diff --git a/packages/components-faraday/src/components/Reviewers/InviteReviewers.js b/packages/components-faraday/src/components/Reviewers/InviteReviewers.js index 272a4c02ddb7501491e342ed9a3fd6dc1909a205..bd8722dc070371a724e8511b9b1512349267b61a 100644 --- a/packages/components-faraday/src/components/Reviewers/InviteReviewers.js +++ b/packages/components-faraday/src/components/Reviewers/InviteReviewers.js @@ -71,6 +71,7 @@ const InviteReviewersModal = compose( collectionId={collectionId} getReviewers={getReviewers} isFetching={fetchingInvite} + reviewers={reviewers} /> <Row> diff --git a/packages/components-faraday/src/components/Reviewers/ReviewerForm.js b/packages/components-faraday/src/components/Reviewers/ReviewerForm.js index 923c669e1b543d86fa691aae0b0f6ba529d9f624..8234bcad106f141eb1a5873889b150822fc742c3 100644 --- a/packages/components-faraday/src/components/Reviewers/ReviewerForm.js +++ b/packages/components-faraday/src/components/Reviewers/ReviewerForm.js @@ -1,9 +1,9 @@ import React from 'react' -import { get, pick } from 'lodash' import { connect } from 'react-redux' import styled from 'styled-components' import { compose, withHandlers } from 'recompose' import { th, Button, Spinner } from '@pubsweet/ui' +import { get, pick, differenceWith } from 'lodash' import { reduxForm, change as changeForm, initialize } from 'redux-form' import { ReviewersSelect } from './' @@ -16,10 +16,11 @@ const ReviewerForm = ({ handleSubmit, users, isFetching, + filteredUsers, }) => ( <Root> <Row> - <ReviewersSelect onSelect={selectReviewer} values={users} /> + <ReviewersSelect onSelect={selectReviewer} values={filteredUsers()} /> <ValidatedTextField isRequired label="Last name*" name="lastName" /> </Row> <Row> @@ -76,6 +77,12 @@ export default compose( clearForm: ({ reset }) => () => { reset() }, + filteredUsers: ({ users, reviewers }) => () => + differenceWith( + users, + reviewers.filter(r => r.status !== 'pending'), + (user, reviewer) => user.email === reviewer.email, + ), }), )(ReviewerForm) diff --git a/packages/components-faraday/src/components/Reviewers/ReviewerList.js b/packages/components-faraday/src/components/Reviewers/ReviewerList.js index 4dcf29933a27a91ebbea68b29c7ce8b69f71518d..1e6e44fcdbaaa46724c3c5c8ad2880e89324a870 100644 --- a/packages/components-faraday/src/components/Reviewers/ReviewerList.js +++ b/packages/components-faraday/src/components/Reviewers/ReviewerList.js @@ -3,8 +3,8 @@ import moment from 'moment' import { pick } from 'lodash' import { connect } from 'react-redux' import { th, Icon } from '@pubsweet/ui' -import { compose, withHandlers } from 'recompose' import styled, { withTheme } from 'styled-components' +import { compose, withHandlers, withProps } from 'recompose' import { revokeReviewer, inviteReviewer } from '../../redux/reviewers' @@ -24,6 +24,7 @@ const ResendRevoke = withTheme( ) const ReviewersList = ({ + renderAcceptedLabel, reviewers, showConfirmResend, showConfirmRevoke, @@ -38,7 +39,9 @@ const ReviewersList = ({ <div> <ReviewerName>{r.name}</ReviewerName> {r.status === 'accepted' && ( - <AcceptedReviewer>{`Reviewer ${index + 1}`}</AcceptedReviewer> + <AcceptedReviewer> + {renderAcceptedLabel(index)} + </AcceptedReviewer> )} </div> <ReviewerEmail>{r.email}</ReviewerEmail> @@ -47,7 +50,7 @@ const ReviewersList = ({ <StatusText>{r.status}</StatusText> <DateText>{renderTimestamp(r.timestamp)}</DateText> </Column> - {r.status !== 'accepted' ? ( + {r.status === 'pending' ? ( <ResendRevoke showConfirmResend={showConfirmResend(r)} showConfirmRevoke={showConfirmRevoke(r.invitationId)} @@ -64,6 +67,9 @@ const ReviewersList = ({ export default compose( connect(null, { inviteReviewer, revokeReviewer }), + withProps(({ reviewers = [] }) => ({ + firstAccepted: reviewers.findIndex(r => r.status === 'accepted'), + })), withHandlers({ renderTimestamp: () => timestamp => { const today = moment() @@ -84,6 +90,8 @@ export default compose( }, }) }, + renderAcceptedLabel: ({ firstAccepted }) => index => + `Reviewer ${index - firstAccepted + 1}`, }), withHandlers({ showConfirmResend: ({ diff --git a/packages/components-faraday/src/redux/reviewers.js b/packages/components-faraday/src/redux/reviewers.js index 7f5795c31c0b0e3148692c58b725eb3d6ac6d031..51d559637995a1280ca6955a8467058c6b063ed2 100644 --- a/packages/components-faraday/src/redux/reviewers.js +++ b/packages/components-faraday/src/redux/reviewers.js @@ -1,4 +1,4 @@ -import { get } from 'lodash' +import { get, orderBy } from 'lodash' import { selectCurrentUser } from 'xpub-selectors' import { get as apiGet, @@ -6,6 +6,7 @@ import { remove, update, } from 'pubsweet-client/src/helpers/api' +import { orderReviewers } from './utils' const GET_REVIEWERS_REQUEST = 'GET_REVIEWERS_REQUEST' const GET_REVIEWERS_ERROR = 'GET_REVIEWERS_ERROR' @@ -86,7 +87,7 @@ export const selectInvitation = (state, collectionId) => { export const getCollectionReviewers = collectionId => dispatch => { dispatch(getReviewersRequest()) return apiGet(`/collections/${collectionId}/invitations?role=reviewer`).then( - r => dispatch(getReviewersSuccess(r)), + r => dispatch(getReviewersSuccess(orderBy(r, orderReviewers))), err => dispatch(getReviewersError(err)), ) } diff --git a/packages/components-faraday/src/redux/utils.js b/packages/components-faraday/src/redux/utils.js new file mode 100644 index 0000000000000000000000000000000000000000..2f7f9cdca4a2f3b65a248f0ad1bb67d4fe300f04 --- /dev/null +++ b/packages/components-faraday/src/redux/utils.js @@ -0,0 +1,11 @@ +export const orderReviewers = r => { + switch (r.status) { + case 'pending': + return -1 + case 'accepted': + return 0 + case 'refused': + default: + return 1 + } +}