@cube-dev/ui-kit 0.163.0 → 0.165.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 (676) hide show
  1. package/README.md +1 -1
  2. package/dist/CHANGELOG.md +394 -0
  3. package/dist/README.md +1 -1
  4. package/dist/_internal/hooks/use-chained-callback.js +1 -1
  5. package/dist/_internal/hooks/use-debounced-value.js +1 -1
  6. package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
  7. package/dist/_internal/hooks/use-event.js +1 -1
  8. package/dist/_internal/hooks/use-is-first-render.js +1 -1
  9. package/dist/_internal/hooks/use-sync-ref.js +1 -1
  10. package/dist/_internal/hooks/use-timer/timer.js +1 -1
  11. package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
  12. package/dist/_internal/hooks/use-warn.js +1 -1
  13. package/dist/components/Block.js +1 -1
  14. package/dist/components/CollectionItem.js +1 -1
  15. package/dist/components/GlobalStyles.js +1 -1
  16. package/dist/components/GridProvider.js +1 -1
  17. package/dist/components/HiddenInput.js +1 -1
  18. package/dist/components/Root.d.ts +3 -2
  19. package/dist/components/Root.js +1 -1
  20. package/dist/components/Root.js.map +1 -1
  21. package/dist/components/actions/Action/Action.js +1 -1
  22. package/dist/components/actions/Banner/Banner.js +2 -5
  23. package/dist/components/actions/Banner/Banner.js.map +1 -1
  24. package/dist/components/actions/Button/Button.d.ts +3 -3
  25. package/dist/components/actions/Button/Button.js +8 -5
  26. package/dist/components/actions/Button/Button.js.map +1 -1
  27. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  28. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  29. package/dist/components/actions/ButtonSplit/context.js +1 -1
  30. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  31. package/dist/components/actions/CommandMenu/styled.js +1 -1
  32. package/dist/components/actions/ItemAction/ItemAction.d.ts +2 -2
  33. package/dist/components/actions/ItemAction/ItemAction.js +15 -6
  34. package/dist/components/actions/ItemAction/ItemAction.js.map +1 -1
  35. package/dist/components/actions/ItemActionContext.d.ts +14 -0
  36. package/dist/components/actions/ItemActionContext.js +2 -2
  37. package/dist/components/actions/ItemActionContext.js.map +1 -1
  38. package/dist/components/actions/ItemButton/ItemButton.js +56 -46
  39. package/dist/components/actions/ItemButton/ItemButton.js.map +1 -1
  40. package/dist/components/actions/Link/Link.js +1 -1
  41. package/dist/components/actions/Menu/Menu.js +1 -1
  42. package/dist/components/actions/Menu/MenuItem.js +1 -1
  43. package/dist/components/actions/Menu/MenuSection.js +1 -1
  44. package/dist/components/actions/Menu/MenuTrigger.d.ts +13 -0
  45. package/dist/components/actions/Menu/MenuTrigger.js +27 -15
  46. package/dist/components/actions/Menu/MenuTrigger.js.map +1 -1
  47. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  48. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  49. package/dist/components/actions/Menu/context.js +1 -1
  50. package/dist/components/actions/Menu/styled.js +1 -1
  51. package/dist/components/actions/index.js +1 -1
  52. package/dist/components/actions/use-action.js +1 -1
  53. package/dist/components/actions/use-anchored-menu.js +1 -1
  54. package/dist/components/actions/use-context-menu.js +1 -1
  55. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  56. package/dist/components/content/Alert/Alert.js +1 -1
  57. package/dist/components/content/Alert/use-alert.js +1 -1
  58. package/dist/components/content/Avatar/Avatar.js +1 -1
  59. package/dist/components/content/Badge/Badge.js +1 -1
  60. package/dist/components/content/Card/Card.js +1 -1
  61. package/dist/components/content/Content.js +1 -1
  62. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  63. package/dist/components/content/CopySnippet/CopySnippet.d.ts +10 -0
  64. package/dist/components/content/CopySnippet/CopySnippet.js +7 -4
  65. package/dist/components/content/CopySnippet/CopySnippet.js.map +1 -1
  66. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  67. package/dist/components/content/Divider.js +1 -1
  68. package/dist/components/content/Footer.js +1 -1
  69. package/dist/components/content/Header.js +1 -1
  70. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  71. package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
  72. package/dist/components/content/InlineInput/InlineInput.js +1 -1
  73. package/dist/components/content/InlineInput/InlineInput.js.map +1 -1
  74. package/dist/components/content/Item/Item.d.ts +2 -2
  75. package/dist/components/content/Item/Item.js +13 -58
  76. package/dist/components/content/Item/Item.js.map +1 -1
  77. package/dist/components/content/ItemBadge/ItemBadge.d.ts +1 -1
  78. package/dist/components/content/ItemBadge/ItemBadge.js +7 -4
  79. package/dist/components/content/ItemBadge/ItemBadge.js.map +1 -1
  80. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  81. package/dist/components/content/Layout/GridLayout.js +1 -1
  82. package/dist/components/content/Layout/Layout.js +1 -1
  83. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  84. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  85. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  86. package/dist/components/content/Layout/LayoutContent.js +1 -1
  87. package/dist/components/content/Layout/LayoutContext.js +1 -1
  88. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  89. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  90. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  91. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  92. package/dist/components/content/Layout/LayoutPane.js +1 -1
  93. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  94. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  95. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  96. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  97. package/dist/components/content/Layout/index.js +1 -1
  98. package/dist/components/content/Layout/utils.js +1 -1
  99. package/dist/components/content/Paragraph.js +1 -1
  100. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  101. package/dist/components/content/PrismCode/PrismCode.d.ts +6 -0
  102. package/dist/components/content/PrismCode/PrismCode.js +12 -3
  103. package/dist/components/content/PrismCode/PrismCode.js.map +1 -1
  104. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  105. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  106. package/dist/components/content/Result/Result.js +1 -1
  107. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  108. package/dist/components/content/Tag/Tag.js +1 -1
  109. package/dist/components/content/Text.d.ts +14 -14
  110. package/dist/components/content/Text.js +1 -1
  111. package/dist/components/content/TextItem/TextItem.js +1 -1
  112. package/dist/components/content/Title.js +1 -1
  113. package/dist/components/content/Tree/Tree.js +1 -1
  114. package/dist/components/content/Tree/TreeNode.js +1 -1
  115. package/dist/components/content/Tree/styled.js +1 -1
  116. package/dist/components/content/Tree/tree-index.js +1 -1
  117. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  118. package/dist/components/content/Tree/use-load-data.js +1 -1
  119. package/dist/components/content/highlightText.js +1 -1
  120. package/dist/components/content/use-auto-tooltip.js +1 -1
  121. package/dist/components/data/DataTable/DataTable.js +140 -21
  122. package/dist/components/data/DataTable/DataTable.js.map +1 -1
  123. package/dist/components/data/DataTable/index.d.ts +1 -1
  124. package/dist/components/data/DataTable/types.d.ts +19 -4
  125. package/dist/components/data/ItemTable/ItemTable.js +169 -25
  126. package/dist/components/data/ItemTable/ItemTable.js.map +1 -1
  127. package/dist/components/data/ItemTable/ItemTableBulkBar.js +1 -1
  128. package/dist/components/data/ItemTable/ItemTableDragPreview.js +1 -1
  129. package/dist/components/data/ItemTable/ItemTableFooter.js +1 -1
  130. package/dist/components/data/ItemTable/ItemTableToolbar.js +1 -1
  131. package/dist/components/data/ItemTable/types.d.ts +7 -2
  132. package/dist/components/data/TableBase/ColumnResizer.js +1 -1
  133. package/dist/components/data/TableBase/RowCollection.js +1 -1
  134. package/dist/components/data/TableBase/TableHeaderCell.js +1 -1
  135. package/dist/components/data/TableBase/TableRow.js +30 -5
  136. package/dist/components/data/TableBase/TableRow.js.map +1 -1
  137. package/dist/components/data/TableBase/TableView.d.ts +2 -1
  138. package/dist/components/data/TableBase/TableView.js +299 -75
  139. package/dist/components/data/TableBase/TableView.js.map +1 -1
  140. package/dist/components/data/TableBase/column-menu.js +1 -1
  141. package/dist/components/data/TableBase/column-tint.js +12 -2
  142. package/dist/components/data/TableBase/column-tint.js.map +1 -1
  143. package/dist/components/data/TableBase/index.d.ts +1 -1
  144. package/dist/components/data/TableBase/row-menu.js +1 -1
  145. package/dist/components/data/TableBase/styled.d.ts +1 -2
  146. package/dist/components/data/TableBase/styled.js +75 -2
  147. package/dist/components/data/TableBase/styled.js.map +1 -1
  148. package/dist/components/data/TableBase/table-tree.js +129 -0
  149. package/dist/components/data/TableBase/table-tree.js.map +1 -0
  150. package/dist/components/data/TableBase/types.d.ts +46 -1
  151. package/dist/components/data/TableBase/types.js +1 -1
  152. package/dist/components/data/TableBase/types.js.map +1 -1
  153. package/dist/components/data/TableBase/use-cell-selection.d.ts +0 -1
  154. package/dist/components/data/TableBase/use-cell-selection.js +0 -0
  155. package/dist/components/data/TableBase/use-column-order.js +1 -1
  156. package/dist/components/data/TableBase/use-container-width.js +1 -1
  157. package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
  158. package/dist/components/data/TableBase/use-scrollability.js +1 -1
  159. package/dist/components/data/TableBase/use-table-columns.js +1 -1
  160. package/dist/components/data/TableBase/use-table-search.js +4 -4
  161. package/dist/components/data/TableBase/use-table-search.js.map +1 -1
  162. package/dist/components/data/TableBase/use-table-selection.js +124 -24
  163. package/dist/components/data/TableBase/use-table-selection.js.map +1 -1
  164. package/dist/components/data/TableBase/use-table-sort.js +1 -1
  165. package/dist/components/data/TableBase/use-table-sorts.js +1 -1
  166. package/dist/components/data/TableBase/use-table-storage.js +1 -1
  167. package/dist/components/data/TableBase/use-table-tree-state.js +107 -0
  168. package/dist/components/data/TableBase/use-table-tree-state.js.map +1 -0
  169. package/dist/components/data/index.d.ts +2 -2
  170. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  171. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  172. package/dist/components/fields/Checkbox/context.js +1 -1
  173. package/dist/components/fields/ColorInput/ColorInput.js +12 -7
  174. package/dist/components/fields/ColorInput/ColorInput.js.map +1 -1
  175. package/dist/components/fields/ColorPicker/ColorPicker.js +3 -2
  176. package/dist/components/fields/ColorPicker/ColorPicker.js.map +1 -1
  177. package/dist/components/fields/{color → ColorSwatch}/ColorSwatch.d.ts +8 -2
  178. package/dist/components/fields/{color → ColorSwatch}/ColorSwatch.js +14 -6
  179. package/dist/components/fields/ColorSwatch/ColorSwatch.js.map +1 -0
  180. package/dist/components/fields/ColorSwatch/index.d.ts +2 -0
  181. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +1 -1
  182. package/dist/components/fields/ComboBox/ComboBox.js +2 -6
  183. package/dist/components/fields/ComboBox/ComboBox.js.map +1 -1
  184. package/dist/components/fields/CommandTextArea/CommandTextArea.js +8 -25
  185. package/dist/components/fields/CommandTextArea/CommandTextArea.js.map +1 -1
  186. package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
  187. package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
  188. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  189. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  190. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  191. package/dist/components/fields/DatePicker/DatePickerButton.js +32 -2
  192. package/dist/components/fields/DatePicker/DatePickerButton.js.map +1 -1
  193. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  194. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  195. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  196. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  197. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  198. package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
  199. package/dist/components/fields/DatePicker/PeriodPicker.js +3 -2
  200. package/dist/components/fields/DatePicker/PeriodPicker.js.map +1 -1
  201. package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
  202. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  203. package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
  204. package/dist/components/fields/DatePicker/YearPicker.js +1 -1
  205. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  206. package/dist/components/fields/DatePicker/period.js +1 -1
  207. package/dist/components/fields/DatePicker/props.js +1 -1
  208. package/dist/components/fields/DatePicker/utils.js +1 -1
  209. package/dist/components/fields/FileInput/FileInput.js +1 -1
  210. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  211. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  212. package/dist/components/fields/FilterPicker/FilterPicker.js.map +1 -1
  213. package/dist/components/fields/Input/Input.js +1 -1
  214. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  215. package/dist/components/fields/ListBox/ListBox.js +1 -1
  216. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
  217. package/dist/components/fields/ListBoxPopover/index.d.ts +0 -1
  218. package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
  219. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
  220. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  221. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  222. package/dist/components/fields/PasswordInput/PasswordInput.js +9 -6
  223. package/dist/components/fields/PasswordInput/PasswordInput.js.map +1 -1
  224. package/dist/components/fields/Picker/Picker.js +1 -1
  225. package/dist/components/fields/Picker/Picker.js.map +1 -1
  226. package/dist/components/fields/RadioGroup/Radio.js +1 -1
  227. package/dist/components/fields/RadioGroup/RadioGroup.js +2 -1
  228. package/dist/components/fields/RadioGroup/RadioGroup.js.map +1 -1
  229. package/dist/components/fields/RadioGroup/context.js +1 -1
  230. package/dist/components/fields/SearchComboBox/SearchComboBox.js +2 -6
  231. package/dist/components/fields/SearchComboBox/SearchComboBox.js.map +1 -1
  232. package/dist/components/fields/SearchInput/SearchInput.js +18 -16
  233. package/dist/components/fields/SearchInput/SearchInput.js.map +1 -1
  234. package/dist/components/fields/Select/Select.js +3 -6
  235. package/dist/components/fields/Select/Select.js.map +1 -1
  236. package/dist/components/fields/Slider/Gradation.js +1 -1
  237. package/dist/components/fields/Slider/HueSlider.js +15 -2
  238. package/dist/components/fields/Slider/HueSlider.js.map +1 -1
  239. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  240. package/dist/components/fields/Slider/Slider.js +1 -1
  241. package/dist/components/fields/Slider/SliderBase.js +1 -1
  242. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  243. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  244. package/dist/components/fields/Slider/elements.js +1 -1
  245. package/dist/components/fields/Slider/index.js +1 -1
  246. package/dist/components/fields/Switch/Switch.js +1 -1
  247. package/dist/components/fields/TextArea/TextArea.js +10 -29
  248. package/dist/components/fields/TextArea/TextArea.js.map +1 -1
  249. package/dist/components/fields/TextInput/TextInput.js +1 -1
  250. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  251. package/dist/components/fields/TextInput/useAutoSizeTextArea.js +146 -0
  252. package/dist/components/fields/TextInput/useAutoSizeTextArea.js.map +1 -0
  253. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  254. package/dist/components/fields/color/ColorPanel.js +1 -1
  255. package/dist/components/fields/color/channels.js +1 -1
  256. package/dist/components/fields/color/color.js +4 -4
  257. package/dist/components/fields/color/color.js.map +1 -1
  258. package/dist/components/fields/color/context.js +1 -1
  259. package/dist/components/fields/color/index.d.ts +0 -1
  260. package/dist/components/fields/index.d.ts +2 -1
  261. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  262. package/dist/components/form/Form/Field.js +1 -1
  263. package/dist/components/form/Form/Form.js +1 -1
  264. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  265. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  266. package/dist/components/form/Form/SubmitError.js +1 -1
  267. package/dist/components/form/Form/index.js +1 -1
  268. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  269. package/dist/components/form/Form/use-field/use-field.js +1 -1
  270. package/dist/components/form/Form/use-form.js +1 -1
  271. package/dist/components/form/Form/validation.js +1 -1
  272. package/dist/components/form/Label.js +1 -1
  273. package/dist/components/form/validation/ValidationIndicator.js +1 -1
  274. package/dist/components/form/validation/resolve-validation-props.js +1 -1
  275. package/dist/components/form/validation/use-validation-props.js +1 -1
  276. package/dist/components/form/wrapper.js +1 -1
  277. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  278. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  279. package/dist/components/layout/Board/Board.d.ts +38 -5
  280. package/dist/components/layout/Board/Board.js +11 -5
  281. package/dist/components/layout/Board/Board.js.map +1 -1
  282. package/dist/components/layout/Board/BoardProvider.js +1 -1
  283. package/dist/components/layout/Board/BoardResponsive.js +1 -1
  284. package/dist/components/layout/Board/Widget.d.ts +16 -1
  285. package/dist/components/layout/Board/Widget.js +3 -2
  286. package/dist/components/layout/Board/Widget.js.map +1 -1
  287. package/dist/components/layout/Board/WidgetHost.js +92 -17
  288. package/dist/components/layout/Board/WidgetHost.js.map +1 -1
  289. package/dist/components/layout/Board/board-context.js +5 -5
  290. package/dist/components/layout/Board/board-context.js.map +1 -1
  291. package/dist/components/layout/Board/board-store.d.ts +1 -0
  292. package/dist/components/layout/Board/board-store.js +2 -2
  293. package/dist/components/layout/Board/board-store.js.map +1 -1
  294. package/dist/components/layout/Board/grid-core/calculate.js +1 -1
  295. package/dist/components/layout/Board/grid-core/collision-modes.js +186 -0
  296. package/dist/components/layout/Board/grid-core/collision-modes.js.map +1 -0
  297. package/dist/components/layout/Board/grid-core/collision.js +1 -1
  298. package/dist/components/layout/Board/grid-core/compactors.js +1 -1
  299. package/dist/components/layout/Board/grid-core/constraints.js +1 -1
  300. package/dist/components/layout/Board/grid-core/group-move.js +1 -1
  301. package/dist/components/layout/Board/grid-core/layout.js +12 -2
  302. package/dist/components/layout/Board/grid-core/layout.js.map +1 -1
  303. package/dist/components/layout/Board/grid-core/sort.js +1 -1
  304. package/dist/components/layout/Board/grid-core/types.d.ts +19 -1
  305. package/dist/components/layout/Board/index.d.ts +2 -2
  306. package/dist/components/layout/Board/index.js +1 -1
  307. package/dist/components/layout/Board/index.js.map +1 -1
  308. package/dist/components/layout/Board/responsive-utils.js +1 -1
  309. package/dist/components/layout/Board/use-board-layout.js +1 -1
  310. package/dist/components/layout/Board/use-board-registry.js +137 -47
  311. package/dist/components/layout/Board/use-board-registry.js.map +1 -1
  312. package/dist/components/layout/Board/use-board-select-modifier-key.js +1 -1
  313. package/dist/components/layout/Board/use-board-selection.js +1 -1
  314. package/dist/components/layout/Flex.js +1 -1
  315. package/dist/components/layout/Flow.js +1 -1
  316. package/dist/components/layout/Grid.js +1 -1
  317. package/dist/components/layout/Panel.js +1 -1
  318. package/dist/components/layout/Prefix.js +1 -1
  319. package/dist/components/layout/ResizablePanel.js +1 -1
  320. package/dist/components/layout/Space.js +1 -1
  321. package/dist/components/layout/Suffix.js +1 -1
  322. package/dist/components/navigation/Pagination/Pagination.js +1 -1
  323. package/dist/components/navigation/Pagination/use-pagination.js +1 -1
  324. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  325. package/dist/components/navigation/Tabs/TabButton.js +2 -29
  326. package/dist/components/navigation/Tabs/TabButton.js.map +1 -1
  327. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  328. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  329. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  330. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  331. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  332. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  333. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  334. package/dist/components/navigation/Tabs/styled.js +1 -1
  335. package/dist/components/navigation/Tabs/types.js +1 -1
  336. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  337. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  338. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  339. package/dist/components/other/Calendar/Calendar.js +1 -1
  340. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  341. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  342. package/dist/components/other/Calendar/CalendarHeader.js +1 -1
  343. package/dist/components/other/Calendar/CalendarPanel.js +1 -1
  344. package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
  345. package/dist/components/other/Calendar/PeriodGrid.js +1 -1
  346. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  347. package/dist/components/other/Calendar/styled.js +1 -1
  348. package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
  349. package/dist/components/other/NoDataIcon/NoDataIcon.d.ts +37 -0
  350. package/dist/components/other/NoDataIcon/NoDataIcon.js +56 -0
  351. package/dist/components/other/NoDataIcon/NoDataIcon.js.map +1 -0
  352. package/dist/components/other/NoDataIcon/index.d.ts +2 -0
  353. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  354. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  355. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  356. package/dist/components/overlays/Dialog/Dialog.js +4 -3
  357. package/dist/components/overlays/Dialog/Dialog.js.map +1 -1
  358. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  359. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  360. package/dist/components/overlays/Dialog/DialogTrigger.d.ts +13 -0
  361. package/dist/components/overlays/Dialog/DialogTrigger.js +24 -5
  362. package/dist/components/overlays/Dialog/DialogTrigger.js.map +1 -1
  363. package/dist/components/overlays/Dialog/context.js +1 -1
  364. package/dist/components/overlays/Dialog/context.js.map +1 -1
  365. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  366. package/dist/components/overlays/Modal/Modal.d.ts +1 -2
  367. package/dist/components/overlays/Modal/Modal.js +1 -1
  368. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  369. package/dist/components/overlays/Modal/Overlay.d.ts +0 -1
  370. package/dist/components/overlays/Modal/Overlay.js +1 -1
  371. package/dist/components/overlays/Modal/Popover.js +1 -1
  372. package/dist/components/overlays/Modal/Tray.js +1 -1
  373. package/dist/components/overlays/Modal/Underlay.js +1 -1
  374. package/dist/components/overlays/Modal/types.d.ts +0 -1
  375. package/dist/components/overlays/Notifications/Notification.js +1 -1
  376. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  377. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  378. package/dist/components/overlays/Notifications/NotificationContext.d.ts +0 -2
  379. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  380. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  381. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  382. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  383. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  384. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  385. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  386. package/dist/components/overlays/Notifications/index.js +1 -1
  387. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  388. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  389. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  390. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  391. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  392. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  393. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  394. package/dist/components/overlays/Toast/index.js +1 -1
  395. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  396. package/dist/components/overlays/Toast/useToast.js +1 -1
  397. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  398. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  399. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  400. package/dist/components/overlays/Tooltip/context.js +1 -1
  401. package/dist/components/portal/Portal.js +1 -1
  402. package/dist/components/portal/PortalProvider.js +1 -1
  403. package/dist/components/portal/index.d.ts +0 -1
  404. package/dist/components/portal/usePortal.js +1 -1
  405. package/dist/components/shared/DraggableCollection.js +1 -1
  406. package/dist/components/shared/InvalidIcon.js +1 -1
  407. package/dist/components/shared/ValidIcon.js +1 -1
  408. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  409. package/dist/components/status/LoadingAnimation/LoadingAnimation.js.map +1 -1
  410. package/dist/components/status/Spin/Cube.js +1 -1
  411. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  412. package/dist/components/status/Spin/Spin.js +1 -1
  413. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  414. package/dist/data/item-themes.d.ts +1 -1
  415. package/dist/data/item-themes.js +217 -46
  416. package/dist/data/item-themes.js.map +1 -1
  417. package/dist/data/themes.js +1 -1
  418. package/dist/eslint-plugin/defaults.generated.js +41 -13
  419. package/dist/eslint-plugin/defaults.generated.js.map +1 -1
  420. package/dist/eslint-plugin/index.js +1 -1
  421. package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
  422. package/dist/i18n/I18nProvider.js +1 -1
  423. package/dist/i18n/createFormatter.js +1 -1
  424. package/dist/i18n/index.js +1 -1
  425. package/dist/i18n/instance.js +1 -1
  426. package/dist/i18n/locales/de-DE/uikit.js +2 -1
  427. package/dist/i18n/locales/en-US/uikit.js +2 -1
  428. package/dist/i18n/locales/en-US/uikit.json.d.ts +1 -0
  429. package/dist/i18n/locales/es-ES/uikit.js +2 -1
  430. package/dist/i18n/locales/es-MX/uikit.js +2 -1
  431. package/dist/i18n/locales/fr-FR/uikit.js +2 -1
  432. package/dist/i18n/locales/it-IT/uikit.js +2 -1
  433. package/dist/i18n/locales/ja-JP/uikit.js +2 -1
  434. package/dist/i18n/locales/nb-NO/uikit.js +2 -1
  435. package/dist/i18n/locales/pt-BR/uikit.js +2 -1
  436. package/dist/i18n/locales/pt-PT/uikit.js +2 -1
  437. package/dist/i18n/locales/sv-SE/uikit.js +2 -1
  438. package/dist/i18n/locales/vi-VN/uikit.js +2 -1
  439. package/dist/i18n/locales.js +1 -1
  440. package/dist/i18n/useFormatter.js +1 -1
  441. package/dist/i18n/useI18n.js +1 -1
  442. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  443. package/dist/icons/AdjustmentsIcon.js +1 -1
  444. package/dist/icons/AiIcon.js +1 -1
  445. package/dist/icons/AreaChartIcon.js +1 -1
  446. package/dist/icons/ArrowNarrowDownIcon.js +1 -1
  447. package/dist/icons/ArrowNarrowUpIcon.js +1 -1
  448. package/dist/icons/BackwardIcon.js +1 -1
  449. package/dist/icons/BarChartIcon.js +1 -1
  450. package/dist/icons/BellFilledIcon.js +1 -1
  451. package/dist/icons/BellIcon.js +1 -1
  452. package/dist/icons/BooleanIcon.js +1 -1
  453. package/dist/icons/CalendarEditIcon.js +1 -1
  454. package/dist/icons/CalendarIcon.js +1 -1
  455. package/dist/icons/CaretDownIcon.js +1 -1
  456. package/dist/icons/CaretUpIcon.js +1 -1
  457. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  458. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  459. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  460. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  461. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  462. package/dist/icons/ChartBarLineIcon.js +1 -1
  463. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  464. package/dist/icons/ChartBarStackedIcon.js +1 -1
  465. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  466. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  467. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  468. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  469. package/dist/icons/ChartBubbleIcon.js +1 -1
  470. package/dist/icons/ChartDonut2Icon.js +1 -1
  471. package/dist/icons/ChartFunnelIcon.js +1 -1
  472. package/dist/icons/ChartHeatmapIcon.js +1 -1
  473. package/dist/icons/ChartKPIIcon.js +1 -1
  474. package/dist/icons/ChartPie2Icon.js +1 -1
  475. package/dist/icons/ChartScatterIcon.js +1 -1
  476. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  477. package/dist/icons/CheckCircleIcon.js +1 -1
  478. package/dist/icons/CheckIcon.js +1 -1
  479. package/dist/icons/CircleFilledIcon.js +1 -1
  480. package/dist/icons/ClearIcon.js +1 -1
  481. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  482. package/dist/icons/CloseCircleIcon.js +1 -1
  483. package/dist/icons/CloseIcon.js +1 -1
  484. package/dist/icons/CodeIcon.js +1 -1
  485. package/dist/icons/ColumnTotalIcon.js +1 -1
  486. package/dist/icons/CopyIcon.js +1 -1
  487. package/dist/icons/CountIcon.js +1 -1
  488. package/dist/icons/CubeIcon.js +1 -1
  489. package/dist/icons/CubePauseIcon.js +1 -1
  490. package/dist/icons/CubePlayIcon.js +1 -1
  491. package/dist/icons/CurrencyDollarIcon.js +1 -1
  492. package/dist/icons/DangerIcon.js +1 -1
  493. package/dist/icons/DashboardIcon.js +1 -1
  494. package/dist/icons/DatabaseIcon.js +1 -1
  495. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  496. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  497. package/dist/icons/DirectionIcon.js +1 -1
  498. package/dist/icons/DonutIcon.js +1 -1
  499. package/dist/icons/DownIcon.js +1 -1
  500. package/dist/icons/EditIcon.js +1 -1
  501. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  502. package/dist/icons/ExclamationCircleIcon.js +1 -1
  503. package/dist/icons/ExclamationIcon.js +1 -1
  504. package/dist/icons/EyeIcon.js +1 -1
  505. package/dist/icons/EyeInvisibleIcon.js +1 -1
  506. package/dist/icons/FilterIcon.js +1 -1
  507. package/dist/icons/FolderFilledIcon.js +1 -1
  508. package/dist/icons/FolderIcon.js +1 -1
  509. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  510. package/dist/icons/FolderOpenIcon.js +1 -1
  511. package/dist/icons/ForwardIcon.js +1 -1
  512. package/dist/icons/GripVerticalIcon.js +1 -1
  513. package/dist/icons/HierarchyIcon.js +1 -1
  514. package/dist/icons/HierarchyOpenIcon.js +1 -1
  515. package/dist/icons/Icon.js +1 -1
  516. package/dist/icons/InfoCircleIcon.js +1 -1
  517. package/dist/icons/InfoIcon.js +1 -1
  518. package/dist/icons/KeyIcon.js +1 -1
  519. package/dist/icons/LeftIcon.js +1 -1
  520. package/dist/icons/LineChartIcon.js +1 -1
  521. package/dist/icons/LoadingIcon.js +1 -1
  522. package/dist/icons/LockFilledIcon.js +1 -1
  523. package/dist/icons/LockIcon.js +1 -1
  524. package/dist/icons/MoreIcon.js +1 -1
  525. package/dist/icons/NotAllowedIcon.js +1 -1
  526. package/dist/icons/Number123Icon.js +1 -1
  527. package/dist/icons/NumberIcon.js +1 -1
  528. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  529. package/dist/icons/PauseCircleIcon.js +1 -1
  530. package/dist/icons/PauseIcon.js +1 -1
  531. package/dist/icons/PercentageIcon.js +1 -1
  532. package/dist/icons/PieChartIcon.js +1 -1
  533. package/dist/icons/PipetteIcon.js +1 -1
  534. package/dist/icons/PlayCircleIcon.js +1 -1
  535. package/dist/icons/PlayIcon.js +1 -1
  536. package/dist/icons/PlusIcon.js +1 -1
  537. package/dist/icons/ProgressBarIcon.js +1 -1
  538. package/dist/icons/ReloadIcon.js +1 -1
  539. package/dist/icons/ReportIcon.js +1 -1
  540. package/dist/icons/ReturnIcon.js +1 -1
  541. package/dist/icons/RightIcon.js +1 -1
  542. package/dist/icons/RowTotalsIcon.js +1 -1
  543. package/dist/icons/SchemeIcon.js +1 -1
  544. package/dist/icons/SearchIcon.js +1 -1
  545. package/dist/icons/SemanticQueryIcon.js +1 -1
  546. package/dist/icons/SettingsIcon.js +1 -1
  547. package/dist/icons/ShieldFilledIcon.js +1 -1
  548. package/dist/icons/ShieldIcon.js +1 -1
  549. package/dist/icons/SlashIcon.js +1 -1
  550. package/dist/icons/SparklesIcon.js +1 -1
  551. package/dist/icons/SqlIcon.js +1 -1
  552. package/dist/icons/StatsIcon.js +1 -1
  553. package/dist/icons/StopIcon.js +1 -1
  554. package/dist/icons/StringIcon.js +1 -1
  555. package/dist/icons/SubtotalsIcon.js +1 -1
  556. package/dist/icons/SwitchIcon.js +1 -1
  557. package/dist/icons/TableIcon.js +1 -1
  558. package/dist/icons/ThumbsDownIcon.js +1 -1
  559. package/dist/icons/ThumbsUpIcon.js +1 -1
  560. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  561. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  562. package/dist/icons/ThunderboltIcon.js +1 -1
  563. package/dist/icons/TimeIcon.js +1 -1
  564. package/dist/icons/TrashIcon.js +1 -1
  565. package/dist/icons/UnlockIcon.js +1 -1
  566. package/dist/icons/UpIcon.js +1 -1
  567. package/dist/icons/UserGroupIcon.js +1 -1
  568. package/dist/icons/UserIcon.js +1 -1
  569. package/dist/icons/UserLockIcon.js +1 -1
  570. package/dist/icons/ViewIcon.js +1 -1
  571. package/dist/icons/WarningFilledIcon.js +1 -1
  572. package/dist/icons/WarningIcon.js +1 -1
  573. package/dist/icons/wrap-icon.js +1 -1
  574. package/dist/index.d.ts +10 -7
  575. package/dist/index.js +6 -4
  576. package/dist/index.js.map +1 -1
  577. package/dist/probe/canonicalize.js +1 -1
  578. package/dist/probe/css.js +1 -1
  579. package/dist/probe/index.js +1 -1
  580. package/dist/provider.js +1 -1
  581. package/dist/providers/TrackingProvider.js +1 -1
  582. package/dist/providers/navigationAdapter.default.js +1 -1
  583. package/dist/tokens/base.js +1 -1
  584. package/dist/tokens/color-seed.d.ts +44 -0
  585. package/dist/tokens/color-seed.js +48 -0
  586. package/dist/tokens/color-seed.js.map +1 -0
  587. package/dist/tokens/color-theme.d.ts +9 -1
  588. package/dist/tokens/color-theme.js +20 -7
  589. package/dist/tokens/color-theme.js.map +1 -1
  590. package/dist/tokens/colors.js +20 -3
  591. package/dist/tokens/colors.js.map +1 -1
  592. package/dist/tokens/index.d.ts +2 -1
  593. package/dist/tokens/index.js +3 -2
  594. package/dist/tokens/index.js.map +1 -1
  595. package/dist/tokens/layout.js +1 -1
  596. package/dist/tokens/lazy-styles.js +1 -1
  597. package/dist/tokens/palette-config.d.ts +304 -77
  598. package/dist/tokens/palette-config.js +188 -49
  599. package/dist/tokens/palette-config.js.map +1 -1
  600. package/dist/tokens/palette.js +617 -163
  601. package/dist/tokens/palette.js.map +1 -1
  602. package/dist/tokens/shadows.js +1 -1
  603. package/dist/tokens/sizes.js +1 -1
  604. package/dist/tokens/spacing.js +1 -1
  605. package/dist/tokens/typography.js +1 -1
  606. package/dist/utils/ResizeSensor.js +1 -1
  607. package/dist/utils/is-dev-env.js +1 -1
  608. package/dist/utils/modules.js +1 -1
  609. package/dist/utils/promise.js +1 -1
  610. package/dist/utils/raf.js +1 -1
  611. package/dist/utils/random.js +1 -1
  612. package/dist/utils/range.js +1 -1
  613. package/dist/utils/react/RenderCache.js +1 -1
  614. package/dist/utils/react/Slots.js +1 -1
  615. package/dist/utils/react/chain.js +1 -1
  616. package/dist/utils/react/disabledProps.js +1 -1
  617. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  618. package/dist/utils/react/index.js +1 -1
  619. package/dist/utils/react/interactions.js +1 -1
  620. package/dist/utils/react/isTextOnly.js +1 -1
  621. package/dist/utils/react/mapProps.js +1 -1
  622. package/dist/utils/react/mergeProps.js +1 -1
  623. package/dist/utils/react/nullableValue.js +1 -1
  624. package/dist/utils/react/resolveIcon.js +1 -1
  625. package/dist/utils/react/sharedStore.js +1 -1
  626. package/dist/utils/react/useBufferedValue.js +1 -1
  627. package/dist/utils/react/useCombinedRefs.js +1 -1
  628. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  629. package/dist/utils/react/useEventBus.js +1 -1
  630. package/dist/utils/react/useId.js +1 -1
  631. package/dist/utils/react/useIsDarwin.js +1 -1
  632. package/dist/utils/react/useKeySymbols.js +1 -1
  633. package/dist/utils/react/useLayoutEffect.js +1 -1
  634. package/dist/utils/react/useLocalStorage.js +1 -1
  635. package/dist/utils/react/useMergeStyles.js +1 -1
  636. package/dist/utils/react/usePopoverSync.js +1 -1
  637. package/dist/utils/react/useQaProps.js +1 -1
  638. package/dist/utils/react/useViewportSize.js +1 -1
  639. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  640. package/dist/utils/selection.js +1 -1
  641. package/dist/utils/styles.js +1 -1
  642. package/dist/utils/tree.js +1 -1
  643. package/dist/utils/warnings.js +1 -1
  644. package/dist/version.js +3 -3
  645. package/docs/Introduction.md +85 -97
  646. package/docs/Theming.md +471 -83
  647. package/docs/Usage.md +63 -2
  648. package/docs/components/Root.md +1 -1
  649. package/docs/components/actions/Button.md +9 -3
  650. package/docs/components/actions/ItemAction.md +3 -3
  651. package/docs/components/actions/MenuTrigger.md +54 -2
  652. package/docs/components/actions/SubMenuTrigger.md +2 -2
  653. package/docs/components/content/CopySnippet.md +5 -5
  654. package/docs/components/content/InlineInput.md +1 -1
  655. package/docs/components/content/Item.md +10 -10
  656. package/docs/components/content/ItemBadge.md +2 -2
  657. package/docs/components/content/PrismCode.md +1 -0
  658. package/docs/components/data/DataTable.md +110 -11
  659. package/docs/components/data/ItemTable.md +63 -1
  660. package/docs/components/fields/ColorSwatch.md +155 -0
  661. package/docs/components/layout/Board.md +21 -2
  662. package/docs/components/other/NoDataIcon.md +48 -0
  663. package/docs/components/overlays/DialogTrigger.md +3 -2
  664. package/docs/components/status/LoadingAnimation.md +12 -0
  665. package/docs/glaze/api.md +155 -47
  666. package/docs/glaze/methodology.md +15 -13
  667. package/docs/glaze/migration.md +36 -0
  668. package/docs/glaze/okhst.md +4 -0
  669. package/docs/tasty/ai-agents.md +3 -0
  670. package/docs/tasty/configuration.md +11 -6
  671. package/docs/tasty/dsl.md +99 -2
  672. package/docs/tasty/styles.md +3 -1
  673. package/package.json +3 -3
  674. package/dist/components/fields/ListBoxPopover/useCompositeFocus.d.ts +0 -2
  675. package/dist/components/fields/color/ColorSwatch.js.map +0 -1
  676. package/dist/components/portal/PortalProvider.d.ts +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable.js","names":[],"sources":["../../../../src/components/data/DataTable/DataTable.tsx"],"sourcesContent":["import { SelectionManager } from '@react-stately/selection';\nimport { useControlledState } from '@react-stately/utils';\nimport { CONTAINER_STYLES } from '@tenphi/tasty';\nimport { forwardRef, useMemo, useRef, useState } from 'react';\nimport { useMultipleSelectionState } from 'react-stately';\n\nimport { useEvent } from '../../../_internal/hooks';\nimport { useI18n } from '../../../i18n';\nimport { useCombinedRefs } from '../../../utils/react';\nimport { extractStyles } from '../../../utils/styles';\nimport { clampPage, getPageInfo } from '../../navigation/Pagination';\nimport { DraggableCollection } from '../../shared/DraggableCollection';\nimport { ItemTableFooter } from '../ItemTable/ItemTableFooter';\nimport { RowCollection } from '../TableBase/RowCollection';\nimport { TableView } from '../TableBase/TableView';\nimport { selectionRowKey } from '../TableBase/types';\nimport { useCellSelection } from '../TableBase/use-cell-selection';\nimport {\n getDraggableColumnKeys,\n isColumnDraggable,\n useColumnOrder,\n} from '../TableBase/use-column-order';\nimport { useContainerWidth } from '../TableBase/use-container-width';\nimport {\n freezeColumnWidths,\n useTableColumns,\n} from '../TableBase/use-table-columns';\nimport { ROW_NUMBER_COLUMN_KEY } from '../TableBase/use-table-selection';\nimport { useTableSorts } from '../TableBase/use-table-sorts';\nimport { useTableStorage } from '../TableBase/use-table-storage';\n\nimport type { Key } from '@react-types/shared';\nimport type { ForwardedRef, ReactElement } from 'react';\nimport type {\n CubeTableColumnLayout,\n CubeTableRowSection,\n} from '../TableBase/types';\nimport type { CubeDataTableColumn, CubeDataTableProps } from './types';\n\n/** Wide enough for five digits at the dense default. */\nconst ROW_NUMBER_WIDTH = 56;\n\nconst EMPTY_WIDTHS: Record<string, number> = {};\n\nfunction defaultGetRowKey<T>(rowKey: string) {\n return (row: T, index: number): Key => {\n const value = (row as any)?.[rowKey];\n\n return value == null ? index : (value as Key);\n };\n}\n\n/**\n * A grid for query results.\n *\n * The same engine as `ItemTable` — one `TableView`, one column layout, one\n * value pipeline — with the defaults an analytical grid wants rather than a\n * list's: denser type, banded rows, resizable columns, multi-column sort, and\n * rows pinned for totals.\n *\n * It knows nothing about Cube. Measures, dimensions, pivots and drill-downs\n * reach it as ordinary columns, `render` output and `column.header.menu`\n * content, which is what keeps the ~34 kB of Cloud's column-header menu in\n * Cloud.\n */\nfunction DataTable<T = any>(\n props: CubeDataTableProps<T>,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const {\n data,\n columns,\n rowKey = 'id',\n getRowKey,\n pinnedTopRows,\n pinnedBottomRows,\n isLoading = false,\n loadingIndicator = 'overlay',\n skeletonRowCount,\n error,\n emptyLabel,\n noResultsLabel,\n isFiltered,\n shape = 'plain',\n // Denser than `ItemTable`'s `medium`: a result grid is read as a block, and\n // more rows on screen is the point of it.\n size = 'small',\n rowSize,\n rowHeight,\n headerHeight,\n isStriped = true,\n isHeaderHidden,\n isHeaderSticky,\n showRowNumbers = false,\n sortMode,\n sorts: sortsProp,\n defaultSorts,\n onSortsChange,\n paginationMode = 'client',\n page: pageProp,\n defaultPage,\n onPageChange,\n pageSize: pageSizeProp,\n defaultPageSize = 100,\n onPageSizeChange,\n pageSizeOptions,\n total: totalProp,\n totalPages,\n hasNextPage,\n summary = true,\n autoHidePagination = true,\n footerStart,\n footerCenter,\n footerEnd,\n cellSelectionMode = 'range',\n isCellSelectable,\n selectedCellRange,\n defaultSelectedCellRange,\n onCellRangeChange,\n isRowMoveAnimated,\n isResizable = true,\n columnWidths: columnWidthsProp,\n defaultColumnWidths,\n onColumnResize,\n isColumnReorderable = false,\n columnOrder,\n defaultColumnOrder,\n onColumnOrderChange,\n columnContextMenu,\n onColumnMenuAction,\n columnMenuTriggerProps,\n columnMenuProps,\n isVirtualized,\n virtualizeThreshold,\n overscan,\n getRowProps,\n storageKey,\n styles,\n headerStyles,\n headerCellStyles,\n bodyStyles,\n rowStyles,\n cellStyles,\n footerStyles,\n ariaLabel,\n qa,\n mods,\n ...rest\n } = props;\n\n const localRef = useRef<HTMLDivElement>(null);\n const rootRef = useCombinedRefs(ref, localRef);\n const [scrollerEl, setScrollerEl] = useState<HTMLElement | null>(null);\n const containerWidth = useContainerWidth(scrollerEl);\n\n const storage = useTableStorage(storageKey);\n\n /**\n * `dataType` is presentational, so it is folded into the column here rather\n * than reaching the renderer: `number` right-aligns and takes tabular figures\n * so digits line up down the column.\n */\n const resolvedColumns = useMemo(\n () =>\n columns.map((column) => {\n const isNumeric = column.dataType === 'number';\n\n return {\n ...column,\n align: column.align ?? (isNumeric ? 'end' : 'start'),\n cellStyles: isNumeric\n ? {\n fontVariantNumeric: 'tabular-nums',\n ...(typeof column.cellStyles === 'object'\n ? column.cellStyles\n : null),\n }\n : column.cellStyles,\n } as CubeDataTableColumn<T>;\n }),\n [columns],\n );\n\n // Applied to the SOURCE columns, before `useTableColumns`, so hidden-column\n // filtering, structural injection and pinned hoisting all still happen\n // downstream and `columnOrder` can never fight `pin`.\n const columnOrderState = useColumnOrder<T>({\n columns: resolvedColumns,\n columnOrder,\n defaultColumnOrder,\n onColumnOrderChange,\n storage,\n });\n const orderedColumns = columnOrderState.columns;\n\n const {\n sorts,\n sortedRows,\n toggleSort,\n setColumnSort,\n mode: resolvedSortMode,\n } = useTableSorts<T>({\n columns: orderedColumns,\n rows: data,\n mode: sortMode,\n sorts: sortsProp,\n defaultSorts,\n onSortsChange,\n });\n\n const [pageSize, setPageSizeState] = useControlledState<number>(\n pageSizeProp as number,\n (pageSizeProp === undefined && storage.has('pageSize')\n ? storage.initial.pageSize ?? defaultPageSize\n : defaultPageSize) as number,\n onPageSizeChange as (value: number) => void,\n );\n const [page, setPageState] = useControlledState<number>(\n pageProp as number,\n defaultPage ?? 1,\n onPageChange as (value: number) => void,\n );\n\n const isPaginated = paginationMode !== 'off';\n const isServerPaginated = paginationMode === 'server';\n const total = isServerPaginated ? totalProp ?? 0 : sortedRows.length;\n\n const pageInfo = getPageInfo({\n page,\n pageSize,\n total,\n totalPages: isServerPaginated ? totalPages : undefined,\n });\n\n const setPage = useEvent((next: number) =>\n setPageState(clampPage(next, pageInfo.totalPages)),\n );\n const setPageSize = useEvent((next: number) => {\n setPageSizeState(next);\n setPageState(1);\n\n if (pageSizeProp === undefined) storage.write({ pageSize: next });\n });\n\n const visibleRows =\n paginationMode === 'client'\n ? sortedRows.slice(\n (pageInfo.page - 1) * pageSize,\n pageInfo.page * pageSize,\n )\n : sortedRows;\n\n const [ownColumnWidths, setOwnColumnWidths] = useState<\n Record<string, number>\n >(\n () =>\n (columnWidthsProp === undefined && storage.has('columnWidths')\n ? storage.initial.columnWidths ?? defaultColumnWidths\n : defaultColumnWidths) ?? EMPTY_WIDTHS,\n );\n const [draftColumnWidths, setDraftColumnWidths] = useState<Record<\n string,\n number\n > | null>(null);\n const draftRef = useRef<Record<string, number> | null>(null);\n\n const baseColumnWidths = columnWidthsProp ?? ownColumnWidths;\n const columnWidths = draftColumnWidths ?? baseColumnWidths;\n\n /**\n * The resolved widths, for the freeze below. A ref because `layout` is\n * computed *after* this handler is defined, and `useEvent` only reads it when\n * the drag actually runs.\n */\n const layoutRef = useRef<CubeTableColumnLayout<T> | null>(null);\n\n const handleColumnResize = useEvent((key: string, width: number) => {\n // First move of a drag freezes every column, so this changes exactly one\n // width instead of re-splitting the flex pool. See `freezeColumnWidths`.\n const base =\n draftRef.current ??\n freezeColumnWidths(layoutRef.current, baseColumnWidths);\n\n draftRef.current = { ...base, [key]: Math.round(width) };\n setDraftColumnWidths(draftRef.current);\n });\n\n const handleColumnResizeEnd = useEvent((key: string) => {\n const next = draftRef.current ?? baseColumnWidths;\n\n if (columnWidthsProp === undefined) {\n setOwnColumnWidths(next);\n storage.write({ columnWidths: next });\n }\n\n onColumnResize?.(key, next[key], next);\n draftRef.current = null;\n setDraftColumnWidths(null);\n });\n\n const leadingColumns = useMemo(\n () =>\n showRowNumbers\n ? [{ key: ROW_NUMBER_COLUMN_KEY, width: ROW_NUMBER_WIDTH }]\n : undefined,\n [showRowNumbers],\n );\n\n const layout = useTableColumns<T>({\n columns: orderedColumns,\n containerWidth,\n columnWidths,\n leadingColumns,\n });\n\n layoutRef.current = layout;\n\n const { t } = useI18n();\n\n const resolvedGetRowKey = useMemo(\n () => getRowKey ?? defaultGetRowKey<T>(rowKey),\n [getRowKey, rowKey],\n );\n\n // Every row a range can reach, in the order they appear on screen. Pinned rows\n // are in it: a total is a figure like any other, and having to copy it\n // separately from the column it sums is the wrong trade.\n //\n // The keys are built here rather than inside the hook so they cannot disagree\n // with the ones the renderer stamps — a pinned row is keyed by its own index\n // within its group, exactly as `renderPinnedRow` keys it.\n const selectionRows = useMemo(\n () => [\n ...(pinnedTopRows ?? []),\n ...visibleRows,\n ...(pinnedBottomRows ?? []),\n ],\n [pinnedTopRows, visibleRows, pinnedBottomRows],\n );\n const selectionRowKeys = useMemo(\n () => [\n // Section-qualified, matching what the renderer stamps: the same record\n // is routinely pinned at both edges, and one flat key space collapsed the\n // two into whichever came first.\n ...(pinnedTopRows ?? []).map((row, index) =>\n selectionRowKey('pinnedTop', resolvedGetRowKey(row, index)),\n ),\n ...visibleRows.map(resolvedGetRowKey),\n ...(pinnedBottomRows ?? []).map((row, index) =>\n selectionRowKey('pinnedBottom', resolvedGetRowKey(row, index)),\n ),\n ],\n [pinnedTopRows, visibleRows, pinnedBottomRows, resolvedGetRowKey],\n );\n\n // The hook works in one flat row order; the section a row belongs to is a\n // property of where it sits in that order, so it is resolved here rather than\n // asking the consumer to track it.\n const resolveCellSelectable = useEvent(\n (row: T, rowKey: Key, columnKey: string) => {\n if (!isCellSelectable) return true;\n\n const index = selectionRowKeys.indexOf(rowKey);\n const topCount = pinnedTopRows?.length ?? 0;\n const section: CubeTableRowSection =\n index < topCount\n ? 'pinnedTop'\n : index < topCount + visibleRows.length\n ? 'body'\n : 'pinnedBottom';\n\n return isCellSelectable({ row, rowKey, columnKey, section });\n },\n );\n\n const cellSelection = useCellSelection<T>({\n mode: cellSelectionMode,\n columns: layout.columns,\n rows: selectionRows,\n rowKeys: selectionRowKeys,\n isCellSelectable: isCellSelectable ? resolveCellSelectable : undefined,\n range: selectedCellRange,\n defaultRange: defaultSelectedCellRange,\n onRangeChange: onCellRangeChange,\n });\n\n // Same as `ItemTable`: style props (`height`, `maxHeight`, `margin`, …) land\n // on the root frame. `height` is the one that matters — there is no\n // page-scroll mode, so bounding the grid is what turns the body into a\n // scroller, pins the header, and lets virtualization engage at all.\n const rootStyles = { ...extractStyles(props, CONTAINER_STYLES), ...styles };\n\n const smallestPageSize = pageSizeOptions?.length\n ? Math.min(...pageSizeOptions)\n : pageSize;\n\n const showPagination =\n isPaginated &&\n !(\n autoHidePagination &&\n !hasNextPage &&\n pageInfo.totalPages <= 1 &&\n total <= smallestPageSize\n );\n\n const hasFooter =\n showPagination ||\n footerStart != null ||\n footerCenter != null ||\n footerEnd != null;\n\n /* ── column reordering ────────────────────────────────────────────────── */\n\n const headRowRef = useRef<HTMLTableRowElement>(null);\n const draggableColumnKeys = useMemo(\n () => getDraggableColumnKeys(layout.columns, isColumnReorderable),\n [layout.columns, isColumnReorderable],\n );\n const columnCollection = useMemo(\n () =>\n new RowCollection(\n layout.columns.filter((column) =>\n isColumnDraggable(column, isColumnReorderable),\n ),\n (column) => column.key,\n new Set(),\n // The drag announcements read this — otherwise a screen reader hears\n // \"Insert between and \".\n (column) =>\n typeof column.title === 'string' ? column.title : column.key,\n ),\n [layout.columns, isColumnReorderable],\n );\n /**\n * `'single'`, not `'none'`.\n *\n * `useDraggableItem` only deletes its own `onClick` — the one that would\n * hijack a screen-reader click away from the sort — when the selection mode is\n * not `'none'`, and only then does it attach the keyboard drag description.\n * Nothing is ever actually selected here.\n */\n const columnSelectionState = useMultipleSelectionState({\n selectionMode: 'single',\n disabledBehavior: 'all',\n });\n const columnSelectionManager = useMemo(\n () => new SelectionManager(columnCollection, columnSelectionState),\n [columnCollection, columnSelectionState],\n );\n const handleColumnFocus = useEvent((columnKey: string | null) => {\n columnSelectionManager.setFocusedKey(columnKey);\n });\n\n // One draggable column cannot be reordered, so the machinery stays unmounted\n // and the header keeps its exact DOM.\n const isColumnDragEnabled =\n isColumnReorderable && draggableColumnKeys.length > 1;\n\n const renderTable = (\n columnDragState?: any,\n columnDropState?: any,\n headCollectionProps?: Record<string, any>,\n ) => (\n <TableView<T>\n {...rest}\n rootRef={rootRef}\n qa={qa || 'DataTable'}\n rows={visibleRows}\n pinnedTopRows={pinnedTopRows}\n pinnedBottomRows={pinnedBottomRows}\n // Continuous across pages: row 101 is row 101, not row 1 of page two.\n //\n // Server mode counts too — the page and its size are known there just the\n // same, and `rows` is that page. Only `'off'` starts at 1, because then\n // there is no page to be on.\n rowNumberOffset={\n paginationMode === 'off' ? 0 : (pageInfo.page - 1) * pageSize\n }\n // The same offset drives `aria-rowindex`, which is document-absolute by\n // contract — a screen reader on page 3 should hear \"row 51 of 240\", not\n // \"row 1 of 25\".\n rowIndexOffset={\n paginationMode === 'off' ? 0 : (pageInfo.page - 1) * pageSize\n }\n totalRowCount={total}\n layout={layout}\n // Always on, unlike `ItemTable`. A result grid is read down a column, and\n // once the values are wide and right-aligned the rule is what keeps a\n // figure attached to its column — which is why Cloud's ag-grid theme sets\n // `columnBorder` for `DataTable` and not for the list grids.\n hasColumnDividers\n cellSelection={cellSelection}\n getRowKey={resolvedGetRowKey}\n onScrollerRef={setScrollerEl}\n isLoading={isLoading}\n loadingIndicator={loadingIndicator}\n skeletonRowCount={skeletonRowCount}\n error={error}\n // Same localized fallbacks as `ItemTable`: a grid that has finished\n // loading and shows an unexplained blank rectangle reads as broken.\n emptyLabel={emptyLabel ?? t('itemTable.noItems', 'No items')}\n noResultsLabel={\n noResultsLabel ?? t('itemTable.noResults', 'No results found')\n }\n isFiltered={isFiltered}\n shape={shape}\n size={size}\n rowSize={rowSize}\n rowHeight={rowHeight}\n headerHeight={headerHeight}\n isStriped={isStriped}\n isRowMoveAnimated={isRowMoveAnimated}\n isHeaderHidden={isHeaderHidden}\n isHeaderSticky={isHeaderSticky}\n // The header shows the column name at body size — a result grid has no\n // room for the uppercase caption a list header uses.\n // `t4` throughout: a result grid is read as a block, and one step down\n // from the list preset fits noticeably more on screen without losing\n // legibility. The header takes the medium weight of the same step.\n contentPreset=\"t4\"\n headerPreset=\"t4m\"\n sortMode={resolvedSortMode}\n sorts={sorts}\n onColumnSort={toggleSort}\n onColumnSortChange={setColumnSort}\n columnContextMenu={columnContextMenu}\n onColumnMenuAction={onColumnMenuAction}\n columnMenuTriggerProps={columnMenuTriggerProps}\n columnMenuProps={columnMenuProps}\n isVirtualized={isVirtualized}\n virtualizeThreshold={virtualizeThreshold}\n overscan={overscan}\n isResizable={isResizable}\n onColumnResize={handleColumnResize}\n onColumnResizeEnd={handleColumnResizeEnd}\n getRowProps={getRowProps}\n ariaLabel={ariaLabel}\n styles={rootStyles}\n headerStyles={headerStyles}\n headerCellStyles={headerCellStyles}\n bodyStyles={bodyStyles}\n rowStyles={rowStyles}\n cellStyles={cellStyles}\n mods={mods}\n isColumnReorderable={isColumnDragEnabled}\n columnDragState={columnDragState}\n columnDropState={columnDropState}\n headCollectionProps={headCollectionProps}\n headRowRef={headRowRef}\n onColumnFocus={handleColumnFocus}\n footer={\n hasFooter ? (\n <ItemTableFooter\n start={footerStart}\n center={footerCenter}\n end={footerEnd}\n styles={footerStyles}\n pagination={\n showPagination\n ? {\n page: pageInfo.page,\n pageSize,\n total,\n totalPages: pageInfo.totalPages,\n pageSizeOptions,\n summary,\n hasNextPage,\n onPageChange: setPage,\n onPageSizeChange: setPageSize,\n }\n : undefined\n }\n />\n ) : null\n }\n />\n );\n\n return isColumnDragEnabled ? (\n <DraggableCollection\n state={{\n collection: columnCollection as any,\n selectionManager: columnSelectionManager as any,\n disabledKeys: new Set(),\n }}\n // The element that DIRECTLY contains the header cells. React Aria's\n // `ListDropTargetDelegate` resolves a drop by measuring `[data-key]`\n // descendants of this element, so pointing it anywhere else leaves every\n // drop unresolvable — the column lifts but never lands.\n listRef={headRowRef}\n orderedKeys={draggableColumnKeys}\n orientation=\"horizontal\"\n onReorder={columnOrderState.reorder}\n >\n {(dragState, dropState, collectionProps) =>\n renderTable(dragState, dropState, collectionProps)\n }\n </DraggableCollection>\n ) : (\n renderTable()\n );\n}\n\nconst _DataTable = forwardRef(DataTable) as unknown as (<T = any>(\n props: CubeDataTableProps<T> & { ref?: ForwardedRef<HTMLDivElement> },\n) => ReactElement) & { displayName?: string };\n\n_DataTable.displayName = 'DataTable';\n\nexport { _DataTable as DataTable };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCA,MAAM,mBAAmB;AAEzB,MAAM,eAAuC,EAAE;AAE/C,SAAS,iBAAoB,QAAgB;AAC3C,SAAQ,KAAQ,UAAuB;EACrC,MAAM,QAAS,MAAc;AAE7B,SAAO,SAAS,OAAO,QAAS;;;;;;;;;;;;;;;;AAiBpC,SAAS,UACP,OACA,KACA;CACA,MAAM,EACJ,MACA,SACA,SAAS,MACT,WACA,eACA,kBACA,YAAY,OACZ,mBAAmB,WACnB,kBACA,OACA,YACA,gBACA,YACA,QAAQ,SAGR,OAAO,SACP,SACA,WACA,cACA,YAAY,MACZ,gBACA,gBACA,iBAAiB,OACjB,UACA,OAAO,WACP,cACA,eACA,iBAAiB,UACjB,MAAM,UACN,aACA,cACA,UAAU,cACV,kBAAkB,KAClB,kBACA,iBACA,OAAO,WACP,YACA,aACA,UAAU,MACV,qBAAqB,MACrB,aACA,cACA,WACA,oBAAoB,SACpB,kBACA,mBACA,0BACA,mBACA,mBACA,cAAc,MACd,cAAc,kBACd,qBACA,gBACA,sBAAsB,OACtB,aACA,oBACA,qBACA,mBACA,oBACA,wBACA,iBACA,eACA,qBACA,UACA,aACA,YACA,QACA,cACA,kBACA,YACA,WACA,YACA,cACA,WACA,IACA,MACA,GAAG,SACD;CAGJ,MAAM,UAAU,gBAAgB,KADf,OAAuB,KAAK,CACC;CAC9C,MAAM,CAAC,YAAY,iBAAiB,SAA6B,KAAK;CACtE,MAAM,iBAAiB,kBAAkB,WAAW;CAEpD,MAAM,UAAU,gBAAgB,WAAW;CA+B3C,MAAM,mBAAmB,eAAkB;EACzC,SAzBsB,cAEpB,QAAQ,KAAK,WAAW;GACtB,MAAM,YAAY,OAAO,aAAa;AAEtC,UAAO;IACL,GAAG;IACH,OAAO,OAAO,UAAU,YAAY,QAAQ;IAC5C,YAAY,YACR;KACE,oBAAoB;KACpB,GAAI,OAAO,OAAO,eAAe,WAC7B,OAAO,aACP;KACL,GACD,OAAO;IACZ;IACD,EACJ,CAAC,QAAQ,CACV;EAOC;EACA;EACA;EACA;EACD,CAAC;CACF,MAAM,iBAAiB,iBAAiB;CAExC,MAAM,EACJ,OACA,YACA,YACA,eACA,MAAM,qBACJ,cAAiB;EACnB,SAAS;EACT,MAAM;EACN,MAAM;EACN,OAAO;EACP;EACA;EACD,CAAC;CAEF,MAAM,CAAC,UAAU,oBAAoB,mBACnC,cACC,iBAAiB,UAAa,QAAQ,IAAI,WAAW,GAClD,QAAQ,QAAQ,YAAY,kBAC5B,iBACJ,iBACD;CACD,MAAM,CAAC,MAAM,gBAAgB,mBAC3B,UACA,eAAe,GACf,aACD;CAED,MAAM,cAAc,mBAAmB;CACvC,MAAM,oBAAoB,mBAAmB;CAC7C,MAAM,QAAQ,oBAAoB,aAAa,IAAI,WAAW;CAE9D,MAAM,WAAW,YAAY;EAC3B;EACA;EACA;EACA,YAAY,oBAAoB,aAAa;EAC9C,CAAC;CAEF,MAAM,UAAU,UAAU,SACxB,aAAa,UAAU,MAAM,SAAS,WAAW,CAAC,CACnD;CACD,MAAM,cAAc,UAAU,SAAiB;AAC7C,mBAAiB,KAAK;AACtB,eAAa,EAAE;AAEf,MAAI,iBAAiB,OAAW,SAAQ,MAAM,EAAE,UAAU,MAAM,CAAC;GACjE;CAEF,MAAM,cACJ,mBAAmB,WACf,WAAW,OACR,SAAS,OAAO,KAAK,UACtB,SAAS,OAAO,SACjB,GACD;CAEN,MAAM,CAAC,iBAAiB,sBAAsB,gBAIzC,qBAAqB,UAAa,QAAQ,IAAI,eAAe,GAC1D,QAAQ,QAAQ,gBAAgB,sBAChC,wBAAwB,aAC/B;CACD,MAAM,CAAC,mBAAmB,wBAAwB,SAGxC,KAAK;CACf,MAAM,WAAW,OAAsC,KAAK;CAE5D,MAAM,mBAAmB,oBAAoB;CAC7C,MAAM,eAAe,qBAAqB;;;;;;CAO1C,MAAM,YAAY,OAAwC,KAAK;CAE/D,MAAM,qBAAqB,UAAU,KAAa,UAAkB;AAOlE,WAAS,UAAU;GAAE,GAHnB,SAAS,WACT,mBAAmB,UAAU,SAAS,iBAAiB;IAE1B,MAAM,KAAK,MAAM,MAAM;GAAE;AACxD,uBAAqB,SAAS,QAAQ;GACtC;CAEF,MAAM,wBAAwB,UAAU,QAAgB;EACtD,MAAM,OAAO,SAAS,WAAW;AAEjC,MAAI,qBAAqB,QAAW;AAClC,sBAAmB,KAAK;AACxB,WAAQ,MAAM,EAAE,cAAc,MAAM,CAAC;;AAGvC,mBAAiB,KAAK,KAAK,MAAM,KAAK;AACtC,WAAS,UAAU;AACnB,uBAAqB,KAAK;GAC1B;CAUF,MAAM,SAAS,gBAAmB;EAChC,SAAS;EACT;EACA;EACA,gBAZqB,cAEnB,iBACI,CAAC;GAAE,KAAK;GAAuB,OAAO;GAAkB,CAAC,GACzD,QACN,CAAC,eAAe,CACjB;EAOA,CAAC;AAEF,WAAU,UAAU;CAEpB,MAAM,EAAE,MAAM,SAAS;CAEvB,MAAM,oBAAoB,cAClB,aAAa,iBAAoB,OAAO,EAC9C,CAAC,WAAW,OAAO,CACpB;CASD,MAAM,gBAAgB,cACd;EACJ,GAAI,iBAAiB,EAAE;EACvB,GAAG;EACH,GAAI,oBAAoB,EAAE;EAC3B,EACD;EAAC;EAAe;EAAa;EAAiB,CAC/C;CACD,MAAM,mBAAmB,cACjB;EAIJ,IAAI,iBAAiB,EAAE,EAAE,KAAK,KAAK,UACjC,gBAAgB,aAAa,kBAAkB,KAAK,MAAM,CAAC,CAC5D;EACD,GAAG,YAAY,IAAI,kBAAkB;EACrC,IAAI,oBAAoB,EAAE,EAAE,KAAK,KAAK,UACpC,gBAAgB,gBAAgB,kBAAkB,KAAK,MAAM,CAAC,CAC/D;EACF,EACD;EAAC;EAAe;EAAa;EAAkB;EAAkB,CAClE;CAKD,MAAM,wBAAwB,UAC3B,KAAQ,QAAa,cAAsB;AAC1C,MAAI,CAAC,iBAAkB,QAAO;EAE9B,MAAM,QAAQ,iBAAiB,QAAQ,OAAO;EAC9C,MAAM,WAAW,eAAe,UAAU;AAQ1C,SAAO,iBAAiB;GAAE;GAAK;GAAQ;GAAW,SANhD,QAAQ,WACJ,cACA,QAAQ,WAAW,YAAY,SAC7B,SACA;GAEmD,CAAC;GAE/D;CAED,MAAM,gBAAgB,iBAAoB;EACxC,MAAM;EACN,SAAS,OAAO;EAChB,MAAM;EACN,SAAS;EACT,kBAAkB,mBAAmB,wBAAwB;EAC7D,OAAO;EACP,cAAc;EACd,eAAe;EAChB,CAAC;CAMF,MAAM,aAAa;EAAE,GAAG,cAAc,OAAO,iBAAiB;EAAE,GAAG;EAAQ;CAE3E,MAAM,mBAAmB,iBAAiB,SACtC,KAAK,IAAI,GAAG,gBAAgB,GAC5B;CAEJ,MAAM,iBACJ,eACA,EACE,sBACA,CAAC,eACD,SAAS,cAAc,KACvB,SAAS;CAGb,MAAM,YACJ,kBACA,eAAe,QACf,gBAAgB,QAChB,aAAa;CAIf,MAAM,aAAa,OAA4B,KAAK;CACpD,MAAM,sBAAsB,cACpB,uBAAuB,OAAO,SAAS,oBAAoB,EACjE,CAAC,OAAO,SAAS,oBAAoB,CACtC;CACD,MAAM,mBAAmB,cAErB,IAAI,cACF,OAAO,QAAQ,QAAQ,WACrB,kBAAkB,QAAQ,oBAAoB,CAC/C,GACA,WAAW,OAAO,qBACnB,IAAI,KAAK,GAGR,WACC,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ,OAAO,IAC5D,EACH,CAAC,OAAO,SAAS,oBAAoB,CACtC;;;;;;;;;CASD,MAAM,uBAAuB,0BAA0B;EACrD,eAAe;EACf,kBAAkB;EACnB,CAAC;CACF,MAAM,yBAAyB,cACvB,IAAI,iBAAiB,kBAAkB,qBAAqB,EAClE,CAAC,kBAAkB,qBAAqB,CACzC;CACD,MAAM,oBAAoB,UAAU,cAA6B;AAC/D,yBAAuB,cAAc,UAAU;GAC/C;CAIF,MAAM,sBACJ,uBAAuB,oBAAoB,SAAS;CAEtD,MAAM,eACJ,iBACA,iBACA,wBAEA,oBAAC;EACC,GAAI;EACK;EACT,IAAI,MAAM;EACV,MAAM;EACS;EACG;EAMlB,iBACE,mBAAmB,QAAQ,KAAK,SAAS,OAAO,KAAK;EAKvD,gBACE,mBAAmB,QAAQ,KAAK,SAAS,OAAO,KAAK;EAEvD,eAAe;EACP;EAKR;EACe;EACf,WAAW;EACX,eAAe;EACJ;EACO;EACA;EACX;EAGP,YAAY,cAAc,EAAE,qBAAqB,WAAW;EAC5D,gBACE,kBAAkB,EAAE,uBAAuB,mBAAmB;EAEpD;EACL;EACD;EACG;EACE;EACG;EACH;EACQ;EACH;EACA;EAMhB,eAAc;EACd,cAAa;EACb,UAAU;EACH;EACP,cAAc;EACd,oBAAoB;EACD;EACC;EACI;EACP;EACF;EACM;EACX;EACG;EACb,gBAAgB;EAChB,mBAAmB;EACN;EACF;EACX,QAAQ;EACM;EACI;EACN;EACD;EACC;EACN;EACN,qBAAqB;EACJ;EACA;EACI;EACT;EACZ,eAAe;EACf,QACE,YACE,oBAAC;GACC,OAAO;GACP,QAAQ;GACR,KAAK;GACL,QAAQ;GACR,YACE,iBACI;IACE,MAAM,SAAS;IACf;IACA;IACA,YAAY,SAAS;IACrB;IACA;IACA;IACA,cAAc;IACd,kBAAkB;IACnB,GACD;IAEN,GACA;GAEN;AAGJ,QAAO,sBACL,oBAAC;EACC,OAAO;GACL,YAAY;GACZ,kBAAkB;GAClB,8BAAc,IAAI,KAAK;GACxB;EAKD,SAAS;EACT,aAAa;EACb,aAAY;EACZ,WAAW,iBAAiB;aAE1B,WAAW,WAAW,oBACtB,YAAY,WAAW,WAAW,gBAAgB;GAEhC,GAEtB,aAAa;;AAIjB,MAAM,aAAa,WAAW,UAAU;AAIxC,WAAW,cAAc"}
1
+ {"version":3,"file":"DataTable.js","names":[],"sources":["../../../../src/components/data/DataTable/DataTable.tsx"],"sourcesContent":["import { useCollator } from '@react-aria/i18n';\nimport { SelectionManager } from '@react-stately/selection';\nimport { useControlledState } from '@react-stately/utils';\nimport { CONTAINER_STYLES } from '@tenphi/tasty';\nimport { forwardRef, useMemo, useRef, useState } from 'react';\nimport { useMultipleSelectionState } from 'react-stately';\n\nimport { useEvent, useWarn } from '../../../_internal/hooks';\nimport { useI18n } from '../../../i18n';\nimport { useCombinedRefs } from '../../../utils/react';\nimport { extractStyles } from '../../../utils/styles';\nimport { clampPage, getPageInfo } from '../../navigation/Pagination';\nimport { DraggableCollection } from '../../shared/DraggableCollection';\nimport { ItemTableFooter } from '../ItemTable/ItemTableFooter';\nimport { RowCollection } from '../TableBase/RowCollection';\nimport {\n buildTableTree,\n flattenTableTree,\n reindexTableTree,\n sortTableTree,\n} from '../TableBase/table-tree';\nimport { TableView } from '../TableBase/TableView';\nimport { selectionRowKey } from '../TableBase/types';\nimport { useCellSelection } from '../TableBase/use-cell-selection';\nimport {\n getDraggableColumnKeys,\n isColumnDraggable,\n useColumnOrder,\n} from '../TableBase/use-column-order';\nimport { useContainerWidth } from '../TableBase/use-container-width';\nimport {\n freezeColumnWidths,\n getColumnText,\n useTableColumns,\n} from '../TableBase/use-table-columns';\nimport { ROW_NUMBER_COLUMN_KEY } from '../TableBase/use-table-selection';\nimport { compareByColumn } from '../TableBase/use-table-sort';\nimport { useTableSorts } from '../TableBase/use-table-sorts';\nimport { useTableStorage } from '../TableBase/use-table-storage';\nimport { useTableTreeState } from '../TableBase/use-table-tree-state';\n\nimport type { Key } from '@react-types/shared';\nimport type { ForwardedRef, ReactElement } from 'react';\nimport type {\n CubeTableColumnGroupHeader,\n CubeTableColumnLayout,\n CubeTableRowSection,\n} from '../TableBase/types';\nimport type {\n CubeDataTableColumn,\n CubeDataTableColumnDefinition,\n CubeDataTableColumnGroup,\n CubeDataTableProps,\n} from './types';\n\n/** Wide enough for five digits at the dense default. */\nconst ROW_NUMBER_WIDTH = 56;\n\nconst EMPTY_WIDTHS: Record<string, number> = {};\n\ninterface DataTableColumnModel<T> {\n columns: CubeDataTableColumn<T>[];\n headerPaths: Map<string, readonly CubeTableColumnGroupHeader[]>;\n}\n\nfunction isColumnGroup<T>(\n column: CubeDataTableColumnDefinition<T>,\n): column is CubeDataTableColumnGroup<T> {\n return 'children' in column;\n}\n\n/** Flattens the public column tree while retaining each leaf's header path. */\nfunction buildColumnModel<T>(\n definitions: readonly CubeDataTableColumnDefinition<T>[],\n): DataTableColumnModel<T> {\n const columns: CubeDataTableColumn<T>[] = [];\n const headerPaths = new Map<string, readonly CubeTableColumnGroupHeader[]>();\n\n function visit(\n entries: readonly CubeDataTableColumnDefinition<T>[],\n path: readonly CubeTableColumnGroupHeader[],\n ) {\n for (const entry of entries) {\n if (isColumnGroup(entry)) {\n visit(entry.children, [\n ...path,\n { key: entry.key, title: entry.title },\n ]);\n } else {\n columns.push(entry);\n if (path.length) headerPaths.set(entry.key, path);\n }\n }\n }\n\n visit(definitions, []);\n\n return { columns, headerPaths };\n}\n\nfunction defaultGetRowKey<T>(rowKey: string) {\n return (row: T, index: number): Key => {\n const value = (row as any)?.[rowKey];\n\n return value == null ? index : (value as Key);\n };\n}\n\n/**\n * A grid for query results.\n *\n * The same engine as `ItemTable` — one `TableView`, one column layout, one\n * value pipeline — with the defaults an analytical grid wants rather than a\n * list's: denser type, banded rows, resizable columns, multi-column sort, and\n * rows pinned for totals.\n *\n * It knows nothing about Cube. Measures, dimensions, pivots and drill-downs\n * reach it as leaf columns, presentational column groups, `render` output and\n * `column.header.menu` content, which is what keeps the ~34 kB of Cloud's\n * column-header menu in Cloud.\n */\nfunction DataTable<T = any>(\n props: CubeDataTableProps<T>,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const {\n data,\n columns,\n rowKey = 'id',\n getRowKey,\n getRowChildren,\n treeColumnKey,\n expandedKeys,\n defaultExpandedKeys,\n onExpand,\n pinnedTopRows,\n pinnedBottomRows,\n isLoading = false,\n loadingIndicator = 'overlay',\n skeletonRowCount,\n error,\n emptyLabel,\n noResultsLabel,\n isFiltered,\n shape = 'plain',\n // Denser than `ItemTable`'s `medium`: a result grid is read as a block, and\n // more rows on screen is the point of it.\n size = 'small',\n rowSize,\n rowHeight,\n headerHeight,\n isStriped = true,\n isHeaderHidden,\n isHeaderSticky,\n isAutoHeight = false,\n showRowNumbers = false,\n sortMode,\n sorts: sortsProp,\n defaultSorts,\n onSortsChange,\n paginationMode = 'client',\n page: pageProp,\n defaultPage,\n onPageChange,\n pageSize: pageSizeProp,\n defaultPageSize = 100,\n onPageSizeChange,\n pageSizeOptions,\n total: totalProp,\n totalPages,\n hasNextPage,\n summary = true,\n autoHidePagination = true,\n footerStart,\n footerCenter,\n footerEnd,\n cellSelectionMode = 'range',\n isCellSelectable,\n selectedCellRange,\n defaultSelectedCellRange,\n onCellRangeChange,\n isRowMoveAnimated,\n isResizable = true,\n columnWidths: columnWidthsProp,\n defaultColumnWidths,\n onColumnResize,\n isColumnReorderable = false,\n columnOrder,\n defaultColumnOrder,\n onColumnOrderChange,\n columnContextMenu,\n onColumnMenuAction,\n columnMenuTriggerProps,\n columnMenuProps,\n isVirtualized,\n virtualizeThreshold,\n overscan,\n getRowProps,\n storageKey,\n styles,\n headerStyles,\n headerCellStyles,\n bodyStyles,\n rowStyles,\n cellStyles,\n footerStyles,\n ariaLabel,\n qa,\n mods,\n ...rest\n } = props;\n\n const localRef = useRef<HTMLDivElement>(null);\n const rootRef = useCombinedRefs(ref, localRef);\n const [scrollerEl, setScrollerEl] = useState<HTMLElement | null>(null);\n const containerWidth = useContainerWidth(scrollerEl);\n\n const resolvedGetRowKey = useMemo(\n () => getRowKey ?? defaultGetRowKey<T>(rowKey),\n [getRowKey, rowKey],\n );\n\n const treeModel = useMemo(\n () =>\n getRowChildren\n ? buildTableTree(data, getRowChildren, resolvedGetRowKey)\n : null,\n [data, getRowChildren, resolvedGetRowKey],\n );\n\n useWarn(treeModel != null && treeModel.duplicateKeys.length > 0, {\n key: ['data-table-tree-duplicate-keys'],\n args: [\n 'DataTable:',\n 'Tree row keys must be unique across the complete hierarchy. Duplicate rows were ignored.',\n ],\n });\n useWarn(treeModel != null && treeModel.cyclicKeys.length > 0, {\n key: ['data-table-tree-cyclic-keys'],\n args: [\n 'DataTable:',\n 'Tree data contains a cycle. Cyclic descendants were ignored.',\n ],\n });\n\n const storage = useTableStorage(storageKey);\n\n const columnModel = useMemo(() => buildColumnModel(columns), [columns]);\n const hasColumnGroups = columnModel.headerPaths.size > 0;\n\n /**\n * `dataType` is presentational, so it is folded into the column here rather\n * than reaching the renderer: `number` right-aligns and takes tabular figures\n * so digits line up down the column.\n */\n const resolvedColumns = useMemo(\n () =>\n columnModel.columns.map((column) => {\n const isNumeric = column.dataType === 'number';\n\n return {\n ...column,\n align: column.align ?? (isNumeric ? 'end' : 'start'),\n cellStyles: isNumeric\n ? {\n fontVariantNumeric: 'tabular-nums',\n ...(typeof column.cellStyles === 'object'\n ? column.cellStyles\n : null),\n }\n : column.cellStyles,\n } as CubeDataTableColumn<T>;\n }),\n [columnModel.columns],\n );\n\n // Applied to the SOURCE columns, before `useTableColumns`, so hidden-column\n // filtering, structural injection and pinned hoisting all still happen\n // downstream and `columnOrder` can never fight `pin`.\n const columnOrderState = useColumnOrder<T>({\n columns: resolvedColumns,\n columnOrder,\n defaultColumnOrder,\n onColumnOrderChange,\n storage,\n });\n const orderedColumns = columnOrderState.columns;\n\n const resolvedTreeColumnKey = useMemo(() => {\n if (!treeModel) return undefined;\n const visibleColumns = orderedColumns.filter((column) => !column.isHidden);\n return visibleColumns.some((column) => column.key === treeColumnKey)\n ? treeColumnKey\n : visibleColumns[0]?.key;\n }, [treeModel, orderedColumns, treeColumnKey]);\n\n useWarn(\n treeModel != null &&\n treeColumnKey != null &&\n resolvedTreeColumnKey !== treeColumnKey,\n {\n key: ['data-table-tree-column-invalid', treeColumnKey],\n args: [\n 'DataTable:',\n '`treeColumnKey` must identify a visible data column. Falling back to the first visible column.',\n ],\n },\n );\n\n const {\n sorts,\n sortedRows,\n toggleSort,\n setColumnSort,\n mode: resolvedSortMode,\n } = useTableSorts<T>({\n columns: orderedColumns,\n rows: treeModel ? treeModel.roots.map((node) => node.row) : data,\n mode: treeModel ? 'server' : sortMode,\n sorts: sortsProp,\n defaultSorts,\n onSortsChange,\n });\n\n const collator = useCollator({ numeric: true, sensitivity: 'base' });\n const treeSortMode = treeModel\n ? sortMode ??\n (orderedColumns.some((column) => column.isSortable) ? 'client' : 'off')\n : resolvedSortMode;\n const processedTreeRoots = useMemo(() => {\n const roots = treeModel?.roots ?? [];\n if (treeSortMode !== 'client' || !sorts.length) return roots;\n\n const active = sorts\n .map((sort) => ({\n sort,\n column: orderedColumns.find((column) => column.key === sort.columnKey),\n }))\n .filter((entry) => entry.column != null);\n\n return sortTableTree(roots, (a, b) => {\n for (const { sort, column } of active) {\n const result = compareByColumn(\n column!,\n collator,\n a.row,\n a.sourceIndex,\n b.row,\n b.sourceIndex,\n );\n if (result !== 0) {\n return result * (sort.direction === 'asc' ? 1 : -1);\n }\n }\n return a.siblingIndex - b.siblingIndex;\n });\n }, [treeModel, treeSortMode, sorts, orderedColumns, collator]);\n\n const [pageSize, setPageSizeState] = useControlledState<number>(\n pageSizeProp as number,\n (pageSizeProp === undefined && storage.has('pageSize')\n ? storage.initial.pageSize ?? defaultPageSize\n : defaultPageSize) as number,\n onPageSizeChange as (value: number) => void,\n );\n const [page, setPageState] = useControlledState<number>(\n pageProp as number,\n defaultPage ?? 1,\n onPageChange as (value: number) => void,\n );\n\n const isPaginated = paginationMode !== 'off';\n const isServerPaginated = paginationMode === 'server';\n const total = isServerPaginated\n ? totalProp ?? 0\n : treeModel\n ? processedTreeRoots.length\n : sortedRows.length;\n\n const pageInfo = getPageInfo({\n page,\n pageSize,\n total,\n totalPages: isServerPaginated ? totalPages : undefined,\n });\n\n const setPage = useEvent((next: number) =>\n setPageState(clampPage(next, pageInfo.totalPages)),\n );\n const setPageSize = useEvent((next: number) => {\n setPageSizeState(next);\n setPageState(1);\n\n if (pageSizeProp === undefined) storage.write({ pageSize: next });\n });\n\n const flatVisibleRows =\n paginationMode === 'client'\n ? sortedRows.slice(\n (pageInfo.page - 1) * pageSize,\n pageInfo.page * pageSize,\n )\n : sortedRows;\n\n const pageTreeRoots = useMemo(\n () =>\n reindexTableTree(\n paginationMode === 'client'\n ? processedTreeRoots.slice(\n (pageInfo.page - 1) * pageSize,\n pageInfo.page * pageSize,\n )\n : processedTreeRoots,\n ),\n [processedTreeRoots, paginationMode, pageInfo.page, pageSize],\n );\n\n const treeState = useTableTreeState<T>({\n roots: pageTreeRoots,\n allNodesByKey: treeModel?.byKey ?? new Map(),\n expandedKeys,\n defaultExpandedKeys,\n getTextValue: (node) => {\n const column = orderedColumns.find(\n (entry) => entry.key === resolvedTreeColumnKey,\n );\n return column\n ? getColumnText(column, node.row, node.sourceIndex) ?? String(node.key)\n : String(node.key);\n },\n onExpand,\n ariaLabel,\n });\n\n const visibleTreeEntries = treeModel ? treeState.visibleEntries : [];\n const visibleRows = treeModel\n ? visibleTreeEntries.map((entry) => entry.row)\n : flatVisibleRows;\n const visibleRowKeys = treeModel\n ? visibleTreeEntries.map((entry) => entry.key)\n : undefined;\n\n const [ownColumnWidths, setOwnColumnWidths] = useState<\n Record<string, number>\n >(\n () =>\n (columnWidthsProp === undefined && storage.has('columnWidths')\n ? storage.initial.columnWidths ?? defaultColumnWidths\n : defaultColumnWidths) ?? EMPTY_WIDTHS,\n );\n const [draftColumnWidths, setDraftColumnWidths] = useState<Record<\n string,\n number\n > | null>(null);\n const draftRef = useRef<Record<string, number> | null>(null);\n\n const baseColumnWidths = columnWidthsProp ?? ownColumnWidths;\n const columnWidths = draftColumnWidths ?? baseColumnWidths;\n\n /**\n * The resolved widths, for the freeze below. A ref because `layout` is\n * computed *after* this handler is defined, and `useEvent` only reads it when\n * the drag actually runs.\n */\n const layoutRef = useRef<CubeTableColumnLayout<T> | null>(null);\n\n const handleColumnResize = useEvent((key: string, width: number) => {\n // First move of a drag freezes every column, so this changes exactly one\n // width instead of re-splitting the flex pool. See `freezeColumnWidths`.\n const base =\n draftRef.current ??\n freezeColumnWidths(layoutRef.current, baseColumnWidths);\n\n draftRef.current = { ...base, [key]: Math.round(width) };\n setDraftColumnWidths(draftRef.current);\n });\n\n const handleColumnResizeEnd = useEvent((key: string) => {\n const next = draftRef.current ?? baseColumnWidths;\n\n if (columnWidthsProp === undefined) {\n setOwnColumnWidths(next);\n storage.write({ columnWidths: next });\n }\n\n onColumnResize?.(key, next[key], next);\n draftRef.current = null;\n setDraftColumnWidths(null);\n });\n\n const leadingColumns = useMemo(\n () =>\n showRowNumbers\n ? [{ key: ROW_NUMBER_COLUMN_KEY, width: ROW_NUMBER_WIDTH }]\n : undefined,\n [showRowNumbers],\n );\n\n const layout = useTableColumns<T>({\n columns: orderedColumns,\n containerWidth,\n columnWidths,\n leadingColumns,\n });\n\n layoutRef.current = layout;\n\n const { t } = useI18n();\n\n // Every row a range can reach, in the order they appear on screen. Pinned rows\n // are in it: a total is a figure like any other, and having to copy it\n // separately from the column it sums is the wrong trade.\n //\n // The keys are built here rather than inside the hook so they cannot disagree\n // with the ones the renderer stamps — a pinned row is keyed by its own index\n // within its group, exactly as `renderPinnedRow` keys it.\n const selectionRows = useMemo(\n () => [\n ...(pinnedTopRows ?? []),\n ...visibleRows,\n ...(pinnedBottomRows ?? []),\n ],\n [pinnedTopRows, visibleRows, pinnedBottomRows],\n );\n const selectionRowKeys = useMemo(\n () => [\n // Section-qualified, matching what the renderer stamps: the same record\n // is routinely pinned at both edges, and one flat key space collapsed the\n // two into whichever came first.\n ...(pinnedTopRows ?? []).map((row, index) =>\n selectionRowKey('pinnedTop', resolvedGetRowKey(row, index)),\n ),\n ...visibleRows.map(\n (row, index) =>\n visibleRowKeys?.[index] ?? resolvedGetRowKey(row, index),\n ),\n ...(pinnedBottomRows ?? []).map((row, index) =>\n selectionRowKey('pinnedBottom', resolvedGetRowKey(row, index)),\n ),\n ],\n [\n pinnedTopRows,\n visibleRows,\n visibleRowKeys,\n pinnedBottomRows,\n resolvedGetRowKey,\n ],\n );\n\n // The hook works in one flat row order; the section a row belongs to is a\n // property of where it sits in that order, so it is resolved here rather than\n // asking the consumer to track it.\n const resolveCellSelectable = useEvent(\n (row: T, rowKey: Key, columnKey: string) => {\n if (!isCellSelectable) return true;\n\n const index = selectionRowKeys.indexOf(rowKey);\n const topCount = pinnedTopRows?.length ?? 0;\n const section: CubeTableRowSection =\n index < topCount\n ? 'pinnedTop'\n : index < topCount + visibleRows.length\n ? 'body'\n : 'pinnedBottom';\n\n return isCellSelectable({ row, rowKey, columnKey, section });\n },\n );\n\n const cellSelection = useCellSelection<T>({\n mode: cellSelectionMode,\n columns: layout.columns,\n rows: selectionRows,\n rowKeys: selectionRowKeys,\n isCellSelectable: isCellSelectable ? resolveCellSelectable : undefined,\n range: selectedCellRange,\n defaultRange: defaultSelectedCellRange,\n onRangeChange: onCellRangeChange,\n });\n\n const rootStyles = { ...extractStyles(props, CONTAINER_STYLES), ...styles };\n\n const smallestPageSize = pageSizeOptions?.length\n ? Math.min(...pageSizeOptions)\n : pageSize;\n\n const showPagination =\n isPaginated &&\n !(\n autoHidePagination &&\n !hasNextPage &&\n pageInfo.totalPages <= 1 &&\n total <= smallestPageSize\n );\n\n const hasFooter =\n showPagination ||\n footerStart != null ||\n footerCenter != null ||\n footerEnd != null;\n\n /* ── column reordering ────────────────────────────────────────────────── */\n\n useWarn(isColumnReorderable && hasColumnGroups, {\n key: ['data-table-grouped-column-reorder'],\n args: [\n 'DataTable:',\n '`isColumnReorderable` is ignored when columns contain header groups.',\n ],\n });\n\n const canReorderColumns = isColumnReorderable && !hasColumnGroups;\n\n const headRowRef = useRef<HTMLTableRowElement>(null);\n const draggableColumnKeys = useMemo(\n () => getDraggableColumnKeys(layout.columns, canReorderColumns),\n [layout.columns, canReorderColumns],\n );\n const columnCollection = useMemo(\n () =>\n new RowCollection(\n layout.columns.filter((column) =>\n isColumnDraggable(column, canReorderColumns),\n ),\n (column) => column.key,\n new Set(),\n // The drag announcements read this — otherwise a screen reader hears\n // \"Insert between and \".\n (column) =>\n typeof column.title === 'string' ? column.title : column.key,\n ),\n [layout.columns, canReorderColumns],\n );\n /**\n * `'single'`, not `'none'`.\n *\n * `useDraggableItem` only deletes its own `onClick` — the one that would\n * hijack a screen-reader click away from the sort — when the selection mode is\n * not `'none'`, and only then does it attach the keyboard drag description.\n * Nothing is ever actually selected here.\n */\n const columnSelectionState = useMultipleSelectionState({\n selectionMode: 'single',\n disabledBehavior: 'all',\n });\n const columnSelectionManager = useMemo(\n () => new SelectionManager(columnCollection, columnSelectionState),\n [columnCollection, columnSelectionState],\n );\n const handleColumnFocus = useEvent((columnKey: string | null) => {\n columnSelectionManager.setFocusedKey(columnKey);\n });\n\n // One draggable column cannot be reordered, so the machinery stays unmounted\n // and the header keeps its exact DOM.\n const isColumnDragEnabled =\n canReorderColumns && draggableColumnKeys.length > 1;\n\n const treeRowNumberOffset = treeModel\n ? paginationMode === 'client'\n ? flattenTableTree(\n processedTreeRoots.slice(0, (pageInfo.page - 1) * pageSize),\n treeState.expandedKeys,\n ).length\n : 0\n : null;\n\n const renderTable = (\n columnDragState?: any,\n columnDropState?: any,\n headCollectionProps?: Record<string, any>,\n ) => (\n <TableView<T>\n {...rest}\n rootRef={rootRef}\n qa={qa || 'DataTable'}\n rows={visibleRows}\n rowKeys={visibleRowKeys}\n pinnedTopRows={pinnedTopRows}\n pinnedBottomRows={pinnedBottomRows}\n // Continuous across pages: row 101 is row 101, not row 1 of page two.\n //\n // Server mode counts too — the page and its size are known there just the\n // same, and `rows` is that page. Only `'off'` starts at 1, because then\n // there is no page to be on.\n rowNumberOffset={\n treeRowNumberOffset ??\n (paginationMode === 'off' ? 0 : (pageInfo.page - 1) * pageSize)\n }\n // The same offset drives `aria-rowindex`, which is document-absolute by\n // contract — a screen reader on page 3 should hear \"row 51 of 240\", not\n // \"row 1 of 25\".\n rowIndexOffset={\n treeModel\n ? 0\n : paginationMode === 'off'\n ? 0\n : (pageInfo.page - 1) * pageSize\n }\n totalRowCount={treeModel ? visibleRows.length : total}\n layout={layout}\n columnHeaderPaths={columnModel.headerPaths}\n // Always on, unlike `ItemTable`. A result grid is read down a column, and\n // once the values are wide and right-aligned the rule is what keeps a\n // figure attached to its column — which is why Cloud's ag-grid theme sets\n // `columnBorder` for `DataTable` and not for the list grids.\n hasColumnDividers\n cellSelection={cellSelection}\n getRowKey={resolvedGetRowKey}\n onScrollerRef={setScrollerEl}\n isLoading={isLoading}\n loadingIndicator={loadingIndicator}\n skeletonRowCount={skeletonRowCount}\n error={error}\n // Same localized fallbacks as `ItemTable`: a grid that has finished\n // loading and shows an unexplained blank rectangle reads as broken.\n emptyLabel={emptyLabel ?? t('itemTable.noItems', 'No items')}\n noResultsLabel={\n noResultsLabel ?? t('itemTable.noResults', 'No results found')\n }\n isFiltered={isFiltered}\n shape={shape}\n size={size}\n rowSize={rowSize}\n rowHeight={rowHeight}\n headerHeight={headerHeight}\n isStriped={isStriped}\n isRowMoveAnimated={isRowMoveAnimated}\n isHeaderHidden={isHeaderHidden}\n isHeaderSticky={isHeaderSticky}\n isAutoHeight={isAutoHeight}\n // The header shows the column name at body size — a result grid has no\n // room for the uppercase caption a list header uses.\n // `t4` throughout: a result grid is read as a block, and one step down\n // from the list preset fits noticeably more on screen without losing\n // legibility. The header takes the medium weight of the same step.\n contentPreset=\"t4\"\n headerPreset=\"t4m\"\n sortMode={treeSortMode}\n sorts={sorts}\n onColumnSort={toggleSort}\n onColumnSortChange={setColumnSort}\n columnContextMenu={columnContextMenu}\n onColumnMenuAction={onColumnMenuAction}\n columnMenuTriggerProps={columnMenuTriggerProps}\n columnMenuProps={columnMenuProps}\n isVirtualized={isVirtualized}\n virtualizeThreshold={virtualizeThreshold}\n overscan={overscan}\n isResizable={isResizable}\n onColumnResize={handleColumnResize}\n onColumnResizeEnd={handleColumnResizeEnd}\n getRowProps={getRowProps}\n ariaLabel={ariaLabel}\n styles={rootStyles}\n headerStyles={headerStyles}\n headerCellStyles={headerCellStyles}\n bodyStyles={bodyStyles}\n rowStyles={rowStyles}\n cellStyles={cellStyles}\n mods={mods}\n isColumnReorderable={isColumnDragEnabled}\n columnDragState={columnDragState}\n columnDropState={columnDropState}\n headCollectionProps={headCollectionProps}\n headRowRef={headRowRef}\n onColumnFocus={handleColumnFocus}\n tree={\n treeModel\n ? {\n state: treeState.state,\n ariaProps: treeState.ariaProps,\n nodes: treeState.visibleNodes,\n entries: visibleTreeEntries,\n columnKey: resolvedTreeColumnKey!,\n }\n : undefined\n }\n footer={\n hasFooter ? (\n <ItemTableFooter\n start={footerStart}\n center={footerCenter}\n end={footerEnd}\n styles={footerStyles}\n pagination={\n showPagination\n ? {\n page: pageInfo.page,\n pageSize,\n total,\n totalPages: pageInfo.totalPages,\n pageSizeOptions,\n summary,\n hasNextPage,\n onPageChange: setPage,\n onPageSizeChange: setPageSize,\n }\n : undefined\n }\n />\n ) : null\n }\n />\n );\n\n return isColumnDragEnabled ? (\n <DraggableCollection\n state={{\n collection: columnCollection as any,\n selectionManager: columnSelectionManager as any,\n disabledKeys: new Set(),\n }}\n // The element that DIRECTLY contains the header cells. React Aria's\n // `ListDropTargetDelegate` resolves a drop by measuring `[data-key]`\n // descendants of this element, so pointing it anywhere else leaves every\n // drop unresolvable — the column lifts but never lands.\n listRef={headRowRef}\n orderedKeys={draggableColumnKeys}\n orientation=\"horizontal\"\n onReorder={columnOrderState.reorder}\n >\n {(dragState, dropState, collectionProps) =>\n renderTable(dragState, dropState, collectionProps)\n }\n </DraggableCollection>\n ) : (\n renderTable()\n );\n}\n\nconst _DataTable = forwardRef(DataTable) as unknown as (<T = any>(\n props: CubeDataTableProps<T> & { ref?: ForwardedRef<HTMLDivElement> },\n) => ReactElement) & { displayName?: string };\n\n_DataTable.displayName = 'DataTable';\n\nexport { _DataTable as DataTable };\n"],"mappings":"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B;EAEpD;EACL;EACD;EACG;EACE;EACG;EACH;EACQ;EACH;EACA;EACF;EAMd,eAAc;EACd,cAAa;EACb,UAAU;EACH;EACP,cAAc;EACd,oBAAoB;EACD;EACC;EACI;EACP;EACF;EACM;EACX;EACG;EACb,gBAAgB;EAChB,mBAAmB;EACN;EACF;EACX,QAAQ;EACM;EACI;EACN;EACD;EACC;EACN;EACN,qBAAqB;EACJ;EACA;EACI;EACT;EACZ,eAAe;EACf,MACE,YACI;GACE,OAAO,UAAU;GACjB,WAAW,UAAU;GACrB,OAAO,UAAU;GACjB,SAAS;GACT,WAAW;GACZ,GACD;EAEN,QACE,YACE,oBAAC;GACC,OAAO;GACP,QAAQ;GACR,KAAK;GACL,QAAQ;GACR,YACE,iBACI;IACE,MAAM,SAAS;IACf;IACA;IACA,YAAY,SAAS;IACrB;IACA;IACA;IACA,cAAc;IACd,kBAAkB;IACnB,GACD;IAEN,GACA;GAEN;AAGJ,QAAO,sBACL,oBAAC;EACC,OAAO;GACL,YAAY;GACZ,kBAAkB;GAClB,8BAAc,IAAI,KAAK;GACxB;EAKD,SAAS;EACT,aAAa;EACb,aAAY;EACZ,WAAW,iBAAiB;aAE1B,WAAW,WAAW,oBACtB,YAAY,WAAW,WAAW,gBAAgB;GAEhC,GAEtB,aAAa;;AAIjB,MAAM,aAAa,WAAW,UAAU;AAIxC,WAAW,cAAc"}
@@ -1,3 +1,3 @@
1
1
 
2
- import { CubeDataTableColumn, CubeDataTableProps } from "./types.js";
2
+ import { CubeDataTableColumn, CubeDataTableColumnDefinition, CubeDataTableColumnGroup, CubeDataTableProps } from "./types.js";
3
3
  import { _DataTable } from "./DataTable.js";
@@ -3,7 +3,7 @@ import { SizeName } from "../../../tokens/sizes.js";
3
3
  import { CubeTablePageInfo } from "../../navigation/Pagination/types.js";
4
4
  import "../../navigation/Pagination/index.js";
5
5
  import "../../../tokens/index.js";
6
- import { CubeTableCellRange, CubeTableColumn, CubeTableLoadingIndicator, CubeTableRowContext, CubeTableRowSection, CubeTableRowSize, CubeTableSort } from "../TableBase/types.js";
6
+ import { CubeTableCellRange, CubeTableColumn, CubeTableLayoutProps, CubeTableLoadingIndicator, CubeTableRowContext, CubeTableRowSection, CubeTableRowSize, CubeTableSort, CubeTableTreeProps } from "../TableBase/types.js";
7
7
  import { BaseProps, ContainerStyleProps, Styles } from "@tenphi/tasty";
8
8
  import { ReactNode } from "react";
9
9
  import { Key as Key$1 } from "@react-types/shared";
@@ -23,9 +23,23 @@ interface CubeDataTableColumn<T = any> extends CubeTableColumn<T> {
23
23
  */
24
24
  dataType?: 'string' | 'number' | 'boolean' | 'date' | 'unknown';
25
25
  }
26
- interface CubeDataTableProps<T = any> extends BaseProps, ContainerStyleProps {
26
+ /**
27
+ * A header band spanning one or more DataTable columns.
28
+ *
29
+ * Groups are presentational: sorting, resizing, selection and the value
30
+ * pipeline continue to operate on the leaf columns in `children`.
31
+ */
32
+ interface CubeDataTableColumnGroup<T = any> {
33
+ /** Stable identity within the column tree. */
34
+ key: string;
35
+ title?: ReactNode;
36
+ children: CubeDataTableColumnDefinition<T>[];
37
+ }
38
+ /** A leaf column or a nested header group. */
39
+ type CubeDataTableColumnDefinition<T = any> = CubeDataTableColumn<T> | CubeDataTableColumnGroup<T>;
40
+ interface CubeDataTableProps<T = any> extends BaseProps, ContainerStyleProps, CubeTableLayoutProps, CubeTableTreeProps<T> {
27
41
  data: readonly T[];
28
- columns: CubeDataTableColumn<T>[];
42
+ columns: CubeDataTableColumnDefinition<T>[];
29
43
  rowKey?: string;
30
44
  getRowKey?: (row: T, index: number) => Key$1;
31
45
  /**
@@ -59,6 +73,7 @@ interface CubeDataTableProps<T = any> extends BaseProps, ContainerStyleProps {
59
73
  rowSize?: CubeTableRowSize;
60
74
  /** An exact height in px, when none of the named steps is the answer. */
61
75
  rowHeight?: number;
76
+ /** Exact height of each header row in px. */
62
77
  headerHeight?: number;
63
78
  /** @default true — banding is what makes a wide row readable across. */
64
79
  isStriped?: boolean;
@@ -196,5 +211,5 @@ interface CubeDataTableProps<T = any> extends BaseProps, ContainerStyleProps {
196
211
  mods?: Record<string, boolean>;
197
212
  }
198
213
  //#endregion
199
- export { CubeDataTableColumn, CubeDataTableProps };
214
+ export { CubeDataTableColumn, CubeDataTableColumnDefinition, CubeDataTableColumnGroup, CubeDataTableProps };
200
215
  //# sourceMappingURL=types.d.ts.map
@@ -1,19 +1,22 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.163.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.165.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../../utils/styles.js";
3
3
  import { useCombinedRefs } from "../../../utils/react/useCombinedRefs.js";
4
4
  import { useEvent } from "../../../_internal/hooks/use-event.js";
5
+ import { useWarn } from "../../../_internal/hooks/use-warn.js";
5
6
  import { useI18n } from "../../../i18n/useI18n.js";
6
7
  import { DraggableCollection } from "../../shared/DraggableCollection.js";
7
8
  import { clampPage, getPageInfo } from "../../navigation/Pagination/use-pagination.js";
8
9
  import { ItemTableFooter } from "./ItemTableFooter.js";
10
+ import { buildTableTree, filterTableTree, flattenTableTree, isTableTreeDescendant, reindexTableTree, sortTableTree } from "../TableBase/table-tree.js";
9
11
  import { ROW_MENU_COLUMN_KEY, ROW_MENU_COLUMN_WIDTH } from "../TableBase/row-menu.js";
10
- import { freezeColumnWidths, useTableColumns } from "../TableBase/use-table-columns.js";
12
+ import { freezeColumnWidths, getColumnText, useTableColumns } from "../TableBase/use-table-columns.js";
11
13
  import { SELECTION_COLUMN_KEY, SELECTION_COLUMN_WIDTH, useTableSelection } from "../TableBase/use-table-selection.js";
12
14
  import { TableView } from "../TableBase/TableView.js";
13
15
  import { useContainerWidth } from "../TableBase/use-container-width.js";
14
- import { useTableSort } from "../TableBase/use-table-sort.js";
16
+ import { compareByColumn, useTableSort } from "../TableBase/use-table-sort.js";
15
17
  import { useTableStorage } from "../TableBase/use-table-storage.js";
16
- import { useTableSearch } from "../TableBase/use-table-search.js";
18
+ import { useTableTreeState } from "../TableBase/use-table-tree-state.js";
19
+ import { matchesTableSearch, useTableSearch } from "../TableBase/use-table-search.js";
17
20
  import { ItemTableChromeProvider, ItemTableSearch, ItemTableToolbar } from "./ItemTableToolbar.js";
18
21
  import { ItemTableBulkBar } from "./ItemTableBulkBar.js";
19
22
  import { ItemTableDragPreview } from "./ItemTableDragPreview.js";
@@ -21,6 +24,7 @@ import { CONTAINER_STYLES } from "@tenphi/tasty";
21
24
  import { forwardRef, useMemo, useRef, useState } from "react";
22
25
  import { jsx } from "react/jsx-runtime";
23
26
  import { useControlledState } from "@react-stately/utils";
27
+ import { useCollator } from "@react-aria/i18n";
24
28
 
25
29
  //#region src/components/data/ItemTable/ItemTable.tsx
26
30
  /** Stable identity, so the uncontrolled default does not change every render. */
@@ -32,13 +36,13 @@ function defaultGetRowKey(rowKey) {
32
36
  };
33
37
  }
34
38
  function ItemTable(props, ref) {
35
- const { data, columns, rowKey = "id", getRowKey, isLoading = false, loadingIndicator = "overlay", selectionMode, bulkActions, rowLink, onRowAction, rowMenu, rowContextMenu = false, onRowMenuAction, rowMenuTriggerProps, bulkBarPlacement = "floating", bulkBarStyles, selectedKeys: selectedKeysProp, defaultSelectedKeys, onSelectionChange, selectAllMode = "page", isRowSelectable, selectionTooltip, disabledKeys, skeletonRowCount = 6, emptyLabel, noResultsLabel, error, isFiltered, toolbar, isSearchable = false, searchMode = "client", searchPlaceholder, searchValue: searchValueProp, defaultSearchValue, onSearchChange, searchDelay = 500, searchFilter, filters, actions, onRefresh, paginationMode = "client", pageSize: pageSizeProp, defaultPageSize = 50, autoHidePagination = true, onLoadMore, hasMore, isLoadingMore, loadMoreMargin, storageKey, persist, isReorderable = false, onReorder, dropOnRow, getItemDragInfo, isResizable = false, columnWidths: columnWidthsProp, defaultColumnWidths, onColumnResize, columnContextMenu, onColumnMenuAction, columnMenuTriggerProps, columnMenuProps, onPageSizeChange, pageSizeOptions = [
39
+ const { data, columns, rowKey = "id", getRowKey, getRowChildren, treeColumnKey, expandedKeys, defaultExpandedKeys, onExpand, isLoading = false, loadingIndicator = "overlay", selectionMode, bulkActions, rowLink, onRowAction, rowMenu, rowContextMenu = false, onRowMenuAction, rowMenuTriggerProps, bulkBarPlacement = "floating", bulkBarStyles, selectedKeys: selectedKeysProp, defaultSelectedKeys, onSelectionChange, selectAllMode = "page", isRowSelectable, selectionTooltip, disabledKeys, treeSelectionBehavior = "cascade", skeletonRowCount = 6, emptyLabel, noResultsLabel, error, isFiltered, toolbar, isSearchable = false, searchMode = "client", searchPlaceholder, searchValue: searchValueProp, defaultSearchValue, onSearchChange, searchDelay = 500, searchFilter, filters, actions, onRefresh, paginationMode = "client", pageSize: pageSizeProp, defaultPageSize = 50, autoHidePagination = true, onLoadMore, hasMore, isLoadingMore, loadMoreMargin, storageKey, persist, isReorderable = false, onReorder, dropOnRow, getItemDragInfo, isResizable = false, columnWidths: columnWidthsProp, defaultColumnWidths, onColumnResize, columnContextMenu, onColumnMenuAction, columnMenuTriggerProps, columnMenuProps, onPageSizeChange, pageSizeOptions = [
36
40
  10,
37
41
  20,
38
42
  50,
39
43
  100,
40
44
  500
41
- ], page: pageProp, defaultPage, onPageChange, total: totalProp, totalPages, hasNextPage, summary = true, footer, footerStart, footerCenter, footerEnd, sortMode, sort: sortProp, defaultSort, onSortChange, shape = "plain", size = "medium", rowHeight, headerHeight, isStriped = false, isHeaderHidden = false, isHeaderSticky = true, isVirtualized = "auto", virtualizeThreshold = 50, overscan = 20, getRowProps, ariaLabel, qa, mods, styles, headerStyles, headerCellStyles, headerPreset = "c3", toolbarStyles, searchStyles, footerStyles, bodyStyles, rowStyles, cellStyles, isRowMoveAnimated } = props;
45
+ ], page: pageProp, defaultPage, onPageChange, total: totalProp, totalPages, hasNextPage, summary = true, footer, footerStart, footerCenter, footerEnd, sortMode, sort: sortProp, defaultSort, onSortChange, shape = "plain", size = "medium", rowHeight, headerHeight, isStriped = false, isHeaderHidden = false, isHeaderSticky = true, isAutoHeight = false, isVirtualized = "auto", virtualizeThreshold = 50, overscan = 20, getRowProps, ariaLabel, qa, mods, styles, headerStyles, headerCellStyles, headerPreset = "c3", toolbarStyles, searchStyles, footerStyles, bodyStyles, rowStyles, cellStyles, isRowMoveAnimated } = props;
42
46
  const { t } = useI18n();
43
47
  const rootRef = useCombinedRefs(ref, useRef(null));
44
48
  const [scrollerEl, setScrollerEl] = useState(null);
@@ -47,21 +51,66 @@ function ItemTable(props, ref) {
47
51
  ...extractStyles(props, CONTAINER_STYLES),
48
52
  ...styles
49
53
  };
50
- const { searchValue, setSearchValue, searchedRows, isFiltered: isSearching } = useTableSearch({
54
+ const resolvedGetRowKey = useMemo(() => getRowKey ?? defaultGetRowKey(rowKey), [getRowKey, rowKey]);
55
+ const treeModel = useMemo(() => getRowChildren ? buildTableTree(data, getRowChildren, resolvedGetRowKey) : null, [
56
+ data,
57
+ getRowChildren,
58
+ resolvedGetRowKey
59
+ ]);
60
+ useWarn(treeModel != null && treeModel.duplicateKeys.length > 0, {
61
+ key: ["item-table-tree-duplicate-keys"],
62
+ args: ["ItemTable:", "Tree row keys must be unique across the complete hierarchy. Duplicate rows were ignored."]
63
+ });
64
+ useWarn(treeModel != null && treeModel.cyclicKeys.length > 0, {
65
+ key: ["item-table-tree-cyclic-keys"],
66
+ args: ["ItemTable:", "Tree data contains a cycle. Cyclic descendants were ignored."]
67
+ });
68
+ useWarn(treeModel != null && isReorderable, {
69
+ key: ["item-table-tree-reorder-unsupported"],
70
+ args: ["ItemTable:", "`isReorderable` is ignored in tree mode. Use `dropOnRow` for folder-style moves."]
71
+ });
72
+ const resolvedTreeColumnKey = useMemo(() => {
73
+ if (!treeModel) return void 0;
74
+ const visibleColumns = columns.filter((column) => !column.isHidden);
75
+ return visibleColumns.some((column) => column.key === treeColumnKey) ? treeColumnKey : visibleColumns[0]?.key;
76
+ }, [
77
+ treeModel,
78
+ columns,
79
+ treeColumnKey
80
+ ]);
81
+ useWarn(treeModel != null && treeColumnKey != null && resolvedTreeColumnKey !== treeColumnKey, {
82
+ key: ["item-table-tree-column-invalid", treeColumnKey],
83
+ args: ["ItemTable:", "`treeColumnKey` must identify a visible data column. Falling back to the first visible column."]
84
+ });
85
+ const { searchValue, setSearchValue, searchedRows, query, isFiltered: isSearching } = useTableSearch({
51
86
  columns,
52
87
  rows: data,
53
- mode: searchMode,
88
+ mode: treeModel ? "server" : searchMode,
54
89
  value: searchValueProp,
55
90
  defaultValue: defaultSearchValue,
56
91
  onChange: onSearchChange,
57
92
  delay: searchDelay,
58
93
  filter: searchFilter
59
94
  });
95
+ const searchedTree = useMemo(() => {
96
+ if (!treeModel) return null;
97
+ if (searchMode !== "client" || !query) return {
98
+ roots: treeModel.roots,
99
+ forcedExpandedKeys: /* @__PURE__ */ new Set()
100
+ };
101
+ return filterTableTree(treeModel.roots, (node) => searchFilter ? searchFilter(node.row, query) : matchesTableSearch(columns, node.row, node.sourceIndex, query));
102
+ }, [
103
+ treeModel,
104
+ searchMode,
105
+ query,
106
+ searchFilter,
107
+ columns
108
+ ]);
60
109
  const storage = useTableStorage(storageKey, persist);
61
110
  const { sort, sortedRows, toggleSort, setColumnSort, mode: resolvedSortMode } = useTableSort({
62
111
  columns,
63
- rows: searchedRows,
64
- mode: sortMode,
112
+ rows: treeModel ? searchedTree?.roots.map((node) => node.row) ?? [] : searchedRows,
113
+ mode: treeModel ? "server" : sortMode,
65
114
  sort: sortProp,
66
115
  defaultSort: sortProp === void 0 && storage.has("sort") ? storage.initial.sort ?? defaultSort : defaultSort,
67
116
  onSortChange: useEvent((next) => {
@@ -69,12 +118,32 @@ function ItemTable(props, ref) {
69
118
  onSortChange?.(next);
70
119
  })
71
120
  });
121
+ const collator = useCollator({
122
+ numeric: true,
123
+ sensitivity: "base"
124
+ });
125
+ const treeSortMode = treeModel ? sortMode ?? (columns.some((column) => column.isSortable) ? "client" : "off") : resolvedSortMode;
126
+ const processedTreeRoots = useMemo(() => {
127
+ const roots = searchedTree?.roots ?? [];
128
+ if (treeSortMode !== "client" || !sort) return roots;
129
+ const column = columns.find((entry) => entry.key === sort.columnKey);
130
+ if (!column) return roots;
131
+ return sortTableTree(roots, (a, b) => {
132
+ return compareByColumn(column, collator, a.row, a.sourceIndex, b.row, b.sourceIndex) * (sort.direction === "asc" ? 1 : -1);
133
+ });
134
+ }, [
135
+ searchedTree,
136
+ treeSortMode,
137
+ sort,
138
+ columns,
139
+ collator
140
+ ]);
72
141
  const [pageSize, setPageSizeState] = useControlledState(pageSizeProp, pageSizeProp === void 0 && storage.has("pageSize") ? storage.initial.pageSize ?? defaultPageSize : defaultPageSize, onPageSizeChange);
73
142
  const [page, setPageState] = useControlledState(pageProp, defaultPage ?? 1, onPageChange);
74
143
  const isInfinite = paginationMode === "infinite";
75
144
  const isPaginated = paginationMode !== "off" && !isInfinite;
76
145
  const isServerPaginated = paginationMode === "server";
77
- const total = isServerPaginated ? totalProp ?? 0 : sortedRows.length;
146
+ const total = isServerPaginated ? totalProp ?? 0 : treeModel ? processedTreeRoots.length : sortedRows.length;
78
147
  const pageInfo = getPageInfo({
79
148
  page,
80
149
  pageSize,
@@ -87,12 +156,59 @@ function ItemTable(props, ref) {
87
156
  if (pageSizeProp === void 0) storage.write({ pageSize: next });
88
157
  setPageState(1);
89
158
  });
90
- const visibleRows = paginationMode === "client" ? sortedRows.slice((pageInfo.page - 1) * pageSize, pageInfo.page * pageSize) : sortedRows;
91
- const resolvedGetRowKey = useMemo(() => getRowKey ?? defaultGetRowKey(rowKey), [getRowKey, rowKey]);
159
+ const flatVisibleRows = paginationMode === "client" ? sortedRows.slice((pageInfo.page - 1) * pageSize, pageInfo.page * pageSize) : sortedRows;
160
+ const pageTreeRoots = useMemo(() => reindexTableTree(paginationMode === "client" ? processedTreeRoots.slice((pageInfo.page - 1) * pageSize, pageInfo.page * pageSize) : processedTreeRoots), [
161
+ processedTreeRoots,
162
+ paginationMode,
163
+ pageInfo.page,
164
+ pageSize
165
+ ]);
166
+ const treeState = useTableTreeState({
167
+ roots: pageTreeRoots,
168
+ allNodesByKey: treeModel?.byKey ?? /* @__PURE__ */ new Map(),
169
+ expandedKeys,
170
+ defaultExpandedKeys,
171
+ forcedExpandedKeys: searchedTree?.forcedExpandedKeys,
172
+ disabledKeys,
173
+ getTextValue: (node) => {
174
+ const column = columns.find((entry) => entry.key === resolvedTreeColumnKey);
175
+ return column ? getColumnText(column, node.row, node.sourceIndex) ?? String(node.key) : String(node.key);
176
+ },
177
+ onExpand,
178
+ ariaLabel
179
+ });
180
+ const visibleTreeEntries = treeModel ? treeState.visibleEntries : [];
181
+ const visibleRows = treeModel ? visibleTreeEntries.map((entry) => entry.row) : flatVisibleRows;
182
+ const visibleRowKeys = treeModel ? visibleTreeEntries.map((entry) => entry.key) : void 0;
183
+ const pageTreeEntries = treeModel ? flattenTableTree(pageTreeRoots) : [];
184
+ const filteredTreeEntries = treeModel ? flattenTableTree(processedTreeRoots) : [];
185
+ const selectionTree = useMemo(() => {
186
+ if (!treeModel) return void 0;
187
+ const childrenOf = /* @__PURE__ */ new Map();
188
+ const parentOf = /* @__PURE__ */ new Map();
189
+ flattenTableTree(processedTreeRoots).forEach((node) => {
190
+ childrenOf.set(node.key, node.children.map((child) => child.key));
191
+ parentOf.set(node.key, node.parentKey);
192
+ });
193
+ return {
194
+ rootKeys: processedTreeRoots.map((node) => node.key),
195
+ childrenOf,
196
+ parentOf,
197
+ behavior: treeSelectionBehavior
198
+ };
199
+ }, [
200
+ treeModel,
201
+ processedTreeRoots,
202
+ treeSelectionBehavior
203
+ ]);
92
204
  const resolvedSelectionMode = selectionMode ?? (bulkActions?.length ? "multiple" : "none");
93
205
  const selection = useTableSelection({
94
206
  rows: visibleRows,
95
- filteredRows: paginationMode === "client" ? sortedRows : visibleRows,
207
+ rowKeys: visibleRowKeys,
208
+ pageRows: treeModel ? pageTreeEntries.map((entry) => entry.row) : visibleRows,
209
+ pageRowKeys: treeModel ? pageTreeEntries.map((entry) => entry.key) : void 0,
210
+ filteredRows: treeModel ? (paginationMode === "client" ? filteredTreeEntries : pageTreeEntries).map((entry) => entry.row) : paginationMode === "client" ? sortedRows : visibleRows,
211
+ filteredRowKeys: treeModel ? (paginationMode === "client" ? filteredTreeEntries : pageTreeEntries).map((entry) => entry.key) : void 0,
96
212
  getRowKey: resolvedGetRowKey,
97
213
  selectionMode: resolvedSelectionMode,
98
214
  selectedKeys: selectedKeysProp,
@@ -100,7 +216,8 @@ function ItemTable(props, ref) {
100
216
  onSelectionChange,
101
217
  selectAllMode,
102
218
  isRowSelectable,
103
- disabledKeys
219
+ disabledKeys,
220
+ tree: selectionTree
104
221
  });
105
222
  const resolveRowMenu = useMemo(() => rowMenu == null ? void 0 : typeof rowMenu === "function" ? rowMenu : () => rowMenu, [rowMenu]);
106
223
  const trailingColumns = useMemo(() => resolveRowMenu && rowContextMenu === true ? [{
@@ -210,7 +327,11 @@ function ItemTable(props, ref) {
210
327
  } : void 0
211
328
  }) : null;
212
329
  const bodyRef = useRef(null);
213
- const rowKeys = useMemo(() => visibleRows.map((row, index) => String(resolvedGetRowKey(row, index))), [visibleRows, resolvedGetRowKey]);
330
+ const rowKeys = useMemo(() => visibleRows.map((row, index) => String(visibleRowKeys?.[index] ?? resolvedGetRowKey(row, index))), [
331
+ visibleRows,
332
+ visibleRowKeys,
333
+ resolvedGetRowKey
334
+ ]);
214
335
  const handleReorder = useEvent((nextKeys) => {
215
336
  const byKey = new Map(visibleRows.map((row, index) => [String(resolvedGetRowKey(row, index)), row]));
216
337
  onReorder?.(nextKeys, nextKeys.map((key) => byKey.get(key)).filter((row) => row !== void 0));
@@ -232,8 +353,9 @@ function ItemTable(props, ref) {
232
353
  bodyRef,
233
354
  qa: qa || "ItemTable",
234
355
  rows: visibleRows,
235
- rowIndexOffset: isPaginated ? (pageInfo.page - 1) * pageSize : 0,
236
- totalRowCount: total,
356
+ rowKeys: visibleRowKeys,
357
+ rowIndexOffset: treeModel ? 0 : isPaginated ? (pageInfo.page - 1) * pageSize : 0,
358
+ totalRowCount: treeModel ? visibleRows.length : total,
237
359
  getRowKey: resolvedGetRowKey,
238
360
  layout,
239
361
  onScrollerRef: setScrollerEl,
@@ -243,6 +365,7 @@ function ItemTable(props, ref) {
243
365
  headerHeight,
244
366
  isHeaderHidden,
245
367
  isHeaderSticky,
368
+ isAutoHeight,
246
369
  isVirtualized,
247
370
  virtualizeThreshold,
248
371
  overscan,
@@ -273,7 +396,7 @@ function ItemTable(props, ref) {
273
396
  toolbar: toolbarNode,
274
397
  footer: footerNode,
275
398
  isFiltered: isFiltered ?? isSearching,
276
- sortMode: resolvedSortMode,
399
+ sortMode: treeSortMode,
277
400
  sort,
278
401
  onColumnSort: toggleSort,
279
402
  onColumnSortChange: setColumnSort,
@@ -291,18 +414,39 @@ function ItemTable(props, ref) {
291
414
  rowStyles,
292
415
  cellStyles,
293
416
  mods,
294
- overlay: bulkBarPlacement === "floating" ? bulkBar : null
417
+ overlay: bulkBarPlacement === "floating" ? bulkBar : null,
418
+ tree: treeModel ? {
419
+ state: treeState.state,
420
+ ariaProps: treeState.ariaProps,
421
+ nodes: treeState.visibleNodes,
422
+ entries: visibleTreeEntries,
423
+ columnKey: resolvedTreeColumnKey
424
+ } : void 0
295
425
  });
296
426
  const rowByKeyForDrop = useMemo(() => {
297
427
  const map = /* @__PURE__ */ new Map();
298
- visibleRows.forEach((row, index) => map.set(String(resolvedGetRowKey(row, index)), row));
428
+ visibleRows.forEach((row, index) => map.set(String(visibleRowKeys?.[index] ?? resolvedGetRowKey(row, index)), row));
299
429
  return map;
300
- }, [visibleRows, resolvedGetRowKey]);
430
+ }, [
431
+ visibleRows,
432
+ visibleRowKeys,
433
+ resolvedGetRowKey
434
+ ]);
301
435
  const handleItemDrop = useEvent((targetKey, draggedKeys) => {
302
436
  if (!dropOnRow) return;
303
437
  const target = rowByKeyForDrop.get(String(targetKey));
304
438
  if (!target) return;
305
- const dragged = draggedKeys.map((key) => rowByKeyForDrop.get(String(key))).filter((row) => row !== void 0 && row !== target);
439
+ const draggedKeySet = new Set(draggedKeys);
440
+ const topmostDraggedKeys = treeModel ? draggedKeys.filter((key) => {
441
+ let parent = treeModel.parentOf.get(key);
442
+ while (parent != null) {
443
+ if (draggedKeySet.has(parent)) return false;
444
+ parent = treeModel.parentOf.get(parent);
445
+ }
446
+ return true;
447
+ }) : draggedKeys;
448
+ if (treeModel && topmostDraggedKeys.some((key) => isTableTreeDescendant(treeModel, targetKey, key))) return;
449
+ const dragged = topmostDraggedKeys.map((key) => rowByKeyForDrop.get(String(key))).filter((row) => row !== void 0 && row !== target);
306
450
  if (!dragged.length) return;
307
451
  if (dropOnRow.isAllowed && !dropOnRow.isAllowed(dragged, target)) return;
308
452
  dropOnRow.onDrop(dragged, target);
@@ -315,7 +459,7 @@ function ItemTable(props, ref) {
315
459
  const target = rowByKeyForDrop.get(String(targetKey));
316
460
  return target != null && (dropOnRow?.isTarget(target) ?? false);
317
461
  });
318
- const isDragEnabled = isReorderable || dropOnRow != null;
462
+ const isDragEnabled = !treeModel && isReorderable || dropOnRow != null;
319
463
  const table = isDragEnabled ? /* @__PURE__ */ jsx(DraggableCollection, {
320
464
  state: {
321
465
  collection: selection.collection,
@@ -325,7 +469,7 @@ function ItemTable(props, ref) {
325
469
  listRef: bodyRef,
326
470
  orderedKeys: rowKeys,
327
471
  orientation: "vertical",
328
- onReorder: isReorderable ? handleReorder : void 0,
472
+ onReorder: !treeModel && isReorderable ? handleReorder : void 0,
329
473
  onItemDrop: dropOnRow ? handleItemDrop : void 0,
330
474
  shouldAcceptItemDrop: dropOnRow ? shouldAcceptItemDrop : void 0,
331
475
  renderPreview: getItemDragInfo ? renderDragPreview : void 0,