diff --git a/packages/components-faraday/src/components/Dashboard/DashboardFilters.js b/packages/components-faraday/src/components/Dashboard/DashboardFilters.js index b291f63ef101053ffec0c25e409115f038616c6e..06063f305074ccf1ead8d370a29b3ea418887d09 100644 --- a/packages/components-faraday/src/components/Dashboard/DashboardFilters.js +++ b/packages/components-faraday/src/components/Dashboard/DashboardFilters.js @@ -31,6 +31,7 @@ const DashboardFilters = ({ inline onChange={changeFilterValue('order')} options={getFilterOptions('order')} + value={getDefaultFilterValue('order')} /> </FilterGroup> </FiltersContainer> diff --git a/packages/components-faraday/src/components/Dashboard/DashboardPage.js b/packages/components-faraday/src/components/Dashboard/DashboardPage.js index fde2ae95683fd1b9897c4d7068427cb2afe728ef..999e87de37369464f4a6b38a3bc45eec0e58a67e 100644 --- a/packages/components-faraday/src/components/Dashboard/DashboardPage.js +++ b/packages/components-faraday/src/components/Dashboard/DashboardPage.js @@ -13,7 +13,7 @@ import { Dashboard } from './' import { getHandlingEditors } from '../../redux/editors' import { getUserPermissions } from '../../../../component-faraday-selectors/src' -import { priorityFilter, withFiltersHOC } from '../Filters' +import { priorityFilter, importanceSort, withFiltersHOC } from '../Filters' export default compose( ConnectPage(() => [actions.getCollections(), actions.getUsers()]), @@ -64,13 +64,7 @@ export default compose( withJournal, withFiltersHOC({ priority: priorityFilter, - order: { - options: [ - { label: 'Newest first', value: 'newest' }, - { label: 'Oldest first', value: 'oldest' }, - ], - filterFn: () => () => true, - }, + order: importanceSort, }), withContext( { diff --git a/packages/components-faraday/src/components/Filters/importanceSort.js b/packages/components-faraday/src/components/Filters/importanceSort.js new file mode 100644 index 0000000000000000000000000000000000000000..b86f37c80951a9a4ebbf89bb26ea03d78acb37ca --- /dev/null +++ b/packages/components-faraday/src/components/Filters/importanceSort.js @@ -0,0 +1,31 @@ +import { get } from 'lodash' + +import { utils } from './' +import cfg from '../../../../xpub-faraday/config/default' + +const statuses = get(cfg, 'statuses') +export const SORT_VALUES = { + MORE_IMPORTANT: 'more_important', + LESS_IMPORTANT: 'less_important', +} + +const options = [ + { label: 'Imporant first', value: SORT_VALUES.MORE_IMPORTANT }, + { label: 'Less important first', value: SORT_VALUES.LESS_IMPORTANT }, +] + +const sortFn = sortValue => (item1, item2) => { + const item1Importance = utils.getCollectionImportance(statuses, item1) + const item2Importance = utils.getCollectionImportance(statuses, item2) + + if (sortValue === SORT_VALUES.MORE_IMPORTANT) { + return item2Importance - item1Importance + } + return item1Importance - item2Importance +} + +export default { + sortFn, + options, + type: 'sort', +} diff --git a/packages/components-faraday/src/components/Filters/index.js b/packages/components-faraday/src/components/Filters/index.js index 478766405caaa6e6fe6dfa5d7bda8b9ece630bd3..cec651407a1906360e0be3b88876740fde6ba1aa 100644 --- a/packages/components-faraday/src/components/Filters/index.js +++ b/packages/components-faraday/src/components/Filters/index.js @@ -3,3 +3,4 @@ import * as utils from './utils' export { utils } export { default as withFiltersHOC } from './withFilters' export { default as priorityFilter } from './priorityFilter' +export { default as importanceSort } from './importanceSort' diff --git a/packages/components-faraday/src/components/Filters/priorityFilter.js b/packages/components-faraday/src/components/Filters/priorityFilter.js index 6821e81a2bc54cad473714f481628c53d07b80d5..4222f85fd52fb9caa18b561bdfb8b9960c7b28da 100644 --- a/packages/components-faraday/src/components/Filters/priorityFilter.js +++ b/packages/components-faraday/src/components/Filters/priorityFilter.js @@ -5,10 +5,16 @@ import cfg from '../../../../xpub-faraday/config/default' const statuses = get(cfg, 'statuses') +export const FILTER_VALUES = { + ALL: 'all', + NEEDS_ATTENTION: 'needsAttention', + IN_PROGRESS: 'inProgress', +} + const options = [ - { label: 'All', value: 'all' }, - { label: 'Needs Attention', value: 'needsAttention' }, - { label: 'In Progress', value: 'inProgress' }, + { label: 'All', value: FILTER_VALUES.ALL }, + { label: 'Needs Attention', value: FILTER_VALUES.NEEDS_ATTENTION }, + { label: 'In Progress', value: FILTER_VALUES.IN_PROGRESS }, ] const filterFn = (filterValue, { currentUser, userPermissions = [] }) => ({ @@ -21,9 +27,9 @@ const filterFn = (filterValue, { currentUser, userPermissions = [] }) => ({ ) const userRole = utils.getUserRole(currentUser, get(permission, 'role')) switch (filterValue) { - case 'needsAttention': + case FILTER_VALUES.NEEDS_ATTENTION: return get(statuses, `${status}.${userRole}.needsAttention`) - case 'inProgress': + case FILTER_VALUES.IN_PROGRESS: return !get(statuses, `${status}.${userRole}.needsAttention`) default: return true @@ -33,4 +39,5 @@ const filterFn = (filterValue, { currentUser, userPermissions = [] }) => ({ export default { options, filterFn, + type: 'filter', } diff --git a/packages/components-faraday/src/components/Filters/priorityFilter.test.js b/packages/components-faraday/src/components/Filters/priorityFilter.test.js index 398869d18547bb27ea854d50bc9cca8e2d6a772c..ce0d9b6b0afc43dccb4174f5a7efc12717ef5046 100644 --- a/packages/components-faraday/src/components/Filters/priorityFilter.test.js +++ b/packages/components-faraday/src/components/Filters/priorityFilter.test.js @@ -1,5 +1,6 @@ import fixturesService from 'pubsweet-component-fixture-service' +import { FILTER_VALUES } from './priorityFilter' import { priorityFilter, utils } from './' const { @@ -8,12 +9,6 @@ const { const { filterFn } = priorityFilter -const FILTER_VALUES = { - ALL: 'all', - NEEDS_ATTENTION: 'needsAttention', - IN_PROGRESS: 'inProgress', -} - describe('Priority filter function for reviewersInvited status', () => { describe('ALL', () => { it('should return true if ALL is selected', () => { diff --git a/packages/components-faraday/src/components/Filters/utils.js b/packages/components-faraday/src/components/Filters/utils.js index adb36cf50379a376dbe93832572ce33c93ebac2e..8dabf8b2f1c77b530bf761937f6a1b8fb96329a8 100644 --- a/packages/components-faraday/src/components/Filters/utils.js +++ b/packages/components-faraday/src/components/Filters/utils.js @@ -1,3 +1,5 @@ +import { get } from 'lodash' + export const hydrateFilters = defaultValues => { const filterValues = localStorage.getItem('filterValues') if (filterValues) return JSON.parse(filterValues) @@ -5,10 +7,22 @@ export const hydrateFilters = defaultValues => { } export const makeFilterFunctions = config => - Object.entries(config).map(([filterKey, { filterFn }]) => ({ - key: filterKey, - fn: filterFn, - })) + Object.entries(config) + .filter(([filterKey, { type }]) => type === 'filter') + .map(([filterKey, { filterFn }]) => ({ + key: filterKey, + fn: filterFn, + })) + +export const makeSortFunction = config => { + const [sortKey, { sortFn }] = Object.entries(config).find( + ([filterKey, { type }]) => type !== 'filter', + ) + return { + sortKey, + sortFn, + } +} export const makeFilterValues = config => Object.keys(config).reduce((acc, el) => ({ ...acc, [el]: '' }), {}) @@ -23,3 +37,6 @@ export const parsePermission = permission => ({ objectId: permission.object.id, role: permission.group, }) + +export const getCollectionImportance = (statuses, item) => + get(statuses, `${get(item, 'status') || 'draft'}.importance`) diff --git a/packages/components-faraday/src/components/Filters/withFilters.js b/packages/components-faraday/src/components/Filters/withFilters.js index baee35d21808b20561b0dd8edd3238deaab9fe40..22c8ce546d6f8875b1e480316f5569a48cc470cc 100644 --- a/packages/components-faraday/src/components/Filters/withFilters.js +++ b/packages/components-faraday/src/components/Filters/withFilters.js @@ -6,6 +6,7 @@ import { utils } from './' export default config => Component => { const filterFns = utils.makeFilterFunctions(config) const filterValues = utils.makeFilterValues(config) + const { sortKey, sortFn } = utils.makeSortFunction(config) return compose( withState( @@ -37,10 +38,12 @@ export default config => Component => { ) }, filterItems: ({ filterValues, ...props }) => items => - filterFns.reduce( - (acc, { key, fn }) => acc.filter(fn(filterValues[key], props)), - items, - ), + filterFns + .reduce( + (acc, { key, fn }) => acc.filter(fn(filterValues[key], props)), + items, + ) + .sort(sortFn(filterValues[sortKey], props)), }), )(Component) }