@servicetitan/anvil2 3.0.6 → 3.0.8

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 (361) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/dist/{AiMark-BXL0sWIV.js → AiMark-CS6MvraM.js} +5 -4
  3. package/dist/{AiMark-BXL0sWIV.js.map → AiMark-CS6MvraM.js.map} +1 -1
  4. package/dist/AiMark.js +1 -1
  5. package/dist/{Alert-BNH0UD2s.js → Alert-CNDLoh6b.js} +2 -2
  6. package/dist/{Alert-BNH0UD2s.js.map → Alert-CNDLoh6b.js.map} +1 -1
  7. package/dist/Alert.js +1 -1
  8. package/dist/{AnvilProvider-J9DjoJiB.js → AnvilProvider-BFK29dL5.js} +3 -2
  9. package/dist/{AnvilProvider-J9DjoJiB.js.map → AnvilProvider-BFK29dL5.js.map} +1 -1
  10. package/dist/AnvilProvider.js +1 -1
  11. package/dist/{Avatar-FDHyqiCy.js → Avatar-Bl-Dxbhf.js} +7 -2
  12. package/dist/Avatar-Bl-Dxbhf.js.map +1 -0
  13. package/dist/{Avatar-B_cRQqKR.js → Avatar-CdAIJ5VK.js} +2 -2
  14. package/dist/{Avatar-B_cRQqKR.js.map → Avatar-CdAIJ5VK.js.map} +1 -1
  15. package/dist/Avatar.js +2 -2
  16. package/dist/{Breadcrumbs-Bzxbdu-S.js → Breadcrumbs--Xt6l_2L.js} +2 -2
  17. package/dist/{Breadcrumbs-Bzxbdu-S.js.map → Breadcrumbs--Xt6l_2L.js.map} +1 -1
  18. package/dist/Breadcrumbs.js +1 -1
  19. package/dist/{Calendar-DS5eWpGF.js → Calendar-5mAxtdNh.js} +2 -2
  20. package/dist/{Calendar-DS5eWpGF.js.map → Calendar-5mAxtdNh.js.map} +1 -1
  21. package/dist/{Calendar-BYNFAWpZ.js → Calendar-rITorBvD.js} +5 -3
  22. package/dist/{Calendar-BYNFAWpZ.js.map → Calendar-rITorBvD.js.map} +1 -1
  23. package/dist/Calendar.js +2 -2
  24. package/dist/{Checkbox-BeIzx_ZX.js → Checkbox-BYWhkYoK.js} +2 -2
  25. package/dist/{Checkbox-BeIzx_ZX.js.map → Checkbox-BYWhkYoK.js.map} +1 -1
  26. package/dist/{Checkbox-BB3BDJsK.js → Checkbox-DTzoDcJl.js} +3 -3
  27. package/dist/{Checkbox-BB3BDJsK.js.map → Checkbox-DTzoDcJl.js.map} +1 -1
  28. package/dist/Checkbox.js +1 -1
  29. package/dist/{Chip-D2k5X_wX.js → Chip-CyMNyEPR.js} +3 -3
  30. package/dist/{Chip-D2k5X_wX.js.map → Chip-CyMNyEPR.js.map} +1 -1
  31. package/dist/Chip.js +1 -1
  32. package/dist/Combobox.js +1 -2
  33. package/dist/Combobox.js.map +1 -1
  34. package/dist/{DataTable-0kOuVgSB.js → DataTable-Dwhwvm6R.js} +205 -78
  35. package/dist/DataTable-Dwhwvm6R.js.map +1 -0
  36. package/dist/DataTable.css +47 -5
  37. package/dist/{DateFieldRange-Be_I9GTp.js → DateFieldRange-BUug1tUy.js} +27 -15
  38. package/dist/DateFieldRange-BUug1tUy.js.map +1 -0
  39. package/dist/DateFieldRange.js +1 -1
  40. package/dist/{DateFieldSingle-CsrsY9i8.js → DateFieldSingle-DR7faQGD.js} +5 -5
  41. package/dist/{DateFieldSingle-CsrsY9i8.js.map → DateFieldSingle-DR7faQGD.js.map} +1 -1
  42. package/dist/DateFieldSingle.js +1 -1
  43. package/dist/{DateFieldYearless-m_Hl2gMY.js → DateFieldYearless-7MFcR7L6.js} +4 -4
  44. package/dist/{DateFieldYearless-m_Hl2gMY.js.map → DateFieldYearless-7MFcR7L6.js.map} +1 -1
  45. package/dist/DateFieldYearless.js +1 -1
  46. package/dist/{DateFieldYearlessRange-DNqSTBDr.js → DateFieldYearlessRange-DGtdyISH.js} +3 -3
  47. package/dist/{DateFieldYearlessRange-DNqSTBDr.js.map → DateFieldYearlessRange-DGtdyISH.js.map} +1 -1
  48. package/dist/DateFieldYearlessRange.js +1 -1
  49. package/dist/{DaysOfTheWeek-D58z_eF3.js → DaysOfTheWeek-C7oN9nIe.js} +3 -3
  50. package/dist/{DaysOfTheWeek-D58z_eF3.js.map → DaysOfTheWeek-C7oN9nIe.js.map} +1 -1
  51. package/dist/DaysOfTheWeek.js +1 -1
  52. package/dist/{Dialog-CD-SDfPT.js → Dialog-dE9c90iR.js} +4 -4
  53. package/dist/{Dialog-CD-SDfPT.js.map → Dialog-dE9c90iR.js.map} +1 -1
  54. package/dist/Dialog.js +1 -1
  55. package/dist/{Drawer-s2y0xcgV.js → Drawer-Dk0MsaOU.js} +3 -3
  56. package/dist/{Drawer-s2y0xcgV.js.map → Drawer-Dk0MsaOU.js.map} +1 -1
  57. package/dist/Drawer.js +1 -1
  58. package/dist/DrillDown.js +1 -1
  59. package/dist/{EditCard-B25pj0Jx.js → EditCard-DV2N7zWr.js} +2 -2
  60. package/dist/{EditCard-B25pj0Jx.js.map → EditCard-DV2N7zWr.js.map} +1 -1
  61. package/dist/EditCard.js +1 -1
  62. package/dist/{FieldLabel-D1qPAGtB.js → FieldLabel-VVn8GR64.js} +3 -3
  63. package/dist/{FieldLabel-D1qPAGtB.js.map → FieldLabel-VVn8GR64.js.map} +1 -1
  64. package/dist/FieldLabel.js +1 -1
  65. package/dist/FilterBar-CXGsoWw5.js +413 -0
  66. package/dist/FilterBar-CXGsoWw5.js.map +1 -0
  67. package/dist/FilterBar.js +1 -1
  68. package/dist/{InputMask-BDl09V4u.js → InputMask-VBHWGZGN.js} +3 -3
  69. package/dist/{InputMask-BDl09V4u.js.map → InputMask-VBHWGZGN.js.map} +1 -1
  70. package/dist/InputMask.js +1 -1
  71. package/dist/{ListView-CcRRh1ap.js → ListView-BUrfz75g.js} +6 -6
  72. package/dist/{ListView-CcRRh1ap.js.map → ListView-BUrfz75g.js.map} +1 -1
  73. package/dist/ListView.js +1 -1
  74. package/dist/{ListView.module-CKUQP3kf.js → ListView.module-DfqtCL3Q.js} +3 -3
  75. package/dist/ListView.module-DfqtCL3Q.js.map +1 -0
  76. package/dist/{Listbox-CvQHBFWb.js → Listbox-CRY-0BkS.js} +2 -2
  77. package/dist/{Listbox-CvQHBFWb.js.map → Listbox-CRY-0BkS.js.map} +1 -1
  78. package/dist/Listbox.js +1 -1
  79. package/dist/{Menu-W0c-xKdX.js → Menu-DNJ0YqjA.js} +11 -7
  80. package/dist/Menu-DNJ0YqjA.js.map +1 -0
  81. package/dist/Menu.js +1 -1
  82. package/dist/MenuFooter-CrsZdXvN.js +115 -0
  83. package/dist/MenuFooter-CrsZdXvN.js.map +1 -0
  84. package/dist/MenuFooter.css +28 -0
  85. package/dist/MultiSelectField.js +1 -1
  86. package/dist/{MultiSelectFieldSync-BMVROOjy.js → MultiSelectFieldSync-CIuy3aRD.js} +64 -79
  87. package/dist/MultiSelectFieldSync-CIuy3aRD.js.map +1 -0
  88. package/dist/MultiSelectFieldSync.css +72 -69
  89. package/dist/MultiSelectMenu.js +1 -1
  90. package/dist/{MultiSelectMenuSync-BNPp_2Bm.js → MultiSelectMenuSync-Drz8SEk9.js} +150 -46
  91. package/dist/MultiSelectMenuSync-Drz8SEk9.js.map +1 -0
  92. package/dist/{NumberField-BymFZhIJ.js → NumberField-bgYX7JGs.js} +3 -3
  93. package/dist/{NumberField-BymFZhIJ.js.map → NumberField-bgYX7JGs.js.map} +1 -1
  94. package/dist/NumberField.js +1 -1
  95. package/dist/{Page-SBy27-Wv.js → Page-BSHydn4p.js} +9 -9
  96. package/dist/{Page-SBy27-Wv.js.map → Page-BSHydn4p.js.map} +1 -1
  97. package/dist/Page.js +1 -1
  98. package/dist/{Pagination-Cm8-K6VH.js → Pagination-CAeyJ7Pl.js} +193 -27
  99. package/dist/Pagination-CAeyJ7Pl.js.map +1 -0
  100. package/dist/Pagination.css +4 -2
  101. package/dist/Pagination.js +1 -1
  102. package/dist/{Popover-8mTJoMy7.js → Popover-Cq5tirFz.js} +11 -5
  103. package/dist/Popover-Cq5tirFz.js.map +1 -0
  104. package/dist/Popover.js +1 -1
  105. package/dist/{ProgressBar-C1CkQHV5.js → ProgressBar-ByR50ln7.js} +2 -2
  106. package/dist/{ProgressBar-C1CkQHV5.js.map → ProgressBar-ByR50ln7.js.map} +1 -1
  107. package/dist/ProgressBar.js +1 -1
  108. package/dist/{Radio-BcHMk8dD.js → Radio-CPuctRpl.js} +2 -2
  109. package/dist/{Radio-BcHMk8dD.js.map → Radio-CPuctRpl.js.map} +1 -1
  110. package/dist/{Radio-D5WyQN2i.js → Radio-WlsZFRzX.js} +3 -3
  111. package/dist/{Radio-D5WyQN2i.js.map → Radio-WlsZFRzX.js.map} +1 -1
  112. package/dist/Radio.js +1 -1
  113. package/dist/{RichTextEditor-DstVbYch.js → RichTextEditor-CoPXdaWI.js} +78 -42
  114. package/dist/RichTextEditor-CoPXdaWI.js.map +1 -0
  115. package/dist/RichTextEditor.js +1 -1
  116. package/dist/SavedFiltersButton-DzJijqHz.js +651 -0
  117. package/dist/SavedFiltersButton-DzJijqHz.js.map +1 -0
  118. package/dist/SavedFiltersButton.css +8 -0
  119. package/dist/SavedFiltersButton.d.ts +1 -0
  120. package/dist/SavedFiltersButton.js +2 -0
  121. package/dist/SavedFiltersButton.js.map +1 -0
  122. package/dist/{SearchField-3tUPU8hH.js → SearchField-BMHJCVFu.js} +2 -2
  123. package/dist/{SearchField-3tUPU8hH.js.map → SearchField-BMHJCVFu.js.map} +1 -1
  124. package/dist/{SearchField-BcQZ5e0x.js → SearchField-fXc_vWEr.js} +2 -2
  125. package/dist/{SearchField-BcQZ5e0x.js.map → SearchField-fXc_vWEr.js.map} +1 -1
  126. package/dist/SearchField.js +1 -1
  127. package/dist/{SelectCard-BN-LI14f.js → SelectCard-DLWLHi_i.js} +3 -3
  128. package/dist/{SelectCard-BN-LI14f.js.map → SelectCard-DLWLHi_i.js.map} +1 -1
  129. package/dist/SelectCard.js +1 -1
  130. package/dist/SelectField.js +1 -1
  131. package/dist/{SelectFieldLabel-UbQT7fDD.js → SelectFieldLabel-vemffdmu.js} +2 -2
  132. package/dist/{SelectFieldLabel-UbQT7fDD.js.map → SelectFieldLabel-vemffdmu.js.map} +1 -1
  133. package/dist/{SelectFieldSync-BeDYbJ2M.js → SelectFieldSync-DlGiJ-Iy.js} +5 -4
  134. package/dist/{SelectFieldSync-BeDYbJ2M.js.map → SelectFieldSync-DlGiJ-Iy.js.map} +1 -1
  135. package/dist/SelectMenu.js +1 -1
  136. package/dist/{SelectMenuSync-C-PFemsQ.js → SelectMenuSync-CAweNjRL.js} +23 -9
  137. package/dist/SelectMenuSync-CAweNjRL.js.map +1 -0
  138. package/dist/{SelectOptions-Tr11Ckqw.js → SelectOptions-BGCap9fZ.js} +2 -2
  139. package/dist/{SelectOptions-Tr11Ckqw.js.map → SelectOptions-BGCap9fZ.js.map} +1 -1
  140. package/dist/{SelectTrigger-DTz7V-Xx.js → SelectTrigger-BbneVXMz.js} +3 -3
  141. package/dist/{SelectTrigger-DTz7V-Xx.js.map → SelectTrigger-BbneVXMz.js.map} +1 -1
  142. package/dist/SelectTrigger.js +1 -1
  143. package/dist/{SelectTriggerBase-Ds6I7Qbr.js → SelectTriggerBase-BjIOERXr.js} +136 -40
  144. package/dist/SelectTriggerBase-BjIOERXr.js.map +1 -0
  145. package/dist/{Switch-onmiKoRd.js → Switch-B6bKmpwN.js} +3 -3
  146. package/dist/{Switch-onmiKoRd.js.map → Switch-B6bKmpwN.js.map} +1 -1
  147. package/dist/Switch.js +1 -1
  148. package/dist/Table.js +1 -1
  149. package/dist/{Text-BTzgTpqu.js → Text-w2gWn4K6.js} +2 -2
  150. package/dist/{Text-BTzgTpqu.js.map → Text-w2gWn4K6.js.map} +1 -1
  151. package/dist/Text.js +1 -1
  152. package/dist/{TextField-WTYZJlX3.js → TextField-BQsCh5Nb.js} +2 -2
  153. package/dist/{TextField-WTYZJlX3.js.map → TextField-BQsCh5Nb.js.map} +1 -1
  154. package/dist/{TextField-rVfctM1E.js → TextField-DJ3gEIP6.js} +3 -3
  155. package/dist/{TextField-rVfctM1E.js.map → TextField-DJ3gEIP6.js.map} +1 -1
  156. package/dist/TextField.js +1 -1
  157. package/dist/{Textarea-PXjppEQ6.js → Textarea-BK4Vf84K.js} +3 -3
  158. package/dist/{Textarea-PXjppEQ6.js.map → Textarea-BK4Vf84K.js.map} +1 -1
  159. package/dist/Textarea.js +1 -1
  160. package/dist/{ThemeProvider-D4KdGCaP.js → ThemeProvider-BC6wbuLU.js} +4 -9
  161. package/dist/{ThemeProvider-D4KdGCaP.js.map → ThemeProvider-BC6wbuLU.js.map} +1 -1
  162. package/dist/ThemeProvider.js +1 -1
  163. package/dist/ThemeProvider.module-D9pNGYjP.js +8 -0
  164. package/dist/ThemeProvider.module-D9pNGYjP.js.map +1 -0
  165. package/dist/{TimeField-BJPXIv6W.js → TimeField-B4IW2B_o.js} +4 -4
  166. package/dist/{TimeField-BJPXIv6W.js.map → TimeField-B4IW2B_o.js.map} +1 -1
  167. package/dist/TimeField.js +1 -1
  168. package/dist/Toast.js +2 -2
  169. package/dist/{Toaster-CoChsMD0.js → Toaster-BGY2IzF5.js} +53 -48
  170. package/dist/Toaster-BGY2IzF5.js.map +1 -0
  171. package/dist/{Toaster-DXLc86VD.js → Toaster-DTF9qnTy.js} +2 -2
  172. package/dist/{Toaster-DXLc86VD.js.map → Toaster-DTF9qnTy.js.map} +1 -1
  173. package/dist/{Toolbar-Bt3kShho.js → Toolbar-DObrJ_S5.js} +5 -4
  174. package/dist/{Toolbar-Bt3kShho.js.map → Toolbar-DObrJ_S5.js.map} +1 -1
  175. package/dist/{Toolbar-BUd9eNkq.js → Toolbar-DRJGKk8D.js} +7 -6
  176. package/dist/{Toolbar-BUd9eNkq.js.map → Toolbar-DRJGKk8D.js.map} +1 -1
  177. package/dist/Toolbar.js +2 -2
  178. package/dist/{ToolbarButtonToggle-C06cqJ6F.js → ToolbarButtonToggle-BCKgA8FE.js} +5 -4
  179. package/dist/ToolbarButtonToggle-BCKgA8FE.js.map +1 -0
  180. package/dist/{Tooltip-yr1D06BE.js → Tooltip-DqS6xDUf.js} +27 -25
  181. package/dist/Tooltip-DqS6xDUf.js.map +1 -0
  182. package/dist/Tooltip.js +1 -1
  183. package/dist/TreeSelectField.d.ts +1 -0
  184. package/dist/TreeSelectField.js +2 -0
  185. package/dist/TreeSelectField.js.map +1 -0
  186. package/dist/TreeSelectFieldSync-Do5ffU0b.js +609 -0
  187. package/dist/TreeSelectFieldSync-Do5ffU0b.js.map +1 -0
  188. package/dist/TreeSelectFieldSync.css +173 -0
  189. package/dist/TreeSelectMenu.d.ts +1 -0
  190. package/dist/TreeSelectMenu.js +2 -0
  191. package/dist/TreeSelectMenu.js.map +1 -0
  192. package/dist/TreeSelectMenuSync-s05Ly6lj.js +413 -0
  193. package/dist/TreeSelectMenuSync-s05Ly6lj.js.map +1 -0
  194. package/dist/{YearlessDateInputWithPicker-BIcVgz-J.js → YearlessDateInputWithPicker-BHfFjCqE.js} +2 -2
  195. package/dist/{YearlessDateInputWithPicker-BIcVgz-J.js.map → YearlessDateInputWithPicker-BHfFjCqE.js.map} +1 -1
  196. package/dist/beta.js +15 -12
  197. package/dist/beta.js.map +1 -1
  198. package/dist/confirmationTypes-CG7xl50f.js +75 -0
  199. package/dist/confirmationTypes-CG7xl50f.js.map +1 -0
  200. package/dist/filter-state-DyMDjdRS.js +1867 -0
  201. package/dist/filter-state-DyMDjdRS.js.map +1 -0
  202. package/dist/{FilterBar.css → filter-state.css} +19 -33
  203. package/dist/{floating-ui.react-dom-CHrYz13o.js → floating-ui.react-dom-BIKT960u.js} +2 -2
  204. package/dist/{floating-ui.react-dom-CHrYz13o.js.map → floating-ui.react-dom-BIKT960u.js.map} +1 -1
  205. package/dist/{index-DVYRUKtW.js → index-fSKD4ey4.js} +79 -109
  206. package/dist/{index-DVYRUKtW.js.map → index-fSKD4ey4.js.map} +1 -1
  207. package/dist/index.js +43 -44
  208. package/dist/index.js.map +1 -1
  209. package/dist/keyboard_arrow_left-CiE1n99w.js +6 -0
  210. package/dist/keyboard_arrow_left-CiE1n99w.js.map +1 -0
  211. package/dist/keyboard_arrow_right-DMloHg_F.js +6 -0
  212. package/dist/keyboard_arrow_right-DMloHg_F.js.map +1 -0
  213. package/dist/portalScopeClassNames-jlZkdug_.js +7 -0
  214. package/dist/portalScopeClassNames-jlZkdug_.js.map +1 -0
  215. package/dist/src/beta/components/FilterBar/FilterBar.d.ts +12 -10
  216. package/dist/src/beta/components/FilterBar/FilterDateList.d.ts +15 -5
  217. package/dist/src/beta/components/FilterBar/FilterDateRange.d.ts +34 -29
  218. package/dist/src/beta/components/FilterBar/FilterDateSingle.d.ts +31 -22
  219. package/dist/src/beta/components/FilterBar/FilterDrawer.d.ts +1 -1
  220. package/dist/src/beta/components/FilterBar/FilterItemWrapper.d.ts +4 -12
  221. package/dist/src/beta/components/FilterBar/FilterNumericRange.d.ts +29 -0
  222. package/dist/src/beta/components/FilterBar/FilterPopoverButton.d.ts +86 -0
  223. package/dist/src/beta/components/FilterBar/FilterTextInput.d.ts +29 -0
  224. package/dist/src/beta/components/FilterBar/FilterToggleButton.d.ts +2 -2
  225. package/dist/src/beta/components/FilterBar/FilterTriggerButton.d.ts +50 -0
  226. package/dist/src/beta/components/FilterBar/index.d.ts +1 -1
  227. package/dist/src/beta/components/FilterBar/internal/FilterGroupContext.d.ts +5 -9
  228. package/dist/src/beta/components/FilterBar/internal/adapters/asyncMultiSelect.d.ts +6 -0
  229. package/dist/src/beta/components/FilterBar/internal/adapters/asyncSelect.d.ts +6 -0
  230. package/dist/src/beta/components/FilterBar/internal/adapters/asyncTree.d.ts +6 -0
  231. package/dist/src/beta/components/FilterBar/internal/adapters/boolean.d.ts +3 -0
  232. package/dist/src/beta/components/FilterBar/internal/adapters/custom.d.ts +3 -0
  233. package/dist/src/beta/components/FilterBar/internal/adapters/date.d.ts +5 -0
  234. package/dist/src/beta/components/FilterBar/internal/adapters/dateList.d.ts +5 -0
  235. package/dist/src/beta/components/FilterBar/internal/adapters/dateRange.d.ts +8 -0
  236. package/dist/src/beta/components/FilterBar/internal/adapters/index.d.ts +15 -0
  237. package/dist/src/beta/components/FilterBar/internal/adapters/multiSelect.d.ts +6 -0
  238. package/dist/src/beta/components/FilterBar/internal/adapters/numericRange.d.ts +3 -0
  239. package/dist/src/beta/components/FilterBar/internal/adapters/singleSelect.d.ts +6 -0
  240. package/dist/src/beta/components/FilterBar/internal/adapters/textInput.d.ts +3 -0
  241. package/dist/src/beta/components/FilterBar/internal/adapters/tree.d.ts +6 -0
  242. package/dist/src/beta/components/FilterBar/internal/adapters/types.d.ts +81 -0
  243. package/dist/src/beta/components/FilterBar/internal/types.d.ts +223 -61
  244. package/dist/src/beta/components/FilterBar/internal/utils/dateListLibraryOptions.d.ts +2 -2
  245. package/dist/src/beta/components/FilterBar/internal/utils/filter-state.d.ts +2 -40
  246. package/dist/src/beta/components/FilterBar/internal/utils/test.d.ts +16 -28
  247. package/dist/src/beta/components/FilterBar/internal/utils/value-compare.d.ts +14 -0
  248. package/dist/src/beta/components/MultiSelectField/internal/MultiSelectFieldComboboxMode.d.ts +1 -1
  249. package/dist/src/beta/components/MultiSelectField/internal/MultiSelectFieldSelectMode.d.ts +1 -1
  250. package/dist/src/beta/components/MultiSelectField/internal/types.d.ts +4 -2
  251. package/dist/src/beta/components/MultiSelectField/internal/useComboMultiple.d.ts +7 -5
  252. package/dist/src/beta/components/MultiSelectField/internal/useSelectModeMultiple.d.ts +5 -2
  253. package/dist/src/beta/components/MultiSelectField/types.d.ts +21 -36
  254. package/dist/src/beta/components/MultiSelectMenu/MultiSelectMenu.d.ts +1 -0
  255. package/dist/src/beta/components/MultiSelectMenu/types.d.ts +52 -12
  256. package/dist/src/beta/components/SavedFiltersButton/SavedFiltersButton.d.ts +40 -0
  257. package/dist/src/beta/components/SavedFiltersButton/index.d.ts +2 -0
  258. package/dist/src/beta/components/SavedFiltersButton/internal/AddSavedFilterDrawer.d.ts +27 -0
  259. package/dist/src/beta/components/SavedFiltersButton/internal/EditSavedFiltersDrawer.d.ts +38 -0
  260. package/dist/src/beta/components/SavedFiltersButton/types.d.ts +147 -0
  261. package/dist/src/beta/components/SelectField/types.d.ts +7 -11
  262. package/dist/src/beta/components/SelectMenu/internal/useMenuInteraction.d.ts +8 -1
  263. package/dist/src/beta/components/SelectMenu/types.d.ts +21 -1
  264. package/dist/src/beta/components/Table/DataTable/DataTable.d.ts +4 -6
  265. package/dist/src/beta/components/Table/DataTable/internal/DataTableBodyRow.d.ts +6 -1
  266. package/dist/src/beta/components/Table/DataTable/internal/DataTablePagination.d.ts +6 -0
  267. package/dist/src/beta/components/Table/DataTable/internal/context/focus/DTFocusContext.d.ts +1 -11
  268. package/dist/src/beta/components/Table/DataTable/internal/context/focus/useDTFocusDispatchContext.d.ts +0 -2
  269. package/dist/src/beta/components/Table/DataTable/internal/useColumnOrder.d.ts +1 -0
  270. package/dist/src/beta/components/Table/DataTable/types.d.ts +43 -10
  271. package/dist/src/beta/components/Toolbar/internal/ToolbarContext.d.ts +3 -2
  272. package/dist/src/beta/components/TreeSelectField/TreeSelectField.d.ts +68 -0
  273. package/dist/src/beta/components/TreeSelectField/TreeSelectFieldSync.d.ts +64 -0
  274. package/dist/src/beta/components/TreeSelectField/index.d.ts +3 -0
  275. package/dist/src/beta/components/TreeSelectField/internal/TreeContent.d.ts +31 -0
  276. package/dist/src/beta/components/TreeSelectField/internal/TreePanel.d.ts +56 -0
  277. package/dist/src/beta/components/TreeSelectField/internal/TreeRow.d.ts +56 -0
  278. package/dist/src/beta/components/TreeSelectField/internal/TreeSelectFieldInput.d.ts +82 -0
  279. package/dist/src/beta/components/TreeSelectField/internal/VirtualizedTreePanel.d.ts +57 -0
  280. package/dist/src/beta/components/TreeSelectField/internal/treeSync.d.ts +33 -0
  281. package/dist/src/beta/components/TreeSelectField/internal/treeUtils.d.ts +25 -0
  282. package/dist/src/beta/components/TreeSelectField/internal/types.d.ts +12 -0
  283. package/dist/src/beta/components/TreeSelectField/internal/useTree.d.ts +99 -0
  284. package/dist/src/beta/components/TreeSelectField/internal/useTreeCascade.d.ts +93 -0
  285. package/dist/src/beta/components/TreeSelectField/internal/useTreeKeyboard.d.ts +42 -0
  286. package/dist/src/beta/components/TreeSelectField/internal/useTreeLazyCascade.d.ts +56 -0
  287. package/dist/src/beta/components/TreeSelectField/internal/useTreeLoader.d.ts +58 -0
  288. package/dist/src/beta/components/TreeSelectField/stories/TreeSelectField.stories.data.d.ts +21 -0
  289. package/dist/src/beta/components/TreeSelectField/types.d.ts +124 -0
  290. package/dist/src/beta/components/TreeSelectMenu/TreeSelectMenu.d.ts +29 -0
  291. package/dist/src/beta/components/TreeSelectMenu/TreeSelectMenuSync.d.ts +65 -0
  292. package/dist/src/beta/components/TreeSelectMenu/index.d.ts +4 -0
  293. package/dist/src/beta/components/TreeSelectMenu/types.d.ts +103 -0
  294. package/dist/src/beta/components/index.d.ts +3 -0
  295. package/dist/src/components/Pagination/internal/Pagination.d.ts +1 -0
  296. package/dist/src/components/Pagination/internal/PaginationOverflowMenu.d.ts +12 -1
  297. package/dist/src/internal/components/MenuFooter/MenuFooter.d.ts +43 -0
  298. package/dist/src/internal/components/OptionCheckbox.d.ts +6 -0
  299. package/dist/src/internal/components/OptionContentArea.d.ts +8 -0
  300. package/dist/src/internal/components/OptionRow.d.ts +10 -0
  301. package/dist/src/internal/components/OptionsPopover/OptionsPopover.d.ts +4 -4
  302. package/dist/src/internal/functions/portalScopeClassNames.d.ts +14 -0
  303. package/dist/src/internal/hooks/index.d.ts +2 -0
  304. package/dist/src/internal/hooks/useBulkActionRunner.d.ts +41 -0
  305. package/dist/src/internal/hooks/useConfirmationDraft.d.ts +21 -0
  306. package/dist/src/internal/types/bulkActionTypes.d.ts +39 -0
  307. package/dist/src/internal/types/confirmationTypes.d.ts +19 -0
  308. package/dist/src/internal/types/optionContent.d.ts +19 -0
  309. package/dist/src/internal/types/selectFieldInternalTypes.d.ts +2 -0
  310. package/dist/src/internal/utils/arrayIdsEqual.d.ts +10 -0
  311. package/dist/src/internal/utils/index.d.ts +1 -0
  312. package/dist/{stripInlineMarkdown-C5DNxxwf.js → stripInlineMarkdown-C0bVmYgG.js} +2 -2
  313. package/dist/{stripInlineMarkdown-C5DNxxwf.js.map → stripInlineMarkdown-C0bVmYgG.js.map} +1 -1
  314. package/dist/{syncFilterUtils-COxBIkt6.js → syncFilterUtils-DZqeVWTS.js} +49 -385
  315. package/dist/syncFilterUtils-DZqeVWTS.js.map +1 -0
  316. package/dist/syncFilterUtils.css +21 -164
  317. package/dist/treeSync-Cz3H08cr.js +1453 -0
  318. package/dist/treeSync-Cz3H08cr.js.map +1 -0
  319. package/dist/treeSync.css +40 -0
  320. package/dist/useAdaptiveView-CeYKH0Me.js +386 -0
  321. package/dist/useAdaptiveView-CeYKH0Me.js.map +1 -0
  322. package/dist/useAdaptiveView.css +181 -0
  323. package/dist/useChipLayout-BWZfKDgd.js +51 -0
  324. package/dist/useChipLayout-BWZfKDgd.js.map +1 -0
  325. package/dist/{useDrilldown-KZ9rRsXQ.js → useDrilldown-BJ2dHHKV.js} +2 -2
  326. package/dist/{useDrilldown-KZ9rRsXQ.js.map → useDrilldown-BJ2dHHKV.js.map} +1 -1
  327. package/dist/{Combobox-Cp7M4-4r.js → useInfiniteCombobox-C6TDFfds.js} +206 -31
  328. package/dist/useInfiniteCombobox-C6TDFfds.js.map +1 -0
  329. package/dist/{useMenuInteraction-C4RU5Fdq.js → useMenuInteraction-NEJXUD4I.js} +5 -4
  330. package/dist/useMenuInteraction-NEJXUD4I.js.map +1 -0
  331. package/dist/{useToggleSelection-B5PnTuT2.js → useToggleSelection-Bn7h-gGD.js} +53 -4
  332. package/dist/useToggleSelection-Bn7h-gGD.js.map +1 -0
  333. package/package.json +3 -5
  334. package/dist/Avatar-FDHyqiCy.js.map +0 -1
  335. package/dist/Combobox-Cp7M4-4r.js.map +0 -1
  336. package/dist/DataTable-0kOuVgSB.js.map +0 -1
  337. package/dist/DateFieldRange-Be_I9GTp.js.map +0 -1
  338. package/dist/FilterBar-yysyZ-t1.js +0 -1797
  339. package/dist/FilterBar-yysyZ-t1.js.map +0 -1
  340. package/dist/ListView.module-CKUQP3kf.js.map +0 -1
  341. package/dist/Menu-W0c-xKdX.js.map +0 -1
  342. package/dist/MultiSelectFieldSync-BMVROOjy.js.map +0 -1
  343. package/dist/MultiSelectMenuSync-BNPp_2Bm.js.map +0 -1
  344. package/dist/Pagination-Cm8-K6VH.js.map +0 -1
  345. package/dist/Popover-8mTJoMy7.js.map +0 -1
  346. package/dist/RichTextEditor-DstVbYch.js.map +0 -1
  347. package/dist/SelectMenuSync-C-PFemsQ.js.map +0 -1
  348. package/dist/SelectTriggerBase-Ds6I7Qbr.js.map +0 -1
  349. package/dist/Toaster-CoChsMD0.js.map +0 -1
  350. package/dist/ToolbarButtonToggle-C06cqJ6F.js.map +0 -1
  351. package/dist/Tooltip-yr1D06BE.js.map +0 -1
  352. package/dist/keyboard_arrow_right-DZWNVytH.js +0 -8
  353. package/dist/keyboard_arrow_right-DZWNVytH.js.map +0 -1
  354. package/dist/src/beta/components/FilterBar/FilterButton.d.ts +0 -33
  355. package/dist/src/beta/components/FilterBar/FilterSelect.d.ts +0 -29
  356. package/dist/syncFilterUtils-COxBIkt6.js.map +0 -1
  357. package/dist/useInfiniteCombobox-WcRgC9p6.js +0 -179
  358. package/dist/useInfiniteCombobox-WcRgC9p6.js.map +0 -1
  359. package/dist/useMenuInteraction-C4RU5Fdq.js.map +0 -1
  360. package/dist/useToggleSelection-B5PnTuT2.js.map +0 -1
  361. /package/dist/{Combobox.css → useInfiniteCombobox.css} +0 -0
