@navikt/ds-react 8.10.3 → 8.10.4
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/cjs/action-menu/ActionMenu.js +1 -1
- package/cjs/action-menu/ActionMenu.js.map +1 -1
- package/cjs/data/stories/Data.test-data.d.ts +24 -0
- package/cjs/data/stories/Data.test-data.js +1616 -0
- package/cjs/data/stories/Data.test-data.js.map +1 -0
- package/cjs/data/table/column-header/DataTableColumnHeader.d.ts +4 -1
- package/cjs/data/table/column-header/DataTableColumnHeader.js +2 -2
- package/cjs/data/table/column-header/DataTableColumnHeader.js.map +1 -1
- package/cjs/data/table/column-header/useTableColumnResize.d.ts +21 -18
- package/cjs/data/table/column-header/useTableColumnResize.js +7 -25
- package/cjs/data/table/column-header/useTableColumnResize.js.map +1 -1
- package/cjs/data/table/details-panel-row/DataTableDetailsPanelRow.d.ts +6 -0
- package/cjs/data/table/details-panel-row/DataTableDetailsPanelRow.js +32 -0
- package/cjs/data/table/details-panel-row/DataTableDetailsPanelRow.js.map +1 -0
- package/cjs/data/table/helpers/collectTableRowEntries.d.ts +4 -4
- package/cjs/data/table/helpers/collectTableRowEntries.js +6 -7
- package/cjs/data/table/helpers/collectTableRowEntries.js.map +1 -1
- package/cjs/data/table/hooks/useColumnOptions.js +18 -5
- package/cjs/data/table/hooks/useColumnOptions.js.map +1 -1
- package/cjs/data/table/hooks/useTableDetailsPanel.d.ts +62 -0
- package/cjs/data/table/hooks/{useTableExpansion.js → useTableDetailsPanel.js} +20 -19
- package/cjs/data/table/hooks/useTableDetailsPanel.js.map +1 -0
- package/cjs/data/table/hooks/useTableItems.d.ts +13 -16
- package/cjs/data/table/hooks/useTableItems.js +9 -8
- package/cjs/data/table/hooks/useTableItems.js.map +1 -1
- package/cjs/data/table/hooks/useTableSelection.d.ts +4 -2
- package/cjs/data/table/hooks/useTableSelection.js +6 -1
- package/cjs/data/table/hooks/useTableSelection.js.map +1 -1
- package/cjs/data/table/index.d.ts +1 -2
- package/cjs/data/table/index.js +22 -12
- package/cjs/data/table/index.js.map +1 -1
- package/cjs/data/table/root/DataTable.types.d.ts +7 -6
- package/cjs/data/table/root/DataTableRoot.context.d.ts +5 -1
- package/cjs/data/table/root/DataTableRoot.context.js.map +1 -1
- package/cjs/data/table/root/DataTableRoot.d.ts +79 -115
- package/cjs/data/table/root/DataTableRoot.js +167 -38
- package/cjs/data/table/root/DataTableRoot.js.map +1 -1
- package/cjs/data/table/root/DataTableRoot.legacy.d.ts +177 -0
- package/cjs/data/table/root/DataTableRoot.legacy.js +104 -0
- package/cjs/data/table/root/DataTableRoot.legacy.js.map +1 -0
- package/cjs/data/table/sub-row-toggle/DataTableSubRowToggle.d.ts +6 -0
- package/cjs/data/table/sub-row-toggle/DataTableSubRowToggle.js +21 -0
- package/cjs/data/table/sub-row-toggle/DataTableSubRowToggle.js.map +1 -0
- package/cjs/data/table/tr/DataTableTr.js +11 -11
- package/cjs/data/table/tr/DataTableTr.js.map +1 -1
- package/cjs/utils/components/dismissablelayer/DismissableLayer.js +1 -1
- package/cjs/utils/components/dismissablelayer/DismissableLayer.js.map +1 -1
- package/cjs/utils/components/floating/Floating.d.ts +16 -1
- package/cjs/utils/components/floating/Floating.js +50 -13
- package/cjs/utils/components/floating/Floating.js.map +1 -1
- package/cjs/utils/components/floating-menu/Menu.js +1 -1
- package/cjs/utils/components/floating-menu/Menu.js.map +1 -1
- package/cjs/utils/helpers/create-strict-context.js +1 -1
- package/cjs/utils/helpers/create-strict-context.js.map +1 -1
- package/cjs/utils/hooks/useControllableState.d.ts +5 -5
- package/cjs/utils/hooks/useControllableState.js.map +1 -1
- package/cjs/utils/hooks/useValueAsRef.js +1 -1
- package/cjs/utils/hooks/useValueAsRef.js.map +1 -1
- package/cjs/utils-external/hooks/useId.js +1 -1
- package/cjs/utils-external/hooks/useId.js.map +1 -1
- package/esm/action-menu/ActionMenu.js +1 -1
- package/esm/action-menu/ActionMenu.js.map +1 -1
- package/esm/data/stories/Data.test-data.d.ts +24 -0
- package/esm/data/stories/Data.test-data.js +1607 -0
- package/esm/data/stories/Data.test-data.js.map +1 -0
- package/esm/data/table/column-header/DataTableColumnHeader.d.ts +4 -1
- package/esm/data/table/column-header/DataTableColumnHeader.js +2 -2
- package/esm/data/table/column-header/DataTableColumnHeader.js.map +1 -1
- package/esm/data/table/column-header/useTableColumnResize.d.ts +21 -18
- package/esm/data/table/column-header/useTableColumnResize.js +7 -25
- package/esm/data/table/column-header/useTableColumnResize.js.map +1 -1
- package/esm/data/table/details-panel-row/DataTableDetailsPanelRow.d.ts +6 -0
- package/esm/data/table/details-panel-row/DataTableDetailsPanelRow.js +27 -0
- package/esm/data/table/details-panel-row/DataTableDetailsPanelRow.js.map +1 -0
- package/esm/data/table/helpers/collectTableRowEntries.d.ts +4 -4
- package/esm/data/table/helpers/collectTableRowEntries.js +6 -7
- package/esm/data/table/helpers/collectTableRowEntries.js.map +1 -1
- package/esm/data/table/hooks/useColumnOptions.js +18 -5
- package/esm/data/table/hooks/useColumnOptions.js.map +1 -1
- package/esm/data/table/hooks/useTableDetailsPanel.d.ts +62 -0
- package/esm/data/table/hooks/{useTableExpansion.js → useTableDetailsPanel.js} +17 -16
- package/esm/data/table/hooks/useTableDetailsPanel.js.map +1 -0
- package/esm/data/table/hooks/useTableItems.d.ts +13 -16
- package/esm/data/table/hooks/useTableItems.js +9 -8
- package/esm/data/table/hooks/useTableItems.js.map +1 -1
- package/esm/data/table/hooks/useTableSelection.d.ts +4 -2
- package/esm/data/table/hooks/useTableSelection.js +6 -1
- package/esm/data/table/hooks/useTableSelection.js.map +1 -1
- package/esm/data/table/index.d.ts +1 -2
- package/esm/data/table/index.js +21 -1
- package/esm/data/table/index.js.map +1 -1
- package/esm/data/table/root/DataTable.types.d.ts +7 -6
- package/esm/data/table/root/DataTableRoot.context.d.ts +5 -1
- package/esm/data/table/root/DataTableRoot.context.js.map +1 -1
- package/esm/data/table/root/DataTableRoot.d.ts +79 -115
- package/esm/data/table/root/DataTableRoot.js +174 -36
- package/esm/data/table/root/DataTableRoot.js.map +1 -1
- package/esm/data/table/root/DataTableRoot.legacy.d.ts +177 -0
- package/esm/data/table/root/DataTableRoot.legacy.js +59 -0
- package/esm/data/table/root/DataTableRoot.legacy.js.map +1 -0
- package/esm/data/table/sub-row-toggle/DataTableSubRowToggle.d.ts +6 -0
- package/esm/data/table/sub-row-toggle/DataTableSubRowToggle.js +16 -0
- package/esm/data/table/sub-row-toggle/DataTableSubRowToggle.js.map +1 -0
- package/esm/data/table/tr/DataTableTr.js +11 -11
- package/esm/data/table/tr/DataTableTr.js.map +1 -1
- package/esm/utils/components/dismissablelayer/DismissableLayer.js +1 -1
- package/esm/utils/components/dismissablelayer/DismissableLayer.js.map +1 -1
- package/esm/utils/components/floating/Floating.d.ts +16 -1
- package/esm/utils/components/floating/Floating.js +48 -13
- package/esm/utils/components/floating/Floating.js.map +1 -1
- package/esm/utils/components/floating-menu/Menu.js +2 -2
- package/esm/utils/components/floating-menu/Menu.js.map +1 -1
- package/esm/utils/helpers/create-strict-context.js +1 -1
- package/esm/utils/helpers/create-strict-context.js.map +1 -1
- package/esm/utils/hooks/useControllableState.d.ts +5 -5
- package/esm/utils/hooks/useControllableState.js.map +1 -1
- package/esm/utils/hooks/useValueAsRef.js +1 -1
- package/esm/utils/hooks/useValueAsRef.js.map +1 -1
- package/esm/utils-external/hooks/useId.js +1 -1
- package/esm/utils-external/hooks/useId.js.map +1 -1
- package/package.json +3 -3
- package/src/action-menu/ActionMenu.tsx +1 -1
- package/src/data/stories/Data.test-data.tsx +1703 -0
- package/src/data/table/column-header/DataTableColumnHeader.tsx +6 -6
- package/src/data/table/column-header/useTableColumnResize.ts +29 -44
- package/src/data/table/details-panel-row/DataTableDetailsPanelRow.tsx +53 -0
- package/src/data/table/helpers/collectTableRowEntries.ts +10 -18
- package/src/data/table/hooks/__tests__/useTableItems.test.ts +14 -7
- package/src/data/table/hooks/__tests__/useTableSelection.test.ts +57 -44
- package/src/data/table/hooks/useColumnOptions.ts +19 -5
- package/src/data/table/hooks/{useTableExpansion.tsx → useTableDetailsPanel.tsx} +81 -45
- package/src/data/table/hooks/useTableItems.ts +27 -36
- package/src/data/table/hooks/useTableSelection.ts +17 -6
- package/src/data/table/index.tsx +5 -3
- package/src/data/table/root/DataTable.types.ts +20 -6
- package/src/data/table/root/DataTableRoot.context.ts +5 -1
- package/src/data/table/root/DataTableRoot.legacy.tsx +297 -0
- package/src/data/table/root/DataTableRoot.tsx +482 -217
- package/src/data/table/sub-row-toggle/DataTableSubRowToggle.tsx +39 -0
- package/src/data/table/tr/DataTableTr.tsx +14 -13
- package/src/utils/components/dismissablelayer/DismissableLayer.tsx +1 -1
- package/src/utils/components/floating/Floating.tsx +56 -13
- package/src/utils/components/floating-menu/Menu.tsx +4 -1
- package/src/utils/helpers/create-strict-context.tsx +1 -1
- package/src/utils/hooks/useControllableState.ts +11 -8
- package/src/utils/hooks/useValueAsRef.ts +1 -1
- package/src/utils-external/hooks/useId.ts +1 -1
- package/cjs/data/table/hooks/useTableExpansion.d.ts +0 -27
- package/cjs/data/table/hooks/useTableExpansion.js.map +0 -1
- package/cjs/data/table/root/DataTableAuto.d.ts +0 -182
- package/cjs/data/table/root/DataTableAuto.js +0 -206
- package/cjs/data/table/root/DataTableAuto.js.map +0 -1
- package/esm/data/table/hooks/useTableExpansion.d.ts +0 -27
- package/esm/data/table/hooks/useTableExpansion.js.map +0 -1
- package/esm/data/table/root/DataTableAuto.d.ts +0 -182
- package/esm/data/table/root/DataTableAuto.js +0 -170
- package/esm/data/table/root/DataTableAuto.js.map +0 -1
- package/src/data/table/root/DataTableAuto.test.tsx +0 -244
- package/src/data/table/root/DataTableAuto.tsx +0 -612
|
@@ -3,7 +3,49 @@ import { createStrictContext } from "../../../utils/helpers";
|
|
|
3
3
|
import { useControllableState } from "../../../utils/hooks";
|
|
4
4
|
import { useTableItemsContext } from "./useTableItems";
|
|
5
5
|
|
|
6
|
-
type
|
|
6
|
+
type DetailsPanelProps<T> = {
|
|
7
|
+
/**
|
|
8
|
+
* Renders a details panel below the row when expanded.
|
|
9
|
+
* When provided, an expand toggle column is added automatically.
|
|
10
|
+
*/
|
|
11
|
+
getContent?: (rowData: T) => React.ReactNode;
|
|
12
|
+
/**
|
|
13
|
+
* Determines whether a row can be expanded to show details panel content.
|
|
14
|
+
* @default () => true
|
|
15
|
+
*/
|
|
16
|
+
isRowExpandable?: (rowData: T) => boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Controlled list of expanded row IDs.
|
|
19
|
+
* Use with `onDetailsPanelChange` for controlled usage, or `defaultDetailsPanelRowIds` for uncontrolled.
|
|
20
|
+
*/
|
|
21
|
+
expandedRowIds?: (string | number)[];
|
|
22
|
+
/**
|
|
23
|
+
* Initial list of expanded row IDs for uncontrolled usage.
|
|
24
|
+
* @default []
|
|
25
|
+
*/
|
|
26
|
+
defaultExpandedRowIds?: (string | number)[];
|
|
27
|
+
/**
|
|
28
|
+
* Called when the list of expanded row IDs changes.
|
|
29
|
+
*
|
|
30
|
+
*
|
|
31
|
+
* TODO:
|
|
32
|
+
* - Docs: This pattern is called "Master / Detail" in general terms
|
|
33
|
+
*/
|
|
34
|
+
onExpandedRowIdsChange?: (ids: (string | number)[]) => void;
|
|
35
|
+
/**
|
|
36
|
+
* Returns the height (in px) or `"auto"` for a row's details panel.
|
|
37
|
+
* When a number is returned, the panel scrolls within that fixed height.
|
|
38
|
+
* @default "auto"
|
|
39
|
+
*/
|
|
40
|
+
getHeight?: (rowData: T) => number | "auto";
|
|
41
|
+
/**
|
|
42
|
+
* Shows an expand-all toggle button in the expand column header.
|
|
43
|
+
* @default false
|
|
44
|
+
*/
|
|
45
|
+
showExpandAll?: boolean;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
type DataTableDetailsPanelContextT = {
|
|
7
49
|
isExpanded: (id: string | number) => boolean;
|
|
8
50
|
isDetailsPanelExpandable: (id: string | number) => boolean;
|
|
9
51
|
toggleExpansion: (id: string | number) => void;
|
|
@@ -16,42 +58,32 @@ type DataTableExpansionContextT = {
|
|
|
16
58
|
};
|
|
17
59
|
|
|
18
60
|
const {
|
|
19
|
-
Provider:
|
|
20
|
-
useContext:
|
|
21
|
-
} = createStrictContext<
|
|
22
|
-
name: "
|
|
61
|
+
Provider: DataTableDetailsPanelContextProvider,
|
|
62
|
+
useContext: useDataTableDetailsPanel,
|
|
63
|
+
} = createStrictContext<DataTableDetailsPanelContextT>({
|
|
64
|
+
name: "DataTableDetailsPanelContext",
|
|
23
65
|
errorMessage:
|
|
24
|
-
"
|
|
66
|
+
"useDataTableDetailsPanel must be used within a DataTableDetailsPanelProvider.",
|
|
25
67
|
});
|
|
26
68
|
|
|
27
|
-
|
|
28
|
-
detailsPanelRowIds?: (string | number)[];
|
|
29
|
-
defaultDetailsPanelRowIds?: (string | number)[];
|
|
30
|
-
onDetailsPanelChange?: (ids: (string | number)[]) => void;
|
|
31
|
-
getDetailsPanelContent?: (row: T) => React.ReactNode;
|
|
32
|
-
isDetailsPanelExpandable?: (rowData: T) => boolean;
|
|
33
|
-
getDetailsPanelHeight?: (row: T) => number | "auto";
|
|
34
|
-
showExpandAll?: boolean;
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
function getDataTableExpansionId(tableId: string, rowId: string | number) {
|
|
38
|
-
return `${tableId}-expansion-${rowId}`;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function DataTableExpansionProvider<T>({
|
|
69
|
+
function DataTableDetailsPanelProvider<T>({
|
|
42
70
|
children,
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
71
|
+
detailsPanel = {},
|
|
72
|
+
}: { detailsPanel?: DetailsPanelProps<T> } & { children: React.ReactNode }) {
|
|
73
|
+
const {
|
|
74
|
+
expandedRowIds,
|
|
75
|
+
defaultExpandedRowIds = [],
|
|
76
|
+
onExpandedRowIdsChange,
|
|
77
|
+
getContent,
|
|
78
|
+
isRowExpandable,
|
|
79
|
+
getHeight,
|
|
80
|
+
showExpandAll = false,
|
|
81
|
+
} = detailsPanel;
|
|
82
|
+
|
|
51
83
|
const [expandedIds, setExpandedIds] = useControllableState({
|
|
52
|
-
value:
|
|
53
|
-
defaultValue:
|
|
54
|
-
onChange:
|
|
84
|
+
value: expandedRowIds,
|
|
85
|
+
defaultValue: defaultExpandedRowIds,
|
|
86
|
+
onChange: onExpandedRowIdsChange,
|
|
55
87
|
});
|
|
56
88
|
|
|
57
89
|
/* TODO: False is just fallback until auto and root is merged */
|
|
@@ -62,7 +94,7 @@ function DataTableExpansionProvider<T>({
|
|
|
62
94
|
};
|
|
63
95
|
|
|
64
96
|
const expandableIds = React.useMemo(() => {
|
|
65
|
-
if (!
|
|
97
|
+
if (!getContent) {
|
|
66
98
|
return new Set<string | number>();
|
|
67
99
|
}
|
|
68
100
|
|
|
@@ -74,13 +106,13 @@ function DataTableExpansionProvider<T>({
|
|
|
74
106
|
continue;
|
|
75
107
|
}
|
|
76
108
|
|
|
77
|
-
if (!
|
|
109
|
+
if (!isRowExpandable || isRowExpandable(rowData)) {
|
|
78
110
|
ids.add(id);
|
|
79
111
|
}
|
|
80
112
|
}
|
|
81
113
|
|
|
82
114
|
return ids;
|
|
83
|
-
}, [
|
|
115
|
+
}, [getContent, isRowExpandable, itemDetails]);
|
|
84
116
|
|
|
85
117
|
const isDetailsPanelExpandableById = useCallback(
|
|
86
118
|
(id: string | number) => expandableIds.has(id),
|
|
@@ -117,30 +149,34 @@ function DataTableExpansionProvider<T>({
|
|
|
117
149
|
}, [expandableIds, isAllExpanded, setExpandedIds]);
|
|
118
150
|
|
|
119
151
|
return (
|
|
120
|
-
<
|
|
152
|
+
<DataTableDetailsPanelContextProvider
|
|
121
153
|
isExpanded={isExpanded}
|
|
122
154
|
isDetailsPanelExpandable={isDetailsPanelExpandableById}
|
|
123
155
|
toggleExpansion={toggleExpansion}
|
|
124
156
|
toggleAll={toggleAll}
|
|
125
157
|
isAllExpanded={isAllExpanded}
|
|
126
158
|
getDetailsPanelContent={
|
|
127
|
-
|
|
128
|
-
| ((row: unknown) => React.ReactNode)
|
|
129
|
-
| undefined
|
|
159
|
+
getContent as ((row: unknown) => React.ReactNode) | undefined
|
|
130
160
|
}
|
|
131
161
|
getDetailsPanelHeight={
|
|
132
|
-
|
|
162
|
+
getHeight as ((row: unknown) => number | "auto") | undefined
|
|
133
163
|
}
|
|
134
164
|
showExpandAll={showExpandAll}
|
|
135
|
-
enableDetailsPanel={!!
|
|
165
|
+
enableDetailsPanel={!!getContent}
|
|
136
166
|
>
|
|
137
167
|
{children}
|
|
138
|
-
</
|
|
168
|
+
</DataTableDetailsPanelContextProvider>
|
|
139
169
|
);
|
|
140
170
|
}
|
|
141
171
|
|
|
172
|
+
function getDataTableDetailsPanelId(tableId: string, rowId: string | number) {
|
|
173
|
+
return `${tableId}-expansion-${rowId}`;
|
|
174
|
+
}
|
|
175
|
+
|
|
142
176
|
export {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
177
|
+
DataTableDetailsPanelProvider,
|
|
178
|
+
getDataTableDetailsPanelId,
|
|
179
|
+
useDataTableDetailsPanel,
|
|
146
180
|
};
|
|
181
|
+
|
|
182
|
+
export type { DetailsPanelProps };
|
|
@@ -7,27 +7,18 @@ import {
|
|
|
7
7
|
collectTableRowEntries,
|
|
8
8
|
} from "../helpers/collectTableRowEntries";
|
|
9
9
|
|
|
10
|
+
type SubRowsProps<T> = {
|
|
11
|
+
getRows?: (rowData: T) => T[];
|
|
12
|
+
expandedRowIds?: (string | number)[];
|
|
13
|
+
defaultExpandedRowIds?: (string | number)[];
|
|
14
|
+
isRowExpandable?: (rowData: T) => boolean;
|
|
15
|
+
onExpandedRowIdsChange?: (ids: (string | number)[]) => void;
|
|
16
|
+
};
|
|
17
|
+
|
|
10
18
|
type UseTableItemsArgs<T> = {
|
|
11
19
|
items: T[];
|
|
12
|
-
getRowId
|
|
13
|
-
|
|
14
|
-
* Master - Detail pattern props
|
|
15
|
-
*/
|
|
16
|
-
/* expandedDetailsPanelIds?: (string | number)[];
|
|
17
|
-
defaultExpandedDetailsPanelIds?: (string | number)[];
|
|
18
|
-
isDetailsPanelExpandable?: (rowData: T) => boolean;
|
|
19
|
-
onDetailsPanelChange?: (ids: (string | number)[]) => void;
|
|
20
|
-
|
|
21
|
-
getDetailsPanelHeight?: (row: T) => number | "auto";
|
|
22
|
-
getDetailsPanelContent?: (row: T) => React.ReactNode; */
|
|
23
|
-
/**
|
|
24
|
-
* Expanded/Nested rows pattern props
|
|
25
|
-
*/
|
|
26
|
-
getSubRows?: (rowData: T) => T[];
|
|
27
|
-
expandedSubRowIds?: (string | number)[];
|
|
28
|
-
defaultExpandedSubRowIds?: (string | number)[];
|
|
29
|
-
isSubRowExpandable?: (rowData: T) => boolean;
|
|
30
|
-
onExpandedSubRowIdsChange?: (ids: (string | number)[]) => void;
|
|
20
|
+
getRowId: (rowData: T, index: number) => TableRowEntryId;
|
|
21
|
+
subRows?: SubRowsProps<T>;
|
|
31
22
|
};
|
|
32
23
|
|
|
33
24
|
type useTableItemsReturn<T> = {
|
|
@@ -37,26 +28,26 @@ type useTableItemsReturn<T> = {
|
|
|
37
28
|
visibleRowIds: TableRowEntryId[];
|
|
38
29
|
/** Direct child ids for each row, used to traverse selection groups lazily. */
|
|
39
30
|
childRowIdsById: Map<TableRowEntryId, TableRowEntryId[]>;
|
|
40
|
-
|
|
31
|
+
onExpandedRowIdsChange: (id: string | number) => void;
|
|
41
32
|
isSubRowExpanded: (id: string | number) => boolean;
|
|
42
33
|
};
|
|
43
34
|
|
|
44
35
|
function useTableItems<T>(args: UseTableItemsArgs<T>): useTableItemsReturn<T> {
|
|
36
|
+
const { items, subRows = {}, getRowId } = args;
|
|
37
|
+
|
|
45
38
|
const {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
isSubRowExpandable,
|
|
53
|
-
} = args;
|
|
39
|
+
expandedRowIds,
|
|
40
|
+
defaultExpandedRowIds,
|
|
41
|
+
getRows,
|
|
42
|
+
onExpandedRowIdsChange,
|
|
43
|
+
isRowExpandable,
|
|
44
|
+
} = subRows;
|
|
54
45
|
|
|
55
46
|
const [nestedSubRowsExpandedIds, setNestedSubRowsExpandedIds] =
|
|
56
47
|
useControllableState({
|
|
57
|
-
value:
|
|
58
|
-
defaultValue:
|
|
59
|
-
onChange:
|
|
48
|
+
value: expandedRowIds,
|
|
49
|
+
defaultValue: defaultExpandedRowIds ?? [],
|
|
50
|
+
onChange: onExpandedRowIdsChange,
|
|
60
51
|
});
|
|
61
52
|
|
|
62
53
|
const expandedIdsSet = useMemo(
|
|
@@ -70,8 +61,8 @@ function useTableItems<T>(args: UseTableItemsArgs<T>): useTableItemsReturn<T> {
|
|
|
70
61
|
collectTableRowEntries({
|
|
71
62
|
items,
|
|
72
63
|
getRowId,
|
|
73
|
-
|
|
74
|
-
|
|
64
|
+
getRows,
|
|
65
|
+
isRowExpandable,
|
|
75
66
|
});
|
|
76
67
|
|
|
77
68
|
const localVisibleItems: T[] = [];
|
|
@@ -109,7 +100,7 @@ function useTableItems<T>(args: UseTableItemsArgs<T>): useTableItemsReturn<T> {
|
|
|
109
100
|
childRowIdsById: _childRowIdsById,
|
|
110
101
|
itemDetails: rowEntriesMap,
|
|
111
102
|
};
|
|
112
|
-
}, [
|
|
103
|
+
}, [getRows, items, getRowId, isRowExpandable, expandedIdsSet]);
|
|
113
104
|
|
|
114
105
|
const handleExpandedSubRowIdChange = useCallback(
|
|
115
106
|
(id: string | number) => {
|
|
@@ -127,7 +118,7 @@ function useTableItems<T>(args: UseTableItemsArgs<T>): useTableItemsReturn<T> {
|
|
|
127
118
|
itemDetails,
|
|
128
119
|
visibleRowIds,
|
|
129
120
|
childRowIdsById,
|
|
130
|
-
|
|
121
|
+
onExpandedRowIdsChange: handleExpandedSubRowIdChange,
|
|
131
122
|
isSubRowExpanded: (id: string | number) => expandedIdsSet.has(id),
|
|
132
123
|
};
|
|
133
124
|
}
|
|
@@ -143,4 +134,4 @@ const { Provider: TableItemsProvider, useContext: useTableItemsContext } =
|
|
|
143
134
|
});
|
|
144
135
|
|
|
145
136
|
export { useTableItems, TableItemsProvider, useTableItemsContext };
|
|
146
|
-
export type { ItemDetail };
|
|
137
|
+
export type { ItemDetail, SubRowsProps };
|
|
@@ -9,7 +9,8 @@ import type {
|
|
|
9
9
|
TableSelection,
|
|
10
10
|
} from "../helpers/selection/selection.types";
|
|
11
11
|
|
|
12
|
-
type UseTableSelectionArgs =
|
|
12
|
+
type UseTableSelectionArgs = {
|
|
13
|
+
selection?: SelectionProps;
|
|
13
14
|
/* Visible rows manage the header checkbox state and render selection cells. */
|
|
14
15
|
visibleRowIds: (string | number)[];
|
|
15
16
|
/* Direct child ids let selection walk nested rows lazily. */
|
|
@@ -19,17 +20,23 @@ type UseTableSelectionArgs = SelectionProps & {
|
|
|
19
20
|
type UseTableSelectionReturn = {
|
|
20
21
|
selection: TableSelection;
|
|
21
22
|
renderSelection: boolean;
|
|
23
|
+
disableRowSelectionOnClick: boolean;
|
|
22
24
|
};
|
|
23
25
|
|
|
24
26
|
function useTableSelection({
|
|
25
|
-
|
|
26
|
-
defaultSelectedKeys,
|
|
27
|
-
selectedKeys: selectedKeysProp,
|
|
28
|
-
onSelectionChange,
|
|
29
|
-
disabledSelectionKeys = [],
|
|
27
|
+
selection = {},
|
|
30
28
|
visibleRowIds = [],
|
|
31
29
|
childRowIdsById,
|
|
32
30
|
}: UseTableSelectionArgs): UseTableSelectionReturn {
|
|
31
|
+
const {
|
|
32
|
+
selectionMode = "none",
|
|
33
|
+
defaultSelectedKeys,
|
|
34
|
+
selectedKeys: selectedKeysProp,
|
|
35
|
+
onSelectionChange,
|
|
36
|
+
disabledSelectionKeys = [],
|
|
37
|
+
disableRowSelectionOnClick = false,
|
|
38
|
+
} = selection;
|
|
39
|
+
|
|
33
40
|
const radioGroupName = useId();
|
|
34
41
|
|
|
35
42
|
const [selectedKeys, setSelectedKeys] = useControllableState<SelectedKeysT>({
|
|
@@ -59,6 +66,7 @@ function useTableSelection({
|
|
|
59
66
|
...baseSelection,
|
|
60
67
|
selectedKeys: [],
|
|
61
68
|
},
|
|
69
|
+
disableRowSelectionOnClick,
|
|
62
70
|
renderSelection: false,
|
|
63
71
|
};
|
|
64
72
|
}
|
|
@@ -75,6 +83,7 @@ function useTableSelection({
|
|
|
75
83
|
name: radioGroupName,
|
|
76
84
|
}),
|
|
77
85
|
},
|
|
86
|
+
disableRowSelectionOnClick,
|
|
78
87
|
renderSelection: visibleRowIds.length !== 0,
|
|
79
88
|
};
|
|
80
89
|
}
|
|
@@ -92,6 +101,7 @@ function useTableSelection({
|
|
|
92
101
|
childRowIdsById,
|
|
93
102
|
}),
|
|
94
103
|
},
|
|
104
|
+
disableRowSelectionOnClick,
|
|
95
105
|
renderSelection: visibleRowIds.length !== 0,
|
|
96
106
|
};
|
|
97
107
|
}
|
|
@@ -106,6 +116,7 @@ const noSelectionState: UseTableSelectionReturn = {
|
|
|
106
116
|
disabledSelectionKeys: [],
|
|
107
117
|
isRowSelected: () => false,
|
|
108
118
|
},
|
|
119
|
+
disableRowSelectionOnClick: false,
|
|
109
120
|
renderSelection: false,
|
|
110
121
|
};
|
|
111
122
|
|
package/src/data/table/index.tsx
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
export {
|
|
2
|
+
/* export {
|
|
3
3
|
default as DataTable,
|
|
4
4
|
DataTableCaption,
|
|
5
5
|
DataTableThead,
|
|
@@ -8,7 +8,7 @@ export {
|
|
|
8
8
|
DataTableTh,
|
|
9
9
|
DataTableTd,
|
|
10
10
|
DataTableTfoot,
|
|
11
|
-
} from "./root/DataTableRoot";
|
|
11
|
+
} from "./root/DataTableRoot.legacy";
|
|
12
12
|
export type {
|
|
13
13
|
DataTableProps,
|
|
14
14
|
DataTableCaptionProps,
|
|
@@ -18,4 +18,6 @@ export type {
|
|
|
18
18
|
DataTableThProps,
|
|
19
19
|
DataTableTdProps,
|
|
20
20
|
DataTableTfootProps,
|
|
21
|
-
} from "./root/DataTableRoot";
|
|
21
|
+
} from "./root/DataTableRoot.legacy"; */
|
|
22
|
+
|
|
23
|
+
export { DataTable, type DataTableProps } from "./root/DataTableRoot";
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { ResizeProps } from "../column-header/useTableColumnResize";
|
|
2
|
+
|
|
1
3
|
type SortDirection = "asc" | "desc" | "none";
|
|
2
4
|
|
|
3
5
|
/**
|
|
@@ -5,12 +7,17 @@ type SortDirection = "asc" | "desc" | "none";
|
|
|
5
7
|
* - Consider "accessorKey" or similar to allow simple column definitions without a cell function.
|
|
6
8
|
* - Add "align" property for better control over text alignment in cells.
|
|
7
9
|
*/
|
|
8
|
-
type ColumnDefinition<T
|
|
10
|
+
type ColumnDefinition<T, DetailsT = Record<string, any>> = Pick<
|
|
11
|
+
ResizeProps,
|
|
12
|
+
| "resizable"
|
|
13
|
+
| "width"
|
|
14
|
+
| "defaultWidth"
|
|
15
|
+
| "autoWidth"
|
|
16
|
+
| "minWidth"
|
|
17
|
+
| "maxWidth"
|
|
18
|
+
| "onWidthChange"
|
|
19
|
+
> & {
|
|
9
20
|
id: string;
|
|
10
|
-
width?: number | string;
|
|
11
|
-
defaultWidth?: number | string;
|
|
12
|
-
minWidth?: number | string;
|
|
13
|
-
maxWidth?: number | string;
|
|
14
21
|
/**
|
|
15
22
|
* Text alignment for cells in this column.
|
|
16
23
|
*
|
|
@@ -44,9 +51,16 @@ type ColumnDefinition<T> = {
|
|
|
44
51
|
* Use `sort` and `onSortChange` on the root component to control sort state.
|
|
45
52
|
*/
|
|
46
53
|
sortable?: boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Additional metadata that can be used for filtering or other purposes. Not used by the table itself.
|
|
56
|
+
*/
|
|
57
|
+
details?: DetailsT;
|
|
47
58
|
};
|
|
48
59
|
|
|
49
|
-
type ColumnDefinitions<T
|
|
60
|
+
type ColumnDefinitions<T, DetailsT = Record<string, any>> = ColumnDefinition<
|
|
61
|
+
T,
|
|
62
|
+
DetailsT
|
|
63
|
+
>[];
|
|
50
64
|
|
|
51
65
|
/**
|
|
52
66
|
* A single sort entry representing a column's current sort state.
|
|
@@ -14,10 +14,14 @@ type DataTableContextProps<T> = {
|
|
|
14
14
|
rowId: string | number,
|
|
15
15
|
event: React.MouseEvent<HTMLTableRowElement>,
|
|
16
16
|
) => void;
|
|
17
|
-
disableRowSelectionOnClick: boolean;
|
|
18
17
|
isLoading?: boolean;
|
|
19
18
|
showLoadingOverlay: boolean;
|
|
20
19
|
columns: UseColumnOptionsResult<T>["columns"];
|
|
20
|
+
/**
|
|
21
|
+
* Used to set exact colspan for detailsPanel, loadingState and emptyState.
|
|
22
|
+
* This is necessary to ensure that these components span the entire width of the table.
|
|
23
|
+
*/
|
|
24
|
+
fullWidthColSpan: number;
|
|
21
25
|
};
|
|
22
26
|
|
|
23
27
|
const { Provider: DataTableContextProvider, useContext: useDataTableContext } =
|