@navikt/ds-react 8.10.3 → 8.10.5

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 (242) hide show
  1. package/cjs/action-menu/ActionMenu.js +1 -1
  2. package/cjs/action-menu/ActionMenu.js.map +1 -1
  3. package/cjs/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js +11 -12
  4. package/cjs/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js.map +1 -1
  5. package/cjs/data/drag-and-drop/root/DragAndDrop.context.d.ts +4 -2
  6. package/cjs/data/drag-and-drop/root/DragAndDrop.context.js.map +1 -1
  7. package/cjs/data/drag-and-drop/root/DragAndDropRoot.d.ts +5 -5
  8. package/cjs/data/drag-and-drop/root/DragAndDropRoot.js +49 -28
  9. package/cjs/data/drag-and-drop/root/DragAndDropRoot.js.map +1 -1
  10. package/cjs/data/drag-and-drop/types.d.ts +0 -4
  11. package/cjs/data/{drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.d.ts → drag-and-drop-legacy/drag-handler/DragAndDropDragHandlerLegacy.d.ts} +3 -3
  12. package/cjs/data/{drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.js → drag-and-drop-legacy/drag-handler/DragAndDropDragHandlerLegacy.js} +5 -5
  13. package/cjs/data/drag-and-drop-legacy/drag-handler/DragAndDropDragHandlerLegacy.js.map +1 -0
  14. package/cjs/data/drag-and-drop-legacy/item/DragAndDropItemLegacy.d.ts +27 -0
  15. package/cjs/data/{drag-and-drop-old/item/DataDragAndDropItem.js → drag-and-drop-legacy/item/DragAndDropItemLegacy.js} +12 -12
  16. package/cjs/data/drag-and-drop-legacy/item/DragAndDropItemLegacy.js.map +1 -0
  17. package/cjs/data/drag-and-drop-legacy/root/DragAndDropLegacy.context.d.ts +5 -0
  18. package/cjs/data/drag-and-drop-legacy/root/DragAndDropLegacy.context.js +6 -0
  19. package/cjs/data/drag-and-drop-legacy/root/DragAndDropLegacy.context.js.map +1 -0
  20. package/cjs/data/drag-and-drop-legacy/root/DragAndDropLegacyRoot.d.ts +24 -0
  21. package/cjs/data/{drag-and-drop-old/root/DataDragAndDropRoot.js → drag-and-drop-legacy/root/DragAndDropLegacyRoot.js} +10 -10
  22. package/cjs/data/drag-and-drop-legacy/root/DragAndDropLegacyRoot.js.map +1 -0
  23. package/cjs/data/stories/Data.test-data.d.ts +24 -0
  24. package/cjs/data/stories/Data.test-data.js +1615 -0
  25. package/cjs/data/stories/Data.test-data.js.map +1 -0
  26. package/cjs/data/table/column-header/DataTableColumnHeader.d.ts +4 -1
  27. package/cjs/data/table/column-header/DataTableColumnHeader.js +4 -4
  28. package/cjs/data/table/column-header/DataTableColumnHeader.js.map +1 -1
  29. package/cjs/data/table/column-header/useTableColumnResize.d.ts +21 -18
  30. package/cjs/data/table/column-header/useTableColumnResize.js +7 -25
  31. package/cjs/data/table/column-header/useTableColumnResize.js.map +1 -1
  32. package/cjs/data/table/details-panel-row/DataTableDetailsPanelRow.d.ts +6 -0
  33. package/cjs/data/table/details-panel-row/DataTableDetailsPanelRow.js +32 -0
  34. package/cjs/data/table/details-panel-row/DataTableDetailsPanelRow.js.map +1 -0
  35. package/cjs/data/table/helpers/collectTableRowEntries.d.ts +9 -7
  36. package/cjs/data/table/helpers/collectTableRowEntries.js +21 -14
  37. package/cjs/data/table/helpers/collectTableRowEntries.js.map +1 -1
  38. package/cjs/data/table/helpers/table-focus.d.ts +0 -3
  39. package/cjs/data/table/helpers/table-focus.js +38 -8
  40. package/cjs/data/table/helpers/table-focus.js.map +1 -1
  41. package/cjs/data/table/hooks/useColumnOptions.js +18 -5
  42. package/cjs/data/table/hooks/useColumnOptions.js.map +1 -1
  43. package/cjs/data/table/hooks/useGridCache.js +2 -2
  44. package/cjs/data/table/hooks/useGridCache.js.map +1 -1
  45. package/cjs/data/table/hooks/useTableDetailsPanel.d.ts +62 -0
  46. package/cjs/data/table/hooks/{useTableExpansion.js → useTableDetailsPanel.js} +21 -20
  47. package/cjs/data/table/hooks/useTableDetailsPanel.js.map +1 -0
  48. package/cjs/data/table/hooks/useTableItems.d.ts +14 -17
  49. package/cjs/data/table/hooks/useTableItems.js +17 -16
  50. package/cjs/data/table/hooks/useTableItems.js.map +1 -1
  51. package/cjs/data/table/hooks/useTableKeyboardNav.js +5 -1
  52. package/cjs/data/table/hooks/useTableKeyboardNav.js.map +1 -1
  53. package/cjs/data/table/hooks/useTableSelection.d.ts +4 -2
  54. package/cjs/data/table/hooks/useTableSelection.js +6 -1
  55. package/cjs/data/table/hooks/useTableSelection.js.map +1 -1
  56. package/cjs/data/table/index.d.ts +1 -2
  57. package/cjs/data/table/index.js +22 -12
  58. package/cjs/data/table/index.js.map +1 -1
  59. package/cjs/data/table/root/DataTable.types.d.ts +7 -9
  60. package/cjs/data/table/root/DataTableRoot.context.d.ts +5 -1
  61. package/cjs/data/table/root/DataTableRoot.context.js.map +1 -1
  62. package/cjs/data/table/root/DataTableRoot.d.ts +79 -115
  63. package/cjs/data/table/root/DataTableRoot.js +163 -38
  64. package/cjs/data/table/root/DataTableRoot.js.map +1 -1
  65. package/cjs/data/table/root/DataTableRoot.legacy.d.ts +177 -0
  66. package/cjs/data/table/root/DataTableRoot.legacy.js +104 -0
  67. package/cjs/data/table/root/DataTableRoot.legacy.js.map +1 -0
  68. package/cjs/data/table/sub-row-toggle/DataTableSubRowToggle.d.ts +6 -0
  69. package/cjs/data/table/sub-row-toggle/DataTableSubRowToggle.js +21 -0
  70. package/cjs/data/table/sub-row-toggle/DataTableSubRowToggle.js.map +1 -0
  71. package/cjs/data/table/tr/DataTableTr.js +11 -11
  72. package/cjs/data/table/tr/DataTableTr.js.map +1 -1
  73. package/cjs/utils/components/dismissablelayer/DismissableLayer.js +1 -1
  74. package/cjs/utils/components/dismissablelayer/DismissableLayer.js.map +1 -1
  75. package/cjs/utils/components/floating/Floating.d.ts +16 -1
  76. package/cjs/utils/components/floating/Floating.js +50 -13
  77. package/cjs/utils/components/floating/Floating.js.map +1 -1
  78. package/cjs/utils/components/floating-menu/Menu.js +1 -1
  79. package/cjs/utils/components/floating-menu/Menu.js.map +1 -1
  80. package/cjs/utils/helpers/create-strict-context.js +1 -1
  81. package/cjs/utils/helpers/create-strict-context.js.map +1 -1
  82. package/cjs/utils/hooks/useControllableState.d.ts +5 -5
  83. package/cjs/utils/hooks/useControllableState.js.map +1 -1
  84. package/cjs/utils/hooks/useValueAsRef.js +1 -1
  85. package/cjs/utils/hooks/useValueAsRef.js.map +1 -1
  86. package/cjs/utils-external/hooks/useId.js +1 -1
  87. package/cjs/utils-external/hooks/useId.js.map +1 -1
  88. package/esm/action-menu/ActionMenu.js +1 -1
  89. package/esm/action-menu/ActionMenu.js.map +1 -1
  90. package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js +11 -12
  91. package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js.map +1 -1
  92. package/esm/data/drag-and-drop/root/DragAndDrop.context.d.ts +4 -2
  93. package/esm/data/drag-and-drop/root/DragAndDrop.context.js.map +1 -1
  94. package/esm/data/drag-and-drop/root/DragAndDropRoot.d.ts +5 -5
  95. package/esm/data/drag-and-drop/root/DragAndDropRoot.js +49 -28
  96. package/esm/data/drag-and-drop/root/DragAndDropRoot.js.map +1 -1
  97. package/esm/data/drag-and-drop/types.d.ts +0 -4
  98. package/esm/data/{drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.d.ts → drag-and-drop-legacy/drag-handler/DragAndDropDragHandlerLegacy.d.ts} +3 -3
  99. package/esm/data/{drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.js → drag-and-drop-legacy/drag-handler/DragAndDropDragHandlerLegacy.js} +4 -4
  100. package/esm/data/drag-and-drop-legacy/drag-handler/DragAndDropDragHandlerLegacy.js.map +1 -0
  101. package/esm/data/drag-and-drop-legacy/item/DragAndDropItemLegacy.d.ts +27 -0
  102. package/esm/data/{drag-and-drop-old/item/DataDragAndDropItem.js → drag-and-drop-legacy/item/DragAndDropItemLegacy.js} +11 -11
  103. package/esm/data/drag-and-drop-legacy/item/DragAndDropItemLegacy.js.map +1 -0
  104. package/esm/data/drag-and-drop-legacy/root/DragAndDropLegacy.context.d.ts +5 -0
  105. package/esm/data/drag-and-drop-legacy/root/DragAndDropLegacy.context.js +3 -0
  106. package/esm/data/drag-and-drop-legacy/root/DragAndDropLegacy.context.js.map +1 -0
  107. package/esm/data/drag-and-drop-legacy/root/DragAndDropLegacyRoot.d.ts +24 -0
  108. package/esm/data/{drag-and-drop-old/root/DataDragAndDropRoot.js → drag-and-drop-legacy/root/DragAndDropLegacyRoot.js} +8 -8
  109. package/esm/data/drag-and-drop-legacy/root/DragAndDropLegacyRoot.js.map +1 -0
  110. package/esm/data/stories/Data.test-data.d.ts +24 -0
  111. package/esm/data/stories/Data.test-data.js +1606 -0
  112. package/esm/data/stories/Data.test-data.js.map +1 -0
  113. package/esm/data/table/column-header/DataTableColumnHeader.d.ts +4 -1
  114. package/esm/data/table/column-header/DataTableColumnHeader.js +4 -4
  115. package/esm/data/table/column-header/DataTableColumnHeader.js.map +1 -1
  116. package/esm/data/table/column-header/useTableColumnResize.d.ts +21 -18
  117. package/esm/data/table/column-header/useTableColumnResize.js +7 -25
  118. package/esm/data/table/column-header/useTableColumnResize.js.map +1 -1
  119. package/esm/data/table/details-panel-row/DataTableDetailsPanelRow.d.ts +6 -0
  120. package/esm/data/table/details-panel-row/DataTableDetailsPanelRow.js +27 -0
  121. package/esm/data/table/details-panel-row/DataTableDetailsPanelRow.js.map +1 -0
  122. package/esm/data/table/helpers/collectTableRowEntries.d.ts +9 -7
  123. package/esm/data/table/helpers/collectTableRowEntries.js +21 -14
  124. package/esm/data/table/helpers/collectTableRowEntries.js.map +1 -1
  125. package/esm/data/table/helpers/table-focus.d.ts +0 -3
  126. package/esm/data/table/helpers/table-focus.js +38 -8
  127. package/esm/data/table/helpers/table-focus.js.map +1 -1
  128. package/esm/data/table/hooks/useColumnOptions.js +18 -5
  129. package/esm/data/table/hooks/useColumnOptions.js.map +1 -1
  130. package/esm/data/table/hooks/useGridCache.js +2 -2
  131. package/esm/data/table/hooks/useGridCache.js.map +1 -1
  132. package/esm/data/table/hooks/useTableDetailsPanel.d.ts +62 -0
  133. package/esm/data/table/hooks/{useTableExpansion.js → useTableDetailsPanel.js} +18 -17
  134. package/esm/data/table/hooks/useTableDetailsPanel.js.map +1 -0
  135. package/esm/data/table/hooks/useTableItems.d.ts +14 -17
  136. package/esm/data/table/hooks/useTableItems.js +17 -16
  137. package/esm/data/table/hooks/useTableItems.js.map +1 -1
  138. package/esm/data/table/hooks/useTableKeyboardNav.js +6 -2
  139. package/esm/data/table/hooks/useTableKeyboardNav.js.map +1 -1
  140. package/esm/data/table/hooks/useTableSelection.d.ts +4 -2
  141. package/esm/data/table/hooks/useTableSelection.js +6 -1
  142. package/esm/data/table/hooks/useTableSelection.js.map +1 -1
  143. package/esm/data/table/index.d.ts +1 -2
  144. package/esm/data/table/index.js +21 -1
  145. package/esm/data/table/index.js.map +1 -1
  146. package/esm/data/table/root/DataTable.types.d.ts +7 -9
  147. package/esm/data/table/root/DataTableRoot.context.d.ts +5 -1
  148. package/esm/data/table/root/DataTableRoot.context.js.map +1 -1
  149. package/esm/data/table/root/DataTableRoot.d.ts +79 -115
  150. package/esm/data/table/root/DataTableRoot.js +170 -36
  151. package/esm/data/table/root/DataTableRoot.js.map +1 -1
  152. package/esm/data/table/root/DataTableRoot.legacy.d.ts +177 -0
  153. package/esm/data/table/root/DataTableRoot.legacy.js +59 -0
  154. package/esm/data/table/root/DataTableRoot.legacy.js.map +1 -0
  155. package/esm/data/table/sub-row-toggle/DataTableSubRowToggle.d.ts +6 -0
  156. package/esm/data/table/sub-row-toggle/DataTableSubRowToggle.js +16 -0
  157. package/esm/data/table/sub-row-toggle/DataTableSubRowToggle.js.map +1 -0
  158. package/esm/data/table/tr/DataTableTr.js +11 -11
  159. package/esm/data/table/tr/DataTableTr.js.map +1 -1
  160. package/esm/utils/components/dismissablelayer/DismissableLayer.js +1 -1
  161. package/esm/utils/components/dismissablelayer/DismissableLayer.js.map +1 -1
  162. package/esm/utils/components/floating/Floating.d.ts +16 -1
  163. package/esm/utils/components/floating/Floating.js +48 -13
  164. package/esm/utils/components/floating/Floating.js.map +1 -1
  165. package/esm/utils/components/floating-menu/Menu.js +2 -2
  166. package/esm/utils/components/floating-menu/Menu.js.map +1 -1
  167. package/esm/utils/helpers/create-strict-context.js +1 -1
  168. package/esm/utils/helpers/create-strict-context.js.map +1 -1
  169. package/esm/utils/hooks/useControllableState.d.ts +5 -5
  170. package/esm/utils/hooks/useControllableState.js.map +1 -1
  171. package/esm/utils/hooks/useValueAsRef.js +1 -1
  172. package/esm/utils/hooks/useValueAsRef.js.map +1 -1
  173. package/esm/utils-external/hooks/useId.js +1 -1
  174. package/esm/utils-external/hooks/useId.js.map +1 -1
  175. package/package.json +8 -7
  176. package/src/action-menu/ActionMenu.tsx +1 -1
  177. package/src/data/drag-and-drop/drag-handler/DragAndDropDragHandler.tsx +11 -16
  178. package/src/data/drag-and-drop/root/DragAndDrop.context.tsx +4 -2
  179. package/src/data/drag-and-drop/root/DragAndDropRoot.tsx +85 -40
  180. package/src/data/drag-and-drop/types.ts +0 -5
  181. package/src/data/{drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.tsx → drag-and-drop-legacy/drag-handler/DragAndDropDragHandlerLegacy.tsx} +5 -5
  182. package/src/data/{drag-and-drop-old/item/DataDragAndDropItem.tsx → drag-and-drop-legacy/item/DragAndDropItemLegacy.tsx} +13 -13
  183. package/src/data/{drag-and-drop-old/root/DataDragAndDrop.context.tsx → drag-and-drop-legacy/root/DragAndDropLegacy.context.tsx} +3 -3
  184. package/src/data/{drag-and-drop-old/root/DataDragAndDropRoot.tsx → drag-and-drop-legacy/root/DragAndDropLegacyRoot.tsx} +19 -21
  185. package/src/data/stories/Data.test-data.tsx +1702 -0
  186. package/src/data/table/column-header/DataTableColumnHeader.tsx +8 -6
  187. package/src/data/table/column-header/useTableColumnResize.ts +29 -44
  188. package/src/data/table/details-panel-row/DataTableDetailsPanelRow.tsx +57 -0
  189. package/src/data/table/helpers/collectTableRowEntries.ts +36 -30
  190. package/src/data/table/helpers/table-focus.ts +63 -9
  191. package/src/data/table/hooks/__tests__/useTableItems.test.ts +58 -12
  192. package/src/data/table/hooks/__tests__/useTableSelection.test.ts +57 -44
  193. package/src/data/table/hooks/useColumnOptions.ts +19 -5
  194. package/src/data/table/hooks/useGridCache.ts +3 -2
  195. package/src/data/table/hooks/useTableDetailsPanel.tsx +185 -0
  196. package/src/data/table/hooks/useTableItems.ts +44 -52
  197. package/src/data/table/hooks/useTableKeyboardNav.ts +6 -2
  198. package/src/data/table/hooks/useTableSelection.ts +17 -6
  199. package/src/data/table/index.tsx +5 -3
  200. package/src/data/table/root/DataTable.types.ts +20 -9
  201. package/src/data/table/root/DataTableRoot.context.ts +5 -1
  202. package/src/data/table/root/DataTableRoot.legacy.tsx +297 -0
  203. package/src/data/table/root/DataTableRoot.tsx +484 -219
  204. package/src/data/table/root/agent-feature-gap.md +96 -0
  205. package/src/data/table/sub-row-toggle/DataTableSubRowToggle.tsx +39 -0
  206. package/src/data/table/tr/DataTableTr.tsx +14 -13
  207. package/src/utils/components/dismissablelayer/DismissableLayer.tsx +1 -1
  208. package/src/utils/components/floating/Floating.tsx +56 -13
  209. package/src/utils/components/floating-menu/Menu.tsx +4 -1
  210. package/src/utils/helpers/create-strict-context.tsx +1 -1
  211. package/src/utils/hooks/useControllableState.ts +11 -8
  212. package/src/utils/hooks/useValueAsRef.ts +1 -1
  213. package/src/utils-external/hooks/useId.ts +1 -1
  214. package/cjs/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.js.map +0 -1
  215. package/cjs/data/drag-and-drop-old/item/DataDragAndDropItem.d.ts +0 -27
  216. package/cjs/data/drag-and-drop-old/item/DataDragAndDropItem.js.map +0 -1
  217. package/cjs/data/drag-and-drop-old/root/DataDragAndDrop.context.d.ts +0 -5
  218. package/cjs/data/drag-and-drop-old/root/DataDragAndDrop.context.js +0 -6
  219. package/cjs/data/drag-and-drop-old/root/DataDragAndDrop.context.js.map +0 -1
  220. package/cjs/data/drag-and-drop-old/root/DataDragAndDropRoot.d.ts +0 -24
  221. package/cjs/data/drag-and-drop-old/root/DataDragAndDropRoot.js.map +0 -1
  222. package/cjs/data/table/hooks/useTableExpansion.d.ts +0 -27
  223. package/cjs/data/table/hooks/useTableExpansion.js.map +0 -1
  224. package/cjs/data/table/root/DataTableAuto.d.ts +0 -182
  225. package/cjs/data/table/root/DataTableAuto.js +0 -206
  226. package/cjs/data/table/root/DataTableAuto.js.map +0 -1
  227. package/esm/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.js.map +0 -1
  228. package/esm/data/drag-and-drop-old/item/DataDragAndDropItem.d.ts +0 -27
  229. package/esm/data/drag-and-drop-old/item/DataDragAndDropItem.js.map +0 -1
  230. package/esm/data/drag-and-drop-old/root/DataDragAndDrop.context.d.ts +0 -5
  231. package/esm/data/drag-and-drop-old/root/DataDragAndDrop.context.js +0 -3
  232. package/esm/data/drag-and-drop-old/root/DataDragAndDrop.context.js.map +0 -1
  233. package/esm/data/drag-and-drop-old/root/DataDragAndDropRoot.d.ts +0 -24
  234. package/esm/data/drag-and-drop-old/root/DataDragAndDropRoot.js.map +0 -1
  235. package/esm/data/table/hooks/useTableExpansion.d.ts +0 -27
  236. package/esm/data/table/hooks/useTableExpansion.js.map +0 -1
  237. package/esm/data/table/root/DataTableAuto.d.ts +0 -182
  238. package/esm/data/table/root/DataTableAuto.js +0 -170
  239. package/esm/data/table/root/DataTableAuto.js.map +0 -1
  240. package/src/data/table/hooks/useTableExpansion.tsx +0 -146
  241. package/src/data/table/root/DataTableAuto.test.tsx +0 -244
  242. package/src/data/table/root/DataTableAuto.tsx +0 -612
