@astryxdesign/core 0.4.7 → 0.5.0-canary.32a62fd
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/CHANGELOG.md +161 -1
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +3 -2
- package/dist/AspectRatio/AspectRatio.d.ts +24 -0
- package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
- package/dist/AspectRatio/AspectRatio.js +23 -4
- package/dist/Avatar/Avatar.d.ts +25 -1
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +58 -19
- package/dist/Avatar/index.d.ts +2 -2
- package/dist/Avatar/index.d.ts.map +1 -1
- package/dist/Avatar/index.js +1 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts +9 -2
- package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.js +8 -4
- package/dist/AvatarGroup/AvatarGroupContext.d.ts +2 -1
- package/dist/AvatarGroup/AvatarGroupContext.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +10 -6
- package/dist/Banner/Banner.d.ts +40 -15
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +51 -18
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +17 -4
- package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetSwitcher.js +3 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +11 -10
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +5 -4
- package/dist/ButtonGroup/ButtonGroup.d.ts +5 -1
- package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
- package/dist/ButtonGroup/ButtonGroup.js +26 -7
- package/dist/Calendar/Calendar.d.ts +3 -1
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +13 -14
- package/dist/Calendar/getInitialFocusDate.d.ts +46 -0
- package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -0
- package/dist/Calendar/getInitialFocusDate.js +62 -0
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +3 -3
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +2 -3
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +3 -3
- package/dist/Chat/ChatMessageList.d.ts +22 -3
- package/dist/Chat/ChatMessageList.d.ts.map +1 -1
- package/dist/Chat/ChatMessageList.js +6 -3
- package/dist/Chat/ChatTokenizedText.d.ts +2 -0
- package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
- package/dist/Chat/ChatTokenizedText.js +11 -6
- package/dist/Chat/useChatComposerTokens.js +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +10 -3
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +3 -3
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +15 -4
- package/dist/CodeBlock/highlightRanges.js +1 -1
- package/dist/CodeBlock/highlightStyles.js +13 -13
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +3 -2
- package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteItem.js +3 -2
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +4 -3
- package/dist/DateInput/DateInput.d.ts +43 -0
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +22 -2
- package/dist/DateInput/NativeDateField.d.ts +10 -0
- package/dist/DateInput/NativeDateField.d.ts.map +1 -0
- package/dist/DateInput/NativeDateField.js +477 -0
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +38 -4
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts +21 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +406 -12
- package/dist/DateTimeInput/index.d.ts +1 -1
- package/dist/DateTimeInput/index.d.ts.map +1 -1
- package/dist/Dialog/Dialog.d.ts +7 -1
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +89 -58
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +6 -5
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +9 -1
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +3 -2
- package/dist/Heading/Heading.d.ts.map +1 -1
- package/dist/Heading/Heading.js +6 -2
- package/dist/HoverCard/HoverCard.d.ts +6 -0
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +52 -3
- package/dist/HoverCard/useHoverCard.d.ts +16 -2
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +74 -26
- package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
- package/dist/Indicator/CheckboxIndicator.js +6 -2
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +4 -2
- package/dist/Kbd/Kbd.d.ts.map +1 -1
- package/dist/Kbd/Kbd.js +2 -19
- package/dist/Layer/LayerDepthContext.d.ts +52 -0
- package/dist/Layer/LayerDepthContext.d.ts.map +1 -0
- package/dist/Layer/LayerDepthContext.js +66 -0
- package/dist/Layer/index.d.ts +3 -0
- package/dist/Layer/index.d.ts.map +1 -1
- package/dist/Layer/index.js +4 -0
- package/dist/Layer/layerStack.d.ts +98 -0
- package/dist/Layer/layerStack.d.ts.map +1 -0
- package/dist/Layer/layerStack.js +306 -0
- package/dist/Layer/useLayerDismissal.d.ts +93 -0
- package/dist/Layer/useLayerDismissal.d.ts.map +1 -0
- package/dist/Layer/useLayerDismissal.js +91 -0
- package/dist/Lightbox/Lightbox.d.ts +1 -0
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +103 -81
- package/dist/Markdown/index.d.ts +1 -1
- package/dist/Markdown/index.d.ts.map +1 -1
- package/dist/Markdown/parser.d.ts +38 -1
- package/dist/Markdown/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +177 -29
- package/dist/MobileNav/MobileNav.d.ts +6 -1
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +61 -36
- package/dist/MultiSelector/MultiSelector.d.ts +15 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +17 -6
- package/dist/MultiSelector/index.d.ts +1 -1
- package/dist/MultiSelector/index.d.ts.map +1 -1
- package/dist/NavIcon/NavIcon.d.ts.map +1 -1
- package/dist/NavIcon/NavIcon.js +5 -1
- package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
- package/dist/NavMenu/NavHeadingMenu.js +3 -2
- package/dist/NumberInput/NumberInput.d.ts +1 -0
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +27 -37
- package/dist/NumberInput/numberParser.d.ts +43 -0
- package/dist/NumberInput/numberParser.d.ts.map +1 -0
- package/dist/NumberInput/numberParser.js +293 -0
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +3 -2
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +3 -2
- package/dist/Overlay/Overlay.d.ts.map +1 -1
- package/dist/Overlay/Overlay.js +3 -2
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +20 -17
- package/dist/PowerSearch/PowerSearch.d.ts +8 -2
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +19 -6
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts +3 -1
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +28 -6
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts +3 -1
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchValueEditor.js +19 -9
- package/dist/PowerSearch/types.d.ts +2 -0
- package/dist/PowerSearch/types.d.ts.map +1 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts +6 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
- package/dist/PowerSearch/usePowerSearchSource.js +14 -5
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +18 -5
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +3 -2
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +3 -2
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +3 -3
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +5 -0
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +4 -3
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +8 -7
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +4 -3
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +3 -3
- package/dist/Spinner/Spinner.d.ts +3 -3
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +130 -78
- package/dist/StatusDot/StatusDot.d.ts.map +1 -1
- package/dist/StatusDot/StatusDot.js +6 -1
- package/dist/Stepper/Step.d.ts +140 -0
- package/dist/Stepper/Step.d.ts.map +1 -0
- package/dist/Stepper/Step.js +1045 -0
- package/dist/Stepper/StepStatus.d.ts +24 -0
- package/dist/Stepper/StepStatus.d.ts.map +1 -0
- package/dist/Stepper/StepStatus.js +1 -0
- package/dist/Stepper/Stepper.d.ts +93 -0
- package/dist/Stepper/Stepper.d.ts.map +1 -0
- package/dist/Stepper/Stepper.js +184 -0
- package/dist/Stepper/StepperContext.d.ts +41 -0
- package/dist/Stepper/StepperContext.d.ts.map +1 -0
- package/dist/Stepper/StepperContext.js +34 -0
- package/dist/Stepper/index.d.ts +8 -0
- package/dist/Stepper/index.d.ts.map +1 -0
- package/dist/Stepper/index.js +7 -0
- package/dist/Stepper/stepper.stylex.d.ts +15 -0
- package/dist/Stepper/stepper.stylex.d.ts.map +1 -0
- package/dist/Stepper/stepper.stylex.js +20 -0
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +8 -3
- package/dist/TabList/Tab.d.ts +15 -2
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +32 -7
- package/dist/TabList/TabList.d.ts +46 -7
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +353 -23
- package/dist/TabList/TabListContext.d.ts +11 -1
- package/dist/TabList/TabListContext.d.ts.map +1 -1
- package/dist/TabList/TabListContext.js +11 -2
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +3 -2
- package/dist/TabList/index.d.ts +2 -2
- package/dist/TabList/index.d.ts.map +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +10 -2
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +3 -6
- package/dist/Table/TableRow.d.ts +16 -5
- package/dist/Table/TableRow.d.ts.map +1 -1
- package/dist/Table/TableRow.js +16 -5
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +20 -8
- package/dist/Table/plugins/pagination/useTablePagination.d.ts +3 -0
- package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
- package/dist/Table/plugins/pagination/useTablePagination.js +21 -4
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +7 -2
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -1
- package/dist/Table/plugins/rowStatus/useTableRowStatus.js +10 -3
- package/dist/Table/plugins/selection/useTableSelection.d.ts +16 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +19 -5
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
- package/dist/Table/types.d.ts +22 -4
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.js +5 -0
- package/dist/Text/Text.d.ts.map +1 -1
- package/dist/Text/Text.js +6 -2
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +9 -3
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +3 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +3 -2
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +5 -3
- package/dist/Token/TokenLink.d.ts.map +1 -1
- package/dist/Token/TokenLink.js +2 -2
- package/dist/Tokenizer/Tokenizer.d.ts +3 -1
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +2 -0
- package/dist/Tooltip/Tooltip.d.ts +5 -0
- package/dist/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.d.ts +5 -0
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +39 -24
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +5 -4
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +3 -3
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +4 -3
- package/dist/Typeahead/BaseTypeahead.d.ts +2 -0
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +68 -29
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +3 -2
- package/dist/astryx.css +94 -7
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useFocusTrap.d.ts +7 -4
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +60 -95
- package/dist/hooks/useHotkeys.d.ts.map +1 -1
- package/dist/hooks/useHotkeys.js +3 -18
- package/dist/hooks/useMergedRefs.d.ts +18 -0
- package/dist/hooks/useMergedRefs.d.ts.map +1 -0
- package/dist/hooks/useMergedRefs.js +25 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +24 -4
- package/dist/theme/syntax/tokens.d.ts +1 -1
- package/dist/theme/syntax/tokens.d.ts.map +1 -1
- package/dist/theme/syntax/tokens.js +5 -2
- package/dist/utils/groupItems.d.ts +5 -1
- package/dist/utils/groupItems.d.ts.map +1 -1
- package/dist/utils/groupItems.js +9 -9
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/isApplePlatform.d.ts +18 -0
- package/dist/utils/isApplePlatform.d.ts.map +1 -0
- package/dist/utils/isApplePlatform.js +37 -0
- package/dist/utils/sharedResizeObserver.d.ts.map +1 -1
- package/dist/utils/sharedResizeObserver.js +10 -1
- package/dist/utils/timeParser.d.ts +1 -1
- package/dist/utils/timeParser.d.ts.map +1 -1
- package/dist/utils/timeParser.js +26 -12
- package/locales/en.json +31 -7
- package/locales/pseudo.json +18 -0
- package/package.json +8 -3
- package/src/AppShell/AppShell.tsx +3 -2
- package/src/AspectRatio/AspectRatio.doc.mjs +6 -3
- package/src/AspectRatio/AspectRatio.test.tsx +57 -10
- package/src/AspectRatio/AspectRatio.tsx +40 -1
- package/src/Avatar/Avatar.doc.mjs +14 -3
- package/src/Avatar/Avatar.test.tsx +97 -0
- package/src/Avatar/Avatar.tsx +125 -52
- package/src/Avatar/index.ts +2 -2
- package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
- package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
- package/src/AvatarGroup/AvatarGroup.tsx +15 -6
- package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +10 -4
- package/src/Banner/Banner.doc.mjs +13 -11
- package/src/Banner/Banner.test.tsx +102 -15
- package/src/Banner/Banner.tsx +72 -25
- package/src/BottomSheet/BottomSheet.test.tsx +123 -0
- package/src/BottomSheet/BottomSheet.tsx +17 -4
- package/src/BottomSheet/BottomSheetSwitcher.tsx +3 -2
- package/src/Breadcrumbs/BreadcrumbItem.tsx +9 -5
- package/src/Button/Button.doc.mjs +22 -0
- package/src/Button/Button.test.tsx +13 -0
- package/src/Button/Button.tsx +5 -4
- package/src/ButtonGroup/ButtonGroup.doc.mjs +10 -1
- package/src/ButtonGroup/ButtonGroup.test.tsx +391 -1
- package/src/ButtonGroup/ButtonGroup.tsx +23 -5
- package/src/Calendar/Calendar.doc.mjs +4 -3
- package/src/Calendar/Calendar.test.tsx +52 -0
- package/src/Calendar/Calendar.tsx +18 -15
- package/src/Calendar/getInitialFocusDate.test.ts +94 -0
- package/src/Calendar/getInitialFocusDate.ts +93 -0
- package/src/Carousel/Carousel.tsx +3 -2
- package/src/Chat/ChatComposerInput.tsx +5 -1
- package/src/Chat/ChatLayout.tsx +3 -2
- package/src/Chat/ChatMessageList.doc.mjs +9 -1
- package/src/Chat/ChatMessageList.test.tsx +46 -0
- package/src/Chat/ChatMessageList.tsx +28 -4
- package/src/Chat/ChatTokenizedText.tsx +17 -10
- package/src/Chat/useChatComposerTokens.ts +1 -1
- package/src/CheckboxInput/CheckboxInput.doc.mjs +2 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
- package/src/CheckboxInput/CheckboxInput.tsx +8 -2
- package/src/ClickableCard/ClickableCard.tsx +3 -2
- package/src/CodeBlock/CodeBlock.doc.mjs +16 -4
- package/src/CodeBlock/CodeBlock.test.tsx +37 -0
- package/src/CodeBlock/CodeBlock.tsx +20 -4
- package/src/CodeBlock/highlightRanges.ts +1 -1
- package/src/CodeBlock/highlightStyles.ts +13 -13
- package/src/CommandPalette/CommandPaletteInput.tsx +3 -2
- package/src/CommandPalette/CommandPaletteItem.tsx +3 -2
- package/src/ContextMenu/ContextMenu.doc.mjs +5 -0
- package/src/ContextMenu/ContextMenu.tsx +4 -3
- package/src/DateInput/DateInput.doc.mjs +16 -0
- package/src/DateInput/DateInput.tsx +55 -2
- package/src/DateInput/DateInputTouch.test.tsx +68 -9
- package/src/DateInput/NativeDateField.test.tsx +565 -0
- package/src/DateInput/NativeDateField.tsx +623 -0
- package/src/DateInput/TouchDateField.tsx +38 -4
- package/src/DateInput/index.ts +1 -0
- package/src/DateTimeInput/DateTimeInput.doc.mjs +18 -0
- package/src/DateTimeInput/DateTimeInput.test.tsx +1088 -0
- package/src/DateTimeInput/DateTimeInput.tsx +556 -24
- package/src/DateTimeInput/index.ts +1 -0
- package/src/Dialog/Dialog.doc.mjs +8 -3
- package/src/Dialog/Dialog.test.tsx +261 -1
- package/src/Dialog/Dialog.tsx +109 -58
- package/src/DropdownMenu/DropdownMenu.doc.mjs +6 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +8 -5
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +8 -11
- package/src/Field/Field.doc.mjs +13 -2
- package/src/Field/FieldLabel.test.tsx +29 -0
- package/src/Field/FieldLabel.tsx +7 -0
- package/src/FileInput/FileInput.tsx +3 -2
- package/src/Heading/Heading.test.tsx +23 -1
- package/src/Heading/Heading.tsx +6 -2
- package/src/HoverCard/HoverCard.doc.mjs +13 -2
- package/src/HoverCard/HoverCard.test.tsx +101 -4
- package/src/HoverCard/HoverCard.tsx +71 -3
- package/src/HoverCard/useHoverCard.tsx +101 -33
- package/src/Indicator/CheckboxIndicator.tsx +14 -8
- package/src/Indicator/Indicator.doc.mjs +2 -0
- package/src/Item/Item.tsx +5 -4
- package/src/Kbd/Kbd.tsx +2 -19
- package/src/Layer/LayerDepthContext.tsx +62 -0
- package/src/Layer/index.ts +9 -0
- package/src/Layer/layerDismissalFamilies.test.tsx +359 -0
- package/src/Layer/layerDismissalInvariants.test.tsx +417 -0
- package/src/Layer/layerStack.ts +362 -0
- package/src/Layer/useLayerDismissal.test.tsx +469 -0
- package/src/Layer/useLayerDismissal.ts +173 -0
- package/src/Layout/Layout.doc.mjs +2 -2
- package/src/Lightbox/Lightbox.doc.mjs +12 -0
- package/src/Lightbox/Lightbox.tsx +124 -102
- package/src/Link/Link.doc.mjs +39 -0
- package/src/Markdown/Markdown.doc.mjs +5 -0
- package/src/Markdown/incremental.test.ts +16 -2
- package/src/Markdown/index.ts +1 -0
- package/src/Markdown/parser.perf.test.ts +96 -1
- package/src/Markdown/parser.test.ts +145 -2
- package/src/Markdown/parser.ts +244 -29
- package/src/MobileNav/MobileNav.tsx +62 -36
- package/src/MoreMenu/MoreMenu.doc.mjs +7 -1
- package/src/MultiSelector/MultiSelector.doc.mjs +27 -0
- package/src/MultiSelector/MultiSelector.test.tsx +106 -0
- package/src/MultiSelector/MultiSelector.tsx +50 -6
- package/src/MultiSelector/index.ts +1 -0
- package/src/NavIcon/NavIcon.doc.mjs +8 -2
- package/src/NavIcon/NavIcon.test.tsx +9 -0
- package/src/NavIcon/NavIcon.tsx +5 -1
- package/src/NavMenu/NavHeadingMenu.tsx +3 -2
- package/src/NumberInput/NumberInput.doc.mjs +20 -0
- package/src/NumberInput/NumberInput.tsx +28 -29
- package/src/NumberInput/numberParser.test.ts +137 -0
- package/src/NumberInput/numberParser.ts +346 -0
- package/src/Outline/Outline.tsx +3 -2
- package/src/OverflowList/OverflowList.tsx +3 -2
- package/src/Overlay/Overlay.tsx +3 -2
- package/src/Popover/usePopover.tsx +31 -28
- package/src/PowerSearch/PowerSearch.doc.mjs +160 -28
- package/src/PowerSearch/PowerSearch.test.tsx +240 -1
- package/src/PowerSearch/PowerSearch.tsx +34 -5
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +201 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +29 -2
- package/src/PowerSearch/PowerSearchValueEditor.test.tsx +47 -1
- package/src/PowerSearch/PowerSearchValueEditor.tsx +15 -0
- package/src/PowerSearch/types.ts +2 -0
- package/src/PowerSearch/usePowerSearchSource.test.ts +82 -2
- package/src/PowerSearch/usePowerSearchSource.ts +13 -3
- package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
- package/src/ProgressBar/ProgressBar.test.tsx +24 -0
- package/src/ProgressBar/ProgressBar.tsx +28 -8
- package/src/Resizable/ResizeHandle.tsx +3 -2
- package/src/SegmentedControl/SegmentedControl.tsx +3 -2
- package/src/SelectableCard/SelectableCard.tsx +3 -2
- package/src/Selector/Selector.doc.mjs +12 -1
- package/src/Selector/Selector.test.tsx +45 -1
- package/src/Selector/Selector.tsx +11 -1
- package/src/SideNav/SideNav.doc.mjs +6 -6
- package/src/SideNav/SideNav.tsx +4 -2
- package/src/SideNav/SideNavHeading.tsx +12 -12
- package/src/SideNav/SideNavItem.tsx +4 -2
- package/src/Slider/Slider.tsx +3 -2
- package/src/Spinner/Spinner.test.tsx +147 -1
- package/src/Spinner/Spinner.tsx +120 -101
- package/src/StatusDot/StatusDot.doc.mjs +8 -2
- package/src/StatusDot/StatusDot.test.tsx +9 -0
- package/src/StatusDot/StatusDot.tsx +7 -1
- package/src/Stepper/Step.doc.mjs +98 -0
- package/src/Stepper/Step.tsx +1638 -0
- package/src/Stepper/StepStatus.ts +26 -0
- package/src/Stepper/Stepper.doc.mjs +370 -0
- package/src/Stepper/Stepper.test.tsx +1024 -0
- package/src/Stepper/Stepper.tsx +258 -0
- package/src/Stepper/StepperContext.ts +71 -0
- package/src/Stepper/index.ts +18 -0
- package/src/Stepper/stepper.stylex.ts +19 -0
- package/src/Switch/Switch.doc.mjs +2 -0
- package/src/Switch/Switch.test.tsx +10 -0
- package/src/Switch/Switch.tsx +6 -2
- package/src/TabList/Tab.doc.mjs +13 -1
- package/src/TabList/Tab.tsx +67 -7
- package/src/TabList/TabList.doc.mjs +22 -6
- package/src/TabList/TabList.test.tsx +559 -0
- package/src/TabList/TabList.tsx +490 -22
- package/src/TabList/TabListContext.ts +13 -2
- package/src/TabList/TabMenu.tsx +3 -2
- package/src/TabList/index.ts +6 -2
- package/src/Table/BaseTable.tsx +12 -4
- package/src/Table/Table.doc.mjs +9 -2
- package/src/Table/Table.test.tsx +132 -14
- package/src/Table/Table.tsx +3 -8
- package/src/Table/TableBody.doc.mjs +40 -0
- package/src/Table/TableFooter.doc.mjs +40 -0
- package/src/Table/TableHeader.doc.mjs +40 -0
- package/src/Table/TableRow.tsx +16 -5
- package/src/Table/plugins/groupedRows/useTableGroupedRows-perf.test.tsx +112 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +100 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +17 -8
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +34 -4
- package/src/Table/plugins/pagination/useTablePagination.tsx +35 -3
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -2
- package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +13 -7
- package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +12 -3
- package/src/Table/plugins/selection/useTableSelection.test.tsx +76 -0
- package/src/Table/plugins/selection/useTableSelection.tsx +40 -7
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
- package/src/Table/types.ts +22 -4
- package/src/Table/useBaseTablePlugins.ts +5 -0
- package/src/Table/useTableGroupedRows.doc.mjs +5 -4
- package/src/Table/useTablePagination.doc.mjs +7 -0
- package/src/Table/useTableRowStatus.doc.mjs +1 -1
- package/src/Table/useTableSelection.doc.mjs +31 -0
- package/src/Text/Text.test.tsx +23 -1
- package/src/Text/Text.tsx +6 -2
- package/src/TextArea/TextArea.doc.mjs +8 -2
- package/src/TextArea/TextArea.test.tsx +11 -0
- package/src/TextArea/TextArea.tsx +15 -8
- package/src/TextInput/TextInput.doc.mjs +10 -0
- package/src/TextInput/TextInput.tsx +3 -2
- package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
- package/src/TimeInput/TimeInput.tsx +2 -2
- package/src/Timestamp/Timestamp.tsx +4 -2
- package/src/Toast/Toast.doc.mjs +6 -0
- package/src/Token/TokenLink.tsx +2 -2
- package/src/Tokenizer/Tokenizer.doc.mjs +27 -0
- package/src/Tokenizer/Tokenizer.tsx +4 -0
- package/src/Toolbar/Toolbar.doc.mjs +5 -0
- package/src/Tooltip/Tooltip.doc.mjs +5 -0
- package/src/Tooltip/Tooltip.test.tsx +32 -0
- package/src/Tooltip/Tooltip.tsx +5 -0
- package/src/Tooltip/useTooltip.tsx +47 -24
- package/src/TopNav/TopNavHeading.tsx +5 -4
- package/src/TopNav/TopNavMegaMenu.tsx +3 -2
- package/src/TopNav/TopNavMenu.tsx +4 -3
- package/src/Typeahead/BaseTypeahead.doc.mjs +11 -0
- package/src/Typeahead/BaseTypeahead.tsx +85 -33
- package/src/Typeahead/Typeahead.doc.mjs +5 -0
- package/src/Typeahead/Typeahead.test.tsx +49 -0
- package/src/Typeahead/Typeahead.tsx +3 -2
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useContainerReveal.doc.mjs +2 -2
- package/src/hooks/useFocusTrap.test.tsx +14 -0
- package/src/hooks/useFocusTrap.ts +62 -111
- package/src/hooks/useFocusTrapEscapeShim.test.tsx +165 -0
- package/src/hooks/useHotkeys.ts +3 -18
- package/src/hooks/useMergedRefs.doc.mjs +79 -0
- package/src/hooks/useMergedRefs.test.tsx +62 -0
- package/src/hooks/useMergedRefs.ts +36 -0
- package/src/index.ts +1 -0
- package/src/theme/MediaTheme.doc.mjs +5 -5
- package/src/theme/derivedVarRegistry.test.ts +19 -3
- package/src/theme/derivedVarRegistry.ts +23 -4
- package/src/theme/generateThemeRules.test.ts +37 -0
- package/src/theme/syntax/tokens.ts +5 -2
- package/src/utils/groupItems.ts +12 -6
- package/src/utils/index.ts +1 -1
- package/src/utils/isApplePlatform.test.ts +61 -0
- package/src/utils/isApplePlatform.ts +37 -0
- package/src/utils/sharedResizeObserver.ts +10 -2
- package/src/utils/timeParser.test.ts +6 -1
- package/src/utils/timeParser.ts +35 -13
- package/src/__tests__/inputWidthContract.test.tsx +0 -69
|
@@ -12,6 +12,8 @@ import {
|
|
|
12
12
|
} from 'vitest';
|
|
13
13
|
import {render, screen, fireEvent, act} from '@testing-library/react';
|
|
14
14
|
import React, {useState} from 'react';
|
|
15
|
+
import * as stylex from '@stylexjs/stylex';
|
|
16
|
+
import {spacingVars} from '../theme/tokens.stylex';
|
|
15
17
|
import {PowerSearch} from './PowerSearch';
|
|
16
18
|
import {PowerSearchEditPopover} from './PowerSearchEditPopover';
|
|
17
19
|
import {useInternalConfig} from './useInternalConfig';
|
|
@@ -326,3 +328,202 @@ describe('PowerSearch', () => {
|
|
|
326
328
|
expect(onSave).toHaveBeenCalledTimes(1);
|
|
327
329
|
});
|
|
328
330
|
});
|
|
331
|
+
|
|
332
|
+
// =============================================================================
|
|
333
|
+
// Narrow-width layout (#4761)
|
|
334
|
+
// =============================================================================
|
|
335
|
+
|
|
336
|
+
// jsdom performs no real layout (and never matches @container conditions), so
|
|
337
|
+
// these tests assert the declarations that produce the narrow-width behavior
|
|
338
|
+
// rather than measured geometry, via StyleX probe classes: one deterministic
|
|
339
|
+
// atomic class per property/value/condition, so an element carries a probe's
|
|
340
|
+
// classes exactly when it has the same declaration. The dev debug class
|
|
341
|
+
// (contains "__") is excluded.
|
|
342
|
+
const CHIP_ROW_COLLAPSE = '@container (max-width: 399px)';
|
|
343
|
+
|
|
344
|
+
const probe = stylex.create({
|
|
345
|
+
responsiveLayerMinWidth: {
|
|
346
|
+
minWidth: `min(400px, calc(100% - ${spacingVars['--spacing-4']}))`,
|
|
347
|
+
},
|
|
348
|
+
fixedLayerMinWidth: {minWidth: 400},
|
|
349
|
+
queryContainer: {containerType: 'inline-size'},
|
|
350
|
+
responsiveWrap: {
|
|
351
|
+
flexWrap: {default: 'nowrap', [CHIP_ROW_COLLAPSE]: 'wrap'},
|
|
352
|
+
},
|
|
353
|
+
cellMaxWidth: {maxWidth: '100%'},
|
|
354
|
+
nestedFieldCellWidth: {width: 200},
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
function atomicClasses(style: (typeof probe)[keyof typeof probe]): string[] {
|
|
358
|
+
const {className = ''} = stylex.props(style);
|
|
359
|
+
const classes = className
|
|
360
|
+
.split(' ')
|
|
361
|
+
.filter(c => c !== '' && !c.includes('__'));
|
|
362
|
+
// A probe resolving to no atomic classes would make every assertion built
|
|
363
|
+
// on it vacuous, including the not-toHaveClass loops; fail loudly instead.
|
|
364
|
+
expect(classes.length).toBeGreaterThan(0);
|
|
365
|
+
return classes;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
function expectProbeClasses(
|
|
369
|
+
el: HTMLElement,
|
|
370
|
+
style: (typeof probe)[keyof typeof probe],
|
|
371
|
+
) {
|
|
372
|
+
for (const cls of atomicClasses(style)) {
|
|
373
|
+
expect(el).toHaveClass(cls);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
describe('narrow-width layout (#4761)', () => {
|
|
378
|
+
function EditHarness() {
|
|
379
|
+
const internalConfig = useInternalConfig(testConfig);
|
|
380
|
+
return (
|
|
381
|
+
<PowerSearchEditPopover
|
|
382
|
+
config={internalConfig}
|
|
383
|
+
filter={{
|
|
384
|
+
field: 'status',
|
|
385
|
+
operator: 'is',
|
|
386
|
+
value: {type: 'string', value: 'open'},
|
|
387
|
+
}}
|
|
388
|
+
mode="edit"
|
|
389
|
+
onSave={() => {}}
|
|
390
|
+
onCancel={() => {}}
|
|
391
|
+
/>
|
|
392
|
+
);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
function getChipRow(container: HTMLElement): HTMLElement {
|
|
396
|
+
// Locate the chip row by its collapse declaration, then sanity-check it
|
|
397
|
+
// really is the row holding the field / operator / value cells.
|
|
398
|
+
const [rowCls] = atomicClasses(probe.responsiveWrap);
|
|
399
|
+
const row = container.querySelector(`.${rowCls}`) as HTMLElement;
|
|
400
|
+
expect(row).not.toBeNull();
|
|
401
|
+
expect(row).toHaveClass('astryx-stack');
|
|
402
|
+
expect(row.children).toHaveLength(3);
|
|
403
|
+
return row;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
it('popover root establishes the container the collapse query measures', () => {
|
|
407
|
+
const {container} = render(<EditHarness />);
|
|
408
|
+
|
|
409
|
+
// Without inline-size containment on the root, no @container condition
|
|
410
|
+
// in this file can match and the chip rows would never wrap.
|
|
411
|
+
const root = container.firstElementChild as HTMLElement;
|
|
412
|
+
expect(root).not.toBeNull();
|
|
413
|
+
expectProbeClasses(root, probe.queryContainer);
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
it('filter chip row wraps below the collapse width instead of overflowing', () => {
|
|
417
|
+
const {container} = render(<EditHarness />);
|
|
418
|
+
|
|
419
|
+
const row = getChipRow(container);
|
|
420
|
+
expectProbeClasses(row, probe.responsiveWrap);
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
it('operator cell is capped at the row width', () => {
|
|
424
|
+
const {container} = render(<EditHarness />);
|
|
425
|
+
|
|
426
|
+
// Capped so a long translated operator label truncates inside the
|
|
427
|
+
// Selector trigger instead of pushing the row wider than the popover.
|
|
428
|
+
const operatorCell = getChipRow(container).children[1] as HTMLElement;
|
|
429
|
+
expectProbeClasses(operatorCell, probe.cellMaxWidth);
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
it('nested sub-filter rows wrap instead of overflowing on one line', () => {
|
|
433
|
+
const nestedConfig: PowerSearchConfig = {
|
|
434
|
+
name: 'test-nested',
|
|
435
|
+
fields: [
|
|
436
|
+
{
|
|
437
|
+
key: 'group',
|
|
438
|
+
label: 'Group',
|
|
439
|
+
operators: [
|
|
440
|
+
{key: 'all_of', label: 'all of', value: {type: 'nested'}},
|
|
441
|
+
],
|
|
442
|
+
},
|
|
443
|
+
{
|
|
444
|
+
key: 'status',
|
|
445
|
+
label: 'Status',
|
|
446
|
+
operators: [{key: 'is', label: 'is', value: {type: 'string'}}],
|
|
447
|
+
},
|
|
448
|
+
],
|
|
449
|
+
};
|
|
450
|
+
|
|
451
|
+
function NestedHarness() {
|
|
452
|
+
const internalConfig = useInternalConfig(nestedConfig);
|
|
453
|
+
return (
|
|
454
|
+
<PowerSearchEditPopover
|
|
455
|
+
config={internalConfig}
|
|
456
|
+
filter={{
|
|
457
|
+
field: 'group',
|
|
458
|
+
operator: 'all_of',
|
|
459
|
+
value: {
|
|
460
|
+
type: 'nested',
|
|
461
|
+
value: [
|
|
462
|
+
{
|
|
463
|
+
field: 'status',
|
|
464
|
+
operator: 'is',
|
|
465
|
+
value: {type: 'string', value: 'open'},
|
|
466
|
+
},
|
|
467
|
+
],
|
|
468
|
+
},
|
|
469
|
+
}}
|
|
470
|
+
mode="edit"
|
|
471
|
+
onSave={() => {}}
|
|
472
|
+
onCancel={() => {}}
|
|
473
|
+
/>
|
|
474
|
+
);
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
const {container} = render(<NestedHarness />);
|
|
478
|
+
|
|
479
|
+
// Locate the sub-filter row through its fixed-width field cell.
|
|
480
|
+
const [cellCls] = atomicClasses(probe.nestedFieldCellWidth);
|
|
481
|
+
const fieldCell = container.querySelector(`.${cellCls}`) as HTMLElement;
|
|
482
|
+
expect(fieldCell).not.toBeNull();
|
|
483
|
+
const row = fieldCell.parentElement as HTMLElement;
|
|
484
|
+
expect(row).toHaveClass('astryx-stack');
|
|
485
|
+
expectProbeClasses(row, probe.responsiveWrap);
|
|
486
|
+
|
|
487
|
+
// The fixed-width cells are capped so they cannot clip in containers
|
|
488
|
+
// narrower than their design width (or under deep TreeList indentation).
|
|
489
|
+
expectProbeClasses(fieldCell, probe.cellMaxWidth);
|
|
490
|
+
const operatorCell = row.children[1] as HTMLElement;
|
|
491
|
+
expectProbeClasses(operatorCell, probe.cellMaxWidth);
|
|
492
|
+
});
|
|
493
|
+
|
|
494
|
+
it('edit popover layer yields to viewports narrower than its 400px floor', () => {
|
|
495
|
+
const filters: PowerSearchFilter[] = [
|
|
496
|
+
{field: 'status', operator: 'is', value: {type: 'string', value: 'open'}},
|
|
497
|
+
];
|
|
498
|
+
|
|
499
|
+
function Harness() {
|
|
500
|
+
const [currentFilters, setCurrentFilters] = useState(filters);
|
|
501
|
+
return (
|
|
502
|
+
<PowerSearch
|
|
503
|
+
config={testConfig}
|
|
504
|
+
filters={currentFilters}
|
|
505
|
+
onChange={newFilters => setCurrentFilters([...newFilters])}
|
|
506
|
+
/>
|
|
507
|
+
);
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
render(<Harness />);
|
|
511
|
+
|
|
512
|
+
act(() => {
|
|
513
|
+
fireEvent.click(screen.getByText('Status: is'));
|
|
514
|
+
flushRAF();
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
const layer = screen
|
|
518
|
+
.getByText('Cancel')
|
|
519
|
+
.closest('[popover]') as HTMLElement;
|
|
520
|
+
expect(layer).not.toBeNull();
|
|
521
|
+
|
|
522
|
+
// The fixed 400px floor is replaced by one clamped to the available
|
|
523
|
+
// inline space, so the popover never opens wider than the screen.
|
|
524
|
+
expectProbeClasses(layer, probe.responsiveLayerMinWidth);
|
|
525
|
+
for (const cls of atomicClasses(probe.fixedLayerMinWidth)) {
|
|
526
|
+
expect(layer).not.toHaveClass(cls);
|
|
527
|
+
}
|
|
528
|
+
});
|
|
529
|
+
});
|
|
@@ -32,13 +32,23 @@ import type {
|
|
|
32
32
|
OperatorValue,
|
|
33
33
|
} from './types';
|
|
34
34
|
|
|
35
|
+
// Below the popover layer's 400px floor (see popoverLayerStyles in
|
|
36
|
+
// PowerSearch.tsx) the chip rows collapse from one line to wrapped lines.
|
|
37
|
+
// A container query, not a viewport one, so the rows track the width the
|
|
38
|
+
// popover actually got (#4761).
|
|
39
|
+
const CHIP_ROW_COLLAPSE = '@container (max-width: 399px)';
|
|
40
|
+
|
|
35
41
|
const styles = stylex.create({
|
|
36
42
|
container: {
|
|
37
43
|
overflow: 'hidden',
|
|
44
|
+
containerType: 'inline-size',
|
|
38
45
|
},
|
|
39
46
|
content: {
|
|
40
47
|
padding: spacingVars['--spacing-4'],
|
|
41
48
|
},
|
|
49
|
+
chipRow: {
|
|
50
|
+
flexWrap: {default: 'nowrap', [CHIP_ROW_COLLAPSE]: 'wrap'},
|
|
51
|
+
},
|
|
42
52
|
footer: {
|
|
43
53
|
padding: spacingVars['--spacing-3'],
|
|
44
54
|
paddingTop: 0,
|
|
@@ -51,6 +61,9 @@ const styles = stylex.create({
|
|
|
51
61
|
operatorSelector: {
|
|
52
62
|
flexGrow: 1,
|
|
53
63
|
flexShrink: 0,
|
|
64
|
+
// Long translated operator labels truncate in the Selector trigger
|
|
65
|
+
// instead of pushing the row wider than the popover (#4761).
|
|
66
|
+
maxWidth: '100%',
|
|
54
67
|
},
|
|
55
68
|
valueEditor: {
|
|
56
69
|
flexGrow: 2,
|
|
@@ -63,10 +76,12 @@ const styles = stylex.create({
|
|
|
63
76
|
nestedFieldSelector: {
|
|
64
77
|
flexShrink: 0,
|
|
65
78
|
width: 200,
|
|
79
|
+
maxWidth: '100%',
|
|
66
80
|
},
|
|
67
81
|
nestedOperatorSelector: {
|
|
68
82
|
flexShrink: 0,
|
|
69
83
|
width: 180,
|
|
84
|
+
maxWidth: '100%',
|
|
70
85
|
},
|
|
71
86
|
nestedRow: {
|
|
72
87
|
width: '100%',
|
|
@@ -90,6 +105,8 @@ export interface PowerSearchEditPopoverProps {
|
|
|
90
105
|
onCancel: () => void;
|
|
91
106
|
/** Label for the save button. @default 'Apply' */
|
|
92
107
|
saveButtonLabel?: string;
|
|
108
|
+
/** Max suggestions in string and entity value typeaheads. */
|
|
109
|
+
maxMenuItems?: number;
|
|
93
110
|
/** Whether the filter is read-only. */
|
|
94
111
|
isReadOnly?: boolean;
|
|
95
112
|
}
|
|
@@ -232,6 +249,7 @@ interface NestedSubFilterRowProps {
|
|
|
232
249
|
config: InternalConfig;
|
|
233
250
|
subFilter: EditablePartialFilter;
|
|
234
251
|
onChange: (subFilter: EditablePartialFilter) => void;
|
|
252
|
+
maxMenuItems?: number;
|
|
235
253
|
isReadOnly: boolean;
|
|
236
254
|
}
|
|
237
255
|
|
|
@@ -239,6 +257,7 @@ function NestedSubFilterRow({
|
|
|
239
257
|
config,
|
|
240
258
|
subFilter,
|
|
241
259
|
onChange,
|
|
260
|
+
maxMenuItems,
|
|
242
261
|
isReadOnly,
|
|
243
262
|
}: NestedSubFilterRowProps) {
|
|
244
263
|
const t = useTranslator();
|
|
@@ -309,7 +328,7 @@ function NestedSubFilterRow({
|
|
|
309
328
|
);
|
|
310
329
|
|
|
311
330
|
return (
|
|
312
|
-
<HStack gap={2} vAlign="center">
|
|
331
|
+
<HStack gap={2} vAlign="center" xstyle={styles.chipRow}>
|
|
313
332
|
<div {...stylex.props(styles.nestedFieldSelector)}>
|
|
314
333
|
<Selector
|
|
315
334
|
label={t('@astryx.powersearch.editor.field')}
|
|
@@ -341,6 +360,7 @@ function NestedSubFilterRow({
|
|
|
341
360
|
filterValue={subFilter.value}
|
|
342
361
|
onChange={handleValueChange}
|
|
343
362
|
config={config}
|
|
363
|
+
maxMenuItems={maxMenuItems}
|
|
344
364
|
isDisabled={isReadOnly}
|
|
345
365
|
/>
|
|
346
366
|
</div>
|
|
@@ -359,6 +379,7 @@ interface NestedEditorProps {
|
|
|
359
379
|
operatorOptions: {value: string; label: string}[];
|
|
360
380
|
onOperatorChange: (operatorKey: string) => void;
|
|
361
381
|
onPartialFilterChange: (filter: PartialFilter) => void;
|
|
382
|
+
maxMenuItems?: number;
|
|
362
383
|
isReadOnly: boolean;
|
|
363
384
|
}
|
|
364
385
|
|
|
@@ -368,6 +389,7 @@ function NestedEditor({
|
|
|
368
389
|
operatorOptions,
|
|
369
390
|
onOperatorChange,
|
|
370
391
|
onPartialFilterChange,
|
|
392
|
+
maxMenuItems,
|
|
371
393
|
isReadOnly,
|
|
372
394
|
}: NestedEditorProps) {
|
|
373
395
|
const t = useTranslator();
|
|
@@ -489,6 +511,7 @@ function NestedEditor({
|
|
|
489
511
|
config={config}
|
|
490
512
|
subFilter={sf}
|
|
491
513
|
onChange={updated => handleUpdate(itemPath, updated)}
|
|
514
|
+
maxMenuItems={maxMenuItems}
|
|
492
515
|
isReadOnly={isReadOnly}
|
|
493
516
|
/>
|
|
494
517
|
),
|
|
@@ -515,6 +538,7 @@ function NestedEditor({
|
|
|
515
538
|
config={config}
|
|
516
539
|
subFilter={sf}
|
|
517
540
|
onChange={updated => handleUpdate(itemPath, updated)}
|
|
541
|
+
maxMenuItems={maxMenuItems}
|
|
518
542
|
isReadOnly={isReadOnly}
|
|
519
543
|
/>
|
|
520
544
|
),
|
|
@@ -593,6 +617,7 @@ export function PowerSearchEditPopover({
|
|
|
593
617
|
onSave,
|
|
594
618
|
onCancel,
|
|
595
619
|
saveButtonLabel: saveButtonLabelFromProps,
|
|
620
|
+
maxMenuItems,
|
|
596
621
|
isReadOnly = false,
|
|
597
622
|
}: PowerSearchEditPopoverProps) {
|
|
598
623
|
const t = useTranslator();
|
|
@@ -762,6 +787,7 @@ export function PowerSearchEditPopover({
|
|
|
762
787
|
operatorOptions={operatorOptions}
|
|
763
788
|
onOperatorChange={handleOperatorChange}
|
|
764
789
|
onPartialFilterChange={setPartialFilter}
|
|
790
|
+
maxMenuItems={maxMenuItems}
|
|
765
791
|
isReadOnly={isReadOnly}
|
|
766
792
|
/>
|
|
767
793
|
</VStack>
|
|
@@ -802,7 +828,7 @@ export function PowerSearchEditPopover({
|
|
|
802
828
|
return (
|
|
803
829
|
<div {...stylex.props(styles.container)} onKeyDown={handleKeyDown}>
|
|
804
830
|
<div {...stylex.props(styles.content)}>
|
|
805
|
-
<HStack gap={2}>
|
|
831
|
+
<HStack gap={2} xstyle={styles.chipRow}>
|
|
806
832
|
<div {...stylex.props(styles.fieldSelector)}>
|
|
807
833
|
<Selector
|
|
808
834
|
label={t('@astryx.powersearch.editor.field')}
|
|
@@ -835,6 +861,7 @@ export function PowerSearchEditPopover({
|
|
|
835
861
|
onChange={handleValueChange}
|
|
836
862
|
onEnter={handleSave}
|
|
837
863
|
config={config}
|
|
864
|
+
maxMenuItems={maxMenuItems}
|
|
838
865
|
isDisabled={isReadOnly}
|
|
839
866
|
/>
|
|
840
867
|
</div>
|
|
@@ -10,7 +10,11 @@
|
|
|
10
10
|
import {describe, it, expect, vi, beforeAll, afterAll} from 'vitest';
|
|
11
11
|
import {render, screen, fireEvent, act} from '@testing-library/react';
|
|
12
12
|
import {PowerSearchValueEditor} from './PowerSearchValueEditor';
|
|
13
|
-
import type {
|
|
13
|
+
import type {
|
|
14
|
+
FilterValueEntityList,
|
|
15
|
+
OperatorValue,
|
|
16
|
+
PowerSearchEntity,
|
|
17
|
+
} from './types';
|
|
14
18
|
import type {InternalConfig} from './useInternalConfig';
|
|
15
19
|
import type {SearchableItem, SearchSource} from '../Typeahead/types';
|
|
16
20
|
|
|
@@ -404,3 +408,45 @@ describe('StringListEditor (#1107)', () => {
|
|
|
404
408
|
expect(screen.getByRole('combobox')).toBeInTheDocument();
|
|
405
409
|
});
|
|
406
410
|
});
|
|
411
|
+
|
|
412
|
+
describe('maxMenuItems', () => {
|
|
413
|
+
const source = createSearchSource(
|
|
414
|
+
Array.from({length: 6}, (_, index) => ({
|
|
415
|
+
id: `option-${index}`,
|
|
416
|
+
label: `Option ${index}`,
|
|
417
|
+
})),
|
|
418
|
+
);
|
|
419
|
+
|
|
420
|
+
async function expectCapped(operatorValue: OperatorValue) {
|
|
421
|
+
render(
|
|
422
|
+
<PowerSearchValueEditor
|
|
423
|
+
operatorValue={operatorValue}
|
|
424
|
+
filterValue={undefined}
|
|
425
|
+
onChange={vi.fn()}
|
|
426
|
+
config={stubConfig}
|
|
427
|
+
maxMenuItems={2}
|
|
428
|
+
/>,
|
|
429
|
+
);
|
|
430
|
+
|
|
431
|
+
await act(async () => {
|
|
432
|
+
fireEvent.change(screen.getByRole('combobox'), {
|
|
433
|
+
target: {value: 'Option'},
|
|
434
|
+
});
|
|
435
|
+
await new Promise(resolve => setTimeout(resolve, 200));
|
|
436
|
+
});
|
|
437
|
+
|
|
438
|
+
expect(screen.getAllByRole('option', {hidden: true})).toHaveLength(2);
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
it('caps string suggestions', async () => {
|
|
442
|
+
await expectCapped({type: 'string', searchSource: source});
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
it('caps string-list suggestions', async () => {
|
|
446
|
+
await expectCapped({type: 'string_list', searchSource: source});
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
it('caps entity-list suggestions', async () => {
|
|
450
|
+
await expectCapped({type: 'entity_list', searchSource: source});
|
|
451
|
+
});
|
|
452
|
+
});
|
|
@@ -40,6 +40,8 @@ export interface PowerSearchValueEditorProps {
|
|
|
40
40
|
onChange: (value: FilterValue, shouldSave?: boolean) => void;
|
|
41
41
|
onEnter?: () => void;
|
|
42
42
|
config: InternalConfig;
|
|
43
|
+
/** Max suggestions in string and entity value typeaheads. */
|
|
44
|
+
maxMenuItems?: number;
|
|
43
45
|
isDisabled?: boolean;
|
|
44
46
|
timezoneID?: string;
|
|
45
47
|
}
|
|
@@ -80,11 +82,13 @@ function StringEditor({
|
|
|
80
82
|
filterValue,
|
|
81
83
|
onChange,
|
|
82
84
|
onEnter: _onEnter,
|
|
85
|
+
maxMenuItems,
|
|
83
86
|
}: {
|
|
84
87
|
operatorValue: OperatorValue & {type: 'string'};
|
|
85
88
|
filterValue: FilterValue | undefined;
|
|
86
89
|
onChange: (value: FilterValue, shouldSave?: boolean) => void;
|
|
87
90
|
onEnter?: () => void;
|
|
91
|
+
maxMenuItems?: number;
|
|
88
92
|
}) {
|
|
89
93
|
const t = useTranslator();
|
|
90
94
|
const currentValue = filterValue?.type === 'string' ? filterValue.value : '';
|
|
@@ -111,6 +115,7 @@ function StringEditor({
|
|
|
111
115
|
}}
|
|
112
116
|
placeholder={t('@astryx.powersearch.valueEditor.searchPlaceholder')}
|
|
113
117
|
debounceMs={150}
|
|
118
|
+
maxMenuItems={maxMenuItems}
|
|
114
119
|
/>
|
|
115
120
|
);
|
|
116
121
|
}
|
|
@@ -132,10 +137,12 @@ function StringListEditor({
|
|
|
132
137
|
operatorValue,
|
|
133
138
|
filterValue,
|
|
134
139
|
onChange,
|
|
140
|
+
maxMenuItems,
|
|
135
141
|
}: {
|
|
136
142
|
operatorValue: OperatorValue & {type: 'string_list'};
|
|
137
143
|
filterValue: FilterValue | undefined;
|
|
138
144
|
onChange: (value: FilterValue) => void;
|
|
145
|
+
maxMenuItems?: number;
|
|
139
146
|
}) {
|
|
140
147
|
const t = useTranslator();
|
|
141
148
|
const currentValue: SearchableItem[] = useMemo(() => {
|
|
@@ -176,6 +183,7 @@ function StringListEditor({
|
|
|
176
183
|
placeholder={t('@astryx.powersearch.valueEditor.addValuesPlaceholder')}
|
|
177
184
|
debounceMs={operatorValue.searchSource ? 150 : 0}
|
|
178
185
|
hasCreate={hasCreate}
|
|
186
|
+
maxMenuItems={maxMenuItems}
|
|
179
187
|
/>
|
|
180
188
|
);
|
|
181
189
|
}
|
|
@@ -537,10 +545,12 @@ function EntityListEditor({
|
|
|
537
545
|
operatorValue,
|
|
538
546
|
filterValue,
|
|
539
547
|
onChange,
|
|
548
|
+
maxMenuItems,
|
|
540
549
|
}: {
|
|
541
550
|
operatorValue: OperatorValue & {type: 'entity_list'};
|
|
542
551
|
filterValue: FilterValue | undefined;
|
|
543
552
|
onChange: (value: FilterValue) => void;
|
|
553
|
+
maxMenuItems?: number;
|
|
544
554
|
}) {
|
|
545
555
|
const t = useTranslator();
|
|
546
556
|
const source = useMemo<SearchSource<SearchableItem>>(() => {
|
|
@@ -588,6 +598,7 @@ function EntityListEditor({
|
|
|
588
598
|
renderItem={operatorValue.renderItem}
|
|
589
599
|
placeholder={t('@astryx.powersearch.valueEditor.searchPlaceholder')}
|
|
590
600
|
debounceMs={operatorValue.searchSource ? 150 : 0}
|
|
601
|
+
maxMenuItems={maxMenuItems}
|
|
591
602
|
/>
|
|
592
603
|
);
|
|
593
604
|
}
|
|
@@ -631,6 +642,7 @@ export function PowerSearchValueEditor({
|
|
|
631
642
|
filterValue,
|
|
632
643
|
onChange,
|
|
633
644
|
onEnter,
|
|
645
|
+
maxMenuItems,
|
|
634
646
|
isDisabled,
|
|
635
647
|
}: PowerSearchValueEditorProps) {
|
|
636
648
|
switch (operatorValue.type) {
|
|
@@ -644,6 +656,7 @@ export function PowerSearchValueEditor({
|
|
|
644
656
|
filterValue={filterValue}
|
|
645
657
|
onChange={onChange}
|
|
646
658
|
onEnter={onEnter}
|
|
659
|
+
maxMenuItems={maxMenuItems}
|
|
647
660
|
/>
|
|
648
661
|
);
|
|
649
662
|
|
|
@@ -653,6 +666,7 @@ export function PowerSearchValueEditor({
|
|
|
653
666
|
operatorValue={operatorValue}
|
|
654
667
|
filterValue={filterValue}
|
|
655
668
|
onChange={onChange}
|
|
669
|
+
maxMenuItems={maxMenuItems}
|
|
656
670
|
/>
|
|
657
671
|
);
|
|
658
672
|
|
|
@@ -734,6 +748,7 @@ export function PowerSearchValueEditor({
|
|
|
734
748
|
operatorValue={operatorValue}
|
|
735
749
|
filterValue={filterValue}
|
|
736
750
|
onChange={onChange}
|
|
751
|
+
maxMenuItems={maxMenuItems}
|
|
737
752
|
/>
|
|
738
753
|
);
|
|
739
754
|
|
package/src/PowerSearch/types.ts
CHANGED
|
@@ -384,6 +384,8 @@ export interface PowerSearchAuxData {
|
|
|
384
384
|
readonly filterValue?: FilterValue;
|
|
385
385
|
/** Index in the filters array (for editing/removing). */
|
|
386
386
|
readonly filterIndex?: number;
|
|
387
|
+
/** Section heading for field-browser entries. */
|
|
388
|
+
readonly group?: string;
|
|
387
389
|
}
|
|
388
390
|
|
|
389
391
|
export type PowerSearchItem = SearchableItem<PowerSearchAuxData>;
|
|
@@ -21,10 +21,15 @@ import type {
|
|
|
21
21
|
// Helpers
|
|
22
22
|
// =============================================================================
|
|
23
23
|
|
|
24
|
-
function createSource(
|
|
24
|
+
function createSource(
|
|
25
|
+
config: PowerSearchConfig,
|
|
26
|
+
// Uncapped by default so these tests exercise matching and ranking rather
|
|
27
|
+
// than the typed-result cap, which has its own test below.
|
|
28
|
+
maxTypedResults: number = Number.POSITIVE_INFINITY,
|
|
29
|
+
) {
|
|
25
30
|
const {result} = renderHook(() => {
|
|
26
31
|
const internal = useInternalConfig(config);
|
|
27
|
-
return usePowerSearchSource(internal);
|
|
32
|
+
return usePowerSearchSource(internal, maxTypedResults);
|
|
28
33
|
});
|
|
29
34
|
return result.current;
|
|
30
35
|
}
|
|
@@ -92,6 +97,27 @@ const configWithContentSearch: PowerSearchConfig = {
|
|
|
92
97
|
contentSearchFieldKey: 'title',
|
|
93
98
|
};
|
|
94
99
|
|
|
100
|
+
const groupedConfig: PowerSearchConfig = {
|
|
101
|
+
name: 'GroupedSearch',
|
|
102
|
+
fields: [
|
|
103
|
+
field('team_a', 'Field Team A', 'Team'),
|
|
104
|
+
field('plain_a', 'Field Plain A'),
|
|
105
|
+
field('time_a', 'Field Time A', 'Time'),
|
|
106
|
+
field('team_b', 'Field Team B', 'Team'),
|
|
107
|
+
field('plain_b', 'Field Plain B'),
|
|
108
|
+
field('time_b', 'Field Time B', 'Time'),
|
|
109
|
+
],
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
function field(key: string, label: string, group?: string) {
|
|
113
|
+
return {
|
|
114
|
+
key,
|
|
115
|
+
label,
|
|
116
|
+
group,
|
|
117
|
+
operators: [{key: 'is', label: 'is', value: {type: 'string'} as const}],
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
95
121
|
// =============================================================================
|
|
96
122
|
// Tests
|
|
97
123
|
// =============================================================================
|
|
@@ -125,6 +151,21 @@ describe('usePowerSearchSource', () => {
|
|
|
125
151
|
const source = createSource(baseConfig);
|
|
126
152
|
expect(syncSearch(source, '')).toEqual(syncBootstrap(source));
|
|
127
153
|
});
|
|
154
|
+
|
|
155
|
+
it('orders ungrouped fields before named groups', () => {
|
|
156
|
+
const items = syncBootstrap(createSource(groupedConfig));
|
|
157
|
+
expect(items.map(item => item.label)).toEqual([
|
|
158
|
+
'Field Plain A',
|
|
159
|
+
'Field Plain B',
|
|
160
|
+
'Field Team A',
|
|
161
|
+
'Field Team B',
|
|
162
|
+
'Field Time A',
|
|
163
|
+
'Field Time B',
|
|
164
|
+
]);
|
|
165
|
+
expect(
|
|
166
|
+
items.map(item => (item.auxiliaryData as PowerSearchAuxData).group),
|
|
167
|
+
).toEqual([undefined, undefined, 'Team', 'Team', 'Time', 'Time']);
|
|
168
|
+
});
|
|
128
169
|
});
|
|
129
170
|
|
|
130
171
|
describe('search (with query)', () => {
|
|
@@ -176,6 +217,23 @@ describe('usePowerSearchSource', () => {
|
|
|
176
217
|
const aux = isItem?.auxiliaryData as PowerSearchAuxData;
|
|
177
218
|
expect(aux.operatorKey).toBe('is');
|
|
178
219
|
});
|
|
220
|
+
|
|
221
|
+
it('leaves ranked results flat and in relevance order', () => {
|
|
222
|
+
const results = syncSearch(createSource(groupedConfig), 'field');
|
|
223
|
+
expect(results.slice(0, 6).map(item => item.label)).toEqual([
|
|
224
|
+
'Field Team A',
|
|
225
|
+
'Field Team A is',
|
|
226
|
+
'Field Plain A',
|
|
227
|
+
'Field Plain A is',
|
|
228
|
+
'Field Time A',
|
|
229
|
+
'Field Time A is',
|
|
230
|
+
]);
|
|
231
|
+
expect(
|
|
232
|
+
results.every(
|
|
233
|
+
item => (item.auxiliaryData as PowerSearchAuxData).group == null,
|
|
234
|
+
),
|
|
235
|
+
).toBe(true);
|
|
236
|
+
});
|
|
179
237
|
});
|
|
180
238
|
|
|
181
239
|
describe('contentSearchFieldKey', () => {
|
|
@@ -539,3 +597,25 @@ describe('usePowerSearchSource', () => {
|
|
|
539
597
|
});
|
|
540
598
|
});
|
|
541
599
|
});
|
|
600
|
+
|
|
601
|
+
describe('typed-result cap', () => {
|
|
602
|
+
const manyFields: PowerSearchConfig = {
|
|
603
|
+
name: 'many',
|
|
604
|
+
fields: Array.from({length: 25}, (_, i) => ({
|
|
605
|
+
key: `field_${i}`,
|
|
606
|
+
label: `Zebra ${String(i).padStart(2, '0')}`,
|
|
607
|
+
operators: [{key: 'is', label: 'is', value: {type: 'string'} as const}],
|
|
608
|
+
})),
|
|
609
|
+
};
|
|
610
|
+
|
|
611
|
+
it('caps results for a typed query', () => {
|
|
612
|
+
const source = createSource(manyFields, 10);
|
|
613
|
+
expect(source.search('zebra')).toHaveLength(10);
|
|
614
|
+
});
|
|
615
|
+
|
|
616
|
+
it('never caps the field list for an empty query', () => {
|
|
617
|
+
const source = createSource(manyFields, 10);
|
|
618
|
+
expect(syncBootstrap(source)).toHaveLength(25);
|
|
619
|
+
expect(source.search('')).toHaveLength(25);
|
|
620
|
+
});
|
|
621
|
+
});
|
|
@@ -14,13 +14,20 @@
|
|
|
14
14
|
|
|
15
15
|
import {useMemo} from 'react';
|
|
16
16
|
import type {SearchSource} from '../Typeahead/types';
|
|
17
|
+
import {groupItems} from '../utils';
|
|
17
18
|
import {useTranslator} from '../i18n';
|
|
18
19
|
import {resolveOperatorLabel} from './resolveOperatorLabel';
|
|
19
20
|
import type {InternalConfig} from './useInternalConfig';
|
|
20
21
|
import type {PowerSearchItem, PowerSearchOperator, FilterValue} from './types';
|
|
21
22
|
|
|
23
|
+
/**
|
|
24
|
+
* @param maxTypedResults Cap applied to ranked results for a non-empty query.
|
|
25
|
+
* The source never truncates empty-query browsing; PowerSearch's view applies
|
|
26
|
+
* a separate 1,000-row safety ceiling.
|
|
27
|
+
*/
|
|
22
28
|
export function usePowerSearchSource(
|
|
23
29
|
config: InternalConfig,
|
|
30
|
+
maxTypedResults: number,
|
|
24
31
|
): SearchSource<PowerSearchItem> {
|
|
25
32
|
const t = useTranslator();
|
|
26
33
|
return useMemo(() => {
|
|
@@ -198,14 +205,14 @@ export function usePowerSearchSource(
|
|
|
198
205
|
}
|
|
199
206
|
}
|
|
200
207
|
|
|
201
|
-
return results;
|
|
208
|
+
return results.slice(0, maxTypedResults);
|
|
202
209
|
},
|
|
203
210
|
|
|
204
211
|
bootstrap(): PowerSearchItem[] {
|
|
205
212
|
return allItems;
|
|
206
213
|
},
|
|
207
214
|
};
|
|
208
|
-
}, [config, t]);
|
|
215
|
+
}, [config, t, maxTypedResults]);
|
|
209
216
|
}
|
|
210
217
|
|
|
211
218
|
interface ValueMatch {
|
|
@@ -282,9 +289,12 @@ function buildFieldItems(config: InternalConfig): PowerSearchItem[] {
|
|
|
282
289
|
auxiliaryData: {
|
|
283
290
|
fieldKey: field.key,
|
|
284
291
|
operatorKey: defaultOp?.key,
|
|
292
|
+
group: field.group,
|
|
285
293
|
},
|
|
286
294
|
});
|
|
287
295
|
}
|
|
288
296
|
|
|
289
|
-
return items
|
|
297
|
+
return groupItems(items, {ungroupedFirst: true}).flatMap(
|
|
298
|
+
group => group.items,
|
|
299
|
+
);
|
|
290
300
|
}
|