export interface DataExplorer {
fetchMode: DataTableFetchMode;
- columns: DataColumns<any>;
+ columns: DataColumns<any, any>;
items: any[];
itemsAvailable: number;
page: number;
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) => ({
SET_EXPLORER_SEARCH_VALUE: ({ id, searchValue }) =>
update(state, id, (explorer) => ({ ...explorer, searchValue })),
+ RESET_EXPLORER_SEARCH_VALUE: ({ id }) =>
+ update(state, id, (explorer) => ({ ...explorer, searchValue: '' })),
+
SET_REQUEST_STATE: ({ id, requestState }) =>
update(state, id, (explorer) => ({ ...explorer, requestState })),
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 = (
) => ({ ...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;
};
const setColumns =
- (columns: DataColumns<any>) => (dataExplorer: DataExplorer) => ({
+ (columns: DataColumns<any, any>) => (dataExplorer: DataExplorer) => ({
...dataExplorer,
columns: canUpdateColumns(dataExplorer.columns, columns)
? columns
});
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;