@navikt/ds-react 8.10.2 → 8.10.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) 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/stories/Data.test-data.d.ts +24 -0
  4. package/cjs/data/stories/Data.test-data.js +1616 -0
  5. package/cjs/data/stories/Data.test-data.js.map +1 -0
  6. package/cjs/data/table/column-header/DataTableColumnHeader.d.ts +4 -1
  7. package/cjs/data/table/column-header/DataTableColumnHeader.js +4 -2
  8. package/cjs/data/table/column-header/DataTableColumnHeader.js.map +1 -1
  9. package/cjs/data/table/column-header/useTableColumnResize.d.ts +39 -14
  10. package/cjs/data/table/column-header/useTableColumnResize.js +37 -39
  11. package/cjs/data/table/column-header/useTableColumnResize.js.map +1 -1
  12. package/cjs/data/table/details-panel-row/DataTableDetailsPanelRow.d.ts +6 -0
  13. package/cjs/data/table/details-panel-row/DataTableDetailsPanelRow.js +32 -0
  14. package/cjs/data/table/details-panel-row/DataTableDetailsPanelRow.js.map +1 -0
  15. package/cjs/data/table/helpers/collectTableRowEntries.d.ts +13 -5
  16. package/cjs/data/table/helpers/collectTableRowEntries.js +26 -19
  17. package/cjs/data/table/helpers/collectTableRowEntries.js.map +1 -1
  18. package/cjs/data/table/helpers/selection/SelectionSubtreeHelper.d.ts +46 -0
  19. package/cjs/data/table/helpers/selection/SelectionSubtreeHelper.js +112 -0
  20. package/cjs/data/table/helpers/selection/SelectionSubtreeHelper.js.map +1 -0
  21. package/cjs/data/table/helpers/selection/getMultipleSelectProps.d.ts +3 -2
  22. package/cjs/data/table/helpers/selection/getMultipleSelectProps.js +43 -19
  23. package/cjs/data/table/helpers/selection/getMultipleSelectProps.js.map +1 -1
  24. package/cjs/data/table/helpers/selection/selection.types.d.ts +1 -0
  25. package/cjs/data/table/helpers/table-keyboard.d.ts +1 -2
  26. package/cjs/data/table/helpers/table-keyboard.js +1 -2
  27. package/cjs/data/table/helpers/table-keyboard.js.map +1 -1
  28. package/cjs/data/table/hooks/useColumnOptions.js +18 -5
  29. package/cjs/data/table/hooks/useColumnOptions.js.map +1 -1
  30. package/cjs/data/table/hooks/useTableDetailsPanel.d.ts +62 -0
  31. package/cjs/data/table/hooks/{useTableExpansion.js → useTableDetailsPanel.js} +26 -19
  32. package/cjs/data/table/hooks/useTableDetailsPanel.js.map +1 -0
  33. package/cjs/data/table/hooks/useTableItems.d.ts +18 -17
  34. package/cjs/data/table/hooks/useTableItems.js +27 -15
  35. package/cjs/data/table/hooks/useTableItems.js.map +1 -1
  36. package/cjs/data/table/hooks/useTableSelection.d.ts +6 -3
  37. package/cjs/data/table/hooks/useTableSelection.js +10 -4
  38. package/cjs/data/table/hooks/useTableSelection.js.map +1 -1
  39. package/cjs/data/table/index.d.ts +1 -2
  40. package/cjs/data/table/index.js +22 -12
  41. package/cjs/data/table/index.js.map +1 -1
  42. package/cjs/data/table/root/DataTable.types.d.ts +12 -10
  43. package/cjs/data/table/root/DataTableRoot.context.d.ts +5 -1
  44. package/cjs/data/table/root/DataTableRoot.context.js.map +1 -1
  45. package/cjs/data/table/root/DataTableRoot.d.ts +79 -115
  46. package/cjs/data/table/root/DataTableRoot.js +167 -39
  47. package/cjs/data/table/root/DataTableRoot.js.map +1 -1
  48. package/cjs/data/table/root/DataTableRoot.legacy.d.ts +177 -0
  49. package/cjs/data/table/root/DataTableRoot.legacy.js +104 -0
  50. package/cjs/data/table/root/DataTableRoot.legacy.js.map +1 -0
  51. package/cjs/data/table/sub-row-toggle/DataTableSubRowToggle.d.ts +6 -0
  52. package/cjs/data/table/sub-row-toggle/DataTableSubRowToggle.js +21 -0
  53. package/cjs/data/table/sub-row-toggle/DataTableSubRowToggle.js.map +1 -0
  54. package/cjs/data/table/tr/DataTableTr.js +11 -11
  55. package/cjs/data/table/tr/DataTableTr.js.map +1 -1
  56. package/cjs/form/checkbox/Checkbox.js +1 -0
  57. package/cjs/form/checkbox/Checkbox.js.map +1 -1
  58. package/cjs/form/radio/Radio.js +7 -1
  59. package/cjs/form/radio/Radio.js.map +1 -1
  60. package/cjs/modal/types.d.ts +8 -4
  61. package/cjs/utils/components/dismissablelayer/DismissableLayer.js +1 -1
  62. package/cjs/utils/components/dismissablelayer/DismissableLayer.js.map +1 -1
  63. package/cjs/utils/components/floating/Floating.d.ts +16 -1
  64. package/cjs/utils/components/floating/Floating.js +50 -13
  65. package/cjs/utils/components/floating/Floating.js.map +1 -1
  66. package/cjs/utils/components/floating-menu/Menu.js +1 -1
  67. package/cjs/utils/components/floating-menu/Menu.js.map +1 -1
  68. package/cjs/utils/helpers/create-strict-context.js +1 -1
  69. package/cjs/utils/helpers/create-strict-context.js.map +1 -1
  70. package/cjs/utils/hooks/useControllableState.d.ts +5 -5
  71. package/cjs/utils/hooks/useControllableState.js.map +1 -1
  72. package/cjs/utils/hooks/useValueAsRef.js +1 -1
  73. package/cjs/utils/hooks/useValueAsRef.js.map +1 -1
  74. package/cjs/utils-external/hooks/useId.js +1 -1
  75. package/cjs/utils-external/hooks/useId.js.map +1 -1
  76. package/esm/action-menu/ActionMenu.js +1 -1
  77. package/esm/action-menu/ActionMenu.js.map +1 -1
  78. package/esm/data/stories/Data.test-data.d.ts +24 -0
  79. package/esm/data/stories/Data.test-data.js +1607 -0
  80. package/esm/data/stories/Data.test-data.js.map +1 -0
  81. package/esm/data/table/column-header/DataTableColumnHeader.d.ts +4 -1
  82. package/esm/data/table/column-header/DataTableColumnHeader.js +4 -2
  83. package/esm/data/table/column-header/DataTableColumnHeader.js.map +1 -1
  84. package/esm/data/table/column-header/useTableColumnResize.d.ts +39 -14
  85. package/esm/data/table/column-header/useTableColumnResize.js +38 -40
  86. package/esm/data/table/column-header/useTableColumnResize.js.map +1 -1
  87. package/esm/data/table/details-panel-row/DataTableDetailsPanelRow.d.ts +6 -0
  88. package/esm/data/table/details-panel-row/DataTableDetailsPanelRow.js +27 -0
  89. package/esm/data/table/details-panel-row/DataTableDetailsPanelRow.js.map +1 -0
  90. package/esm/data/table/helpers/collectTableRowEntries.d.ts +13 -5
  91. package/esm/data/table/helpers/collectTableRowEntries.js +26 -19
  92. package/esm/data/table/helpers/collectTableRowEntries.js.map +1 -1
  93. package/esm/data/table/helpers/selection/SelectionSubtreeHelper.d.ts +46 -0
  94. package/esm/data/table/helpers/selection/SelectionSubtreeHelper.js +109 -0
  95. package/esm/data/table/helpers/selection/SelectionSubtreeHelper.js.map +1 -0
  96. package/esm/data/table/helpers/selection/getMultipleSelectProps.d.ts +3 -2
  97. package/esm/data/table/helpers/selection/getMultipleSelectProps.js +43 -19
  98. package/esm/data/table/helpers/selection/getMultipleSelectProps.js.map +1 -1
  99. package/esm/data/table/helpers/selection/selection.types.d.ts +1 -0
  100. package/esm/data/table/helpers/table-keyboard.d.ts +1 -2
  101. package/esm/data/table/helpers/table-keyboard.js +1 -2
  102. package/esm/data/table/helpers/table-keyboard.js.map +1 -1
  103. package/esm/data/table/hooks/useColumnOptions.js +18 -5
  104. package/esm/data/table/hooks/useColumnOptions.js.map +1 -1
  105. package/esm/data/table/hooks/useTableDetailsPanel.d.ts +62 -0
  106. package/esm/data/table/hooks/useTableDetailsPanel.js +58 -0
  107. package/esm/data/table/hooks/useTableDetailsPanel.js.map +1 -0
  108. package/esm/data/table/hooks/useTableItems.d.ts +18 -17
  109. package/esm/data/table/hooks/useTableItems.js +27 -15
  110. package/esm/data/table/hooks/useTableItems.js.map +1 -1
  111. package/esm/data/table/hooks/useTableSelection.d.ts +6 -3
  112. package/esm/data/table/hooks/useTableSelection.js +10 -4
  113. package/esm/data/table/hooks/useTableSelection.js.map +1 -1
  114. package/esm/data/table/index.d.ts +1 -2
  115. package/esm/data/table/index.js +21 -1
  116. package/esm/data/table/index.js.map +1 -1
  117. package/esm/data/table/root/DataTable.types.d.ts +12 -10
  118. package/esm/data/table/root/DataTableRoot.context.d.ts +5 -1
  119. package/esm/data/table/root/DataTableRoot.context.js.map +1 -1
  120. package/esm/data/table/root/DataTableRoot.d.ts +79 -115
  121. package/esm/data/table/root/DataTableRoot.js +174 -37
  122. package/esm/data/table/root/DataTableRoot.js.map +1 -1
  123. package/esm/data/table/root/DataTableRoot.legacy.d.ts +177 -0
  124. package/esm/data/table/root/DataTableRoot.legacy.js +59 -0
  125. package/esm/data/table/root/DataTableRoot.legacy.js.map +1 -0
  126. package/esm/data/table/sub-row-toggle/DataTableSubRowToggle.d.ts +6 -0
  127. package/esm/data/table/sub-row-toggle/DataTableSubRowToggle.js +16 -0
  128. package/esm/data/table/sub-row-toggle/DataTableSubRowToggle.js.map +1 -0
  129. package/esm/data/table/tr/DataTableTr.js +11 -11
  130. package/esm/data/table/tr/DataTableTr.js.map +1 -1
  131. package/esm/form/checkbox/Checkbox.js +1 -0
  132. package/esm/form/checkbox/Checkbox.js.map +1 -1
  133. package/esm/form/radio/Radio.js +7 -1
  134. package/esm/form/radio/Radio.js.map +1 -1
  135. package/esm/modal/types.d.ts +8 -4
  136. package/esm/utils/components/dismissablelayer/DismissableLayer.js +1 -1
  137. package/esm/utils/components/dismissablelayer/DismissableLayer.js.map +1 -1
  138. package/esm/utils/components/floating/Floating.d.ts +16 -1
  139. package/esm/utils/components/floating/Floating.js +48 -13
  140. package/esm/utils/components/floating/Floating.js.map +1 -1
  141. package/esm/utils/components/floating-menu/Menu.js +2 -2
  142. package/esm/utils/components/floating-menu/Menu.js.map +1 -1
  143. package/esm/utils/helpers/create-strict-context.js +1 -1
  144. package/esm/utils/helpers/create-strict-context.js.map +1 -1
  145. package/esm/utils/hooks/useControllableState.d.ts +5 -5
  146. package/esm/utils/hooks/useControllableState.js.map +1 -1
  147. package/esm/utils/hooks/useValueAsRef.js +1 -1
  148. package/esm/utils/hooks/useValueAsRef.js.map +1 -1
  149. package/esm/utils-external/hooks/useId.js +1 -1
  150. package/esm/utils-external/hooks/useId.js.map +1 -1
  151. package/package.json +3 -3
  152. package/src/action-menu/ActionMenu.tsx +1 -1
  153. package/src/data/stories/Data.test-data.tsx +1703 -0
  154. package/src/data/table/column-header/DataTableColumnHeader.tsx +11 -7
  155. package/src/data/table/column-header/useTableColumnResize.ts +95 -54
  156. package/src/data/table/details-panel-row/DataTableDetailsPanelRow.tsx +53 -0
  157. package/src/data/table/helpers/collectTableRowEntries.ts +55 -31
  158. package/src/data/table/helpers/selection/SelectionSubtreeHelper.test.ts +66 -0
  159. package/src/data/table/helpers/selection/SelectionSubtreeHelper.ts +162 -0
  160. package/src/data/table/helpers/selection/getMultipleSelectProps.ts +57 -20
  161. package/src/data/table/helpers/selection/selection.types.ts +1 -0
  162. package/src/data/table/helpers/table-keyboard.ts +1 -2
  163. package/src/data/table/hooks/__tests__/useTableItems.test.ts +27 -6
  164. package/src/data/table/hooks/__tests__/useTableSelection.test.ts +182 -58
  165. package/src/data/table/hooks/useColumnOptions.ts +19 -5
  166. package/src/data/table/hooks/useTableDetailsPanel.tsx +182 -0
  167. package/src/data/table/hooks/useTableItems.ts +74 -60
  168. package/src/data/table/hooks/useTableSelection.ts +27 -12
  169. package/src/data/table/index.tsx +5 -3
  170. package/src/data/table/root/DataTable.types.ts +25 -10
  171. package/src/data/table/root/DataTableRoot.context.ts +5 -1
  172. package/src/data/table/root/DataTableRoot.legacy.tsx +297 -0
  173. package/src/data/table/root/DataTableRoot.tsx +483 -219
  174. package/src/data/table/sub-row-toggle/DataTableSubRowToggle.tsx +39 -0
  175. package/src/data/table/tr/DataTableTr.tsx +14 -13
  176. package/src/form/checkbox/Checkbox.tsx +1 -0
  177. package/src/form/radio/Radio.tsx +7 -1
  178. package/src/modal/types.ts +8 -4
  179. package/src/utils/components/dismissablelayer/DismissableLayer.tsx +1 -1
  180. package/src/utils/components/floating/Floating.tsx +56 -13
  181. package/src/utils/components/floating-menu/Menu.tsx +4 -1
  182. package/src/utils/helpers/create-strict-context.tsx +1 -1
  183. package/src/utils/hooks/useControllableState.ts +11 -8
  184. package/src/utils/hooks/useValueAsRef.ts +1 -1
  185. package/src/utils-external/hooks/useId.ts +1 -1
  186. package/cjs/data/table/hooks/useTableExpansion.d.ts +0 -29
  187. package/cjs/data/table/hooks/useTableExpansion.js.map +0 -1
  188. package/cjs/data/table/root/DataTableAuto.d.ts +0 -174
  189. package/cjs/data/table/root/DataTableAuto.js +0 -206
  190. package/cjs/data/table/root/DataTableAuto.js.map +0 -1
  191. package/esm/data/table/hooks/useTableExpansion.d.ts +0 -29
  192. package/esm/data/table/hooks/useTableExpansion.js +0 -51
  193. package/esm/data/table/hooks/useTableExpansion.js.map +0 -1
  194. package/esm/data/table/root/DataTableAuto.d.ts +0 -174
  195. package/esm/data/table/root/DataTableAuto.js +0 -170
  196. package/esm/data/table/root/DataTableAuto.js.map +0 -1
  197. package/src/data/table/hooks/__tests__/useTableExpansion.test.tsx +0 -115
  198. package/src/data/table/hooks/useTableExpansion.tsx +0 -141
  199. package/src/data/table/root/DataTableAuto.test.tsx +0 -118
  200. package/src/data/table/root/DataTableAuto.tsx +0 -603
