@wheelhouse/ui 0.2.2 → 0.2.3
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/dist/blocks/columns/columns-types.d.ts +40 -0
- package/dist/blocks/columns/columns-types.d.ts.map +1 -0
- package/dist/blocks/columns/columns-types.js +10 -0
- package/dist/blocks/columns/columns-utils.d.ts +13 -0
- package/dist/blocks/columns/columns-utils.d.ts.map +1 -0
- package/dist/blocks/columns/columns-utils.js +85 -0
- package/dist/blocks/columns/columns.d.ts +3 -0
- package/dist/blocks/columns/columns.d.ts.map +1 -0
- package/dist/blocks/columns/columns.js +79 -0
- package/dist/blocks/columns/columns.stories.d.ts +12 -0
- package/dist/blocks/columns/columns.stories.d.ts.map +1 -0
- package/dist/blocks/columns/columns.stories.js +67 -0
- package/dist/blocks/columns/index.d.ts +6 -0
- package/dist/blocks/columns/index.d.ts.map +1 -0
- package/dist/blocks/columns/index.js +3 -0
- package/dist/blocks/date-selector/date-selector-context.d.ts.map +1 -0
- package/dist/blocks/date-selector/date-selector-default-i18n.d.ts +10 -0
- package/dist/blocks/date-selector/date-selector-default-i18n.d.ts.map +1 -0
- package/dist/blocks/date-selector/date-selector-default-i18n.js +29 -0
- package/dist/blocks/date-selector/date-selector-i18n-resources.d.ts +11 -0
- package/dist/blocks/date-selector/date-selector-i18n-resources.d.ts.map +1 -0
- package/dist/blocks/date-selector/date-selector-i18n-resources.js +248 -0
- package/dist/blocks/date-selector/date-selector-i18n.shared.d.ts +12 -0
- package/dist/blocks/date-selector/date-selector-i18n.shared.d.ts.map +1 -0
- package/dist/blocks/date-selector/date-selector-i18n.shared.js +84 -0
- package/dist/{components → blocks}/date-selector/date-selector-parts.d.ts +9 -0
- package/dist/blocks/date-selector/date-selector-parts.d.ts.map +1 -0
- package/dist/{components → blocks}/date-selector/date-selector-parts.js +21 -6
- package/dist/{components → blocks}/date-selector/date-selector-types.d.ts +70 -0
- package/dist/blocks/date-selector/date-selector-types.d.ts.map +1 -0
- package/dist/{components → blocks}/date-selector/date-selector-types.js +22 -0
- package/dist/blocks/date-selector/date-selector-value.d.ts +81 -0
- package/dist/blocks/date-selector/date-selector-value.d.ts.map +1 -0
- package/dist/blocks/date-selector/date-selector-value.js +423 -0
- package/dist/{components → blocks}/date-selector/date-selector.d.ts +1 -1
- package/dist/blocks/date-selector/date-selector.d.ts.map +1 -0
- package/dist/blocks/date-selector/date-selector.js +191 -0
- package/dist/{components → blocks}/date-selector/date-selector.stories.d.ts +14 -0
- package/dist/blocks/date-selector/date-selector.stories.d.ts.map +1 -0
- package/dist/blocks/date-selector/date-selector.stories.js +299 -0
- package/dist/blocks/date-selector/index.d.ts +11 -0
- package/dist/blocks/date-selector/index.d.ts.map +1 -0
- package/dist/blocks/date-selector/index.js +8 -0
- package/dist/{components → blocks}/date-selector/use-date-selector.d.ts +4 -3
- package/dist/blocks/date-selector/use-date-selector.d.ts.map +1 -0
- package/dist/{components → blocks}/date-selector/use-date-selector.js +14 -8
- package/dist/blocks/index.d.ts +4 -0
- package/dist/blocks/index.d.ts.map +1 -0
- package/dist/blocks/index.js +3 -0
- package/dist/blocks/navigation/index.d.ts +5 -0
- package/dist/blocks/navigation/index.d.ts.map +1 -0
- package/dist/blocks/navigation/index.js +2 -0
- package/dist/blocks/navigation/navigation-types.d.ts +60 -0
- package/dist/blocks/navigation/navigation-types.d.ts.map +1 -0
- package/dist/blocks/navigation/navigation-types.js +1 -0
- package/dist/blocks/navigation/navigation.d.ts +9 -0
- package/dist/blocks/navigation/navigation.d.ts.map +1 -0
- package/dist/blocks/navigation/navigation.demo.d.ts +4 -0
- package/dist/blocks/navigation/navigation.demo.d.ts.map +1 -0
- package/dist/blocks/navigation/navigation.demo.js +46 -0
- package/dist/blocks/navigation/navigation.js +98 -0
- package/dist/blocks/navigation/navigation.stories.d.ts +14 -0
- package/dist/blocks/navigation/navigation.stories.d.ts.map +1 -0
- package/dist/blocks/navigation/navigation.stories.js +16 -0
- package/dist/components/accordion/accordion.stories.js +1 -1
- package/dist/components/alert/alert.stories.js +1 -1
- package/dist/components/alert-dialog/alert-dialog.stories.js +1 -1
- package/dist/components/aspect-ratio/aspect-ratio.stories.js +1 -1
- package/dist/components/avatar/avatar.stories.js +1 -1
- package/dist/components/badge/badge.stories.js +1 -1
- package/dist/components/breadcrumb/breadcrumb.stories.js +1 -1
- package/dist/components/button/button.stories.js +1 -1
- package/dist/components/button-group/button-group.d.ts +10 -4
- package/dist/components/button-group/button-group.d.ts.map +1 -1
- package/dist/components/button-group/button-group.js +15 -3
- package/dist/components/button-group/button-group.stories.js +1 -1
- package/dist/components/button-group/index.d.ts +2 -2
- package/dist/components/button-group/index.d.ts.map +1 -1
- package/dist/components/button-group/index.js +1 -1
- package/dist/components/calendar/calendar.stories.js +1 -1
- package/dist/components/card/card.stories.js +1 -1
- package/dist/components/checkbox/checkbox.stories.js +1 -1
- package/dist/components/collapsible/collapsible.stories.js +1 -1
- package/dist/components/combobox/combobox.stories.js +1 -1
- package/dist/components/command/command.stories.js +1 -1
- package/dist/components/context-menu/context-menu.stories.js +1 -1
- package/dist/components/dialog/dialog.stories.js +1 -1
- package/dist/components/direction/direction.stories.js +1 -1
- package/dist/components/drawer/drawer.stories.js +1 -1
- package/dist/components/dropdown-menu/dropdown-menu.d.ts +9 -2
- package/dist/components/dropdown-menu/dropdown-menu.d.ts.map +1 -1
- package/dist/components/dropdown-menu/dropdown-menu.js +4 -1
- package/dist/components/dropdown-menu/dropdown-menu.stories.js +1 -1
- package/dist/components/dropdown-menu/index.d.ts +2 -2
- package/dist/components/dropdown-menu/index.d.ts.map +1 -1
- package/dist/components/dropdown-menu/index.js +1 -1
- package/dist/components/empty/empty.stories.js +1 -1
- package/dist/components/field/field.stories.js +1 -1
- package/dist/components/filters/filter-date-metric-value.d.ts +32 -0
- package/dist/components/filters/filter-date-metric-value.d.ts.map +1 -0
- package/dist/components/filters/filter-date-metric-value.js +331 -0
- package/dist/components/filters/filters-defaults.d.ts +4 -0
- package/dist/components/filters/filters-defaults.d.ts.map +1 -1
- package/dist/components/filters/filters-defaults.js +59 -1
- package/dist/components/filters/filters-i18n-resources.d.ts +277 -0
- package/dist/components/filters/filters-i18n-resources.d.ts.map +1 -0
- package/dist/components/filters/filters-i18n-resources.js +276 -0
- package/dist/components/filters/filters-i18n.shared.d.ts +16 -0
- package/dist/components/filters/filters-i18n.shared.d.ts.map +1 -0
- package/dist/components/filters/filters-i18n.shared.js +111 -0
- package/dist/components/filters/filters-types.d.ts +33 -1
- package/dist/components/filters/filters-types.d.ts.map +1 -1
- package/dist/components/filters/filters-utils.d.ts +28 -1
- package/dist/components/filters/filters-utils.d.ts.map +1 -1
- package/dist/components/filters/filters-utils.js +102 -0
- package/dist/components/filters/filters.d.ts +21 -3
- package/dist/components/filters/filters.d.ts.map +1 -1
- package/dist/components/filters/filters.js +493 -290
- package/dist/components/filters/filters.stories.d.ts +107 -2
- package/dist/components/filters/filters.stories.d.ts.map +1 -1
- package/dist/components/filters/filters.stories.js +364 -29
- package/dist/components/filters/index.d.ts +3 -1
- package/dist/components/filters/index.d.ts.map +1 -1
- package/dist/components/filters/index.js +3 -1
- package/dist/components/frame/frame.stories.js +1 -1
- package/dist/components/hover-card/hover-card.stories.js +1 -1
- package/dist/components/index.d.ts +0 -2
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +0 -2
- package/dist/components/input/input.stories.js +1 -1
- package/dist/components/input-group/input-group.stories.js +1 -1
- package/dist/components/item/item.stories.js +1 -1
- package/dist/components/kbd/kbd.stories.js +1 -1
- package/dist/components/label/label.stories.js +1 -1
- package/dist/components/menubar/menubar.stories.js +1 -1
- package/dist/components/native-select/native-select.stories.js +1 -1
- package/dist/components/navigation-menu/navigation-menu.stories.js +1 -1
- package/dist/components/pagination/pagination.stories.js +1 -1
- package/dist/components/popover/popover.stories.js +1 -1
- package/dist/components/progress/progress.stories.js +1 -1
- package/dist/components/radio-group/radio-group.stories.js +1 -1
- package/dist/components/resizable/resizable.stories.js +1 -1
- package/dist/components/scroll-area/scroll-area.stories.js +1 -1
- package/dist/components/select/select.stories.js +1 -1
- package/dist/components/separator/separator.stories.js +1 -1
- package/dist/components/sheet/sheet.stories.js +1 -1
- package/dist/components/slider/slider.stories.js +1 -1
- package/dist/components/sonner/sonner.stories.js +1 -1
- package/dist/components/sortable/sortable.stories.js +1 -1
- package/dist/components/spinner/spinner.stories.js +1 -1
- package/dist/components/status-indicator/status-indicator.stories.js +1 -1
- package/dist/components/switch/switch.stories.js +1 -1
- package/dist/components/tabs/tabs.stories.js +1 -1
- package/dist/components/text/text.stories.js +1 -1
- package/dist/components/textarea/textarea.stories.js +1 -1
- package/dist/components/toggle/toggle.stories.js +1 -1
- package/dist/components/toggle-group/toggle-group.stories.js +1 -1
- package/dist/components/tooltip/tooltip.stories.js +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/llms.txt +10 -5
- package/package.json +8 -4
- package/dist/components/date-selector/date-selector-context.d.ts.map +0 -1
- package/dist/components/date-selector/date-selector-parts.d.ts.map +0 -1
- package/dist/components/date-selector/date-selector-types.d.ts.map +0 -1
- package/dist/components/date-selector/date-selector-value.d.ts +0 -47
- package/dist/components/date-selector/date-selector-value.d.ts.map +0 -1
- package/dist/components/date-selector/date-selector-value.js +0 -183
- package/dist/components/date-selector/date-selector.d.ts.map +0 -1
- package/dist/components/date-selector/date-selector.js +0 -144
- package/dist/components/date-selector/date-selector.stories.d.ts.map +0 -1
- package/dist/components/date-selector/date-selector.stories.js +0 -144
- package/dist/components/date-selector/index.d.ts +0 -7
- package/dist/components/date-selector/index.d.ts.map +0 -1
- package/dist/components/date-selector/index.js +0 -5
- package/dist/components/date-selector/use-date-selector.d.ts.map +0 -1
- package/dist/components/navigation-pattern-1/index.d.ts +0 -3
- package/dist/components/navigation-pattern-1/index.d.ts.map +0 -1
- package/dist/components/navigation-pattern-1/index.js +0 -1
- package/dist/components/navigation-pattern-1/pattern-1.config.d.ts +0 -47
- package/dist/components/navigation-pattern-1/pattern-1.config.d.ts.map +0 -1
- package/dist/components/navigation-pattern-1/pattern-1.config.js +0 -55
- package/dist/components/navigation-pattern-1/pattern-1.d.ts +0 -7
- package/dist/components/navigation-pattern-1/pattern-1.d.ts.map +0 -1
- package/dist/components/navigation-pattern-1/pattern-1.js +0 -83
- package/dist/components/navigation-pattern-1/pattern-1.stories.d.ts +0 -16
- package/dist/components/navigation-pattern-1/pattern-1.stories.d.ts.map +0 -1
- package/dist/components/navigation-pattern-1/pattern-1.stories.js +0 -20
- /package/dist/{components → blocks}/date-selector/date-selector-context.d.ts +0 -0
- /package/dist/{components → blocks}/date-selector/date-selector-context.js +0 -0
|
@@ -3,7 +3,7 @@ import { useState } from 'react';
|
|
|
3
3
|
import { Button } from '../button';
|
|
4
4
|
import { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut } from '.';
|
|
5
5
|
const meta = {
|
|
6
|
-
title: '
|
|
6
|
+
title: 'Components/Command',
|
|
7
7
|
component: Command,
|
|
8
8
|
tags: ['autodocs'],
|
|
9
9
|
parameters: {
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { Text } from '../text';
|
|
3
3
|
import { ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, } from '.';
|
|
4
4
|
const meta = {
|
|
5
|
-
title: '
|
|
5
|
+
title: 'Components/ContextMenu',
|
|
6
6
|
component: ContextMenu,
|
|
7
7
|
tags: ['autodocs'],
|
|
8
8
|
parameters: {
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { Button } from '../button';
|
|
3
3
|
import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from './dialog';
|
|
4
4
|
const meta = {
|
|
5
|
-
title: '
|
|
5
|
+
title: 'Components/Dialog',
|
|
6
6
|
component: Dialog,
|
|
7
7
|
tags: ['autodocs'],
|
|
8
8
|
parameters: {
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { Button } from '../button';
|
|
3
3
|
import { Drawer, DrawerContent, DrawerDescription, DrawerHeader, DrawerTitle, DrawerTrigger } from './drawer';
|
|
4
4
|
const meta = {
|
|
5
|
-
title: '
|
|
5
|
+
title: 'Components/Drawer',
|
|
6
6
|
tags: ['autodocs'],
|
|
7
7
|
parameters: {
|
|
8
8
|
layout: 'centered',
|
|
@@ -25,6 +25,12 @@ type DropdownMenuItemProps = MenuPrimitive.Item.Props & {
|
|
|
25
25
|
inset?: boolean;
|
|
26
26
|
variant?: 'default' | 'destructive';
|
|
27
27
|
};
|
|
28
|
+
/** Anchor row for `DropdownMenu` — real `<a href>` for navigation, open-in-new-tab, and middle-click. */
|
|
29
|
+
type DropdownMenuLinkItemProps = Omit<React.ComponentPropsWithRef<'a'>, 'className'> & {
|
|
30
|
+
inset?: boolean;
|
|
31
|
+
variant?: 'default' | 'destructive';
|
|
32
|
+
className?: string;
|
|
33
|
+
};
|
|
28
34
|
/** Props for `DropdownMenuSub`. */
|
|
29
35
|
type DropdownMenuSubProps = MenuPrimitive.SubmenuRoot.Props;
|
|
30
36
|
/** Props for `DropdownMenuSubTrigger`. */
|
|
@@ -52,6 +58,7 @@ declare function DropdownMenuContent({ align, alignOffset, side, sideOffset, cla
|
|
|
52
58
|
declare function DropdownMenuGroup({ ...props }: DropdownMenuGroupProps): import("react/jsx-runtime").JSX.Element;
|
|
53
59
|
declare function DropdownMenuLabel({ className, inset, ...props }: DropdownMenuLabelProps): import("react/jsx-runtime").JSX.Element;
|
|
54
60
|
declare function DropdownMenuItem({ className, inset, variant, ...props }: DropdownMenuItemProps): import("react/jsx-runtime").JSX.Element;
|
|
61
|
+
declare function DropdownMenuLinkItem({ className, inset, variant, children, ...anchorProps }: DropdownMenuLinkItemProps): import("react/jsx-runtime").JSX.Element;
|
|
55
62
|
declare function DropdownMenuSub({ ...props }: DropdownMenuSubProps): import("react/jsx-runtime").JSX.Element;
|
|
56
63
|
declare function DropdownMenuSubTrigger({ className, inset, children, ...props }: DropdownMenuSubTriggerProps): import("react/jsx-runtime").JSX.Element;
|
|
57
64
|
declare function DropdownMenuSubContent({ align, alignOffset, side, sideOffset, className, ...props }: DropdownMenuSubContentProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -60,6 +67,6 @@ declare function DropdownMenuRadioGroup({ ...props }: DropdownMenuRadioGroupProp
|
|
|
60
67
|
declare function DropdownMenuRadioItem({ className, children, inset, ...props }: DropdownMenuRadioItemProps): import("react/jsx-runtime").JSX.Element;
|
|
61
68
|
declare function DropdownMenuSeparator({ className, ...props }: DropdownMenuSeparatorProps): import("react/jsx-runtime").JSX.Element;
|
|
62
69
|
declare function DropdownMenuShortcut({ className, ...props }: DropdownMenuShortcutProps): import("react/jsx-runtime").JSX.Element;
|
|
63
|
-
export { DropdownMenu, DropdownMenuPortal, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuLabel, DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, };
|
|
64
|
-
export type { DropdownMenuProps, DropdownMenuPortalProps, DropdownMenuTriggerProps, DropdownMenuContentProps, DropdownMenuSubContentProps, DropdownMenuGroupProps, DropdownMenuLabelProps, DropdownMenuItemProps, DropdownMenuSubProps, DropdownMenuSubTriggerProps, DropdownMenuCheckboxItemProps, DropdownMenuRadioGroupProps, DropdownMenuRadioItemProps, DropdownMenuSeparatorProps, DropdownMenuShortcutProps, };
|
|
70
|
+
export { DropdownMenu, DropdownMenuPortal, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuLabel, DropdownMenuItem, DropdownMenuLinkItem, DropdownMenuCheckboxItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, };
|
|
71
|
+
export type { DropdownMenuProps, DropdownMenuPortalProps, DropdownMenuTriggerProps, DropdownMenuContentProps, DropdownMenuSubContentProps, DropdownMenuGroupProps, DropdownMenuLabelProps, DropdownMenuItemProps, DropdownMenuLinkItemProps, DropdownMenuSubProps, DropdownMenuSubTriggerProps, DropdownMenuCheckboxItemProps, DropdownMenuRadioGroupProps, DropdownMenuRadioItemProps, DropdownMenuSeparatorProps, DropdownMenuShortcutProps, };
|
|
65
72
|
//# sourceMappingURL=dropdown-menu.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dropdown-menu.d.ts","sourceRoot":"","sources":["../../../src/components/dropdown-menu/dropdown-menu.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,IAAI,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAK5D,KAAK,gCAAgC,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,GAAG,MAAM,GAAG,YAAY,CAAC,CAAC;AAE9H;;;GAGG;AACH,KAAK,iBAAiB,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;AAElD,sCAAsC;AACtC,KAAK,uBAAuB,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC;AAE1D,uCAAuC;AACvC,KAAK,wBAAwB,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC;AAE5D,yEAAyE;AACzE,KAAK,wBAAwB,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,gCAAgC,CAAC;AAE7F,4FAA4F;AAC5F,KAAK,2BAA2B,GAAG,wBAAwB,CAAC;AAE5D,qCAAqC;AACrC,KAAK,sBAAsB,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC;AAExD,qCAAqC;AACrC,KAAK,sBAAsB,GAAG,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IACxD,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,oCAAoC;AACpC,KAAK,qBAAqB,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,GAAG;IACpD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,SAAS,GAAG,aAAa,CAAC;CACvC,CAAC;AAEF,mCAAmC;AACnC,KAAK,oBAAoB,GAAG,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC;AAE5D,0CAA0C;AAC1C,KAAK,2BAA2B,GAAG,aAAa,CAAC,cAAc,CAAC,KAAK,GAAG;IACpE,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,4CAA4C;AAC5C,KAAK,6BAA6B,GAAG,aAAa,CAAC,YAAY,CAAC,KAAK,GAAG;IACpE,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,0CAA0C;AAC1C,KAAK,2BAA2B,GAAG,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC;AAElE,yCAAyC;AACzC,KAAK,0BAA0B,GAAG,aAAa,CAAC,SAAS,CAAC,KAAK,GAAG;IAC9D,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,yCAAyC;AACzC,KAAK,0BAA0B,GAAG,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC;AAEhE,wCAAwC;AACxC,KAAK,yBAAyB,GAAG,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAE9D,iBAAS,YAAY,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,iBAAiB,2CAEpD;AAED,iBAAS,kBAAkB,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,uBAAuB,2CAEhE;AAED,iBAAS,mBAAmB,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,wBAAwB,2CAElE;AAED,iBAAS,mBAAmB,CAAC,EAAE,KAAe,EAAE,WAAe,EAAE,IAAe,EAAE,UAAc,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,wBAAwB,2CAehJ;AAED,iBAAS,iBAAiB,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,sBAAsB,2CAE9D;AAED,iBAAS,iBAAiB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,sBAAsB,2CAShF;AAED,iBAAS,gBAAgB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,OAAmB,EAAE,GAAG,KAAK,EAAE,EAAE,qBAAqB,2CAanG;AAED,iBAAS,eAAe,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,oBAAoB,2CAE1D;AAED,iBAAS,sBAAsB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,2BAA2B,2CAepG;AAED,iBAAS,sBAAsB,CAAC,EAAE,KAAe,EAAE,WAAgB,EAAE,IAAc,EAAE,UAAc,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,2BAA2B,2CAetJ;AAED,iBAAS,wBAAwB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,6BAA6B,2CAoBjH;AAED,iBAAS,sBAAsB,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,2BAA2B,2CAMxE;AAED,iBAAS,qBAAqB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,0BAA0B,2CAmBlG;AAED,iBAAS,qBAAqB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,0BAA0B,2CAEjF;AAED,iBAAS,oBAAoB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,yBAAyB,2CAQ/E;AAED,OAAO,EACH,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,GACzB,CAAC;AAEF,YAAY,EACR,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,2BAA2B,EAC3B,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,2BAA2B,EAC3B,6BAA6B,EAC7B,2BAA2B,EAC3B,0BAA0B,EAC1B,0BAA0B,EAC1B,yBAAyB,GAC5B,CAAC"}
|
|
1
|
+
{"version":3,"file":"dropdown-menu.d.ts","sourceRoot":"","sources":["../../../src/components/dropdown-menu/dropdown-menu.tsx"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,9 @@ function DropdownMenuLabel({ className, inset, ...props }) {
|
|
|
25
25
|
function DropdownMenuItem({ className, inset, variant = 'default', ...props }) {
|
|
26
26
|
return (_jsx(MenuPrimitive.Item, { "data-slot": "dropdown-menu-item", "data-inset": inset, "data-variant": variant, className: cn("group/dropdown-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive-foreground data-[variant=destructive]:focus:bg-destructive-foreground/10 data-[variant=destructive]:focus:text-destructive-foreground dark:data-[variant=destructive]:focus:bg-destructive-foreground/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive-foreground", className), ...props }));
|
|
27
27
|
}
|
|
28
|
+
function DropdownMenuLinkItem({ className, inset, variant = 'default', children, ...anchorProps }) {
|
|
29
|
+
return (_jsx(MenuPrimitive.Item, { render: _jsx("a", { "data-slot": "dropdown-menu-link-item", "data-inset": inset, "data-variant": variant, className: cn("group/dropdown-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive-foreground data-[variant=destructive]:focus:bg-destructive-foreground/10 data-[variant=destructive]:focus:text-destructive-foreground dark:data-[variant=destructive]:focus:bg-destructive-foreground/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive-foreground", className), ...anchorProps, children: children }) }));
|
|
30
|
+
}
|
|
28
31
|
function DropdownMenuSub({ ...props }) {
|
|
29
32
|
return _jsx(MenuPrimitive.SubmenuRoot, { "data-slot": "dropdown-menu-sub", ...props });
|
|
30
33
|
}
|
|
@@ -49,4 +52,4 @@ function DropdownMenuSeparator({ className, ...props }) {
|
|
|
49
52
|
function DropdownMenuShortcut({ className, ...props }) {
|
|
50
53
|
return (_jsx("span", { "data-slot": "dropdown-menu-shortcut", className: cn('ml-auto text-xs tracking-widest text-muted-foreground group-focus/dropdown-menu-item:text-accent-foreground', className), ...props }));
|
|
51
54
|
}
|
|
52
|
-
export { DropdownMenu, DropdownMenuPortal, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuLabel, DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, };
|
|
55
|
+
export { DropdownMenu, DropdownMenuPortal, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuLabel, DropdownMenuItem, DropdownMenuLinkItem, DropdownMenuCheckboxItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, };
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { Button } from '../button';
|
|
3
3
|
import { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from '.';
|
|
4
4
|
const meta = {
|
|
5
|
-
title: '
|
|
5
|
+
title: 'Components/DropdownMenu',
|
|
6
6
|
component: DropdownMenu,
|
|
7
7
|
tags: ['autodocs'],
|
|
8
8
|
parameters: {
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { DropdownMenu, DropdownMenuPortal, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuLabel, DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, } from './dropdown-menu';
|
|
2
|
-
export type { DropdownMenuProps, DropdownMenuPortalProps, DropdownMenuTriggerProps, DropdownMenuContentProps, DropdownMenuSubContentProps, DropdownMenuGroupProps, DropdownMenuLabelProps, DropdownMenuItemProps, DropdownMenuSubProps, DropdownMenuSubTriggerProps, DropdownMenuCheckboxItemProps, DropdownMenuRadioGroupProps, DropdownMenuRadioItemProps, DropdownMenuSeparatorProps, DropdownMenuShortcutProps, } from './dropdown-menu';
|
|
1
|
+
export { DropdownMenu, DropdownMenuPortal, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuLabel, DropdownMenuItem, DropdownMenuLinkItem, DropdownMenuCheckboxItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, } from './dropdown-menu';
|
|
2
|
+
export type { DropdownMenuProps, DropdownMenuPortalProps, DropdownMenuTriggerProps, DropdownMenuContentProps, DropdownMenuSubContentProps, DropdownMenuGroupProps, DropdownMenuLabelProps, DropdownMenuItemProps, DropdownMenuLinkItemProps, DropdownMenuSubProps, DropdownMenuSubTriggerProps, DropdownMenuCheckboxItemProps, DropdownMenuRadioGroupProps, DropdownMenuRadioItemProps, DropdownMenuSeparatorProps, DropdownMenuShortcutProps, } from './dropdown-menu';
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/dropdown-menu/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,GACzB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACR,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,2BAA2B,EAC3B,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,2BAA2B,EAC3B,6BAA6B,EAC7B,2BAA2B,EAC3B,0BAA0B,EAC1B,0BAA0B,EAC1B,yBAAyB,GAC5B,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/dropdown-menu/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,GACzB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACR,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,2BAA2B,EAC3B,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,yBAAyB,EACzB,oBAAoB,EACpB,2BAA2B,EAC3B,6BAA6B,EAC7B,2BAA2B,EAC3B,0BAA0B,EAC1B,0BAA0B,EAC1B,yBAAyB,GAC5B,MAAM,iBAAiB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { DropdownMenu, DropdownMenuPortal, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuLabel, DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, } from './dropdown-menu';
|
|
1
|
+
export { DropdownMenu, DropdownMenuPortal, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuLabel, DropdownMenuItem, DropdownMenuLinkItem, DropdownMenuCheckboxItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, } from './dropdown-menu';
|
|
@@ -3,7 +3,7 @@ import { FolderOpen } from 'lucide-react';
|
|
|
3
3
|
import { Button } from '../button';
|
|
4
4
|
import { Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle } from './empty';
|
|
5
5
|
const meta = {
|
|
6
|
-
title: '
|
|
6
|
+
title: 'Components/Empty',
|
|
7
7
|
component: Empty,
|
|
8
8
|
tags: ['autodocs'],
|
|
9
9
|
parameters: {
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type DateSelectorI18nConfig, type DateSelectorValue, type FormatDateValueOptions } from '../../blocks/date-selector/date-selector-types';
|
|
2
|
+
import type { FilterFieldConfig, FilterI18nConfig } from './filters-types';
|
|
3
|
+
/**
|
|
4
|
+
* Compact date summary for the bar (e.g. "Last 60 days"); uses rolling templates when applicable.
|
|
5
|
+
* Day pickers use {@link DATE_SELECTOR_COMPACT_DAY_FORMAT} here so the bar stays short; the dialog still uses `dateMetricProps.dayDateFormat` for parsing.
|
|
6
|
+
* Pass {@link FormatDateValueOptions} to match {@link DateSelectorProps.rollingRangeDisplay} on the filter field.
|
|
7
|
+
*/
|
|
8
|
+
export declare function dateSegmentLabelForBar(date: DateSelectorValue, dateI18n: DateSelectorI18nConfig, dayDateFormat: string, options?: FormatDateValueOptions): string;
|
|
9
|
+
export interface FilterDateMetricBarPeriodSegmentsProps<T = unknown> {
|
|
10
|
+
field: FilterFieldConfig<T>;
|
|
11
|
+
values: T[];
|
|
12
|
+
onChange: (values: T[]) => void;
|
|
13
|
+
i18n: FilterI18nConfig;
|
|
14
|
+
size: 'sm' | 'default' | 'lg';
|
|
15
|
+
/** When set (e.g. newly added filter row), opens the date range menu once. */
|
|
16
|
+
autoFocus?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/** Static "in" connector + rolling Next/Last presets (submenus) + full {@link DateSelector} in a dialog for Custom. */
|
|
19
|
+
export declare function FilterDateMetricBarPeriodSegments<T = unknown>({ field, values, onChange, i18n, size, autoFocus }: FilterDateMetricBarPeriodSegmentsProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export interface FilterDateMetricBarValueSegmentProps<T = unknown> {
|
|
21
|
+
field: FilterFieldConfig<T>;
|
|
22
|
+
values: T[];
|
|
23
|
+
onChange: (values: T[]) => void;
|
|
24
|
+
operator: string;
|
|
25
|
+
i18n: FilterI18nConfig;
|
|
26
|
+
size: 'sm' | 'default' | 'lg';
|
|
27
|
+
/** Lets the value segment change operator (e.g. "Any value" → threshold so the number field appears). */
|
|
28
|
+
onOperatorChange?: (operator: string) => void;
|
|
29
|
+
}
|
|
30
|
+
/** Value inputs / “any value” control for a date metric filter bar (after field, “in”, range, and operator). */
|
|
31
|
+
export declare function FilterDateMetricBarValueSegment<T = unknown>({ field, values, onChange, operator, i18n, size, onOperatorChange, }: FilterDateMetricBarValueSegmentProps<T>): import("react/jsx-runtime").JSX.Element | null;
|
|
32
|
+
//# sourceMappingURL=filter-date-metric-value.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-date-metric-value.d.ts","sourceRoot":"","sources":["../../../src/components/filters/filter-date-metric-value.tsx"],"names":[],"mappings":"AAeA,OAAO,EAKH,KAAK,sBAAsB,EAG3B,KAAK,iBAAiB,EAEtB,KAAK,sBAAsB,EAC9B,MAAM,gDAAgD,CAAC;AAyBxD,OAAO,KAAK,EAA2B,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAyIpG;;;;GAIG;AACH,wBAAgB,sBAAsB,CAClC,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,sBAAsB,EAChC,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,sBAAsB,GACjC,MAAM,CAER;AAED,MAAM,WAAW,sCAAsC,CAAC,CAAC,GAAG,OAAO;IAC/D,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;IAChC,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC;IAC9B,8EAA8E;IAC9E,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,uHAAuH;AACvH,wBAAgB,iCAAiC,CAAC,CAAC,GAAG,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,sCAAsC,CAAC,CAAC,CAAC,2CAqP3J;AAED,MAAM,WAAW,oCAAoC,CAAC,CAAC,GAAG,OAAO;IAC7D,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC;IAC9B,yGAAyG;IACzG,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACjD;AA+ED,gHAAgH;AAChH,wBAAgB,+BAA+B,CAAC,CAAC,GAAG,OAAO,EAAE,EACzD,KAAK,EACL,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,gBAAgB,GACnB,EAAE,oCAAoC,CAAC,CAAC,CAAC,kDAyNzC"}
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
4
|
+
import { computeRollingPresetRange, DATE_SELECTOR_COMPACT_DAY_FORMAT, DateSelector, formatDateValue, formatRollingRangeTooltipDetail, getRollingSummaryLabel, resolveRollingCount, resolveRollingUnit, } from '../../blocks/date-selector';
|
|
5
|
+
import { DATE_SELECTOR_ROLLING_DAY_OPTIONS, DATE_SELECTOR_ROLLING_MONTH_OPTIONS, DATE_SELECTOR_ROLLING_QUARTER_OPTIONS, DATE_SELECTOR_ROLLING_YEAR_OPTIONS, DEFAULT_DATE_SELECTOR_I18N, } from '../../blocks/date-selector/date-selector-types';
|
|
6
|
+
import { Button } from '../button';
|
|
7
|
+
import { ButtonGroupText } from '../button-group';
|
|
8
|
+
import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from '../dialog';
|
|
9
|
+
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from '../dropdown-menu';
|
|
10
|
+
import { Input } from '../input';
|
|
11
|
+
import { Popover, PopoverContent, PopoverTrigger } from '../popover';
|
|
12
|
+
import { Tooltip, TooltipContent, TooltipTrigger } from '../tooltip';
|
|
13
|
+
import { Check } from 'lucide-react';
|
|
14
|
+
import { cn } from '../../lib/utils';
|
|
15
|
+
import { dateMetricValueForCustomEditor, getDateMetricPayloadFromValues, getOperatorsForField } from './filters-utils';
|
|
16
|
+
/** Matches `Button` `variant="outline"` surface: bordered tile in the preset grid. */
|
|
17
|
+
const ROLLING_PRESET_OUTLINE = 'rounded-md border border-input bg-popover shadow-xs/5 dark:bg-input/32';
|
|
18
|
+
const ROLLING_PRESET_CELL_BASE = cn(ROLLING_PRESET_OUTLINE, 'relative min-h-7 shrink-0 justify-center !px-1.5 !py-1 text-center text-[0.7rem] leading-tight [text-wrap:pretty] tabular-nums', '[&_[data-slot=dropdown-menu-radio-item-indicator]]:hidden');
|
|
19
|
+
/** Selected tile: filled “active” look instead of the menu radio checkmark. */
|
|
20
|
+
const rollingPresetCellSelected = 'border-primary bg-accent font-medium text-foreground shadow-xs/10 dark:bg-accent/90';
|
|
21
|
+
function RollingWindowPresetGrid({ mode, i18n, idPrefix, rollingDayOpts, rollingMonthOpts, rollingQuarterOpts, rollingYearOpts, radioValue, rollingRadioKey, labelForRolling, onApply, }) {
|
|
22
|
+
const rollingPrefix = mode === 'rolling-next' ? i18n.rollingWindowTabs.next : i18n.rollingWindowTabs.last;
|
|
23
|
+
const sectionLabel = (unitTab) => `${rollingPrefix} ${unitTab}`;
|
|
24
|
+
return (_jsx(DropdownMenuRadioGroup, { value: radioValue ?? '', onValueChange: (v) => {
|
|
25
|
+
if (!v)
|
|
26
|
+
return;
|
|
27
|
+
const [u, c] = v.split(':');
|
|
28
|
+
const count = Number(c);
|
|
29
|
+
if (!u || !Number.isFinite(count))
|
|
30
|
+
return;
|
|
31
|
+
onApply(u, count);
|
|
32
|
+
}, children: _jsx("div", { className: "flex flex-col", children: _jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx(DropdownMenuLabel, { className: "px-0 pt-0 pb-0", children: sectionLabel(i18n.rollingUnitTabs.days) }), _jsx("div", { className: "grid grid-cols-4 gap-1.5", children: rollingDayOpts.map((days) => {
|
|
33
|
+
const value = rollingRadioKey('day', days);
|
|
34
|
+
const selected = radioValue === value;
|
|
35
|
+
return (_jsx(DropdownMenuRadioItem, { className: cn(ROLLING_PRESET_CELL_BASE, selected && rollingPresetCellSelected), value: value, "aria-label": labelForRolling(mode, 'day', days), children: days }, `${idPrefix}-day-${days}`));
|
|
36
|
+
}) })] }), _jsxs("div", { className: "flex flex-col gap-1", children: [_jsx(DropdownMenuLabel, { className: "px-0 pt-0 pb-0", children: sectionLabel(i18n.rollingUnitTabs.months) }), _jsx("div", { className: "grid grid-cols-5 gap-1.5", children: rollingMonthOpts.map((m) => {
|
|
37
|
+
const value = rollingRadioKey('month', m);
|
|
38
|
+
const selected = radioValue === value;
|
|
39
|
+
return (_jsx(DropdownMenuRadioItem, { className: cn(ROLLING_PRESET_CELL_BASE, selected && rollingPresetCellSelected), value: value, "aria-label": labelForRolling(mode, 'month', m), children: m }, `${idPrefix}-month-${m}`));
|
|
40
|
+
}) })] }), _jsxs("div", { className: "flex flex-col gap-1", children: [_jsx(DropdownMenuLabel, { className: "px-0 pt-0 pb-0", children: sectionLabel(i18n.rollingUnitTabs.quarters) }), _jsx("div", { className: "grid grid-cols-4 gap-1.5", children: rollingQuarterOpts.map((q) => {
|
|
41
|
+
const value = rollingRadioKey('quarter', q);
|
|
42
|
+
const selected = radioValue === value;
|
|
43
|
+
return (_jsx(DropdownMenuRadioItem, { className: cn(ROLLING_PRESET_CELL_BASE, selected && rollingPresetCellSelected), value: value, "aria-label": labelForRolling(mode, 'quarter', q), children: q }, `${idPrefix}-quarter-${q}`));
|
|
44
|
+
}) })] }), _jsxs("div", { className: "flex flex-col gap-1", children: [_jsx(DropdownMenuLabel, { className: "px-0 pt-0 pb-0", children: sectionLabel(i18n.rollingUnitTabs.years) }), _jsx("div", { className: "grid grid-cols-4 gap-1.5", children: rollingYearOpts.map((y) => {
|
|
45
|
+
const value = rollingRadioKey('year', y);
|
|
46
|
+
const selected = radioValue === value;
|
|
47
|
+
return (_jsx(DropdownMenuRadioItem, { className: cn(ROLLING_PRESET_CELL_BASE, selected && rollingPresetCellSelected), value: value, "aria-label": labelForRolling(mode, 'year', y), children: y }, `${idPrefix}-year-${y}`));
|
|
48
|
+
}) })] })] }) }) }));
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Compact date summary for the bar (e.g. "Last 60 days"); uses rolling templates when applicable.
|
|
52
|
+
* Day pickers use {@link DATE_SELECTOR_COMPACT_DAY_FORMAT} here so the bar stays short; the dialog still uses `dateMetricProps.dayDateFormat` for parsing.
|
|
53
|
+
* Pass {@link FormatDateValueOptions} to match {@link DateSelectorProps.rollingRangeDisplay} on the filter field.
|
|
54
|
+
*/
|
|
55
|
+
export function dateSegmentLabelForBar(date, dateI18n, dayDateFormat, options) {
|
|
56
|
+
return formatDateValue(date, dateI18n, dayDateFormat, options);
|
|
57
|
+
}
|
|
58
|
+
/** Static "in" connector + rolling Next/Last presets (submenus) + full {@link DateSelector} in a dialog for Custom. */
|
|
59
|
+
export function FilterDateMetricBarPeriodSegments({ field, values, onChange, i18n, size, autoFocus }) {
|
|
60
|
+
const [menuOpen, setMenuOpen] = useState(false);
|
|
61
|
+
const [customOpen, setCustomOpen] = useState(false);
|
|
62
|
+
/** Draft while Custom dialog is open; committed on Done, discarded on dismiss. */
|
|
63
|
+
const [customDraft, setCustomDraft] = useState(null);
|
|
64
|
+
const menuAutoOpenedRef = useRef(false);
|
|
65
|
+
const payload = useMemo(() => getDateMetricPayloadFromValues(values), [values]);
|
|
66
|
+
const setPayload = (next) => {
|
|
67
|
+
onChange([next]);
|
|
68
|
+
};
|
|
69
|
+
const dayFormat = field.dateMetricProps?.dayDateFormat ?? 'MM/dd/yyyy';
|
|
70
|
+
const mergedDateI18n = { ...DEFAULT_DATE_SELECTOR_I18N, ...field.dateMetricProps?.i18n };
|
|
71
|
+
const rollingDayOpts = (field.dateMetricProps?.rollingDayOptions ?? DATE_SELECTOR_ROLLING_DAY_OPTIONS);
|
|
72
|
+
const rollingMonthOpts = field.dateMetricProps?.rollingMonthOptions ?? DATE_SELECTOR_ROLLING_MONTH_OPTIONS;
|
|
73
|
+
const rollingQuarterOpts = field.dateMetricProps?.rollingQuarterOptions ?? DATE_SELECTOR_ROLLING_QUARTER_OPTIONS;
|
|
74
|
+
const rollingYearOpts = field.dateMetricProps?.rollingYearOptions ?? DATE_SELECTOR_ROLLING_YEAR_OPTIONS;
|
|
75
|
+
const rollingRangeDisplay = field.dateMetricProps?.rollingRangeDisplay ?? 'inline';
|
|
76
|
+
const barFormatOptions = rollingRangeDisplay === 'tooltip' ? { includeRollingRangeDetailInLabel: false } : undefined;
|
|
77
|
+
const dateSummary = dateSegmentLabelForBar(payload.date, mergedDateI18n, DATE_SELECTOR_COMPACT_DAY_FORMAT, barFormatOptions);
|
|
78
|
+
const rollingRangeTooltip = rollingRangeDisplay === 'tooltip' ? formatRollingRangeTooltipDetail(payload.date, mergedDateI18n, dayFormat) : null;
|
|
79
|
+
const buttonSize = size === 'lg' ? 'lg' : size === 'sm' ? 'sm' : 'default';
|
|
80
|
+
const dateRangeTriggerButtonClassName = 'max-w-[min(100%,18rem)] justify-start text-start [text-wrap:pretty] whitespace-normal';
|
|
81
|
+
const dateRangeTriggerButton = _jsx(Button, { variant: "outline", size: buttonSize, className: dateRangeTriggerButtonClassName });
|
|
82
|
+
const applyRolling = useCallback((mode, unit, count) => {
|
|
83
|
+
const base = getDateMetricPayloadFromValues(values);
|
|
84
|
+
const { startDate, endDate } = computeRollingPresetRange(mode, unit, count);
|
|
85
|
+
const nextDate = {
|
|
86
|
+
period: 'day',
|
|
87
|
+
operator: 'between',
|
|
88
|
+
selectionMode: mode,
|
|
89
|
+
rollingUnit: unit,
|
|
90
|
+
rollingCount: count,
|
|
91
|
+
startDate,
|
|
92
|
+
endDate,
|
|
93
|
+
};
|
|
94
|
+
if (unit === 'day' && DATE_SELECTOR_ROLLING_DAY_OPTIONS.includes(count)) {
|
|
95
|
+
nextDate.rollingDays = count;
|
|
96
|
+
}
|
|
97
|
+
onChange([
|
|
98
|
+
{
|
|
99
|
+
...base,
|
|
100
|
+
date: nextDate,
|
|
101
|
+
},
|
|
102
|
+
]);
|
|
103
|
+
setMenuOpen(false);
|
|
104
|
+
}, [values, onChange]);
|
|
105
|
+
useEffect(() => {
|
|
106
|
+
if (!autoFocus)
|
|
107
|
+
return;
|
|
108
|
+
if (menuAutoOpenedRef.current)
|
|
109
|
+
return;
|
|
110
|
+
let cancelled = false;
|
|
111
|
+
const timer = window.setTimeout(() => {
|
|
112
|
+
if (cancelled)
|
|
113
|
+
return;
|
|
114
|
+
menuAutoOpenedRef.current = true;
|
|
115
|
+
setMenuOpen(true);
|
|
116
|
+
}, 100);
|
|
117
|
+
return () => {
|
|
118
|
+
cancelled = true;
|
|
119
|
+
window.clearTimeout(timer);
|
|
120
|
+
};
|
|
121
|
+
}, [autoFocus]);
|
|
122
|
+
const labelForRolling = (mode, unit, count) => {
|
|
123
|
+
if (unit === 'year' && count === 1) {
|
|
124
|
+
return mode === 'rolling-next' ? mergedDateI18n.rollingSummaryNextYear : mergedDateI18n.rollingSummaryLastYear;
|
|
125
|
+
}
|
|
126
|
+
if (unit === 'month' && count === 1) {
|
|
127
|
+
return mode === 'rolling-next' ? mergedDateI18n.rollingSummaryNextSingleMonth : mergedDateI18n.rollingSummaryLastSingleMonth;
|
|
128
|
+
}
|
|
129
|
+
if (unit === 'month' && count > 1) {
|
|
130
|
+
return mode === 'rolling-next'
|
|
131
|
+
? mergedDateI18n.rollingSummaryNextMonths.replace('{{count}}', String(count))
|
|
132
|
+
: mergedDateI18n.rollingSummaryLastMonths.replace('{{count}}', String(count));
|
|
133
|
+
}
|
|
134
|
+
if (unit === 'quarter' && count === 1) {
|
|
135
|
+
return mode === 'rolling-next' ? mergedDateI18n.rollingSummaryNextQuarter : mergedDateI18n.rollingSummaryLastQuarter;
|
|
136
|
+
}
|
|
137
|
+
if (unit === 'quarter' && count > 1) {
|
|
138
|
+
return mode === 'rolling-next'
|
|
139
|
+
? mergedDateI18n.rollingSummaryNextQuarters.replace('{{count}}', String(count))
|
|
140
|
+
: mergedDateI18n.rollingSummaryLastQuarters.replace('{{count}}', String(count));
|
|
141
|
+
}
|
|
142
|
+
return (getRollingSummaryLabel({ period: 'day', operator: 'between', selectionMode: mode, rollingUnit: unit, rollingCount: count }, mergedDateI18n) ?? '');
|
|
143
|
+
};
|
|
144
|
+
const rollingRadioKey = (unit, count) => `${unit}:${count}`;
|
|
145
|
+
const { selectionMode } = payload.date;
|
|
146
|
+
const selectedCount = resolveRollingCount(payload.date);
|
|
147
|
+
const selectedUnit = resolveRollingUnit(payload.date);
|
|
148
|
+
const isAllowedRolling = (unit, count) => {
|
|
149
|
+
const list = unit === 'day' ? rollingDayOpts : unit === 'month' ? rollingMonthOpts : unit === 'quarter' ? rollingQuarterOpts : rollingYearOpts;
|
|
150
|
+
return list.includes(count);
|
|
151
|
+
};
|
|
152
|
+
const nextRadioValue = selectionMode === 'rolling-next' && selectedCount != null && isAllowedRolling(selectedUnit, selectedCount)
|
|
153
|
+
? rollingRadioKey(selectedUnit, selectedCount)
|
|
154
|
+
: undefined;
|
|
155
|
+
const lastRadioValue = selectionMode === 'rolling-last' && selectedCount != null && isAllowedRolling(selectedUnit, selectedCount)
|
|
156
|
+
? rollingRadioKey(selectedUnit, selectedCount)
|
|
157
|
+
: undefined;
|
|
158
|
+
const isNextBranchActive = selectionMode === 'rolling-next';
|
|
159
|
+
const isLastBranchActive = selectionMode === 'rolling-last';
|
|
160
|
+
const isCustomRangeActive = selectionMode === 'custom';
|
|
161
|
+
const mainMenuActiveIcon = (show) => (show ? _jsx(Check, { className: "ml-auto size-4 shrink-0 text-foreground", "aria-hidden": true }) : null);
|
|
162
|
+
const openCustomDialog = () => {
|
|
163
|
+
setMenuOpen(false);
|
|
164
|
+
setCustomDraft(dateMetricValueForCustomEditor(payload.date));
|
|
165
|
+
setCustomOpen(true);
|
|
166
|
+
};
|
|
167
|
+
const commitCustomDialog = () => {
|
|
168
|
+
if (customDraft != null) {
|
|
169
|
+
setPayload({ ...payload, date: customDraft });
|
|
170
|
+
}
|
|
171
|
+
setCustomDraft(null);
|
|
172
|
+
setCustomOpen(false);
|
|
173
|
+
};
|
|
174
|
+
return (_jsxs(_Fragment, { children: [_jsx(ButtonGroupText, { size: size, className: "bg-background font-normal text-muted-foreground dark:bg-input/30", children: i18n.helpers.dateMetricDateConnector(payload.date, mergedDateI18n) }), _jsxs(DropdownMenu, { open: menuOpen, onOpenChange: setMenuOpen, children: [rollingRangeTooltip ? (_jsxs(Tooltip, { children: [_jsx(DropdownMenuTrigger, { render: _jsx(TooltipTrigger, { render: dateRangeTriggerButton }), children: _jsx("span", { children: dateSummary || i18n.select }) }), _jsx(TooltipContent, { side: "top", sideOffset: 6, className: "max-w-xs [text-wrap:pretty] tabular-nums", children: rollingRangeTooltip })] })) : (_jsx(DropdownMenuTrigger, { render: dateRangeTriggerButton, children: _jsx("span", { children: dateSummary || i18n.select }) })), _jsxs(DropdownMenuContent, { align: "center", className: "min-w-48", side: "bottom", children: [_jsxs(DropdownMenuSub, { children: [_jsx(DropdownMenuSubTrigger, { children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "min-w-0 shrink", children: mergedDateI18n.rollingWindowTabs.next }), mainMenuActiveIcon(isNextBranchActive)] }) }), _jsx(DropdownMenuSubContent, { align: "start", className: "max-h-none min-w-[13rem] overflow-visible p-2", children: _jsx(RollingWindowPresetGrid, { mode: "rolling-next", idPrefix: "next", i18n: mergedDateI18n, rollingDayOpts: rollingDayOpts, rollingMonthOpts: rollingMonthOpts, rollingQuarterOpts: rollingQuarterOpts, rollingYearOpts: rollingYearOpts, radioValue: nextRadioValue, rollingRadioKey: rollingRadioKey, labelForRolling: labelForRolling, onApply: (unit, count) => applyRolling('rolling-next', unit, count) }) })] }), _jsxs(DropdownMenuSub, { children: [_jsx(DropdownMenuSubTrigger, { children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "min-w-0 shrink", children: mergedDateI18n.rollingWindowTabs.last }), mainMenuActiveIcon(isLastBranchActive)] }) }), _jsx(DropdownMenuSubContent, { align: "start", className: "max-h-none min-w-[13rem] overflow-visible p-2", children: _jsx(RollingWindowPresetGrid, { mode: "rolling-last", idPrefix: "last", i18n: mergedDateI18n, rollingDayOpts: rollingDayOpts, rollingMonthOpts: rollingMonthOpts, rollingQuarterOpts: rollingQuarterOpts, rollingYearOpts: rollingYearOpts, radioValue: lastRadioValue, rollingRadioKey: rollingRadioKey, labelForRolling: labelForRolling, onApply: (unit, count) => applyRolling('rolling-last', unit, count) }) })] }), _jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuItem, { className: "gap-2", onClick: openCustomDialog, children: [_jsx("span", { className: "min-w-0 shrink", children: mergedDateI18n.rollingWindowTabs.custom }), mainMenuActiveIcon(isCustomRangeActive)] })] })] }), _jsx(Dialog, { open: customOpen, onOpenChange: (open) => {
|
|
175
|
+
setCustomOpen(open);
|
|
176
|
+
if (!open) {
|
|
177
|
+
setCustomDraft(null);
|
|
178
|
+
}
|
|
179
|
+
}, children: _jsxs(DialogContent, { className: "max-h-[min(90vh,32rem)] w-[min(calc(100vw-2rem),28rem)] gap-0 overflow-y-auto p-4 sm:max-w-none", children: [_jsx(DialogHeader, { className: "pb-2", children: _jsx(DialogTitle, { children: mergedDateI18n.selectDate }) }), _jsx("div", { className: "flex flex-col gap-6 py-2", children: _jsx("section", { className: "flex flex-col gap-2", children: _jsx(DateSelector, { ...field.dateMetricProps, className: cn('max-w-none space-y-3', field.dateMetricProps?.className), value: customDraft ?? dateMetricValueForCustomEditor(payload.date), onChange: setCustomDraft, showOperators: field.dateMetricProps?.showOperators !== false, showInput: field.dateMetricProps?.showInput ?? false, dayDateFormat: dayFormat, showRollingPresets: false }) }) }), _jsx(DialogFooter, { className: "mt-2 border-t pt-4 sm:justify-end", children: _jsx(Button, { type: "button", size: "sm", variant: "default", onClick: commitCustomDialog, children: i18n.dateMetricDialogDone }) })] }) })] }));
|
|
180
|
+
}
|
|
181
|
+
/** Typographic en dash (–) for “no amount” on the bar trigger. */
|
|
182
|
+
const METRIC_EMPTY_AMOUNT = '\u2013';
|
|
183
|
+
/** Spaces around the en dash so empty segments don’t feel cramped (e.g. `$ – `). */
|
|
184
|
+
const METRIC_EMPTY_DISPLAY = ` ${METRIC_EMPTY_AMOUNT} `;
|
|
185
|
+
const metricAmountFormatters = new Map();
|
|
186
|
+
function formatMetricAmountDigits(value, locale) {
|
|
187
|
+
let nf = metricAmountFormatters.get(locale);
|
|
188
|
+
if (!nf) {
|
|
189
|
+
try {
|
|
190
|
+
nf = new Intl.NumberFormat(locale, {
|
|
191
|
+
minimumFractionDigits: 0,
|
|
192
|
+
maximumFractionDigits: 20,
|
|
193
|
+
useGrouping: true,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
nf = new Intl.NumberFormat('en-US', {
|
|
198
|
+
minimumFractionDigits: 0,
|
|
199
|
+
maximumFractionDigits: 20,
|
|
200
|
+
useGrouping: true,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
metricAmountFormatters.set(locale, nf);
|
|
204
|
+
}
|
|
205
|
+
return nf.format(value);
|
|
206
|
+
}
|
|
207
|
+
/** Bar label: `sym` + grouped amount, or `sym` + spaced en dash when empty. */
|
|
208
|
+
function formatMetricMoney(sym, value, locale) {
|
|
209
|
+
if (value == null || Number.isNaN(value))
|
|
210
|
+
return `${sym}${METRIC_EMPTY_DISPLAY}`;
|
|
211
|
+
return `${sym}${formatMetricAmountDigits(value, locale)}`;
|
|
212
|
+
}
|
|
213
|
+
function parseDraftNumber(raw, previous) {
|
|
214
|
+
if (raw.trim() === '')
|
|
215
|
+
return null;
|
|
216
|
+
const n = Number(raw);
|
|
217
|
+
if (!Number.isFinite(n))
|
|
218
|
+
return previous ?? null;
|
|
219
|
+
return n;
|
|
220
|
+
}
|
|
221
|
+
const METRIC_POPOVER_TRIGGER_NARROW = 'max-w-[min(100%,14rem)] shrink-0 justify-start font-medium tabular-nums';
|
|
222
|
+
const METRIC_POPOVER_TRIGGER_WIDE = 'max-w-[min(100%,18rem)] shrink-0 justify-start text-start font-medium [text-wrap:pretty] whitespace-normal tabular-nums';
|
|
223
|
+
function MetricValueThresholdPopoverShell({ open, onOpenChange, buttonSize, triggerLabel, summary, triggerClassName, children, }) {
|
|
224
|
+
return (_jsxs(Popover, { open: open, onOpenChange: onOpenChange, children: [_jsx(PopoverTrigger, { render: _jsx(Button, { type: "button", variant: "outline", size: buttonSize, className: triggerClassName, "aria-label": triggerLabel, "aria-expanded": open }), children: summary }), _jsx(PopoverContent, { align: "start", side: "bottom", className: "w-(--anchor-width) max-w-none min-w-[8rem] gap-0 p-1.5", children: children })] }));
|
|
225
|
+
}
|
|
226
|
+
/** Value inputs / “any value” control for a date metric filter bar (after field, “in”, range, and operator). */
|
|
227
|
+
export function FilterDateMetricBarValueSegment({ field, values, onChange, operator, i18n, size, onOperatorChange, }) {
|
|
228
|
+
const [metricPopoverOpen, setMetricPopoverOpen] = useState(false);
|
|
229
|
+
const [draftMin, setDraftMin] = useState('');
|
|
230
|
+
const [draftMax, setDraftMax] = useState('');
|
|
231
|
+
const draftMinRef = useRef('');
|
|
232
|
+
const draftMaxRef = useRef('');
|
|
233
|
+
const payload = useMemo(() => getDateMetricPayloadFromValues(values), [values]);
|
|
234
|
+
const commitMetricFromDraft = useCallback(() => {
|
|
235
|
+
const base = getDateMetricPayloadFromValues(values);
|
|
236
|
+
const min = parseDraftNumber(draftMinRef.current, base.min ?? null);
|
|
237
|
+
const max = parseDraftNumber(draftMaxRef.current, base.max ?? null);
|
|
238
|
+
if (operator === 'value_greater_than') {
|
|
239
|
+
onChange([{ ...base, min }]);
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
if (operator === 'value_less_than') {
|
|
243
|
+
onChange([{ ...base, max }]);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
if (operator === 'value_between') {
|
|
247
|
+
onChange([{ ...base, min, max }]);
|
|
248
|
+
}
|
|
249
|
+
}, [operator, values, onChange]);
|
|
250
|
+
const handleMetricPopoverOpenChange = useCallback((open) => {
|
|
251
|
+
if (open) {
|
|
252
|
+
const base = getDateMetricPayloadFromValues(values);
|
|
253
|
+
const dm = base.min != null ? String(base.min) : '';
|
|
254
|
+
const dx = base.max != null ? String(base.max) : '';
|
|
255
|
+
draftMinRef.current = dm;
|
|
256
|
+
draftMaxRef.current = dx;
|
|
257
|
+
setDraftMin(dm);
|
|
258
|
+
setDraftMax(dx);
|
|
259
|
+
setMetricPopoverOpen(true);
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
setMetricPopoverOpen((wasOpen) => {
|
|
263
|
+
if (wasOpen) {
|
|
264
|
+
commitMetricFromDraft();
|
|
265
|
+
}
|
|
266
|
+
return false;
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
}, [values, commitMetricFromDraft]);
|
|
270
|
+
const handleMetricValueInputKeyDown = useCallback((e) => {
|
|
271
|
+
if (e.key !== 'Enter')
|
|
272
|
+
return;
|
|
273
|
+
e.preventDefault();
|
|
274
|
+
handleMetricPopoverOpenChange(false);
|
|
275
|
+
}, [handleMetricPopoverOpenChange]);
|
|
276
|
+
const operators = useMemo(() => getOperatorsForField(field, values, i18n), [field, values, i18n]);
|
|
277
|
+
const valueAnyOperator = operators.find((o) => o.value === 'value_any');
|
|
278
|
+
const sym = i18n.defaultCurrency;
|
|
279
|
+
const numberLocale = i18n.numberFormatLocale;
|
|
280
|
+
const inputSizeProp = size === 'lg' ? 'default' : 'sm';
|
|
281
|
+
const buttonSize = size === 'lg' ? 'lg' : size === 'sm' ? 'sm' : 'default';
|
|
282
|
+
const valueSegment = (() => {
|
|
283
|
+
if (operator === 'value_any') {
|
|
284
|
+
const anyLabel = i18n.operators.valueAny;
|
|
285
|
+
const anyIcon = valueAnyOperator?.icon;
|
|
286
|
+
if (anyIcon) {
|
|
287
|
+
return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { render: _jsx(Button, { type: "button", variant: "outline", size: buttonSize, className: "min-w-8 shrink-0 px-2 font-normal text-muted-foreground hover:text-foreground [&_svg]:size-3.5", "aria-label": anyLabel, onClick: () => onOperatorChange?.('value_greater_than') }), children: anyIcon }), _jsx(TooltipContent, { side: "top", sideOffset: 6, children: anyLabel })] }));
|
|
288
|
+
}
|
|
289
|
+
return (_jsx(Button, { type: "button", variant: "outline", size: buttonSize, className: "max-w-[min(100%,14rem)] justify-start font-normal text-muted-foreground hover:text-foreground", "aria-label": anyLabel, onClick: () => onOperatorChange?.('value_greater_than'), children: anyLabel }));
|
|
290
|
+
}
|
|
291
|
+
if (operator === 'value_greater_than') {
|
|
292
|
+
const hasMinValue = payload.min != null && !Number.isNaN(payload.min);
|
|
293
|
+
const summary = formatMetricMoney(sym, payload.min ?? undefined, numberLocale);
|
|
294
|
+
const triggerLabel = `${i18n.operators.greaterThan}: ${summary}`;
|
|
295
|
+
return (_jsx(MetricValueThresholdPopoverShell, { open: metricPopoverOpen, onOpenChange: handleMetricPopoverOpenChange, buttonSize: buttonSize, triggerLabel: triggerLabel, summary: summary, triggerClassName: cn(METRIC_POPOVER_TRIGGER_NARROW, !hasMinValue ? 'text-muted-foreground' : 'text-foreground'), children: _jsx(Input, { type: "number", size: inputSizeProp, className: "w-full min-w-0 tabular-nums", value: draftMin, onChange: (e) => {
|
|
296
|
+
const v = e.target.value;
|
|
297
|
+
draftMinRef.current = v;
|
|
298
|
+
setDraftMin(v);
|
|
299
|
+
}, onKeyDown: handleMetricValueInputKeyDown }) }));
|
|
300
|
+
}
|
|
301
|
+
if (operator === 'value_less_than') {
|
|
302
|
+
const hasMaxValue = payload.max != null && !Number.isNaN(payload.max);
|
|
303
|
+
const summary = formatMetricMoney(sym, payload.max ?? undefined, numberLocale);
|
|
304
|
+
const triggerLabel = `${i18n.operators.lessThan}: ${summary}`;
|
|
305
|
+
return (_jsx(MetricValueThresholdPopoverShell, { open: metricPopoverOpen, onOpenChange: handleMetricPopoverOpenChange, buttonSize: buttonSize, triggerLabel: triggerLabel, summary: summary, triggerClassName: cn(METRIC_POPOVER_TRIGGER_NARROW, !hasMaxValue ? 'text-muted-foreground' : 'text-foreground'), children: _jsx(Input, { type: "number", size: inputSizeProp, className: "w-full min-w-0 tabular-nums", value: draftMax, onChange: (e) => {
|
|
306
|
+
const v = e.target.value;
|
|
307
|
+
draftMaxRef.current = v;
|
|
308
|
+
setDraftMax(v);
|
|
309
|
+
}, onKeyDown: handleMetricValueInputKeyDown }) }));
|
|
310
|
+
}
|
|
311
|
+
if (operator === 'value_between') {
|
|
312
|
+
const hasMinValue = payload.min != null && !Number.isNaN(payload.min);
|
|
313
|
+
const hasMaxValue = payload.max != null && !Number.isNaN(payload.max);
|
|
314
|
+
const minPart = formatMetricMoney(sym, payload.min ?? undefined, numberLocale);
|
|
315
|
+
const maxPart = formatMetricMoney(sym, payload.max ?? undefined, numberLocale);
|
|
316
|
+
const summary = `${minPart} - ${maxPart}`;
|
|
317
|
+
const triggerLabel = `${i18n.operators.between}: ${summary}`;
|
|
318
|
+
return (_jsx(MetricValueThresholdPopoverShell, { open: metricPopoverOpen, onOpenChange: handleMetricPopoverOpenChange, buttonSize: buttonSize, triggerLabel: triggerLabel, summary: summary, triggerClassName: cn(METRIC_POPOVER_TRIGGER_WIDE, !hasMinValue && !hasMaxValue ? 'text-muted-foreground' : 'text-foreground'), children: _jsxs("div", { className: "flex w-full flex-col gap-1.5", children: [_jsx(Input, { type: "number", size: inputSizeProp, className: "w-full min-w-0 tabular-nums", value: draftMin, onChange: (e) => {
|
|
319
|
+
const v = e.target.value;
|
|
320
|
+
draftMinRef.current = v;
|
|
321
|
+
setDraftMin(v);
|
|
322
|
+
}, onKeyDown: handleMetricValueInputKeyDown }), _jsx("div", { className: "pointer-events-none text-center text-xs text-muted-foreground select-none", "aria-hidden": true, children: "-" }), _jsx(Input, { type: "number", size: inputSizeProp, className: "w-full min-w-0 tabular-nums", value: draftMax, onChange: (e) => {
|
|
323
|
+
const v = e.target.value;
|
|
324
|
+
draftMaxRef.current = v;
|
|
325
|
+
setDraftMax(v);
|
|
326
|
+
}, onKeyDown: handleMetricValueInputKeyDown })] }) }));
|
|
327
|
+
}
|
|
328
|
+
return null;
|
|
329
|
+
})();
|
|
330
|
+
return valueSegment;
|
|
331
|
+
}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
+
import type { DateSelectorI18nConfig, DateSelectorValue } from '../../blocks/date-selector/date-selector-types';
|
|
1
2
|
import type { FilterI18nConfig, FilterOperator } from './filters-types';
|
|
3
|
+
export type DateMetricDateConnectorPhrases = Pick<FilterI18nConfig, 'dateMetricDateOn' | 'dateMetricDateIn'>;
|
|
4
|
+
/** Default bar connector between amount and date for `date_metric` filters. */
|
|
5
|
+
export declare function defaultDateMetricDateConnector(date: DateSelectorValue, dateI18n: DateSelectorI18nConfig, phrases?: DateMetricDateConnectorPhrases): string;
|
|
2
6
|
export declare const DEFAULT_I18N: FilterI18nConfig;
|
|
3
7
|
export declare const createOperatorsFromI18n: (i18n: FilterI18nConfig) => Record<string, FilterOperator[]>;
|
|
4
8
|
export declare const DEFAULT_OPERATORS: Record<string, FilterOperator[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filters-defaults.d.ts","sourceRoot":"","sources":["../../../src/components/filters/filters-defaults.
|
|
1
|
+
{"version":3,"file":"filters-defaults.d.ts","sourceRoot":"","sources":["../../../src/components/filters/filters-defaults.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AAEhH,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAExE,MAAM,MAAM,8BAA8B,GAAG,IAAI,CAAC,gBAAgB,EAAE,kBAAkB,GAAG,kBAAkB,CAAC,CAAC;AAe7G,+EAA+E;AAC/E,wBAAgB,8BAA8B,CAC1C,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,sBAAsB,EAChC,OAAO,GAAE,8BAAsE,GAChF,MAAM,CA2BR;AAED,eAAO,MAAM,YAAY,EAAE,gBA0E1B,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,MAAM,gBAAgB,KAAG,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,CAqC9F,CAAC;AAEH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,CAAyC,CAAC"}
|