diff --git a/packages/component-faraday-selectors/src/index.js b/packages/component-faraday-selectors/src/index.js index 925aac7a881fce50bf971f765a560042755bf468..fab299296f67b3f089781024a0c9a37c4dd7ed81 100644 --- a/packages/component-faraday-selectors/src/index.js +++ b/packages/component-faraday-selectors/src/index.js @@ -53,6 +53,7 @@ const cannotViewReviewersDetails = [ 'submitted', 'heInvited', ] + export const canViewReviewersDetails = (state, collection = {}) => { if (cannotViewReviewersDetails.includes(get(collection, 'status', 'draft'))) { return false @@ -60,6 +61,42 @@ export const canViewReviewersDetails = (state, collection = {}) => { return canViewReports(state, collection.id) } +const canHeViewEditorialCommentsStatuses = [ + 'revisionRequested', + 'rejected', + 'accepted', + 'inQA', + 'pendingApproval', +] +export const canHeViewEditorialComments = (state, collection = {}) => { + const isHE = isHEToManuscript(state, collection.id) + const status = get(collection, 'status', 'draft') + return isHE && canHeViewEditorialCommentsStatuses.includes(status) +} + +const canEICViewEditorialCommentsStatuses = ['rejected', 'accepted', 'inQA'] +export const canEICViewEditorialComments = (state, collection = {}) => { + const isEIC = currentUserIs(state, 'adminEiC') + const status = get(collection, 'status', 'draft') + return isEIC && canEICViewEditorialCommentsStatuses.includes(status) +} + +export const canViewEditorialComments = ( + state, + collection = {}, + fragmentId, +) => { + const editorialRecommentations = getFragmentEditorialComments( + state, + fragmentId, + ) + return ( + (canHeViewEditorialComments(state, collection) || + canEICViewEditorialComments(state, collection)) && + editorialRecommentations.length > 0 + ) +} + export const getUserToken = ({ currentUser }) => get(currentUser, 'user.token', '') @@ -254,6 +291,10 @@ export const getFragmentReviewerRecommendations = (state, fragmentId) => getFragmentRecommendations(state, fragmentId).filter( r => r.recommendationType === 'review', ) +const getFragmentEditorialComments = (state, fragmentId) => + getFragmentRecommendations(state, fragmentId).filter( + r => r.recommendationType === 'editorRecommendation', + ) const getOwnRecommendations = (state, fragmentId) => chain(state) diff --git a/packages/component-faraday-ui/src/ActionLink.js b/packages/component-faraday-ui/src/ActionLink.js index 2f61672b38c201090d65f40eba954d7a6e1a467f..9f27cec30d1ba8e1584fed2f753653c952e23f77 100644 --- a/packages/component-faraday-ui/src/ActionLink.js +++ b/packages/component-faraday-ui/src/ActionLink.js @@ -69,7 +69,6 @@ const ExternalLink = styled.a` text-decoration: underline; } ` - const CustomLink = ExternalLink.withComponent(Link) const Root = styled.div` diff --git a/packages/component-faraday-ui/src/AppBar.js b/packages/component-faraday-ui/src/AppBar.js index f1eef417786cbfbe861325e7bff8e2bb5304ac3d..80dc030cc5b325b62bc929a143d3500009f3a948 100644 --- a/packages/component-faraday-ui/src/AppBar.js +++ b/packages/component-faraday-ui/src/AppBar.js @@ -31,7 +31,7 @@ const AppBar = ({ !isSubmit && currentUser.user && ( <Button - data-test="new-manuscript" + data-test-id="new-manuscript" disabled={!canCreateDraft} ml={2} mr={5} diff --git a/packages/component-faraday-ui/src/AppBarMenu.js b/packages/component-faraday-ui/src/AppBarMenu.js index 48952b453fbd702c5b4ec4257fd8aaa5c61f8ce8..3a3a93ba7b682469bdcd67ff340efc3ebf8996f7 100644 --- a/packages/component-faraday-ui/src/AppBarMenu.js +++ b/packages/component-faraday-ui/src/AppBarMenu.js @@ -75,7 +75,9 @@ const User = styled.div` display: flex; cursor: pointer; ` -const Dropdown = styled.div` +const Dropdown = styled.div.attrs({ + 'data-test-id': props => props['data-test-id'] || 'admin-dropdown', +})` background-color: ${th('appBar.colorBackground')}; border-radius: ${th('borderRadius')}; box-shadow: ${th('boxShadow')}; @@ -86,7 +88,9 @@ const Dropdown = styled.div` z-index: 10; ` -const DropdownOption = styled.div` +const DropdownOption = styled.div.attrs({ + 'data-test-id': props => props['data-test-id'] || 'dropdown-option', +})` align-items: center; color: ${th('colorText')}; cursor: pointer; diff --git a/packages/component-faraday-ui/src/AuthorCard.js b/packages/component-faraday-ui/src/AuthorCard.js index 9ad8bda6301f4b275f51f534df01688a8d86edaa..8adbc518603f4a43cfa1bfd97a3db34fa007b25b 100644 --- a/packages/component-faraday-ui/src/AuthorCard.js +++ b/packages/component-faraday-ui/src/AuthorCard.js @@ -158,6 +158,7 @@ const AuthorEdit = ({ <Label required>Email</Label> <ValidatedField component={TextField} + data-test-id="author-card-email" name="email" validate={[required, validators.emailValidator]} /> @@ -166,6 +167,7 @@ const AuthorEdit = ({ <Label required>First name</Label> <ValidatedField component={TextField} + data-test-id="author-card-firstname" name="firstName" validate={[required]} /> @@ -174,6 +176,7 @@ const AuthorEdit = ({ <Label required>Last name</Label> <ValidatedField component={TextField} + data-test-id="author-card-lastname" name="lastName" validate={[required]} /> @@ -182,6 +185,7 @@ const AuthorEdit = ({ <Label required>Affiliation</Label> <ValidatedField component={TextField} + data-test-id="author-card-affiliation" name="affiliation" validate={[required]} /> @@ -192,6 +196,7 @@ const AuthorEdit = ({ component={input => ( <Menu {...input} options={countries} placeholder="Please select" /> )} + data-test-id="author-card-country" name="country" /> </Item> diff --git a/packages/component-faraday-ui/src/AuthorTag.js b/packages/component-faraday-ui/src/AuthorTag.js index de77649af2ef6640b21c315fe8cac3bf78bfa00c..1ac2a56a90bd18468d8235f90746e827801b37fc 100644 --- a/packages/component-faraday-ui/src/AuthorTag.js +++ b/packages/component-faraday-ui/src/AuthorTag.js @@ -7,6 +7,7 @@ import Text from './Text' const AuthorTag = ({ author: { + id, firstName, lastName, isCorresponding, @@ -14,7 +15,7 @@ const AuthorTag = ({ affiliationNumber, }, }) => ( - <Root> + <Root data-test-id={`author-tag-${id}`}> <Text>{`${firstName} ${lastName}`}</Text> {isSubmitting && <Tag>SA</Tag>} {isCorresponding && <Tag>CA</Tag>} diff --git a/packages/component-faraday-ui/src/AuthorTagList.js b/packages/component-faraday-ui/src/AuthorTagList.js index 4e9cd757a62866f19b3c66298d084cee967cd80d..5aea50c288cf1b4dde73988203438d07ad0264d5 100644 --- a/packages/component-faraday-ui/src/AuthorTagList.js +++ b/packages/component-faraday-ui/src/AuthorTagList.js @@ -69,6 +69,7 @@ const AuthorTagList = ({ {withAffiliations && ( <Item flex={0} ml={1}> <ActionLink + data-test-id="author-affiliations" icon={showAffiliation ? 'minus' : 'plus'} onClick={toggleAffiliation} > diff --git a/packages/component-faraday-ui/src/EditorialReportCard.js b/packages/component-faraday-ui/src/EditorialReportCard.js index a294c039795914fe5e5333e95b395f938ee4f187..a89ca77499af8c0d0a6b6ceff3b6b5af97c617d5 100644 --- a/packages/component-faraday-ui/src/EditorialReportCard.js +++ b/packages/component-faraday-ui/src/EditorialReportCard.js @@ -9,26 +9,32 @@ import { Label, Item, Row, Text, Tag } from './' import { getReportComments } from './helpers' const EditorialReportCard = ({ + publicLabel, + privateLabel, journal, publicReport, privateReport, recommendation, - reviewerName, - reviewerRole, + editorName, + editorRole, report: { createdOn, reviewer }, }) => ( <Root> <Row justify="space-between" mb={2}> <Item vertical> - <Label mb={1 / 2}>Decision</Label> + {editorRole === 'HE' ? ( + <Label mb={1 / 2}>Recommendation</Label> + ) : ( + <Label mb={1 / 2}>Decision</Label> + )} <Text>{recommendation}</Text> </Item> <Item justify="flex-end"> {reviewer && ( <Fragment> - <Text mr={1 / 2}>{reviewerName}</Text> - <Tag mr={2}>{reviewerRole}</Tag> + <Text mr={1 / 2}>{editorName}</Text> + <Tag mr={2}>{editorRole}</Tag> </Fragment> )} <DateParser timestamp={createdOn}> @@ -40,7 +46,7 @@ const EditorialReportCard = ({ {publicReport && ( <Row mb={2}> <Item vertical> - <Label mb={1 / 2}>Message For Author</Label> + <Label mb={1 / 2}>{publicLabel}</Label> <Text>{publicReport}</Text> </Item> </Row> @@ -49,7 +55,7 @@ const EditorialReportCard = ({ {privateReport && ( <Row mb={2}> <Item vertical> - <Label mb={1 / 2}>Message For Editorial Team</Label> + <Label mb={1 / 2}>{privateLabel}</Label> <Text>{privateReport}</Text> </Item> </Row> @@ -85,8 +91,8 @@ export default compose( recommendation: getRecommendationLabel(), publicReport: getReportComments({ report, isPublic: true }), privateReport: getReportComments({ report, isPublic: false }), - reviewerName: getReviewerName(), - reviewerRole: getReviewerRole(), + editorName: getReviewerName(), + editorRole: getReviewerRole(), }), ), )(EditorialReportCard) diff --git a/packages/component-faraday-ui/src/EditorialReportCard.md b/packages/component-faraday-ui/src/EditorialReportCard.md index 26fd9dce55e7c917e5944b6baf617a3384c50407..0c81711ef2c425f242e7f7b7433347f78de2aa15 100644 --- a/packages/component-faraday-ui/src/EditorialReportCard.md +++ b/packages/component-faraday-ui/src/EditorialReportCard.md @@ -47,7 +47,12 @@ const journal = { }, ], } -;<EditorialReportCard report={report} journal={journal} /> +;<EditorialReportCard + report={report} + journal={journal} + publicLabel="Message For Author" + privateLabel="Message For Editorial Team" + /> ``` Card with message for the editorial team @@ -97,7 +102,12 @@ const journal = { }, ], } -;<EditorialReportCard report={report} journal={journal} /> +;<EditorialReportCard + report={report} + journal={journal} + publicLabel="Message For Author" + privateLabel="Message For Editorial Team" + /> ``` Card with message for the editorial team and for the author @@ -152,5 +162,11 @@ const journal = { }, ], } -;<EditorialReportCard report={report} journal={journal} /> + +;<EditorialReportCard + report={report} + journal={journal} + publicLabel="Message For Author" + privateLabel="Message For Editorial Team" + /> ``` diff --git a/packages/component-faraday-ui/src/FileSection.js b/packages/component-faraday-ui/src/FileSection.js index d36b670d1abe8b482b11a021e15d90f5f9362c79..596f65e8436d8362ab1fdf506c1f5b1dd822071c 100644 --- a/packages/component-faraday-ui/src/FileSection.js +++ b/packages/component-faraday-ui/src/FileSection.js @@ -70,6 +70,7 @@ const FileSection = ({ onUpload={onFilePick} > <ActionLink + data-test-id={`add-file-${listId}`} disabled={files.length >= maxFiles} icon="plus" size="small" diff --git a/packages/component-faraday-ui/src/Footer.js b/packages/component-faraday-ui/src/Footer.js index 4a237f254c3afcb9c6c964495c0380ab54cdf75f..15c2d7588cc049f4cc3da02ac990b274665a407a 100644 --- a/packages/component-faraday-ui/src/Footer.js +++ b/packages/component-faraday-ui/src/Footer.js @@ -7,17 +7,30 @@ import { withJournal } from 'xpub-journal' import { ActionLink, Row, Text } from './' const Footer = ({ journal }) => ( - <Root alignItems="center" justify="center"> - <ActionLink to="https://hindawi.com">Hindawi</ActionLink> - <ActionLink ml={3} to="https://www.hindawi.com/privacy/"> + <Root alignItems="center" data-test-id="footer-row-id" justify="center"> + <ActionLink data-test-id="hindawi-redirect" to="https://hindawi.com"> + Hindawi + </ActionLink> + <ActionLink + data-test-id="privacy-policy" + ml={3} + to="https://www.hindawi.com/privacy/" + > Privacy Policy </ActionLink> - <ActionLink ml={3} to="https://www.hindawi.com/terms/"> + <ActionLink + data-test-id="terms-of-service" + ml={3} + to="https://www.hindawi.com/terms/" + > Terms of Service </ActionLink> <Text ml={4} secondary> {`Support: `} - <ActionLink to={`mailto:${get(journal, 'metadata.email')}`}> + <ActionLink + data-test-id="email-support" + to={`mailto:${get(journal, 'metadata.email')}`} + > {get(journal, 'metadata.email')} </ActionLink> </Text> diff --git a/packages/component-faraday-ui/src/Logo.js b/packages/component-faraday-ui/src/Logo.js index 655780803e2c2a3010dd1e243136376af4c6e8d1..338312793bdfef4b08c3b3cdbe138e5591248392 100644 --- a/packages/component-faraday-ui/src/Logo.js +++ b/packages/component-faraday-ui/src/Logo.js @@ -1,9 +1,17 @@ /* eslint-disable jsx-a11y/no-noninteractive-element-interactions */ import React from 'react' +import { get } from 'lodash' -const Logo = ({ src, onClick, title, height = 36 }) => ( - <img alt={title} height={height} onClick={onClick} src={src} title={title} /> +const Logo = ({ src, onClick, title, height = 36, ...rest }) => ( + <img + alt={title} + data-test-id={get(rest, 'data-test-id', 'journal-logo')} + height={height} + onClick={onClick} + src={src} + title={title} + /> ) export default Logo diff --git a/packages/component-faraday-ui/src/PublonsTable.js b/packages/component-faraday-ui/src/PublonsTable.js index d11c7d479ecb15cc49cbfe9d7ef2938335e444ce..4b7a53511d9312f03b61f77d11b52a83e8f5b85d 100644 --- a/packages/component-faraday-ui/src/PublonsTable.js +++ b/packages/component-faraday-ui/src/PublonsTable.js @@ -1,11 +1,11 @@ import React, { Fragment } from 'react' +import { get, last, head } from 'lodash' import styled from 'styled-components' import { th } from '@pubsweet/ui-toolkit' import { Button, Spinner } from '@pubsweet/ui' -import { get } from 'lodash' import { compose, withHandlers, withProps } from 'recompose' -import { Label, OpenModal, Text, withFetching } from '../' +import { Label, OpenModal, Text, withFetching, ActionLink } from '../' const TableView = ({ reviewers, @@ -14,12 +14,13 @@ const TableView = ({ isFetching, publonsError, }) => { - if (publonsError) + if (publonsError) { return ( <Text align="center" error> {publonsError} </Text> ) + } return reviewers.length === 0 ? ( <Text align="center">No suggestions yet.</Text> ) : ( @@ -42,7 +43,11 @@ const TableView = ({ {reviewers.map(reviewer => ( <TableRow key={reviewer.email}> <td> - <Text>{`${get(reviewer, 'name', '')}`}</Text> + <ActionLink + to={get(reviewer, 'profileUrl', 'https://www.publons.com/')} + > + {`${get(reviewer, 'name', '')}`} + </ActionLink> </td> <td> <Text>{`${get(reviewer, 'affiliation', '')}`}</Text> @@ -83,11 +88,12 @@ export default compose( })), withHandlers({ onInviteReviewer: ({ onInvite }) => (reviewer, modalProps) => { + const names = reviewer.name.split(' ') const newReviewer = { email: reviewer.email, role: 'reviewer', - firstName: reviewer.name, - lastName: '', + firstName: head(names), + lastName: last(names), } onInvite(newReviewer, modalProps) }, diff --git a/packages/component-faraday-ui/src/SortableList.js b/packages/component-faraday-ui/src/SortableList.js index f6bd63d6e33fc049676783818ffb6378691fb58a..e27f7158f2a2da12943106001a3008542c0b0506 100644 --- a/packages/component-faraday-ui/src/SortableList.js +++ b/packages/component-faraday-ui/src/SortableList.js @@ -60,7 +60,7 @@ const Item = ({ dragHandle ? connectDragPreview( connectDropTarget( - <div style={{ flex: 1 }}> + <div data-test-id={`sortable-item-${rest.id}`} style={{ flex: 1 }}> {React.createElement(listItem, { ...rest, dragHandle: connectDragSource( @@ -74,7 +74,9 @@ const Item = ({ ) : connectDropTarget( connectDragSource( - <div style={{ flex: 1 }}>{React.createElement(listItem, rest)}</div>, + <div data-test-id={`sortable-item-${rest.id}`} style={{ flex: 1 }}> + {React.createElement(listItem, rest)} + </div>, ), ) @@ -101,6 +103,7 @@ const SortableList = ({ <Fragment> {items.map((item, i) => ( <DecoratedItem + data-test-id={`add-author-id-${i}`} dragHandle={dragHandle} index={i} item={item} diff --git a/packages/component-faraday-ui/src/WizardAuthors.js b/packages/component-faraday-ui/src/WizardAuthors.js index 43cb64bea7e4250eef65b23ff30c7528f88702d9..9bc023bd0da92f05d83611f0389b1557f0751496 100644 --- a/packages/component-faraday-ui/src/WizardAuthors.js +++ b/packages/component-faraday-ui/src/WizardAuthors.js @@ -72,7 +72,11 @@ const WizardAuthors = ({ <Row alignItems="center" justify="flex-start"> <Item> <Label>Authors</Label> - <ActionLink icon="plus" onClick={addNewAuthor}> + <ActionLink + data-test-id="add-author" + icon="plus" + onClick={addNewAuthor} + > ADD AUTHOR </ActionLink> </Item> diff --git a/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptAssignHE.js b/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptAssignHE.js index b30f045ad4725e1502b54433ca631d168d17b359..ed9e04dfc0e67bd3844c512eee5a6a49f9b7a0ce 100644 --- a/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptAssignHE.js +++ b/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptAssignHE.js @@ -11,6 +11,7 @@ const ManuscriptAssignHE = ({ }) => canAssignHE ? ( <ContextualBox + data-test-id="assign-handling-editor" expanded={expanded} label="Assign Handling Editor" scrollIntoView diff --git a/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptEicDecision.js b/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptEicDecision.js index a6f66d3736b655bb1835539cd73115feac761ceb..f0e5d8a3fd2392f511108c906a7861d73a73cec8 100644 --- a/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptEicDecision.js +++ b/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptEicDecision.js @@ -1,6 +1,6 @@ import React from 'react' -import { get } from 'lodash' -import { compose } from 'recompose' +import { get, last } from 'lodash' +import { compose, withProps } from 'recompose' import styled from 'styled-components' import { reduxForm } from 'redux-form' import { th } from '@pubsweet/ui-toolkit' @@ -19,43 +19,76 @@ import { withFetching, } from '../' +const eicDecisions = [ + { + value: 'return-to-handling-editor', + label: 'Return to Handling Editor', + modalTitle: 'Return Manuscript', + modalSubtitle: + 'A returning manuscript to Handling Editor decision is final', + }, + { + value: 'publish', + label: 'Publish', + modalTitle: 'Publish Manuscript', + modalSubtitle: 'A publish decision is final', + }, + { + value: 'reject', + label: 'Reject', + modalTitle: 'Reject Manuscript', + modalSubtitle: 'A rejection decision is final', + }, +] + const ManuscriptEicDecision = ({ isFetching, formValues, handleSubmit, messagesLabel, - options = [], + collection = {}, ...rest }) => ( - <ContextualBox label="Your Editorial Decision" {...rest}> + <ContextualBox + data-test-id="your-editorial-decision-id" + label="Your Editorial Decision" + {...rest} + > <Root> <Row justify="flex-start"> <ItemOverrideAlert flex={0} vertical> <Label required>Decision</Label> <ValidatedField - component={input => <Menu {...input} options={options} />} + component={input => ( + <Menu + {...input} + options={ + get(collection, 'status', 'submitted') === 'submitted' + ? [last(eicDecisions)] + : eicDecisions + } + /> + )} name="decision" validate={[required]} /> </ItemOverrideAlert> </Row> - <Row mt={2}> - <Item vertical> - <Label required> - { - messagesLabel[ - get(formValues, 'decision', 'return-to-handling-editor') - ] - } - </Label> - <ValidatedField - component={ValidatedTextArea} - name="message" - validate={[required]} - /> - </Item> - </Row> + {get(formValues, 'decision') !== 'publish' && ( + <Row mt={2}> + <Item vertical> + <Label required> + {messagesLabel[get(formValues, 'decision', 'reject')]} + </Label> + <ValidatedField + component={ValidatedTextArea} + name="message" + validate={[required]} + /> + </Item> + </Row> + )} <Row justify="flex-end" mt={4}> <Button onClick={handleSubmit} primary size="medium"> @@ -73,15 +106,32 @@ export default compose( modalKey: 'eic-decision', modalComponent: MultiAction, })), + withProps(({ formValues }) => ({ + modalTitle: eicDecisions.find( + o => o.value === get(formValues, 'decision', 'publish'), + ).modalTitle, + modalSubtitle: eicDecisions.find( + o => o.value === get(formValues, 'decision', 'publish'), + ).modalSubtitle, + })), reduxForm({ form: 'eic-decision', onSubmit: ( values, dispatch, - { submitDecision, showModal, setFetching }, + { + submitDecision, + showModal, + setFetching, + modalTitle, + confirmMessage, + modalSubtitle, + }, ) => { showModal({ - title: 'Are you sure you want to submit this decision?', + title: `${modalTitle}?`, + confirmText: modalTitle, + subtitle: modalSubtitle, onConfirm: modalProps => { submitDecision(values, { ...modalProps, setFetching }) }, diff --git a/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptHeader.js b/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptHeader.js index cc79766601a6e3bf1461efb6c0c1eaa294624d95..268d7af507e41a54af7f5dd2088c905a7681d0ca 100644 --- a/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptHeader.js +++ b/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptHeader.js @@ -28,19 +28,34 @@ const ManuscriptHeader = ({ const { title = 'No title', journal = '', type = '' } = metadata return ( <Fragment> - <Row alignItems="baseline" justify="space-between"> + <Row + alignItems="baseline" + data-test-id="manuscript-title" + justify="space-between" + > <H2 mb={1}>{title}</H2> <Tag data-test-id="fragment-status" status> {visibleStatus} </Tag> </Row> {authors.length > 0 && ( - <Row alignItems="center" justify="flex-start" mb={1}> + <Row + alignItems="center" + data-test-id="authors-row" + justify="flex-start" + mb={1} + > <AuthorTagList authors={authors} withAffiliations withTooltip /> </Row> )} <Row alignItems="center" justify="flex-start" mb={1}> - {customId && <Text customId mr={1}>{`ID ${customId}`}</Text>} + {customId && ( + <Text + customId + data-test-id="manuscript-id" + mr={1} + >{`ID ${customId}`}</Text> + )} {submitted && ( <DateParser durationThreshold={0} timestamp={submitted}> {timestamp => <Text mr={3}>Submitted on {timestamp}</Text>} diff --git a/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptMetadata.js b/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptMetadata.js index 205719b95fb817a3b67b0e0d8b18da2e807ca05d..f86208b45f71994aaf8ae38bec91a88df103ed40 100644 --- a/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptMetadata.js +++ b/packages/component-faraday-ui/src/manuscriptDetails/ManuscriptMetadata.js @@ -18,7 +18,12 @@ const ManuscriptMetadata = ({ <Fragment> {!!abstract && ( <Item mb={1}> - <ContextualBox label="Abstract" startExpanded transparent> + <ContextualBox + data-test-id="abstract-tab" + label="Abstract" + startExpanded + transparent + > <Text mb={1} mt={1}> {abstract} </Text> @@ -27,7 +32,11 @@ const ManuscriptMetadata = ({ )} {conflicts.hasConflicts === 'yes' && ( <Item mb={1}> - <ContextualBox label="Conflict of Interest" transparent> + <ContextualBox + data-test-id="conflict-of-interest-tab" + label="Conflict of Interest" + transparent + > <Text mb={1} mt={1}> {get(conflicts, 'message', '')} </Text> @@ -36,7 +45,7 @@ const ManuscriptMetadata = ({ )} {!isEmpty(files) && ( <Item mb={1}> - <ContextualBox label={filesLabel} transparent> + <ContextualBox data-test-id="files-tab" label={filesLabel} transparent> <ManuscriptFileList files={files} getSignedUrl={getSignedUrl} diff --git a/packages/component-faraday-ui/src/modals/MultiAction.js b/packages/component-faraday-ui/src/modals/MultiAction.js index a1beeaf592edb16b9df1a02bdab80e24027c9fab..3a9acf7d332be3e39d6270cdde72fbf637e81b57 100644 --- a/packages/component-faraday-ui/src/modals/MultiAction.js +++ b/packages/component-faraday-ui/src/modals/MultiAction.js @@ -20,10 +20,14 @@ const MultiAction = ({ <Root> <IconButton icon="x" onClick={onClose} right={5} secondary top={5} /> <H2>{title}</H2> - {subtitle && <Text secondary>{subtitle}</Text>} + {subtitle && ( + <Text mb={1} secondary> + {subtitle} + </Text> + )} {renderContent()} {modalError && ( - <Text error mt={1}> + <Text align="center" error mt={1}> {modalError} </Text> )} @@ -32,8 +36,10 @@ const MultiAction = ({ <Spinner size={3} /> ) : ( <Fragment> - <Button onClick={onClose}>{cancelText}</Button> - <Button onClick={onConfirm} primary> + <Button data-test-id="modal-cancel" onClick={onClose}> + {cancelText} + </Button> + <Button data-test-id="modal-confirm" onClick={onConfirm} primary> {confirmText} </Button> </Fragment> @@ -79,7 +85,7 @@ const Root = styled.div` flex-direction: column; position: relative; padding: calc(${th('gridUnit')} * 5); - width: calc(${th('gridUnit')} * 60); + width: calc(${th('gridUnit')} * 70); ${H2} { margin: 0 0 ${th('gridUnit')} 0; diff --git a/packages/component-faraday-ui/src/modals/SingleActionModal.js b/packages/component-faraday-ui/src/modals/SingleActionModal.js index 49a9ec10906007ff593dcb0b087be7016f76b89d..44385a9e75b20df802e0bb1c0248563ad84b4bb2 100644 --- a/packages/component-faraday-ui/src/modals/SingleActionModal.js +++ b/packages/component-faraday-ui/src/modals/SingleActionModal.js @@ -21,7 +21,7 @@ const SingleActionModal = ({ </Icon> {title && <H2>{title}</H2>} {subtitle && <Text secondary>{subtitle}</Text>} - <Button onClick={onClick} primary> + <Button data-test-id="modal-confirm" onClick={onClick} primary> {confirmText} </Button> </Root> diff --git a/packages/component-invite/src/routes/fragmentsInvitations/post.js b/packages/component-invite/src/routes/fragmentsInvitations/post.js index ae1eeb0282021d4211f9048abe2fc969e5396308..2eab3d2d1642e1aed6f2a9384bbf11b9058fd993 100644 --- a/packages/component-invite/src/routes/fragmentsInvitations/post.js +++ b/packages/component-invite/src/routes/fragmentsInvitations/post.js @@ -1,4 +1,5 @@ const logger = require('@pubsweet/logger') + const { Team, User, @@ -123,17 +124,32 @@ module.exports = models => async (req, res) => { const userHelper = new User({ UserModel }) const userData = req.body - const { firstName, lastName, isPublons } = userData + const { firstName = '', lastName = '', isPublons } = userData + if (!services.checkForUndefinedParams(firstName, lastName)) { + return res + .status(400) + .json({ error: 'First name and last name are required.' }) + } - if (process.env.PUBLONS_MOCK_EMAIL && isPublons) { + if (isPublons && process.env.PUBLONS_MOCK_EMAIL) { const mockEmail = process.env.PUBLONS_MOCK_EMAIL - userData.email = mockEmail.replace('__NAME__', `${firstName}.${lastName}`) + userData.email = mockEmail.replace( + '__NAME__', + `${firstName.trim()}.${lastName.trim()}`, + ) } - const newUser = await userHelper.createUser({ - role, - body: userData, - }) + let newUser + try { + newUser = await userHelper.createUser({ + role, + body: userData, + }) + } catch (e) { + return res + .status(400) + .json({ error: `User already exists with email: ${userData.email}` }) + } if (collection.status === 'heAssigned') await collectionHelper.updateStatus({ newStatus: 'reviewersInvited' }) diff --git a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/notifications/notifications.js b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/notifications/notifications.js index eee5ba2fc9ee4eb1206172c29b7d6c298dfeeabd..9bb9c3a6cbd7d7b66222cb4b472e108c08304a06 100644 --- a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/notifications/notifications.js +++ b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/notifications/notifications.js @@ -60,7 +60,11 @@ module.exports = { // the EiC recommends to publish so an email to the EQA needs to be sent, // one requesting approval or one informing them that the manuscript has been published - if (isEditorInChief && recommendation === 'publish') { + if ( + isEditorInChief && + recommendation === 'publish' && + collection.technicalChecks.token + ) { sendEQAEmail({ email, eicName, @@ -77,7 +81,6 @@ module.exports = { // send HE emails when a review is submitted // or when the EiC makes a recommendation after peer review - if ( recommendationType === 'review' || (isEditorInChief && diff --git a/packages/component-manuscript-manager/src/routes/technicalChecks/notifications/notifications.js b/packages/component-manuscript-manager/src/routes/technicalChecks/notifications/notifications.js index 631f6719315bd164636fdb88b9632caa4c08d15a..8380da030638ce5c7d66293fd7531ac01841a237 100644 --- a/packages/component-manuscript-manager/src/routes/technicalChecks/notifications/notifications.js +++ b/packages/component-manuscript-manager/src/routes/technicalChecks/notifications/notifications.js @@ -1,5 +1,4 @@ const config = require('config') -const { get } = require('lodash') const Email = require('@pubsweet/component-email-templating') const { @@ -9,12 +8,10 @@ const { } = require('pubsweet-component-helper-service') const { getEmailCopy } = require('./emailCopy') -const unsubscribeSlug = config.get('unsubscribe.url') const { name: journalName, staffEmail } = config.get('journal') module.exports = { async sendNotifications({ - isEQA, agree, baseUrl, collection, @@ -28,10 +25,7 @@ module.exports = { handlingEditor: collection.handlingEditor, }) - const { - activeAuthors: authors, - submittingAuthor, - } = await fragmentHelper.getAuthorData({ + const { submittingAuthor } = await fragmentHelper.getAuthorData({ UserModel, }) @@ -60,42 +54,14 @@ module.exports = { }, }) - if (agree && isEQA) { - email.content.signatureName = await userHelper.getEiCName() - - sendHandlingEditorEmail({ - email, - baseUrl, - titleText, - subjectBaseText, - handlingEditor: get(collection, 'handlingEditor', {}), - }) - sendSubmittedReviewersEmail({ - email, - baseUrl, - titleText, - UserModel, - fragmentHelper, - subjectBaseText, - }) - - sendAuthorsEmail({ - email, - baseUrl, - titleText, - subjectBaseText, - fragmentAuthors: authors, - }) - } else { - sendEditorsEmail({ - email, - agree, - customId, - comments, - titleText, - userHelper, - }) - } + sendEditorsEmail({ + email, + agree, + customId, + comments, + titleText, + userHelper, + }) }, } @@ -137,113 +103,3 @@ const sendEditorsEmail = async ({ email.sendEmail({ html, text }) }) } - -const sendHandlingEditorEmail = ({ - email, - baseUrl, - titleText, - handlingEditor, - subjectBaseText, -}) => { - email.content.subject = `${subjectBaseText} Decision` - const emailType = 'he-manuscript-published' - - email.toUser = { - email: handlingEditor.email, - name: handlingEditor.name, - } - email.content.unsubscribeLink = services.createUrl(baseUrl, unsubscribeSlug, { - id: handlingEditor.id, - }) - - const { html, text } = email.getNotificationBody({ - emailBodyProps: getEmailCopy({ - emailType, - titleText, - }), - }) - email.sendEmail({ html, text }) -} - -const sendSubmittedReviewersEmail = async ({ - email, - baseUrl, - titleText, - UserModel, - fragmentHelper, - subjectBaseText, -}) => { - email.content.subject = `${subjectBaseText} Decision` - - const reviewers = (await fragmentHelper.getReviewers({ - UserModel, - type: 'submitted', - })).map(rev => ({ - ...rev, - ...getEmailCopy({ - emailType: 'submitted-reviewers-after-publish', - titleText, - }), - })) - - reviewers.forEach(reviewer => { - email.toUser = { - email: reviewer.email, - name: `${reviewer.firstName} ${reviewer.lastName}`, - } - email.content.unsubscribeLink = services.createUrl( - baseUrl, - unsubscribeSlug, - { - id: reviewer.id, - }, - ) - const { html, text } = email.getNotificationBody({ - emailBodyProps: { - paragraph: reviewer.paragraph, - hasLink: reviewer.hasLink, - }, - }) - email.sendEmail({ html, text }) - }) -} - -const sendAuthorsEmail = ({ - email, - baseUrl, - titleText, - subjectBaseText, - fragmentAuthors, -}) => { - const emailType = 'author-manuscript-published' - email.content.subject = `${subjectBaseText} Published` - - const authors = fragmentAuthors.map(author => ({ - ...author, - ...getEmailCopy({ - emailType, - titleText, - }), - })) - - authors.forEach(author => { - email.toUser = { - email: author.email, - name: `${author.firstName} ${author.lastName}`, - } - email.content.unsubscribeLink = services.createUrl( - baseUrl, - unsubscribeSlug, - { - id: author.id, - }, - ) - const { html, text } = email.getNotificationBody({ - emailBodyProps: { - paragraph: author.paragraph, - hasLink: author.hasLink, - }, - }) - email.sendEmail({ html, text }) - }) -} diff --git a/packages/component-manuscript-manager/src/routes/technicalChecks/patch.js b/packages/component-manuscript-manager/src/routes/technicalChecks/patch.js index 4afb91c9d628e6a13e19bfea7d2360527dab8ab5..fcb8a59daf70b1bc7129fa23b1fe664d8de5750e 100644 --- a/packages/component-manuscript-manager/src/routes/technicalChecks/patch.js +++ b/packages/component-manuscript-manager/src/routes/technicalChecks/patch.js @@ -1,7 +1,13 @@ -const { get, find, isEmpty } = require('lodash') +const { get, find, isEmpty, last } = require('lodash') const { services } = require('pubsweet-component-helper-service') -const { sendNotifications } = require('./notifications/notifications') +const { + sendNotifications: sendEQSNotifications, +} = require('./notifications/notifications') + +const { + sendNotifications: sendEQANotifications, +} = require('../fragmentsRecommendations/notifications/notifications') const TECHNICAL_STEPS = { EQS: 'eqs', @@ -64,15 +70,33 @@ module.exports = ({ Collection, Fragment, User }) => async (req, res) => { collection.status = setNewStatus(step, agree) await collection.save() - sendNotifications({ - User, - agree, - comments, - Fragment, - collection, - baseUrl: services.getBaseUrl(req), - isEQA: step === TECHNICAL_STEPS.EQA, - }) + const isEQA = get(collection, 'technicalChecks.eqa', false) + const baseUrl = services.getBaseUrl(req) + if (isEQA) { + const fragment = await Fragment.find(last(collection.fragments)) + + sendEQANotifications({ + baseUrl, + fragment, + collection, + hasEQA: true, + UserModel: User, + isEditorInChief: true, + newRecommendation: { + recommendation: 'publish', + recommendationType: 'editorRecommendation', + }, + }) + } else { + sendEQSNotifications({ + User, + agree, + comments, + Fragment, + collection, + baseUrl, + }) + } return res.status(200).json(collection) } catch (e) { diff --git a/packages/component-manuscript/src/components/EditorialCommentCard.js b/packages/component-manuscript/src/components/EditorialCommentCard.js index aa9187971fa82db28b3a3896b7fafb78c4520622..366200e4fba723bc2c2a7431b4d19b39ea0501b9 100644 --- a/packages/component-manuscript/src/components/EditorialCommentCard.js +++ b/packages/component-manuscript/src/components/EditorialCommentCard.js @@ -6,10 +6,22 @@ import { withFileDownload, } from 'pubsweet-component-faraday-ui' -const EditorialCommentCard = ({ journal, reports = [] }) => ( - <ContextualBox label="Editorial Comments" mb={2}> +const EditorialCommentCard = ({ journal, reports = [], toggle, expanded }) => ( + <ContextualBox + expanded={expanded} + label="Editorial Comments" + mb={2} + scrollIntoView + toggle={toggle} + > {reports.map(report => ( - <EditorialReportCard journal={journal} key={report.id} report={report} /> + <EditorialReportCard + journal={journal} + key={report.id} + privateLabel="Message For Editorial Team" + publicLabel="Message For Author" + report={report} + /> ))} </ContextualBox> ) diff --git a/packages/component-manuscript/src/components/ManuscriptLayout.js b/packages/component-manuscript/src/components/ManuscriptLayout.js index 4840203f2a13dd02c8830bea39d985d0afab6174..cf3ed06611bb7deede31f739dfa2de172dbd571d 100644 --- a/packages/component-manuscript/src/components/ManuscriptLayout.js +++ b/packages/component-manuscript/src/components/ManuscriptLayout.js @@ -1,6 +1,6 @@ import React, { Fragment } from 'react' import styled from 'styled-components' -import { isEmpty, get, last } from 'lodash' +import { isEmpty, get } from 'lodash' import { Text, paddingHelper, @@ -19,15 +19,8 @@ import ReviewerReportCard from './ReviewReportCard' import ReviewerReportForm from './ReviewerReportForm' import EditorialCommentCard from './EditorialCommentCard' -const eicDecisions = [ - { value: 'return-to-handling-editor', label: 'Return to Handling Editor' }, - { value: 'publish', label: 'Publish' }, - { value: 'reject', label: 'Reject' }, -] - const messagesLabel = { 'return-to-handling-editor': 'Comments for Handling Editor', - publish: 'Comments for Author', reject: 'Comments for Author', } @@ -71,6 +64,8 @@ const ManuscriptLayout = ({ reviewerRecommendations, toggleReviewerDetails, reviewerDetailsExpanded, + toggleHeRecommendation, + heRecommendationExpanded, onInvitePublonReviewer, submitRevision, }) => ( @@ -106,13 +101,14 @@ const ManuscriptLayout = ({ <SubmitRevision {...submitRevision} /> - {get(currentUser, 'permissions.canViewReports', true) && - !!editorialRecommendations.length && ( - <EditorialCommentCard - journal={journal} - reports={editorialRecommendations} - /> - )} + {get(currentUser, 'permissions.canViewEditorialComments', true) && ( + <EditorialCommentCard + expanded={heRecommendationExpanded} + journal={journal} + reports={editorialRecommendations} + toggle={toggleHeRecommendation} + /> + )} {submittedOwnRecommendation && ( <ReviewerReportCard @@ -205,14 +201,11 @@ const ManuscriptLayout = ({ {get(currentUser, 'permissions.canMakeDecision', false) && ( <ManuscriptEicDecision + collection={collection} formValues={get(formValues, 'eicDecision')} + highlight={editorialRecommendations.length > 0} messagesLabel={messagesLabel} mt={2} - options={ - get(collection, 'status', 'submitted') === 'submitted' - ? [last(eicDecisions)] - : eicDecisions - } submitDecision={createRecommendation} /> )} diff --git a/packages/component-manuscript/src/components/ManuscriptPage.js b/packages/component-manuscript/src/components/ManuscriptPage.js index 689b1b516b547619427a352daeb34001672a1e3f..ff313bccab7df40660e2bc92e52860ff52b5f160 100644 --- a/packages/component-manuscript/src/components/ManuscriptPage.js +++ b/packages/component-manuscript/src/components/ManuscriptPage.js @@ -48,6 +48,7 @@ import { currentUserIsReviewer, parseCollectionDetails, canMakeHERecommendation, + canViewEditorialComments, canViewReviewersDetails, pendingReviewerInvitation, canOverrideTechnicalChecks, @@ -85,7 +86,7 @@ export default compose( withJournal, withRouter, withFetching, - withState('publonReviewers', 'setPub', []), + withState('publonReviewers', 'setPublonsReviewers', []), withState('editorInChief', 'setEiC', 'N/A'), ConnectPage(({ match }) => [ actions.getCollection({ id: match.params.project }), @@ -167,6 +168,11 @@ export default compose( }), canAssignHE: canAssignHE(state, match.params.project), canViewReports: canViewReports(state, match.params.project), + canViewEditorialComments: canViewEditorialComments( + state, + collection, + match.params.version, + ), canInviteReviewers: canInviteReviewers(state, collection), canMakeRecommendation: !isUndefined(pendingOwnRecommendation), canMakeRevision: canMakeRevision(state, collection, fragment), @@ -211,6 +217,22 @@ export default compose( getFragment(collection, fragment) getUsers() }, + getPublonsReviewers: ({ clearError, setFetching, setPublonsReviewers }) => ( + fragmentId, + errorFn, + ) => { + clearError() + setFetching(true) + getPublonsReviewers(fragmentId) + .then(res => { + setFetching(false) + setPublonsReviewers(res) + }) + .catch(e => { + setFetching(false) + handleError(errorFn)(e) + }) + }, }), withHandlers({ updateManuscript: ({ updateVersion, collection, fragment }) => data => @@ -224,8 +246,6 @@ export default compose( setEiC(`${firstName} ${lastName}`) } }, - setPublons: ({ setPub }) => (publonReviewers = []) => - setPub(publonReviewers), assignHE: ({ assignHandlingEditor, fetchUpdatedCollection, @@ -422,32 +442,26 @@ export default compose( }), withHandlers({ onInvitePublonReviewer: ({ - collection, + setError, fragment, + collection, + clearError, + getPublonsReviewers, fetchUpdatedCollection, - setPublons, setFetching: setListFetching, - setError, - clearError, - }) => (values, { hideModal, setModalError, setFetching }) => { + }) => (reviewerData, { hideModal, setModalError, setFetching }) => { setFetching(true) inviteReviewer({ - reviewerData: values, + reviewerData, + isPublons: true, fragmentId: fragment.id, collectionId: collection.id, - isPublon: true, }) .then(() => { setFetching(false) hideModal() fetchUpdatedCollection() - getPublonsReviewers({ - fragmentId: fragment.id, - setPublons, - setFetching: setListFetching, - setError, - clearError, - }) + getPublonsReviewers(fragment.id) }) .catch(err => { setFetching(false) @@ -475,6 +489,10 @@ export default compose( toggleReviewerDetails: toggle, reviewerDetailsExpanded: expanded, })), + fromRenderProps(RemoteOpener, ({ toggle, expanded }) => ({ + toggleHeRecommendation: toggle, + heRecommendationExpanded: expanded, + })), withProps(({ currentUser, collection, submittedOwnRecommendation }) => ({ submitRevisionModalKey: 'submitRevision', getSignedUrl, @@ -488,23 +506,23 @@ export default compose( const { match, history, + setError, location, - setPublons, shouldReview, reviewerReports, setEditorInChief, clearCustomError, + getPublonsReviewers, hasManuscriptFailure, fetchUpdatedCollection, + editorialRecommendations, currentUser: { isInvitedHE, isInvitedToReview, isHEToManuscript, + isEIC, permissions: { canInviteReviewers }, }, - setFetching, - setError, - clearError, } = this.props if (hasManuscriptFailure) { @@ -527,13 +545,7 @@ export default compose( ) if (canInviteReviewers) { - getPublonsReviewers({ - fragmentId, - setPublons, - setFetching, - setError, - clearError, - }) + getPublonsReviewers(fragmentId, setError) } if (isInvitedHE) { @@ -551,6 +563,10 @@ export default compose( if (isHEToManuscript && !!reviewerReports.length) { this.props.toggleReviewerDetails() } + + if (isEIC && !!editorialRecommendations.length) { + this.props.toggleHeRecommendation() + } }, }), )(ManuscriptLayout) diff --git a/packages/component-manuscript/src/components/utils.js b/packages/component-manuscript/src/components/utils.js index 3fd58fbc9af7b3c79394b81f3cfde6162c2d09a3..8d9a2d6cc3ad46d4304e2fc07dcfb57731c49c3b 100644 --- a/packages/component-manuscript/src/components/utils.js +++ b/packages/component-manuscript/src/components/utils.js @@ -306,22 +306,5 @@ export const parseEicDecision = ({ decision, message }) => ({ }) // handle publons -export const getPublonsAPI = fragmentId => +export const getPublonsReviewers = fragmentId => apiGet(`/fragments/${fragmentId}/publons`) - -export const getPublonsReviewers = ({ - fragmentId, - setPublons, - setFetching, - setError, - clearError, -}) => { - clearError() - setFetching(true) - getPublonsAPI(fragmentId) - .then(res => { - setPublons(res) - setFetching(false) - }) - .catch(handleError(setError)) -} diff --git a/packages/component-wizard/src/components/SubmissionConfirmation.js b/packages/component-wizard/src/components/SubmissionConfirmation.js index f258b3153b15f1ba55b10483605929af2042a20f..032f737a3aedf8c580defb29364bd82d56f3227c 100644 --- a/packages/component-wizard/src/components/SubmissionConfirmation.js +++ b/packages/component-wizard/src/components/SubmissionConfirmation.js @@ -23,7 +23,11 @@ const SubmissionConfirmation = ({ history, journal }) => ( </Text> </Row> <Row justify="center"> - <Button onClick={() => history.push('/')} primary> + <Button + data-test-id="go-to-dashboard" + onClick={() => history.push('/')} + primary + > GO TO DASHBOARD </Button> </Row> diff --git a/packages/component-wizard/src/components/SubmissionStatement.js b/packages/component-wizard/src/components/SubmissionStatement.js index cdbc630458e7808c29651a8bd83520d476f30301..4769604cea17f535dd3b4fb239361d5bdc8b154d 100644 --- a/packages/component-wizard/src/components/SubmissionStatement.js +++ b/packages/component-wizard/src/components/SubmissionStatement.js @@ -3,23 +3,13 @@ import { ActionLink, Text, Row } from 'pubsweet-component-faraday-ui' const SubmissionStatement = () => ( <Fragment> - <Row mb={1}> + <Row mb={1} mt={2}> <Text> This manuscript is not currently submitted to or under consideration in any other journals. </Text> </Row> - <Row mb={1}> - <Text> - The submission ensures that sources are given proper attribution (the - journal employs <b>Crossref Similarity Check</b> to compare submissions - against published scholarly content. If, in the judgement of an editor, - a submission is genuinely suspected of plagiarism, it will be returned - to the author(s) with a request for explanation). - </Text> - </Row> - <Row mb={1}> <Text> The manuscript complies with all relevant{' '} @@ -29,28 +19,13 @@ const SubmissionStatement = () => ( </Text> </Row> - <Row mb={1}> - <Text> - If applicable - there is a Data Availability statement, containing - information about the location of any open data and materials in the - manuscript, and how others can access the data. - </Text> - </Row> - - <Row mb={1}> - <Text> - A conflict of interest statement is present in the manuscript, even if - to state there is no conflict of interest. - </Text> - </Row> - - <Row mb={1}> + <Row mb={3}> <Text> You have read and understood the{' '} <ActionLink to="https://www.hindawi.com/terms/"> terms of service - </ActionLink> - {' & '} + </ActionLink>{' '} + and{' '} <ActionLink to="https://www.hindawi.com/privacy/"> privacy policy </ActionLink>{' '} diff --git a/packages/components-faraday/src/components/Admin/AdminUsers.js b/packages/components-faraday/src/components/Admin/AdminUsers.js index 0fc5130192cda78f6ac5dba1b246dde4d7d1bc86..b29d70d4221431fbfdb750fbd965ccbb13dd00b0 100644 --- a/packages/components-faraday/src/components/Admin/AdminUsers.js +++ b/packages/components-faraday/src/components/Admin/AdminUsers.js @@ -45,7 +45,12 @@ const Users = ({ <Fragment> <Row alignItems="center" justify="space-between" mb={1}> <Item alignItems="center"> - <ActionLink icon="arrow-left" mr={2} onClick={history.goBack}> + <ActionLink + data-test-id="go-to-dashboard" + icon="arrow-left" + mr={2} + onClick={history.goBack} + > Admin Dashboard </ActionLink> <AddUser diff --git a/packages/components-faraday/src/components/Dashboard/DashboardFilters.js b/packages/components-faraday/src/components/Dashboard/DashboardFilters.js index f9b3bab6f8aedca1accd5c05b3fd2beb4df5d314..2f1794281d784ee183df364b9322a61c56c5f251 100644 --- a/packages/components-faraday/src/components/Dashboard/DashboardFilters.js +++ b/packages/components-faraday/src/components/Dashboard/DashboardFilters.js @@ -8,7 +8,13 @@ const DashboardFilters = ({ changeFilterValue, getDefaultFilterValue, }) => ( - <Row alignItems="flex-end" justify="flex-start" mb={1} mt={2}> + <Row + alignItems="flex-end" + data-test-id="dashboard-filters" + justify="flex-start" + mb={1} + mt={2} + > <Text mr={1} pb={1} secondary> Filters </Text> diff --git a/packages/components-faraday/src/components/MakeDecision/DecisionForm.js b/packages/components-faraday/src/components/MakeDecision/DecisionForm.js index 3fab58f21c15bcdd312cc0fa0f8df64ef928350e..b698cf1f41d8b9c2fac0ba97fa7b01f588eac0ce 100644 --- a/packages/components-faraday/src/components/MakeDecision/DecisionForm.js +++ b/packages/components-faraday/src/components/MakeDecision/DecisionForm.js @@ -73,7 +73,7 @@ const DecisionForm = ({ {decision === 'return-to-handling-editor' && ( <Row> <RowItem vertical> - <Label>Comments for Handling Editor</Label> + <Label>Comments for Author</Label> <ValidatedField component={TextAreaField} name="messageToHE" diff --git a/packages/components-faraday/src/components/SignUp/SignUpStep0.js b/packages/components-faraday/src/components/SignUp/SignUpStep0.js index 51edb75af1575d53e615c6cff9db1f7081b682ca..f17aabd46a27554e01396ab0369eb5b3124769fd 100644 --- a/packages/components-faraday/src/components/SignUp/SignUpStep0.js +++ b/packages/components-faraday/src/components/SignUp/SignUpStep0.js @@ -42,7 +42,7 @@ const Step0 = ({ !isUndefined(initialValues) ? ( <Fragment> <Row mb={2} mt={3}> - <Item mr={1} vertical> + <Item data-test-id="sign-up-first-name" mr={1} vertical> <Label required>First Name</Label> <ValidatedField component={TextField} @@ -50,7 +50,7 @@ const Step0 = ({ validate={[requiredValidator]} /> </Item> - <Item ml={1} vertical> + <Item data-test-id="sign-up-last-name" ml={1} vertical> <Label required>Last Name</Label> <ValidatedField component={TextField} @@ -61,7 +61,7 @@ const Step0 = ({ </Row> <Row mb={2}> - <ItemOverrideAlert mr={1} vertical> + <ItemOverrideAlert data-test-id="sign-up-title" mr={1} vertical> <Label required>Title</Label> <ValidatedField component={input => ( @@ -75,7 +75,7 @@ const Step0 = ({ validate={[requiredValidator]} /> </ItemOverrideAlert> - <ItemOverrideAlert ml={1} vertical> + <ItemOverrideAlert data-test-id="sign-up-country" ml={1} vertical> <Label required>Country</Label> <ValidatedField component={input => ( @@ -92,7 +92,7 @@ const Step0 = ({ </Row> <Row> - <Item vertical> + <Item data-test-id="sign-up-affiliation" vertical> <Label required>Affiliation</Label> <ValidatedField component={TextField} @@ -102,7 +102,7 @@ const Step0 = ({ </Item> </Row> - <ValidationRow mb={2}> + <ValidationRow data-test-id="sign-up-agree-TC" mb={2}> <ValidatedField component={AgreeCheckbox} name="agreeTC" @@ -123,7 +123,11 @@ const Step0 = ({ </Text> </Row> - <Button mt={4} onClick={handleSubmit}> + <Button + data-test-id="sign-up-proceed-to-set-email-and-password" + mt={4} + onClick={handleSubmit} + > PROCEED TO SET {type === 'signup' && 'EMAIL AND'} PASSWORD </Button> diff --git a/packages/components-faraday/src/components/SignUp/SignUpStep1.js b/packages/components-faraday/src/components/SignUp/SignUpStep1.js index a9d6d4625b1fd6ca485b7de67d7765154a1bc020..2b704892b11d80f05b88ea4007b45d5ce8e9e0a5 100644 --- a/packages/components-faraday/src/components/SignUp/SignUpStep1.js +++ b/packages/components-faraday/src/components/SignUp/SignUpStep1.js @@ -12,7 +12,7 @@ const EmailField = input => <TextField {...input} type="email" /> const SignUpForm = () => ( <Fragment> <Row mb={2}> - <Item vertical> + <Item data-test-id="sign-up-email" vertical> <Label required>Email</Label> <ValidatedField component={EmailField} @@ -22,7 +22,7 @@ const SignUpForm = () => ( </Item> </Row> <Row mb={2}> - <Item vertical> + <Item data-test-id="sign-up-password" vertical> <Label required>Password</Label> <ValidatedField component={PasswordField} @@ -32,7 +32,7 @@ const SignUpForm = () => ( </Item> </Row> <Row mb={2}> - <Item vertical> + <Item data-test-id="sign-up-confirm-password" vertical> <Label required>Confirm password</Label> <ValidatedField component={PasswordField} @@ -106,8 +106,17 @@ const Step1 = ({ <Row /> <Row justify={!withoutBack.includes(type) ? 'space-between' : 'center'}> - {!withoutBack.includes(type) && <Button onClick={onBack}>BACK</Button>} - <Button disabled={submitting} onClick={handleSubmit} primary> + {!withoutBack.includes(type) && ( + <Button data-test-id="sign-up-back-button" onClick={onBack}> + BACK + </Button> + )} + <Button + data-test-id="sign-up-confirm-button" + disabled={submitting} + onClick={handleSubmit} + primary + > {onSubmitText} </Button> </Row> diff --git a/packages/components-faraday/src/components/UIComponents/EQSDecisionPage.js b/packages/components-faraday/src/components/UIComponents/EQSDecisionPage.js index ed37e20705475698d9d47fa0543fa819d00fe3c4..a2c978f8660d924d2b7b27bbadd607b8a6a27995 100644 --- a/packages/components-faraday/src/components/UIComponents/EQSDecisionPage.js +++ b/packages/components-faraday/src/components/UIComponents/EQSDecisionPage.js @@ -34,7 +34,7 @@ const sizeValidator = manuscriptIdSizeValidator(7) const Enhanched = () => ( <Row> - <Item vertical> + <Item data-test-id="manuscript-id" vertical> <Label required>Manuscript ID</Label> <ValidatedField component={TextField} @@ -77,7 +77,7 @@ const FormModal = reduxForm({ title="Accept Manuscript" > {showModal => ( - <Button onClick={showModal} primary> + <Button data-test-id="eqs-yes-button" onClick={showModal} primary> YES </Button> )} @@ -116,7 +116,11 @@ const EQSDecisionPage = ({ subtitle="Are you sure you want to reject this manuscript?" title="Reject manuscript" > - {showModal => <Button onClick={showModal}>NO</Button>} + {showModal => ( + <Button data-test-id="eqs-no-button" onClick={showModal}> + NO + </Button> + )} </OpenModal> <FormModal isFetching={isFetching} diff --git a/packages/components-faraday/src/redux/reviewers.js b/packages/components-faraday/src/redux/reviewers.js index 9d2ee9b6333822535652d83f30b1802a21a879df..4cb9dd209e6d8d922a0e3ca394698743754b61c2 100644 --- a/packages/components-faraday/src/redux/reviewers.js +++ b/packages/components-faraday/src/redux/reviewers.js @@ -60,9 +60,9 @@ export const getCollectionReviewers = (collectionId, fragmentId) => dispatch => // #endregion export const inviteReviewer = ({ + fragmentId, reviewerData, collectionId, - fragmentId, isPublons = false, }) => create(`/collections/${collectionId}/fragments/${fragmentId}/invitations`, { diff --git a/packages/xpub-faraday/config/authsome-helpers.js b/packages/xpub-faraday/config/authsome-helpers.js index 718190c444db9b5404cec625cf3109db0abea80e..c97f8b89a8f9acb1b7b626e5fc5b79636889bf65 100644 --- a/packages/xpub-faraday/config/authsome-helpers.js +++ b/packages/xpub-faraday/config/authsome-helpers.js @@ -184,7 +184,11 @@ const stripeFragmentByRole = ({ return { ...fragment, recommendations: recommendations - ? recommendations.filter(r => r.submittedOn) + ? recommendations.filter( + r => + r.submittedOn || + r.recommendationType === 'editorRecommendation', + ) : [], } default: