@navikt/ds-react 8.10.4 → 8.10.6
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/data/data-grid/index.d.ts +2 -0
- package/cjs/data/data-grid/index.js +7 -0
- package/cjs/data/data-grid/index.js.map +1 -0
- package/cjs/data/data-grid/root/DataGridRoot.context.d.ts +11 -0
- package/cjs/data/data-grid/root/DataGridRoot.context.js +11 -0
- package/cjs/data/data-grid/root/DataGridRoot.context.js.map +1 -0
- package/cjs/data/data-grid/root/DataGridRoot.d.ts +38 -0
- package/cjs/data/data-grid/root/DataGridRoot.js +68 -0
- package/cjs/data/data-grid/root/DataGridRoot.js.map +1 -0
- package/cjs/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js +11 -13
- package/cjs/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js.map +1 -1
- package/cjs/data/drag-and-drop/root/DragAndDrop.context.d.ts +4 -2
- package/cjs/data/drag-and-drop/root/DragAndDrop.context.js.map +1 -1
- package/cjs/data/drag-and-drop/root/DragAndDropRoot.js +44 -46
- package/cjs/data/drag-and-drop/root/DragAndDropRoot.js.map +1 -1
- package/cjs/data/drag-and-drop/types.d.ts +0 -4
- package/cjs/data/stories/Data.test-data.d.ts +2 -5
- package/cjs/data/stories/Data.test-data.js +30 -39
- package/cjs/data/stories/Data.test-data.js.map +1 -1
- package/cjs/data/table/base-cell/DataTableBaseCell.d.ts +15 -15
- package/cjs/data/table/base-cell/DataTableBaseCell.js +4 -8
- package/cjs/data/table/base-cell/DataTableBaseCell.js.map +1 -1
- package/cjs/data/table/column-header/DataTableColumnHeader.d.ts +24 -6
- package/cjs/data/table/column-header/DataTableColumnHeader.js +22 -27
- package/cjs/data/table/column-header/DataTableColumnHeader.js.map +1 -1
- package/cjs/data/table/column-header/useTableColumnResize.d.ts +19 -29
- package/cjs/data/table/column-header/useTableColumnResize.js +24 -22
- package/cjs/data/table/column-header/useTableColumnResize.js.map +1 -1
- package/cjs/data/table/details-panel-row/DataTableDetailsPanelRow.d.ts +1 -1
- package/cjs/data/table/details-panel-row/DataTableDetailsPanelRow.js +2 -2
- package/cjs/data/table/details-panel-row/DataTableDetailsPanelRow.js.map +1 -1
- package/cjs/data/table/helpers/collectTableRowEntries.d.ts +9 -7
- package/cjs/data/table/helpers/collectTableRowEntries.js +18 -10
- package/cjs/data/table/helpers/collectTableRowEntries.js.map +1 -1
- package/cjs/data/table/helpers/selection/getMultipleSelectProps.d.ts +13 -11
- package/cjs/data/table/helpers/selection/getMultipleSelectProps.js +43 -53
- package/cjs/data/table/helpers/selection/getMultipleSelectProps.js.map +1 -1
- package/cjs/data/table/helpers/selection/getSingleSelectProps.d.ts +9 -8
- package/cjs/data/table/helpers/selection/getSingleSelectProps.js +23 -10
- package/cjs/data/table/helpers/selection/getSingleSelectProps.js.map +1 -1
- package/cjs/data/table/helpers/selection/selection.types.d.ts +19 -19
- package/cjs/data/table/helpers/selection/selection.utils.d.ts +21 -0
- package/cjs/data/table/helpers/selection/selection.utils.js +46 -0
- package/cjs/data/table/helpers/selection/selection.utils.js.map +1 -0
- package/cjs/data/table/helpers/table-focus.d.ts +0 -3
- package/cjs/data/table/helpers/table-focus.js +38 -8
- package/cjs/data/table/helpers/table-focus.js.map +1 -1
- package/cjs/data/table/hooks/useColumnOptions.d.ts +16 -5
- package/cjs/data/table/hooks/useColumnOptions.js +26 -8
- package/cjs/data/table/hooks/useColumnOptions.js.map +1 -1
- package/cjs/data/table/hooks/useGridCache.js +2 -2
- package/cjs/data/table/hooks/useGridCache.js.map +1 -1
- package/cjs/data/table/hooks/useTableDetailsPanel.d.ts +10 -13
- package/cjs/data/table/hooks/useTableDetailsPanel.js +7 -6
- package/cjs/data/table/hooks/useTableDetailsPanel.js.map +1 -1
- package/cjs/data/table/hooks/useTableItems.d.ts +31 -17
- package/cjs/data/table/hooks/useTableItems.js +10 -20
- package/cjs/data/table/hooks/useTableItems.js.map +1 -1
- package/cjs/data/table/hooks/useTableKeyboardNav.d.ts +1 -6
- package/cjs/data/table/hooks/useTableKeyboardNav.js +6 -5
- package/cjs/data/table/hooks/useTableKeyboardNav.js.map +1 -1
- package/cjs/data/table/hooks/useTableSelection.d.ts +6 -6
- package/cjs/data/table/hooks/useTableSelection.js +13 -13
- package/cjs/data/table/hooks/useTableSelection.js.map +1 -1
- package/cjs/data/table/hooks/useTableSort.d.ts +2 -2
- package/cjs/data/table/hooks/useTableSort.js +4 -5
- package/cjs/data/table/hooks/useTableSort.js.map +1 -1
- package/cjs/data/table/root/DataTable.types.d.ts +22 -13
- package/cjs/data/table/root/DataTableRoot.context.d.ts +13 -7
- package/cjs/data/table/root/DataTableRoot.context.js.map +1 -1
- package/cjs/data/table/root/DataTableRoot.d.ts +49 -72
- package/cjs/data/table/root/DataTableRoot.js +56 -72
- package/cjs/data/table/root/DataTableRoot.js.map +1 -1
- package/cjs/data/table/root/DataTableRoot.legacy.d.ts +2 -7
- package/cjs/data/table/root/DataTableRoot.legacy.js +17 -3
- package/cjs/data/table/root/DataTableRoot.legacy.js.map +1 -1
- package/cjs/data/table/sub-row-toggle/DataTableSubRowToggle.js +4 -4
- package/cjs/data/table/sub-row-toggle/DataTableSubRowToggle.js.map +1 -1
- package/cjs/data/table/tbody/DataTableTbody.js +4 -2
- package/cjs/data/table/tbody/DataTableTbody.js.map +1 -1
- package/cjs/data/table/tr/DataTableTr.d.ts +5 -3
- package/cjs/data/table/tr/DataTableTr.js +36 -23
- package/cjs/data/table/tr/DataTableTr.js.map +1 -1
- package/cjs/table/ColumnHeader.js +2 -1
- package/cjs/table/ColumnHeader.js.map +1 -1
- package/esm/data/data-grid/index.d.ts +2 -0
- package/esm/data/data-grid/index.js +3 -0
- package/esm/data/data-grid/index.js.map +1 -0
- package/esm/data/data-grid/root/DataGridRoot.context.d.ts +11 -0
- package/esm/data/data-grid/root/DataGridRoot.context.js +7 -0
- package/esm/data/data-grid/root/DataGridRoot.context.js.map +1 -0
- package/esm/data/data-grid/root/DataGridRoot.d.ts +38 -0
- package/esm/data/data-grid/root/DataGridRoot.js +32 -0
- package/esm/data/data-grid/root/DataGridRoot.js.map +1 -0
- package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js +11 -13
- package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js.map +1 -1
- package/esm/data/drag-and-drop/root/DragAndDrop.context.d.ts +4 -2
- package/esm/data/drag-and-drop/root/DragAndDrop.context.js.map +1 -1
- package/esm/data/drag-and-drop/root/DragAndDropRoot.js +44 -46
- package/esm/data/drag-and-drop/root/DragAndDropRoot.js.map +1 -1
- package/esm/data/drag-and-drop/types.d.ts +0 -4
- package/esm/data/stories/Data.test-data.d.ts +2 -5
- package/esm/data/stories/Data.test-data.js +30 -39
- package/esm/data/stories/Data.test-data.js.map +1 -1
- package/esm/data/table/base-cell/DataTableBaseCell.d.ts +15 -15
- package/esm/data/table/base-cell/DataTableBaseCell.js +4 -8
- package/esm/data/table/base-cell/DataTableBaseCell.js.map +1 -1
- package/esm/data/table/column-header/DataTableColumnHeader.d.ts +24 -6
- package/esm/data/table/column-header/DataTableColumnHeader.js +23 -28
- package/esm/data/table/column-header/DataTableColumnHeader.js.map +1 -1
- package/esm/data/table/column-header/useTableColumnResize.d.ts +19 -29
- package/esm/data/table/column-header/useTableColumnResize.js +24 -22
- package/esm/data/table/column-header/useTableColumnResize.js.map +1 -1
- package/esm/data/table/details-panel-row/DataTableDetailsPanelRow.d.ts +1 -1
- package/esm/data/table/details-panel-row/DataTableDetailsPanelRow.js +2 -2
- package/esm/data/table/details-panel-row/DataTableDetailsPanelRow.js.map +1 -1
- package/esm/data/table/helpers/collectTableRowEntries.d.ts +9 -7
- package/esm/data/table/helpers/collectTableRowEntries.js +18 -10
- package/esm/data/table/helpers/collectTableRowEntries.js.map +1 -1
- package/esm/data/table/helpers/selection/getMultipleSelectProps.d.ts +13 -11
- package/esm/data/table/helpers/selection/getMultipleSelectProps.js +43 -53
- package/esm/data/table/helpers/selection/getMultipleSelectProps.js.map +1 -1
- package/esm/data/table/helpers/selection/getSingleSelectProps.d.ts +9 -8
- package/esm/data/table/helpers/selection/getSingleSelectProps.js +23 -10
- package/esm/data/table/helpers/selection/getSingleSelectProps.js.map +1 -1
- package/esm/data/table/helpers/selection/selection.types.d.ts +19 -19
- package/esm/data/table/helpers/selection/selection.utils.d.ts +21 -0
- package/esm/data/table/helpers/selection/selection.utils.js +43 -0
- package/esm/data/table/helpers/selection/selection.utils.js.map +1 -0
- package/esm/data/table/helpers/table-focus.d.ts +0 -3
- package/esm/data/table/helpers/table-focus.js +38 -8
- package/esm/data/table/helpers/table-focus.js.map +1 -1
- package/esm/data/table/hooks/useColumnOptions.d.ts +16 -5
- package/esm/data/table/hooks/useColumnOptions.js +26 -8
- package/esm/data/table/hooks/useColumnOptions.js.map +1 -1
- package/esm/data/table/hooks/useGridCache.js +2 -2
- package/esm/data/table/hooks/useGridCache.js.map +1 -1
- package/esm/data/table/hooks/useTableDetailsPanel.d.ts +10 -13
- package/esm/data/table/hooks/useTableDetailsPanel.js +7 -6
- package/esm/data/table/hooks/useTableDetailsPanel.js.map +1 -1
- package/esm/data/table/hooks/useTableItems.d.ts +31 -17
- package/esm/data/table/hooks/useTableItems.js +11 -18
- package/esm/data/table/hooks/useTableItems.js.map +1 -1
- package/esm/data/table/hooks/useTableKeyboardNav.d.ts +1 -6
- package/esm/data/table/hooks/useTableKeyboardNav.js +7 -6
- package/esm/data/table/hooks/useTableKeyboardNav.js.map +1 -1
- package/esm/data/table/hooks/useTableSelection.d.ts +6 -6
- package/esm/data/table/hooks/useTableSelection.js +13 -13
- package/esm/data/table/hooks/useTableSelection.js.map +1 -1
- package/esm/data/table/hooks/useTableSort.d.ts +2 -2
- package/esm/data/table/hooks/useTableSort.js +4 -5
- package/esm/data/table/hooks/useTableSort.js.map +1 -1
- package/esm/data/table/root/DataTable.types.d.ts +22 -13
- package/esm/data/table/root/DataTableRoot.context.d.ts +13 -7
- package/esm/data/table/root/DataTableRoot.context.js.map +1 -1
- package/esm/data/table/root/DataTableRoot.d.ts +49 -72
- package/esm/data/table/root/DataTableRoot.js +58 -74
- package/esm/data/table/root/DataTableRoot.js.map +1 -1
- package/esm/data/table/root/DataTableRoot.legacy.d.ts +2 -7
- package/esm/data/table/root/DataTableRoot.legacy.js +17 -3
- package/esm/data/table/root/DataTableRoot.legacy.js.map +1 -1
- package/esm/data/table/sub-row-toggle/DataTableSubRowToggle.js +4 -4
- package/esm/data/table/sub-row-toggle/DataTableSubRowToggle.js.map +1 -1
- package/esm/data/table/tbody/DataTableTbody.js +4 -2
- package/esm/data/table/tbody/DataTableTbody.js.map +1 -1
- package/esm/data/table/tr/DataTableTr.d.ts +5 -3
- package/esm/data/table/tr/DataTableTr.js +35 -23
- package/esm/data/table/tr/DataTableTr.js.map +1 -1
- package/esm/table/ColumnHeader.js +2 -1
- package/esm/table/ColumnHeader.js.map +1 -1
- package/package.json +8 -7
- package/src/data/data-grid/index.ts +3 -0
- package/src/data/data-grid/root/DataGridRoot.context.ts +16 -0
- package/src/data/data-grid/root/DataGridRoot.tsx +71 -0
- package/src/data/drag-and-drop/drag-handler/DragAndDropDragHandler.tsx +11 -17
- package/src/data/drag-and-drop/root/DragAndDrop.context.tsx +4 -2
- package/src/data/drag-and-drop/root/DragAndDropRoot.tsx +63 -52
- package/src/data/drag-and-drop/types.ts +0 -5
- package/src/data/stories/Data.test-data.tsx +52 -44
- package/src/data/table/agent-component-review.md +175 -0
- package/src/data/table/base-cell/DataTableBaseCell.tsx +31 -21
- package/src/data/table/column-header/DataTableColumnHeader.tsx +63 -58
- package/src/data/table/column-header/useTableColumnResize.ts +55 -71
- package/src/data/table/details-panel-row/DataTableDetailsPanelRow.tsx +7 -3
- package/src/data/table/helpers/collectTableRowEntries.ts +32 -19
- package/src/data/table/helpers/selection/getMultipleSelectProps.ts +65 -85
- package/src/data/table/helpers/selection/getSingleSelectProps.ts +35 -17
- package/src/data/table/helpers/selection/selection.types.ts +19 -19
- package/src/data/table/helpers/selection/selection.utils.test.ts +161 -0
- package/src/data/table/helpers/selection/selection.utils.ts +73 -0
- package/src/data/table/helpers/table-focus.ts +63 -9
- package/src/data/table/hooks/__tests__/useTableItems.test.ts +48 -8
- package/src/data/table/hooks/useColumnOptions.ts +48 -14
- package/src/data/table/hooks/useGridCache.ts +3 -2
- package/src/data/table/hooks/useTableDetailsPanel.tsx +25 -25
- package/src/data/table/hooks/useTableItems.ts +51 -42
- package/src/data/table/hooks/useTableKeyboardNav.ts +7 -15
- package/src/data/table/hooks/useTableSelection.ts +26 -31
- package/src/data/table/hooks/useTableSort.ts +10 -9
- package/src/data/table/root/DataTable.types.ts +30 -25
- package/src/data/table/root/DataTableRoot.context.ts +19 -7
- package/src/data/table/root/DataTableRoot.legacy.tsx +22 -14
- package/src/data/table/root/DataTableRoot.tsx +271 -320
- package/src/data/table/sub-row-toggle/DataTableSubRowToggle.tsx +5 -4
- package/src/data/table/tbody/DataTableTbody.tsx +6 -2
- package/src/data/table/tr/DataTableTr.tsx +98 -35
- package/src/table/ColumnHeader.tsx +2 -1
- package/cjs/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.d.ts +0 -22
- package/cjs/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.js +0 -35
- package/cjs/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.js.map +0 -1
- package/cjs/data/drag-and-drop-old/item/DataDragAndDropItem.d.ts +0 -27
- package/cjs/data/drag-and-drop-old/item/DataDragAndDropItem.js +0 -86
- package/cjs/data/drag-and-drop-old/item/DataDragAndDropItem.js.map +0 -1
- package/cjs/data/drag-and-drop-old/root/DataDragAndDrop.context.d.ts +0 -5
- package/cjs/data/drag-and-drop-old/root/DataDragAndDrop.context.js +0 -6
- package/cjs/data/drag-and-drop-old/root/DataDragAndDrop.context.js.map +0 -1
- package/cjs/data/drag-and-drop-old/root/DataDragAndDropRoot.d.ts +0 -24
- package/cjs/data/drag-and-drop-old/root/DataDragAndDropRoot.js +0 -108
- package/cjs/data/drag-and-drop-old/root/DataDragAndDropRoot.js.map +0 -1
- package/cjs/data/table/helpers/selection/SelectionSubtreeHelper.d.ts +0 -46
- package/cjs/data/table/helpers/selection/SelectionSubtreeHelper.js +0 -112
- package/cjs/data/table/helpers/selection/SelectionSubtreeHelper.js.map +0 -1
- package/esm/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.d.ts +0 -22
- package/esm/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.js +0 -29
- package/esm/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.js.map +0 -1
- package/esm/data/drag-and-drop-old/item/DataDragAndDropItem.d.ts +0 -27
- package/esm/data/drag-and-drop-old/item/DataDragAndDropItem.js +0 -50
- package/esm/data/drag-and-drop-old/item/DataDragAndDropItem.js.map +0 -1
- package/esm/data/drag-and-drop-old/root/DataDragAndDrop.context.d.ts +0 -5
- package/esm/data/drag-and-drop-old/root/DataDragAndDrop.context.js +0 -3
- package/esm/data/drag-and-drop-old/root/DataDragAndDrop.context.js.map +0 -1
- package/esm/data/drag-and-drop-old/root/DataDragAndDropRoot.d.ts +0 -24
- package/esm/data/drag-and-drop-old/root/DataDragAndDropRoot.js +0 -68
- package/esm/data/drag-and-drop-old/root/DataDragAndDropRoot.js.map +0 -1
- package/esm/data/table/helpers/selection/SelectionSubtreeHelper.d.ts +0 -46
- package/esm/data/table/helpers/selection/SelectionSubtreeHelper.js +0 -109
- package/esm/data/table/helpers/selection/SelectionSubtreeHelper.js.map +0 -1
- package/src/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.tsx +0 -104
- package/src/data/drag-and-drop-old/item/DataDragAndDropItem.tsx +0 -74
- package/src/data/drag-and-drop-old/root/DataDragAndDrop.context.tsx +0 -11
- package/src/data/drag-and-drop-old/root/DataDragAndDropRoot.tsx +0 -96
- package/src/data/table/helpers/selection/SelectionSubtreeHelper.test.ts +0 -66
- package/src/data/table/helpers/selection/SelectionSubtreeHelper.ts +0 -162
- package/src/data/table/hooks/__tests__/useTableSelection.test.ts +0 -488
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
/** biome-ignore-all lint/correctness/useHookAtTopLevel: False positive because of the way forwardRef() is added */
|
|
2
1
|
import React, {
|
|
3
2
|
forwardRef,
|
|
4
3
|
useCallback,
|
|
5
4
|
useEffect,
|
|
6
|
-
useMemo,
|
|
7
5
|
useRef,
|
|
8
6
|
useState,
|
|
9
7
|
} from "react";
|
|
@@ -12,6 +10,7 @@ import { useId } from "../../../utils-external";
|
|
|
12
10
|
import { Slot } from "../../../utils/components/slot/Slot";
|
|
13
11
|
import { cl } from "../../../utils/helpers";
|
|
14
12
|
import { useMergeRefs } from "../../../utils/hooks";
|
|
13
|
+
import { useDataGridContext } from "../../data-grid/root/DataGridRoot.context";
|
|
15
14
|
import { DataTableBaseCell } from "../base-cell/DataTableBaseCell";
|
|
16
15
|
import { DataTableColumnHeader } from "../column-header/DataTableColumnHeader";
|
|
17
16
|
import { DataTableDetailsPanelRow } from "../details-panel-row/DataTableDetailsPanelRow";
|
|
@@ -21,12 +20,7 @@ import {
|
|
|
21
20
|
DataTableDetailsPanelProvider,
|
|
22
21
|
type DetailsPanelProps,
|
|
23
22
|
} from "../hooks/useTableDetailsPanel";
|
|
24
|
-
import {
|
|
25
|
-
type SubRowsProps,
|
|
26
|
-
TableItemsProvider,
|
|
27
|
-
useTableItems,
|
|
28
|
-
useTableItemsContext,
|
|
29
|
-
} from "../hooks/useTableItems";
|
|
23
|
+
import { type SubRowsProps, useTableItems } from "../hooks/useTableItems";
|
|
30
24
|
import { useTableKeyboardNav } from "../hooks/useTableKeyboardNav";
|
|
31
25
|
import {
|
|
32
26
|
type SelectionProps,
|
|
@@ -38,14 +32,29 @@ import { DataTableSubRowToggle } from "../sub-row-toggle/DataTableSubRowToggle";
|
|
|
38
32
|
import { DataTableTbody } from "../tbody/DataTableTbody";
|
|
39
33
|
import { DataTableThead } from "../thead/DataTableThead";
|
|
40
34
|
import { DataTableTr } from "../tr/DataTableTr";
|
|
41
|
-
import type {
|
|
35
|
+
import type {
|
|
36
|
+
DataTableLoadingConfig,
|
|
37
|
+
TableRowEntryId,
|
|
38
|
+
} from "./DataTable.types";
|
|
42
39
|
import {
|
|
43
40
|
DataTableContextProvider,
|
|
44
41
|
useDataTableContext,
|
|
45
42
|
} from "./DataTableRoot.context";
|
|
46
43
|
|
|
47
|
-
|
|
48
|
-
|
|
44
|
+
/**
|
|
45
|
+
* TODO: For consideration:
|
|
46
|
+
* - Use namespacing for types. There will be a lot of standalone types connected to this component,
|
|
47
|
+
* it could make sense to access them under DataTable.X instead of separate imports.
|
|
48
|
+
* - Consider having a "Wrapper" component that only handles context and logic like,
|
|
49
|
+
* "DataTableRoot" or "DataGrid" or something, and then have the main "DataTable" component only handle rendering of table itself.
|
|
50
|
+
* This would make props more focused and discoverable since its not mixed with htmltable-props.
|
|
51
|
+
*/
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* TODO:
|
|
55
|
+
* - Test `onColumnDefinitionChange` callback that is called when resize, sort, order etc changes
|
|
56
|
+
*/
|
|
57
|
+
interface DataTableProps<T> extends React.HTMLAttributes<HTMLTableElement> {
|
|
49
58
|
children?: never;
|
|
50
59
|
/**
|
|
51
60
|
* Controls vertical cell padding.
|
|
@@ -60,21 +69,16 @@ interface DataTableProps<T>
|
|
|
60
69
|
/**
|
|
61
70
|
* Truncate content in cells and show ellipsis for overflowed text.
|
|
62
71
|
*
|
|
63
|
-
* **NB:** When using `layout="auto"`,
|
|
64
|
-
*
|
|
72
|
+
* **NB:** When using this together with `layout="auto"`,
|
|
73
|
+
* you have to manually set a `maxWidth` on columns that should be truncated.
|
|
74
|
+
* @default false if layout="auto", else true
|
|
65
75
|
*/
|
|
66
|
-
truncateContent?: boolean;
|
|
76
|
+
truncateContent?: boolean;
|
|
67
77
|
/**
|
|
68
78
|
* Enables keyboard navigation for table rows and cells.
|
|
69
79
|
* @default true
|
|
70
80
|
*/
|
|
71
81
|
withKeyboardNav?: boolean;
|
|
72
|
-
/**
|
|
73
|
-
* Custom callback to determine if navigation should be blocked.
|
|
74
|
-
* Called before default blocking logic.
|
|
75
|
-
* Requires `withKeyboardNav` to be `true`.
|
|
76
|
-
*/
|
|
77
|
-
shouldBlockNavigation?: (event: KeyboardEvent) => boolean;
|
|
78
82
|
/**
|
|
79
83
|
* Controls table layout.
|
|
80
84
|
*
|
|
@@ -90,35 +94,14 @@ interface DataTableProps<T>
|
|
|
90
94
|
* @default "fixed"
|
|
91
95
|
*/
|
|
92
96
|
layout?: "fixed" | "auto";
|
|
93
|
-
/**
|
|
94
|
-
* Defines the columns of the table and how to render them.
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
* Each column definition should have a unique `id` (or use the column index as fallback) and a `cell`-renderer function that takes the row data as argument and returns a React node.
|
|
98
|
-
*/
|
|
99
|
-
columnDefinitions: ColumnDefinitions<T>;
|
|
100
|
-
/**
|
|
101
|
-
* The data to display in the table.
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
* Each object in the array represents a row, and the properties of the object are used to render the cells based on the `columnDefinitions`.
|
|
105
|
-
*/
|
|
106
|
-
data: T[];
|
|
107
|
-
/**
|
|
108
|
-
* Function to get unique row id from row data.
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
* If not provided, the row index will be used as id. This can cause issues if your data changes dynamically, so it's recommended to provide a stable id if possible.
|
|
112
|
-
*/
|
|
113
|
-
getRowId?: (rowData: T, index: number) => string | number;
|
|
114
97
|
/**
|
|
115
98
|
* Sticky columns that remain visible when horizontally scrolling the table.
|
|
116
99
|
*
|
|
117
100
|
* You can specify 1 sticky column on the left and 1 on the right.
|
|
118
101
|
*/
|
|
119
102
|
stickyColumns?: {
|
|
120
|
-
|
|
121
|
-
|
|
103
|
+
start?: "1";
|
|
104
|
+
end?: "1";
|
|
122
105
|
};
|
|
123
106
|
/**
|
|
124
107
|
* @default true
|
|
@@ -129,219 +112,167 @@ interface DataTableProps<T>
|
|
|
129
112
|
* Not called when clicking header, loading, or empty-state rows.
|
|
130
113
|
*/
|
|
131
114
|
onRowClick?: (
|
|
132
|
-
rowId:
|
|
115
|
+
rowId: TableRowEntryId,
|
|
133
116
|
event: React.MouseEvent<HTMLTableRowElement>,
|
|
134
117
|
) => void;
|
|
135
118
|
/**
|
|
136
119
|
* Content to render when `data` is empty.
|
|
137
120
|
* Rendered inside a `DataTable.EmptyState` row spanning all columns.
|
|
138
121
|
*/
|
|
139
|
-
|
|
140
|
-
loading?: {
|
|
141
|
-
/**
|
|
142
|
-
* Shows the table in a loading state.
|
|
143
|
-
*
|
|
144
|
-
* - When `loadingState` is provided, it is rendered inside a `DataTable.LoadingState` row.
|
|
145
|
-
* - When `loadingState` is **not** provided, skeleton placeholder rows are rendered instead.
|
|
146
|
-
* @default false
|
|
147
|
-
*/
|
|
148
|
-
isLoading?: boolean;
|
|
149
|
-
/**
|
|
150
|
-
* Custom content to render when `isLoading` is `true`.
|
|
151
|
-
* Rendered inside a `DataTable.LoadingState` row spanning all columns.
|
|
152
|
-
* When omitted, skeleton rows are rendered based on `loadingRows`.
|
|
153
|
-
*/
|
|
154
|
-
loadingState?: React.ReactNode;
|
|
155
|
-
/**
|
|
156
|
-
* Number of skeleton rows to render when `isLoading` is `true` and no `loadingState` is provided.
|
|
157
|
-
*
|
|
158
|
-
*
|
|
159
|
-
* If not provided, the rendered content will get a temporarily overlay while loading
|
|
160
|
-
*/
|
|
161
|
-
loadingRows?: number;
|
|
162
|
-
/**
|
|
163
|
-
* Visually hidden label announced to screen readers when skeleton rows are shown.
|
|
164
|
-
* Only used when `isLoading` is `true` and no `loadingState` is provided.
|
|
165
|
-
* @default "Laster innhold"
|
|
166
|
-
*/
|
|
167
|
-
loadingLabel?: string;
|
|
168
|
-
};
|
|
169
|
-
|
|
122
|
+
emptyContent?: React.ReactNode;
|
|
170
123
|
/**
|
|
171
|
-
*
|
|
172
|
-
* When provided, an expand toggle column is added automatically.
|
|
124
|
+
* Configures how the table behaves during loading.
|
|
173
125
|
*
|
|
174
|
-
*
|
|
175
|
-
*
|
|
176
|
-
* -
|
|
126
|
+
* Use `variant` to select the loading strategy:
|
|
127
|
+
* - `"content"` — renders custom content inside a full-width row.
|
|
128
|
+
* - `"skeleton"` — renders skeleton placeholder rows.
|
|
129
|
+
* - `"overlay"` — keeps existing data visible with a loading overlay.
|
|
130
|
+
*/
|
|
131
|
+
loading?: DataTableLoadingConfig;
|
|
132
|
+
/**
|
|
133
|
+
* Adjusts font-size
|
|
134
|
+
* @default "medium"
|
|
135
|
+
*/
|
|
136
|
+
textSize?: "small" | "medium";
|
|
137
|
+
/**
|
|
138
|
+
* Object with props related to row selection.
|
|
139
|
+
*/
|
|
140
|
+
selection?: SelectionProps<T>;
|
|
141
|
+
/**
|
|
142
|
+
* Object with props related to nested rows (sub-rows).
|
|
143
|
+
*/
|
|
144
|
+
subRows?: SubRowsProps<T>; // TODO: Table might need to be implemented with role="treegrid" for a11y when having nested rows.
|
|
145
|
+
/**
|
|
146
|
+
* Object with props related to details panel.
|
|
147
|
+
* This is a panel that can be expanded below each row to show arbitrary content.
|
|
177
148
|
*/
|
|
178
|
-
selection?: SelectionProps;
|
|
179
|
-
subRows?: SubRowsProps<T>;
|
|
180
149
|
detailsPanel?: DetailsPanelProps<T>;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
function DataTableInner<T>(
|
|
184
|
-
{
|
|
185
|
-
className,
|
|
186
|
-
id,
|
|
187
|
-
rowDensity = "normal",
|
|
188
|
-
withKeyboardNav = true,
|
|
189
|
-
zebraStripes = false,
|
|
190
|
-
truncateContent = true,
|
|
191
|
-
shouldBlockNavigation,
|
|
192
|
-
layout = "fixed",
|
|
193
|
-
selection,
|
|
194
|
-
data,
|
|
195
|
-
columnDefinitions,
|
|
196
|
-
getRowId,
|
|
197
|
-
stickyColumns,
|
|
198
|
-
stickyHeader = true,
|
|
199
|
-
sort: sortProp,
|
|
200
|
-
defaultSort = [],
|
|
201
|
-
onSortChange,
|
|
202
|
-
onRowClick,
|
|
203
|
-
emptyState,
|
|
204
|
-
loading,
|
|
205
|
-
detailsPanel,
|
|
206
|
-
subRows,
|
|
207
|
-
...rest
|
|
208
|
-
}: DataTableProps<T>,
|
|
209
|
-
forwardedRef: React.ForwardedRef<HTMLTableElement>,
|
|
210
|
-
) {
|
|
211
|
-
const { sortState, onSortClick } = useTableSort({
|
|
212
|
-
defaultSort,
|
|
213
|
-
onSortChange,
|
|
214
|
-
sort: sortProp,
|
|
215
|
-
});
|
|
216
|
-
|
|
217
150
|
/**
|
|
218
|
-
*
|
|
219
|
-
* - If user currently does not give a getRowsId function, and data is nested (getSubRows)
|
|
220
|
-
* we end up in an infinite loop since the index based ids repeat for children and causes chaos.
|
|
151
|
+
* Object with props related to sorting.
|
|
221
152
|
*/
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
getRowId: getRowId ?? ((_, index) => index),
|
|
225
|
-
subRows,
|
|
226
|
-
});
|
|
227
|
-
|
|
228
|
-
const tableSelectionState = useTableSelection({
|
|
229
|
-
selection,
|
|
230
|
-
visibleRowIds: tableItems.visibleRowIds,
|
|
231
|
-
childRowIdsById: tableItems.childRowIdsById,
|
|
232
|
-
});
|
|
153
|
+
sorting?: TableSortOptions;
|
|
154
|
+
}
|
|
233
155
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
156
|
+
const DataTableInternal = forwardRef<HTMLTableElement, DataTableProps<any>>(
|
|
157
|
+
(
|
|
158
|
+
{
|
|
159
|
+
className,
|
|
160
|
+
id,
|
|
161
|
+
rowDensity = "normal",
|
|
162
|
+
textSize = "medium",
|
|
163
|
+
withKeyboardNav = true,
|
|
164
|
+
zebraStripes = false,
|
|
165
|
+
truncateContent: truncateContentProp,
|
|
166
|
+
layout = "fixed",
|
|
167
|
+
stickyColumns,
|
|
168
|
+
stickyHeader = true,
|
|
169
|
+
onRowClick,
|
|
170
|
+
emptyContent,
|
|
171
|
+
selection,
|
|
172
|
+
loading,
|
|
173
|
+
detailsPanel,
|
|
174
|
+
subRows,
|
|
175
|
+
sorting,
|
|
176
|
+
...rest
|
|
177
|
+
}: DataTableProps<any>, // Have to use <any> for docgen to work
|
|
178
|
+
forwardedRef,
|
|
179
|
+
) => {
|
|
180
|
+
const { columnDefinitions, data, getRowId } = useDataGridContext();
|
|
181
|
+
|
|
182
|
+
const sortingState = useTableSort(sorting);
|
|
183
|
+
|
|
184
|
+
const tableItems = useTableItems({
|
|
185
|
+
items: data,
|
|
186
|
+
getRowId,
|
|
187
|
+
subRows,
|
|
188
|
+
});
|
|
238
189
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
loadingLabel = "Laster innhold",
|
|
244
|
-
} = loading || {};
|
|
190
|
+
const tableSelectionState = useTableSelection({
|
|
191
|
+
selection,
|
|
192
|
+
tableItems,
|
|
193
|
+
});
|
|
245
194
|
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
195
|
+
const { columns, stickyStart, totalColSpan } = useColumnOptions(
|
|
196
|
+
columnDefinitions,
|
|
197
|
+
{
|
|
198
|
+
stickyColumns,
|
|
199
|
+
hasSelection: tableSelectionState.selection.selectionMode !== "none",
|
|
200
|
+
hasDetailsPanel: !!detailsPanel?.getContent,
|
|
201
|
+
layout,
|
|
202
|
+
},
|
|
252
203
|
);
|
|
253
|
-
}, [
|
|
254
|
-
columns,
|
|
255
|
-
layout,
|
|
256
|
-
tableSelectionState.selection.selectionMode,
|
|
257
|
-
detailsPanel,
|
|
258
|
-
]);
|
|
259
204
|
|
|
260
|
-
|
|
205
|
+
const tableId = useId(id);
|
|
261
206
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
itemDetails={tableItems.itemDetails}
|
|
279
|
-
items={tableItems.items}
|
|
280
|
-
onExpandedRowIdsChange={tableItems.onExpandedRowIdsChange}
|
|
281
|
-
isSubRowExpanded={tableItems.isSubRowExpanded}
|
|
207
|
+
const truncateContent = truncateContentProp ?? layout !== "auto";
|
|
208
|
+
|
|
209
|
+
return (
|
|
210
|
+
<DataTableContextProvider
|
|
211
|
+
layout={layout}
|
|
212
|
+
withKeyboardNav={withKeyboardNav}
|
|
213
|
+
selectionState={tableSelectionState}
|
|
214
|
+
stickyStart={stickyStart}
|
|
215
|
+
stickyHeader={stickyHeader}
|
|
216
|
+
tableId={tableId}
|
|
217
|
+
loading={loading}
|
|
218
|
+
onRowClick={onRowClick}
|
|
219
|
+
columns={columns}
|
|
220
|
+
totalColSpan={totalColSpan}
|
|
221
|
+
tableItems={tableItems}
|
|
222
|
+
sortingState={sortingState}
|
|
282
223
|
>
|
|
283
|
-
<
|
|
284
|
-
<
|
|
285
|
-
|
|
286
|
-
|
|
224
|
+
<TableElementWrapper enabled={withKeyboardNav}>
|
|
225
|
+
<table
|
|
226
|
+
{...rest}
|
|
227
|
+
ref={forwardedRef}
|
|
228
|
+
className={cl("aksel-data-table", className)}
|
|
229
|
+
data-zebra-stripes={zebraStripes}
|
|
230
|
+
data-truncate-content={truncateContent}
|
|
231
|
+
data-density={rowDensity}
|
|
232
|
+
data-text-size={textSize}
|
|
233
|
+
data-layout={layout}
|
|
234
|
+
data-loading={loading?.isLoading || undefined}
|
|
235
|
+
aria-busy={loading?.isLoading || undefined}
|
|
287
236
|
>
|
|
288
|
-
<
|
|
289
|
-
{...rest}
|
|
290
|
-
ref={forwardedRef}
|
|
291
|
-
className={cl("aksel-data-table", className)}
|
|
292
|
-
data-zebra-stripes={zebraStripes}
|
|
293
|
-
data-truncate-content={truncateContent}
|
|
294
|
-
data-density={rowDensity}
|
|
295
|
-
data-layout={layout}
|
|
296
|
-
data-loading={isLoading || undefined}
|
|
297
|
-
aria-busy={isLoading || undefined}
|
|
298
|
-
>
|
|
237
|
+
<DataTableDetailsPanelProvider detailsPanel={detailsPanel}>
|
|
299
238
|
<DataTableThead>
|
|
300
239
|
<DataTableTr>
|
|
301
|
-
{columns.map(
|
|
302
|
-
|
|
303
|
-
(
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
</DataTableColumnHeader>
|
|
325
|
-
);
|
|
326
|
-
})}
|
|
240
|
+
{columns.map(
|
|
241
|
+
({ isSticky, isStickyLast, stickyLeftOffset, colDef }) => {
|
|
242
|
+
return (
|
|
243
|
+
<DataTableColumnHeader
|
|
244
|
+
id={colDef.id}
|
|
245
|
+
width={colDef.width}
|
|
246
|
+
textAlign={colDef.align ?? "left"}
|
|
247
|
+
key={colDef.id}
|
|
248
|
+
isSticky={isSticky}
|
|
249
|
+
sortable={colDef.sortable}
|
|
250
|
+
label={colDef.label}
|
|
251
|
+
style={
|
|
252
|
+
stickyLeftOffset
|
|
253
|
+
? { left: stickyLeftOffset }
|
|
254
|
+
: undefined
|
|
255
|
+
}
|
|
256
|
+
data-sticky-last={isStickyLast || undefined}
|
|
257
|
+
>
|
|
258
|
+
{colDef.header ?? colDef.label}
|
|
259
|
+
</DataTableColumnHeader>
|
|
260
|
+
);
|
|
261
|
+
},
|
|
262
|
+
)}
|
|
327
263
|
</DataTableTr>
|
|
328
264
|
</DataTableThead>
|
|
329
265
|
|
|
330
266
|
<DataTableTbody>
|
|
331
|
-
<DataTableTBodyContent
|
|
332
|
-
loadingState={loadingState}
|
|
333
|
-
loadingRows={loadingRows}
|
|
334
|
-
loadingLabel={loadingLabel}
|
|
335
|
-
emptyState={emptyState}
|
|
336
|
-
/>
|
|
267
|
+
<DataTableTBodyContent emptyContent={emptyContent} />
|
|
337
268
|
</DataTableTbody>
|
|
338
|
-
</
|
|
339
|
-
</
|
|
340
|
-
</
|
|
341
|
-
</
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
269
|
+
</DataTableDetailsPanelProvider>
|
|
270
|
+
</table>
|
|
271
|
+
</TableElementWrapper>
|
|
272
|
+
</DataTableContextProvider>
|
|
273
|
+
);
|
|
274
|
+
},
|
|
275
|
+
);
|
|
345
276
|
|
|
346
277
|
/**
|
|
347
278
|
* Temp optimization to avoid re-renders on every keyboard-move, selection change etc
|
|
@@ -349,10 +280,8 @@ function DataTableInner<T>(
|
|
|
349
280
|
function TableElementWrapper({
|
|
350
281
|
children,
|
|
351
282
|
enabled,
|
|
352
|
-
shouldBlockNavigation,
|
|
353
283
|
}: {
|
|
354
284
|
children: React.ReactNode;
|
|
355
|
-
shouldBlockNavigation?: (event: KeyboardEvent) => boolean;
|
|
356
285
|
enabled: boolean;
|
|
357
286
|
}) {
|
|
358
287
|
const [applyStickyStyles, setApplyStickyStyles] = useState<boolean>(false);
|
|
@@ -362,7 +291,6 @@ function TableElementWrapper({
|
|
|
362
291
|
const rafRef = useRef<number | null>(null);
|
|
363
292
|
const { tabIndex, setTableRef } = useTableKeyboardNav({
|
|
364
293
|
enabled,
|
|
365
|
-
shouldBlockNavigation,
|
|
366
294
|
});
|
|
367
295
|
|
|
368
296
|
const mergedTableRefs = useMergeRefs(tableRef, setTableRef);
|
|
@@ -389,37 +317,40 @@ function TableElementWrapper({
|
|
|
389
317
|
});
|
|
390
318
|
}, [updateStickyStyles]);
|
|
391
319
|
|
|
392
|
-
useEffect(
|
|
393
|
-
|
|
320
|
+
useEffect(
|
|
321
|
+
function observeAndUpdateStickyStyles() {
|
|
322
|
+
const tableWrapperElement = tableWrapperRef.current;
|
|
394
323
|
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
324
|
+
if (!tableWrapperElement) {
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
398
327
|
|
|
399
|
-
|
|
328
|
+
const handleResize = () => scheduleStickyStylesUpdate();
|
|
400
329
|
|
|
401
|
-
|
|
330
|
+
window.addEventListener("resize", handleResize);
|
|
402
331
|
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
332
|
+
let resizeObserver: ResizeObserver | undefined;
|
|
333
|
+
if (typeof ResizeObserver !== "undefined") {
|
|
334
|
+
resizeObserver = new ResizeObserver(handleResize);
|
|
335
|
+
resizeObserver.observe(tableWrapperElement);
|
|
336
|
+
if (tableRef.current) {
|
|
337
|
+
resizeObserver.observe(tableRef.current);
|
|
338
|
+
}
|
|
409
339
|
}
|
|
410
|
-
}
|
|
411
340
|
|
|
412
|
-
|
|
341
|
+
scheduleStickyStylesUpdate();
|
|
413
342
|
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
343
|
+
return () => {
|
|
344
|
+
window.removeEventListener("resize", handleResize);
|
|
345
|
+
resizeObserver?.disconnect();
|
|
346
|
+
if (rafRef.current !== null) {
|
|
347
|
+
cancelAnimationFrame(rafRef.current);
|
|
348
|
+
rafRef.current = null;
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
},
|
|
352
|
+
[scheduleStickyStylesUpdate],
|
|
353
|
+
);
|
|
423
354
|
|
|
424
355
|
return (
|
|
425
356
|
<div className="aksel-data-table__border-wrapper">
|
|
@@ -438,76 +369,86 @@ function TableElementWrapper({
|
|
|
438
369
|
}
|
|
439
370
|
|
|
440
371
|
interface DataTableTBodyContentProps {
|
|
441
|
-
|
|
442
|
-
loadingLabel: string;
|
|
443
|
-
loadingRows?: number;
|
|
444
|
-
emptyState: React.ReactNode;
|
|
372
|
+
emptyContent: React.ReactNode;
|
|
445
373
|
}
|
|
446
374
|
|
|
447
|
-
function DataTableTBodyContent({
|
|
448
|
-
|
|
449
|
-
loadingRows,
|
|
450
|
-
loadingLabel,
|
|
451
|
-
emptyState,
|
|
452
|
-
}: DataTableTBodyContentProps) {
|
|
453
|
-
const { items, itemDetails } = useTableItemsContext();
|
|
454
|
-
const { columns, isLoading, fullWidthColSpan } = useDataTableContext();
|
|
375
|
+
function DataTableTBodyContent({ emptyContent }: DataTableTBodyContentProps) {
|
|
376
|
+
const { columns, loading, totalColSpan, tableItems } = useDataTableContext();
|
|
455
377
|
|
|
456
|
-
if (isLoading &&
|
|
378
|
+
if (loading?.isLoading && loading?.variant === "content") {
|
|
457
379
|
return (
|
|
458
|
-
<DataTableLoadingState colSpan={
|
|
459
|
-
{
|
|
380
|
+
<DataTableLoadingState colSpan={totalColSpan}>
|
|
381
|
+
{loading.content}
|
|
460
382
|
</DataTableLoadingState>
|
|
461
383
|
);
|
|
462
384
|
}
|
|
463
385
|
|
|
464
|
-
if (isLoading &&
|
|
386
|
+
if (loading?.isLoading && loading?.variant === "skeleton") {
|
|
387
|
+
const rows = loading.rows ?? 5;
|
|
388
|
+
const label = loading.label ?? "Laster innhold";
|
|
465
389
|
return (
|
|
466
390
|
<>
|
|
467
391
|
<tr>
|
|
468
|
-
<td colSpan={
|
|
469
|
-
{
|
|
392
|
+
<td colSpan={totalColSpan} className="aksel-sr-only">
|
|
393
|
+
{label}
|
|
470
394
|
</td>
|
|
471
395
|
</tr>
|
|
472
|
-
{Array.from({ length:
|
|
396
|
+
{Array.from({ length: rows }, (_, rowIndex) => (
|
|
473
397
|
<DataTableTr key={`skeleton-row-${rowIndex}`} aria-hidden>
|
|
474
|
-
{columns.map(
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
398
|
+
{columns.map(
|
|
399
|
+
(
|
|
400
|
+
{ isSticky, isStickyLast, stickyLeftOffset, colDef },
|
|
401
|
+
colDefIndex,
|
|
402
|
+
) => (
|
|
403
|
+
<DataTableBaseCell
|
|
404
|
+
textAlign={colDef.align ?? "left"}
|
|
405
|
+
key={colDef.id || colDefIndex}
|
|
406
|
+
as={colDef.isRowHeader ? "th" : "td"}
|
|
407
|
+
isSticky={isSticky}
|
|
408
|
+
style={
|
|
409
|
+
stickyLeftOffset ? { left: stickyLeftOffset } : undefined
|
|
410
|
+
}
|
|
411
|
+
data-sticky-last={isStickyLast || undefined}
|
|
412
|
+
>
|
|
413
|
+
<Skeleton variant="text" />
|
|
414
|
+
</DataTableBaseCell>
|
|
415
|
+
),
|
|
416
|
+
)}
|
|
484
417
|
</DataTableTr>
|
|
485
418
|
))}
|
|
486
419
|
</>
|
|
487
420
|
);
|
|
488
421
|
}
|
|
489
422
|
|
|
490
|
-
if (items.length === 0 &&
|
|
423
|
+
if (tableItems.items.length === 0 && emptyContent !== undefined) {
|
|
491
424
|
return (
|
|
492
|
-
<DataTableEmptyState colSpan={
|
|
493
|
-
{
|
|
425
|
+
<DataTableEmptyState colSpan={totalColSpan}>
|
|
426
|
+
{emptyContent}
|
|
494
427
|
</DataTableEmptyState>
|
|
495
428
|
);
|
|
496
429
|
}
|
|
497
430
|
|
|
498
|
-
const renderLoadingAnnouncement =
|
|
431
|
+
const renderLoadingAnnouncement =
|
|
432
|
+
loading?.isLoading && loading?.variant === "overlay";
|
|
433
|
+
|
|
434
|
+
const overlayLabel =
|
|
435
|
+
loading?.variant === "overlay"
|
|
436
|
+
? (loading.label ?? "Laster innhold")
|
|
437
|
+
: "Laster innhold";
|
|
499
438
|
|
|
500
439
|
return (
|
|
501
440
|
<>
|
|
502
441
|
{renderLoadingAnnouncement && (
|
|
503
442
|
<tr>
|
|
504
|
-
<td colSpan={
|
|
505
|
-
{
|
|
443
|
+
<td colSpan={totalColSpan} className="aksel-sr-only">
|
|
444
|
+
{overlayLabel}
|
|
506
445
|
</td>
|
|
507
446
|
</tr>
|
|
508
447
|
)}
|
|
509
|
-
{items.map((rowData) => {
|
|
510
|
-
const
|
|
448
|
+
{tableItems.items.map((rowData, rowIndex) => {
|
|
449
|
+
const rowId = tableItems.visibleRowIds[rowIndex];
|
|
450
|
+
const details =
|
|
451
|
+
rowId != null ? tableItems.itemDetails.get(rowId) : undefined;
|
|
511
452
|
|
|
512
453
|
/* Should in theory be impossible. Look about typing this? */
|
|
513
454
|
if (!details) {
|
|
@@ -519,31 +460,40 @@ function DataTableTBodyContent({
|
|
|
519
460
|
return (
|
|
520
461
|
<React.Fragment key={details.id}>
|
|
521
462
|
<DataTableTr rowId={details.id}>
|
|
522
|
-
{columns.map(
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
colDefIndex
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
463
|
+
{columns.map(
|
|
464
|
+
(
|
|
465
|
+
{ isSticky, isStickyLast, stickyLeftOffset, colDef },
|
|
466
|
+
colDefIndex,
|
|
467
|
+
) => {
|
|
468
|
+
const renderNestedToggle = colDefIndex === 0 && hasSubRows;
|
|
469
|
+
const renderNestedIndent =
|
|
470
|
+
colDefIndex === 0 && (details.level > 0 || hasSubRows);
|
|
471
|
+
|
|
472
|
+
const style: React.CSSProperties = {
|
|
473
|
+
"--__axc-data-table-nested-depth": details.level,
|
|
474
|
+
...(stickyLeftOffset ? { left: stickyLeftOffset } : {}),
|
|
475
|
+
};
|
|
476
|
+
|
|
477
|
+
return (
|
|
478
|
+
<DataTableBaseCell
|
|
479
|
+
textAlign={colDef.align ?? "left"}
|
|
480
|
+
key={colDef.id || colDefIndex}
|
|
481
|
+
as={colDef.isRowHeader ? "th" : "td"}
|
|
482
|
+
isSticky={isSticky}
|
|
483
|
+
data-nested={renderNestedIndent || undefined}
|
|
484
|
+
data-sticky-last={isStickyLast || undefined}
|
|
485
|
+
style={style}
|
|
486
|
+
beforeContent={
|
|
487
|
+
renderNestedToggle ? (
|
|
488
|
+
<DataTableSubRowToggle details={details} />
|
|
489
|
+
) : undefined
|
|
490
|
+
}
|
|
491
|
+
>
|
|
492
|
+
{colDef.cell(rowData)}
|
|
493
|
+
</DataTableBaseCell>
|
|
494
|
+
);
|
|
495
|
+
},
|
|
496
|
+
)}
|
|
547
497
|
</DataTableTr>
|
|
548
498
|
<DataTableDetailsPanelRow rowId={details.id} rowData={rowData} />
|
|
549
499
|
</React.Fragment>
|
|
@@ -553,10 +503,11 @@ function DataTableTBodyContent({
|
|
|
553
503
|
);
|
|
554
504
|
}
|
|
555
505
|
|
|
556
|
-
const DataTable =
|
|
506
|
+
const DataTable = DataTableInternal as <T>(
|
|
557
507
|
props: DataTableProps<T> & React.RefAttributes<HTMLTableElement>,
|
|
558
508
|
) => React.ReactElement | null;
|
|
559
509
|
|
|
560
|
-
|
|
510
|
+
// docgen doesn't work well with type params, so we let it use DataTableInternal instead
|
|
511
|
+
export { DataTable, DataTableInternal };
|
|
561
512
|
export type { DataTableProps };
|
|
562
513
|
export default DataTable;
|