@navikt/ds-react 8.9.0 → 8.10.0

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 (439) hide show
  1. package/cjs/alert/base-alert/content/BaseAlertContent.js +4 -1
  2. package/cjs/alert/base-alert/content/BaseAlertContent.js.map +1 -1
  3. package/cjs/data/drag-and-drop/drag-handler/DragAndDropDragHandler.d.ts +3 -0
  4. package/cjs/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js +41 -20
  5. package/cjs/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js.map +1 -1
  6. package/cjs/data/drag-and-drop/item/DragAndDropItem.d.ts +7 -2
  7. package/cjs/data/drag-and-drop/item/DragAndDropItem.js +6 -8
  8. package/cjs/data/drag-and-drop/item/DragAndDropItem.js.map +1 -1
  9. package/cjs/data/drag-and-drop/root/DragAndDrop.context.d.ts +2 -1
  10. package/cjs/data/drag-and-drop/root/DragAndDrop.context.js.map +1 -1
  11. package/cjs/data/drag-and-drop/root/DragAndDropRoot.d.ts +7 -30
  12. package/cjs/data/drag-and-drop/root/DragAndDropRoot.js +124 -65
  13. package/cjs/data/drag-and-drop/root/DragAndDropRoot.js.map +1 -1
  14. package/cjs/data/drag-and-drop/types.d.ts +4 -0
  15. package/cjs/data/table/base-cell/DataTableBaseCell.d.ts +46 -0
  16. package/cjs/data/table/base-cell/DataTableBaseCell.js +63 -0
  17. package/cjs/data/table/base-cell/DataTableBaseCell.js.map +1 -0
  18. package/cjs/data/table/column-header/DataTableColumnHeader.d.ts +32 -0
  19. package/cjs/data/table/column-header/DataTableColumnHeader.js +108 -0
  20. package/cjs/data/table/column-header/DataTableColumnHeader.js.map +1 -0
  21. package/cjs/data/table/column-header/useTableColumnResize.js.map +1 -0
  22. package/cjs/data/table/empty-state/DataTableEmptyState.d.ts +6 -2
  23. package/cjs/data/table/empty-state/DataTableEmptyState.js +2 -2
  24. package/cjs/data/table/empty-state/DataTableEmptyState.js.map +1 -1
  25. package/cjs/data/table/helpers/selection/getMultipleSelectProps.d.ts +10 -10
  26. package/cjs/data/table/helpers/selection/getMultipleSelectProps.js +29 -28
  27. package/cjs/data/table/helpers/selection/getMultipleSelectProps.js.map +1 -1
  28. package/cjs/data/table/helpers/selection/getSingleSelectProps.d.ts +7 -5
  29. package/cjs/data/table/helpers/selection/getSingleSelectProps.js +8 -9
  30. package/cjs/data/table/helpers/selection/getSingleSelectProps.js.map +1 -1
  31. package/cjs/data/table/helpers/selection/selection.types.d.ts +44 -21
  32. package/cjs/data/table/hooks/useColumnOptions.d.ts +19 -0
  33. package/cjs/data/table/hooks/useColumnOptions.js +19 -0
  34. package/cjs/data/table/hooks/useColumnOptions.js.map +1 -0
  35. package/cjs/data/table/hooks/useTableExpansion.d.ts +26 -0
  36. package/cjs/data/table/hooks/useTableExpansion.js +68 -0
  37. package/cjs/data/table/hooks/useTableExpansion.js.map +1 -0
  38. package/cjs/data/table/hooks/useTableKeyboardNav.d.ts +2 -1
  39. package/cjs/data/table/hooks/useTableKeyboardNav.js +3 -1
  40. package/cjs/data/table/hooks/useTableKeyboardNav.js.map +1 -1
  41. package/cjs/data/table/hooks/useTableSelection.d.ts +14 -7
  42. package/cjs/data/table/hooks/useTableSelection.js +40 -27
  43. package/cjs/data/table/hooks/useTableSelection.js.map +1 -1
  44. package/cjs/data/table/hooks/useTableSort.d.ts +37 -0
  45. package/cjs/data/table/hooks/useTableSort.js +49 -0
  46. package/cjs/data/table/hooks/useTableSort.js.map +1 -0
  47. package/cjs/data/table/loading-state/DataTableLoadingState.d.ts +6 -2
  48. package/cjs/data/table/loading-state/DataTableLoadingState.js +2 -2
  49. package/cjs/data/table/loading-state/DataTableLoadingState.js.map +1 -1
  50. package/cjs/data/table/root/DataTable.types.d.ts +55 -4
  51. package/cjs/data/table/root/DataTableAuto.d.ts +97 -1
  52. package/cjs/data/table/root/DataTableAuto.js +92 -41
  53. package/cjs/data/table/root/DataTableAuto.js.map +1 -1
  54. package/cjs/data/table/root/DataTableRoot.context.d.ts +22 -1
  55. package/cjs/data/table/root/DataTableRoot.context.js +7 -1
  56. package/cjs/data/table/root/DataTableRoot.context.js.map +1 -1
  57. package/cjs/data/table/root/DataTableRoot.d.ts +0 -6
  58. package/cjs/data/table/root/DataTableRoot.js +5 -4
  59. package/cjs/data/table/root/DataTableRoot.js.map +1 -1
  60. package/cjs/data/table/tbody/DataTableTbody.js +7 -1
  61. package/cjs/data/table/tbody/DataTableTbody.js.map +1 -1
  62. package/cjs/data/table/td/DataTableTd.d.ts +3 -19
  63. package/cjs/data/table/td/DataTableTd.js +3 -5
  64. package/cjs/data/table/td/DataTableTd.js.map +1 -1
  65. package/cjs/data/table/tfoot/DataTableTfoot.js +3 -1
  66. package/cjs/data/table/tfoot/DataTableTfoot.js.map +1 -1
  67. package/cjs/data/table/th/DataTableTh.d.ts +3 -44
  68. package/cjs/data/table/th/DataTableTh.js +3 -54
  69. package/cjs/data/table/th/DataTableTh.js.map +1 -1
  70. package/cjs/data/table/thead/DataTableThead.js +2 -2
  71. package/cjs/data/table/thead/DataTableThead.js.map +1 -1
  72. package/cjs/data/table/tr/DataTableTr.d.ts +8 -0
  73. package/cjs/data/table/tr/DataTableTr.js +131 -9
  74. package/cjs/data/table/tr/DataTableTr.js.map +1 -1
  75. package/cjs/data/token-filter/FilterChip.d.ts +10 -0
  76. package/cjs/data/token-filter/FilterChip.js +65 -0
  77. package/cjs/data/token-filter/FilterChip.js.map +1 -0
  78. package/cjs/data/token-filter/TokenFilter.js +3 -10
  79. package/cjs/data/token-filter/TokenFilter.js.map +1 -1
  80. package/cjs/date/datepicker/hooks/useRangeDatepicker.js +1 -1
  81. package/cjs/date/datepicker/hooks/useRangeDatepicker.js.map +1 -1
  82. package/cjs/date/datepicker/parts/DatePicker.DayButton.js +3 -1
  83. package/cjs/date/datepicker/parts/DatePicker.DayButton.js.map +1 -1
  84. package/cjs/date/datepicker/parts/DatePicker.RDP.d.ts +1 -1
  85. package/cjs/date/datepicker/parts/DatePicker.RDP.js +26 -11
  86. package/cjs/date/datepicker/parts/DatePicker.RDP.js.map +1 -1
  87. package/cjs/date/monthpicker/parts/MonthPicker.Button.js +7 -5
  88. package/cjs/date/monthpicker/parts/MonthPicker.Button.js.map +1 -1
  89. package/cjs/date/monthpicker/parts/MonthPicker.Standalone.d.ts +1 -1
  90. package/cjs/dialog/popup/DialogPopupInternal.js +1 -1
  91. package/cjs/dialog/popup/DialogPopupInternal.js.map +1 -1
  92. package/cjs/form/checkbox/Checkbox.js +19 -33
  93. package/cjs/form/checkbox/Checkbox.js.map +1 -1
  94. package/cjs/form/checkbox/CheckboxGroup.context.d.ts +6 -0
  95. package/cjs/form/checkbox/CheckboxGroup.context.js +6 -0
  96. package/cjs/form/checkbox/CheckboxGroup.context.js.map +1 -0
  97. package/cjs/form/checkbox/CheckboxGroup.d.ts +0 -6
  98. package/cjs/form/checkbox/CheckboxGroup.js +8 -8
  99. package/cjs/form/checkbox/CheckboxGroup.js.map +1 -1
  100. package/cjs/form/checkbox/checkbox-input/CheckboxInput.d.ts +21 -0
  101. package/cjs/form/checkbox/checkbox-input/CheckboxInput.js +65 -0
  102. package/cjs/form/checkbox/checkbox-input/CheckboxInput.js.map +1 -0
  103. package/cjs/form/checkbox/types.d.ts +1 -1
  104. package/cjs/form/checkbox/useCheckbox.js +2 -2
  105. package/cjs/form/checkbox/useCheckbox.js.map +1 -1
  106. package/cjs/form/combobox/ComboboxWrapper.js +1 -3
  107. package/cjs/form/combobox/ComboboxWrapper.js.map +1 -1
  108. package/cjs/form/error-summary/ErrorSummary.js +1 -3
  109. package/cjs/form/error-summary/ErrorSummary.js.map +1 -1
  110. package/cjs/form/fieldset/Fieldset.d.ts +0 -4
  111. package/cjs/form/fieldset/Fieldset.js +5 -9
  112. package/cjs/form/fieldset/Fieldset.js.map +1 -1
  113. package/cjs/form/fieldset/useFieldset.d.ts +5 -3
  114. package/cjs/form/fieldset/useFieldset.js +9 -4
  115. package/cjs/form/fieldset/useFieldset.js.map +1 -1
  116. package/cjs/form/radio/Radio.js +9 -7
  117. package/cjs/form/radio/Radio.js.map +1 -1
  118. package/cjs/form/radio/RadioGroup.context.d.ts +8 -0
  119. package/cjs/form/radio/RadioGroup.context.js +6 -0
  120. package/cjs/form/radio/RadioGroup.context.js.map +1 -0
  121. package/cjs/form/radio/RadioGroup.d.ts +0 -8
  122. package/cjs/form/radio/RadioGroup.js +10 -10
  123. package/cjs/form/radio/RadioGroup.js.map +1 -1
  124. package/cjs/form/radio/radio-input/RadioInput.d.ts +19 -0
  125. package/cjs/{data/table/thead/DataTableThead.context.js → form/radio/radio-input/RadioInput.js} +19 -9
  126. package/cjs/form/radio/radio-input/RadioInput.js.map +1 -0
  127. package/cjs/form/radio/useRadio.js +2 -2
  128. package/cjs/form/radio/useRadio.js.map +1 -1
  129. package/cjs/form/search/Search.js +1 -3
  130. package/cjs/form/search/Search.js.map +1 -1
  131. package/cjs/inline-message/root/InlineMessage.js +2 -5
  132. package/cjs/inline-message/root/InlineMessage.js.map +1 -1
  133. package/cjs/modal/Modal.js +1 -3
  134. package/cjs/modal/Modal.js.map +1 -1
  135. package/cjs/modal/ModalUtils.js +1 -1
  136. package/cjs/modal/ModalUtils.js.map +1 -1
  137. package/cjs/primitives/box/Box.d.ts +1 -1
  138. package/cjs/process/Process.js +1 -5
  139. package/cjs/process/Process.js.map +1 -1
  140. package/cjs/tabs/useTabs.js +3 -7
  141. package/cjs/tabs/useTabs.js.map +1 -1
  142. package/cjs/timeline/Timeline.js +25 -62
  143. package/cjs/timeline/Timeline.js.map +1 -1
  144. package/cjs/timeline/TimelineRow.js +10 -14
  145. package/cjs/timeline/TimelineRow.js.map +1 -1
  146. package/cjs/timeline/hooks/TimelineKeyboardNavProvider.d.ts +16 -0
  147. package/cjs/timeline/hooks/TimelineKeyboardNavProvider.js +179 -0
  148. package/cjs/timeline/hooks/TimelineKeyboardNavProvider.js.map +1 -0
  149. package/cjs/timeline/hooks/usePeriodContext.d.ts +0 -1
  150. package/cjs/timeline/hooks/usePeriodContext.js +0 -1
  151. package/cjs/timeline/hooks/usePeriodContext.js.map +1 -1
  152. package/cjs/timeline/hooks/useRowContext.d.ts +0 -1
  153. package/cjs/timeline/hooks/useRowContext.js +0 -1
  154. package/cjs/timeline/hooks/useRowContext.js.map +1 -1
  155. package/cjs/timeline/hooks/useTimelineContext.d.ts +0 -4
  156. package/cjs/timeline/hooks/useTimelineContext.js +0 -4
  157. package/cjs/timeline/hooks/useTimelineContext.js.map +1 -1
  158. package/cjs/timeline/period/ClickablePeriod.js +6 -20
  159. package/cjs/timeline/period/ClickablePeriod.js.map +1 -1
  160. package/cjs/timeline/period/NonClickablePeriod.js +1 -1
  161. package/cjs/timeline/period/NonClickablePeriod.js.map +1 -1
  162. package/cjs/timeline/pin/PinInternal.js +9 -10
  163. package/cjs/timeline/pin/PinInternal.js.map +1 -1
  164. package/cjs/toggle-group/useToggleGroup.js +1 -1
  165. package/cjs/toggle-group/useToggleGroup.js.map +1 -1
  166. package/cjs/utils/components/HighlightText/HighlightText.js +1 -4
  167. package/cjs/utils/components/HighlightText/HighlightText.js.map +1 -1
  168. package/cjs/utils/components/dismissablelayer/DismissableLayer.js +1 -1
  169. package/cjs/utils/components/dismissablelayer/DismissableLayer.js.map +1 -1
  170. package/cjs/utils/helpers/create-strict-context.js +1 -1
  171. package/cjs/utils/helpers/create-strict-context.js.map +1 -1
  172. package/cjs/utils/hooks/useEventCallback.js +1 -1
  173. package/cjs/utils/hooks/useEventCallback.js.map +1 -1
  174. package/cjs/utils/hooks/useMedia.js +1 -1
  175. package/cjs/utils/hooks/useMedia.js.map +1 -1
  176. package/esm/alert/base-alert/content/BaseAlertContent.js +4 -1
  177. package/esm/alert/base-alert/content/BaseAlertContent.js.map +1 -1
  178. package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.d.ts +3 -0
  179. package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js +41 -20
  180. package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js.map +1 -1
  181. package/esm/data/drag-and-drop/item/DragAndDropItem.d.ts +7 -2
  182. package/esm/data/drag-and-drop/item/DragAndDropItem.js +6 -8
  183. package/esm/data/drag-and-drop/item/DragAndDropItem.js.map +1 -1
  184. package/esm/data/drag-and-drop/root/DragAndDrop.context.d.ts +2 -1
  185. package/esm/data/drag-and-drop/root/DragAndDrop.context.js.map +1 -1
  186. package/esm/data/drag-and-drop/root/DragAndDropRoot.d.ts +7 -30
  187. package/esm/data/drag-and-drop/root/DragAndDropRoot.js +125 -66
  188. package/esm/data/drag-and-drop/root/DragAndDropRoot.js.map +1 -1
  189. package/esm/data/drag-and-drop/types.d.ts +4 -0
  190. package/esm/data/table/base-cell/DataTableBaseCell.d.ts +46 -0
  191. package/esm/data/table/base-cell/DataTableBaseCell.js +27 -0
  192. package/esm/data/table/base-cell/DataTableBaseCell.js.map +1 -0
  193. package/esm/data/table/column-header/DataTableColumnHeader.d.ts +32 -0
  194. package/esm/data/table/column-header/DataTableColumnHeader.js +72 -0
  195. package/esm/data/table/column-header/DataTableColumnHeader.js.map +1 -0
  196. package/esm/data/table/column-header/useTableColumnResize.js.map +1 -0
  197. package/esm/data/table/empty-state/DataTableEmptyState.d.ts +6 -2
  198. package/esm/data/table/empty-state/DataTableEmptyState.js +2 -2
  199. package/esm/data/table/empty-state/DataTableEmptyState.js.map +1 -1
  200. package/esm/data/table/helpers/selection/getMultipleSelectProps.d.ts +10 -10
  201. package/esm/data/table/helpers/selection/getMultipleSelectProps.js +29 -28
  202. package/esm/data/table/helpers/selection/getMultipleSelectProps.js.map +1 -1
  203. package/esm/data/table/helpers/selection/getSingleSelectProps.d.ts +7 -5
  204. package/esm/data/table/helpers/selection/getSingleSelectProps.js +8 -9
  205. package/esm/data/table/helpers/selection/getSingleSelectProps.js.map +1 -1
  206. package/esm/data/table/helpers/selection/selection.types.d.ts +44 -21
  207. package/esm/data/table/hooks/useColumnOptions.d.ts +19 -0
  208. package/esm/data/table/hooks/useColumnOptions.js +17 -0
  209. package/esm/data/table/hooks/useColumnOptions.js.map +1 -0
  210. package/esm/data/table/hooks/useTableExpansion.d.ts +26 -0
  211. package/esm/data/table/hooks/useTableExpansion.js +31 -0
  212. package/esm/data/table/hooks/useTableExpansion.js.map +1 -0
  213. package/esm/data/table/hooks/useTableKeyboardNav.d.ts +2 -1
  214. package/esm/data/table/hooks/useTableKeyboardNav.js +4 -2
  215. package/esm/data/table/hooks/useTableKeyboardNav.js.map +1 -1
  216. package/esm/data/table/hooks/useTableSelection.d.ts +14 -7
  217. package/esm/data/table/hooks/useTableSelection.js +40 -29
  218. package/esm/data/table/hooks/useTableSelection.js.map +1 -1
  219. package/esm/data/table/hooks/useTableSort.d.ts +37 -0
  220. package/esm/data/table/hooks/useTableSort.js +47 -0
  221. package/esm/data/table/hooks/useTableSort.js.map +1 -0
  222. package/esm/data/table/loading-state/DataTableLoadingState.d.ts +6 -2
  223. package/esm/data/table/loading-state/DataTableLoadingState.js +2 -2
  224. package/esm/data/table/loading-state/DataTableLoadingState.js.map +1 -1
  225. package/esm/data/table/root/DataTable.types.d.ts +55 -4
  226. package/esm/data/table/root/DataTableAuto.d.ts +97 -1
  227. package/esm/data/table/root/DataTableAuto.js +94 -43
  228. package/esm/data/table/root/DataTableAuto.js.map +1 -1
  229. package/esm/data/table/root/DataTableRoot.context.d.ts +22 -1
  230. package/esm/data/table/root/DataTableRoot.context.js +5 -1
  231. package/esm/data/table/root/DataTableRoot.context.js.map +1 -1
  232. package/esm/data/table/root/DataTableRoot.d.ts +0 -6
  233. package/esm/data/table/root/DataTableRoot.js +6 -5
  234. package/esm/data/table/root/DataTableRoot.js.map +1 -1
  235. package/esm/data/table/tbody/DataTableTbody.js +8 -2
  236. package/esm/data/table/tbody/DataTableTbody.js.map +1 -1
  237. package/esm/data/table/td/DataTableTd.d.ts +3 -19
  238. package/esm/data/table/td/DataTableTd.js +3 -5
  239. package/esm/data/table/td/DataTableTd.js.map +1 -1
  240. package/esm/data/table/tfoot/DataTableTfoot.js +3 -1
  241. package/esm/data/table/tfoot/DataTableTfoot.js.map +1 -1
  242. package/esm/data/table/th/DataTableTh.d.ts +3 -44
  243. package/esm/data/table/th/DataTableTh.js +4 -55
  244. package/esm/data/table/th/DataTableTh.js.map +1 -1
  245. package/esm/data/table/thead/DataTableThead.js +2 -2
  246. package/esm/data/table/thead/DataTableThead.js.map +1 -1
  247. package/esm/data/table/tr/DataTableTr.d.ts +8 -0
  248. package/esm/data/table/tr/DataTableTr.js +134 -12
  249. package/esm/data/table/tr/DataTableTr.js.map +1 -1
  250. package/esm/data/token-filter/FilterChip.d.ts +10 -0
  251. package/esm/data/token-filter/FilterChip.js +30 -0
  252. package/esm/data/token-filter/FilterChip.js.map +1 -0
  253. package/esm/data/token-filter/TokenFilter.js +3 -10
  254. package/esm/data/token-filter/TokenFilter.js.map +1 -1
  255. package/esm/date/datepicker/hooks/useRangeDatepicker.js +1 -1
  256. package/esm/date/datepicker/hooks/useRangeDatepicker.js.map +1 -1
  257. package/esm/date/datepicker/parts/DatePicker.DayButton.js +3 -1
  258. package/esm/date/datepicker/parts/DatePicker.DayButton.js.map +1 -1
  259. package/esm/date/datepicker/parts/DatePicker.RDP.d.ts +1 -1
  260. package/esm/date/datepicker/parts/DatePicker.RDP.js +27 -12
  261. package/esm/date/datepicker/parts/DatePicker.RDP.js.map +1 -1
  262. package/esm/date/monthpicker/parts/MonthPicker.Button.js +7 -5
  263. package/esm/date/monthpicker/parts/MonthPicker.Button.js.map +1 -1
  264. package/esm/date/monthpicker/parts/MonthPicker.Standalone.d.ts +1 -1
  265. package/esm/dialog/popup/DialogPopupInternal.js +1 -1
  266. package/esm/dialog/popup/DialogPopupInternal.js.map +1 -1
  267. package/esm/form/checkbox/Checkbox.js +19 -33
  268. package/esm/form/checkbox/Checkbox.js.map +1 -1
  269. package/esm/form/checkbox/CheckboxGroup.context.d.ts +6 -0
  270. package/esm/form/checkbox/CheckboxGroup.context.js +3 -0
  271. package/esm/form/checkbox/CheckboxGroup.context.js.map +1 -0
  272. package/esm/form/checkbox/CheckboxGroup.d.ts +0 -6
  273. package/esm/form/checkbox/CheckboxGroup.js +8 -8
  274. package/esm/form/checkbox/CheckboxGroup.js.map +1 -1
  275. package/esm/form/checkbox/checkbox-input/CheckboxInput.d.ts +21 -0
  276. package/esm/form/checkbox/checkbox-input/CheckboxInput.js +29 -0
  277. package/esm/form/checkbox/checkbox-input/CheckboxInput.js.map +1 -0
  278. package/esm/form/checkbox/types.d.ts +1 -1
  279. package/esm/form/checkbox/useCheckbox.js +1 -1
  280. package/esm/form/checkbox/useCheckbox.js.map +1 -1
  281. package/esm/form/combobox/ComboboxWrapper.js +1 -3
  282. package/esm/form/combobox/ComboboxWrapper.js.map +1 -1
  283. package/esm/form/error-summary/ErrorSummary.js +1 -3
  284. package/esm/form/error-summary/ErrorSummary.js.map +1 -1
  285. package/esm/form/fieldset/Fieldset.d.ts +0 -4
  286. package/esm/form/fieldset/Fieldset.js +5 -9
  287. package/esm/form/fieldset/Fieldset.js.map +1 -1
  288. package/esm/form/fieldset/useFieldset.d.ts +5 -3
  289. package/esm/form/fieldset/useFieldset.js +10 -5
  290. package/esm/form/fieldset/useFieldset.js.map +1 -1
  291. package/esm/form/radio/Radio.js +9 -7
  292. package/esm/form/radio/Radio.js.map +1 -1
  293. package/esm/form/radio/RadioGroup.context.d.ts +8 -0
  294. package/esm/form/radio/RadioGroup.context.js +3 -0
  295. package/esm/form/radio/RadioGroup.context.js.map +1 -0
  296. package/esm/form/radio/RadioGroup.d.ts +0 -8
  297. package/esm/form/radio/RadioGroup.js +9 -9
  298. package/esm/form/radio/RadioGroup.js.map +1 -1
  299. package/esm/form/radio/radio-input/RadioInput.d.ts +19 -0
  300. package/esm/form/radio/radio-input/RadioInput.js +19 -0
  301. package/esm/form/radio/radio-input/RadioInput.js.map +1 -0
  302. package/esm/form/radio/useRadio.js +1 -1
  303. package/esm/form/radio/useRadio.js.map +1 -1
  304. package/esm/form/search/Search.js +1 -3
  305. package/esm/form/search/Search.js.map +1 -1
  306. package/esm/inline-message/root/InlineMessage.js +2 -5
  307. package/esm/inline-message/root/InlineMessage.js.map +1 -1
  308. package/esm/modal/Modal.js +1 -3
  309. package/esm/modal/Modal.js.map +1 -1
  310. package/esm/modal/ModalUtils.js +1 -1
  311. package/esm/modal/ModalUtils.js.map +1 -1
  312. package/esm/primitives/box/Box.d.ts +1 -1
  313. package/esm/process/Process.js +1 -5
  314. package/esm/process/Process.js.map +1 -1
  315. package/esm/tabs/useTabs.js +3 -7
  316. package/esm/tabs/useTabs.js.map +1 -1
  317. package/esm/timeline/Timeline.js +26 -63
  318. package/esm/timeline/Timeline.js.map +1 -1
  319. package/esm/timeline/TimelineRow.js +10 -14
  320. package/esm/timeline/TimelineRow.js.map +1 -1
  321. package/esm/timeline/hooks/TimelineKeyboardNavProvider.d.ts +16 -0
  322. package/esm/timeline/hooks/TimelineKeyboardNavProvider.js +141 -0
  323. package/esm/timeline/hooks/TimelineKeyboardNavProvider.js.map +1 -0
  324. package/esm/timeline/hooks/usePeriodContext.d.ts +0 -1
  325. package/esm/timeline/hooks/usePeriodContext.js +0 -1
  326. package/esm/timeline/hooks/usePeriodContext.js.map +1 -1
  327. package/esm/timeline/hooks/useRowContext.d.ts +0 -1
  328. package/esm/timeline/hooks/useRowContext.js +0 -1
  329. package/esm/timeline/hooks/useRowContext.js.map +1 -1
  330. package/esm/timeline/hooks/useTimelineContext.d.ts +0 -4
  331. package/esm/timeline/hooks/useTimelineContext.js +0 -4
  332. package/esm/timeline/hooks/useTimelineContext.js.map +1 -1
  333. package/esm/timeline/period/ClickablePeriod.js +7 -21
  334. package/esm/timeline/period/ClickablePeriod.js.map +1 -1
  335. package/esm/timeline/period/NonClickablePeriod.js +1 -1
  336. package/esm/timeline/period/NonClickablePeriod.js.map +1 -1
  337. package/esm/timeline/pin/PinInternal.js +10 -11
  338. package/esm/timeline/pin/PinInternal.js.map +1 -1
  339. package/esm/toggle-group/useToggleGroup.js +1 -1
  340. package/esm/toggle-group/useToggleGroup.js.map +1 -1
  341. package/esm/utils/components/HighlightText/HighlightText.js +1 -4
  342. package/esm/utils/components/HighlightText/HighlightText.js.map +1 -1
  343. package/esm/utils/components/dismissablelayer/DismissableLayer.js +1 -1
  344. package/esm/utils/components/dismissablelayer/DismissableLayer.js.map +1 -1
  345. package/esm/utils/helpers/create-strict-context.js +1 -1
  346. package/esm/utils/helpers/create-strict-context.js.map +1 -1
  347. package/esm/utils/hooks/useEventCallback.js +1 -1
  348. package/esm/utils/hooks/useEventCallback.js.map +1 -1
  349. package/esm/utils/hooks/useMedia.js +1 -1
  350. package/esm/utils/hooks/useMedia.js.map +1 -1
  351. package/package.json +9 -7
  352. package/src/alert/base-alert/content/BaseAlertContent.tsx +7 -2
  353. package/src/data/drag-and-drop/drag-handler/DragAndDropDragHandler.tsx +73 -29
  354. package/src/data/drag-and-drop/item/DragAndDropItem.tsx +28 -18
  355. package/src/data/drag-and-drop/root/DragAndDrop.context.tsx +4 -2
  356. package/src/data/drag-and-drop/root/DragAndDropRoot.tsx +303 -209
  357. package/src/data/drag-and-drop/types.ts +5 -0
  358. package/src/data/table/base-cell/DataTableBaseCell.tsx +92 -0
  359. package/src/data/table/column-header/DataTableColumnHeader.tsx +180 -0
  360. package/src/data/table/empty-state/DataTableEmptyState.tsx +5 -3
  361. package/src/data/table/helpers/selection/getMultipleSelectProps.ts +49 -45
  362. package/src/data/table/helpers/selection/getSingleSelectProps.ts +15 -13
  363. package/src/data/table/helpers/selection/selection.types.ts +46 -21
  364. package/src/data/table/hooks/__tests__/useTableSelection.test.ts +93 -56
  365. package/src/data/table/hooks/useColumnOptions.ts +48 -0
  366. package/src/data/table/hooks/useTableExpansion.tsx +100 -0
  367. package/src/data/table/hooks/useTableKeyboardNav.ts +7 -5
  368. package/src/data/table/hooks/useTableSelection.ts +77 -46
  369. package/src/data/table/hooks/useTableSort.ts +103 -0
  370. package/src/data/table/loading-state/DataTableLoadingState.tsx +5 -3
  371. package/src/data/table/root/DataTable.types.ts +64 -5
  372. package/src/data/table/root/DataTableAuto.tsx +383 -95
  373. package/src/data/table/root/DataTableRoot.context.ts +30 -1
  374. package/src/data/table/root/DataTableRoot.tsx +14 -11
  375. package/src/data/table/tbody/DataTableTbody.tsx +17 -6
  376. package/src/data/table/td/DataTableTd.tsx +10 -33
  377. package/src/data/table/tfoot/DataTableTfoot.tsx +10 -7
  378. package/src/data/table/th/DataTableTh.tsx +11 -172
  379. package/src/data/table/thead/DataTableThead.tsx +3 -3
  380. package/src/data/table/tr/DataTableTr.tsx +300 -11
  381. package/src/data/token-filter/FilterChip.tsx +100 -0
  382. package/src/data/token-filter/TokenFilter.tsx +8 -24
  383. package/src/date/datepicker/hooks/useRangeDatepicker.tsx +1 -1
  384. package/src/date/datepicker/parts/DatePicker.DayButton.tsx +2 -1
  385. package/src/date/datepicker/parts/DatePicker.RDP.tsx +34 -15
  386. package/src/date/monthpicker/parts/MonthPicker.Button.tsx +11 -9
  387. package/src/date/monthpicker/parts/MonthPicker.Standalone.tsx +1 -1
  388. package/src/dialog/popup/DialogPopupInternal.tsx +1 -1
  389. package/src/form/checkbox/Checkbox.tsx +37 -64
  390. package/src/form/checkbox/CheckboxGroup.context.ts +10 -0
  391. package/src/form/checkbox/CheckboxGroup.tsx +18 -28
  392. package/src/form/checkbox/checkbox-input/CheckboxInput.tsx +69 -0
  393. package/src/form/checkbox/types.ts +1 -1
  394. package/src/form/checkbox/useCheckbox.ts +1 -1
  395. package/src/form/fieldset/Fieldset.tsx +8 -14
  396. package/src/form/fieldset/useFieldset.ts +13 -6
  397. package/src/form/radio/Radio.tsx +43 -38
  398. package/src/form/radio/RadioGroup.context.ts +13 -0
  399. package/src/form/radio/RadioGroup.tsx +22 -31
  400. package/src/form/radio/radio-input/RadioInput.tsx +32 -0
  401. package/src/form/radio/useRadio.ts +1 -1
  402. package/src/inline-message/root/InlineMessage.tsx +3 -13
  403. package/src/modal/ModalUtils.ts +1 -1
  404. package/src/primitives/box/Box.tsx +1 -1
  405. package/src/tabs/useTabs.ts +3 -7
  406. package/src/timeline/Timeline.tsx +62 -91
  407. package/src/timeline/TimelineRow.tsx +19 -17
  408. package/src/timeline/hooks/TimelineKeyboardNavProvider.tsx +237 -0
  409. package/src/timeline/hooks/usePeriodContext.tsx +0 -2
  410. package/src/timeline/hooks/useRowContext.tsx +0 -2
  411. package/src/timeline/hooks/useTimelineContext.tsx +0 -8
  412. package/src/timeline/period/ClickablePeriod.tsx +8 -19
  413. package/src/timeline/period/NonClickablePeriod.tsx +2 -0
  414. package/src/timeline/pin/PinInternal.tsx +10 -13
  415. package/src/toggle-group/useToggleGroup.ts +1 -1
  416. package/src/utils/components/dismissablelayer/DismissableLayer.tsx +1 -1
  417. package/src/utils/helpers/create-strict-context.tsx +1 -1
  418. package/src/utils/hooks/useEventCallback.ts +1 -1
  419. package/src/utils/hooks/useMedia.ts +1 -1
  420. package/cjs/data/table/th/DataTableThActions.d.ts +0 -5
  421. package/cjs/data/table/th/DataTableThActions.js +0 -23
  422. package/cjs/data/table/th/DataTableThActions.js.map +0 -1
  423. package/cjs/data/table/th/useTableColumnResize.js.map +0 -1
  424. package/cjs/data/table/thead/DataTableThead.context.d.ts +0 -4
  425. package/cjs/data/table/thead/DataTableThead.context.js.map +0 -1
  426. package/esm/data/table/th/DataTableThActions.d.ts +0 -5
  427. package/esm/data/table/th/DataTableThActions.js +0 -18
  428. package/esm/data/table/th/DataTableThActions.js.map +0 -1
  429. package/esm/data/table/th/useTableColumnResize.js.map +0 -1
  430. package/esm/data/table/thead/DataTableThead.context.d.ts +0 -4
  431. package/esm/data/table/thead/DataTableThead.context.js +0 -8
  432. package/esm/data/table/thead/DataTableThead.context.js.map +0 -1
  433. package/src/data/table/th/DataTableThActions.tsx +0 -32
  434. package/src/data/table/thead/DataTableThead.context.ts +0 -10
  435. /package/cjs/data/table/{th → column-header}/useTableColumnResize.d.ts +0 -0
  436. /package/cjs/data/table/{th → column-header}/useTableColumnResize.js +0 -0
  437. /package/esm/data/table/{th → column-header}/useTableColumnResize.d.ts +0 -0
  438. /package/esm/data/table/{th → column-header}/useTableColumnResize.js +0 -0
  439. /package/src/data/table/{th → column-header}/useTableColumnResize.ts +0 -0
