From cbbf931e060afeb918286073e9bb5945cf90a9db Mon Sep 17 00:00:00 2001
From: Jure Triglav <juretriglav@gmail.com>
Date: Thu, 13 Aug 2020 20:35:25 +0200
Subject: [PATCH] feat: add form submission feedback for decisions

---
 .../src/components/DecisionPage.js            | 37 +++++-----
 .../src/components/decision/DecisionForm.js   | 67 ++++++++++++-------
 .../component-review/src/components/style.js  |  6 ++
 cypress/integration/decision_spec.js          |  1 +
 4 files changed, 67 insertions(+), 44 deletions(-)

diff --git a/app/components/component-review/src/components/DecisionPage.js b/app/components/component-review/src/components/DecisionPage.js
index 09ba62e323..cb4a9d57ab 100644
--- a/app/components/component-review/src/components/DecisionPage.js
+++ b/app/components/component-review/src/components/DecisionPage.js
@@ -178,6 +178,8 @@ const decisionSections = ({
   isValid,
   updateReview,
   uploadFile,
+  isSubmitting,
+  submitCount,
 }) => {
   const decisionSections = []
   const manuscriptVersions = manuscript.manuscriptVersions || []
@@ -215,7 +217,9 @@ const decisionSections = ({
         <AdminSection key="decision-form">
           <DecisionForm
             handleSubmit={handleSubmit}
+            isSubmitting={isSubmitting}
             isValid={isValid}
+            submitCount={submitCount}
             updateReview={updateReview}
             uploadFile={uploadFile}
           />
@@ -372,13 +376,22 @@ const DecisionPage = ({ match }) => {
   }
   // const editorSectionsResult = editorSections({ manuscript })
 
+  const sections = props =>
+    decisionSections({
+      manuscript,
+      handleSubmit: props.handleSubmit,
+      isValid: props.isValid,
+      updateReview,
+      isSubmitting: props.isSubmitting,
+      submitCount: props.submitCount,
+    })
+
   return (
     <Columns>
       <Manuscript>
         <Formik
           displayName="decision"
-          enableReinitialize
-          initialValues={existingReview}
+          initialValues={reviewOrInitial(data.manuscript)}
           // isInitialValid={({ manuscript }) => {
           //   const rv =
           //     manuscript.reviews.find(review => review.isDecision) || {}
@@ -387,7 +400,7 @@ const DecisionPage = ({ match }) => {
 
           //   return isCommented && isRecommendation
           // }}
-          onSubmit={() => {
+          onSubmit={() =>
             makeDecision({
               variables: {
                 id: manuscript.id,
@@ -395,7 +408,7 @@ const DecisionPage = ({ match }) => {
                   .recommendation,
               },
             })
-          }}
+          }
           // validate={(values, props) => {
           //   const errors = {}
           //   if (values.decisionComment?.content === '') {
@@ -419,20 +432,8 @@ const DecisionPage = ({ match }) => {
                 title="Versions"
               /> */}
               <Tabs
-                activeKey={
-                  decisionSections({
-                    manuscript,
-                    handleSubmit: props.handleSubmit,
-                    isValid: props.isValid,
-                    updateReview,
-                  })[decisionSections.length - 1].key
-                }
-                sections={decisionSections({
-                  manuscript,
-                  handleSubmit: props.handleSubmit,
-                  isValid: props.isValid,
-                  updateReview,
-                })}
+                activeKey={sections(props)[decisionSections.length - 1].key}
+                sections={sections(props)}
                 title="Versions"
               />
             </>
diff --git a/app/components/component-review/src/components/decision/DecisionForm.js b/app/components/component-review/src/components/decision/DecisionForm.js
index 6a501deada..b418778291 100644
--- a/app/components/component-review/src/components/decision/DecisionForm.js
+++ b/app/components/component-review/src/components/decision/DecisionForm.js
@@ -22,6 +22,7 @@ import {
   SectionRowGrid,
   SectionRow,
   SectionAction,
+  FormStatus,
 } from '../style'
 
 const NoteDecision = ({ updateReview }) => (
@@ -29,7 +30,6 @@ const NoteDecision = ({ updateReview }) => (
     <Field key="noteField" name="decisionComment">
       {formikBag => (
         <>
-          <p>NoteDecision: {JSON.stringify(formikBag.form.values)}</p>
           <NoteInput updateReview={updateReview} {...formikBag} />
           <FilesUpload
             containerId={formikBag.field.value?.id}
@@ -123,31 +123,46 @@ const RecommendationInput = ({
   )
 }
 
-const DecisionForm = ({ handleSubmit, updateReview, isValid }) => (
-  <Container key="decisionform">
-    <form onSubmit={handleSubmit}>
-      <SectionHeader>
-        <Title>Decision</Title>
-      </SectionHeader>
-      <SectionRow key="note">
-        <NoteDecision updateReview={updateReview} />
-      </SectionRow>
-      <SectionRowGrid>
-        <Field
-          component={RecommendationInput}
-          name="recommendation"
-          updateReview={updateReview}
-          validate={required}
-        />
+const DecisionForm = ({
+  handleSubmit,
+  updateReview,
+  isValid,
+  isSubmitting,
+  submitCount,
+}) => {
+  let status = null
+  if (isSubmitting) {
+    status = 'Your decision is submitting...'
+  } else if (submitCount) {
+    status = 'Your decision has been saved.'
+  }
 
-        <SectionAction key="submit">
-          <Button disabled={!isValid} primary type="submit">
-            Submit
-          </Button>
-        </SectionAction>
-      </SectionRowGrid>
-    </form>
-  </Container>
-)
+  return (
+    <Container key="decisionform">
+      <form onSubmit={handleSubmit}>
+        <SectionHeader>
+          <Title>Decision</Title>
+        </SectionHeader>
+        <SectionRow key="note">
+          <NoteDecision updateReview={updateReview} />
+        </SectionRow>
+        <SectionRowGrid>
+          <Field
+            component={RecommendationInput}
+            name="recommendation"
+            updateReview={updateReview}
+            validate={required}
+          />
+          <FormStatus>{status}</FormStatus>
+          <SectionAction key="submit">
+            <Button disabled={!isValid || isSubmitting} primary type="submit">
+              Submit
+            </Button>
+          </SectionAction>
+        </SectionRowGrid>
+      </form>
+    </Container>
+  )
+}
 
 export default DecisionForm
diff --git a/app/components/component-review/src/components/style.js b/app/components/component-review/src/components/style.js
index c4b49a22d7..2d0f1ca3ad 100644
--- a/app/components/component-review/src/components/style.js
+++ b/app/components/component-review/src/components/style.js
@@ -77,6 +77,12 @@ export const Container = styled.div`
   }
 `
 
+export const FormStatus = styled.div`
+  line-height: ${grid(5)};
+  text-align: center;
+  color: ${th('colorSecondary')};
+`
+
 export {
   Title,
   SectionHeader,
diff --git a/cypress/integration/decision_spec.js b/cypress/integration/decision_spec.js
index a5137e8255..8780bd7206 100644
--- a/cypress/integration/decision_spec.js
+++ b/cypress/integration/decision_spec.js
@@ -12,6 +12,7 @@ describe('Completing a review', () => {
 
     cy.contains('Accept').click()
     cy.contains('Submit').click()
+    cy.contains('Your decision has been saved.')
     cy.visit('/journal/dashboard')
     cy.contains('Accepted')
 
-- 
GitLab