From c0e22f8184f9570713a28a7016f29701b384b37c Mon Sep 17 00:00:00 2001
From: Alexandru Munteanu <alexandru.munt@gmail.com>
Date: Wed, 16 May 2018 14:04:38 +0300
Subject: [PATCH] feat(make-recommendation): request a revision form

---
 .../MakeRecommendation/FormItems.js           |   6 +-
 .../components/MakeRecommendation/StepTwo.js  | 194 +++++++++++++++---
 packages/xpub-faraday/app.js                  |   2 +-
 3 files changed, 167 insertions(+), 35 deletions(-)

diff --git a/packages/components-faraday/src/components/MakeRecommendation/FormItems.js b/packages/components-faraday/src/components/MakeRecommendation/FormItems.js
index 596aa0042..66534ec0c 100644
--- a/packages/components-faraday/src/components/MakeRecommendation/FormItems.js
+++ b/packages/components-faraday/src/components/MakeRecommendation/FormItems.js
@@ -8,7 +8,7 @@ export const RootContainer = styled.div`
   flex-direction: column;
   margin: 0 auto;
   max-width: 550px;
-  min-width: 350px;
+  min-width: 450px;
   padding: calc(${th('subGridUnit')} * 2) calc(${th('subGridUnit')} * 4);
 `
 
@@ -48,7 +48,7 @@ export const Row = styled.div`
 
 export const RowItem = styled.div`
   display: flex;
-  flex: 1;
+  flex: ${({ flex }) => flex || 1};
   flex-direction: ${({ vertical }) => (vertical ? 'column' : 'row')};
   justify-content: ${({ centered }) => (centered ? 'center' : 'initial')};
 `
@@ -67,7 +67,7 @@ export const Err = styled.span`
 `
 
 export const Textarea = styled.textarea`
-  width: 100%;
+  width: 400px;
   padding: calc(${th('subGridUnit')}*2);
   font-size: ${th('fontSizeBaseSmall')};
   font-family: ${th('fontWriting')};
diff --git a/packages/components-faraday/src/components/MakeRecommendation/StepTwo.js b/packages/components-faraday/src/components/MakeRecommendation/StepTwo.js
index f549c1cd5..1f7f86db2 100644
--- a/packages/components-faraday/src/components/MakeRecommendation/StepTwo.js
+++ b/packages/components-faraday/src/components/MakeRecommendation/StepTwo.js
@@ -1,8 +1,18 @@
-import React from 'react'
+import React, { Fragment } from 'react'
 import { capitalize } from 'lodash'
