diff --git a/packages/component-manuscript/src/components/ReviewerReportForm.js b/packages/component-manuscript/src/components/ReviewerReportForm.js index b8ca662a4109bdd916cf195c0690bda6bc6e1c17..2da95ea14fcfeb5d219f7f47a57829a27facb1c6 100644 --- a/packages/component-manuscript/src/components/ReviewerReportForm.js +++ b/packages/component-manuscript/src/components/ReviewerReportForm.js @@ -25,7 +25,6 @@ import AutosaveIndicator from 'pubsweet-component-wizard/src/components/Autosave import { uploadFile, deleteFile, - getFileError, getSignedUrl, getRequestStatus, } from 'pubsweet-components-faraday/src/redux/files' @@ -40,8 +39,6 @@ import { } from 'pubsweet-component-modal/src/components' import { - selectError, - selectFetching, createRecommendation, updateRecommendation, } from 'pubsweet-components-faraday/src/redux/recommendations' @@ -62,7 +59,6 @@ const ReviewerReportForm = ({ fileError, removeFile, changeField, - errorRequest, isSubmitting, handleSubmit, fileFetching, @@ -172,11 +168,6 @@ const ReviewerReportForm = ({ <ErrorText>{fileError}</ErrorText> </Row> )} - {errorRequest && ( - <Row> - <ErrorText>{errorRequest}</ErrorText> - </Row> - )} <Row> <ActionButton onClick={handleSubmit}> Submit report </ActionButton> <AutosaveIndicator @@ -189,8 +180,7 @@ const ReviewerReportForm = ({ const ModalWrapper = compose( connect(state => ({ - modalError: selectError(state), - fetching: selectFetching(state), + fetching: false, })), )(({ fetching, ...rest }) => ( <ConfirmationModal {...rest} isFetching={fetching} /> @@ -200,8 +190,6 @@ export default compose( withJournal, connect( state => ({ - fileError: getFileError(state), - errorRequest: selectError(state), fileFetching: getRequestStatus(state), formValues: getFormValues('reviewerReport')(state), isSubmitting: isSubmitting('reviewerReport')(state), diff --git a/packages/component-manuscript/src/components/ReviewsAndReports.js b/packages/component-manuscript/src/components/ReviewsAndReports.js index 7248a6a1502bef9da4171683a8b09b8eb161981a..ced7097c6c243e89b12228118c210f16fa3caedf 100644 --- a/packages/component-manuscript/src/components/ReviewsAndReports.js +++ b/packages/component-manuscript/src/components/ReviewsAndReports.js @@ -1,6 +1,6 @@ import React, { Fragment } from 'react' -import { head } from 'lodash' import { th } from '@pubsweet/ui' +import { head, get } from 'lodash' import { connect } from 'react-redux' import styled from 'styled-components' import { compose, withHandlers, lifecycle, withProps } from 'recompose' @@ -51,6 +51,9 @@ const ReviewsAndReports = ({ mappedReviewers, mappedRecommendations, canSeeReviewersReports, + // + reviewerRecommendation, + // review = {}, reviewers = [], recommendations = [], @@ -82,13 +85,13 @@ const ReviewsAndReports = ({ {isReviewer && ( <Root id="review-report"> <Expandable label="Your Report" startExpanded> - {report ? ( - <ReviewReportCard report={report} /> + {get(reviewerRecommendation, 'submittedOn') ? ( + <ReviewReportCard report={reviewerRecommendation} /> ) : ( <ReviewerReportForm modalKey={`review-${project.id}`} project={project} - review={review} + review={reviewerRecommendation} version={version} /> )} @@ -127,6 +130,7 @@ export default compose( withProps(({ recommendations = [] }) => ({ review: head(recommendations), report: head(recommendations.filter(r => r.submittedOn)), + reviewerRecommendation: head(recommendations), })), lifecycle({ componentDidMount() { diff --git a/packages/component-manuscript/src/components/utils.js b/packages/component-manuscript/src/components/utils.js index 47c080f7ea60b9ea2b4bc412f01c06a36bdc17e8..ed5e3885bbfad9c55e488500582ab05c8ed6ca66 100644 --- a/packages/component-manuscript/src/components/utils.js +++ b/packages/component-manuscript/src/components/utils.js @@ -1,6 +1,8 @@ import moment from 'moment' import { get, find, capitalize, omit, isEmpty, isEqual, debounce } from 'lodash' +import { actions } from 'pubsweet-client/src' +import { change as changeForm } from 'redux-form' import { autosaveRequest, autosaveSuccess, @@ -88,7 +90,7 @@ export const redirectToError = redirectFn => err => { } export const parseReviewResponseToForm = (review = {}) => { - if (isEmpty(review)) return null + if (isEmpty(review)) return {} const comments = review.comments || [] const publicComment = comments.find(c => c.public) const privateComment = comments.find(c => !c.public) @@ -102,7 +104,7 @@ export const parseReviewResponseToForm = (review = {}) => { } export const parseReviewRequest = (review = {}) => { - if (isEmpty(review)) return null + if (isEmpty(review)) return {} const comments = [ { public: true, @@ -147,7 +149,10 @@ const onChange = ( .catch(e => dispatch(autosaveFailure(e))) } else { createRecommendation(project.id, version.id, newValues) - .then(r => dispatch(autosaveSuccess(get(r, 'updatedOn')))) + .then(r => { + dispatch(changeForm('reviewerReport', 'id', r.id)) + return dispatch(autosaveSuccess(get(r, 'updatedOn'))) + }) .catch(e => dispatch(autosaveFailure(e))) } } @@ -177,7 +182,10 @@ export const onReviewSubmit = ( dispatch(autosaveRequest()) updateRecommendation(project.id, version.id, newValues) .then(r => dispatch(autosaveSuccess(get(r, 'updatedOn')))) - .then(hideModal) + .then(() => { + dispatch(actions.getFragments()) + hideModal() + }) }, onCancel: hideModal, }) diff --git a/packages/components-faraday/src/components/Dashboard/ReviewerDecision.js b/packages/components-faraday/src/components/Dashboard/ReviewerDecision.js index c4d020c9a5ac49a0ed5b160476429a3f64b640de..08bfbff9dc1dbd96821f8b40eb6e881604117aea 100644 --- a/packages/components-faraday/src/components/Dashboard/ReviewerDecision.js +++ b/packages/components-faraday/src/components/Dashboard/ReviewerDecision.js @@ -31,12 +31,14 @@ export default compose( connect(null, { reviewerDecision, getFragments: actions.getFragments, + getCollections: actions.getCollections, }), withModal(props => ({ modalComponent: ModalComponent, })), withHandlers({ - decisionSuccess: ({ getFragments, hideModal }) => () => { + decisionSuccess: ({ getFragments, getCollections, hideModal }) => () => { + getCollections() getFragments() hideModal() }, diff --git a/packages/components-faraday/src/components/MakeDecision/DecisionForm.js b/packages/components-faraday/src/components/MakeDecision/DecisionForm.js index 262a8cfbe8297cd9a0ca7e3c18c2d5241a3e73fc..0a53c9423317ac06571ebf6470b6ee16b957fb0f 100644 --- a/packages/components-faraday/src/components/MakeDecision/DecisionForm.js +++ b/packages/components-faraday/src/components/MakeDecision/DecisionForm.js @@ -1,24 +1,19 @@ import React from 'react' import { get } from 'lodash' import { connect } from 'react-redux' +import styled from 'styled-components' import { actions } from 'pubsweet-client' import { required } from 'xpub-validators' -import styled from 'styled-components' import { reduxForm, formValueSelector } from 'redux-form' import { compose, setDisplayName, withProps } from 'recompose' -import { Icon, Button, Spinner, RadioGroup, ValidatedField } from '@pubsweet/ui' +import { Icon, Button, RadioGroup, ValidatedField } from '@pubsweet/ui' import { FormItems } from '../UIComponents' -import { - selectError, - selectFetching, - createRecommendation, -} from '../../redux/recommendations' +import { createRecommendation } from '../../redux/recommendations' import { subtitleParser, decisions, parseFormValues } from './utils' import { getHERecommendation } from '../../../../component-faraday-selectors' const { - Err, Row, Title, Label, @@ -35,9 +30,7 @@ const DecisionForm = ({ aHERec, decision, hideModal, - isFetching, handleSubmit, - recommendationError, heRecommendation: { reason, message = '' }, }) => ( <Form onSubmit={handleSubmit}> @@ -90,25 +83,14 @@ const DecisionForm = ({ </RowItem> </Row> )} - {recommendationError && ( - <Row> - <RowItem centered> - <Err>{recommendationError}</Err> - </RowItem> - </Row> - )} <Row> <RowItem centered> <Button onClick={hideModal}>Cancel</Button> </RowItem> <RowItem centered> - {isFetching ? ( - <Spinner size={3} /> - ) : ( - <Button primary type="submit"> - Submit - </Button> - )} + <Button primary type="submit"> + Submit + </Button> </RowItem> </Row> </Form> @@ -119,9 +101,7 @@ export default compose( setDisplayName('DecisionForm'), connect( (state, { fragmentId, collectionId }) => ({ - isFetching: selectFetching(state), decision: selector(state, 'decision'), - recommendationError: selectError(state), heRecommendation: getHERecommendation(state, collectionId, fragmentId), }), { diff --git a/packages/components-faraday/src/components/MakeRecommendation/RecommendWizard.js b/packages/components-faraday/src/components/MakeRecommendation/RecommendWizard.js index 555a8979f77c7987940721aaa25d2be1e0c2b570..fb7452baf0ba87d8e6d3edb530511df05a9a4bfa 100644 --- a/packages/components-faraday/src/components/MakeRecommendation/RecommendWizard.js +++ b/packages/components-faraday/src/components/MakeRecommendation/RecommendWizard.js @@ -9,11 +9,7 @@ import { getFormValues, reset as resetForm } from 'redux-form' import { FormItems } from '../UIComponents' import { StepOne, StepTwo, utils } from './' -import { - selectError, - selectFetching, - createRecommendation, -} from '../../redux/recommendations' +import { createRecommendation } from '../../redux/recommendations' const RecommendWizard = ({ step, @@ -22,8 +18,6 @@ const RecommendWizard = ({ prevStep, closeModal, submitForm, - isFetching, - recommendationError, ...rest }) => ( <FormItems.RootContainer> @@ -39,13 +33,7 @@ const RecommendWizard = ({ /> )} {step === 1 && ( - <StepTwo - decision={decision} - goBack={prevStep} - isFetching={isFetching} - onSubmit={submitForm} - recommendationError={recommendationError} - /> + <StepTwo decision={decision} goBack={prevStep} onSubmit={submitForm} /> )} </FormItems.RootContainer> ) @@ -53,8 +41,6 @@ const RecommendWizard = ({ export default compose( connect( state => ({ - isFetching: selectFetching(state), - recommendationError: selectError(state), decision: get(getFormValues('recommendation')(state), 'decision'), }), { diff --git a/packages/components-faraday/src/redux/recommendations.js b/packages/components-faraday/src/redux/recommendations.js index 9936ff3d16989380edfa015d086c45a37ed8dafe..4a3e1f70ff1efd7ef18b9fb4e1191a3e503a5361 100644 --- a/packages/components-faraday/src/redux/recommendations.js +++ b/packages/components-faraday/src/redux/recommendations.js @@ -1,46 +1,7 @@ import { get } from 'lodash' import { create, update } from 'pubsweet-client/src/helpers/api' -// #region Constants -const REQUEST = 'recommendations/REQUEST' -const ERROR = 'recommendations/ERROR' - -const GET_FRAGMENT_SUCCESS = 'GET_FRAGMENT_SUCCESS' -const GET_RECOMMENDATIONS_SUCCESS = 'recommendations/GET_SUCCESS' -const CREATE_RECOMMENDATION_SUCCESS = 'recommendations/CREATE_SUCCESS' -const UPDATE_RECOMMENDATION_SUCCESS = 'recommendations/UPDATE_SUCCESS' -// #endregion - -// #region Action Creators -export const recommendationsRequest = () => ({ - type: REQUEST, -}) - -export const recommendationsError = error => ({ - type: ERROR, - error, -}) - -export const getRecommendationsSuccess = recommendation => ({ - type: GET_RECOMMENDATIONS_SUCCESS, - payload: { recommendation }, -}) - -export const createRecommendationSuccess = recommendation => ({ - type: CREATE_RECOMMENDATION_SUCCESS, - payload: { recommendation }, -}) - -export const updateRecommendationSuccess = recommendation => ({ - type: UPDATE_RECOMMENDATION_SUCCESS, - payload: { recommendation }, -}) -// #endregion - // #region Selectors -export const selectFetching = state => - get(state, 'recommendations.fetching') || false -export const selectError = state => get(state, 'recommendations.error') export const selectRecommendations = (state, fragmentId) => get(state, `fragments.${fragmentId}.recommendations`) || [] export const selectEditorialRecommendations = (state, fragmentId) => @@ -50,105 +11,26 @@ export const selectEditorialRecommendations = (state, fragmentId) => // #endregion // #region Actions +// error handling and fetching is handled by the autosave reducer export const createRecommendation = ( collId, fragId, recommendation, -) => dispatch => { - dispatch(recommendationsRequest()) - return create( +) => dispatch => + create( `/collections/${collId}/fragments/${fragId}/recommendations`, recommendation, - ).then( - r => { - dispatch(getRecommendationsSuccess(r)) - return r - }, - err => { - const error = get(err, 'response') - if (error) { - const errorMessage = get(JSON.parse(error), 'error') - dispatch(recommendationsError(errorMessage)) - } - throw err - }, ) -} export const updateRecommendation = ( collId, fragId, recommendation, -) => dispatch => { - dispatch(recommendationsRequest()) - return update( +) => dispatch => + update( `/collections/${collId}/fragments/${fragId}/recommendations/${ recommendation.id }`, recommendation, - ).then( - r => { - dispatch(getRecommendationsSuccess(r)) - return r - }, - err => { - const error = get(err, 'response') - if (error) { - const errorMessage = get(JSON.parse(error), 'error') - dispatch(recommendationsError(errorMessage)) - } - throw err - }, ) -} -// #endregion - -// #region State -const initialState = { - fetching: false, - error: null, - recommendations: [], -} - -export default (state = initialState, action = {}) => { - switch (action.type) { - case REQUEST: - return { - ...state, - fetching: true, - } - case ERROR: - return { - ...state, - fetching: false, - error: action.error, - } - case GET_FRAGMENT_SUCCESS: - return { - ...state, - fetching: false, - error: null, - recommendations: get(action, 'fragment.recommendations'), - } - case GET_RECOMMENDATIONS_SUCCESS: - return { - ...state, - fetching: false, - error: null, - recommendations: state.recommendations - ? [...state.recommendations, action.payload.recommendation] - : action.payload.recommendation, - } - case UPDATE_RECOMMENDATION_SUCCESS: - case CREATE_RECOMMENDATION_SUCCESS: - return { - ...state, - fetching: false, - error: null, - recommendations: [action.payload.recommendation], - } - default: - return state - } -} // #endregion diff --git a/packages/xpub-faraday/config/authsome-mode.js b/packages/xpub-faraday/config/authsome-mode.js index 2c80868ddf05885664bdaa937bcf571bb32d264a..a8e5d2349b827eb0986a5c9d5ea688c8a1d7f9e8 100644 --- a/packages/xpub-faraday/config/authsome-mode.js +++ b/packages/xpub-faraday/config/authsome-mode.js @@ -141,6 +141,9 @@ async function authenticatedUser(user, operation, object, context) { if (permission.role === 'reviewer') { fragment.files = omit(fragment.files, ['coverLetter']) fragment.authors = fragment.authors.map(a => omit(a, ['email'])) + fragment.recommendations = fragment.recommendations + ? fragment.recommendations.filter(r => r.userId === user.id) + : [] } return fragment },