Skip to content
Snippets Groups Projects
Commit 758c6190 authored by Anca Ursachi's avatar Anca Ursachi
Browse files

feat(deleteManuscriptModal): Create deleteManuscriptModal component for...

feat(deleteManuscriptModal): Create deleteManuscriptModal component for archiving manuscripts by adm
parent d8192034
No related branches found
No related tags found
3 merge requests!222Sprint #26,!217Sprint #26,!198Hin 1166 admin delete manuscript
import React, { Fragment } from 'react' import React, { Fragment } from 'react'
import { get } from 'lodash' import { get } from 'lodash'
import { reduxForm } from 'redux-form'
import styled from 'styled-components' import styled from 'styled-components'
import { th } from '@pubsweet/ui-toolkit' import { th } from '@pubsweet/ui-toolkit'
import { withJournal } from 'xpub-journal' import { withJournal } from 'xpub-journal'
import { H3, H4, DateParser, ValidatedField, TextArea } from '@pubsweet/ui' import { H3, H4, DateParser } from '@pubsweet/ui'
import { compose, withHandlers, setDisplayName, withProps } from 'recompose' import { compose, withHandlers, setDisplayName, withProps } from 'recompose'
import { ItemOverrideAlert } from 'pubsweet-component-faraday-ui'
import { import {
Tag, Tag,
Text, Text,
...@@ -18,20 +17,20 @@ import { ...@@ -18,20 +17,20 @@ import {
TextTooltip, TextTooltip,
AuthorTagList, AuthorTagList,
ReviewerBreakdown, ReviewerBreakdown,
DeleteManuscriptModal,
} from './' } from './'
import { OpenModal } from './modals' import { OpenModal } from './modals'
const ManuscriptCard = ({ const ManuscriptCard = ({
isAdmin,
isDraft, isDraft,
onDelete, onDelete,
isDeleted,
isFetching, isFetching,
deleteManuscript,
onCardClick, onCardClick,
canViewReports,
fragment = {}, fragment = {},
canViewReports,
deleteManuscript,
canDeleteManuscript,
manuscriptType = {}, manuscriptType = {},
collection: { visibleStatus = 'Draft', handlingEditor, customId, id: collId }, collection: { visibleStatus = 'Draft', handlingEditor, customId, id: collId },
}) => { }) => {
...@@ -110,16 +109,16 @@ const ManuscriptCard = ({ ...@@ -110,16 +109,16 @@ const ManuscriptCard = ({
</OpenModal> </OpenModal>
</Item> </Item>
)} )}
{isAdmin &&
!isDraft && {canDeleteManuscript && (
!isDeleted && ( <Item justify="flex-end" onClick={e => e.stopPropagation()}>
<Item justify="flex-end" onClick={e => e.stopPropagation()}> <DeleteManuscriptModal
<FormModal collectionId={collId}
collectionId={collId} modalKey={`archive-${collId}`}
deleteManuscript={deleteManuscript} onSubmit={deleteManuscript}
/> />
</Item> </Item>
)} )}
</Row> </Row>
</MainContainer> </MainContainer>
<SideNavigation> <SideNavigation>
...@@ -128,40 +127,6 @@ const ManuscriptCard = ({ ...@@ -128,40 +127,6 @@ const ManuscriptCard = ({
</Root> </Root>
) )
} }
const Enhanced = () => (
<Row>
<ItemOverrideAlert data-test-id="manuscript-return-reason" vertical>
<Label required>
Reason for removing the manuscript from the platform:
</Label>
<ValidatedField component={TextArea} name="comments" />
</ItemOverrideAlert>
</Row>
)
const FormModal = reduxForm({
form: 'deleteManuscript',
onSubmit: (
{ comments },
dispatch,
{ deleteManuscript, collectionId },
) => modalProps => deleteManuscript({ collectionId, comments, modalProps }),
})(({ collectionId, isFetching, handleSubmit }) => (
<OpenModal
confirmText="Delete"
content={Enhanced}
isFetching={isFetching}
modalKey={`delete-${collectionId}`}
onConfirm={modalProps => handleSubmit()(modalProps)}
title="Are you sure you want to remove this manuscript?"
>
{showModal => (
<ActionLink height={16} icon="trash" onClick={showModal} size="small">
Delete
</ActionLink>
)}
</OpenModal>
))
export default compose( export default compose(
withJournal, withJournal,
...@@ -183,6 +148,9 @@ export default compose( ...@@ -183,6 +148,9 @@ export default compose(
isDeleted: status === 'deleted', isDeleted: status === 'deleted',
}), }),
), ),
withProps(({ isAdmin, isDraft, isDeleted }) => ({
canDeleteManuscript: isAdmin && !isDraft && !isDeleted,
})),
setDisplayName('ManuscriptCard'), setDisplayName('ManuscriptCard'),
)(ManuscriptCard) )(ManuscriptCard)
......
import React, { Fragment } from 'react'
import styled from 'styled-components'
import { compose } from 'recompose'
import { reduxForm } from 'redux-form'
import { th } from '@pubsweet/ui-toolkit'
import { required } from 'xpub-validators'
import { H2, Button, ValidatedField, TextArea, Spinner } from '@pubsweet/ui'
import {
Row,
Text,
Label,
IconButton,
OpenModal,
ActionLink,
ItemOverrideAlert,
withFetching,
} from 'pubsweet-component-faraday-ui'
const Form = compose(
withFetching,
reduxForm({
form: 'deleteManuscript',
}),
)(({ fetchingError, hideModal, handleSubmit, isFetching }) => (
<Root>
<IconButton icon="x" onClick={hideModal} right={5} secondary top={5} />
<H2>Are you sure you want to remove this manuscript?</H2>
<Row mt={1}>
<ItemOverrideAlert data-test-id="manuscript-return-reason" vertical>
<Label required>
Reason for removing the manuscript from the platform:
</Label>
<ValidatedField
component={TextArea}
name="comments"
validate={[required]}
/>
</ItemOverrideAlert>
</Row>
{fetchingError && (
<Text align="center" error mt={1}>
{fetchingError}
</Text>
)}
<Row mt={1}>
{isFetching ? (
<Spinner size={3} />
) : (
<Fragment>
<Button data-test-id="modal-cancel" onClick={hideModal}>
NO
</Button>
<Button data-test-id="modal-confirm" onClick={handleSubmit} primary>
YES
</Button>
</Fragment>
)}
</Row>
</Root>
))
const DeleteManuscriptModal = props => (
<OpenModal component={Form} {...props}>
{showModal => (
<ActionLink height={16} icon="trash" onClick={showModal} size="small">
Delete
</ActionLink>
)}
</OpenModal>
)
export default DeleteManuscriptModal
DeleteManuscriptModal.defaultProps = {
onSubmit: () => {},
collectionId: 'santa-claus',
modalKey: 'deleteManuscriptModal',
}
// #region styles
const Root = styled.div`
align-items: center;
background: ${th('colorBackgroundHue')};
border: ${th('borderWidth')} ${th('borderStyle')} transparent;
border-radius: ${th('borderRadius')};
box-shadow: ${th('boxShadow')};
display: flex;
flex-direction: column;
position: relative;
padding: calc(${th('gridUnit')} * 3);
width: calc(${th('gridUnit')} * 60);
${H2} {
margin: 0;
text-align: center;
}
`
// #endregion
export { default as DeleteManuscriptModal } from './DeleteManuscriptModal'
export { default as ManuscriptDetailsTop } from './ManuscriptDetailsTop' export { default as ManuscriptDetailsTop } from './ManuscriptDetailsTop'
export { default as ManuscriptVersion } from './ManuscriptVersion' export { default as ManuscriptVersion } from './ManuscriptVersion'
export { default as ManuscriptHeader } from './ManuscriptHeader' export { default as ManuscriptHeader } from './ManuscriptHeader'
......
...@@ -51,12 +51,12 @@ const MultiAction = ({ ...@@ -51,12 +51,12 @@ const MultiAction = ({
export default compose( export default compose(
withHandlers({ withHandlers({
onConfirm: ({ onConfirm, ...props }) => () => { onConfirm: ({ onConfirm, ...props }) => () => {
if (onConfirm && typeof onConfirm === 'function') { if (typeof onConfirm === 'function') {
onConfirm(props) onConfirm(props)
} }
}, },
onClose: ({ onCancel, ...props }) => () => { onClose: ({ onCancel, ...props }) => () => {
if (onCancel && typeof onCancel === 'function') { if (typeof onCancel === 'function') {
onCancel(props) onCancel(props)
} }
props.hideModal() props.hideModal()
......
import { compose, withHandlers, withProps } from 'recompose' import { compose, withHandlers, withProps } from 'recompose'
import { withModal } from 'pubsweet-component-modal/src/components' import { withModal } from 'pubsweet-component-modal/src/components'
import { MultiAction, SingleActionModal, FormModal } from './' import { MultiAction, SingleActionModal } from './'
const OpenModal = ({ showModal, children }) => children(showModal) const OpenModal = ({ showModal, children }) => children(showModal)
const selectModalComponent = props => { const selectModalComponent = props => {
if (props.single) { if (props.component) {
return { return {
modalComponent: SingleActionModal, modalComponent: props.component,
} }
} }
if (props.formModal) if (props.single) {
return { return {
modalComponent: FormModal, modalComponent: SingleActionModal,
} }
}
return { return {
modalComponent: MultiAction, modalComponent: MultiAction,
} }
......
...@@ -19,6 +19,7 @@ const Dashboard = ({ ...@@ -19,6 +19,7 @@ const Dashboard = ({
getDefaultFilterValue={getDefaultFilterValue} getDefaultFilterValue={getDefaultFilterValue}
getFilterOptions={getFilterOptions} getFilterOptions={getFilterOptions}
/> />
<DashboardItems <DashboardItems
deleteCollection={deleteCollection} deleteCollection={deleteCollection}
deleteManuscript={deleteManuscript} deleteManuscript={deleteManuscript}
......
...@@ -16,8 +16,8 @@ import { ...@@ -16,8 +16,8 @@ import {
import { Dashboard } from './' import { Dashboard } from './'
import { priorityFilter, orderFilter, withFiltersHOC } from '../Filters' import { priorityFilter, orderFilter, withFiltersHOC } from '../Filters'
const deleteManuscript = ({ collectionId, ...body }) => const deleteManuscript = ({ collectionId, comments }) =>
update(`/collections/${collectionId}/archive`, body) update(`/collections/${collectionId}/archive`, { comments })
export default compose( export default compose(
ConnectPage(() => [ ConnectPage(() => [
...@@ -86,20 +86,21 @@ export default compose( ...@@ -86,20 +86,21 @@ export default compose(
handleError(setModalError)(err) handleError(setModalError)(err)
}) })
}, },
deleteManuscript: ({ setFetching, getCollections }) => ({ deleteManuscript: ({ getCollections }) => (
modalProps: { setModalError, hideModal }, { comments },
...decision dispatch,
}) => { { setFetching, setError, hideModal, collectionId },
) => {
setFetching(true) setFetching(true)
return deleteManuscript(decision) deleteManuscript({ collectionId, comments })
.then(() => { .then(() => {
setFetching(false) setFetching(false)
hideModal() hideModal()
getCollections() getCollections()
}) })
.catch(err => { .catch(e => {
setFetching(false) setFetching(false)
handleError(setModalError)(err) handleError(setError)(e)
}) })
}, },
}), }),
......
...@@ -116,7 +116,6 @@ const Step0 = ({ type, error, journal, handleSubmit, initialValues }) => ...@@ -116,7 +116,6 @@ const Step0 = ({ type, error, journal, handleSubmit, initialValues }) =>
> >
PROCEED TO SET {type === 'signup' && 'EMAIL AND'} PASSWORD PROCEED TO SET {type === 'signup' && 'EMAIL AND'} PASSWORD
</Button> </Button>
<Row mt={3}> <Row mt={3}>
<Text display="flex"> <Text display="flex">
Already have an account? Already have an account?
......
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