@databiosphere/findable-ui 17.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 +22 -0
- package/lib/apis/azul/common/filterTransformer.js +1 -1
- package/lib/apis/azul/common/utils.d.ts +1 -1
- package/lib/apis/azul/common/utils.js +5 -1
- package/lib/common/entities.d.ts +3 -3
- 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/Filter/common/utils.js +1 -1
- package/lib/components/Filter/components/VariableSizeList/VariableSizeList.d.ts +1 -1
- package/lib/components/Filter/components/VariableSizeListItem/variableSizeListItem.d.ts +1 -1
- 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 +26 -61
- 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 +7 -7
- package/lib/config/utils.d.ts +0 -7
- package/lib/config/utils.js +0 -12
- package/lib/hooks/useCategoryFilter.js +5 -1
- 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/providers/fileManifestState.js +2 -4
- package/lib/viewModelBuilders/common/utils.d.ts +6 -6
- package/lib/viewModelBuilders/common/utils.js +10 -10
- package/lib/views/ExploreView/exploreView.js +3 -3
- package/package.json +1 -1
- package/src/apis/azul/common/filterTransformer.ts +1 -1
- package/src/apis/azul/common/utils.ts +4 -2
- package/src/common/entities.ts +3 -3
- 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/Filter/common/utils.ts +1 -1
- package/src/components/Filter/components/VariableSizeList/VariableSizeList.tsx +1 -1
- package/src/components/Filter/components/VariableSizeListItem/variableSizeListItem.tsx +1 -1
- 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 +45 -108
- 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 +11 -10
- package/src/config/utils.ts +0 -14
- package/src/hooks/useCategoryFilter.ts +5 -1
- package/src/hooks/useFileManifest/common/utils.ts +2 -2
- 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/providers/fileManifestState.tsx +2 -4
- package/src/viewModelBuilders/common/utils.ts +10 -10
- package/src/views/ExploreView/exploreView.tsx +2 -4
- 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
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Row, RowData } from "@tanstack/react-table";
|
|
2
|
+
import { useWindowVirtualizer } from "@tanstack/react-virtual";
|
|
3
|
+
import { useCallback } from "react";
|
|
4
|
+
import { VIRTUALIZER_OPTIONS } from "./constants";
|
|
5
|
+
import { UseVirtualizer } from "./types";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* A hook to create and manage TanStack window virtualizer for table rows.
|
|
9
|
+
* @param rows - Rows.
|
|
10
|
+
* @returns An object containing the virtualizer instance, which manages the visible rows.
|
|
11
|
+
*/
|
|
12
|
+
export function useVirtualizer<T extends RowData>(
|
|
13
|
+
rows: Row<T>[]
|
|
14
|
+
): UseVirtualizer {
|
|
15
|
+
const estimateSize = useCallback(() => 100, []);
|
|
16
|
+
const count = rows.length;
|
|
17
|
+
const virtualizer = useWindowVirtualizer({
|
|
18
|
+
...VIRTUALIZER_OPTIONS,
|
|
19
|
+
count,
|
|
20
|
+
estimateSize,
|
|
21
|
+
});
|
|
22
|
+
return { virtualizer };
|
|
23
|
+
}
|
|
@@ -1,40 +1,38 @@
|
|
|
1
1
|
import { TableBody as MTableBody } from "@mui/material";
|
|
2
|
-
import { RowData, Table } from "@tanstack/react-table";
|
|
3
|
-
import
|
|
4
|
-
import React, { useCallback } from "react";
|
|
2
|
+
import { Row, RowData, Table } from "@tanstack/react-table";
|
|
3
|
+
import React from "react";
|
|
5
4
|
import { ROW_DIRECTION } from "../../common/entities";
|
|
6
5
|
import { CollapsableRows } from "../TableRows/components/CollapsableRows/collapsableRows";
|
|
7
6
|
import { VirtualizedRow } from "../TableRows/components/VirtualizedRow/virtualizedRow";
|
|
8
7
|
import { TableRows } from "../TableRows/tableRows";
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
import { useVirtualizer } from "./hooks/virtualizer/hook";
|
|
9
|
+
import { getAllVirtualizedRows } from "./utils";
|
|
11
10
|
|
|
12
11
|
export interface TableBodyProps<T extends RowData> {
|
|
13
12
|
rowDirection: ROW_DIRECTION;
|
|
13
|
+
rows: Row<T>[];
|
|
14
14
|
tableInstance: Table<T>;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
export const TableBody = <T extends RowData>({
|
|
18
18
|
rowDirection,
|
|
19
|
+
rows,
|
|
19
20
|
tableInstance,
|
|
20
21
|
}: TableBodyProps<T>): JSX.Element => {
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
estimateSize,
|
|
28
|
-
measureElement,
|
|
29
|
-
overscan: OVERSCAN,
|
|
30
|
-
});
|
|
22
|
+
const virtualizedRows = getAllVirtualizedRows(
|
|
23
|
+
tableInstance,
|
|
24
|
+
rows,
|
|
25
|
+
rowDirection
|
|
26
|
+
);
|
|
27
|
+
const { virtualizer } = useVirtualizer(virtualizedRows);
|
|
31
28
|
return (
|
|
32
29
|
<MTableBody>
|
|
33
30
|
<VirtualizedRow isUpperRow={true} virtualizer={virtualizer} />
|
|
34
31
|
{rowDirection === ROW_DIRECTION.DEFAULT ? (
|
|
35
|
-
<TableRows
|
|
32
|
+
<TableRows rows={virtualizedRows} virtualizer={virtualizer} />
|
|
36
33
|
) : (
|
|
37
34
|
<CollapsableRows
|
|
35
|
+
rows={virtualizedRows}
|
|
38
36
|
tableInstance={tableInstance}
|
|
39
37
|
virtualizer={virtualizer}
|
|
40
38
|
/>
|
|
@@ -43,17 +41,3 @@ export const TableBody = <T extends RowData>({
|
|
|
43
41
|
</MTableBody>
|
|
44
42
|
);
|
|
45
43
|
};
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Measures the height of the element.
|
|
49
|
-
* @param element - Element to measure.
|
|
50
|
-
* @returns height of the element.
|
|
51
|
-
*/
|
|
52
|
-
function measureElement(element: Element): number {
|
|
53
|
-
// We select the first child element because the row is not a box element due to the "display: contents" style attribute.
|
|
54
|
-
const box = element.children[0];
|
|
55
|
-
if (!box) {
|
|
56
|
-
return 0;
|
|
57
|
-
}
|
|
58
|
-
return box.getBoundingClientRect().height;
|
|
59
|
-
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Row, RowData, Table } from "@tanstack/react-table";
|
|
2
|
+
import { ROW_DIRECTION } from "../../common/entities";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Filters and returns the appropriate rows for a virtualized table based on row direction
|
|
6
|
+
* and grouping state.
|
|
7
|
+
* Rows are filtered if `ROW_DIRECTION` is `VERTICAL` and the table is grouped.
|
|
8
|
+
* @param table - Table.
|
|
9
|
+
* @param rows - Rows.
|
|
10
|
+
* @param rowDirection - Row direction.
|
|
11
|
+
* @returns Rows based on the provided row direction and table grouping state.
|
|
12
|
+
*/
|
|
13
|
+
export function getAllVirtualizedRows<T extends RowData>(
|
|
14
|
+
table: Table<T>,
|
|
15
|
+
rows: Row<T>[],
|
|
16
|
+
rowDirection: ROW_DIRECTION
|
|
17
|
+
): Row<T>[] {
|
|
18
|
+
if (rowDirection === ROW_DIRECTION.DEFAULT) return rows;
|
|
19
|
+
if (table.getState().grouping.length === 0) return rows;
|
|
20
|
+
return rows.filter(({ getIsGrouped }) => getIsGrouped());
|
|
21
|
+
}
|
package/src/components/Table/components/TableCell/components/CollapsableCell/collapsableCell.tsx
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Collapse, IconButton, Typography } from "@mui/material";
|
|
2
2
|
import { Cell, flexRender, Row, RowData } from "@tanstack/react-table";
|
|
3
|
-
import
|
|
3
|
+
import { Virtualizer } from "@tanstack/react-virtual";
|
|
4
|
+
import React from "react";
|
|
4
5
|
import { TEXT_BODY_400_2_LINES } from "../../../../../../theme/common/typography";
|
|
5
6
|
import { UnfoldMoreIcon } from "../../../../../common/CustomIcon/components/UnfoldMoreIcon/unfoldMoreIcon";
|
|
6
7
|
import { getPinnedCellIndex } from "../../../../common/utils";
|
|
@@ -14,35 +15,36 @@ import {
|
|
|
14
15
|
export interface CollapsableCellProps<T extends RowData> {
|
|
15
16
|
isDisabled?: boolean;
|
|
16
17
|
row: Row<T>;
|
|
18
|
+
virtualizer?: Virtualizer<Window, Element>;
|
|
17
19
|
}
|
|
18
20
|
|
|
19
21
|
export const CollapsableCell = <T extends RowData>({
|
|
20
22
|
isDisabled = false,
|
|
21
23
|
row,
|
|
24
|
+
virtualizer,
|
|
22
25
|
}: CollapsableCellProps<T>): JSX.Element => {
|
|
23
|
-
const [isExpanded, setIsExpanded] = useState<boolean>(false);
|
|
24
26
|
const [pinnedCell, pinnedIndex] = getPinnedCellIndex(row);
|
|
25
|
-
|
|
26
|
-
// Toggles open/close table cell.
|
|
27
|
-
const onToggleExpanded = (): void => {
|
|
28
|
-
setIsExpanded((expanded) => !expanded);
|
|
29
|
-
};
|
|
30
|
-
|
|
31
27
|
return (
|
|
32
|
-
<TableCell isExpanded={
|
|
28
|
+
<TableCell isExpanded={row.getIsExpanded()}>
|
|
33
29
|
<PinnedCell>
|
|
34
30
|
{flexRender(pinnedCell.column.columnDef.cell, pinnedCell.getContext())}
|
|
35
31
|
<IconButton
|
|
36
32
|
color="ink"
|
|
37
33
|
disabled={isDisabled}
|
|
38
34
|
edge="end"
|
|
39
|
-
onClick={
|
|
35
|
+
onClick={() => row.toggleExpanded()}
|
|
40
36
|
size="large"
|
|
41
37
|
>
|
|
42
38
|
<UnfoldMoreIcon fontSize="small" />
|
|
43
39
|
</IconButton>
|
|
44
40
|
</PinnedCell>
|
|
45
|
-
<Collapse
|
|
41
|
+
<Collapse
|
|
42
|
+
in={row.getIsExpanded()}
|
|
43
|
+
mountOnEnter
|
|
44
|
+
onEntered={() => virtualizer?.measure()} // Measure when cell is opened.
|
|
45
|
+
onExited={() => virtualizer?.measure()} // Measure when cell is closed.
|
|
46
|
+
unmountOnExit
|
|
47
|
+
>
|
|
46
48
|
<CollapsedContents>
|
|
47
49
|
{getRowVisibleCells(row).map((cell, i) => {
|
|
48
50
|
if (cell.getIsAggregated()) return null; // Display of aggregated cells is currently not supported.
|
|
@@ -80,10 +82,7 @@ function getRowVisibleCells<T extends RowData>(
|
|
|
80
82
|
row: Row<T>
|
|
81
83
|
): Cell<T, unknown>[] {
|
|
82
84
|
if (row.getIsGrouped()) {
|
|
83
|
-
return row
|
|
84
|
-
.getLeafRows()
|
|
85
|
-
.map((leafRow) => leafRow.getVisibleCells())
|
|
86
|
-
.flat();
|
|
85
|
+
return row.subRows.map(({ getVisibleCells }) => getVisibleCells()).flat();
|
|
87
86
|
}
|
|
88
87
|
return row.getVisibleCells();
|
|
89
88
|
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Column, RowData, Table } from "@tanstack/react-table";
|
|
2
|
+
import { buildColumnSort } from "../RowSorting/utils";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Clears the grouping state of the table and optionally resets the sorting state.
|
|
6
|
+
* ### Grouping State:
|
|
7
|
+
* - Grouping state is reset to `[]`.
|
|
8
|
+
* ### Sorting State:
|
|
9
|
+
* - Sorting state is reset to initial state (if sorting is enabled).
|
|
10
|
+
* @param table - Table.
|
|
11
|
+
*/
|
|
12
|
+
export function handleClearGroupingState<T extends RowData>(
|
|
13
|
+
table: Table<T>
|
|
14
|
+
): void {
|
|
15
|
+
const {
|
|
16
|
+
options: { enableSorting },
|
|
17
|
+
resetGrouping,
|
|
18
|
+
resetSorting,
|
|
19
|
+
} = table;
|
|
20
|
+
resetGrouping(true); // Clears grouping state to `[]`.
|
|
21
|
+
if (enableSorting) resetSorting(); // Resets sorting state to initial state.
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Toggles the grouping state for the given column.
|
|
26
|
+
* ### Grouping State
|
|
27
|
+
* - **Column grouping is not enabled**:
|
|
28
|
+
* - No grouping action (exit).
|
|
29
|
+
* - **Column grouping is enabled**:
|
|
30
|
+
* - Toggles the grouping state of the specified column.
|
|
31
|
+
* ### Sorting State
|
|
32
|
+
* - **Table sorting is not enabled**:
|
|
33
|
+
* - No sorting action (exit).
|
|
34
|
+
* - **Column sorting is not enabled**:
|
|
35
|
+
* - Resets sorting state to initial state.
|
|
36
|
+
* - **Column sorting is enabled**:
|
|
37
|
+
* - Sets new sorting state with the grouped column as the first sort key.
|
|
38
|
+
* @param table - Table.
|
|
39
|
+
* @param column - Column.
|
|
40
|
+
*/
|
|
41
|
+
export function handleToggleGrouping<T extends RowData>(
|
|
42
|
+
table: Table<T>,
|
|
43
|
+
column: Column<T>
|
|
44
|
+
): void {
|
|
45
|
+
const {
|
|
46
|
+
options: { enableSorting },
|
|
47
|
+
resetSorting,
|
|
48
|
+
setSorting,
|
|
49
|
+
} = table;
|
|
50
|
+
const { getCanGroup, getCanSort } = column;
|
|
51
|
+
|
|
52
|
+
// Column cannot be grouped.
|
|
53
|
+
if (!getCanGroup()) return;
|
|
54
|
+
|
|
55
|
+
// Toggle column grouping.
|
|
56
|
+
column.toggleGrouping(); // Grouping state currently only supports single-column grouping.
|
|
57
|
+
|
|
58
|
+
// Table sorting is not enabled.
|
|
59
|
+
if (!enableSorting) return;
|
|
60
|
+
|
|
61
|
+
// Column sorting is enabled.
|
|
62
|
+
if (getCanSort()) {
|
|
63
|
+
// Set new sorting state; grouped column is first sort.
|
|
64
|
+
setSorting([buildColumnSort(column)]);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Column sorting is not enabled; reset sorting state to initial state.
|
|
69
|
+
resetSorting();
|
|
70
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Column, RowData, Table } from "@tanstack/react-table";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Toggles the visibility state for the given column.
|
|
5
|
+
* ### Column Visibility State
|
|
6
|
+
* - **Column visibility is not enabled**:
|
|
7
|
+
* - No column visibility action (exit).
|
|
8
|
+
* - **Column visibility is enabled**:
|
|
9
|
+
* - Toggles the visibility state of the specified column.
|
|
10
|
+
* ### Grouping and Sorting State
|
|
11
|
+
* - **Column is not visible**:
|
|
12
|
+
* - No grouping or sorting action (exit).
|
|
13
|
+
* - **Column is visible**:
|
|
14
|
+
* - **Column is grouped**:
|
|
15
|
+
* - Resets grouping state to `[]`.
|
|
16
|
+
* - Clears column from sorting state.
|
|
17
|
+
* - **Column is not grouped**:
|
|
18
|
+
* - No grouping or sorting action.
|
|
19
|
+
* @param table - Table.
|
|
20
|
+
* @param column - Column.
|
|
21
|
+
*/
|
|
22
|
+
export function handleToggleVisibility<T extends RowData>(
|
|
23
|
+
table: Table<T>,
|
|
24
|
+
column: Column<T>
|
|
25
|
+
): void {
|
|
26
|
+
const {
|
|
27
|
+
options: { enableGrouping },
|
|
28
|
+
resetGrouping,
|
|
29
|
+
} = table;
|
|
30
|
+
const {
|
|
31
|
+
clearSorting,
|
|
32
|
+
getCanHide,
|
|
33
|
+
getIsGrouped,
|
|
34
|
+
getIsVisible,
|
|
35
|
+
toggleVisibility,
|
|
36
|
+
} = column;
|
|
37
|
+
if (!getCanHide()) return;
|
|
38
|
+
|
|
39
|
+
// Toggle column visibility.
|
|
40
|
+
toggleVisibility();
|
|
41
|
+
|
|
42
|
+
// Column is not visible i.e. requesting column visibility and therefore no further action is needed.
|
|
43
|
+
if (!getIsVisible()) return;
|
|
44
|
+
|
|
45
|
+
// Column is visible.
|
|
46
|
+
// Table grouping is enabled, and column is grouped.
|
|
47
|
+
if (enableGrouping && getIsGrouped()) {
|
|
48
|
+
resetGrouping(true); // Clears grouping state to `[]`.
|
|
49
|
+
// Currently, only a grouped column's sorting state is cleared.
|
|
50
|
+
clearSorting(); // Clears column sorting.
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { Column, ColumnSort, RowData, Table } from "@tanstack/react-table";
|
|
2
|
+
import { MouseEvent } from "react";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Constructs a `ColumnSort` object from a column.
|
|
6
|
+
* @param column - Column.
|
|
7
|
+
* @returns `ColumnSort` object with sorting direction and column ID.
|
|
8
|
+
*/
|
|
9
|
+
export function buildColumnSort<T extends RowData>(
|
|
10
|
+
column: Column<T>
|
|
11
|
+
): ColumnSort {
|
|
12
|
+
return { desc: column.getFirstSortDir() === "desc", id: column.id };
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Toggles the sorting state for the specified column.
|
|
17
|
+
* The sorting state of a table is modified based on user interaction, table grouping state, and
|
|
18
|
+
* its sorting configuration (single-sort or multi-sort modes).
|
|
19
|
+
* ### Sorting State:
|
|
20
|
+
* - **Ungrouped Table**:
|
|
21
|
+
* - Sorting is toggled normally, respecting single-sort or multi-sort modes.
|
|
22
|
+
* - **Grouped Table**:
|
|
23
|
+
* - **Multi-Sort Request**:
|
|
24
|
+
* - Sorting is toggled normally.
|
|
25
|
+
* - **Single-Sort Request**:
|
|
26
|
+
* - **Multi-Sort Mode**:
|
|
27
|
+
* - Grouped column is preserved as the first sort key, and the requested column is sorted as the second sort key.
|
|
28
|
+
* - **Single-Sort Mode**:
|
|
29
|
+
* - If the grouped column is already sorted, no action taken (the grouped column remains the primary sort key).
|
|
30
|
+
* - Otherwise, sorting is toggled normally.
|
|
31
|
+
* @param mouseEvent - Mouse event.
|
|
32
|
+
* @param table - Table.
|
|
33
|
+
* @param column - Column.
|
|
34
|
+
*/
|
|
35
|
+
export function handleToggleSorting<T extends RowData>(
|
|
36
|
+
mouseEvent: MouseEvent,
|
|
37
|
+
table: Table<T>,
|
|
38
|
+
column: Column<T>
|
|
39
|
+
): void {
|
|
40
|
+
const {
|
|
41
|
+
getColumn,
|
|
42
|
+
getState,
|
|
43
|
+
options: { enableMultiSort, isMultiSortEvent },
|
|
44
|
+
setSorting,
|
|
45
|
+
} = table;
|
|
46
|
+
const { getCanSort, getSortIndex, toggleSorting } = column;
|
|
47
|
+
const { grouping, sorting } = getState();
|
|
48
|
+
|
|
49
|
+
// Table and column sorting is not enabled.
|
|
50
|
+
if (!getCanSort()) return;
|
|
51
|
+
|
|
52
|
+
// Sorting is enabled.
|
|
53
|
+
// Table is not grouped; toggle sorting as usual.
|
|
54
|
+
if (grouping.length === 0) {
|
|
55
|
+
toggleSorting(undefined, isMultiSortEvent?.(mouseEvent));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Table is grouped.
|
|
60
|
+
// Multi-sort mode and multi-sort requested; toggle sorting as usual.
|
|
61
|
+
if (enableMultiSort && isMultiSortEvent?.(mouseEvent)) {
|
|
62
|
+
toggleSorting(undefined, true);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Retrieve the grouped column.
|
|
67
|
+
const groupedColumn = getColumn(grouping[0]); // Grouping state currently only supports single-column grouping.
|
|
68
|
+
|
|
69
|
+
// Single-sort requested (either single-sort or multi-sort mode).
|
|
70
|
+
// Grouped column is sorted.
|
|
71
|
+
if (groupedColumn?.getIsSorted()) {
|
|
72
|
+
if (enableMultiSort) {
|
|
73
|
+
// Multi-sort mode.
|
|
74
|
+
// Column to be sorted is not the last most recent sorted column.
|
|
75
|
+
if (getSortIndex() !== sorting.length - 1) {
|
|
76
|
+
// Reset sorting state, preserving grouped column as the first sort, and requested column to be sorted as the second sort.
|
|
77
|
+
setSorting([buildColumnSort(groupedColumn), buildColumnSort(column)]);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
} else {
|
|
81
|
+
// Special case; in single-sort mode we do not override a grouped sort.
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
toggleSorting();
|
|
87
|
+
}
|
|
@@ -1,22 +1,20 @@
|
|
|
1
|
+
import SouthRoundedIcon from "@mui/icons-material/SouthRounded";
|
|
1
2
|
import {
|
|
2
3
|
TableHead as MTableHead,
|
|
3
4
|
TableRow as MTableRow,
|
|
4
5
|
TableCell,
|
|
5
6
|
TableSortLabel,
|
|
6
7
|
} from "@mui/material";
|
|
7
|
-
import { flexRender, RowData
|
|
8
|
+
import { flexRender, RowData } from "@tanstack/react-table";
|
|
8
9
|
import React, { Fragment } from "react";
|
|
9
10
|
import { ROW_DIRECTION } from "../../common/entities";
|
|
10
|
-
import { getTableSortLabelProps } from "../../common/utils";
|
|
11
11
|
import {
|
|
12
12
|
getTableCellAlign,
|
|
13
13
|
getTableCellPadding,
|
|
14
14
|
} from "../TableCell/common/utils";
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
tableInstance: Table<T>;
|
|
19
|
-
}
|
|
15
|
+
import { handleToggleSorting } from "../TableFeatures/RowSorting/utils";
|
|
16
|
+
import { TableHeadProps } from "./types";
|
|
17
|
+
import { isSortDisabled, shouldSortColumn } from "./utils";
|
|
20
18
|
|
|
21
19
|
export const TableHead = <T extends RowData>({
|
|
22
20
|
rowDirection,
|
|
@@ -28,34 +26,28 @@ export const TableHead = <T extends RowData>({
|
|
|
28
26
|
tableInstance.getHeaderGroups().map((headerGroup) => (
|
|
29
27
|
<MTableHead key={headerGroup.id}>
|
|
30
28
|
<MTableRow>
|
|
31
|
-
{headerGroup.headers.map((
|
|
32
|
-
const {
|
|
33
|
-
|
|
34
|
-
columnDef: {
|
|
35
|
-
meta: { enableSortingInteraction = true } = {},
|
|
36
|
-
},
|
|
37
|
-
},
|
|
38
|
-
} = header;
|
|
39
|
-
return header.column.getIsGrouped() ? null : (
|
|
29
|
+
{headerGroup.headers.map(({ column, getContext, id }) => {
|
|
30
|
+
const { columnDef, getIsGrouped, getIsSorted } = column;
|
|
31
|
+
return getIsGrouped() ? null : (
|
|
40
32
|
<TableCell
|
|
41
|
-
key={
|
|
42
|
-
align={getTableCellAlign(
|
|
43
|
-
padding={getTableCellPadding(
|
|
33
|
+
key={id}
|
|
34
|
+
align={getTableCellAlign(column)}
|
|
35
|
+
padding={getTableCellPadding(id)}
|
|
44
36
|
>
|
|
45
|
-
{
|
|
37
|
+
{shouldSortColumn(tableInstance, column) ? (
|
|
46
38
|
<TableSortLabel
|
|
47
|
-
{
|
|
39
|
+
IconComponent={SouthRoundedIcon}
|
|
40
|
+
active={Boolean(getIsSorted())}
|
|
41
|
+
direction={getIsSorted() || undefined}
|
|
42
|
+
disabled={isSortDisabled(tableInstance)}
|
|
43
|
+
onClick={(mouseEvent) =>
|
|
44
|
+
handleToggleSorting(mouseEvent, tableInstance, column)
|
|
45
|
+
}
|
|
48
46
|
>
|
|
49
|
-
{flexRender(
|
|
50
|
-
header.column.columnDef.header,
|
|
51
|
-
header.getContext()
|
|
52
|
-
)}
|
|
47
|
+
{flexRender(columnDef.header, getContext())}
|
|
53
48
|
</TableSortLabel>
|
|
54
49
|
) : (
|
|
55
|
-
flexRender(
|
|
56
|
-
header.column.columnDef.header,
|
|
57
|
-
header.getContext()
|
|
58
|
-
)
|
|
50
|
+
flexRender(columnDef.header, getContext())
|
|
59
51
|
)}
|
|
60
52
|
</TableCell>
|
|
61
53
|
);
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Column, RowData, Table } from "@tanstack/react-table";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Determines if the column sorting interaction should be disabled.
|
|
5
|
+
* The sort label is disabled under the following conditions:
|
|
6
|
+
* - The table is in single-sort mode, and is grouped, and the grouped column is already sorted.
|
|
7
|
+
* When multi-sort mode is enabled or the table is not grouped, the sort label remains enabled.
|
|
8
|
+
* @param table - Table.
|
|
9
|
+
* @returns `true` if the sort label should be disabled; otherwise, `false`.
|
|
10
|
+
*/
|
|
11
|
+
export function isSortDisabled<T extends RowData>(table: Table<T>): boolean {
|
|
12
|
+
const {
|
|
13
|
+
getColumn,
|
|
14
|
+
getState,
|
|
15
|
+
options: { enableMultiSort },
|
|
16
|
+
} = table;
|
|
17
|
+
const { grouping } = getState();
|
|
18
|
+
// Multi-sort is enabled - sorting is always enabled.
|
|
19
|
+
if (enableMultiSort) return false;
|
|
20
|
+
// Table is not grouped - sorting is always enabled.
|
|
21
|
+
if (grouping.length === 0) return false;
|
|
22
|
+
// In single-sort mode, check if the grouped column is already sorted.
|
|
23
|
+
const groupedColumn = getColumn(grouping[0]); // Grouping state currently only supports single-column grouping.
|
|
24
|
+
return Boolean(groupedColumn?.getIsSorted());
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Checks whether a column in a table can be sorted.
|
|
29
|
+
* A column is sortable if both table sorting interactions are enabled
|
|
30
|
+
* and the column itself is marked as sortable.
|
|
31
|
+
* @param table - Table.
|
|
32
|
+
* @param column - Column.
|
|
33
|
+
* @returns {boolean} `true` if the column can be sorted; otherwise, `false`.
|
|
34
|
+
*/
|
|
35
|
+
export function shouldSortColumn<T extends RowData>(
|
|
36
|
+
table: Table<T>,
|
|
37
|
+
column: Column<T>
|
|
38
|
+
): boolean {
|
|
39
|
+
const { enableSortingInteraction } = table.options;
|
|
40
|
+
const canSort = column.getCanSort();
|
|
41
|
+
return Boolean(enableSortingInteraction && canSort);
|
|
42
|
+
}
|
|
@@ -1,18 +1,35 @@
|
|
|
1
1
|
import { css } from "@emotion/react";
|
|
2
2
|
import styled from "@emotion/styled";
|
|
3
3
|
import { TableRow as MTableRow } from "@mui/material";
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
primaryLightest,
|
|
6
|
+
smokeLightest,
|
|
7
|
+
} from "../../../../styles/common/mixins/colors";
|
|
8
|
+
import { textBodySmall500 } from "../../../../styles/common/mixins/fonts";
|
|
5
9
|
|
|
6
10
|
interface Props {
|
|
11
|
+
isGrouped?: boolean;
|
|
7
12
|
isPreview?: boolean;
|
|
8
13
|
}
|
|
9
14
|
|
|
10
15
|
export const TableRow = styled(MTableRow, {
|
|
11
|
-
shouldForwardProp: (prop) => prop !== "isPreview",
|
|
16
|
+
shouldForwardProp: (prop) => prop !== "isPreview" && prop !== "isGrouped",
|
|
12
17
|
})<Props>`
|
|
13
18
|
&& {
|
|
14
19
|
transition: background-color 300ms ease-in;
|
|
15
20
|
|
|
21
|
+
${(props) =>
|
|
22
|
+
props.isGrouped &&
|
|
23
|
+
css`
|
|
24
|
+
background-color: ${smokeLightest(props)};
|
|
25
|
+
|
|
26
|
+
td {
|
|
27
|
+
${textBodySmall500(props)};
|
|
28
|
+
background-color: inherit;
|
|
29
|
+
grid-column: 1 / -1;
|
|
30
|
+
}
|
|
31
|
+
`}
|
|
32
|
+
|
|
16
33
|
${(props) =>
|
|
17
34
|
props.isPreview &&
|
|
18
35
|
css`
|
package/src/components/Table/components/TableRows/components/CollapsableRows/collapsableRows.tsx
CHANGED
|
@@ -4,24 +4,29 @@ import React, { Fragment } from "react";
|
|
|
4
4
|
import { isCollapsableRowDisabled } from "../../../../common/utils";
|
|
5
5
|
import { CollapsableCell } from "../../../TableCell/components/CollapsableCell/collapsableCell";
|
|
6
6
|
import { TableRow } from "../../../TableRow/tableRow.styles";
|
|
7
|
+
import { useCollapsableRows } from "./hook";
|
|
7
8
|
|
|
8
9
|
export interface CollapsableRowsProps<T extends RowData> {
|
|
10
|
+
rows: Row<T>[];
|
|
9
11
|
tableInstance: Table<T>;
|
|
10
12
|
virtualizer: Virtualizer<Window, Element>;
|
|
11
13
|
}
|
|
12
14
|
|
|
13
15
|
export const CollapsableRows = <T extends RowData>({
|
|
16
|
+
rows,
|
|
14
17
|
tableInstance,
|
|
15
18
|
virtualizer,
|
|
16
19
|
}: CollapsableRowsProps<T>): JSX.Element => {
|
|
17
|
-
const {
|
|
18
|
-
const {
|
|
20
|
+
const { getState } = tableInstance;
|
|
21
|
+
const { grouping } = getState();
|
|
19
22
|
const virtualItems = virtualizer.getVirtualItems();
|
|
23
|
+
useCollapsableRows(tableInstance);
|
|
20
24
|
return (
|
|
21
25
|
<Fragment>
|
|
22
26
|
{virtualItems.map((virtualRow) => {
|
|
23
27
|
const row = rows[virtualRow.index] as Row<T>;
|
|
24
28
|
const { getIsPreview } = row;
|
|
29
|
+
if (grouping.length > 0 && row.depth > 0) return null; // TODO(cc) hide sub rows -- sub-rows are within collapsed content -- UI TBD.
|
|
25
30
|
return (
|
|
26
31
|
<TableRow
|
|
27
32
|
key={row.id}
|
|
@@ -32,6 +37,7 @@ export const CollapsableRows = <T extends RowData>({
|
|
|
32
37
|
<CollapsableCell
|
|
33
38
|
isDisabled={isCollapsableRowDisabled(tableInstance)}
|
|
34
39
|
row={row}
|
|
40
|
+
virtualizer={virtualizer}
|
|
35
41
|
/>
|
|
36
42
|
</TableRow>
|
|
37
43
|
);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { RowData, Table } from "@tanstack/react-table";
|
|
2
|
+
import { useEffect } from "react";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Hook to manage the expanded row state during viewport transitions (e.g., desktop to mobile and vice versa).
|
|
6
|
+
* Designed for use with the `CollapsableRows` component, where row expansion is a work in progress for desktop viewports.
|
|
7
|
+
* This hook ensures that all rows are collapsed when transitioning from desktop to mobile (when `CollapsableRows` component is mounted).
|
|
8
|
+
* It also resets the expanded row state when transitioning back to desktop (when the `CollapsableRows` component is unmounted).
|
|
9
|
+
* @param table - Table.
|
|
10
|
+
*/
|
|
11
|
+
export function useCollapsableRows<T extends RowData>(table: Table<T>): void {
|
|
12
|
+
const { resetExpanded, toggleAllRowsExpanded } = table;
|
|
13
|
+
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
toggleAllRowsExpanded(false);
|
|
16
|
+
return (): void => {
|
|
17
|
+
resetExpanded();
|
|
18
|
+
};
|
|
19
|
+
}, [resetExpanded, toggleAllRowsExpanded]);
|
|
20
|
+
}
|