@servicetitan/anvil2 3.0.5 → 3.0.7

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 (300) hide show
  1. package/CHANGELOG.md +48 -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.js +1 -2
  28. package/dist/Combobox.js.map +1 -1
  29. package/dist/{DataTable-BFzj8cZG.js → DataTable-E8z0H8c7.js} +144 -17
  30. package/dist/{DataTable-BFzj8cZG.js.map → DataTable-E8z0H8c7.js.map} +1 -1
  31. package/dist/DataTable.css +47 -5
  32. package/dist/{DateFieldRange-CO2C776E.js → DateFieldRange-BN_uIvHI.js} +27 -15
  33. package/dist/DateFieldRange-BN_uIvHI.js.map +1 -0
  34. package/dist/DateFieldRange.js +1 -1
  35. package/dist/{DateFieldSingle-DjmHpn1y.js → DateFieldSingle-h3YkdwPo.js} +5 -5
  36. package/dist/{DateFieldSingle-DjmHpn1y.js.map → DateFieldSingle-h3YkdwPo.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-CvYSMvfD.js} +23 -21
  49. package/dist/{Dialog-BZTo4hbX.js.map → Dialog-CvYSMvfD.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-B4ZAs73g.js +412 -0
  63. package/dist/FilterBar-B4ZAs73g.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-DO5psxd4.js} +6 -6
  69. package/dist/{ListView-CIa981KJ.js.map → ListView-DO5psxd4.js.map} +1 -1
  70. package/dist/ListView.js +1 -1
  71. package/dist/{ListView.module-CKUQP3kf.js → ListView.module-DfqtCL3Q.js} +3 -3
  72. package/dist/ListView.module-DfqtCL3Q.js.map +1 -0
  73. package/dist/{Listbox-DRznPBCr.js → Listbox-CvQHBFWb.js} +2 -2
  74. package/dist/{Listbox-DRznPBCr.js.map → Listbox-CvQHBFWb.js.map} +1 -1
  75. package/dist/Listbox.js +1 -1
  76. package/dist/MultiSelectField.js +1 -1
  77. package/dist/{MultiSelectFieldSync-BxyQiVPQ.js → MultiSelectFieldSync-CXX2F0ru.js} +62 -32
  78. package/dist/MultiSelectFieldSync-CXX2F0ru.js.map +1 -0
  79. package/dist/MultiSelectFieldSync.css +72 -65
  80. package/dist/MultiSelectMenu.js +1 -1
  81. package/dist/{MultiSelectMenuSync-BJfvZGf3.js → MultiSelectMenuSync-EKtvlL62.js} +218 -47
  82. package/dist/MultiSelectMenuSync-EKtvlL62.js.map +1 -0
  83. package/dist/{NumberField-D7YYo4Rl.js → NumberField-BymFZhIJ.js} +4 -4
  84. package/dist/{NumberField-D7YYo4Rl.js.map → NumberField-BymFZhIJ.js.map} +1 -1
  85. package/dist/NumberField.js +1 -1
  86. package/dist/{Page-cELP59Hm.js → Page-C2_Hm27h.js} +8 -8
  87. package/dist/{Page-cELP59Hm.js.map → Page-C2_Hm27h.js.map} +1 -1
  88. package/dist/Page.js +1 -1
  89. package/dist/{Pagination-DTN4FovY.js → Pagination-Bmd4JORe.js} +3 -3
  90. package/dist/{Pagination-DTN4FovY.js.map → Pagination-Bmd4JORe.js.map} +1 -1
  91. package/dist/Pagination.js +1 -1
  92. package/dist/{Popover-B3Vw4lDW.js → Popover-8mTJoMy7.js} +2 -2
  93. package/dist/{Popover-B3Vw4lDW.js.map → Popover-8mTJoMy7.js.map} +1 -1
  94. package/dist/Popover.js +1 -1
  95. package/dist/{ProgressBar-kzCNhaCO.js → ProgressBar-C1CkQHV5.js} +2 -2
  96. package/dist/{ProgressBar-kzCNhaCO.js.map → ProgressBar-C1CkQHV5.js.map} +1 -1
  97. package/dist/ProgressBar.js +1 -1
  98. package/dist/{Radio-CSBetBV6.js → Radio-BcHMk8dD.js} +2 -2
  99. package/dist/{Radio-CSBetBV6.js.map → Radio-BcHMk8dD.js.map} +1 -1
  100. package/dist/{Radio-BDE1xGel.js → Radio-D5WyQN2i.js} +16 -16
  101. package/dist/{Radio-BDE1xGel.js.map → Radio-D5WyQN2i.js.map} +1 -1
  102. package/dist/Radio.css +40 -37
  103. package/dist/Radio.js +1 -1
  104. package/dist/{RichTextEditor-BFFXj0zS.js → RichTextEditor-DstVbYch.js} +8 -8
  105. package/dist/{RichTextEditor-BFFXj0zS.js.map → RichTextEditor-DstVbYch.js.map} +1 -1
  106. package/dist/RichTextEditor.js +1 -1
  107. package/dist/SavedFiltersButton-2qba2Cgu.js +650 -0
  108. package/dist/SavedFiltersButton-2qba2Cgu.js.map +1 -0
  109. package/dist/SavedFiltersButton.css +8 -0
  110. package/dist/SavedFiltersButton.d.ts +1 -0
  111. package/dist/SavedFiltersButton.js +2 -0
  112. package/dist/SavedFiltersButton.js.map +1 -0
  113. package/dist/{SearchField-Dl7sh_M4.js → SearchField-BMHJCVFu.js} +2 -2
  114. package/dist/{SearchField-Dl7sh_M4.js.map → SearchField-BMHJCVFu.js.map} +1 -1
  115. package/dist/{SearchField-CO9BHCYB.js → SearchField-fXc_vWEr.js} +3 -3
  116. package/dist/{SearchField-CO9BHCYB.js.map → SearchField-fXc_vWEr.js.map} +1 -1
  117. package/dist/SearchField.js +1 -1
  118. package/dist/{SelectCard-CLCLIBoq.js → SelectCard-BN-LI14f.js} +3 -3
  119. package/dist/{SelectCard-CLCLIBoq.js.map → SelectCard-BN-LI14f.js.map} +1 -1
  120. package/dist/SelectCard.js +1 -1
  121. package/dist/SelectField.js +1 -1
  122. package/dist/{SelectFieldLabel-Db9w6O6r.js → SelectFieldLabel-UbQT7fDD.js} +2 -2
  123. package/dist/{SelectFieldLabel-Db9w6O6r.js.map → SelectFieldLabel-UbQT7fDD.js.map} +1 -1
  124. package/dist/{SelectFieldSync-z8b41JZz.js → SelectFieldSync-DykGkR_w.js} +6 -6
  125. package/dist/SelectFieldSync-DykGkR_w.js.map +1 -0
  126. package/dist/SelectMenu.js +1 -1
  127. package/dist/{SelectMenuSync-Cf1Zradm.js → SelectMenuSync-DTQ8Ofoz.js} +21 -9
  128. package/dist/SelectMenuSync-DTQ8Ofoz.js.map +1 -0
  129. package/dist/{SelectOptions-BgT1V6qp.js → SelectOptions-DVSOJwRy.js} +2 -2
  130. package/dist/{SelectOptions-BgT1V6qp.js.map → SelectOptions-DVSOJwRy.js.map} +1 -1
  131. package/dist/{SelectTrigger-37HzF-VI.js → SelectTrigger-CHk0KO-P.js} +2 -2
  132. package/dist/{SelectTrigger-37HzF-VI.js.map → SelectTrigger-CHk0KO-P.js.map} +1 -1
  133. package/dist/SelectTrigger.js +1 -1
  134. package/dist/{SelectTriggerBase-4o1cqEbR.js → SelectTriggerBase-B2S5SOZr.js} +137 -41
  135. package/dist/SelectTriggerBase-B2S5SOZr.js.map +1 -0
  136. package/dist/SelectTriggerBase.css +46 -42
  137. package/dist/SelectTriggerBase.module-DsPvTQE7.js +37 -0
  138. package/dist/SelectTriggerBase.module-DsPvTQE7.js.map +1 -0
  139. package/dist/{Switch-p4yVJTNy.js → Switch-onmiKoRd.js} +2 -2
  140. package/dist/{Switch-p4yVJTNy.js.map → Switch-onmiKoRd.js.map} +1 -1
  141. package/dist/Switch.js +1 -1
  142. package/dist/Table.js +1 -1
  143. package/dist/{Text-BgPuOXJM.js → Text-BTzgTpqu.js} +2 -2
  144. package/dist/{Text-BgPuOXJM.js.map → Text-BTzgTpqu.js.map} +1 -1
  145. package/dist/Text.js +1 -1
  146. package/dist/{TextField-DzuM8vvd.js → TextField-WTYZJlX3.js} +2 -2
  147. package/dist/{TextField-DzuM8vvd.js.map → TextField-WTYZJlX3.js.map} +1 -1
  148. package/dist/{TextField-D7NyaKId.js → TextField-rVfctM1E.js} +4 -4
  149. package/dist/{TextField-D7NyaKId.js.map → TextField-rVfctM1E.js.map} +1 -1
  150. package/dist/TextField.css +22 -58
  151. package/dist/TextField.js +1 -1
  152. package/dist/TextField.module-C8FsjTpx.js +23 -0
  153. package/dist/TextField.module-C8FsjTpx.js.map +1 -0
  154. package/dist/{Textarea-Dks15Zt3.js → Textarea-PXjppEQ6.js} +3 -3
  155. package/dist/{Textarea-Dks15Zt3.js.map → Textarea-PXjppEQ6.js.map} +1 -1
  156. package/dist/Textarea.js +1 -1
  157. package/dist/{TimeField-lN_5V6-X.js → TimeField-BJPXIv6W.js} +4 -4
  158. package/dist/{TimeField-lN_5V6-X.js.map → TimeField-BJPXIv6W.js.map} +1 -1
  159. package/dist/TimeField.js +1 -1
  160. package/dist/Toast.js +2 -2
  161. package/dist/{Toaster-3GI_qJxj.js → Toaster-CoChsMD0.js} +3 -3
  162. package/dist/{Toaster-3GI_qJxj.js.map → Toaster-CoChsMD0.js.map} +1 -1
  163. package/dist/{Toaster-2pAMQXRk.js → Toaster-DXLc86VD.js} +2 -2
  164. package/dist/{Toaster-2pAMQXRk.js.map → Toaster-DXLc86VD.js.map} +1 -1
  165. package/dist/{Toolbar-BRQpvj9U.js → Toolbar-Bt3kShho.js} +4 -4
  166. package/dist/{Toolbar-BRQpvj9U.js.map → Toolbar-Bt3kShho.js.map} +1 -1
  167. package/dist/{Toolbar-B0WHsX9W.js → Toolbar-DaUKbbsL.js} +6 -6
  168. package/dist/{Toolbar-B0WHsX9W.js.map → Toolbar-DaUKbbsL.js.map} +1 -1
  169. package/dist/Toolbar.js +2 -2
  170. package/dist/{ToolbarButtonToggle-xvMWRxzC.js → ToolbarButtonToggle-BPu81Wuv.js} +5 -4
  171. package/dist/ToolbarButtonToggle-BPu81Wuv.js.map +1 -0
  172. package/dist/{Tooltip-DGo3OWqL.js → Tooltip-yr1D06BE.js} +5 -5
  173. package/dist/{Tooltip-DGo3OWqL.js.map → Tooltip-yr1D06BE.js.map} +1 -1
  174. package/dist/Tooltip.css +6 -7
  175. package/dist/Tooltip.js +1 -1
  176. package/dist/{YearlessDateInputWithPicker-BhbR5F22.js → YearlessDateInputWithPicker-BIcVgz-J.js} +3 -3
  177. package/dist/{YearlessDateInputWithPicker-BhbR5F22.js.map → YearlessDateInputWithPicker-BIcVgz-J.js.map} +1 -1
  178. package/dist/assets/icons/st/batch.svg +1 -1
  179. package/dist/assets/icons/st/call.svg +1 -1
  180. package/dist/assets/icons/st/customer.svg +1 -1
  181. package/dist/assets/icons/st/enterprise_hub.svg +1 -1
  182. package/dist/assets/icons/st/equipment.svg +1 -1
  183. package/dist/assets/icons/st/estimate.svg +1 -1
  184. package/dist/assets/icons/st/full_fluid.svg +1 -1
  185. package/dist/assets/icons/st/gnav_titan_advisor_active.svg +1 -1
  186. package/dist/assets/icons/st/gnav_titan_advisor_inactive.svg +1 -1
  187. package/dist/assets/icons/st/job.svg +1 -1
  188. package/dist/assets/icons/st/leads.svg +1 -1
  189. package/dist/assets/icons/st/proposal.svg +1 -1
  190. package/dist/assets/icons/st/roofing.svg +1 -1
  191. package/dist/beta.js +13 -12
  192. package/dist/beta.js.map +1 -1
  193. package/dist/filter-state-Bx3aYS1r.js +1627 -0
  194. package/dist/filter-state-Bx3aYS1r.js.map +1 -0
  195. package/dist/{FilterBar.css → filter-state.css} +19 -33
  196. package/dist/{index-B6Demgr-.js → index-DVYRUKtW.js} +2 -2
  197. package/dist/{index-B6Demgr-.js.map → index-DVYRUKtW.js.map} +1 -1
  198. package/dist/index.js +38 -39
  199. package/dist/index.js.map +1 -1
  200. package/dist/src/beta/components/FilterBar/FilterBar.d.ts +12 -10
  201. package/dist/src/beta/components/FilterBar/FilterDateList.d.ts +47 -0
  202. package/dist/src/beta/components/FilterBar/FilterDateRange.d.ts +34 -29
  203. package/dist/src/beta/components/FilterBar/FilterDateSingle.d.ts +31 -22
  204. package/dist/src/beta/components/FilterBar/FilterDrawer.d.ts +1 -1
  205. package/dist/src/beta/components/FilterBar/FilterItemWrapper.d.ts +4 -12
  206. package/dist/src/beta/components/FilterBar/FilterNumericRange.d.ts +29 -0
  207. package/dist/src/beta/components/FilterBar/FilterPopoverButton.d.ts +86 -0
  208. package/dist/src/beta/components/FilterBar/FilterToggleButton.d.ts +2 -2
  209. package/dist/src/beta/components/FilterBar/FilterTriggerButton.d.ts +50 -0
  210. package/dist/src/beta/components/FilterBar/index.d.ts +1 -1
  211. package/dist/src/beta/components/FilterBar/internal/FilterGroupContext.d.ts +5 -9
  212. package/dist/src/beta/components/FilterBar/internal/adapters/asyncMultiSelect.d.ts +6 -0
  213. package/dist/src/beta/components/FilterBar/internal/adapters/asyncSelect.d.ts +6 -0
  214. package/dist/src/beta/components/FilterBar/internal/adapters/boolean.d.ts +3 -0
  215. package/dist/src/beta/components/FilterBar/internal/adapters/custom.d.ts +3 -0
  216. package/dist/src/beta/components/FilterBar/internal/adapters/date.d.ts +5 -0
  217. package/dist/src/beta/components/FilterBar/internal/adapters/dateList.d.ts +5 -0
  218. package/dist/src/beta/components/FilterBar/internal/adapters/dateRange.d.ts +8 -0
  219. package/dist/src/beta/components/FilterBar/internal/adapters/index.d.ts +15 -0
  220. package/dist/src/beta/components/FilterBar/internal/adapters/multiSelect.d.ts +6 -0
  221. package/dist/src/beta/components/FilterBar/internal/adapters/numericRange.d.ts +3 -0
  222. package/dist/src/beta/components/FilterBar/internal/adapters/singleSelect.d.ts +6 -0
  223. package/dist/src/beta/components/FilterBar/internal/adapters/types.d.ts +78 -0
  224. package/dist/src/beta/components/FilterBar/internal/types.d.ts +204 -61
  225. package/dist/src/beta/components/FilterBar/internal/utils/dateListLibraryOptions.d.ts +29 -0
  226. package/dist/src/beta/components/FilterBar/internal/utils/filter-state.d.ts +2 -38
  227. package/dist/src/beta/components/FilterBar/internal/utils/test.d.ts +14 -28
  228. package/dist/src/beta/components/FilterBar/internal/utils/value-compare.d.ts +14 -0
  229. package/dist/src/beta/components/MultiSelectField/internal/MultiSelectFieldComboboxMode.d.ts +1 -1
  230. package/dist/src/beta/components/MultiSelectField/internal/MultiSelectFieldSelectMode.d.ts +1 -1
  231. package/dist/src/beta/components/MultiSelectField/internal/types.d.ts +4 -2
  232. package/dist/src/beta/components/MultiSelectField/internal/useComboMultiple.d.ts +7 -5
  233. package/dist/src/beta/components/MultiSelectField/internal/useSelectModeMultiple.d.ts +5 -2
  234. package/dist/src/beta/components/MultiSelectField/types.d.ts +21 -36
  235. package/dist/src/beta/components/MultiSelectMenu/MultiSelectMenu.d.ts +1 -0
  236. package/dist/src/beta/components/MultiSelectMenu/types.d.ts +52 -12
  237. package/dist/src/beta/components/SavedFiltersButton/SavedFiltersButton.d.ts +40 -0
  238. package/dist/src/beta/components/SavedFiltersButton/index.d.ts +2 -0
  239. package/dist/src/beta/components/SavedFiltersButton/internal/AddSavedFilterDrawer.d.ts +27 -0
  240. package/dist/src/beta/components/SavedFiltersButton/internal/EditSavedFiltersDrawer.d.ts +38 -0
  241. package/dist/src/beta/components/SavedFiltersButton/types.d.ts +147 -0
  242. package/dist/src/beta/components/SelectField/types.d.ts +7 -11
  243. package/dist/src/beta/components/SelectMenu/internal/useMenuInteraction.d.ts +8 -1
  244. package/dist/src/beta/components/SelectMenu/types.d.ts +21 -1
  245. package/dist/src/beta/components/Table/DataTable/internal/DataTablePagination.d.ts +6 -0
  246. package/dist/src/beta/components/Table/DataTable/types.d.ts +43 -10
  247. package/dist/src/beta/components/Toolbar/internal/ToolbarContext.d.ts +3 -2
  248. package/dist/src/beta/components/index.d.ts +1 -0
  249. package/dist/src/internal/components/MenuFooter/MenuFooter.d.ts +43 -0
  250. package/dist/src/internal/components/OptionCheckbox.d.ts +6 -0
  251. package/dist/src/internal/components/OptionContentArea.d.ts +8 -0
  252. package/dist/src/internal/components/OptionRow.d.ts +10 -0
  253. package/dist/src/internal/components/OptionsPopover/OptionsPopover.d.ts +4 -4
  254. package/dist/src/internal/hooks/index.d.ts +2 -0
  255. package/dist/src/internal/hooks/useBulkActionRunner.d.ts +41 -0
  256. package/dist/src/internal/hooks/useConfirmationDraft.d.ts +21 -0
  257. package/dist/src/internal/types/bulkActionTypes.d.ts +39 -0
  258. package/dist/src/internal/types/confirmationTypes.d.ts +19 -0
  259. package/dist/src/internal/types/optionContent.d.ts +19 -0
  260. package/dist/src/internal/types/selectFieldInternalTypes.d.ts +2 -0
  261. package/dist/{stripInlineMarkdown-D_eHogvh.js → stripInlineMarkdown-C5DNxxwf.js} +2 -2
  262. package/dist/{stripInlineMarkdown-D_eHogvh.js.map → stripInlineMarkdown-C5DNxxwf.js.map} +1 -1
  263. package/dist/{syncFilterUtils-Dpp7gt05.js → syncFilterUtils-BEKek64h.js} +497 -458
  264. package/dist/syncFilterUtils-BEKek64h.js.map +1 -0
  265. package/dist/syncFilterUtils.css +96 -59
  266. package/dist/{useDrilldown-bIRsbg1m.js → useDrilldown-KZ9rRsXQ.js} +2 -2
  267. package/dist/{useDrilldown-bIRsbg1m.js.map → useDrilldown-KZ9rRsXQ.js.map} +1 -1
  268. package/dist/{Combobox-BXQFOwX4.js → useInfiniteCombobox-CknXmqlQ.js} +188 -13
  269. package/dist/useInfiniteCombobox-CknXmqlQ.js.map +1 -0
  270. package/dist/{useMenuInteraction-C4RU5Fdq.js → useMenuInteraction-CpAOHSJu.js} +118 -5
  271. package/dist/useMenuInteraction-CpAOHSJu.js.map +1 -0
  272. package/dist/useMenuInteraction.css +28 -0
  273. package/dist/{useToggleSelection-DBqr4HwT.js → useToggleSelection-B-Z80gy2.js} +53 -4
  274. package/dist/useToggleSelection-B-Z80gy2.js.map +1 -0
  275. package/package.json +1 -1
  276. package/dist/Checkbox.module-DVbXNsaN.js +0 -28
  277. package/dist/Checkbox.module-DVbXNsaN.js.map +0 -1
  278. package/dist/Combobox-BXQFOwX4.js.map +0 -1
  279. package/dist/DateFieldRange-CO2C776E.js.map +0 -1
  280. package/dist/FilterBar-GjMlLOME.js +0 -1442
  281. package/dist/FilterBar-GjMlLOME.js.map +0 -1
  282. package/dist/ListView.module-CKUQP3kf.js.map +0 -1
  283. package/dist/MultiSelectFieldSync-BxyQiVPQ.js.map +0 -1
  284. package/dist/MultiSelectMenuSync-BJfvZGf3.js.map +0 -1
  285. package/dist/SelectFieldSync-z8b41JZz.js.map +0 -1
  286. package/dist/SelectMenuSync-Cf1Zradm.js.map +0 -1
  287. package/dist/SelectTriggerBase-4o1cqEbR.js.map +0 -1
  288. package/dist/SelectTriggerBase.module-BgZSNZfE.js +0 -37
  289. package/dist/SelectTriggerBase.module-BgZSNZfE.js.map +0 -1
  290. package/dist/TextField.module-DkZwywjf.js +0 -23
  291. package/dist/TextField.module-DkZwywjf.js.map +0 -1
  292. package/dist/ToolbarButtonToggle-xvMWRxzC.js.map +0 -1
  293. package/dist/src/beta/components/FilterBar/FilterButton.d.ts +0 -30
  294. package/dist/src/beta/components/FilterBar/FilterSelect.d.ts +0 -29
  295. package/dist/syncFilterUtils-Dpp7gt05.js.map +0 -1
  296. package/dist/useInfiniteCombobox-WcRgC9p6.js +0 -179
  297. package/dist/useInfiniteCombobox-WcRgC9p6.js.map +0 -1
  298. package/dist/useMenuInteraction-C4RU5Fdq.js.map +0 -1
  299. package/dist/useToggleSelection-DBqr4HwT.js.map +0 -1
  300. /package/dist/{Combobox.css → useInfiniteCombobox.css} +0 -0
