@servicetitan/anvil2 3.0.5 → 3.0.6

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 (210) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/{AiMark-DjOf60tj.js → AiMark-BXL0sWIV.js} +2 -2
  3. package/dist/{AiMark-DjOf60tj.js.map → AiMark-BXL0sWIV.js.map} +1 -1
  4. package/dist/AiMark.js +1 -1
  5. package/dist/{Alert-BTesdKK7.js → Alert-BNH0UD2s.js} +2 -2
  6. package/dist/{Alert-BTesdKK7.js.map → Alert-BNH0UD2s.js.map} +1 -1
  7. package/dist/Alert.js +1 -1
  8. package/dist/{Breadcrumbs-DTi5RqT-.js → Breadcrumbs-Bzxbdu-S.js} +2 -2
  9. package/dist/{Breadcrumbs-DTi5RqT-.js.map → Breadcrumbs-Bzxbdu-S.js.map} +1 -1
  10. package/dist/Breadcrumbs.js +1 -1
  11. package/dist/{Calendar-ddGQKSGU.js → Calendar-BYNFAWpZ.js} +2 -2
  12. package/dist/{Calendar-ddGQKSGU.js.map → Calendar-BYNFAWpZ.js.map} +1 -1
  13. package/dist/{Calendar-CpCRxcue.js → Calendar-DS5eWpGF.js} +2 -2
  14. package/dist/{Calendar-CpCRxcue.js.map → Calendar-DS5eWpGF.js.map} +1 -1
  15. package/dist/Calendar.js +2 -2
  16. package/dist/{Checkbox-CJ8eYejR.js → Checkbox-BB3BDJsK.js} +4 -4
  17. package/dist/{Checkbox-CJ8eYejR.js.map → Checkbox-BB3BDJsK.js.map} +1 -1
  18. package/dist/{Checkbox-CVidv1sO.js → Checkbox-BeIzx_ZX.js} +2 -2
  19. package/dist/{Checkbox-CVidv1sO.js.map → Checkbox-BeIzx_ZX.js.map} +1 -1
  20. package/dist/Checkbox.css +40 -37
  21. package/dist/Checkbox.js +1 -1
  22. package/dist/Checkbox.module-CURNX27M.js +28 -0
  23. package/dist/Checkbox.module-CURNX27M.js.map +1 -0
  24. package/dist/{Chip-0-Yx9SGX.js → Chip-D2k5X_wX.js} +2 -2
  25. package/dist/{Chip-0-Yx9SGX.js.map → Chip-D2k5X_wX.js.map} +1 -1
  26. package/dist/Chip.js +1 -1
  27. package/dist/{Combobox-BXQFOwX4.js → Combobox-Cp7M4-4r.js} +5 -5
  28. package/dist/{Combobox-BXQFOwX4.js.map → Combobox-Cp7M4-4r.js.map} +1 -1
  29. package/dist/Combobox.js +1 -1
  30. package/dist/{DataTable-BFzj8cZG.js → DataTable-0kOuVgSB.js} +8 -8
  31. package/dist/{DataTable-BFzj8cZG.js.map → DataTable-0kOuVgSB.js.map} +1 -1
  32. package/dist/{DateFieldRange-CO2C776E.js → DateFieldRange-Be_I9GTp.js} +4 -4
  33. package/dist/{DateFieldRange-CO2C776E.js.map → DateFieldRange-Be_I9GTp.js.map} +1 -1
  34. package/dist/DateFieldRange.js +1 -1
  35. package/dist/{DateFieldSingle-DjmHpn1y.js → DateFieldSingle-CsrsY9i8.js} +4 -4
  36. package/dist/{DateFieldSingle-DjmHpn1y.js.map → DateFieldSingle-CsrsY9i8.js.map} +1 -1
  37. package/dist/DateFieldSingle.js +1 -1
  38. package/dist/{DateFieldYearless-CCJAopYd.js → DateFieldYearless-m_Hl2gMY.js} +5 -5
  39. package/dist/{DateFieldYearless-CCJAopYd.js.map → DateFieldYearless-m_Hl2gMY.js.map} +1 -1
  40. package/dist/DateFieldYearless.js +1 -1
  41. package/dist/{DateFieldYearlessRange-BUv1mGJg.js → DateFieldYearlessRange-DNqSTBDr.js} +4 -4
  42. package/dist/{DateFieldYearlessRange-BUv1mGJg.js.map → DateFieldYearlessRange-DNqSTBDr.js.map} +1 -1
  43. package/dist/DateFieldYearlessRange.js +1 -1
  44. package/dist/{DaysOfTheWeek-BihTU2No.js → DaysOfTheWeek-D58z_eF3.js} +10 -9
  45. package/dist/{DaysOfTheWeek-BihTU2No.js.map → DaysOfTheWeek-D58z_eF3.js.map} +1 -1
  46. package/dist/DaysOfTheWeek.css +10 -6
  47. package/dist/DaysOfTheWeek.js +1 -1
  48. package/dist/{Dialog-BZTo4hbX.js → Dialog-CD-SDfPT.js} +22 -20
  49. package/dist/{Dialog-BZTo4hbX.js.map → Dialog-CD-SDfPT.js.map} +1 -1
  50. package/dist/Dialog.css +43 -29
  51. package/dist/Dialog.js +1 -1
  52. package/dist/{Drawer-Dg35inxH.js → Drawer-s2y0xcgV.js} +3 -3
  53. package/dist/{Drawer-Dg35inxH.js.map → Drawer-s2y0xcgV.js.map} +1 -1
  54. package/dist/Drawer.js +1 -1
  55. package/dist/DrillDown.js +1 -1
  56. package/dist/{EditCard-BfNq-T8n.js → EditCard-B25pj0Jx.js} +2 -2
  57. package/dist/{EditCard-BfNq-T8n.js.map → EditCard-B25pj0Jx.js.map} +1 -1
  58. package/dist/EditCard.js +1 -1
  59. package/dist/{FieldLabel-xV6EdVwo.js → FieldLabel-D1qPAGtB.js} +3 -3
  60. package/dist/{FieldLabel-xV6EdVwo.js.map → FieldLabel-D1qPAGtB.js.map} +1 -1
  61. package/dist/FieldLabel.js +1 -1
  62. package/dist/{FilterBar-GjMlLOME.js → FilterBar-yysyZ-t1.js} +374 -19
  63. package/dist/FilterBar-yysyZ-t1.js.map +1 -0
  64. package/dist/FilterBar.js +1 -1
  65. package/dist/{InputMask-8rI6UIb8.js → InputMask-BDl09V4u.js} +3 -3
  66. package/dist/{InputMask-8rI6UIb8.js.map → InputMask-BDl09V4u.js.map} +1 -1
  67. package/dist/InputMask.js +1 -1
  68. package/dist/{ListView-CIa981KJ.js → ListView-CcRRh1ap.js} +2 -2
  69. package/dist/{ListView-CIa981KJ.js.map → ListView-CcRRh1ap.js.map} +1 -1
  70. package/dist/ListView.js +1 -1
  71. package/dist/{Listbox-DRznPBCr.js → Listbox-CvQHBFWb.js} +2 -2
  72. package/dist/{Listbox-DRznPBCr.js.map → Listbox-CvQHBFWb.js.map} +1 -1
  73. package/dist/Listbox.js +1 -1
  74. package/dist/MultiSelectField.js +1 -1
  75. package/dist/{MultiSelectFieldSync-BxyQiVPQ.js → MultiSelectFieldSync-BMVROOjy.js} +25 -25
  76. package/dist/{MultiSelectFieldSync-BxyQiVPQ.js.map → MultiSelectFieldSync-BMVROOjy.js.map} +1 -1
  77. package/dist/MultiSelectFieldSync.css +61 -57
  78. package/dist/MultiSelectMenu.js +1 -1
  79. package/dist/{MultiSelectMenuSync-BJfvZGf3.js → MultiSelectMenuSync-BNPp_2Bm.js} +4 -4
  80. package/dist/{MultiSelectMenuSync-BJfvZGf3.js.map → MultiSelectMenuSync-BNPp_2Bm.js.map} +1 -1
  81. package/dist/{NumberField-D7YYo4Rl.js → NumberField-BymFZhIJ.js} +4 -4
  82. package/dist/{NumberField-D7YYo4Rl.js.map → NumberField-BymFZhIJ.js.map} +1 -1
  83. package/dist/NumberField.js +1 -1
  84. package/dist/{Page-cELP59Hm.js → Page-SBy27-Wv.js} +8 -8
  85. package/dist/{Page-cELP59Hm.js.map → Page-SBy27-Wv.js.map} +1 -1
  86. package/dist/Page.js +1 -1
  87. package/dist/{Pagination-DTN4FovY.js → Pagination-Cm8-K6VH.js} +2 -2
  88. package/dist/{Pagination-DTN4FovY.js.map → Pagination-Cm8-K6VH.js.map} +1 -1
  89. package/dist/Pagination.js +1 -1
  90. package/dist/{Popover-B3Vw4lDW.js → Popover-8mTJoMy7.js} +2 -2
  91. package/dist/{Popover-B3Vw4lDW.js.map → Popover-8mTJoMy7.js.map} +1 -1
  92. package/dist/Popover.js +1 -1
  93. package/dist/{ProgressBar-kzCNhaCO.js → ProgressBar-C1CkQHV5.js} +2 -2
  94. package/dist/{ProgressBar-kzCNhaCO.js.map → ProgressBar-C1CkQHV5.js.map} +1 -1
  95. package/dist/ProgressBar.js +1 -1
  96. package/dist/{Radio-CSBetBV6.js → Radio-BcHMk8dD.js} +2 -2
  97. package/dist/{Radio-CSBetBV6.js.map → Radio-BcHMk8dD.js.map} +1 -1
  98. package/dist/{Radio-BDE1xGel.js → Radio-D5WyQN2i.js} +16 -16
  99. package/dist/{Radio-BDE1xGel.js.map → Radio-D5WyQN2i.js.map} +1 -1
  100. package/dist/Radio.css +40 -37
  101. package/dist/Radio.js +1 -1
  102. package/dist/{RichTextEditor-BFFXj0zS.js → RichTextEditor-DstVbYch.js} +8 -8
  103. package/dist/{RichTextEditor-BFFXj0zS.js.map → RichTextEditor-DstVbYch.js.map} +1 -1
  104. package/dist/RichTextEditor.js +1 -1
  105. package/dist/{SearchField-Dl7sh_M4.js → SearchField-3tUPU8hH.js} +2 -2
  106. package/dist/{SearchField-Dl7sh_M4.js.map → SearchField-3tUPU8hH.js.map} +1 -1
  107. package/dist/{SearchField-CO9BHCYB.js → SearchField-BcQZ5e0x.js} +2 -2
  108. package/dist/{SearchField-CO9BHCYB.js.map → SearchField-BcQZ5e0x.js.map} +1 -1
  109. package/dist/SearchField.js +1 -1
  110. package/dist/{SelectCard-CLCLIBoq.js → SelectCard-BN-LI14f.js} +3 -3
  111. package/dist/{SelectCard-CLCLIBoq.js.map → SelectCard-BN-LI14f.js.map} +1 -1
  112. package/dist/SelectCard.js +1 -1
  113. package/dist/SelectField.js +1 -1
  114. package/dist/{SelectFieldLabel-Db9w6O6r.js → SelectFieldLabel-UbQT7fDD.js} +2 -2
  115. package/dist/{SelectFieldLabel-Db9w6O6r.js.map → SelectFieldLabel-UbQT7fDD.js.map} +1 -1
  116. package/dist/{SelectFieldSync-z8b41JZz.js → SelectFieldSync-BeDYbJ2M.js} +6 -6
  117. package/dist/SelectFieldSync-BeDYbJ2M.js.map +1 -0
  118. package/dist/SelectMenu.js +1 -1
  119. package/dist/{SelectMenuSync-Cf1Zradm.js → SelectMenuSync-C-PFemsQ.js} +4 -4
  120. package/dist/{SelectMenuSync-Cf1Zradm.js.map → SelectMenuSync-C-PFemsQ.js.map} +1 -1
  121. package/dist/{SelectOptions-BgT1V6qp.js → SelectOptions-Tr11Ckqw.js} +2 -2
  122. package/dist/{SelectOptions-BgT1V6qp.js.map → SelectOptions-Tr11Ckqw.js.map} +1 -1
  123. package/dist/{SelectTrigger-37HzF-VI.js → SelectTrigger-DTz7V-Xx.js} +2 -2
  124. package/dist/{SelectTrigger-37HzF-VI.js.map → SelectTrigger-DTz7V-Xx.js.map} +1 -1
  125. package/dist/SelectTrigger.js +1 -1
  126. package/dist/{SelectTriggerBase-4o1cqEbR.js → SelectTriggerBase-Ds6I7Qbr.js} +4 -4
  127. package/dist/{SelectTriggerBase-4o1cqEbR.js.map → SelectTriggerBase-Ds6I7Qbr.js.map} +1 -1
  128. package/dist/SelectTriggerBase.css +46 -42
  129. package/dist/SelectTriggerBase.module-DsPvTQE7.js +37 -0
  130. package/dist/SelectTriggerBase.module-DsPvTQE7.js.map +1 -0
  131. package/dist/{Switch-p4yVJTNy.js → Switch-onmiKoRd.js} +2 -2
  132. package/dist/{Switch-p4yVJTNy.js.map → Switch-onmiKoRd.js.map} +1 -1
  133. package/dist/Switch.js +1 -1
  134. package/dist/Table.js +1 -1
  135. package/dist/{Text-BgPuOXJM.js → Text-BTzgTpqu.js} +2 -2
  136. package/dist/{Text-BgPuOXJM.js.map → Text-BTzgTpqu.js.map} +1 -1
  137. package/dist/Text.js +1 -1
  138. package/dist/{TextField-DzuM8vvd.js → TextField-WTYZJlX3.js} +2 -2
  139. package/dist/{TextField-DzuM8vvd.js.map → TextField-WTYZJlX3.js.map} +1 -1
  140. package/dist/{TextField-D7NyaKId.js → TextField-rVfctM1E.js} +4 -4
  141. package/dist/{TextField-D7NyaKId.js.map → TextField-rVfctM1E.js.map} +1 -1
  142. package/dist/TextField.css +22 -58
  143. package/dist/TextField.js +1 -1
  144. package/dist/TextField.module-C8FsjTpx.js +23 -0
  145. package/dist/TextField.module-C8FsjTpx.js.map +1 -0
  146. package/dist/{Textarea-Dks15Zt3.js → Textarea-PXjppEQ6.js} +3 -3
  147. package/dist/{Textarea-Dks15Zt3.js.map → Textarea-PXjppEQ6.js.map} +1 -1
  148. package/dist/Textarea.js +1 -1
  149. package/dist/{TimeField-lN_5V6-X.js → TimeField-BJPXIv6W.js} +4 -4
  150. package/dist/{TimeField-lN_5V6-X.js.map → TimeField-BJPXIv6W.js.map} +1 -1
  151. package/dist/TimeField.js +1 -1
  152. package/dist/Toast.js +2 -2
  153. package/dist/{Toaster-3GI_qJxj.js → Toaster-CoChsMD0.js} +3 -3
  154. package/dist/{Toaster-3GI_qJxj.js.map → Toaster-CoChsMD0.js.map} +1 -1
  155. package/dist/{Toaster-2pAMQXRk.js → Toaster-DXLc86VD.js} +2 -2
  156. package/dist/{Toaster-2pAMQXRk.js.map → Toaster-DXLc86VD.js.map} +1 -1
  157. package/dist/{Toolbar-B0WHsX9W.js → Toolbar-BUd9eNkq.js} +6 -6
  158. package/dist/{Toolbar-B0WHsX9W.js.map → Toolbar-BUd9eNkq.js.map} +1 -1
  159. package/dist/{Toolbar-BRQpvj9U.js → Toolbar-Bt3kShho.js} +4 -4
  160. package/dist/{Toolbar-BRQpvj9U.js.map → Toolbar-Bt3kShho.js.map} +1 -1
  161. package/dist/Toolbar.js +2 -2
  162. package/dist/{ToolbarButtonToggle-xvMWRxzC.js → ToolbarButtonToggle-C06cqJ6F.js} +2 -2
  163. package/dist/{ToolbarButtonToggle-xvMWRxzC.js.map → ToolbarButtonToggle-C06cqJ6F.js.map} +1 -1
  164. package/dist/{Tooltip-DGo3OWqL.js → Tooltip-yr1D06BE.js} +5 -5
  165. package/dist/{Tooltip-DGo3OWqL.js.map → Tooltip-yr1D06BE.js.map} +1 -1
  166. package/dist/Tooltip.css +6 -7
  167. package/dist/Tooltip.js +1 -1
  168. package/dist/{YearlessDateInputWithPicker-BhbR5F22.js → YearlessDateInputWithPicker-BIcVgz-J.js} +3 -3
  169. package/dist/{YearlessDateInputWithPicker-BhbR5F22.js.map → YearlessDateInputWithPicker-BIcVgz-J.js.map} +1 -1
  170. package/dist/assets/icons/st/batch.svg +1 -1
  171. package/dist/assets/icons/st/call.svg +1 -1
  172. package/dist/assets/icons/st/customer.svg +1 -1
  173. package/dist/assets/icons/st/enterprise_hub.svg +1 -1
  174. package/dist/assets/icons/st/equipment.svg +1 -1
  175. package/dist/assets/icons/st/estimate.svg +1 -1
  176. package/dist/assets/icons/st/full_fluid.svg +1 -1
  177. package/dist/assets/icons/st/gnav_titan_advisor_active.svg +1 -1
  178. package/dist/assets/icons/st/gnav_titan_advisor_inactive.svg +1 -1
  179. package/dist/assets/icons/st/job.svg +1 -1
  180. package/dist/assets/icons/st/leads.svg +1 -1
  181. package/dist/assets/icons/st/proposal.svg +1 -1
  182. package/dist/assets/icons/st/roofing.svg +1 -1
  183. package/dist/beta.js +12 -12
  184. package/dist/{index-B6Demgr-.js → index-DVYRUKtW.js} +2 -2
  185. package/dist/{index-B6Demgr-.js.map → index-DVYRUKtW.js.map} +1 -1
  186. package/dist/index.js +38 -38
  187. package/dist/src/beta/components/FilterBar/FilterButton.d.ts +6 -3
  188. package/dist/src/beta/components/FilterBar/FilterDateList.d.ts +37 -0
  189. package/dist/src/beta/components/FilterBar/index.d.ts +1 -1
  190. package/dist/src/beta/components/FilterBar/internal/types.d.ts +40 -2
  191. package/dist/src/beta/components/FilterBar/internal/utils/dateListLibraryOptions.d.ts +29 -0
  192. package/dist/src/beta/components/FilterBar/internal/utils/filter-state.d.ts +2 -0
  193. package/dist/src/beta/components/FilterBar/internal/utils/test.d.ts +2 -1
  194. package/dist/{stripInlineMarkdown-D_eHogvh.js → stripInlineMarkdown-C5DNxxwf.js} +2 -2
  195. package/dist/{stripInlineMarkdown-D_eHogvh.js.map → stripInlineMarkdown-C5DNxxwf.js.map} +1 -1
  196. package/dist/{syncFilterUtils-Dpp7gt05.js → syncFilterUtils-COxBIkt6.js} +357 -357
  197. package/dist/{syncFilterUtils-Dpp7gt05.js.map → syncFilterUtils-COxBIkt6.js.map} +1 -1
  198. package/dist/{useDrilldown-bIRsbg1m.js → useDrilldown-KZ9rRsXQ.js} +2 -2
  199. package/dist/{useDrilldown-bIRsbg1m.js.map → useDrilldown-KZ9rRsXQ.js.map} +1 -1
  200. package/dist/{useToggleSelection-DBqr4HwT.js → useToggleSelection-B5PnTuT2.js} +2 -2
  201. package/dist/{useToggleSelection-DBqr4HwT.js.map → useToggleSelection-B5PnTuT2.js.map} +1 -1
  202. package/package.json +3 -3
  203. package/dist/Checkbox.module-DVbXNsaN.js +0 -28
  204. package/dist/Checkbox.module-DVbXNsaN.js.map +0 -1
  205. package/dist/FilterBar-GjMlLOME.js.map +0 -1
  206. package/dist/SelectFieldSync-z8b41JZz.js.map +0 -1
  207. package/dist/SelectTriggerBase.module-BgZSNZfE.js +0 -37
  208. package/dist/SelectTriggerBase.module-BgZSNZfE.js.map +0 -1
  209. package/dist/TextField.module-DkZwywjf.js +0 -23
  210. package/dist/TextField.module-DkZwywjf.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { forwardRef, useMemo, useCallback } from 'react';
