diff --git a/packages/component-faraday-ui/src/ReviewersTable.js b/packages/component-faraday-ui/src/ReviewersTable.js index 74ddafc17049e76ed80fcc5b799f1f9091c1bec9..4da6d58f7f350ba5b3e773b33a1f3429e033c379 100644 --- a/packages/component-faraday-ui/src/ReviewersTable.js +++ b/packages/component-faraday-ui/src/ReviewersTable.js @@ -65,7 +65,9 @@ const ReviewersTable = ({ </Fragment> </td> <td> - <div /> + <DateParser timestamp={get(invitation, 'review.submittedOn')}> + {timestamp => <Text>{timestamp}</Text>} + </DateParser> </td> <HiddenCell> {!invitation.hasAnswer && ( diff --git a/packages/component-faraday-ui/src/contextualBoxes/ReviewerDetails.js b/packages/component-faraday-ui/src/contextualBoxes/ReviewerDetails.js index 7cf367f7ec049a39afbd533ea780e74b9182e7e7..c9f0c279bd83899b6ee723a859cb6529420df9b7 100644 --- a/packages/component-faraday-ui/src/contextualBoxes/ReviewerDetails.js +++ b/packages/component-faraday-ui/src/contextualBoxes/ReviewerDetails.js @@ -1,5 +1,6 @@ import React, { Fragment } from 'react' import { H4 } from '@pubsweet/ui' +import { withProps } from 'recompose' import styled from 'styled-components' import { th } from '@pubsweet/ui-toolkit' @@ -56,7 +57,12 @@ const ReviewerDetails = ({ </ContextualBox> ) -export default ReviewerDetails +export default withProps(({ invitations, reviewerReports = [] }) => ({ + invitations: invitations.map(i => ({ + ...i, + review: reviewerReports.find(r => r.userId === i.userId), + })), +}))(ReviewerDetails) // #region styles const TabButton = styled.div` diff --git a/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptEicDecision.js b/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptEicDecision.js index e2120d3ed8315076974e405222466827665af831..a6f66d3736b655bb1835539cd73115feac761ceb 100644 --- a/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptEicDecision.js +++ b/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptEicDecision.js @@ -1,16 +1,25 @@ import React from 'react' -import { has, get } from 'lodash' +import { get } from 'lodash' +import { compose } from 'recompose' import styled from 'styled-components' import { reduxForm } from 'redux-form' import { th } from '@pubsweet/ui-toolkit' import { required } from 'xpub-validators' -import { compose, withProps } from 'recompose' import { Button, Menu, ValidatedField } from '@pubsweet/ui' +import { withModal } from 'pubsweet-component-modal/src/components' -import { ContextualBox, OpenModal, Row, Item, Label, Textarea } from '../' +import { + Row, + Item, + Label, + Textarea, + MultiAction, + ContextualBox, + ItemOverrideAlert, + withFetching, +} from '../' const ManuscriptEicDecision = ({ - disabled, isFetching, formValues, handleSubmit, @@ -21,17 +30,17 @@ const ManuscriptEicDecision = ({ <ContextualBox label="Your Editorial Decision" {...rest}> <Root> <Row justify="flex-start"> - <Item flex={0} vertical> + <ItemOverrideAlert flex={0} vertical> <Label required>Decision</Label> <ValidatedField - component={input => <CustomMenu {...input} options={options} />} + component={input => <Menu {...input} options={options} />} name="decision" validate={[required]} /> - </Item> + </ItemOverrideAlert> </Row> - <Row mt={6}> + <Row mt={2}> <Item vertical> <Label required> { @@ -49,37 +58,34 @@ const ManuscriptEicDecision = ({ </Row> <Row justify="flex-end" mt={4}> - <OpenModal - isFetching={isFetching} - onConfirm={props => { - handleSubmit()(props) - }} - title="Are you sure you want to submit this decision?" - > - {showModal => ( - <Button - disabled={disabled} - onClick={showModal} - primary - size="medium" - > - SUBMIT DECISION - </Button> - )} - </OpenModal> + <Button onClick={handleSubmit} primary size="medium"> + SUBMIT DECISION + </Button> </Row> </Root> </ContextualBox> ) export default compose( - withProps(({ formValues }) => ({ - disabled: !has(formValues, 'decision') || !has(formValues, 'message'), + withFetching, + withModal(({ isFetching }) => ({ + isFetching, + modalKey: 'eic-decision', + modalComponent: MultiAction, })), reduxForm({ form: 'eic-decision', - onSubmit: (values, dispatch, { submitDecision }) => modalProps => { - submitDecision(values, modalProps) + onSubmit: ( + values, + dispatch, + { submitDecision, showModal, setFetching }, + ) => { + showModal({ + title: 'Are you sure you want to submit this decision?', + onConfirm: modalProps => { + submitDecision(values, { ...modalProps, setFetching }) + }, + }) }, }), )(ManuscriptEicDecision) @@ -91,10 +97,6 @@ const Root = styled.div` padding: ${th('gridUnit')}; ` -const CustomMenu = styled(Menu)` - min-width: calc(${th('gridUnit')} * 30); -` - const ValidatedTextArea = styled(Textarea)` & + div { margin-top: 0; diff --git a/packages/component-faraday-ui/src/manuscriptDetails/ResponseToInvitation.js b/packages/component-faraday-ui/src/manuscriptDetails/ResponseToInvitation.js index b0f85ce73dad5312410b2161fadd3469497f691e..5ce45b9d80316f2f12aaa94a49acca64d588cbe8 100644 --- a/packages/component-faraday-ui/src/manuscriptDetails/ResponseToInvitation.js +++ b/packages/component-faraday-ui/src/manuscriptDetails/ResponseToInvitation.js @@ -90,7 +90,6 @@ export default compose( })), reduxForm({ form: 'answer-invitation', - destroyOnUnmount: false, onSubmit: (values, dispatch, { showModal, onResponse, setFetching }) => { showModal({ title: `${capitalize(values.decision)} this invitation?`, diff --git a/packages/component-manuscript/src/components/ManuscriptLayout.js b/packages/component-manuscript/src/components/ManuscriptLayout.js index a33f986d60e6d92505444b1aa0fecaa748a3fdf6..68a4037b958131e24639a0c2289ec041f8d4d897 100644 --- a/packages/component-manuscript/src/components/ManuscriptLayout.js +++ b/packages/component-manuscript/src/components/ManuscriptLayout.js @@ -59,9 +59,9 @@ const ManuscriptLayout = ({ pendingOwnRecommendation, toggleReviewerRecommendations, reviewerRecommendationExpanded, - // shouldReview, submittedOwnRecommendation, + reviewerReports, }) => ( <Root pb={1}> {!isEmpty(collection) && !isEmpty(fragment) ? ( @@ -169,6 +169,7 @@ const ManuscriptLayout = ({ onInviteReviewer={onInviteReviewer} onResendReviewerInvite={onResendReviewerInvite} onRevokeReviewerInvite={onRevokeReviewerInvite} + reviewerReports={reviewerReports} /> )} </Fragment> diff --git a/packages/component-manuscript/src/components/ManuscriptPage.js b/packages/component-manuscript/src/components/ManuscriptPage.js index 8c1dccd2742b8d97fb40b80294e6ee0acc192b92..7c2839e5966a45b40b6d210f8aef301e014403ea 100644 --- a/packages/component-manuscript/src/components/ManuscriptPage.js +++ b/packages/component-manuscript/src/components/ManuscriptPage.js @@ -64,6 +64,7 @@ import { import { createRecommendation, recommendationsFetching, + selectReviewRecommendations, } from '../redux/recommendations' export default compose( @@ -86,6 +87,7 @@ export default compose( state, selectCollection(state, match.params.project), ), + reviewerReports: selectReviewRecommendations(state, match.params.version), pendingHEInvitation: pendingHEInvitation(state, match.params.project), pendingOwnRecommendation: getOwnPendingRecommendation( state, @@ -112,7 +114,6 @@ export default compose( changeForm, clearCustomError, assignHandlingEditor, - createRecommendation, revokeHandlingEditor, getUsers: actions.getUsers, getFragment: actions.getFragment, @@ -229,19 +230,23 @@ export default compose( fragment, collection, fetchUpdatedCollection, - createRecommendation, }) => (values, modalProps) => { const recommendation = parseEicDecision(values) + modalProps.setFetching(true) createRecommendation({ recommendation, fragmentId: fragment.id, collectionId: collection.id, }) .then(() => { - fetchUpdatedCollection() + modalProps.setFetching(false) modalProps.hideModal() + fetchUpdatedCollection() + }) + .catch(err => { + modalProps.setFetching(false) + handleError(modalProps.setModalError)(err) }) - .catch(handleError(modalProps.setModalError)) }, onHEResponse: ({ history,