@servicetitan/anvil2 3.0.4 → 3.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/{AnvilProvider-JXEbeQjR.js → AnvilProvider-J9DjoJiB.js} +13 -2
  3. package/dist/AnvilProvider-J9DjoJiB.js.map +1 -0
  4. package/dist/AnvilProvider.js +1 -1
  5. package/dist/{Combobox-C9-3tlcP.js → Combobox-BXQFOwX4.js} +2 -2
  6. package/dist/{Combobox-C9-3tlcP.js.map → Combobox-BXQFOwX4.js.map} +1 -1
  7. package/dist/Combobox.js +1 -1
  8. package/dist/{DataTable-Dr5A6RDe.js → DataTable-BFzj8cZG.js} +3 -3
  9. package/dist/{DataTable-Dr5A6RDe.js.map → DataTable-BFzj8cZG.js.map} +1 -1
  10. package/dist/{FilterBar-BUfajdQU.js → FilterBar-GjMlLOME.js} +6 -6
  11. package/dist/FilterBar-GjMlLOME.js.map +1 -0
  12. package/dist/FilterBar.js +1 -1
  13. package/dist/MultiSelectField.js +1 -1
  14. package/dist/{MultiSelectFieldSync-DXIBQABc.js → MultiSelectFieldSync-BxyQiVPQ.js} +56 -26
  15. package/dist/MultiSelectFieldSync-BxyQiVPQ.js.map +1 -0
  16. package/dist/MultiSelectFieldSync.css +59 -57
  17. package/dist/MultiSelectMenu.js +1 -1
  18. package/dist/{MultiSelectMenuSync-CCINebbr.js → MultiSelectMenuSync-BJfvZGf3.js} +19 -6
  19. package/dist/MultiSelectMenuSync-BJfvZGf3.js.map +1 -0
  20. package/dist/SelectField.js +1 -1
  21. package/dist/{SelectFieldSync-DqIDTKqt.js → SelectFieldSync-z8b41JZz.js} +39 -9
  22. package/dist/SelectFieldSync-z8b41JZz.js.map +1 -0
  23. package/dist/SelectMenu.js +1 -1
  24. package/dist/{SelectMenuSync-DYPEX5wc.js → SelectMenuSync-Cf1Zradm.js} +19 -6
  25. package/dist/SelectMenuSync-Cf1Zradm.js.map +1 -0
  26. package/dist/{SelectOptions-DuMbmJjh.js → SelectOptions-BgT1V6qp.js} +2 -2
  27. package/dist/{SelectOptions-DuMbmJjh.js.map → SelectOptions-BgT1V6qp.js.map} +1 -1
  28. package/dist/{SelectTrigger-RiRjgwXd.js → SelectTrigger-37HzF-VI.js} +2 -2
  29. package/dist/{SelectTrigger-RiRjgwXd.js.map → SelectTrigger-37HzF-VI.js.map} +1 -1
  30. package/dist/SelectTrigger.js +1 -1
  31. package/dist/{SelectTriggerBase-CWxP7nPA.js → SelectTriggerBase-4o1cqEbR.js} +2 -2
  32. package/dist/{SelectTriggerBase-CWxP7nPA.js.map → SelectTriggerBase-4o1cqEbR.js.map} +1 -1
  33. package/dist/SelectTriggerBase.css +44 -42
  34. package/dist/SelectTriggerBase.module-BgZSNZfE.js +37 -0
  35. package/dist/SelectTriggerBase.module-BgZSNZfE.js.map +1 -0
  36. package/dist/Table.js +1 -1
  37. package/dist/beta.js +7 -7
  38. package/dist/index.js +3 -3
  39. package/dist/src/beta/components/MultiSelectField/MultiSelectField.d.ts +1 -0
  40. package/dist/src/beta/components/MultiSelectField/internal/MultiSelectFieldComboboxMode.d.ts +1 -1
  41. package/dist/src/beta/components/MultiSelectField/internal/MultiSelectFieldSelectMode.d.ts +1 -1
  42. package/dist/src/beta/components/MultiSelectField/internal/types.d.ts +2 -1
  43. package/dist/src/beta/components/MultiSelectField/types.d.ts +2 -1
  44. package/dist/src/beta/components/MultiSelectMenu/MultiSelectMenu.d.ts +1 -0
  45. package/dist/src/beta/components/MultiSelectMenu/types.d.ts +2 -1
  46. package/dist/src/beta/components/SelectField/SelectField.d.ts +21 -0
  47. package/dist/src/beta/components/SelectField/internal/SelectFieldComboboxMode.d.ts +1 -1
  48. package/dist/src/beta/components/SelectField/internal/SelectFieldSelectMode.d.ts +1 -1
  49. package/dist/src/beta/components/SelectField/types.d.ts +2 -1
  50. package/dist/src/beta/components/SelectMenu/SelectMenu.d.ts +1 -0
  51. package/dist/src/beta/components/SelectMenu/types.d.ts +2 -1
  52. package/dist/src/internal/components/AddNewItemButton.d.ts +40 -0
  53. package/dist/src/internal/components/OptionsDialog/OptionsDialog.d.ts +3 -1
  54. package/dist/src/internal/components/OptionsPopover/OptionsPopover.d.ts +13 -1
  55. package/dist/src/internal/types/addNewItemTypes.d.ts +12 -0
  56. package/dist/src/internal/types/selectFieldInternalTypes.d.ts +2 -1
  57. package/dist/{syncFilterUtils-hlw11Ud8.js → syncFilterUtils-Dpp7gt05.js} +96 -24
  58. package/dist/syncFilterUtils-Dpp7gt05.js.map +1 -0
  59. package/dist/syncFilterUtils.css +44 -23
  60. package/dist/{useMenuInteraction-BwZ2ORo9.js → useMenuInteraction-C4RU5Fdq.js} +1 -5
  61. package/dist/useMenuInteraction-C4RU5Fdq.js.map +1 -0
  62. package/dist/{useToggleSelection-VwlBkdZo.js → useToggleSelection-DBqr4HwT.js} +2 -2
  63. package/dist/{useToggleSelection-VwlBkdZo.js.map → useToggleSelection-DBqr4HwT.js.map} +1 -1
  64. package/package.json +3 -3
  65. package/dist/AnvilProvider-JXEbeQjR.js.map +0 -1
  66. package/dist/FilterBar-BUfajdQU.js.map +0 -1
  67. package/dist/MultiSelectFieldSync-DXIBQABc.js.map +0 -1
  68. package/dist/MultiSelectMenuSync-CCINebbr.js.map +0 -1
  69. package/dist/SelectFieldSync-DqIDTKqt.js.map +0 -1
  70. package/dist/SelectMenuSync-DYPEX5wc.js.map +0 -1
  71. package/dist/SelectTriggerBase.module-CCLOnHm1.js +0 -37
  72. package/dist/SelectTriggerBase.module-CCLOnHm1.js.map +0 -1
  73. package/dist/syncFilterUtils-hlw11Ud8.js.map +0 -1
  74. package/dist/useMenuInteraction-BwZ2ORo9.js.map +0 -1
@@ -20,7 +20,7 @@ import { P as Popover } from './AiMark-DjOf60tj.js';
20
20
  import { a as SvgSearch } from './SearchField-CO9BHCYB.js';
21
21
  import { C as Checkbox } from './Checkbox-CVidv1sO.js';
22
22
  import { R as Radio } from './Radio-CSBetBV6.js';
23
- import { C as Combobox } from './Combobox-C9-3tlcP.js';
23
+ import { C as Combobox } from './Combobox-BXQFOwX4.js';
24
24
  import { B as ButtonToggle } from './ButtonToggle-jnDMPSyK.js';
25
25
  import { D as Drawer } from './Drawer-Dg35inxH.js';
26
26
  import { d as BreakpointSm, c as BreakpointMd, b as BreakpointLg, a as BreakpointXl, B as BreakpointXxl } from './primitive-DXlHdTFb.js';
