diff --git a/packages/component-faraday-selectors/src/index.js b/packages/component-faraday-selectors/src/index.js index ad815f61de09f8514c57cb1fb1b900b00e2ecb3e..ad0747cc02c078d460e87734def415d3dde1932b 100644 --- a/packages/component-faraday-selectors/src/index.js +++ b/packages/component-faraday-selectors/src/index.js @@ -82,6 +82,15 @@ export const canMakeRevision = (state, collection) => { ) } +export const currentUserIsAuthor = (state, id) => { + const permissions = getUserPermissions(state) || [] + + return permissions + .filter(f => f.role === 'author') + .map(p => p.objectId) + .includes(id) +} + export const getUserPermissions = ({ currentUser }) => get(currentUser, 'user.teams').map(t => ({ objectId: t.object.id, diff --git a/packages/component-manuscript-manager/src/routes/fragments/post.js b/packages/component-manuscript-manager/src/routes/fragments/post.js index d0b5b18f6d4592f681bcd14298c8cedd5c194c0d..b54399b0cc006f469863bbfabaaecb0c8bab3150 100644 --- a/packages/component-manuscript-manager/src/routes/fragments/post.js +++ b/packages/component-manuscript-manager/src/routes/fragments/post.js @@ -48,6 +48,9 @@ module.exports = models => async (req, res) => { }) email.setupManuscriptSubmittedEmail() + collection.status = 'submitted' + collection.save() + return res.status(200).json(fragment) } catch (e) { const notFoundError = await services.handleNotFoundError(e, 'Item') diff --git a/packages/component-manuscript/src/components/Files.js b/packages/component-manuscript/src/components/Files.js index 8a9c4057dcde3b1afd47989544bc7860ef6ac655..cb3315829631061e90b79fee25372d9c76507e11 100644 --- a/packages/component-manuscript/src/components/Files.js +++ b/packages/component-manuscript/src/components/Files.js @@ -5,7 +5,12 @@ import styled, { css } from 'styled-components' import { FileItem } from 'pubsweet-components-faraday/src/components/Files' const Files = ({ - files: { manuscripts = [], coverLetter = [], supplementary = [] }, + files: { + manuscripts = [], + coverLetter = [], + supplementary = [], + responseToReviewers = [], + }, }) => ( <Root> {!!manuscripts.length && ( @@ -41,6 +46,17 @@ const Files = ({ ))} </Fragment> )} + {!!responseToReviewers.length && ( + <Fragment> + <Header> + <span>Response to Reviewers</span> + <div /> + </Header> + {responseToReviewers.map(file => ( + <FileItem compact id={file.id} key={file.id} {...file} /> + ))} + </Fragment> + )} </Root> ) @@ -60,9 +76,9 @@ const Header = styled.div` flex-direction: row; & span { - ${defaultText}; margin-right: ${th('subGridUnit')}; margin-top: ${th('subGridUnit')}; + ${defaultText}; text-transform: uppercase; } diff --git a/packages/component-manuscript/src/components/ReviewReportCard.js b/packages/component-manuscript/src/components/ReviewReportCard.js index ff357bec2509e18d1a2d164f1f8a26945ec0f8cf..9617ac681434f4718e7494dd11a2fba86f679724 100644 --- a/packages/component-manuscript/src/components/ReviewReportCard.js +++ b/packages/component-manuscript/src/components/ReviewReportCard.js @@ -12,6 +12,7 @@ import { ShowMore } from './' const ReviewReportCard = ({ i = 0, report = {}, + showBorder = false, journal: { recommendations }, }) => { const hasReviewer = !isEmpty(get(report, 'user')) @@ -24,7 +25,7 @@ const ReviewReportCard = ({ ) return ( - <Root hasReviewer={hasReviewer}> + <Root showBorder={showBorder}> {hasReviewer && ( <Row> <Text> @@ -117,7 +118,7 @@ const Root = styled.div` margin: auto; border: none; padding: 0; - ${({ hasReviewer }) => (hasReviewer ? cardStyle : null)}; + ${({ showBorder }) => (showBorder ? cardStyle : null)}; ` const Text = styled.div` ${defaultText}; diff --git a/packages/component-manuscript/src/components/ReviewReportsList.js b/packages/component-manuscript/src/components/ReviewReportsList.js new file mode 100644 index 0000000000000000000000000000000000000000..ee47831817b963a6dc04a3d0361ffed6d2a98c64 --- /dev/null +++ b/packages/component-manuscript/src/components/ReviewReportsList.js @@ -0,0 +1,21 @@ +import React, { Fragment } from 'react' +import { ReviewReportCard } from './' + +const ReviewReportsList = ({ recommendations, showBorder }) => ( + <Fragment> + {recommendations.length ? ( + recommendations.map((r, index) => ( + <ReviewReportCard + i={index + 1} + key={r.id} + report={r} + showBorder={showBorder} + /> + )) + ) : ( + <div>No reports submitted yet.</div> + )} + </Fragment> +) + +export default ReviewReportsList diff --git a/packages/component-manuscript/src/components/ReviewsAndReports.js b/packages/component-manuscript/src/components/ReviewsAndReports.js index ced7097c6c243e89b12228118c210f16fa3caedf..126be81551c3ebf04077dd977e7fea0fda791e63 100644 --- a/packages/component-manuscript/src/components/ReviewsAndReports.js +++ b/packages/component-manuscript/src/components/ReviewsAndReports.js @@ -15,8 +15,11 @@ import { import { selectRecommendations } from 'pubsweet-components-faraday/src/redux/recommendations' import { Tabs, Expandable } from '../molecules' -import { ReviewReportCard, ReviewerReportForm } from './' -import { canSeeReviewersReports } from '../../../component-faraday-selectors' +import { ReviewReportCard, ReviewerReportForm, ReviewReportsList } from './' +import { + canSeeReviewersReports, + currentUserIsAuthor, +} from '../../../component-faraday-selectors' const getTabSections = (collectionId, reviewers, recommendations = []) => [ { @@ -29,17 +32,7 @@ const getTabSections = (collectionId, reviewers, recommendations = []) => [ { key: 2, label: 'Reviewer Reports', - content: ( - <Fragment> - {recommendations.length ? ( - recommendations.map((r, index) => ( - <ReviewReportCard i={index + 1} key={r.id} report={r} /> - )) - ) : ( - <div>No reports submitted yet.</div> - )} - </Fragment> - ), + content: <ReviewReportsList recommendations={recommendations} showBorder />, }, ] @@ -47,6 +40,7 @@ const ReviewsAndReports = ({ report, project, version, + isAuthor, isReviewer, mappedReviewers, mappedRecommendations, @@ -60,7 +54,7 @@ const ReviewsAndReports = ({ }) => ( <Fragment> {canSeeReviewersReports && ( - <Root> + <Root id="reviews-and-reports"> <Expandable label="Reviewers & Reports" rightHTML={ @@ -83,7 +77,7 @@ const ReviewsAndReports = ({ </Root> )} {isReviewer && ( - <Root id="review-report"> + <Root id="reviewer-report"> <Expandable label="Your Report" startExpanded> {get(reviewerRecommendation, 'submittedOn') ? ( <ReviewReportCard report={reviewerRecommendation} /> @@ -98,6 +92,14 @@ const ReviewsAndReports = ({ </Expandable> </Root> )} + {isAuthor && + !!recommendations.length && ( + <Root id="review-reports"> + <Expandable label="Reports" startExpanded> + <ReviewReportsList recommendations={recommendations} showBorder /> + </Expandable> + </Root> + )} </Fragment> ) @@ -107,6 +109,7 @@ export default compose( reviewers: selectReviewers(state), fetchingReviewers: selectFetchingReviewers(state), isReviewer: currentUserIsReviewer(state, version.id), + isAuthor: currentUserIsAuthor(state, version.id), recommendations: selectRecommendations(state, version.id), canSeeReviewersReports: canSeeReviewersReports(state, project.id), }), diff --git a/packages/component-manuscript/src/components/index.js b/packages/component-manuscript/src/components/index.js index 3509c110448651a67ba4e2659d1bf1bb30abf404..dadf8d4e6ffd637ee1faed3f90c00d99978b5c20 100644 --- a/packages/component-manuscript/src/components/index.js +++ b/packages/component-manuscript/src/components/index.js @@ -13,3 +13,4 @@ export { default as ManuscriptVersion } from './ManuscriptVersion' export { default as ReviewsAndReports } from './ReviewsAndReports' export { default as EditorialComments } from './EditorialComments' export { default as ReviewerReportForm } from './ReviewerReportForm' +export { default as ReviewReportsList } from './ReviewReportsList' diff --git a/packages/component-wizard/src/components/WizardFormStep.js b/packages/component-wizard/src/components/WizardFormStep.js index 5579434a313269425ecd33382e621faf1ea44dd1..c4caa8b12f1bb533d416e01c1d2c716ed6908d0f 100644 --- a/packages/component-wizard/src/components/WizardFormStep.js +++ b/packages/component-wizard/src/components/WizardFormStep.js @@ -7,7 +7,11 @@ import { reduxForm, formValueSelector, SubmissionError } from 'redux-form' import WizardStep from './WizardStep' import { autosaveRequest } from '../redux/autosave' -import { submitRevision, isRevisionFlow } from '../redux/conversion' +import { + submitRevision, + isRevisionFlow, + submitManuscript as submitNewManuscript, +} from '../redux/conversion' const wizardSelector = formValueSelector('wizard') @@ -38,21 +42,7 @@ const submitManuscript = ({ dispatch, redirectPath = '/', }) => { - dispatch( - actions.updateFragment(project, { - id: version.id, - submitted: new Date(), - ...values, - }), - ) - .then(() => - dispatch( - actions.updateCollection({ - id: project.id, - status: 'submitted', - }), - ), - ) + submitNewManuscript(project.id, version.id) .then(() => { history.push(redirectPath, { project: project.id, diff --git a/packages/component-wizard/src/redux/conversion.js b/packages/component-wizard/src/redux/conversion.js index 7f8f205c5c2f595ec7c40fe562c7069c3872662e..a7d861b8e023658d50cd84b2c90d65503598eac3 100644 --- a/packages/component-wizard/src/redux/conversion.js +++ b/packages/component-wizard/src/redux/conversion.js @@ -19,7 +19,7 @@ const generateCustomId = () => .toString() .slice(-7) -export const isRevisionFlow = (state, collection, fragment) => +export const isRevisionFlow = (state, collection, fragment = {}) => collection.fragments.length > 1 && !fragment.submitted /* actions */ @@ -75,6 +75,9 @@ export const createDraftSubmission = history => (dispatch, getState) => { }) } +export const submitManuscript = (collectionId, fragmentId) => + create(`/collections/${collectionId}/fragments/${fragmentId}/submit`) + export const createRevision = ( collection, previousVersion, diff --git a/packages/components-faraday/src/components/Dashboard/DashboardCard.js b/packages/components-faraday/src/components/Dashboard/DashboardCard.js index f126eca8ac1d52f65f8912729a3a4da95e0caa9b..59638dda62cd0f0059f530d3a11105723c954d82 100644 --- a/packages/components-faraday/src/components/Dashboard/DashboardCard.js +++ b/packages/components-faraday/src/components/Dashboard/DashboardCard.js @@ -85,7 +85,9 @@ const DashboardCard = ({ <Icon>download</Icon> </ClickableIcon> </ZipFiles> - {(!project.status || project.status === 'draft') && ( + {(!project.status || + project.status === 'draft' || + !submittedDate) && ( <ActionButtons data-test="button-resume-submission" onClick={() => @@ -118,17 +120,19 @@ const DashboardCard = ({ {manuscriptMeta} </ManuscriptType> {project.status && project.status !== 'draft' ? ( - <Details - data-test="button-details" - onClick={() => - history.push( - `/projects/${project.id}/versions/${version.id}/details`, - ) - } - > - Details - <Icon primary>chevron-right</Icon> - </Details> + submittedDate && ( + <Details + data-test="button-details" + onClick={() => + history.push( + `/projects/${project.id}/versions/${version.id}/details`, + ) + } + > + Details + <Icon primary>chevron-right</Icon> + </Details> + ) ) : ( <DeleteManuscript deleteProject={() => deleteProject(project)} diff --git a/packages/components-faraday/src/components/Filters/importanceSort.js b/packages/components-faraday/src/components/Filters/importanceSort.js index b86f37c80951a9a4ebbf89bb26ea03d78acb37ca..fd906879dcd0e8af3309ea28d24668984cad8d18 100644 --- a/packages/components-faraday/src/components/Filters/importanceSort.js +++ b/packages/components-faraday/src/components/Filters/importanceSort.js @@ -18,6 +18,10 @@ const sortFn = sortValue => (item1, item2) => { const item1Importance = utils.getCollectionImportance(statuses, item1) const item2Importance = utils.getCollectionImportance(statuses, item2) + if (item1Importance - item2Importance === 0) { + return item1.created - item2.created + } + if (sortValue === SORT_VALUES.MORE_IMPORTANT) { return item2Importance - item1Importance } diff --git a/packages/components-faraday/src/components/Filters/importanceSort.test.js b/packages/components-faraday/src/components/Filters/importanceSort.test.js new file mode 100644 index 0000000000000000000000000000000000000000..b2c270dbbcdc40a45b9fb2f521714f8805c1bd29 --- /dev/null +++ b/packages/components-faraday/src/components/Filters/importanceSort.test.js @@ -0,0 +1,63 @@ +import fixturesService from 'pubsweet-component-fixture-service' + +import { importanceSort } from './' +import { SORT_VALUES } from './importanceSort' + +const { sortFn } = importanceSort +const { fixtures: { collections: { collection } } } = fixturesService + +describe('Importance sort', () => { + describe('Important items first', () => { + // the more important collection is already before the less important one + it('should return a negative value', () => { + const sortResult = sortFn(SORT_VALUES.MORE_IMPORTANT)( + { ...collection, status: 'pendingApproval' }, + { ...collection, status: 'heAssigned' }, + ) + expect(sortResult).toBeLessThan(0) + }) + // the more important collection is after a less important one + it('should return a positive value', () => { + const sortResult = sortFn(SORT_VALUES.MORE_IMPORTANT)( + { ...collection, status: 'heAssigned' }, + { ...collection, status: 'pendingApproval' }, + ) + expect(sortResult).toBeGreaterThan(0) + }) + }) + + describe('Less important items first', () => { + it('should return a positive value', () => { + const sortResult = sortFn(SORT_VALUES.LESS_IMPORTANT)( + { ...collection, status: 'pendingApproval' }, + { ...collection, status: 'heAssigned' }, + ) + expect(sortResult).toBeGreaterThan(0) + }) + it('should return a negative value', () => { + const sortResult = sortFn(SORT_VALUES.LESS_IMPORTANT)( + { ...collection, status: 'heAssigned' }, + { ...collection, status: 'pendingApproval' }, + ) + expect(sortResult).toBeLessThan(0) + }) + }) + + describe('Sort by date if both have the same', () => { + it('should place older item before newer item', () => { + const sortResult = sortFn(SORT_VALUES.LESS_IMPORTANT)( + { ...collection, status: 'heAssigned', created: Date.now() + 2000 }, + { ...collection, status: 'heAssigned', created: Date.now() }, + ) + expect(sortResult).toBeGreaterThan(0) + }) + + it('should not move items', () => { + const sortResult = sortFn(SORT_VALUES.LESS_IMPORTANT)( + { ...collection, status: 'heAssigned', created: Date.now() }, + { ...collection, status: 'heAssigned', created: Date.now() + 2000 }, + ) + expect(sortResult).toBeLessThan(0) + }) + }) +}) diff --git a/packages/components-faraday/src/components/Filters/priorityFilter.js b/packages/components-faraday/src/components/Filters/priorityFilter.js index 4222f85fd52fb9caa18b561bdfb8b9960c7b28da..47ffbc88cb6193ba43299838d7474ff58d6337bc 100644 --- a/packages/components-faraday/src/components/Filters/priorityFilter.js +++ b/packages/components-faraday/src/components/Filters/priorityFilter.js @@ -9,19 +9,26 @@ export const FILTER_VALUES = { ALL: 'all', NEEDS_ATTENTION: 'needsAttention', IN_PROGRESS: 'inProgress', + ARCHIVED: 'archived', } const options = [ { label: 'All', value: FILTER_VALUES.ALL }, { label: 'Needs Attention', value: FILTER_VALUES.NEEDS_ATTENTION }, { label: 'In Progress', value: FILTER_VALUES.IN_PROGRESS }, + { label: 'Archived', value: FILTER_VALUES.ARCHIVED }, ] +const archivedStatuses = ['withdrawn', 'accepted', 'rejected'] + const filterFn = (filterValue, { currentUser, userPermissions = [] }) => ({ id = '', fragments = [], status = 'draft', }) => { + if (filterValue === FILTER_VALUES.ARCHIVED) { + return archivedStatuses.includes(status) + } const permission = userPermissions.find( ({ objectId }) => objectId === id || fragments.includes(objectId), ) @@ -30,7 +37,10 @@ const filterFn = (filterValue, { currentUser, userPermissions = [] }) => ({ case FILTER_VALUES.NEEDS_ATTENTION: return get(statuses, `${status}.${userRole}.needsAttention`) case FILTER_VALUES.IN_PROGRESS: - return !get(statuses, `${status}.${userRole}.needsAttention`) + return ( + !archivedStatuses.includes(status) && + !get(statuses, `${status}.${userRole}.needsAttention`) + ) default: return true } diff --git a/packages/components-faraday/src/components/Filters/priorityFilter.test.js b/packages/components-faraday/src/components/Filters/priorityFilter.test.js index ce0d9b6b0afc43dccb4174f5a7efc12717ef5046..ac2f07d2f7f5f4ffa937073fe3d96ea1bc6c88ec 100644 --- a/packages/components-faraday/src/components/Filters/priorityFilter.test.js +++ b/packages/components-faraday/src/components/Filters/priorityFilter.test.js @@ -123,6 +123,18 @@ describe('Priority filter function for reviewersInvited status', () => { expect(filterResult).toBeFalsy() }) }) + + describe('ARCHIVED', () => { + it('should return falsy', () => { + const filterResult = filterFn(FILTER_VALUES.ARCHIVED, { + currentUser: users.admin, + })({ + ...collection, + status: 'reviewersInvited', + }) + expect(filterResult).toBeFalsy() + }) + }) }) describe('Priority filter function for technicalChecks status', () => { @@ -239,6 +251,18 @@ describe('Priority filter function for technicalChecks status', () => { expect(filterResult).toBeFalsy() }) }) + + describe('ARCHIVED', () => { + it('should return falsy', () => { + const filterResult = filterFn(FILTER_VALUES.ARCHIVED, { + currentUser: users.admin, + })({ + ...collection, + status: 'technicalChecks', + }) + expect(filterResult).toBeFalsy() + }) + }) }) describe('Priority filter function for pendingApproval status', () => { @@ -355,4 +379,58 @@ describe('Priority filter function for pendingApproval status', () => { expect(filterResult).toBeFalsy() }) }) + + describe('ARCHIVED', () => { + it('should return falsy', () => { + const filterResult = filterFn(FILTER_VALUES.ARCHIVED, { + currentUser: users.admin, + })({ + ...collection, + status: 'pendingApproval', + }) + expect(filterResult).toBeFalsy() + }) + }) +}) + +describe('Priority filter function for archived statuses', () => { + it('should show rejected manuscripts', () => { + const filterResult = filterFn(FILTER_VALUES.ARCHIVED, { + currentUser: users.admin, + })({ + ...collection, + status: 'rejected', + }) + expect(filterResult).toBeTruthy() + }) + + it('should show withdrawn manuscripts', () => { + const filterResult = filterFn(FILTER_VALUES.ARCHIVED, { + currentUser: users.admin, + })({ + ...collection, + status: 'withdrawn', + }) + expect(filterResult).toBeTruthy() + }) + + it('should show accepted manuscripts', () => { + const filterResult = filterFn(FILTER_VALUES.ARCHIVED, { + currentUser: users.admin, + })({ + ...collection, + status: 'accepted', + }) + expect(filterResult).toBeTruthy() + }) + + it('should not show pendingApproval manuscripts', () => { + const filterResult = filterFn(FILTER_VALUES.ARCHIVED, { + currentUser: users.admin, + })({ + ...collection, + status: 'pendingApproval', + }) + expect(filterResult).toBeFalsy() + }) }) diff --git a/packages/xpub-faraday/config/authsome-helpers.js b/packages/xpub-faraday/config/authsome-helpers.js index 8b5a135a30aa8f7bc660d518664db6b32001017a..56f1495a32349c9bafda65a920dab6b9f5560305 100644 --- a/packages/xpub-faraday/config/authsome-helpers.js +++ b/packages/xpub-faraday/config/authsome-helpers.js @@ -126,12 +126,15 @@ const hasFragmentInDraft = async ({ object, Fragment }) => { return isInDraft(fragment) } -const filterAuthorRecommendationData = recommendation => { - const { comments } = recommendation - return { - ...recommendation, - comments: comments ? comments.filter(c => c.public) : [], +const filterAuthorRecommendations = (recommendations, status) => { + const canViewRecommendations = authorAllowedStatuses.includes(status) + if (canViewRecommendations) { + return recommendations.map(r => ({ + ...r, + comments: r.comments ? r.comments.filter(c => c.public) : [], + })) } + return [] } const stripeCollectionByRole = (coll = {}, role = '') => { @@ -139,26 +142,32 @@ const stripeCollectionByRole = (coll = {}, role = '') => { const { handlingEditor } = coll if (!authorAllowedStatuses.includes(coll.status)) { - coll = { + return { ...coll, - handlingEditor: handlingEditor && { - ...omit(handlingEditor, keysToOmit), - name: 'Assigned', - }, + handlingEditor: handlingEditor && + handlingEditor.isAccepted && { + ...omit(handlingEditor, keysToOmit), + name: 'Assigned', + }, } } } return coll } -const stripeFragmentByRole = (fragment = {}, role = '', user = {}) => { +const stripeFragmentByRole = ({ + fragment = {}, + role = '', + status = 'draft', + user = {}, +}) => { const { recommendations, files, authors } = fragment switch (role) { case 'author': return { ...fragment, recommendations: recommendations - ? recommendations.map(filterAuthorRecommendationData) + ? filterAuthorRecommendations(recommendations, status) : [], } case 'reviewer': diff --git a/packages/xpub-faraday/config/authsome-mode.js b/packages/xpub-faraday/config/authsome-mode.js index 2aada0e12aef4d742f83a5847ae150a6a58079fa..9b444f9705c21ca314235e2ed7757d965e4e2038 100644 --- a/packages/xpub-faraday/config/authsome-mode.js +++ b/packages/xpub-faraday/config/authsome-mode.js @@ -117,8 +117,8 @@ async function applyAuthenticatedUserPolicy(user, operation, object, context) { } if (get(object, 'type') === 'fragment') { - if (helpers.isInDraft(object) && !helpers.isOwner({ user, object })) { - return false + if (helpers.isInDraft(object)) { + return helpers.isOwner({ user, object }) } const userPermissions = await helpers.getUserPermissions({ @@ -132,9 +132,17 @@ async function applyAuthenticatedUserPolicy(user, operation, object, context) { if (!permission) return false + const collectionId = get(object, 'collectionId') + const { status } = await context.models.Collection.find(collectionId) + return { filter: fragment => - helpers.stripeFragmentByRole(fragment, permission.role, user), + helpers.stripeFragmentByRole({ + fragment, + role: permission.role, + status, + user, + }), } } diff --git a/packages/xpub-faraday/tests/authsome-helpers.test.js b/packages/xpub-faraday/tests/authsome-helpers.test.js index 8999b892b2b80a1ef5b92ffa35f8f823d84f9580..cdc942b01bdb01d6b6965c6b7b0c5983d9a962db 100644 --- a/packages/xpub-faraday/tests/authsome-helpers.test.js +++ b/packages/xpub-faraday/tests/authsome-helpers.test.js @@ -14,13 +14,17 @@ describe('Authsome Helpers', () => { }) it('stripeFragment - should return fragment', () => { const { fragment } = testFixtures.fragments - const result = ah.stripeFragmentByRole(fragment) + const result = ah.stripeFragmentByRole({ fragment }) expect(result).toBeTruthy() }) - it('stripeCollection - author should not see HE name before recommendation made', () => { + it('stripeCollection - author should not see accepted HE name before recommendation made', () => { const { collection } = testFixtures.collections collection.status = 'underReview' + collection.handlingEditor = { + ...collection.handlingEditor, + isAccepted: true, + } const result = ah.stripeCollectionByRole(collection, 'author') const { handlingEditor = {} } = result @@ -29,6 +33,21 @@ describe('Authsome Helpers', () => { expect(handlingEditor.name).toEqual('Assigned') }) + it('stripeCollection - author should not see Assigned until HE accepted ', () => { + const { collection } = testFixtures.collections + collection.status = 'underReview' + collection.handlingEditor = { + ...collection.handlingEditor, + isAccepted: false, + } + + const result = ah.stripeCollectionByRole(collection, 'author') + const { handlingEditor = {} } = result + + expect(handlingEditor).toBeFalsy() + expect(handlingEditor.name).not.toEqual('Assigned') + }) + it('stripeCollection - author should see HE name after recommendation made', () => { const { collection } = testFixtures.collections collection.status = 'revisionRequested' @@ -69,13 +88,13 @@ describe('Authsome Helpers', () => { it('stripeFragment - reviewer should not see authors email', () => { const { fragment } = testFixtures.fragments - const result = ah.stripeFragmentByRole(fragment, 'reviewer') + const result = ah.stripeFragmentByRole({ fragment, role: 'reviewer' }) const { authors = [] } = result expect(authors[0].email).toBeFalsy() }) it('stripeFragment - other roles than reviewer should see authors emails', () => { const { fragment } = testFixtures.fragments - const result = ah.stripeFragmentByRole(fragment, 'author') + const result = ah.stripeFragmentByRole({ fragment, role: 'author' }) const { authors = [] } = result expect(authors[0].email).toBeTruthy() @@ -83,18 +102,41 @@ describe('Authsome Helpers', () => { it('stripeFragment - reviewer should not see cover letter', () => { const { fragment } = testFixtures.fragments - const result = ah.stripeFragmentByRole(fragment, 'reviewer') + const result = ah.stripeFragmentByRole({ fragment, role: 'reviewer' }) const { files = {} } = result expect(files.coverLetter).toBeFalsy() }) it('stripeFragment - reviewer should not see others reviews', () => { const { fragment } = testFixtures.fragments - const result = ah.stripeFragmentByRole(fragment, 'reviewer') + const result = ah.stripeFragmentByRole({ fragment, role: 'reviewer' }) const { recommendations } = result expect(recommendations).toEqual([]) }) - it('stripeFragment - author should not see private recommendations comments', () => { + it('stripeFragment - author should not see recommendations if a decision has not been made', () => { + const { fragment } = testFixtures.fragments + fragment.recommendations = [ + { + comments: [ + { + content: 'private', + public: false, + }, + { + content: 'public', + public: true, + }, + ], + }, + ] + const { recommendations } = ah.stripeFragmentByRole({ + fragment, + role: 'author', + status: 'underReview', + }) + expect(recommendations).toHaveLength(0) + }) + it('stripeFragment - author should see reviews only if recommendation has been made and only public ones', () => { const { fragment } = testFixtures.fragments fragment.recommendations = [ { @@ -110,8 +152,12 @@ describe('Authsome Helpers', () => { ], }, ] - const result = ah.stripeFragmentByRole(fragment, 'author') - const privateComments = get(result, 'recommendations[0].comments') - expect(privateComments).toHaveLength(1) + const result = ah.stripeFragmentByRole({ + fragment, + role: 'author', + status: 'revisionRequested', + }) + const publicComments = get(result, 'recommendations[0].comments') + expect(publicComments).toHaveLength(1) }) })