@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.
- package/README.md +151 -0
- package/README.ru.md +151 -0
- package/assets/orcestr-banner.webp +0 -0
- package/dist/components/Action/ActionConfirmModal.d.ts +8 -0
- package/dist/components/Action/ActionConfirmModal.d.ts.map +1 -0
- package/dist/components/Action/ActionConfirmModal.js +13 -0
- package/dist/components/Action/ActionTypes.d.ts +47 -0
- package/dist/components/Action/ActionTypes.d.ts.map +1 -0
- package/dist/components/Action/ActionTypes.js +49 -0
- package/dist/components/ActionMenu/ActionMenu.d.ts +3 -0
- package/dist/components/ActionMenu/ActionMenu.d.ts.map +1 -0
- package/dist/components/ActionMenu/ActionMenu.js +1 -0
- package/dist/components/Alert/Alert.d.ts +11 -0
- package/dist/components/Alert/Alert.d.ts.map +1 -0
- package/dist/components/Alert/Alert.js +7 -0
- package/dist/components/AppShell/AppShell.d.ts +102 -0
- package/dist/components/AppShell/AppShell.d.ts.map +1 -0
- package/dist/components/AppShell/AppShell.js +96 -0
- package/dist/components/Badge/Badge.d.ts +15 -0
- package/dist/components/Badge/Badge.d.ts.map +1 -0
- package/dist/components/Badge/Badge.js +8 -0
- package/dist/components/Box/Box.d.ts +11 -0
- package/dist/components/Box/Box.d.ts.map +1 -0
- package/dist/components/Box/Box.js +8 -0
- package/dist/components/Button/Button.d.ts +27 -0
- package/dist/components/Button/Button.d.ts.map +1 -0
- package/dist/components/Button/Button.js +13 -0
- package/dist/components/Checkbox/Checkbox.d.ts +10 -0
- package/dist/components/Checkbox/Checkbox.d.ts.map +1 -0
- package/dist/components/Checkbox/Checkbox.js +15 -0
- package/dist/components/Collapse/Collapse.d.ts +11 -0
- package/dist/components/Collapse/Collapse.d.ts.map +1 -0
- package/dist/components/Collapse/Collapse.js +33 -0
- package/dist/components/Combobox/Combobox.d.ts +17 -0
- package/dist/components/Combobox/Combobox.d.ts.map +1 -0
- package/dist/components/Combobox/Combobox.js +32 -0
- package/dist/components/CommandPalette/CommandPalette.d.ts +21 -0
- package/dist/components/CommandPalette/CommandPalette.d.ts.map +1 -0
- package/dist/components/CommandPalette/CommandPalette.js +168 -0
- package/dist/components/ConfirmDialog/ConfirmDialog.d.ts +25 -0
- package/dist/components/ConfirmDialog/ConfirmDialog.d.ts.map +1 -0
- package/dist/components/ConfirmDialog/ConfirmDialog.js +25 -0
- package/dist/components/ContextMenu/ContextMenu.d.ts +11 -0
- package/dist/components/ContextMenu/ContextMenu.d.ts.map +1 -0
- package/dist/components/ContextMenu/ContextMenu.js +68 -0
- package/dist/components/DataTable/DataTable.d.ts +88 -0
- package/dist/components/DataTable/DataTable.d.ts.map +1 -0
- package/dist/components/DataTable/DataTable.js +415 -0
- package/dist/components/DataTable/DataTableStateAdapters.d.ts +41 -0
- package/dist/components/DataTable/DataTableStateAdapters.d.ts.map +1 -0
- package/dist/components/DataTable/DataTableStateAdapters.js +192 -0
- package/dist/components/DatePicker/DatePicker.d.ts +21 -0
- package/dist/components/DatePicker/DatePicker.d.ts.map +1 -0
- package/dist/components/DatePicker/DatePicker.js +39 -0
- package/dist/components/DatePicker/DatePickerState.d.ts +30 -0
- package/dist/components/DatePicker/DatePickerState.d.ts.map +1 -0
- package/dist/components/DatePicker/DatePickerState.js +106 -0
- package/dist/components/DateRangePicker/DateRangePicker.d.ts +19 -0
- package/dist/components/DateRangePicker/DateRangePicker.d.ts.map +1 -0
- package/dist/components/DateRangePicker/DateRangePicker.js +6 -0
- package/dist/components/DateRangePresetPicker/DateRangePresetPicker.d.ts +10 -0
- package/dist/components/DateRangePresetPicker/DateRangePresetPicker.d.ts.map +1 -0
- package/dist/components/DateRangePresetPicker/DateRangePresetPicker.js +26 -0
- package/dist/components/DateRangePresetPicker/DateRangePresetPickerState.d.ts +4 -0
- package/dist/components/DateRangePresetPicker/DateRangePresetPickerState.d.ts.map +1 -0
- package/dist/components/DateRangePresetPicker/DateRangePresetPickerState.js +20 -0
- package/dist/components/Dialog/Dialog.d.ts +2 -0
- package/dist/components/Dialog/Dialog.d.ts.map +1 -0
- package/dist/components/Dialog/Dialog.js +1 -0
- package/dist/components/Drawer/Drawer.d.ts +30 -0
- package/dist/components/Drawer/Drawer.d.ts.map +1 -0
- package/dist/components/Drawer/Drawer.js +83 -0
- package/dist/components/EntityPicker/EntityPicker.d.ts +41 -0
- package/dist/components/EntityPicker/EntityPicker.d.ts.map +1 -0
- package/dist/components/EntityPicker/EntityPicker.js +17 -0
- package/dist/components/Field/Field.d.ts +12 -0
- package/dist/components/Field/Field.d.ts.map +1 -0
- package/dist/components/Field/Field.js +8 -0
- package/dist/components/Flex/Flex.d.ts +9 -0
- package/dist/components/Flex/Flex.d.ts.map +1 -0
- package/dist/components/Flex/Flex.js +8 -0
- package/dist/components/Grid/Grid.d.ts +11 -0
- package/dist/components/Grid/Grid.d.ts.map +1 -0
- package/dist/components/Grid/Grid.js +12 -0
- package/dist/components/Highlight/Highlight.d.ts +27 -0
- package/dist/components/Highlight/Highlight.d.ts.map +1 -0
- package/dist/components/Highlight/Highlight.js +26 -0
- package/dist/components/IconButton/IconButton.d.ts +25 -0
- package/dist/components/IconButton/IconButton.d.ts.map +1 -0
- package/dist/components/IconButton/IconButton.js +13 -0
- package/dist/components/IconText/IconText.d.ts +12 -0
- package/dist/components/IconText/IconText.d.ts.map +1 -0
- package/dist/components/IconText/IconText.js +7 -0
- package/dist/components/Listbox/Listbox.d.ts +13 -0
- package/dist/components/Listbox/Listbox.d.ts.map +1 -0
- package/dist/components/Listbox/Listbox.js +74 -0
- package/dist/components/Menu/Menu.d.ts +14 -0
- package/dist/components/Menu/Menu.d.ts.map +1 -0
- package/dist/components/Menu/Menu.js +168 -0
- package/dist/components/Modal/Modal.d.ts +29 -0
- package/dist/components/Modal/Modal.d.ts.map +1 -0
- package/dist/components/Modal/Modal.js +155 -0
- package/dist/components/MultiSelect/MultiSelect.d.ts +21 -0
- package/dist/components/MultiSelect/MultiSelect.d.ts.map +1 -0
- package/dist/components/MultiSelect/MultiSelect.js +139 -0
- package/dist/components/NumberField/NumberField.d.ts +4 -0
- package/dist/components/NumberField/NumberField.d.ts.map +1 -0
- package/dist/components/NumberField/NumberField.js +6 -0
- package/dist/components/Overlay/OverlayProvider.d.ts +19 -0
- package/dist/components/Overlay/OverlayProvider.d.ts.map +1 -0
- package/dist/components/Overlay/OverlayProvider.js +73 -0
- package/dist/components/PaginatedCombobox/PaginatedCombobox.d.ts +48 -0
- package/dist/components/PaginatedCombobox/PaginatedCombobox.d.ts.map +1 -0
- package/dist/components/PaginatedCombobox/PaginatedCombobox.js +223 -0
- package/dist/components/PaginatedCombobox/PaginatedComboboxReactQueryAdapter.d.ts +13 -0
- package/dist/components/PaginatedCombobox/PaginatedComboboxReactQueryAdapter.d.ts.map +1 -0
- package/dist/components/PaginatedCombobox/PaginatedComboboxReactQueryAdapter.js +10 -0
- package/dist/components/Pagination/Pagination.d.ts +7 -0
- package/dist/components/Pagination/Pagination.d.ts.map +1 -0
- package/dist/components/Pagination/Pagination.js +9 -0
- package/dist/components/Popover/Popover.d.ts +19 -0
- package/dist/components/Popover/Popover.d.ts.map +1 -0
- package/dist/components/Popover/Popover.js +83 -0
- package/dist/components/Portal/Portal.d.ts +6 -0
- package/dist/components/Portal/Portal.d.ts.map +1 -0
- package/dist/components/Portal/Portal.js +23 -0
- package/dist/components/RadioGroup/RadioGroup.d.ts +14 -0
- package/dist/components/RadioGroup/RadioGroup.d.ts.map +1 -0
- package/dist/components/RadioGroup/RadioGroup.js +6 -0
- package/dist/components/ScrollArea/ScrollArea.d.ts +36 -0
- package/dist/components/ScrollArea/ScrollArea.d.ts.map +1 -0
- package/dist/components/ScrollArea/ScrollArea.js +124 -0
- package/dist/components/Section/Section.d.ts +14 -0
- package/dist/components/Section/Section.d.ts.map +1 -0
- package/dist/components/Section/Section.js +20 -0
- package/dist/components/SegmentedControl/SegmentedControl.d.ts +13 -0
- package/dist/components/SegmentedControl/SegmentedControl.d.ts.map +1 -0
- package/dist/components/SegmentedControl/SegmentedControl.js +6 -0
- package/dist/components/Select/Select.d.ts +27 -0
- package/dist/components/Select/Select.d.ts.map +1 -0
- package/dist/components/Select/Select.js +142 -0
- package/dist/components/Separator/Separator.d.ts +6 -0
- package/dist/components/Separator/Separator.d.ts.map +1 -0
- package/dist/components/Separator/Separator.js +5 -0
- package/dist/components/Skeleton/Skeleton.d.ts +9 -0
- package/dist/components/Skeleton/Skeleton.d.ts.map +1 -0
- package/dist/components/Skeleton/Skeleton.js +8 -0
- package/dist/components/Spinner/Spinner.d.ts +7 -0
- package/dist/components/Spinner/Spinner.d.ts.map +1 -0
- package/dist/components/Spinner/Spinner.js +5 -0
- package/dist/components/Stack/Stack.d.ts +9 -0
- package/dist/components/Stack/Stack.d.ts.map +1 -0
- package/dist/components/Stack/Stack.js +7 -0
- package/dist/components/State/State.d.ts +23 -0
- package/dist/components/State/State.d.ts.map +1 -0
- package/dist/components/State/State.js +30 -0
- package/dist/components/State/stateIcon.d.ts +3 -0
- package/dist/components/State/stateIcon.d.ts.map +1 -0
- package/dist/components/State/stateIcon.js +11 -0
- package/dist/components/StepperInput/StepperInput.d.ts +13 -0
- package/dist/components/StepperInput/StepperInput.d.ts.map +1 -0
- package/dist/components/StepperInput/StepperInput.js +22 -0
- package/dist/components/Switch/Switch.d.ts +10 -0
- package/dist/components/Switch/Switch.d.ts.map +1 -0
- package/dist/components/Switch/Switch.js +14 -0
- package/dist/components/Tabs/Tabs.d.ts +18 -0
- package/dist/components/Tabs/Tabs.d.ts.map +1 -0
- package/dist/components/Tabs/Tabs.js +104 -0
- package/dist/components/Text/Text.d.ts +13 -0
- package/dist/components/Text/Text.d.ts.map +1 -0
- package/dist/components/Text/Text.js +8 -0
- package/dist/components/TextArea/TextArea.d.ts +15 -0
- package/dist/components/TextArea/TextArea.d.ts.map +1 -0
- package/dist/components/TextArea/TextArea.js +17 -0
- package/dist/components/TextField/TextField.d.ts +25 -0
- package/dist/components/TextField/TextField.d.ts.map +1 -0
- package/dist/components/TextField/TextField.js +31 -0
- package/dist/components/Toast/Toast.d.ts +43 -0
- package/dist/components/Toast/Toast.d.ts.map +1 -0
- package/dist/components/Toast/Toast.js +205 -0
- package/dist/components/Tooltip/Tooltip.d.ts +10 -0
- package/dist/components/Tooltip/Tooltip.d.ts.map +1 -0
- package/dist/components/Tooltip/Tooltip.js +24 -0
- package/dist/components/VisuallyHidden/VisuallyHidden.d.ts +8 -0
- package/dist/components/VisuallyHidden/VisuallyHidden.d.ts.map +1 -0
- package/dist/components/VisuallyHidden/VisuallyHidden.js +6 -0
- package/dist/components/Workflow/Workflow.d.ts +82 -0
- package/dist/components/Workflow/Workflow.d.ts.map +1 -0
- package/dist/components/Workflow/Workflow.js +73 -0
- package/dist/example/CodePreview.d.ts +25 -0
- package/dist/example/CodePreview.d.ts.map +1 -0
- package/dist/example/CodePreview.js +93 -0
- package/dist/example/ExampleActionsSection.d.ts +10 -0
- package/dist/example/ExampleActionsSection.d.ts.map +1 -0
- package/dist/example/ExampleActionsSection.js +10 -0
- package/dist/example/ExampleBasicsSections.d.ts +8 -0
- package/dist/example/ExampleBasicsSections.d.ts.map +1 -0
- package/dist/example/ExampleBasicsSections.js +43 -0
- package/dist/example/ExampleDataSection.d.ts +7 -0
- package/dist/example/ExampleDataSection.d.ts.map +1 -0
- package/dist/example/ExampleDataSection.js +124 -0
- package/dist/example/ExampleFieldsSection.d.ts +17 -0
- package/dist/example/ExampleFieldsSection.d.ts.map +1 -0
- package/dist/example/ExampleFieldsSection.js +10 -0
- package/dist/example/ExampleFoundationsSection.d.ts +5 -0
- package/dist/example/ExampleFoundationsSection.d.ts.map +1 -0
- package/dist/example/ExampleFoundationsSection.js +25 -0
- package/dist/example/ExampleOverlays.d.ts +30 -0
- package/dist/example/ExampleOverlays.d.ts.map +1 -0
- package/dist/example/ExampleOverlays.js +12 -0
- package/dist/example/ExampleOverlaysSection.d.ts +14 -0
- package/dist/example/ExampleOverlaysSection.d.ts.map +1 -0
- package/dist/example/ExampleOverlaysSection.js +126 -0
- package/dist/example/ExampleSelectionSection.d.ts +30 -0
- package/dist/example/ExampleSelectionSection.d.ts.map +1 -0
- package/dist/example/ExampleSelectionSection.js +66 -0
- package/dist/example/ExampleStateSection.d.ts +8 -0
- package/dist/example/ExampleStateSection.d.ts.map +1 -0
- package/dist/example/ExampleStateSection.js +76 -0
- package/dist/example/ExampleThemePlayground.d.ts +417 -0
- package/dist/example/ExampleThemePlayground.d.ts.map +1 -0
- package/dist/example/ExampleThemePlayground.js +596 -0
- package/dist/example/UiExamplePage.d.ts +2 -0
- package/dist/example/UiExamplePage.d.ts.map +1 -0
- package/dist/example/UiExamplePage.js +315 -0
- package/dist/example/UiExampleSection.d.ts +8 -0
- package/dist/example/UiExampleSection.d.ts.map +1 -0
- package/dist/example/UiExampleSection.js +5 -0
- package/dist/example/codeSamples.d.ts +30 -0
- package/dist/example/codeSamples.d.ts.map +1 -0
- package/dist/example/codeSamples.js +976 -0
- package/dist/example/exampleData.d.ts +33 -0
- package/dist/example/exampleData.d.ts.map +1 -0
- package/dist/example/exampleData.js +217 -0
- package/dist/example/styles.css +1106 -0
- package/dist/hooks/useControllableState.d.ts +6 -0
- package/dist/hooks/useControllableState.d.ts.map +1 -0
- package/dist/hooks/useControllableState.js +16 -0
- package/dist/hooks/useDisclosure.d.ts +12 -0
- package/dist/hooks/useDisclosure.d.ts.map +1 -0
- package/dist/hooks/useDisclosure.js +14 -0
- package/dist/hooks/useEscapeKey.d.ts +2 -0
- package/dist/hooks/useEscapeKey.d.ts.map +1 -0
- package/dist/hooks/useEscapeKey.js +15 -0
- package/dist/hooks/useFloatingLayer.d.ts +19 -0
- package/dist/hooks/useFloatingLayer.d.ts.map +1 -0
- package/dist/hooks/useFloatingLayer.js +26 -0
- package/dist/hooks/useFloatingPosition.d.ts +17 -0
- package/dist/hooks/useFloatingPosition.d.ts.map +1 -0
- package/dist/hooks/useFloatingPosition.js +132 -0
- package/dist/hooks/useFocusTrap.d.ts +3 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -0
- package/dist/hooks/useFocusTrap.js +54 -0
- package/dist/hooks/useListNavigation.d.ts +17 -0
- package/dist/hooks/useListNavigation.d.ts.map +1 -0
- package/dist/hooks/useListNavigation.js +44 -0
- package/dist/hooks/useOutsidePointerDown.d.ts +3 -0
- package/dist/hooks/useOutsidePointerDown.d.ts.map +1 -0
- package/dist/hooks/useOutsidePointerDown.js +20 -0
- package/dist/hooks/usePresence.d.ts +5 -0
- package/dist/hooks/usePresence.d.ts.map +1 -0
- package/dist/hooks/usePresence.js +35 -0
- package/dist/hooks/useTypeahead.d.ts +2 -0
- package/dist/hooks/useTypeahead.d.ts.map +1 -0
- package/dist/hooks/useTypeahead.js +23 -0
- package/dist/index.d.ts +64 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +64 -0
- package/dist/locale/LocaleProvider.d.ts +89 -0
- package/dist/locale/LocaleProvider.d.ts.map +1 -0
- package/dist/locale/LocaleProvider.js +174 -0
- package/dist/provider/OrcestrUiProvider.d.ts +28 -0
- package/dist/provider/OrcestrUiProvider.d.ts.map +1 -0
- package/dist/provider/OrcestrUiProvider.js +9 -0
- package/dist/react-query.d.ts +2 -0
- package/dist/react-query.d.ts.map +1 -0
- package/dist/react-query.js +1 -0
- package/dist/styles/orcestr-ui.css +4676 -0
- package/dist/theme/ThemeProvider.d.ts +3 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +280 -0
- package/dist/theme/defaultTheme.d.ts +12 -0
- package/dist/theme/defaultTheme.d.ts.map +1 -0
- package/dist/theme/defaultTheme.js +516 -0
- package/dist/theme/systemProps.d.ts +53 -0
- package/dist/theme/systemProps.d.ts.map +1 -0
- package/dist/theme/systemProps.js +240 -0
- package/dist/theme/themeTypes.d.ts +197 -0
- package/dist/theme/themeTypes.d.ts.map +1 -0
- package/dist/theme/themeTypes.js +1 -0
- package/dist/theme/useTheme.d.ts +4 -0
- package/dist/theme/useTheme.d.ts.map +1 -0
- package/dist/theme/useTheme.js +10 -0
- package/dist/utils/cn.d.ts +2 -0
- package/dist/utils/cn.d.ts.map +1 -0
- package/dist/utils/cn.js +3 -0
- package/dist/utils/composeRefs.d.ts +3 -0
- package/dist/utils/composeRefs.d.ts.map +1 -0
- package/dist/utils/composeRefs.js +14 -0
- package/dist/utils/mergeProps.d.ts +4 -0
- package/dist/utils/mergeProps.d.ts.map +1 -0
- package/dist/utils/mergeProps.js +26 -0
- package/dist/utils/ownerDocument.d.ts +2 -0
- package/dist/utils/ownerDocument.d.ts.map +1 -0
- package/dist/utils/ownerDocument.js +3 -0
- package/dist/utils/polymorphic.d.ts +6 -0
- package/dist/utils/polymorphic.d.ts.map +1 -0
- package/dist/utils/polymorphic.js +1 -0
- 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"}
|