3
- import { V as VirtualizedOptionsPanel, O as OptionsPanel } from './syncFilterUtils-Dpp7gt05.js';
3
+ import { V as VirtualizedOptionsPanel, O as OptionsPanel } from './syncFilterUtils-COxBIkt6.js';
4
4
 
5
5
  const MultiSelectOptions = forwardRef(({ selectedOptions, items, virtualize, ...rest }, ref) => {
6
6
  const selectedIds = useMemo(
@@ -60,4 +60,4 @@ const useToggleSelection = ({
60
60
  };
61
61
 
62
62
  export { MultiSelectOptions as M, useToggleSelection as u };
63
- //# sourceMappingURL=useToggleSelection-DBqr4HwT.js.map
63
+ //# sourceMappingURL=useToggleSelection-B5PnTuT2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useToggleSelection-DBqr4HwT.js","sources":["../src/internal/components/MultiSelectOptions.tsx","../src/internal/hooks/useToggleSelection.ts"],"sourcesContent":["import { MultiSelectFieldOption } from \"../../beta/components/MultiSelectField/types\";\nimport { CheckState } from \"../../types\";\nimport { CSSProperties, forwardRef, useCallback, useMemo } from \"react\";\nimport { OptionsPanel, OptionsPanelHandle } from \"./OptionsPanel\";\nimport { VirtualizedOptionsPanel } from \"./VirtualizedOptionsPanel\";\nimport {\n GetItemPropsFn,\n GetMenuPropsFn,\n SectionMeta,\n SelectItem,\n} from \"../types/selectFieldInternalTypes\";\n\nexport type MultiSelectOptionsProps = {\n isOpen: boolean;\n items: SelectItem[];\n getMenuProps: GetMenuPropsFn;\n getItemProps: GetItemPropsFn;\n highlightedIndex: number;\n selectedOptions: MultiSelectFieldOption[];\n hasMore: boolean;\n onLoadMore: () => void;\n loading: boolean;\n loadingMore: boolean;\n disableAutoLoadMore?: boolean;\n disabled?: boolean;\n className?: string;\n style?: CSSProperties;\n sectionsMeta?: SectionMeta[];\n virtualize?: boolean;\n};\n\nexport const MultiSelectOptions = forwardRef<\n OptionsPanelHandle,\n MultiSelectOptionsProps\n>(({ selectedOptions, items, virtualize, ...rest }, ref) => {\n const selectedIds = useMemo(\n () => new Set(selectedOptions.map((opt) => opt.id)),\n [selectedOptions],\n );\n\n const getCheckedState = useCallback(\n (item: SelectItem): CheckState => {\n if (item.type === \"select-all\" || item.type === \"select-filtered\") {\n return item.checkState ?? \"indeterminate\";\n }\n const checkId =\n item.type === \"pinned-option\" ? item.original.id : item.id;\n return selectedIds.has(checkId) ? \"checked\" : \"unchecked\";\n },\n [selectedIds],\n );\n\n const ListComponent = virtualize ? VirtualizedOptionsPanel : OptionsPanel;\n\n return (\n <ListComponent\n {...rest}\n ref={ref}\n items={items}\n selectionType=\"multiple\"\n getCheckedState={getCheckedState}\n />\n );\n});\n\nMultiSelectOptions.displayName = \"MultiSelectOptions\";\n","import { useCallback, useMemo } from \"react\";\nimport { SelectFieldOption } from \"../../beta/components/SelectField/types\";\nimport { NormalizedPinnedSection } from \"./usePinnedOptions\";\n\ntype UseToggleSelectionParams = {\n options: SelectFieldOption[];\n pinnedSections: NormalizedPinnedSection[];\n selectedOptions: SelectFieldOption[];\n onSelectedOptionsChange: (options: SelectFieldOption[]) => void;\n};\n\n/**\n * Shared multi-select toggle logic: computes allPinnedOptions and provides\n * handleItemClick to add/remove an option from the selection.\n * Used by both useComboMultiple and useSelectModeMultiple.\n */\nexport const useToggleSelection = ({\n options,\n pinnedSections,\n selectedOptions,\n onSelectedOptionsChange,\n}: UseToggleSelectionParams) => {\n const allPinnedOptions = useMemo(() => {\n return pinnedSections.flatMap((section) => section.options);\n }, [pinnedSections]);\n\n const handleItemClick = useCallback(\n (option: { id: string | number; label: string }) => {\n const isSelected = selectedOptions.some((opt) => opt.id === option.id);\n if (isSelected) {\n onSelectedOptionsChange(\n selectedOptions.filter((opt) => opt.id !== option.id),\n );\n } else {\n const fullOption =\n options.find((opt) => opt.id === option.id) ||\n allPinnedOptions.find((opt) => opt.id === option.id);\n if (fullOption) {\n onSelectedOptionsChange([...selectedOptions, fullOption]);\n }\n }\n },\n [selectedOptions, onSelectedOptionsChange, options, allPinnedOptions],\n );\n\n return { handleItemClick, allPinnedOptions };\n};\n"],"names":[],"mappings":";;;;AA+BO,MAAM,kBAAA,GAAqB,UAAA,CAGhC,CAAC,EAAE,eAAA,EAAiB,OAAO,UAAA,EAAY,GAAG,IAAA,EAAK,EAAG,GAAA,KAAQ;AAC1D,EAAA,MAAM,WAAA,GAAc,OAAA;AAAA,IAClB,MAAM,IAAI,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,EAAE,CAAC,CAAA;AAAA,IAClD,CAAC,eAAe;AAAA,GAClB;AAEA,EAAA,MAAM,eAAA,GAAkB,WAAA;AAAA,IACtB,CAAC,IAAA,KAAiC;AAChC,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,YAAA,IAAgB,IAAA,CAAK,SAAS,iBAAA,EAAmB;AACjE,QAAA,OAAO,KAAK,UAAA,IAAc,eAAA;AAAA,MAC5B;AACA,MAAA,MAAM,UACJ,IAAA,CAAK,IAAA,KAAS,kBAAkB,IAAA,CAAK,QAAA,CAAS,KAAK,IAAA,CAAK,EAAA;AAC1D,MAAA,OAAO,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA,GAAI,SAAA,GAAY,WAAA;AAAA,IAChD,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,MAAM,aAAA,GAAgB,aAAa,uBAAA,GAA0B,YAAA;AAE7D,EAAA,uBACE,GAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,GAAA;AAAA,MACA,KAAA;AAAA,MACA,aAAA,EAAc,UAAA;AAAA,MACd;AAAA;AAAA,GACF;AAEJ,CAAC;AAED,kBAAA,CAAmB,WAAA,GAAc,oBAAA;;ACjD1B,MAAM,qBAAqB,CAAC;AAAA,EACjC,OAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,KAAgC;AAC9B,EAAA,MAAM,gBAAA,GAAmB,QAAQ,MAAM;AACrC,IAAA,OAAO,cAAA,CAAe,OAAA,CAAQ,CAAC,OAAA,KAAY,QAAQ,OAAO,CAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAEnB,EAAA,MAAM,eAAA,GAAkB,WAAA;AAAA,IACtB,CAAC,MAAA,KAAmD;AAClD,MAAA,MAAM,UAAA,GAAa,gBAAgB,IAAA,CAAK,CAAC,QAAQ,GAAA,CAAI,EAAA,KAAO,OAAO,EAAE,CAAA;AACrE,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,uBAAA;AAAA,UACE,gBAAgB,MAAA,CAAO,CAAC,QAAQ,GAAA,CAAI,EAAA,KAAO,OAAO,EAAE;AAAA,SACtD;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,aACJ,OAAA,CAAQ,IAAA,CAAK,CAAC,GAAA,KAAQ,IAAI,EAAA,KAAO,MAAA,CAAO,EAAE,CAAA,IAC1C,iBAAiB,IAAA,CAAK,CAAC,QAAQ,GAAA,CAAI,EAAA,KAAO,OAAO,EAAE,CAAA;AACrD,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,uBAAA,CAAwB,CAAC,GAAG,eAAA,EAAiB,UAAU,CAAC,CAAA;AAAA,QAC1D;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,eAAA,EAAiB,uBAAA,EAAyB,OAAA,EAAS,gBAAgB;AAAA,GACtE;AAEA,EAAA,OAAO,EAAE,iBAAiB,gBAAA,EAAiB;AAC7C;;;;"}
1
+ {"version":3,"file":"useToggleSelection-B5PnTuT2.js","sources":["../src/internal/components/MultiSelectOptions.tsx","../src/internal/hooks/useToggleSelection.ts"],"sourcesContent":["import { MultiSelectFieldOption } from \"../../beta/components/MultiSelectField/types\";\nimport { CheckState } from \"../../types\";\nimport { CSSProperties, forwardRef, useCallback, useMemo } from \"react\";\nimport { OptionsPanel, OptionsPanelHandle } from \"./OptionsPanel\";\nimport { VirtualizedOptionsPanel } from \"./VirtualizedOptionsPanel\";\nimport {\n GetItemPropsFn,\n GetMenuPropsFn,\n SectionMeta,\n SelectItem,\n} from \"../types/selectFieldInternalTypes\";\n\nexport type MultiSelectOptionsProps = {\n isOpen: boolean;\n items: SelectItem[];\n getMenuProps: GetMenuPropsFn;\n getItemProps: GetItemPropsFn;\n highlightedIndex: number;\n selectedOptions: MultiSelectFieldOption[];\n hasMore: boolean;\n onLoadMore: () => void;\n loading: boolean;\n loadingMore: boolean;\n disableAutoLoadMore?: boolean;\n disabled?: boolean;\n className?: string;\n style?: CSSProperties;\n sectionsMeta?: SectionMeta[];\n virtualize?: boolean;\n};\n\nexport const MultiSelectOptions = forwardRef<\n OptionsPanelHandle,\n MultiSelectOptionsProps\n>(({ selectedOptions, items, virtualize, ...rest }, ref) => {\n const selectedIds = useMemo(\n () => new Set(selectedOptions.map((opt) => opt.id)),\n [selectedOptions],\n );\n\n const getCheckedState = useCallback(\n (item: SelectItem): CheckState => {\n if (item.type === \"select-all\" || item.type === \"select-filtered\") {\n return item.checkState ?? \"indeterminate\";\n }\n const checkId =\n item.type === \"pinned-option\" ? item.original.id : item.id;\n return selectedIds.has(checkId) ? \"checked\" : \"unchecked\";\n },\n [selectedIds],\n );\n\n const ListComponent = virtualize ? VirtualizedOptionsPanel : OptionsPanel;\n\n return (\n <ListComponent\n {...rest}\n ref={ref}\n items={items}\n selectionType=\"multiple\"\n getCheckedState={getCheckedState}\n />\n );\n});\n\nMultiSelectOptions.displayName = \"MultiSelectOptions\";\n","import { useCallback, useMemo } from \"react\";\nimport { SelectFieldOption } from \"../../beta/components/SelectField/types\";\nimport { NormalizedPinnedSection } from \"./usePinnedOptions\";\n\ntype UseToggleSelectionParams = {\n options: SelectFieldOption[];\n pinnedSections: NormalizedPinnedSection[];\n selectedOptions: SelectFieldOption[];\n onSelectedOptionsChange: (options: SelectFieldOption[]) => void;\n};\n\n/**\n * Shared multi-select toggle logic: computes allPinnedOptions and provides\n * handleItemClick to add/remove an option from the selection.\n * Used by both useComboMultiple and useSelectModeMultiple.\n */\nexport const useToggleSelection = ({\n options,\n pinnedSections,\n selectedOptions,\n onSelectedOptionsChange,\n}: UseToggleSelectionParams) => {\n const allPinnedOptions = useMemo(() => {\n return pinnedSections.flatMap((section) => section.options);\n }, [pinnedSections]);\n\n const handleItemClick = useCallback(\n (option: { id: string | number; label: string }) => {\n const isSelected = selectedOptions.some((opt) => opt.id === option.id);\n if (isSelected) {\n onSelectedOptionsChange(\n selectedOptions.filter((opt) => opt.id !== option.id),\n );\n } else {\n const fullOption =\n options.find((opt) => opt.id === option.id) ||\n allPinnedOptions.find((opt) => opt.id === option.id);\n if (fullOption) {\n onSelectedOptionsChange([...selectedOptions, fullOption]);\n }\n }\n },\n [selectedOptions, onSelectedOptionsChange, options, allPinnedOptions],\n );\n\n return { handleItemClick, allPinnedOptions };\n};\n"],"names":[],"mappings":";;;;AA+BO,MAAM,kBAAA,GAAqB,UAAA,CAGhC,CAAC,EAAE,eAAA,EAAiB,OAAO,UAAA,EAAY,GAAG,IAAA,EAAK,EAAG,GAAA,KAAQ;AAC1D,EAAA,MAAM,WAAA,GAAc,OAAA;AAAA,IAClB,MAAM,IAAI,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,EAAE,CAAC,CAAA;AAAA,IAClD,CAAC,eAAe;AAAA,GAClB;AAEA,EAAA,MAAM,eAAA,GAAkB,WAAA;AAAA,IACtB,CAAC,IAAA,KAAiC;AAChC,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,YAAA,IAAgB,IAAA,CAAK,SAAS,iBAAA,EAAmB;AACjE,QAAA,OAAO,KAAK,UAAA,IAAc,eAAA;AAAA,MAC5B;AACA,MAAA,MAAM,UACJ,IAAA,CAAK,IAAA,KAAS,kBAAkB,IAAA,CAAK,QAAA,CAAS,KAAK,IAAA,CAAK,EAAA;AAC1D,MAAA,OAAO,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA,GAAI,SAAA,GAAY,WAAA;AAAA,IAChD,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,MAAM,aAAA,GAAgB,aAAa,uBAAA,GAA0B,YAAA;AAE7D,EAAA,uBACE,GAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,GAAA;AAAA,MACA,KAAA;AAAA,MACA,aAAA,EAAc,UAAA;AAAA,MACd;AAAA;AAAA,GACF;AAEJ,CAAC;AAED,kBAAA,CAAmB,WAAA,GAAc,oBAAA;;ACjD1B,MAAM,qBAAqB,CAAC;AAAA,EACjC,OAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,KAAgC;AAC9B,EAAA,MAAM,gBAAA,GAAmB,QAAQ,MAAM;AACrC,IAAA,OAAO,cAAA,CAAe,OAAA,CAAQ,CAAC,OAAA,KAAY,QAAQ,OAAO,CAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAEnB,EAAA,MAAM,eAAA,GAAkB,WAAA;AAAA,IACtB,CAAC,MAAA,KAAmD;AAClD,MAAA,MAAM,UAAA,GAAa,gBAAgB,IAAA,CAAK,CAAC,QAAQ,GAAA,CAAI,EAAA,KAAO,OAAO,EAAE,CAAA;AACrE,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,uBAAA;AAAA,UACE,gBAAgB,MAAA,CAAO,CAAC,QAAQ,GAAA,CAAI,EAAA,KAAO,OAAO,EAAE;AAAA,SACtD;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,aACJ,OAAA,CAAQ,IAAA,CAAK,CAAC,GAAA,KAAQ,IAAI,EAAA,KAAO,MAAA,CAAO,EAAE,CAAA,IAC1C,iBAAiB,IAAA,CAAK,CAAC,QAAQ,GAAA,CAAI,EAAA,KAAO,OAAO,EAAE,CAAA;AACrD,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,uBAAA,CAAwB,CAAC,GAAG,eAAA,EAAiB,UAAU,CAAC,CAAA;AAAA,QAC1D;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,eAAA,EAAiB,uBAAA,EAAyB,OAAA,EAAS,gBAAgB;AAAA,GACtE;AAEA,EAAA,OAAO,EAAE,iBAAiB,gBAAA,EAAiB;AAC7C;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/anvil2",
3
- "version": "3.0.5",
3
+ "version": "3.0.6",
4
4
  "type": "module",
5
5
  "types": "./dist/src/index.d.ts",
6
6
  "main": "./dist/index.js",
@@ -73,8 +73,8 @@
73
73
  "tabbable": "^6.2.0",
74
74
  "tinycolor2": "^1.6.0",
75
75
  "uuid": "^10.0.0",
76
- "@servicetitan/hammer-token": "3.0.2",
77
- "@servicetitan/hammer-icon": "1.2.0"
76
+ "@servicetitan/hammer-icon": "1.2.0",
77
+ "@servicetitan/hammer-token": "3.0.2"
78
78
  },
79
79
  "peerDependencies": {
80
80
  "@types/react": "^18 || ^19",
@@ -1,28 +0,0 @@
1
- import './Checkbox.css';const wrapper = "_wrapper_cclcz_1";
2
- const checkbox = "_checkbox_cclcz_7";
3
- const icon = "_icon_cclcz_88";
4
- const legend = "_legend_cclcz_250";
5
- const children = "_children_cclcz_263";
6
- const label = "_label_cclcz_270";
7
- const checkboxStyles = {
8
- wrapper: wrapper,
9
- checkbox: checkbox,
10
- "icon-wrapper": "_icon-wrapper_cclcz_88",
11
- "required-asterisk": "_required-asterisk_cclcz_104",
12
- "focus-label": "_focus-label_cclcz_109",
13
- "helper-wrapper": "_helper-wrapper_cclcz_132",
14
- icon: icon,
15
- "checkbox-checked": "_checkbox-checked_cclcz_148",
16
- "checkbox-indeterminate": "_checkbox-indeterminate_cclcz_149",
17
- "checkbox-error": "_checkbox-error_cclcz_185",
18
- "sr-only": "_sr-only_cclcz_221",
19
- "checkbox-group": "_checkbox-group_cclcz_234",
20
- legend: legend,
21
- children: children,
22
- label: label,
23
- "direction-row": "_direction-row_cclcz_270",
24
- "label-row": "_label-row_cclcz_275"
25
- };
26
-
27
- export { checkboxStyles as c };
28
- //# sourceMappingURL=Checkbox.module-DVbXNsaN.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Checkbox.module-DVbXNsaN.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +0,0 @@
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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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"SelectFieldSync-z8b41JZz.js","sources":["../src/beta/components/SelectField/internal/SelectFieldInput.tsx","../src/beta/components/SelectField/internal/useCombo.tsx","../src/beta/components/SelectField/internal/SelectFieldComboboxMode.tsx","../src/beta/components/SelectField/internal/SelectFieldTrigger.tsx","../src/beta/components/SelectField/internal/useSelectMode.ts","../src/beta/components/SelectField/internal/SelectFieldSelectMode.tsx","../src/beta/components/SelectField/SelectField.tsx","../src/beta/components/SelectField/SelectFieldSync.tsx"],"sourcesContent":["import styles from \"../../../../components/SelectTrigger/internal/SelectTriggerBase.module.scss\";\nimport cx from \"classnames\";\nimport { PassThroughProps, Size } from \"../../../../types\";\nimport { Button } from \"../../../../components/Button\";\nimport Chevron_Right from \"@servicetitan/hammer-icon/mdi/round/chevron_right.svg\";\nimport Close from \"@servicetitan/hammer-icon/mdi/round/close.svg\";\nimport { ReactElement, RefObject } from \"react\";\n\n/**\n * Props for the SelectFieldInput component\n * @property {string} [placeholder] - Placeholder text displayed when input is empty\n * @property {Extract<Size, \"small\" | \"medium\" | \"large\">} [size] - Size variant of the input\n * @property {boolean} [disableClearButton] - Hides the clear button when true\n * @property {boolean} [disableToggleButton] - Hides the toggle button when true\n * @property {boolean} [disabled] - Disables the input entirely\n * @property {boolean} [readOnly] - Cannot be modified but remains interactive\n * @property {boolean} [required] - Marks the input as required for form validation\n * @property {boolean} [error] - Shows error styling on the input when true\n * @property {() => void} [onClear] - Callback fired when the clear button is clicked\n * @property {string} [id] - HTML id attribute for the input element\n * @property {RefObject<HTMLDivElement>} [inputWrapperRef] - Ref for the input wrapper div element\n * @property {PassThroughProps<\"div\">} [htmlInputWrapperProps] - Additional props passed to the wrapper div\n * @property {PassThroughProps<\"input\">} [inputProps] - Additional props passed to the input element\n * @property {PassThroughProps<\"button\">} [toggleButtonProps] - Additional props passed to the toggle button\n * @property {string | ReactElement} [prefix] - Content to display before the input\n * @property {string | ReactElement} [suffix] - Content to display after the input\n */\nexport type SelectFieldInputProps = {\n placeholder?: string;\n size?: Extract<Size, \"small\" | \"medium\" | \"large\">;\n disableClearButton?: boolean;\n disableToggleButton?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n error?: boolean;\n onClear?: () => void;\n id?: string;\n inputWrapperRef?: RefObject<HTMLDivElement>;\n htmlInputWrapperProps?: PassThroughProps<\"div\">;\n inputProps?: PassThroughProps<\"input\">;\n toggleButtonProps?: PassThroughProps<\"button\">;\n prefix?: string | ReactElement;\n suffix?: string | ReactElement;\n};\n\n/**\n * Internal input component for the SelectField that provides the text input and action buttons.\n *\n * Features:\n * - Text input for filtering and displaying selected values\n * - Optional clear button for removing the current selection\n * - Optional toggle button for opening/closing the dropdown menu\n * - Supports multiple size variants (small, medium, large)\n * - Fully accessible with proper ARIA labels on buttons\n * - Supports pass-through props for customization of internal elements\n * - Optional prefix and suffix content\n * - Error state styling\n *\n * @example\n * <SelectFieldInput\n * placeholder=\"Search...\"\n * size=\"medium\"\n * onClear={() => handleClear()}\n * prefix=\"$\"\n * />\n */\nexport const SelectFieldInput = ({\n placeholder,\n size,\n disableClearButton,\n disableToggleButton,\n disabled,\n readOnly,\n required,\n error,\n onClear,\n id,\n inputWrapperRef,\n htmlInputWrapperProps,\n inputProps,\n toggleButtonProps,\n prefix,\n suffix,\n}: SelectFieldInputProps) => {\n const inputWrapperClassNames = cx(styles[\"input-wrapper\"], {\n [styles[\"small\"]]: size === \"small\",\n [styles[\"large\"]]: size === \"large\",\n [styles[\"no-clear-button\"]]: disableClearButton,\n [styles[\"no-toggle-button\"]]: disableToggleButton,\n [styles[\"disabled\"]]: disabled || readOnly,\n });\n\n return (\n <div\n ref={inputWrapperRef}\n {...htmlInputWrapperProps}\n className={cx(inputWrapperClassNames, htmlInputWrapperProps?.className)}\n >\n {prefix ? <div className={styles[\"prefix\"]}>{prefix}</div> : null}\n <input\n type=\"text\"\n id={id}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n {...inputProps}\n className={cx(styles[\"input\"], inputProps?.className, {\n [styles[\"error\"]]: error,\n })}\n />\n {suffix ? <div className={styles[\"suffix\"]}>{suffix}</div> : null}\n <div className={styles[\"buttons-wrapper\"]}>\n {disableClearButton ? null : (\n <div className={styles[\"close-button-wrapper\"]}>\n <Button\n icon={Close}\n aria-label=\"clear selection\"\n appearance=\"ghost\"\n size=\"small\"\n className={styles[\"close-button\"]}\n onClick={() => {\n onClear?.();\n }}\n />\n </div>\n )}\n {disableToggleButton ? null : (\n <div className={styles[\"toggle-button-wrapper\"]}>\n <Button\n icon={Chevron_Right}\n aria-label=\"toggle menu\"\n appearance=\"ghost\"\n size=\"small\"\n disabled={disabled}\n {...toggleButtonProps}\n className={cx(\n styles[\"toggle-button\"],\n toggleButtonProps?.className,\n )}\n />\n </div>\n )}\n </div>\n </div>\n );\n};\n\nSelectFieldInput.displayName = \"SelectFieldInput\";\n","import {\n useCombobox,\n UseComboboxProps,\n UseComboboxState,\n UseComboboxStateChangeOptions,\n} from \"downshift\";\nimport { useDownshiftEnvironment } from \"../../../../internal/hooks\";\nimport {\n SelectFieldGroupByValue,\n SelectFieldOption,\n SelectFieldPinnedOptions,\n} from \"../types\";\nimport { useMemo, useState } from \"react\";\nimport {\n SectionMeta,\n SelectItem,\n} from \"../../../../internal/types/selectFieldInternalTypes\";\nimport { useProcessedOptions } from \"../../../../internal/hooks/useProcessedOptions\";\nimport {\n buildSelectItems,\n toSelectItem,\n} from \"../../../../internal/functions/buildSelectItems\";\n\nexport type { SectionMeta };\n\nexport type UseComboOptions = {\n // An array of currently loaded options\n options: SelectFieldOption[];\n // Pinned options configuration (raw prop)\n pinned?: SelectFieldPinnedOptions;\n // Function to convert a group value to a display label\n groupToString?: (groupValue: SelectFieldGroupByValue) => string;\n // Function to sort group sections\n groupSorter?: (\n a: SelectFieldGroupByValue,\n b: SelectFieldGroupByValue,\n ) => number;\n selectedOption: SelectFieldOption | null;\n onSelectedOptionChange: (option: SelectFieldOption | null) => void;\n displayAs: \"popover\" | \"dialog\";\n disableHighlightOnOpen?: boolean;\n disabled: boolean;\n virtualize?: boolean;\n onScrollToHighlight?: (index: number) => void;\n} & Pick<UseComboboxProps<SelectItem>, \"onInputValueChange\" | \"onIsOpenChange\">;\n\n/**\n * The purpose of useCombo is to provide an abstraction over the downshift combobox hook.\n */\nexport const useCombo = ({\n options,\n pinned,\n groupToString,\n groupSorter,\n selectedOption,\n onSelectedOptionChange,\n onInputValueChange,\n onIsOpenChange,\n displayAs = \"popover\",\n disableHighlightOnOpen = false,\n disabled,\n virtualize = false,\n onScrollToHighlight,\n}: UseComboOptions) => {\n // Controlled input value state - needed so usePinnedOptions can access it\n // before useCombobox is called\n const [inputValue, setInputValue] = useState(selectedOption?.label ?? \"\");\n\n // Compute effective search value (empty if showing selected option's label)\n const effectiveSearchValue =\n selectedOption?.label === inputValue ? \"\" : inputValue;\n\n const { pinnedSections, ungroupedItems, groupSections } = useProcessedOptions(\n {\n options,\n pinned,\n searchValue: effectiveSearchValue,\n groupToString,\n groupSorter,\n },\n );\n\n const { items, sectionsMeta } = useMemo(\n () =>\n buildSelectItems({\n pinnedSections,\n groupSections,\n ungroupedItems,\n }),\n [pinnedSections, groupSections, ungroupedItems],\n );\n\n const selectedDownshiftItem = useMemo(() => {\n return selectedOption ? toSelectItem(selectedOption) : null;\n }, [selectedOption]);\n\n const { ref: wrapperDivRef, environment } = useDownshiftEnvironment();\n\n const {\n isOpen,\n highlightedIndex,\n getToggleButtonProps,\n getLabelProps,\n getMenuProps,\n getInputProps,\n getItemProps,\n closeMenu,\n openMenu,\n setHighlightedIndex,\n } = useCombobox({\n isItemDisabled: (item, _index) => {\n if (!item) {\n return false; // Downshift passes -1 index with an undefined item. Ignore it.\n }\n return (disabled || item.disabled) ?? false;\n },\n environment: environment,\n selectedItem: selectedDownshiftItem,\n inputValue, // Controlled input value\n onSelectedItemChange: ({\n selectedItem: si,\n }: {\n selectedItem: SelectItem;\n }) => {\n // Regular, pinned, and grouped options are all selectable\n if (\n si &&\n (si.type === \"option\" ||\n si.type === \"pinned-option\" ||\n si.type === \"grouped-option\")\n ) {\n onSelectedOptionChange(si.original);\n } else {\n onSelectedOptionChange(null);\n }\n },\n onInputValueChange: (changes) => {\n // Update local state\n setInputValue(changes.inputValue ?? \"\");\n // Call external handler\n onInputValueChange?.(changes);\n },\n onHighlightedIndexChange: ({ type, highlightedIndex: idx }) => {\n if (type !== useCombobox.stateChangeTypes.ItemMouseMove && idx >= 0) {\n onScrollToHighlight?.(idx);\n }\n },\n onIsOpenChange: (changes) => {\n onIsOpenChange?.(changes);\n if (changes.isOpen && !disableHighlightOnOpen) {\n const selectedItemIndex = items.findIndex(\n (item) => item.original.id === selectedOption?.id,\n );\n setHighlightedIndex(selectedItemIndex);\n }\n },\n items: items,\n itemToString(item: SelectItem | null) {\n return item?.original.label ?? \"\";\n },\n stateReducer: (state, actionAndChanges) =>\n stateReducer(state, actionAndChanges, displayAs),\n ...(virtualize && { scrollIntoView: () => {} }),\n });\n\n return {\n inputValue,\n wrapperDivRef,\n getToggleButtonProps,\n getLabelProps,\n getMenuProps,\n getInputProps,\n getItemProps,\n highlightedIndex,\n isOpen,\n items,\n sectionsMeta,\n closeMenu,\n openMenu,\n };\n};\n\nfunction stateReducer(\n state: UseComboboxState<SelectItem>,\n actionAndChanges: UseComboboxStateChangeOptions<SelectItem>,\n displayAs: \"popover\" | \"dialog\",\n) {\n const { type, changes } = actionAndChanges;\n // this prevents the menu from being closed when the user selects an item with 'Enter' or mouse\n switch (type) {\n case useCombobox.stateChangeTypes.InputBlur:\n // keep the dialog open if the user blurs the input while the dialog is open\n if (displayAs === \"dialog\" && state.isOpen) {\n return {\n ...changes,\n isOpen: state.isOpen,\n };\n }\n return {\n ...changes,\n inputValue: state.selectedItem?.original.label ?? state.inputValue,\n };\n case useCombobox.stateChangeTypes.InputKeyDownEscape:\n case useCombobox.stateChangeTypes.FunctionCloseMenu:\n return {\n ...changes,\n inputValue: state.selectedItem?.original.label ?? state.inputValue,\n };\n case useCombobox.stateChangeTypes.InputClick:\n if (displayAs === \"dialog\" && state.isOpen) {\n // keep the dialog open if the user clicks the input while the dialog is open\n return {\n ...changes,\n isOpen: state.isOpen,\n };\n }\n return changes;\n case useCombobox.stateChangeTypes.InputKeyDownEnter:\n case useCombobox.stateChangeTypes.ItemClick:\n return changes;\n default:\n return changes; // otherwise business as usual.\n }\n}\n","import { useCallback, useEffect, useRef } from \"react\";\nimport { SelectOptions } from \"../../../../internal/components/SelectOptions\";\nimport { OptionsPanelHandle } from \"../../../../internal/components/OptionsPanel\";\nimport { SelectFieldInput } from \"./SelectFieldInput\";\nimport { SelectFieldLabel } from \"./SelectFieldLabel\";\nimport { useDebouncedCallback } from \"../../../../internal/hooks/useDebouncedCallback\";\nimport styles from \"../../../../components/SelectTrigger/internal/SelectTriggerBase.module.scss\";\nimport { useCombo } from \"./useCombo\";\nimport { OptionsPopover } from \"../../../../internal/components/OptionsPopover/OptionsPopover\";\nimport { OptionsDialog } from \"../../../../internal/components/OptionsDialog/OptionsDialog\";\nimport { AddNewItemButton } from \"../../../../internal/components/AddNewItemButton\";\nimport { FieldMessage } from \"../../../../components/FieldMessage\";\nimport { SelectFieldComboboxInternalProps } from \"../../../../internal/types/selectFieldInternalTypes\";\n\n/**\n * Combobox mode: searchable select using useCombobox.\n * This is the default behavior when disableSearch is false.\n */\nexport const SelectFieldComboboxMode = ({\n id,\n helperUid,\n selectedOption,\n onSelectedOptionChange,\n displayAs,\n isDisabledOrReadOnly,\n disabled,\n labelAiMark,\n readOnly,\n required,\n placeholder,\n size,\n error,\n hasHelperText,\n disableClearButton,\n prefix,\n suffix,\n label,\n hideLabel,\n hint,\n moreInfo,\n moreInfoId,\n errorMessages,\n warning,\n description,\n className,\n style,\n layoutStyles,\n pinned,\n groupToString,\n groupSorter,\n virtualize,\n options,\n loading,\n loadingMore,\n hasMore,\n loadOptions,\n loadMore,\n initialLoad,\n initialLoadPerformed,\n setInitialLoadPerformed,\n inputWrapperRef,\n debounceMs,\n addItemLabel,\n onAddNewItem,\n}: SelectFieldComboboxInternalProps) => {\n const listRef = useRef<OptionsPanelHandle>(null);\n\n const debouncedOptionLoader = useDebouncedCallback((inputValue: string) => {\n loadOptions(selectedOption?.label === inputValue ? \"\" : inputValue, {\n initial: true,\n });\n }, debounceMs);\n\n const adjustInputValueForSelectedOption = useCallback(\n (inputValue: string) => {\n return selectedOption?.label === inputValue ? \"\" : inputValue;\n },\n [selectedOption?.label],\n );\n\n const {\n isOpen,\n getToggleButtonProps,\n getLabelProps,\n getMenuProps,\n getInputProps,\n wrapperDivRef,\n highlightedIndex,\n getItemProps,\n inputValue,\n items,\n closeMenu,\n sectionsMeta,\n } = useCombo({\n displayAs,\n disabled: isDisabledOrReadOnly,\n options,\n pinned,\n groupToString,\n groupSorter,\n selectedOption,\n virtualize,\n onSelectedOptionChange: (opt) => onSelectedOptionChange(opt),\n async onIsOpenChange(changes) {\n if (initialLoad === \"open\" && !initialLoadPerformed && changes.isOpen) {\n await loadOptions(adjustInputValueForSelectedOption(inputValue), {\n initial: true,\n });\n setInitialLoadPerformed(true);\n }\n },\n onInputValueChange: ({ inputValue: iv }) => {\n debouncedOptionLoader(iv ?? \"\");\n },\n onScrollToHighlight: (i) => listRef.current?.scrollToIndex(i),\n });\n\n useEffect(() => {\n const performInitialLoad = async () => {\n if (initialLoad === \"immediate\" && !initialLoadPerformed) {\n await loadOptions(adjustInputValueForSelectedOption(inputValue), {\n initial: true,\n });\n setInitialLoadPerformed(true);\n }\n };\n performInitialLoad();\n }, [\n loadOptions,\n initialLoadPerformed,\n initialLoad,\n inputValue,\n adjustInputValueForSelectedOption,\n setInitialLoadPerformed,\n ]);\n\n const handleLoadMore = async () => {\n await loadMore(adjustInputValueForSelectedOption(inputValue));\n };\n\n const addNewItemButton = onAddNewItem ? (\n <AddNewItemButton\n searchText={inputValue}\n addItemLabel={addItemLabel}\n onAddNewItem={onAddNewItem}\n onCloseMenu={closeMenu}\n />\n ) : null;\n\n if (displayAs === \"dialog\") {\n return (\n <div\n className={\n className\n ? `${styles[\"search-field\"]} ${className}`\n : styles[\"search-field\"]\n }\n style={{ ...layoutStyles, ...style }}\n ref={wrapperDivRef}\n >\n <SelectFieldLabel\n aiMark={labelAiMark}\n label={label}\n hideLabel={hideLabel}\n getLabelProps={getLabelProps}\n required={required}\n moreInfo={moreInfo}\n moreInfoId={moreInfoId}\n />\n <SelectFieldInput\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n disableToggleButton={false}\n placeholder={placeholder}\n disableClearButton={disableClearButton}\n toggleButtonProps={getToggleButtonProps()}\n onClear={() => onSelectedOptionChange(null)}\n id={`${id}-input`}\n inputProps={getInputProps({\n \"aria-describedby\":\n [hasHelperText && helperUid, moreInfo && moreInfoId]\n .filter(Boolean)\n .join(\" \") || undefined,\n \"aria-invalid\": error ? true : undefined,\n })}\n size={size}\n error={!!error}\n prefix={prefix}\n suffix={suffix}\n />\n {hasHelperText ? (\n <FieldMessage\n id={helperUid}\n hint={hint}\n error={errorMessages}\n warning={warning}\n description={description}\n />\n ) : null}\n <OptionsDialog\n id={`${id}-dialog`}\n isOpen={isOpen}\n onClose={closeMenu}\n title={label}\n field={\n <SelectFieldInput\n disabled={disabled}\n readOnly={readOnly}\n inputProps={getInputProps()}\n disableToggleButton\n placeholder={placeholder}\n disableClearButton={disableClearButton}\n onClear={() => onSelectedOptionChange(null)}\n id={`${id}-dialog-input`}\n inputWrapperRef={inputWrapperRef}\n size=\"medium\"\n error={!!error}\n prefix={prefix}\n suffix={suffix}\n />\n }\n initialFocusResolver={(elements) => {\n return (\n elements.find((element) => element.tagName === \"INPUT\") ||\n elements[0]\n );\n }}\n footer={addNewItemButton ?? undefined}\n >\n <SelectOptions\n ref={listRef}\n isOpen\n items={items}\n sectionsMeta={sectionsMeta}\n getMenuProps={getMenuProps}\n getItemProps={getItemProps}\n highlightedIndex={highlightedIndex}\n selectedOption={selectedOption}\n hasMore={hasMore}\n onLoadMore={handleLoadMore}\n loading={loading}\n loadingMore={loadingMore}\n disabled={isDisabledOrReadOnly}\n virtualize={virtualize}\n />\n </OptionsDialog>\n </div>\n );\n }\n\n return (\n <div\n className={\n className\n ? `${styles[\"search-field\"]} ${className}`\n : styles[\"search-field\"]\n }\n style={{ ...layoutStyles, ...style }}\n >\n <SelectFieldLabel\n aiMark={labelAiMark}\n label={label}\n hideLabel={hideLabel}\n getLabelProps={getLabelProps}\n required={required}\n moreInfo={moreInfo}\n moreInfoId={moreInfoId}\n />\n <SelectFieldInput\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n inputProps={getInputProps({\n popovertarget: `${id}-popover`,\n \"aria-describedby\":\n [hasHelperText && helperUid, moreInfo && moreInfoId]\n .filter(Boolean)\n .join(\" \") || undefined,\n \"aria-invalid\": error ? true : undefined,\n })}\n toggleButtonProps={getToggleButtonProps()}\n disableToggleButton={false}\n placeholder={placeholder}\n disableClearButton={disableClearButton}\n onClear={() => onSelectedOptionChange(null)}\n id={`${id}-input`}\n inputWrapperRef={inputWrapperRef}\n size={size}\n error={!!error}\n prefix={prefix}\n suffix={suffix}\n />\n {hasHelperText ? (\n <FieldMessage\n id={helperUid}\n hint={hint}\n error={errorMessages}\n warning={warning}\n description={description}\n />\n ) : null}\n\n <OptionsPopover\n id={`${id}-popover`}\n referenceElement={inputWrapperRef}\n open={isOpen && displayAs === \"popover\"}\n onClose={closeMenu}\n width=\"reference\"\n footer={addNewItemButton ?? undefined}\n >\n <SelectOptions\n ref={listRef}\n isOpen={isOpen}\n items={items}\n sectionsMeta={sectionsMeta}\n getMenuProps={getMenuProps}\n getItemProps={getItemProps}\n highlightedIndex={highlightedIndex}\n selectedOption={selectedOption}\n hasMore={hasMore}\n onLoadMore={handleLoadMore}\n loading={loading}\n loadingMore={loadingMore}\n disabled={isDisabledOrReadOnly}\n virtualize={virtualize}\n />\n </OptionsPopover>\n </div>\n );\n};\n","import styles from \"../../../../components/SelectTrigger/internal/SelectTriggerBase.module.scss\";\nimport cx from \"classnames\";\nimport { Size } from \"../../../../types\";\nimport { Button } from \"../../../../components/Button\";\nimport Chevron_Right from \"@servicetitan/hammer-icon/mdi/round/chevron_right.svg\";\nimport Close from \"@servicetitan/hammer-icon/mdi/round/close.svg\";\nimport { ReactElement, RefObject } from \"react\";\nimport { useMergeRefs } from \"../../../../hooks/useMergeRefs/useMergeRefs\";\n\nexport type SelectFieldTriggerProps = {\n placeholder?: string;\n size?: Extract<Size, \"small\" | \"medium\" | \"large\">;\n disableClearButton?: boolean;\n disabled?: boolean;\n readOnly?: boolean;\n error?: boolean;\n onClear?: () => void;\n id?: string;\n popoverTarget?: string;\n inputWrapperRef?: RefObject<HTMLDivElement>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n toggleButtonProps?: Record<string, any>;\n /** The display text (selected option label or empty) */\n displayValue?: string;\n prefix?: string | ReactElement;\n suffix?: string | ReactElement;\n};\n\n/**\n * Non-searchable select trigger for SelectField when disableSearch is true.\n * Renders a div-based trigger instead of an input, suitable for the listbox ARIA pattern.\n */\nexport const SelectFieldTrigger = ({\n placeholder,\n size,\n disableClearButton,\n disabled,\n readOnly,\n error,\n onClear,\n id,\n inputWrapperRef,\n toggleButtonProps,\n displayValue,\n prefix,\n suffix,\n popoverTarget,\n}: SelectFieldTriggerProps) => {\n const { ref: downshiftRef, ...restToggleButtonProps } =\n toggleButtonProps ?? {};\n const mergedRef = useMergeRefs([inputWrapperRef, downshiftRef]);\n\n const inputWrapperClassNames = cx(styles[\"input-wrapper\"], {\n [styles[\"small\"]]: size === \"small\",\n [styles[\"large\"]]: size === \"large\",\n [styles[\"no-clear-button\"]]: disableClearButton,\n [styles[\"disabled\"]]: disabled || readOnly,\n });\n\n return (\n <div style={{ position: \"relative\" }}>\n <div\n ref={mergedRef}\n {...restToggleButtonProps}\n // @ts-expect-error: popovertarget is a valid HTML attribute\n popovertarget={popoverTarget}\n id={id}\n className={cx(inputWrapperClassNames, restToggleButtonProps?.className)}\n >\n {prefix ? <div className={styles[\"prefix\"]}>{prefix}</div> : null}\n <div\n className={cx(styles[\"input\"], {\n [styles[\"error\"]]: error,\n })}\n >\n {displayValue ? (\n <span>{displayValue}</span>\n ) : (\n <span className={styles[\"fake-placeholder\"]}>{placeholder}</span>\n )}\n </div>\n {suffix ? <div className={styles[\"suffix\"]}>{suffix}</div> : null}\n <div className={styles[\"buttons-wrapper\"]}>\n <div className={styles[\"toggle-button-wrapper\"]}>\n <Button\n icon={Chevron_Right}\n aria-label=\"toggle menu\"\n appearance=\"ghost\"\n size=\"small\"\n disabled={disabled}\n tabIndex={-1}\n className={styles[\"toggle-button\"]}\n />\n </div>\n </div>\n </div>\n {disableClearButton ? null : (\n <div\n className={styles[\"buttons-wrapper\"]}\n style={{ insetInlineEnd: \"2rem\" }}\n >\n <div className={styles[\"close-button-wrapper\"]}>\n <Button\n icon={Close}\n aria-label=\"clear selection\"\n appearance=\"ghost\"\n size=\"small\"\n className={styles[\"close-button\"]}\n onClick={(e) => {\n e.stopPropagation();\n onClear?.();\n }}\n />\n </div>\n </div>\n )}\n </div>\n );\n};\n\nSelectFieldTrigger.displayName = \"SelectFieldTrigger\";\n","import {\n useSelect,\n UseSelectState,\n UseSelectStateChangeOptions,\n} from \"downshift\";\nimport { useDownshiftEnvironment } from \"../../../../internal/hooks\";\nimport {\n SelectFieldGroupByValue,\n SelectFieldOption,\n SelectFieldPinnedOptions,\n} from \"../types\";\nimport { SelectItem } from \"../../../../internal/types/selectFieldInternalTypes\";\nimport { useMemo } from \"react\";\nimport { useProcessedOptions } from \"../../../../internal/hooks/useProcessedOptions\";\nimport {\n buildSelectItems,\n toSelectItem,\n} from \"../../../../internal/functions/buildSelectItems\";\n\nexport type UseSelectModeOptions = {\n options: SelectFieldOption[];\n pinned?: SelectFieldPinnedOptions;\n groupToString?: (groupValue: SelectFieldGroupByValue) => string;\n groupSorter?: (\n a: SelectFieldGroupByValue,\n b: SelectFieldGroupByValue,\n ) => number;\n selectedOption: SelectFieldOption | null;\n onSelectedOptionChange: (option: SelectFieldOption | null) => void;\n onIsOpenChange?: (changes: { isOpen?: boolean }) => void;\n displayAs: \"popover\" | \"dialog\";\n disableHighlightOnOpen?: boolean;\n disabled: boolean;\n virtualize?: boolean;\n onScrollToHighlight?: (index: number) => void;\n};\n\n/**\n * Wraps downshift's useSelect for non-searchable select fields.\n * Returns a compatible interface to useCombo (minus getInputProps/inputValue).\n */\nexport const useSelectMode = ({\n options,\n pinned,\n groupToString,\n groupSorter,\n selectedOption,\n onSelectedOptionChange,\n onIsOpenChange,\n displayAs = \"popover\",\n disableHighlightOnOpen = false,\n disabled,\n virtualize = false,\n onScrollToHighlight,\n}: UseSelectModeOptions) => {\n const { pinnedSections, ungroupedItems, groupSections } = useProcessedOptions(\n {\n options,\n pinned,\n searchValue: \"\",\n groupToString,\n groupSorter,\n },\n );\n\n const { items, sectionsMeta } = useMemo(\n () =>\n buildSelectItems({\n pinnedSections,\n groupSections,\n ungroupedItems,\n }),\n [pinnedSections, groupSections, ungroupedItems],\n );\n\n const selectedDownshiftItem = useMemo(() => {\n return selectedOption ? toSelectItem(selectedOption) : null;\n }, [selectedOption]);\n\n const { ref: wrapperDivRef, environment } = useDownshiftEnvironment();\n\n const {\n isOpen,\n highlightedIndex,\n getToggleButtonProps,\n getLabelProps,\n getMenuProps,\n getItemProps,\n closeMenu,\n openMenu,\n setHighlightedIndex,\n } = useSelect({\n isItemDisabled: (item) => {\n if (!item) return false;\n return (disabled || item.disabled) ?? false;\n },\n environment,\n selectedItem: selectedDownshiftItem,\n onSelectedItemChange: ({\n selectedItem: si,\n }: {\n selectedItem: SelectItem;\n }) => {\n if (\n si &&\n (si.type === \"option\" ||\n si.type === \"pinned-option\" ||\n si.type === \"grouped-option\")\n ) {\n onSelectedOptionChange(si.original);\n } else {\n onSelectedOptionChange(null);\n }\n },\n onHighlightedIndexChange: ({ type, highlightedIndex: idx }) => {\n if (type !== useSelect.stateChangeTypes.ItemMouseMove && idx >= 0) {\n onScrollToHighlight?.(idx);\n }\n },\n onIsOpenChange: (changes) => {\n onIsOpenChange?.(changes);\n if (changes.isOpen && !disableHighlightOnOpen) {\n const selectedItemIndex = items.findIndex(\n (item) => item.original.id === selectedOption?.id,\n );\n setHighlightedIndex(selectedItemIndex);\n }\n },\n items: items,\n itemToString(item: SelectItem | null) {\n return item?.original.label ?? \"\";\n },\n stateReducer: (state, actionAndChanges) =>\n stateReducer(state, actionAndChanges, displayAs),\n ...(virtualize && { scrollIntoView: () => {} }),\n });\n\n return {\n wrapperDivRef,\n getToggleButtonProps,\n getLabelProps,\n getMenuProps,\n getItemProps,\n highlightedIndex,\n isOpen,\n items,\n sectionsMeta,\n closeMenu,\n openMenu,\n };\n};\n\nfunction stateReducer(\n state: UseSelectState<SelectItem>,\n actionAndChanges: UseSelectStateChangeOptions<SelectItem>,\n displayAs: \"popover\" | \"dialog\",\n) {\n const { type, changes } = actionAndChanges;\n switch (type) {\n case useSelect.stateChangeTypes.ToggleButtonBlur:\n if (displayAs === \"dialog\" && state.isOpen) {\n return { ...changes, isOpen: state.isOpen };\n }\n return changes;\n case useSelect.stateChangeTypes.ToggleButtonKeyDownEscape:\n case useSelect.stateChangeTypes.FunctionCloseMenu:\n return changes;\n case useSelect.stateChangeTypes.ToggleButtonClick:\n if (displayAs === \"dialog\" && state.isOpen) {\n return { ...changes, isOpen: state.isOpen };\n }\n return changes;\n case useSelect.stateChangeTypes.ToggleButtonKeyDownEnter:\n case useSelect.stateChangeTypes.ItemClick:\n return changes;\n default:\n return changes;\n }\n}\n","import { useEffect, useRef } from \"react\";\nimport { SelectOptions } from \"../../../../internal/components/SelectOptions\";\nimport { OptionsPanelHandle } from \"../../../../internal/components/OptionsPanel\";\nimport { SelectFieldTrigger } from \"./SelectFieldTrigger\";\nimport { SelectFieldLabel } from \"./SelectFieldLabel\";\nimport styles from \"../../../../components/SelectTrigger/internal/SelectTriggerBase.module.scss\";\nimport { useSelectMode } from \"./useSelectMode\";\nimport { OptionsPopover } from \"../../../../internal/components/OptionsPopover/OptionsPopover\";\nimport { OptionsDialog } from \"../../../../internal/components/OptionsDialog/OptionsDialog\";\nimport { AddNewItemButton } from \"../../../../internal/components/AddNewItemButton\";\nimport { FieldMessage } from \"../../../../components/FieldMessage\";\nimport { SelectFieldBaseInternalProps } from \"../../../../internal/types/selectFieldInternalTypes\";\n\n/**\n * Select mode: non-searchable select using useSelect.\n * Active when disableSearch is true.\n */\nexport const SelectFieldSelectMode = ({\n labelAiMark,\n id,\n helperUid,\n selectedOption,\n onSelectedOptionChange,\n displayAs,\n isDisabledOrReadOnly,\n disabled,\n readOnly,\n placeholder,\n size,\n error,\n hasHelperText,\n disableClearButton,\n prefix,\n suffix,\n label,\n hideLabel,\n hint,\n moreInfo,\n moreInfoId,\n errorMessages,\n warning,\n description,\n className,\n style,\n layoutStyles,\n pinned,\n groupToString,\n groupSorter,\n virtualize,\n options,\n loading,\n loadingMore,\n hasMore,\n loadOptions,\n loadMore,\n initialLoad,\n initialLoadPerformed,\n setInitialLoadPerformed,\n inputWrapperRef,\n required,\n addItemLabel,\n onAddNewItem,\n}: SelectFieldBaseInternalProps) => {\n const listRef = useRef<OptionsPanelHandle>(null);\n\n const {\n isOpen,\n getToggleButtonProps,\n getLabelProps,\n getMenuProps,\n wrapperDivRef,\n highlightedIndex,\n getItemProps,\n items,\n closeMenu,\n sectionsMeta,\n } = useSelectMode({\n displayAs,\n disabled: isDisabledOrReadOnly,\n options,\n pinned,\n groupToString,\n groupSorter,\n selectedOption,\n virtualize,\n onSelectedOptionChange: (opt) => onSelectedOptionChange(opt),\n async onIsOpenChange(changes) {\n if (initialLoad === \"open\" && !initialLoadPerformed && changes.isOpen) {\n await loadOptions(\"\", { initial: true });\n setInitialLoadPerformed(true);\n }\n },\n onScrollToHighlight: (i) => listRef.current?.scrollToIndex(i),\n });\n\n useEffect(() => {\n const performInitialLoad = async () => {\n if (initialLoad === \"immediate\" && !initialLoadPerformed) {\n await loadOptions(\"\", { initial: true });\n setInitialLoadPerformed(true);\n }\n };\n performInitialLoad();\n }, [loadOptions, initialLoadPerformed, initialLoad, setInitialLoadPerformed]);\n\n const handleLoadMore = async () => {\n await loadMore(\"\");\n };\n\n const addNewItemButton = onAddNewItem ? (\n <AddNewItemButton\n searchText=\"\"\n addItemLabel={addItemLabel}\n onAddNewItem={onAddNewItem}\n onCloseMenu={closeMenu}\n />\n ) : null;\n\n const toggleButtonProps = getToggleButtonProps({\n disabled: !!disabled,\n \"aria-required\": required ? true : undefined,\n \"aria-describedby\":\n [hasHelperText && helperUid, moreInfo && moreInfoId]\n .filter(Boolean)\n .join(\" \") || undefined,\n \"aria-invalid\": error ? true : undefined,\n } as Record<string, unknown>);\n\n if (displayAs === \"dialog\") {\n return (\n <div\n className={\n className\n ? `${styles[\"search-field\"]} ${className}`\n : styles[\"search-field\"]\n }\n style={{ ...layoutStyles, ...style }}\n ref={wrapperDivRef}\n >\n <SelectFieldLabel\n aiMark={labelAiMark}\n label={label}\n hideLabel={hideLabel}\n getLabelProps={getLabelProps}\n required={required}\n moreInfo={moreInfo}\n moreInfoId={moreInfoId}\n />\n <SelectFieldTrigger\n disabled={disabled}\n readOnly={readOnly}\n placeholder={placeholder}\n disableClearButton={disableClearButton}\n toggleButtonProps={toggleButtonProps}\n onClear={() => onSelectedOptionChange(null)}\n id={`${id}-trigger`}\n inputWrapperRef={inputWrapperRef}\n displayValue={selectedOption?.label}\n size={size}\n error={!!error}\n prefix={prefix}\n suffix={suffix}\n />\n {hasHelperText ? (\n <FieldMessage\n id={helperUid}\n hint={hint}\n error={errorMessages}\n warning={warning}\n description={description}\n />\n ) : null}\n <OptionsDialog\n id={`${id}-dialog`}\n isOpen={isOpen}\n onClose={closeMenu}\n title={label}\n footer={addNewItemButton ?? undefined}\n >\n <SelectOptions\n ref={listRef}\n isOpen\n items={items}\n sectionsMeta={sectionsMeta}\n getMenuProps={(opts) =>\n getMenuProps({\n ...opts,\n style: { ...opts?.style, outline: \"none\" },\n onKeyDown: toggleButtonProps.onKeyDown,\n tabIndex: 0,\n \"aria-activedescendant\":\n toggleButtonProps[\"aria-activedescendant\"],\n })\n }\n getItemProps={getItemProps}\n highlightedIndex={highlightedIndex}\n selectedOption={selectedOption}\n hasMore={hasMore}\n onLoadMore={handleLoadMore}\n loading={loading}\n loadingMore={loadingMore}\n disabled={isDisabledOrReadOnly}\n virtualize={virtualize}\n />\n </OptionsDialog>\n </div>\n );\n }\n\n return (\n <div\n className={\n className\n ? `${styles[\"search-field\"]} ${className}`\n : styles[\"search-field\"]\n }\n style={{ ...layoutStyles, ...style }}\n >\n <SelectFieldLabel\n aiMark={labelAiMark}\n label={label}\n hideLabel={hideLabel}\n getLabelProps={getLabelProps}\n required={required}\n moreInfo={moreInfo}\n moreInfoId={moreInfoId}\n />\n <SelectFieldTrigger\n disabled={disabled}\n readOnly={readOnly}\n placeholder={placeholder}\n disableClearButton={disableClearButton}\n toggleButtonProps={toggleButtonProps}\n onClear={() => onSelectedOptionChange(null)}\n id={`${id}-trigger`}\n popoverTarget={`${id}-popover`}\n inputWrapperRef={inputWrapperRef}\n displayValue={selectedOption?.label}\n size={size}\n error={!!error}\n prefix={prefix}\n suffix={suffix}\n />\n {hasHelperText ? (\n <FieldMessage\n id={helperUid}\n hint={hint}\n error={errorMessages}\n warning={warning}\n description={description}\n />\n ) : null}\n\n <OptionsPopover\n id={`${id}-popover`}\n referenceElement={inputWrapperRef}\n open={isOpen && displayAs === \"popover\"}\n onClose={closeMenu}\n width=\"reference\"\n footer={addNewItemButton ?? undefined}\n >\n <SelectOptions\n ref={listRef}\n isOpen={isOpen}\n items={items}\n sectionsMeta={sectionsMeta}\n getMenuProps={getMenuProps}\n getItemProps={getItemProps}\n highlightedIndex={highlightedIndex}\n selectedOption={selectedOption}\n hasMore={hasMore}\n onLoadMore={handleLoadMore}\n loading={loading}\n loadingMore={loadingMore}\n disabled={isDisabledOrReadOnly}\n virtualize={virtualize}\n />\n </OptionsPopover>\n </div>\n );\n};\n","import { SelectFieldHandle, SelectFieldProps } from \"./types\";\nimport { forwardRef, useId, useRef } from \"react\";\nimport { useLayoutPropsUtil } from \"../../../internal/hooks/useLayoutPropsUtil\";\nimport { warnDeprecatedErrorUsage } from \"../../../components/FieldMessage\";\nimport { SelectFieldComboboxMode } from \"./internal/SelectFieldComboboxMode\";\nimport { SelectFieldSelectMode } from \"./internal/SelectFieldSelectMode\";\nimport {\n SelectFieldBaseInternalProps,\n SelectFieldComboboxInternalProps,\n} from \"../../../internal/types/selectFieldInternalTypes\";\nimport { useSelectOrchestration } from \"../../../internal/hooks/useSelectOrchestration\";\n\n/**\n * SelectField component for selecting a single option from a searchable dropdown.\n *\n * Features:\n * - Async option loading with caching, lazy pagination (page, offset, group), and debounced search\n * - Supports pinned option sections (static or dynamically loaded)\n * - Grouped options with custom sort and label functions\n * - Combobox mode (searchable) and select mode (non-searchable) via disableSearch\n * - Dialog and popover display modes with auto-detection based on viewport\n * - Imperative handle for cache management (clearCache, invalidate)\n * - Optional \"Add new item\" affordance below the option list with consumer-owned dialog\n * - Supports layout utilities for positioning and spacing\n *\n * @example\n * <SelectField\n * label=\"Technician\"\n * value={selected}\n * onSelectedOptionChange={setSelected}\n * loadOptions={async (search) => fetchTechnicians(search)}\n * />\n */\nexport const SelectField = forwardRef<SelectFieldHandle, SelectFieldProps>(\n (propsWithLayout, ref) => {\n const { layoutStyles, componentProps } =\n useLayoutPropsUtil(propsWithLayout);\n\n const inputWrapperRef = useRef<HTMLDivElement>(null);\n\n const {\n id: idProp,\n value: selectedOption,\n initialLoad: initialLoadProp,\n displayMenuAs: displayMenuAsProp,\n lazy,\n loadOptions: loadOptionsProp,\n label,\n labelAiMark,\n hideLabel,\n placeholder,\n disableClearButton: disableClearButtonProp = false,\n debounceMs = 200,\n onSelectedOptionChange,\n cache,\n size,\n error,\n hint,\n moreInfo,\n description,\n errorAriaLive: _errorAriaLive,\n required,\n disabled,\n readOnly,\n prefix,\n suffix,\n warning,\n className,\n style,\n pinned,\n virtualize,\n disableSearch,\n addItemLabel,\n onAddNewItem,\n } = componentProps;\n\n const groupToString =\n \"groupToString\" in componentProps\n ? componentProps.groupToString\n : undefined;\n const groupSorter =\n \"groupSorter\" in componentProps ? componentProps.groupSorter : undefined;\n\n const autoId = useId();\n const id = idProp ?? autoId;\n const helperUid = useId();\n const moreInfoUid = useId();\n\n warnDeprecatedErrorUsage(\"SelectField\", error);\n\n const errorMessages =\n typeof error === \"boolean\" || error === undefined ? undefined : error;\n const hasHelperText = !!(hint || errorMessages || warning || description);\n const isDisabledOrReadOnly = (disabled || readOnly) ?? false;\n\n const {\n displayAs,\n initialLoad,\n initialLoadPerformed,\n setInitialLoadPerformed,\n options,\n loading,\n loadingMore,\n hasMore,\n loadOptions,\n loadMore,\n } = useSelectOrchestration({\n lazy,\n loadOptions: loadOptionsProp,\n cache,\n lazyOptions:\n \"lazyOptions\" in componentProps\n ? componentProps.lazyOptions\n : undefined,\n initialLoad: initialLoadProp,\n displayMenuAs: displayMenuAsProp,\n ref,\n });\n\n const disableClearButton =\n disableClearButtonProp || !selectedOption || isDisabledOrReadOnly;\n\n const baseProps: SelectFieldBaseInternalProps = {\n id,\n helperUid,\n selectedOption,\n onSelectedOptionChange,\n displayAs,\n isDisabledOrReadOnly,\n disabled,\n readOnly,\n required,\n placeholder,\n size,\n error,\n hasHelperText,\n disableClearButton,\n prefix,\n suffix,\n label,\n labelAiMark,\n hideLabel,\n hint,\n moreInfo,\n moreInfoId: moreInfo ? moreInfoUid : undefined,\n errorMessages,\n warning,\n description,\n className,\n style,\n layoutStyles,\n pinned,\n groupToString,\n groupSorter,\n virtualize,\n addItemLabel,\n onAddNewItem,\n options,\n loading,\n loadingMore,\n hasMore,\n loadOptions,\n loadMore,\n initialLoad,\n initialLoadPerformed,\n setInitialLoadPerformed,\n inputWrapperRef,\n };\n\n if (disableSearch) {\n return <SelectFieldSelectMode {...baseProps} />;\n }\n\n const comboboxProps: SelectFieldComboboxInternalProps = {\n ...baseProps,\n debounceMs,\n };\n\n return <SelectFieldComboboxMode {...comboboxProps} />;\n },\n);\n\nSelectField.displayName = \"SelectField\";\n","import { useEffect, useMemo, useRef } from \"react\";\nimport { MatchSorterOptions } from \"match-sorter\";\nimport { SelectField } from \"./SelectField\";\nimport {\n SelectFieldHandle,\n SelectFieldProps,\n SelectFieldOption,\n SelectFieldGroupByValue,\n} from \"./types\";\nimport {\n SyncFilterFn,\n defaultSyncFilter,\n toSyncFilterFn,\n sortByGroup,\n} from \"../../../internal/functions/syncFilterUtils\";\n\nexport type SelectFieldSyncProps = Omit<\n SelectFieldProps,\n \"loadOptions\" | \"lazy\" | \"debounceMs\" | \"cache\" | \"initialLoad\"\n> & {\n /**\n * The options to display in the select field.\n */\n options: SelectFieldOption[];\n /**\n * Controls how options are filtered and sorted when the user types a search value.\n * Can be a function that returns options in the desired display order,\n * or a MatchSorterOptions object to customize the default match-sorter behavior.\n *\n * Before any search is performed, options appear in the order they are supplied.\n * By default, options are filtered by `label` and `searchText` using match-sorter,\n * which also ranks results by match quality (best matches first).\n *\n * @example\n * <SelectFieldSync\n * options={options}\n * filter={(options, searchValue) => {\n * return options.filter((option) => {\n * return option.label?.toLowerCase().includes(searchValue.toLowerCase());\n * });\n * }}\n * />\n *\n * @example\n * <SelectFieldSync\n * options={options}\n * filter={{ keys: [\"label\"] }}\n * />\n */\n filter?: SyncFilterFn | MatchSorterOptions<SelectFieldOption>;\n /**\n * Function to compare two group values for sorting.\n * When provided, options are sorted by group using this comparator,\n * then by match-sort order within each group.\n * @param a - First group value to compare\n * @param b - Second group value to compare\n * @returns Negative if a < b, positive if a > b, zero if equal\n */\n groupSorter?: (\n a: SelectFieldGroupByValue,\n b: SelectFieldGroupByValue,\n ) => number;\n};\n\n/**\n * SelectFieldSync is a simplified version of SelectField that is used to display a list of options in a select field.\n *\n * Features:\n * - Accepts `options` instead of `loadOptions` and `lazy`.\n * - Performs client-side filtering of the options.\n * - Optionally accepts a function to filter the options, or a MatchSorterOptions object to customize the default filtering.\n * - Supports grouping with optional group sorting via `groupSorter`.\n * - Supports all the other props of SelectField.\n */\nexport const SelectFieldSync = (props: SelectFieldSyncProps) => {\n const {\n options,\n filter: filterProp = defaultSyncFilter,\n groupSorter,\n ...rest\n } = props;\n\n const filter = useMemo(() => toSyncFilterFn(filterProp), [filterProp]);\n\n const loadOptions = (searchValue: string) => {\n const filtered = filter(options, searchValue);\n return groupSorter ? sortByGroup(filtered, groupSorter) : filtered;\n };\n\n const fieldRef = useRef<SelectFieldHandle>(null);\n const prevOptionsRef = useRef(options);\n\n useEffect(() => {\n if (prevOptionsRef.current !== options) {\n prevOptionsRef.current = options;\n fieldRef.current?.invalidate();\n }\n }, [options]);\n\n return (\n <SelectField\n ref={fieldRef}\n lazy={false}\n loadOptions={loadOptions}\n debounceMs={0}\n {...rest}\n />\n );\n};\n"],"names":["Close","Chevron_Right","stateReducer","inputValue"],"mappings":"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"}