@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
|
@@ -1,18 +1,10 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import { DropdownButton
|
|
2
|
+
import { DropdownButton } from "../../../../../../../common/Button/components/DropdownButton/dropdownButton";
|
|
3
3
|
import { DropdownMenu as RowSelectionDropdownMenu } from "./dropdownMenu.styles";
|
|
4
4
|
const DEFAULT_MENU_PROPS = {
|
|
5
5
|
anchorOrigin: { horizontal: "left", vertical: "bottom" },
|
|
6
6
|
transformOrigin: { horizontal: "left", vertical: "top" },
|
|
7
7
|
};
|
|
8
|
-
export const DropdownMenu = ({
|
|
9
|
-
return (React.createElement(RowSelectionDropdownMenu, { ...DEFAULT_MENU_PROPS, className: className,
|
|
8
|
+
export const DropdownMenu = ({ button = (props) => (React.createElement(DropdownButton, { ...props }, "Edit")), children, className, ...props /* Spread props to allow for Mui Menu specific prop overrides e.g. "anchorOrigin". */ }) => {
|
|
9
|
+
return (React.createElement(RowSelectionDropdownMenu, { ...DEFAULT_MENU_PROPS, className: className, button: button, ...props }, ({ closeMenu }) => children({ closeMenu })));
|
|
10
10
|
};
|
|
11
|
-
/**
|
|
12
|
-
* Return the dropdown button.
|
|
13
|
-
* @param props - Button props e.g. "onClick".
|
|
14
|
-
* @returns button element.
|
|
15
|
-
*/
|
|
16
|
-
function renderButton(props) {
|
|
17
|
-
return React.createElement(DXDropdownButton, { ...props });
|
|
18
|
-
}
|
|
@@ -5,6 +5,7 @@ import { getEditColumnOptions, isAnyRowSelected } from "../../common/utils";
|
|
|
5
5
|
import { CheckboxMenu } from "../CheckboxMenu/checkboxMenu";
|
|
6
6
|
import { DownloadEntityResults } from "../DownloadEntityResults/downloadEntityResults";
|
|
7
7
|
import { PaginationSummary } from "../PaginationSummary/paginationSummary";
|
|
8
|
+
import { ColumnGrouping } from "./components/ColumnGrouping/columnGrouping";
|
|
8
9
|
import { RowPreview } from "./components/RowPreview/rowPreview";
|
|
9
10
|
import { RowSelection } from "./components/RowSelection/rowSelection";
|
|
10
11
|
import { Toolbar, ToolbarActions } from "./tableToolbar.styles";
|
|
@@ -12,12 +13,12 @@ export const TableToolbar = ({ listView, rowDirection, tableInstance, }) => {
|
|
|
12
13
|
const { exploreState } = useExploreState();
|
|
13
14
|
const { paginationState } = exploreState;
|
|
14
15
|
const { currentPage, pages, pageSize, rows } = paginationState;
|
|
15
|
-
const { getSelectedRowModel, resetColumnVisibility } = tableInstance;
|
|
16
|
+
const { getSelectedRowModel, options: { enableGrouping }, resetColumnVisibility, } = tableInstance;
|
|
16
17
|
const { enableDownload, rowPreviewView } = listView || {};
|
|
17
18
|
const isLastPage = currentPage === pages;
|
|
18
19
|
const editColumnOptions = getEditColumnOptions(tableInstance);
|
|
19
20
|
const showToolbar = rowDirection === ROW_DIRECTION.DEFAULT &&
|
|
20
|
-
(editColumnOptions || enableDownload);
|
|
21
|
+
(editColumnOptions || enableDownload || enableGrouping);
|
|
21
22
|
/**
|
|
22
23
|
* Resets column visibility to default state.
|
|
23
24
|
*/
|
|
@@ -29,6 +30,7 @@ export const TableToolbar = ({ listView, rowDirection, tableInstance, }) => {
|
|
|
29
30
|
isAnyRowSelected(tableInstance) ? (React.createElement(RowSelection, { rows: getSelectedRowModel().rows, rowSelectionView: listView?.rowSelectionView })) : (React.createElement(PaginationSummary, { firstResult: (currentPage - 1) * pageSize + 1, lastResult: isLastPage ? rows : pageSize * currentPage, totalResult: rows })),
|
|
30
31
|
React.createElement(ToolbarActions, null,
|
|
31
32
|
enableDownload && (React.createElement(DownloadEntityResults, { entityName: exploreState.tabValue, rows: tableInstance.getFilteredRowModel().rows })),
|
|
33
|
+
React.createElement(ColumnGrouping, { tableInstance: tableInstance }),
|
|
32
34
|
React.createElement(CheckboxMenu, { label: "Edit Columns", onReset: onResetColumnVisibility, options: editColumnOptions })))),
|
|
33
35
|
React.createElement(RowPreview, { rowPreviewView: rowPreviewView, tableInstance: tableInstance })));
|
|
34
36
|
};
|
|
@@ -6,9 +6,9 @@ export const ROW_POSITION = {
|
|
|
6
6
|
};
|
|
7
7
|
},
|
|
8
8
|
createTable: (table) => {
|
|
9
|
-
const originalGetRowModel = table.getRowModel.bind(table);
|
|
10
9
|
table.getRowModel = () => {
|
|
11
|
-
|
|
10
|
+
const rowModel = table.getPaginationRowModel();
|
|
11
|
+
return getRowModel(table, rowModel);
|
|
12
12
|
};
|
|
13
13
|
},
|
|
14
14
|
getInitialState: (initialState) => {
|
|
@@ -2,10 +2,10 @@ import { InitialTableState, RowData, RowModel, Table, TableState } from "@tansta
|
|
|
2
2
|
/**
|
|
3
3
|
* Returns row model, with getter for row position.
|
|
4
4
|
* @param table - Table.
|
|
5
|
-
* @param
|
|
5
|
+
* @param rowModel - Row model.
|
|
6
6
|
* @returns row model.
|
|
7
7
|
*/
|
|
8
|
-
export declare function getRowModel<T extends RowData>(table: Table<T>,
|
|
8
|
+
export declare function getRowModel<T extends RowData>(table: Table<T>, rowModel: RowModel<T>): RowModel<T>;
|
|
9
9
|
/**
|
|
10
10
|
* Returns the position of the row in the table.
|
|
11
11
|
* @param rowId - Row ID.
|
|
@@ -3,13 +3,18 @@ import { DEFAULT_PAGINATION } from "../constants";
|
|
|
3
3
|
/**
|
|
4
4
|
* Returns row model, with getter for row position.
|
|
5
5
|
* @param table - Table.
|
|
6
|
-
* @param
|
|
6
|
+
* @param rowModel - Row model.
|
|
7
7
|
* @returns row model.
|
|
8
8
|
*/
|
|
9
|
-
export function getRowModel(table,
|
|
10
|
-
|
|
11
|
-
rowModel.
|
|
12
|
-
|
|
9
|
+
export function getRowModel(table, rowModel) {
|
|
10
|
+
let i = 0;
|
|
11
|
+
rowModel.flatRows.forEach(({ getIsGrouped, id }) => {
|
|
12
|
+
const isGroupedRow = getIsGrouped();
|
|
13
|
+
const index = isGroupedRow ? -1 : i; // Capture the current value of i for this iteration.
|
|
14
|
+
rowModel.rowsById[id].getRowPosition = () => calculateRowPosition(table, index);
|
|
15
|
+
if (isGroupedRow)
|
|
16
|
+
return; // Iterate only for non-grouped rows.
|
|
17
|
+
i++;
|
|
13
18
|
});
|
|
14
19
|
return rowModel;
|
|
15
20
|
}
|
|
@@ -31,6 +36,8 @@ export function getRowPosition(rowId, table) {
|
|
|
31
36
|
* @returns row position.
|
|
32
37
|
*/
|
|
33
38
|
function calculateRowPosition(table, index) {
|
|
39
|
+
if (index < 0)
|
|
40
|
+
return index; // Grouped rows have a position of -1.
|
|
34
41
|
const { getState } = table;
|
|
35
42
|
const { pagination: { pageIndex, pageSize }, } = getState();
|
|
36
43
|
return pageIndex * pageSize + (index + 1);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Updater } from "@tanstack/react-table";
|
|
2
|
+
/**
|
|
3
|
+
* Utility function to resolve TanStack updater into a new value.
|
|
4
|
+
* If the updater is a function, it is called with the `old` value to compute the new value.
|
|
5
|
+
* If the updater is not a function, it is returned as-is.
|
|
6
|
+
* @param updaterOrValue - The updater, either a function or a direct value.
|
|
7
|
+
* @param old - The (old) value.
|
|
8
|
+
* @returns Resolved value.
|
|
9
|
+
*/
|
|
10
|
+
export declare function resolveUpdater<T>(updaterOrValue: Updater<T>, old: T): T;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type guard to check if the given value is TanStack's updater function.
|
|
3
|
+
* TanStack updater can either be a function that computes the new value based on the old value,
|
|
4
|
+
* or a direct value. This type guard identifies whether the provided updater is a function.
|
|
5
|
+
* @param updaterOrValue - The value to check.
|
|
6
|
+
* @returns True if the value is a function, false otherwise.
|
|
7
|
+
*/
|
|
8
|
+
function isUpdaterFunction(updaterOrValue) {
|
|
9
|
+
return typeof updaterOrValue === "function";
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Utility function to resolve TanStack updater into a new value.
|
|
13
|
+
* If the updater is a function, it is called with the `old` value to compute the new value.
|
|
14
|
+
* If the updater is not a function, it is returned as-is.
|
|
15
|
+
* @param updaterOrValue - The updater, either a function or a direct value.
|
|
16
|
+
* @param old - The (old) value.
|
|
17
|
+
* @returns Resolved value.
|
|
18
|
+
*/
|
|
19
|
+
export function resolveUpdater(updaterOrValue, old) {
|
|
20
|
+
if (isUpdaterFunction(updaterOrValue)) {
|
|
21
|
+
return updaterOrValue(old);
|
|
22
|
+
}
|
|
23
|
+
return updaterOrValue;
|
|
24
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TableContainer } from "@mui/material";
|
|
2
2
|
import { getCoreRowModel, getFacetedRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable, } from "@tanstack/react-table";
|
|
3
|
-
import React, { useEffect, useMemo } from "react";
|
|
3
|
+
import React, { useCallback, useEffect, useMemo } from "react";
|
|
4
4
|
import { track } from "../../common/analytics/analytics";
|
|
5
5
|
import { EVENT_NAME, EVENT_PARAM, PAGINATION_DIRECTION, SORT_DIRECTION, } from "../../common/analytics/entities";
|
|
6
6
|
import { BREAKPOINT_FN_NAME, useBreakpointHelper, } from "../../hooks/useBreakpointHelper";
|
|
@@ -39,7 +39,7 @@ export const TableComponent = ({ columns, getRowId, initialState, items, listVie
|
|
|
39
39
|
const exploreMode = useExploreMode();
|
|
40
40
|
const { exploreDispatch, exploreState } = useExploreState();
|
|
41
41
|
const { entityPageState, filterState, listItems, loading, paginationState, rowPreview, tabValue, } = exploreState;
|
|
42
|
-
const { columnsVisibility, enableRowSelection, rowSelection, sorting } = entityPageState[tabValue];
|
|
42
|
+
const { columnsVisibility, enableRowSelection, grouping, rowSelection, sorting, } = entityPageState[tabValue];
|
|
43
43
|
const { currentPage, pages, pageSize, rows: pageCount } = paginationState;
|
|
44
44
|
const { disablePagination = false, enableRowPreview = false } = listView || {};
|
|
45
45
|
const clientFiltering = isClientFilteringEnabled(exploreMode);
|
|
@@ -48,39 +48,46 @@ export const TableComponent = ({ columns, getRowId, initialState, items, listVie
|
|
|
48
48
|
: ROW_DIRECTION.DEFAULT;
|
|
49
49
|
const pagination = useMemo(() => getTableStatePagination(currentPage - 1, pageSize), [currentPage, pageSize]);
|
|
50
50
|
const onSortingChange = (updater) => {
|
|
51
|
+
// TODO(cc) memoize `onSortingChange` with `useCallback`.
|
|
52
|
+
// TODO(cc) copy `onSortingChange` to ../options/sorting/hook.ts see src/components/Table/options/grouping/hook.ts for example.
|
|
51
53
|
exploreDispatch({
|
|
52
54
|
payload: typeof updater === "function" ? updater(sorting) : updater,
|
|
53
55
|
type: ExploreActionKind.UpdateSorting,
|
|
54
56
|
});
|
|
55
57
|
// Execute GTM tracking.
|
|
58
|
+
// TODO(cc) update tracking to handle sorting of multiple columns.
|
|
59
|
+
// 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.
|
|
56
60
|
track(EVENT_NAME.ENTITY_TABLE_SORTED, {
|
|
57
61
|
[EVENT_PARAM.ENTITY_NAME]: exploreState.tabValue,
|
|
58
|
-
[EVENT_PARAM.COLUMN_NAME]: sorting[0]
|
|
59
|
-
[EVENT_PARAM.SORT_DIRECTION]: sorting[0]
|
|
62
|
+
[EVENT_PARAM.COLUMN_NAME]: sorting?.[0]?.id, // TODO(cc) sorting should always be at least `[]` and never `undefined`.
|
|
63
|
+
[EVENT_PARAM.SORT_DIRECTION]: sorting?.[0]?.desc // TODO(cc) sorting should always be at least `[]` and never `undefined`.
|
|
60
64
|
? SORT_DIRECTION.DESC
|
|
61
65
|
: SORT_DIRECTION.ASC,
|
|
62
66
|
});
|
|
63
67
|
};
|
|
64
68
|
const onColumnVisibilityChange = (updater) => {
|
|
69
|
+
// TODO(cc) memoize `onColumnVisibilityChange` with `useCallback`.
|
|
65
70
|
exploreDispatch({
|
|
66
71
|
payload: typeof updater === "function" ? updater(columnsVisibility) : updater,
|
|
67
72
|
type: ExploreActionKind.UpdateColumnVisibility,
|
|
68
73
|
});
|
|
69
74
|
};
|
|
70
|
-
const onRowPreviewChange = (updater) => {
|
|
75
|
+
const onRowPreviewChange = useCallback((updater) => {
|
|
71
76
|
exploreDispatch({
|
|
72
77
|
payload: typeof updater === "function" ? updater(rowPreview) : updater,
|
|
73
78
|
type: ExploreActionKind.UpdateRowPreview,
|
|
74
79
|
});
|
|
75
|
-
};
|
|
76
|
-
const onRowSelectionChange = (updater) => {
|
|
80
|
+
}, [exploreDispatch, rowPreview]);
|
|
81
|
+
const onRowSelectionChange = useCallback((updater) => {
|
|
82
|
+
// TODO(cc) refactor `onRowSelectionChange` to /options/rowSelection/hook.ts see onGroupingChange.
|
|
77
83
|
exploreDispatch({
|
|
78
84
|
payload: typeof updater === "function" ? updater(rowSelection) : updater,
|
|
79
85
|
type: ExploreActionKind.UpdateRowSelection,
|
|
80
86
|
});
|
|
81
|
-
};
|
|
87
|
+
}, [exploreDispatch, rowSelection]);
|
|
82
88
|
const state = {
|
|
83
89
|
columnVisibility: columnsVisibility,
|
|
90
|
+
grouping,
|
|
84
91
|
pagination,
|
|
85
92
|
rowPreview,
|
|
86
93
|
rowSelection,
|
|
@@ -107,11 +114,9 @@ export const TableComponent = ({ columns, getRowId, initialState, items, listVie
|
|
|
107
114
|
data: items,
|
|
108
115
|
enableColumnFilters: true, // client-side filtering.
|
|
109
116
|
enableFilters: true, // client-side filtering.
|
|
110
|
-
enableMultiSort: clientFiltering,
|
|
117
|
+
enableMultiSort: clientFiltering, // TODO(cc) move to sorting options; default to false and let the table options in config flag this value.
|
|
111
118
|
enableRowPreview,
|
|
112
119
|
enableRowSelection,
|
|
113
|
-
enableSorting: true, // client-side filtering.
|
|
114
|
-
enableSortingRemoval: false, // client-side filtering.
|
|
115
120
|
getCoreRowModel: getCoreRowModel(),
|
|
116
121
|
getFacetedRowModel: clientFiltering ? getFacetedRowModel() : undefined,
|
|
117
122
|
getFacetedUniqueValues: clientFiltering
|
|
@@ -135,8 +140,8 @@ export const TableComponent = ({ columns, getRowId, initialState, items, listVie
|
|
|
135
140
|
const { getAllColumns, getRowModel, getState, getVisibleFlatColumns, nextPage: tableNextPage, previousPage: tablePreviousPage, } = tableInstance;
|
|
136
141
|
const allColumns = getAllColumns();
|
|
137
142
|
const { columnFilters } = getState();
|
|
138
|
-
const { rows
|
|
139
|
-
const noResults = !loading && (!
|
|
143
|
+
const { rows } = getRowModel();
|
|
144
|
+
const noResults = !loading && (!rows || rows.length === 0);
|
|
140
145
|
const scrollTop = useScroll();
|
|
141
146
|
const visibleColumns = getVisibleFlatColumns();
|
|
142
147
|
const gridTemplateColumns = getGridTemplateColumns(visibleColumns);
|
|
@@ -195,8 +200,8 @@ export const TableComponent = ({ columns, getRowId, initialState, items, listVie
|
|
|
195
200
|
loading: false,
|
|
196
201
|
paginationResponse: {
|
|
197
202
|
...DEFAULT_PAGINATION_STATE,
|
|
198
|
-
pageSize:
|
|
199
|
-
rows:
|
|
203
|
+
pageSize: rows.filter(({ getIsGrouped }) => !getIsGrouped()).length,
|
|
204
|
+
rows: rows.filter(({ getIsGrouped }) => !getIsGrouped()).length,
|
|
200
205
|
},
|
|
201
206
|
selectCategories: buildCategoryViews(allColumns, columnFilters),
|
|
202
207
|
},
|
|
@@ -209,7 +214,7 @@ export const TableComponent = ({ columns, getRowId, initialState, items, listVie
|
|
|
209
214
|
columnFilters,
|
|
210
215
|
exploreDispatch,
|
|
211
216
|
listItems,
|
|
212
|
-
|
|
217
|
+
rows,
|
|
213
218
|
]);
|
|
214
219
|
function canNextPage() {
|
|
215
220
|
return currentPage < pages;
|
|
@@ -223,7 +228,7 @@ export const TableComponent = ({ columns, getRowId, initialState, items, listVie
|
|
|
223
228
|
React.createElement(TableContainer, null,
|
|
224
229
|
React.createElement(GridTable, { collapsable: true, gridTemplateColumns: gridTemplateColumns },
|
|
225
230
|
React.createElement(TableHead, { rowDirection: rowDirection, tableInstance: tableInstance }),
|
|
226
|
-
React.createElement(TableBody, { rowDirection: rowDirection, tableInstance: tableInstance }))),
|
|
231
|
+
React.createElement(TableBody, { rows: rows, rowDirection: rowDirection, tableInstance: tableInstance }))),
|
|
227
232
|
!disablePagination && (React.createElement(DXPagination, { canNextPage: canNextPage(), canPreviousPage: canPreviousPage(), currentPage: currentPage, onNextPage: handleTableNextPage, onPreviousPage: handleTablePreviousPage, totalPage: pages ?? 0 })))));
|
|
228
233
|
};
|
|
229
234
|
// TODO(Dave) review whether memo is necessary - flash between tabs / loading state.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { RowData } from "@tanstack/react-table";
|
|
2
|
-
import {
|
|
2
|
+
import { ColumnConfig } from "../../../config/entities";
|
|
3
3
|
export declare const ACCESSOR_KEYS: {
|
|
4
4
|
ROW_POSITION: string;
|
|
5
5
|
SELECT: string;
|
|
6
6
|
};
|
|
7
|
-
export declare const COLUMN_CONFIGS: Record<string,
|
|
7
|
+
export declare const COLUMN_CONFIGS: Record<string, ColumnConfig<RowData>>;
|
|
@@ -9,7 +9,8 @@ export const COLUMN_CONFIGS = {
|
|
|
9
9
|
columnVisible: false,
|
|
10
10
|
componentConfig: { component: RowSelectionCell },
|
|
11
11
|
disableHiding: true,
|
|
12
|
-
|
|
12
|
+
enableGrouping: false,
|
|
13
|
+
enableSorting: false,
|
|
13
14
|
header: ACCESSOR_KEYS.SELECT,
|
|
14
15
|
id: ACCESSOR_KEYS.SELECT,
|
|
15
16
|
meta: {
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { ColumnDef } from "@tanstack/react-table";
|
|
2
|
-
import {
|
|
2
|
+
import { ColumnConfig } from "../../../config/entities";
|
|
3
3
|
/**
|
|
4
4
|
* Builds a base column definition.
|
|
5
|
+
* The following properties are set by default:
|
|
6
|
+
* - Grouping is not enabled `enableGrouping: false`.
|
|
7
|
+
* - Sorting is enabled - `enableSorting: true`.
|
|
5
8
|
* @param baseColumnConfig - Base column configuration.
|
|
6
9
|
* @returns column definition.
|
|
7
10
|
*/
|
|
8
|
-
export declare function buildBaseColumnDef<T
|
|
11
|
+
export declare function buildBaseColumnDef<T>(baseColumnConfig: ColumnConfig<T>): ColumnDef<T>;
|
|
@@ -1,21 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Builds a base column definition.
|
|
3
|
+
* The following properties are set by default:
|
|
4
|
+
* - Grouping is not enabled `enableGrouping: false`.
|
|
5
|
+
* - Sorting is enabled - `enableSorting: true`.
|
|
3
6
|
* @param baseColumnConfig - Base column configuration.
|
|
4
7
|
* @returns column definition.
|
|
5
8
|
*/
|
|
6
9
|
export function buildBaseColumnDef(baseColumnConfig) {
|
|
7
|
-
const { columnPinned,
|
|
10
|
+
const { columnPinned,
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars -- Destructure to avoid passing it to the columnDef.
|
|
12
|
+
columnVisible,
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars -- Destructure to avoid passing it to the columnDef.
|
|
14
|
+
componentConfig, disableHiding, header, id, meta, width, ...columnDef } = baseColumnConfig;
|
|
8
15
|
return {
|
|
16
|
+
...columnDef,
|
|
9
17
|
accessorKey: id,
|
|
10
18
|
enableHiding: !disableHiding,
|
|
11
|
-
enableSorting: !disableSorting,
|
|
12
19
|
header,
|
|
13
20
|
id,
|
|
14
21
|
meta: {
|
|
15
|
-
...meta,
|
|
16
22
|
columnPinned,
|
|
17
|
-
header:
|
|
23
|
+
header: typeof header === "string" ? header : undefined,
|
|
18
24
|
width,
|
|
25
|
+
...meta,
|
|
19
26
|
},
|
|
20
27
|
};
|
|
21
28
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { useCallback } from "react";
|
|
2
|
+
import { useExploreState } from "../../../../hooks/useExploreState";
|
|
3
|
+
import { updateGrouping } from "../../../../providers/exploreState/actions/updateGrouping/dispatch";
|
|
4
|
+
import { GROUPING_OPTIONS } from "./constants";
|
|
5
|
+
export function useGroupingOptions() {
|
|
6
|
+
const { exploreDispatch } = useExploreState();
|
|
7
|
+
const onGroupingChange = useCallback((updaterOrValue) => exploreDispatch(updateGrouping({ updaterOrValue })), [exploreDispatch]);
|
|
8
|
+
return { ...GROUPING_OPTIONS, onGroupingChange };
|
|
9
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { useConfig } from "../../../hooks/useConfig";
|
|
2
|
+
import { useExpandedOptions } from "./expanded/hook";
|
|
3
|
+
import { useGroupingOptions } from "./grouping/hook";
|
|
4
|
+
import { useRowSelectionOptions } from "./rowSelection/hook";
|
|
5
|
+
import { useSortingOptions } from "./sorting/hook";
|
|
6
|
+
export function useTableOptions() {
|
|
7
|
+
const { entityConfig: { list: { defaultSort, tableOptions }, }, } = useConfig();
|
|
8
|
+
const expandedOptions = useExpandedOptions();
|
|
9
|
+
const groupingOptions = useGroupingOptions();
|
|
10
|
+
const rowSelectionOptions = useRowSelectionOptions();
|
|
11
|
+
const sortingOptions = useSortingOptions();
|
|
12
|
+
return {
|
|
13
|
+
...expandedOptions,
|
|
14
|
+
...groupingOptions,
|
|
15
|
+
...rowSelectionOptions,
|
|
16
|
+
...sortingOptions, // TODO(cc) merge of all sorting options.
|
|
17
|
+
...tableOptions,
|
|
18
|
+
initialState: {
|
|
19
|
+
...tableOptions?.initialState,
|
|
20
|
+
sorting: defaultSort
|
|
21
|
+
? [defaultSort] // TODO(cc) deprecate `defaultSort` in favor of `initialState.sorting`.
|
|
22
|
+
: tableOptions?.initialState?.sorting,
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { ColumnConfig,
|
|
1
|
+
import { CoreOptions, RowData } from "@tanstack/react-table";
|
|
2
|
+
import { ColumnConfig, ListViewConfig } from "../../config/entities";
|
|
3
3
|
export interface TableCreatorProps<T> {
|
|
4
4
|
columns: ColumnConfig<T>[];
|
|
5
|
-
defaultSort: ColumnSort | undefined;
|
|
6
5
|
getRowId?: CoreOptions<T>["getRowId"];
|
|
7
6
|
items: T[];
|
|
8
7
|
listView?: ListViewConfig;
|
|
9
8
|
loading?: boolean;
|
|
10
|
-
tableOptions?: ListConfig<T>["tableOptions"];
|
|
11
9
|
}
|
|
12
|
-
export declare const TableCreator: <T extends RowData>({ columns,
|
|
10
|
+
export declare const TableCreator: <T extends RowData>({ columns, getRowId, items, listView, loading, }: TableCreatorProps<T>) => JSX.Element;
|
|
@@ -9,6 +9,7 @@ import { HeadSelectionCell } from "../Table/components/TableHead/components/Head
|
|
|
9
9
|
import { Table } from "../Table/table";
|
|
10
10
|
import { COLUMN_CONFIGS } from "./common/constants";
|
|
11
11
|
import { buildBaseColumnDef } from "./common/utils";
|
|
12
|
+
import { useTableOptions } from "./options/hook";
|
|
12
13
|
import { TableCreator as TableCreatorContainer } from "./tableCreator.styles";
|
|
13
14
|
const createCell = (config) => function CellCreator(cellContext) {
|
|
14
15
|
return (React.createElement(ComponentCreator, { components: [config.componentConfig], response: cellContext.row.original, viewContext: { cellContext } }));
|
|
@@ -19,7 +20,8 @@ const createHeaderSelectionCell = () => function CellCreator({ table }) {
|
|
|
19
20
|
const createRowSelectionCell = () => function CellCreator({ row }) {
|
|
20
21
|
return React.createElement(RowSelectionCell, { row: row });
|
|
21
22
|
};
|
|
22
|
-
export const TableCreator = ({ columns,
|
|
23
|
+
export const TableCreator = ({ columns, getRowId, items, listView, loading, }) => {
|
|
24
|
+
const tableOptions = useTableOptions();
|
|
23
25
|
const columnDefs = useMemo(() => columns.reduce((acc, columnConfig) => {
|
|
24
26
|
acc.push({
|
|
25
27
|
...buildBaseColumnDef(columnConfig),
|
|
@@ -38,7 +40,7 @@ export const TableCreator = ({ columns, defaultSort, getRowId, items, listView,
|
|
|
38
40
|
header: createHeaderSelectionCell(),
|
|
39
41
|
},
|
|
40
42
|
]), [columns]);
|
|
41
|
-
const initialState = getInitialState(columns
|
|
43
|
+
const initialState = getInitialState(columns);
|
|
42
44
|
return (React.createElement(TableCreatorContainer, null,
|
|
43
45
|
React.createElement(Loading, { appear: false, loading: loading || false, panelStyle: PAPER_PANEL_STYLE.FLUID }),
|
|
44
46
|
React.createElement(Table, { columns: columnDefs, getRowId: getRowId, initialState: initialState, items: items, listView: listView, loading: loading, tableOptions: tableOptions })));
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { MenuProps as MMenuProps } from "@mui/material";
|
|
2
|
-
import { ElementType } from "react";
|
|
3
2
|
import { DropdownMenuButtonProps, DropdownMenuIconButtonProps, DropdownMenuItemProps } from "./common/entities";
|
|
4
3
|
export interface DropdownMenuProps extends Omit<MMenuProps, "children" | "open"> {
|
|
5
|
-
|
|
4
|
+
button: (props: Pick<DropdownMenuButtonProps, "onClick" | "open"> | Pick<DropdownMenuIconButtonProps, "onClick" | "open">) => JSX.Element;
|
|
6
5
|
children?: ({ closeMenu }: DropdownMenuItemProps) => JSX.Element[];
|
|
7
6
|
className?: string;
|
|
8
7
|
}
|
|
9
|
-
export declare const DropdownMenu: ({
|
|
8
|
+
export declare const DropdownMenu: ({ button, children, className, ...props }: DropdownMenuProps) => JSX.Element;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import React, { Fragment
|
|
1
|
+
import React, { Fragment } from "react";
|
|
2
|
+
import { useMenu } from "../Menu/hooks/useMenu";
|
|
2
3
|
import { DEFAULT_DROPDOWN_MENU_PROPS } from "./common/constants";
|
|
3
|
-
import {
|
|
4
|
-
export const DropdownMenu = ({
|
|
5
|
-
const
|
|
6
|
-
const closeMenu = () => setAnchorEl(null);
|
|
4
|
+
import { StyledMenu } from "./dropdownMenu.styles";
|
|
5
|
+
export const DropdownMenu = ({ button, children, className, ...props /* Spread props to allow for Mui Menu specific prop overrides e.g. "anchorOrigin". */ }) => {
|
|
6
|
+
const { anchorEl, onClose: closeMenu, onOpen: openMenu, open, } = useMenu();
|
|
7
7
|
return (React.createElement(Fragment, null,
|
|
8
|
-
|
|
9
|
-
React.createElement(
|
|
8
|
+
button({ onClick: openMenu, open }),
|
|
9
|
+
React.createElement(StyledMenu, { ...DEFAULT_DROPDOWN_MENU_PROPS, anchorEl: anchorEl, className: className, onClose: closeMenu, open: open, ...props }, children ? children({ closeMenu }) : null)));
|
|
10
10
|
};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export declare const
|
|
1
|
+
export declare const StyledMenu: import("@emotion/styled").StyledComponent<import("@mui/material").MenuProps & {
|
|
2
2
|
theme?: import("@emotion/react").Theme;
|
|
3
3
|
}, {}, {}>;
|
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
import { PopperProps as MPopperProps } from "@mui/material";
|
|
2
1
|
import { MouseEvent } from "react";
|
|
3
|
-
export interface UseMenu {
|
|
4
|
-
anchorEl:
|
|
2
|
+
export interface UseMenu<E extends HTMLElement> {
|
|
3
|
+
anchorEl: E | null;
|
|
5
4
|
onClose: () => void;
|
|
6
5
|
onDisableScrollLock: () => void;
|
|
7
6
|
onEnableScrollLock: () => void;
|
|
8
|
-
onOpen: (event: MouseEvent<
|
|
9
|
-
onToggleOpen: (event: MouseEvent<
|
|
7
|
+
onOpen: (event: MouseEvent<E>) => void;
|
|
8
|
+
onToggleOpen: (event: MouseEvent<E>) => void;
|
|
10
9
|
open: boolean;
|
|
11
10
|
}
|
|
12
11
|
/**
|
|
13
12
|
* Menu functionality for menu dropdown, with menu position.
|
|
14
13
|
* @returns menu functionality.
|
|
15
14
|
*/
|
|
16
|
-
export declare const useMenu: () => UseMenu
|
|
15
|
+
export declare const useMenu: <E extends HTMLElement>() => UseMenu<E>;
|