@@ -964,7 +964,7 @@ const FilterDrawer = () => {
964
964
  label: draftSingleSelectFilter.label,
965
965
  prefix: { icon: { svg: SvgSearch } },
966
966
  placeholder: "Search...",
967
- size: "small",
967
+ size: "medium",
968
968
  value: draftSingleSelectFilter.selectedItem?.label || searchValues[draftFilter.id] || "",
969
969
  onChange: (e) => {
970
970
  const searchValue = e.target.value;
@@ -989,7 +989,7 @@ const FilterDrawer = () => {
989
989
  {
990
990
  label: singleSelectFilter.label,
991
991
  placeholder: "Select an option...",
992
- size: "small"
992
+ size: "medium"
993
993
  }
994
994
  ),
995
995
  /* @__PURE__ */ jsx(Combobox.Content, { children: ({ items }) => /* @__PURE__ */ jsx(Combobox.List, { style: { padding: 0 }, children: items.map((item, i) => /* @__PURE__ */ jsx(Combobox.Item, { item, index: i, children: item.label }, item.id)) }) })
@@ -1056,7 +1056,7 @@ const FilterDrawer = () => {
1056
1056
  label: multiSelectFilter.label,
1057
1057
  prefix: { icon: { svg: SvgSearch } },
1058
1058
  placeholder: "Search...",
1059
- size: "small",
1059
+ size: "medium",
1060
1060
  value: searchValues[draftFilter.id] || "",
1061
1061
  onChange: (e) => {
1062
1062
  const searchValue = e.target.value;
@@ -1081,7 +1081,7 @@ const FilterDrawer = () => {
1081
1081
  {
1082
1082
  label: multiSelectFilter.label,
1083
1083
  placeholder: "Select options...",
1084
- size: "small"
1084
+ size: "medium"
1085
1085
  }
1086
1086
  ),
1087
1087
  /* @__PURE__ */ jsx(Combobox.Content, { children: ({ items }) => /* @__PURE__ */ jsx(Combobox.List, { style: { padding: 0 }, children: items.map((item, i) => /* @__PURE__ */ jsx(Combobox.Item, { item, index: i, children: item.label }, item.id)) }) })
@@ -1439,4 +1439,4 @@ const FilterBar = forwardRef(
1439
1439
  FilterBar.displayName = "FilterBar";
1440
1440
 
1441
1441
  export { FilterBar as F };
1442
- //# sourceMappingURL=FilterBar-BUfajdQU.js.map
1442
+ //# sourceMappingURL=FilterBar-GjMlLOME.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterBar-GjMlLOME.js","sources":["../src/internal/hooks/useContainerQuery/useContainerQuery.ts","../src/beta/components/FilterBar/internal/FilterGroupContext.tsx","../src/beta/components/FilterBar/FilterItemWrapper.tsx","../src/beta/components/FilterBar/internal/utils/filter-state.ts","../src/beta/components/FilterBar/FilterToggleButton.tsx","../src/beta/components/FilterBar/FilterSelect.tsx","../src/beta/components/FilterBar/FilterDateSingle.tsx","../src/beta/components/FilterBar/FilterDateRange.tsx","../src/beta/components/FilterBar/FilterButton.tsx","../../hammer-icon/mdi/round/tune.svg","../src/beta/components/FilterBar/FilterDrawer.tsx","../src/beta/components/FilterBar/FilterBar.tsx"],"sourcesContent":["import { useEffect, useState, RefObject } from \"react\";\nimport { core } from \"@servicetitan/hammer-token\";\n\n/**\n * Return type for the useContainerQuery hook\n */\nexport type ContainerQueryReturnProps = {\n /**\n * The breakpoint name\n */\n name: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"xxl\";\n /**\n * Minimum width for this breakpoint\n */\n min: number | undefined;\n /**\n * Maximum width for this breakpoint\n */\n max: number | undefined;\n /**\n * Current container width\n */\n containerWidth: number;\n /**\n * Current container height\n */\n containerHeight: number;\n};\n\n/**\n * Determines if the current container width matches a specific breakpoint\n * @param containerWidth - The container width\n * @param name - The breakpoint name\n * @param min - Minimum width for this breakpoint\n * @param max - Maximum width for this breakpoint\n * @returns Breakpoint information if matched, undefined otherwise\n */\nfunction containerBreakpoint(\n containerWidth: number,\n name: ContainerQueryReturnProps[\"name\"],\n min?: number,\n max?: number,\n): ContainerQueryReturnProps | undefined {\n if (\n (min == null || containerWidth >= min) &&\n (max == null || containerWidth < max)\n ) {\n return {\n name,\n min,\n max,\n containerWidth,\n containerHeight: 0, // Will be updated with actual height\n } as const;\n }\n return undefined;\n}\n\n/**\n * Determines the current breakpoint based on container width and hammer-token breakpoint values.\n *\n * Features:\n * - Validates that all required hammer-token breakpoint values are available\n * - Uses cascade logic to determine the appropriate breakpoint\n * - Returns the first matching breakpoint in order of preference\n * - Handles edge cases where breakpoint values are missing\n * - Uses container dimensions for accurate measurements\n * - Supports all standard breakpoints (xs, sm, md, lg, xl, xxl)\n *\n * @param containerWidth - The width of the container element\n * @param containerHeight - The height of the container element\n * @returns Current breakpoint information or undefined if breakpoint values are unavailable\n */\nconst getContainerBreakpoint = (\n containerWidth: number,\n containerHeight: number,\n) => {\n if (!core.primitive?.BreakpointSm) return;\n if (!core.primitive?.BreakpointMd) return;\n if (!core.primitive?.BreakpointLg) return;\n if (!core.primitive?.BreakpointXl) return;\n if (!core.primitive?.BreakpointXxl) return;\n\n const sm = parseInt(core.primitive?.BreakpointSm.value);\n const md = parseInt(core.primitive?.BreakpointMd.value);\n const lg = parseInt(core.primitive?.BreakpointLg.value);\n const xl = parseInt(core.primitive?.BreakpointXl.value);\n const xxl = parseInt(core.primitive?.BreakpointXxl.value);\n\n const result =\n containerBreakpoint(containerWidth, \"xs\", undefined, sm) ??\n containerBreakpoint(containerWidth, \"sm\", sm, md) ??\n containerBreakpoint(containerWidth, \"md\", md, lg) ??\n containerBreakpoint(containerWidth, \"lg\", lg, xl) ??\n containerBreakpoint(containerWidth, \"xl\", xl, xxl) ??\n containerBreakpoint(containerWidth, \"xxl\", xxl, undefined);\n\n return result ? { ...result, containerHeight } : undefined;\n};\n\n/**\n * Custom hook for detecting current breakpoint based on container dimensions.\n *\n * Features:\n * - Detects current breakpoint based on container width instead of viewport width\n * - Supports all standard breakpoints (xs, sm, md, lg, xl, xxl)\n * - Provides container dimensions information\n * - Uses hammer-token breakpoint values for consistency\n * - Listens for container resize events using ResizeObserver\n * - Supports optional disable functionality\n * - Uses container element dimensions for accurate measurements\n *\n * @param containerRef - React ref to the container element to observe\n * @param props - Optional configuration object\n * @param props.disable - Whether to disable the hook\n * @returns Current breakpoint information or undefined if disabled\n */\nexport const useContainerQuery = (\n containerRef: RefObject<HTMLElement>,\n props?: { disable?: boolean },\n) => {\n const [size, setSize] = useState<ContainerQueryReturnProps | undefined>(\n undefined,\n );\n\n useEffect(() => {\n if (props?.disable || !containerRef.current) return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n const breakpoint = getContainerBreakpoint(width, height);\n setSize(breakpoint);\n }\n });\n\n resizeObserver.observe(containerRef.current);\n\n // Set initial size\n const rect = containerRef.current.getBoundingClientRect();\n setSize(getContainerBreakpoint(rect.width, rect.height));\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [containerRef, props?.disable]);\n\n if (props?.disable) return undefined;\n return size;\n};\n","import { createContext, RefObject } from \"react\";\nimport { FilterBarProps } from \"../FilterBar\";\nimport { Filter, FilterValue } from \"./types\";\n\n/**\n * Context for sharing filter state and operations between FilterBar and its children\n *\n * @extends FilterBarProps\n */\ntype FilterGroupContextProps = FilterBarProps & {\n /** Reference to the filter group DOM element\n * @default { current: null }\n */\n filterGroupRef: RefObject<HTMLDivElement>;\n /** Current filters array\n * @default []\n */\n filters: Filter[];\n /** Function to update a single filter and submit if needed\n * @default () => {}\n */\n updateFilter: (filterId: string, value: FilterValue, submit: boolean) => void;\n /** Array of filters that are currently hidden due to overflow\n * @default []\n */\n hiddenFilters: Filter[];\n /** Function to mark a filter as hidden\n * @default () => {}\n */\n addHiddenFilter: (filter: Filter) => void;\n /** Function to mark a filter as visible\n * @default () => {}\n */\n removeHiddenFilter: (filter: Filter) => void;\n};\n\n/**\n * Context provider for filter-related operations\n * Used to share filter state between FilterBar and FilterDrawer\n */\nexport const FilterGroupContext = createContext<FilterGroupContextProps>({\n filterGroupRef: { current: null },\n filters: [],\n updateFilter: () => {},\n onFilterChange: () => {},\n controlledFiltering: false,\n associatedContent: \"\",\n hiddenFilters: [],\n addHiddenFilter: () => {},\n removeHiddenFilter: () => {},\n});\n","import { useContext, useCallback, useMemo } from \"react\";\nimport { FilterGroupContext } from \"./internal/FilterGroupContext\";\nimport { Filter } from \"./internal/types\";\nimport {\n ToolbarItemWrapper,\n ToolbarItemWrapperProps,\n} from \"../Toolbar/internal/ToolbarItemWrapper\";\nimport { ToolbarButtonProps } from \"../Toolbar/ToolbarButton\";\n\nimport styles from \"./FilterBar.module.scss\";\n\n/**\n * Props for the FilterItemWrapper component\n */\ntype FilterItemWrapperProps = {\n /**\n * Optional filter object. If provided, visibility changes will be tracked in FilterGroupContext.\n * If not provided, only basic visibility tracking will be used.\n */\n filter?: Filter;\n /** The content to render inside the wrapper */\n children: React.ReactNode;\n};\n\n/**\n * FilterItemWrapper extends ToolbarItemWrapper to handle filter-specific visibility.\n * Uses FilterGroupContext to track hidden filters instead of overflow menu.\n * Built into FilterButton and other filter components for consistent overflow handling.\n *\n * Features:\n * - Wraps filter controls for consistent overflow and visibility handling\n * - Integrates with FilterGroupContext to track hidden filters\n */\nexport const FilterItemWrapper = ({\n filter,\n children,\n}: FilterItemWrapperProps) => {\n const { addHiddenFilter, removeHiddenFilter, filterGroupRef } =\n useContext(FilterGroupContext);\n\n const handleVisibilityChange = useCallback(\n (isVisible: boolean) => {\n // Only track in FilterGroupContext if a filter is provided\n if (filter) {\n if (isVisible) {\n removeHiddenFilter?.(filter);\n } else {\n addHiddenFilter?.(filter);\n }\n }\n },\n [filter, addHiddenFilter, removeHiddenFilter],\n );\n\n const props: ToolbarItemWrapperProps = useMemo(\n () => ({\n item: {\n itemType: \"button\",\n itemProps: {\n children: null,\n \"aria-hidden\": true,\n } as ToolbarButtonProps,\n },\n children,\n className: styles[\"filter-item\"],\n observerRoot: filterGroupRef.current,\n onVisibilityChange: handleVisibilityChange,\n rootMargin: \"0px -80px 0px 0px\",\n }),\n [children, filterGroupRef, handleVisibilityChange],\n );\n\n return <ToolbarItemWrapper {...props} />;\n};\n","import {\n BooleanFilter,\n CustomFilter,\n DateFilter,\n DateRangeFilter,\n Filter,\n FilterValue,\n MultiSelectFilter,\n SingleSelectFilter,\n} from \"../types\";\n\n/**\n * Returns an array of filters that are currently active (i.e., have a value set).\n *\n * @param {Filter[]} filters - Array of filter objects to check\n * @returns {Filter[]} Array of active filters\n */\nexport const getActiveFilters = (filters: Filter[]): Filter[] => {\n return filters.filter((filter) => {\n switch (filter.type) {\n case \"boolean\":\n return filter.checked;\n case \"custom\":\n return filter.value !== undefined;\n case \"singleSelect\":\n return filter.selectedItem !== undefined;\n case \"multiSelect\":\n return filter.selectedItems && filter.selectedItems.length > 0;\n case \"date\":\n return filter.value !== null && filter.value !== undefined;\n case \"dateRange\":\n return (\n filter.value !== null &&\n filter.value !== undefined &&\n filter.value.startDate !== null &&\n filter.value.endDate !== null\n );\n default:\n return false;\n }\n });\n};\n\n/**\n * Checks if any filters in the array have active values\n *\n * @param {Filter[]} filters - Array of filter objects to check\n * @returns {boolean} True if any filter has an active value\n */\nexport const checkActiveFilters = (filters: Filter[]): boolean => {\n return getActiveFilters(filters).length > 0;\n};\n\n/**\n * Resets all filters to their default state\n *\n * @param {Filter[]} filters - Array of filter objects to reset\n * @returns {Filter[]} New array with reset filters\n */\nexport const resetFilters = (filters: Filter[]): Filter[] => {\n return filters.map((filter) => {\n switch (filter.type) {\n case \"boolean\":\n return {\n ...filter,\n checked: false,\n };\n case \"custom\":\n return {\n ...filter,\n value: undefined,\n };\n case \"singleSelect\":\n return {\n ...filter,\n selectedItem: undefined,\n };\n case \"multiSelect\":\n return {\n ...filter,\n selectedItems: [],\n };\n case \"date\":\n case \"dateRange\":\n return {\n ...filter,\n value: null,\n };\n default:\n return filter;\n }\n });\n};\n\n/**\n * Updates a single filter in an array of filters\n *\n * @param {Filter[]} filters - Array of filter objects\n * @param {string} filterId - ID of the filter to update\n * @param {FilterValue} value - New value for the filter\n * @returns {Filter[]} New array with updated filter\n */\nexport const updateSingleFilter = (\n filters: Filter[],\n filterId: string,\n value: FilterValue,\n): Filter[] => {\n return filters.map((filter) => {\n if (filter.id !== filterId) return filter;\n\n switch (filter.type) {\n case \"boolean\":\n return {\n ...filter,\n checked: value as boolean,\n };\n case \"singleSelect\":\n return {\n ...filter,\n selectedItem: value,\n };\n case \"multiSelect\":\n return {\n ...filter,\n selectedItems: value as unknown[],\n };\n case \"date\":\n return {\n ...filter,\n value: value as string | null,\n };\n case \"dateRange\":\n return {\n ...filter,\n value: value as {\n startDate: string | null;\n endDate: string | null;\n } | null,\n };\n case \"custom\":\n return {\n ...filter,\n value,\n };\n default:\n return filter;\n }\n });\n};\n\n/**\n * Determines if two filter values are different.\n * For arrays (multiSelect), compares by id set (order-insensitive, avoids JSON serialization).\n * For singleSelect, compares by id if both are objects with id.\n *\n * @param {T} a - First value to compare\n * @param {T} b - Second value to compare\n * @returns {boolean} True if the values are different\n */\nexport const hasChangedFilter = <T>(a: T, b: T): boolean => {\n // For arrays (multiSelect), compare by id set to handle new array references with same items.\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return true;\n if (a.length === 0) return false;\n const aItems = a as Array<{ id?: unknown }>;\n const bItems = b as Array<{ id?: unknown }>;\n if (aItems[0] && \"id\" in aItems[0]) {\n const aIds = new Set(aItems.map((item) => item.id));\n return (bItems as Array<{ id: unknown }>).some(\n (item) => !aIds.has(item.id),\n );\n }\n return JSON.stringify(a) !== JSON.stringify(b);\n }\n // For singleSelect, compare by id if both are objects with id\n if (\n a &&\n b &&\n typeof a === \"object\" &&\n typeof b === \"object\" &&\n \"id\" in a &&\n \"id\" in b\n ) {\n return a.id !== b.id;\n }\n // Fallback to strict equality\n return a !== b;\n};\n\n/**\n * Gets the selection value from a filter based on its type.\n * Internal helper function used by hasFilterSelectionChanged.\n *\n * @param {Filter} filter - The filter to extract the selection value from\n * @returns {unknown} The selection value (checked, selectedItem, selectedItems, value)\n */\nconst getFilterSelectionValue = (filter: Filter): unknown => {\n switch (filter.type) {\n case \"boolean\":\n return filter.checked;\n case \"singleSelect\":\n return filter.selectedItem;\n case \"multiSelect\":\n return filter.selectedItems;\n case \"date\":\n case \"dateRange\":\n case \"custom\":\n return filter.value;\n default:\n return undefined;\n }\n};\n\n/**\n * Checks if the selection value of a filter has changed by comparing references.\n * Uses reference equality (===) to detect if the parent has provided a new value.\n *\n * @param {Filter} existingFilter - The current filter state\n * @param {Filter} newFilter - The incoming filter from props\n * @returns {boolean} True if the selection value reference has changed\n */\nexport const hasFilterSelectionChanged = (\n existingFilter: Filter,\n newFilter: Filter,\n): boolean => {\n const existingValue = getFilterSelectionValue(existingFilter);\n const newValue = getFilterSelectionValue(newFilter);\n\n // Reference equality check - returns true if references differ\n return existingValue !== newValue;\n};\n\n/**\n * Preserves the selection state from an existing filter into a new filter.\n * Used when filter configuration updates but the selection value reference hasn't changed,\n * allowing us to maintain user selections through configuration updates.\n *\n * @param {Filter} newFilter - The new filter configuration from props\n * @param {Filter} existingFilter - The existing filter with user's selections\n * @returns {Filter} New filter with configuration from newFilter and selection from existingFilter\n */\nexport const preserveFilterState = (\n newFilter: Filter,\n existingFilter: Filter,\n): Filter => {\n switch (newFilter.type) {\n case \"boolean\":\n return {\n ...newFilter,\n checked: (existingFilter as BooleanFilter).checked,\n };\n case \"singleSelect\":\n return {\n ...newFilter,\n selectedItem: (existingFilter as SingleSelectFilter<unknown>)\n .selectedItem,\n };\n case \"multiSelect\":\n return {\n ...newFilter,\n selectedItems: (existingFilter as MultiSelectFilter<unknown>)\n .selectedItems,\n };\n case \"date\":\n return {\n ...newFilter,\n value: (existingFilter as DateFilter).value,\n };\n case \"dateRange\":\n return {\n ...newFilter,\n value: (existingFilter as DateRangeFilter).value,\n };\n case \"custom\":\n return {\n ...newFilter,\n value: (existingFilter as CustomFilter<unknown>).value,\n };\n default:\n return newFilter;\n }\n};\n\n/**\n * Creates a deep clone of filters with updated item references.\n * Ensures that selected items reference the current items array for proper equality checks.\n * Used when initializing draft state to ensure selections use current item references.\n *\n * @param {Filter[]} filters - Array of filter objects to clone\n * @returns {Filter[]} New array with cloned filters and updated item references\n */\nexport const cloneFiltersWithItemRefs = (filters: Filter[]): Filter[] => {\n return filters.map((filter) => {\n switch (filter.type) {\n case \"singleSelect\":\n return {\n ...filter,\n selectedItem: filter.selectedItem\n ? filter.items.find(\n (item) => item.id === filter.selectedItem?.id,\n ) || filter.selectedItem\n : undefined,\n };\n case \"multiSelect\":\n return {\n ...filter,\n selectedItems: filter.selectedItems\n ? filter.selectedItems.map(\n (selectedItem) =>\n filter.items.find((item) => item.id === selectedItem.id) ||\n selectedItem,\n )\n : [],\n };\n case \"date\":\n return {\n ...filter,\n value: filter.value as string | null,\n };\n case \"dateRange\":\n return {\n ...filter,\n value: filter.value as {\n startDate: string | null;\n endDate: string | null;\n } | null,\n };\n case \"custom\": {\n const { value } = filter;\n\n if (value === undefined) {\n return { ...filter, value: undefined };\n }\n if (Array.isArray(value)) {\n return { ...filter, value: [...value] };\n }\n if (typeof value === \"object\" && value !== null) {\n return { ...filter, value: { ...value } };\n }\n return { ...filter, value };\n }\n default:\n return { ...filter };\n }\n });\n};\n","import {\n ToolbarButtonToggle,\n ToolbarButtonToggleProps,\n} from \"../Toolbar/ToolbarButtonToggle\";\nimport { FilterItemWrapper } from \"./FilterItemWrapper\";\nimport { BooleanFilter } from \"./internal/types\";\n\nimport styles from \"./FilterBar.module.scss\";\n\n/**\n * Props for the FilterToggleButton component\n *\n * @extends Omit<ToolbarButtonToggleProps, \"checked\">\n */\nexport type FilterToggleButtonProps = Omit<\n ToolbarButtonToggleProps,\n \"checked\"\n> & {\n /** Unique identifier for the filter */\n id: string;\n /** Whether the toggle is checked */\n checked: boolean;\n /** The content to display inside the toggle button */\n children: React.ReactNode;\n};\n\n/**\n * FilterToggleButton wraps ToolbarButtonToggle in a FilterItemWrapper for consistent overflow behavior with other filter types.\n * Built into FilterGroup for boolean filter rendering.\n *\n * Features:\n * - Renders a toggle button for boolean filters\n * - Integrates with FilterGroup and FilterItemWrapper for overflow handling\n * - Supports accessibility and keyboard navigation\n */\nexport const FilterToggleButton = ({\n id,\n checked,\n children,\n ...props\n}: FilterToggleButtonProps) => {\n // Construct a BooleanFilter object from the props\n const filter: BooleanFilter = {\n id,\n type: \"boolean\",\n checked,\n label: typeof children === \"string\" ? children : id,\n };\n\n return (\n <FilterItemWrapper filter={filter}>\n <ToolbarButtonToggle\n checked={checked}\n isFilter\n {...props}\n className={styles[\"filter-button-trigger\"]}\n data-anv=\"toolbar-boolean-filter\"\n >\n {children}\n </ToolbarButtonToggle>\n </FilterItemWrapper>\n );\n};\n","import {\n useMemo,\n useCallback,\n useRef,\n useState,\n useEffect,\n KeyboardEvent,\n} from \"react\";\nimport { tabbable } from \"tabbable\";\nimport { MultiSelectFilter, SingleSelectFilter } from \"./internal/types\";\nimport Listbox from \"../../../components/Listbox\";\nimport ListView from \"../../../components/ListView\";\nimport { SearchField } from \"../../../components/SearchField\";\n\nimport styles from \"./FilterBar.module.scss\";\n\n/**\n * Props for the FilterSelect component\n */\ninterface FilterSelectProps<Item extends { id: string; label: string }> {\n /** The filter configuration object */\n filter: SingleSelectFilter<Item> | MultiSelectFilter<Item>;\n /** The current draft value for the filter */\n draftValue: Item | Item[] | undefined;\n /** Callback to update the draft value */\n onDraftChange: (value: Item | Item[] | undefined) => void;\n}\n\n/**\n * FilterSelect component renders a Listbox or ListView for single or multi-select filters.\n * Built into FilterButton and FilterDrawer for filter selection UI.\n *\n * Features:\n * - Renders a Listbox for single select filters\n * - Renders a ListView for multi select filters\n * - Supports search field for filtering options\n */\nexport const FilterSelect = <Item extends { id: string; label: string }>({\n filter,\n draftValue,\n onDraftChange,\n}: FilterSelectProps<Item>) => {\n const isMultiSelect = filter.type === \"multiSelect\";\n\n // Ref to track the list container for focus management\n const listRef = useRef<HTMLDivElement>(null);\n\n // For multi-select with search: keep a stable snapshot of items so that a selection\n // (which causes the consumer to re-render and potentially reset filter.items) does not\n // clear the search-filtered list while the search field still has a value.\n const shouldStabilizeItems = isMultiSelect && filter.hasSearch;\n const [stableItems, setStableItems] = useState(filter.items);\n const isSearchActiveRef = useRef(false);\n const expectingSearchUpdate = useRef(false);\n\n // displayItems is filter.items for all non-stabilized cases so items always stay\n // in sync with props without an extra render cycle via state.\n const displayItems = shouldStabilizeItems ? stableItems : filter.items;\n\n useEffect(() => {\n if (!shouldStabilizeItems) return;\n if (expectingSearchUpdate.current) {\n // This items update was triggered by a new search term — accept it\n setStableItems(filter.items);\n expectingSearchUpdate.current = false;\n } else if (!isSearchActiveRef.current) {\n // Search is not active — freely sync items (e.g. search cleared, initial load)\n setStableItems(filter.items);\n }\n // While search is active and this isn't a search-triggered update (i.e. a selection\n // update caused the consumer to re-render), preserve the current stableItems.\n }, [filter.items, shouldStabilizeItems]);\n\n const handleSearch = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const { value } = e.target;\n filter.onSearch?.(value);\n if (shouldStabilizeItems) {\n if (value.length > 0) {\n isSearchActiveRef.current = true;\n expectingSearchUpdate.current = true;\n } else {\n isSearchActiveRef.current = false;\n }\n }\n },\n [filter, shouldStabilizeItems],\n );\n\n const handleSearchClear = useCallback(() => {\n filter.onSearchClear?.();\n if (shouldStabilizeItems) {\n isSearchActiveRef.current = false;\n }\n }, [filter, shouldStabilizeItems]);\n\n const handleSearchKeyDown = useCallback(\n (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"ArrowDown\" && listRef.current) {\n e.preventDefault();\n // Find first focusable element in the list and focus it\n const focusableElements = tabbable(listRef.current);\n if (focusableElements.length > 0) {\n focusableElements[0].focus();\n }\n }\n },\n [],\n );\n\n const singleSelectList = useMemo(\n () => (\n <div ref={listRef}>\n <Listbox\n key={filter.id}\n items={filter.items}\n selected={draftValue as Item | undefined}\n onSelectionChange={(selected: Item | undefined) => {\n onDraftChange(selected);\n }}\n disableAutoSelectOnFocus\n style={{ paddingInline: \"1rem\", paddingBlockStart: \"1rem\" }}\n >\n {({ items }) =>\n items.map((item) => (\n <Listbox.Option\n key={item.id}\n item={item}\n disabled={item.disabled}\n >\n {item.label}\n </Listbox.Option>\n ))\n }\n </Listbox>\n </div>\n ),\n [filter.id, filter.items, draftValue, onDraftChange],\n );\n\n const multiSelectList = useMemo(\n () => (\n <div ref={listRef}>\n <ListView\n key={filter.id}\n items={displayItems}\n selected={Array.isArray(draftValue) ? draftValue : []}\n onSelectionChange={(selectedItems: unknown[]) => {\n const items = selectedItems as Item[];\n onDraftChange(items);\n }}\n style={{ paddingInline: \"1rem\", paddingBlockStart: \"1rem\" }}\n >\n {({ items }) =>\n items.map((item) => (\n <ListView.Option key={item.id} item={item}>\n {item.label}\n </ListView.Option>\n ))\n }\n </ListView>\n </div>\n ),\n [filter.id, displayItems, draftValue, onDraftChange],\n );\n\n return (\n <>\n {filter.hasSearch && (\n <SearchField\n size=\"small\"\n className={styles[\"filter-select-search\"]}\n onChange={handleSearch}\n onClear={handleSearchClear}\n onKeyDown={handleSearchKeyDown}\n data-anv=\"filter-select-search\"\n />\n )}\n {isMultiSelect ? multiSelectList : singleSelectList}\n </>\n );\n};\n","import { useRef } from \"react\";\nimport { DateFilter } from \"./internal/types\";\nimport Flex from \"../../../components/Flex\";\nimport {\n MaskedDateInput,\n MaskedDateInputRef,\n} from \"../../../components/DateFieldSingle/internal/MaskedDateInput\";\nimport { DateFieldSingleChange } from \"../../../components/DateFieldSingle\";\nimport { useDateFieldSingleConversion } from \"../../../components/DateFieldSingle/internal/useDateFieldSingleConversion\";\nimport { useDateFieldSingleState } from \"../../../components/DateFieldSingle/internal/useDateFieldSingleState\";\nimport { DateFieldSingleCalendar } from \"../../../components/DateFieldSingle/internal/DateFieldSingleCalendar\";\n\n/**\n * Props for the FilterDateSingle component\n */\ninterface FilterDateSingleProps {\n /**\n * The date filter configuration object containing mode and other settings\n */\n filter: DateFilter;\n /**\n * The current draft value for the date filter in ISO 8601 format\n */\n draftValue: string | null;\n /**\n * Callback function to update the draft value when the date changes\n */\n onDraftChange: (value: string | null) => void;\n}\n\n/**\n * FilterDateSingle component for selecting a single date in toolbar filters.\n *\n * Features:\n * - Renders a masked date input field with format validation\n * - Provides calendar popup for date selection\n * - Integrates with toolbar filter state management\n * - Supports controlled and uncontrolled date selection\n * - Maintains draft state for filter changes\n */\nexport const FilterDateSingle = ({\n filter,\n draftValue,\n onDraftChange,\n}: FilterDateSingleProps) => {\n const maskedDateInputRef = useRef<MaskedDateInputRef>(null);\n\n const handleChange = (change: DateFieldSingleChange) => {\n onDraftChange(change.date);\n };\n\n const { value, onChange } = useDateFieldSingleConversion({\n value: draftValue,\n onChange: handleChange,\n });\n\n const { handleInputChange, handleCalendarSelection } =\n useDateFieldSingleState({\n valueProp: value,\n onChange: (change) => onChange({ ...change, isDateValid: true }),\n });\n\n return (\n <Flex gap={4} direction=\"column\">\n <MaskedDateInput\n mode={filter.mode}\n ref={maskedDateInputRef}\n onChange={handleInputChange}\n lastValidDate={value ?? null}\n autoComplete=\"off\"\n />\n\n <DateFieldSingleCalendar\n value={value ?? null}\n onSelection={handleCalendarSelection}\n />\n </Flex>\n );\n};\n","import { useRef } from \"react\";\nimport { DateRangeFilter } from \"./internal/types\";\nimport {\n MaskedDateRangeInput,\n MaskedDateRangeInputRef,\n} from \"../../../components/DateFieldRange/internal/MaskedDateRangeInput\";\nimport { DateFieldRangeChange } from \"../../../components/DateFieldRange\";\nimport { useDateFieldRangeConversion } from \"../../../components/DateFieldRange/internal/useDateFieldRangeConversion\";\nimport { useDateFieldRangeState } from \"../../../components/DateFieldRange/internal/useDateFieldRangeState\";\nimport Flex from \"../../../components/Flex\";\nimport { DateFieldRangeCalendar } from \"../../../components/DateFieldRange/internal/DateFieldRangeCalendar\";\n\n/**\n * Props for the FilterDateRange component\n */\ninterface FilterDateRangeProps {\n /**\n * The date range filter configuration object containing mode and other settings\n */\n filter: DateRangeFilter;\n /**\n * The current draft value for the date range filter with start and end dates in ISO 8601 format\n */\n draftValue: { startDate: string | null; endDate: string | null } | null;\n /**\n * Callback function to update the draft value when the date range changes\n */\n onDraftChange: (\n value: { startDate: string | null; endDate: string | null } | null,\n ) => void;\n}\n\n/**\n * FilterDateRange component for selecting a date range in toolbar filters.\n *\n * Features:\n * - Renders a masked date range input field with format validation\n * - Provides calendar popup for date range selection\n * - Integrates with toolbar filter state management\n * - Supports controlled and uncontrolled date range selection\n * - Maintains draft state for filter changes\n * - Handles start and end date selection independently\n */\nexport const FilterDateRange = ({\n filter,\n draftValue,\n onDraftChange,\n}: FilterDateRangeProps) => {\n const maskedDateRangeInputRef = useRef<MaskedDateRangeInputRef>(null);\n\n const handleChange = (change: DateFieldRangeChange) => {\n // Only call onDraftChange when we have a complete date range (both start and end)\n // or when clearing the range (both null)\n const hasCompleteRange = change.startDate && change.endDate;\n const isClearingRange = !change.startDate && !change.endDate;\n\n if (hasCompleteRange || isClearingRange) {\n onDraftChange({\n startDate: change.startDate,\n endDate: change.endDate,\n });\n }\n };\n\n const { value, onChange } = useDateFieldRangeConversion({\n value: draftValue,\n onChange: handleChange,\n });\n\n const { handleInputChange, handleCalendarSelection } = useDateFieldRangeState(\n {\n valueProp: value,\n onChange: (change) => {\n // Only call handleChange if input is valid and we have a complete range, or if clearing\n const hasCompleteRange = change.startDate && change.endDate;\n const isClearingRange = change.isInputEmpty;\n\n if ((change.isInputValid && hasCompleteRange) || isClearingRange) {\n onChange({ ...change, isDateRangeValid: true });\n }\n },\n },\n );\n\n return (\n <Flex gap={4} direction=\"column\">\n <MaskedDateRangeInput\n mode={filter.mode}\n ref={maskedDateRangeInputRef}\n onChange={handleInputChange}\n startDate={value?.startDate ?? null}\n endDate={value?.endDate ?? null}\n autoComplete=\"off\"\n />\n\n <DateFieldRangeCalendar\n startDate={value?.startDate ?? null}\n endDate={value?.endDate ?? null}\n onSelection={handleCalendarSelection}\n />\n </Flex>\n );\n};\n","import {\n useContext,\n useState,\n ReactNode,\n useEffect,\n KeyboardEvent,\n useCallback,\n useMemo,\n useRef,\n} from \"react\";\nimport ArrowDropDown from \"@servicetitan/hammer-icon/mdi/round/keyboard_arrow_down.svg\";\nimport Event from \"@servicetitan/hammer-icon/mdi/round/event.svg\";\nimport { DateTime } from \"luxon\";\nimport {\n CustomFilter,\n DateFilter,\n DateRangeFilter,\n Filter,\n MultiSelectFilter,\n SingleSelectFilter,\n} from \"./internal/types\";\nimport { FilterGroupContext } from \"./internal/FilterGroupContext\";\nimport {\n hasChangedFilter,\n hasFilterSelectionChanged,\n} from \"./internal/utils/filter-state\";\nimport Chip from \"../../../components/Chip\";\nimport { FilterSelect } from \"./FilterSelect\";\nimport { FilterDateSingle } from \"./FilterDateSingle\";\nimport { FilterDateRange } from \"./FilterDateRange\";\nimport { FilterItemWrapper } from \"./FilterItemWrapper\";\nimport Popover from \"../../../internal/components/Popover\";\nimport Flex from \"../../../components/Flex\";\nimport Button from \"../../../components/Button\";\n\nimport { useToolbarSize } from \"../Toolbar/internal/ToolbarContext\";\n\nimport cx from \"classnames\";\nimport styles from \"./FilterBar.module.scss\";\n\n/**\n * Props for the FilterButton component\n */\ninterface FilterButtonProps {\n /** Filter configuration object */\n filter: Filter;\n /** Optional child content for non-custom filter types */\n children?: ReactNode;\n /** Optional class name for the popover content */\n className?: string;\n}\n\n/**\n * FilterButton component provides a popover interface for filter selection.\n * Handles both controlled and uncontrolled filter updates.\n * Built into FilterGroup for single-select, multi-select, date, and date range filter rendering.\n *\n * Features:\n * - Maintains draft state for controlled filters\n * - Updates immediately for uncontrolled filters\n * - Provides Apply and Cancel actions in controlled mode\n * - Supports keyboard navigation and accessibility\n * - Renders custom, single-select, multi-select, date, and date range filter types\n * - Integrates with FilterGroup context for state management\n * - Displays appropriate icons for date-based filters\n * - Shows formatted date values in button labels\n */\nexport const FilterButton = ({\n filter,\n children,\n className,\n}: FilterButtonProps) => {\n const [isOpen, setIsOpen] = useState(false);\n const { updateFilter, controlledFiltering } = useContext(FilterGroupContext);\n const toolbarSize = useToolbarSize();\n\n // MultiSelect filters need to be initialized with an empty array\n const [draftValue, setDraftValue] = useState<unknown>(\n filter.type === \"multiSelect\" ? [] : undefined,\n );\n\n // Ref to track draftValue without causing handleChange to recreate\n const draftValueRef = useRef(draftValue);\n\n // Sync ref with state\n useEffect(() => {\n draftValueRef.current = draftValue;\n }, [draftValue]);\n\n /**\n * Returns the current value for the filter based on its type.\n * Used for resetting draft state and comparing changes.\n *\n * @returns The current filter value based on type:\n * - singleSelect: selectedItem\n * - multiSelect: selectedItems array\n * - date: date string value\n * - dateRange: { startDate, endDate } object\n * - custom: custom value\n */\n const getCurrentFilterValue = useCallback(() => {\n switch (filter.type) {\n case \"singleSelect\":\n return (filter as SingleSelectFilter<unknown>).selectedItem;\n case \"multiSelect\":\n return (filter as MultiSelectFilter<unknown>).selectedItems || [];\n case \"date\":\n case \"dateRange\":\n return filter.value;\n case \"custom\":\n return (filter as CustomFilter<unknown>).value;\n default:\n return undefined;\n }\n }, [filter]);\n\n // Track previous state to detect when to sync draft\n const prevIsOpenRef = useRef(isOpen);\n const prevFilterRef = useRef<Filter>(filter);\n\n // Initialize draft state when popover opens and sync when filter selection changes while open\n useEffect(() => {\n const justOpened = isOpen && !prevIsOpenRef.current;\n prevIsOpenRef.current = isOpen;\n\n if (isOpen) {\n // Sync draft state if:\n // 1. Popover just opened, OR\n // 2. Filter selection value changed while already open (race condition fix)\n // Don't sync when only items array changes (preserves selection during search)\n const shouldSync =\n justOpened ||\n (prevFilterRef.current &&\n hasFilterSelectionChanged(prevFilterRef.current, filter));\n\n if (shouldSync) {\n const currentValue = getCurrentFilterValue();\n setDraftValue(currentValue);\n }\n\n prevFilterRef.current = filter;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen, filter]);\n\n const handleChange = useCallback(\n (value: unknown) => {\n if (hasChangedFilter(value, draftValueRef.current)) {\n // Sync ref immediately to guard against duplicate calls from ListView re-renders\n draftValueRef.current = value;\n // Always update draft state\n setDraftValue(value);\n\n // In uncontrolled mode, update immediately for all filter types\n // For multi-select, keep popover open to allow multiple selections\n // For all other types, close popover after updating\n if (!controlledFiltering) {\n updateFilter(filter.id, value, true);\n\n if (filter.type !== \"multiSelect\") {\n setIsOpen(false);\n }\n }\n }\n },\n [filter.id, filter.type, controlledFiltering, updateFilter],\n );\n\n const handleSubmit = useCallback(() => {\n const stateValue = getCurrentFilterValue();\n\n if (hasChangedFilter(draftValue, stateValue)) {\n updateFilter(filter.id, draftValue, true);\n }\n\n setIsOpen(false);\n }, [draftValue, getCurrentFilterValue, filter.id, updateFilter]);\n\n const handleCancel = useCallback(() => {\n // In uncontrolled mode, clicking outside should finalize changes, not cancel them\n if (!controlledFiltering) {\n setIsOpen(false);\n return;\n }\n\n const originalValue = getCurrentFilterValue();\n\n setDraftValue(originalValue);\n setIsOpen(false);\n }, [controlledFiltering, getCurrentFilterValue]);\n\n /**\n * Builds the button label text based on filter type and current selection.\n * Formats labels appropriately for each filter type to show current state.\n *\n * @returns Formatted label text:\n * - singleSelect: \"Label: Selected Item\" or just \"Label\"\n * - multiSelect: \"Label\" with selection count chip\n * - date: Full date string or \"Label\"\n * - dateRange: \"Label: Start - End\" or just \"Label\"\n * - custom: \"Label: Custom Value\" or just \"Label\"\n */\n const getButtonLabel = useMemo(() => {\n switch (filter.type) {\n case \"singleSelect\": {\n const singleSelectFilter = filter as SingleSelectFilter<{\n id: string;\n label: string;\n }>;\n if (singleSelectFilter.selectedItem) {\n return `${filter.label}: ${singleSelectFilter.selectedItem.label}`;\n }\n return filter.label;\n }\n case \"multiSelect\": {\n const multiSelectFilter = filter as MultiSelectFilter<{\n id: string;\n label: string;\n }>;\n if (\n multiSelectFilter.selectedItems &&\n multiSelectFilter.selectedItems.length > 0\n ) {\n const selectionCount =\n multiSelectFilter.selectedItems.length.toString();\n return (\n <>\n {filter.label}\n <Chip\n label={selectionCount}\n color=\"#0265DC\"\n size=\"small\"\n aria-label={`${selectionCount} selected items`}\n />\n </>\n );\n }\n return filter.label;\n }\n case \"date\":\n if (filter.value) {\n const date = DateTime.fromISO(filter.value, { zone: \"local\" });\n return `${filter.label}: ${date.monthShort} ${date.day}, ${date.year}`;\n }\n return filter.label;\n case \"dateRange\":\n if (filter.value?.startDate && filter.value?.endDate) {\n const start = DateTime.fromISO(filter.value.startDate as string, {\n zone: \"local\",\n });\n const end = DateTime.fromISO(filter.value.endDate as string, {\n zone: \"local\",\n });\n\n // If the start and end dates are in the same year, we don't shiw year in start date\n const isSameYear = start.year === end.year;\n const formattedStart = isSameYear\n ? `${start.monthShort} ${start.day}`\n : `${start.monthShort} ${start.day}, ${start.year}`;\n\n return `${filter.label}: ${formattedStart} – ${end.monthShort} ${end.day}, ${end.year}`;\n }\n return filter.label;\n case \"custom\":\n if (filter.labelChipCount) {\n return (\n <>\n {filter.label}\n <Chip\n label={filter.labelChipCount.toString()}\n color=\"#0265DC\"\n size=\"small\"\n aria-label={`${filter.labelChipCount} selected items`}\n />\n </>\n );\n }\n return filter.label;\n default:\n return filter.label;\n }\n }, [filter]);\n\n /**\n * Renders the appropriate filter content based on filter type.\n * Each filter type has its own specialized component for optimal UX.\n *\n * @returns React component for the filter type:\n * - custom: Custom render function\n * - singleSelect: FilterSelect with Listbox\n * - multiSelect: FilterSelect with ListView\n * - date: FilterDateSingle with calendar\n * - dateRange: FilterDateRange with range calendar\n */\n const getContent = useMemo(() => {\n switch (filter.type) {\n case \"custom\":\n return filter.buttonRender({\n value: draftValue,\n onChange: handleChange,\n });\n case \"singleSelect\":\n return (\n <FilterSelect\n filter={filter as SingleSelectFilter<{ id: string; label: string }>}\n draftValue={draftValue as { id: string; label: string } | undefined}\n onDraftChange={handleChange}\n />\n );\n case \"multiSelect\":\n return (\n <FilterSelect\n filter={filter as MultiSelectFilter<{ id: string; label: string }>}\n draftValue={\n draftValue as { id: string; label: string }[] | undefined\n }\n onDraftChange={handleChange}\n />\n );\n case \"date\":\n return (\n <FilterDateSingle\n filter={filter as DateFilter}\n draftValue={draftValue as string | null}\n onDraftChange={handleChange}\n />\n );\n case \"dateRange\":\n return (\n <FilterDateRange\n filter={filter as DateRangeFilter}\n draftValue={\n draftValue as {\n startDate: string | null;\n endDate: string | null;\n } | null\n }\n onDraftChange={handleChange}\n />\n );\n default:\n return children;\n }\n }, [filter, draftValue, handleChange, children]);\n\n const handleOutsidePress = () => {\n if (controlledFiltering) {\n handleCancel();\n } else if (filter.type === \"multiSelect\") {\n // Multi-select uncontrolled: update already called on each selection, just close\n setIsOpen(false);\n } else {\n // Other filter types uncontrolled: submit changes on close\n handleSubmit();\n }\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n // In uncontrolled mode, Enter submits and closes for all filter types except multi-select\n // Multi-select updates on each selection, so Enter is a no-op to avoid re-submitting\n if (!controlledFiltering && filter.type !== \"multiSelect\") {\n handleSubmit();\n }\n }\n };\n\n const triggerClasses = cx(styles[\"filter-button-trigger\"], {\n [styles[\"filter-button-trigger--selected\"]]:\n (filter.type === \"custom\" && filter.value) ||\n (filter.type === \"singleSelect\" && filter.selectedItem) ||\n (filter.type === \"multiSelect\" &&\n filter.selectedItems &&\n filter.selectedItems.length > 0) ||\n (filter.type === \"date\" && filter.value) ||\n (filter.type === \"dateRange\" &&\n filter.value?.startDate &&\n filter.value?.endDate),\n });\n\n const contentClasses = cx(styles[\"filter-button-content\"], className);\n\n const iconOptions =\n filter.type === \"date\" || filter.type === \"dateRange\"\n ? { before: Event }\n : { after: ArrowDropDown };\n\n return (\n <FilterItemWrapper filter={filter}>\n <Popover\n open={isOpen}\n onClose={handleOutsidePress}\n placement=\"bottom-start\"\n modal\n noPadding={\n filter.type === \"multiSelect\" || filter.type === \"singleSelect\"\n }\n >\n <Popover.Button\n appearance=\"ghost\"\n size={toolbarSize}\n icon={iconOptions}\n data-id={filter.id}\n data-anv=\"toolbar-button\"\n className={triggerClasses}\n onClick={() => {\n setIsOpen(!isOpen);\n }}\n >\n {getButtonLabel}\n </Popover.Button>\n\n <Popover.Content onKeyDown={handleKeyDown} className={contentClasses}>\n {getContent}\n {controlledFiltering && (\n <Flex\n gap={2}\n justifyContent=\"flex-end\"\n className={styles[\"filter-button-buttons\"]}\n >\n <Popover.Close size=\"small\">Cancel</Popover.Close>\n <Button appearance=\"primary\" size=\"small\" onClick={handleSubmit}>\n Apply\n </Button>\n </Flex>\n )}\n </Popover.Content>\n </Popover>\n </FilterItemWrapper>\n );\n};\n","import * as React from \"react\";\nconst SvgTune = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: \"1em\", height: \"1em\", viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M3 18c0 .55.45 1 1 1h5v-2H4c-.55 0-1 .45-1 1zM3 6c0 .55.45 1 1 1h9V5H4c-.55 0-1 .45-1 1zm10 14v-1h7c.55 0 1-.45 1-1s-.45-1-1-1h-7v-1c0-.55-.45-1-1-1s-1 .45-1 1v4c0 .55.45 1 1 1s1-.45 1-1zM7 10v1H4c-.55 0-1 .45-1 1s.45 1 1 1h3v1c0 .55.45 1 1 1s1-.45 1-1v-4c0-.55-.45-1-1-1s-1 .45-1 1zm14 2c0-.55-.45-1-1-1h-9v2h9c.55 0 1-.45 1-1zm-5-3c.55 0 1-.45 1-1V7h3c.55 0 1-.45 1-1s-.45-1-1-1h-3V4c0-.55-.45-1-1-1s-1 .45-1 1v4c0 .55.45 1 1 1z\" }));\nexport default SvgTune;\n","import {\n useContext,\n useEffect,\n useState,\n useMemo,\n useCallback,\n useRef,\n} from \"react\";\nimport IconTune from \"@servicetitan/hammer-icon/mdi/round/tune.svg\";\nimport IconClose from \"@servicetitan/hammer-icon/mdi/round/close.svg\";\nimport Search from \"@servicetitan/hammer-icon/mdi/round/search.svg\";\nimport {\n CustomFilter,\n Filter,\n MultiSelectFilter,\n SingleSelectFilter,\n} from \"./internal/types\";\nimport { FilterGroupContext } from \"./internal/FilterGroupContext\";\nimport { Checkbox } from \"../../../components/Checkbox\";\nimport { Radio } from \"../../../components/Radio\";\nimport { Combobox } from \"../../../components/Combobox\";\nimport { Flex } from \"../../../components/Flex\";\nimport { useContainerQuery } from \"../../../internal/hooks\";\nimport {\n checkActiveFilters,\n getActiveFilters,\n resetFilters,\n updateSingleFilter,\n cloneFiltersWithItemRefs,\n hasFilterSelectionChanged,\n} from \"./internal/utils/filter-state\";\nimport { DateFieldSingle } from \"../../../components/DateFieldSingle\";\nimport { DateFieldRange } from \"../../../components/DateFieldRange\";\nimport ButtonToggle from \"../../../components/ButtonToggle\";\nimport Chip from \"../../../components/Chip\";\nimport Drawer from \"../../../components/Drawer\";\nimport Button from \"../../../components/Button\";\n\nimport { useToolbarSize } from \"../Toolbar/internal/ToolbarContext\";\n\nimport cx from \"classnames\";\nimport styles from \"./FilterBar.module.scss\";\n\n/**\n * FilterDrawer component provides a drawer interface for filter selection.\n * Always operates in controlled mode with batch updates.\n * Built into FilterGroup for mobile and overflow filter editing.\n *\n * Features:\n * - Shows all available filters in a side panel\n * - Maintains separate draft state for all filters\n * - Updates filters only when Apply is clicked\n * - Provides Clear All functionality\n * - Supports boolean, custom, single-select, multi-select, date, and date range filter types\n * - Integrates with FilterGroup context for state management\n * - Handles date and date range filters with appropriate input components\n */\nexport const FilterDrawer = () => {\n const [open, setOpen] = useState(false);\n\n // Get filter context from parent\n const {\n filters,\n updateFilter,\n onFilterChange,\n hiddenFilters,\n filterGroupRef,\n } = useContext(FilterGroupContext);\n const toolbarSize = useToolbarSize();\n\n const containerQuery = useContainerQuery(filterGroupRef);\n const showInlineFilters =\n containerQuery &&\n containerQuery.name !== \"xs\" &&\n containerQuery.name !== \"sm\";\n\n // Local draft state for filters within the drawer\n const [draftFilters, setDraftFilters] = useState<Filter[]>(filters);\n\n // Local search value state for combobox search fields\n const [searchValues, setSearchValues] = useState<Record<string, string>>({});\n\n // Count active filters based on view mode\n const activeFiltersCount = getActiveFilters(\n !showInlineFilters ? filters : hiddenFilters,\n ).length;\n\n // Track previous state to detect when to sync draft\n const prevOpenRef = useRef(open);\n const prevFiltersRef = useRef<Filter[]>(filters);\n\n /**\n * Reset draft filters when drawer opens and sync when filter selections change while open\n * Ensures drawer always shows current filter state\n */\n useEffect(() => {\n const justOpened = open && !prevOpenRef.current;\n prevOpenRef.current = open;\n\n if (open) {\n // Sync draft state if:\n // 1. Drawer just opened, OR\n // 2. Any filter selection value changed while already open (race condition fix)\n // Don't sync when only items arrays change (preserves selections during search)\n const anySelectionChanged = prevFiltersRef.current.some(\n (prevFilter, index) => {\n const newFilter = filters[index];\n return newFilter && hasFilterSelectionChanged(prevFilter, newFilter);\n },\n );\n\n const shouldSync = justOpened || anySelectionChanged;\n\n if (shouldSync) {\n setDraftFilters(cloneFiltersWithItemRefs(filters));\n }\n\n prevFiltersRef.current = filters;\n }\n }, [open, filters]);\n\n /**\n * Handles changing a draft filter value\n * Updates only the draft state, not the actual filters\n *\n * @param filterId - ID of the filter to update\n * @param value - New value for the filter\n */\n const handleDraftChange = useCallback(\n (filterId: string, value: unknown) => {\n setDraftFilters((draft) => updateSingleFilter(draft, filterId, value));\n\n // Reset search when selection is made for filters with search\n const filter = filters.find((f) => f.id === filterId);\n if (\n (filter?.type === \"singleSelect\" || filter?.type === \"multiSelect\") &&\n filter.hasSearch &&\n value\n ) {\n // Clear the search value\n setSearchValues((prev) => ({ ...prev, [filterId]: \"\" }));\n // Reset the items list\n requestAnimationFrame(() => {\n filter.onSearch?.(\"\");\n });\n }\n },\n [filters],\n );\n\n /**\n * Clears all draft filters in the drawer\n * Does not affect the actual filters until Apply is clicked\n */\n const clearDraftFilters = () => {\n setDraftFilters(resetFilters(draftFilters));\n };\n\n const hasActiveDraftFilters = checkActiveFilters(draftFilters);\n\n /**\n * Render filter form controls based on filter types\n * Delegates rendering to appropriate components based on filter type\n */\n const filterForm = useMemo(\n () =>\n draftFilters.map((draftFilter) => {\n // Find the original filter to get the render functions\n const originalFilter = filters.find((f) => f.id === draftFilter.id);\n if (!originalFilter) return null;\n\n switch (draftFilter.type) {\n case \"boolean\":\n return (\n <Checkbox\n key={draftFilter.id}\n label={draftFilter.label}\n checked={draftFilter.checked}\n onChange={(e) =>\n handleDraftChange(draftFilter.id, e?.target.checked ?? false)\n }\n />\n );\n case \"custom\": {\n const customFilter = originalFilter as CustomFilter;\n return (\n <div key={draftFilter.id}>\n {customFilter.drawerRender?.({\n value: draftFilter.value,\n onChange: (value) => handleDraftChange(draftFilter.id, value),\n })}\n </div>\n );\n }\n case \"singleSelect\": {\n const singleSelectFilter = originalFilter as SingleSelectFilter<{\n id: string;\n label: string;\n }>;\n const draftSingleSelectFilter = draftFilter as SingleSelectFilter<{\n id: string;\n label: string;\n }>;\n\n if (singleSelectFilter.simpleDrawerVariant) {\n // Simple variant: Radio group\n return (\n <div key={draftFilter.id}>\n <Radio.Group legend={singleSelectFilter.label}>\n {singleSelectFilter.items.map((item) => (\n <Radio\n key={item.id}\n name={`${singleSelectFilter.id}-radio`}\n value={item.id}\n label={item.label}\n checked={\n draftSingleSelectFilter.selectedItem?.id === item.id\n }\n onChange={(e) => {\n if (e?.target.checked) {\n const selected = singleSelectFilter.items.find(\n (opt) => opt.id === e.target.value,\n );\n handleDraftChange(draftFilter.id, selected);\n }\n }}\n />\n ))}\n </Radio.Group>\n </div>\n );\n } else {\n // Default variant: Combobox with search\n // Ensure selected item uses the reference from current items array\n const selectedItem = draftSingleSelectFilter.selectedItem\n ? (singleSelectFilter.items?.find(\n (item) =>\n item.id === draftSingleSelectFilter.selectedItem?.id,\n ) ?? null)\n : null;\n\n return (\n <Combobox\n key={draftFilter.id}\n items={singleSelectFilter.items}\n selectedItem={selectedItem}\n onChange={(\n selectedItem: { id: string; label: string } | null,\n ) => {\n handleDraftChange(draftFilter.id, selectedItem);\n }}\n itemToString={(item) => item?.label ?? \"\"}\n disableFilter={singleSelectFilter.hasSearch}\n >\n {singleSelectFilter.hasSearch ? (\n <Combobox.SearchField\n label={draftSingleSelectFilter.label}\n prefix={{ icon: { svg: Search } }}\n placeholder=\"Search...\"\n size=\"medium\"\n value={\n draftSingleSelectFilter.selectedItem?.label ||\n searchValues[draftFilter.id] ||\n \"\"\n }\n onChange={(e) => {\n const searchValue = e.target.value;\n setSearchValues((prev) => ({\n ...prev,\n [draftFilter.id]: searchValue,\n }));\n singleSelectFilter.onSearch?.(searchValue);\n }}\n onClear={() => {\n // Clear our controlled search value\n setSearchValues((prev) => ({\n ...prev,\n [draftFilter.id]: \"\",\n }));\n // Clear the selection\n handleDraftChange(draftFilter.id, undefined);\n // Reset the parent's items list\n singleSelectFilter.onSearchClear?.();\n }}\n data-anv=\"filter-drawer-combobox-search\"\n />\n ) : (\n <Combobox.SelectTrigger\n label={singleSelectFilter.label}\n placeholder=\"Select an option...\"\n size=\"medium\"\n />\n )}\n <Combobox.Content>\n {({ items }) => (\n <Combobox.List style={{ padding: 0 }}>\n {items.map((item, i) => (\n <Combobox.Item key={item.id} item={item} index={i}>\n {item.label}\n </Combobox.Item>\n ))}\n </Combobox.List>\n )}\n </Combobox.Content>\n </Combobox>\n );\n }\n }\n case \"multiSelect\": {\n const multiSelectFilter = originalFilter as MultiSelectFilter<{\n id: string;\n label: string;\n }>;\n const draftMultiSelectFilter = draftFilter as MultiSelectFilter<{\n id: string;\n label: string;\n }>;\n\n if (multiSelectFilter.simpleDrawerVariant) {\n // Simple variant: ListView\n return (\n <Checkbox.Group\n key={draftFilter.id}\n legend={multiSelectFilter.label}\n >\n {multiSelectFilter.items.map((item) => (\n <Checkbox\n key={item.id}\n label={item.label}\n checked={\n draftMultiSelectFilter.selectedItems?.some(\n (selected) => selected.id === item.id,\n ) ?? false\n }\n onChange={(e) => {\n const currentSelected =\n draftMultiSelectFilter.selectedItems || [];\n if (e?.target.checked) {\n // Add item to selection\n handleDraftChange(draftFilter.id, [\n ...currentSelected,\n item,\n ]);\n } else {\n // Remove item from selection\n handleDraftChange(\n draftFilter.id,\n currentSelected.filter(\n (selected) => selected.id !== item.id,\n ),\n );\n }\n }}\n />\n ))}\n </Checkbox.Group>\n );\n } else {\n // Default variant: Combobox with multiple selection\n const hasActiveSearch =\n searchValues[draftFilter.id] &&\n searchValues[draftFilter.id].length > 0;\n\n return (\n <Combobox\n key={draftFilter.id}\n items={multiSelectFilter.items}\n selectedItems={draftMultiSelectFilter.selectedItems || []}\n onChange={(\n selectedItems: { id: string; label: string }[] | null,\n ) => handleDraftChange(draftFilter.id, selectedItems)}\n itemToString={(item) => item?.label ?? \"\"}\n itemToKey={(item) => item?.id ?? \"\"}\n disableFilter={multiSelectFilter.hasSearch}\n multiple\n disableCloseOnSelectItem={!hasActiveSearch}\n >\n {multiSelectFilter.hasSearch ? (\n <Combobox.SearchField\n label={multiSelectFilter.label}\n prefix={{ icon: { svg: Search } }}\n placeholder=\"Search...\"\n size=\"medium\"\n value={searchValues[draftFilter.id] || \"\"}\n onChange={(e) => {\n const searchValue = e.target.value;\n setSearchValues((prev) => ({\n ...prev,\n [draftFilter.id]: searchValue,\n }));\n multiSelectFilter.onSearch?.(searchValue);\n }}\n onClear={() => {\n // Clear our controlled search value\n setSearchValues((prev) => ({\n ...prev,\n [draftFilter.id]: \"\",\n }));\n handleDraftChange(draftFilter.id, []);\n multiSelectFilter.onSearchClear?.();\n }}\n data-anv=\"filter-drawer-combobox-search\"\n />\n ) : (\n <Combobox.SelectTrigger\n label={multiSelectFilter.label}\n placeholder=\"Select options...\"\n size=\"medium\"\n />\n )}\n <Combobox.Content>\n {({ items }) => (\n <Combobox.List style={{ padding: 0 }}>\n {items.map((item, i) => (\n <Combobox.Item key={item.id} item={item} index={i}>\n {item.label}\n </Combobox.Item>\n ))}\n </Combobox.List>\n )}\n </Combobox.Content>\n </Combobox>\n );\n }\n }\n case \"date\": {\n return (\n <DateFieldSingle\n key={draftFilter.id}\n label={draftFilter.label}\n value={draftFilter.value as string | null}\n onChange={(change) => {\n handleDraftChange(draftFilter.id, change.date);\n }}\n mode={draftFilter.mode}\n />\n );\n }\n case \"dateRange\": {\n return (\n <DateFieldRange\n key={draftFilter.id}\n label={draftFilter.label}\n value={\n draftFilter.value as {\n startDate: string | null;\n endDate: string | null;\n } | null\n }\n onChange={(change) => {\n handleDraftChange(draftFilter.id, {\n startDate: change.startDate,\n endDate: change.endDate,\n });\n }}\n mode={draftFilter.mode}\n />\n );\n }\n default:\n return null;\n }\n }),\n [draftFilters, filters, searchValues, handleDraftChange],\n );\n\n /**\n * Applies all draft filter changes to the actual filters\n * Updates filters individually then triggers batch update\n */\n const applyFiltering = () => {\n // Update all filters with their current draft values\n draftFilters.forEach((draftFilter) => {\n switch (draftFilter.type) {\n case \"boolean\":\n updateFilter(draftFilter.id, draftFilter.checked, false);\n break;\n case \"singleSelect\":\n updateFilter(\n draftFilter.id,\n (draftFilter as SingleSelectFilter).selectedItem,\n false,\n );\n break;\n case \"multiSelect\":\n updateFilter(\n draftFilter.id,\n (draftFilter as MultiSelectFilter).selectedItems,\n false,\n );\n break;\n case \"date\":\n case \"dateRange\":\n case \"custom\":\n updateFilter(draftFilter.id, draftFilter.value, false);\n break;\n }\n });\n\n // Submit all filters at once after updates\n onFilterChange?.(draftFilters);\n setOpen(false);\n };\n\n const handleCancel = () => {\n setOpen(false);\n };\n\n const hasHiddenActiveFilters = activeFiltersCount > 0;\n\n const triggerClasses = cx(\n styles[\"filter-button-trigger\"],\n styles[\"filter-drawer-trigger\"],\n {\n [styles[\"filter-drawer-trigger--chipped\"]]: hasHiddenActiveFilters,\n },\n );\n\n return (\n <>\n <ButtonToggle\n data-anv=\"filter-group-drawer-trigger\"\n icon={{ before: IconTune }}\n onClick={() => setOpen(true)}\n className={triggerClasses}\n checked={open}\n size={toolbarSize}\n >\n Filters\n {hasHiddenActiveFilters && (\n <Chip\n size=\"small\"\n color=\"#0265DC\"\n label={activeFiltersCount.toString()}\n />\n )}\n </ButtonToggle>\n\n <Drawer\n data-anv=\"filter-group-drawer\"\n data-testid=\"filter-group-drawer\"\n open={open}\n onClose={() => setOpen(false)}\n >\n <Drawer.Content>\n <Flex direction=\"column\" gap={6} grow={1}>\n {filterForm}\n </Flex>\n </Drawer.Content>\n\n <Drawer.Footer>\n <Flex\n justifyContent={\n hasActiveDraftFilters ? \"space-between\" : \"flex-end\"\n }\n grow={1}\n >\n {hasActiveDraftFilters && (\n <Button\n appearance=\"ghost\"\n icon={{ before: IconClose }}\n onClick={clearDraftFilters}\n >\n Clear All Filters\n </Button>\n )}\n\n <Flex gap=\"3\">\n <Button onClick={handleCancel}>Cancel</Button>\n <Button appearance=\"primary\" onClick={applyFiltering}>\n Apply\n </Button>\n </Flex>\n </Flex>\n </Drawer.Footer>\n </Drawer>\n </>\n );\n};\n","import {\n ComponentPropsWithoutRef,\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n useCallback,\n} from \"react\";\nimport { useMergeRefs } from \"../../../hooks\";\nimport CloseIcon from \"@servicetitan/hammer-icon/mdi/round/close.svg\";\nimport { Filter } from \"./internal/types\";\nimport { FilterItemWrapper } from \"./FilterItemWrapper\";\nimport Button from \"../../../components/Button\";\nimport { LayoutUtilProps } from \"../../../types\";\nimport { useContainerQuery, useLayoutPropsUtil } from \"../../../internal/hooks\";\nimport {\n checkActiveFilters,\n resetFilters,\n updateSingleFilter,\n hasFilterSelectionChanged,\n preserveFilterState,\n} from \"./internal/utils/filter-state\";\nimport { FilterToggleButton } from \"./FilterToggleButton\";\nimport { FilterButton } from \"./FilterButton\";\nimport { FilterGroupContext } from \"./internal/FilterGroupContext\";\nimport { FilterDrawer } from \"./FilterDrawer\";\nimport { ToolbarContext } from \"../Toolbar/internal/ToolbarContext\";\nimport { ToolbarOverflowTypes, ToolbarSize } from \"../Toolbar/types\";\nimport {\n handleToolbarKeyDown,\n updateToolbarItemsTabIndex,\n} from \"../Toolbar/internal/utils/accessibility\";\nimport { Flex } from \"../../../components/Flex\";\n\nimport styles from \"./FilterBar.module.scss\";\n\n/**\n * Props for the FilterBar component\n *\n * @extends ComponentPropsWithoutRef<\"div\">\n * @extends LayoutUtilProps\n */\nexport type FilterBarProps = ComponentPropsWithoutRef<\"div\"> &\n LayoutUtilProps & {\n /** Array of filter objects */\n filters: Filter[];\n /** Description of the content this filter bar is associated with, used for accessibility */\n associatedContent: string;\n /** Callback function when filters change */\n onFilterChange: (filters: Filter[]) => void;\n /** Whether the filters submission is controlled via an apply button */\n controlledFiltering?: boolean;\n /**\n * Size of filter controls\n * @default xsmall\n */\n size?: ToolbarSize;\n /**\n * How to handle overflow when items don't fit\n * @default wrap\n */\n overflow?: ToolbarOverflowTypes;\n };\n\n/**\n * FilterBar component for displaying a standalone group of filters with toggles and a clear button.\n *\n * Features:\n * - Standalone component with `role=\"toolbar\"` and keyboard navigation\n * - Renders filter toggles and popovers for all filter types\n * - Supports controlled and uncontrolled filtering\n * - Integrates with FilterDrawer for batch filter editing\n * - Provides a clear all filters button\n * - Handles overflow and hidden filters\n * - Shares filter state via context for child components\n * - Supports boolean, custom, single-select, multi-select, date, and date range filter types\n * - Preserves filter state when filter configuration changes\n * - Responsive: condenses to drawer-only at small container sizes\n * - Can be composed alongside Toolbar as a sibling using Flex layout\n *\n * @example\n * <FilterBar\n * associatedContent=\"invoices\"\n * filters={filters}\n * onFilterChange={handleFilter}\n * controlledFiltering={true}\n * />\n *\n * @example\n * // With Toolbar as sibling\n * <Flex alignItems=\"center\" justifyContent=\"space-between\">\n * <Toolbar associatedContent=\"invoice actions\">\n * <Toolbar.Button icon={SaveIcon} aria-label=\"Save\" />\n * </Toolbar>\n * <FilterBar\n * associatedContent=\"invoices\"\n * filters={filters}\n * onFilterChange={handleFilter}\n * />\n * </Flex>\n */\nexport const FilterBar = forwardRef<HTMLDivElement, FilterBarProps>(\n function FilterBarInner(props, ref) {\n const { layoutStyles, componentProps } = useLayoutPropsUtil(props);\n const {\n filters: initialFilters,\n onFilterChange,\n controlledFiltering = false,\n associatedContent,\n size = \"xsmall\",\n overflow = \"wrap\",\n className,\n style,\n onKeyDown,\n ...rest\n } = componentProps;\n\n const [filters, setFilters] = useState<Filter[]>(initialFilters);\n const [hiddenFilters, setHiddenFilters] = useState<Filter[]>([]);\n const filterBarRef = useRef<HTMLDivElement>(null);\n const containerQuery = useContainerQuery(filterBarRef);\n\n const showInlineFilters =\n containerQuery &&\n containerQuery.name !== \"xs\" &&\n containerQuery.name !== \"sm\";\n\n // Update filters when props change\n useEffect(() => {\n setFilters((prevFilters) => {\n const existingFiltersMap = new Map(prevFilters.map((f) => [f.id, f]));\n\n return initialFilters.map((newFilter: Filter) => {\n const existingFilter = existingFiltersMap.get(newFilter.id);\n\n if (!existingFilter) {\n return newFilter;\n }\n\n if (!hasFilterSelectionChanged(existingFilter, newFilter)) {\n return preserveFilterState(newFilter, existingFilter);\n }\n\n return newFilter;\n });\n });\n }, [initialFilters]);\n\n /**\n * Updates filter state when a filter is changed\n *\n * @param filterId - ID of the filter to update\n * @param value - New value for the filter\n * @param submit - Whether to submit the filter change\n */\n const updateFilter = useCallback(\n (filterId: string, value: unknown, submit: boolean) => {\n setFilters((prevFilters) => {\n const updatedFilters = updateSingleFilter(\n prevFilters,\n filterId,\n value,\n );\n\n if (submit) {\n onFilterChange?.(updatedFilters);\n }\n\n return updatedFilters;\n });\n },\n [onFilterChange],\n );\n\n /**\n * Adds a filter to the list of hidden filters.\n *\n * @param filter - The filter to add to the hidden filters array\n */\n const addHiddenFilter = useCallback((filter: Filter) => {\n setHiddenFilters((prev) => [...prev, filter]);\n }, []);\n\n /**\n * Removes a filter from the list of hidden filters.\n *\n * @param filter - The filter to remove from the hidden filters array\n */\n const removeHiddenFilter = useCallback((filter: Filter) => {\n setHiddenFilters((prev) => prev.filter((f) => f.id !== filter.id));\n }, []);\n\n /**\n * Clears all active filters\n */\n const clearAllFilters = () => {\n const resetAllFilters = resetFilters(filters);\n setFilters(resetAllFilters);\n onFilterChange?.(resetAllFilters);\n\n requestAnimationFrame(() => {\n if (filterBarRef.current) {\n const firstFocusable = filterBarRef.current.querySelector(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n ) as HTMLElement;\n\n if (firstFocusable) {\n firstFocusable.focus();\n }\n }\n });\n };\n\n const hasActiveFilters = checkActiveFilters(filters);\n\n const filterGroupControls = filters.map((filter) => {\n switch (filter.type) {\n case \"boolean\":\n return (\n <FilterToggleButton\n key={filter.id}\n id={filter.id}\n checked={filter.checked}\n onClick={() => {\n updateFilter(filter.id, !filter.checked, true);\n }}\n >\n {filter.label}\n </FilterToggleButton>\n );\n case \"singleSelect\":\n case \"multiSelect\":\n return (\n <FilterButton\n key={filter.id}\n filter={filter}\n className={styles[\"filter-select-content\"]}\n />\n );\n case \"custom\":\n case \"date\":\n case \"dateRange\":\n return <FilterButton key={filter.id} filter={filter} />;\n default:\n return null;\n }\n });\n\n // Provide ToolbarContext so filter sub-components (FilterButton, FilterDrawer,\n // FilterToggleButton, FilterItemWrapper) read size/overflow from FilterBar\n const toolbarContextValue = useMemo(\n () => ({\n overflowItems: [],\n addItem: () => {},\n removeItem: () => {},\n toolbarRef: filterBarRef,\n overflow,\n size,\n }),\n [overflow, size],\n );\n\n const filterGroupContextValue = useMemo(\n () => ({\n filterGroupRef: filterBarRef,\n filters,\n updateFilter,\n onFilterChange,\n controlledFiltering,\n associatedContent,\n hiddenFilters,\n addHiddenFilter,\n removeHiddenFilter,\n }),\n [\n filterBarRef,\n filters,\n updateFilter,\n onFilterChange,\n controlledFiltering,\n associatedContent,\n hiddenFilters,\n addHiddenFilter,\n removeHiddenFilter,\n ],\n );\n\n // Initialize tabindex values for keyboard navigation\n useEffect(() => {\n if (filterBarRef.current) {\n updateToolbarItemsTabIndex(filterBarRef.current);\n }\n }, [filters]);\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (filterBarRef.current) {\n handleToolbarKeyDown(event, filterBarRef.current);\n }\n onKeyDown?.(event);\n },\n [onKeyDown],\n );\n\n const styleCombined = {\n ...style,\n ...layoutStyles,\n };\n\n return (\n <ToolbarContext.Provider value={toolbarContextValue}>\n <FilterGroupContext.Provider value={filterGroupContextValue}>\n <Flex\n ref={useMergeRefs([filterBarRef, ref])}\n role=\"toolbar\"\n aria-label={`Filters for ${associatedContent}. Use arrow keys to navigate through filter controls.`}\n aria-orientation=\"horizontal\"\n onKeyDown={handleKeyDown}\n alignItems=\"center\"\n gap={1}\n wrap={overflow === \"collapse\" ? \"nowrap\" : \"wrap\"}\n className={className}\n style={styleCombined}\n data-anv=\"filter-bar\"\n {...rest}\n >\n <Flex\n alignItems=\"center\"\n gap={1}\n wrap={overflow === \"collapse\" ? \"nowrap\" : \"wrap\"}\n grow={1}\n data-anv=\"toolbar-content\"\n >\n {showInlineFilters && filterGroupControls}\n <FilterDrawer />\n\n {showInlineFilters && hasActiveFilters && (\n <FilterItemWrapper>\n <Button\n appearance=\"ghost\"\n size={size}\n className={styles[\"filter-button-trigger\"]}\n icon={{\n before: CloseIcon,\n }}\n onClick={clearAllFilters}\n >\n Clear Filters\n </Button>\n </FilterItemWrapper>\n )}\n </Flex>\n </Flex>\n </FilterGroupContext.Provider>\n </ToolbarContext.Provider>\n );\n },\n);\n\nFilterBar.displayName = \"FilterBar\";\n"],"names":["core.primitive?.BreakpointSm","core.primitive?.BreakpointMd","core.primitive?.BreakpointLg","core.primitive?.BreakpointXl","core.primitive?.BreakpointXxl","Event","ArrowDropDown","selectedItem","Search","IconTune","IconClose","CloseIcon"],"mappings":"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"}
package/dist/FilterBar.js CHANGED
@@ -1,2 +1,2 @@
1
- export { F as FilterBar, F as default } from './FilterBar-BUfajdQU.js';
1
+ export { F as FilterBar, F as default } from './FilterBar-GjMlLOME.js';
2
2
  //# sourceMappingURL=FilterBar.js.map
@@ -1,2 +1,2 @@
1
- export { M as MultiSelectField, a as MultiSelectFieldSync } from './MultiSelectFieldSync-DXIBQABc.js';
1
+ export { M as MultiSelectField, a as MultiSelectFieldSync } from './MultiSelectFieldSync-BxyQiVPQ.js';
2
2
  //# sourceMappingURL=MultiSelectField.js.map
@@ -1,7 +1,7 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { useRef, useState, useLayoutEffect, useMemo, useEffect, forwardRef, useId, useCallback } from 'react';
3
3
  import { w as warnDeprecatedErrorUsage } from './utils-CM48ODEJ.js';
4
- import { u as useToggleSelection, M as MultiSelectOptions } from './useToggleSelection-VwlBkdZo.js';
4
+ import { u as useToggleSelection, M as MultiSelectOptions } from './useToggleSelection-DBqr4HwT.js';
5
5
  import { c as cx } from './index-De1g9FRV.js';
6
6
  import { B as Button } from './Button-C_V2xQAs.js';
7
7
  import { C as Chip } from './Chip-0-Yx9SGX.js';
@@ -10,39 +10,39 @@ import { m as mergeRefs, u as useMergeRefs } from './useMergeRefs-Dfmtq9cI.js';
10
10
  import { S as SvgChevronRight } from './chevron_right-BdpsxX7x.js';
11
11
  import { S as SvgClose } from './close-DZj38AEh.js';
12
12
  import { S as SelectFieldLabel } from './SelectFieldLabel-Db9w6O6r.js';
13
- import { s as styles$1 } from './SelectTriggerBase.module-CCLOnHm1.js';
13
+ import { s as styles$1 } from './SelectTriggerBase.module-BgZSNZfE.js';
14
14
  import { u as useDownshiftEnvironment, a as useCombobox, b as useSelect } from './downshift.esm-xtSnQp44.js';
15
- import { b as useProcessedOptions, c as buildSelectItems, d as useDebouncedCallback, e as OptionsDialog, f as OptionsPopover, a as useSelectOrchestration, g as defaultSyncFilter, t as toSyncFilterFn } from './syncFilterUtils-hlw11Ud8.js';
15
+ import { b as useProcessedOptions, c as buildSelectItems, d as useDebouncedCallback, e as OptionsDialog, f as OptionsPopover, A as AddNewItemButton, a as useSelectOrchestration, g as defaultSyncFilter, t as toSyncFilterFn } from './syncFilterUtils-Dpp7gt05.js';
16
16
  import { F as FieldMessage } from './FieldMessage-mTGdycSA.js';
17
17
  import { u as useLayoutPropsUtil } from './useLayoutPropsUtil-CB_zHDbW.js';
18
18
  import { w as warnOnce } from './warnOnce-Y9PRHcU4.js';
19
19
 
20
- import './MultiSelectFieldSync.css';const input = "_input_15cqx_26";
21
- const error = "_error_15cqx_54";
22
- const disabled = "_disabled_15cqx_61";
23
- const chip = "_chip_15cqx_130";
24
- const prefix = "_prefix_15cqx_220";
25
- const suffix = "_suffix_15cqx_221";
26
- const small = "_small_15cqx_296";
27
- const large = "_large_15cqx_302";
20
+ import './MultiSelectFieldSync.css';const input = "_input_s6lf7_26";
21
+ const error = "_error_s6lf7_54";
22
+ const disabled = "_disabled_s6lf7_61";
23
+ const chip = "_chip_s6lf7_132";
24
+ const prefix = "_prefix_s6lf7_222";
25
+ const suffix = "_suffix_s6lf7_223";
26
+ const small = "_small_s6lf7_298";
27
+ const large = "_large_s6lf7_304";
28
28
  const styles = {
29
- "input-wrapper": "_input-wrapper_15cqx_26",
29
+ "input-wrapper": "_input-wrapper_s6lf7_26",
30
30
  input: input,
31
31
  error: error,
32
32
  disabled: disabled,
33
- "input-flex": "_input-flex_15cqx_71",
34
- "rows-wrapper": "_rows-wrapper_15cqx_119",
35
- "chip-wrapper": "_chip-wrapper_15cqx_130",
33
+ "input-flex": "_input-flex_s6lf7_71",
34
+ "rows-wrapper": "_rows-wrapper_s6lf7_121",
35
+ "chip-wrapper": "_chip-wrapper_s6lf7_132",
36
36
  chip: chip,
37
- "buttons-wrapper": "_buttons-wrapper_15cqx_142",
38
- "close-button-wrapper": "_close-button-wrapper_15cqx_159",
39
- "close-button": "_close-button_15cqx_159",
40
- "toggle-button-wrapper": "_toggle-button-wrapper_15cqx_182",
41
- "toggle-button": "_toggle-button_15cqx_182",
37
+ "buttons-wrapper": "_buttons-wrapper_s6lf7_144",
38
+ "close-button-wrapper": "_close-button-wrapper_s6lf7_161",
39
+ "close-button": "_close-button_s6lf7_161",
40
+ "toggle-button-wrapper": "_toggle-button-wrapper_s6lf7_184",
41
+ "toggle-button": "_toggle-button_s6lf7_184",
42
42
  prefix: prefix,
43
43
  suffix: suffix,
44
- "no-clear-button": "_no-clear-button_15cqx_288",
45
- "no-toggle-button": "_no-toggle-button_15cqx_292",
44
+ "no-clear-button": "_no-clear-button_s6lf7_290",
45
+ "no-toggle-button": "_no-toggle-button_s6lf7_294",
46
46
  small: small,
47
47
  large: large};
48
48
 
@@ -522,6 +522,8 @@ const MultiSelectFieldComboboxMode = ({
522
522
  maxChips,
523
523
  getChipProps,
524
524
  onSearchChange,
525
+ addItemLabel,
526
+ onAddNewItem,
525
527
  handleRemoveOption,
526
528
  handleClear
527
529
  }) => {
@@ -580,6 +582,15 @@ const MultiSelectFieldComboboxMode = ({
580
582
  const handleLoadMore = async () => {
581
583
  await loadMore(inputValue);
582
584
  };
585
+ const addNewItemButton = onAddNewItem ? /* @__PURE__ */ jsx(
586
+ AddNewItemButton,
587
+ {
588
+ searchText: inputValue,
589
+ addItemLabel,
590
+ onAddNewItem,
591
+ onCloseMenu: closeMenu
592
+ }
593
+ ) : null;
583
594
  if (displayAs === "dialog") {
584
595
  return /* @__PURE__ */ jsxs(
585
596
  "div",
@@ -670,6 +681,7 @@ const MultiSelectFieldComboboxMode = ({
670
681
  getChipProps
671
682
  }
672
683
  ),
684
+ footer: addNewItemButton ?? void 0,
673
685
  children: /* @__PURE__ */ jsx(
674
686
  MultiSelectOptions,
675
687
  {
@@ -758,8 +770,9 @@ const MultiSelectFieldComboboxMode = ({
758
770
  id: `${id}-popover`,
759
771
  referenceElement: inputWrapperRef,
760
772
  open: isOpen && displayAs === "popover",
761
- onClickOutside: closeMenu,
773
+ onClose: closeMenu,
762
774
  width: "reference",
775
+ footer: addNewItemButton ?? void 0,
763
776
  children: /* @__PURE__ */ jsx(
764
777
  MultiSelectOptions,
765
778
  {
@@ -1101,6 +1114,8 @@ const MultiSelectFieldSelectMode = ({
1101
1114
  singleRow,
1102
1115
  maxChips,
1103
1116
  getChipProps,
1117
+ addItemLabel,
1118
+ onAddNewItem,
1104
1119
  handleRemoveOption,
1105
1120
  handleClear
1106
1121
  }) => {
@@ -1147,6 +1162,15 @@ const MultiSelectFieldSelectMode = ({
1147
1162
  const handleLoadMore = async () => {
1148
1163
  await loadMore("");
1149
1164
  };
1165
+ const addNewItemButton = onAddNewItem ? /* @__PURE__ */ jsx(
1166
+ AddNewItemButton,
1167
+ {
1168
+ searchText: "",
1169
+ addItemLabel,
1170
+ onAddNewItem,
1171
+ onCloseMenu: closeMenu
1172
+ }
1173
+ ) : null;
1150
1174
  const toggleButtonProps = getToggleButtonProps({
1151
1175
  disabled: !!disabled,
1152
1176
  "aria-required": required ? true : void 0,
@@ -1212,6 +1236,7 @@ const MultiSelectFieldSelectMode = ({
1212
1236
  isOpen,
1213
1237
  onClose: closeMenu,
1214
1238
  title: label,
1239
+ footer: addNewItemButton ?? void 0,
1215
1240
  children: /* @__PURE__ */ jsx(
1216
1241
  MultiSelectOptions,
1217
1242
  {
@@ -1300,8 +1325,9 @@ const MultiSelectFieldSelectMode = ({
1300
1325
  id: `${id}-popover`,
1301
1326
  referenceElement: inputWrapperRef,
1302
1327
  open: isOpen && displayAs === "popover",
1303
- onClickOutside: closeMenu,
1328
+ onClose: closeMenu,
1304
1329
  width: "reference",
1330
+ footer: addNewItemButton ?? void 0,
1305
1331
  children: /* @__PURE__ */ jsx(
1306
1332
  MultiSelectOptions,
1307
1333
  {
@@ -1366,7 +1392,9 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
1366
1392
  style,
1367
1393
  virtualize,
1368
1394
  disableSearch,
1369
- getChipProps
1395
+ getChipProps,
1396
+ addItemLabel,
1397
+ onAddNewItem
1370
1398
  } = componentProps;
1371
1399
  const groupToString = "groupToString" in componentProps ? componentProps.groupToString : void 0;
1372
1400
  const groupSorter = "groupSorter" in componentProps ? componentProps.groupSorter : void 0;
@@ -1475,6 +1503,8 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
1475
1503
  singleRow,
1476
1504
  maxChips,
1477
1505
  getChipProps,
1506
+ addItemLabel,
1507
+ onAddNewItem,
1478
1508
  handleRemoveOption,
1479
1509
  handleClear
1480
1510
  };
@@ -1582,4 +1612,4 @@ const MultiSelectFieldSync = (props) => {
1582
1612
  };
1583
1613
 
1584
1614
  export { MultiSelectField as M, MultiSelectFieldSync as a };
1585
- //# sourceMappingURL=MultiSelectFieldSync-DXIBQABc.js.map
1615
+ //# sourceMappingURL=MultiSelectFieldSync-BxyQiVPQ.js.map