@orcestr/ui 0.0.1

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 (309) hide show
  1. package/README.md +151 -0
  2. package/README.ru.md +151 -0
  3. package/assets/orcestr-banner.webp +0 -0
  4. package/dist/components/Action/ActionConfirmModal.d.ts +8 -0
  5. package/dist/components/Action/ActionConfirmModal.d.ts.map +1 -0
  6. package/dist/components/Action/ActionConfirmModal.js +13 -0
  7. package/dist/components/Action/ActionTypes.d.ts +47 -0
  8. package/dist/components/Action/ActionTypes.d.ts.map +1 -0
  9. package/dist/components/Action/ActionTypes.js +49 -0
  10. package/dist/components/ActionMenu/ActionMenu.d.ts +3 -0
  11. package/dist/components/ActionMenu/ActionMenu.d.ts.map +1 -0
  12. package/dist/components/ActionMenu/ActionMenu.js +1 -0
  13. package/dist/components/Alert/Alert.d.ts +11 -0
  14. package/dist/components/Alert/Alert.d.ts.map +1 -0
  15. package/dist/components/Alert/Alert.js +7 -0
  16. package/dist/components/AppShell/AppShell.d.ts +102 -0
  17. package/dist/components/AppShell/AppShell.d.ts.map +1 -0
  18. package/dist/components/AppShell/AppShell.js +96 -0
  19. package/dist/components/Badge/Badge.d.ts +15 -0
  20. package/dist/components/Badge/Badge.d.ts.map +1 -0
  21. package/dist/components/Badge/Badge.js +8 -0
  22. package/dist/components/Box/Box.d.ts +11 -0
  23. package/dist/components/Box/Box.d.ts.map +1 -0
  24. package/dist/components/Box/Box.js +8 -0
  25. package/dist/components/Button/Button.d.ts +27 -0
  26. package/dist/components/Button/Button.d.ts.map +1 -0
  27. package/dist/components/Button/Button.js +13 -0
  28. package/dist/components/Checkbox/Checkbox.d.ts +10 -0
  29. package/dist/components/Checkbox/Checkbox.d.ts.map +1 -0
  30. package/dist/components/Checkbox/Checkbox.js +15 -0
  31. package/dist/components/Collapse/Collapse.d.ts +11 -0
  32. package/dist/components/Collapse/Collapse.d.ts.map +1 -0
  33. package/dist/components/Collapse/Collapse.js +33 -0
  34. package/dist/components/Combobox/Combobox.d.ts +17 -0
  35. package/dist/components/Combobox/Combobox.d.ts.map +1 -0
  36. package/dist/components/Combobox/Combobox.js +32 -0
  37. package/dist/components/CommandPalette/CommandPalette.d.ts +21 -0
  38. package/dist/components/CommandPalette/CommandPalette.d.ts.map +1 -0
  39. package/dist/components/CommandPalette/CommandPalette.js +168 -0
  40. package/dist/components/ConfirmDialog/ConfirmDialog.d.ts +25 -0
  41. package/dist/components/ConfirmDialog/ConfirmDialog.d.ts.map +1 -0
  42. package/dist/components/ConfirmDialog/ConfirmDialog.js +25 -0
  43. package/dist/components/ContextMenu/ContextMenu.d.ts +11 -0
  44. package/dist/components/ContextMenu/ContextMenu.d.ts.map +1 -0
  45. package/dist/components/ContextMenu/ContextMenu.js +68 -0
  46. package/dist/components/DataTable/DataTable.d.ts +88 -0
  47. package/dist/components/DataTable/DataTable.d.ts.map +1 -0
  48. package/dist/components/DataTable/DataTable.js +415 -0
  49. package/dist/components/DataTable/DataTableStateAdapters.d.ts +41 -0
  50. package/dist/components/DataTable/DataTableStateAdapters.d.ts.map +1 -0
  51. package/dist/components/DataTable/DataTableStateAdapters.js +192 -0
  52. package/dist/components/DatePicker/DatePicker.d.ts +21 -0
  53. package/dist/components/DatePicker/DatePicker.d.ts.map +1 -0
  54. package/dist/components/DatePicker/DatePicker.js +39 -0
  55. package/dist/components/DatePicker/DatePickerState.d.ts +30 -0
  56. package/dist/components/DatePicker/DatePickerState.d.ts.map +1 -0
  57. package/dist/components/DatePicker/DatePickerState.js +106 -0
  58. package/dist/components/DateRangePicker/DateRangePicker.d.ts +19 -0
  59. package/dist/components/DateRangePicker/DateRangePicker.d.ts.map +1 -0
  60. package/dist/components/DateRangePicker/DateRangePicker.js +6 -0
  61. package/dist/components/DateRangePresetPicker/DateRangePresetPicker.d.ts +10 -0
  62. package/dist/components/DateRangePresetPicker/DateRangePresetPicker.d.ts.map +1 -0
  63. package/dist/components/DateRangePresetPicker/DateRangePresetPicker.js +26 -0
  64. package/dist/components/DateRangePresetPicker/DateRangePresetPickerState.d.ts +4 -0
  65. package/dist/components/DateRangePresetPicker/DateRangePresetPickerState.d.ts.map +1 -0
  66. package/dist/components/DateRangePresetPicker/DateRangePresetPickerState.js +20 -0
  67. package/dist/components/Dialog/Dialog.d.ts +2 -0
  68. package/dist/components/Dialog/Dialog.d.ts.map +1 -0
  69. package/dist/components/Dialog/Dialog.js +1 -0
  70. package/dist/components/Drawer/Drawer.d.ts +30 -0
  71. package/dist/components/Drawer/Drawer.d.ts.map +1 -0
  72. package/dist/components/Drawer/Drawer.js +83 -0
  73. package/dist/components/EntityPicker/EntityPicker.d.ts +41 -0
  74. package/dist/components/EntityPicker/EntityPicker.d.ts.map +1 -0
  75. package/dist/components/EntityPicker/EntityPicker.js +17 -0
  76. package/dist/components/Field/Field.d.ts +12 -0
  77. package/dist/components/Field/Field.d.ts.map +1 -0
  78. package/dist/components/Field/Field.js +8 -0
  79. package/dist/components/Flex/Flex.d.ts +9 -0
  80. package/dist/components/Flex/Flex.d.ts.map +1 -0
  81. package/dist/components/Flex/Flex.js +8 -0
  82. package/dist/components/Grid/Grid.d.ts +11 -0
  83. package/dist/components/Grid/Grid.d.ts.map +1 -0
  84. package/dist/components/Grid/Grid.js +12 -0
  85. package/dist/components/Highlight/Highlight.d.ts +27 -0
  86. package/dist/components/Highlight/Highlight.d.ts.map +1 -0
  87. package/dist/components/Highlight/Highlight.js +26 -0
  88. package/dist/components/IconButton/IconButton.d.ts +25 -0
  89. package/dist/components/IconButton/IconButton.d.ts.map +1 -0
  90. package/dist/components/IconButton/IconButton.js +13 -0
  91. package/dist/components/IconText/IconText.d.ts +12 -0
  92. package/dist/components/IconText/IconText.d.ts.map +1 -0
  93. package/dist/components/IconText/IconText.js +7 -0
  94. package/dist/components/Listbox/Listbox.d.ts +13 -0
  95. package/dist/components/Listbox/Listbox.d.ts.map +1 -0
  96. package/dist/components/Listbox/Listbox.js +74 -0
  97. package/dist/components/Menu/Menu.d.ts +14 -0
  98. package/dist/components/Menu/Menu.d.ts.map +1 -0
  99. package/dist/components/Menu/Menu.js +168 -0
  100. package/dist/components/Modal/Modal.d.ts +29 -0
  101. package/dist/components/Modal/Modal.d.ts.map +1 -0
  102. package/dist/components/Modal/Modal.js +155 -0
  103. package/dist/components/MultiSelect/MultiSelect.d.ts +21 -0
  104. package/dist/components/MultiSelect/MultiSelect.d.ts.map +1 -0
  105. package/dist/components/MultiSelect/MultiSelect.js +139 -0
  106. package/dist/components/NumberField/NumberField.d.ts +4 -0
  107. package/dist/components/NumberField/NumberField.d.ts.map +1 -0
  108. package/dist/components/NumberField/NumberField.js +6 -0
  109. package/dist/components/Overlay/OverlayProvider.d.ts +19 -0
  110. package/dist/components/Overlay/OverlayProvider.d.ts.map +1 -0
  111. package/dist/components/Overlay/OverlayProvider.js +73 -0
  112. package/dist/components/PaginatedCombobox/PaginatedCombobox.d.ts +48 -0
  113. package/dist/components/PaginatedCombobox/PaginatedCombobox.d.ts.map +1 -0
  114. package/dist/components/PaginatedCombobox/PaginatedCombobox.js +223 -0
  115. package/dist/components/PaginatedCombobox/PaginatedComboboxReactQueryAdapter.d.ts +13 -0
  116. package/dist/components/PaginatedCombobox/PaginatedComboboxReactQueryAdapter.d.ts.map +1 -0
  117. package/dist/components/PaginatedCombobox/PaginatedComboboxReactQueryAdapter.js +10 -0
  118. package/dist/components/Pagination/Pagination.d.ts +7 -0
  119. package/dist/components/Pagination/Pagination.d.ts.map +1 -0
  120. package/dist/components/Pagination/Pagination.js +9 -0
  121. package/dist/components/Popover/Popover.d.ts +19 -0
  122. package/dist/components/Popover/Popover.d.ts.map +1 -0
  123. package/dist/components/Popover/Popover.js +83 -0
  124. package/dist/components/Portal/Portal.d.ts +6 -0
  125. package/dist/components/Portal/Portal.d.ts.map +1 -0
  126. package/dist/components/Portal/Portal.js +23 -0
  127. package/dist/components/RadioGroup/RadioGroup.d.ts +14 -0
  128. package/dist/components/RadioGroup/RadioGroup.d.ts.map +1 -0
  129. package/dist/components/RadioGroup/RadioGroup.js +6 -0
  130. package/dist/components/ScrollArea/ScrollArea.d.ts +36 -0
  131. package/dist/components/ScrollArea/ScrollArea.d.ts.map +1 -0
  132. package/dist/components/ScrollArea/ScrollArea.js +124 -0
  133. package/dist/components/Section/Section.d.ts +14 -0
  134. package/dist/components/Section/Section.d.ts.map +1 -0
  135. package/dist/components/Section/Section.js +20 -0
  136. package/dist/components/SegmentedControl/SegmentedControl.d.ts +13 -0
  137. package/dist/components/SegmentedControl/SegmentedControl.d.ts.map +1 -0
  138. package/dist/components/SegmentedControl/SegmentedControl.js +6 -0
  139. package/dist/components/Select/Select.d.ts +27 -0
  140. package/dist/components/Select/Select.d.ts.map +1 -0
  141. package/dist/components/Select/Select.js +142 -0
  142. package/dist/components/Separator/Separator.d.ts +6 -0
  143. package/dist/components/Separator/Separator.d.ts.map +1 -0
  144. package/dist/components/Separator/Separator.js +5 -0
  145. package/dist/components/Skeleton/Skeleton.d.ts +9 -0
  146. package/dist/components/Skeleton/Skeleton.d.ts.map +1 -0
  147. package/dist/components/Skeleton/Skeleton.js +8 -0
  148. package/dist/components/Spinner/Spinner.d.ts +7 -0
  149. package/dist/components/Spinner/Spinner.d.ts.map +1 -0
  150. package/dist/components/Spinner/Spinner.js +5 -0
  151. package/dist/components/Stack/Stack.d.ts +9 -0
  152. package/dist/components/Stack/Stack.d.ts.map +1 -0
  153. package/dist/components/Stack/Stack.js +7 -0
  154. package/dist/components/State/State.d.ts +23 -0
  155. package/dist/components/State/State.d.ts.map +1 -0
  156. package/dist/components/State/State.js +30 -0
  157. package/dist/components/State/stateIcon.d.ts +3 -0
  158. package/dist/components/State/stateIcon.d.ts.map +1 -0
  159. package/dist/components/State/stateIcon.js +11 -0
  160. package/dist/components/StepperInput/StepperInput.d.ts +13 -0
  161. package/dist/components/StepperInput/StepperInput.d.ts.map +1 -0
  162. package/dist/components/StepperInput/StepperInput.js +22 -0
  163. package/dist/components/Switch/Switch.d.ts +10 -0
  164. package/dist/components/Switch/Switch.d.ts.map +1 -0
  165. package/dist/components/Switch/Switch.js +14 -0
  166. package/dist/components/Tabs/Tabs.d.ts +18 -0
  167. package/dist/components/Tabs/Tabs.d.ts.map +1 -0
  168. package/dist/components/Tabs/Tabs.js +104 -0
  169. package/dist/components/Text/Text.d.ts +13 -0
  170. package/dist/components/Text/Text.d.ts.map +1 -0
  171. package/dist/components/Text/Text.js +8 -0
  172. package/dist/components/TextArea/TextArea.d.ts +15 -0
  173. package/dist/components/TextArea/TextArea.d.ts.map +1 -0
  174. package/dist/components/TextArea/TextArea.js +17 -0
  175. package/dist/components/TextField/TextField.d.ts +25 -0
  176. package/dist/components/TextField/TextField.d.ts.map +1 -0
  177. package/dist/components/TextField/TextField.js +31 -0
  178. package/dist/components/Toast/Toast.d.ts +43 -0
  179. package/dist/components/Toast/Toast.d.ts.map +1 -0
  180. package/dist/components/Toast/Toast.js +205 -0
  181. package/dist/components/Tooltip/Tooltip.d.ts +10 -0
  182. package/dist/components/Tooltip/Tooltip.d.ts.map +1 -0
  183. package/dist/components/Tooltip/Tooltip.js +24 -0
  184. package/dist/components/VisuallyHidden/VisuallyHidden.d.ts +8 -0
  185. package/dist/components/VisuallyHidden/VisuallyHidden.d.ts.map +1 -0
  186. package/dist/components/VisuallyHidden/VisuallyHidden.js +6 -0
  187. package/dist/components/Workflow/Workflow.d.ts +82 -0
  188. package/dist/components/Workflow/Workflow.d.ts.map +1 -0
  189. package/dist/components/Workflow/Workflow.js +73 -0
  190. package/dist/example/CodePreview.d.ts +25 -0
  191. package/dist/example/CodePreview.d.ts.map +1 -0
  192. package/dist/example/CodePreview.js +93 -0
  193. package/dist/example/ExampleActionsSection.d.ts +10 -0
  194. package/dist/example/ExampleActionsSection.d.ts.map +1 -0
  195. package/dist/example/ExampleActionsSection.js +10 -0
  196. package/dist/example/ExampleBasicsSections.d.ts +8 -0
  197. package/dist/example/ExampleBasicsSections.d.ts.map +1 -0
  198. package/dist/example/ExampleBasicsSections.js +43 -0
  199. package/dist/example/ExampleDataSection.d.ts +7 -0
  200. package/dist/example/ExampleDataSection.d.ts.map +1 -0
  201. package/dist/example/ExampleDataSection.js +124 -0
  202. package/dist/example/ExampleFieldsSection.d.ts +17 -0
  203. package/dist/example/ExampleFieldsSection.d.ts.map +1 -0
  204. package/dist/example/ExampleFieldsSection.js +10 -0
  205. package/dist/example/ExampleFoundationsSection.d.ts +5 -0
  206. package/dist/example/ExampleFoundationsSection.d.ts.map +1 -0
  207. package/dist/example/ExampleFoundationsSection.js +25 -0
  208. package/dist/example/ExampleOverlays.d.ts +30 -0
  209. package/dist/example/ExampleOverlays.d.ts.map +1 -0
  210. package/dist/example/ExampleOverlays.js +12 -0
  211. package/dist/example/ExampleOverlaysSection.d.ts +14 -0
  212. package/dist/example/ExampleOverlaysSection.d.ts.map +1 -0
  213. package/dist/example/ExampleOverlaysSection.js +126 -0
  214. package/dist/example/ExampleSelectionSection.d.ts +30 -0
  215. package/dist/example/ExampleSelectionSection.d.ts.map +1 -0
  216. package/dist/example/ExampleSelectionSection.js +66 -0
  217. package/dist/example/ExampleStateSection.d.ts +8 -0
  218. package/dist/example/ExampleStateSection.d.ts.map +1 -0
  219. package/dist/example/ExampleStateSection.js +76 -0
  220. package/dist/example/ExampleThemePlayground.d.ts +417 -0
  221. package/dist/example/ExampleThemePlayground.d.ts.map +1 -0
  222. package/dist/example/ExampleThemePlayground.js +596 -0
  223. package/dist/example/UiExamplePage.d.ts +2 -0
  224. package/dist/example/UiExamplePage.d.ts.map +1 -0
  225. package/dist/example/UiExamplePage.js +315 -0
  226. package/dist/example/UiExampleSection.d.ts +8 -0
  227. package/dist/example/UiExampleSection.d.ts.map +1 -0
  228. package/dist/example/UiExampleSection.js +5 -0
  229. package/dist/example/codeSamples.d.ts +30 -0
  230. package/dist/example/codeSamples.d.ts.map +1 -0
  231. package/dist/example/codeSamples.js +976 -0
  232. package/dist/example/exampleData.d.ts +33 -0
  233. package/dist/example/exampleData.d.ts.map +1 -0
  234. package/dist/example/exampleData.js +217 -0
  235. package/dist/example/styles.css +1106 -0
  236. package/dist/hooks/useControllableState.d.ts +6 -0
  237. package/dist/hooks/useControllableState.d.ts.map +1 -0
  238. package/dist/hooks/useControllableState.js +16 -0
  239. package/dist/hooks/useDisclosure.d.ts +12 -0
  240. package/dist/hooks/useDisclosure.d.ts.map +1 -0
  241. package/dist/hooks/useDisclosure.js +14 -0
  242. package/dist/hooks/useEscapeKey.d.ts +2 -0
  243. package/dist/hooks/useEscapeKey.d.ts.map +1 -0
  244. package/dist/hooks/useEscapeKey.js +15 -0
  245. package/dist/hooks/useFloatingLayer.d.ts +19 -0
  246. package/dist/hooks/useFloatingLayer.d.ts.map +1 -0
  247. package/dist/hooks/useFloatingLayer.js +26 -0
  248. package/dist/hooks/useFloatingPosition.d.ts +17 -0
  249. package/dist/hooks/useFloatingPosition.d.ts.map +1 -0
  250. package/dist/hooks/useFloatingPosition.js +132 -0
  251. package/dist/hooks/useFocusTrap.d.ts +3 -0
  252. package/dist/hooks/useFocusTrap.d.ts.map +1 -0
  253. package/dist/hooks/useFocusTrap.js +54 -0
  254. package/dist/hooks/useListNavigation.d.ts +17 -0
  255. package/dist/hooks/useListNavigation.d.ts.map +1 -0
  256. package/dist/hooks/useListNavigation.js +44 -0
  257. package/dist/hooks/useOutsidePointerDown.d.ts +3 -0
  258. package/dist/hooks/useOutsidePointerDown.d.ts.map +1 -0
  259. package/dist/hooks/useOutsidePointerDown.js +20 -0
  260. package/dist/hooks/usePresence.d.ts +5 -0
  261. package/dist/hooks/usePresence.d.ts.map +1 -0
  262. package/dist/hooks/usePresence.js +35 -0
  263. package/dist/hooks/useTypeahead.d.ts +2 -0
  264. package/dist/hooks/useTypeahead.d.ts.map +1 -0
  265. package/dist/hooks/useTypeahead.js +23 -0
  266. package/dist/index.d.ts +64 -0
  267. package/dist/index.d.ts.map +1 -0
  268. package/dist/index.js +64 -0
  269. package/dist/locale/LocaleProvider.d.ts +89 -0
  270. package/dist/locale/LocaleProvider.d.ts.map +1 -0
  271. package/dist/locale/LocaleProvider.js +174 -0
  272. package/dist/provider/OrcestrUiProvider.d.ts +28 -0
  273. package/dist/provider/OrcestrUiProvider.d.ts.map +1 -0
  274. package/dist/provider/OrcestrUiProvider.js +9 -0
  275. package/dist/react-query.d.ts +2 -0
  276. package/dist/react-query.d.ts.map +1 -0
  277. package/dist/react-query.js +1 -0
  278. package/dist/styles/orcestr-ui.css +4676 -0
  279. package/dist/theme/ThemeProvider.d.ts +3 -0
  280. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  281. package/dist/theme/ThemeProvider.js +280 -0
  282. package/dist/theme/defaultTheme.d.ts +12 -0
  283. package/dist/theme/defaultTheme.d.ts.map +1 -0
  284. package/dist/theme/defaultTheme.js +516 -0
  285. package/dist/theme/systemProps.d.ts +53 -0
  286. package/dist/theme/systemProps.d.ts.map +1 -0
  287. package/dist/theme/systemProps.js +240 -0
  288. package/dist/theme/themeTypes.d.ts +197 -0
  289. package/dist/theme/themeTypes.d.ts.map +1 -0
  290. package/dist/theme/themeTypes.js +1 -0
  291. package/dist/theme/useTheme.d.ts +4 -0
  292. package/dist/theme/useTheme.d.ts.map +1 -0
  293. package/dist/theme/useTheme.js +10 -0
  294. package/dist/utils/cn.d.ts +2 -0
  295. package/dist/utils/cn.d.ts.map +1 -0
  296. package/dist/utils/cn.js +3 -0
  297. package/dist/utils/composeRefs.d.ts +3 -0
  298. package/dist/utils/composeRefs.d.ts.map +1 -0
  299. package/dist/utils/composeRefs.js +14 -0
  300. package/dist/utils/mergeProps.d.ts +4 -0
  301. package/dist/utils/mergeProps.d.ts.map +1 -0
  302. package/dist/utils/mergeProps.js +26 -0
  303. package/dist/utils/ownerDocument.d.ts +2 -0
  304. package/dist/utils/ownerDocument.d.ts.map +1 -0
  305. package/dist/utils/ownerDocument.js +3 -0
  306. package/dist/utils/polymorphic.d.ts +6 -0
  307. package/dist/utils/polymorphic.d.ts.map +1 -0
  308. package/dist/utils/polymorphic.js +1 -0
  309. package/package.json +78 -0
