diff --git a/packages/component-faraday-selectors/src/index.js b/packages/component-faraday-selectors/src/index.js index 67590e4c1b0a913ef22aeed2ea008c3301e6b1f9..034488170d35136918321280ebb55b14a349c7ec 100644 --- a/packages/component-faraday-selectors/src/index.js +++ b/packages/component-faraday-selectors/src/index.js @@ -115,11 +115,9 @@ export const canEICViewEditorialComments = (state, collection = {}) => { } const canReviewerViewEditorialCommentsStatuses = [ - 'rejected', - 'accepted', - 'inQA', 'underReview', 'reviewCompleted', + 'pendingApproval', 'revisionRequested', ] export const canReviewerViewEditorialComments = ( @@ -127,14 +125,15 @@ export const canReviewerViewEditorialComments = ( collection = {}, fragment = {}, ) => { + const status = get(collection, 'status', 'draft') const isReviewer = currentUserIsReviewer(state, get(fragment, 'id', '')) + const hasDecision = ['rejected', 'accepted', 'inQA'].includes(status) const hasRevision = get(fragment, 'revision', false) - const hasRecommendation = get(fragment, 'recommendations', false) - const status = get(collection, 'status', 'draft') return ( isReviewer && - (hasRevision || hasRecommendation) && - canReviewerViewEditorialCommentsStatuses.includes(status) + (hasDecision || + (hasRevision && + canReviewerViewEditorialCommentsStatuses.includes(status))) ) } const cannotAuthorViewEditorialCommentsStatuses = [ @@ -430,3 +429,22 @@ export const canSubmitRevision = (state, fragment = {}) => { return get(fragment, 'revision', null) && fragmentAuthors.includes(userId) } // #endregion + +export const getVersionOptions = (state, collection = {}) => { + const fragments = get(state, 'fragments', {}) + + return chain(collection) + .get('fragments', []) + .reduce( + (acc, el) => [ + ...acc, + { + value: el, + label: `Version ${get(fragments, `${el}.version`)}`, + }, + ], + [], + ) + .reverse() + .value() +} diff --git a/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptDetailsTop.js b/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptDetailsTop.js index 2564bf721c3db9d5cd719b699f1d18c57f319d5a..6a4c5dfb3a2d273cc235ae240e18c48561ff6fd4 100644 --- a/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptDetailsTop.js +++ b/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptDetailsTop.js @@ -16,6 +16,7 @@ import { const ManuscriptDetailsTop = ({ history, + versions, goToEdit, getSignedUrl, goToTechnicalCheck, @@ -78,6 +79,7 @@ const ManuscriptDetailsTop = ({ collection={collection} fragment={fragment} history={history} + versions={versions} /> </Item> </Row> diff --git a/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptVersion.js b/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptVersion.js index 76554162238745e57ab0475e77e6f8f9c61b78fd..2f7473750f267ef12771024e3480984dd06f82f9 100644 --- a/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptVersion.js +++ b/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptVersion.js @@ -1,38 +1,23 @@ import React from 'react' import { get } from 'lodash' import { Menu } from '@pubsweet/ui' -import { compose, withHandlers, withProps } from 'recompose' const ManuscriptVersion = ({ history, - fragments, + versions, fragment = {}, collection = {}, - parseVersionOptions, }) => - !!fragments.length && ( + versions.length > 0 && ( <Menu inline onChange={v => history.push(`/projects/${collection.id}/versions/${v}/details`) } - options={parseVersionOptions(fragments)} + options={versions} placeholder="Please select" value={get(fragment, 'id')} /> ) -export default compose( - withProps(({ collection = {} }) => ({ - fragments: get(collection, 'fragments', []), - })), - withHandlers({ - parseVersionOptions: ({ fragments }) => () => - fragments - .map((f, index) => ({ - value: f, - label: `Version ${index + 1}`, - })) - .reverse(), - }), -)(ManuscriptVersion) +export default ManuscriptVersion diff --git a/packages/component-helper-service/src/services/Fragment.js b/packages/component-helper-service/src/services/Fragment.js index db1ae899ea6226d5214c63326d693f9d31b4bb5d..174067efdfe0cbb7e7e7f627f5a8fd53884bd7f0 100644 --- a/packages/component-helper-service/src/services/Fragment.js +++ b/packages/component-helper-service/src/services/Fragment.js @@ -94,12 +94,9 @@ class Fragment { const { fragment: { invitations = [], recommendations = [] } } = this let filteredInvitations = isAccepted ? invitations.filter( - inv => - inv.role === role && - inv.hasAnswer === true && - inv.isAccepted === true, + inv => inv.role === role && inv.hasAnswer && inv.isAccepted, ) - : invitations.filter(inv => inv.role === role && inv.hasAnswer === false) + : invitations.filter(inv => inv.role === role && !inv.hasAnswer) if (type === 'submitted') { filteredInvitations = filteredInvitations.filter(inv => diff --git a/packages/component-manuscript-manager/src/routes/fragments/patch.js b/packages/component-manuscript-manager/src/routes/fragments/patch.js index 09e3dbc8f106ff8414952801c8b722eb9e0d711b..f28b8cc0847abbbdaff894bc7f4337572a28877c 100644 --- a/packages/component-manuscript-manager/src/routes/fragments/patch.js +++ b/packages/component-manuscript-manager/src/routes/fragments/patch.js @@ -70,10 +70,7 @@ module.exports = models => async (req, res) => { fragment.save() if (heRecommendation.recommendation === 'major') { - const reviewerIds = newFragment.invitations.map(inv => { - const { userId } = inv - return userId - }) + const reviewerIds = newFragment.invitations.map(inv => inv.userId) teamHelper.createTeam({ role: 'reviewer', diff --git a/packages/component-manuscript/src/components/ManuscriptLayout.js b/packages/component-manuscript/src/components/ManuscriptLayout.js index 81d2be237da6cecd3d7c9611c311455b1e6d31b5..c3e8683307b2b599e99a166cef78f693f2b78ddb 100644 --- a/packages/component-manuscript/src/components/ManuscriptLayout.js +++ b/packages/component-manuscript/src/components/ManuscriptLayout.js @@ -64,6 +64,7 @@ const ManuscriptLayout = ({ inviteReviewer, recommendationHandler, inviteHandlingEditor, + versions, }) => ( <Root pb={30}> {!isEmpty(collection) && !isEmpty(fragment) ? ( @@ -74,6 +75,7 @@ const ManuscriptLayout = ({ fragment={fragment} getSignedUrl={getSignedUrl} history={history} + versions={versions} /> <ManuscriptHeader collection={collection} @@ -86,6 +88,7 @@ const ManuscriptLayout = ({ journal={journal} resendInvitation={inviteHandlingEditor.assignHE} revokeInvitation={inviteHandlingEditor.revokeHE} + versions={versions} /> <ManuscriptMetadata diff --git a/packages/component-manuscript/src/components/ManuscriptPage.js b/packages/component-manuscript/src/components/ManuscriptPage.js index b5cf99de5920698973d35e857737db2e6cb0432c..0b77b64cdfeaecaa7e71b9089627d0aade3a2519 100644 --- a/packages/component-manuscript/src/components/ManuscriptPage.js +++ b/packages/component-manuscript/src/components/ManuscriptPage.js @@ -54,6 +54,7 @@ import { canAuthorViewEditorialComments, getFragmentReviewerRecommendations, getInvitationsWithReviewersForFragment, + getVersionOptions, } from 'pubsweet-component-faraday-selectors' import { handleError, @@ -205,6 +206,7 @@ export default compose( state, get(fragment, 'id', ''), ), + versions: getVersionOptions(state, collection), }), ), ConnectPage(({ currentUser }) => { diff --git a/packages/component-manuscript/src/handleRecommendation/withHandleRecommendation.js b/packages/component-manuscript/src/handleRecommendation/withHandleRecommendation.js index 020d7e45d83fb81dc3741476545ef7704f91affb..19fb97c4dfebe3f607e57735c735ec778b62b69e 100644 --- a/packages/component-manuscript/src/handleRecommendation/withHandleRecommendation.js +++ b/packages/component-manuscript/src/handleRecommendation/withHandleRecommendation.js @@ -52,7 +52,7 @@ export default compose( }, }), withProps(props => ({ - recommendationHandle: { + recommendationHandler: { ...pick(props, ['createRecommendation', 'onEditorialRecommendation']), }, })), diff --git a/packages/xpub-faraday/config/authsome-helpers.js b/packages/xpub-faraday/config/authsome-helpers.js index 1f885f1b2d421e5fd996f2c37de90f2ba8aa659d..c92571ecc8808a78710f8631b5fff43629b0d60b 100644 --- a/packages/xpub-faraday/config/authsome-helpers.js +++ b/packages/xpub-faraday/config/authsome-helpers.js @@ -247,7 +247,10 @@ const getCollections = async ({ user, models }) => { }) } - return { ...collection, visibleStatus } + return { + ...collection, + visibleStatus, + } }), )).filter(Boolean) } @@ -259,7 +262,9 @@ async function updateReviewerVisibleStatusByInvitation({ }) { const fragmentId = last(collection.fragments) const fragment = await FragmentModel.find(fragmentId) - const invitation = fragment.invitations.find(inv => inv.userId === user.id) + const invitation = get(fragment, 'invitations', []).find( + inv => inv.userId === user.id, + ) const recommendationDone = fragment.recommendations && fragment.recommendations.some( @@ -273,7 +278,8 @@ async function updateReviewerVisibleStatusByInvitation({ return get(statuses, `${collection.status}.reviewer.label`) } - return invitation.hasAnswer && invitation.isAccepted + return get(invitation, 'hasAnswer', false) && + get(invitation, 'isAccepted', false) ? get(statuses, `underReview.reviewer.label`) : get(statuses, `reviewersInvited.reviewer.label`) } diff --git a/packages/xpub-faraday/config/authsome-mode.js b/packages/xpub-faraday/config/authsome-mode.js index 7b269f3855277ae6aea96a9afca4043f647af6f2..2bb207ebd4264f3d3210d226bb0134e25e0b1bff 100644 --- a/packages/xpub-faraday/config/authsome-mode.js +++ b/packages/xpub-faraday/config/authsome-mode.js @@ -73,6 +73,12 @@ async function applyAuthenticatedUserPolicy(user, operation, object, context) { Team: context.models.Team, }) + const fragmentPermissions = userPermissions + .filter( + up => up.objectType === 'fragment' && up.role === 'reviewer', + ) + .map(up => up.objectId) + // if (collection.owners.map(o => o.id).includes(user.id)) { // return collection // } @@ -98,6 +104,12 @@ async function applyAuthenticatedUserPolicy(user, operation, object, context) { return { ...collection, + fragments: + role !== 'reviewer' + ? collection.fragments + : collection.fragments.filter(fragId => + fragmentPermissions.includes(fragId), + ), visibleStatus, } },