@navikt/ds-react 8.10.6 → 8.11.1

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.
Files changed (249) hide show
  1. package/cjs/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js +5 -1
  2. package/cjs/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js.map +1 -1
  3. package/cjs/data/drag-and-drop/root/DragAndDropRoot.d.ts +1 -1
  4. package/cjs/data/drag-and-drop/root/DragAndDropRoot.js +50 -20
  5. package/cjs/data/drag-and-drop/root/DragAndDropRoot.js.map +1 -1
  6. package/cjs/data/stories/Data.test-data.d.ts +2 -2
  7. package/cjs/data/stories/Data.test-data.js +37 -42
  8. package/cjs/data/stories/Data.test-data.js.map +1 -1
  9. package/cjs/data/table/base-cell/DataTableBaseCell.d.ts +4 -4
  10. package/cjs/data/table/base-cell/DataTableBaseCell.js +2 -2
  11. package/cjs/data/table/base-cell/DataTableBaseCell.js.map +1 -1
  12. package/cjs/data/table/column-header/DataTableColumnHeader.d.ts +3 -15
  13. package/cjs/data/table/column-header/DataTableColumnHeader.js +8 -5
  14. package/cjs/data/table/column-header/DataTableColumnHeader.js.map +1 -1
  15. package/cjs/data/table/column-header/useTableColumnResize.d.ts +2 -4
  16. package/cjs/data/table/column-header/useTableColumnResize.js +15 -11
  17. package/cjs/data/table/column-header/useTableColumnResize.js.map +1 -1
  18. package/cjs/data/table/helpers/collectTableRowEntries.d.ts +1 -1
  19. package/cjs/data/table/helpers/selection/getMultipleSelectProps.d.ts +6 -5
  20. package/cjs/data/table/helpers/selection/getMultipleSelectProps.js +6 -2
  21. package/cjs/data/table/helpers/selection/getMultipleSelectProps.js.map +1 -1
  22. package/cjs/data/table/helpers/selection/getSingleSelectProps.d.ts +3 -3
  23. package/cjs/data/table/helpers/selection/getSingleSelectProps.js +1 -1
  24. package/cjs/data/table/helpers/selection/getSingleSelectProps.js.map +1 -1
  25. package/cjs/data/table/helpers/selection/selection.types.d.ts +19 -27
  26. package/cjs/data/table/helpers/selection/selection.utils.d.ts +1 -1
  27. package/cjs/data/table/helpers/table-focus.js +1 -1
  28. package/cjs/data/table/helpers/table-focus.js.map +1 -1
  29. package/cjs/data/table/hooks/useColumnOptions.d.ts +8 -5
  30. package/cjs/data/table/hooks/useColumnOptions.js +25 -10
  31. package/cjs/data/table/hooks/useColumnOptions.js.map +1 -1
  32. package/cjs/data/table/hooks/useTableDetailsPanel.d.ts +8 -9
  33. package/cjs/data/table/hooks/useTableDetailsPanel.js.map +1 -1
  34. package/cjs/data/table/hooks/useTableItems.d.ts +10 -11
  35. package/cjs/data/table/hooks/useTableItems.js +11 -3
  36. package/cjs/data/table/hooks/useTableItems.js.map +1 -1
  37. package/cjs/data/table/hooks/useTableSelection.d.ts +2 -1
  38. package/cjs/data/table/hooks/useTableSelection.js +46 -29
  39. package/cjs/data/table/hooks/useTableSelection.js.map +1 -1
  40. package/cjs/data/table/hooks/useTableSort.d.ts +13 -7
  41. package/cjs/data/table/hooks/useTableSort.js +8 -9
  42. package/cjs/data/table/hooks/useTableSort.js.map +1 -1
  43. package/cjs/data/table/index.d.ts +1 -1
  44. package/cjs/data/table/index.js +3 -23
  45. package/cjs/data/table/index.js.map +1 -1
  46. package/cjs/data/table/root/{DataTable.types.d.ts → DataGridTable.types.d.ts} +16 -26
  47. package/cjs/data/table/root/DataGridTable.types.js +3 -0
  48. package/cjs/data/table/root/DataGridTable.types.js.map +1 -0
  49. package/cjs/data/table/root/DataGridTableRoot.d.ts +104 -0
  50. package/cjs/data/table/root/{DataTableRoot.js → DataGridTableRoot.js} +59 -38
  51. package/cjs/data/table/root/DataGridTableRoot.js.map +1 -0
  52. package/cjs/data/table/root/DataTableRoot.context.d.ts +6 -2
  53. package/cjs/data/table/root/DataTableRoot.context.js.map +1 -1
  54. package/cjs/data/table/tbody/DataTableTbody.js +3 -3
  55. package/cjs/data/table/tbody/DataTableTbody.js.map +1 -1
  56. package/cjs/data/table/tr/DataTableTr.d.ts +3 -3
  57. package/cjs/data/table/tr/DataTableTr.js +45 -23
  58. package/cjs/data/table/tr/DataTableTr.js.map +1 -1
  59. package/cjs/data/token-filter/TokenFilter.d.ts +0 -6
  60. package/cjs/data/token-filter/TokenFilter.js +1 -1
  61. package/cjs/data-grid/index.d.ts +2 -0
  62. package/cjs/data-grid/index.js +9 -0
  63. package/cjs/data-grid/index.js.map +1 -0
  64. package/cjs/data-grid/root/DataGrid.types.d.ts +48 -0
  65. package/cjs/{data/table/root/DataTable.types.js → data-grid/root/DataGrid.types.js} +1 -1
  66. package/cjs/data-grid/root/DataGrid.types.js.map +1 -0
  67. package/cjs/data-grid/root/DataGridRoot.context.d.ts +16 -0
  68. package/cjs/{data/data-grid → data-grid}/root/DataGridRoot.context.js +1 -1
  69. package/cjs/data-grid/root/DataGridRoot.context.js.map +1 -0
  70. package/cjs/data-grid/root/DataGridRoot.d.ts +89 -0
  71. package/cjs/{data/data-grid → data-grid}/root/DataGridRoot.js +35 -8
  72. package/cjs/data-grid/root/DataGridRoot.js.map +1 -0
  73. package/cjs/preview.d.ts +1 -0
  74. package/cjs/{data/data-grid/index.js → preview.js} +3 -3
  75. package/cjs/preview.js.map +1 -0
  76. package/cjs/primitives/bleed/Bleed.d.ts +0 -2
  77. package/cjs/primitives/bleed/Bleed.js.map +1 -1
  78. package/cjs/table/ColumnHeader.js.map +1 -1
  79. package/cjs/tabs/Tabs.context.d.ts +1 -1
  80. package/cjs/tabs/useTabs.d.ts +1 -1
  81. package/cjs/toggle-group/ToggleGroup.context.d.ts +1 -1
  82. package/cjs/toggle-group/useToggleGroup.d.ts +1 -1
  83. package/cjs/utils/components/dismissablelayer/DismissableLayer.js +1 -0
  84. package/cjs/utils/components/dismissablelayer/DismissableLayer.js.map +1 -1
  85. package/cjs/utils/components/dismissablelayer/util/useFocusOutside.d.ts +1 -0
  86. package/cjs/utils/components/dismissablelayer/util/useFocusOutside.js +11 -1
  87. package/cjs/utils/components/dismissablelayer/util/useFocusOutside.js.map +1 -1
  88. package/cjs/utils/hooks/useControllableState.d.ts +1 -1
  89. package/cjs/utils/hooks/useControllableState.js.map +1 -1
  90. package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js +5 -1
  91. package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js.map +1 -1
  92. package/esm/data/drag-and-drop/root/DragAndDropRoot.d.ts +1 -1
  93. package/esm/data/drag-and-drop/root/DragAndDropRoot.js +51 -21
  94. package/esm/data/drag-and-drop/root/DragAndDropRoot.js.map +1 -1
  95. package/esm/data/stories/Data.test-data.d.ts +2 -2
  96. package/esm/data/stories/Data.test-data.js +37 -42
  97. package/esm/data/stories/Data.test-data.js.map +1 -1
  98. package/esm/data/table/base-cell/DataTableBaseCell.d.ts +4 -4
  99. package/esm/data/table/base-cell/DataTableBaseCell.js +2 -2
  100. package/esm/data/table/base-cell/DataTableBaseCell.js.map +1 -1
  101. package/esm/data/table/column-header/DataTableColumnHeader.d.ts +3 -15
  102. package/esm/data/table/column-header/DataTableColumnHeader.js +8 -5
  103. package/esm/data/table/column-header/DataTableColumnHeader.js.map +1 -1
  104. package/esm/data/table/column-header/useTableColumnResize.d.ts +2 -4
  105. package/esm/data/table/column-header/useTableColumnResize.js +15 -11
  106. package/esm/data/table/column-header/useTableColumnResize.js.map +1 -1
  107. package/esm/data/table/helpers/collectTableRowEntries.d.ts +1 -1
  108. package/esm/data/table/helpers/selection/getMultipleSelectProps.d.ts +6 -5
  109. package/esm/data/table/helpers/selection/getMultipleSelectProps.js +6 -2
  110. package/esm/data/table/helpers/selection/getMultipleSelectProps.js.map +1 -1
  111. package/esm/data/table/helpers/selection/getSingleSelectProps.d.ts +3 -3
  112. package/esm/data/table/helpers/selection/getSingleSelectProps.js +1 -1
  113. package/esm/data/table/helpers/selection/getSingleSelectProps.js.map +1 -1
  114. package/esm/data/table/helpers/selection/selection.types.d.ts +19 -27
  115. package/esm/data/table/helpers/selection/selection.utils.d.ts +1 -1
  116. package/esm/data/table/helpers/table-focus.js +1 -1
  117. package/esm/data/table/helpers/table-focus.js.map +1 -1
  118. package/esm/data/table/hooks/useColumnOptions.d.ts +8 -5
  119. package/esm/data/table/hooks/useColumnOptions.js +25 -10
  120. package/esm/data/table/hooks/useColumnOptions.js.map +1 -1
  121. package/esm/data/table/hooks/useTableDetailsPanel.d.ts +8 -9
  122. package/esm/data/table/hooks/useTableDetailsPanel.js.map +1 -1
  123. package/esm/data/table/hooks/useTableItems.d.ts +10 -11
  124. package/esm/data/table/hooks/useTableItems.js +11 -3
  125. package/esm/data/table/hooks/useTableItems.js.map +1 -1
  126. package/esm/data/table/hooks/useTableSelection.d.ts +2 -1
  127. package/esm/data/table/hooks/useTableSelection.js +46 -29
  128. package/esm/data/table/hooks/useTableSelection.js.map +1 -1
  129. package/esm/data/table/hooks/useTableSort.d.ts +13 -7
  130. package/esm/data/table/hooks/useTableSort.js +9 -10
  131. package/esm/data/table/hooks/useTableSort.js.map +1 -1
  132. package/esm/data/table/index.d.ts +1 -1
  133. package/esm/data/table/index.js +1 -21
  134. package/esm/data/table/index.js.map +1 -1
  135. package/esm/data/table/root/{DataTable.types.d.ts → DataGridTable.types.d.ts} +16 -26
  136. package/esm/data/table/root/DataGridTable.types.js +2 -0
  137. package/esm/data/table/root/DataGridTable.types.js.map +1 -0
  138. package/esm/data/table/root/DataGridTableRoot.d.ts +104 -0
  139. package/esm/data/table/root/{DataTableRoot.js → DataGridTableRoot.js} +61 -39
  140. package/esm/data/table/root/DataGridTableRoot.js.map +1 -0
  141. package/esm/data/table/root/DataTableRoot.context.d.ts +6 -2
  142. package/esm/data/table/root/DataTableRoot.context.js.map +1 -1
  143. package/esm/data/table/tbody/DataTableTbody.js +3 -3
  144. package/esm/data/table/tbody/DataTableTbody.js.map +1 -1
  145. package/esm/data/table/tr/DataTableTr.d.ts +3 -3
  146. package/esm/data/table/tr/DataTableTr.js +45 -23
  147. package/esm/data/table/tr/DataTableTr.js.map +1 -1
  148. package/esm/data/token-filter/TokenFilter.d.ts +0 -6
  149. package/esm/data/token-filter/TokenFilter.js +1 -1
  150. package/esm/data-grid/index.d.ts +2 -0
  151. package/esm/data-grid/index.js +4 -0
  152. package/esm/data-grid/index.js.map +1 -0
  153. package/esm/data-grid/root/DataGrid.types.d.ts +48 -0
  154. package/esm/data-grid/root/DataGrid.types.js +2 -0
  155. package/esm/data-grid/root/DataGrid.types.js.map +1 -0
  156. package/esm/data-grid/root/DataGridRoot.context.d.ts +16 -0
  157. package/esm/{data/data-grid → data-grid}/root/DataGridRoot.context.js +1 -1
  158. package/esm/data-grid/root/DataGridRoot.context.js.map +1 -0
  159. package/esm/data-grid/root/DataGridRoot.d.ts +89 -0
  160. package/esm/data-grid/root/DataGridRoot.js +59 -0
  161. package/esm/data-grid/root/DataGridRoot.js.map +1 -0
  162. package/esm/preview.d.ts +1 -0
  163. package/esm/preview.js +3 -0
  164. package/esm/preview.js.map +1 -0
  165. package/esm/primitives/bleed/Bleed.d.ts +0 -2
  166. package/esm/primitives/bleed/Bleed.js.map +1 -1
  167. package/esm/table/ColumnHeader.js.map +1 -1
  168. package/esm/tabs/Tabs.context.d.ts +1 -1
  169. package/esm/tabs/useTabs.d.ts +1 -1
  170. package/esm/toggle-group/ToggleGroup.context.d.ts +1 -1
  171. package/esm/toggle-group/useToggleGroup.d.ts +1 -1
  172. package/esm/utils/components/dismissablelayer/DismissableLayer.js +1 -0
  173. package/esm/utils/components/dismissablelayer/DismissableLayer.js.map +1 -1
  174. package/esm/utils/components/dismissablelayer/util/useFocusOutside.d.ts +1 -0
  175. package/esm/utils/components/dismissablelayer/util/useFocusOutside.js +12 -2
  176. package/esm/utils/components/dismissablelayer/util/useFocusOutside.js.map +1 -1
  177. package/esm/utils/hooks/useControllableState.d.ts +1 -1
  178. package/esm/utils/hooks/useControllableState.js.map +1 -1
  179. package/package.json +25 -5
  180. package/src/data/drag-and-drop/drag-handler/DragAndDropDragHandler.tsx +5 -1
  181. package/src/data/drag-and-drop/root/DragAndDropRoot.tsx +55 -25
  182. package/src/data/stories/Data.test-data.tsx +53 -51
  183. package/src/data/table/base-cell/DataTableBaseCell.tsx +6 -6
  184. package/src/data/table/column-header/DataTableColumnHeader.tsx +17 -20
  185. package/src/data/table/column-header/useTableColumnResize.ts +19 -16
  186. package/src/data/table/helpers/collectTableRowEntries.ts +1 -1
  187. package/src/data/table/helpers/selection/getMultipleSelectProps.ts +11 -5
  188. package/src/data/table/helpers/selection/getSingleSelectProps.ts +4 -4
  189. package/src/data/table/helpers/selection/selection.types.ts +18 -29
  190. package/src/data/table/helpers/selection/selection.utils.test.ts +1 -1
  191. package/src/data/table/helpers/selection/selection.utils.ts +1 -1
  192. package/src/data/table/helpers/table-focus.ts +1 -1
  193. package/src/data/table/hooks/__tests__/useTableItems.test.ts +1 -1
  194. package/src/data/table/hooks/useColumnOptions.ts +50 -15
  195. package/src/data/table/hooks/useTableDetailsPanel.tsx +14 -18
  196. package/src/data/table/hooks/useTableItems.ts +37 -23
  197. package/src/data/table/hooks/useTableSelection.ts +62 -45
  198. package/src/data/table/hooks/useTableSort.ts +29 -17
  199. package/src/data/table/index.tsx +4 -21
  200. package/src/data/table/root/{DataTable.types.ts → DataGridTable.types.ts} +17 -30
  201. package/src/data/table/root/{DataTableRoot.tsx → DataGridTableRoot.tsx} +198 -144
  202. package/src/data/table/root/DataTableRoot.context.ts +10 -8
  203. package/src/data/table/sub-row-toggle/DataTableSubRowToggle.tsx +1 -1
  204. package/src/data/table/tbody/DataTableTbody.tsx +3 -3
  205. package/src/data/table/tr/DataTableTr.tsx +51 -20
  206. package/src/data/token-filter/TokenFilter.tsx +1 -1
  207. package/src/data-grid/index.ts +3 -0
  208. package/src/data-grid/root/DataGrid.types.ts +46 -0
  209. package/src/data-grid/root/DataGridRoot.context.ts +21 -0
  210. package/src/data-grid/root/DataGridRoot.tsx +154 -0
  211. package/src/preview.ts +2 -0
  212. package/src/primitives/bleed/Bleed.tsx +0 -2
  213. package/src/table/ColumnHeader.tsx +1 -0
  214. package/src/utils/components/dismissablelayer/DismissableLayer.tsx +1 -0
  215. package/src/utils/components/dismissablelayer/util/useFocusOutside.ts +14 -2
  216. package/src/utils/hooks/useControllableState.ts +10 -8
  217. package/cjs/data/data-grid/index.d.ts +0 -2
  218. package/cjs/data/data-grid/index.js.map +0 -1
  219. package/cjs/data/data-grid/root/DataGridRoot.context.d.ts +0 -11
  220. package/cjs/data/data-grid/root/DataGridRoot.context.js.map +0 -1
  221. package/cjs/data/data-grid/root/DataGridRoot.d.ts +0 -38
  222. package/cjs/data/data-grid/root/DataGridRoot.js.map +0 -1
  223. package/cjs/data/table/root/DataTable.types.js.map +0 -1
  224. package/cjs/data/table/root/DataTableRoot.d.ts +0 -118
  225. package/cjs/data/table/root/DataTableRoot.js.map +0 -1
  226. package/cjs/data/table/root/DataTableRoot.legacy.d.ts +0 -172
  227. package/cjs/data/table/root/DataTableRoot.legacy.js +0 -118
  228. package/cjs/data/table/root/DataTableRoot.legacy.js.map +0 -1
  229. package/esm/data/data-grid/index.d.ts +0 -2
  230. package/esm/data/data-grid/index.js +0 -3
  231. package/esm/data/data-grid/index.js.map +0 -1
  232. package/esm/data/data-grid/root/DataGridRoot.context.d.ts +0 -11
  233. package/esm/data/data-grid/root/DataGridRoot.context.js.map +0 -1
  234. package/esm/data/data-grid/root/DataGridRoot.d.ts +0 -38
  235. package/esm/data/data-grid/root/DataGridRoot.js +0 -32
  236. package/esm/data/data-grid/root/DataGridRoot.js.map +0 -1
  237. package/esm/data/table/root/DataTable.types.js +0 -2
  238. package/esm/data/table/root/DataTable.types.js.map +0 -1
  239. package/esm/data/table/root/DataTableRoot.d.ts +0 -118
  240. package/esm/data/table/root/DataTableRoot.js.map +0 -1
  241. package/esm/data/table/root/DataTableRoot.legacy.d.ts +0 -172
  242. package/esm/data/table/root/DataTableRoot.legacy.js +0 -73
  243. package/esm/data/table/root/DataTableRoot.legacy.js.map +0 -1
  244. package/src/data/data-grid/index.ts +0 -3
  245. package/src/data/data-grid/root/DataGridRoot.context.ts +0 -16
  246. package/src/data/data-grid/root/DataGridRoot.tsx +0 -71
  247. package/src/data/table/Readme.md +0 -11
  248. package/src/data/table/agent-component-review.md +0 -175
  249. package/src/data/table/root/DataTableRoot.legacy.tsx +0 -305