@@ -3,7 +3,8 @@ import { useId } from "../../../utils-external/index.js";
3
3
  import { useControllableState } from "../../../utils/hooks/index.js";
4
4
  import { getMultipleSelectProps } from "../helpers/selection/getMultipleSelectProps.js";
5
5
  import { getSingleSelectProps } from "../helpers/selection/getSingleSelectProps.js";
6
- function useTableSelection({ selectionMode = "none", defaultSelectedKeys, selectedKeys: selectedKeysProp, onSelectionChange, disabledSelectionKeys = [], allRowKeys, }) {
6
+ function useTableSelection({ selection = {}, visibleRowIds = [], childRowIdsById, }) {
7
+ const { selectionMode = "none", defaultSelectedKeys, selectedKeys: selectedKeysProp, onSelectionChange, disabledSelectionKeys = [], disableRowSelectionOnClick = false, } = selection;
7
8
  const radioGroupName = useId();
8
9
  const [selectedKeys, setSelectedKeys] = useControllableState({
9
10
  value: selectionMode !== "none" ? selectedKeysProp : undefined,
@@ -17,6 +18,7 @@ function useTableSelection({ selectionMode = "none", defaultSelectedKeys, select
17
18
  if (selectionMode === "none") {
18
19
  return {
19
20
  selection: Object.assign(Object.assign({ selectionMode }, baseSelection), { selectedKeys: [] }),
21
+ disableRowSelectionOnClick,
20
22
  renderSelection: false,
21
23
  };
22
24
  }
@@ -28,7 +30,8 @@ function useTableSelection({ selectionMode = "none", defaultSelectedKeys, select
28
30
  disabledKeysSet,
29
31
  name: radioGroupName,
30
32
  })),
31
- renderSelection: allRowKeys.length !== 0,
33
+ disableRowSelectionOnClick,
34
+ renderSelection: visibleRowIds.length !== 0,
32
35
  };
33
36
  }
34
37
  return {
@@ -37,9 +40,11 @@ function useTableSelection({ selectionMode = "none", defaultSelectedKeys, select
37
40
  selectedKeys,
38
41
  setSelectedKeys,
39
42
  disabledKeysSet,
40
- allRowKeys,
43
+ visibleRowIds,
44
+ childRowIdsById,
41
45
  })),
42
- renderSelection: allRowKeys.length !== 0,
46
+ disableRowSelectionOnClick,
47
+ renderSelection: visibleRowIds.length !== 0,
43
48
  };
44
49
  }
45
50
  /**
@@ -52,6 +57,7 @@ const noSelectionState = {
52
57
  disabledSelectionKeys: [],
53
58
  isRowSelected: () => false,
54
59
  },
60
+ disableRowSelectionOnClick: false,
55
61
  renderSelection: false,
56
62
  };
57
63
  export { useTableSelection, noSelectionState };
@@ -1 +1 @@
1
- {"version":3,"file":"useTableSelection.js","sourceRoot":"","sources":["../../../../src/data/table/hooks/useTableSelection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAiBjF,SAAS,iBAAiB,CAAC,EACzB,aAAa,GAAG,MAAM,EACtB,mBAAmB,EACnB,YAAY,EAAE,gBAAgB,EAC9B,iBAAiB,EACjB,qBAAqB,GAAG,EAAE,EAC1B,UAAU,GACY;IACtB,MAAM,cAAc,GAAG,KAAK,EAAE,CAAC;IAE/B,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,oBAAoB,CAAgB;QAC1E,KAAK,EAAE,aAAa,KAAK,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS;QAC9D,YAAY,EAAE,mBAAmB,aAAnB,mBAAmB,cAAnB,mBAAmB,GAAI,EAAE;QACvC,QAAQ,EAAE,iBAAiB;KAC5B,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAE7E,MAAM,eAAe,GAAG,OAAO,CAC7B,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,qBAAqB,CAAC,EACpC,CAAC,qBAAqB,CAAC,CACxB,CAAC;IAEF,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,KAAsB,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,EACtD,CAAC,eAAe,CAAC,CAClB,CAAC;IAEF,MAAM,aAAa,GAAG,EAAE,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,CAAC;IAE7E,IAAI,aAAa,KAAK,MAAM,EAAE,CAAC;QAC7B,OAAO;YACL,SAAS,gCACP,aAAa,IACV,aAAa,KAChB,YAAY,EAAE,EAAE,GACjB;YACD,eAAe,EAAE,KAAK;SACvB,CAAC;IACJ,CAAC;IAED,IAAI,aAAa,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO;YACL,SAAS,gCACP,aAAa,IACV,aAAa,GACb,oBAAoB,CAAC;gBACtB,eAAe;gBACf,eAAe;gBACf,eAAe;gBACf,IAAI,EAAE,cAAc;aACrB,CAAC,CACH;YACD,eAAe,EAAE,UAAU,CAAC,MAAM,KAAK,CAAC;SACzC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,SAAS,gCACP,aAAa,IACV,aAAa,GACb,sBAAsB,CAAC;YACxB,eAAe;YACf,YAAY;YACZ,eAAe;YACf,eAAe;YACf,UAAU;SACX,CAAC,CACH;QACD,eAAe,EAAE,UAAU,CAAC,MAAM,KAAK,CAAC;KACzC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,gBAAgB,GAA4B;IAChD,SAAS,EAAE;QACT,aAAa,EAAE,MAAM;QACrB,YAAY,EAAE,EAAE;QAChB,qBAAqB,EAAE,EAAE;QACzB,aAAa,EAAE,GAAG,EAAE,CAAC,KAAK;KAC3B;IACD,eAAe,EAAE,KAAK;CACvB,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"useTableSelection.js","sourceRoot":"","sources":["../../../../src/data/table/hooks/useTableSelection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAqBjF,SAAS,iBAAiB,CAAC,EACzB,SAAS,GAAG,EAAE,EACd,aAAa,GAAG,EAAE,EAClB,eAAe,GACO;IACtB,MAAM,EACJ,aAAa,GAAG,MAAM,EACtB,mBAAmB,EACnB,YAAY,EAAE,gBAAgB,EAC9B,iBAAiB,EACjB,qBAAqB,GAAG,EAAE,EAC1B,0BAA0B,GAAG,KAAK,GACnC,GAAG,SAAS,CAAC;IAEd,MAAM,cAAc,GAAG,KAAK,EAAE,CAAC;IAE/B,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,oBAAoB,CAAgB;QAC1E,KAAK,EAAE,aAAa,KAAK,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS;QAC9D,YAAY,EAAE,mBAAmB,aAAnB,mBAAmB,cAAnB,mBAAmB,GAAI,EAAE;QACvC,QAAQ,EAAE,iBAAiB;KAC5B,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAE7E,MAAM,eAAe,GAAG,OAAO,CAC7B,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,qBAAqB,CAAC,EACpC,CAAC,qBAAqB,CAAC,CACxB,CAAC;IAEF,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,KAAsB,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,EACtD,CAAC,eAAe,CAAC,CAClB,CAAC;IAEF,MAAM,aAAa,GAAG,EAAE,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,CAAC;IAE7E,IAAI,aAAa,KAAK,MAAM,EAAE,CAAC;QAC7B,OAAO;YACL,SAAS,gCACP,aAAa,IACV,aAAa,KAChB,YAAY,EAAE,EAAE,GACjB;YACD,0BAA0B;YAC1B,eAAe,EAAE,KAAK;SACvB,CAAC;IACJ,CAAC;IAED,IAAI,aAAa,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO;YACL,SAAS,gCACP,aAAa,IACV,aAAa,GACb,oBAAoB,CAAC;gBACtB,eAAe;gBACf,eAAe;gBACf,eAAe;gBACf,IAAI,EAAE,cAAc;aACrB,CAAC,CACH;YACD,0BAA0B;YAC1B,eAAe,EAAE,aAAa,CAAC,MAAM,KAAK,CAAC;SAC5C,CAAC;IACJ,CAAC;IAED,OAAO;QACL,SAAS,gCACP,aAAa,IACV,aAAa,GACb,sBAAsB,CAAC;YACxB,eAAe;YACf,YAAY;YACZ,eAAe;YACf,eAAe;YACf,aAAa;YACb,eAAe;SAChB,CAAC,CACH;QACD,0BAA0B;QAC1B,eAAe,EAAE,aAAa,CAAC,MAAM,KAAK,CAAC;KAC5C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,gBAAgB,GAA4B;IAChD,SAAS,EAAE;QACT,aAAa,EAAE,MAAM;QACrB,YAAY,EAAE,EAAE;QAChB,qBAAqB,EAAE,EAAE;QACzB,aAAa,EAAE,GAAG,EAAE,CAAC,KAAK;KAC3B;IACD,0BAA0B,EAAE,KAAK;IACjC,eAAe,EAAE,KAAK;CACvB,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAC"}
@@ -1,2 +1 @@
1
- export { default as DataTable, DataTableCaption, DataTableThead, DataTableTbody, DataTableTr, DataTableTh, DataTableTd, DataTableTfoot, } from "./root/DataTableRoot.js";
2
- export type { DataTableProps, DataTableCaptionProps, DataTableTheadProps, DataTableTbodyProps, DataTableTrProps, DataTableThProps, DataTableTdProps, DataTableTfootProps, } from "./root/DataTableRoot.js";
1
+ export { DataTable, type DataTableProps } from "./root/DataTableRoot.js";
@@ -1,3 +1,23 @@
1
1
  "use client";
2
- export { default as DataTable, DataTableCaption, DataTableThead, DataTableTbody, DataTableTr, DataTableTh, DataTableTd, DataTableTfoot, } from "./root/DataTableRoot.js";
2
+ /* export {
3
+ default as DataTable,
4
+ DataTableCaption,
5
+ DataTableThead,
6
+ DataTableTbody,
7
+ DataTableTr,
8
+ DataTableTh,
9
+ DataTableTd,
10
+ DataTableTfoot,
11
+ } from "./root/DataTableRoot.legacy.js";
12
+ export type {
13
+ DataTableProps,
14
+ DataTableCaptionProps,
15
+ DataTableTheadProps,
16
+ DataTableTbodyProps,
17
+ DataTableTrProps,
18
+ DataTableThProps,
19
+ DataTableTdProps,
20
+ DataTableTfootProps,
21
+ } from "./root/DataTableRoot.legacy.js"; */
22
+ export { DataTable } from "./root/DataTableRoot.js";
3
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/data/table/index.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,OAAO,EACL,OAAO,IAAI,SAAS,EACpB,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,WAAW,EACX,WAAW,EACX,WAAW,EACX,cAAc,GACf,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/data/table/index.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb;;;;;;;;;;;;;;;;;;;wCAmBwC;AAExC,OAAO,EAAE,SAAS,EAAuB,MAAM,sBAAsB,CAAC"}
@@ -1,21 +1,19 @@
1
+ import type { ResizeProps } from "../column-header/useTableColumnResize.js";
1
2
  type SortDirection = "asc" | "desc" | "none";
2
3
  /**
3
4
  * TODO:
4
5
  * - Consider "accessorKey" or similar to allow simple column definitions without a cell function.
5
6
  * - Add "align" property for better control over text alignment in cells.
6
7
  */
7
- type ColumnDefinition<T> = {
8
+ type ColumnDefinition<T, DetailsT = Record<string, any>> = Pick<ResizeProps, "resizable" | "width" | "defaultWidth" | "autoWidth" | "minWidth" | "maxWidth" | "onWidthChange"> & {
8
9
  id: string;
9
- width?: number | string;
10
- defaultWidth?: number | string;
11
- minWidth?: number | string;
12
- maxWidth?: number | string;
13
10
  /**
14
- * Currently only handles cell alignment.
15
- * TODO: Should this include centering?
16
- * type "icon" or something to avoid ellipsis on actions, tags etc
11
+ * Text alignment for cells in this column.
12
+ *
13
+ *
14
+ * @default "left"
17
15
  */
18
- type?: "string" | "number";
16
+ align?: "left" | "right" | "center";
19
17
  /**
20
18
  * Assigned to the cell's `th` element instead of `td` if true.
21
19
  *
@@ -42,8 +40,12 @@ type ColumnDefinition<T> = {
42
40
  * Use `sort` and `onSortChange` on the root component to control sort state.
43
41
  */
44
42
  sortable?: boolean;
43
+ /**
44
+ * Additional metadata that can be used for filtering or other purposes. Not used by the table itself.
45
+ */
46
+ details?: DetailsT;
45
47
  };
46
- type ColumnDefinitions<T> = ColumnDefinition<T>[];
48
+ type ColumnDefinitions<T, DetailsT = Record<string, any>> = ColumnDefinition<T, DetailsT>[];
47
49
  /**
48
50
  * A single sort entry representing a column's current sort state.
49
51
  * Absent from the `sort` array means the column is unsorted.
@@ -9,10 +9,14 @@ type DataTableContextProps<T> = {
9
9
  tableId: string;
10
10
  showLoadingSkeletons: boolean;
11
11
  onRowClick?: (rowId: string | number, event: React.MouseEvent<HTMLTableRowElement>) => void;
12
- disableRowSelectionOnClick: boolean;
13
12
  isLoading?: boolean;
14
13
  showLoadingOverlay: boolean;
15
14
  columns: UseColumnOptionsResult<T>["columns"];
15
+ /**
16
+ * Used to set exact colspan for detailsPanel, loadingState and emptyState.
17
+ * This is necessary to ensure that these components span the entire width of the table.
18
+ */
19
+ fullWidthColSpan: number;
16
20
  };
17
21
  declare const DataTableContextProvider: import("react").FC<DataTableContextProps<any> & {
18
22
  children: React.ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"DataTableRoot.context.js","sourceRoot":"","sources":["../../../../src/data/table/root/DataTableRoot.context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAsB7D,MAAM,EAAE,QAAQ,EAAE,wBAAwB,EAAE,UAAU,EAAE,mBAAmB,EAAE,GAC3E,mBAAmB,CAA6B;IAC9C,IAAI,EAAE,kBAAkB;IACxB,YAAY,EAAE,mDAAmD;CAClE,CAAC,CAAC;AAIL,MAAM,EACJ,QAAQ,EAAE,yBAAyB,EACnC,UAAU,EAAE,oBAAoB,GACjC,GAAG,mBAAmB,CAAkC;IACvD,IAAI,EAAE,mBAAmB;IACzB,YAAY,EACV,mIAAmI;CACtI,CAAC,CAAC;AAEH,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,GACrB,CAAC"}
1
+ {"version":3,"file":"DataTableRoot.context.js","sourceRoot":"","sources":["../../../../src/data/table/root/DataTableRoot.context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AA0B7D,MAAM,EAAE,QAAQ,EAAE,wBAAwB,EAAE,UAAU,EAAE,mBAAmB,EAAE,GAC3E,mBAAmB,CAA6B;IAC9C,IAAI,EAAE,kBAAkB;IACxB,YAAY,EAAE,mDAAmD;CAClE,CAAC,CAAC;AAIL,MAAM,EACJ,QAAQ,EAAE,yBAAyB,EACnC,UAAU,EAAE,oBAAoB,GACjC,GAAG,mBAAmB,CAAkC;IACvD,IAAI,EAAE,mBAAmB;IACzB,YAAY,EACV,mIAAmI;CACtI,CAAC,CAAC;AAEH,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,GACrB,CAAC"}
@@ -1,16 +1,12 @@
1
+ /** biome-ignore-all lint/correctness/useHookAtTopLevel: False positive because of the way forwardRef() is added */
1
2
  import React from "react";
2
- import { DataTableCaption, type DataTableCaptionProps } from "../caption/DataTableCaption.js";
3
- import { DataTableEmptyState, type DataTableEmptyStateProps } from "../empty-state/DataTableEmptyState.js";
3
+ import { type DetailsPanelProps } from "../hooks/useTableDetailsPanel.js";
4
+ import { type SubRowsProps } from "../hooks/useTableItems.js";
4
5
  import { type SelectionProps } from "../hooks/useTableSelection.js";
5
- import { DataTableLoadingState, type DataTableLoadingStateProps } from "../loading-state/DataTableLoadingState.js";
6
- import { DataTableTbody, type DataTableTbodyProps } from "../tbody/DataTableTbody.js";
7
- import { DataTableTd, type DataTableTdProps } from "../td/DataTableTd.js";
8
- import { DataTableTfoot, type DataTableTfootProps } from "../tfoot/DataTableTfoot.js";
9
- import { DataTableTh, type DataTableThProps } from "../th/DataTableTh.js";
10
- import { DataTableThead, type DataTableTheadProps } from "../thead/DataTableThead.js";
11
- import { DataTableTr, type DataTableTrProps } from "../tr/DataTableTr.js";
12
- interface DataTableProps extends React.HTMLAttributes<HTMLTableElement>, SelectionProps {
13
- children: React.ReactNode;
6
+ import { type TableSortOptions } from "../hooks/useTableSort.js";
7
+ import type { ColumnDefinitions } from "./DataTable.types.js";
8
+ interface DataTableProps<T> extends React.HTMLAttributes<HTMLTableElement>, TableSortOptions {
9
+ children?: never;
14
10
  /**
15
11
  * Controls vertical cell padding.
16
12
  * @default "normal"
@@ -30,7 +26,7 @@ interface DataTableProps extends React.HTMLAttributes<HTMLTableElement>, Selecti
30
26
  truncateContent?: boolean;
31
27
  /**
32
28
  * Enables keyboard navigation for table rows and cells.
33
- * @default false
29
+ * @default true
34
30
  */
35
31
  withKeyboardNav?: boolean;
36
32
  /**
@@ -54,124 +50,92 @@ interface DataTableProps extends React.HTMLAttributes<HTMLTableElement>, Selecti
54
50
  * @default "fixed"
55
51
  */
56
52
  layout?: "fixed" | "auto";
57
- }
58
- interface DataTableRootComponent extends React.ForwardRefExoticComponent<DataTableProps & React.RefAttributes<HTMLTableElement>> {
59
- /**
60
- * @see 🏷️ {@link DataTableCaptionProps}
61
- * @example
62
- * ```jsx
63
- * <DataTable>
64
- * <DataTable.Caption>
65
- * Lorem ipsum
66
- * </DataTable.Caption
67
- * </DataTable>
68
- * ```
69
- */
70
- Caption: typeof DataTableCaption;
71
53
  /**
72
- * @see 🏷️ {@link DataTableTheadProps}
73
- * @example
74
- * ```jsx
75
- * <DataTable>
76
- * <DataTable.Thead>
77
- * ... TODO
78
- * </DataTable.Thead>
79
- * </DataTable>
80
- * ```
54
+ * Defines the columns of the table and how to render them.
55
+ *
56
+ *
57
+ * 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.
81
58
  */
82
- Thead: typeof DataTableThead;
59
+ columnDefinitions: ColumnDefinitions<T>;
83
60
  /**
84
- * @see 🏷️ {@link DataTableTbodyProps}
85
- * @example
86
- * ```jsx
87
- * <DataTable>
88
- * <DataTable.Tbody>
89
- * ... TODO
90
- * </DataTable.Tbody>
91
- * </DataTable>
92
- * ```
61
+ * The data to display in the table.
62
+ *
63
+ *
64
+ * Each object in the array represents a row, and the properties of the object are used to render the cells based on the `columnDefinitions`.
93
65
  */
94
- Tbody: typeof DataTableTbody;
66
+ data: T[];
95
67
  /**
96
- * @see 🏷️ {@link DataTableTrProps}
97
- * @example
98
- * ```jsx
99
- * <DataTable>
100
- * <DataTable.Tr>
101
- * ... TODO
102
- * </DataTable.Tr
103
- * </DataTable>
104
- * ```
68
+ * Function to get unique row id from row data.
69
+ *
70
+ *
71
+ * 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
72
  */
106
- Tr: typeof DataTableTr;
73
+ getRowId?: (rowData: T, index: number) => string | number;
107
74
  /**
108
- * @see 🏷️ {@link DataTableThProps}
109
- * @example
110
- * ```jsx
111
- * ```
75
+ * Sticky columns that remain visible when horizontally scrolling the table.
76
+ *
77
+ * You can specify 1 sticky column on the left and 1 on the right.
112
78
  */
113
- Th: typeof DataTableTh;
79
+ stickyColumns?: {
80
+ first?: "1";
81
+ last?: "1";
82
+ };
114
83
  /**
115
- * @see 🏷️ {@link DataTableTdProps}
116
- * @example
117
- * ```jsx
118
- * <DataTable>
119
- * <DataTable.Tbody>
120
- * <DataTable.Td>
121
- * Lorem ipsum
122
- * </DataTable.Td>
123
- * <DataTable.Td>
124
- * Dolor sit amet
125
- * </DataTable.Td>
126
- * </DataTable.Tbody>
127
- * </DataTable>
128
- * ```
84
+ * @default true
129
85
  */
130
- Td: typeof DataTableTd;
86
+ stickyHeader?: boolean;
131
87
  /**
132
- * @see 🏷️ {@link DataTableTfootProps}
133
- * @example
134
- * ```jsx
135
- * <DataTable>
136
- * <DataTable.Tfoot>
137
- * ...
138
- * </DataTable.Tfoot>
139
- * </DataTable>
140
- * ```
88
+ * Callback invoked when a data row is clicked.
89
+ * Not called when clicking header, loading, or empty-state rows.
141
90
  */
142
- Tfoot: typeof DataTableTfoot;
91
+ onRowClick?: (rowId: string | number, event: React.MouseEvent<HTMLTableRowElement>) => void;
143
92
  /**
144
- * @see 🏷️ {@link DataTableEmptyStateProps}
145
- * @example
146
- * ```jsx
147
- * <DataTable>
148
- * <DataTable.TBody>
149
- * <DataTable.EmptyState />
150
- * </DataTable.TBody>
151
- * </DataTable>
152
- * ```
93
+ * Content to render when `data` is empty.
94
+ * Rendered inside a `DataTable.EmptyState` row spanning all columns.
153
95
  */
154
- EmptyState: typeof DataTableEmptyState;
96
+ emptyState?: React.ReactNode;
97
+ loading?: {
98
+ /**
99
+ * Shows the table in a loading state.
100
+ *
101
+ * - When `loadingState` is provided, it is rendered inside a `DataTable.LoadingState` row.
102
+ * - When `loadingState` is **not** provided, skeleton placeholder rows are rendered instead.
103
+ * @default false
104
+ */
105
+ isLoading?: boolean;
106
+ /**
107
+ * Custom content to render when `isLoading` is `true`.
108
+ * Rendered inside a `DataTable.LoadingState` row spanning all columns.
109
+ * When omitted, skeleton rows are rendered based on `loadingRows`.
110
+ */
111
+ loadingState?: React.ReactNode;
112
+ /**
113
+ * Number of skeleton rows to render when `isLoading` is `true` and no `loadingState` is provided.
114
+ *
115
+ *
116
+ * If not provided, the rendered content will get a temporarily overlay while loading
117
+ */
118
+ loadingRows?: number;
119
+ /**
120
+ * Visually hidden label announced to screen readers when skeleton rows are shown.
121
+ * Only used when `isLoading` is `true` and no `loadingState` is provided.
122
+ * @default "Laster innhold"
123
+ */
124
+ loadingLabel?: string;
125
+ };
155
126
  /**
156
- * @see 🏷️ {@link DataTableEmptyStateProps}
157
- * @example
158
- * ```jsx
159
- * <DataTable>
160
- * <DataTable.TBody>
161
- * <DataTable.LoadingState />
162
- * </DataTable.TBody>
163
- * </DataTable>
164
- * ```
127
+ * Function to get sub-rows for a given row, used for nested rows.
128
+ * When provided, an expand toggle column is added automatically.
129
+ *
130
+ *
131
+ * TODO:
132
+ * - Table might need to be implemented with role="treegrid" for a11y when having nested rows.
165
133
  */
166
- LoadingState: typeof DataTableLoadingState;
134
+ selection?: SelectionProps;
135
+ subRows?: SubRowsProps<T>;
136
+ detailsPanel?: DetailsPanelProps<T>;
167
137
  }
168
- /**
169
- * TODO Component description etc.
170
- *
171
- * **NB:** To get sticky headers, you have to set a height restriction on the table container. You can use VStack for this:
172
- * TODO example
173
- */
174
- declare const DataTable: DataTableRootComponent;
175
- export { DataTable, DataTableCaption, DataTableEmptyState, DataTableLoadingState, DataTableTbody, DataTableTd, DataTableTfoot, DataTableTh, DataTableThead, DataTableTr, };
138
+ declare const DataTable: <T>(props: DataTableProps<T> & React.RefAttributes<HTMLTableElement>) => React.ReactElement | null;
139
+ export { DataTable };
140
+ export type { DataTableProps };
176
141
  export default DataTable;
177
- export type { DataTableCaptionProps, DataTableEmptyStateProps, DataTableLoadingStateProps, DataTableProps, DataTableTbodyProps, DataTableTdProps, DataTableTfootProps, DataTableTheadProps, DataTableThProps, DataTableTrProps, };
@@ -9,52 +9,189 @@ var __rest = (this && this.__rest) || function (s, e) {
9
9
  }
10
10
  return t;
11
11
  };
12
- import React, { forwardRef } from "react";
12
+ /** biome-ignore-all lint/correctness/useHookAtTopLevel: False positive because of the way forwardRef() is added */
13
+ import React, { forwardRef, useCallback, useEffect, useMemo, useRef, useState, } from "react";
14
+ import { Skeleton } from "../../../skeleton/index.js";
13
15
  import { useId } from "../../../utils-external/index.js";
16
+ import { Slot } from "../../../utils/components/slot/Slot.js";
14
17
  import { cl } from "../../../utils/helpers/index.js";
15
18
  import { useMergeRefs } from "../../../utils/hooks/index.js";
16
- import { DataTableCaption, } from "../caption/DataTableCaption.js";
17
- import { DataTableEmptyState, } from "../empty-state/DataTableEmptyState.js";
18
- import { DataTableExpansionProvider } from "../hooks/useTableExpansion.js";
19
+ import { DataTableBaseCell } from "../base-cell/DataTableBaseCell.js";
20
+ import { DataTableColumnHeader } from "../column-header/DataTableColumnHeader.js";
21
+ import { DataTableDetailsPanelRow } from "../details-panel-row/DataTableDetailsPanelRow.js";
22
+ import { DataTableEmptyState } from "../empty-state/DataTableEmptyState.js";
23
+ import { useColumnOptions } from "../hooks/useColumnOptions.js";
24
+ import { DataTableDetailsPanelProvider, } from "../hooks/useTableDetailsPanel.js";
25
+ import { TableItemsProvider, useTableItems, useTableItemsContext, } from "../hooks/useTableItems.js";
19
26
  import { useTableKeyboardNav } from "../hooks/useTableKeyboardNav.js";
20
- import { noSelectionState } from "../hooks/useTableSelection.js";
21
- import { DataTableLoadingState, } from "../loading-state/DataTableLoadingState.js";
22
- import { DataTableTbody, } from "../tbody/DataTableTbody.js";
23
- import { DataTableTd } from "../td/DataTableTd.js";
24
- import { DataTableTfoot, } from "../tfoot/DataTableTfoot.js";
25
- import { DataTableTh } from "../th/DataTableTh.js";
26
- import { DataTableThead, } from "../thead/DataTableThead.js";
27
+ import { useTableSelection, } from "../hooks/useTableSelection.js";
28
+ import { useTableSort } from "../hooks/useTableSort.js";
29
+ import { DataTableLoadingState } from "../loading-state/DataTableLoadingState.js";
30
+ import { DataTableSubRowToggle } from "../sub-row-toggle/DataTableSubRowToggle.js";
31
+ import { DataTableTbody } from "../tbody/DataTableTbody.js";
32
+ import { DataTableThead } from "../thead/DataTableThead.js";
27
33
  import { DataTableTr } from "../tr/DataTableTr.js";
28
- import { DataTableContextProvider } from "./DataTableRoot.context.js";
29
- const EMPTY_ITEM_DETAILS = new Map();
34
+ import { DataTableContextProvider, useDataTableContext, } from "./DataTableRoot.context.js";
35
+ function DataTableInner(_a, forwardedRef) {
36
+ var { className, id, rowDensity = "normal", withKeyboardNav = true, zebraStripes = false, truncateContent = true, shouldBlockNavigation, layout = "fixed", selection, data, columnDefinitions, getRowId, stickyColumns, stickyHeader = true, sort: sortProp, defaultSort = [], onSortChange, onRowClick, emptyState, loading, detailsPanel, subRows } = _a, rest = __rest(_a, ["className", "id", "rowDensity", "withKeyboardNav", "zebraStripes", "truncateContent", "shouldBlockNavigation", "layout", "selection", "data", "columnDefinitions", "getRowId", "stickyColumns", "stickyHeader", "sort", "defaultSort", "onSortChange", "onRowClick", "emptyState", "loading", "detailsPanel", "subRows"]);
37
+ const { sortState, onSortClick } = useTableSort({
38
+ defaultSort,
39
+ onSortChange,
40
+ sort: sortProp,
41
+ });
42
+ /**
43
+ * TODO:
44
+ * - If user currently does not give a getRowsId function, and data is nested (getSubRows)
45
+ * we end up in an infinite loop since the index based ids repeat for children and causes chaos.
46
+ */
47
+ const tableItems = useTableItems({
48
+ items: data,
49
+ getRowId: getRowId !== null && getRowId !== void 0 ? getRowId : ((_, index) => index),
50
+ subRows,
51
+ });
52
+ const tableSelectionState = useTableSelection({
53
+ selection,
54
+ visibleRowIds: tableItems.visibleRowIds,
55
+ childRowIdsById: tableItems.childRowIdsById,
56
+ });
57
+ const { columns, stickySelection } = useColumnOptions(columnDefinitions, {
58
+ stickyColumns,
59
+ selectionMode: tableSelectionState.selection.selectionMode,
60
+ });
61
+ const { isLoading = false, loadingState, loadingRows, loadingLabel = "Laster innhold", } = loading || {};
62
+ const fullWidthColSpan = useMemo(() => {
63
+ return (columns.length +
64
+ (layout === "fixed" ? 1 : 0) +
65
+ (tableSelectionState.selection.selectionMode !== "none" ? 1 : 0) +
66
+ ((detailsPanel === null || detailsPanel === void 0 ? void 0 : detailsPanel.getContent) ? 1 : 0));
67
+ }, [
68
+ columns,
69
+ layout,
70
+ tableSelectionState.selection.selectionMode,
71
+ detailsPanel,
72
+ ]);
73
+ const tableId = useId(id);
74
+ return (React.createElement(DataTableContextProvider, { layout: layout, withKeyboardNav: withKeyboardNav, selectionState: tableSelectionState, stickySelection: stickySelection, stickyHeader: stickyHeader, tableId: tableId, showLoadingSkeletons: isLoading && loadingState == null, onRowClick: onRowClick, isLoading: isLoading, showLoadingOverlay: isLoading && !loadingState && !loadingRows, columns: columns, fullWidthColSpan: fullWidthColSpan },
75
+ React.createElement(TableItemsProvider, { itemDetails: tableItems.itemDetails, items: tableItems.items, onExpandedRowIdsChange: tableItems.onExpandedRowIdsChange, isSubRowExpanded: tableItems.isSubRowExpanded },
76
+ React.createElement(DataTableDetailsPanelProvider, { detailsPanel: detailsPanel },
77
+ React.createElement(TableElementWrapper, { shouldBlockNavigation: shouldBlockNavigation, enabled: withKeyboardNav },
78
+ React.createElement("table", Object.assign({}, rest, { ref: forwardedRef, className: cl("aksel-data-table", className), "data-zebra-stripes": zebraStripes, "data-truncate-content": truncateContent, "data-density": rowDensity, "data-layout": layout, "data-loading": isLoading || undefined, "aria-busy": isLoading || undefined }),
79
+ React.createElement(DataTableThead, null,
80
+ React.createElement(DataTableTr, null, columns.map(({ isSticky, colDef }) => {
81
+ var _a, _b, _c;
82
+ const sortEntry = sortState.find((s) => s.columnId === colDef.id);
83
+ const sortDirection = (_a = sortEntry === null || sortEntry === void 0 ? void 0 : sortEntry.direction) !== null && _a !== void 0 ? _a : "none";
84
+ return (React.createElement(DataTableColumnHeader, { resizable: colDef.resizable, width: colDef.width, defaultWidth: colDef.defaultWidth, autoWidth: colDef.autoWidth, minWidth: colDef.minWidth, maxWidth: colDef.maxWidth, onWidthChange: colDef.onWidthChange, textAlign: (_b = colDef.align) !== null && _b !== void 0 ? _b : "left", key: colDef.id, isSticky: isSticky, sortable: colDef.sortable, sortDirection: sortDirection, onSortClick: (event) => onSortClick(colDef.id, event), label: colDef.label }, (_c = colDef.header) !== null && _c !== void 0 ? _c : colDef.label));
85
+ }))),
86
+ React.createElement(DataTableTbody, null,
87
+ React.createElement(DataTableTBodyContent, { loadingState: loadingState, loadingRows: loadingRows, loadingLabel: loadingLabel, emptyState: emptyState }))))))));
88
+ }
30
89
  /**
31
- * TODO Component description etc.
32
- *
33
- * **NB:** To get sticky headers, you have to set a height restriction on the table container. You can use VStack for this:
34
- * TODO example
90
+ * Temp optimization to avoid re-renders on every keyboard-move, selection change etc
35
91
  */
36
- const DataTable = forwardRef((_a, forwardedRef) => {
37
- var { className, rowDensity = "normal", withKeyboardNav = false, zebraStripes = false, truncateContent = true, shouldBlockNavigation, layout = "fixed" } = _a, rest = __rest(_a, ["className", "rowDensity", "withKeyboardNav", "zebraStripes", "truncateContent", "shouldBlockNavigation", "layout"]);
92
+ function TableElementWrapper({ children, enabled, shouldBlockNavigation, }) {
93
+ const [applyStickyStyles, setApplyStickyStyles] = useState(false);
94
+ const tableWrapperRef = useRef(null);
95
+ const tableRef = useRef(null);
96
+ const rafRef = useRef(null);
38
97
  const { tabIndex, setTableRef } = useTableKeyboardNav({
39
- enabled: withKeyboardNav,
98
+ enabled,
40
99
  shouldBlockNavigation,
41
100
  });
42
- const mergedRef = useMergeRefs(forwardedRef, setTableRef);
43
- return (React.createElement(DataTableContextProvider, { layout: layout, withKeyboardNav: withKeyboardNav, selectionState: noSelectionState, stickySelection: false, stickyHeader: false, tableId: useId(), showLoadingSkeletons: false, onRowClick: undefined, disableRowSelectionOnClick: false, showLoadingOverlay: false, columns: [] },
44
- React.createElement(DataTableExpansionProvider, { itemDetails: EMPTY_ITEM_DETAILS },
45
- React.createElement("div", { className: "aksel-data-table__border-wrapper" },
46
- React.createElement("div", { className: "aksel-data-table__scroll-wrapper" },
47
- React.createElement("table", Object.assign({}, rest, { ref: mergedRef, className: cl("aksel-data-table", className), "data-zebra-stripes": zebraStripes, "data-truncate-content": truncateContent, "data-density": rowDensity, "data-layout": layout, tabIndex: tabIndex })))))));
48
- });
49
- DataTable.Caption = DataTableCaption;
50
- DataTable.Thead = DataTableThead;
51
- DataTable.Tbody = DataTableTbody;
52
- DataTable.Th = DataTableTh;
53
- DataTable.Tr = DataTableTr;
54
- DataTable.Td = DataTableTd;
55
- DataTable.Tfoot = DataTableTfoot;
56
- DataTable.EmptyState = DataTableEmptyState;
57
- DataTable.LoadingState = DataTableLoadingState;
58
- export { DataTable, DataTableCaption, DataTableEmptyState, DataTableLoadingState, DataTableTbody, DataTableTd, DataTableTfoot, DataTableTh, DataTableThead, DataTableTr, };
101
+ const mergedTableRefs = useMergeRefs(tableRef, setTableRef);
102
+ const updateStickyStyles = useCallback(() => {
103
+ if (!tableWrapperRef.current) {
104
+ return;
105
+ }
106
+ const doesWrapperHasScroll = tableWrapperRef.current.scrollWidth > tableWrapperRef.current.clientWidth;
107
+ setApplyStickyStyles(doesWrapperHasScroll);
108
+ }, []);
109
+ const scheduleStickyStylesUpdate = useCallback(() => {
110
+ if (rafRef.current !== null) {
111
+ return;
112
+ }
113
+ rafRef.current = requestAnimationFrame(() => {
114
+ rafRef.current = null;
115
+ updateStickyStyles();
116
+ });
117
+ }, [updateStickyStyles]);
118
+ useEffect(() => {
119
+ const tableWrapperElement = tableWrapperRef.current;
120
+ if (!tableWrapperElement) {
121
+ return;
122
+ }
123
+ const handleResize = () => scheduleStickyStylesUpdate();
124
+ window.addEventListener("resize", handleResize);
125
+ let resizeObserver;
126
+ if (typeof ResizeObserver !== "undefined") {
127
+ resizeObserver = new ResizeObserver(handleResize);
128
+ resizeObserver.observe(tableWrapperElement);
129
+ if (tableRef.current) {
130
+ resizeObserver.observe(tableRef.current);
131
+ }
132
+ }
133
+ scheduleStickyStylesUpdate();
134
+ return () => {
135
+ window.removeEventListener("resize", handleResize);
136
+ resizeObserver === null || resizeObserver === void 0 ? void 0 : resizeObserver.disconnect();
137
+ if (rafRef.current !== null) {
138
+ cancelAnimationFrame(rafRef.current);
139
+ rafRef.current = null;
140
+ }
141
+ };
142
+ }, [scheduleStickyStylesUpdate]);
143
+ return (React.createElement("div", { className: "aksel-data-table__border-wrapper" },
144
+ React.createElement("div", { ref: tableWrapperRef, className: "aksel-data-table__scroll-wrapper" },
145
+ React.createElement(Slot, { tabIndex: tabIndex,
146
+ /* @ts-expect-error Ref is not typed correctly to handle this case */
147
+ ref: mergedTableRefs, "data-scroll": applyStickyStyles ? "true" : undefined }, children))));
148
+ }
149
+ function DataTableTBodyContent({ loadingState, loadingRows, loadingLabel, emptyState, }) {
150
+ const { items, itemDetails } = useTableItemsContext();
151
+ const { columns, isLoading, fullWidthColSpan } = useDataTableContext();
152
+ if (isLoading && loadingState != null) {
153
+ return (React.createElement(DataTableLoadingState, { colSpan: fullWidthColSpan }, loadingState));
154
+ }
155
+ if (isLoading && loadingRows) {
156
+ return (React.createElement(React.Fragment, null,
157
+ React.createElement("tr", null,
158
+ React.createElement("td", { colSpan: fullWidthColSpan, className: "aksel-sr-only" }, loadingLabel)),
159
+ Array.from({ length: loadingRows }, (_, rowIndex) => (React.createElement(DataTableTr, { key: `skeleton-row-${rowIndex}`, "aria-hidden": true }, columns.map(({ isSticky, colDef }, colDefIndex) => {
160
+ var _a;
161
+ return (React.createElement(DataTableBaseCell, { textAlign: (_a = colDef.align) !== null && _a !== void 0 ? _a : "left", key: colDef.id || colDefIndex, as: colDef.isRowHeader ? "th" : "td", isSticky: isSticky },
162
+ React.createElement(Skeleton, { variant: "text" })));
163
+ }))))));
164
+ }
165
+ if (items.length === 0 && emptyState !== undefined) {
166
+ return (React.createElement(DataTableEmptyState, { colSpan: fullWidthColSpan }, emptyState));
167
+ }
168
+ const renderLoadingAnnouncement = isLoading && !loadingState && !loadingRows;
169
+ return (React.createElement(React.Fragment, null,
170
+ renderLoadingAnnouncement && (React.createElement("tr", null,
171
+ React.createElement("td", { colSpan: fullWidthColSpan, className: "aksel-sr-only" }, loadingLabel))),
172
+ items.map((rowData) => {
173
+ const details = itemDetails.get(rowData);
174
+ /* Should in theory be impossible. Look about typing this? */
175
+ if (!details) {
176
+ return null;
177
+ }
178
+ const hasSubRows = details.children.length > 0;
179
+ return (React.createElement(React.Fragment, { key: details.id },
180
+ React.createElement(DataTableTr, { rowId: details.id }, columns.map(({ isSticky, colDef }, colDefIndex) => {
181
+ var _a;
182
+ const renderNestedToggle = colDefIndex === 0 && hasSubRows;
183
+ const renderNestedIndent = colDefIndex === 0 && (details.level > 0 || hasSubRows);
184
+ const style = {
185
+ "--__axc-data-table-nested-depth": details.level,
186
+ };
187
+ return (React.createElement(DataTableBaseCell, { textAlign: (_a = colDef.align) !== null && _a !== void 0 ? _a : "left", key: colDef.id || colDefIndex, as: colDef.isRowHeader ? "th" : "td", isSticky: isSticky, "data-nested": renderNestedIndent || undefined, style: style },
188
+ renderNestedToggle && (React.createElement(DataTableSubRowToggle, { details: details })),
189
+ colDef.cell(rowData)));
190
+ })),
191
+ React.createElement(DataTableDetailsPanelRow, { rowId: details.id, rowData: rowData })));
192
+ })));
193
+ }
194
+ const DataTable = forwardRef(DataTableInner);
195
+ export { DataTable };
59
196
  export default DataTable;
60
197
  //# sourceMappingURL=DataTableRoot.js.map