Newer
Older
import { th, lighten, darken } from '@pubsweet/ui-toolkit'
import { Action, Icon, Button, H1, H2 } from '@pubsweet/ui'
PreviewPage,
PreviewPanel,
EditPanel,
PanelHeader,
PanelContent,
import UploadFiles, {
SubmissionTypes,
ReviewTypes,
AllTypes,
} from '../upload-files'
import ManuscriptPreview from '../ManuscriptPreview'
import PDFViewer from '../pdf-viewer'
import HTMLPreview from './HTMLPreview'
import ReviewForm from './ReviewForm'
import ReviewInstructions from './ReviewInstructions'
import { CONVERT_XML, GET_REVIEWS } from './operations'
const PreviewPageDiv = styled(PreviewPage)`
& > div > div > div:last-child {
height: calc(100% - (${th('gridUnit')} * 19));
@media screen and (max-width: 870px) {
.show-mobile {
}
.hide-mobile {
display: none;
}
}
`
const PreviewPanelHeader = styled(PanelHeader)`
height: calc(${th('gridUnit')} * 10);
&.hide-mobile button {
margin-left: calc(${th('gridUnit')} * 3);
}
@media screen and (max-width: 870px) {
height: auto;
margin-bottom: calc(${th('gridUnit')} * 3);
}
const PreviewError = styled.div`
border: ${th('borderWidth')} ${th('borderStyle')} ${th('colorError')};
background-color: ${lighten('colorError', 40)};
padding: ${th('gridUnit')} calc(${th('gridUnit')} * 2);
margin: ${th('gridUnit')} 0;
const BannerDiv = styled.div`
position: absolute;
top: 0;
right: calc(${th('gridUnit')} * 4);
left: calc(${th('gridUnit')} * 2);
z-index: 3;
padding: calc(${th('gridUnit')} * 3) calc(${th('gridUnit')} * 2);
background-color: ${darken('colorBackgroundHue', 7)};
border: ${th('borderWidth')} ${th('borderStyle')} ${th('colorBorder')};
display: flex;
align-items: start;
justify-content: space-between;
* {
font-size: ${th('fontSizeBaseSmall')};
}
& > div {
display: flex;
align-items: flex-start;
}
`
const AnnotatePDF = Annotator(PDFViewer)
const AnnotateHTML = Annotator(HTMLPreview)
const Banner = ({ close, open, ...props }) => (
<BannerDiv {...props}>
<div>
<Icon size={2}>info</Icon>
<div>
{`Highlight text and click the pencil icon button to create an annotation and report errors.`}
<Action onClick={open}>
Click here to view detailed instructions.
</Action>
</div>
</div>
<CloseButton onClick={close} size={3} />
</BannerDiv>
)
state = {
pane: this.props.currentUser.admin ? 'files' : 'web',
showManuscript: false,
showAll: false,
const hidePopup = document.cookie.split('; ').reduce((r, v) => {
const parts = v.split('=')
return parts[0] === 'hide-review-popup' ? decodeURIComponent(parts[1]) : r
}, '')
if (
['xml-qa', 'xml-review'].includes(this.props.manuscript.status)
) {
this.setState({ instruct: false, banner: true })
const { manuscript, currentUser, reviews } = this.props
const review = reviews.find(r => !r.deleted) || null
const { files: allfiles, status, teams } = manuscript
const sourceFile = allfiles.find(f => f.type === 'manuscript')
f => !f.type || ReviewTypes.some(rev => rev.value === f.type),
const originalFiles = allfiles.filter(f =>
SubmissionTypes.some(sub => sub.value === f.type),
const html = files.find(file => file.type === 'tempHTML')
const pdf = files.find(f => f.type === 'pdf4load' || f.type === 'pdf4print')
const xml = files.find(f => f.type === 'PMC') || null
const reviewer = teams.find(t => t.role === 'reviewer').teamMembers[0]
const { banner, pane, instruct, showManuscript, showAll } = this.state
!(
currentUser.id === reviewer.user.id &&
manuscript.status === 'xml-review'
)
) {
this.props.history.push('/')
return null
}
{instruct && (
<ReviewInstructions
close={() => this.setState({ instruct: false })}
/>
)}
<PreviewPanel
style={{
flex: showManuscript && '1 1 750px',
width: showManuscript && '50%',
}}
>
<div style={{ maxWidth: showManuscript && '750px' }}>
<PreviewPanelHeader>
<H1>Review web versions of manuscript</H1>
</PreviewPanelHeader>
<Toggle>
onClick={() => this.setState({ pane: 'files' })}
>
</Action>
<Action
className={pane === 'pdf' ? 'current' : ''}
onClick={() => this.setState({ pane: 'pdf' })}
>
}
onClick={() => this.setState({ pane: 'original' })}
primary={pane !== 'original'}
>
<Mutation
mutation={CONVERT_XML}
refetchQueries={() => [
{
query: GET_MANUSCRIPT,
variables: { id: manuscript.id },
},
]}
>
{(convertXML, { data }) => {
const generatePreviews = async () => {
await convertXML({
variables: { id: xml.id },
})
}
return (
<React.Fragment>
<Buttons left top>
<Button disabled={!xml} onClick={generatePreviews}>
Regenerate previews
</Button>
<Button
onClick={() => this.setState({ showAll: !showAll })}
>
{`${showAll ? 'Hide' : 'Show'} submission files`}
</Button>
</Buttons>
</PreviewError>
)}
<UploadFiles
checked
files={showAll ? allfiles : files}
manuscript={manuscript.id}
types={showAll ? AllTypes : ReviewTypes}
/>
<Buttons left top>
<Button disabled={!xml} onClick={generatePreviews}>
Regenerate previews
</Button>
<Button
onClick={() => this.setState({ showAll: !showAll })}
>
{`${showAll ? 'Hide' : 'Show'} submission files`}
</Button>
</Buttons>
</React.Fragment>
)
}}
</Mutation>
<React.Fragment>
{status === 'tagging' ? (
<PDFViewer url={pdf.url} />
) : (
<React.Fragment>
{banner && (
<Banner
close={() => this.setState({ banner: false })}
open={() => this.setState({ instruct: true })}
style={{ top: '1.5rem' }}
/>
)}
<AnnotatePDF
file={pdf}
reload={this.props.reload}
revId={(review && review.id) || null}
userId={currentUser.id}
/>
</React.Fragment>
<React.Fragment>
{status === 'tagging' ? (
<HTMLPreview url={html.url} />
) : (
<React.Fragment>
{banner && (
<Banner
close={() => this.setState({ banner: false })}
open={() => this.setState({ instruct: true })}
/>
)}
<AnnotateHTML
file={html}
reload={this.props.reload}
revId={(review && review.id) || null}
userId={currentUser.id}
/>
</React.Fragment>
)}
{pane === 'original' && sourceFile && (
<ManuscriptPreview file={sourceFile} />
)}
</PanelContent>
</div>
</PreviewPanel>
<EditPanel
style={{
flex: showManuscript && '1 1 750px',
width: showManuscript && '50%',
}}
>
<div style={{ maxWidth: showManuscript && '750px' }}>
<PreviewPanelHeader>
<H2>Compare & approve</H2>
</PreviewPanelHeader>
<Toggle className="hide-mobile">
<Button
onClick={() =>
this.setState({ showManuscript: !showManuscript })
}
>
{showManuscript
: 'Compare with submitted file'}
</Button>
</Toggle>
<PanelContent className={showManuscript && 'pad'}>
{showManuscript && sourceFile ? (
<ManuscriptPreview file={sourceFile} />
) : (
<ReviewForm
</div>
</EditPanel>
</PreviewPageDiv>
)
}
}
const ReviewWithHeader = SubmissionHeader(Review)
const ReviewPage = ({ match, ...props }) => (
<Query
fetchPolicy="cache-and-network"
query={GET_MANUSCRIPT}
variables={{ id: match.params.id }}
>
{({ data: { manuscript }, loading: loadingOne }) => (
<Query query={GET_REVIEWS} variables={{ manuscriptId: match.params.id }}>
{({ data, loading: loadingTwo, refetch }) => {
if (loadingOne || !manuscript) {
return (
<Loading>
<LoadingIcon />
</Loading>
)
}
return (
<ReviewWithHeader
manuscript={manuscript}
match={match}
reviews={(data && data.reviewsByMId) || []}
{...props}
/>
)
}}
</Query>
)}