From 9df4e3529aee3343eba37ef5bfc004315ef28a59 Mon Sep 17 00:00:00 2001 From: Michal Klobukowski Date: Thu, 5 Jul 2018 11:47:23 +0200 Subject: [PATCH] Implement sorting by name and createdAt fields Feature #13703 Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski --- .../project-panel/project-panel-middleware.ts | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/src/views/project-panel/project-panel-middleware.ts b/src/views/project-panel/project-panel-middleware.ts index 0ea5f1e5..5230c756 100644 --- a/src/views/project-panel/project-panel-middleware.ts +++ b/src/views/project-panel/project-panel-middleware.ts @@ -12,6 +12,9 @@ import { resourceToDataItem, ProjectPanelItem } from "./project-panel-item"; import FilterBuilder from "../../common/api/filter-builder"; import { DataColumns } from "../../components/data-table/data-table"; import { ProcessResource } from "../../models/process"; +import { CollectionResource } from "../../models/collection"; +import OrderBuilder from "../../common/api/order-builder"; +import { GroupContentsResource } from "../../services/groups-service/groups-service"; export const projectPanelMiddleware: Middleware = store => next => { next(actions.SET_COLUMNS({ id: PROJECT_PANEL_ID, columns })); @@ -37,24 +40,36 @@ export const projectPanelMiddleware: Middleware = store => next => { store.dispatch(actions.RESET_PAGINATION({ id: PROJECT_PANEL_ID })); store.dispatch(actions.REQUEST_ITEMS({ id: PROJECT_PANEL_ID })); }), + TOGGLE_SORT: handleProjectPanelAction(() => { + store.dispatch(actions.RESET_PAGINATION({ id: PROJECT_PANEL_ID })); + store.dispatch(actions.REQUEST_ITEMS({ id: PROJECT_PANEL_ID })); + }), REQUEST_ITEMS: handleProjectPanelAction(() => { const state = store.getState() as RootState; const dataExplorer = getDataExplorer(state.dataExplorer, PROJECT_PANEL_ID); const columns = dataExplorer.columns as DataColumns; const typeFilters = getColumnFilters(columns, "Type"); const statusFilters = getColumnFilters(columns, "Status"); + const sortColumn = dataExplorer.columns.find(({ sortDirection }) => Boolean(sortDirection && sortDirection !== "none")); + const sortDirection = sortColumn && sortColumn.sortDirection === "asc" ? "asc" : "desc"; if (typeFilters.length > 0) { groupsService .contents(state.projects.currentItemId, { limit: dataExplorer.rowsPerPage, offset: dataExplorer.page * dataExplorer.rowsPerPage, + order: sortColumn + ? sortColumn.name === "Name" + ? getOrder("name", sortDirection) + : getOrder("createdAt", sortDirection) + : OrderBuilder.create(), filters: FilterBuilder .create() - .addIsA("uuid", typeFilters.map(f => f.type)) + .concat(FilterBuilder + .create("collections") + .addIsA("uuid", typeFilters.map(f => f.type))) .concat(FilterBuilder .create("containerRequests") - .addIn("state", statusFilters.map(f => f.type)) - ) + .addIn("state", statusFilters.map(f => f.type))) }) .then(response => { store.dispatch(actions.SET_ITEMS({ @@ -85,3 +100,14 @@ const getColumnFilters = (columns: DataColumns f.selected) : []; }; +const getOrder = (attribute: "name" | "createdAt", direction: "asc" | "desc") => + [ + OrderBuilder.create("collections"), + OrderBuilder.create("container_requests"), + OrderBuilder.create("groups") + ].reduce((acc, b) => acc.concat(direction === "asc" + ? b.addAsc(attribute) + : b.addDesc(attribute)), + OrderBuilder.create()); + + -- 2.30.2