Skip to content
Snippets Groups Projects
Commit a26f7aea authored by Alexandru Munteanu's avatar Alexandru Munteanu
Browse files

feat(invite-reviewer): filter users who already answered, sort reviewers

parent 1271d96e
No related branches found
No related tags found
1 merge request!6Agree/Decline to work on a manuscript
...@@ -71,6 +71,7 @@ const InviteReviewersModal = compose( ...@@ -71,6 +71,7 @@ const InviteReviewersModal = compose(
collectionId={collectionId} collectionId={collectionId}
getReviewers={getReviewers} getReviewers={getReviewers}
isFetching={fetchingInvite} isFetching={fetchingInvite}
reviewers={reviewers}
/> />
<Row> <Row>
......
import React from 'react' import React from 'react'
import { get, pick } from 'lodash'
import { connect } from 'react-redux' import { connect } from 'react-redux'
import styled from 'styled-components' import styled from 'styled-components'
import { compose, withHandlers } from 'recompose' import { compose, withHandlers } from 'recompose'
import { th, Button, Spinner } from '@pubsweet/ui' import { th, Button, Spinner } from '@pubsweet/ui'
import { get, pick, differenceWith } from 'lodash'
import { reduxForm, change as changeForm, initialize } from 'redux-form' import { reduxForm, change as changeForm, initialize } from 'redux-form'
import { ReviewersSelect } from './' import { ReviewersSelect } from './'
...@@ -16,10 +16,11 @@ const ReviewerForm = ({ ...@@ -16,10 +16,11 @@ const ReviewerForm = ({
handleSubmit, handleSubmit,
users, users,
isFetching, isFetching,
filteredUsers,
}) => ( }) => (
<Root> <Root>
<Row> <Row>
<ReviewersSelect onSelect={selectReviewer} values={users} /> <ReviewersSelect onSelect={selectReviewer} values={filteredUsers()} />
<ValidatedTextField isRequired label="Last name*" name="lastName" /> <ValidatedTextField isRequired label="Last name*" name="lastName" />
</Row> </Row>
<Row> <Row>
...@@ -76,6 +77,12 @@ export default compose( ...@@ -76,6 +77,12 @@ export default compose(
clearForm: ({ reset }) => () => { clearForm: ({ reset }) => () => {
reset() reset()
}, },
filteredUsers: ({ users, reviewers }) => () =>
differenceWith(
users,
reviewers.filter(r => r.status !== 'pending'),
(user, reviewer) => user.email === reviewer.email,
),
}), }),
)(ReviewerForm) )(ReviewerForm)
......
...@@ -3,8 +3,8 @@ import moment from 'moment' ...@@ -3,8 +3,8 @@ 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'
import { compose, withHandlers } from 'recompose'
import styled, { withTheme } from 'styled-components' import styled, { withTheme } from 'styled-components'
import { compose, withHandlers, withProps } from 'recompose'
import { revokeReviewer, inviteReviewer } from '../../redux/reviewers' import { revokeReviewer, inviteReviewer } from '../../redux/reviewers'
...@@ -24,6 +24,7 @@ const ResendRevoke = withTheme( ...@@ -24,6 +24,7 @@ const ResendRevoke = withTheme(
) )
const ReviewersList = ({ const ReviewersList = ({
renderAcceptedLabel,
reviewers, reviewers,
showConfirmResend, showConfirmResend,
showConfirmRevoke, showConfirmRevoke,
...@@ -38,7 +39,9 @@ const ReviewersList = ({ ...@@ -38,7 +39,9 @@ const ReviewersList = ({
<div> <div>
<ReviewerName>{r.name}</ReviewerName> <ReviewerName>{r.name}</ReviewerName>
{r.status === 'accepted' && ( {r.status === 'accepted' && (
<AcceptedReviewer>{`Reviewer ${index + 1}`}</AcceptedReviewer> <AcceptedReviewer>
{renderAcceptedLabel(index)}
</AcceptedReviewer>
)} )}
</div> </div>
<ReviewerEmail>{r.email}</ReviewerEmail> <ReviewerEmail>{r.email}</ReviewerEmail>
...@@ -47,7 +50,7 @@ const ReviewersList = ({ ...@@ -47,7 +50,7 @@ const ReviewersList = ({
<StatusText>{r.status}</StatusText> <StatusText>{r.status}</StatusText>
<DateText>{renderTimestamp(r.timestamp)}</DateText> <DateText>{renderTimestamp(r.timestamp)}</DateText>
</Column> </Column>
{r.status !== 'accepted' ? ( {r.status === 'pending' ? (
<ResendRevoke <ResendRevoke
showConfirmResend={showConfirmResend(r)} showConfirmResend={showConfirmResend(r)}
showConfirmRevoke={showConfirmRevoke(r.invitationId)} showConfirmRevoke={showConfirmRevoke(r.invitationId)}
...@@ -64,6 +67,9 @@ const ReviewersList = ({ ...@@ -64,6 +67,9 @@ const ReviewersList = ({
export default compose( export default compose(
connect(null, { inviteReviewer, revokeReviewer }), connect(null, { inviteReviewer, revokeReviewer }),
withProps(({ reviewers = [] }) => ({
firstAccepted: reviewers.findIndex(r => r.status === 'accepted'),
})),
withHandlers({ withHandlers({
renderTimestamp: () => timestamp => { renderTimestamp: () => timestamp => {
const today = moment() const today = moment()
...@@ -84,6 +90,8 @@ export default compose( ...@@ -84,6 +90,8 @@ export default compose(
}, },
}) })
}, },
renderAcceptedLabel: ({ firstAccepted }) => index =>
`Reviewer ${index - firstAccepted + 1}`,
}), }),
withHandlers({ withHandlers({
showConfirmResend: ({ showConfirmResend: ({
......
import { get } from 'lodash' import { get, orderBy } from 'lodash'
import { selectCurrentUser } from 'xpub-selectors' import { selectCurrentUser } from 'xpub-selectors'
import { import {
get as apiGet, get as apiGet,
...@@ -6,6 +6,7 @@ import { ...@@ -6,6 +6,7 @@ import {
remove, remove,
update, update,
} from 'pubsweet-client/src/helpers/api' } from 'pubsweet-client/src/helpers/api'
import { orderReviewers } from './utils'
const GET_REVIEWERS_REQUEST = 'GET_REVIEWERS_REQUEST' const GET_REVIEWERS_REQUEST = 'GET_REVIEWERS_REQUEST'
const GET_REVIEWERS_ERROR = 'GET_REVIEWERS_ERROR' const GET_REVIEWERS_ERROR = 'GET_REVIEWERS_ERROR'
...@@ -86,7 +87,7 @@ export const selectInvitation = (state, collectionId) => { ...@@ -86,7 +87,7 @@ export const selectInvitation = (state, collectionId) => {
export const getCollectionReviewers = collectionId => dispatch => { export const getCollectionReviewers = collectionId => dispatch => {
dispatch(getReviewersRequest()) dispatch(getReviewersRequest())
return apiGet(`/collections/${collectionId}/invitations?role=reviewer`).then( return apiGet(`/collections/${collectionId}/invitations?role=reviewer`).then(
r => dispatch(getReviewersSuccess(r)), r => dispatch(getReviewersSuccess(orderBy(r, orderReviewers))),
err => dispatch(getReviewersError(err)), err => dispatch(getReviewersError(err)),
) )
} }
......
export const orderReviewers = r => {
switch (r.status) {
case 'pending':
return -1
case 'accepted':
return 0
case 'refused':
default:
return 1
}
}
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