Skip to content
Snippets Groups Projects
Commit 576fa63a authored by Sebastian's avatar Sebastian
Browse files

Merge branch 'master' of gitlab.coko.foundation:xpub/xpub-faraday

parents a63d5834 84ee35a3
No related branches found
No related tags found
No related merge requests found
export { default as withModal } from './withModal' export { default as withModal } from './withModal'
export { default as SuccessModal } from './SuccessModal' export { default as SuccessModal } from './SuccessModal'
export { default as ConfirmationModal } from './ConfirmationModal' export { default as ConfirmationModal } from './ConfirmationModal'
export { withModal2 } from './withModal'
import React from 'react' import React from 'react'
import { omit } from 'lodash' import { omit } from 'lodash'
import { connect } from 'react-redux' import { connect } from 'react-redux'
import { compose } from 'recompose'
import Modal from './Modal' import Modal from './Modal'
import { showModal, hideModal, setModalError } from '../redux/modal' import { showModal, hideModal, setModalError } from '../redux/modal'
...@@ -17,6 +18,48 @@ const mapDispatch = modalKey => (dispatch, propss) => ({ ...@@ -17,6 +18,48 @@ const mapDispatch = modalKey => (dispatch, propss) => ({
setModalError: errorMessage => dispatch(setModalError(errorMessage)), setModalError: errorMessage => dispatch(setModalError(errorMessage)),
}) })
const mapDispatch2 = (dispatch, props) => ({
hideModal: () => dispatch(hideModal()),
showModal: (modalProps = {}) =>
dispatch(showModal(props.modalKey, modalProps)),
setModalError: errorMessage => dispatch(setModalError(errorMessage)),
})
export const withModal2 = mapperFn => BaseComponent =>
compose(connect(mapState, mapDispatch2))(baseProps => {
const { modalComponent: Component, overlayColor } = mapperFn(baseProps)
const {
hideModal,
modalProps,
modalError,
modalsVisibility,
modalKey,
showModal,
...rest
} = baseProps
return (
<React.Fragment>
{modalsVisibility[modalKey] && (
<Modal
{...modalProps}
component={Component}
hideModal={hideModal}
modalError={modalError}
overlayColor={overlayColor}
setModalError={setModalError}
showModal={showModal}
/>
)}
<BaseComponent
hideModal={hideModal}
setModalError={setModalError}
showModal={showModal}
{...rest}
/>
</React.Fragment>
)
})
const withModal = ({ const withModal = ({
modalKey, modalKey,
modalComponent: Component, modalComponent: Component,
......
...@@ -25,6 +25,7 @@ const DashboardCard = ({ ...@@ -25,6 +25,7 @@ const DashboardCard = ({
theme, theme,
currentUser, currentUser,
renderHandlingEditorRow, renderHandlingEditorRow,
canInviteReviewers,
...rest ...rest
}) => { }) => {
const { submitted, title, type } = parseVersion(version) const { submitted, title, type } = parseVersion(version)
...@@ -139,8 +140,13 @@ const DashboardCard = ({ ...@@ -139,8 +140,13 @@ const DashboardCard = ({
<HEText>Handling Editor</HEText> <HEText>Handling Editor</HEText>
{renderHandlingEditorRow()} {renderHandlingEditorRow()}
</LeftDetails> </LeftDetails>
{canInviteReviewers() && (
<InviteReviewers
modalKey={`invite-reviewers-${project.id}`}
project={project}
/>
)}
</Bottom> </Bottom>
<InviteReviewers project={project} />
</DetailsView> </DetailsView>
)} )}
</Card> </Card>
...@@ -155,6 +161,12 @@ export default compose( ...@@ -155,6 +161,12 @@ export default compose(
modalComponent: ConfirmationModal, modalComponent: ConfirmationModal,
}), }),
withHandlers({ withHandlers({
canInviteReviewers: ({ currentUser }) => () => {
const isAdmin = get(currentUser, 'admin')
const isEic = get(currentUser, 'editorInChief')
const isHe = get(currentUser, 'handlingEditor')
return isAdmin || isEic || isHe
},
renderHandlingEditorRow: ({ currentUser, project }) => () => { renderHandlingEditorRow: ({ currentUser, project }) => () => {
const status = get(project, 'status') || 'draft' const status = get(project, 'status') || 'draft'
const isAdmin = get(currentUser, 'admin') const isAdmin = get(currentUser, 'admin')
......
...@@ -3,8 +3,8 @@ import { Icon, Button, th } from '@pubsweet/ui' ...@@ -3,8 +3,8 @@ import { Icon, Button, th } from '@pubsweet/ui'
import styled, { css, withTheme } from 'styled-components' import styled, { css, withTheme } from 'styled-components'
import { compose, withHandlers, lifecycle, withState } from 'recompose' import { compose, withHandlers, lifecycle, withState } from 'recompose'
import { import {
withModal,
ConfirmationModal, ConfirmationModal,
withModal2,
} from 'pubsweet-component-modal/src/components' } from 'pubsweet-component-modal/src/components'
import { ReviewerForm, ReviewersList } from './' import { ReviewerForm, ReviewersList } from './'
...@@ -69,16 +69,14 @@ const ModalSwitcher = ({ type, ...rest }) => { ...@@ -69,16 +69,14 @@ const ModalSwitcher = ({ type, ...rest }) => {
} }
export default compose( export default compose(
withModal({ withModal2(props => ({
modalKey: 'invite-reviewers',
modalComponent: ModalSwitcher, modalComponent: ModalSwitcher,
}), })),
withHandlers({ withHandlers({
showInviteModal: ({ showModal, hideModal, project, reviewers }) => () => { showInviteModal: ({ showModal, hideModal, project }) => () => {
showModal({ showModal({
type: 'invite-reviewers', type: 'invite-reviewers',
collectionId: project.id, collectionId: project.id,
reviewers,
onConfirm: () => { onConfirm: () => {
hideModal() hideModal()
}, },
......
import React from 'react' import React from 'react'
import moment from 'moment'
import { pick } from 'lodash' import { pick } from 'lodash'
import { connect } from 'react-redux' import { connect } from 'react-redux'
import { th, Icon } from '@pubsweet/ui' import { th, Icon } from '@pubsweet/ui'
...@@ -47,14 +48,16 @@ const defaultReviewers = [ ...@@ -47,14 +48,16 @@ const defaultReviewers = [
] ]
const ResendRevoke = withTheme( const ResendRevoke = withTheme(
({ theme, showConfirmResend, showConfirmRevoke }) => ( ({ theme, showConfirmResend, showConfirmRevoke, status }) => (
<ActionButtons> <ActionButtons>
<div onClick={showConfirmResend}> <div onClick={showConfirmResend}>
<Icon color={theme.colorPrimary}>refresh-cw</Icon> <Icon color={theme.colorPrimary}>refresh-cw</Icon>
</div> </div>
<div onClick={showConfirmRevoke}> {status === 'pending' && (
<Icon color={theme.colorPrimary}>x-circle</Icon> <div onClick={showConfirmRevoke}>
</div> <Icon color={theme.colorPrimary}>x-circle</Icon>
</div>
)}
</ActionButtons> </ActionButtons>
), ),
) )
...@@ -63,6 +66,7 @@ const ReviewersList = ({ ...@@ -63,6 +66,7 @@ const ReviewersList = ({
reviewers = defaultReviewers, reviewers = defaultReviewers,
showConfirmResend, showConfirmResend,
showConfirmRevoke, showConfirmRevoke,
renderTimestamp,
}) => ( }) => (
<Root> <Root>
<ScrollContainer> <ScrollContainer>
...@@ -79,12 +83,15 @@ const ReviewersList = ({ ...@@ -79,12 +83,15 @@ const ReviewersList = ({
</Column> </Column>
<Column> <Column>
<StatusText>{r.status}</StatusText> <StatusText>{r.status}</StatusText>
<StatusText>{r.timestamp}</StatusText> <DateText>{renderTimestamp(r.timestamp)}</DateText>
</Column> </Column>
<ResendRevoke {r.status !== 'accepted' && (
showConfirmResend={showConfirmResend(r)} <ResendRevoke
showConfirmRevoke={showConfirmRevoke(r.invitationId)} showConfirmResend={showConfirmResend(r)}
/> showConfirmRevoke={showConfirmRevoke(r.invitationId)}
status={r.status}
/>
)}
</ReviewerItem> </ReviewerItem>
))} ))}
</ScrollContainer> </ScrollContainer>
...@@ -94,6 +101,16 @@ const ReviewersList = ({ ...@@ -94,6 +101,16 @@ const ReviewersList = ({
export default compose( export default compose(
connect(null, { inviteReviewer, revokeReviewer }), connect(null, { inviteReviewer, revokeReviewer }),
withHandlers({ withHandlers({
renderTimestamp: () => timestamp => {
const today = moment()
const stamp = moment(timestamp)
const duration = moment.duration(today.diff(stamp))
if (duration.asDays() < 1) {
return `${duration.humanize()} ago`
}
return stamp.format('DD.MM.YYYY')
},
goBackToReviewers: ({ showModal, hideModal, collectionId }) => () => { goBackToReviewers: ({ showModal, hideModal, collectionId }) => () => {
showModal({ showModal({
collectionId, collectionId,
...@@ -112,7 +129,8 @@ export default compose( ...@@ -112,7 +129,8 @@ export default compose(
collectionId, collectionId,
}) => reviewer => () => { }) => reviewer => () => {
showModal({ showModal({
title: 'Resend confirmation', title: 'Resend reviewer invite',
confirmText: 'Resend',
onConfirm: () => { onConfirm: () => {
inviteReviewer( inviteReviewer(
pick(reviewer, ['email', 'firstName', 'lastName', 'affiliation']), pick(reviewer, ['email', 'firstName', 'lastName', 'affiliation']),
...@@ -130,7 +148,8 @@ export default compose( ...@@ -130,7 +148,8 @@ export default compose(
collectionId, collectionId,
}) => invitationId => () => { }) => invitationId => () => {
showModal({ showModal({
title: 'Revoke confirmation', title: 'Unassign Reviewer',
confirmText: 'Unassign',
onConfirm: () => { onConfirm: () => {
revokeReviewer(invitationId, collectionId).then( revokeReviewer(invitationId, collectionId).then(
goBackToReviewers, goBackToReviewers,
...@@ -160,7 +179,11 @@ const AcceptedReviewer = ReviewerEmail.extend` ...@@ -160,7 +179,11 @@ const AcceptedReviewer = ReviewerEmail.extend`
margin-left: ${th('subGridUnit')}; margin-left: ${th('subGridUnit')};
` `
const StatusText = ReviewerEmail.extend`` const StatusText = ReviewerEmail.extend`
text-transform: uppercase;
`
const DateText = ReviewerEmail.extend``
const Column = styled.div` const Column = styled.div`
align-items: flex-start; align-items: flex-start;
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment