From 1aa946673f38e4f7c2410be3280347320a3762aa Mon Sep 17 00:00:00 2001 From: Tania Fecheta <tania.fecheta@thinslices.com> Date: Wed, 21 Nov 2018 15:45:46 +0200 Subject: [PATCH] feat(reviewerReports): one reviewer can see other reviwers reports from previous version --- .../component-faraday-selectors/src/index.js | 20 +++++- .../src/components/ManuscriptLayout.js | 14 +++-- .../src/components/ManuscriptPage.js | 6 ++ .../src/components/ReviewerReports.js | 50 +++++++++++++++ .../xpub-faraday/config/authsome-helpers.js | 61 +++++++++++++------ 5 files changed, 128 insertions(+), 23 deletions(-) create mode 100644 packages/component-manuscript/src/components/ReviewerReports.js diff --git a/packages/component-faraday-selectors/src/index.js b/packages/component-faraday-selectors/src/index.js index 728b2e28a..cd9e312e0 100644 --- a/packages/component-faraday-selectors/src/index.js +++ b/packages/component-faraday-selectors/src/index.js @@ -67,7 +67,7 @@ export const canViewReviewersDetails = (state, collection = {}) => { return canViewReports(state, get(collection, 'id', '')) } -const authorCanViewReportsDetailsStatuses = [ +const authorAndReviewersCanViewReportsDetailsStatuses = [ 'revisionRequested', 'pendingApproval', 'rejected', @@ -83,12 +83,28 @@ export const authorCanViewReportsDetails = ( ) => { const isAuthor = currentUserIsAuthor(state, fragmentId) return ( - authorCanViewReportsDetailsStatuses.includes( + authorAndReviewersCanViewReportsDetailsStatuses.includes( get(collection, 'status', 'draft'), ) && isAuthor ) } +export const reviewersCanViewReviewerReports = ( + state, + collection = {}, + fragmentId, +) => { + const isReviewer = currentUserIsReviewer(state, fragmentId) + const reviewerReports = getFragmentReviewerRecommendations(state, fragmentId) + return ( + isReviewer && + authorAndReviewersCanViewReportsDetailsStatuses.includes( + get(collection, 'status', 'draft'), + ) && + reviewerReports.length > 0 + ) +} + const canHeViewEditorialCommentsStatuses = [ 'revisionRequested', 'rejected', diff --git a/packages/component-manuscript/src/components/ManuscriptLayout.js b/packages/component-manuscript/src/components/ManuscriptLayout.js index 4953fa278..f292701d6 100644 --- a/packages/component-manuscript/src/components/ManuscriptLayout.js +++ b/packages/component-manuscript/src/components/ManuscriptLayout.js @@ -17,9 +17,9 @@ import { ResponseToRevisionRequest, } from 'pubsweet-component-faraday-ui' -import ReviewerReportCard from './ReviewReportCard' import ReviewerReportForm from './ReviewerReportForm' import EditorialCommentCard from './EditorialCommentCard' +import ReviewerReports from './ReviewerReports' const messagesLabel = { 'return-to-handling-editor': 'Comments for Handling Editor', @@ -128,11 +128,17 @@ const ManuscriptLayout = ({ /> )} - {submittedOwnRecommendation && ( - <ReviewerReportCard + {get( + currentUser, + 'permissions.reviewersCanViewReviewerReports', + false, + ) && ( + <ReviewerReports + currentUser={currentUser} getSignedUrl={getSignedUrl} + isLatestVersion={isLatestVersion} journal={journal} - report={submittedOwnRecommendation} + reports={reviewerRecommendations} token={get(currentUser, 'token')} /> )} diff --git a/packages/component-manuscript/src/components/ManuscriptPage.js b/packages/component-manuscript/src/components/ManuscriptPage.js index 89b5dadef..0ba16b98b 100644 --- a/packages/component-manuscript/src/components/ManuscriptPage.js +++ b/packages/component-manuscript/src/components/ManuscriptPage.js @@ -57,6 +57,7 @@ import { getOwnPendingRecommendation, getOwnSubmittedRecommendation, canAuthorViewEditorialComments, + reviewersCanViewReviewerReports, canHEMakeRecommendationToPublish, getFragmentReviewerRecommendations, getInvitationsWithReviewersForFragment, @@ -195,6 +196,11 @@ export default compose( collection, get(fragment, 'id', ''), ), + reviewersCanViewReviewerReports: reviewersCanViewReviewerReports( + state, + collection, + get(fragment, 'id', ''), + ), canOverrideTechChecks: canOverrideTechnicalChecks(state, collection), canAuthorViewEditorialComments: canAuthorViewEditorialComments( state, diff --git a/packages/component-manuscript/src/components/ReviewerReports.js b/packages/component-manuscript/src/components/ReviewerReports.js new file mode 100644 index 000000000..a9b33e8eb --- /dev/null +++ b/packages/component-manuscript/src/components/ReviewerReports.js @@ -0,0 +1,50 @@ +import React from 'react' +import { + ReviewerReport, + ContextualBox, + withFilePreview, + withFileDownload, + Text, + Row, +} from 'pubsweet-component-faraday-ui' + +const SubmittedReports = ({ reports }) => ( + <Row fitContent justify="flex-end"> + <Text customId mr={1 / 2}> + {reports} + </Text> + <Text mr={1 / 2} pr={1 / 2} secondary> + {' '} + submitted + </Text> + </Row> +) + +const ReviewReportCard = ({ + journal, + reports, + previewFile, + downloadFile, + isLatestVersion, +}) => ( + <ContextualBox + label={isLatestVersion ? 'Your Report' : 'Reviewer Reports'} + mb={2} + rightChildren={<SubmittedReports reports={reports.length} />} + startExpanded + > + {reports.map((report, index) => ( + <ReviewerReport + journal={journal} + key={report.id} + onDownload={downloadFile} + onPreview={previewFile} + report={report} + reviewerIndex={index + 1} + showOwner + /> + ))} + </ContextualBox> +) + +export default withFileDownload(withFilePreview(ReviewReportCard)) diff --git a/packages/xpub-faraday/config/authsome-helpers.js b/packages/xpub-faraday/config/authsome-helpers.js index 08e583c72..1dc69faf3 100644 --- a/packages/xpub-faraday/config/authsome-helpers.js +++ b/packages/xpub-faraday/config/authsome-helpers.js @@ -72,6 +72,24 @@ const filterAuthorRecommendations = (recommendations, status, isLast) => { return [] } +const filterReviewerRecommendations = (recommendations, user) => { + const ownRecommendationFromCurrentFragment = recommendations.find( + r => r.userId === user.id, + ) + if (ownRecommendationFromCurrentFragment) + return recommendations + .filter( + r => r.submittedOn || r.recommendationType === 'editorRecommendation', + ) + .map( + r => + r.userId !== ownRecommendationFromCurrentFragment.userId + ? { ...r, comments: r.comments.filter(c => c.public === true) } + : { ...r }, + ) + return [] +} + const stripeCollectionByRole = ({ collection = {}, role = '' }) => { if (role === 'author') { const { handlingEditor } = collection @@ -106,23 +124,32 @@ const stripeFragmentByRole = ({ : [], } case 'reviewer': - return { - ...fragment, - files: omit(files, ['coverLetter']), - authors: authors.map(a => omit(a, ['email'])), - recommendations: recommendations - ? recommendations - .filter( - r => - r.userId === user.id || - r.recommendationType === 'editorRecommendation', - ) - .map(r => ({ - ...r, - comments: r.comments.filter(c => c.public === true), - })) - : [], - } + return isLast + ? { + ...fragment, + files: omit(files, ['coverLetter']), + authors: authors.map(a => omit(a, ['email'])), + recommendations: recommendations + ? recommendations + .filter( + r => + r.userId === user.id || + r.recommendationType === 'editorRecommendation', + ) + .map(r => ({ + ...r, + comments: r.comments.filter(c => c.public === true), + })) + : [], + } + : { + ...fragment, + files: omit(files, ['coverLetter']), + authors: authors.map(a => omit(a, ['email'])), + recommendations: recommendations + ? filterReviewerRecommendations(recommendations, user) + : [], + } case 'handlingEditor': return { ...fragment, -- GitLab