@cube-dev/ui-kit 0.0.0-canary-85abc8a → 0.0.0-canary-306afc2

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 (575) hide show
  1. package/dist/_internal/hooks/use-chained-callback.js +1 -1
  2. package/dist/_internal/hooks/use-debounced-value.js +1 -1
  3. package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
  4. package/dist/_internal/hooks/use-event.js +1 -1
  5. package/dist/_internal/hooks/use-is-first-render.js +1 -1
  6. package/dist/_internal/hooks/use-sync-ref.js +1 -1
  7. package/dist/_internal/hooks/use-timer/timer.js +1 -1
  8. package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
  9. package/dist/_internal/hooks/use-warn.js +1 -1
  10. package/dist/components/Block.js +1 -1
  11. package/dist/components/CollectionItem.js +1 -1
  12. package/dist/components/GlobalStyles.js +1 -1
  13. package/dist/components/GridProvider.js +1 -1
  14. package/dist/components/HiddenInput.js +1 -1
  15. package/dist/components/Root.js +1 -1
  16. package/dist/components/actions/Action/Action.js +1 -1
  17. package/dist/components/actions/Banner/Banner.js +1 -1
  18. package/dist/components/actions/Button/Button.js +1 -1
  19. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  20. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  21. package/dist/components/actions/ButtonSplit/context.js +1 -1
  22. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  23. package/dist/components/actions/CommandMenu/styled.js +1 -1
  24. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  25. package/dist/components/actions/ItemActionContext.js +1 -1
  26. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  27. package/dist/components/actions/Link/Link.js +1 -1
  28. package/dist/components/actions/Menu/Menu.js +1 -1
  29. package/dist/components/actions/Menu/MenuItem.js +1 -1
  30. package/dist/components/actions/Menu/MenuSection.js +1 -1
  31. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  32. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  33. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  34. package/dist/components/actions/Menu/context.js +1 -1
  35. package/dist/components/actions/Menu/styled.js +1 -1
  36. package/dist/components/actions/index.js +1 -1
  37. package/dist/components/actions/use-action.js +1 -1
  38. package/dist/components/actions/use-anchored-menu.js +1 -1
  39. package/dist/components/actions/use-context-menu.js +42 -44
  40. package/dist/components/actions/use-context-menu.js.map +1 -1
  41. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  42. package/dist/components/content/Alert/Alert.js +1 -1
  43. package/dist/components/content/Alert/use-alert.js +1 -1
  44. package/dist/components/content/Avatar/Avatar.js +1 -1
  45. package/dist/components/content/Badge/Badge.js +1 -1
  46. package/dist/components/content/Card/Card.js +1 -1
  47. package/dist/components/content/Content.js +1 -1
  48. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  49. package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
  50. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  51. package/dist/components/content/Divider.js +1 -1
  52. package/dist/components/content/Footer.js +1 -1
  53. package/dist/components/content/Header.js +1 -1
  54. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  55. package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
  56. package/dist/components/content/InlineInput/InlineInput.js +1 -1
  57. package/dist/components/content/Item/Item.js +1 -1
  58. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  59. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  60. package/dist/components/content/Layout/GridLayout.js +1 -1
  61. package/dist/components/content/Layout/Layout.js +1 -1
  62. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  63. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  64. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  65. package/dist/components/content/Layout/LayoutContent.js +1 -1
  66. package/dist/components/content/Layout/LayoutContext.js +1 -1
  67. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  68. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  69. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  70. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  71. package/dist/components/content/Layout/LayoutPane.js +1 -1
  72. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  73. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  74. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  75. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  76. package/dist/components/content/Layout/index.js +1 -1
  77. package/dist/components/content/Layout/utils.js +1 -1
  78. package/dist/components/content/Paragraph.js +1 -1
  79. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  80. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  81. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  82. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  83. package/dist/components/content/Result/Result.js +1 -1
  84. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  85. package/dist/components/content/Tag/Tag.js +2 -2
  86. package/dist/components/content/Tag/Tag.js.map +1 -1
  87. package/dist/components/content/Text.js +1 -1
  88. package/dist/components/content/TextItem/TextItem.js +1 -1
  89. package/dist/components/content/Title.js +1 -1
  90. package/dist/components/content/Tree/Tree.js +1 -1
  91. package/dist/components/content/Tree/TreeNode.js +1 -1
  92. package/dist/components/content/Tree/styled.js +1 -1
  93. package/dist/components/content/Tree/tree-index.js +1 -1
  94. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  95. package/dist/components/content/Tree/use-load-data.js +1 -1
  96. package/dist/components/content/highlightText.js +1 -1
  97. package/dist/components/content/use-auto-tooltip.js +1 -1
  98. package/dist/components/data/DataTable/DataTable.d.ts +13 -0
  99. package/dist/components/data/DataTable/DataTable.js +245 -0
  100. package/dist/components/data/DataTable/DataTable.js.map +1 -0
  101. package/dist/components/data/DataTable/index.d.ts +3 -0
  102. package/dist/components/data/DataTable/types.d.ts +145 -0
  103. package/dist/components/data/ItemTable/ItemTable.d.ts +19 -0
  104. package/dist/components/data/ItemTable/ItemTable.js +350 -0
  105. package/dist/components/data/ItemTable/ItemTable.js.map +1 -0
  106. package/dist/components/data/ItemTable/ItemTableBulkBar.d.ts +23 -0
  107. package/dist/components/data/ItemTable/ItemTableBulkBar.js +131 -0
  108. package/dist/components/data/ItemTable/ItemTableBulkBar.js.map +1 -0
  109. package/dist/components/data/ItemTable/ItemTableDragPreview.js +46 -0
  110. package/dist/components/data/ItemTable/ItemTableDragPreview.js.map +1 -0
  111. package/dist/components/data/ItemTable/ItemTableFooter.js +79 -0
  112. package/dist/components/data/ItemTable/ItemTableFooter.js.map +1 -0
  113. package/dist/components/data/ItemTable/ItemTableToolbar.d.ts +34 -0
  114. package/dist/components/data/ItemTable/ItemTableToolbar.js +91 -0
  115. package/dist/components/data/ItemTable/ItemTableToolbar.js.map +1 -0
  116. package/dist/components/data/ItemTable/index.d.ts +4 -0
  117. package/dist/components/data/ItemTable/types.d.ts +327 -0
  118. package/dist/components/data/TableBase/ColumnResizer.js +70 -0
  119. package/dist/components/data/TableBase/ColumnResizer.js.map +1 -0
  120. package/dist/components/data/TableBase/RowCollection.js +99 -0
  121. package/dist/components/data/TableBase/RowCollection.js.map +1 -0
  122. package/dist/components/data/TableBase/TableRow.js +89 -0
  123. package/dist/components/data/TableBase/TableRow.js.map +1 -0
  124. package/dist/components/data/TableBase/TableView.d.ts +22 -0
  125. package/dist/components/data/TableBase/TableView.js +876 -0
  126. package/dist/components/data/TableBase/TableView.js.map +1 -0
  127. package/dist/components/data/TableBase/index.d.ts +5 -0
  128. package/dist/components/data/TableBase/row-menu.js +40 -0
  129. package/dist/components/data/TableBase/row-menu.js.map +1 -0
  130. package/dist/components/data/TableBase/styled.d.ts +6 -0
  131. package/dist/components/data/TableBase/styled.js +532 -0
  132. package/dist/components/data/TableBase/styled.js.map +1 -0
  133. package/dist/components/data/TableBase/types.d.ts +173 -0
  134. package/dist/components/data/TableBase/use-cell-selection.d.ts +4 -0
  135. package/dist/components/data/TableBase/use-cell-selection.js +0 -0
  136. package/dist/components/data/TableBase/use-cell-selection.js.map +1 -0
  137. package/dist/components/data/TableBase/use-container-width.js +35 -0
  138. package/dist/components/data/TableBase/use-container-width.js.map +1 -0
  139. package/dist/components/data/TableBase/use-row-move-animation.js +80 -0
  140. package/dist/components/data/TableBase/use-row-move-animation.js.map +1 -0
  141. package/dist/components/data/TableBase/use-scrollability.js +49 -0
  142. package/dist/components/data/TableBase/use-scrollability.js.map +1 -0
  143. package/dist/components/data/TableBase/use-table-columns.d.ts +2 -0
  144. package/dist/components/data/TableBase/use-table-columns.js +166 -0
  145. package/dist/components/data/TableBase/use-table-columns.js.map +1 -0
  146. package/dist/components/data/TableBase/use-table-search.js +64 -0
  147. package/dist/components/data/TableBase/use-table-search.js.map +1 -0
  148. package/dist/components/data/TableBase/use-table-selection.d.ts +4 -0
  149. package/dist/components/data/TableBase/use-table-selection.js +233 -0
  150. package/dist/components/data/TableBase/use-table-selection.js.map +1 -0
  151. package/dist/components/data/TableBase/use-table-sort.js +91 -0
  152. package/dist/components/data/TableBase/use-table-sort.js.map +1 -0
  153. package/dist/components/data/TableBase/use-table-sorts.js +97 -0
  154. package/dist/components/data/TableBase/use-table-sorts.js.map +1 -0
  155. package/dist/components/data/TableBase/use-table-storage.d.ts +8 -0
  156. package/dist/components/data/TableBase/use-table-storage.js +58 -0
  157. package/dist/components/data/TableBase/use-table-storage.js.map +1 -0
  158. package/dist/components/data/index.d.ts +10 -0
  159. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  160. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  161. package/dist/components/fields/Checkbox/context.js +1 -1
  162. package/dist/components/fields/ColorPicker/ColorPicker.js +1 -1
  163. package/dist/components/fields/ColorPicker/ColorPickerPanel.js +1 -1
  164. package/dist/components/fields/ColorPicker/channels.js +1 -1
  165. package/dist/components/fields/ColorPicker/color.js +1 -1
  166. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  167. package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
  168. package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
  169. package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
  170. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  171. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  172. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  173. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  174. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  175. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  176. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  177. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  178. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  179. package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
  180. package/dist/components/fields/DatePicker/PeriodPicker.js +1 -1
  181. package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
  182. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  183. package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
  184. package/dist/components/fields/DatePicker/YearPicker.js +1 -1
  185. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  186. package/dist/components/fields/DatePicker/period.js +1 -1
  187. package/dist/components/fields/DatePicker/props.js +1 -1
  188. package/dist/components/fields/DatePicker/utils.js +1 -1
  189. package/dist/components/fields/FileInput/FileInput.js +1 -1
  190. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  191. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  192. package/dist/components/fields/Input/Input.js +2 -2
  193. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  194. package/dist/components/fields/ListBox/ListBox.js +1 -1
  195. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
  196. package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
  197. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
  198. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  199. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  200. package/dist/components/fields/PasswordInput/PasswordInput.js +2 -12
  201. package/dist/components/fields/PasswordInput/PasswordInput.js.map +1 -1
  202. package/dist/components/fields/Picker/Picker.js +1 -1
  203. package/dist/components/fields/RadioGroup/Radio.js +1 -1
  204. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  205. package/dist/components/fields/RadioGroup/context.js +1 -1
  206. package/dist/components/fields/SearchComboBox/SearchComboBox.js +1 -1
  207. package/dist/components/fields/SearchInput/SearchInput.js +4 -17
  208. package/dist/components/fields/SearchInput/SearchInput.js.map +1 -1
  209. package/dist/components/fields/Select/Select.js +1 -1
  210. package/dist/components/fields/Slider/Gradation.js +1 -1
  211. package/dist/components/fields/Slider/HueSlider.js +1 -1
  212. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  213. package/dist/components/fields/Slider/Slider.js +1 -1
  214. package/dist/components/fields/Slider/SliderBase.js +1 -1
  215. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  216. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  217. package/dist/components/fields/Slider/elements.js +1 -1
  218. package/dist/components/fields/Slider/index.js +1 -1
  219. package/dist/components/fields/Switch/Switch.js +1 -1
  220. package/dist/components/fields/TextArea/TextArea.js +5 -12
  221. package/dist/components/fields/TextArea/TextArea.js.map +1 -1
  222. package/dist/components/fields/TextInput/TextInput.js +3 -15
  223. package/dist/components/fields/TextInput/TextInput.js.map +1 -1
  224. package/dist/components/fields/TextInput/TextInputBase.d.ts +0 -7
  225. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  226. package/dist/components/fields/TextInput/TextInputBase.js.map +1 -1
  227. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  228. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  229. package/dist/components/form/Form/Field.js +1 -1
  230. package/dist/components/form/Form/Form.js +1 -1
  231. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  232. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  233. package/dist/components/form/Form/SubmitError.js +1 -1
  234. package/dist/components/form/Form/index.js +1 -1
  235. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  236. package/dist/components/form/Form/use-field/use-field.js +1 -1
  237. package/dist/components/form/Form/use-form.js +1 -1
  238. package/dist/components/form/Form/validation.js +1 -1
  239. package/dist/components/form/Label.js +1 -1
  240. package/dist/components/form/validation/ValidationIndicator.js +1 -1
  241. package/dist/components/form/validation/resolve-validation-props.js +1 -1
  242. package/dist/components/form/validation/use-validation-props.js +1 -1
  243. package/dist/components/form/wrapper.js +1 -1
  244. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  245. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  246. package/dist/components/layout/Board/Board.js +1 -1
  247. package/dist/components/layout/Board/BoardProvider.js +1 -1
  248. package/dist/components/layout/Board/BoardResponsive.js +1 -1
  249. package/dist/components/layout/Board/Widget.js +1 -1
  250. package/dist/components/layout/Board/WidgetHost.js +1 -1
  251. package/dist/components/layout/Board/board-context.js +1 -1
  252. package/dist/components/layout/Board/board-store.js +1 -1
  253. package/dist/components/layout/Board/grid-core/calculate.js +1 -1
  254. package/dist/components/layout/Board/grid-core/collision.js +1 -1
  255. package/dist/components/layout/Board/grid-core/compactors.js +1 -1
  256. package/dist/components/layout/Board/grid-core/constraints.js +1 -1
  257. package/dist/components/layout/Board/grid-core/group-move.js +1 -1
  258. package/dist/components/layout/Board/grid-core/layout.js +1 -1
  259. package/dist/components/layout/Board/grid-core/sort.js +1 -1
  260. package/dist/components/layout/Board/index.js +1 -1
  261. package/dist/components/layout/Board/responsive-utils.js +1 -1
  262. package/dist/components/layout/Board/use-board-layout.js +1 -1
  263. package/dist/components/layout/Board/use-board-registry.js +1 -1
  264. package/dist/components/layout/Board/use-board-select-modifier-key.js +1 -1
  265. package/dist/components/layout/Board/use-board-selection.js +1 -1
  266. package/dist/components/layout/Flex.js +1 -1
  267. package/dist/components/layout/Flow.js +1 -1
  268. package/dist/components/layout/Grid.js +1 -1
  269. package/dist/components/layout/Panel.js +1 -1
  270. package/dist/components/layout/Prefix.js +1 -1
  271. package/dist/components/layout/ResizablePanel.js +1 -1
  272. package/dist/components/layout/Space.js +1 -1
  273. package/dist/components/layout/Suffix.js +1 -1
  274. package/dist/components/navigation/Pagination/Pagination.d.ts +9 -0
  275. package/dist/components/navigation/Pagination/Pagination.js +258 -0
  276. package/dist/components/navigation/Pagination/Pagination.js.map +1 -0
  277. package/dist/components/navigation/Pagination/index.d.ts +4 -0
  278. package/dist/components/navigation/Pagination/types.d.ts +81 -0
  279. package/dist/components/navigation/Pagination/use-pagination.d.ts +52 -0
  280. package/dist/components/navigation/Pagination/use-pagination.js +83 -0
  281. package/dist/components/navigation/Pagination/use-pagination.js.map +1 -0
  282. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  283. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  284. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  285. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  286. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  287. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  288. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  289. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  290. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  291. package/dist/components/navigation/Tabs/styled.js +1 -1
  292. package/dist/components/navigation/Tabs/types.js +1 -1
  293. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  294. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  295. package/dist/components/navigation/index.d.ts +5 -1
  296. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  297. package/dist/components/other/Calendar/Calendar.js +1 -1
  298. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  299. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  300. package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
  301. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  302. package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
  303. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  304. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  305. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  306. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  307. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  308. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  309. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  310. package/dist/components/overlays/Dialog/context.js +1 -1
  311. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  312. package/dist/components/overlays/Modal/Modal.js +1 -1
  313. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  314. package/dist/components/overlays/Modal/Overlay.js +1 -1
  315. package/dist/components/overlays/Modal/Popover.js +1 -1
  316. package/dist/components/overlays/Modal/Tray.js +1 -1
  317. package/dist/components/overlays/Modal/Underlay.js +1 -1
  318. package/dist/components/overlays/Notifications/Notification.js +1 -1
  319. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  320. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  321. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  322. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  323. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  324. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  325. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  326. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  327. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  328. package/dist/components/overlays/Notifications/index.js +1 -1
  329. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  330. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  331. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  332. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  333. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  334. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  335. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  336. package/dist/components/overlays/Toast/index.js +1 -1
  337. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  338. package/dist/components/overlays/Toast/useToast.js +1 -1
  339. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  340. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  341. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  342. package/dist/components/overlays/Tooltip/context.js +1 -1
  343. package/dist/components/portal/Portal.js +1 -1
  344. package/dist/components/portal/PortalProvider.js +1 -1
  345. package/dist/components/portal/usePortal.js +1 -1
  346. package/dist/components/shared/DraggableCollection.js +24 -8
  347. package/dist/components/shared/DraggableCollection.js.map +1 -1
  348. package/dist/components/shared/InvalidIcon.js +1 -1
  349. package/dist/components/shared/ValidIcon.js +1 -1
  350. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  351. package/dist/components/status/Spin/Cube.js +1 -1
  352. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  353. package/dist/components/status/Spin/Spin.js +1 -1
  354. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  355. package/dist/data/item-themes.js +1 -1
  356. package/dist/data/themes.js +1 -1
  357. package/dist/eslint-plugin/defaults.generated.js +207 -1
  358. package/dist/eslint-plugin/defaults.generated.js.map +1 -1
  359. package/dist/eslint-plugin/index.js +1 -1
  360. package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
  361. package/dist/i18n/I18nProvider.js +1 -1
  362. package/dist/i18n/createFormatter.js +1 -1
  363. package/dist/i18n/index.js +1 -1
  364. package/dist/i18n/instance.js +1 -1
  365. package/dist/i18n/locales/de-DE/uikit.js +36 -1
  366. package/dist/i18n/locales/en-US/uikit.js +36 -1
  367. package/dist/i18n/locales/en-US/uikit.json.d.ts +41 -1
  368. package/dist/i18n/locales/es-ES/uikit.js +36 -1
  369. package/dist/i18n/locales/es-MX/uikit.js +36 -1
  370. package/dist/i18n/locales/fr-FR/uikit.js +36 -1
  371. package/dist/i18n/locales/it-IT/uikit.js +36 -1
  372. package/dist/i18n/locales/ja-JP/uikit.js +36 -1
  373. package/dist/i18n/locales/nb-NO/uikit.js +36 -1
  374. package/dist/i18n/locales/pt-BR/uikit.js +36 -1
  375. package/dist/i18n/locales/pt-PT/uikit.js +36 -1
  376. package/dist/i18n/locales/sv-SE/uikit.js +36 -1
  377. package/dist/i18n/locales/vi-VN/uikit.js +36 -1
  378. package/dist/i18n/locales.js +1 -1
  379. package/dist/i18n/useFormatter.js +1 -1
  380. package/dist/i18n/useI18n.js +1 -1
  381. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  382. package/dist/icons/AdjustmentsIcon.js +1 -1
  383. package/dist/icons/AiIcon.js +1 -1
  384. package/dist/icons/AreaChartIcon.js +1 -1
  385. package/dist/icons/BackwardIcon.js +1 -1
  386. package/dist/icons/BarChartIcon.js +1 -1
  387. package/dist/icons/BellFilledIcon.js +1 -1
  388. package/dist/icons/BellIcon.js +1 -1
  389. package/dist/icons/BooleanIcon.js +1 -1
  390. package/dist/icons/CalendarEditIcon.js +1 -1
  391. package/dist/icons/CalendarIcon.js +1 -1
  392. package/dist/icons/CaretDownIcon.js +1 -1
  393. package/dist/icons/CaretUpIcon.js +1 -1
  394. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  395. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  396. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  397. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  398. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  399. package/dist/icons/ChartBarLineIcon.js +1 -1
  400. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  401. package/dist/icons/ChartBarStackedIcon.js +1 -1
  402. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  403. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  404. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  405. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  406. package/dist/icons/ChartBubbleIcon.js +1 -1
  407. package/dist/icons/ChartDonut2Icon.js +1 -1
  408. package/dist/icons/ChartFunnelIcon.js +1 -1
  409. package/dist/icons/ChartHeatmapIcon.js +1 -1
  410. package/dist/icons/ChartKPIIcon.js +1 -1
  411. package/dist/icons/ChartPie2Icon.js +1 -1
  412. package/dist/icons/ChartScatterIcon.js +1 -1
  413. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  414. package/dist/icons/CheckCircleIcon.js +1 -1
  415. package/dist/icons/CheckIcon.js +1 -1
  416. package/dist/icons/CircleFilledIcon.js +1 -1
  417. package/dist/icons/ClearIcon.js +1 -1
  418. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  419. package/dist/icons/CloseCircleIcon.js +1 -1
  420. package/dist/icons/CloseIcon.js +1 -1
  421. package/dist/icons/CodeIcon.js +1 -1
  422. package/dist/icons/ColumnTotalIcon.js +1 -1
  423. package/dist/icons/CopyIcon.js +1 -1
  424. package/dist/icons/CountIcon.js +1 -1
  425. package/dist/icons/CubeIcon.js +1 -1
  426. package/dist/icons/CubePauseIcon.js +1 -1
  427. package/dist/icons/CubePlayIcon.js +1 -1
  428. package/dist/icons/CurrencyDollarIcon.js +1 -1
  429. package/dist/icons/DangerIcon.js +1 -1
  430. package/dist/icons/DashboardIcon.js +1 -1
  431. package/dist/icons/DatabaseIcon.js +1 -1
  432. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  433. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  434. package/dist/icons/DirectionIcon.js +1 -1
  435. package/dist/icons/DonutIcon.js +1 -1
  436. package/dist/icons/DownIcon.js +1 -1
  437. package/dist/icons/EditIcon.js +1 -1
  438. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  439. package/dist/icons/ExclamationCircleIcon.js +1 -1
  440. package/dist/icons/ExclamationIcon.js +1 -1
  441. package/dist/icons/EyeIcon.js +1 -1
  442. package/dist/icons/EyeInvisibleIcon.js +1 -1
  443. package/dist/icons/FilterIcon.js +1 -1
  444. package/dist/icons/FolderFilledIcon.js +1 -1
  445. package/dist/icons/FolderIcon.js +1 -1
  446. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  447. package/dist/icons/FolderOpenIcon.js +1 -1
  448. package/dist/icons/ForwardIcon.js +1 -1
  449. package/dist/icons/GripVerticalIcon.js +1 -1
  450. package/dist/icons/HierarchyIcon.js +1 -1
  451. package/dist/icons/HierarchyOpenIcon.js +1 -1
  452. package/dist/icons/Icon.js +1 -1
  453. package/dist/icons/InfoCircleIcon.js +1 -1
  454. package/dist/icons/InfoIcon.js +1 -1
  455. package/dist/icons/KeyIcon.js +1 -1
  456. package/dist/icons/LeftIcon.js +1 -1
  457. package/dist/icons/LineChartIcon.js +1 -1
  458. package/dist/icons/LoadingIcon.js +1 -1
  459. package/dist/icons/LockFilledIcon.js +1 -1
  460. package/dist/icons/LockIcon.js +1 -1
  461. package/dist/icons/MoreIcon.js +1 -1
  462. package/dist/icons/NotAllowedIcon.js +1 -1
  463. package/dist/icons/Number123Icon.js +1 -1
  464. package/dist/icons/NumberIcon.js +1 -1
  465. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  466. package/dist/icons/PauseCircleIcon.js +1 -1
  467. package/dist/icons/PauseIcon.js +1 -1
  468. package/dist/icons/PercentageIcon.js +1 -1
  469. package/dist/icons/PieChartIcon.js +1 -1
  470. package/dist/icons/PipetteIcon.js +1 -1
  471. package/dist/icons/PlayCircleIcon.js +1 -1
  472. package/dist/icons/PlayIcon.js +1 -1
  473. package/dist/icons/PlusIcon.js +1 -1
  474. package/dist/icons/ProgressBarIcon.js +1 -1
  475. package/dist/icons/ReloadIcon.js +1 -1
  476. package/dist/icons/ReportIcon.js +1 -1
  477. package/dist/icons/ReturnIcon.js +1 -1
  478. package/dist/icons/RightIcon.js +1 -1
  479. package/dist/icons/RowTotalsIcon.js +1 -1
  480. package/dist/icons/SchemeIcon.js +1 -1
  481. package/dist/icons/SearchIcon.js +1 -1
  482. package/dist/icons/SemanticQueryIcon.js +1 -1
  483. package/dist/icons/SettingsIcon.js +1 -1
  484. package/dist/icons/ShieldFilledIcon.js +1 -1
  485. package/dist/icons/ShieldIcon.js +1 -1
  486. package/dist/icons/SlashIcon.js +1 -1
  487. package/dist/icons/SparklesIcon.js +1 -1
  488. package/dist/icons/SqlIcon.js +1 -1
  489. package/dist/icons/StatsIcon.js +1 -1
  490. package/dist/icons/StopIcon.js +1 -1
  491. package/dist/icons/StringIcon.js +1 -1
  492. package/dist/icons/SubtotalsIcon.js +1 -1
  493. package/dist/icons/SwitchIcon.js +1 -1
  494. package/dist/icons/TableIcon.js +1 -1
  495. package/dist/icons/ThumbsDownIcon.js +1 -1
  496. package/dist/icons/ThumbsUpIcon.js +1 -1
  497. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  498. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  499. package/dist/icons/ThunderboltIcon.js +1 -1
  500. package/dist/icons/TimeIcon.js +1 -1
  501. package/dist/icons/TrashIcon.js +1 -1
  502. package/dist/icons/UnlockIcon.js +1 -1
  503. package/dist/icons/UpIcon.js +1 -1
  504. package/dist/icons/UserGroupIcon.js +1 -1
  505. package/dist/icons/UserIcon.js +1 -1
  506. package/dist/icons/UserLockIcon.js +1 -1
  507. package/dist/icons/ViewIcon.js +1 -1
  508. package/dist/icons/WarningFilledIcon.js +1 -1
  509. package/dist/icons/WarningIcon.js +1 -1
  510. package/dist/icons/wrap-icon.js +1 -1
  511. package/dist/index.d.ts +19 -10
  512. package/dist/index.js +8 -5
  513. package/dist/index.js.map +1 -1
  514. package/dist/provider.js +1 -1
  515. package/dist/providers/TrackingProvider.js +1 -1
  516. package/dist/providers/navigationAdapter.default.js +1 -1
  517. package/dist/tokens/base.js +1 -1
  518. package/dist/tokens/colors.js +1 -1
  519. package/dist/tokens/index.js +1 -1
  520. package/dist/tokens/layout.js +1 -1
  521. package/dist/tokens/lazy-styles.js +1 -1
  522. package/dist/tokens/palette-config.js +1 -1
  523. package/dist/tokens/palette.js +1 -1
  524. package/dist/tokens/shadows.js +1 -1
  525. package/dist/tokens/sizes.js +1 -1
  526. package/dist/tokens/spacing.js +1 -1
  527. package/dist/tokens/typography.d.ts +1 -1
  528. package/dist/tokens/typography.js +11 -2
  529. package/dist/tokens/typography.js.map +1 -1
  530. package/dist/utils/ResizeSensor.js +1 -1
  531. package/dist/utils/index.d.ts +0 -1
  532. package/dist/utils/is-dev-env.js +1 -1
  533. package/dist/utils/modules.js +1 -1
  534. package/dist/utils/promise.js +1 -1
  535. package/dist/utils/raf.js +1 -1
  536. package/dist/utils/random.js +1 -1
  537. package/dist/utils/range.js +1 -1
  538. package/dist/utils/react/RenderCache.js +1 -1
  539. package/dist/utils/react/Slots.js +1 -1
  540. package/dist/utils/react/chain.js +1 -1
  541. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  542. package/dist/utils/react/index.d.ts +0 -1
  543. package/dist/utils/react/index.js +1 -2
  544. package/dist/utils/react/interactions.js +1 -1
  545. package/dist/utils/react/isTextOnly.js +1 -1
  546. package/dist/utils/react/mapProps.js +1 -1
  547. package/dist/utils/react/mergeProps.js +1 -1
  548. package/dist/utils/react/nullableValue.js +1 -1
  549. package/dist/utils/react/resolveIcon.js +1 -1
  550. package/dist/utils/react/sharedStore.js +1 -1
  551. package/dist/utils/react/useCombinedRefs.js +1 -1
  552. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  553. package/dist/utils/react/useEventBus.js +1 -1
  554. package/dist/utils/react/useId.js +1 -1
  555. package/dist/utils/react/useIsDarwin.js +1 -1
  556. package/dist/utils/react/useKeySymbols.js +1 -1
  557. package/dist/utils/react/useLayoutEffect.js +1 -1
  558. package/dist/utils/react/useLocalStorage.js +1 -1
  559. package/dist/utils/react/useMergeStyles.js +1 -1
  560. package/dist/utils/react/usePopoverSync.js +1 -1
  561. package/dist/utils/react/useQaProps.js +1 -1
  562. package/dist/utils/react/useViewportSize.js +1 -1
  563. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  564. package/dist/utils/selection.js +1 -1
  565. package/dist/utils/styles.js +1 -1
  566. package/dist/utils/tree.js +1 -1
  567. package/dist/utils/warnings.js +1 -1
  568. package/dist/version.js +2 -2
  569. package/docs/components/data/DataTable.md +298 -0
  570. package/docs/components/data/ItemTable.md +971 -0
  571. package/docs/components/navigation/Pagination.md +245 -0
  572. package/package.json +8 -3
  573. package/dist/utils/react/useBufferedValue.d.ts +0 -56
  574. package/dist/utils/react/useBufferedValue.js +0 -86
  575. package/dist/utils/react/useBufferedValue.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTable.js","names":[],"sources":["../../../../src/components/data/DataTable/DataTable.tsx"],"sourcesContent":["import { useControlledState } from '@react-stately/utils';\nimport { CONTAINER_STYLES } from '@tenphi/tasty';\nimport { forwardRef, useMemo, useRef, useState } from 'react';\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 { ItemTableFooter } from '../ItemTable/ItemTableFooter';\nimport { TableView } from '../TableBase/TableView';\nimport { useCellSelection } from '../TableBase/use-cell-selection';\nimport { useContainerWidth } from '../TableBase/use-container-width';\nimport { useTableColumns } 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 { CubeTableRowSection } 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 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 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 const {\n sorts,\n sortedRows,\n toggleSort,\n mode: resolvedSortMode,\n } = useTableSorts<T>({\n columns: resolvedColumns,\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 const handleColumnResize = useEvent((key: string, width: number) => {\n draftRef.current = {\n ...(draftRef.current ?? baseColumnWidths),\n [key]: Math.round(width),\n };\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: resolvedColumns,\n containerWidth,\n columnWidths,\n leadingColumns,\n });\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 ...(pinnedTopRows ?? []).map(resolvedGetRowKey),\n ...visibleRows.map(resolvedGetRowKey),\n ...(pinnedBottomRows ?? []).map(resolvedGetRowKey),\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 return (\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 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 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 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\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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"}
@@ -0,0 +1,3 @@
1
+
2
+ import { CubeDataTableColumn, CubeDataTableProps } from "./types.js";
3
+ import { _DataTable } from "./DataTable.js";
@@ -0,0 +1,145 @@
1
+
2
+ import { SizeName } from "../../../tokens/sizes.js";
3
+ import { CubeTablePageInfo } from "../../navigation/Pagination/types.js";
4
+ import "../../navigation/Pagination/index.js";
5
+ import "../../../tokens/index.js";
6
+ import { CubeTableCellRange, CubeTableColumn, CubeTableLoadingIndicator, CubeTableRowContext, CubeTableRowSection, CubeTableSort } from "../TableBase/types.js";
7
+ import { BaseProps, ContainerStyleProps, Styles } from "@tenphi/tasty";
8
+ import { ReactNode } from "react";
9
+ import { Key as Key$1 } from "@react-types/shared";
10
+
11
+ //#region src/components/data/DataTable/types.d.ts
12
+ /**
13
+ * A `DataTable` column.
14
+ *
15
+ * The same shape `ItemTable` uses. `dataType` is the one addition, and it is
16
+ * deliberately presentational — alignment and numeric formatting — rather than
17
+ * a Cube type: nothing under `src/components/data/` knows what a measure is.
18
+ */
19
+ interface CubeDataTableColumn<T = any> extends CubeTableColumn<T> {
20
+ /**
21
+ * Drives the default alignment and numeric font. `number` right-aligns and
22
+ * switches to tabular figures so digits line up down the column.
23
+ */
24
+ dataType?: 'string' | 'number' | 'boolean' | 'date' | 'unknown';
25
+ }
26
+ interface CubeDataTableProps<T = any> extends BaseProps, ContainerStyleProps {
27
+ data: readonly T[];
28
+ columns: CubeDataTableColumn<T>[];
29
+ rowKey?: string;
30
+ getRowKey?: (row: T, index: number) => Key$1;
31
+ /**
32
+ * Totals and subtotals, pinned above and below the scrolling rows. Ordinary
33
+ * rows as far as the columns are concerned — the consumer decides what a
34
+ * total means.
35
+ */
36
+ pinnedTopRows?: readonly T[];
37
+ pinnedBottomRows?: readonly T[];
38
+ isLoading?: boolean;
39
+ /** @default 'overlay' */
40
+ loadingIndicator?: CubeTableLoadingIndicator;
41
+ skeletonRowCount?: number;
42
+ error?: ReactNode;
43
+ emptyLabel?: ReactNode;
44
+ noResultsLabel?: ReactNode;
45
+ isFiltered?: boolean;
46
+ shape?: 'plain' | 'card';
47
+ /** @default 'small' — an analytical grid packs more rows than a list. */
48
+ size?: SizeName;
49
+ rowHeight?: number;
50
+ headerHeight?: number;
51
+ /** @default true — banding is what makes a wide row readable across. */
52
+ isStriped?: boolean;
53
+ isHeaderHidden?: boolean;
54
+ isHeaderSticky?: boolean;
55
+ /**
56
+ * Slide rows to their new positions when the sort changes, instead of
57
+ * teleporting them. @default true
58
+ */
59
+ isRowMoveAnimated?: boolean;
60
+ /** Numbers each row down the side. @default false */
61
+ showRowNumbers?: boolean;
62
+ /** @default 'client' */
63
+ sortMode?: 'client' | 'server' | 'off';
64
+ /**
65
+ * Multi-column, unlike `ItemTable`'s single `sort`: an analytical grid is
66
+ * routinely sorted by one dimension then another, and Cloud's reports send
67
+ * an array of sorts to the query.
68
+ */
69
+ sorts?: CubeTableSort[];
70
+ defaultSorts?: CubeTableSort[];
71
+ onSortsChange?: (sorts: CubeTableSort[]) => void;
72
+ /** @default 'client' */
73
+ paginationMode?: 'client' | 'server' | 'off';
74
+ page?: number;
75
+ defaultPage?: number;
76
+ onPageChange?: (page: number) => void;
77
+ pageSize?: number;
78
+ defaultPageSize?: number;
79
+ onPageSizeChange?: (pageSize: number) => void;
80
+ pageSizeOptions?: number[];
81
+ total?: number;
82
+ totalPages?: number;
83
+ hasNextPage?: boolean;
84
+ summary?: boolean | ((info: CubeTablePageInfo) => ReactNode);
85
+ /** @default true */
86
+ autoHidePagination?: boolean;
87
+ footerStart?: ReactNode;
88
+ footerCenter?: ReactNode;
89
+ footerEnd?: ReactNode;
90
+ /**
91
+ * A list is acted on by row; a result grid is read by cell. Click selects a
92
+ * cell, shift-click and drag grow a rectangle, and ⌘/Ctrl+C copies it.
93
+ *
94
+ * `'cell'` allows one cell at a time; `'none'` turns the whole thing off.
95
+ * @default 'range'
96
+ */
97
+ cellSelectionMode?: 'none' | 'cell' | 'range';
98
+ /**
99
+ * Vetoes individual cells. A pinned total's label cell is the motivating case:
100
+ * `"Total"` is a caption for the row, not a figure, and there is nothing
101
+ * useful to do with it selected.
102
+ *
103
+ * ```tsx
104
+ * isCellSelectable={({ section, columnKey }) =>
105
+ * !(section === 'pinnedBottom' && columnKey === 'region')
106
+ * }
107
+ * ```
108
+ *
109
+ * A vetoed cell is inert — it cannot anchor or receive a range, never
110
+ * highlights, and copies as an empty field so a block spanning it keeps its
111
+ * shape.
112
+ */
113
+ isCellSelectable?: (ctx: {
114
+ row: T;
115
+ rowKey: Key$1;
116
+ columnKey: string;
117
+ section: CubeTableRowSection;
118
+ }) => boolean;
119
+ selectedCellRange?: CubeTableCellRange | null;
120
+ defaultSelectedCellRange?: CubeTableCellRange | null;
121
+ onCellRangeChange?: (range: CubeTableCellRange | null) => void;
122
+ /** @default true — a result grid is the case resizing exists for. */
123
+ isResizable?: boolean;
124
+ columnWidths?: Record<string, number>;
125
+ defaultColumnWidths?: Record<string, number>;
126
+ onColumnResize?: (columnKey: string, width: number, all: Record<string, number>) => void;
127
+ isVirtualized?: boolean | 'auto';
128
+ virtualizeThreshold?: number;
129
+ overscan?: number;
130
+ getRowProps?: (ctx: CubeTableRowContext<T>) => Record<string, any> | undefined;
131
+ storageKey?: string;
132
+ styles?: Styles;
133
+ headerStyles?: Styles;
134
+ headerCellStyles?: Styles;
135
+ bodyStyles?: Styles;
136
+ rowStyles?: Styles;
137
+ cellStyles?: Styles;
138
+ footerStyles?: Styles;
139
+ ariaLabel?: string;
140
+ qa?: string;
141
+ mods?: Record<string, boolean>;
142
+ }
143
+ //#endregion
144
+ export { CubeDataTableColumn, CubeDataTableProps };
145
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,19 @@
1
+
2
+ import { CubeItemTableProps } from "./types.js";
3
+ import { ItemTableBulkBar } from "./ItemTableBulkBar.js";
4
+ import { ItemTableSearch, ItemTableToolbar } from "./ItemTableToolbar.js";
5
+ import { ForwardedRef, ReactElement } from "react";
6
+
7
+ //#region src/components/data/ItemTable/ItemTable.d.ts
8
+ declare const _ItemTable: (<T = any>(props: CubeItemTableProps<T> & {
9
+ ref?: ForwardedRef<HTMLDivElement>;
10
+ }) => ReactElement) & {
11
+ displayName?: string;
12
+ } & {
13
+ /** The table's search input, bound to the table's own state. */Search: typeof ItemTableSearch; /** The default toolbar row, for rebuilding it around extra content. */
14
+ Toolbar: typeof ItemTableToolbar; /** The selection action bar, for placing it outside the default chrome. */
15
+ BulkBar: typeof ItemTableBulkBar;
16
+ };
17
+ //#endregion
18
+ export { _ItemTable };
19
+ //# sourceMappingURL=ItemTable.d.ts.map
@@ -0,0 +1,350 @@
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-306afc2 | Cube Dev Team */
2
+ import { extractStyles } from "../../../utils/styles.js";
3
+ import { useCombinedRefs } from "../../../utils/react/useCombinedRefs.js";
4
+ import { useEvent } from "../../../_internal/hooks/use-event.js";
5
+ import { useI18n } from "../../../i18n/useI18n.js";
6
+ import { DraggableCollection } from "../../shared/DraggableCollection.js";
7
+ import { clampPage, getPageInfo } from "../../navigation/Pagination/use-pagination.js";
8
+ import { ItemTableFooter } from "./ItemTableFooter.js";
9
+ import { ROW_MENU_COLUMN_KEY, ROW_MENU_COLUMN_WIDTH } from "../TableBase/row-menu.js";
10
+ import { useTableColumns } from "../TableBase/use-table-columns.js";
11
+ import { SELECTION_COLUMN_KEY, SELECTION_COLUMN_WIDTH, useTableSelection } from "../TableBase/use-table-selection.js";
12
+ import { TableView } from "../TableBase/TableView.js";
13
+ import { useContainerWidth } from "../TableBase/use-container-width.js";
14
+ import { useTableSort } from "../TableBase/use-table-sort.js";
15
+ import { useTableStorage } from "../TableBase/use-table-storage.js";
16
+ import { useTableSearch } from "../TableBase/use-table-search.js";
17
+ import { ItemTableChromeProvider, ItemTableSearch, ItemTableToolbar } from "./ItemTableToolbar.js";
18
+ import { ItemTableBulkBar } from "./ItemTableBulkBar.js";
19
+ import { ItemTableDragPreview } from "./ItemTableDragPreview.js";
20
+ import { CONTAINER_STYLES } from "@tenphi/tasty";
21
+ import { forwardRef, useMemo, useRef, useState } from "react";
22
+ import { jsx } from "react/jsx-runtime";
23
+ import { useControlledState } from "@react-stately/utils";
24
+
25
+ //#region src/components/data/ItemTable/ItemTable.tsx
26
+ /** Stable identity, so the uncontrolled default does not change every render. */
27
+ const EMPTY_WIDTHS = {};
28
+ function defaultGetRowKey(rowKey) {
29
+ return (row, index) => {
30
+ const value = row?.[rowKey];
31
+ return value == null ? index : value;
32
+ };
33
+ }
34
+ 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, onPageSizeChange, pageSizeOptions = [
36
+ 10,
37
+ 20,
38
+ 50,
39
+ 100,
40
+ 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;
42
+ const { t } = useI18n();
43
+ const rootRef = useCombinedRefs(ref, useRef(null));
44
+ const [scrollerEl, setScrollerEl] = useState(null);
45
+ const containerWidth = useContainerWidth(scrollerEl);
46
+ const rootStyles = {
47
+ ...extractStyles(props, CONTAINER_STYLES),
48
+ ...styles
49
+ };
50
+ const { searchValue, setSearchValue, searchedRows, isFiltered: isSearching } = useTableSearch({
51
+ columns,
52
+ rows: data,
53
+ mode: searchMode,
54
+ value: searchValueProp,
55
+ defaultValue: defaultSearchValue,
56
+ onChange: onSearchChange,
57
+ delay: searchDelay,
58
+ filter: searchFilter
59
+ });
60
+ const storage = useTableStorage(storageKey, persist);
61
+ const { sort, sortedRows, toggleSort, mode: resolvedSortMode } = useTableSort({
62
+ columns,
63
+ rows: searchedRows,
64
+ mode: sortMode,
65
+ sort: sortProp,
66
+ defaultSort: sortProp === void 0 && storage.has("sort") ? storage.initial.sort ?? defaultSort : defaultSort,
67
+ onSortChange: useEvent((next) => {
68
+ if (sortProp === void 0) storage.write({ sort: next });
69
+ onSortChange?.(next);
70
+ })
71
+ });
72
+ const [pageSize, setPageSizeState] = useControlledState(pageSizeProp, pageSizeProp === void 0 && storage.has("pageSize") ? storage.initial.pageSize ?? defaultPageSize : defaultPageSize, onPageSizeChange);
73
+ const [page, setPageState] = useControlledState(pageProp, defaultPage ?? 1, onPageChange);
74
+ const isInfinite = paginationMode === "infinite";
75
+ const isPaginated = paginationMode !== "off" && !isInfinite;
76
+ const isServerPaginated = paginationMode === "server";
77
+ const total = isServerPaginated ? totalProp ?? 0 : sortedRows.length;
78
+ const pageInfo = getPageInfo({
79
+ page,
80
+ pageSize,
81
+ total,
82
+ totalPages: isServerPaginated ? totalPages : void 0
83
+ });
84
+ const setPage = useEvent((next) => setPageState(clampPage(next, pageInfo.totalPages)));
85
+ const setPageSize = useEvent((next) => {
86
+ setPageSizeState(next);
87
+ if (pageSizeProp === void 0) storage.write({ pageSize: next });
88
+ setPageState(1);
89
+ });
90
+ const visibleRows = paginationMode === "client" ? sortedRows.slice((pageInfo.page - 1) * pageSize, pageInfo.page * pageSize) : sortedRows;
91
+ const resolvedGetRowKey = useMemo(() => getRowKey ?? defaultGetRowKey(rowKey), [getRowKey, rowKey]);
92
+ const resolvedSelectionMode = selectionMode ?? (bulkActions?.length ? "multiple" : "none");
93
+ const selection = useTableSelection({
94
+ rows: visibleRows,
95
+ filteredRows: paginationMode === "client" ? sortedRows : visibleRows,
96
+ getRowKey: resolvedGetRowKey,
97
+ selectionMode: resolvedSelectionMode,
98
+ selectedKeys: selectedKeysProp,
99
+ defaultSelectedKeys,
100
+ onSelectionChange,
101
+ selectAllMode,
102
+ isRowSelectable,
103
+ disabledKeys
104
+ });
105
+ const resolveRowMenu = useMemo(() => rowMenu == null ? void 0 : typeof rowMenu === "function" ? rowMenu : () => rowMenu, [rowMenu]);
106
+ const trailingColumns = useMemo(() => resolveRowMenu && rowContextMenu === true ? [{
107
+ key: ROW_MENU_COLUMN_KEY,
108
+ width: ROW_MENU_COLUMN_WIDTH[size] ?? ROW_MENU_COLUMN_WIDTH.medium,
109
+ align: "center"
110
+ }] : void 0, [
111
+ resolveRowMenu,
112
+ rowContextMenu,
113
+ size
114
+ ]);
115
+ const leadingColumns = useMemo(() => selection.isEnabled ? [{
116
+ key: SELECTION_COLUMN_KEY,
117
+ width: SELECTION_COLUMN_WIDTH[size] ?? SELECTION_COLUMN_WIDTH.medium,
118
+ align: "center"
119
+ }] : void 0, [selection.isEnabled, size]);
120
+ /**
121
+ * Column widths, in three layers.
122
+ *
123
+ * The draft exists because a resize has to be visible *while* it happens, and
124
+ * a controlled `columnWidths` cannot be: the consumer only learns the new
125
+ * width from `onColumnResize`, which fires when the gesture ends. Without a
126
+ * draft a controlled table simply would not move under the pointer.
127
+ */
128
+ const [ownColumnWidths, setOwnColumnWidths] = useState(() => (columnWidthsProp === void 0 && storage.has("columnWidths") ? storage.initial.columnWidths ?? defaultColumnWidths : defaultColumnWidths) ?? EMPTY_WIDTHS);
129
+ const [draftColumnWidths, setDraftColumnWidths] = useState(null);
130
+ /**
131
+ * The same draft, in a ref.
132
+ *
133
+ * A keyboard resize runs `useMove`'s whole start → move → end cycle inside
134
+ * one key press, so the end handler would read the state from before the
135
+ * move. The ref is what it actually settles on; the state exists only to
136
+ * trigger the render.
137
+ */
138
+ const draftColumnWidthsRef = useRef(null);
139
+ const baseColumnWidths = columnWidthsProp ?? ownColumnWidths;
140
+ const columnWidths = draftColumnWidths ?? baseColumnWidths;
141
+ const handleColumnResize = useEvent((key, width) => {
142
+ draftColumnWidthsRef.current = {
143
+ ...draftColumnWidthsRef.current ?? baseColumnWidths,
144
+ [key]: Math.round(width)
145
+ };
146
+ setDraftColumnWidths(draftColumnWidthsRef.current);
147
+ });
148
+ const handleColumnResizeEnd = useEvent((key) => {
149
+ const next = draftColumnWidthsRef.current ?? baseColumnWidths;
150
+ if (columnWidthsProp === void 0) {
151
+ setOwnColumnWidths(next);
152
+ storage.write({ columnWidths: next });
153
+ }
154
+ onColumnResize?.(key, next[key], next);
155
+ draftColumnWidthsRef.current = null;
156
+ setDraftColumnWidths(null);
157
+ });
158
+ const layout = useTableColumns({
159
+ columns,
160
+ containerWidth,
161
+ columnWidths,
162
+ leadingColumns,
163
+ trailingColumns
164
+ });
165
+ const bulkBar = bulkActions != null && bulkActions.length > 0 && selection.selectedCount > 0 ? /* @__PURE__ */ jsx(ItemTableBulkBar, {
166
+ actions: bulkActions,
167
+ placement: bulkBarPlacement,
168
+ styles: bulkBarStyles
169
+ }) : null;
170
+ const isBulkBarInToolbar = bulkBar != null && bulkBarPlacement === "toolbar";
171
+ const toolbarNode = toolbar !== void 0 || isSearchable || filters != null || actions != null || onRefresh != null || isBulkBarInToolbar ? toolbar ?? /* @__PURE__ */ jsx(ItemTableToolbar, {
172
+ isSearchable,
173
+ filters,
174
+ actions: isBulkBarInToolbar ? bulkBar : actions,
175
+ isLoading,
176
+ styles: toolbarStyles,
177
+ searchStyles,
178
+ onRefresh
179
+ }) : null;
180
+ /**
181
+ * Pagination that cannot do anything is noise: one page of five rows still
182
+ * renders "1–5 of 5", a page-size selector whose every option shows the same
183
+ * five rows, and a solitary "1" button.
184
+ *
185
+ * "Cannot do anything" is both conditions together — a single page *and* a
186
+ * total that even the smallest page size would not split. A 15-row single
187
+ * page stays, because choosing "10 / page" would genuinely paginate it.
188
+ */
189
+ const smallestPageSize = pageSizeOptions?.length ? Math.min(...pageSizeOptions) : pageSize;
190
+ const isPaginationUseless = autoHidePagination && !hasNextPage && pageInfo.totalPages <= 1 && total <= smallestPageSize;
191
+ const showPagination = isPaginated && !isPaginationUseless;
192
+ const footerNode = footer !== void 0 || showPagination || footerStart != null || footerCenter != null || footerEnd != null ? footer ?? /* @__PURE__ */ jsx(ItemTableFooter, {
193
+ start: footerStart,
194
+ center: footerCenter,
195
+ end: footerEnd,
196
+ styles: footerStyles,
197
+ pagination: showPagination ? {
198
+ page: pageInfo.page,
199
+ pageSize,
200
+ total,
201
+ totalPages: pageInfo.totalPages,
202
+ pageSizeOptions,
203
+ summary,
204
+ hasNextPage,
205
+ onPageChange: setPage,
206
+ onPageSizeChange: setPageSize
207
+ } : void 0
208
+ }) : null;
209
+ const bodyRef = useRef(null);
210
+ const rowKeys = useMemo(() => visibleRows.map((row, index) => String(resolvedGetRowKey(row, index))), [visibleRows, resolvedGetRowKey]);
211
+ const handleReorder = useEvent((nextKeys) => {
212
+ const byKey = new Map(visibleRows.map((row, index) => [String(resolvedGetRowKey(row, index)), row]));
213
+ onReorder?.(nextKeys, nextKeys.map((key) => byKey.get(key)).filter((row) => row !== void 0));
214
+ });
215
+ /**
216
+ * `DraggableCollection` owns the React Aria drag/drop hooks and hands the two
217
+ * states down. It is only mounted when reordering is on, so a plain table
218
+ * pays nothing for it.
219
+ *
220
+ * `RowCollection` and the `SelectionManager` from `useTableSelection` satisfy
221
+ * its structural `state` contract unchanged — both exist even when selection
222
+ * itself is off.
223
+ */
224
+ const renderTable = (dragState, dropState, collectionProps) => /* @__PURE__ */ jsx(TableView, {
225
+ rootRef,
226
+ dragState,
227
+ dropState,
228
+ collectionProps,
229
+ bodyRef,
230
+ qa: qa || "ItemTable",
231
+ rows: visibleRows,
232
+ rowIndexOffset: isPaginated ? (pageInfo.page - 1) * pageSize : 0,
233
+ totalRowCount: total,
234
+ getRowKey: resolvedGetRowKey,
235
+ layout,
236
+ onScrollerRef: setScrollerEl,
237
+ size,
238
+ shape,
239
+ rowHeight,
240
+ headerHeight,
241
+ isHeaderHidden,
242
+ isHeaderSticky,
243
+ isVirtualized,
244
+ virtualizeThreshold,
245
+ overscan,
246
+ isStriped,
247
+ isRowMoveAnimated,
248
+ isLoading,
249
+ loadingIndicator,
250
+ selection,
251
+ selectionTooltip,
252
+ rowLink,
253
+ onRowAction,
254
+ onLoadMore: isInfinite ? onLoadMore : void 0,
255
+ hasMore,
256
+ isLoadingMore,
257
+ loadMoreMargin,
258
+ isReorderable: isDragEnabled,
259
+ isResizable,
260
+ onColumnResize: handleColumnResize,
261
+ onColumnResizeEnd: handleColumnResizeEnd,
262
+ rowMenu: resolveRowMenu,
263
+ rowContextMenu,
264
+ onRowMenuAction,
265
+ rowMenuTriggerProps,
266
+ skeletonRowCount,
267
+ emptyLabel: emptyLabel ?? t("itemTable.noItems", "No items"),
268
+ noResultsLabel: noResultsLabel ?? t("itemTable.noResults", "No results found"),
269
+ error,
270
+ toolbar: toolbarNode,
271
+ footer: footerNode,
272
+ isFiltered: isFiltered ?? isSearching,
273
+ sortMode: resolvedSortMode,
274
+ sort,
275
+ onColumnSort: toggleSort,
276
+ getRowProps,
277
+ ariaLabel,
278
+ styles: rootStyles,
279
+ headerStyles,
280
+ headerCellStyles,
281
+ headerPreset,
282
+ bodyStyles,
283
+ rowStyles,
284
+ cellStyles,
285
+ mods,
286
+ overlay: bulkBarPlacement === "floating" ? bulkBar : null
287
+ });
288
+ const rowByKeyForDrop = useMemo(() => {
289
+ const map = /* @__PURE__ */ new Map();
290
+ visibleRows.forEach((row, index) => map.set(String(resolvedGetRowKey(row, index)), row));
291
+ return map;
292
+ }, [visibleRows, resolvedGetRowKey]);
293
+ const handleItemDrop = useEvent((targetKey, draggedKeys) => {
294
+ if (!dropOnRow) return;
295
+ const target = rowByKeyForDrop.get(String(targetKey));
296
+ if (!target) return;
297
+ const dragged = draggedKeys.map((key) => rowByKeyForDrop.get(String(key))).filter((row) => row !== void 0 && row !== target);
298
+ if (!dragged.length) return;
299
+ if (dropOnRow.isAllowed && !dropOnRow.isAllowed(dragged, target)) return;
300
+ dropOnRow.onDrop(dragged, target);
301
+ });
302
+ const renderDragPreview = useEvent((keys) => /* @__PURE__ */ jsx(ItemTableDragPreview, {
303
+ rows: keys.map((key) => rowByKeyForDrop.get(String(key))).filter((row) => row !== void 0),
304
+ getItemDragInfo
305
+ }));
306
+ const shouldAcceptItemDrop = useEvent((targetKey) => {
307
+ const target = rowByKeyForDrop.get(String(targetKey));
308
+ return target != null && (dropOnRow?.isTarget(target) ?? false);
309
+ });
310
+ const isDragEnabled = isReorderable || dropOnRow != null;
311
+ const table = isDragEnabled ? /* @__PURE__ */ jsx(DraggableCollection, {
312
+ state: {
313
+ collection: selection.collection,
314
+ selectionManager: selection.selectionManager,
315
+ disabledKeys: new Set(disabledKeys ?? [])
316
+ },
317
+ listRef: bodyRef,
318
+ orderedKeys: rowKeys,
319
+ orientation: "vertical",
320
+ onReorder: isReorderable ? handleReorder : void 0,
321
+ onItemDrop: dropOnRow ? handleItemDrop : void 0,
322
+ shouldAcceptItemDrop: dropOnRow ? shouldAcceptItemDrop : void 0,
323
+ renderPreview: getItemDragInfo ? renderDragPreview : void 0,
324
+ children: (dragState, dropState, collectionProps) => renderTable(dragState, dropState, collectionProps)
325
+ }) : renderTable();
326
+ return /* @__PURE__ */ jsx(ItemTableChromeProvider, {
327
+ value: {
328
+ searchValue,
329
+ setSearchValue,
330
+ searchPlaceholder,
331
+ isLoading,
332
+ onRefresh,
333
+ selectedKeys: selection.selectedKeys,
334
+ selectedRows: selection.selectedRows,
335
+ selectedCount: selection.selectedCount,
336
+ clearSelection: selection.clearSelection
337
+ },
338
+ children: table
339
+ });
340
+ }
341
+ const _ItemTable = Object.assign(forwardRef(ItemTable), {
342
+ Search: ItemTableSearch,
343
+ Toolbar: ItemTableToolbar,
344
+ BulkBar: ItemTableBulkBar
345
+ });
346
+ _ItemTable.displayName = "ItemTable";
347
+
348
+ //#endregion
349
+ export { _ItemTable };
350
+ //# sourceMappingURL=ItemTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ItemTable.js","names":[],"sources":["../../../../src/components/data/ItemTable/ItemTable.tsx"],"sourcesContent":["import { useControlledState } from '@react-stately/utils';\nimport { CONTAINER_STYLES } from '@tenphi/tasty';\nimport { forwardRef, useMemo, useRef, useState } from 'react';\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 {\n ROW_MENU_COLUMN_KEY,\n ROW_MENU_COLUMN_WIDTH,\n} from '../TableBase/row-menu';\nimport { TableView } from '../TableBase/TableView';\nimport { useContainerWidth } from '../TableBase/use-container-width';\nimport { useTableColumns } from '../TableBase/use-table-columns';\nimport { useTableSearch } from '../TableBase/use-table-search';\nimport {\n SELECTION_COLUMN_KEY,\n SELECTION_COLUMN_WIDTH,\n useTableSelection,\n} from '../TableBase/use-table-selection';\nimport { useTableSort } from '../TableBase/use-table-sort';\nimport { useTableStorage } from '../TableBase/use-table-storage';\n\nimport { ItemTableBulkBar } from './ItemTableBulkBar';\nimport { ItemTableDragPreview } from './ItemTableDragPreview';\nimport { ItemTableFooter } from './ItemTableFooter';\nimport {\n ItemTableChromeProvider,\n ItemTableSearch,\n ItemTableToolbar,\n} from './ItemTableToolbar';\n\nimport type { Key } from '@react-types/shared';\nimport type { ForwardedRef, ReactElement, ReactNode } from 'react';\nimport type { CubeTableRowContext, CubeTableSort } from '../TableBase/types';\nimport type { CubeItemTableProps } from './types';\n\n/** Stable identity, so the uncontrolled default does not change every render. */\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\nfunction ItemTable<T = any>(\n props: CubeItemTableProps<T>,\n ref: ForwardedRef<HTMLDivElement>,\n): ReactElement {\n const {\n data,\n columns,\n rowKey = 'id',\n getRowKey,\n isLoading = false,\n loadingIndicator = 'overlay',\n selectionMode,\n bulkActions,\n rowLink,\n onRowAction,\n rowMenu,\n rowContextMenu = false,\n onRowMenuAction,\n rowMenuTriggerProps,\n bulkBarPlacement = 'floating',\n bulkBarStyles,\n selectedKeys: selectedKeysProp,\n defaultSelectedKeys,\n onSelectionChange,\n selectAllMode = 'page',\n isRowSelectable,\n selectionTooltip,\n disabledKeys,\n skeletonRowCount = 6,\n emptyLabel,\n noResultsLabel,\n error,\n isFiltered,\n toolbar,\n isSearchable = false,\n searchMode = 'client',\n searchPlaceholder,\n searchValue: searchValueProp,\n defaultSearchValue,\n onSearchChange,\n searchDelay = 500,\n searchFilter,\n filters,\n actions,\n onRefresh,\n paginationMode = 'client',\n pageSize: pageSizeProp,\n defaultPageSize = 50,\n autoHidePagination = true,\n onLoadMore,\n hasMore,\n isLoadingMore,\n loadMoreMargin,\n storageKey,\n persist,\n isReorderable = false,\n onReorder,\n dropOnRow,\n getItemDragInfo,\n isResizable = false,\n columnWidths: columnWidthsProp,\n defaultColumnWidths,\n onColumnResize,\n onPageSizeChange,\n pageSizeOptions = [10, 20, 50, 100, 500],\n page: pageProp,\n defaultPage,\n onPageChange,\n total: totalProp,\n totalPages,\n hasNextPage,\n summary = true,\n footer,\n footerStart,\n footerCenter,\n footerEnd,\n sortMode,\n sort: sortProp,\n defaultSort,\n onSortChange,\n shape = 'plain',\n size = 'medium',\n rowHeight,\n headerHeight,\n isStriped = false,\n isHeaderHidden = false,\n isHeaderSticky = true,\n isVirtualized = 'auto',\n virtualizeThreshold = 50,\n overscan = 20,\n getRowProps,\n ariaLabel,\n qa,\n mods,\n styles,\n headerStyles,\n headerCellStyles,\n headerPreset = 'c3',\n toolbarStyles,\n searchStyles,\n footerStyles,\n bodyStyles,\n rowStyles,\n cellStyles,\n isRowMoveAnimated,\n } = props;\n\n const { t } = useI18n();\n\n const localRef = useRef<HTMLDivElement>(null);\n const rootRef = useCombinedRefs(ref, localRef);\n\n // Held in state, not a ref: the virtualized path's scroller is created by\n // Virtuoso and arrives through a callback, and the column layout has to\n // re-derive once it does.\n const [scrollerEl, setScrollerEl] = useState<HTMLDivElement | null>(null);\n const containerWidth = useContainerWidth(scrollerEl);\n\n // Style props (`height`, `maxHeight`, `margin`, …) land on the root frame.\n // `height` matters most: there is no page-scroll mode, so bounding the table\n // is what turns the body into a scroller and pins the header.\n const rootStyles = { ...extractStyles(props, CONTAINER_STYLES), ...styles };\n\n const {\n searchValue,\n setSearchValue,\n searchedRows,\n isFiltered: isSearching,\n } = useTableSearch<T>({\n columns,\n rows: data,\n mode: searchMode,\n value: searchValueProp,\n defaultValue: defaultSearchValue,\n onChange: onSearchChange,\n delay: searchDelay,\n filter: searchFilter,\n });\n\n const storage = useTableStorage(storageKey, persist);\n\n const {\n sort,\n sortedRows,\n toggleSort,\n mode: resolvedSortMode,\n } = useTableSort<T>({\n columns,\n rows: searchedRows,\n mode: sortMode,\n sort: sortProp,\n // Only restore what the table owns: a controlled `sort` belongs to the page,\n // and overriding it here would fight the page's own source of truth.\n defaultSort:\n sortProp === undefined && storage.has('sort')\n ? storage.initial.sort ?? defaultSort\n : defaultSort,\n onSortChange: useEvent((next: CubeTableSort | null) => {\n if (sortProp === undefined) storage.write({ sort: next });\n onSortChange?.(next);\n }),\n });\n\n // Search → sort → paginate. Paging last, so a page always reflects the rows\n // the user is actually looking at.\n //\n // Deliberately not `usePagination`: that hook owns an in-memory array, and in\n // server mode `data` is a single page. Deriving the bounds from it would clamp\n // the page to 1 and swallow every page change.\n const [pageSize, setPageSizeState] = useControlledState<number>(\n pageSizeProp as number,\n pageSizeProp === undefined && storage.has('pageSize')\n ? storage.initial.pageSize ?? defaultPageSize\n : defaultPageSize,\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 isInfinite = paginationMode === 'infinite';\n // Infinite scroll replaces the page control rather than adding to it.\n const isPaginated = paginationMode !== 'off' && !isInfinite;\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\n if (pageSizeProp === undefined) storage.write({ pageSize: next });\n\n // The old page index points at different rows under a new page size, so\n // staying on it would silently move the user.\n setPageState(1);\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 resolvedGetRowKey = useMemo(\n () => getRowKey ?? defaultGetRowKey<T>(rowKey),\n [getRowKey, rowKey],\n );\n\n // A bulk action with no way to select rows is a contradiction, so supplying\n // any implies multiple selection unless the consumer says otherwise.\n const resolvedSelectionMode =\n selectionMode ?? (bulkActions?.length ? 'multiple' : 'none');\n\n const selection = useTableSelection<T>({\n rows: visibleRows,\n // The wider set the header checkbox can reach under\n // `selectAllMode=\"filtered\"`. In server mode the client only ever holds one\n // page, so the two coincide.\n filteredRows: paginationMode === 'client' ? sortedRows : visibleRows,\n getRowKey: resolvedGetRowKey,\n selectionMode: resolvedSelectionMode,\n selectedKeys: selectedKeysProp,\n defaultSelectedKeys,\n onSelectionChange,\n selectAllMode,\n isRowSelectable,\n disabledKeys,\n });\n\n // A `ReactNode` menu applies to every row; a function decides per row. The\n // renderer only ever sees the function form.\n const resolveRowMenu = useMemo(\n () =>\n rowMenu == null\n ? undefined\n : typeof rowMenu === 'function'\n ? (rowMenu as (\n row: T,\n ctx: CubeTableRowContext<T>,\n ) => ReactNode | null)\n : () => rowMenu as ReactNode,\n [rowMenu],\n );\n\n const trailingColumns = useMemo(\n () =>\n resolveRowMenu && rowContextMenu === true\n ? [\n {\n key: ROW_MENU_COLUMN_KEY,\n width:\n ROW_MENU_COLUMN_WIDTH[size] ?? ROW_MENU_COLUMN_WIDTH.medium,\n align: 'center' as const,\n },\n ]\n : undefined,\n [resolveRowMenu, rowContextMenu, size],\n );\n\n const leadingColumns = useMemo(\n () =>\n selection.isEnabled\n ? [\n {\n key: SELECTION_COLUMN_KEY,\n width:\n SELECTION_COLUMN_WIDTH[size] ?? SELECTION_COLUMN_WIDTH.medium,\n align: 'center' as const,\n },\n ]\n : undefined,\n [selection.isEnabled, size],\n );\n\n /**\n * Column widths, in three layers.\n *\n * The draft exists because a resize has to be visible *while* it happens, and\n * a controlled `columnWidths` cannot be: the consumer only learns the new\n * width from `onColumnResize`, which fires when the gesture ends. Without a\n * draft a controlled table simply would not move under the pointer.\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\n /**\n * The same draft, in a ref.\n *\n * A keyboard resize runs `useMove`'s whole start → move → end cycle inside\n * one key press, so the end handler would read the state from before the\n * move. The ref is what it actually settles on; the state exists only to\n * trigger the render.\n */\n const draftColumnWidthsRef = useRef<Record<string, number> | null>(null);\n\n const baseColumnWidths = columnWidthsProp ?? ownColumnWidths;\n const columnWidths = draftColumnWidths ?? baseColumnWidths;\n\n const handleColumnResize = useEvent((key: string, width: number) => {\n draftColumnWidthsRef.current = {\n ...(draftColumnWidthsRef.current ?? baseColumnWidths),\n [key]: Math.round(width),\n };\n setDraftColumnWidths(draftColumnWidthsRef.current);\n });\n\n // Once at the end: a callback per pixel would be unusable, and persisting\n // every frame would hammer `localStorage`.\n const handleColumnResizeEnd = useEvent((key: string) => {\n const next = draftColumnWidthsRef.current ?? baseColumnWidths;\n\n if (columnWidthsProp === undefined) {\n setOwnColumnWidths(next);\n storage.write({ columnWidths: next });\n }\n\n onColumnResize?.(key, next[key], next);\n\n // The prop (or `ownColumnWidths`) is the source of truth again. A\n // controlled consumer that ignores the callback reverts, which is what\n // being controlled means.\n draftColumnWidthsRef.current = null;\n setDraftColumnWidths(null);\n });\n\n const layout = useTableColumns<T>({\n columns,\n containerWidth,\n columnWidths,\n leadingColumns,\n trailingColumns,\n });\n\n const hasBulkSelection =\n bulkActions != null &&\n bulkActions.length > 0 &&\n selection.selectedCount > 0;\n\n const bulkBar = hasBulkSelection ? (\n <ItemTableBulkBar<T>\n actions={bulkActions!}\n placement={bulkBarPlacement}\n styles={bulkBarStyles}\n />\n ) : null;\n\n const isBulkBarInToolbar = bulkBar != null && bulkBarPlacement === 'toolbar';\n\n const hasToolbar =\n toolbar !== undefined ||\n isSearchable ||\n filters != null ||\n actions != null ||\n onRefresh != null ||\n isBulkBarInToolbar;\n\n const toolbarNode = hasToolbar\n ? toolbar ?? (\n <ItemTableToolbar\n isSearchable={isSearchable}\n filters={filters}\n // The bar takes the actions group rather than sitting beside it: the\n // two compete for the same space, and while rows are selected the\n // bulk actions are what the user is reaching for.\n actions={isBulkBarInToolbar ? bulkBar : actions}\n isLoading={isLoading}\n styles={toolbarStyles}\n searchStyles={searchStyles}\n onRefresh={onRefresh}\n />\n )\n : null;\n\n /**\n * Pagination that cannot do anything is noise: one page of five rows still\n * renders \"1–5 of 5\", a page-size selector whose every option shows the same\n * five rows, and a solitary \"1\" button.\n *\n * \"Cannot do anything\" is both conditions together — a single page *and* a\n * total that even the smallest page size would not split. A 15-row single\n * page stays, because choosing \"10 / page\" would genuinely paginate it.\n */\n const smallestPageSize = pageSizeOptions?.length\n ? Math.min(...pageSizeOptions)\n : pageSize;\n\n const isPaginationUseless =\n autoHidePagination &&\n !hasNextPage &&\n pageInfo.totalPages <= 1 &&\n total <= smallestPageSize;\n\n const showPagination = isPaginated && !isPaginationUseless;\n\n const hasFooter =\n footer !== undefined ||\n showPagination ||\n footerStart != null ||\n footerCenter != null ||\n footerEnd != null;\n\n const footerNode = hasFooter\n ? footer ?? (\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 )\n : null;\n\n const bodyRef = useRef<HTMLTableSectionElement>(null);\n\n const rowKeys = useMemo(\n () =>\n visibleRows.map((row, index) => String(resolvedGetRowKey(row, index))),\n [visibleRows, resolvedGetRowKey],\n );\n\n const handleReorder = useEvent((nextKeys: string[]) => {\n const byKey = new Map(\n visibleRows.map((row, index) => [\n String(resolvedGetRowKey(row, index)),\n row,\n ]),\n );\n\n onReorder?.(\n nextKeys,\n nextKeys\n .map((key) => byKey.get(key))\n .filter((row): row is T => row !== undefined),\n );\n });\n\n /**\n * `DraggableCollection` owns the React Aria drag/drop hooks and hands the two\n * states down. It is only mounted when reordering is on, so a plain table\n * pays nothing for it.\n *\n * `RowCollection` and the `SelectionManager` from `useTableSelection` satisfy\n * its structural `state` contract unchanged — both exist even when selection\n * itself is off.\n */\n const renderTable = (\n dragState?: any,\n dropState?: any,\n collectionProps?: Record<string, any>,\n ) => (\n <TableView<T>\n rootRef={rootRef}\n dragState={dragState}\n dropState={dropState}\n collectionProps={collectionProps}\n bodyRef={bodyRef}\n qa={qa || 'ItemTable'}\n rows={visibleRows}\n // `aria-rowindex` is document-absolute by contract: on page 3 a screen\n // reader should hear \"row 51 of 240\", not \"row 1 of 25\". Infinite scroll\n // never offsets — every loaded row is already in `visibleRows`.\n // `isPaginated` already excludes infinite scroll, where every loaded row\n // is in `visibleRows` and there is no page to offset by.\n rowIndexOffset={isPaginated ? (pageInfo.page - 1) * pageSize : 0}\n totalRowCount={total}\n getRowKey={resolvedGetRowKey}\n layout={layout}\n onScrollerRef={setScrollerEl}\n size={size}\n shape={shape}\n rowHeight={rowHeight}\n headerHeight={headerHeight}\n isHeaderHidden={isHeaderHidden}\n isHeaderSticky={isHeaderSticky}\n isVirtualized={isVirtualized}\n virtualizeThreshold={virtualizeThreshold}\n overscan={overscan}\n isStriped={isStriped}\n isRowMoveAnimated={isRowMoveAnimated}\n isLoading={isLoading}\n loadingIndicator={loadingIndicator}\n selection={selection}\n selectionTooltip={selectionTooltip}\n rowLink={rowLink}\n onRowAction={onRowAction}\n onLoadMore={isInfinite ? onLoadMore : undefined}\n hasMore={hasMore}\n isLoadingMore={isLoadingMore}\n loadMoreMargin={loadMoreMargin}\n isReorderable={isDragEnabled}\n isResizable={isResizable}\n onColumnResize={handleColumnResize}\n onColumnResizeEnd={handleColumnResizeEnd}\n rowMenu={resolveRowMenu}\n rowContextMenu={rowContextMenu}\n onRowMenuAction={onRowMenuAction}\n rowMenuTriggerProps={rowMenuTriggerProps}\n skeletonRowCount={skeletonRowCount}\n emptyLabel={emptyLabel ?? t('itemTable.noItems', 'No items')}\n noResultsLabel={\n noResultsLabel ?? t('itemTable.noResults', 'No results found')\n }\n error={error}\n toolbar={toolbarNode}\n footer={footerNode}\n isFiltered={isFiltered ?? isSearching}\n sortMode={resolvedSortMode}\n sort={sort}\n onColumnSort={toggleSort}\n getRowProps={getRowProps}\n ariaLabel={ariaLabel}\n styles={rootStyles}\n headerStyles={headerStyles}\n headerCellStyles={headerCellStyles}\n headerPreset={headerPreset}\n bodyStyles={bodyStyles}\n rowStyles={rowStyles}\n cellStyles={cellStyles}\n mods={mods}\n overlay={bulkBarPlacement === 'floating' ? bulkBar : null}\n />\n );\n\n const rowByKeyForDrop = useMemo(() => {\n const map = new Map<string, T>();\n\n visibleRows.forEach((row, index) =>\n map.set(String(resolvedGetRowKey(row, index)), row),\n );\n\n return map;\n }, [visibleRows, resolvedGetRowKey]);\n\n const handleItemDrop = useEvent((targetKey: Key, draggedKeys: Key[]) => {\n if (!dropOnRow) return;\n\n const target = rowByKeyForDrop.get(String(targetKey));\n\n if (!target) return;\n\n const dragged = draggedKeys\n .map((key) => rowByKeyForDrop.get(String(key)))\n // A row cannot be dropped on itself.\n .filter((row): row is T => row !== undefined && row !== target);\n\n if (!dragged.length) return;\n if (dropOnRow.isAllowed && !dropOnRow.isAllowed(dragged, target)) return;\n\n void dropOnRow.onDrop(dragged, target);\n });\n\n const renderDragPreview = useEvent((keys: Key[]) => (\n <ItemTableDragPreview<T>\n rows={keys\n .map((key) => rowByKeyForDrop.get(String(key)))\n .filter((row): row is T => row !== undefined)}\n getItemDragInfo={getItemDragInfo!}\n />\n ));\n\n const shouldAcceptItemDrop = useEvent((targetKey: Key) => {\n const target = rowByKeyForDrop.get(String(targetKey));\n\n return target != null && (dropOnRow?.isTarget(target) ?? false);\n });\n\n // Dropping onto a row and reordering both need the drag machinery.\n const isDragEnabled = isReorderable || dropOnRow != null;\n\n const table = isDragEnabled ? (\n <DraggableCollection\n state={{\n collection: selection.collection,\n selectionManager: selection.selectionManager as any,\n disabledKeys: new Set(disabledKeys ?? []),\n }}\n // The element that directly contains the rows. React Aria's\n // `ListDropTargetDelegate` measures the drop position from this element's\n // children, so pointing it at the table root would leave every drop\n // unresolvable — the row lifts but never lands.\n listRef={bodyRef}\n orderedKeys={rowKeys}\n orientation=\"vertical\"\n onReorder={isReorderable ? handleReorder : undefined}\n onItemDrop={dropOnRow ? handleItemDrop : undefined}\n shouldAcceptItemDrop={dropOnRow ? shouldAcceptItemDrop : undefined}\n renderPreview={getItemDragInfo ? renderDragPreview : undefined}\n >\n {(dragState, dropState, collectionProps) =>\n renderTable(dragState, dropState, collectionProps)\n }\n </DraggableCollection>\n ) : (\n renderTable()\n );\n\n // The provider always wraps, so `ItemTable.Search` works from a custom\n // `toolbar` as well as from the built-in one.\n return (\n <ItemTableChromeProvider\n value={{\n searchValue,\n setSearchValue,\n searchPlaceholder,\n isLoading,\n onRefresh,\n selectedKeys: selection.selectedKeys,\n selectedRows: selection.selectedRows,\n selectedCount: selection.selectedCount,\n clearSelection: selection.clearSelection,\n }}\n >\n {table}\n </ItemTableChromeProvider>\n );\n}\n\nconst _ItemTable = Object.assign(\n forwardRef(ItemTable) as unknown as (<T = any>(\n props: CubeItemTableProps<T> & { ref?: ForwardedRef<HTMLDivElement> },\n ) => ReactElement) & { displayName?: string },\n {\n /** The table's search input, bound to the table's own state. */\n Search: ItemTableSearch,\n /** The default toolbar row, for rebuilding it around extra content. */\n Toolbar: ItemTableToolbar,\n /** The selection action bar, for placing it outside the default chrome. */\n BulkBar: ItemTableBulkBar,\n },\n);\n\n_ItemTable.displayName = 'ItemTable';\n\nexport { _ItemTable as ItemTable };\n"],"mappings":"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"}