@@ -1,20 +1,22 @@
1
1
  import React, {
2
2
  forwardRef,
3
+ memo,
3
4
  useCallback,
4
5
  useEffect,
5
6
  useRef,
6
7
  useState,
7
8
  } from "react";
9
+ import { useDataGridContext } from "../../../data-grid/root/DataGridRoot.context";
8
10
  import { Skeleton } from "../../../skeleton";
9
11
  import { useId } from "../../../utils-external";
10
12
  import { Slot } from "../../../utils/components/slot/Slot";
11
13
  import { cl } from "../../../utils/helpers";
12
14
  import { useMergeRefs } from "../../../utils/hooks";
13
- import { useDataGridContext } from "../../data-grid/root/DataGridRoot.context";
14
15
  import { DataTableBaseCell } from "../base-cell/DataTableBaseCell";
15
16
  import { DataTableColumnHeader } from "../column-header/DataTableColumnHeader";
16
17
  import { DataTableDetailsPanelRow } from "../details-panel-row/DataTableDetailsPanelRow";
17
18
  import { DataTableEmptyState } from "../empty-state/DataTableEmptyState";
19
+ import type { ItemDetail } from "../helpers/collectTableRowEntries";
18
20
  import { useColumnOptions } from "../hooks/useColumnOptions";
