diff --git a/packages/components-faraday/src/components/Filters/importanceSort.js b/packages/components-faraday/src/components/Filters/importanceSort.js index b86f37c80951a9a4ebbf89bb26ea03d78acb37ca..fd906879dcd0e8af3309ea28d24668984cad8d18 100644 --- a/packages/components-faraday/src/components/Filters/importanceSort.js +++ b/packages/components-faraday/src/components/Filters/importanceSort.js @@ -18,6 +18,10 @@ const sortFn = sortValue => (item1, item2) => { const item1Importance = utils.getCollectionImportance(statuses, item1) const item2Importance = utils.getCollectionImportance(statuses, item2) + if (item1Importance - item2Importance === 0) { + return item1.created - item2.created + } + if (sortValue === SORT_VALUES.MORE_IMPORTANT) { return item2Importance - item1Importance } diff --git a/packages/components-faraday/src/components/Filters/importanceSort.test.js b/packages/components-faraday/src/components/Filters/importanceSort.test.js new file mode 100644 index 0000000000000000000000000000000000000000..b2c270dbbcdc40a45b9fb2f521714f8805c1bd29 --- /dev/null +++ b/packages/components-faraday/src/components/Filters/importanceSort.test.js @@ -0,0 +1,63 @@ +import fixturesService from 'pubsweet-component-fixture-service' + +import { importanceSort } from './' +import { SORT_VALUES } from './importanceSort' + +const { sortFn } = importanceSort +const { fixtures: { collections: { collection } } } = fixturesService + +describe('Importance sort', () => { + describe('Important items first', () => { + // the more important collection is already before the less important one + it('should return a negative value', () => { + const sortResult = sortFn(SORT_VALUES.MORE_IMPORTANT)( + { ...collection, status: 'pendingApproval' }, + { ...collection, status: 'heAssigned' }, + ) + expect(sortResult).toBeLessThan(0) + }) + // the more important collection is after a less important one + it('should return a positive value', () => { + const sortResult = sortFn(SORT_VALUES.MORE_IMPORTANT)( + { ...collection, status: 'heAssigned' }, + { ...collection, status: 'pendingApproval' }, + ) + expect(sortResult).toBeGreaterThan(0) + }) + }) + + describe('Less important items first', () => { + it('should return a positive value', () => { + const sortResult = sortFn(SORT_VALUES.LESS_IMPORTANT)( + { ...collection, status: 'pendingApproval' }, + { ...collection, status: 'heAssigned' }, + ) + expect(sortResult).toBeGreaterThan(0) + }) + it('should return a negative value', () => { + const sortResult = sortFn(SORT_VALUES.LESS_IMPORTANT)( + { ...collection, status: 'heAssigned' }, + { ...collection, status: 'pendingApproval' }, + ) + expect(sortResult).toBeLessThan(0) + }) + }) + + describe('Sort by date if both have the same', () => { + it('should place older item before newer item', () => { + const sortResult = sortFn(SORT_VALUES.LESS_IMPORTANT)( + { ...collection, status: 'heAssigned', created: Date.now() + 2000 }, + { ...collection, status: 'heAssigned', created: Date.now() }, + ) + expect(sortResult).toBeGreaterThan(0) + }) + + it('should not move items', () => { + const sortResult = sortFn(SORT_VALUES.LESS_IMPORTANT)( + { ...collection, status: 'heAssigned', created: Date.now() }, + { ...collection, status: 'heAssigned', created: Date.now() + 2000 }, + ) + expect(sortResult).toBeLessThan(0) + }) + }) +}) diff --git a/packages/components-faraday/src/components/Filters/priorityFilter.js b/packages/components-faraday/src/components/Filters/priorityFilter.js index 4222f85fd52fb9caa18b561bdfb8b9960c7b28da..80367b1cea61a920bea6856c4693d038b4400463 100644 --- a/packages/components-faraday/src/components/Filters/priorityFilter.js +++ b/packages/components-faraday/src/components/Filters/priorityFilter.js @@ -9,19 +9,26 @@ export const FILTER_VALUES = { ALL: 'all', NEEDS_ATTENTION: 'needsAttention', IN_PROGRESS: 'inProgress', + ARCHIVED: 'archived', } const options = [ { label: 'All', value: FILTER_VALUES.ALL }, { label: 'Needs Attention', value: FILTER_VALUES.NEEDS_ATTENTION }, { label: 'In Progress', value: FILTER_VALUES.IN_PROGRESS }, + { label: 'Archived', value: FILTER_VALUES.ARCHIVED }, ] +const archivedStatuses = ['withdrawn', 'accepted', 'rejected'] + const filterFn = (filterValue, { currentUser, userPermissions = [] }) => ({ id = '', fragments = [], status = 'draft', }) => { + if (filterValue === FILTER_VALUES.ARCHIVED) { + return archivedStatuses.includes(status) + } const permission = userPermissions.find( ({ objectId }) => objectId === id || fragments.includes(objectId), ) diff --git a/packages/components-faraday/src/components/Filters/priorityFilter.test.js b/packages/components-faraday/src/components/Filters/priorityFilter.test.js index ce0d9b6b0afc43dccb4174f5a7efc12717ef5046..ac2f07d2f7f5f4ffa937073fe3d96ea1bc6c88ec 100644 --- a/packages/components-faraday/src/components/Filters/priorityFilter.test.js +++ b/packages/components-faraday/src/components/Filters/priorityFilter.test.js @@ -123,6 +123,18 @@ describe('Priority filter function for reviewersInvited status', () => { expect(filterResult).toBeFalsy() }) }) + + describe('ARCHIVED', () => { + it('should return falsy', () => { + const filterResult = filterFn(FILTER_VALUES.ARCHIVED, { + currentUser: users.admin, + })({ + ...collection, + status: 'reviewersInvited', + }) + expect(filterResult).toBeFalsy() + }) + }) }) describe('Priority filter function for technicalChecks status', () => { @@ -239,6 +251,18 @@ describe('Priority filter function for technicalChecks status', () => { expect(filterResult).toBeFalsy() }) }) + + describe('ARCHIVED', () => { + it('should return falsy', () => { + const filterResult = filterFn(FILTER_VALUES.ARCHIVED, { + currentUser: users.admin, + })({ + ...collection, + status: 'technicalChecks', + }) + expect(filterResult).toBeFalsy() + }) + }) }) describe('Priority filter function for pendingApproval status', () => { @@ -355,4 +379,58 @@ describe('Priority filter function for pendingApproval status', () => { expect(filterResult).toBeFalsy() }) }) + + describe('ARCHIVED', () => { + it('should return falsy', () => { + const filterResult = filterFn(FILTER_VALUES.ARCHIVED, { + currentUser: users.admin, + })({ + ...collection, + status: 'pendingApproval', + }) + expect(filterResult).toBeFalsy() + }) + }) +}) + +describe('Priority filter function for archived statuses', () => { + it('should show rejected manuscripts', () => { + const filterResult = filterFn(FILTER_VALUES.ARCHIVED, { + currentUser: users.admin, + })({ + ...collection, + status: 'rejected', + }) + expect(filterResult).toBeTruthy() + }) + + it('should show withdrawn manuscripts', () => { + const filterResult = filterFn(FILTER_VALUES.ARCHIVED, { + currentUser: users.admin, + })({ + ...collection, + status: 'withdrawn', + }) + expect(filterResult).toBeTruthy() + }) + + it('should show accepted manuscripts', () => { + const filterResult = filterFn(FILTER_VALUES.ARCHIVED, { + currentUser: users.admin, + })({ + ...collection, + status: 'accepted', + }) + expect(filterResult).toBeTruthy() + }) + + it('should not show pendingApproval manuscripts', () => { + const filterResult = filterFn(FILTER_VALUES.ARCHIVED, { + currentUser: users.admin, + })({ + ...collection, + status: 'pendingApproval', + }) + expect(filterResult).toBeFalsy() + }) })