diff --git a/packages/component-manuscript/src/components/ReviewReportCard.js b/packages/component-manuscript/src/components/ReviewReportCard.js new file mode 100644 index 0000000000000000000000000000000000000000..077c7da4c98ab3e5ca643e18c85e89cce4b7b887 --- /dev/null +++ b/packages/component-manuscript/src/components/ReviewReportCard.js @@ -0,0 +1,91 @@ +import React, { Fragment } from 'react' +import moment from 'moment' +import { th } from '@pubsweet/ui' +import { compose } from 'recompose' +import { withJournal } from 'xpub-journal' +import styled, { css } from 'styled-components' +import { FileItem } from 'pubsweet-components-faraday/src/components/Files' + +const ReviewReportCard = ({ report = {}, journal: { recommendations } }) => ( + <Root> + <Row> + <Label>Recommendation</Label> + {report.submittedOn && ( + <Text> + Submitted on: {moment(report.submittedOn).format('DD.MM.YYYY')} + </Text> + )} + </Row> + <Row> + <Text> + {recommendations.find(r => report.recommendation === r.value).label} + </Text> + </Row> + <Spacing /> + <Row left> + <Label>Report Text</Label> + </Row> + <Row> + <Text>{report.comments[0].content}</Text> + </Row> + <Spacing /> + + {!!report.comments[0].files.length && ( + <Fragment> + <Row left> + <Label>Files</Label> + </Row> + <Row left> + {report.comments[0].files.map(file => ( + <FileItem compact id={file.id} key={file.id} {...file} /> + ))} + </Row> + </Fragment> + )} + </Root> +) + +export default compose(withJournal)(ReviewReportCard) + +// #region styled-components +const defaultText = css` + color: ${th('colorPrimary')}; + font-family: ${th('fontReading')}; + font-size: ${th('fontSizeBaseSmall')}; +` +const Root = styled.div` + display: flex; + flex-direction: column; + margin: auto; + [role='listbox'] { + min-width: 280px; + } +` +const Text = styled.div` + ${defaultText}; +` +const Label = styled.div` + ${defaultText}; + text-transform: uppercase; + i { + text-transform: none; + margin-left: ${th('gridUnit')}; + } +` + +const Spacing = styled.div` + margin-top: ${th('gridUnit')}; + flex: 1; +` + +const Row = styled.div` + display: flex; + flex-direction: row; + align-items: center; + flex: 1; + box-sizing: border-box; + flex-wrap: wrap; + justify-content: ${({ left }) => (left ? 'left' : 'space-between')}; + ${defaultText}; +` +// #endregion diff --git a/packages/component-manuscript/src/components/ReviewsAndReports.js b/packages/component-manuscript/src/components/ReviewsAndReports.js index 976793bc6823cbcbe9b4a1887d7ee75800c4d8b2..62feede02d3d178b3b2b6384932328acd35087bc 100644 --- a/packages/component-manuscript/src/components/ReviewsAndReports.js +++ b/packages/component-manuscript/src/components/ReviewsAndReports.js @@ -7,6 +7,7 @@ import { compose, withHandlers, lifecycle, withProps } from 'recompose' import { ReviewerBreakdown } from 'pubsweet-components-faraday/src/components/Invitations' import ReviewersDetailsList from 'pubsweet-components-faraday/src/components/Reviewers/ReviewersDetailsList' import ReviewerReportForm from 'pubsweet-component-manuscript/src/components/ReviewerReportForm' +import ReviewReportCard from 'pubsweet-component-manuscript/src/components/ReviewReportCard' import { selectReviewers, selectFetchingReviewers, @@ -64,10 +65,7 @@ const ReviewsAndReports = ({ <Root id="review-report"> <Expandable label="Your Report" startExpanded> {report ? ( - <div> - You have a submitted report with recommendation{' '} - {report.recommendation} - </div> + <ReviewReportCard report={report} /> ) : ( <ReviewerReportForm project={project} diff --git a/packages/component-manuscript/src/components/SideBarActions.js b/packages/component-manuscript/src/components/SideBarActions.js index 129ab2176adcbb181d0adddbbead1487fc4d5ee6..e31d92a43e2cb4ac057523a11b2afc4fbc9277e8 100644 --- a/packages/component-manuscript/src/components/SideBarActions.js +++ b/packages/component-manuscript/src/components/SideBarActions.js @@ -2,13 +2,17 @@ import React from 'react' import { th, Icon } from '@pubsweet/ui' import styled from 'styled-components' -import ZipFiles from 'pubsweet-components-faraday/src/components/Dashboard/ZipFiles' +import ZipFiles from 'pubsweet-components-faraday/src/components/Files/ZipFiles' import { MakeDecision } from './' const SideBarActions = ({ project, version, currentUserIs }) => ( <Root> {currentUserIs('adminEiC') ? <MakeDecision /> : <div />} - <ZipFiles archiveName={`ID-${project.customId}`} fragmentId={version.id}> + <ZipFiles + archiveName={`ID-${project.customId}`} + collectionId={project.id} + fragmentId={version.id} + > <ClickableIcon> <Icon>download</Icon> </ClickableIcon> diff --git a/packages/components-faraday/src/components/Dashboard/DashboardCard.js b/packages/components-faraday/src/components/Dashboard/DashboardCard.js index 843736d4cec859d5ca50449aac9bb0f6bb106ad0..e2456344997492259fe08b99369f8d5f30f94ace 100644 --- a/packages/components-faraday/src/components/Dashboard/DashboardCard.js +++ b/packages/components-faraday/src/components/Dashboard/DashboardCard.js @@ -12,7 +12,7 @@ import { import AuthorsWithTooltip from 'pubsweet-component-manuscript/src/molecules/AuthorsWithTooltip' // import { AuthorsWithTooltip } from '@pubsweet/ui' -import ZipFiles from './ZipFiles' +import ZipFiles from '../Files/ZipFiles' import { InviteReviewers } from '../Reviewers/' import { selectInvitation } from '../../redux/reviewers' import { parseVersion, parseJournalIssue, mapStatusToLabel } from './../utils' @@ -59,6 +59,7 @@ const DashboardCard = ({ <RightDetails flex={2}> <ZipFiles archiveName={`ID-${project.customId}`} + collectionId={project.id} disabled={!hasFiles} fragmentId={version.id} > diff --git a/packages/components-faraday/src/components/Dashboard/ZipFiles.js b/packages/components-faraday/src/components/Files/ZipFiles.js similarity index 81% rename from packages/components-faraday/src/components/Dashboard/ZipFiles.js rename to packages/components-faraday/src/components/Files/ZipFiles.js index 12f38e9a77e1e8a6c69e8ee3d469b859c494dcd6..44f894da70b3d99db34380c3a915679291d6eb87 100644 --- a/packages/components-faraday/src/components/Dashboard/ZipFiles.js +++ b/packages/components-faraday/src/components/Files/ZipFiles.js @@ -1,10 +1,12 @@ import React from 'react' +import qs from 'querystring' import PropTypes from 'prop-types' import { connect } from 'react-redux' import styled from 'styled-components' import { compose, withHandlers, withState } from 'recompose' import { Spinner } from '../UIComponents/index' +import { currentUserIsReviewer } from '../../redux/reviewers' const createAnchorElement = (file, filename) => { const url = URL.createObjectURL(file) @@ -25,13 +27,7 @@ const removeAnchorElement = (a, url) => { URL.revokeObjectURL(url) } -const ZipFiles = ({ - disabled, - fragmentId, - fetching, - children, - downloadFiles, -}) => ( +const ZipFiles = ({ disabled, fetching, children, downloadFiles }) => ( <Root onClick={!disabled ? downloadFiles : null}> {fetching ? <Spinner /> : children} </Root> @@ -39,20 +35,28 @@ const ZipFiles = ({ const cache = {} +const reviewerFiles = ['manuscripts', 'supplementary'] +const defaultFiles = [...reviewerFiles, 'coverLetter'] + const Zip = compose( - connect(state => ({ + connect((state, { collectionId }) => ({ token: state.currentUser.user.token, + isReviewer: currentUserIsReviewer(state, collectionId), })), withState('fetching', 'setFetching', false), withHandlers({ downloadFiles: ({ - fragmentId, - collectionId, + isReviewer, token, + fragmentId, setFetching, archiveName, }) => () => { - const getUrl = `${window.location.origin}/api/files/${fragmentId}` + const getUrl = `${ + window.location.origin + }/api/files/${fragmentId}?${qs.stringify({ + fileTypes: isReviewer ? reviewerFiles : defaultFiles, + })}` if (cache[fragmentId]) { const fileName = archiveName || `${fragmentId}-archive.zip`