@@ -1,612 +0,0 @@
1
- /** biome-ignore-all lint/correctness/useHookAtTopLevel: False positive because of the way forwardRef() is added */
2
- import React, { forwardRef } from "react";
3
- import { ChevronDownIcon, ChevronRightIcon } from "@navikt/aksel-icons";
4
- import { Button } from "../../../button";
5
- import { Skeleton } from "../../../skeleton";
6
- import { useId } from "../../../utils-external";
7
- import { cl } from "../../../utils/helpers";
8
- import { useMergeRefs } from "../../../utils/hooks";
9
- import { DataTableBaseCell } from "../base-cell/DataTableBaseCell";
10
- import { DataTableColumnHeader } from "../column-header/DataTableColumnHeader";
11
- import { DataTableEmptyState } from "../empty-state/DataTableEmptyState";
12
- import { useColumnOptions } from "../hooks/useColumnOptions";
13
- import {
14
- DataTableExpansionProvider,
15
- getDataTableExpansionId,
16
- useDataTableExpansion,
17
- } from "../hooks/useTableExpansion";
18
- import {
19
- type ItemDetail,
20
- TableItemsProvider,
21
- useTableItems,
22
- useTableItemsContext,
23
- } from "../hooks/useTableItems";
24
- import { useTableKeyboardNav } from "../hooks/useTableKeyboardNav";
25
- import {
26
- type SelectionProps,
27
- useTableSelection,
28
- } from "../hooks/useTableSelection";
29
- import { type TableSortOptions, useTableSort } from "../hooks/useTableSort";
30
- import { DataTableLoadingState } from "../loading-state/DataTableLoadingState";
31
- import { DataTableTbody } from "../tbody/DataTableTbody";
32
- import { DataTableThead } from "../thead/DataTableThead";
33
- import { DataTableTr } from "../tr/DataTableTr";
34
- import type { ColumnDefinitions } from "./DataTable.types";
35
- import {
36
- DataTableContextProvider,
37
- useDataTableContext,
38
- } from "./DataTableRoot.context";
39
-
40
- interface DataTableProps<T>
41
- extends React.HTMLAttributes<HTMLTableElement>, TableSortOptions {
42
- children?: never;
43
- /**
44
- * Controls vertical cell padding.
45
- * @default "normal"
46
- */
47
- rowDensity?: "condensed" | "normal" | "spacious";
48
- /**
49
- * Zebra striped table
50
- * @default false
51
- */
52
- zebraStripes?: boolean;
53
- /**
54
- * Truncate content in cells and show ellipsis for overflowed text.
55
- *
56
- * **NB:** When using `layout="auto"`, you have to manually set a `maxWidth` on columns that should be truncated.
57
- * @default true
58
- */
59
- truncateContent?: boolean; // TODO: Consider making this default false when layout=auto, and maybe disallow it but add a wrap prop on the td-comp.
60
- /**
61
- * Enables keyboard navigation for table rows and cells.
62
- * @default false
63
- */
64
- withKeyboardNav?: boolean;
65
- /**
66
- * Custom callback to determine if navigation should be blocked.
67
- * Called before default blocking logic.
68
- * Requires `withKeyboardNav` to be `true`.
69
- */
70
- shouldBlockNavigation?: (event: KeyboardEvent) => boolean;
71
- /**
72
- * Controls table layout.
73
- *
74
- * ### fixed
75
- * Gives you full control of column widths. This is required for resizable columns.
76
- *
77
- * ### auto
78
- * Makes the columns resize automatically based on the content.
79
- * The table will take up at least 100% of available width.
80
- *
81
- * **NB:** When using this with `truncateContent`, you have to manually
82
- * set a `contentMaxWidth` on cells that should be truncated.
83
- * @default "fixed"
84
- */
85
- layout?: "fixed" | "auto";
86
- /**
87
- * Defines the columns of the table and how to render them.
88
- *
89
- *
90
- * 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.
91
- */
92
- columnDefinitions: ColumnDefinitions<T>;
93
- /**
94
- * The data to display in the table.
95
- *
96
- *
97
- * Each object in the array represents a row, and the properties of the object are used to render the cells based on the `columnDefinitions`.
98
- */
99
- data: T[];
100
- /**
101
- * Function to get unique row id from row data.
102
- *
103
- *
104
- * 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.
105
- */
106
- getRowId?: (rowData: T, index: number) => string | number;
107
- /**
108
- * Sticky columns that remain visible when horizontally scrolling the table.
109
- *
110
- * You can specify 1 sticky column on the left and 1 on the right.
111
- */
112
- stickyColumns?: {
113
- first?: "1";
114
- last?: "1";
115
- };
116
- /**
117
- * @default false
118
- */
119
- stickyHeader?: boolean;
120
- /**
121
- * Callback invoked when a data row is clicked.
122
- * Not called when clicking header, loading, or empty-state rows.
123
- */
124
- onRowClick?: (
125
- rowId: string | number,
126
- event: React.MouseEvent<HTMLTableRowElement>,
127
- ) => void;
128
- /**
129
- * Content to render when `data` is empty.
130
- * Rendered inside a `DataTable.EmptyState` row spanning all columns.
131
- */
132
- emptyState?: React.ReactNode;
133
- /**
134
- * Shows the table in a loading state.
135
- *
136
- * - When `loadingState` is provided, it is rendered inside a `DataTable.LoadingState` row.
137
- * - When `loadingState` is **not** provided, skeleton placeholder rows are rendered instead.
138
- * @default false
139
- */
140
- isLoading?: boolean;
141
- /**
142
- * Custom content to render when `isLoading` is `true`.
143
- * Rendered inside a `DataTable.LoadingState` row spanning all columns.
144
- * When omitted, skeleton rows are rendered based on `loadingRows`.
145
- */
146
- loadingState?: React.ReactNode;
147
- /**
148
- * Number of skeleton rows to render when `isLoading` is `true` and no `loadingState` is provided.
149
- *
150
- *
151
- * If not provided, the rendered content will get a temporarily overlay while loading
152
- */
153
- loadingRows?: number;
154
- /**
155
- * Visually hidden label announced to screen readers when skeleton rows are shown.
156
- * Only used when `isLoading` is `true` and no `loadingState` is provided.
157
- * @default "Laster innhold"
158
- */
159
- loadingLabel?: string;
160
- /**
161
- * Renders a details panel below the row when expanded.
162
- * When provided, an expand toggle column is added automatically.
163
- */
164
- getDetailsPanelContent?: (rowData: T) => React.ReactNode;
165
- /**
166
- * Determines whether a row can be expanded to show details panel content.
167
- * @default () => true
168
- */
169
- isDetailsPanelExpandable?: (rowData: T) => boolean;
170
- /**
171
- * Controlled list of expanded row IDs.
172
- * Use with `onDetailsPanelChange` for controlled usage, or `defaultDetailsPanelRowIds` for uncontrolled.
173
- */
174
- detailsPanelRowIds?: (string | number)[];
175
- /**
176
- * Initial list of expanded row IDs for uncontrolled usage.
177
- * @default []
178
- */
179
- defaultDetailsPanelRowIds?: (string | number)[];
180
- /**
181
- * Called when the list of expanded row IDs changes.
182
- *
183
- *
184
- * TODO:
185
- * - Docs: This pattern is called "Master / Detail" in general terms
186
- */
187
- onDetailsPanelChange?: (ids: (string | number)[]) => void;
188
- /**
189
- * Returns the height (in px) or `"auto"` for a row's details panel.
190
- * When a number is returned, the panel scrolls within that fixed height.
191
- * @default "auto"
192
- */
193
- getDetailsPanelHeight?: (rowData: T) => number | "auto";
194
- /**
195
- * Shows an expand-all toggle button in the expand column header.
196
- * @default false
197
- */
198
- showExpandAll?: boolean;
199
- /**
200
- * Function to get sub-rows for a given row, used for nested rows.
201
- * When provided, an expand toggle column is added automatically.
202
- *
203
- *
204
- * TODO:
205
- * - Table might need to be implemented with role="treegrid" for a11y when having nested rows.
206
- */
207
- getSubRows?: (rowData: T) => T[];
208
- expandedSubRowIds?: (string | number)[];
209
- defaultExpandedSubRowIds?: (string | number)[];
210
- isSubRowExpandable?: (rowData: T) => boolean;
211
- onExpandedSubRowIdsChange?: (ids: (string | number)[]) => void;
212
- /**
213
- * Props for row selection functionality.
214
- */
215
- selection?: SelectionProps;
216
- }
217
-
218
- function DataTableAutoInner<T>(
219
- {
220
- className,
221
- id,
222
- rowDensity = "normal",
223
- withKeyboardNav = false,
224
- zebraStripes = false,
225
- truncateContent = true,
226
- shouldBlockNavigation,
227
- layout = "fixed",
228
- selection,
229
- data,
230
- columnDefinitions,
231
- getRowId,
232
- stickyColumns,
233
- stickyHeader = false,
234
- sort: sortProp,
235
- defaultSort = [],
236
- onSortChange,
237
- onRowClick,
238
- emptyState,
239
- isLoading = false,
240
- loadingState,
241
- loadingRows,
242
- loadingLabel = "Laster innhold",
243
- getDetailsPanelContent,
244
- isDetailsPanelExpandable,
245
- getDetailsPanelHeight,
246
- showExpandAll = false,
247
- detailsPanelRowIds,
248
- defaultDetailsPanelRowIds,
249
- onDetailsPanelChange,
250
- getSubRows,
251
- expandedSubRowIds,
252
- defaultExpandedSubRowIds,
253
- isSubRowExpandable,
254
- onExpandedSubRowIdsChange,
255
- ...rest
256
- }: DataTableProps<T>,
257
- forwardedRef: React.ForwardedRef<HTMLTableElement>,
258
- ) {
259
- const { tabIndex, setTableRef } = useTableKeyboardNav({
260
- enabled: withKeyboardNav,
261
- shouldBlockNavigation,
262
- });
263
-
264
- const { sortState, onSortClick } = useTableSort({
265
- defaultSort,
266
- onSortChange,
267
- sort: sortProp,
268
- });
269
-
270
- const mergedRef = useMergeRefs(forwardedRef, setTableRef);
271
-
272
- const tableItems = useTableItems({
273
- items: data,
274
- getRowId,
275
- getSubRows,
276
- expandedSubRowIds,
277
- defaultExpandedSubRowIds,
278
- isSubRowExpandable,
279
- onExpandedSubRowIdsChange,
280
- });
281
-
282
- const {
283
- selectionMode: selectionModeProp = "none",
284
- selectedKeys,
285
- defaultSelectedKeys,
286
- onSelectionChange,
287
- disabledSelectionKeys = [],
288
- disableRowSelectionOnClick = false,
289
- } = selection || {};
290
-
291
- const tableSelectionState = useTableSelection({
292
- selectionMode: selectionModeProp,
293
- selectedKeys,
294
- defaultSelectedKeys,
295
- onSelectionChange,
296
- disabledSelectionKeys,
297
- visibleRowIds: tableItems.visibleRowIds,
298
- childRowIdsById: tableItems.childRowIdsById,
299
- });
300
-
301
- const { columns, stickySelection } = useColumnOptions<T>(columnDefinitions, {
302
- stickyColumns,
303
- selectionMode: tableSelectionState.selection.selectionMode,
304
- });
305
-
306
- const fullWidthColSpan =
307
- columns.length +
308
- (layout === "fixed" ? 1 : 0) +
309
- (tableSelectionState.selection.selectionMode !== "none" ? 1 : 0) +
310
- (getDetailsPanelContent ? 1 : 0);
311
-
312
- const tableId = useId(id);
313
-
314
- return (
315
- <DataTableContextProvider
316
- layout={layout}
317
- withKeyboardNav={withKeyboardNav}
318
- selectionState={tableSelectionState}
319
- stickySelection={stickySelection}
320
- stickyHeader={stickyHeader}
321
- tableId={tableId}
322
- showLoadingSkeletons={isLoading && loadingState == null}
323
- onRowClick={onRowClick}
324
- disableRowSelectionOnClick={disableRowSelectionOnClick}
325
- isLoading={isLoading}
326
- showLoadingOverlay={isLoading && !loadingState && !loadingRows}
327
- columns={columns}
328
- >
329
- <TableItemsProvider
330
- itemDetails={tableItems.itemDetails}
331
- items={tableItems.items}
332
- onExpandedSubRowIdsChange={tableItems.onExpandedSubRowIdsChange}
333
- isSubRowExpanded={tableItems.isSubRowExpanded}
334
- >
335
- <DataTableExpansionProvider
336
- detailsPanelRowIds={detailsPanelRowIds}
337
- defaultDetailsPanelRowIds={defaultDetailsPanelRowIds}
338
- onDetailsPanelChange={onDetailsPanelChange}
339
- getDetailsPanelContent={getDetailsPanelContent}
340
- isDetailsPanelExpandable={isDetailsPanelExpandable}
341
- getDetailsPanelHeight={getDetailsPanelHeight}
342
- showExpandAll={showExpandAll}
343
- >
344
- <div className="aksel-data-table__border-wrapper">
345
- <div className="aksel-data-table__scroll-wrapper">
346
- <table
347
- {...rest}
348
- ref={mergedRef}
349
- className={cl("aksel-data-table", className)}
350
- data-zebra-stripes={zebraStripes}
351
- data-truncate-content={truncateContent}
352
- data-density={rowDensity}
353
- data-layout={layout}
354
- data-loading={isLoading || undefined}
355
- tabIndex={tabIndex}
356
- aria-busy={isLoading || undefined}
357
- >
358
- <DataTableThead>
359
- <DataTableTr>
360
- {columns.map(({ isSticky, colDef }) => {
361
- const sortEntry = sortState.find(
362
- (s) => s.columnId === colDef.id,
363
- );
364
- const sortDirection = sortEntry?.direction ?? "none";
365
- return (
366
- <DataTableColumnHeader
367
- maxWidth={colDef.maxWidth}
368
- minWidth={colDef.minWidth}
369
- width={colDef.width}
370
- defaultWidth={colDef.defaultWidth ?? "100%"}
371
- textAlign={colDef.align ?? "left"}
372
- key={colDef.id}
373
- isSticky={isSticky}
374
- sortable={colDef.sortable}
375
- sortDirection={sortDirection}
376
- onSortClick={(event) => onSortClick(colDef.id, event)}
377
- >
378
- {colDef.header}
379
- </DataTableColumnHeader>
380
- );
381
- })}
382
- </DataTableTr>
383
- </DataTableThead>
384
-
385
- <DataTableTbody>
386
- <DataTableAutoTBodyContent
387
- loadingState={loadingState}
388
- loadingRows={loadingRows}
389
- loadingLabel={loadingLabel}
390
- emptyState={emptyState}
391
- fullWidthColSpan={fullWidthColSpan}
392
- />
393
- </DataTableTbody>
394
- </table>
395
- </div>
396
- </div>
397
- </DataTableExpansionProvider>
398
- </TableItemsProvider>
399
- </DataTableContextProvider>
400
- );
401
- }
402
-
403
- interface DataTableAutoTBodyContentProps {
404
- loadingState: React.ReactNode;
405
- loadingLabel: string;
406
- loadingRows?: number;
407
- emptyState: React.ReactNode;
408
- fullWidthColSpan: number;
409
- }
410
-
411
- function DataTableAutoTBodyContent({
412
- loadingState,
413
- loadingRows,
414
- loadingLabel,
415
- emptyState,
416
- fullWidthColSpan,
417
- }: DataTableAutoTBodyContentProps) {
418
- const { items, itemDetails } = useTableItemsContext();
419
- const { columns, isLoading } = useDataTableContext();
420
-
421
- if (isLoading && loadingState != null) {
422
- return (
423
- <DataTableLoadingState colSpan={fullWidthColSpan}>
424
- {loadingState}
425
- </DataTableLoadingState>
426
- );
427
- }
428
-
429
- if (isLoading && loadingRows) {
430
- return (
431
- <>
432
- <tr>
433
- <td colSpan={fullWidthColSpan} className="aksel-sr-only">
434
- {loadingLabel}
435
- </td>
436
- </tr>
437
- {Array.from({ length: loadingRows }, (_, rowIndex) => (
438
- <DataTableTr key={`skeleton-row-${rowIndex}`} aria-hidden>
439
- {columns.map(({ isSticky, colDef }, colDefIndex) => (
440
- <DataTableBaseCell
441
- textAlign={colDef.align ?? "left"}
442
- key={colDef.id || colDefIndex}
443
- as={colDef.isRowHeader ? "th" : "td"}
444
- isSticky={isSticky}
445
- >
446
- <Skeleton variant="text" />
447
- </DataTableBaseCell>
448
- ))}
449
- </DataTableTr>
450
- ))}
451
- </>
452
- );
453
- }
454
-
455
- if (items.length === 0 && emptyState !== undefined) {
456
- return (
457
- <DataTableEmptyState colSpan={fullWidthColSpan}>
458
- {emptyState}
459
- </DataTableEmptyState>
460
- );
461
- }
462
-
463
- const renderLoadingAnnouncement = isLoading && !loadingState && !loadingRows;
464
-
465
- return (
466
- <>
467
- {renderLoadingAnnouncement && (
468
- <tr>
469
- <td colSpan={fullWidthColSpan} className="aksel-sr-only">
470
- {loadingLabel}
471
- </td>
472
- </tr>
473
- )}
474
- {items.map((rowData) => {
475
- const details = itemDetails.get(rowData);
476
-
477
- /* Should in theory be impossible. Look about typing this? */
478
- if (!details) {
479
- return null;
480
- }
481
-
482
- const hasSubRows = details.children.length > 0;
483
-
484
- return (
485
- <React.Fragment key={details.id}>
486
- <DataTableTr rowId={details.id}>
487
- {columns.map(({ isSticky, colDef }, colDefIndex) => {
488
- const renderNestedToggle = colDefIndex === 0 && hasSubRows;
489
- const renderNestedIndent =
490
- colDefIndex === 0 && (details.level > 0 || hasSubRows);
491
-
492
- const style: React.CSSProperties = {
493
- "--__axc-data-table-nested-depth": details.level,
494
- };
495
-
496
- return (
497
- <DataTableBaseCell
498
- textAlign={colDef.align ?? "left"}
499
- key={colDef.id || colDefIndex}
500
- as={colDef.isRowHeader ? "th" : "td"}
501
- isSticky={isSticky}
502
- data-nested={renderNestedIndent || undefined}
503
- style={style}
504
- >
505
- {renderNestedToggle && (
506
- <NestedRowToggle details={details} />
507
- )}
508
- {colDef.cell(rowData)}
509
- </DataTableBaseCell>
510
- );
511
- })}
512
- </DataTableTr>
513
- <DataTableExpandedRow
514
- rowId={details.id}
515
- rowData={rowData}
516
- fullWidthColSpan={fullWidthColSpan}
517
- />
518
- </React.Fragment>
519
- );
520
- })}
521
- </>
522
- );
523
- }
524
-
525
- function NestedRowToggle({ details }: { details: ItemDetail<any> }) {
526
- const { isSubRowExpanded, onExpandedSubRowIdsChange } =
527
- useTableItemsContext();
528
-
529
- const subRows = details.children;
530
- const hasSubRows = subRows && subRows.length > 0;
531
- const isRowExpanded = isSubRowExpanded(details.id);
532
-
533
- return (
534
- <div className="aksel-data-table__nested-toggle">
535
- {hasSubRows && (
536
- <Button
537
- variant="tertiary"
538
- data-color="neutral"
539
- size="small"
540
- onClick={(e) => {
541
- e.stopPropagation();
542
- onExpandedSubRowIdsChange(details.id);
543
- }}
544
- aria-expanded={isRowExpanded}
545
- aria-label={isRowExpanded ? "Skjul under-rader" : "Vis under-rader"}
546
- icon={
547
- isRowExpanded ? (
548
- <ChevronDownIcon aria-hidden />
549
- ) : (
550
- <ChevronRightIcon aria-hidden />
551
- )
552
- }
553
- />
554
- )}
555
- </div>
556
- );
557
- }
558
-
559
- function DataTableExpandedRow<T>({
560
- rowId,
561
- rowData,
562
- fullWidthColSpan,
563
- }: {
564
- rowId: string | number;
565
- rowData: T;
566
- fullWidthColSpan: number;
567
- }) {
568
- const { tableId } = useDataTableContext();
569
- const {
570
- enableDetailsPanel,
571
- isExpanded,
572
- getDetailsPanelContent,
573
- getDetailsPanelHeight,
574
- } = useDataTableExpansion();
575
-
576
- if (!enableDetailsPanel) {
577
- return null;
578
- }
579
-
580
- if (!isExpanded(rowId)) {
581
- return null;
582
- }
583
-
584
- const content = getDetailsPanelContent?.(rowData);
585
- const expansionId = getDataTableExpansionId(tableId, rowId);
586
-
587
- if (!content) {
588
- return null;
589
- }
590
-
591
- const panelHeight = getDetailsPanelHeight?.(rowData);
592
-
593
- const style: React.CSSProperties = panelHeight
594
- ? { height: panelHeight, overflow: "auto" }
595
- : { height: "auto" };
596
-
597
- return (
598
- <tr>
599
- <td id={expansionId} colSpan={fullWidthColSpan}>
600
- <div style={style}>{content}</div>
601
- </td>
602
- </tr>
603
- );
604
- }
605
-
606
- const DataTableAuto = forwardRef(DataTableAutoInner) as <T>(
607
- props: DataTableProps<T> & React.RefAttributes<HTMLTableElement>,
608
- ) => React.ReactElement | null;
609
-
610
- export { DataTableAuto };
611
- export type { DataTableProps };
612
- export default DataTableAuto;