19
21
  import {
20
22
  DataTableDetailsPanelProvider,
@@ -22,26 +24,20 @@ import {
22
24
  } from "../hooks/useTableDetailsPanel";
23
25
  import { type SubRowsProps, useTableItems } from "../hooks/useTableItems";
24
26
  import { useTableKeyboardNav } from "../hooks/useTableKeyboardNav";
25
- import {
26
- type SelectionProps,
27
- useTableSelection,
28
- } from "../hooks/useTableSelection";
27
+ import { useTableSelection } from "../hooks/useTableSelection";
29
28
  import { type TableSortOptions, useTableSort } from "../hooks/useTableSort";
30
29
  import { DataTableLoadingState } from "../loading-state/DataTableLoadingState";
31
30
  import { DataTableSubRowToggle } from "../sub-row-toggle/DataTableSubRowToggle";
32
31
  import { DataTableTbody } from "../tbody/DataTableTbody";
33
32
  import { DataTableThead } from "../thead/DataTableThead";
34
33
  import { DataTableTr } from "../tr/DataTableTr";
35
- import type {
36
- DataTableLoadingConfig,
37
- TableRowEntryId,
38
- } from "./DataTable.types";
34
+ import type { DataTableLoadingConfig } from "./DataGridTable.types";
39
35
  import {
40
36
  DataTableContextProvider,
41
37
  useDataTableContext,
42
38
  } from "./DataTableRoot.context";
43
39
 
44
- /**
40
+ /*
45
41
  * TODO: For consideration:
46
42
  * - Use namespacing for types. There will be a lot of standalone types connected to this component,
47
43
  * it could make sense to access them under DataTable.X instead of separate imports.
@@ -50,35 +46,12 @@ import {
50
46
  * This would make props more focused and discoverable since its not mixed with htmltable-props.
51
47
  */
52
48
 
53
- /**
49
+ /*
54
50
  * TODO:
55
51
  * - Test `onColumnDefinitionChange` callback that is called when resize, sort, order etc changes
56
52
  */
57
- interface DataTableProps<T> extends React.HTMLAttributes<HTMLTableElement> {
53
+ interface DataGridTableProps<T> extends React.HTMLAttributes<HTMLTableElement> {
58
54
  children?: never;
59
- /**
60
- * Controls vertical cell padding.
61
- * @default "normal"
62
- */
63
- rowDensity?: "condensed" | "normal" | "spacious";
64
- /**
65
- * Zebra striped table
66
- * @default false
67
- */
68
- zebraStripes?: boolean;
69
- /**
70
- * Truncate content in cells and show ellipsis for overflowed text.
71
- *
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
75
- */
76
- truncateContent?: boolean;
77
- /**
78
- * Enables keyboard navigation for table rows and cells.
79
- * @default true
80
- */
81
- withKeyboardNav?: boolean;
82
55
  /**
83
56
  * Controls table layout.
84
57
  *
@@ -95,29 +68,45 @@ interface DataTableProps<T> extends React.HTMLAttributes<HTMLTableElement> {
95
68
  */
96
69
  layout?: "fixed" | "auto";
97
70
  /**
98
- * Sticky columns that remain visible when horizontally scrolling the table.
71
+ * Whether the header should be sticky.
72
+ * For this to work, you have to put the component in a flex container with a height restriction.
73
+ *
74
+ * @example
75
+ * <VStack height="100vh">
76
+ * <div>Content before DataGrid</div>
77
+ * <DataGrid>
78
+ * <DataGrid.Table />
79
+ * </DataGrid>
80
+ * <div>Content after DataGrid</div>
81
+ * </VStack>
82
+ *
83
+ * @example
84
+ * <div style={{ display: "flex", maxHeight: "500px" }}>
85
+ * <DataGrid>
86
+ * <DataGrid.Table />
87
+ * </DataGrid>
88
+ * </div>
99
89
  *
100
- * You can specify 1 sticky column on the left and 1 on the right.
101
- */
102
- stickyColumns?: {
103
- start?: "1";
104
- end?: "1";
105
- };
106
- /**
107
90
  * @default true
108
91
  */
109
92
  stickyHeader?: boolean;
110
93
  /**
111
- * Callback invoked when a data row is clicked.
112
- * Not called when clicking header, loading, or empty-state rows.
94
+ * Callback invoked when a row in the table body is clicked.
95
+ *
96
+ * Call `event.preventDefault()` inside the callback to prevent the default row click behavior, such as selection.
113
97
  */
114
- onRowClick?: (
115
- rowId: TableRowEntryId,
116
- event: React.MouseEvent<HTMLTableRowElement>,
117
- ) => void;
98
+ onRowAction?: ({
99
+ row,
100
+ id,
101
+ event,
102
+ }: {
103
+ row: T;
104
+ id: string;
105
+ event: React.MouseEvent<HTMLTableRowElement>;
106
+ }) => void;
118
107
  /**
119
108
  * Content to render when `data` is empty.
120
- * Rendered inside a `DataTable.EmptyState` row spanning all columns.
109
+ * Rendered inside a row spanning all columns.
121
110
  */
122
111
  emptyContent?: React.ReactNode;
123
112
  /**
@@ -127,17 +116,10 @@ interface DataTableProps<T> extends React.HTMLAttributes<HTMLTableElement> {
127
116
  * - `"content"` — renders custom content inside a full-width row.
128
117
  * - `"skeleton"` — renders skeleton placeholder rows.
129
118
  * - `"overlay"` — keeps existing data visible with a loading overlay.
119
+ *
120
+ * @default { variant: "skeleton", rows: 5 }
130
121
  */
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>;
122
+ loadingContent?: DataTableLoadingConfig;
141
123
  /**
142
124
  * Object with props related to nested rows (sub-rows).
143
125
  */
@@ -151,33 +133,46 @@ interface DataTableProps<T> extends React.HTMLAttributes<HTMLTableElement> {
151
133
  * Object with props related to sorting.
152
134
  */
153
135
  sorting?: TableSortOptions;
136
+ /**
137
+ * Determines if selection is triggered by clicking the row or the selection control (checkbox/radio).
138
+ * @default "row"
139
+ */
140
+ selectionTrigger?: "row" | "control";
154
141
  }
155
142
 
156
- const DataTableInternal = forwardRef<HTMLTableElement, DataTableProps<any>>(
143
+ const DataGridTableInternal = forwardRef<
144
+ HTMLTableElement,
145
+ DataGridTableProps<any>
146
+ >(
157
147
  (
158
148
  {
159
149
  className,
160
150
  id,
161
- rowDensity = "normal",
162
- textSize = "medium",
163
- withKeyboardNav = true,
164
- zebraStripes = false,
165
- truncateContent: truncateContentProp,
166
151
  layout = "fixed",
167
- stickyColumns,
168
152
  stickyHeader = true,
169
- onRowClick,
153
+ onRowAction,
170
154
  emptyContent,
171
- selection,
172
- loading,
155
+ loadingContent = {
156
+ variant: "skeleton",
157
+ rows: 5,
158
+ label: "Laster innhold",
159
+ }, // TODO translate label
173
160
  detailsPanel,
174
161
  subRows,
175
162
  sorting,
163
+ selectionTrigger = "row",
176
164
  ...rest
177
- }: DataTableProps<any>, // Have to use <any> for docgen to work
165
+ }: DataGridTableProps<unknown>,
178
166
  forwardedRef,
179
167
  ) => {
180
- const { columnDefinitions, data, getRowId } = useDataGridContext();
168
+ const {
169
+ columnDefinitions,
170
+ data,
171
+ getRowId,
172
+ selection,
173
+ isLoading,
174
+ tableSettings,
175
+ } = useDataGridContext();
181
176
 
182
177
  const sortingState = useTableSort(sorting);
183
178
 
@@ -189,53 +184,63 @@ const DataTableInternal = forwardRef<HTMLTableElement, DataTableProps<any>>(
189
184
 
190
185
  const tableSelectionState = useTableSelection({
191
186
  selection,
187
+ selectionTrigger,
192
188
  tableItems,
193
189
  });
194
190
 
195
191
  const { columns, stickyStart, totalColSpan } = useColumnOptions(
196
192
  columnDefinitions,
197
193
  {
198
- stickyColumns,
199
- hasSelection: tableSelectionState.selection.selectionMode !== "none",
194
+ stickyColumns: tableSettings?.stickyColumns,
195
+ hasSelection: tableSelectionState.selection.mode !== "none",
200
196
  hasDetailsPanel: !!detailsPanel?.getContent,
201
197
  layout,
198
+ columnDisplay: tableSettings?.columnDisplay,
202
199
  },
203
200
  );
204
201
 
205
202
  const tableId = useId(id);
206
203
 
207
- const truncateContent = truncateContentProp ?? layout !== "auto";
204
+ const truncateContent = tableSettings?.truncateContent ?? layout !== "auto";
208
205
 
209
206
  return (
210
207
  <DataTableContextProvider
211
208
  layout={layout}
212
- withKeyboardNav={withKeyboardNav}
209
+ withKeyboardNav={true}
213
210
  selectionState={tableSelectionState}
214
211
  stickyStart={stickyStart}
215
212
  stickyHeader={stickyHeader}
216
213
  tableId={tableId}
217
- loading={loading}
218
- onRowClick={onRowClick}
214
+ loading={loadingContent}
215
+ onRowAction={onRowAction}
219
216
  columns={columns}
220
217
  totalColSpan={totalColSpan}
221
218
  tableItems={tableItems}
222
219
  sortingState={sortingState}
223
220
  >
224
- <TableElementWrapper enabled={withKeyboardNav}>
221
+ <TableElementWrapper
222
+ enabled={true}
223
+ hasStickyColumns={
224
+ !!(
225
+ tableSettings?.stickyColumns?.start ||
226
+ tableSettings?.stickyColumns?.end
227
+ )
228
+ }
229
+ >
225
230
  <table
226
231
  {...rest}
227
232
  ref={forwardedRef}
228
233
  className={cl("aksel-data-table", className)}
229
- data-zebra-stripes={zebraStripes}
234
+ data-zebra-stripes={tableSettings?.zebraStripes}
230
235
  data-truncate-content={truncateContent}
231
- data-density={rowDensity}
232
- data-text-size={textSize}
236
+ data-density={tableSettings?.rowDensity}
237
+ data-text-size={tableSettings?.textSize}
233
238
  data-layout={layout}
234
- data-loading={loading?.isLoading || undefined}
235
- aria-busy={loading?.isLoading || undefined}
239
+ data-loading={isLoading || undefined}
240
+ aria-busy={isLoading || undefined}
236
241
  >
237
242
  <DataTableDetailsPanelProvider detailsPanel={detailsPanel}>
238
- <DataTableThead>
243
+ <DataTableThead data-sticky={stickyHeader || undefined}>
239
244
  <DataTableTr>
240
245
  {columns.map(
241
246
  ({ isSticky, isStickyLast, stickyLeftOffset, colDef }) => {
@@ -243,11 +248,11 @@ const DataTableInternal = forwardRef<HTMLTableElement, DataTableProps<any>>(
243
248
  <DataTableColumnHeader
244
249
  id={colDef.id}
245
250
  width={colDef.width}
246
- textAlign={colDef.align ?? "left"}
251
+ align={colDef.align ?? "left"}
247
252
  key={colDef.id}
248
253
  isSticky={isSticky}
249
- sortable={colDef.sortable}
250
- label={colDef.label}
254
+ sortable={colDef.isSortable}
255
+ label={colDef.header}
251
256
  style={
252
257
  stickyLeftOffset
253
258
  ? { left: stickyLeftOffset }
@@ -255,7 +260,7 @@ const DataTableInternal = forwardRef<HTMLTableElement, DataTableProps<any>>(
255
260
  }
256
261
  data-sticky-last={isStickyLast || undefined}
257
262
  >
258
- {colDef.header ?? colDef.label}
263
+ {colDef.headerCell ?? colDef.header}
259
264
  </DataTableColumnHeader>
260
265
  );
261
266
  },
@@ -280,9 +285,11 @@ const DataTableInternal = forwardRef<HTMLTableElement, DataTableProps<any>>(
280
285
  function TableElementWrapper({
281
286
  children,
282
287
  enabled,
288
+ hasStickyColumns,
283
289
  }: {
284
290
  children: React.ReactNode;
285
291
  enabled: boolean;
292
+ hasStickyColumns: boolean;
286
293
  }) {
287
294
  const [applyStickyStyles, setApplyStickyStyles] = useState<boolean>(false);
288
295
 
@@ -319,6 +326,10 @@ function TableElementWrapper({
319
326
 
320
327
  useEffect(
321
328
  function observeAndUpdateStickyStyles() {
329
+ if (!hasStickyColumns) {
330
+ return;
331
+ }
332
+
322
333
  const tableWrapperElement = tableWrapperRef.current;
323
334
 
324
335
  if (!tableWrapperElement) {
@@ -349,7 +360,7 @@ function TableElementWrapper({
349
360
  }
350
361
  };
351
362
  },
352
- [scheduleStickyStylesUpdate],
363
+ [scheduleStickyStylesUpdate, hasStickyColumns],
353
364
  );
354
365
 
355
366
  return (
@@ -374,8 +385,9 @@ interface DataTableTBodyContentProps {
374
385
 
375
386
  function DataTableTBodyContent({ emptyContent }: DataTableTBodyContentProps) {
376
387
  const { columns, loading, totalColSpan, tableItems } = useDataTableContext();
388
+ const { isLoading } = useDataGridContext();
377
389
 
378
- if (loading?.isLoading && loading?.variant === "content") {
390
+ if (isLoading && loading?.variant === "content") {
379
391
  return (
380
392
  <DataTableLoadingState colSpan={totalColSpan}>
381
393
  {loading.content}
@@ -383,9 +395,9 @@ function DataTableTBodyContent({ emptyContent }: DataTableTBodyContentProps) {
383
395
  );
384
396
  }
385
397
 
386
- if (loading?.isLoading && loading?.variant === "skeleton") {
398
+ if (isLoading && loading?.variant === "skeleton") {
387
399
  const rows = loading.rows ?? 5;
388
- const label = loading.label ?? "Laster innhold";
400
+ const label = loading.label ?? "Laster innhold"; // TODO translate
389
401
  return (
390
402
  <>
391
403
  <tr>
@@ -401,7 +413,7 @@ function DataTableTBodyContent({ emptyContent }: DataTableTBodyContentProps) {
401
413
  colDefIndex,
402
414
  ) => (
403
415
  <DataTableBaseCell
404
- textAlign={colDef.align ?? "left"}
416
+ align={colDef.align ?? "left"}
405
417
  key={colDef.id || colDefIndex}
406
418
  as={colDef.isRowHeader ? "th" : "td"}
407
419
  isSticky={isSticky}
@@ -428,12 +440,11 @@ function DataTableTBodyContent({ emptyContent }: DataTableTBodyContentProps) {
428
440
  );
429
441
  }
430
442
 
431
- const renderLoadingAnnouncement =
432
- loading?.isLoading && loading?.variant === "overlay";
443
+ const renderLoadingAnnouncement = isLoading && loading?.variant === "overlay";
433
444
 
434
445
  const overlayLabel =
435
446
  loading?.variant === "overlay"
436
- ? (loading.label ?? "Laster innhold")
447
+ ? (loading.label ?? "Laster innhold") // TODO translate
437
448
  : "Laster innhold";
438
449
 
439
450
  return (
@@ -455,59 +466,102 @@ function DataTableTBodyContent({ emptyContent }: DataTableTBodyContentProps) {
455
466
  return null;
456
467
  }
457
468
 
458
- const hasSubRows = details.children.length > 0;
459
-
460
469
  return (
461
- <React.Fragment key={details.id}>
462
- <DataTableTr rowId={details.id}>
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
- )}
497
- </DataTableTr>
498
- <DataTableDetailsPanelRow rowId={details.id} rowData={rowData} />
499
- </React.Fragment>
470
+ <DataTableDataRow
471
+ key={details.id}
472
+ rowData={rowData}
473
+ details={details}
474
+ columns={columns}
475
+ />
500
476
  );
501
477
  })}
502
478
  </>
503
479
  );
504
480
  }
505
481
 
506
- const DataTable = DataTableInternal as <T>(
507
- props: DataTableProps<T> & React.RefAttributes<HTMLTableElement>,
482
+ interface DataTableDataRowProps {
483
+ rowData: any;
484
+ details: ItemDetail<any>;
485
+ columns: ReturnType<typeof useColumnOptions>["columns"];
486
+ }
487
+
488
+ const DataTableDataRow = memo(
489
+ function DataTableDataRow({
490
+ rowData,
491
+ details,
492
+ columns,
493
+ }: DataTableDataRowProps) {
494
+ const hasSubRows = details.children.length > 0;
495
+
496
+ return (
497
+ <>
498
+ <DataTableTr rowId={details.id}>
499
+ {columns.map(
500
+ (
501
+ { isSticky, isStickyLast, stickyLeftOffset, colDef },
502
+ colDefIndex,
503
+ ) => {
504
+ const renderNestedToggle = colDefIndex === 0 && hasSubRows;
505
+ const renderNestedIndent =
506
+ colDefIndex === 0 && (details.level > 0 || hasSubRows);
507
+
508
+ const style: React.CSSProperties = {
509
+ "--__axc-data-table-nested-depth": details.level,
510
+ ...(stickyLeftOffset ? { left: stickyLeftOffset } : {}),
511
+ };
512
+
513
+ return (
514
+ <DataTableBaseCell
515
+ align={colDef.align ?? "left"}
516
+ key={colDef.id || colDefIndex}
517
+ as={colDef.isRowHeader ? "th" : "td"}
518
+ isSticky={isSticky}
519
+ data-nested={renderNestedIndent || undefined}
520
+ data-sticky-last={isStickyLast || undefined}
521
+ style={style}
522
+ beforeContent={
523
+ renderNestedToggle ? (
524
+ <DataTableSubRowToggle details={details} />
525
+ ) : undefined
526
+ }
527
+ >
528
+ {colDef.bodyCell(rowData)}
529
+ </DataTableBaseCell>
530
+ );
531
+ },
532
+ )}
533
+ </DataTableTr>
534
+ <DataTableDetailsPanelRow rowId={details.id} rowData={rowData} />
535
+ </>
536
+ );
537
+ },
538
+ /* TODO: Might be some better metrics we could use to optimize this */
539
+ (prev, next) =>
540
+ prev.rowData === next.rowData &&
541
+ prev.columns === next.columns &&
542
+ prev.details.id === next.details.id &&
543
+ prev.details.level === next.details.level &&
544
+ prev.details.children.length === next.details.children.length,
545
+ );
546
+
547
+ const DataGridTable = DataGridTableInternal as <RowT>(
548
+ props: DataGridTableProps<RowT> & React.RefAttributes<HTMLTableElement>,
508
549
  ) => React.ReactElement | null;
509
550
 
510
- // docgen doesn't work well with type params, so we let it use DataTableInternal instead
511
- export { DataTable, DataTableInternal };
512
- export type { DataTableProps };
513
- export default DataTable;
551
+ // eslint-disable-next-line @typescript-eslint/no-namespace, import/export
552
+ export namespace DataGridTable {
553
+ export type Props<T = unknown> = DataGridTableProps<T>;
554
+ export type Sorting = TableSortOptions;
555
+ export type SortEntry = import("./DataGridTable.types").SortEntry;
556
+ export type SortChangeDetail =
557
+ import("./DataGridTable.types").SortChangeDetail;
558
+ export type LoadingContent = DataTableLoadingConfig;
559
+ export type SubRows<T = unknown> = SubRowsProps<T>;
560
+ export type DetailsPanel<T = unknown> = DetailsPanelProps<T>;
561
+ }
562
+
563
+ // docgen doesn't work well with type params, so we let it use DataGridTableInternal instead
564
+ // eslint-disable-next-line import/export
565
+ export { DataGridTable, DataGridTableInternal };
566
+ export type { DataGridTableProps };
567
+ export default DataGridTable;
@@ -6,10 +6,7 @@ import type {
6
6
  import type { UseTableItemsReturn } from "../hooks/useTableItems";
7
7
  import type { UseTableSelectionReturn } from "../hooks/useTableSelection";
8
8
  import type { UseTableSortResults } from "../hooks/useTableSort";
9
- import type {
10
- DataTableLoadingConfig,
11
- TableRowEntryId,
12
- } from "./DataTable.types";
9
+ import type { DataTableLoadingConfig } from "./DataGridTable.types";
13
10
 
14
11
  type DataTableContextProps<T> = {
15
12
  layout: "fixed" | "auto";
@@ -19,10 +16,15 @@ type DataTableContextProps<T> = {
19
16
  stickyHeader: boolean;
20
17
  tableId: string;
21
18
  loading: DataTableLoadingConfig | undefined;
22
- onRowClick?: (
23
- rowId: TableRowEntryId,
24
- event: React.MouseEvent<HTMLTableRowElement>,
25
- ) => void;
19
+ onRowAction?: ({
20
+ row,
21
+ id,
22
+ event,
23
+ }: {
24
+ row: T;
25
+ id: string;
26
+ event: React.MouseEvent<HTMLTableRowElement>;
27
+ }) => void;
26
28
  columns: UseColumnOptionsResult<T>["columns"];
27
29
  /**
28
30
  * Used to set exact colspan for detailsPanel, loadingState and emptyState.
@@ -23,7 +23,7 @@ function DataTableSubRowToggle({ details }: { details: ItemDetail<any> }) {
23
23
  tableItems.onExpandedRowIdsChange(details.id);
24
24
  }}
25
25
  aria-expanded={isRowExpanded}
26
- aria-label={isRowExpanded ? "Skjul under-rader" : "Vis under-rader"}
26
+ aria-label={isRowExpanded ? "Skjul under-rader" : "Vis under-rader"} // TODO translate
27
27
  icon={
28
28
  isRowExpanded ? (
29
29
  <ChevronDownIcon aria-hidden />
@@ -1,4 +1,5 @@
1
1
  import React, { forwardRef, version } from "react";
2
+ import { useDataGridContext } from "../../../data-grid/root/DataGridRoot.context";
2
3
  import { cl } from "../../../utils/helpers";
3
4
  import {
4
5
  DataTableLocationProvider,
@@ -11,6 +12,7 @@ const inertValue = parseInt(version.split(".")[0], 10) > 18 ? true : ""; // Supp
11
12
 
12
13
  const DataTableTbody = forwardRef<HTMLTableSectionElement, DataTableTbodyProps>(
13
14
  ({ className, ...rest }, forwardedRef) => {
15
+ const { isLoading } = useDataGridContext();
14
16
  const { loading } = useDataTableContext();
15
17
  return (
16
18
  <DataTableLocationProvider location="tbody">
@@ -20,9 +22,7 @@ const DataTableTbody = forwardRef<HTMLTableSectionElement, DataTableTbodyProps>(
20
22
  className={cl("aksel-data-table__tbody", className)}
21
23
  // @ts-expect-error - inert is not yet recognized by React's type definitions, but we want to use it for better accessibility when showing the loading overlay.
22
24
  inert={
23
- loading?.isLoading && loading.variant === "overlay"
24
- ? inertValue
25
- : false
25
+ isLoading && loading?.variant === "overlay" ? inertValue : false
26
26
  }
27
27
  />
28
28
  </DataTableLocationProvider>