Merge branch '21128-toolbar-context-menu'
[arvados-workbench2.git] / src / store / data-explorer / data-explorer-reducer.ts
index 68f80b3cfcff16f13269cf267c49dbb530ec1bef..a0a7eb6400b1160f0702d2e4243b94912c85bfa1 100644 (file)
@@ -21,7 +21,7 @@ import { DataTableFilters } from 'components/data-table-filters/data-table-filte
 
 export interface DataExplorer {
     fetchMode: DataTableFetchMode;
-    columns: DataColumns<any>;
+    columns: DataColumns<any, any>;
     items: any[];
     itemsAvailable: number;
     page: number;
@@ -70,14 +70,24 @@ export const dataExplorerReducer = (
         SET_FILTERS: ({ id, columnName, filters }) =>
             update(state, id, mapColumns(setFilters(columnName, filters))),
 
-        SET_ITEMS: ({ id, items, itemsAvailable, page, rowsPerPage }) =>
-            update(state, id, (explorer) => ({
-                ...explorer,
-                items,
-                itemsAvailable,
-                page: page || 0,
-                rowsPerPage,
-            })),
+        SET_ITEMS: ({ id, items, itemsAvailable, page, rowsPerPage }) => (
+            update(state, id, (explorer) => {
+                // Reject updates to pages other than current,
+                //  DataExplorer middleware should retry
+                const updatedPage = page || 0;
+                if (explorer.page === updatedPage) {
+                    return {
+                        ...explorer,
+                        items,
+                        itemsAvailable,
+                        page: updatedPage,
+                        rowsPerPage,
+                    }
+                } else {
+                    return explorer;
+                }
+            })
+        ),
 
         APPEND_ITEMS: ({ id, items, itemsAvailable, page, rowsPerPage }) =>
             update(state, id, (explorer) => ({
@@ -117,9 +127,9 @@ export const getDataExplorer = (state: DataExplorerState, id: string) => {
     return returnValue;
 };
 
-export const getSortColumn = (dataExplorer: DataExplorer) =>
+export const getSortColumn = <R>(dataExplorer: DataExplorer): DataColumn<any, R> | undefined =>
     dataExplorer.columns.find(
-        (c: any) => !!c.sortDirection && c.sortDirection !== SortDirection.NONE
+        (c: DataColumn<any, R>) => !!c.sort && c.sort.direction !== SortDirection.NONE
     );
 
 const update = (
@@ -129,8 +139,8 @@ const update = (
 ) => ({ ...state, [id]: updateFn(getDataExplorer(state, id)) });
 
 const canUpdateColumns = (
-    prevColumns: DataColumns<any>,
-    nextColumns: DataColumns<any>
+    prevColumns: DataColumns<any, any>,
+    nextColumns: DataColumns<any, any>
 ) => {
     if (prevColumns.length !== nextColumns.length) {
         return true;
@@ -146,7 +156,7 @@ const canUpdateColumns = (
 };
 
 const setColumns =
-    (columns: DataColumns<any>) => (dataExplorer: DataExplorer) => ({
+    (columns: DataColumns<any, any>) => (dataExplorer: DataExplorer) => ({
         ...dataExplorer,
         columns: canUpdateColumns(dataExplorer.columns, columns)
             ? columns
@@ -154,23 +164,23 @@ const setColumns =
     });
 
 const mapColumns =
-    (mapFn: (column: DataColumn<any>) => DataColumn<any>) =>
+    (mapFn: (column: DataColumn<any, any>) => DataColumn<any, any>) =>
         (dataExplorer: DataExplorer) => ({
             ...dataExplorer,
             columns: dataExplorer.columns.map(mapFn),
         });
 
-const toggleSort = (columnName: string) => (column: DataColumn<any>) =>
+const toggleSort = (columnName: string) => (column: DataColumn<any, any>) =>
     column.name === columnName
         ? toggleSortDirection(column)
         : resetSortDirection(column);
 
-const toggleColumn = (columnName: string) => (column: DataColumn<any>) =>
+const toggleColumn = (columnName: string) => (column: DataColumn<any, any>) =>
     column.name === columnName
         ? { ...column, selected: !column.selected }
         : column;
 
 const setFilters =
     (columnName: string, filters: DataTableFilters) =>
-        (column: DataColumn<any>) =>
+        (column: DataColumn<any, any>) =>
             column.name === columnName ? { ...column, filters } : column;