@@ -0,0 +1,1867 @@
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import { useMemo, forwardRef, createElement, createContext, useRef, useId, useState, useContext, useEffect, useCallback } from 'react';
3
+ import { C as Chip } from './Chip-CyMNyEPR.js';
4
+ import { d as ToolbarItemWrapper, u as useToolbarSize, T as ToolbarButtonToggle } from './ToolbarButtonToggle-BCKgA8FE.js';
5
+ import { S as SvgKeyboardArrowDown } from './keyboard_arrow_down-C8WQ38p1.js';
6
+ import { S as SvgEvent } from './TimezoneMessage-BrKB_psP.js';
7
+ import { c as cx } from './index-De1g9FRV.js';
8
+ import { B as Button } from './Button-C_V2xQAs.js';
9
+ import { M as MultiSelectField, a as MultiSelectFieldSync } from './MultiSelectFieldSync-CIuy3aRD.js';
10
+ import { M as MultiSelectMenu, a as MultiSelectMenuSync } from './MultiSelectMenuSync-Drz8SEk9.js';
11
+ import { S as SelectField, a as SelectFieldSync } from './SelectFieldSync-DlGiJ-Iy.js';
12
+ import { S as SelectMenu, a as SelectMenuSync } from './SelectMenuSync-CAweNjRL.js';
13
+ import { T as TreeSelectField, a as TreeSelectFieldSync } from './TreeSelectFieldSync-Do5ffU0b.js';
14
+ import { a as TreeSelectMenu, T as TreeSelectMenuSync } from './TreeSelectMenuSync-s05Ly6lj.js';
15
+ import { C as Checkbox } from './Checkbox-BYWhkYoK.js';
16
+ import { a as OptionsPopover } from './useAdaptiveView-CeYKH0Me.js';
17
+ import { M as MenuFooter } from './MenuFooter-CrsZdXvN.js';
18
+ import { D as DateTime } from './luxon-wpz4A-OQ.js';
19
+ import { u as useDateFieldSingleConversion, a as useDateFieldSingleState, M as MaskedDateInput, b as DateFieldSingleCalendar, D as DateFieldSingle } from './DateFieldSingle-DR7faQGD.js';
20
+ import { F as Flex } from './Flex-_orhvoxS.js';
21
+ import { u as useConfirmationDraft } from './confirmationTypes-CG7xl50f.js';
22
+ import { D as Dialog } from './Dialog-dE9c90iR.js';
23
+ import { u as useDateFieldRangeConversion, a as useDateFieldRangeState, M as MaskedDateRangeInput, b as DateFieldRangeCalendar, D as DateFieldRange } from './DateFieldRange-BUug1tUy.js';
24
+ import { w as warnOnce } from './warnOnce-Y9PRHcU4.js';
25
+ import { F as FieldLabel } from './FieldLabel-VVn8GR64.js';
26
+ import { G as Grid } from './Grid-BAN8WD_V.js';
27
+ import { N as NumberField } from './NumberField-bgYX7JGs.js';
28
+ import { T as Text } from './Text-w2gWn4K6.js';
29
+ import { R as Radio } from './Radio-CPuctRpl.js';
30
+ import { T as TextField } from './TextField-BQsCh5Nb.js';
31
+
32
+ import './filter-state.css';const FilterItemWrapper = ({ children }) => {
33
+ const props = useMemo(
34
+ () => ({
35
+ item: {
36
+ itemType: "button",
37
+ itemProps: {
38
+ children: null,
39
+ "aria-hidden": true
40
+ }
41
+ },
42
+ children
43
+ }),
44
+ [children]
45
+ );
46
+ return /* @__PURE__ */ jsx(ToolbarItemWrapper, { ...props });
47
+ };
48
+
49
+ const styles = {
50
+ "filter-button-trigger": "_filter-button-trigger_1kmgt_1",
51
+ "filter-button-trigger--selected": "_filter-button-trigger--selected_1kmgt_5",
52
+ "filter-drawer-trigger": "_filter-drawer-trigger_1kmgt_25",
53
+ "filter-drawer-trigger--chipped": "_filter-drawer-trigger--chipped_1kmgt_31",
54
+ "filter-numeric-range-separator": "_filter-numeric-range-separator_1kmgt_63"
55
+ };
56
+
57
+ const FilterTriggerButton = forwardRef(function FilterTriggerButton2({ filterId, label, isSelected, icon = "dropdown", className, ...rest }, ref) {
58
+ const toolbarSize = useToolbarSize();
59
+ const iconOptions = icon === "calendar" ? { before: SvgEvent } : { after: SvgKeyboardArrowDown };
60
+ const buttonClass = cx(
61
+ styles["filter-button-trigger"],
62
+ {
63
+ [styles["filter-button-trigger--selected"]]: isSelected
64
+ },
65
+ className
66
+ );
67
+ return /* @__PURE__ */ jsx(
68
+ Button,
69
+ {
70
+ ref,
71
+ appearance: "ghost",
72
+ size: toolbarSize,
73
+ icon: iconOptions,
74
+ "data-id": filterId,
75
+ "data-anv": "toolbar-button",
76
+ className: buttonClass,
77
+ ...rest,
78
+ children: label
79
+ }
80
+ );
81
+ });
82
+
83
+ const isSelected$9 = (filter) => !!filter.selectedOptions && filter.selectedOptions.length > 0;
84
+ const formatLabel$b = (filter) => {
85
+ const count = filter.selectedOptions?.length ?? 0;
86
+ if (count === 0) return filter.label;
87
+ const countLabel = count.toString();
88
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
89
+ filter.label,
90
+ /* @__PURE__ */ jsx(
91
+ Chip,
92
+ {
93
+ label: countLabel,
94
+ color: "#0265DC",
95
+ size: "small",
96
+ "aria-label": `${countLabel} selected items`
97
+ }
98
+ )
99
+ ] });
100
+ };
101
+ const passThroughMenuProps$5 = (filter) => {
102
+ const {
103
+ id: _id,
104
+ label: _label,
105
+ type: _type,
106
+ selectedOptions: _selectedOptions,
107
+ drawerOnly: _drawerOnly,
108
+ ...rest
109
+ } = filter;
110
+ return rest;
111
+ };
112
+ const asyncMultiSelectAdapter = {
113
+ getValue: (filter) => filter.selectedOptions ?? [],
114
+ setValue: (filter, value) => ({ ...filter, selectedOptions: value }),
115
+ reset: (filter) => ({ ...filter, selectedOptions: [] }),
116
+ isActive: isSelected$9,
117
+ preserveState: (newFilter, existingFilter) => ({
118
+ ...newFilter,
119
+ selectedOptions: existingFilter.selectedOptions
120
+ }),
121
+ // No items array to rebind against — the selectedOptions are canonical.
122
+ cloneWithItemRefs: (filter) => ({ ...filter }),
123
+ renderBarControl: ({ filter, updateFilter, controlledFiltering }) => /* @__PURE__ */ jsx(FilterItemWrapper, { children: /* @__PURE__ */ jsx(
124
+ MultiSelectMenu,
125
+ {
126
+ ...passThroughMenuProps$5(filter),
127
+ id: filter.id,
128
+ label: filter.label,
129
+ value: filter.selectedOptions ?? [],
130
+ onSelectedOptionsChange: (options) => updateFilter(filter.id, options, true),
131
+ confirmation: controlledFiltering,
132
+ clear: {
133
+ onClick: () => updateFilter(filter.id, [], true)
134
+ },
135
+ trigger: (triggerProps) => /* @__PURE__ */ jsx(
136
+ FilterTriggerButton,
137
+ {
138
+ ...triggerProps,
139
+ filterId: filter.id,
140
+ label: formatLabel$b(filter),
141
+ isSelected: isSelected$9(filter)
142
+ }
143
+ )
144
+ }
145
+ ) }, filter.id),
146
+ renderDrawer: ({ originalFilter, draftFilter, onDraftChange }) => /* @__PURE__ */ createElement(
147
+ MultiSelectField,
148
+ {
149
+ ...passThroughMenuProps$5(originalFilter),
150
+ key: draftFilter.id,
151
+ label: originalFilter.label,
152
+ value: draftFilter.selectedOptions ?? [],
153
+ onSelectedOptionsChange: (options) => onDraftChange(draftFilter.id, options)
154
+ }
155
+ ),
156
+ formatLabel: formatLabel$b,
157
+ isSelected: isSelected$9
158
+ };
159
+
160
+ const formatLabel$a = (filter) => {
161
+ if (filter.selectedOption) {
162
+ return `${filter.label}: ${filter.selectedOption.label}`;
163
+ }
164
+ return filter.label;
165
+ };
166
+ const isSelected$8 = (filter) => filter.selectedOption !== void 0;
167
+ const passThroughMenuProps$4 = (filter) => {
168
+ const {
169
+ id: _id,
170
+ label: _label,
171
+ type: _type,
172
+ selectedOption: _selectedOption,
173
+ drawerOnly: _drawerOnly,
174
+ ...rest
175
+ } = filter;
176
+ return rest;
177
+ };
178
+ const asyncSelectAdapter = {
179
+ getValue: (filter) => filter.selectedOption,
180
+ setValue: (filter, value) => ({ ...filter, selectedOption: value }),
181
+ reset: (filter) => ({ ...filter, selectedOption: void 0 }),
182
+ isActive: isSelected$8,
183
+ preserveState: (newFilter, existingFilter) => ({
184
+ ...newFilter,
185
+ selectedOption: existingFilter.selectedOption
186
+ }),
187
+ // No items array to rebind against — the selectedOption is canonical.
188
+ cloneWithItemRefs: (filter) => ({ ...filter }),
189
+ renderBarControl: ({ filter, updateFilter }) => /* @__PURE__ */ jsx(FilterItemWrapper, { children: /* @__PURE__ */ jsx(
190
+ SelectMenu,
191
+ {
192
+ ...passThroughMenuProps$4(filter),
193
+ id: filter.id,
194
+ label: filter.label,
195
+ value: filter.selectedOption ?? null,
196
+ onSelectedOptionChange: (option) => updateFilter(filter.id, option ?? void 0, true),
197
+ clear: {
198
+ onClick: () => updateFilter(filter.id, void 0, true)
199
+ },
200
+ trigger: (triggerProps) => /* @__PURE__ */ jsx(
201
+ FilterTriggerButton,
202
+ {
203
+ ...triggerProps,
204
+ filterId: filter.id,
205
+ label: formatLabel$a(filter),
206
+ isSelected: isSelected$8(filter)
207
+ }
208
+ )
209
+ }
210
+ ) }, filter.id),
211
+ renderDrawer: ({ originalFilter, draftFilter, onDraftChange }) => /* @__PURE__ */ createElement(
212
+ SelectField,
213
+ {
214
+ ...passThroughMenuProps$4(originalFilter),
215
+ key: draftFilter.id,
216
+ label: originalFilter.label,
217
+ value: draftFilter.selectedOption ?? null,
218
+ onSelectedOptionChange: (option) => onDraftChange(draftFilter.id, option ?? void 0)
219
+ }
220
+ ),
221
+ formatLabel: formatLabel$a,
222
+ isSelected: isSelected$8
223
+ };
224
+
225
+ const isSelected$7 = (filter) => !!filter.selectedNodes && filter.selectedNodes.length > 0;
226
+ const formatLabel$9 = (filter) => {
227
+ const count = filter.selectedNodes?.length ?? 0;
228
+ if (count === 0) return filter.label;
229
+ const countLabel = count.toString();
230
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
231
+ filter.label,
232
+ /* @__PURE__ */ jsx(
233
+ Chip,
234
+ {
235
+ label: countLabel,
236
+ color: "#0265DC",
237
+ size: "small",
238
+ "aria-label": `${countLabel} selected items`
239
+ }
240
+ )
241
+ ] });
242
+ };
243
+ const passThroughMenuProps$3 = (filter) => {
244
+ const {
245
+ id: _id,
246
+ label: _label,
247
+ type: _type,
248
+ selectedNodes: _selectedNodes,
249
+ drawerOnly: _drawerOnly,
250
+ ...rest
251
+ } = filter;
252
+ return rest;
253
+ };
254
+ const asyncTreeAdapter = {
255
+ getValue: (filter) => filter.selectedNodes ?? [],
256
+ setValue: (filter, value) => ({ ...filter, selectedNodes: value }),
257
+ reset: (filter) => ({ ...filter, selectedNodes: [] }),
258
+ isActive: isSelected$7,
259
+ preserveState: (newFilter, existingFilter) => ({
260
+ ...newFilter,
261
+ selectedNodes: existingFilter.selectedNodes
262
+ }),
263
+ // No items array to rebind against — the selected node values are canonical.
264
+ cloneWithItemRefs: (filter) => ({ ...filter }),
265
+ renderBarControl: ({ filter, updateFilter, controlledFiltering }) => /* @__PURE__ */ jsx(FilterItemWrapper, { children: /* @__PURE__ */ jsx(
266
+ TreeSelectMenu,
267
+ {
268
+ ...passThroughMenuProps$3(filter),
269
+ id: filter.id,
270
+ label: filter.label,
271
+ value: filter.selectedNodes ?? [],
272
+ onSelectedOptionsChange: (nodes) => updateFilter(filter.id, nodes, true),
273
+ confirmation: controlledFiltering,
274
+ clear: {
275
+ onClick: () => updateFilter(filter.id, [], true),
276
+ disabled: !isSelected$7(filter)
277
+ },
278
+ trigger: (triggerProps) => /* @__PURE__ */ jsx(
279
+ FilterTriggerButton,
280
+ {
281
+ ...triggerProps,
282
+ filterId: filter.id,
283
+ label: formatLabel$9(filter),
284
+ isSelected: isSelected$7(filter)
285
+ }
286
+ )
287
+ }
288
+ ) }, filter.id),
289
+ renderDrawer: ({ originalFilter, draftFilter, onDraftChange }) => /* @__PURE__ */ createElement(
290
+ TreeSelectField,
291
+ {
292
+ ...passThroughMenuProps$3(originalFilter),
293
+ key: draftFilter.id,
294
+ label: originalFilter.label,
295
+ value: draftFilter.selectedNodes ?? [],
296
+ onSelectedOptionsChange: (nodes) => onDraftChange(draftFilter.id, nodes)
297
+ }
298
+ ),
299
+ formatLabel: formatLabel$9,
300
+ isSelected: isSelected$7
301
+ };
302
+
303
+ const FilterToggleButton = ({
304
+ id,
305
+ checked,
306
+ children,
307
+ ...props
308
+ }) => {
309
+ return /* @__PURE__ */ jsx(FilterItemWrapper, { children: /* @__PURE__ */ jsx(
310
+ ToolbarButtonToggle,
311
+ {
312
+ id,
313
+ checked,
314
+ isFilter: true,
315
+ ...props,
316
+ className: styles["filter-button-trigger"],
317
+ "data-anv": "toolbar-boolean-filter",
318
+ children
319
+ }
320
+ ) });
321
+ };
322
+
323
+ const booleanAdapter = {
324
+ getValue: (filter) => filter.checked,
325
+ setValue: (filter, value) => ({ ...filter, checked: value }),
326
+ reset: (filter) => ({ ...filter, checked: false }),
327
+ isActive: (filter) => filter.checked,
328
+ preserveState: (newFilter, existingFilter) => ({
329
+ ...newFilter,
330
+ checked: existingFilter.checked
331
+ }),
332
+ cloneWithItemRefs: (filter) => ({ ...filter }),
333
+ renderBarControl: ({ filter, updateFilter }) => /* @__PURE__ */ jsx(
334
+ FilterToggleButton,
335
+ {
336
+ id: filter.id,
337
+ checked: filter.checked,
338
+ onClick: () => updateFilter(filter.id, !filter.checked, true),
339
+ children: filter.label
340
+ },
341
+ filter.id
342
+ ),
343
+ renderDrawer: ({ draftFilter, onDraftChange }) => /* @__PURE__ */ jsx(
344
+ Checkbox,
345
+ {
346
+ label: draftFilter.label,
347
+ checked: draftFilter.checked,
348
+ onChange: (e) => onDraftChange(draftFilter.id, e?.target.checked ?? false)
349
+ },
350
+ draftFilter.id
351
+ ),
352
+ formatLabel: (filter) => filter.label,
353
+ isSelected: (filter) => filter.checked
354
+ };
355
+
356
+ const FilterGroupContext = createContext({
357
+ filterGroupRef: { current: null },
358
+ filters: [],
359
+ updateFilter: () => {
360
+ },
361
+ onFilterChange: () => {
362
+ },
363
+ controlledFiltering: false,
364
+ associatedContent: "",
365
+ showInlineFilters: false,
366
+ drawerOnlyFilters: []
367
+ });
368
+
369
+ const hasChangedFilter = (a, b) => {
370
+ if (Array.isArray(a) && Array.isArray(b)) {
371
+ if (a.length !== b.length) return true;
372
+ if (a.length === 0) return false;
373
+ const aItems = a;
374
+ const bItems = b;
375
+ if (aItems[0] && "id" in aItems[0]) {
376
+ const aIds = new Set(aItems.map((item) => item.id));
377
+ return bItems.some(
378
+ (item) => !aIds.has(item.id)
379
+ );
380
+ }
381
+ return JSON.stringify(a) !== JSON.stringify(b);
382
+ }
383
+ if (a && b && typeof a === "object" && typeof b === "object" && "id" in a && "id" in b) {
384
+ if (a.id !== b.id) return true;
385
+ if ("value" in a && "value" in b) {
386
+ return JSON.stringify(a.value) !== JSON.stringify(b.value);
387
+ }
388
+ return false;
389
+ }
390
+ return a !== b;
391
+ };
392
+
393
+ const FilterPopoverButton = (props) => {
394
+ const { filter, label, isSelected, committedValue, children } = props;
395
+ const commitOnSelect = props.commitOnSelect === true;
396
+ const initialValue = commitOnSelect ? void 0 : props.initialValue;
397
+ const keepOpenOnUncontrolledChange = !commitOnSelect && (props.keepOpenOnUncontrolledChange ?? false);
398
+ const triggerRef = useRef(null);
399
+ const popoverId = useId();
400
+ const [isOpen, setIsOpen] = useState(false);
401
+ const { updateFilter, controlledFiltering } = useContext(FilterGroupContext);
402
+ const [draftValue, setDraftValue] = useState(initialValue);
403
+ const draftValueRef = useRef(draftValue);
404
+ useEffect(() => {
405
+ draftValueRef.current = draftValue;
406
+ }, [draftValue]);
407
+ const prevIsOpenRef = useRef(isOpen);
408
+ const prevCommittedValueRef = useRef(committedValue);
409
+ useEffect(() => {
410
+ if (commitOnSelect) return;
411
+ const justOpened = isOpen && !prevIsOpenRef.current;
412
+ prevIsOpenRef.current = isOpen;
413
+ if (isOpen) {
414
+ const shouldSync = justOpened || prevCommittedValueRef.current !== committedValue;
415
+ if (shouldSync) {
416
+ setDraftValue(committedValue);
417
+ }
418
+ prevCommittedValueRef.current = committedValue;
419
+ }
420
+ }, [isOpen, committedValue, commitOnSelect]);
421
+ const closeAndRestoreFocus = useCallback(() => {
422
+ setIsOpen(false);
423
+ triggerRef.current?.focus();
424
+ }, []);
425
+ const handleDraftChange = useCallback(
426
+ (value) => {
427
+ if (commitOnSelect) {
428
+ if (hasChangedFilter(value, committedValue)) {
429
+ updateFilter(filter.id, value, true);
430
+ }
431
+ closeAndRestoreFocus();
432
+ return;
433
+ }
434
+ if (!hasChangedFilter(value, draftValueRef.current)) return;
435
+ draftValueRef.current = value;
436
+ setDraftValue(value);
437
+ if (!controlledFiltering) {
438
+ updateFilter(filter.id, value, true);
439
+ if (!keepOpenOnUncontrolledChange) {
440
+ closeAndRestoreFocus();
441
+ }
442
+ }
443
+ },
444
+ [
445
+ commitOnSelect,
446
+ committedValue,
447
+ controlledFiltering,
448
+ filter.id,
449
+ keepOpenOnUncontrolledChange,
450
+ updateFilter,
451
+ closeAndRestoreFocus
452
+ ]
453
+ );
454
+ const handleApply = useCallback(() => {
455
+ if (hasChangedFilter(draftValue, committedValue)) {
456
+ updateFilter(filter.id, draftValue, true);
457
+ }
458
+ closeAndRestoreFocus();
459
+ }, [
460
+ draftValue,
461
+ committedValue,
462
+ filter.id,
463
+ updateFilter,
464
+ closeAndRestoreFocus
465
+ ]);
466
+ const handleCancel = useCallback(() => {
467
+ if (!controlledFiltering) {
468
+ closeAndRestoreFocus();
469
+ return;
470
+ }
471
+ setDraftValue(committedValue);
472
+ closeAndRestoreFocus();
473
+ }, [controlledFiltering, committedValue, closeAndRestoreFocus]);
474
+ const handlePopoverClose = useCallback(() => {
475
+ if (commitOnSelect) {
476
+ setIsOpen(false);
477
+ return;
478
+ }
479
+ if (controlledFiltering) {
480
+ setDraftValue(committedValue);
481
+ setIsOpen(false);
482
+ } else if (keepOpenOnUncontrolledChange) {
483
+ setIsOpen(false);
484
+ } else {
485
+ if (hasChangedFilter(draftValueRef.current, committedValue)) {
486
+ updateFilter(filter.id, draftValueRef.current, true);
487
+ }
488
+ setIsOpen(false);
489
+ }
490
+ }, [
491
+ commitOnSelect,
492
+ controlledFiltering,
493
+ keepOpenOnUncontrolledChange,
494
+ committedValue,
495
+ filter.id,
496
+ updateFilter
497
+ ]);
498
+ const bodyValue = commitOnSelect ? committedValue : draftValue;
499
+ const showConfirmationFooter = controlledFiltering && !commitOnSelect;
500
+ useEffect(() => {
501
+ if (!isOpen || !showConfirmationFooter) return;
502
+ const popoverEl = document.getElementById(popoverId);
503
+ if (!popoverEl) return;
504
+ const handler = (e) => {
505
+ if (e.key !== "Enter" || e.defaultPrevented) return;
506
+ handleApply();
507
+ };
508
+ popoverEl.addEventListener("keydown", handler);
509
+ return () => popoverEl.removeEventListener("keydown", handler);
510
+ }, [isOpen, showConfirmationFooter, popoverId, handleApply]);
511
+ return /* @__PURE__ */ jsxs(FilterItemWrapper, { children: [
512
+ /* @__PURE__ */ jsx(
513
+ FilterTriggerButton,
514
+ {
515
+ ref: triggerRef,
516
+ filterId: filter.id,
517
+ label,
518
+ isSelected,
519
+ "aria-haspopup": "dialog",
520
+ "aria-expanded": isOpen,
521
+ "aria-controls": popoverId,
522
+ onClick: () => setIsOpen((prev) => !prev),
523
+ onKeyDown: (e) => {
524
+ if (e.key === "Escape" && isOpen) {
525
+ e.preventDefault();
526
+ handlePopoverClose();
527
+ }
528
+ }
529
+ }
530
+ ),
531
+ /* @__PURE__ */ jsx(
532
+ OptionsPopover,
533
+ {
534
+ id: popoverId,
535
+ referenceElement: triggerRef,
536
+ open: isOpen,
537
+ onClose: handlePopoverClose,
538
+ footer: showConfirmationFooter ? /* @__PURE__ */ jsx(
539
+ MenuFooter,
540
+ {
541
+ confirmation: {
542
+ onApply: handleApply,
543
+ onCancel: handleCancel
544
+ }
545
+ }
546
+ ) : void 0,
547
+ children: children({ value: bodyValue, onChange: handleDraftChange })
548
+ }
549
+ )
550
+ ] });
551
+ };
552
+
553
+ const formatLabel$8 = (filter) => {
554
+ if (filter.labelChipCount) {
555
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
556
+ filter.label,
557
+ /* @__PURE__ */ jsx(
558
+ Chip,
559
+ {
560
+ label: filter.labelChipCount.toString(),
561
+ color: "#0265DC",
562
+ size: "small",
563
+ "aria-label": `${filter.labelChipCount} selected items`
564
+ }
565
+ )
566
+ ] });
567
+ }
568
+ return filter.label;
569
+ };
570
+ const customAdapter = {
571
+ getValue: (filter) => filter.value,
572
+ setValue: (filter, value) => ({ ...filter, value }),
573
+ reset: (filter) => ({ ...filter, value: void 0 }),
574
+ isActive: (filter) => filter.value !== void 0,
575
+ preserveState: (newFilter, existingFilter) => ({
576
+ ...newFilter,
577
+ value: existingFilter.value
578
+ }),
579
+ cloneWithItemRefs: (filter) => {
580
+ const { value } = filter;
581
+ if (value === void 0) return { ...filter, value: void 0 };
582
+ if (Array.isArray(value)) return { ...filter, value: [...value] };
583
+ if (typeof value === "object" && value !== null) {
584
+ return { ...filter, value: { ...value } };
585
+ }
586
+ return { ...filter, value };
587
+ },
588
+ renderBarControl: ({ filter }) => /* @__PURE__ */ jsx(
589
+ FilterPopoverButton,
590
+ {
591
+ filter,
592
+ label: formatLabel$8(filter),
593
+ isSelected: filter.value !== void 0,
594
+ committedValue: filter.value,
595
+ initialValue: void 0,
596
+ children: ({ value, onChange }) => (
597
+ // drawer-only customs are filtered out before reaching
598
+ // renderBarControl, so this guard is purely for TS narrowing across
599
+ // the CustomFilter union (buttonRender is `never` when drawerOnly).
600
+ filter.drawerOnly ? null : filter.buttonRender({ value, onChange })
601
+ )
602
+ },
603
+ filter.id
604
+ ),
605
+ renderDrawer: ({ originalFilter, draftFilter, onDraftChange }) => /* @__PURE__ */ jsx("div", { children: originalFilter.drawerRender?.({
606
+ value: draftFilter.value,
607
+ onChange: (value) => onDraftChange(draftFilter.id, value)
608
+ }) }, draftFilter.id),
609
+ formatLabel: formatLabel$8,
610
+ isSelected: (filter) => filter.value !== void 0
611
+ };
612
+
613
+ const FilterDateSingle = (props) => {
614
+ if (props.variant === "inline") {
615
+ return /* @__PURE__ */ jsx(
616
+ Body$1,
617
+ {
618
+ filter: props.filter,
619
+ value: props.draftValue,
620
+ onChange: props.onDraftChange
621
+ }
622
+ );
623
+ }
624
+ return /* @__PURE__ */ jsx(PopoverShell$1, { ...props });
625
+ };
626
+ const Body$1 = ({
627
+ filter,
628
+ value: draftValue,
629
+ onChange: onDraftChange
630
+ }) => {
631
+ const maskedDateInputRef = useRef(null);
632
+ const handleChange = (change) => {
633
+ onDraftChange(change.date);
634
+ };
635
+ const { value, onChange } = useDateFieldSingleConversion({
636
+ value: draftValue,
637
+ onChange: handleChange
638
+ });
639
+ const { handleInputChange, handleCalendarSelection } = useDateFieldSingleState({
640
+ valueProp: value,
641
+ onChange: (change) => onChange({ ...change, isDateValid: true })
642
+ });
643
+ return /* @__PURE__ */ jsxs(Flex, { gap: 4, direction: "column", children: [
644
+ /* @__PURE__ */ jsx(
645
+ MaskedDateInput,
646
+ {
647
+ mode: filter.mode,
648
+ ref: maskedDateInputRef,
649
+ onChange: handleInputChange,
650
+ lastValidDate: value ?? null,
651
+ autoComplete: "off"
652
+ }
653
+ ),
654
+ /* @__PURE__ */ jsx(
655
+ DateFieldSingleCalendar,
656
+ {
657
+ value: value ?? null,
658
+ onSelection: handleCalendarSelection
659
+ }
660
+ )
661
+ ] });
662
+ };
663
+ const PopoverShell$1 = ({
664
+ filter,
665
+ committedValue,
666
+ onCommit,
667
+ controlledFiltering,
668
+ label,
669
+ isSelected,
670
+ clear
671
+ }) => {
672
+ const triggerRef = useRef(null);
673
+ const popoverId = useId();
674
+ const [isOpen, setIsOpen] = useState(false);
675
+ const isEqual = useCallback(
676
+ (a, b) => !hasChangedFilter(a, b),
677
+ []
678
+ );
679
+ const { displayValue, setDraft, apply, cancel } = useConfirmationDraft(
680
+ {
681
+ value: committedValue,
682
+ onCommit,
683
+ isOpen,
684
+ enabled: controlledFiltering,
685
+ isEqual
686
+ }
687
+ );
688
+ const handleClose = useCallback(() => {
689
+ if (controlledFiltering) {
690
+ cancel();
691
+ }
692
+ setIsOpen(false);
693
+ }, [controlledFiltering, cancel]);
694
+ const handleApply = useCallback(() => {
695
+ apply();
696
+ setIsOpen(false);
697
+ }, [apply]);
698
+ return /* @__PURE__ */ jsxs(FilterItemWrapper, { children: [
699
+ /* @__PURE__ */ jsx(
700
+ FilterTriggerButton,
701
+ {
702
+ ref: triggerRef,
703
+ filterId: filter.id,
704
+ label,
705
+ isSelected,
706
+ icon: "calendar",
707
+ "aria-haspopup": "dialog",
708
+ "aria-expanded": isOpen,
709
+ onClick: () => setIsOpen((prev) => !prev)
710
+ }
711
+ ),
712
+ /* @__PURE__ */ jsx(
713
+ OptionsPopover,
714
+ {
715
+ id: popoverId,
716
+ referenceElement: triggerRef,
717
+ open: isOpen,
718
+ onClose: handleClose,
719
+ footer: clear || controlledFiltering ? /* @__PURE__ */ jsx(
720
+ MenuFooter,
721
+ {
722
+ clear: clear ? {
723
+ ...clear,
724
+ onClick: () => {
725
+ clear.onClick();
726
+ setIsOpen(false);
727
+ triggerRef.current?.focus();
728
+ }
729
+ } : void 0,
730
+ confirmation: controlledFiltering ? {
731
+ onApply: handleApply,
732
+ onCancel: handleClose
733
+ } : void 0
734
+ }
735
+ ) : void 0,
736
+ children: /* @__PURE__ */ jsx(Body$1, { filter, value: displayValue, onChange: setDraft })
737
+ }
738
+ )
739
+ ] });
740
+ };
741
+
742
+ const formatLabel$7 = (filter) => {
743
+ if (filter.value) {
744
+ const date = DateTime.fromISO(filter.value, { zone: "local" });
745
+ return `${filter.label}: ${date.monthShort} ${date.day}, ${date.year}`;
746
+ }
747
+ return filter.label;
748
+ };
749
+ const dateAdapter = {
750
+ getValue: (filter) => filter.value ?? null,
751
+ setValue: (filter, value) => ({ ...filter, value }),
752
+ reset: (filter) => ({ ...filter, value: null }),
753
+ isActive: (filter) => filter.value !== null && filter.value !== void 0,
754
+ preserveState: (newFilter, existingFilter) => ({
755
+ ...newFilter,
756
+ value: existingFilter.value
757
+ }),
758
+ cloneWithItemRefs: (filter) => ({ ...filter, value: filter.value ?? null }),
759
+ renderBarControl: ({ filter, updateFilter, controlledFiltering }) => /* @__PURE__ */ jsx(
760
+ FilterDateSingle,
761
+ {
762
+ filter,
763
+ committedValue: filter.value ?? null,
764
+ onCommit: (value) => updateFilter(filter.id, value, true),
765
+ controlledFiltering,
766
+ label: formatLabel$7(filter),
767
+ isSelected: !!filter.value,
768
+ clear: {
769
+ onClick: () => updateFilter(filter.id, null, true)
770
+ }
771
+ },
772
+ filter.id
773
+ ),
774
+ renderDrawer: ({ draftFilter, onDraftChange }) => /* @__PURE__ */ jsx(
775
+ DateFieldSingle,
776
+ {
777
+ label: draftFilter.label,
778
+ value: draftFilter.value ?? null,
779
+ onChange: (change) => onDraftChange(draftFilter.id, change.date),
780
+ mode: draftFilter.mode
781
+ },
782
+ draftFilter.id
783
+ ),
784
+ formatLabel: formatLabel$7,
785
+ isSelected: (filter) => !!filter.value
786
+ };
787
+
788
+ const FilterDateRange = (props) => {
789
+ if (props.variant === "inline") {
790
+ return /* @__PURE__ */ jsx(
791
+ Body,
792
+ {
793
+ filter: props.filter,
794
+ value: props.draftValue,
795
+ onChange: props.onDraftChange
796
+ }
797
+ );
798
+ }
799
+ return /* @__PURE__ */ jsx(PopoverShell, { ...props });
800
+ };
801
+ const Body = ({
802
+ filter,
803
+ value: draftValue,
804
+ onChange: onDraftChange
805
+ }) => {
806
+ const maskedDateRangeInputRef = useRef(null);
807
+ const handleChange = (change) => {
808
+ const hasCompleteRange = change.startDate && change.endDate;
809
+ const isClearingRange = !change.startDate && !change.endDate;
810
+ if (hasCompleteRange || isClearingRange) {
811
+ onDraftChange({
812
+ startDate: change.startDate,
813
+ endDate: change.endDate
814
+ });
815
+ }
816
+ };
817
+ const { value, onChange } = useDateFieldRangeConversion({
818
+ value: draftValue,
819
+ onChange: handleChange
820
+ });
821
+ const { handleInputChange, handleCalendarSelection } = useDateFieldRangeState(
822
+ {
823
+ valueProp: value,
824
+ onChange: (change) => {
825
+ const hasCompleteRange = change.startDate && change.endDate;
826
+ const isClearingRange = change.isInputEmpty;
827
+ if (change.isInputValid && hasCompleteRange || isClearingRange) {
828
+ onChange({ ...change, isDateRangeValid: true });
829
+ }
830
+ }
831
+ }
832
+ );
833
+ return /* @__PURE__ */ jsxs(Flex, { gap: 4, direction: "column", children: [
834
+ /* @__PURE__ */ jsx(
835
+ MaskedDateRangeInput,
836
+ {
837
+ mode: filter.mode,
838
+ ref: maskedDateRangeInputRef,
839
+ onChange: handleInputChange,
840
+ startDate: value?.startDate ?? null,
841
+ endDate: value?.endDate ?? null,
842
+ autoComplete: "off"
843
+ }
844
+ ),
845
+ /* @__PURE__ */ jsx(
846
+ DateFieldRangeCalendar,
847
+ {
848
+ startDate: value?.startDate ?? null,
849
+ endDate: value?.endDate ?? null,
850
+ onSelection: handleCalendarSelection
851
+ }
852
+ )
853
+ ] });
854
+ };
855
+ const PopoverShell = ({
856
+ filter,
857
+ committedValue,
858
+ onCommit,
859
+ controlledFiltering,
860
+ label,
861
+ isSelected,
862
+ clear
863
+ }) => {
864
+ const triggerRef = useRef(null);
865
+ const popoverId = useId();
866
+ const [isOpen, setIsOpen] = useState(false);
867
+ const isEqual = useCallback(
868
+ (a, b) => !hasChangedFilter(a, b),
869
+ []
870
+ );
871
+ const { displayValue, setDraft, apply, cancel } = useConfirmationDraft(
872
+ {
873
+ value: committedValue,
874
+ onCommit,
875
+ isOpen,
876
+ enabled: controlledFiltering,
877
+ isEqual
878
+ }
879
+ );
880
+ const handleClose = useCallback(() => {
881
+ if (controlledFiltering) {
882
+ cancel();
883
+ }
884
+ setIsOpen(false);
885
+ }, [controlledFiltering, cancel]);
886
+ const handleApply = useCallback(() => {
887
+ apply();
888
+ setIsOpen(false);
889
+ }, [apply]);
890
+ return /* @__PURE__ */ jsxs(FilterItemWrapper, { children: [
891
+ /* @__PURE__ */ jsx(
892
+ FilterTriggerButton,
893
+ {
894
+ ref: triggerRef,
895
+ filterId: filter.id,
896
+ label,
897
+ isSelected,
898
+ icon: "calendar",
899
+ "aria-haspopup": "dialog",
900
+ "aria-expanded": isOpen,
901
+ onClick: () => setIsOpen((prev) => !prev)
902
+ }
903
+ ),
904
+ /* @__PURE__ */ jsx(
905
+ OptionsPopover,
906
+ {
907
+ id: popoverId,
908
+ referenceElement: triggerRef,
909
+ open: isOpen,
910
+ onClose: handleClose,
911
+ footer: clear || controlledFiltering ? /* @__PURE__ */ jsx(
912
+ MenuFooter,
913
+ {
914
+ clear: clear ? {
915
+ ...clear,
916
+ onClick: () => {
917
+ clear.onClick();
918
+ setIsOpen(false);
919
+ triggerRef.current?.focus();
920
+ }
921
+ } : void 0,
922
+ confirmation: controlledFiltering ? {
923
+ onApply: handleApply,
924
+ onCancel: handleClose
925
+ } : void 0
926
+ }
927
+ ) : void 0,
928
+ children: /* @__PURE__ */ jsx(Body, { filter, value: displayValue, onChange: setDraft })
929
+ }
930
+ )
931
+ ] });
932
+ };
933
+
934
+ const LIBRARY_OPTION_LABELS = {
935
+ on: "On",
936
+ before: "Before",
937
+ after: "After",
938
+ customRange: "Custom Range"
939
+ };
940
+ const LIBRARY_OPTION_IDS_ORDERED = [
941
+ "on",
942
+ "before",
943
+ "after",
944
+ "customRange"
945
+ ];
946
+ const LIBRARY_OPTION_ID_SET = new Set(LIBRARY_OPTION_IDS_ORDERED);
947
+ const isDateListLibraryOptionId = (id) => LIBRARY_OPTION_ID_SET.has(id);
948
+ const getDateListLibraryOptionLabel = (id) => LIBRARY_OPTION_LABELS[id];
949
+ const dateListLibraryOptions = LIBRARY_OPTION_IDS_ORDERED.map((id) => ({
950
+ id,
951
+ label: `${LIBRARY_OPTION_LABELS[id]}…`
952
+ }));
953
+ const isDateListRangeLibraryId = (id) => id === "customRange";
954
+ const formatDateForLabel = (iso) => {
955
+ const d = DateTime.fromISO(iso, { zone: "local" });
956
+ return `${d.monthShort} ${d.day}, ${d.year}`;
957
+ };
958
+ const formatRangeForLabel = (range) => {
959
+ const start = DateTime.fromISO(range.startDate, { zone: "local" });
960
+ const end = DateTime.fromISO(range.endDate, { zone: "local" });
961
+ const sameYear = start.year === end.year;
962
+ const formattedStart = sameYear ? `${start.monthShort} ${start.day}` : `${start.monthShort} ${start.day}, ${start.year}`;
963
+ return `${formattedStart} – ${end.monthShort} ${end.day}, ${end.year}`;
964
+ };
965
+ const formatDateListSelectionLabel = (selection) => {
966
+ if (selection.value === null) return selection.label;
967
+ const formatted = typeof selection.value === "string" ? formatDateForLabel(selection.value) : formatRangeForLabel(selection.value);
968
+ if (selection.id === "customRange") return formatted;
969
+ return `${selection.label}: ${formatted}`;
970
+ };
971
+
972
+ const DateListDialog = ({
973
+ libraryId,
974
+ parentFilterId,
975
+ initialValue,
976
+ mode,
977
+ dialogCtaLabel,
978
+ onCommit,
979
+ onCancel
980
+ }) => {
981
+ const [dateDraft, setDateDraft] = useState(null);
982
+ const [rangeDraft, setRangeDraft] = useState(null);
983
+ useEffect(() => {
984
+ if (!libraryId) return;
985
+ if (isDateListRangeLibraryId(libraryId)) {
986
+ setRangeDraft(
987
+ initialValue && typeof initialValue === "object" ? {
988
+ startDate: initialValue.startDate,
989
+ endDate: initialValue.endDate
990
+ } : null
991
+ );
992
+ setDateDraft(null);
993
+ } else {
994
+ setDateDraft(typeof initialValue === "string" ? initialValue : null);
995
+ setRangeDraft(null);
996
+ }
997
+ }, [libraryId, initialValue]);
998
+ const dialogOpen = libraryId !== null;
999
+ const dialogLabel = libraryId ? getDateListLibraryOptionLabel(libraryId) : "";
1000
+ const isRange = libraryId ? isDateListRangeLibraryId(libraryId) : false;
1001
+ const canCommit = isRange ? Boolean(rangeDraft?.startDate && rangeDraft?.endDate) : Boolean(dateDraft);
1002
+ const handleCommit = () => {
1003
+ if (!libraryId) return;
1004
+ if (isRange) {
1005
+ if (!rangeDraft?.startDate || !rangeDraft?.endDate) return;
1006
+ onCommit({
1007
+ id: libraryId,
1008
+ label: dialogLabel,
1009
+ value: {
1010
+ startDate: rangeDraft.startDate,
1011
+ endDate: rangeDraft.endDate
1012
+ }
1013
+ });
1014
+ } else {
1015
+ if (!dateDraft) return;
1016
+ onCommit({ id: libraryId, label: dialogLabel, value: dateDraft });
1017
+ }
1018
+ };
1019
+ return /* @__PURE__ */ jsx(Dialog, { open: dialogOpen, onClose: onCancel, children: libraryId && /* @__PURE__ */ jsxs(Fragment, { children: [
1020
+ /* @__PURE__ */ jsx(Dialog.Header, { children: dialogLabel }),
1021
+ /* @__PURE__ */ jsx(Dialog.Content, { children: isRange ? /* @__PURE__ */ jsx(
1022
+ FilterDateRange,
1023
+ {
1024
+ variant: "inline",
1025
+ filter: {
1026
+ id: `${parentFilterId}--date-list-dialog-range`,
1027
+ label: dialogLabel,
1028
+ type: "dateRange",
1029
+ value: rangeDraft,
1030
+ mode
1031
+ },
1032
+ draftValue: rangeDraft,
1033
+ onDraftChange: setRangeDraft
1034
+ }
1035
+ ) : /* @__PURE__ */ jsx(
1036
+ FilterDateSingle,
1037
+ {
1038
+ variant: "inline",
1039
+ filter: {
1040
+ id: `${parentFilterId}--date-list-dialog-date`,
1041
+ label: dialogLabel,
1042
+ type: "date",
1043
+ value: dateDraft,
1044
+ mode
1045
+ },
1046
+ draftValue: dateDraft,
1047
+ onDraftChange: setDateDraft
1048
+ }
1049
+ ) }),
1050
+ /* @__PURE__ */ jsx(Dialog.Footer, { children: /* @__PURE__ */ jsxs(Flex, { gap: 2, justifyContent: "flex-end", children: [
1051
+ /* @__PURE__ */ jsx(Dialog.CancelButton, { appearance: "ghost", "aria-label": "Cancel", children: "Cancel" }),
1052
+ /* @__PURE__ */ jsx(
1053
+ Button,
1054
+ {
1055
+ appearance: "primary",
1056
+ disabled: !canCommit,
1057
+ onClick: handleCommit,
1058
+ children: dialogCtaLabel
1059
+ }
1060
+ )
1061
+ ] }) })
1062
+ ] }) });
1063
+ };
1064
+ const FilterDateList = ({
1065
+ filter,
1066
+ committedValue,
1067
+ onCommit,
1068
+ label,
1069
+ isSelected,
1070
+ dialogCtaLabel,
1071
+ clear
1072
+ }) => {
1073
+ const [openLibraryId, setOpenLibraryId] = useState(null);
1074
+ useEffect(() => {
1075
+ const libraryLabels = new Set(dateListLibraryOptions.map((o) => o.label));
1076
+ filter.options.forEach((opt) => {
1077
+ if (isDateListLibraryOptionId(opt.id)) {
1078
+ warnOnce(
1079
+ `[FilterDateList] Consumer option id "${opt.id}" is reserved for a library option ("on", "before", "after", "customRange"). Use a different id.`
1080
+ );
1081
+ }
1082
+ if (libraryLabels.has(opt.label)) {
1083
+ warnOnce(
1084
+ `[FilterDateList] Consumer option label "${opt.label}" collides with a library option label ("On…", "Before…", "After…", "Custom Range…"). Use a different label.`
1085
+ );
1086
+ }
1087
+ });
1088
+ }, [filter.options]);
1089
+ const options = useMemo(
1090
+ () => [
1091
+ ...filter.options.map(
1092
+ (opt) => ({ id: opt.id, label: opt.label })
1093
+ ),
1094
+ ...dateListLibraryOptions.map(
1095
+ (opt) => ({ id: opt.id, label: opt.label })
1096
+ )
1097
+ ],
1098
+ [filter.options]
1099
+ );
1100
+ const selectedOption = useMemo(
1101
+ () => committedValue ? options.find((opt) => opt.id === committedValue.id) ?? null : null,
1102
+ [options, committedValue]
1103
+ );
1104
+ const handleSelectedOptionChange = (option) => {
1105
+ if (!option) {
1106
+ onCommit(void 0);
1107
+ return;
1108
+ }
1109
+ const id = String(option.id);
1110
+ if (isDateListLibraryOptionId(id)) {
1111
+ setOpenLibraryId(id);
1112
+ return;
1113
+ }
1114
+ const consumerOption = filter.options.find((opt) => opt.id === id);
1115
+ if (!consumerOption) return;
1116
+ onCommit({
1117
+ id: consumerOption.id,
1118
+ label: consumerOption.label,
1119
+ value: consumerOption.value
1120
+ });
1121
+ };
1122
+ const dialogInitialValue = openLibraryId && committedValue?.id === openLibraryId && committedValue.value !== null ? committedValue.value : void 0;
1123
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
1124
+ /* @__PURE__ */ jsx(FilterItemWrapper, { children: /* @__PURE__ */ jsx(
1125
+ SelectMenuSync,
1126
+ {
1127
+ id: filter.id,
1128
+ label: filter.label,
1129
+ options,
1130
+ value: selectedOption,
1131
+ onSelectedOptionChange: handleSelectedOptionChange,
1132
+ disableSearch: true,
1133
+ clear,
1134
+ trigger: (triggerProps) => /* @__PURE__ */ jsx(
1135
+ FilterTriggerButton,
1136
+ {
1137
+ ...triggerProps,
1138
+ filterId: filter.id,
1139
+ label,
1140
+ isSelected,
1141
+ icon: "calendar"
1142
+ }
1143
+ )
1144
+ }
1145
+ ) }),
1146
+ /* @__PURE__ */ jsx(
1147
+ DateListDialog,
1148
+ {
1149
+ libraryId: openLibraryId,
1150
+ parentFilterId: filter.id,
1151
+ initialValue: dialogInitialValue,
1152
+ mode: filter.mode,
1153
+ dialogCtaLabel,
1154
+ onCommit: (option) => {
1155
+ onCommit(option);
1156
+ setOpenLibraryId(null);
1157
+ },
1158
+ onCancel: () => setOpenLibraryId(null)
1159
+ }
1160
+ )
1161
+ ] });
1162
+ };
1163
+
1164
+ const isSelected$6 = (filter) => filter.selectedOption !== void 0 && filter.selectedOption.value !== null;
1165
+ const formatLabel$6 = (filter) => {
1166
+ const selected = filter.selectedOption;
1167
+ if (!selected || selected.value === null) return filter.label;
1168
+ return formatDateListSelectionLabel(selected);
1169
+ };
1170
+ const dateListAdapter = {
1171
+ getValue: (filter) => filter.selectedOption,
1172
+ setValue: (filter, value) => ({ ...filter, selectedOption: value }),
1173
+ reset: (filter) => ({ ...filter, selectedOption: void 0 }),
1174
+ isActive: isSelected$6,
1175
+ preserveState: (newFilter, existingFilter) => ({
1176
+ ...newFilter,
1177
+ selectedOption: existingFilter.selectedOption
1178
+ }),
1179
+ cloneWithItemRefs: (filter) => ({ ...filter }),
1180
+ renderBarControl: ({ filter, updateFilter }) => /* @__PURE__ */ jsx(
1181
+ FilterDateList,
1182
+ {
1183
+ filter,
1184
+ committedValue: filter.selectedOption,
1185
+ onCommit: (value) => updateFilter(filter.id, value, true),
1186
+ label: formatLabel$6(filter),
1187
+ isSelected: isSelected$6(filter),
1188
+ dialogCtaLabel: "Apply",
1189
+ clear: {
1190
+ onClick: () => updateFilter(filter.id, void 0, true)
1191
+ }
1192
+ },
1193
+ filter.id
1194
+ ),
1195
+ renderDrawer: ({
1196
+ originalFilter,
1197
+ draftFilter,
1198
+ onDraftChange,
1199
+ requestDateListDialog
1200
+ }) => {
1201
+ const consumerSelectOptions = originalFilter.options.map((opt) => ({
1202
+ id: opt.id,
1203
+ label: opt.label,
1204
+ extra: { value: opt.value }
1205
+ }));
1206
+ const librarySelectOptions = dateListLibraryOptions.map((opt) => ({
1207
+ id: opt.id,
1208
+ label: opt.label,
1209
+ extra: { value: null }
1210
+ }));
1211
+ const allSelectOptions = [
1212
+ ...consumerSelectOptions,
1213
+ ...librarySelectOptions
1214
+ ];
1215
+ const selectedSelectOption = draftFilter.selectedOption ? {
1216
+ id: draftFilter.selectedOption.id,
1217
+ label: formatDateListSelectionLabel(draftFilter.selectedOption),
1218
+ extra: {
1219
+ value: draftFilter.selectedOption.value
1220
+ }
1221
+ } : null;
1222
+ return /* @__PURE__ */ jsx(
1223
+ SelectFieldSync,
1224
+ {
1225
+ label: originalFilter.label,
1226
+ placeholder: "Select an option...",
1227
+ disableSearch: true,
1228
+ options: allSelectOptions,
1229
+ value: selectedSelectOption,
1230
+ onSelectedOptionChange: (option) => {
1231
+ if (!option) {
1232
+ onDraftChange(draftFilter.id, void 0);
1233
+ return;
1234
+ }
1235
+ const id = String(option.id);
1236
+ if (isDateListLibraryOptionId(id)) {
1237
+ requestDateListDialog(draftFilter.id, id);
1238
+ return;
1239
+ }
1240
+ onDraftChange(draftFilter.id, {
1241
+ id,
1242
+ label: option.label,
1243
+ value: option.extra?.value ?? null
1244
+ });
1245
+ }
1246
+ },
1247
+ draftFilter.id
1248
+ );
1249
+ },
1250
+ formatLabel: formatLabel$6,
1251
+ isSelected: isSelected$6
1252
+ };
1253
+
1254
+ const formatLabel$5 = (filter) => {
1255
+ if (filter.value?.startDate && filter.value?.endDate) {
1256
+ const start = DateTime.fromISO(filter.value.startDate, {
1257
+ zone: "local"
1258
+ });
1259
+ const end = DateTime.fromISO(filter.value.endDate, {
1260
+ zone: "local"
1261
+ });
1262
+ const isSameYear = start.year === end.year;
1263
+ const formattedStart = isSameYear ? `${start.monthShort} ${start.day}` : `${start.monthShort} ${start.day}, ${start.year}`;
1264
+ return `${filter.label}: ${formattedStart} – ${end.monthShort} ${end.day}, ${end.year}`;
1265
+ }
1266
+ return filter.label;
1267
+ };
1268
+ const isSelected$5 = (filter) => !!(filter.value?.startDate && filter.value?.endDate);
1269
+ const dateRangeAdapter = {
1270
+ getValue: (filter) => filter.value ?? null,
1271
+ setValue: (filter, value) => ({ ...filter, value }),
1272
+ reset: (filter) => ({ ...filter, value: null }),
1273
+ isActive: (filter) => filter.value !== null && filter.value !== void 0 && filter.value.startDate !== null && filter.value.endDate !== null,
1274
+ preserveState: (newFilter, existingFilter) => ({
1275
+ ...newFilter,
1276
+ value: existingFilter.value
1277
+ }),
1278
+ cloneWithItemRefs: (filter) => ({
1279
+ ...filter,
1280
+ value: filter.value ?? null
1281
+ }),
1282
+ renderBarControl: ({ filter, updateFilter, controlledFiltering }) => /* @__PURE__ */ jsx(
1283
+ FilterDateRange,
1284
+ {
1285
+ filter,
1286
+ committedValue: filter.value ?? null,
1287
+ onCommit: (value) => updateFilter(filter.id, value, true),
1288
+ controlledFiltering,
1289
+ label: formatLabel$5(filter),
1290
+ isSelected: isSelected$5(filter),
1291
+ clear: {
1292
+ onClick: () => updateFilter(filter.id, null, true)
1293
+ }
1294
+ },
1295
+ filter.id
1296
+ ),
1297
+ renderDrawer: ({ draftFilter, onDraftChange }) => /* @__PURE__ */ jsx(
1298
+ DateFieldRange,
1299
+ {
1300
+ label: draftFilter.label,
1301
+ value: draftFilter.value ?? null,
1302
+ onChange: (change) => onDraftChange(draftFilter.id, {
1303
+ startDate: change.startDate,
1304
+ endDate: change.endDate
1305
+ }),
1306
+ mode: draftFilter.mode
1307
+ },
1308
+ draftFilter.id
1309
+ ),
1310
+ formatLabel: formatLabel$5,
1311
+ isSelected: isSelected$5
1312
+ };
1313
+
1314
+ const isSelected$4 = (filter) => !!filter.selectedOptions && filter.selectedOptions.length > 0;
1315
+ const formatLabel$4 = (filter) => {
1316
+ const count = filter.selectedOptions?.length ?? 0;
1317
+ if (count === 0) return filter.label;
1318
+ const countLabel = count.toString();
1319
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
1320
+ filter.label,
1321
+ /* @__PURE__ */ jsx(
1322
+ Chip,
1323
+ {
1324
+ label: countLabel,
1325
+ color: "#0265DC",
1326
+ size: "small",
1327
+ "aria-label": `${countLabel} selected items`
1328
+ }
1329
+ )
1330
+ ] });
1331
+ };
1332
+ const passThroughMenuProps$2 = (filter) => {
1333
+ const {
1334
+ id: _id,
1335
+ label: _label,
1336
+ type: _type,
1337
+ selectedOptions: _selectedOptions,
1338
+ simpleDrawerVariant: _simpleDrawerVariant,
1339
+ drawerOnly: _drawerOnly,
1340
+ ...rest
1341
+ } = filter;
1342
+ return rest;
1343
+ };
1344
+ const multiSelectAdapter = {
1345
+ getValue: (filter) => filter.selectedOptions ?? [],
1346
+ setValue: (filter, value) => ({ ...filter, selectedOptions: value }),
1347
+ reset: (filter) => ({ ...filter, selectedOptions: [] }),
1348
+ isActive: isSelected$4,
1349
+ preserveState: (newFilter, existingFilter) => ({
1350
+ ...newFilter,
1351
+ selectedOptions: existingFilter.selectedOptions
1352
+ }),
1353
+ // Options are owned by the consumer; MultiSelectMenuSync handles identity
1354
+ // internally — no rebinding needed.
1355
+ cloneWithItemRefs: (filter) => ({ ...filter }),
1356
+ renderBarControl: ({ filter, updateFilter, controlledFiltering }) => /* @__PURE__ */ jsx(FilterItemWrapper, { children: /* @__PURE__ */ jsx(
1357
+ MultiSelectMenuSync,
1358
+ {
1359
+ ...passThroughMenuProps$2(filter),
1360
+ id: filter.id,
1361
+ label: filter.label,
1362
+ value: filter.selectedOptions ?? [],
1363
+ onSelectedOptionsChange: (options) => updateFilter(filter.id, options, true),
1364
+ confirmation: controlledFiltering,
1365
+ clear: {
1366
+ onClick: () => updateFilter(filter.id, [], true)
1367
+ },
1368
+ trigger: (triggerProps) => /* @__PURE__ */ jsx(
1369
+ FilterTriggerButton,
1370
+ {
1371
+ ...triggerProps,
1372
+ filterId: filter.id,
1373
+ label: formatLabel$4(filter),
1374
+ isSelected: isSelected$4(filter)
1375
+ }
1376
+ )
1377
+ }
1378
+ ) }, filter.id),
1379
+ renderDrawer: ({ originalFilter, draftFilter, onDraftChange }) => {
1380
+ if (originalFilter.simpleDrawerVariant) {
1381
+ return /* @__PURE__ */ jsx(Checkbox.Group, { legend: originalFilter.label, children: originalFilter.options.map((option) => /* @__PURE__ */ jsx(
1382
+ Checkbox,
1383
+ {
1384
+ label: option.label,
1385
+ checked: draftFilter.selectedOptions?.some(
1386
+ (selected) => selected.id === option.id
1387
+ ) ?? false,
1388
+ onChange: (e) => {
1389
+ const currentSelected = draftFilter.selectedOptions ?? [];
1390
+ if (e?.target.checked) {
1391
+ onDraftChange(draftFilter.id, [...currentSelected, option]);
1392
+ } else {
1393
+ onDraftChange(
1394
+ draftFilter.id,
1395
+ currentSelected.filter(
1396
+ (selected) => selected.id !== option.id
1397
+ )
1398
+ );
1399
+ }
1400
+ }
1401
+ },
1402
+ option.id
1403
+ )) }, draftFilter.id);
1404
+ }
1405
+ return /* @__PURE__ */ createElement(
1406
+ MultiSelectFieldSync,
1407
+ {
1408
+ ...passThroughMenuProps$2(originalFilter),
1409
+ key: draftFilter.id,
1410
+ label: originalFilter.label,
1411
+ value: draftFilter.selectedOptions ?? [],
1412
+ onSelectedOptionsChange: (options) => onDraftChange(draftFilter.id, options)
1413
+ }
1414
+ );
1415
+ },
1416
+ formatLabel: formatLabel$4,
1417
+ isSelected: isSelected$4
1418
+ };
1419
+
1420
+ const clampToBounds = (n, minValue, maxValue) => {
1421
+ if (n === void 0) return void 0;
1422
+ let result = n;
1423
+ if (minValue !== void 0) result = Math.max(result, minValue);
1424
+ if (maxValue !== void 0) result = Math.min(result, maxValue);
1425
+ return result;
1426
+ };
1427
+ const FilterNumericRange = ({
1428
+ filter,
1429
+ value,
1430
+ onChange,
1431
+ layout
1432
+ }) => {
1433
+ const inclusive = filter.inclusiveBounds === true;
1434
+ const minFieldLabel = inclusive ? "Min" : "Above";
1435
+ const maxFieldLabel = inclusive ? "Max" : "Below";
1436
+ const minimumFractionDigits = filter.minimumFractionDigits ?? (filter.mode === "currency" ? 2 : filter.mode === "percentage" ? 0 : void 0);
1437
+ const maximumFractionDigits = filter.maximumFractionDigits ?? (filter.mode === "currency" ? 2 : filter.mode === "percentage" ? 3 : void 0);
1438
+ const decoratorProps = {
1439
+ ...filter.mode === "currency" && { prefix: "$" },
1440
+ ...filter.mode === "percentage" && { suffix: "%" },
1441
+ ...minimumFractionDigits !== void 0 && { minimumFractionDigits },
1442
+ ...maximumFractionDigits !== void 0 && { maximumFractionDigits }
1443
+ };
1444
+ const update = (next) => {
1445
+ const min = clampToBounds(next.min, filter.minValue, filter.maxValue);
1446
+ const max = clampToBounds(next.max, filter.minValue, filter.maxValue);
1447
+ onChange(min === void 0 && max === void 0 ? null : { min, max });
1448
+ };
1449
+ const sharedNumberFieldProps = {
1450
+ hideControls: filter.hideControls ?? true,
1451
+ step: filter.step,
1452
+ minValue: filter.minValue,
1453
+ maxValue: filter.maxValue,
1454
+ ...decoratorProps
1455
+ };
1456
+ const minField = /* @__PURE__ */ jsx(
1457
+ NumberField,
1458
+ {
1459
+ label: minFieldLabel,
1460
+ value: value?.min ?? null,
1461
+ onChange: (n) => update({ min: n ?? void 0, max: value?.max }),
1462
+ ...sharedNumberFieldProps
1463
+ }
1464
+ );
1465
+ const maxField = /* @__PURE__ */ jsx(
1466
+ NumberField,
1467
+ {
1468
+ label: maxFieldLabel,
1469
+ value: value?.max ?? null,
1470
+ onChange: (n) => update({ min: value?.min, max: n ?? void 0 }),
1471
+ ...sharedNumberFieldProps
1472
+ }
1473
+ );
1474
+ if (layout === "compact") {
1475
+ return /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "2", grow: 1, children: [
1476
+ minField,
1477
+ maxField
1478
+ ] });
1479
+ }
1480
+ return /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "2", grow: 1, children: [
1481
+ /* @__PURE__ */ jsx(FieldLabel, { children: filter.label }),
1482
+ /* @__PURE__ */ jsxs(Grid, { templateColumns: "1fr auto 1fr", gap: "2", children: [
1483
+ minField,
1484
+ /* @__PURE__ */ jsx(
1485
+ Flex,
1486
+ {
1487
+ alignItems: "center",
1488
+ justifyContent: "center",
1489
+ className: styles["filter-numeric-range-separator"],
1490
+ children: /* @__PURE__ */ jsx(Text, { children: "to" })
1491
+ }
1492
+ ),
1493
+ maxField
1494
+ ] })
1495
+ ] });
1496
+ };
1497
+
1498
+ const formatBound = (n, filter) => {
1499
+ const minimumFractionDigits = filter.minimumFractionDigits ?? (filter.mode === "currency" ? 2 : filter.mode === "percentage" ? 0 : void 0);
1500
+ const maximumFractionDigits = filter.maximumFractionDigits ?? (filter.mode === "currency" ? 2 : filter.mode === "percentage" ? 3 : void 0);
1501
+ const formatOptions = {};
1502
+ if (minimumFractionDigits !== void 0) {
1503
+ formatOptions.minimumFractionDigits = minimumFractionDigits;
1504
+ }
1505
+ if (maximumFractionDigits !== void 0) {
1506
+ formatOptions.maximumFractionDigits = maximumFractionDigits;
1507
+ }
1508
+ const formatted = n.toLocaleString("en-US", formatOptions);
1509
+ if (filter.mode === "currency") return `$${formatted}`;
1510
+ if (filter.mode === "percentage") return `${formatted}%`;
1511
+ return formatted;
1512
+ };
1513
+ const formatLabel$3 = (filter) => {
1514
+ const hasMin = filter.value?.min !== void 0;
1515
+ const hasMax = filter.value?.max !== void 0;
1516
+ if (!hasMin && !hasMax) return filter.label;
1517
+ const inclusive = filter.inclusiveBounds === true;
1518
+ const minSymbol = inclusive ? "≥" : ">";
1519
+ const maxSymbol = inclusive ? "≤" : "<";
1520
+ if (hasMin && hasMax) {
1521
+ return `${filter.label}: ${formatBound(filter.value.min, filter)} to ${formatBound(filter.value.max, filter)}`;
1522
+ }
1523
+ if (hasMin) {
1524
+ return `${filter.label}: ${minSymbol} ${formatBound(filter.value.min, filter)}`;
1525
+ }
1526
+ return `${filter.label}: ${maxSymbol} ${formatBound(filter.value.max, filter)}`;
1527
+ };
1528
+ const isSelected$3 = (filter) => filter.value !== null && filter.value !== void 0 && (filter.value.min !== void 0 || filter.value.max !== void 0);
1529
+ const numericRangeAdapter = {
1530
+ getValue: (filter) => filter.value ?? null,
1531
+ setValue: (filter, value) => ({ ...filter, value }),
1532
+ reset: (filter) => ({ ...filter, value: null }),
1533
+ isActive: isSelected$3,
1534
+ preserveState: (newFilter, existingFilter) => ({
1535
+ ...newFilter,
1536
+ value: existingFilter.value
1537
+ }),
1538
+ cloneWithItemRefs: (filter) => ({
1539
+ ...filter,
1540
+ value: filter.value ? { ...filter.value } : null
1541
+ }),
1542
+ renderBarControl: ({ filter }) => /* @__PURE__ */ jsx(
1543
+ FilterPopoverButton,
1544
+ {
1545
+ filter,
1546
+ label: formatLabel$3(filter),
1547
+ isSelected: isSelected$3(filter),
1548
+ committedValue: filter.value ?? null,
1549
+ initialValue: null,
1550
+ keepOpenOnUncontrolledChange: true,
1551
+ children: ({ value, onChange }) => /* @__PURE__ */ jsx(
1552
+ FilterNumericRange,
1553
+ {
1554
+ filter,
1555
+ value,
1556
+ onChange,
1557
+ layout: "compact"
1558
+ }
1559
+ )
1560
+ },
1561
+ filter.id
1562
+ ),
1563
+ renderDrawer: ({ draftFilter, onDraftChange }) => /* @__PURE__ */ jsx(
1564
+ FilterNumericRange,
1565
+ {
1566
+ filter: draftFilter,
1567
+ value: draftFilter.value ?? null,
1568
+ onChange: (value) => onDraftChange(draftFilter.id, value),
1569
+ layout: "grid"
1570
+ },
1571
+ draftFilter.id
1572
+ ),
1573
+ formatLabel: formatLabel$3,
1574
+ isSelected: isSelected$3
1575
+ };
1576
+
1577
+ const formatLabel$2 = (filter) => {
1578
+ if (filter.selectedOption) {
1579
+ return `${filter.label}: ${filter.selectedOption.label}`;
1580
+ }
1581
+ return filter.label;
1582
+ };
1583
+ const isSelected$2 = (filter) => filter.selectedOption !== void 0;
1584
+ const passThroughMenuProps$1 = (filter) => {
1585
+ const {
1586
+ id: _id,
1587
+ label: _label,
1588
+ type: _type,
1589
+ selectedOption: _selectedOption,
1590
+ simpleDrawerVariant: _simpleDrawerVariant,
1591
+ drawerOnly: _drawerOnly,
1592
+ ...rest
1593
+ } = filter;
1594
+ return rest;
1595
+ };
1596
+ const singleSelectAdapter = {
1597
+ getValue: (filter) => filter.selectedOption,
1598
+ setValue: (filter, value) => ({ ...filter, selectedOption: value }),
1599
+ reset: (filter) => ({ ...filter, selectedOption: void 0 }),
1600
+ isActive: isSelected$2,
1601
+ preserveState: (newFilter, existingFilter) => ({
1602
+ ...newFilter,
1603
+ selectedOption: existingFilter.selectedOption
1604
+ }),
1605
+ // Options are owned by the consumer; SelectMenuSync handles option identity
1606
+ // internally — no rebinding needed here.
1607
+ cloneWithItemRefs: (filter) => ({ ...filter }),
1608
+ renderBarControl: ({ filter, updateFilter }) => /* @__PURE__ */ jsx(FilterItemWrapper, { children: /* @__PURE__ */ jsx(
1609
+ SelectMenuSync,
1610
+ {
1611
+ ...passThroughMenuProps$1(filter),
1612
+ id: filter.id,
1613
+ label: filter.label,
1614
+ value: filter.selectedOption ?? null,
1615
+ onSelectedOptionChange: (option) => updateFilter(filter.id, option ?? void 0, true),
1616
+ clear: {
1617
+ onClick: () => updateFilter(filter.id, void 0, true)
1618
+ },
1619
+ trigger: (triggerProps) => /* @__PURE__ */ jsx(
1620
+ FilterTriggerButton,
1621
+ {
1622
+ ...triggerProps,
1623
+ filterId: filter.id,
1624
+ label: formatLabel$2(filter),
1625
+ isSelected: isSelected$2(filter)
1626
+ }
1627
+ )
1628
+ }
1629
+ ) }, filter.id),
1630
+ renderDrawer: ({ originalFilter, draftFilter, onDraftChange }) => {
1631
+ if (originalFilter.simpleDrawerVariant) {
1632
+ return /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Radio.Group, { legend: originalFilter.label, children: originalFilter.options.map((option) => /* @__PURE__ */ jsx(
1633
+ Radio,
1634
+ {
1635
+ name: `${originalFilter.id}-radio`,
1636
+ value: String(option.id),
1637
+ label: option.label,
1638
+ checked: draftFilter.selectedOption?.id === option.id,
1639
+ onChange: (e) => {
1640
+ if (e?.target.checked) {
1641
+ const selected = originalFilter.options.find(
1642
+ (opt) => String(opt.id) === e.target.value
1643
+ );
1644
+ onDraftChange(draftFilter.id, selected);
1645
+ }
1646
+ }
1647
+ },
1648
+ option.id
1649
+ )) }) }, draftFilter.id);
1650
+ }
1651
+ return /* @__PURE__ */ createElement(
1652
+ SelectFieldSync,
1653
+ {
1654
+ ...passThroughMenuProps$1(originalFilter),
1655
+ key: draftFilter.id,
1656
+ label: originalFilter.label,
1657
+ value: draftFilter.selectedOption ?? null,
1658
+ onSelectedOptionChange: (option) => onDraftChange(draftFilter.id, option ?? void 0)
1659
+ }
1660
+ );
1661
+ },
1662
+ formatLabel: formatLabel$2,
1663
+ isSelected: isSelected$2
1664
+ };
1665
+
1666
+ const FilterTextInput = ({
1667
+ filter,
1668
+ value,
1669
+ onChange,
1670
+ layout
1671
+ }) => {
1672
+ const truncate = (s) => filter.maxLength !== void 0 ? s.slice(0, filter.maxLength) : s;
1673
+ const counterProps = filter.showCounter ? { showCounter: true, maxLength: filter.maxLength } : { maxLength: filter.maxLength };
1674
+ return /* @__PURE__ */ jsx(
1675
+ TextField,
1676
+ {
1677
+ label: filter.label,
1678
+ hideLabel: layout === "compact",
1679
+ placeholder: filter.placeholder,
1680
+ value,
1681
+ onChange: (e) => onChange(truncate(e.target.value)),
1682
+ ...counterProps
1683
+ }
1684
+ );
1685
+ };
1686
+
1687
+ const TRIGGER_VALUE_MAX_CHARS = 24;
1688
+ const formatLabel$1 = (filter) => {
1689
+ if (!filter.value) return filter.label;
1690
+ const display = filter.value.length > TRIGGER_VALUE_MAX_CHARS ? `${filter.value.slice(0, TRIGGER_VALUE_MAX_CHARS)}…` : filter.value;
1691
+ return `${filter.label}: ${display}`;
1692
+ };
1693
+ const isSelected$1 = (filter) => filter.value !== void 0 && filter.value !== "";
1694
+ const textInputAdapter = {
1695
+ getValue: (filter) => filter.value ?? "",
1696
+ // Normalise empty → undefined on write so `isSelected` / activeFilters lists
1697
+ // treat a cleared field as inactive without needing extra guards.
1698
+ setValue: (filter, value) => ({ ...filter, value: value || void 0 }),
1699
+ reset: (filter) => ({ ...filter, value: void 0 }),
1700
+ isActive: isSelected$1,
1701
+ preserveState: (newFilter, existingFilter) => ({
1702
+ ...newFilter,
1703
+ value: existingFilter.value
1704
+ }),
1705
+ cloneWithItemRefs: (filter) => ({ ...filter }),
1706
+ renderBarControl: ({ filter }) => /* @__PURE__ */ jsx(
1707
+ FilterPopoverButton,
1708
+ {
1709
+ filter,
1710
+ label: formatLabel$1(filter),
1711
+ isSelected: isSelected$1(filter),
1712
+ committedValue: filter.value ?? "",
1713
+ initialValue: "",
1714
+ keepOpenOnUncontrolledChange: true,
1715
+ children: ({ value, onChange }) => /* @__PURE__ */ jsx(
1716
+ FilterTextInput,
1717
+ {
1718
+ filter,
1719
+ value,
1720
+ onChange,
1721
+ layout: "compact"
1722
+ }
1723
+ )
1724
+ },
1725
+ filter.id
1726
+ ),
1727
+ renderDrawer: ({ draftFilter, onDraftChange }) => /* @__PURE__ */ jsx(
1728
+ FilterTextInput,
1729
+ {
1730
+ filter: draftFilter,
1731
+ value: draftFilter.value ?? "",
1732
+ onChange: (value) => onDraftChange(draftFilter.id, value || void 0),
1733
+ layout: "grid"
1734
+ },
1735
+ draftFilter.id
1736
+ ),
1737
+ formatLabel: formatLabel$1,
1738
+ isSelected: isSelected$1
1739
+ };
1740
+
1741
+ const isSelected = (filter) => !!filter.selectedNodes && filter.selectedNodes.length > 0;
1742
+ const formatLabel = (filter) => {
1743
+ const count = filter.selectedNodes?.length ?? 0;
1744
+ if (count === 0) return filter.label;
1745
+ const countLabel = count.toString();
1746
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
1747
+ filter.label,
1748
+ /* @__PURE__ */ jsx(
1749
+ Chip,
1750
+ {
1751
+ label: countLabel,
1752
+ color: "#0265DC",
1753
+ size: "small",
1754
+ "aria-label": `${countLabel} selected items`
1755
+ }
1756
+ )
1757
+ ] });
1758
+ };
1759
+ const passThroughMenuProps = (filter) => {
1760
+ const {
1761
+ id: _id,
1762
+ label: _label,
1763
+ type: _type,
1764
+ selectedNodes: _selectedNodes,
1765
+ drawerOnly: _drawerOnly,
1766
+ ...rest
1767
+ } = filter;
1768
+ return rest;
1769
+ };
1770
+ const treeAdapter = {
1771
+ getValue: (filter) => filter.selectedNodes ?? [],
1772
+ setValue: (filter, value) => ({ ...filter, selectedNodes: value }),
1773
+ reset: (filter) => ({ ...filter, selectedNodes: [] }),
1774
+ isActive: isSelected,
1775
+ preserveState: (newFilter, existingFilter) => ({
1776
+ ...newFilter,
1777
+ selectedNodes: existingFilter.selectedNodes
1778
+ }),
1779
+ // The tree's `options` are owned by the consumer; the selected node values
1780
+ // are canonical and carry their own id/label — no rebinding needed.
1781
+ cloneWithItemRefs: (filter) => ({ ...filter }),
1782
+ renderBarControl: ({ filter, updateFilter, controlledFiltering }) => /* @__PURE__ */ jsx(FilterItemWrapper, { children: /* @__PURE__ */ jsx(
1783
+ TreeSelectMenuSync,
1784
+ {
1785
+ ...passThroughMenuProps(filter),
1786
+ id: filter.id,
1787
+ label: filter.label,
1788
+ value: filter.selectedNodes ?? [],
1789
+ onSelectedOptionsChange: (nodes) => updateFilter(filter.id, nodes, true),
1790
+ confirmation: controlledFiltering,
1791
+ clear: {
1792
+ onClick: () => updateFilter(filter.id, [], true),
1793
+ disabled: !isSelected(filter)
1794
+ },
1795
+ trigger: (triggerProps) => /* @__PURE__ */ jsx(
1796
+ FilterTriggerButton,
1797
+ {
1798
+ ...triggerProps,
1799
+ filterId: filter.id,
1800
+ label: formatLabel(filter),
1801
+ isSelected: isSelected(filter)
1802
+ }
1803
+ )
1804
+ }
1805
+ ) }, filter.id),
1806
+ renderDrawer: ({ originalFilter, draftFilter, onDraftChange }) => /* @__PURE__ */ createElement(
1807
+ TreeSelectFieldSync,
1808
+ {
1809
+ ...passThroughMenuProps(originalFilter),
1810
+ key: draftFilter.id,
1811
+ label: originalFilter.label,
1812
+ value: draftFilter.selectedNodes ?? [],
1813
+ onSelectedOptionsChange: (nodes) => onDraftChange(draftFilter.id, nodes)
1814
+ }
1815
+ ),
1816
+ formatLabel,
1817
+ isSelected
1818
+ };
1819
+
1820
+ const filterAdapters = {
1821
+ boolean: booleanAdapter,
1822
+ custom: customAdapter,
1823
+ singleSelect: singleSelectAdapter,
1824
+ multiSelect: multiSelectAdapter,
1825
+ date: dateAdapter,
1826
+ dateRange: dateRangeAdapter,
1827
+ dateList: dateListAdapter,
1828
+ asyncSelect: asyncSelectAdapter,
1829
+ asyncMultiSelect: asyncMultiSelectAdapter,
1830
+ tree: treeAdapter,
1831
+ asyncTree: asyncTreeAdapter,
1832
+ numericRange: numericRangeAdapter,
1833
+ textInput: textInputAdapter
1834
+ };
1835
+ const unknownAdapter = {
1836
+ getValue: () => void 0,
1837
+ setValue: (filter) => filter,
1838
+ reset: (filter) => filter,
1839
+ isActive: () => false,
1840
+ preserveState: (newFilter) => newFilter,
1841
+ cloneWithItemRefs: (filter) => filter,
1842
+ renderBarControl: () => null,
1843
+ renderDrawer: () => null,
1844
+ formatLabel: (filter) => filter.label,
1845
+ isSelected: () => false
1846
+ };
1847
+ const getAdapter = (filter) => filterAdapters[filter.type] ?? unknownAdapter;
1848
+
1849
+ const getActiveFilters = (filters) => filters.filter((filter) => getAdapter(filter).isActive(filter));
1850
+ const checkActiveFilters = (filters) => getActiveFilters(filters).length > 0;
1851
+ const resetFilters = (filters) => filters.map((filter) => getAdapter(filter).reset(filter));
1852
+ const updateSingleFilter = (filters, filterId, value) => filters.map((filter) => {
1853
+ if (filter.id !== filterId) return filter;
1854
+ return getAdapter(filter).setValue(filter, value);
1855
+ });
1856
+ const hasFilterSelectionChanged = (existingFilter, newFilter) => {
1857
+ const existingValue = getAdapter(existingFilter).getValue(existingFilter);
1858
+ const newValue = getAdapter(newFilter).getValue(newFilter);
1859
+ return existingValue !== newValue;
1860
+ };
1861
+ const preserveFilterState = (newFilter, existingFilter) => getAdapter(newFilter).preserveState(newFilter, existingFilter);
1862
+ const cloneFiltersWithItemRefs = (filters) => filters.map(
1863
+ (filter) => getAdapter(filter).cloneWithItemRefs(filter)
1864
+ );
1865
+
1866
+ export { DateListDialog as D, FilterGroupContext as F, checkActiveFilters as a, getAdapter as b, cloneFiltersWithItemRefs as c, FilterItemWrapper as d, FilterTriggerButton as e, getActiveFilters as g, hasFilterSelectionChanged as h, preserveFilterState as p, resetFilters as r, styles as s, updateSingleFilter as u };
1867
+ //# sourceMappingURL=filter-state-DyMDjdRS.js.map