Merge branch '19988-data-explorer-sorting' into main. Closes #19988
[arvados-workbench2.git] / src / store / data-explorer / data-explorer-middleware-service.ts
index f5f24495d5455cb6f7f4f5a0fe6122d6c5a5313b..01964fa48a9f260442205ab14e33a9f5dc9b09f2 100644 (file)
@@ -5,10 +5,13 @@
 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;
@@ -22,7 +25,7 @@ export abstract class DataExplorerMiddlewareService {
     }
 
     public getColumnFilters<T>(
-        columns: DataColumns<T>,
+        columns: DataColumns<T, any>,
         columnName: string
     ): DataTableFilters {
         return getDataExplorerColumnFilters(columns, columnName);
@@ -35,7 +38,7 @@ export abstract class DataExplorerMiddlewareService {
 }
 
 export const getDataExplorerColumnFilters = <T>(
-    columns: DataColumns<T>,
+    columns: DataColumns<T, any>,
     columnName: string
 ): DataTableFilters => {
     const column = columns.find((c) => c.name === columnName);
@@ -47,6 +50,22 @@ export const dataExplorerToListParams = (dataExplorer: DataExplorer) => ({
     offset: dataExplorer.page * dataExplorer.rowsPerPage,
 });
 
+export const getOrder = <T extends Resource = Resource>(dataExplorer: DataExplorer) => {
+    const sortColumn = getSortColumn<T>(dataExplorer);
+    const order = new OrderBuilder<T>();
+    if (sortColumn && sortColumn.sort) {
+        const sortDirection = sortColumn.sort.direction === SortDirection.ASC
+            ? OrderDirection.ASC
+            : OrderDirection.DESC;
+
+        return order
+            .addOrder(sortDirection, sortColumn.sort.field)
+            .getOrder();
+    } else {
+        return order.getOrder();
+    }
+};
+
 export const listResultsToDataExplorerItemsMeta = <R>({
     itemsAvailable,
     offset,