@@ -1,1442 +0,0 @@
1
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
- import * as React from 'react';
3
- import { useState, useEffect, createContext, useContext, useCallback, useMemo, useRef, forwardRef } from 'react';
4
- import { S as SvgClose } from './close-DZj38AEh.js';
5
- import { b as ToolbarItemWrapper, T as ToolbarButtonToggle, a as useToolbarSize, d as updateToolbarItemsTabIndex, e as handleToolbarKeyDown, c as ToolbarContext } from './ToolbarButtonToggle-xvMWRxzC.js';
6
- import { B as Button } from './Button-C_V2xQAs.js';
7
- import { S as SvgKeyboardArrowDown } from './keyboard_arrow_down-C8WQ38p1.js';
8
- import { S as SvgEvent } from './TimezoneMessage-BrKB_psP.js';
9
- import { D as DateTime } from './luxon-wpz4A-OQ.js';
10
- import { C as Chip } from './Chip-0-Yx9SGX.js';
11
- import { t as tabbable } from './usePopoverTransitionStates-CDXCdyKa.js';
12
- import { L as Listbox } from './Listbox-DRznPBCr.js';
13
- import { L as ListView } from './ListView-CIa981KJ.js';
14
- import { S as SearchField } from './SearchField-Dl7sh_M4.js';
15
- import { F as Flex } from './Flex-_orhvoxS.js';
16
- import { u as useDateFieldSingleConversion, a as useDateFieldSingleState, M as MaskedDateInput, b as DateFieldSingleCalendar, D as DateFieldSingle } from './DateFieldSingle-DjmHpn1y.js';
17
- import { u as useDateFieldRangeConversion, a as useDateFieldRangeState, M as MaskedDateRangeInput, b as DateFieldRangeCalendar, D as DateFieldRange } from './DateFieldRange-CO2C776E.js';
18
- import { c as cx } from './index-De1g9FRV.js';
19
- import { P as Popover } from './AiMark-DjOf60tj.js';
20
- import { a as SvgSearch } from './SearchField-CO9BHCYB.js';
21
- import { C as Checkbox } from './Checkbox-CVidv1sO.js';
22
- import { R as Radio } from './Radio-CSBetBV6.js';
23
- import { C as Combobox } from './Combobox-BXQFOwX4.js';
24
- import { B as ButtonToggle } from './ButtonToggle-jnDMPSyK.js';
25
- import { D as Drawer } from './Drawer-Dg35inxH.js';
26
- import { d as BreakpointSm, c as BreakpointMd, b as BreakpointLg, a as BreakpointXl, B as BreakpointXxl } from './primitive-DXlHdTFb.js';
27
- import { u as useLayoutPropsUtil } from './useLayoutPropsUtil-CB_zHDbW.js';
28
- import { u as useMergeRefs } from './useMergeRefs-Dfmtq9cI.js';
29
-
30
- import './FilterBar.css';function containerBreakpoint(containerWidth, name, min, max) {
31
- if ((min == null || containerWidth >= min) && (max == null || containerWidth < max)) {
32
- return {
33
- name,
34
- min,
35
- max,
36
- containerWidth,
37
- containerHeight: 0
38
- // Will be updated with actual height
39
- };
40
- }
41
- return void 0;
42
- }
43
- const getContainerBreakpoint = (containerWidth, containerHeight) => {
44
- if (!BreakpointSm) return;
45
- if (!BreakpointMd) return;
46
- if (!BreakpointLg) return;
47
- if (!BreakpointXl) return;
48
- if (!BreakpointXxl) return;
49
- const sm = parseInt(BreakpointSm.value);
50
- const md = parseInt(BreakpointMd.value);
51
- const lg = parseInt(BreakpointLg.value);
52
- const xl = parseInt(BreakpointXl.value);
53
- const xxl = parseInt(BreakpointXxl.value);
54
- const result = containerBreakpoint(containerWidth, "xs", void 0, sm) ?? containerBreakpoint(containerWidth, "sm", sm, md) ?? containerBreakpoint(containerWidth, "md", md, lg) ?? containerBreakpoint(containerWidth, "lg", lg, xl) ?? containerBreakpoint(containerWidth, "xl", xl, xxl) ?? containerBreakpoint(containerWidth, "xxl", xxl, void 0);
55
- return result ? { ...result, containerHeight } : void 0;
56
- };
57
- const useContainerQuery = (containerRef, props) => {
58
- const [size, setSize] = useState(
59
- void 0
60
- );
61
- useEffect(() => {
62
- if (!containerRef.current) return;
63
- const resizeObserver = new ResizeObserver((entries) => {
64
- for (const entry of entries) {
65
- const { width, height } = entry.contentRect;
66
- const breakpoint = getContainerBreakpoint(width, height);
67
- setSize(breakpoint);
68
- }
69
- });
70
- resizeObserver.observe(containerRef.current);
71
- const rect = containerRef.current.getBoundingClientRect();
72
- setSize(getContainerBreakpoint(rect.width, rect.height));
73
- return () => {
74
- resizeObserver.disconnect();
75
- };
76
- }, [containerRef, props?.disable]);
77
- return size;
78
- };
79
-
80
- const FilterGroupContext = createContext({
81
- filterGroupRef: { current: null },
82
- filters: [],
83
- updateFilter: () => {
84
- },
85
- onFilterChange: () => {
86
- },
87
- controlledFiltering: false,
88
- associatedContent: "",
89
- hiddenFilters: [],
90
- addHiddenFilter: () => {
91
- },
92
- removeHiddenFilter: () => {
93
- }
94
- });
95
-
96
- const styles = {
97
- "filter-button-trigger": "_filter-button-trigger_1ky9m_1",
98
- "filter-button-trigger--selected": "_filter-button-trigger--selected_1ky9m_5",
99
- "filter-button-content": "_filter-button-content_1ky9m_14",
100
- "filter-select-content": "_filter-select-content_1ky9m_19",
101
- "filter-button-buttons": "_filter-button-buttons_1ky9m_25",
102
- "filter-drawer-trigger": "_filter-drawer-trigger_1ky9m_29",
103
- "filter-drawer-trigger--chipped": "_filter-drawer-trigger--chipped_1ky9m_41",
104
- "filter-item": "_filter-item_1ky9m_65",
105
- "filter-select-search": "_filter-select-search_1ky9m_70"
106
- };
107
-
108
- const FilterItemWrapper = ({
109
- filter,
110
- children
111
- }) => {
112
- const { addHiddenFilter, removeHiddenFilter, filterGroupRef } = useContext(FilterGroupContext);
113
- const handleVisibilityChange = useCallback(
114
- (isVisible) => {
115
- if (filter) {
116
- if (isVisible) {
117
- removeHiddenFilter?.(filter);
118
- } else {
119
- addHiddenFilter?.(filter);
120
- }
121
- }
122
- },
123
- [filter, addHiddenFilter, removeHiddenFilter]
124
- );
125
- const props = useMemo(
126
- () => ({
127
- item: {
128
- itemType: "button",
129
- itemProps: {
130
- children: null,
131
- "aria-hidden": true
132
- }
133
- },
134
- children,
135
- className: styles["filter-item"],
136
- observerRoot: filterGroupRef.current,
137
- onVisibilityChange: handleVisibilityChange,
138
- rootMargin: "0px -80px 0px 0px"
139
- }),
140
- [children, filterGroupRef, handleVisibilityChange]
141
- );
142
- return /* @__PURE__ */ jsx(ToolbarItemWrapper, { ...props });
143
- };
144
-
145
- const getActiveFilters = (filters) => {
146
- return filters.filter((filter) => {
147
- switch (filter.type) {
148
- case "boolean":
149
- return filter.checked;
150
- case "custom":
151
- return filter.value !== void 0;
152
- case "singleSelect":
153
- return filter.selectedItem !== void 0;
154
- case "multiSelect":
155
- return filter.selectedItems && filter.selectedItems.length > 0;
156
- case "date":
157
- return filter.value !== null && filter.value !== void 0;
158
- case "dateRange":
159
- return filter.value !== null && filter.value !== void 0 && filter.value.startDate !== null && filter.value.endDate !== null;
160
- default:
161
- return false;
162
- }
163
- });
164
- };
165
- const checkActiveFilters = (filters) => {
166
- return getActiveFilters(filters).length > 0;
167
- };
168
- const resetFilters = (filters) => {
169
- return filters.map((filter) => {
170
- switch (filter.type) {
171
- case "boolean":
172
- return {
173
- ...filter,
174
- checked: false
175
- };
176
- case "custom":
177
- return {
178
- ...filter,
179
- value: void 0
180
- };
181
- case "singleSelect":
182
- return {
183
- ...filter,
184
- selectedItem: void 0
185
- };
186
- case "multiSelect":
187
- return {
188
- ...filter,
189
- selectedItems: []
190
- };
191
- case "date":
192
- case "dateRange":
193
- return {
194
- ...filter,
195
- value: null
196
- };
197
- default:
198
- return filter;
199
- }
200
- });
201
- };
202
- const updateSingleFilter = (filters, filterId, value) => {
203
- return filters.map((filter) => {
204
- if (filter.id !== filterId) return filter;
205
- switch (filter.type) {
206
- case "boolean":
207
- return {
208
- ...filter,
209
- checked: value
210
- };
211
- case "singleSelect":
212
- return {
213
- ...filter,
214
- selectedItem: value
215
- };
216
- case "multiSelect":
217
- return {
218
- ...filter,
219
- selectedItems: value
220
- };
221
- case "date":
222
- return {
223
- ...filter,
224
- value
225
- };
226
- case "dateRange":
227
- return {
228
- ...filter,
229
- value
230
- };
231
- case "custom":
232
- return {
233
- ...filter,
234
- value
235
- };
236
- default:
237
- return filter;
238
- }
239
- });
240
- };
241
- const hasChangedFilter = (a, b) => {
242
- if (Array.isArray(a) && Array.isArray(b)) {
243
- if (a.length !== b.length) return true;
244
- if (a.length === 0) return false;
245
- const aItems = a;
246
- const bItems = b;
247
- if (aItems[0] && "id" in aItems[0]) {
248
- const aIds = new Set(aItems.map((item) => item.id));
249
- return bItems.some(
250
- (item) => !aIds.has(item.id)
251
- );
252
- }
253
- return JSON.stringify(a) !== JSON.stringify(b);
254
- }
255
- if (a && b && typeof a === "object" && typeof b === "object" && "id" in a && "id" in b) {
256
- return a.id !== b.id;
257
- }
258
- return a !== b;
259
- };
260
- const getFilterSelectionValue = (filter) => {
261
- switch (filter.type) {
262
- case "boolean":
263
- return filter.checked;
264
- case "singleSelect":
265
- return filter.selectedItem;
266
- case "multiSelect":
267
- return filter.selectedItems;
268
- case "date":
269
- case "dateRange":
270
- case "custom":
271
- return filter.value;
272
- default:
273
- return void 0;
274
- }
275
- };
276
- const hasFilterSelectionChanged = (existingFilter, newFilter) => {
277
- const existingValue = getFilterSelectionValue(existingFilter);
278
- const newValue = getFilterSelectionValue(newFilter);
279
- return existingValue !== newValue;
280
- };
281
- const preserveFilterState = (newFilter, existingFilter) => {
282
- switch (newFilter.type) {
283
- case "boolean":
284
- return {
285
- ...newFilter,
286
- checked: existingFilter.checked
287
- };
288
- case "singleSelect":
289
- return {
290
- ...newFilter,
291
- selectedItem: existingFilter.selectedItem
292
- };
293
- case "multiSelect":
294
- return {
295
- ...newFilter,
296
- selectedItems: existingFilter.selectedItems
297
- };
298
- case "date":
299
- return {
300
- ...newFilter,
301
- value: existingFilter.value
302
- };
303
- case "dateRange":
304
- return {
305
- ...newFilter,
306
- value: existingFilter.value
307
- };
308
- case "custom":
309
- return {
310
- ...newFilter,
311
- value: existingFilter.value
312
- };
313
- default:
314
- return newFilter;
315
- }
316
- };
317
- const cloneFiltersWithItemRefs = (filters) => {
318
- return filters.map((filter) => {
319
- switch (filter.type) {
320
- case "singleSelect":
321
- return {
322
- ...filter,
323
- selectedItem: filter.selectedItem ? filter.items.find(
324
- (item) => item.id === filter.selectedItem?.id
325
- ) || filter.selectedItem : void 0
326
- };
327
- case "multiSelect":
328
- return {
329
- ...filter,
330
- selectedItems: filter.selectedItems ? filter.selectedItems.map(
331
- (selectedItem) => filter.items.find((item) => item.id === selectedItem.id) || selectedItem
332
- ) : []
333
- };
334
- case "date":
335
- return {
336
- ...filter,
337
- value: filter.value
338
- };
339
- case "dateRange":
340
- return {
341
- ...filter,
342
- value: filter.value
343
- };
344
- case "custom": {
345
- const { value } = filter;
346
- if (value === void 0) {
347
- return { ...filter, value: void 0 };
348
- }
349
- if (Array.isArray(value)) {
350
- return { ...filter, value: [...value] };
351
- }
352
- if (typeof value === "object" && value !== null) {
353
- return { ...filter, value: { ...value } };
354
- }
355
- return { ...filter, value };
356
- }
357
- default:
358
- return { ...filter };
359
- }
360
- });
361
- };
362
-
363
- const FilterToggleButton = ({
364
- id,
365
- checked,
366
- children,
367
- ...props
368
- }) => {
369
- const filter = {
370
- id,
371
- type: "boolean",
372
- checked,
373
- label: typeof children === "string" ? children : id
374
- };
375
- return /* @__PURE__ */ jsx(FilterItemWrapper, { filter, children: /* @__PURE__ */ jsx(
376
- ToolbarButtonToggle,
377
- {
378
- checked,
379
- isFilter: true,
380
- ...props,
381
- className: styles["filter-button-trigger"],
382
- "data-anv": "toolbar-boolean-filter",
383
- children
384
- }
385
- ) });
386
- };
387
-
388
- const FilterSelect = ({
389
- filter,
390
- draftValue,
391
- onDraftChange
392
- }) => {
393
- const isMultiSelect = filter.type === "multiSelect";
394
- const listRef = useRef(null);
395
- const shouldStabilizeItems = isMultiSelect && filter.hasSearch;
396
- const [stableItems, setStableItems] = useState(filter.items);
397
- const isSearchActiveRef = useRef(false);
398
- const expectingSearchUpdate = useRef(false);
399
- const displayItems = shouldStabilizeItems ? stableItems : filter.items;
400
- useEffect(() => {
401
- if (!shouldStabilizeItems) return;
402
- if (expectingSearchUpdate.current) {
403
- setStableItems(filter.items);
404
- expectingSearchUpdate.current = false;
405
- } else if (!isSearchActiveRef.current) {
406
- setStableItems(filter.items);
407
- }
408
- }, [filter.items, shouldStabilizeItems]);
409
- const handleSearch = useCallback(
410
- (e) => {
411
- const { value } = e.target;
412
- filter.onSearch?.(value);
413
- if (shouldStabilizeItems) {
414
- if (value.length > 0) {
415
- isSearchActiveRef.current = true;
416
- expectingSearchUpdate.current = true;
417
- } else {
418
- isSearchActiveRef.current = false;
419
- }
420
- }
421
- },
422
- [filter, shouldStabilizeItems]
423
- );
424
- const handleSearchClear = useCallback(() => {
425
- filter.onSearchClear?.();
426
- if (shouldStabilizeItems) {
427
- isSearchActiveRef.current = false;
428
- }
429
- }, [filter, shouldStabilizeItems]);
430
- const handleSearchKeyDown = useCallback(
431
- (e) => {
432
- if (e.key === "ArrowDown" && listRef.current) {
433
- e.preventDefault();
434
- const focusableElements = tabbable(listRef.current);
435
- if (focusableElements.length > 0) {
436
- focusableElements[0].focus();
437
- }
438
- }
439
- },
440
- []
441
- );
442
- const singleSelectList = useMemo(
443
- () => /* @__PURE__ */ jsx("div", { ref: listRef, children: /* @__PURE__ */ jsx(
444
- Listbox,
445
- {
446
- items: filter.items,
447
- selected: draftValue,
448
- onSelectionChange: (selected) => {
449
- onDraftChange(selected);
450
- },
451
- disableAutoSelectOnFocus: true,
452
- style: { paddingInline: "1rem", paddingBlockStart: "1rem" },
453
- children: ({ items }) => items.map((item) => /* @__PURE__ */ jsx(
454
- Listbox.Option,
455
- {
456
- item,
457
- disabled: item.disabled,
458
- children: item.label
459
- },
460
- item.id
461
- ))
462
- },
463
- filter.id
464
- ) }),
465
- [filter.id, filter.items, draftValue, onDraftChange]
466
- );
467
- const multiSelectList = useMemo(
468
- () => /* @__PURE__ */ jsx("div", { ref: listRef, children: /* @__PURE__ */ jsx(
469
- ListView,
470
- {
471
- items: displayItems,
472
- selected: Array.isArray(draftValue) ? draftValue : [],
473
- onSelectionChange: (selectedItems) => {
474
- const items = selectedItems;
475
- onDraftChange(items);
476
- },
477
- style: { paddingInline: "1rem", paddingBlockStart: "1rem" },
478
- children: ({ items }) => items.map((item) => /* @__PURE__ */ jsx(ListView.Option, { item, children: item.label }, item.id))
479
- },
480
- filter.id
481
- ) }),
482
- [filter.id, displayItems, draftValue, onDraftChange]
483
- );
484
- return /* @__PURE__ */ jsxs(Fragment, { children: [
485
- filter.hasSearch && /* @__PURE__ */ jsx(
486
- SearchField,
487
- {
488
- size: "small",
489
- className: styles["filter-select-search"],
490
- onChange: handleSearch,
491
- onClear: handleSearchClear,
492
- onKeyDown: handleSearchKeyDown,
493
- "data-anv": "filter-select-search"
494
- }
495
- ),
496
- isMultiSelect ? multiSelectList : singleSelectList
497
- ] });
498
- };
499
-
500
- const FilterDateSingle = ({
501
- filter,
502
- draftValue,
503
- onDraftChange
504
- }) => {
505
- const maskedDateInputRef = useRef(null);
506
- const handleChange = (change) => {
507
- onDraftChange(change.date);
508
- };
509
- const { value, onChange } = useDateFieldSingleConversion({
510
- value: draftValue,
511
- onChange: handleChange
512
- });
513
- const { handleInputChange, handleCalendarSelection } = useDateFieldSingleState({
514
- valueProp: value,
515
- onChange: (change) => onChange({ ...change, isDateValid: true })
516
- });
517
- return /* @__PURE__ */ jsxs(Flex, { gap: 4, direction: "column", children: [
518
- /* @__PURE__ */ jsx(
519
- MaskedDateInput,
520
- {
521
- mode: filter.mode,
522
- ref: maskedDateInputRef,
523
- onChange: handleInputChange,
524
- lastValidDate: value ?? null,
525
- autoComplete: "off"
526
- }
527
- ),
528
- /* @__PURE__ */ jsx(
529
- DateFieldSingleCalendar,
530
- {
531
- value: value ?? null,
532
- onSelection: handleCalendarSelection
533
- }
534
- )
535
- ] });
536
- };
537
-
538
- const FilterDateRange = ({
539
- filter,
540
- draftValue,
541
- onDraftChange
542
- }) => {
543
- const maskedDateRangeInputRef = useRef(null);
544
- const handleChange = (change) => {
545
- const hasCompleteRange = change.startDate && change.endDate;
546
- const isClearingRange = !change.startDate && !change.endDate;
547
- if (hasCompleteRange || isClearingRange) {
548
- onDraftChange({
549
- startDate: change.startDate,
550
- endDate: change.endDate
551
- });
552
- }
553
- };
554
- const { value, onChange } = useDateFieldRangeConversion({
555
- value: draftValue,
556
- onChange: handleChange
557
- });
558
- const { handleInputChange, handleCalendarSelection } = useDateFieldRangeState(
559
- {
560
- valueProp: value,
561
- onChange: (change) => {
562
- const hasCompleteRange = change.startDate && change.endDate;
563
- const isClearingRange = change.isInputEmpty;
564
- if (change.isInputValid && hasCompleteRange || isClearingRange) {
565
- onChange({ ...change, isDateRangeValid: true });
566
- }
567
- }
568
- }
569
- );
570
- return /* @__PURE__ */ jsxs(Flex, { gap: 4, direction: "column", children: [
571
- /* @__PURE__ */ jsx(
572
- MaskedDateRangeInput,
573
- {
574
- mode: filter.mode,
575
- ref: maskedDateRangeInputRef,
576
- onChange: handleInputChange,
577
- startDate: value?.startDate ?? null,
578
- endDate: value?.endDate ?? null,
579
- autoComplete: "off"
580
- }
581
- ),
582
- /* @__PURE__ */ jsx(
583
- DateFieldRangeCalendar,
584
- {
585
- startDate: value?.startDate ?? null,
586
- endDate: value?.endDate ?? null,
587
- onSelection: handleCalendarSelection
588
- }
589
- )
590
- ] });
591
- };
592
-
593
- const FilterButton = ({
594
- filter,
595
- children,
596
- className
597
- }) => {
598
- const [isOpen, setIsOpen] = useState(false);
599
- const { updateFilter, controlledFiltering } = useContext(FilterGroupContext);
600
- const toolbarSize = useToolbarSize();
601
- const [draftValue, setDraftValue] = useState(
602
- filter.type === "multiSelect" ? [] : void 0
603
- );
604
- const draftValueRef = useRef(draftValue);
605
- useEffect(() => {
606
- draftValueRef.current = draftValue;
607
- }, [draftValue]);
608
- const getCurrentFilterValue = useCallback(() => {
609
- switch (filter.type) {
610
- case "singleSelect":
611
- return filter.selectedItem;
612
- case "multiSelect":
613
- return filter.selectedItems || [];
614
- case "date":
615
- case "dateRange":
616
- return filter.value;
617
- case "custom":
618
- return filter.value;
619
- default:
620
- return void 0;
621
- }
622
- }, [filter]);
623
- const prevIsOpenRef = useRef(isOpen);
624
- const prevFilterRef = useRef(filter);
625
- useEffect(() => {
626
- const justOpened = isOpen && !prevIsOpenRef.current;
627
- prevIsOpenRef.current = isOpen;
628
- if (isOpen) {
629
- const shouldSync = justOpened || prevFilterRef.current && hasFilterSelectionChanged(prevFilterRef.current, filter);
630
- if (shouldSync) {
631
- const currentValue = getCurrentFilterValue();
632
- setDraftValue(currentValue);
633
- }
634
- prevFilterRef.current = filter;
635
- }
636
- }, [isOpen, filter]);
637
- const handleChange = useCallback(
638
- (value) => {
639
- if (hasChangedFilter(value, draftValueRef.current)) {
640
- draftValueRef.current = value;
641
- setDraftValue(value);
642
- if (!controlledFiltering) {
643
- updateFilter(filter.id, value, true);
644
- if (filter.type !== "multiSelect") {
645
- setIsOpen(false);
646
- }
647
- }
648
- }
649
- },
650
- [filter.id, filter.type, controlledFiltering, updateFilter]
651
- );
652
- const handleSubmit = useCallback(() => {
653
- const stateValue = getCurrentFilterValue();
654
- if (hasChangedFilter(draftValue, stateValue)) {
655
- updateFilter(filter.id, draftValue, true);
656
- }
657
- setIsOpen(false);
658
- }, [draftValue, getCurrentFilterValue, filter.id, updateFilter]);
659
- const handleCancel = useCallback(() => {
660
- if (!controlledFiltering) {
661
- setIsOpen(false);
662
- return;
663
- }
664
- const originalValue = getCurrentFilterValue();
665
- setDraftValue(originalValue);
666
- setIsOpen(false);
667
- }, [controlledFiltering, getCurrentFilterValue]);
668
- const getButtonLabel = useMemo(() => {
669
- switch (filter.type) {
670
- case "singleSelect": {
671
- const singleSelectFilter = filter;
672
- if (singleSelectFilter.selectedItem) {
673
- return `${filter.label}: ${singleSelectFilter.selectedItem.label}`;
674
- }
675
- return filter.label;
676
- }
677
- case "multiSelect": {
678
- const multiSelectFilter = filter;
679
- if (multiSelectFilter.selectedItems && multiSelectFilter.selectedItems.length > 0) {
680
- const selectionCount = multiSelectFilter.selectedItems.length.toString();
681
- return /* @__PURE__ */ jsxs(Fragment, { children: [
682
- filter.label,
683
- /* @__PURE__ */ jsx(
684
- Chip,
685
- {
686
- label: selectionCount,
687
- color: "#0265DC",
688
- size: "small",
689
- "aria-label": `${selectionCount} selected items`
690
- }
691
- )
692
- ] });
693
- }
694
- return filter.label;
695
- }
696
- case "date":
697
- if (filter.value) {
698
- const date = DateTime.fromISO(filter.value, { zone: "local" });
699
- return `${filter.label}: ${date.monthShort} ${date.day}, ${date.year}`;
700
- }
701
- return filter.label;
702
- case "dateRange":
703
- if (filter.value?.startDate && filter.value?.endDate) {
704
- const start = DateTime.fromISO(filter.value.startDate, {
705
- zone: "local"
706
- });
707
- const end = DateTime.fromISO(filter.value.endDate, {
708
- zone: "local"
709
- });
710
- const isSameYear = start.year === end.year;
711
- const formattedStart = isSameYear ? `${start.monthShort} ${start.day}` : `${start.monthShort} ${start.day}, ${start.year}`;
712
- return `${filter.label}: ${formattedStart} – ${end.monthShort} ${end.day}, ${end.year}`;
713
- }
714
- return filter.label;
715
- case "custom":
716
- if (filter.labelChipCount) {
717
- return /* @__PURE__ */ jsxs(Fragment, { children: [
718
- filter.label,
719
- /* @__PURE__ */ jsx(
720
- Chip,
721
- {
722
- label: filter.labelChipCount.toString(),
723
- color: "#0265DC",
724
- size: "small",
725
- "aria-label": `${filter.labelChipCount} selected items`
726
- }
727
- )
728
- ] });
729
- }
730
- return filter.label;
731
- default:
732
- return filter.label;
733
- }
734
- }, [filter]);
735
- const getContent = useMemo(() => {
736
- switch (filter.type) {
737
- case "custom":
738
- return filter.buttonRender({
739
- value: draftValue,
740
- onChange: handleChange
741
- });
742
- case "singleSelect":
743
- return /* @__PURE__ */ jsx(
744
- FilterSelect,
745
- {
746
- filter,
747
- draftValue,
748
- onDraftChange: handleChange
749
- }
750
- );
751
- case "multiSelect":
752
- return /* @__PURE__ */ jsx(
753
- FilterSelect,
754
- {
755
- filter,
756
- draftValue,
757
- onDraftChange: handleChange
758
- }
759
- );
760
- case "date":
761
- return /* @__PURE__ */ jsx(
762
- FilterDateSingle,
763
- {
764
- filter,
765
- draftValue,
766
- onDraftChange: handleChange
767
- }
768
- );
769
- case "dateRange":
770
- return /* @__PURE__ */ jsx(
771
- FilterDateRange,
772
- {
773
- filter,
774
- draftValue,
775
- onDraftChange: handleChange
776
- }
777
- );
778
- default:
779
- return children;
780
- }
781
- }, [filter, draftValue, handleChange, children]);
782
- const handleOutsidePress = () => {
783
- if (controlledFiltering) {
784
- handleCancel();
785
- } else if (filter.type === "multiSelect") {
786
- setIsOpen(false);
787
- } else {
788
- handleSubmit();
789
- }
790
- };
791
- const handleKeyDown = (e) => {
792
- if (e.key === "Enter") {
793
- if (!controlledFiltering && filter.type !== "multiSelect") {
794
- handleSubmit();
795
- }
796
- }
797
- };
798
- const triggerClasses = cx(styles["filter-button-trigger"], {
799
- [styles["filter-button-trigger--selected"]]: filter.type === "custom" && filter.value || filter.type === "singleSelect" && filter.selectedItem || filter.type === "multiSelect" && filter.selectedItems && filter.selectedItems.length > 0 || filter.type === "date" && filter.value || filter.type === "dateRange" && filter.value?.startDate && filter.value?.endDate
800
- });
801
- const contentClasses = cx(styles["filter-button-content"], className);
802
- const iconOptions = filter.type === "date" || filter.type === "dateRange" ? { before: SvgEvent } : { after: SvgKeyboardArrowDown };
803
- return /* @__PURE__ */ jsx(FilterItemWrapper, { filter, children: /* @__PURE__ */ jsxs(
804
- Popover,
805
- {
806
- open: isOpen,
807
- onClose: handleOutsidePress,
808
- placement: "bottom-start",
809
- modal: true,
810
- noPadding: filter.type === "multiSelect" || filter.type === "singleSelect",
811
- children: [
812
- /* @__PURE__ */ jsx(
813
- Popover.Button,
814
- {
815
- appearance: "ghost",
816
- size: toolbarSize,
817
- icon: iconOptions,
818
- "data-id": filter.id,
819
- "data-anv": "toolbar-button",
820
- className: triggerClasses,
821
- onClick: () => {
822
- setIsOpen(!isOpen);
823
- },
824
- children: getButtonLabel
825
- }
826
- ),
827
- /* @__PURE__ */ jsxs(Popover.Content, { onKeyDown: handleKeyDown, className: contentClasses, children: [
828
- getContent,
829
- controlledFiltering && /* @__PURE__ */ jsxs(
830
- Flex,
831
- {
832
- gap: 2,
833
- justifyContent: "flex-end",
834
- className: styles["filter-button-buttons"],
835
- children: [
836
- /* @__PURE__ */ jsx(Popover.Close, { size: "small", children: "Cancel" }),
837
- /* @__PURE__ */ jsx(Button, { appearance: "primary", size: "small", onClick: handleSubmit, children: "Apply" })
838
- ]
839
- }
840
- )
841
- ] })
842
- ]
843
- }
844
- ) });
845
- };
846
-
847
- const 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" }));
848
-
849
- const FilterDrawer = () => {
850
- const [open, setOpen] = useState(false);
851
- const {
852
- filters,
853
- updateFilter,
854
- onFilterChange,
855
- hiddenFilters,
856
- filterGroupRef
857
- } = useContext(FilterGroupContext);
858
- const toolbarSize = useToolbarSize();
859
- const containerQuery = useContainerQuery(filterGroupRef);
860
- const showInlineFilters = containerQuery && containerQuery.name !== "xs" && containerQuery.name !== "sm";
861
- const [draftFilters, setDraftFilters] = useState(filters);
862
- const [searchValues, setSearchValues] = useState({});
863
- const activeFiltersCount = getActiveFilters(
864
- !showInlineFilters ? filters : hiddenFilters
865
- ).length;
866
- const prevOpenRef = useRef(open);
867
- const prevFiltersRef = useRef(filters);
868
- useEffect(() => {
869
- const justOpened = open && !prevOpenRef.current;
870
- prevOpenRef.current = open;
871
- if (open) {
872
- const anySelectionChanged = prevFiltersRef.current.some(
873
- (prevFilter, index) => {
874
- const newFilter = filters[index];
875
- return newFilter && hasFilterSelectionChanged(prevFilter, newFilter);
876
- }
877
- );
878
- const shouldSync = justOpened || anySelectionChanged;
879
- if (shouldSync) {
880
- setDraftFilters(cloneFiltersWithItemRefs(filters));
881
- }
882
- prevFiltersRef.current = filters;
883
- }
884
- }, [open, filters]);
885
- const handleDraftChange = useCallback(
886
- (filterId, value) => {
887
- setDraftFilters((draft) => updateSingleFilter(draft, filterId, value));
888
- const filter = filters.find((f) => f.id === filterId);
889
- if ((filter?.type === "singleSelect" || filter?.type === "multiSelect") && filter.hasSearch && value) {
890
- setSearchValues((prev) => ({ ...prev, [filterId]: "" }));
891
- requestAnimationFrame(() => {
892
- filter.onSearch?.("");
893
- });
894
- }
895
- },
896
- [filters]
897
- );
898
- const clearDraftFilters = () => {
899
- setDraftFilters(resetFilters(draftFilters));
900
- };
901
- const hasActiveDraftFilters = checkActiveFilters(draftFilters);
902
- const filterForm = useMemo(
903
- () => draftFilters.map((draftFilter) => {
904
- const originalFilter = filters.find((f) => f.id === draftFilter.id);
905
- if (!originalFilter) return null;
906
- switch (draftFilter.type) {
907
- case "boolean":
908
- return /* @__PURE__ */ jsx(
909
- Checkbox,
910
- {
911
- label: draftFilter.label,
912
- checked: draftFilter.checked,
913
- onChange: (e) => handleDraftChange(draftFilter.id, e?.target.checked ?? false)
914
- },
915
- draftFilter.id
916
- );
917
- case "custom": {
918
- const customFilter = originalFilter;
919
- return /* @__PURE__ */ jsx("div", { children: customFilter.drawerRender?.({
920
- value: draftFilter.value,
921
- onChange: (value) => handleDraftChange(draftFilter.id, value)
922
- }) }, draftFilter.id);
923
- }
924
- case "singleSelect": {
925
- const singleSelectFilter = originalFilter;
926
- const draftSingleSelectFilter = draftFilter;
927
- if (singleSelectFilter.simpleDrawerVariant) {
928
- return /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Radio.Group, { legend: singleSelectFilter.label, children: singleSelectFilter.items.map((item) => /* @__PURE__ */ jsx(
929
- Radio,
930
- {
931
- name: `${singleSelectFilter.id}-radio`,
932
- value: item.id,
933
- label: item.label,
934
- checked: draftSingleSelectFilter.selectedItem?.id === item.id,
935
- onChange: (e) => {
936
- if (e?.target.checked) {
937
- const selected = singleSelectFilter.items.find(
938
- (opt) => opt.id === e.target.value
939
- );
940
- handleDraftChange(draftFilter.id, selected);
941
- }
942
- }
943
- },
944
- item.id
945
- )) }) }, draftFilter.id);
946
- } else {
947
- const selectedItem = draftSingleSelectFilter.selectedItem ? singleSelectFilter.items?.find(
948
- (item) => item.id === draftSingleSelectFilter.selectedItem?.id
949
- ) ?? null : null;
950
- return /* @__PURE__ */ jsxs(
951
- Combobox,
952
- {
953
- items: singleSelectFilter.items,
954
- selectedItem,
955
- onChange: (selectedItem2) => {
956
- handleDraftChange(draftFilter.id, selectedItem2);
957
- },
958
- itemToString: (item) => item?.label ?? "",
959
- disableFilter: singleSelectFilter.hasSearch,
960
- children: [
961
- singleSelectFilter.hasSearch ? /* @__PURE__ */ jsx(
962
- Combobox.SearchField,
963
- {
964
- label: draftSingleSelectFilter.label,
965
- prefix: { icon: { svg: SvgSearch } },
966
- placeholder: "Search...",
967
- size: "medium",
968
- value: draftSingleSelectFilter.selectedItem?.label || searchValues[draftFilter.id] || "",
969
- onChange: (e) => {
970
- const searchValue = e.target.value;
971
- setSearchValues((prev) => ({
972
- ...prev,
973
- [draftFilter.id]: searchValue
974
- }));
975
- singleSelectFilter.onSearch?.(searchValue);
976
- },
977
- onClear: () => {
978
- setSearchValues((prev) => ({
979
- ...prev,
980
- [draftFilter.id]: ""
981
- }));
982
- handleDraftChange(draftFilter.id, void 0);
983
- singleSelectFilter.onSearchClear?.();
984
- },
985
- "data-anv": "filter-drawer-combobox-search"
986
- }
987
- ) : /* @__PURE__ */ jsx(
988
- Combobox.SelectTrigger,
989
- {
990
- label: singleSelectFilter.label,
991
- placeholder: "Select an option...",
992
- size: "medium"
993
- }
994
- ),
995
- /* @__PURE__ */ jsx(Combobox.Content, { children: ({ items }) => /* @__PURE__ */ jsx(Combobox.List, { style: { padding: 0 }, children: items.map((item, i) => /* @__PURE__ */ jsx(Combobox.Item, { item, index: i, children: item.label }, item.id)) }) })
996
- ]
997
- },
998
- draftFilter.id
999
- );
1000
- }
1001
- }
1002
- case "multiSelect": {
1003
- const multiSelectFilter = originalFilter;
1004
- const draftMultiSelectFilter = draftFilter;
1005
- if (multiSelectFilter.simpleDrawerVariant) {
1006
- return /* @__PURE__ */ jsx(
1007
- Checkbox.Group,
1008
- {
1009
- legend: multiSelectFilter.label,
1010
- children: multiSelectFilter.items.map((item) => /* @__PURE__ */ jsx(
1011
- Checkbox,
1012
- {
1013
- label: item.label,
1014
- checked: draftMultiSelectFilter.selectedItems?.some(
1015
- (selected) => selected.id === item.id
1016
- ) ?? false,
1017
- onChange: (e) => {
1018
- const currentSelected = draftMultiSelectFilter.selectedItems || [];
1019
- if (e?.target.checked) {
1020
- handleDraftChange(draftFilter.id, [
1021
- ...currentSelected,
1022
- item
1023
- ]);
1024
- } else {
1025
- handleDraftChange(
1026
- draftFilter.id,
1027
- currentSelected.filter(
1028
- (selected) => selected.id !== item.id
1029
- )
1030
- );
1031
- }
1032
- }
1033
- },
1034
- item.id
1035
- ))
1036
- },
1037
- draftFilter.id
1038
- );
1039
- } else {
1040
- const hasActiveSearch = searchValues[draftFilter.id] && searchValues[draftFilter.id].length > 0;
1041
- return /* @__PURE__ */ jsxs(
1042
- Combobox,
1043
- {
1044
- items: multiSelectFilter.items,
1045
- selectedItems: draftMultiSelectFilter.selectedItems || [],
1046
- onChange: (selectedItems) => handleDraftChange(draftFilter.id, selectedItems),
1047
- itemToString: (item) => item?.label ?? "",
1048
- itemToKey: (item) => item?.id ?? "",
1049
- disableFilter: multiSelectFilter.hasSearch,
1050
- multiple: true,
1051
- disableCloseOnSelectItem: !hasActiveSearch,
1052
- children: [
1053
- multiSelectFilter.hasSearch ? /* @__PURE__ */ jsx(
1054
- Combobox.SearchField,
1055
- {
1056
- label: multiSelectFilter.label,
1057
- prefix: { icon: { svg: SvgSearch } },
1058
- placeholder: "Search...",
1059
- size: "medium",
1060
- value: searchValues[draftFilter.id] || "",
1061
- onChange: (e) => {
1062
- const searchValue = e.target.value;
1063
- setSearchValues((prev) => ({
1064
- ...prev,
1065
- [draftFilter.id]: searchValue
1066
- }));
1067
- multiSelectFilter.onSearch?.(searchValue);
1068
- },
1069
- onClear: () => {
1070
- setSearchValues((prev) => ({
1071
- ...prev,
1072
- [draftFilter.id]: ""
1073
- }));
1074
- handleDraftChange(draftFilter.id, []);
1075
- multiSelectFilter.onSearchClear?.();
1076
- },
1077
- "data-anv": "filter-drawer-combobox-search"
1078
- }
1079
- ) : /* @__PURE__ */ jsx(
1080
- Combobox.SelectTrigger,
1081
- {
1082
- label: multiSelectFilter.label,
1083
- placeholder: "Select options...",
1084
- size: "medium"
1085
- }
1086
- ),
1087
- /* @__PURE__ */ jsx(Combobox.Content, { children: ({ items }) => /* @__PURE__ */ jsx(Combobox.List, { style: { padding: 0 }, children: items.map((item, i) => /* @__PURE__ */ jsx(Combobox.Item, { item, index: i, children: item.label }, item.id)) }) })
1088
- ]
1089
- },
1090
- draftFilter.id
1091
- );
1092
- }
1093
- }
1094
- case "date": {
1095
- return /* @__PURE__ */ jsx(
1096
- DateFieldSingle,
1097
- {
1098
- label: draftFilter.label,
1099
- value: draftFilter.value,
1100
- onChange: (change) => {
1101
- handleDraftChange(draftFilter.id, change.date);
1102
- },
1103
- mode: draftFilter.mode
1104
- },
1105
- draftFilter.id
1106
- );
1107
- }
1108
- case "dateRange": {
1109
- return /* @__PURE__ */ jsx(
1110
- DateFieldRange,
1111
- {
1112
- label: draftFilter.label,
1113
- value: draftFilter.value,
1114
- onChange: (change) => {
1115
- handleDraftChange(draftFilter.id, {
1116
- startDate: change.startDate,
1117
- endDate: change.endDate
1118
- });
1119
- },
1120
- mode: draftFilter.mode
1121
- },
1122
- draftFilter.id
1123
- );
1124
- }
1125
- default:
1126
- return null;
1127
- }
1128
- }),
1129
- [draftFilters, filters, searchValues, handleDraftChange]
1130
- );
1131
- const applyFiltering = () => {
1132
- draftFilters.forEach((draftFilter) => {
1133
- switch (draftFilter.type) {
1134
- case "boolean":
1135
- updateFilter(draftFilter.id, draftFilter.checked, false);
1136
- break;
1137
- case "singleSelect":
1138
- updateFilter(
1139
- draftFilter.id,
1140
- draftFilter.selectedItem,
1141
- false
1142
- );
1143
- break;
1144
- case "multiSelect":
1145
- updateFilter(
1146
- draftFilter.id,
1147
- draftFilter.selectedItems,
1148
- false
1149
- );
1150
- break;
1151
- case "date":
1152
- case "dateRange":
1153
- case "custom":
1154
- updateFilter(draftFilter.id, draftFilter.value, false);
1155
- break;
1156
- }
1157
- });
1158
- onFilterChange?.(draftFilters);
1159
- setOpen(false);
1160
- };
1161
- const handleCancel = () => {
1162
- setOpen(false);
1163
- };
1164
- const hasHiddenActiveFilters = activeFiltersCount > 0;
1165
- const triggerClasses = cx(
1166
- styles["filter-button-trigger"],
1167
- styles["filter-drawer-trigger"],
1168
- {
1169
- [styles["filter-drawer-trigger--chipped"]]: hasHiddenActiveFilters
1170
- }
1171
- );
1172
- return /* @__PURE__ */ jsxs(Fragment, { children: [
1173
- /* @__PURE__ */ jsxs(
1174
- ButtonToggle,
1175
- {
1176
- "data-anv": "filter-group-drawer-trigger",
1177
- icon: { before: SvgTune },
1178
- onClick: () => setOpen(true),
1179
- className: triggerClasses,
1180
- checked: open,
1181
- size: toolbarSize,
1182
- children: [
1183
- "Filters",
1184
- hasHiddenActiveFilters && /* @__PURE__ */ jsx(
1185
- Chip,
1186
- {
1187
- size: "small",
1188
- color: "#0265DC",
1189
- label: activeFiltersCount.toString()
1190
- }
1191
- )
1192
- ]
1193
- }
1194
- ),
1195
- /* @__PURE__ */ jsxs(
1196
- Drawer,
1197
- {
1198
- "data-anv": "filter-group-drawer",
1199
- "data-testid": "filter-group-drawer",
1200
- open,
1201
- onClose: () => setOpen(false),
1202
- children: [
1203
- /* @__PURE__ */ jsx(Drawer.Content, { children: /* @__PURE__ */ jsx(Flex, { direction: "column", gap: 6, grow: 1, children: filterForm }) }),
1204
- /* @__PURE__ */ jsx(Drawer.Footer, { children: /* @__PURE__ */ jsxs(
1205
- Flex,
1206
- {
1207
- justifyContent: hasActiveDraftFilters ? "space-between" : "flex-end",
1208
- grow: 1,
1209
- children: [
1210
- hasActiveDraftFilters && /* @__PURE__ */ jsx(
1211
- Button,
1212
- {
1213
- appearance: "ghost",
1214
- icon: { before: SvgClose },
1215
- onClick: clearDraftFilters,
1216
- children: "Clear All Filters"
1217
- }
1218
- ),
1219
- /* @__PURE__ */ jsxs(Flex, { gap: "3", children: [
1220
- /* @__PURE__ */ jsx(Button, { onClick: handleCancel, children: "Cancel" }),
1221
- /* @__PURE__ */ jsx(Button, { appearance: "primary", onClick: applyFiltering, children: "Apply" })
1222
- ] })
1223
- ]
1224
- }
1225
- ) })
1226
- ]
1227
- }
1228
- )
1229
- ] });
1230
- };
1231
-
1232
- const FilterBar = forwardRef(
1233
- function FilterBarInner(props, ref) {
1234
- const { layoutStyles, componentProps } = useLayoutPropsUtil(props);
1235
- const {
1236
- filters: initialFilters,
1237
- onFilterChange,
1238
- controlledFiltering = false,
1239
- associatedContent,
1240
- size = "xsmall",
1241
- overflow = "wrap",
1242
- className,
1243
- style,
1244
- onKeyDown,
1245
- ...rest
1246
- } = componentProps;
1247
- const [filters, setFilters] = useState(initialFilters);
1248
- const [hiddenFilters, setHiddenFilters] = useState([]);
1249
- const filterBarRef = useRef(null);
1250
- const containerQuery = useContainerQuery(filterBarRef);
1251
- const showInlineFilters = containerQuery && containerQuery.name !== "xs" && containerQuery.name !== "sm";
1252
- useEffect(() => {
1253
- setFilters((prevFilters) => {
1254
- const existingFiltersMap = new Map(prevFilters.map((f) => [f.id, f]));
1255
- return initialFilters.map((newFilter) => {
1256
- const existingFilter = existingFiltersMap.get(newFilter.id);
1257
- if (!existingFilter) {
1258
- return newFilter;
1259
- }
1260
- if (!hasFilterSelectionChanged(existingFilter, newFilter)) {
1261
- return preserveFilterState(newFilter, existingFilter);
1262
- }
1263
- return newFilter;
1264
- });
1265
- });
1266
- }, [initialFilters]);
1267
- const updateFilter = useCallback(
1268
- (filterId, value, submit) => {
1269
- setFilters((prevFilters) => {
1270
- const updatedFilters = updateSingleFilter(
1271
- prevFilters,
1272
- filterId,
1273
- value
1274
- );
1275
- if (submit) {
1276
- onFilterChange?.(updatedFilters);
1277
- }
1278
- return updatedFilters;
1279
- });
1280
- },
1281
- [onFilterChange]
1282
- );
1283
- const addHiddenFilter = useCallback((filter) => {
1284
- setHiddenFilters((prev) => [...prev, filter]);
1285
- }, []);
1286
- const removeHiddenFilter = useCallback((filter) => {
1287
- setHiddenFilters((prev) => prev.filter((f) => f.id !== filter.id));
1288
- }, []);
1289
- const clearAllFilters = () => {
1290
- const resetAllFilters = resetFilters(filters);
1291
- setFilters(resetAllFilters);
1292
- onFilterChange?.(resetAllFilters);
1293
- requestAnimationFrame(() => {
1294
- if (filterBarRef.current) {
1295
- const firstFocusable = filterBarRef.current.querySelector(
1296
- 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
1297
- );
1298
- if (firstFocusable) {
1299
- firstFocusable.focus();
1300
- }
1301
- }
1302
- });
1303
- };
1304
- const hasActiveFilters = checkActiveFilters(filters);
1305
- const filterGroupControls = filters.map((filter) => {
1306
- switch (filter.type) {
1307
- case "boolean":
1308
- return /* @__PURE__ */ jsx(
1309
- FilterToggleButton,
1310
- {
1311
- id: filter.id,
1312
- checked: filter.checked,
1313
- onClick: () => {
1314
- updateFilter(filter.id, !filter.checked, true);
1315
- },
1316
- children: filter.label
1317
- },
1318
- filter.id
1319
- );
1320
- case "singleSelect":
1321
- case "multiSelect":
1322
- return /* @__PURE__ */ jsx(
1323
- FilterButton,
1324
- {
1325
- filter,
1326
- className: styles["filter-select-content"]
1327
- },
1328
- filter.id
1329
- );
1330
- case "custom":
1331
- case "date":
1332
- case "dateRange":
1333
- return /* @__PURE__ */ jsx(FilterButton, { filter }, filter.id);
1334
- default:
1335
- return null;
1336
- }
1337
- });
1338
- const toolbarContextValue = useMemo(
1339
- () => ({
1340
- overflowItems: [],
1341
- addItem: () => {
1342
- },
1343
- removeItem: () => {
1344
- },
1345
- toolbarRef: filterBarRef,
1346
- overflow,
1347
- size
1348
- }),
1349
- [overflow, size]
1350
- );
1351
- const filterGroupContextValue = useMemo(
1352
- () => ({
1353
- filterGroupRef: filterBarRef,
1354
- filters,
1355
- updateFilter,
1356
- onFilterChange,
1357
- controlledFiltering,
1358
- associatedContent,
1359
- hiddenFilters,
1360
- addHiddenFilter,
1361
- removeHiddenFilter
1362
- }),
1363
- [
1364
- filterBarRef,
1365
- filters,
1366
- updateFilter,
1367
- onFilterChange,
1368
- controlledFiltering,
1369
- associatedContent,
1370
- hiddenFilters,
1371
- addHiddenFilter,
1372
- removeHiddenFilter
1373
- ]
1374
- );
1375
- useEffect(() => {
1376
- if (filterBarRef.current) {
1377
- updateToolbarItemsTabIndex(filterBarRef.current);
1378
- }
1379
- }, [filters]);
1380
- const handleKeyDown = useCallback(
1381
- (event) => {
1382
- if (filterBarRef.current) {
1383
- handleToolbarKeyDown(event, filterBarRef.current);
1384
- }
1385
- onKeyDown?.(event);
1386
- },
1387
- [onKeyDown]
1388
- );
1389
- const styleCombined = {
1390
- ...style,
1391
- ...layoutStyles
1392
- };
1393
- return /* @__PURE__ */ jsx(ToolbarContext.Provider, { value: toolbarContextValue, children: /* @__PURE__ */ jsx(FilterGroupContext.Provider, { value: filterGroupContextValue, children: /* @__PURE__ */ jsx(
1394
- Flex,
1395
- {
1396
- ref: useMergeRefs([filterBarRef, ref]),
1397
- role: "toolbar",
1398
- "aria-label": `Filters for ${associatedContent}. Use arrow keys to navigate through filter controls.`,
1399
- "aria-orientation": "horizontal",
1400
- onKeyDown: handleKeyDown,
1401
- alignItems: "center",
1402
- gap: 1,
1403
- wrap: overflow === "collapse" ? "nowrap" : "wrap",
1404
- className,
1405
- style: styleCombined,
1406
- "data-anv": "filter-bar",
1407
- ...rest,
1408
- children: /* @__PURE__ */ jsxs(
1409
- Flex,
1410
- {
1411
- alignItems: "center",
1412
- gap: 1,
1413
- wrap: overflow === "collapse" ? "nowrap" : "wrap",
1414
- grow: 1,
1415
- "data-anv": "toolbar-content",
1416
- children: [
1417
- showInlineFilters && filterGroupControls,
1418
- /* @__PURE__ */ jsx(FilterDrawer, {}),
1419
- showInlineFilters && hasActiveFilters && /* @__PURE__ */ jsx(FilterItemWrapper, { children: /* @__PURE__ */ jsx(
1420
- Button,
1421
- {
1422
- appearance: "ghost",
1423
- size,
1424
- className: styles["filter-button-trigger"],
1425
- icon: {
1426
- before: SvgClose
1427
- },
1428
- onClick: clearAllFilters,
1429
- children: "Clear Filters"
1430
- }
1431
- ) })
1432
- ]
1433
- }
1434
- )
1435
- }
1436
- ) }) });
1437
- }
1438
- );
1439
- FilterBar.displayName = "FilterBar";
1440
-
1441
- export { FilterBar as F };
1442
- //# sourceMappingURL=FilterBar-GjMlLOME.js.map