-import { compose } from 'recompose'
-import { reduxForm } from 'redux-form'
-import { Button, Spinner, ValidatedField } from '@pubsweet/ui'
+import { connect } from 'react-redux'
+import { required } from 'xpub-validators'
+import styled, { css } from 'styled-components'
+import { reduxForm, change as changeForm } from 'redux-form'
+import { compose, withState, withHandlers } from 'recompose'
+import {
+  th,
+  Icon,
+  Button,
+  Spinner,
+  RadioGroup,
+  ValidatedField,
+} from '@pubsweet/ui'
 
 import {
   Row,
@@ -15,41 +25,118 @@ import {
   FormContainer,
 } from './'
 
+const revisionOptions = [
+  { value: 'minor', label: 'Minor' },
+  { value: 'major', label: 'Major' },
+]
+
 const Form = RootContainer.withComponent(FormContainer)
 
 const StepTwo = ({
-  recommendationError,
   goBack,
+  hasNote,
   decision,
-  handleSubmit,
+  showNote,
+  removeNote,
   isFetching,
+  handleSubmit,
+  recommendationError,
 }) => (
   <Form onSubmit={handleSubmit}>
-    <Title>{`Recommandation to ${capitalize(decision)}`}</Title>
-    <Row>
-      <RowItem vertical>
-        <Label>Message for Editor in Chief (optional)</Label>
-        <ValidatedField
-          component={input => <Textarea {...input} />}
-          name="message.eic"
-        />
-      </RowItem>
-    </Row>
-    <Row>
-      <RowItem vertical>
-        <Label>Message for Author (optional)</Label>
-        <ValidatedField
-          component={input => <Textarea {...input} />}
-          name="message.author"
-        />
-      </RowItem>
-    </Row>
-    {recommendationError && (
-      <Row>
-        <RowItem centered>
-          <Err>{recommendationError}</Err>
-        </RowItem>
-      </Row>
+    <Title>
+      {decision !== 'revise'
+        ? `Recommandation to ${capitalize(decision)}`
+        : `Request a revision from Author`}
+    </Title>
+    {decision !== 'revise' ? (
+      <Fragment>
+        <Row>
+          <RowItem vertical>
+            <Label>Message for Editor in Chief (optional)</Label>
+            <ValidatedField
+              component={input => <Textarea {...input} />}
+              name="message.eic"
+            />
+          </RowItem>
+        </Row>
+        <Row>
+          <RowItem vertical>
+            <Label>Message for Author (optional)</Label>
+            <ValidatedField
+              component={input => <Textarea {...input} />}
+              name="message.author"
+            />
+          </RowItem>
+        </Row>
+        {recommendationError && (
+          <Row>
+            <RowItem centered>
+              <Err>{recommendationError}</Err>
+            </RowItem>
+          </Row>
+        )}
+      </Fragment>
+    ) : (
+      <Fragment>
+        <CustomRow>
+          <RowItem vertical>
+            <Label>REVISION TYPE</Label>
+            <ValidatedField
+              component={input => (
+                <RadioGroup
+                  name="revision.revision-type"
+                  {...input}
+                  options={revisionOptions}
+                />
+              )}
+              name="revision.revisionType"
+            />
+          </RowItem>
+        </CustomRow>
+        <CustomRow>
+          <RowItem vertical>
+            <Label>REASON & DETAILS</Label>
+            <ValidatedField
+              component={input => <Textarea {...input} />}
+              name="revision.reason"
+              validate={[required]}
+            />
+          </RowItem>
+        </CustomRow>
+        {!hasNote ? (
+          <Row>
+            <RowItem>
+              <TextButton onClick={showNote}>Add Internal Note</TextButton>
+              <HintText>Not shared with author</HintText>
+            </RowItem>
+          </Row>
+        ) : (
+          <Fragment>
+            <CustomRow>
+              <RowItem>
+                <Label>INTERNAL NOTE</Label>
+              </RowItem>
+              <RowItem>
+                <HintText>Not shared with author</HintText>
+              </RowItem>
+              <CustomRowItem onClick={removeNote}>
+                <IconButton>
+                  <Icon primary>x</Icon>
+                </IconButton>
+                <TextButton>Remove</TextButton>
+              </CustomRowItem>
+            </CustomRow>
+            <CustomRow>
+              <RowItem>
+                <ValidatedField
+                  component={input => <Textarea {...input} />}
+                  name="revision.internal-note"
+                />
+              </RowItem>
+            </CustomRow>
+          </Fragment>
+        )}
+      </Fragment>
     )}
     <Row>
       <RowItem centered>
@@ -69,9 +156,54 @@ const StepTwo = ({
 )
 
 export default compose(
+  connect(null, { changeForm }),
+  withState('hasNote', 'changeHasNote', false),
+  withHandlers({
+    showNote: ({ changeHasNote }) => () => {
+      changeHasNote(true)
+    },
+    removeNote: ({ changeHasNote, changeForm }) => () => {
+      changeHasNote(false)
+      changeForm('recommendation', 'revision.internal-note', '')
+    },
+  }),
   reduxForm({
     form: 'recommendation',
     destroyOnUnmount: false,
     forceUnregisterOnUnmount: true,
   }),
 )(StepTwo)
+
+// #region styled components
+const defaultText = css`
+  color: ${th('colorPrimary')};
+  font-family: ${th('fontInterface')};
+  font-size: ${th('fontSizeBaseSmall')};
+`
+
+const TextButton = styled.span`
+  ${defaultText};
+  cursor: pointer;
+  margin-right: ${th('subGridUnit')};
+  text-decoration: underline;
+`
+
+const HintText = styled.span`
+  ${defaultText};
+  font-style: oblique;
+`
+
+const IconButton = styled.div`
+  display: flex;
+  justify-content: center;
+`
+
+const CustomRowItem = RowItem.extend`
+  align-items: center;
+  justify-content: flex-end;
+`
+
+const CustomRow = Row.extend`
+  margin: ${th('subGridUnit')} 0;
+`
+// #endregion
diff --git a/packages/xpub-faraday/app.js b/packages/xpub-faraday/app.js
index 91f061e68..5eefe9509 100644
--- a/packages/xpub-faraday/app.js
+++ b/packages/xpub-faraday/app.js
@@ -3,6 +3,6 @@ const startServer = require('pubsweet-server')
 require('dotenv').config()
 
 startServer().catch(err => {
-  logger.error('FATAL ERROR, SHUTTING DOWN::', err)
+  logger.error('FATAL ERROR, SHUTTING DOWN:', err)
   process.exit(1)
 })
-- 
GitLab