@@ -0,0 +1,68 @@
1
+ 'use client';
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { cloneElement, useCallback, useEffect, useRef, useState, } from 'react';
4
+ import { cn } from '../../utils/cn';
5
+ import { ActionConfirmModal } from '../Action/ActionConfirmModal';
6
+ import { isActionItemDisabled } from '../Action/ActionTypes';
7
+ import { useOverlayContext, useOverlayLayerIndex } from '../Overlay/OverlayProvider';
8
+ import { Portal } from '../Portal/Portal';
9
+ import { Spinner } from '../Spinner/Spinner';
10
+ export function ContextMenu({ children, items, className, testId, }) {
11
+ const overlay = useOverlayContext();
12
+ const [point, setPoint] = useState(null);
13
+ const [confirmItem, setConfirmItem] = useState(null);
14
+ const layerRef = useRef(null);
15
+ const close = useCallback(() => setPoint(null), []);
16
+ const layerIndex = useOverlayLayerIndex(point !== null);
17
+ useEffect(() => {
18
+ if (!point)
19
+ return;
20
+ const handlePointerDown = (event) => {
21
+ const target = event.target;
22
+ if (target instanceof Node && layerRef.current?.contains(target))
23
+ return;
24
+ close();
25
+ };
26
+ const handleKeyDown = (event) => {
27
+ if (event.key === 'Escape')
28
+ close();
29
+ };
30
+ document.addEventListener('pointerdown', handlePointerDown, true);
31
+ document.addEventListener('keydown', handleKeyDown, true);
32
+ return () => {
33
+ document.removeEventListener('pointerdown', handlePointerDown, true);
34
+ document.removeEventListener('keydown', handleKeyDown, true);
35
+ };
36
+ }, [close, point]);
37
+ const childProps = children.props;
38
+ const trigger = cloneElement(children, {
39
+ onContextMenu: (event) => {
40
+ childProps.onContextMenu?.(event);
41
+ if (event.defaultPrevented)
42
+ return;
43
+ event.preventDefault();
44
+ setPoint({ x: event.clientX, y: event.clientY });
45
+ },
46
+ });
47
+ return (_jsxs(_Fragment, { children: [trigger, point ? (_jsx(Portal, { children: _jsx("div", { ref: layerRef, className: cn('oui-popover-content oui-menu oui-action-menu-content oui-context-menu-content', className), "data-state": 'opening', "data-layer": 'dropdown', "data-testid": testId, style: {
48
+ left: point.x,
49
+ top: point.y,
50
+ zIndex: overlay.zIndex.dropdown + layerIndex * 10,
51
+ }, onClick: (event) => event.stopPropagation(), children: _jsx(ContextMenuContent, { items: items, close: close, requestConfirmation: setConfirmItem, testId: testId ? `${testId}-list` : undefined }) }) })) : null, _jsx(ActionConfirmModal, { item: confirmItem, open: confirmItem !== null, onCancel: () => setConfirmItem(null), onConfirm: () => {
52
+ confirmItem?.onSelect?.();
53
+ setConfirmItem(null);
54
+ } })] }));
55
+ }
56
+ function ContextMenuContent({ items, close, requestConfirmation, testId, }) {
57
+ return (_jsx("div", { className: 'oui-menu-list', role: 'menu', "data-testid": testId, children: items.map((item) => (_jsxs("div", { children: [item.separatorBefore ? _jsx("div", { className: 'oui-menu-separator' }) : null, _jsxs("button", { type: 'button', role: 'menuitem', className: 'oui-menu-item oui-combobox-option', "data-tone": item.tone, "data-selected": 'false', "data-loading": item.loading ? 'true' : undefined, "data-testid": testId ? `${testId}-${item.key}` : undefined, "aria-busy": item.loading ? 'true' : undefined, disabled: isActionItemDisabled(item) || Boolean(item.children?.length), onClick: () => {
58
+ if (isActionItemDisabled(item) || item.children?.length)
59
+ return;
60
+ if (item.confirm) {
61
+ close();
62
+ requestConfirmation(item);
63
+ return;
64
+ }
65
+ item.onSelect?.();
66
+ close();
67
+ }, children: [item.icon || item.loading ? (_jsx("span", { className: 'oui-menu-icon', children: item.loading ? _jsx(Spinner, { size: 1 }) : item.icon })) : null, _jsx("span", { className: 'oui-menu-label', children: item.label })] })] }, item.key))) }));
68
+ }
@@ -0,0 +1,88 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { OrcestrActionItem } from '../Action/ActionTypes';
3
+ export type DataTableSortDirection = 'asc' | 'desc';
4
+ export type DataTableSort = {
5
+ key: string;
6
+ direction: DataTableSortDirection;
7
+ };
8
+ export type DataTableColumn<T> = {
9
+ key: string;
10
+ title: ReactNode;
11
+ render: (row: T) => ReactNode;
12
+ width?: number | string;
13
+ minWidth?: number;
14
+ maxWidth?: number;
15
+ align?: 'left' | 'center' | 'right';
16
+ sortable?: boolean;
17
+ resizable?: boolean;
18
+ hideable?: boolean;
19
+ defaultVisible?: boolean;
20
+ pinned?: 'left' | 'right';
21
+ };
22
+ export type DataTableColumnSettings<T> = {
23
+ columns?: ReadonlyArray<DataTableColumn<T>>;
24
+ visibleColumnKeys: ReadonlyArray<string>;
25
+ onVisibleColumnKeysChange: (keys: string[]) => void;
26
+ columnWidths?: Record<string, number>;
27
+ onColumnWidthsChange?: (widths: Record<string, number>) => void;
28
+ columnOrder?: ReadonlyArray<string>;
29
+ onColumnOrderChange?: (keys: string[]) => void;
30
+ onReset?: () => void;
31
+ label?: ReactNode;
32
+ resetLabel?: ReactNode;
33
+ emptyLabel?: ReactNode;
34
+ };
35
+ export type DataTableRowAction<T> = OrcestrActionItem<T>;
36
+ export type DataTableRowGroup<T> = {
37
+ key: string;
38
+ label: ReactNode;
39
+ rows?: ReadonlyArray<T>;
40
+ };
41
+ export type DataTableExpansion<T> = {
42
+ expandedRowKeys: ReadonlyArray<string>;
43
+ onExpandedRowKeysChange: (keys: string[]) => void;
44
+ renderExpandedRow: (row: T) => ReactNode;
45
+ expandLabel?: string;
46
+ collapseLabel?: string;
47
+ };
48
+ export type DataTableProps<T> = {
49
+ rows: ReadonlyArray<T>;
50
+ columns: ReadonlyArray<DataTableColumn<T>>;
51
+ rowKey?: (row: T, index: number) => string;
52
+ sort?: DataTableSort | ReadonlyArray<DataTableSort> | null;
53
+ onSortChange?: (sort: DataTableSort | DataTableSort[] | null) => void;
54
+ selectedRowKeys?: ReadonlyArray<string>;
55
+ onSelectedRowKeysChange?: (keys: string[]) => void;
56
+ selectable?: boolean;
57
+ isLoading?: boolean;
58
+ isFetchingNext?: boolean;
59
+ hasNext?: boolean;
60
+ sentinelRef?: (node: HTMLTableRowElement | null) => void;
61
+ scrollRootRef?: (node: HTMLDivElement | null) => void;
62
+ emptyText?: ReactNode;
63
+ loadingText?: ReactNode;
64
+ error?: ReactNode;
65
+ errorTitle?: ReactNode;
66
+ retryLabel?: ReactNode;
67
+ onRetry?: () => void;
68
+ onRowClick?: (row: T) => void;
69
+ rowContextMenuActions?: (row: T) => ReadonlyArray<DataTableRowAction<T>>;
70
+ rowGroup?: (row: T) => DataTableRowGroup<T> | null;
71
+ expansion?: DataTableExpansion<T>;
72
+ height?: number | string;
73
+ total?: number;
74
+ toolbar?: ReactNode;
75
+ columnSettings?: DataTableColumnSettings<T>;
76
+ virtualized?: boolean;
77
+ virtualRowHeight?: number;
78
+ virtualOverscan?: number;
79
+ virtualWindow?: {
80
+ start: number;
81
+ end: number;
82
+ beforeHeight?: number;
83
+ afterHeight?: number;
84
+ };
85
+ testId?: string;
86
+ };
87
+ export declare function DataTable<T>({ rows, columns, rowKey, sort, onSortChange, selectedRowKeys, onSelectedRowKeysChange, selectable, isLoading, isFetchingNext, hasNext, sentinelRef, scrollRootRef, emptyText, loadingText, error, errorTitle, retryLabel, onRetry, onRowClick, rowContextMenuActions, rowGroup, expansion, height, total, toolbar, columnSettings, virtualized, virtualRowHeight, virtualOverscan, virtualWindow, testId, }: DataTableProps<T>): import("react/jsx-runtime").JSX.Element;
88
+ //# sourceMappingURL=DataTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/DataTable.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,415 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { Fragment, useCallback, useEffect, useMemo, useRef, useState, } from 'react';
4
+ import { LuArrowDown, LuArrowUp, LuChevronDown, LuChevronRight, LuRefreshCw, LuRotateCcw, LuSettings2, } from 'react-icons/lu';
5
+ import { useOrcestrUiLocale } from '../../locale/LocaleProvider';
6
+ import { Button } from '../Button/Button';
7
+ import { Checkbox } from '../Checkbox/Checkbox';
8
+ import { ContextMenu } from '../ContextMenu/ContextMenu';
9
+ import { IconButton } from '../IconButton/IconButton';
10
+ import { Popover } from '../Popover/Popover';
11
+ import { Spinner } from '../Spinner/Spinner';
12
+ import { Text } from '../Text/Text';
13
+ export function DataTable({ rows, columns, rowKey, sort, onSortChange, selectedRowKeys = [], onSelectedRowKeysChange, selectable = false, isLoading = false, isFetchingNext = false, hasNext = false, sentinelRef, scrollRootRef, emptyText, loadingText, error, errorTitle, retryLabel, onRetry, onRowClick, rowContextMenuActions, rowGroup, expansion, height, total, toolbar, columnSettings, virtualized = false, virtualRowHeight = 44, virtualOverscan = 8, virtualWindow, testId, }) {
14
+ const { copy } = useOrcestrUiLocale();
15
+ const [columnWidths, setColumnWidths] = useState({});
16
+ const actualColumnWidths = columnSettings?.columnWidths ?? columnWidths;
17
+ const [resizingColumnKey, setResizingColumnKey] = useState(null);
18
+ const [scrollState, setScrollState] = useState({ top: 0, height: 0 });
19
+ const [activeRowIndex, setActiveRowIndex] = useState(null);
20
+ const horizontalScrollAnimationRef = useRef(null);
21
+ const horizontalScrollTargetRef = useRef(null);
22
+ const sortItems = normalizeSort(sort);
23
+ const settingsColumns = columnSettings?.columns ?? columns;
24
+ const visibleColumns = useMemo(() => orderColumns(columns.filter((column) => columnVisible(column, columnSettings)), columnSettings?.columnOrder), [columnSettings, columns]);
25
+ const keyedRows = useMemo(() => rows.map((row, index) => ({
26
+ row,
27
+ key: rowKey?.(row, index) ?? String(index),
28
+ })), [rowKey, rows]);
29
+ const internalVirtualWindow = useMemo(() => {
30
+ if (!virtualized || virtualWindow || scrollState.height <= 0)
31
+ return null;
32
+ const start = Math.max(0, Math.floor(scrollState.top / virtualRowHeight) - virtualOverscan);
33
+ const visibleCount = Math.ceil(scrollState.height / virtualRowHeight) + virtualOverscan * 2;
34
+ const end = Math.min(keyedRows.length, start + visibleCount);
35
+ return {
36
+ start,
37
+ end,
38
+ beforeHeight: start * virtualRowHeight,
39
+ afterHeight: Math.max(0, keyedRows.length - end) * virtualRowHeight,
40
+ };
41
+ }, [
42
+ keyedRows.length,
43
+ scrollState.height,
44
+ scrollState.top,
45
+ virtualized,
46
+ virtualOverscan,
47
+ virtualRowHeight,
48
+ virtualWindow,
49
+ ]);
50
+ const actualVirtualWindow = virtualWindow ?? internalVirtualWindow;
51
+ const renderedRows = useMemo(() => {
52
+ if (!virtualized || !actualVirtualWindow)
53
+ return keyedRows;
54
+ return keyedRows.slice(actualVirtualWindow.start, actualVirtualWindow.end);
55
+ }, [actualVirtualWindow, keyedRows, virtualized]);
56
+ const selectedSet = useMemo(() => new Set(selectedRowKeys), [selectedRowKeys]);
57
+ const expandedSet = useMemo(() => new Set(expansion?.expandedRowKeys ?? []), [expansion?.expandedRowKeys]);
58
+ const visibleKeys = renderedRows.map((item) => item.key);
59
+ const selectedVisibleCount = visibleKeys.filter((key) => selectedSet.has(key)).length;
60
+ const allVisibleSelected = visibleKeys.length > 0 && selectedVisibleCount === visibleKeys.length;
61
+ const someVisibleSelected = selectedVisibleCount > 0 && !allVisibleSelected;
62
+ const colSpan = visibleColumns.length + (selectable ? 1 : 0) + (expansion ? 1 : 0);
63
+ const pinnedLeftOffset = (selectable ? 42 : 0) + (expansion ? 34 : 0);
64
+ const tableMinWidth = useMemo(() => tableMinimumWidth({
65
+ columns: visibleColumns,
66
+ columnWidths: actualColumnWidths,
67
+ selectable,
68
+ expandable: Boolean(expansion),
69
+ }), [actualColumnWidths, expansion, selectable, visibleColumns]);
70
+ const attachScrollRoot = useCallback((node) => {
71
+ scrollRootRef?.(node);
72
+ if (!node)
73
+ return;
74
+ setScrollState({
75
+ top: node.scrollTop,
76
+ height: node.clientHeight,
77
+ });
78
+ }, [scrollRootRef]);
79
+ const handleScroll = useCallback((event) => {
80
+ const node = event.currentTarget;
81
+ setScrollState({
82
+ top: node.scrollTop,
83
+ height: node.clientHeight,
84
+ });
85
+ }, []);
86
+ const cancelHorizontalScrollAnimation = useCallback(() => {
87
+ horizontalScrollTargetRef.current = null;
88
+ if (horizontalScrollAnimationRef.current !== null) {
89
+ window.cancelAnimationFrame(horizontalScrollAnimationRef.current);
90
+ horizontalScrollAnimationRef.current = null;
91
+ }
92
+ }, []);
93
+ const animateHorizontalScroll = useCallback((node) => {
94
+ if (horizontalScrollAnimationRef.current !== null)
95
+ return;
96
+ const tick = () => {
97
+ const target = horizontalScrollTargetRef.current;
98
+ if (target === null) {
99
+ horizontalScrollAnimationRef.current = null;
100
+ return;
101
+ }
102
+ const distance = target - node.scrollLeft;
103
+ if (Math.abs(distance) < 0.5) {
104
+ node.scrollLeft = target;
105
+ horizontalScrollAnimationRef.current = null;
106
+ horizontalScrollTargetRef.current = null;
107
+ return;
108
+ }
109
+ node.scrollLeft += distance * 0.24;
110
+ horizontalScrollAnimationRef.current = window.requestAnimationFrame(tick);
111
+ };
112
+ horizontalScrollAnimationRef.current = window.requestAnimationFrame(tick);
113
+ }, []);
114
+ const handleWheel = useCallback((event) => {
115
+ if (!event.shiftKey || Math.abs(event.deltaY) <= Math.abs(event.deltaX))
116
+ return;
117
+ const node = event.currentTarget;
118
+ if (node.scrollWidth <= node.clientWidth)
119
+ return;
120
+ event.preventDefault();
121
+ const currentTarget = horizontalScrollTargetRef.current ?? node.scrollLeft;
122
+ const maxScroll = Math.max(0, node.scrollWidth - node.clientWidth);
123
+ horizontalScrollTargetRef.current = clamp(currentTarget + normalizeWheelDelta(event, node), 0, maxScroll);
124
+ animateHorizontalScroll(node);
125
+ }, [animateHorizontalScroll]);
126
+ useEffect(() => {
127
+ if (!resizingColumnKey || typeof document === 'undefined')
128
+ return;
129
+ const previousCursor = document.body.style.cursor;
130
+ const previousUserSelect = document.body.style.userSelect;
131
+ document.body.style.cursor = 'col-resize';
132
+ document.body.style.userSelect = 'none';
133
+ return () => {
134
+ document.body.style.cursor = previousCursor;
135
+ document.body.style.userSelect = previousUserSelect;
136
+ };
137
+ }, [resizingColumnKey]);
138
+ useEffect(() => () => cancelHorizontalScrollAnimation(), [cancelHorizontalScrollAnimation]);
139
+ const setSelectedKeys = (keys) => {
140
+ onSelectedRowKeysChange?.(keys);
141
+ };
142
+ const toggleAllVisible = () => {
143
+ if (!onSelectedRowKeysChange)
144
+ return;
145
+ if (allVisibleSelected) {
146
+ setSelectedKeys(selectedRowKeys.filter((key) => !visibleKeys.includes(key)));
147
+ return;
148
+ }
149
+ setSelectedKeys(Array.from(new Set([...selectedRowKeys, ...visibleKeys])));
150
+ };
151
+ const toggleRow = (key) => {
152
+ if (!onSelectedRowKeysChange)
153
+ return;
154
+ if (selectedSet.has(key)) {
155
+ setSelectedKeys(selectedRowKeys.filter((item) => item !== key));
156
+ return;
157
+ }
158
+ setSelectedKeys([...selectedRowKeys, key]);
159
+ };
160
+ const toggleExpandedRow = (key) => {
161
+ if (!expansion)
162
+ return;
163
+ if (expandedSet.has(key)) {
164
+ expansion.onExpandedRowKeysChange(expansion.expandedRowKeys.filter((item) => item !== key));
165
+ return;
166
+ }
167
+ expansion.onExpandedRowKeysChange([...expansion.expandedRowKeys, key]);
168
+ };
169
+ const toggleSort = (column, event) => {
170
+ if (!column.sortable || !onSortChange)
171
+ return;
172
+ const existing = sortItems.find((item) => item.key === column.key);
173
+ const nextForColumn = !existing
174
+ ? { key: column.key, direction: 'asc' }
175
+ : existing.direction === 'asc'
176
+ ? { key: column.key, direction: 'desc' }
177
+ : null;
178
+ const keepOthers = event?.shiftKey ? sortItems.filter((item) => item.key !== column.key) : [];
179
+ const next = nextForColumn ? [...keepOthers, nextForColumn] : keepOthers;
180
+ onSortChange(next.length === 0 ? null : event?.shiftKey ? next : next[0]);
181
+ };
182
+ const startResize = (column, event) => {
183
+ event.preventDefault();
184
+ event.stopPropagation();
185
+ const startX = event.clientX;
186
+ const headerCell = event.currentTarget.closest('th');
187
+ const measuredWidth = Math.round(headerCell?.getBoundingClientRect().width ?? 0);
188
+ const startWidth = actualColumnWidths[column.key] ??
189
+ (measuredWidth > 0 ? measuredWidth : undefined) ??
190
+ numericWidth(column.width) ??
191
+ column.minWidth ??
192
+ 160;
193
+ setResizingColumnKey(column.key);
194
+ const onMove = (moveEvent) => {
195
+ const next = clamp(Math.round(startWidth + moveEvent.clientX - startX), column.minWidth ?? 72, column.maxWidth ?? 720);
196
+ if (columnSettings?.onColumnWidthsChange) {
197
+ columnSettings.onColumnWidthsChange({
198
+ ...actualColumnWidths,
199
+ [column.key]: next,
200
+ });
201
+ return;
202
+ }
203
+ setColumnWidths((current) => ({ ...current, [column.key]: next }));
204
+ };
205
+ const onUp = () => {
206
+ setResizingColumnKey(null);
207
+ window.removeEventListener('pointermove', onMove);
208
+ window.removeEventListener('pointerup', onUp);
209
+ };
210
+ window.addEventListener('pointermove', onMove);
211
+ window.addEventListener('pointerup', onUp);
212
+ };
213
+ const handleKeyDown = (event) => {
214
+ if (renderedRows.length === 0)
215
+ return;
216
+ if (event.key === 'ArrowDown') {
217
+ event.preventDefault();
218
+ setActiveRowIndex((current) => Math.min(renderedRows.length - 1, (current ?? -1) + 1));
219
+ }
220
+ else if (event.key === 'ArrowUp') {
221
+ event.preventDefault();
222
+ setActiveRowIndex((current) => Math.max(0, (current ?? renderedRows.length) - 1));
223
+ }
224
+ else if (event.key === 'Enter') {
225
+ if (activeRowIndex == null)
226
+ return;
227
+ const item = renderedRows[activeRowIndex];
228
+ if (item)
229
+ onRowClick?.(item.row);
230
+ }
231
+ else if (event.key === ' ' && selectable) {
232
+ if (activeRowIndex == null)
233
+ return;
234
+ const item = renderedRows[activeRowIndex];
235
+ if (item) {
236
+ event.preventDefault();
237
+ toggleRow(item.key);
238
+ }
239
+ }
240
+ else if (event.key === 'ArrowRight' && expansion) {
241
+ if (activeRowIndex == null)
242
+ return;
243
+ const item = renderedRows[activeRowIndex];
244
+ if (item && !expandedSet.has(item.key))
245
+ toggleExpandedRow(item.key);
246
+ }
247
+ else if (event.key === 'ArrowLeft' && expansion) {
248
+ if (activeRowIndex == null)
249
+ return;
250
+ const item = renderedRows[activeRowIndex];
251
+ if (item && expandedSet.has(item.key))
252
+ toggleExpandedRow(item.key);
253
+ }
254
+ };
255
+ return (_jsxs("div", { className: 'oui-data-table-shell', "data-testid": testId ? `${testId}-shell` : undefined, children: [toolbar || columnSettings ? (_jsxs("div", { className: 'oui-data-table-toolbar', children: [toolbar ? (_jsx("div", { className: 'oui-data-table-toolbar-content', children: toolbar })) : null, columnSettings ? (_jsx(ColumnSettingsPanel, { columns: settingsColumns, visibleColumnKeys: columnSettings.visibleColumnKeys, columnOrder: columnSettings.columnOrder, label: columnSettings.label ?? copy.table.columnSettings, resetLabel: columnSettings.resetLabel ?? copy.common.reset, emptyLabel: columnSettings.emptyLabel ?? copy.common.noData, onVisibleColumnKeysChange: columnSettings.onVisibleColumnKeysChange, onColumnOrderChange: columnSettings.onColumnOrderChange, onReset: columnSettings.onReset, testId: testId ? `${testId}-columns` : undefined })) : null] })) : null, _jsx("div", { ref: attachScrollRoot, className: 'oui-data-table-wrap', style: { height }, role: 'grid', tabIndex: 0, "data-testid": testId, onScroll: virtualized ? handleScroll : undefined, onWheel: handleWheel, onPointerDown: cancelHorizontalScrollAnimation, onMouseDown: cancelHorizontalScrollAnimation, onKeyDown: handleKeyDown, children: _jsxs("table", { className: 'oui-data-table', "aria-rowcount": total ?? rows.length, style: {
256
+ minWidth: tableMinWidth ? `${tableMinWidth}px` : undefined,
257
+ '--oui-data-table-select-left-offset': expansion ? '34px' : '0px',
258
+ '--oui-data-table-pinned-left-offset': `${pinnedLeftOffset}px`,
259
+ }, children: [_jsxs("colgroup", { children: [expansion ? _jsx("col", { style: { width: 34 } }) : null, selectable ? _jsx("col", { style: { width: 42 } }) : null, visibleColumns.map((column) => (_jsx("col", { style: {
260
+ width: formatCssSize(actualColumnWidths[column.key] ?? column.width),
261
+ minWidth: formatCssSize(column.minWidth),
262
+ maxWidth: formatCssSize(column.maxWidth),
263
+ } }, column.key)))] }), _jsx("thead", { children: _jsxs("tr", { children: [expansion ? (_jsx("th", { className: 'oui-data-table-expand-cell', role: 'columnheader', "aria-hidden": 'true' })) : null, selectable ? (_jsx("th", { className: 'oui-data-table-select-cell', role: 'columnheader', scope: 'col', children: _jsx("span", { className: 'oui-data-table-select-control', children: _jsx(Checkbox, { "aria-label": copy.table.selectAllRows, checked: allVisibleSelected, ref: (node) => {
264
+ if (node)
265
+ node.indeterminate = someVisibleSelected;
266
+ }, disabled: !onSelectedRowKeysChange || visibleKeys.length === 0, onChange: toggleAllVisible }) }) })) : null, visibleColumns.map((column) => {
267
+ const activeSort = sortItems.find((item) => item.key === column.key) ?? null;
268
+ return (_jsx("th", { role: 'columnheader', scope: 'col', "data-pinned": column.pinned, "data-resizing": resizingColumnKey === column.key ? 'true' : undefined, style: {
269
+ width: formatCssSize(actualColumnWidths[column.key] ?? column.width),
270
+ minWidth: formatCssSize(column.minWidth),
271
+ maxWidth: formatCssSize(column.maxWidth),
272
+ textAlign: column.align,
273
+ }, children: _jsxs("span", { className: 'oui-data-table-header-cell', children: [column.sortable ? (_jsxs("button", { type: 'button', className: 'oui-data-table-sort', "data-active": activeSort ? 'true' : undefined, onClick: (event) => toggleSort(column, event), children: [_jsx("span", { className: 'oui-data-table-sort-label', children: column.title }), activeSort?.direction === 'asc' ? (_jsx(LuArrowUp, { size: 13 })) : activeSort?.direction === 'desc' ? (_jsx(LuArrowDown, { size: 13 })) : (_jsx("span", { className: 'oui-data-table-sort-placeholder' }))] })) : (column.title), column.resizable ? (_jsx("span", { role: 'separator', "aria-orientation": 'vertical', tabIndex: 0, className: 'oui-data-table-resize', "aria-label": copy.common.resizeColumn, onPointerDown: (event) => startResize(column, event) })) : null] }) }, column.key));
274
+ })] }) }), _jsx("tbody", { children: error ? (_jsxs(DataTableMessageRow, { colSpan: colSpan, children: [_jsx(Text, { fw: 700, children: errorTitle ?? copy.table.unableToLoad }), _jsx(Text, { fs: '12px', tone: 'muted', children: error }), onRetry ? (_jsx(Button, { size: 1, v: 'surface', leftIcon: _jsx(LuRefreshCw, { size: 14 }), onClick: onRetry, children: retryLabel ?? copy.common.retry })) : null] })) : isLoading ? (_jsxs(DataTableMessageRow, { colSpan: colSpan, children: [_jsx(Spinner, {}), _jsx(Text, { fs: '12px', tone: 'muted', children: loadingText ?? copy.table.loadingRows })] })) : renderedRows.length === 0 ? (_jsx(DataTableMessageRow, { colSpan: colSpan, children: _jsx(Text, { fs: '12px', tone: 'muted', children: emptyText ?? copy.common.noData }) })) : (_jsxs(_Fragment, { children: [virtualized && actualVirtualWindow?.beforeHeight ? (_jsx("tr", { role: 'row', "aria-hidden": 'true', children: _jsx("td", { colSpan: colSpan, style: { height: actualVirtualWindow.beforeHeight, padding: 0 } }) })) : null, renderGroupedRows({
275
+ activeRowIndex,
276
+ colSpan,
277
+ columns: visibleColumns,
278
+ copy,
279
+ expandedSet,
280
+ expansion,
281
+ renderedRows,
282
+ rowContextMenuActions,
283
+ rowGroup,
284
+ onRowClick,
285
+ onSelectToggle: toggleRow,
286
+ onExpandToggle: toggleExpandedRow,
287
+ selectable,
288
+ selectedSet,
289
+ canSelect: Boolean(onSelectedRowKeysChange),
290
+ }), virtualized && actualVirtualWindow?.afterHeight ? (_jsx("tr", { role: 'row', "aria-hidden": 'true', children: _jsx("td", { colSpan: colSpan, style: { height: actualVirtualWindow.afterHeight, padding: 0 } }) })) : null, hasNext ? (_jsx("tr", { ref: sentinelRef, role: 'row', "aria-hidden": 'true', children: _jsx("td", { colSpan: colSpan, children: _jsx("div", { className: 'oui-data-table-next-loader', children: isFetchingNext ? _jsx(Spinner, { size: 1 }) : null }) }) })) : null] })) })] }) })] }));
291
+ }
292
+ function ColumnSettingsPanel({ columns, visibleColumnKeys, columnOrder, label, resetLabel, emptyLabel, onVisibleColumnKeysChange, onColumnOrderChange, onReset, testId, }) {
293
+ const configurableColumns = orderColumns(columns.filter((column) => column.hideable !== false), columnOrder);
294
+ const visibleSet = new Set(visibleColumnKeys);
295
+ const orderedKeys = configurableColumns.map((column) => column.key);
296
+ const selectedCount = orderedKeys.filter((key) => visibleSet.has(key)).length;
297
+ const toggleColumn = (key) => {
298
+ if (visibleSet.has(key)) {
299
+ if (selectedCount <= 1)
300
+ return;
301
+ onVisibleColumnKeysChange(visibleColumnKeys.filter((item) => item !== key));
302
+ return;
303
+ }
304
+ onVisibleColumnKeysChange([...visibleColumnKeys, key]);
305
+ };
306
+ const moveColumn = (key, direction) => {
307
+ if (!onColumnOrderChange)
308
+ return;
309
+ const current = columnOrder?.length ? [...columnOrder] : columns.map((column) => column.key);
310
+ const index = current.indexOf(key);
311
+ const nextIndex = index + direction;
312
+ if (index < 0 || nextIndex < 0 || nextIndex >= current.length)
313
+ return;
314
+ const next = [...current];
315
+ [next[index], next[nextIndex]] = [next[nextIndex], next[index]];
316
+ onColumnOrderChange(next);
317
+ };
318
+ return (_jsxs(Popover, { trigger: (_jsx(IconButton, { v: 'surface', icon: _jsx(LuSettings2, { size: 16 }), "aria-label": typeof label === 'string' ? label : undefined, testId: testId })), align: 'end', className: 'oui-data-table-column-settings', testId: testId ? `${testId}-popover` : undefined, children: [_jsxs("div", { className: 'oui-data-table-column-settings-head', children: [_jsx(Text, { fs: '13px', fw: 760, children: label }), onReset ? (_jsx(Button, { className: 'oui-data-table-settings-reset', size: 1, v: 'ghost', leftIcon: _jsx(LuRotateCcw, { size: 13 }), onClick: onReset, children: resetLabel })) : null] }), _jsx("div", { className: 'oui-data-table-column-settings-list', children: configurableColumns.length === 0 ? (_jsx(Text, { fs: '12px', tone: 'muted', children: emptyLabel })) : configurableColumns.map((column, index) => {
319
+ const visible = visibleSet.has(column.key);
320
+ return (_jsxs("div", { className: 'oui-data-table-column-settings-row', children: [_jsxs("label", { className: 'oui-data-table-column-toggle', children: [_jsx(Checkbox, { checked: visible, disabled: visible && selectedCount <= 1, onChange: () => toggleColumn(column.key) }), _jsx("span", { children: column.title })] }), onColumnOrderChange ? (_jsxs("span", { className: 'oui-data-table-column-settings-order', children: [_jsx("button", { type: 'button', disabled: index === 0, onClick: () => moveColumn(column.key, -1), children: _jsx(LuArrowUp, { size: 13 }) }), _jsx("button", { type: 'button', disabled: index === configurableColumns.length - 1, onClick: () => moveColumn(column.key, 1), children: _jsx(LuArrowDown, { size: 13 }) })] })) : null] }, column.key));
321
+ }) })] }));
322
+ }
323
+ function DataTableRow({ row, columns, active, expanded, expansion, selected, selectable, canSelect, onToggle, onExpandToggle, onRowClick, actions, selectLabel, }) {
324
+ const rowNode = (_jsxs("tr", { role: 'row', "data-selected": selected ? 'true' : undefined, "data-active": active ? 'true' : undefined, "data-clickable": onRowClick ? 'true' : undefined, onClick: () => onRowClick?.(row), children: [expansion ? (_jsx("td", { className: 'oui-data-table-expand-cell', role: 'gridcell', children: _jsx("button", { type: 'button', className: 'oui-data-table-expand', "aria-label": expanded ? expansion.collapseLabel : expansion.expandLabel, "aria-expanded": expanded, onClick: (event) => {
325
+ event.stopPropagation();
326
+ onExpandToggle();
327
+ }, children: expanded ? _jsx(LuChevronDown, { size: 14 }) : _jsx(LuChevronRight, { size: 14 }) }) })) : null, selectable ? (_jsx("td", { className: 'oui-data-table-select-cell', role: 'gridcell', children: _jsx("span", { className: 'oui-data-table-select-control', children: _jsx(Checkbox, { "aria-label": selectLabel, checked: selected, disabled: !canSelect, onClick: (event) => event.stopPropagation(), onChange: onToggle }) }) })) : null, columns.map((column) => (_jsx("td", { role: 'gridcell', "data-pinned": column.pinned, style: { textAlign: column.align }, children: column.render(row) }, column.key)))] }));
328
+ if (actions.length === 0)
329
+ return rowNode;
330
+ const menuItems = actions.map(({ children: _children, onSelect, ...action }) => ({
331
+ ...action,
332
+ onSelect: () => onSelect?.(row),
333
+ }));
334
+ return (_jsx(ContextMenu, { items: menuItems, children: rowNode }));
335
+ }
336
+ function renderGroupedRows({ activeRowIndex, colSpan, columns, copy, expandedSet, expansion, renderedRows, rowContextMenuActions, rowGroup, onRowClick, onSelectToggle, onExpandToggle, selectable, selectedSet, canSelect, }) {
337
+ let previousGroupKey = null;
338
+ return renderedRows.map(({ row, key }, index) => {
339
+ const group = rowGroup?.(row) ?? null;
340
+ const showGroup = group && group.key !== previousGroupKey;
341
+ if (group)
342
+ previousGroupKey = group.key;
343
+ const expanded = expandedSet.has(key);
344
+ return (_jsxs(Fragment, { children: [showGroup ? (_jsx("tr", { className: 'oui-data-table-group-row', role: 'row', children: _jsx("td", { role: 'gridcell', colSpan: colSpan, children: group.label }) })) : null, _jsx(DataTableRow, { row: row, columns: columns, active: index === activeRowIndex, expanded: expanded, expansion: expansion
345
+ ? {
346
+ ...expansion,
347
+ expandLabel: expansion.expandLabel ?? copy.table.expandRow,
348
+ collapseLabel: expansion.collapseLabel ?? copy.table.collapseRow,
349
+ }
350
+ : undefined, selected: selectedSet.has(key), selectable: selectable, canSelect: canSelect, onToggle: () => onSelectToggle(key), onExpandToggle: () => onExpandToggle(key), onRowClick: onRowClick, actions: rowContextMenuActions?.(row) ?? [], selectLabel: copy.table.selectRow }), expanded && expansion ? (_jsx("tr", { className: 'oui-data-table-expanded-row', role: 'row', children: _jsx("td", { role: 'gridcell', colSpan: colSpan, children: expansion.renderExpandedRow(row) }) })) : null] }, key));
351
+ });
352
+ }
353
+ function DataTableMessageRow({ colSpan, children, }) {
354
+ return (_jsx("tr", { role: 'row', children: _jsx("td", { role: 'gridcell', colSpan: colSpan, children: _jsx("div", { className: 'oui-data-table-message', children: children }) }) }));
355
+ }
356
+ function normalizeSort(sort) {
357
+ if (!sort)
358
+ return [];
359
+ return Array.isArray(sort) ? [...sort] : [sort];
360
+ }
361
+ function columnVisible(column, settings) {
362
+ if (!settings)
363
+ return column.defaultVisible !== false;
364
+ return settings.visibleColumnKeys.includes(column.key);
365
+ }
366
+ function orderColumns(columns, order) {
367
+ const ordered = order
368
+ ? [...columns].sort((left, right) => {
369
+ const leftIndex = order.indexOf(left.key);
370
+ const rightIndex = order.indexOf(right.key);
371
+ return indexOrEnd(leftIndex) - indexOrEnd(rightIndex);
372
+ })
373
+ : [...columns];
374
+ return [
375
+ ...ordered.filter((column) => column.pinned === 'left'),
376
+ ...ordered.filter((column) => !column.pinned),
377
+ ...ordered.filter((column) => column.pinned === 'right'),
378
+ ];
379
+ }
380
+ function indexOrEnd(index) {
381
+ return index === -1 ? Number.MAX_SAFE_INTEGER : index;
382
+ }
383
+ function formatCssSize(value) {
384
+ if (value === undefined)
385
+ return undefined;
386
+ return typeof value === 'number' ? `${value}px` : value;
387
+ }
388
+ function numericWidth(value) {
389
+ if (typeof value === 'number')
390
+ return value;
391
+ if (typeof value === 'string' && /^\d+px$/.test(value)) {
392
+ return Number.parseInt(value, 10);
393
+ }
394
+ return undefined;
395
+ }
396
+ function tableMinimumWidth({ columns, columnWidths, selectable, expandable, }) {
397
+ const base = (selectable ? 42 : 0) + (expandable ? 34 : 0);
398
+ return columns.reduce((total, column) => {
399
+ const width = columnWidths[column.key] ??
400
+ numericWidth(column.width) ??
401
+ column.minWidth ??
402
+ 120;
403
+ return total + width;
404
+ }, base);
405
+ }
406
+ function normalizeWheelDelta(event, node) {
407
+ if (event.deltaMode === 1)
408
+ return event.deltaY * 16;
409
+ if (event.deltaMode === 2)
410
+ return event.deltaY * node.clientWidth;
411
+ return event.deltaY;
412
+ }
413
+ function clamp(value, min, max) {
414
+ return Math.max(min, Math.min(max, value));
415
+ }
@@ -0,0 +1,41 @@
1
+ import type { DataTableSort } from './DataTable';
2
+ export type DataTablePreferenceScope = {
3
+ tableKey: string;
4
+ tenantId?: string | number | null;
5
+ userId?: string | number | null;
6
+ };
7
+ export type DataTablePersistedState = {
8
+ visibleColumnKeys?: string[];
9
+ columnOrder?: string[];
10
+ columnWidths?: Record<string, number>;
11
+ sort?: DataTableSort[];
12
+ page?: number;
13
+ pageSize?: number;
14
+ savedViewKey?: string;
15
+ };
16
+ export type DataTableSavedView = DataTablePersistedState & {
17
+ key: string;
18
+ label: string;
19
+ default?: boolean;
20
+ };
21
+ export type DataTableStateStorage = Pick<Storage, 'getItem' | 'removeItem' | 'setItem'>;
22
+ export declare function dataTablePreferenceStorageKey(scope: DataTablePreferenceScope): string;
23
+ export declare function readDataTableState(scope: DataTablePreferenceScope, storage?: DataTableStateStorage | null): DataTablePersistedState | null;
24
+ export declare function writeDataTableState(scope: DataTablePreferenceScope, state: DataTablePersistedState, storage?: DataTableStateStorage | null): void;
25
+ export declare function clearDataTableState(scope: DataTablePreferenceScope, storage?: DataTableStateStorage | null): void;
26
+ export declare function dataTableStateToSearchParams(state: DataTablePersistedState): URLSearchParams;
27
+ export declare function dataTableStateFromSearchParams(params: URLSearchParams): DataTablePersistedState;
28
+ export declare function dataTablePaginationToSearchParams({ page, pageSize, }: {
29
+ page?: number;
30
+ pageSize?: number;
31
+ }): URLSearchParams;
32
+ export declare function dataTablePaginationFromSearchParams(params: URLSearchParams): Pick<DataTablePersistedState, 'page' | 'pageSize'>;
33
+ export declare function resolveDataTableState({ defaultState, persistedState, urlState, }: {
34
+ defaultState?: DataTablePersistedState | null;
35
+ persistedState?: DataTablePersistedState | null;
36
+ urlState?: DataTablePersistedState | null;
37
+ }): DataTablePersistedState;
38
+ export declare function defaultDataTableSavedView(views: ReadonlyArray<DataTableSavedView>): DataTableSavedView | null;
39
+ export declare function applyDataTableSavedView(state: DataTablePersistedState, view: DataTableSavedView): DataTablePersistedState;
40
+ export declare function resetDataTableStateToDefault(defaultState?: DataTablePersistedState): DataTablePersistedState;
41
+ //# sourceMappingURL=DataTableStateAdapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTableStateAdapters.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/DataTableStateAdapters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,aAAa,CAAC;AAE/C,MAAM,MAAM,wBAAwB,GAAG;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IAClC,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,EAAE,aAAa,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,uBAAuB,GAAG;IACvD,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,YAAY,GAAG,SAAS,CAAC,CAAC;AAExF,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,wBAAwB,GAAG,MAAM,CAIrF;AAED,wBAAgB,kBAAkB,CAC9B,KAAK,EAAE,wBAAwB,EAC/B,OAAO,GAAE,qBAAqB,GAAG,IAAuB,GACzD,uBAAuB,GAAG,IAAI,CAShC;AAED,wBAAgB,mBAAmB,CAC/B,KAAK,EAAE,wBAAwB,EAC/B,KAAK,EAAE,uBAAuB,EAC9B,OAAO,GAAE,qBAAqB,GAAG,IAAuB,QAI3D;AAED,wBAAgB,mBAAmB,CAC/B,KAAK,EAAE,wBAAwB,EAC/B,OAAO,GAAE,qBAAqB,GAAG,IAAuB,QAG3D;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,uBAAuB,GAAG,eAAe,CAiB5F;AAED,wBAAgB,8BAA8B,CAC1C,MAAM,EAAE,eAAe,GACxB,uBAAuB,CAUzB;AAED,wBAAgB,iCAAiC,CAAC,EAC9C,IAAI,EACJ,QAAQ,GACX,EAAE;IACC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,eAAe,CAElB;AAED,wBAAgB,mCAAmC,CAC/C,MAAM,EAAE,eAAe,GACxB,IAAI,CAAC,uBAAuB,EAAE,MAAM,GAAG,UAAU,CAAC,CAMpD;AAED,wBAAgB,qBAAqB,CAAC,EAClC,YAAY,EACZ,cAAc,EACd,QAAQ,GACX,EAAE;IACC,YAAY,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC9C,cAAc,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAChD,QAAQ,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;CAC7C,GAAG,uBAAuB,CAM1B;AAED,wBAAgB,yBAAyB,CACrC,KAAK,EAAE,aAAa,CAAC,kBAAkB,CAAC,GACzC,kBAAkB,GAAG,IAAI,CAE3B;AAED,wBAAgB,uBAAuB,CACnC,KAAK,EAAE,uBAAuB,EAC9B,IAAI,EAAE,kBAAkB,GACzB,uBAAuB,CAWzB;AAED,wBAAgB,4BAA4B,CACxC,YAAY,GAAE,uBAA4B,GAC3C,uBAAuB,CAEzB"}