X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/0534b585de71147120e880fe670ebd0e61dcf68f..HEAD:/src/store/data-explorer/data-explorer-middleware-service.ts diff --git a/src/store/data-explorer/data-explorer-middleware-service.ts b/src/store/data-explorer/data-explorer-middleware-service.ts index 0b8d6deb..6bb95a9a 100644 --- a/src/store/data-explorer/data-explorer-middleware-service.ts +++ b/src/store/data-explorer/data-explorer-middleware-service.ts @@ -5,54 +5,76 @@ import { Dispatch, MiddlewareAPI } from 'redux'; import { RootState } from '../store'; import { DataColumns } from 'components/data-table/data-table'; -import { DataExplorer } from './data-explorer-reducer'; +import { DataExplorer, getSortColumn } from './data-explorer-reducer'; import { ListResults } from 'services/common-service/common-service'; import { createTree } from 'models/tree'; import { DataTableFilters } from 'components/data-table-filters/data-table-filters-tree'; +import { OrderBuilder, OrderDirection } from 'services/api/order-builder'; +import { SortDirection } from 'components/data-table/data-column'; +import { Resource } from 'models/resource'; export abstract class DataExplorerMiddlewareService { - protected readonly id: string; + protected readonly id: string; - protected constructor(id: string) { - this.id = id; - } + protected constructor(id: string) { + this.id = id; + } - public getId() { - return this.id; - } + public getId() { + return this.id; + } - public getColumnFilters( - columns: DataColumns, - columnName: string - ): DataTableFilters { - return getDataExplorerColumnFilters(columns, columnName); - } - - abstract requestItems( - api: MiddlewareAPI, - criteriaChanged?: boolean - ): Promise; + public getColumnFilters( + columns: DataColumns, + columnName: string + ): DataTableFilters { + return getDataExplorerColumnFilters(columns, columnName); + } + + abstract requestItems( + api: MiddlewareAPI, + criteriaChanged?: boolean, + background?: boolean + ): Promise; } export const getDataExplorerColumnFilters = ( - columns: DataColumns, - columnName: string + columns: DataColumns, + columnName: string ): DataTableFilters => { - const column = columns.find((c) => c.name === columnName); - return column ? column.filters : createTree(); + const column = columns.find((c) => c.name === columnName); + return column ? column.filters : createTree(); }; export const dataExplorerToListParams = (dataExplorer: DataExplorer) => ({ - limit: dataExplorer.rowsPerPage, - offset: dataExplorer.page * dataExplorer.rowsPerPage, + limit: dataExplorer.rowsPerPage, + offset: dataExplorer.page * dataExplorer.rowsPerPage, }); +export const getOrder = (dataExplorer: DataExplorer) => { + const sortColumn = getSortColumn(dataExplorer); + const order = new OrderBuilder(); + if (sortColumn && sortColumn.sort) { + const sortDirection = sortColumn.sort.direction === SortDirection.ASC + ? OrderDirection.ASC + : OrderDirection.DESC; + + // Use createdAt as a secondary sort column so we break ties consistently. + return order + .addOrder(sortDirection, sortColumn.sort.field) + .addOrder(OrderDirection.DESC, "createdAt") + .getOrder(); + } else { + return order.getOrder(); + } +}; + export const listResultsToDataExplorerItemsMeta = ({ - itemsAvailable, - offset, - limit, + itemsAvailable, + offset, + limit, }: ListResults) => ({ - itemsAvailable, - page: Math.floor(offset / limit), - rowsPerPage: limit, + itemsAvailable, + page: Math.floor(offset / limit), + rowsPerPage: limit, });