@databiosphere/findable-ui 18.0.0 → 19.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.release-please-manifest.json +1 -1
- package/CHANGELOG.md +11 -0
- package/lib/components/Detail/components/Table/components/TableRows/components/CollapsableRows/collapsableRows.js +2 -0
- package/lib/components/Detail/components/Table/components/TableRows/tableRows.js +1 -15
- package/lib/components/Export/components/ExportForm/components/ExportFileSummaryForm/exportFileSummaryForm.js +9 -10
- package/lib/components/Links/components/Link/components/ExploreViewLink/exploreViewLink.js +23 -12
- package/lib/components/Table/common/columnDef.js +1 -0
- package/lib/components/Table/common/gridTable.styles.js +5 -11
- package/lib/components/Table/common/utils.d.ts +3 -29
- package/lib/components/Table/common/utils.js +25 -60
- package/lib/components/Table/components/TableBody/hooks/virtualizer/constants.d.ts +3 -0
- package/lib/components/Table/components/TableBody/hooks/virtualizer/constants.js +3 -0
- package/lib/components/Table/components/TableBody/hooks/virtualizer/hook.d.ts +8 -0
- package/lib/components/Table/components/TableBody/hooks/virtualizer/hook.js +18 -0
- package/lib/components/Table/components/TableBody/hooks/virtualizer/types.d.ts +4 -0
- package/lib/components/Table/components/TableBody/tableBody.d.ts +3 -2
- package/lib/components/Table/components/TableBody/tableBody.js +7 -28
- package/lib/components/Table/components/TableBody/utils.d.ts +12 -0
- package/lib/components/Table/components/TableBody/utils.js +17 -0
- package/lib/components/Table/components/TableCell/components/CollapsableCell/collapsableCell.d.ts +3 -1
- package/lib/components/Table/components/TableCell/components/CollapsableCell/collapsableCell.js +6 -14
- package/lib/components/Table/components/TableFeatures/ColumnGrouping/utils.d.ts +28 -0
- package/lib/components/Table/components/TableFeatures/ColumnGrouping/utils.js +52 -0
- package/lib/components/Table/components/TableFeatures/ColumnVisibility/utils.d.ts +21 -0
- package/lib/components/Table/components/TableFeatures/ColumnVisibility/utils.js +37 -0
- package/lib/components/Table/components/TableFeatures/RowSorting/utils.d.ts +29 -0
- package/lib/components/Table/components/TableFeatures/RowSorting/utils.js +68 -0
- package/lib/components/Table/components/TableHead/tableHead.d.ts +2 -6
- package/lib/components/Table/components/TableHead/tableHead.js +6 -4
- package/lib/components/Table/components/TableHead/types.d.ts +6 -0
- package/lib/components/Table/components/TableHead/types.js +1 -0
- package/lib/components/Table/components/TableHead/utils.d.ts +19 -0
- package/lib/components/Table/components/TableHead/utils.js +34 -0
- package/lib/components/Table/components/TableRow/tableRow.styles.d.ts +1 -0
- package/lib/components/Table/components/TableRow/tableRow.styles.js +14 -2
- package/lib/components/Table/components/TableRows/components/CollapsableRows/collapsableRows.d.ts +3 -2
- package/lib/components/Table/components/TableRows/components/CollapsableRows/collapsableRows.js +8 -4
- package/lib/components/Table/components/TableRows/components/CollapsableRows/hook.d.ts +9 -0
- package/lib/components/Table/components/TableRows/components/CollapsableRows/hook.js +17 -0
- package/lib/components/Table/components/TableRows/tableRows.d.ts +3 -3
- package/lib/components/Table/components/TableRows/tableRows.js +9 -5
- package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/columnGrouping.d.ts +3 -0
- package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/columnGrouping.js +26 -0
- package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/columnGrouping.styles.d.ts +2 -0
- package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/columnGrouping.styles.js +16 -0
- package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/components/MenuItems/menuItems.d.ts +3 -0
- package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/components/MenuItems/menuItems.js +12 -0
- package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/components/MenuItems/types.d.ts +7 -0
- package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/components/MenuItems/types.js +1 -0
- package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/constants.d.ts +4 -0
- package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/constants.js +13 -0
- package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/types.d.ts +4 -0
- package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/types.js +1 -0
- package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/utils.d.ts +17 -0
- package/lib/components/Table/components/TableToolbar/components/ColumnGrouping/utils.js +36 -0
- package/lib/components/Table/components/TableToolbar/components/RowSelection/components/DropdownMenu/dropdownMenu.d.ts +2 -3
- package/lib/components/Table/components/TableToolbar/components/RowSelection/components/DropdownMenu/dropdownMenu.js +3 -11
- package/lib/components/Table/components/TableToolbar/tableToolbar.js +4 -2
- package/lib/components/Table/features/RowPosition/constants.js +2 -2
- package/lib/components/Table/features/RowPosition/utils.d.ts +2 -2
- package/lib/components/Table/features/RowPosition/utils.js +12 -5
- package/lib/components/Table/options/updater.d.ts +10 -0
- package/lib/components/Table/options/updater.js +24 -0
- package/lib/components/Table/table.js +22 -17
- package/lib/components/TableCreator/common/constants.d.ts +2 -2
- package/lib/components/TableCreator/common/constants.js +2 -1
- package/lib/components/TableCreator/common/utils.d.ts +5 -2
- package/lib/components/TableCreator/common/utils.js +11 -4
- package/lib/components/TableCreator/options/expanded/constants.d.ts +2 -0
- package/lib/components/TableCreator/options/expanded/constants.js +6 -0
- package/lib/components/TableCreator/options/expanded/hook.d.ts +2 -0
- package/lib/components/TableCreator/options/expanded/hook.js +4 -0
- package/lib/components/TableCreator/options/grouping/constants.d.ts +2 -0
- package/lib/components/TableCreator/options/grouping/constants.js +5 -0
- package/lib/components/TableCreator/options/grouping/hook.d.ts +2 -0
- package/lib/components/TableCreator/options/grouping/hook.js +9 -0
- package/lib/components/TableCreator/options/hook.d.ts +2 -0
- package/lib/components/TableCreator/options/hook.js +25 -0
- package/lib/components/TableCreator/options/rowSelection/constants.d.ts +2 -0
- package/lib/components/TableCreator/options/rowSelection/constants.js +5 -0
- package/lib/components/TableCreator/options/rowSelection/hook.d.ts +2 -0
- package/lib/components/TableCreator/options/rowSelection/hook.js +4 -0
- package/lib/components/TableCreator/options/sorting/constants.d.ts +2 -0
- package/lib/components/TableCreator/options/sorting/constants.js +5 -0
- package/lib/components/TableCreator/options/sorting/hook.d.ts +2 -0
- package/lib/components/TableCreator/options/sorting/hook.js +4 -0
- package/lib/components/TableCreator/tableCreator.d.ts +3 -5
- package/lib/components/TableCreator/tableCreator.js +4 -2
- package/lib/components/common/DropdownMenu/dropdownMenu.d.ts +2 -3
- package/lib/components/common/DropdownMenu/dropdownMenu.js +7 -7
- package/lib/components/common/DropdownMenu/dropdownMenu.styles.d.ts +1 -1
- package/lib/components/common/DropdownMenu/dropdownMenu.styles.js +1 -1
- package/lib/components/common/Menu/hooks/useMenu.d.ts +5 -6
- package/lib/config/entities.d.ts +6 -6
- package/lib/config/utils.d.ts +0 -7
- package/lib/config/utils.js +0 -12
- package/lib/providers/exploreState/actions/updateGrouping/action.d.ts +10 -0
- package/lib/providers/exploreState/actions/updateGrouping/action.js +16 -0
- package/lib/providers/exploreState/actions/updateGrouping/dispatch.d.ts +7 -0
- package/lib/providers/exploreState/actions/updateGrouping/dispatch.js +12 -0
- package/lib/providers/exploreState/actions/updateGrouping/types.d.ts +9 -0
- package/lib/providers/exploreState/actions/updateGrouping/types.js +1 -0
- package/lib/providers/exploreState/actions/updateGrouping/utils.d.ts +10 -0
- package/lib/providers/exploreState/actions/updateGrouping/utils.js +26 -0
- package/lib/providers/exploreState/entities.d.ts +3 -4
- package/lib/providers/exploreState/initializer/utils.js +41 -8
- package/lib/providers/exploreState/payloads/entities.d.ts +2 -1
- package/lib/providers/exploreState/utils.d.ts +6 -4
- package/lib/providers/exploreState/utils.js +7 -4
- package/lib/providers/exploreState.d.ts +3 -1
- package/lib/providers/exploreState.js +15 -5
- package/lib/views/ExploreView/exploreView.js +2 -2
- package/package.json +1 -1
- package/src/components/Detail/components/Table/components/TableRows/components/CollapsableRows/collapsableRows.tsx +2 -0
- package/src/components/Detail/components/Table/components/TableRows/tableRows.tsx +3 -18
- package/src/components/Export/components/ExportForm/components/ExportFileSummaryForm/exportFileSummaryForm.tsx +28 -32
- package/src/components/Links/components/Link/components/ExploreViewLink/exploreViewLink.tsx +27 -13
- package/src/components/Table/common/columnDef.ts +1 -0
- package/src/components/Table/common/gridTable.styles.ts +5 -11
- package/src/components/Table/common/utils.ts +44 -107
- package/src/components/Table/components/TableBody/hooks/virtualizer/constants.ts +3 -0
- package/src/components/Table/components/TableBody/hooks/virtualizer/hook.ts +23 -0
- package/src/components/Table/components/TableBody/hooks/virtualizer/types.ts +5 -0
- package/src/components/Table/components/TableBody/tableBody.tsx +14 -30
- package/src/components/Table/components/TableBody/utils.ts +21 -0
- package/src/components/Table/components/TableCell/components/CollapsableCell/collapsableCell.tsx +14 -15
- package/src/components/Table/components/TableFeatures/ColumnGrouping/utils.ts +70 -0
- package/src/components/Table/components/TableFeatures/ColumnVisibility/utils.ts +52 -0
- package/src/components/Table/components/TableFeatures/RowSorting/utils.ts +87 -0
- package/src/components/Table/components/TableHead/tableHead.tsx +21 -29
- package/src/components/Table/components/TableHead/types.ts +7 -0
- package/src/components/Table/components/TableHead/utils.ts +42 -0
- package/src/components/Table/components/TableRow/tableRow.styles.ts +19 -2
- package/src/components/Table/components/TableRows/components/CollapsableRows/collapsableRows.tsx +8 -2
- package/src/components/Table/components/TableRows/components/CollapsableRows/hook.ts +20 -0
- package/src/components/Table/components/TableRows/tableRows.tsx +18 -15
- package/src/components/Table/components/TableToolbar/components/ColumnGrouping/columnGrouping.styles.ts +17 -0
- package/src/components/Table/components/TableToolbar/components/ColumnGrouping/columnGrouping.tsx +54 -0
- package/src/components/Table/components/TableToolbar/components/ColumnGrouping/components/MenuItems/menuItems.tsx +28 -0
- package/src/components/Table/components/TableToolbar/components/ColumnGrouping/components/MenuItems/types.ts +8 -0
- package/src/components/Table/components/TableToolbar/components/ColumnGrouping/constants.ts +17 -0
- package/src/components/Table/components/TableToolbar/components/ColumnGrouping/types.ts +5 -0
- package/src/components/Table/components/TableToolbar/components/ColumnGrouping/utils.ts +45 -0
- package/src/components/Table/components/TableToolbar/components/RowSelection/components/DropdownMenu/dropdownMenu.tsx +7 -20
- package/src/components/Table/components/TableToolbar/tableToolbar.tsx +8 -2
- package/src/components/Table/features/RowPosition/constants.ts +2 -2
- package/src/components/Table/features/RowPosition/utils.ts +10 -5
- package/src/components/Table/options/updater.ts +29 -0
- package/src/components/Table/table.tsx +43 -25
- package/src/components/TableCreator/common/constants.ts +4 -6
- package/src/components/TableCreator/common/utils.ts +14 -7
- package/src/components/TableCreator/options/expanded/constants.ts +14 -0
- package/src/components/TableCreator/options/expanded/hook.ts +6 -0
- package/src/components/TableCreator/options/grouping/constants.ts +6 -0
- package/src/components/TableCreator/options/grouping/hook.ts +17 -0
- package/src/components/TableCreator/options/hook.ts +31 -0
- package/src/components/TableCreator/options/rowSelection/constants.ts +10 -0
- package/src/components/TableCreator/options/rowSelection/hook.ts +8 -0
- package/src/components/TableCreator/options/sorting/constants.ts +10 -0
- package/src/components/TableCreator/options/sorting/hook.ts +6 -0
- package/src/components/TableCreator/tableCreator.tsx +4 -11
- package/src/components/common/DropdownMenu/dropdownMenu.styles.ts +1 -1
- package/src/components/common/DropdownMenu/dropdownMenu.tsx +19 -17
- package/src/components/common/Menu/hooks/useMenu.ts +8 -9
- package/src/config/entities.ts +10 -9
- package/src/config/utils.ts +0 -14
- package/src/providers/exploreState/actions/updateGrouping/action.ts +26 -0
- package/src/providers/exploreState/actions/updateGrouping/dispatch.ts +16 -0
- package/src/providers/exploreState/actions/updateGrouping/types.ts +11 -0
- package/src/providers/exploreState/actions/updateGrouping/utils.ts +33 -0
- package/src/providers/exploreState/entities.ts +3 -3
- package/src/providers/exploreState/initializer/utils.ts +58 -10
- package/src/providers/exploreState/payloads/entities.ts +2 -0
- package/src/providers/exploreState/utils.ts +10 -7
- package/src/providers/exploreState.tsx +29 -6
- package/src/views/ExploreView/exploreView.tsx +1 -3
- package/types/data-explorer-ui.d.ts +8 -1
- package/lib/components/TableCreator/common/entities.d.ts +0 -5
- package/src/components/TableCreator/common/entities.ts +0 -6
- /package/lib/components/{TableCreator/common/entities.js → Table/components/TableBody/hooks/virtualizer/types.js} +0 -0
|
@@ -23,9 +23,9 @@ export const ROW_POSITION: TableFeature = {
|
|
|
23
23
|
};
|
|
24
24
|
},
|
|
25
25
|
createTable: <T extends RowData>(table: Table<T>): void => {
|
|
26
|
-
const originalGetRowModel = table.getRowModel.bind(table);
|
|
27
26
|
table.getRowModel = (): RowModel<T> => {
|
|
28
|
-
|
|
27
|
+
const rowModel = table.getPaginationRowModel();
|
|
28
|
+
return getRowModel(table, rowModel);
|
|
29
29
|
};
|
|
30
30
|
},
|
|
31
31
|
getInitialState: (initialState?: InitialTableState): Partial<TableState> => {
|
|
@@ -11,17 +11,21 @@ import { DEFAULT_PAGINATION } from "../constants";
|
|
|
11
11
|
/**
|
|
12
12
|
* Returns row model, with getter for row position.
|
|
13
13
|
* @param table - Table.
|
|
14
|
-
* @param
|
|
14
|
+
* @param rowModel - Row model.
|
|
15
15
|
* @returns row model.
|
|
16
16
|
*/
|
|
17
17
|
export function getRowModel<T extends RowData>(
|
|
18
18
|
table: Table<T>,
|
|
19
|
-
|
|
19
|
+
rowModel: RowModel<T>
|
|
20
20
|
): RowModel<T> {
|
|
21
|
-
|
|
22
|
-
rowModel.
|
|
21
|
+
let i = 0;
|
|
22
|
+
rowModel.flatRows.forEach(({ getIsGrouped, id }) => {
|
|
23
|
+
const isGroupedRow = getIsGrouped();
|
|
24
|
+
const index = isGroupedRow ? -1 : i; // Capture the current value of i for this iteration.
|
|
23
25
|
rowModel.rowsById[id].getRowPosition = (): number =>
|
|
24
|
-
calculateRowPosition(table,
|
|
26
|
+
calculateRowPosition(table, index);
|
|
27
|
+
if (isGroupedRow) return; // Iterate only for non-grouped rows.
|
|
28
|
+
i++;
|
|
25
29
|
});
|
|
26
30
|
return rowModel;
|
|
27
31
|
}
|
|
@@ -51,6 +55,7 @@ function calculateRowPosition<T extends RowData>(
|
|
|
51
55
|
table: Table<T>,
|
|
52
56
|
index: number
|
|
53
57
|
): number {
|
|
58
|
+
if (index < 0) return index; // Grouped rows have a position of -1.
|
|
54
59
|
const { getState } = table;
|
|
55
60
|
const {
|
|
56
61
|
pagination: { pageIndex, pageSize },
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Updater } from "@tanstack/react-table";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Type guard to check if the given value is TanStack's updater function.
|
|
5
|
+
* TanStack updater can either be a function that computes the new value based on the old value,
|
|
6
|
+
* or a direct value. This type guard identifies whether the provided updater is a function.
|
|
7
|
+
* @param updaterOrValue - The value to check.
|
|
8
|
+
* @returns True if the value is a function, false otherwise.
|
|
9
|
+
*/
|
|
10
|
+
function isUpdaterFunction<T>(
|
|
11
|
+
updaterOrValue: Updater<T>
|
|
12
|
+
): updaterOrValue is (old: T) => T {
|
|
13
|
+
return typeof updaterOrValue === "function";
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Utility function to resolve TanStack updater into a new value.
|
|
18
|
+
* If the updater is a function, it is called with the `old` value to compute the new value.
|
|
19
|
+
* If the updater is not a function, it is returned as-is.
|
|
20
|
+
* @param updaterOrValue - The updater, either a function or a direct value.
|
|
21
|
+
* @param old - The (old) value.
|
|
22
|
+
* @returns Resolved value.
|
|
23
|
+
*/
|
|
24
|
+
export function resolveUpdater<T>(updaterOrValue: Updater<T>, old: T): T {
|
|
25
|
+
if (isUpdaterFunction(updaterOrValue)) {
|
|
26
|
+
return updaterOrValue(old);
|
|
27
|
+
}
|
|
28
|
+
return updaterOrValue;
|
|
29
|
+
}
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
useReactTable,
|
|
17
17
|
VisibilityState,
|
|
18
18
|
} from "@tanstack/react-table";
|
|
19
|
-
import React, { useEffect, useMemo } from "react";
|
|
19
|
+
import React, { useCallback, useEffect, useMemo } from "react";
|
|
20
20
|
import { track } from "../../common/analytics/analytics";
|
|
21
21
|
import {
|
|
22
22
|
EVENT_NAME,
|
|
@@ -98,8 +98,13 @@ TableProps<T>): JSX.Element => {
|
|
|
98
98
|
rowPreview,
|
|
99
99
|
tabValue,
|
|
100
100
|
} = exploreState;
|
|
101
|
-
const {
|
|
102
|
-
|
|
101
|
+
const {
|
|
102
|
+
columnsVisibility,
|
|
103
|
+
enableRowSelection,
|
|
104
|
+
grouping,
|
|
105
|
+
rowSelection,
|
|
106
|
+
sorting,
|
|
107
|
+
} = entityPageState[tabValue];
|
|
103
108
|
const { currentPage, pages, pageSize, rows: pageCount } = paginationState;
|
|
104
109
|
const { disablePagination = false, enableRowPreview = false } =
|
|
105
110
|
listView || {};
|
|
@@ -113,15 +118,19 @@ TableProps<T>): JSX.Element => {
|
|
|
113
118
|
);
|
|
114
119
|
|
|
115
120
|
const onSortingChange = (updater: Updater<ColumnSort[]>): void => {
|
|
121
|
+
// TODO(cc) memoize `onSortingChange` with `useCallback`.
|
|
122
|
+
// TODO(cc) copy `onSortingChange` to ../options/sorting/hook.ts see src/components/Table/options/grouping/hook.ts for example.
|
|
116
123
|
exploreDispatch({
|
|
117
124
|
payload: typeof updater === "function" ? updater(sorting) : updater,
|
|
118
125
|
type: ExploreActionKind.UpdateSorting,
|
|
119
126
|
});
|
|
120
127
|
// Execute GTM tracking.
|
|
128
|
+
// TODO(cc) update tracking to handle sorting of multiple columns.
|
|
129
|
+
// TODO(cc) GTM tracking when `onSortingChange` is triggered only tracks the first column sorted, and takes the value from explore state which is not updated yet.
|
|
121
130
|
track(EVENT_NAME.ENTITY_TABLE_SORTED, {
|
|
122
131
|
[EVENT_PARAM.ENTITY_NAME]: exploreState.tabValue,
|
|
123
|
-
[EVENT_PARAM.COLUMN_NAME]: sorting[0]
|
|
124
|
-
[EVENT_PARAM.SORT_DIRECTION]: sorting[0]
|
|
132
|
+
[EVENT_PARAM.COLUMN_NAME]: sorting?.[0]?.id, // TODO(cc) sorting should always be at least `[]` and never `undefined`.
|
|
133
|
+
[EVENT_PARAM.SORT_DIRECTION]: sorting?.[0]?.desc // TODO(cc) sorting should always be at least `[]` and never `undefined`.
|
|
125
134
|
? SORT_DIRECTION.DESC
|
|
126
135
|
: SORT_DIRECTION.ASC,
|
|
127
136
|
});
|
|
@@ -130,6 +139,7 @@ TableProps<T>): JSX.Element => {
|
|
|
130
139
|
const onColumnVisibilityChange = (
|
|
131
140
|
updater: Updater<VisibilityState>
|
|
132
141
|
): void => {
|
|
142
|
+
// TODO(cc) memoize `onColumnVisibilityChange` with `useCallback`.
|
|
133
143
|
exploreDispatch({
|
|
134
144
|
payload:
|
|
135
145
|
typeof updater === "function" ? updater(columnsVisibility) : updater,
|
|
@@ -137,22 +147,31 @@ TableProps<T>): JSX.Element => {
|
|
|
137
147
|
});
|
|
138
148
|
};
|
|
139
149
|
|
|
140
|
-
const onRowPreviewChange = (
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
150
|
+
const onRowPreviewChange = useCallback(
|
|
151
|
+
(updater: Updater<RowPreviewState>): void => {
|
|
152
|
+
exploreDispatch({
|
|
153
|
+
payload: typeof updater === "function" ? updater(rowPreview) : updater,
|
|
154
|
+
type: ExploreActionKind.UpdateRowPreview,
|
|
155
|
+
});
|
|
156
|
+
},
|
|
157
|
+
[exploreDispatch, rowPreview]
|
|
158
|
+
);
|
|
146
159
|
|
|
147
|
-
const onRowSelectionChange = (
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
160
|
+
const onRowSelectionChange = useCallback(
|
|
161
|
+
(updater: Updater<RowSelectionState>): void => {
|
|
162
|
+
// TODO(cc) refactor `onRowSelectionChange` to /options/rowSelection/hook.ts see onGroupingChange.
|
|
163
|
+
exploreDispatch({
|
|
164
|
+
payload:
|
|
165
|
+
typeof updater === "function" ? updater(rowSelection) : updater,
|
|
166
|
+
type: ExploreActionKind.UpdateRowSelection,
|
|
167
|
+
});
|
|
168
|
+
},
|
|
169
|
+
[exploreDispatch, rowSelection]
|
|
170
|
+
);
|
|
153
171
|
|
|
154
172
|
const state: Partial<TableState> = {
|
|
155
173
|
columnVisibility: columnsVisibility,
|
|
174
|
+
grouping,
|
|
156
175
|
pagination,
|
|
157
176
|
rowPreview,
|
|
158
177
|
rowSelection,
|
|
@@ -180,11 +199,9 @@ TableProps<T>): JSX.Element => {
|
|
|
180
199
|
data: items,
|
|
181
200
|
enableColumnFilters: true, // client-side filtering.
|
|
182
201
|
enableFilters: true, // client-side filtering.
|
|
183
|
-
enableMultiSort: clientFiltering,
|
|
202
|
+
enableMultiSort: clientFiltering, // TODO(cc) move to sorting options; default to false and let the table options in config flag this value.
|
|
184
203
|
enableRowPreview,
|
|
185
204
|
enableRowSelection,
|
|
186
|
-
enableSorting: true, // client-side filtering.
|
|
187
|
-
enableSortingRemoval: false, // client-side filtering.
|
|
188
205
|
getCoreRowModel: getCoreRowModel(),
|
|
189
206
|
getFacetedRowModel: clientFiltering ? getFacetedRowModel() : undefined,
|
|
190
207
|
getFacetedUniqueValues: clientFiltering
|
|
@@ -215,8 +232,8 @@ TableProps<T>): JSX.Element => {
|
|
|
215
232
|
} = tableInstance;
|
|
216
233
|
const allColumns = getAllColumns();
|
|
217
234
|
const { columnFilters } = getState();
|
|
218
|
-
const { rows
|
|
219
|
-
const noResults = !loading && (!
|
|
235
|
+
const { rows } = getRowModel();
|
|
236
|
+
const noResults = !loading && (!rows || rows.length === 0);
|
|
220
237
|
const scrollTop = useScroll();
|
|
221
238
|
const visibleColumns = getVisibleFlatColumns();
|
|
222
239
|
const gridTemplateColumns = getGridTemplateColumns(visibleColumns);
|
|
@@ -280,8 +297,8 @@ TableProps<T>): JSX.Element => {
|
|
|
280
297
|
loading: false,
|
|
281
298
|
paginationResponse: {
|
|
282
299
|
...DEFAULT_PAGINATION_STATE,
|
|
283
|
-
pageSize:
|
|
284
|
-
rows:
|
|
300
|
+
pageSize: rows.filter(({ getIsGrouped }) => !getIsGrouped()).length,
|
|
301
|
+
rows: rows.filter(({ getIsGrouped }) => !getIsGrouped()).length,
|
|
285
302
|
},
|
|
286
303
|
selectCategories: buildCategoryViews(allColumns, columnFilters),
|
|
287
304
|
},
|
|
@@ -294,7 +311,7 @@ TableProps<T>): JSX.Element => {
|
|
|
294
311
|
columnFilters,
|
|
295
312
|
exploreDispatch,
|
|
296
313
|
listItems,
|
|
297
|
-
|
|
314
|
+
rows,
|
|
298
315
|
]);
|
|
299
316
|
|
|
300
317
|
function canNextPage(): boolean {
|
|
@@ -325,6 +342,7 @@ TableProps<T>): JSX.Element => {
|
|
|
325
342
|
tableInstance={tableInstance}
|
|
326
343
|
/>
|
|
327
344
|
<TableBody
|
|
345
|
+
rows={rows}
|
|
328
346
|
rowDirection={rowDirection}
|
|
329
347
|
tableInstance={tableInstance}
|
|
330
348
|
/>
|
|
@@ -1,22 +1,20 @@
|
|
|
1
1
|
import { RowData } from "@tanstack/react-table";
|
|
2
|
+
import { ColumnConfig } from "../../../config/entities";
|
|
2
3
|
import { RowSelectionCell } from "../../Table/components/TableCell/components/RowSelectionCell/rowSelectionCell";
|
|
3
|
-
import { BaseColumnConfig } from "./entities";
|
|
4
4
|
|
|
5
5
|
export const ACCESSOR_KEYS = {
|
|
6
6
|
ROW_POSITION: "rowPosition",
|
|
7
7
|
SELECT: "select",
|
|
8
8
|
};
|
|
9
9
|
|
|
10
|
-
export const COLUMN_CONFIGS: Record<
|
|
11
|
-
string,
|
|
12
|
-
BaseColumnConfig<RowData, unknown>
|
|
13
|
-
> = {
|
|
10
|
+
export const COLUMN_CONFIGS: Record<string, ColumnConfig<RowData>> = {
|
|
14
11
|
SELECT: {
|
|
15
12
|
columnPinned: false,
|
|
16
13
|
columnVisible: false,
|
|
17
14
|
componentConfig: { component: RowSelectionCell },
|
|
18
15
|
disableHiding: true,
|
|
19
|
-
|
|
16
|
+
enableGrouping: false,
|
|
17
|
+
enableSorting: false,
|
|
20
18
|
header: ACCESSOR_KEYS.SELECT,
|
|
21
19
|
id: ACCESSOR_KEYS.SELECT,
|
|
22
20
|
meta: {
|
|
@@ -1,34 +1,41 @@
|
|
|
1
1
|
import { ColumnDef } from "@tanstack/react-table";
|
|
2
|
-
import {
|
|
2
|
+
import { ColumnConfig } from "../../../config/entities";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Builds a base column definition.
|
|
6
|
+
* The following properties are set by default:
|
|
7
|
+
* - Grouping is not enabled `enableGrouping: false`.
|
|
8
|
+
* - Sorting is enabled - `enableSorting: true`.
|
|
6
9
|
* @param baseColumnConfig - Base column configuration.
|
|
7
10
|
* @returns column definition.
|
|
8
11
|
*/
|
|
9
|
-
export function buildBaseColumnDef<T
|
|
10
|
-
baseColumnConfig:
|
|
12
|
+
export function buildBaseColumnDef<T>(
|
|
13
|
+
baseColumnConfig: ColumnConfig<T>
|
|
11
14
|
): ColumnDef<T> {
|
|
12
15
|
const {
|
|
13
16
|
columnPinned,
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars -- Destructure to avoid passing it to the columnDef.
|
|
18
|
+
columnVisible,
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars -- Destructure to avoid passing it to the columnDef.
|
|
20
|
+
componentConfig,
|
|
14
21
|
disableHiding,
|
|
15
|
-
disableSorting,
|
|
16
22
|
header,
|
|
17
23
|
id,
|
|
18
24
|
meta,
|
|
19
25
|
width,
|
|
26
|
+
...columnDef
|
|
20
27
|
} = baseColumnConfig;
|
|
21
28
|
return {
|
|
29
|
+
...columnDef,
|
|
22
30
|
accessorKey: id,
|
|
23
31
|
enableHiding: !disableHiding,
|
|
24
|
-
enableSorting: !disableSorting,
|
|
25
32
|
header,
|
|
26
33
|
id,
|
|
27
34
|
meta: {
|
|
28
|
-
...meta,
|
|
29
35
|
columnPinned,
|
|
30
|
-
header:
|
|
36
|
+
header: typeof header === "string" ? header : undefined,
|
|
31
37
|
width,
|
|
38
|
+
...meta,
|
|
32
39
|
},
|
|
33
40
|
};
|
|
34
41
|
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ExpandedOptions,
|
|
3
|
+
getExpandedRowModel,
|
|
4
|
+
RowData,
|
|
5
|
+
} from "@tanstack/react-table";
|
|
6
|
+
|
|
7
|
+
export const EXPANDED_OPTIONS: Pick<
|
|
8
|
+
ExpandedOptions<RowData>,
|
|
9
|
+
"autoResetExpanded" | "enableExpanding" | "getExpandedRowModel"
|
|
10
|
+
> = {
|
|
11
|
+
autoResetExpanded: false,
|
|
12
|
+
enableExpanding: false,
|
|
13
|
+
getExpandedRowModel: getExpandedRowModel(),
|
|
14
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { GroupingOptions, GroupingState, Updater } from "@tanstack/react-table";
|
|
2
|
+
import { useCallback } from "react";
|
|
3
|
+
import { useExploreState } from "../../../../hooks/useExploreState";
|
|
4
|
+
import { updateGrouping } from "../../../../providers/exploreState/actions/updateGrouping/dispatch";
|
|
5
|
+
import { GROUPING_OPTIONS } from "./constants";
|
|
6
|
+
|
|
7
|
+
export function useGroupingOptions(): GroupingOptions {
|
|
8
|
+
const { exploreDispatch } = useExploreState();
|
|
9
|
+
|
|
10
|
+
const onGroupingChange = useCallback(
|
|
11
|
+
(updaterOrValue: Updater<GroupingState>): void =>
|
|
12
|
+
exploreDispatch(updateGrouping({ updaterOrValue })),
|
|
13
|
+
[exploreDispatch]
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
return { ...GROUPING_OPTIONS, onGroupingChange };
|
|
17
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { RowData, TableOptions } from "@tanstack/react-table";
|
|
2
|
+
import { useConfig } from "../../../hooks/useConfig";
|
|
3
|
+
import { useExpandedOptions } from "./expanded/hook";
|
|
4
|
+
import { useGroupingOptions } from "./grouping/hook";
|
|
5
|
+
import { useRowSelectionOptions } from "./rowSelection/hook";
|
|
6
|
+
import { useSortingOptions } from "./sorting/hook";
|
|
7
|
+
|
|
8
|
+
export function useTableOptions<T extends RowData>(): Partial<TableOptions<T>> {
|
|
9
|
+
const {
|
|
10
|
+
entityConfig: {
|
|
11
|
+
list: { defaultSort, tableOptions },
|
|
12
|
+
},
|
|
13
|
+
} = useConfig();
|
|
14
|
+
const expandedOptions = useExpandedOptions<T>();
|
|
15
|
+
const groupingOptions = useGroupingOptions();
|
|
16
|
+
const rowSelectionOptions = useRowSelectionOptions<T>();
|
|
17
|
+
const sortingOptions = useSortingOptions<T>();
|
|
18
|
+
return {
|
|
19
|
+
...expandedOptions,
|
|
20
|
+
...groupingOptions,
|
|
21
|
+
...rowSelectionOptions,
|
|
22
|
+
...sortingOptions, // TODO(cc) merge of all sorting options.
|
|
23
|
+
...tableOptions,
|
|
24
|
+
initialState: {
|
|
25
|
+
...tableOptions?.initialState,
|
|
26
|
+
sorting: defaultSort
|
|
27
|
+
? [defaultSort] // TODO(cc) deprecate `defaultSort` in favor of `initialState.sorting`.
|
|
28
|
+
: tableOptions?.initialState?.sorting,
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { RowData, RowSelectionOptions } from "@tanstack/react-table";
|
|
2
|
+
|
|
3
|
+
export const ROW_SELECTION_OPTIONS: Pick<
|
|
4
|
+
RowSelectionOptions<RowData>,
|
|
5
|
+
"enableRowSelection" | "enableSubRowSelection" | "enableMultiRowSelection"
|
|
6
|
+
> = {
|
|
7
|
+
enableMultiRowSelection: false,
|
|
8
|
+
enableRowSelection: false,
|
|
9
|
+
enableSubRowSelection: false,
|
|
10
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { RowData, RowSelectionOptions } from "@tanstack/react-table";
|
|
2
|
+
import { ROW_SELECTION_OPTIONS } from "./constants";
|
|
3
|
+
|
|
4
|
+
export function useRowSelectionOptions<
|
|
5
|
+
T extends RowData
|
|
6
|
+
>(): RowSelectionOptions<T> {
|
|
7
|
+
return { ...(ROW_SELECTION_OPTIONS as RowSelectionOptions<T>) };
|
|
8
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { RowData, SortingOptions } from "@tanstack/react-table";
|
|
2
|
+
|
|
3
|
+
export const SORTING_OPTIONS: Pick<
|
|
4
|
+
SortingOptions<RowData>,
|
|
5
|
+
"enableSorting" | "enableSortingInteraction" | "enableSortingRemoval"
|
|
6
|
+
> = {
|
|
7
|
+
enableSorting: true,
|
|
8
|
+
enableSortingInteraction: true,
|
|
9
|
+
enableSortingRemoval: false, // false i.e. toggling the sorting on a column will not remove sorting on the column.
|
|
10
|
+
};
|
|
@@ -1,17 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
CellContext,
|
|
3
3
|
ColumnDef,
|
|
4
|
-
ColumnSort,
|
|
5
4
|
CoreOptions,
|
|
6
5
|
HeaderContext,
|
|
7
6
|
RowData,
|
|
8
7
|
} from "@tanstack/react-table";
|
|
9
8
|
import React, { useMemo } from "react";
|
|
10
|
-
import {
|
|
11
|
-
ColumnConfig,
|
|
12
|
-
ListConfig,
|
|
13
|
-
ListViewConfig,
|
|
14
|
-
} from "../../config/entities";
|
|
9
|
+
import { ColumnConfig, ListViewConfig } from "../../config/entities";
|
|
15
10
|
import { PAPER_PANEL_STYLE } from "../common/Paper/paper";
|
|
16
11
|
import { ComponentCreator } from "../ComponentCreator/ComponentCreator";
|
|
17
12
|
import { Loading } from "../Loading/loading";
|
|
@@ -26,16 +21,15 @@ import { HeadSelectionCell } from "../Table/components/TableHead/components/Head
|
|
|
26
21
|
import { Table } from "../Table/table";
|
|
27
22
|
import { COLUMN_CONFIGS } from "./common/constants";
|
|
28
23
|
import { buildBaseColumnDef } from "./common/utils";
|
|
24
|
+
import { useTableOptions } from "./options/hook";
|
|
29
25
|
import { TableCreator as TableCreatorContainer } from "./tableCreator.styles";
|
|
30
26
|
|
|
31
27
|
export interface TableCreatorProps<T> {
|
|
32
28
|
columns: ColumnConfig<T>[];
|
|
33
|
-
defaultSort: ColumnSort | undefined;
|
|
34
29
|
getRowId?: CoreOptions<T>["getRowId"];
|
|
35
30
|
items: T[];
|
|
36
31
|
listView?: ListViewConfig;
|
|
37
32
|
loading?: boolean;
|
|
38
|
-
tableOptions?: ListConfig<T>["tableOptions"];
|
|
39
33
|
}
|
|
40
34
|
|
|
41
35
|
const createCell = <T extends RowData = RowData, TData = unknown>(
|
|
@@ -63,13 +57,12 @@ const createRowSelectionCell = <T extends RowData>() =>
|
|
|
63
57
|
|
|
64
58
|
export const TableCreator = <T extends RowData>({
|
|
65
59
|
columns,
|
|
66
|
-
defaultSort,
|
|
67
60
|
getRowId,
|
|
68
61
|
items,
|
|
69
62
|
listView,
|
|
70
63
|
loading,
|
|
71
|
-
tableOptions,
|
|
72
64
|
}: TableCreatorProps<T>): JSX.Element => {
|
|
65
|
+
const tableOptions = useTableOptions<T>();
|
|
73
66
|
const columnDefs: ColumnDef<T>[] = useMemo(
|
|
74
67
|
() =>
|
|
75
68
|
columns.reduce(
|
|
@@ -95,7 +88,7 @@ export const TableCreator = <T extends RowData>({
|
|
|
95
88
|
),
|
|
96
89
|
[columns]
|
|
97
90
|
);
|
|
98
|
-
const initialState = getInitialState(columns
|
|
91
|
+
const initialState = getInitialState(columns);
|
|
99
92
|
return (
|
|
100
93
|
<TableCreatorContainer>
|
|
101
94
|
<Loading
|
|
@@ -1,48 +1,50 @@
|
|
|
1
1
|
import { MenuProps as MMenuProps } from "@mui/material";
|
|
2
|
-
import React, {
|
|
2
|
+
import React, { Fragment } from "react";
|
|
3
|
+
import { useMenu } from "../Menu/hooks/useMenu";
|
|
3
4
|
import { DEFAULT_DROPDOWN_MENU_PROPS } from "./common/constants";
|
|
4
5
|
import {
|
|
5
6
|
DropdownMenuButtonProps,
|
|
6
7
|
DropdownMenuIconButtonProps,
|
|
7
8
|
DropdownMenuItemProps,
|
|
8
9
|
} from "./common/entities";
|
|
9
|
-
import {
|
|
10
|
+
import { StyledMenu } from "./dropdownMenu.styles";
|
|
10
11
|
|
|
11
12
|
export interface DropdownMenuProps
|
|
12
13
|
extends Omit<MMenuProps, "children" | "open"> {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
button: (
|
|
15
|
+
props:
|
|
16
|
+
| Pick<DropdownMenuButtonProps, "onClick" | "open">
|
|
17
|
+
| Pick<DropdownMenuIconButtonProps, "onClick" | "open">
|
|
18
|
+
) => JSX.Element;
|
|
16
19
|
children?: ({ closeMenu }: DropdownMenuItemProps) => JSX.Element[];
|
|
17
20
|
className?: string;
|
|
18
21
|
}
|
|
19
22
|
|
|
20
23
|
export const DropdownMenu = ({
|
|
21
|
-
|
|
24
|
+
button,
|
|
22
25
|
children,
|
|
23
26
|
className,
|
|
24
27
|
...props /* Spread props to allow for Mui Menu specific prop overrides e.g. "anchorOrigin". */
|
|
25
28
|
}: DropdownMenuProps): JSX.Element => {
|
|
26
|
-
const
|
|
27
|
-
|
|
29
|
+
const {
|
|
30
|
+
anchorEl,
|
|
31
|
+
onClose: closeMenu,
|
|
32
|
+
onOpen: openMenu,
|
|
33
|
+
open,
|
|
34
|
+
} = useMenu<HTMLButtonElement>();
|
|
28
35
|
return (
|
|
29
36
|
<Fragment>
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
setAnchorEl(event.currentTarget)
|
|
33
|
-
}
|
|
34
|
-
open={Boolean(anchorEl)}
|
|
35
|
-
/>
|
|
36
|
-
<Menu
|
|
37
|
+
{button({ onClick: openMenu, open })}
|
|
38
|
+
<StyledMenu
|
|
37
39
|
{...DEFAULT_DROPDOWN_MENU_PROPS}
|
|
38
40
|
anchorEl={anchorEl}
|
|
39
41
|
className={className}
|
|
40
42
|
onClose={closeMenu}
|
|
41
|
-
open={
|
|
43
|
+
open={open}
|
|
42
44
|
{...props}
|
|
43
45
|
>
|
|
44
46
|
{children ? children({ closeMenu }) : null}
|
|
45
|
-
</
|
|
47
|
+
</StyledMenu>
|
|
46
48
|
</Fragment>
|
|
47
49
|
);
|
|
48
50
|
};
|
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import { PopperProps as MPopperProps } from "@mui/material";
|
|
2
1
|
import { MouseEvent, useCallback, useMemo, useState } from "react";
|
|
3
2
|
|
|
4
|
-
export interface UseMenu {
|
|
5
|
-
anchorEl:
|
|
3
|
+
export interface UseMenu<E extends HTMLElement> {
|
|
4
|
+
anchorEl: E | null;
|
|
6
5
|
onClose: () => void;
|
|
7
6
|
onDisableScrollLock: () => void;
|
|
8
7
|
onEnableScrollLock: () => void;
|
|
9
|
-
onOpen: (event: MouseEvent<
|
|
10
|
-
onToggleOpen: (event: MouseEvent<
|
|
8
|
+
onOpen: (event: MouseEvent<E>) => void;
|
|
9
|
+
onToggleOpen: (event: MouseEvent<E>) => void;
|
|
11
10
|
open: boolean;
|
|
12
11
|
}
|
|
13
12
|
|
|
@@ -15,8 +14,8 @@ export interface UseMenu {
|
|
|
15
14
|
* Menu functionality for menu dropdown, with menu position.
|
|
16
15
|
* @returns menu functionality.
|
|
17
16
|
*/
|
|
18
|
-
export const useMenu = (): UseMenu => {
|
|
19
|
-
const [anchorEl, setAnchorEl] = useState<
|
|
17
|
+
export const useMenu = <E extends HTMLElement>(): UseMenu<E> => {
|
|
18
|
+
const [anchorEl, setAnchorEl] = useState<E | null>(null);
|
|
20
19
|
const open = useMemo(() => Boolean(anchorEl), [anchorEl]);
|
|
21
20
|
|
|
22
21
|
// Closes menu.
|
|
@@ -35,13 +34,13 @@ export const useMenu = (): UseMenu => {
|
|
|
35
34
|
}, []);
|
|
36
35
|
|
|
37
36
|
// Opens menu.
|
|
38
|
-
const onOpen = useCallback((event: MouseEvent<
|
|
37
|
+
const onOpen = useCallback((event: MouseEvent<E>): void => {
|
|
39
38
|
setAnchorEl(event.currentTarget);
|
|
40
39
|
}, []);
|
|
41
40
|
|
|
42
41
|
// Toggles menu open/close.
|
|
43
42
|
const onToggleOpen = useCallback(
|
|
44
|
-
(event: MouseEvent<
|
|
43
|
+
(event: MouseEvent<E>): void => {
|
|
45
44
|
if (open) {
|
|
46
45
|
setAnchorEl(null);
|
|
47
46
|
} else {
|