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