From 5c39f8d0f91ed71517e547c96a8ca945aec7da9c Mon Sep 17 00:00:00 2001
From: Alf Eaton <eaton.alf@gmail.com>
Date: Fri, 1 Sep 2017 15:38:47 +0100
Subject: [PATCH] Save the form on submit

---
 packages/component-submit/package.json        |  1 +
 .../component-submit/src/components/Submit.js |  4 +-
 .../src/components/SubmitPage.js              | 60 +++++++++++++------
 packages/xpub-collabra/config/validations.js  | 21 ++++++-
 4 files changed, 64 insertions(+), 22 deletions(-)

diff --git a/packages/component-submit/package.json b/packages/component-submit/package.json
index 9a8aca884..3584898d8 100644
--- a/packages/component-submit/package.json
+++ b/packages/component-submit/package.json
@@ -18,6 +18,7 @@
     "react-dom": "^15.6.1",
     "react-redux": "^5.0.2",
     "react-router": "^3.0.5",
+    "react-router-redux": "^4.0.7",
     "recompose": "^0.25.0",
     "redux": "^3.6.0",
     "redux-form": "^7.0.3",
diff --git a/packages/component-submit/src/components/Submit.js b/packages/component-submit/src/components/Submit.js
index a92e9338b..91ec30441 100644
--- a/packages/component-submit/src/components/Submit.js
+++ b/packages/component-submit/src/components/Submit.js
@@ -34,9 +34,9 @@ const Submit = ({ journal, project, version, valid, pristine, submitting, handle
       <div>
         <Button
           type="button"
+          primary
           onClick={toggleConfirming}
-          // disabled={pristine || submitting || !valid}
-        >
+          disabled={submitting || !valid}>
           Submit your manuscript
         </Button>
       </div>
diff --git a/packages/component-submit/src/components/SubmitPage.js b/packages/component-submit/src/components/SubmitPage.js
index d78d51f35..6b574dd61 100644
--- a/packages/component-submit/src/components/SubmitPage.js
+++ b/packages/component-submit/src/components/SubmitPage.js
@@ -1,23 +1,48 @@
 /* global CONFIG */
 
 import { pick } from 'lodash'
-import { compose, withState, withHandlers } from 'recompose'
+import { compose, withProps, withState, withHandlers } from 'recompose'
 import { connect } from 'react-redux'
-import { reduxForm } from 'redux-form'
+import { push } from 'react-router-redux'
+import { reduxForm, SubmissionError } from 'redux-form'
 import actions from 'pubsweet-client/src/actions'
 import token from 'pubsweet-client/src/helpers/token'
 import { withJournal, ConnectPage } from 'pubsweet-component-xpub-app/src/components'
 import { selectCollection, selectFragment } from 'xpub-selectors'
 import Submit from './Submit'
 
-const onSubmit = (values, dispatch) => {
-  // TODO: save fragment
+const onSubmit = (values, dispatch, props) => {
   console.log('submit', values)
+
+  return dispatch(actions.updateFragment(props.project, {
+    id: props.version.id,
+    submitted: true,
+    ...values
+  })).then(() => {
+    return dispatch(actions.updateCollection({
+      id: props.project.id,
+      status: 'submitted'
+    }))
+  }).then(() => {
+    dispatch(push(`/`))
+  }).catch(error => {
+    if (error.validationErrors) {
+      throw new SubmissionError()
+    }
+  })
 }
 
-const onChange = (values, dispatch) => {
-  // TODO: save fragment
+// TODO: redux-form doesn't have an onBlur handler(?)
+const onBlur = (values, dispatch, props) => {
   console.log('change', values)
+
+  return dispatch(actions.updateFragment(props.project, {
+    id: props.version.id,
+    // submitted: false,
+    ...values
+  }))
+
+  // TODO: display a notification when saving/saving completes/saving fails
 }
 
 const uploadFile = file => dispatch => {
@@ -42,30 +67,27 @@ export default compose(
     actions.getFragment({ id: params.project }, { id: params.version })
   ]),
   withJournal,
-  connect(
-    (state, ownProps) => {
-      const version = selectFragment(state, ownProps.params.version)
-      const paths = ['metadata', 'declarations', 'suggestions', 'notes', 'files']
-
-      return {
-        initialValues: pick(version, paths)
-      }
-    }
-  ),
   connect(
     (state, ownProps) => ({
-        project: selectCollection(state, ownProps.params.project),
-        version: selectFragment(state, ownProps.params.version)
+      project: selectCollection(state, ownProps.params.project),
+      version: selectFragment(state, ownProps.params.version)
     }),
     {
       uploadFile
     }
   ),
+  withProps(({ version }) => {
+    const paths = ['metadata', 'declarations', 'suggestions', 'notes', 'files']
+
+    return {
+      initialValues: pick(version, paths)
+    }
+  }),
   reduxForm({
     form: 'submit',
     // enableReinitialize: true,
     onSubmit,
-    onChange
+    onBlur
   }),
   withState('confirming', 'setConfirming', false),
   withHandlers({
diff --git a/packages/xpub-collabra/config/validations.js b/packages/xpub-collabra/config/validations.js
index 632d37235..af905f8f5 100644
--- a/packages/xpub-collabra/config/validations.js
+++ b/packages/xpub-collabra/config/validations.js
@@ -3,16 +3,31 @@ const Joi = require('joi')
 module.exports = {
   collection: { // project
     title: Joi.string(),
+    status: Joi.string()
   },
   fragment: { // version
     version: Joi.number().required(),
+    submitted: Joi.boolean(),
     source: Joi.string(), // TODO: move to a file
     metadata: Joi.object({
       title: Joi.string(),
       abstract: Joi.string(),
-      authors: Joi.string(),
+      articleType: Joi.string(),
+      articleSection: Joi.array().items(Joi.string()),
+      authors: Joi.array(),
+      keywords: Joi.array(),
     }),
     declarations: Joi.object().unknown(),
+    suggestions: Joi.object({
+      reviewers: Joi.object({
+        suggested: Joi.array().items(Joi.string()),
+        opposed: Joi.array().items(Joi.string())
+      }),
+      editors: Joi.object({
+        suggested: Joi.array().items(Joi.string()),
+        opposed: Joi.array().items(Joi.string())
+      }),
+    }),
     files: Joi.object({
       supplementary: Joi.array().items(Joi.object({
         name: Joi.string().required(),
@@ -20,6 +35,10 @@ module.exports = {
         size: Joi.number(),
         url: Joi.string()
       }))
+    }),
+    notes: Joi.object({
+      fundingAcknowledgement: Joi.string(),
+      specialInstructions: Joi.string()
     })
   },
   user: {
-- 
GitLab