@@ -4,7 +4,10 @@ import type {
4
4
  MultipleSelection,
5
5
  SingleSelection,
6
6
  } from "../../helpers/selection/selection.types";
7
- import { useTableSelection } from "../useTableSelection";
7
+ import {
8
+ type UseTableSelectionReturn,
9
+ useTableSelection,
10
+ } from "../useTableSelection";
8
11
 
9
12
  type Item = { id: string; name: string };
10
13
 
@@ -14,18 +17,18 @@ const items: Item[] = [
14
17
  { id: "c", name: "Charlie" },
15
18
  ];
16
19
 
17
- const getRowId = (item: Item) => item.id;
20
+ const allRowKeys = items.map((item) => item.id);
18
21
 
19
- function asSingle(
20
- result: ReturnType<typeof renderHook>["result"],
21
- ): SingleSelection {
22
- return result.current as SingleSelection;
22
+ function asSingle(result: {
23
+ current: UseTableSelectionReturn;
24
+ }): SingleSelection {
25
+ return result.current.selection as SingleSelection;
23
26
  }
24
27
 
25
- function asMultiple(
26
- result: ReturnType<typeof renderHook>["result"],
27
- ): MultipleSelection {
28
- return result.current as MultipleSelection;
28
+ function asMultiple(result: {
29
+ current: UseTableSelectionReturn;
30
+ }): MultipleSelection {
31
+ return result.current.selection as MultipleSelection;
29
32
  }
30
33
 
31
34
  describe("useTableSelection", () => {
@@ -34,14 +37,12 @@ describe("useTableSelection", () => {
34
37
  const { result } = renderHook(() =>
35
38
  useTableSelection({
36
39
  selectionMode: "none",
37
- data: items,
38
- getRowId,
40
+ allRowKeys,
39
41
  }),
40
42
  );
41
43
 
42
- expect(result.current.selectionMode).toBe("none");
43
- expect(result.current.selectedKeys).toEqual([]);
44
- expect(result.current.allKeys).toEqual(["a", "b", "c"]);
44
+ expect(result.current.selection.selectionMode).toBe("none");
45
+ expect(result.current.selection.selectedKeys).toEqual([]);
45
46
  });
46
47
  });
47
48
 
@@ -50,12 +51,11 @@ describe("useTableSelection", () => {
50
51
  const { result } = renderHook(() =>
51
52
  useTableSelection({
52
53
  selectionMode: "single",
53
- data: items,
54
- getRowId,
54
+ allRowKeys,
55
55
  }),
56
56
  );
57
57
 
58
- expect(result.current.selectionMode).toBe("single");
58
+ expect(result.current.selection.selectionMode).toBe("single");
59
59
  expect(asSingle(result).getRowRadioProps).toBeDefined();
60
60
  });
61
61
 
@@ -64,8 +64,7 @@ describe("useTableSelection", () => {
64
64
  const { result } = renderHook(() =>
65
65
  useTableSelection({
66
66
  selectionMode: "single",
67
- data: items,
68
- getRowId,
67
+ allRowKeys,
69
68
  onSelectionChange: onChange,
70
69
  }),
71
70
  );
@@ -80,12 +79,11 @@ describe("useTableSelection", () => {
80
79
  expect(asSingle(result).selectedKeys).toEqual(["a"]);
81
80
  });
82
81
 
83
- test("toggling the same row deselects it", () => {
82
+ test("toggling the same row keeps it selected", () => {
84
83
  const { result } = renderHook(() =>
85
84
  useTableSelection({
86
85
  selectionMode: "single",
87
- data: items,
88
- getRowId,
86
+ allRowKeys,
89
87
  defaultSelectedKeys: ["a"],
90
88
  }),
91
89
  );
@@ -96,15 +94,14 @@ describe("useTableSelection", () => {
96
94
  .onChange?.({} as React.ChangeEvent<HTMLInputElement>);
97
95
  });
98
96
 
99
- expect(asSingle(result).selectedKeys).toEqual([]);
97
+ expect(asSingle(result).selectedKeys).toEqual(["a"]);
100
98
  });
101
99
 
102
100
  test("selecting a new row replaces the previous", () => {
103
101
  const { result } = renderHook(() =>
104
102
  useTableSelection({
105
103
  selectionMode: "single",
106
- data: items,
107
- getRowId,
104
+ allRowKeys,
108
105
  defaultSelectedKeys: ["a"],
109
106
  }),
110
107
  );
@@ -122,9 +119,8 @@ describe("useTableSelection", () => {
122
119
  const { result } = renderHook(() =>
123
120
  useTableSelection({
124
121
  selectionMode: "single",
125
- data: items,
126
- getRowId,
127
- disabledKeys: ["b"],
122
+ allRowKeys,
123
+ disabledSelectionKeys: ["b"],
128
124
  }),
129
125
  );
130
126
 
@@ -137,8 +133,7 @@ describe("useTableSelection", () => {
137
133
  ({ selectedKeys }) =>
138
134
  useTableSelection({
139
135
  selectionMode: "single",
140
- data: items,
141
- getRowId,
136
+ allRowKeys,
142
137
  selectedKeys,
143
138
  }),
144
139
  { initialProps: { selectedKeys: ["a"] as (string | number)[] } },
@@ -156,12 +151,11 @@ describe("useTableSelection", () => {
156
151
  const { result } = renderHook(() =>
157
152
  useTableSelection({
158
153
  selectionMode: "multiple",
159
- data: items,
160
- getRowId,
154
+ allRowKeys,
161
155
  }),
162
156
  );
163
157
 
164
- expect(result.current.selectionMode).toBe("multiple");
158
+ expect(result.current.selection.selectionMode).toBe("multiple");
165
159
  expect(asMultiple(result).getTheadCheckboxProps).toBeDefined();
166
160
  expect(asMultiple(result).getRowCheckboxProps).toBeDefined();
167
161
  });
@@ -170,8 +164,7 @@ describe("useTableSelection", () => {
170
164
  const { result } = renderHook(() =>
171
165
  useTableSelection({
172
166
  selectionMode: "multiple",
173
- data: items,
174
- getRowId,
167
+ allRowKeys,
175
168
  }),
176
169
  );
177
170
 
@@ -196,8 +189,7 @@ describe("useTableSelection", () => {
196
189
  const { result } = renderHook(() =>
197
190
  useTableSelection({
198
191
  selectionMode: "multiple",
199
- data: items,
200
- getRowId,
192
+ allRowKeys,
201
193
  defaultSelectedKeys: ["a", "b"],
202
194
  }),
203
195
  );
@@ -215,8 +207,7 @@ describe("useTableSelection", () => {
215
207
  const { result } = renderHook(() =>
216
208
  useTableSelection({
217
209
  selectionMode: "multiple",
218
- data: items,
219
- getRowId,
210
+ allRowKeys,
220
211
  }),
221
212
  );
222
213
 
@@ -233,8 +224,7 @@ describe("useTableSelection", () => {
233
224
  const { result } = renderHook(() =>
234
225
  useTableSelection({
235
226
  selectionMode: "multiple",
236
- data: items,
237
- getRowId,
227
+ allRowKeys,
238
228
  defaultSelectedKeys: ["a", "b", "c"],
239
229
  }),
240
230
  );
@@ -248,12 +238,48 @@ describe("useTableSelection", () => {
248
238
  expect(asMultiple(result).selectedKeys).toEqual([]);
249
239
  });
250
240
 
241
+ test("select all skips disabled keys", () => {
242
+ const { result } = renderHook(() =>
243
+ useTableSelection({
244
+ selectionMode: "multiple",
245
+ allRowKeys,
246
+ disabledSelectionKeys: ["b"],
247
+ }),
248
+ );
249
+
250
+ act(() => {
251
+ asMultiple(result)
252
+ .getTheadCheckboxProps()
253
+ .onChange?.({} as React.ChangeEvent<HTMLInputElement>);
254
+ });
255
+
256
+ expect(asMultiple(result).selectedKeys).toEqual(["a", "c"]);
257
+ });
258
+
259
+ test("deselect all preserves disabled-but-selected rows", () => {
260
+ const { result } = renderHook(() =>
261
+ useTableSelection({
262
+ selectionMode: "multiple",
263
+ allRowKeys,
264
+ defaultSelectedKeys: ["a", "b", "c"],
265
+ disabledSelectionKeys: ["b"],
266
+ }),
267
+ );
268
+
269
+ act(() => {
270
+ asMultiple(result)
271
+ .getTheadCheckboxProps()
272
+ .onChange?.({} as React.ChangeEvent<HTMLInputElement>);
273
+ });
274
+
275
+ expect(asMultiple(result).selectedKeys).toEqual(["b"]);
276
+ });
277
+
251
278
  test("thead checkbox shows indeterminate when partially selected", () => {
252
279
  const { result } = renderHook(() =>
253
280
  useTableSelection({
254
281
  selectionMode: "multiple",
255
- data: items,
256
- getRowId,
282
+ allRowKeys,
257
283
  defaultSelectedKeys: ["a"],
258
284
  }),
259
285
  );
@@ -267,8 +293,7 @@ describe("useTableSelection", () => {
267
293
  const { result } = renderHook(() =>
268
294
  useTableSelection({
269
295
  selectionMode: "multiple",
270
- data: items,
271
- getRowId,
296
+ allRowKeys,
272
297
  defaultSelectedKeys: ["a", "b", "c"],
273
298
  }),
274
299
  );
@@ -278,13 +303,27 @@ describe("useTableSelection", () => {
278
303
  expect(theadProps.checked).toBe(true);
279
304
  });
280
305
 
281
- test("deselecting one row when selectedKeys is 'all'", () => {
306
+ test("thead checkbox shows checked when all selectable rows are selected", () => {
307
+ const { result } = renderHook(() =>
308
+ useTableSelection({
309
+ selectionMode: "multiple",
310
+ allRowKeys,
311
+ defaultSelectedKeys: ["a", "c"],
312
+ disabledSelectionKeys: ["b"],
313
+ }),
314
+ );
315
+
316
+ const theadProps = asMultiple(result).getTheadCheckboxProps();
317
+ expect(theadProps.indeterminate).toBe(false);
318
+ expect(theadProps.checked).toBe(true);
319
+ });
320
+
321
+ test("deselecting one row when all rows are selected", () => {
282
322
  const { result } = renderHook(() =>
283
323
  useTableSelection({
284
324
  selectionMode: "multiple",
285
- data: items,
286
- getRowId,
287
- defaultSelectedKeys: "all",
325
+ allRowKeys,
326
+ defaultSelectedKeys: ["a", "b", "c"],
288
327
  }),
289
328
  );
290
329
 
@@ -301,9 +340,8 @@ describe("useTableSelection", () => {
301
340
  const { result } = renderHook(() =>
302
341
  useTableSelection({
303
342
  selectionMode: "multiple",
304
- data: items,
305
- getRowId,
306
- disabledKeys: ["b"],
343
+ allRowKeys,
344
+ disabledSelectionKeys: ["b"],
307
345
  }),
308
346
  );
309
347
 
@@ -315,9 +353,8 @@ describe("useTableSelection", () => {
315
353
  const { result } = renderHook(() =>
316
354
  useTableSelection({
317
355
  selectionMode: "multiple",
318
- data: items,
319
- getRowId,
320
- disabledKeys: ["a", "b", "c"],
356
+ allRowKeys,
357
+ disabledSelectionKeys: ["a", "b", "c"],
321
358
  }),
322
359
  );
323
360
 
@@ -0,0 +1,48 @@
1
+ import type {
2
+ ColumnDefinition,
3
+ ColumnDefinitions,
4
+ } from "../root/DataTable.types";
5
+ import type { SelectionProps } from "./useTableSelection";
6
+
7
+ type UseColumnOptions = {
8
+ stickyColumns?: {
9
+ first?: "1";
10
+ last?: "1";
11
+ };
12
+ selectionMode: SelectionProps["selectionMode"];
13
+ };
14
+
15
+ type UseColumnOptionsResult<T> = {
16
+ columns: {
17
+ isSticky: "start" | "end" | false;
18
+ colDef: ColumnDefinition<T>;
19
+ }[];
20
+ stickySelection: boolean;
21
+ };
22
+
23
+ function useColumnOptions<T>(
24
+ columnDefinitions: ColumnDefinitions<T>,
25
+ options: UseColumnOptions,
26
+ ): UseColumnOptionsResult<T> {
27
+ const { stickyColumns, selectionMode } = options;
28
+
29
+ const hasSelection = selectionMode !== "none";
30
+
31
+ return {
32
+ stickySelection: selectionMode !== "none" && stickyColumns?.first === "1",
33
+ columns: columnDefinitions.map((colDef, index) => {
34
+ const isFirstSticky =
35
+ stickyColumns?.first === "1" && index === 0 && !hasSelection;
36
+ const isLastSticky =
37
+ stickyColumns?.last === "1" && index === columnDefinitions.length - 1;
38
+
39
+ return {
40
+ isSticky: isFirstSticky ? "start" : isLastSticky ? "end" : false,
41
+ colDef,
42
+ };
43
+ }),
44
+ };
45
+ }
46
+
47
+ export { useColumnOptions };
48
+ export type { UseColumnOptionsResult };
@@ -0,0 +1,100 @@
1
+ import React, { useCallback } from "react";
2
+ import { createStrictContext } from "../../../utils/helpers";
3
+ import { useControllableState } from "../../../utils/hooks";
4
+
5
+ type DataTableExpansionContextT = {
6
+ expandedIds: (string | number)[];
7
+ isExpanded: (id: string | number) => boolean;
8
+ toggleExpansion: (id: string | number) => void;
9
+ toggleAll: () => void;
10
+ isAllExpanded: boolean;
11
+ getDetailsPanelContent?: (row: unknown) => React.ReactNode;
12
+ getDetailsPanelHeight?: (row: unknown) => number | "auto";
13
+ showExpandAll?: boolean;
14
+ enableExpansion: boolean;
15
+ };
16
+
17
+ const {
18
+ Provider: DataTableExpansionContextProvider,
19
+ useContext: useDataTableExpansion,
20
+ } = createStrictContext<DataTableExpansionContextT>({
21
+ name: "DataTableExpansionContext",
22
+ errorMessage:
23
+ "useDataTableExpansion must be used within a DataTableExpansionProvider.",
24
+ });
25
+
26
+ type TableExpansionOptions<T> = {
27
+ detailsPanelRowIds?: (string | number)[];
28
+ defaultDetailsPanelRowIds?: (string | number)[];
29
+ onDetailsPanelChange?: (ids: (string | number)[]) => void;
30
+ allRowKeys: (string | number)[];
31
+ getDetailsPanelContent?: (row: T) => React.ReactNode;
32
+ getDetailsPanelHeight?: (row: T) => number | "auto";
33
+ showExpandAll?: boolean;
34
+ };
35
+
36
+ function DataTableExpansionProvider<T>({
37
+ children,
38
+ detailsPanelRowIds,
39
+ defaultDetailsPanelRowIds = [],
40
+ onDetailsPanelChange,
41
+ allRowKeys,
42
+ getDetailsPanelContent,
43
+ getDetailsPanelHeight,
44
+ showExpandAll = false,
45
+ }: TableExpansionOptions<T> & { children: React.ReactNode }) {
46
+ const [expandedIds, setExpandedIds] = useControllableState({
47
+ value: detailsPanelRowIds,
48
+ defaultValue: defaultDetailsPanelRowIds,
49
+ });
50
+
51
+ const isExpanded = useCallback(
52
+ (id: string | number) => expandedIds.includes(id),
53
+ [expandedIds],
54
+ );
55
+
56
+ const toggleExpansion = useCallback(
57
+ (id: string | number) => {
58
+ const next = expandedIds.includes(id)
59
+ ? expandedIds.filter((eid) => eid !== id)
60
+ : [...expandedIds, id];
61
+ setExpandedIds(next);
62
+ onDetailsPanelChange?.(next);
63
+ },
64
+ [expandedIds, setExpandedIds, onDetailsPanelChange],
65
+ );
66
+
67
+ const isAllExpanded =
68
+ allRowKeys.length > 0 &&
69
+ allRowKeys.every((key) => expandedIds.includes(key));
70
+
71
+ const toggleAll = useCallback(() => {
72
+ const next = isAllExpanded ? [] : [...allRowKeys];
73
+ setExpandedIds(next);
74
+ onDetailsPanelChange?.(next);
75
+ }, [isAllExpanded, allRowKeys, setExpandedIds, onDetailsPanelChange]);
76
+
77
+ return (
78
+ <DataTableExpansionContextProvider
79
+ expandedIds={expandedIds}
80
+ isExpanded={isExpanded}
81
+ toggleExpansion={toggleExpansion}
82
+ toggleAll={toggleAll}
83
+ isAllExpanded={isAllExpanded}
84
+ getDetailsPanelContent={
85
+ getDetailsPanelContent as
86
+ | ((row: unknown) => React.ReactNode)
87
+ | undefined
88
+ }
89
+ getDetailsPanelHeight={
90
+ getDetailsPanelHeight as ((row: unknown) => number | "auto") | undefined
91
+ }
92
+ showExpandAll={showExpandAll}
93
+ enableExpansion={!!getDetailsPanelContent}
94
+ >
95
+ {children}
96
+ </DataTableExpansionContextProvider>
97
+ );
98
+ }
99
+
100
+ export { DataTableExpansionProvider, useDataTableExpansion };
@@ -1,4 +1,4 @@
1
- import { useEffect } from "react";
1
+ import { useEffect, useState } from "react";
2
2
  import { useEventCallback } from "../../../utils/hooks";
3
3
  import { focusInitialTableTarget } from "../helpers/table-cell";
4
4
  import { focusCellAndUpdateTabIndex } from "../helpers/table-focus";
@@ -25,10 +25,11 @@ type UseTableKeyboardNavOptions = {
25
25
  shouldBlockNavigation?: (event: KeyboardEvent) => boolean;
26
26
  };
27
27
 
28
- function useTableKeyboardNav(
29
- tableRef: HTMLTableElement | null,
30
- { enabled, shouldBlockNavigation: customBlockFn }: UseTableKeyboardNavOptions,
31
- ) {
28
+ function useTableKeyboardNav({
29
+ enabled,
30
+ shouldBlockNavigation: customBlockFn,
31
+ }: UseTableKeyboardNavOptions) {
32
+ const [tableRef, setTableRef] = useState<HTMLTableElement | null>(null);
32
33
  const { getTableGrid, activeCell, setActiveCell } = useGridCache(
33
34
  tableRef,
34
35
  enabled,
@@ -173,6 +174,7 @@ function useTableKeyboardNav(
173
174
  return {
174
175
  /* Table should only have tabIndex until the focus is moved inside and is enabled */
175
176
  tabIndex: enabled ? (activeCell ? undefined : 0) : undefined,
177
+ setTableRef,
176
178
  };
177
179
  }
178
180
 
@@ -1,78 +1,109 @@
1
- import { useMemo } from "react";
1
+ import { useCallback, useMemo } from "react";
2
+ import { useId } from "../../../utils-external";
2
3
  import { useControllableState } from "../../../utils/hooks";
3
4
  import { getMultipleSelectProps } from "../helpers/selection/getMultipleSelectProps";
4
5
  import { getSingleSelectProps } from "../helpers/selection/getSingleSelectProps";
5
6
  import type {
7
+ SelectedKeysT,
6
8
  SelectionProps,
7
- SelectionT,
8
9
  TableSelection,
9
10
  } from "../helpers/selection/selection.types";
10
11
 
11
- type UseTableSelectionArgs<T> = SelectionProps & {
12
- data: T[];
13
- getRowId: (rowData: T, index: number) => string | number;
12
+ type UseTableSelectionArgs = SelectionProps & {
13
+ /* This is needed for multiple selection to know which keys to select when "select all" is used */
14
+ allRowKeys: (string | number)[];
14
15
  };
15
16
 
16
- function useTableSelection<T>({
17
+ type UseTableSelectionReturn = {
18
+ selection: TableSelection;
19
+ renderSelection: boolean;
20
+ };
21
+
22
+ function useTableSelection({
17
23
  selectionMode = "none",
18
24
  defaultSelectedKeys,
19
25
  selectedKeys: selectedKeysProp,
20
26
  onSelectionChange,
21
- disabledKeys = [],
22
- data,
23
- getRowId,
24
- }: UseTableSelectionArgs<T>): TableSelection {
25
- const allKeys = useMemo(
26
- () => data.map((item, index) => getRowId(item, index)),
27
- [data, getRowId],
28
- );
27
+ disabledSelectionKeys = [],
28
+ allRowKeys,
29
+ }: UseTableSelectionArgs): UseTableSelectionReturn {
30
+ const radioGroupName = useId();
29
31
 
30
- const [selectedKeys, setSelectedKeys] = useControllableState<SelectionT>({
32
+ const [selectedKeys, setSelectedKeys] = useControllableState<SelectedKeysT>({
31
33
  value: selectionMode !== "none" ? selectedKeysProp : undefined,
32
34
  defaultValue: defaultSelectedKeys ?? [],
33
35
  onChange: onSelectionChange,
34
36
  });
35
37
 
38
+ const selectedKeysSet = useMemo(() => new Set(selectedKeys), [selectedKeys]);
39
+
40
+ const disabledKeysSet = useMemo(
41
+ () => new Set(disabledSelectionKeys),
42
+ [disabledSelectionKeys],
43
+ );
44
+
45
+ const isRowSelected = useCallback(
46
+ (rowId: string | number) => selectedKeysSet.has(rowId),
47
+ [selectedKeysSet],
48
+ );
49
+
50
+ const baseSelection = { selectedKeys, disabledSelectionKeys, isRowSelected };
51
+
36
52
  if (selectionMode === "none") {
37
- return { selectionMode, allKeys, selectedKeys: [], disabledKeys };
53
+ return {
54
+ selection: {
55
+ selectionMode,
56
+ ...baseSelection,
57
+ selectedKeys: [],
58
+ },
59
+ renderSelection: false,
60
+ };
38
61
  }
39
62
 
40
63
  if (selectionMode === "single") {
41
- const arrayKeys = Array.isArray(selectedKeys) ? selectedKeys : [];
42
- const { getRowRadioProps } = getSingleSelectProps({
43
- selectedKeys: arrayKeys,
44
- setSelectedKeys,
45
- disabledKeys,
46
- });
47
-
48
64
  return {
49
- selectionMode,
50
- allKeys,
51
- selectedKeys: arrayKeys,
52
- disabledKeys,
53
- getRowRadioProps,
65
+ selection: {
66
+ selectionMode,
67
+ ...baseSelection,
68
+ ...getSingleSelectProps({
69
+ selectedKeysSet,
70
+ setSelectedKeys,
71
+ disabledKeysSet,
72
+ name: radioGroupName,
73
+ }),
74
+ },
75
+ renderSelection: allRowKeys.length !== 0,
54
76
  };
55
77
  }
56
78
 
57
- const { getTheadCheckboxProps, getRowCheckboxProps } = getMultipleSelectProps(
58
- {
59
- selectedKeys,
60
- setSelectedKeys,
61
- disabledKeys,
62
- allKeys,
63
- totalCount: data.length,
64
- },
65
- );
66
-
67
79
  return {
68
- selectionMode,
69
- allKeys,
70
- selectedKeys,
71
- disabledKeys,
72
- getTheadCheckboxProps,
73
- getRowCheckboxProps,
80
+ selection: {
81
+ selectionMode,
82
+ ...baseSelection,
83
+ ...getMultipleSelectProps({
84
+ selectedKeysSet,
85
+ selectedKeys,
86
+ setSelectedKeys,
87
+ disabledKeysSet,
88
+ allRowKeys,
89
+ }),
90
+ },
91
+ renderSelection: allRowKeys.length !== 0,
74
92
  };
75
93
  }
76
94
 
77
- export { useTableSelection };
78
- export type { SelectionProps, SelectionT };
95
+ /**
96
+ * TODO: Only temp needed to keep Root happy
97
+ */
98
+ const noSelectionState: UseTableSelectionReturn = {
99
+ selection: {
100
+ selectionMode: "none",
101
+ selectedKeys: [],
102
+ disabledSelectionKeys: [],
103
+ isRowSelected: () => false,
104
+ },
105
+ renderSelection: false,
106
+ };
107
+
108
+ export { useTableSelection, noSelectionState };
109
+ export type { SelectionProps, UseTableSelectionReturn };