@servicetitan/anvil2 2.1.0 → 2.3.0

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 (248) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/{Alert-DXoEusod.js → Alert-D9mBPs6z.js} +2 -2
  3. package/dist/{Alert-DXoEusod.js.map → Alert-D9mBPs6z.js.map} +1 -1
  4. package/dist/Alert.js +1 -1
  5. package/dist/{Announcement-SAypScAu.js → Announcement-B34cD6BC.js} +2 -2
  6. package/dist/{Announcement-SAypScAu.js.map → Announcement-B34cD6BC.js.map} +1 -1
  7. package/dist/Announcement.js +1 -1
  8. package/dist/{Button-l7pTJdPc.js → Button-DrNDkO2f.js} +2 -2
  9. package/dist/{Button-l7pTJdPc.js.map → Button-DrNDkO2f.js.map} +1 -1
  10. package/dist/Button.css +50 -50
  11. package/dist/Button.js +1 -1
  12. package/dist/Button.module-DwCq9XU0.js +26 -0
  13. package/dist/Button.module-DwCq9XU0.js.map +1 -0
  14. package/dist/{ButtonCompound-CX2kHgWe.js → ButtonCompound-D9VTKcL4.js} +2 -2
  15. package/dist/{ButtonCompound-CX2kHgWe.js.map → ButtonCompound-D9VTKcL4.js.map} +1 -1
  16. package/dist/ButtonCompound.js +1 -1
  17. package/dist/{ButtonLink-CRlyK750.js → ButtonLink-DDtrmbVM.js} +3 -2
  18. package/dist/ButtonLink-DDtrmbVM.js.map +1 -0
  19. package/dist/ButtonLink.js +1 -1
  20. package/dist/{ButtonToggle-BOVP_jEN.js → ButtonToggle-DrFewgOG.js} +3 -3
  21. package/dist/{ButtonToggle-BOVP_jEN.js.map → ButtonToggle-DrFewgOG.js.map} +1 -1
  22. package/dist/ButtonToggle.js +1 -1
  23. package/dist/{Calendar-D93exRLI.js → Calendar-CkgpKD7Q.js} +2 -2
  24. package/dist/{Calendar-D93exRLI.js.map → Calendar-CkgpKD7Q.js.map} +1 -1
  25. package/dist/{Calendar-BhCce9hE.js → Calendar-CtkL4zYU.js} +3 -3
  26. package/dist/{Calendar-BhCce9hE.js.map → Calendar-CtkL4zYU.js.map} +1 -1
  27. package/dist/Calendar.js +2 -2
  28. package/dist/{Checkbox-DHWOiSml.js → Checkbox-CFgjreAl.js} +2 -2
  29. package/dist/{Checkbox-DHWOiSml.js.map → Checkbox-CFgjreAl.js.map} +1 -1
  30. package/dist/{Checkbox-cVlWQOTq.js → Checkbox-CxjZpzPp.js} +4 -4
  31. package/dist/{Checkbox-cVlWQOTq.js.map → Checkbox-CxjZpzPp.js.map} +1 -1
  32. package/dist/Checkbox.js +1 -1
  33. package/dist/{Combobox-BGYeW0ZF.js → Combobox-B6saoDAP.js} +15 -8
  34. package/dist/Combobox-B6saoDAP.js.map +1 -0
  35. package/dist/Combobox.js +1 -1
  36. package/dist/{DataTable-Dnt-q7jf.js → DataTable-NzX8SCYT.js} +43 -13
  37. package/dist/{DataTable-Dnt-q7jf.js.map → DataTable-NzX8SCYT.js.map} +1 -1
  38. package/dist/DataTable.css +9 -5
  39. package/dist/{DateFieldRange-Dx2YbnQ-.js → DateFieldRange-DgGgNSzN.js} +45 -35
  40. package/dist/DateFieldRange-DgGgNSzN.js.map +1 -0
  41. package/dist/DateFieldRange.js +1 -1
  42. package/dist/{DateFieldSingle-CZg1n-n2.js → DateFieldSingle-BR4nJNVl.js} +37 -28
  43. package/dist/DateFieldSingle-BR4nJNVl.js.map +1 -0
  44. package/dist/DateFieldSingle.js +1 -1
  45. package/dist/{DateFieldYearless-D7-O2FLP.js → DateFieldYearless-mqvM2uVP.js} +5 -5
  46. package/dist/{DateFieldYearless-D7-O2FLP.js.map → DateFieldYearless-mqvM2uVP.js.map} +1 -1
  47. package/dist/DateFieldYearless.js +1 -1
  48. package/dist/{DateFieldYearlessRange-6EocQch6.js → DateFieldYearlessRange-CLuyUoGF.js} +5 -5
  49. package/dist/{DateFieldYearlessRange-6EocQch6.js.map → DateFieldYearlessRange-CLuyUoGF.js.map} +1 -1
  50. package/dist/DateFieldYearlessRange.js +1 -1
  51. package/dist/{DaysOfTheWeek-BfCVsQK7.js → DaysOfTheWeek-D-WPj18i.js} +5 -5
  52. package/dist/{DaysOfTheWeek-BfCVsQK7.js.map → DaysOfTheWeek-D-WPj18i.js.map} +1 -1
  53. package/dist/DaysOfTheWeek.js +1 -1
  54. package/dist/{Dialog-DVBl8phs.js → Dialog-yA2jYtgv.js} +3 -3
  55. package/dist/{Dialog-DVBl8phs.js.map → Dialog-yA2jYtgv.js.map} +1 -1
  56. package/dist/Dialog.js +1 -1
  57. package/dist/{DialogCancelButton-GuN5lgR-.js → DialogCancelButton-BfI9K4a4.js} +2 -2
  58. package/dist/{DialogCancelButton-GuN5lgR-.js.map → DialogCancelButton-BfI9K4a4.js.map} +1 -1
  59. package/dist/Dnd.js +1 -1
  60. package/dist/DndSort.js +2 -2
  61. package/dist/{Drawer-c_d511iA.js → Drawer-Dt4dqAxQ.js} +3 -3
  62. package/dist/{Drawer-c_d511iA.js.map → Drawer-Dt4dqAxQ.js.map} +1 -1
  63. package/dist/Drawer.js +1 -1
  64. package/dist/DrillDown.js +1 -1
  65. package/dist/{EditCard-DAiE-Hsc.js → EditCard-CH-JE4ba.js} +2 -2
  66. package/dist/{EditCard-DAiE-Hsc.js.map → EditCard-CH-JE4ba.js.map} +1 -1
  67. package/dist/EditCard.js +1 -1
  68. package/dist/{FieldDialog-BHDi3oXg.js → FieldDialog-BghhsL2B.js} +125 -38
  69. package/dist/FieldDialog-BghhsL2B.js.map +1 -0
  70. package/dist/{FieldLabel-DSrHbw9U.js → FieldLabel-DL0D6fvc.js} +2 -2
  71. package/dist/{FieldLabel-DSrHbw9U.js.map → FieldLabel-DL0D6fvc.js.map} +1 -1
  72. package/dist/FieldLabel.js +1 -1
  73. package/dist/FieldMessage-OeP_xSUE.js +132 -0
  74. package/dist/FieldMessage-OeP_xSUE.js.map +1 -0
  75. package/dist/FieldMessage.js +1 -1
  76. package/dist/{Helper-BXiz9ZRC.js → Helper-B2UrgJvr.js} +2 -2
  77. package/dist/{Helper-BXiz9ZRC.js.map → Helper-B2UrgJvr.js.map} +1 -1
  78. package/dist/{InputMask-CdJ-cfLV.js → InputMask-B7ZnJoR5.js} +2 -2
  79. package/dist/{InputMask-CdJ-cfLV.js.map → InputMask-B7ZnJoR5.js.map} +1 -1
  80. package/dist/InputMask.js +1 -1
  81. package/dist/{ListView-D7GBpVnV.js → ListView-CN8zu-cq.js} +2 -2
  82. package/dist/{ListView-D7GBpVnV.js.map → ListView-CN8zu-cq.js.map} +1 -1
  83. package/dist/ListView.js +1 -1
  84. package/dist/{Menu-3LIfRdTk.js → Menu-CpRnsr0v.js} +2 -2
  85. package/dist/{Menu-3LIfRdTk.js.map → Menu-CpRnsr0v.js.map} +1 -1
  86. package/dist/Menu.js +1 -1
  87. package/dist/MultiSelectField.js +1 -1
  88. package/dist/{MultiSelectFieldSync-Bc7IphJ7.js → MultiSelectFieldSync-ChDuxvhE.js} +894 -254
  89. package/dist/MultiSelectFieldSync-ChDuxvhE.js.map +1 -0
  90. package/dist/{NumberField-CcGYnIFG.js → NumberField-ecubQsaf.js} +5 -5
  91. package/dist/{NumberField-CcGYnIFG.js.map → NumberField-ecubQsaf.js.map} +1 -1
  92. package/dist/NumberField.js +1 -1
  93. package/dist/{Page-D_IpquWk.js → Page-CkcnGPPK.js} +8 -8
  94. package/dist/{Page-D_IpquWk.js.map → Page-CkcnGPPK.js.map} +1 -1
  95. package/dist/Page.js +1 -1
  96. package/dist/{Pagination-DIatYUXX.js → Pagination-DO9NORlw.js} +4 -4
  97. package/dist/{Pagination-DIatYUXX.js.map → Pagination-DO9NORlw.js.map} +1 -1
  98. package/dist/Pagination.js +1 -1
  99. package/dist/{Popover-BxgfNjyI.js → Popover-D_BmwIOW.js} +6 -6
  100. package/dist/{Popover-BxgfNjyI.js.map → Popover-D_BmwIOW.js.map} +1 -1
  101. package/dist/Popover.css +15 -14
  102. package/dist/Popover.js +1 -1
  103. package/dist/{ProgressBar-B_g3VRUD.js → ProgressBar-CBhVZIzK.js} +3 -3
  104. package/dist/{ProgressBar-B_g3VRUD.js.map → ProgressBar-CBhVZIzK.js.map} +1 -1
  105. package/dist/ProgressBar.js +1 -1
  106. package/dist/{Radio-DpSPaTCO.js → Radio-BMFwnzyz.js} +2 -2
  107. package/dist/{Radio-DpSPaTCO.js.map → Radio-BMFwnzyz.js.map} +1 -1
  108. package/dist/{Radio-CtG1jOiO.js → Radio-DtYoRq3m.js} +4 -4
  109. package/dist/{Radio-CtG1jOiO.js.map → Radio-DtYoRq3m.js.map} +1 -1
  110. package/dist/Radio.js +1 -1
  111. package/dist/{SearchField-CoeaOip5.js → SearchField-CtdtcrVV.js} +12 -4
  112. package/dist/SearchField-CtdtcrVV.js.map +1 -0
  113. package/dist/SearchField.js +1 -1
  114. package/dist/{SelectCard-WXTxM25t.js → SelectCard-yWBNnm7t.js} +32 -8
  115. package/dist/SelectCard-yWBNnm7t.js.map +1 -0
  116. package/dist/SelectCard.js +1 -1
  117. package/dist/SelectField.js +1 -1
  118. package/dist/SelectFieldSync-DfP3eETZ.js +1248 -0
  119. package/dist/SelectFieldSync-DfP3eETZ.js.map +1 -0
  120. package/dist/{SelectTrigger-DhEe9uk9.js → SelectTrigger-Cs5CGc4D.js} +2 -2
  121. package/dist/{SelectTrigger-DhEe9uk9.js.map → SelectTrigger-Cs5CGc4D.js.map} +1 -1
  122. package/dist/SelectTrigger.js +1 -1
  123. package/dist/{SelectTriggerBase-C6HYuH_N.js → SelectTriggerBase-Cs827tDp.js} +4 -4
  124. package/dist/{SelectTriggerBase-C6HYuH_N.js.map → SelectTriggerBase-Cs827tDp.js.map} +1 -1
  125. package/dist/{Stepper-D8lkCP8Y.js → Stepper-CzVKDg-N.js} +2 -2
  126. package/dist/{Stepper-D8lkCP8Y.js.map → Stepper-CzVKDg-N.js.map} +1 -1
  127. package/dist/Stepper.js +1 -1
  128. package/dist/{Switch-stfkX7Jb.js → Switch-CEmjmSiL.js} +2 -2
  129. package/dist/{Switch-stfkX7Jb.js.map → Switch-CEmjmSiL.js.map} +1 -1
  130. package/dist/Switch.js +1 -1
  131. package/dist/Table.js +1 -1
  132. package/dist/{TextField-rpj9q7zM.js → TextField-D9VWORek.js} +2 -2
  133. package/dist/{TextField-rpj9q7zM.js.map → TextField-D9VWORek.js.map} +1 -1
  134. package/dist/{TextField-DoC8YyDM.js → TextField-atI4M79b.js} +4 -4
  135. package/dist/{TextField-DoC8YyDM.js.map → TextField-atI4M79b.js.map} +1 -1
  136. package/dist/TextField.css +29 -25
  137. package/dist/TextField.js +1 -1
  138. package/dist/TextField.module-BP-hDP5m.js +22 -0
  139. package/dist/TextField.module-BP-hDP5m.js.map +1 -0
  140. package/dist/{Textarea-NLBfav5i.js → Textarea-D-kPIsIN.js} +3 -3
  141. package/dist/{Textarea-NLBfav5i.js.map → Textarea-D-kPIsIN.js.map} +1 -1
  142. package/dist/Textarea.js +1 -1
  143. package/dist/{TimeField-CnhHEvuK.js → TimeField-CbdxhawY.js} +3 -3
  144. package/dist/{TimeField-CnhHEvuK.js.map → TimeField-CbdxhawY.js.map} +1 -1
  145. package/dist/TimeField.js +1 -1
  146. package/dist/TimezoneMessage-Cnsl4cHT.js +84 -0
  147. package/dist/TimezoneMessage-Cnsl4cHT.js.map +1 -0
  148. package/dist/TimezoneMessage.css +7 -0
  149. package/dist/Toast.js +2 -2
  150. package/dist/{Toaster-Ca0dk3qg.js → Toaster-B652KIzq.js} +4 -4
  151. package/dist/{Toaster-Ca0dk3qg.js.map → Toaster-B652KIzq.js.map} +1 -1
  152. package/dist/{Toaster-ChpE9e3Z.js → Toaster-Bisc1mlh.js} +2 -2
  153. package/dist/{Toaster-ChpE9e3Z.js.map → Toaster-Bisc1mlh.js.map} +1 -1
  154. package/dist/{Toolbar-BO_vOFMg.js → Toolbar-4VdevLJd.js} +79 -65
  155. package/dist/Toolbar-4VdevLJd.js.map +1 -0
  156. package/dist/Toolbar.css +37 -55
  157. package/dist/Toolbar.js +1 -1
  158. package/dist/{Tooltip-CUiAJXak.js → Tooltip-Bt62hC5J.js} +5 -5
  159. package/dist/{Tooltip-CUiAJXak.js.map → Tooltip-Bt62hC5J.js.map} +1 -1
  160. package/dist/Tooltip.css +9 -8
  161. package/dist/Tooltip.js +1 -1
  162. package/dist/{YearlessDateInputWithPicker-BqDyd-Vq.js → YearlessDateInputWithPicker-BADNBDmy.js} +3 -3
  163. package/dist/{YearlessDateInputWithPicker-BqDyd-Vq.js.map → YearlessDateInputWithPicker-BADNBDmy.js.map} +1 -1
  164. package/dist/beta/components/MultiSelectField/MultiSelectField.d.ts +1 -10
  165. package/dist/beta/components/MultiSelectField/internal/MultiSelectFieldComboboxMode.d.ts +5 -0
  166. package/dist/beta/components/MultiSelectField/internal/MultiSelectFieldInput.d.ts +0 -2
  167. package/dist/beta/components/MultiSelectField/internal/MultiSelectFieldList.d.ts +3 -7
  168. package/dist/beta/components/MultiSelectField/internal/MultiSelectFieldSelectMode.d.ts +6 -0
  169. package/dist/beta/components/MultiSelectField/internal/MultiSelectFieldTrigger.d.ts +30 -0
  170. package/dist/beta/components/MultiSelectField/internal/types.d.ts +67 -0
  171. package/dist/beta/components/MultiSelectField/internal/useChipLayout.d.ts +19 -0
  172. package/dist/beta/components/MultiSelectField/internal/useComboMultiple.d.ts +1 -2
  173. package/dist/beta/components/MultiSelectField/internal/useSelectModeMultiple.d.ts +40 -0
  174. package/dist/beta/components/MultiSelectField/internal/useToggleSelection.d.ts +21 -0
  175. package/dist/beta/components/MultiSelectField/types.d.ts +9 -0
  176. package/dist/beta/components/SelectField/internal/FieldDialog/FieldDialog.d.ts +1 -1
  177. package/dist/beta/components/SelectField/internal/FieldListBase.d.ts +3 -4
  178. package/dist/beta/components/SelectField/internal/SelectFieldComboboxMode.d.ts +6 -0
  179. package/dist/beta/components/SelectField/internal/SelectFieldInput.d.ts +0 -2
  180. package/dist/beta/components/SelectField/internal/SelectFieldLabel.d.ts +4 -3
  181. package/dist/beta/components/SelectField/internal/SelectFieldList.d.ts +3 -7
  182. package/dist/beta/components/SelectField/internal/SelectFieldListItem.d.ts +2 -4
  183. package/dist/beta/components/SelectField/internal/SelectFieldSelectMode.d.ts +6 -0
  184. package/dist/beta/components/SelectField/internal/SelectFieldTrigger.d.ts +27 -0
  185. package/dist/beta/components/SelectField/internal/buildDownshiftItems.d.ts +22 -0
  186. package/dist/beta/components/SelectField/internal/types.d.ts +57 -0
  187. package/dist/beta/components/SelectField/internal/useCombo.d.ts +1 -5
  188. package/dist/beta/components/SelectField/internal/useProcessedOptions.d.ts +19 -0
  189. package/dist/beta/components/SelectField/internal/useSelectMode.d.ts +34 -0
  190. package/dist/beta/components/SelectField/types.d.ts +9 -0
  191. package/dist/beta/components/Table/DataTable/DataTable.d.ts +9 -2
  192. package/dist/beta/components/Table/DataTable/types.d.ts +20 -0
  193. package/dist/beta/components/Toolbar/Toolbar.d.ts +17 -7
  194. package/dist/beta/components/Toolbar/ToolbarButton.d.ts +0 -1
  195. package/dist/beta/components/Toolbar/ToolbarButtonLink.d.ts +0 -1
  196. package/dist/beta/components/Toolbar/ToolbarButtonToggle.d.ts +0 -1
  197. package/dist/beta/components/Toolbar/ToolbarSearchField.d.ts +2 -3
  198. package/dist/beta/components/Toolbar/ToolbarSelect.d.ts +0 -1
  199. package/dist/beta/components/Toolbar/internal/{ToolbarOverflowContext.d.ts → ToolbarContext.d.ts} +14 -5
  200. package/dist/beta/components/Toolbar/internal/utils/test.d.ts +5 -3
  201. package/dist/beta/components/Toolbar/types.d.ts +5 -1
  202. package/dist/beta.js +7 -7
  203. package/dist/components/ButtonLink/ButtonLink.d.ts +3 -3
  204. package/dist/components/DateFieldRange/DateFieldRange.d.ts +8 -1
  205. package/dist/components/DateFieldRange/internal/DateFieldRangeCalendar.d.ts +3 -1
  206. package/dist/components/DateFieldSingle/DateFieldSingle.d.ts +8 -1
  207. package/dist/components/DateFieldSingle/internal/DateFieldSingleCalendar.d.ts +3 -1
  208. package/dist/components/DateFieldSingle/internal/TimezoneMessage.d.ts +6 -0
  209. package/dist/components/DateFieldSingle/internal/utils.d.ts +11 -0
  210. package/dist/components/SearchField/SearchField.d.ts +8 -26
  211. package/dist/components/SearchField/internal/SearchField.d.ts +73 -0
  212. package/dist/components/Toolbar/Toolbar.d.ts +11 -5
  213. package/dist/components/Toolbar/ToolbarButton.d.ts +0 -1
  214. package/dist/components/Toolbar/ToolbarButtonLink.d.ts +0 -1
  215. package/dist/components/Toolbar/ToolbarButtonToggle.d.ts +0 -1
  216. package/dist/components/Toolbar/ToolbarSelect.d.ts +0 -1
  217. package/dist/components/Toolbar/internal/{ToolbarOverflowContext.d.ts → ToolbarContext.d.ts} +14 -5
  218. package/dist/components/Toolbar/internal/utils/test.d.ts +5 -3
  219. package/dist/components/Toolbar/types.d.ts +5 -1
  220. package/dist/{index-DFvIVS57.js → index-ClUtwV8V.js} +2 -2
  221. package/dist/{index-DFvIVS57.js.map → index-ClUtwV8V.js.map} +1 -1
  222. package/dist/index.js +82 -71
  223. package/dist/index.js.map +1 -1
  224. package/dist/index2.css +17 -23
  225. package/dist/{match-sorter.esm-B3vwg1-X.js → match-sorter.esm-adzV1NDp.js} +2 -2
  226. package/dist/{match-sorter.esm-B3vwg1-X.js.map → match-sorter.esm-adzV1NDp.js.map} +1 -1
  227. package/dist/{useDrilldown-CjabTI9n.js → useDrilldown-C8TRwNE9.js} +2 -2
  228. package/dist/{useDrilldown-CjabTI9n.js.map → useDrilldown-C8TRwNE9.js.map} +1 -1
  229. package/package.json +6 -4
  230. package/dist/Button.module-Ck7VrMqw.js +0 -26
  231. package/dist/Button.module-Ck7VrMqw.js.map +0 -1
  232. package/dist/ButtonLink-CRlyK750.js.map +0 -1
  233. package/dist/Combobox-BGYeW0ZF.js.map +0 -1
  234. package/dist/DateFieldRange-Dx2YbnQ-.js.map +0 -1
  235. package/dist/DateFieldSingle-CZg1n-n2.js.map +0 -1
  236. package/dist/FieldDialog-BHDi3oXg.js.map +0 -1
  237. package/dist/FieldMessage-B0LBQl0D.js +0 -132
  238. package/dist/FieldMessage-B0LBQl0D.js.map +0 -1
  239. package/dist/MultiSelectFieldSync-Bc7IphJ7.js.map +0 -1
  240. package/dist/SearchField-CoeaOip5.js.map +0 -1
  241. package/dist/SelectCard-WXTxM25t.js.map +0 -1
  242. package/dist/SelectFieldSync-0UwcyJTA.js +0 -744
  243. package/dist/SelectFieldSync-0UwcyJTA.js.map +0 -1
  244. package/dist/TextField.module-pD1felN8.js +0 -20
  245. package/dist/TextField.module-pD1felN8.js.map +0 -1
  246. package/dist/Toolbar-BO_vOFMg.js.map +0 -1
  247. package/dist/utils-BHKRoLps.js +0 -60
  248. package/dist/utils-BHKRoLps.js.map +0 -1
@@ -1,17 +1,17 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
- import { forwardRef, useMemo, useCallback, useRef, useState, useLayoutEffect, useId, useImperativeHandle, useEffect } from 'react';
3
- import { u as useDownshiftEnvironment, a as useCombobox, m as matchSorter } from './match-sorter.esm-B3vwg1-X.js';
4
- import { V as VirtualizedFieldListBase, F as FieldListBase, a as usePinnedOptions, b as useGroupedOptions, s as sortGroupSections, u as useAdaptiveView, D as DEFAULT_PAGE_SIZE, c as useSelectFieldLoading, d as useDebouncedCallback, S as SelectFieldLabel, e as FieldDialog, f as FieldPopover } from './FieldDialog-BHDi3oXg.js';
2
+ import { forwardRef, useMemo, useCallback, useRef, useState, useLayoutEffect, useEffect, useId, useImperativeHandle } from 'react';
3
+ import { u as useDownshiftEnvironment, a as useCombobox, b as useSelect, m as matchSorter } from './match-sorter.esm-adzV1NDp.js';
4
+ import { w as warnDeprecatedErrorUsage, a as warnOnce } from './utils-pudAMGnO.js';
5
+ import { V as VirtualizedFieldListBase, F as FieldListBase, a as useProcessedOptions, b as buildDownshiftItems, c as useDebouncedCallback, S as SelectFieldLabel, d as FieldDialog, e as FieldPopover, u as useAdaptiveView, D as DEFAULT_PAGE_SIZE, f as useSelectFieldLoading } from './FieldDialog-BghhsL2B.js';
5
6
  import { c as cx } from './index-SvGbrGuT.js';
6
- import { B as Button } from './Button-l7pTJdPc.js';
7
+ import { B as Button } from './Button-DrNDkO2f.js';
7
8
  import { C as Chip } from './Chip-Bc7jiIJ1.js';
8
9
  import { F as Flex } from './Flex-CUtXN-C0.js';
9
- import { m as mergeRefs } from './useMergeRefs-Dfmtq9cI.js';
10
+ import { m as mergeRefs, u as useMergeRefs } from './useMergeRefs-Dfmtq9cI.js';
10
11
  import { S as SvgChevronRight } from './chevron_right-BdpsxX7x.js';
11
12
  import { S as SvgClose } from './close-DZj38AEh.js';
12
13
  import { s as styles$1 } from './SelectTriggerBase.module-B0NFRlQP.js';
13
- import { F as FieldMessage } from './FieldMessage-B0LBQl0D.js';
14
- import { w as warnDeprecatedErrorUsage } from './utils-pudAMGnO.js';
14
+ import { F as FieldMessage } from './FieldMessage-OeP_xSUE.js';
15
15
  import { u as useLayoutPropsUtil } from './useLayoutPropsUtil-loxbyklF.js';
16
16
 
17
17
  import './MultiSelectFieldSync.css';const MultiSelectFieldList = forwardRef(({ selectedOptions, items, virtualize, ...rest }, ref) => {
@@ -80,40 +80,20 @@ const hasMultipleRows = (container) => {
80
80
  (child) => child.getBoundingClientRect().top !== firstTop
81
81
  );
82
82
  };
83
- const MultiSelectFieldInput = ({
84
- placeholder,
85
- size,
86
- disableClearButton,
87
- disableToggleButton,
88
- disabled,
89
- readOnly,
90
- error,
91
- onClear,
92
- id,
93
- inputWrapperRef,
94
- htmlInputWrapperProps,
95
- inputProps,
96
- toggleButtonProps,
97
- prefix,
98
- suffix,
99
- selectedOptions = [],
100
- onRemoveOption,
83
+ function useChipLayout({
84
+ selectedOptionsLength,
101
85
  singleRow,
102
- maxChips,
103
- onWrapperClick
104
- }) => {
86
+ maxChips
87
+ }) {
105
88
  const rowsRef = useRef(null);
106
- const inputRef = useRef(null);
107
- const externalRef = inputProps?.ref;
108
- const mergedInputRef = mergeRefs([inputRef, externalRef]);
109
89
  const [visibleCount, setVisibleCount] = useState(null);
110
- const prevSelectedLengthRef = useRef(selectedOptions.length);
90
+ const prevSelectedLengthRef = useRef(selectedOptionsLength);
111
91
  useLayoutEffect(() => {
112
- if (prevSelectedLengthRef.current !== selectedOptions.length) {
113
- prevSelectedLengthRef.current = selectedOptions.length;
92
+ if (prevSelectedLengthRef.current !== selectedOptionsLength) {
93
+ prevSelectedLengthRef.current = selectedOptionsLength;
114
94
  setVisibleCount(null);
115
95
  }
116
- }, [selectedOptions.length]);
96
+ }, [selectedOptionsLength]);
117
97
  useLayoutEffect(() => {
118
98
  if (!singleRow || !rowsRef.current) {
119
99
  setVisibleCount(null);
@@ -132,10 +112,43 @@ const MultiSelectFieldInput = ({
132
112
  if (hasMultipleRows(rowsRef.current) && visibleCount > 0) {
133
113
  setVisibleCount(visibleCount - 1);
134
114
  }
135
- }, [singleRow, selectedOptions.length, visibleCount]);
115
+ }, [singleRow, selectedOptionsLength, visibleCount]);
136
116
  const maxAllowed = maxChips ?? 10;
137
- const displayCount = singleRow && visibleCount !== null ? Math.min(visibleCount, maxAllowed) : Math.min(selectedOptions.length, maxAllowed);
138
- const hiddenCount = selectedOptions.length - displayCount;
117
+ const displayCount = singleRow && visibleCount !== null ? Math.min(visibleCount, maxAllowed) : Math.min(selectedOptionsLength, maxAllowed);
118
+ const hiddenCount = selectedOptionsLength - displayCount;
119
+ return { rowsRef, displayCount, hiddenCount };
120
+ }
121
+
122
+ const MultiSelectFieldInput = ({
123
+ placeholder,
124
+ size,
125
+ disableClearButton,
126
+ disableToggleButton,
127
+ disabled,
128
+ readOnly,
129
+ error,
130
+ onClear,
131
+ id,
132
+ inputWrapperRef,
133
+ htmlInputWrapperProps,
134
+ inputProps,
135
+ toggleButtonProps,
136
+ prefix,
137
+ suffix,
138
+ selectedOptions = [],
139
+ onRemoveOption,
140
+ singleRow,
141
+ maxChips,
142
+ onWrapperClick
143
+ }) => {
144
+ const inputRef = useRef(null);
145
+ const externalRef = inputProps?.ref;
146
+ const mergedInputRef = mergeRefs([inputRef, externalRef]);
147
+ const { rowsRef, displayCount, hiddenCount } = useChipLayout({
148
+ selectedOptionsLength: selectedOptions.length,
149
+ singleRow,
150
+ maxChips
151
+ });
139
152
  const inputWrapperClassNames = cx(styles["input-wrapper"], {
140
153
  [styles["small"]]: size === "small",
141
154
  [styles["large"]]: size === "large",
@@ -251,6 +264,34 @@ const MultiSelectFieldInput = ({
251
264
  };
252
265
  MultiSelectFieldInput.displayName = "MultiSelectFieldInput";
253
266
 
267
+ const useToggleSelection = ({
268
+ options,
269
+ pinnedSections,
270
+ selectedOptions,
271
+ onSelectedOptionsChange
272
+ }) => {
273
+ const allPinnedOptions = useMemo(() => {
274
+ return pinnedSections.flatMap((section) => section.options);
275
+ }, [pinnedSections]);
276
+ const handleItemClick = useCallback(
277
+ (option) => {
278
+ const isSelected = selectedOptions.some((opt) => opt.id === option.id);
279
+ if (isSelected) {
280
+ onSelectedOptionsChange(
281
+ selectedOptions.filter((opt) => opt.id !== option.id)
282
+ );
283
+ } else {
284
+ const fullOption = options.find((opt) => opt.id === option.id) || allPinnedOptions.find((opt) => opt.id === option.id);
285
+ if (fullOption) {
286
+ onSelectedOptionsChange([...selectedOptions, fullOption]);
287
+ }
288
+ }
289
+ },
290
+ [selectedOptions, onSelectedOptionsChange, options, allPinnedOptions]
291
+ );
292
+ return { handleItemClick, allPinnedOptions };
293
+ };
294
+
254
295
  const useComboMultiple = ({
255
296
  options,
256
297
  pinned,
@@ -268,20 +309,17 @@ const useComboMultiple = ({
268
309
  virtualize = false
269
310
  }) => {
270
311
  const [inputValue, setInputValue] = useState("");
271
- const { pinnedSections } = usePinnedOptions(pinned, inputValue);
272
- const { ungroupedItems, groupSections: rawGroupSections } = useGroupedOptions(
273
- options,
274
- groupToString
275
- );
276
- const groupSections = useMemo(() => {
277
- if (groupSorter && rawGroupSections.length > 0) {
278
- return sortGroupSections(rawGroupSections, groupSorter);
312
+ const { pinnedSections, ungroupedItems, groupSections } = useProcessedOptions(
313
+ {
314
+ options,
315
+ pinned,
316
+ searchValue: inputValue,
317
+ groupToString,
318
+ groupSorter
279
319
  }
280
- return rawGroupSections;
281
- }, [rawGroupSections, groupSorter]);
282
- const { downshiftItems, sectionsMeta } = useMemo(() => {
320
+ );
321
+ const bulkActionItems = useMemo(() => {
283
322
  const items = [];
284
- const meta = [];
285
323
  const hasSearchTerm = inputValue.trim().length > 0;
286
324
  const hasResults = ungroupedItems.length > 0 || groupSections.some((s) => s.options.length > 0) || pinnedSections.some((s) => s.options.length > 0);
287
325
  if (hasSearchTerm && selectFiltered && hasResults && !loading) {
@@ -306,86 +344,33 @@ const useComboMultiple = ({
306
344
  checkState: selectAll.checkState
307
345
  });
308
346
  }
309
- pinnedSections.forEach((section) => {
310
- const startIndex = items.length;
311
- section.options.forEach((option) => {
312
- items.push({
313
- id: option.id + "-pinned",
314
- type: "pinned-option",
315
- original: option,
316
- disabled: option.disabled ?? false
317
- });
318
- });
319
- const endIndex = items.length;
320
- if (endIndex > startIndex || section.loading) {
321
- meta.push({
322
- type: "pinned",
323
- label: section.label,
324
- startIndex,
325
- endIndex,
326
- loading: section.loading
327
- });
328
- }
329
- });
330
- groupSections.forEach((section) => {
331
- const startIndex = items.length;
332
- section.options.forEach((option) => {
333
- items.push({
334
- id: option.id,
335
- type: "grouped-option",
336
- original: option,
337
- disabled: option.disabled ?? false
338
- });
339
- });
340
- const endIndex = items.length;
341
- if (endIndex > startIndex) {
342
- meta.push({
343
- type: "group",
344
- label: section.label,
345
- startIndex,
346
- endIndex
347
- });
348
- }
349
- });
350
- ungroupedItems.forEach((item) => {
351
- items.push({
352
- id: item.id,
353
- type: "option",
354
- original: item.original,
355
- disabled: item.disabled ?? false
356
- });
357
- });
358
- return { downshiftItems: items, sectionsMeta: meta };
347
+ return items;
359
348
  }, [
360
- groupSections,
349
+ inputValue,
361
350
  ungroupedItems,
351
+ groupSections,
362
352
  pinnedSections,
363
- selectAll,
364
353
  selectFiltered,
365
- inputValue,
354
+ selectAll,
366
355
  loading
367
356
  ]);
357
+ const { downshiftItems, sectionsMeta } = useMemo(
358
+ () => buildDownshiftItems({
359
+ prefixItems: bulkActionItems,
360
+ pinnedSections,
361
+ groupSections,
362
+ ungroupedItems
363
+ }),
364
+ [bulkActionItems, pinnedSections, groupSections, ungroupedItems]
365
+ );
368
366
  const { ref: wrapperDivRef, environment } = useDownshiftEnvironment();
369
367
  const highlightChangeTypeRef = useRef("");
370
- const allPinnedOptions = useMemo(() => {
371
- return pinnedSections.flatMap((section) => section.options);
372
- }, [pinnedSections]);
373
- const handleItemClick = useCallback(
374
- (option) => {
375
- const isSelected = selectedOptions.some((opt) => opt.id === option.id);
376
- if (isSelected) {
377
- onSelectedOptionsChange(
378
- selectedOptions.filter((opt) => opt.id !== option.id)
379
- );
380
- } else {
381
- const fullOption = options.find((opt) => opt.id === option.id) || allPinnedOptions.find((opt) => opt.id === option.id);
382
- if (fullOption) {
383
- onSelectedOptionsChange([...selectedOptions, fullOption]);
384
- }
385
- }
386
- },
387
- [selectedOptions, onSelectedOptionsChange, options, allPinnedOptions]
388
- );
368
+ const { handleItemClick } = useToggleSelection({
369
+ options,
370
+ pinnedSections,
371
+ selectedOptions,
372
+ onSelectedOptionsChange
373
+ });
389
374
  const {
390
375
  isOpen,
391
376
  highlightedIndex,
@@ -463,7 +448,7 @@ const useComboMultiple = ({
463
448
  itemToString(item) {
464
449
  return item?.original.label ?? "";
465
450
  },
466
- stateReducer: (state, actionAndChanges) => stateReducer(state, actionAndChanges, displayAs)
451
+ stateReducer: (state, actionAndChanges) => stateReducer$1(state, actionAndChanges, displayAs)
467
452
  });
468
453
  return {
469
454
  inputValue: downshiftInputValue,
@@ -484,7 +469,7 @@ const useComboMultiple = ({
484
469
  selectedOptions
485
470
  };
486
471
  };
487
- function stateReducer(state, actionAndChanges, displayAs) {
472
+ function stateReducer$1(state, actionAndChanges, displayAs) {
488
473
  const { type, changes } = actionAndChanges;
489
474
  switch (type) {
490
475
  case useCombobox.stateChangeTypes.InputBlur:
@@ -537,113 +522,59 @@ function stateReducer(state, actionAndChanges, displayAs) {
537
522
  }
538
523
  }
539
524
 
540
- const MultiSelectField = forwardRef((propsWithLayout, ref) => {
541
- const { layoutStyles, componentProps } = useLayoutPropsUtil(propsWithLayout);
542
- const [initialLoadPerformed, setInitialLoadPerformed] = useState(false);
543
- const inputWrapperRef = useRef(null);
544
- const {
545
- id: idProp,
546
- value: selectedOptions,
547
- initialLoad: initialLoadProp = "auto",
548
- displayMenuAs: displayMenuAsProp = "auto",
549
- lazy,
550
- loadOptions: loadOptionsProp,
551
- label,
552
- labelNode,
553
- hideLabel,
554
- placeholder,
555
- debounceMs = 200,
556
- onSelectedOptionsChange,
557
- cache,
558
- size,
559
- error,
560
- hint,
561
- description,
562
- required,
563
- disabled,
564
- readOnly,
565
- prefix,
566
- suffix,
567
- selectAll,
568
- selectFiltered,
569
- singleRow,
570
- maxChips,
571
- warning,
572
- pinned,
573
- onSearchChange,
574
- className,
575
- style,
576
- virtualize
577
- } = componentProps;
578
- const groupToString = "groupToString" in componentProps ? componentProps.groupToString : void 0;
579
- const groupSorter = "groupSorter" in componentProps ? componentProps.groupSorter : void 0;
580
- const autoId = useId();
581
- const id = idProp ?? autoId;
582
- const helperUid = useId();
583
- warnDeprecatedErrorUsage("MultiSelectField", error);
584
- const errorMessages = typeof error === "boolean" || error === void 0 ? void 0 : error;
585
- const hasHelperText = hint || errorMessages || warning || description;
586
- const isDisabledOrReadOnly = (disabled || readOnly) ?? false;
587
- const { isMobile } = useAdaptiveView();
588
- const displayAs = displayMenuAsProp === "auto" ? isMobile ? "dialog" : "popover" : displayMenuAsProp;
589
- const initialLoad = initialLoadProp === "auto" ? "immediate" : initialLoadProp;
590
- const pageSize = lazy === "page" && "lazyOptions" in componentProps ? componentProps.lazyOptions?.pageSize ?? DEFAULT_PAGE_SIZE : DEFAULT_PAGE_SIZE;
591
- const limit = lazy === "offset" && "lazyOptions" in componentProps ? componentProps.lazyOptions?.limit ?? DEFAULT_PAGE_SIZE : DEFAULT_PAGE_SIZE;
592
- const loadingHookConfig = useMemo(() => {
593
- const cacheConfig = {
594
- enabled: cache?.enabled,
595
- maxSize: cache?.maxSize
596
- };
597
- if (lazy === "page")
598
- return {
599
- lazy: "page",
600
- loadOptions: loadOptionsProp,
601
- pageSize,
602
- cache: cacheConfig
603
- };
604
- if (lazy === "offset")
605
- return {
606
- lazy: "offset",
607
- loadOptions: loadOptionsProp,
608
- limit,
609
- cache: cacheConfig
610
- };
611
- if (lazy === "group")
612
- return {
613
- lazy: "group",
614
- loadOptions: loadOptionsProp,
615
- cache: cacheConfig
616
- };
617
- return {
618
- lazy: false,
619
- loadOptions: loadOptionsProp,
620
- cache: cacheConfig
621
- };
622
- }, [lazy, loadOptionsProp, pageSize, limit, cache?.enabled, cache?.maxSize]);
623
- const {
624
- options,
625
- loading,
626
- loadingMore,
627
- hasMore,
628
- loadOptions,
629
- loadMore,
630
- clearCache
631
- } = useSelectFieldLoading(loadingHookConfig);
632
- useImperativeHandle(ref, () => ({ clearCache }), [clearCache]);
525
+ const MultiSelectFieldComboboxMode = ({
526
+ id,
527
+ helperUid,
528
+ selectedOptions,
529
+ onSelectedOptionsChange,
530
+ displayAs,
531
+ isDisabledOrReadOnly,
532
+ disabled,
533
+ readOnly,
534
+ required,
535
+ placeholder,
536
+ size,
537
+ error,
538
+ hasHelperText,
539
+ disableClearButton,
540
+ prefix,
541
+ suffix,
542
+ label,
543
+ labelNode,
544
+ hideLabel,
545
+ hint,
546
+ errorMessages,
547
+ warning,
548
+ description,
549
+ className,
550
+ style,
551
+ layoutStyles,
552
+ pinned,
553
+ groupToString,
554
+ groupSorter,
555
+ virtualize,
556
+ options,
557
+ loading,
558
+ loadingMore,
559
+ hasMore,
560
+ loadOptions,
561
+ loadMore,
562
+ initialLoad,
563
+ initialLoadPerformed,
564
+ setInitialLoadPerformed,
565
+ inputWrapperRef,
566
+ debounceMs,
567
+ selectAll,
568
+ selectFiltered,
569
+ singleRow,
570
+ maxChips,
571
+ onSearchChange,
572
+ handleRemoveOption,
573
+ handleClear
574
+ }) => {
633
575
  const debouncedOptionLoader = useDebouncedCallback((inputValue2) => {
634
576
  loadOptions(inputValue2, { initial: true });
635
577
  }, debounceMs);
636
- const handleRemoveOption = useCallback(
637
- (option) => {
638
- onSelectedOptionsChange(
639
- selectedOptions.filter((opt) => opt.id !== option.id)
640
- );
641
- },
642
- [selectedOptions, onSelectedOptionsChange]
643
- );
644
- const handleClear = useCallback(() => {
645
- onSelectedOptionsChange([]);
646
- }, [onSelectedOptionsChange]);
647
578
  const {
648
579
  isOpen,
649
580
  getToggleButtonProps,
@@ -670,19 +601,8 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
670
601
  groupToString,
671
602
  groupSorter,
672
603
  selectedOptions,
673
- selectAll: selectAll ? {
674
- label: selectAll.label ?? "Select All",
675
- onClick: selectAll.onClick,
676
- checkState: selectAll.checkState === true ? "checked" : selectAll.checkState === false ? "unchecked" : selectAll.checkState ?? "indeterminate"
677
- } : void 0,
678
- selectFiltered: selectFiltered ? (searchValue) => {
679
- const config = selectFiltered(searchValue);
680
- return {
681
- label: config.label,
682
- onClick: config.onClick,
683
- checkState: config.checkState === true ? "checked" : config.checkState === false ? "unchecked" : config.checkState ?? "indeterminate"
684
- };
685
- } : void 0,
604
+ selectAll,
605
+ selectFiltered,
686
606
  async onIsOpenChange(changes) {
687
607
  if (initialLoad === "open" && !initialLoadPerformed && changes.isOpen) {
688
608
  await loadOptions("", { initial: true });
@@ -702,11 +622,10 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
702
622
  }
703
623
  };
704
624
  performInitialLoad();
705
- }, [loadOptions, initialLoadPerformed, initialLoad]);
625
+ }, [loadOptions, initialLoadPerformed, initialLoad, setInitialLoadPerformed]);
706
626
  const handleLoadMore = async () => {
707
627
  await loadMore(inputValue);
708
628
  };
709
- const disableClearButton = selectedOptions.length === 0 || isDisabledOrReadOnly;
710
629
  if (displayAs === "dialog") {
711
630
  return /* @__PURE__ */ jsxs(
712
631
  "div",
@@ -850,7 +769,6 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
850
769
  disableClearButton,
851
770
  onClear: handleClear,
852
771
  id: `${id}-input`,
853
- popoverTarget: `${id}-popover`,
854
772
  inputWrapperRef,
855
773
  size,
856
774
  error: !!error,
@@ -904,16 +822,729 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
904
822
  ]
905
823
  }
906
824
  );
907
- });
908
- MultiSelectField.displayName = "MultiSelectField";
825
+ };
909
826
 
910
- const defaultFilter = (options, searchValue) => matchSorter(options, searchValue, {
911
- keys: ["label", "searchText"],
912
- baseSort: (a, b) => a.index - b.index
913
- });
914
- const toFilterFn = (filter) => typeof filter === "function" ? filter : (options, searchValue) => matchSorter(options, searchValue, {
915
- baseSort: (a, b) => a.index - b.index,
916
- ...filter
827
+ const MultiSelectFieldTrigger = ({
828
+ placeholder,
829
+ size,
830
+ disableClearButton,
831
+ disabled,
832
+ readOnly,
833
+ error,
834
+ onClear,
835
+ id,
836
+ inputWrapperRef,
837
+ toggleButtonProps,
838
+ prefix,
839
+ suffix,
840
+ selectedOptions = [],
841
+ onRemoveOption,
842
+ singleRow,
843
+ maxChips,
844
+ popoverTarget
845
+ }) => {
846
+ const { ref: downshiftRef, ...restToggleButtonProps } = toggleButtonProps ?? {};
847
+ const triggerRef = useRef(null);
848
+ const mergedRef = useMergeRefs([inputWrapperRef, downshiftRef, triggerRef]);
849
+ const { rowsRef, displayCount, hiddenCount } = useChipLayout({
850
+ selectedOptionsLength: selectedOptions.length,
851
+ singleRow,
852
+ maxChips
853
+ });
854
+ const inputWrapperClassNames = cx(styles["input-wrapper"], {
855
+ [styles["small"]]: size === "small",
856
+ [styles["large"]]: size === "large",
857
+ [styles["no-clear-button"]]: disableClearButton,
858
+ [styles["disabled"]]: disabled || readOnly
859
+ });
860
+ return /* @__PURE__ */ jsxs("div", { style: { position: "relative" }, children: [
861
+ /* @__PURE__ */ jsxs(
862
+ "div",
863
+ {
864
+ ref: mergedRef,
865
+ ...restToggleButtonProps,
866
+ popovertarget: popoverTarget,
867
+ id,
868
+ className: cx(inputWrapperClassNames, restToggleButtonProps?.className),
869
+ children: [
870
+ prefix ? /* @__PURE__ */ jsx("div", { className: styles["prefix"], children: prefix }) : null,
871
+ /* @__PURE__ */ jsxs("div", { className: styles["rows-wrapper"], ref: rowsRef, children: [
872
+ selectedOptions.length > 0 && onRemoveOption ? selectedOptions.slice(0, displayCount).map((option, index) => /* @__PURE__ */ jsx(
873
+ "div",
874
+ {
875
+ className: styles["chip-wrapper"],
876
+ children: /* @__PURE__ */ jsx(
877
+ Chip,
878
+ {
879
+ label: option.label,
880
+ onClose: disabled || readOnly ? void 0 : (e) => {
881
+ e.stopPropagation();
882
+ onRemoveOption(option);
883
+ triggerRef.current?.focus();
884
+ },
885
+ className: styles["chip"],
886
+ title: option.label
887
+ }
888
+ )
889
+ },
890
+ `selected-item-${option.id}-${index}`
891
+ )) : null,
892
+ hiddenCount > 0 ? /* @__PURE__ */ jsx("div", { className: styles["chip-wrapper"], children: /* @__PURE__ */ jsx(
893
+ Chip,
894
+ {
895
+ label: `+${hiddenCount}`,
896
+ className: styles["chip"],
897
+ title: selectedOptions.slice(displayCount).map((option) => option.label).join(", ")
898
+ }
899
+ ) }) : null,
900
+ selectedOptions.length === 0 ? /* @__PURE__ */ jsxs(Flex, { className: styles["input-flex"], alignItems: "center", children: [
901
+ /* @__PURE__ */ jsx(
902
+ "div",
903
+ {
904
+ className: cx(styles["input"], {
905
+ [styles["error"]]: error
906
+ }),
907
+ children: placeholder
908
+ }
909
+ ),
910
+ suffix ? /* @__PURE__ */ jsx("div", { className: styles["suffix"], children: suffix }) : null
911
+ ] }) : null
912
+ ] }),
913
+ /* @__PURE__ */ jsx("div", { className: styles["buttons-wrapper"], children: /* @__PURE__ */ jsx("div", { className: styles["toggle-button-wrapper"], children: /* @__PURE__ */ jsx(
914
+ Button,
915
+ {
916
+ icon: SvgChevronRight,
917
+ "aria-label": "toggle menu",
918
+ appearance: "ghost",
919
+ size: "small",
920
+ disabled,
921
+ tabIndex: -1,
922
+ className: styles["toggle-button"]
923
+ }
924
+ ) }) })
925
+ ]
926
+ }
927
+ ),
928
+ disableClearButton ? null : /* @__PURE__ */ jsx(
929
+ "div",
930
+ {
931
+ className: styles["buttons-wrapper"],
932
+ style: { insetInlineEnd: "2rem" },
933
+ children: /* @__PURE__ */ jsx("div", { className: styles["close-button-wrapper"], children: /* @__PURE__ */ jsx(
934
+ Button,
935
+ {
936
+ icon: SvgClose,
937
+ "aria-label": "clear selection",
938
+ appearance: "ghost",
939
+ size: "small",
940
+ className: styles["close-button"],
941
+ onClick: (e) => {
942
+ e.stopPropagation();
943
+ onClear?.();
944
+ }
945
+ }
946
+ ) })
947
+ }
948
+ )
949
+ ] });
950
+ };
951
+ MultiSelectFieldTrigger.displayName = "MultiSelectFieldTrigger";
952
+
953
+ const useSelectModeMultiple = ({
954
+ options,
955
+ pinned,
956
+ groupToString,
957
+ groupSorter,
958
+ selectAll,
959
+ selectedOptions,
960
+ onSelectedOptionsChange,
961
+ onIsOpenChange,
962
+ displayAs = "popover",
963
+ disabled,
964
+ virtualize = false
965
+ }) => {
966
+ const { pinnedSections, ungroupedItems, groupSections } = useProcessedOptions(
967
+ {
968
+ options,
969
+ pinned,
970
+ searchValue: "",
971
+ groupToString,
972
+ groupSorter
973
+ }
974
+ );
975
+ const bulkActionItems = useMemo(() => {
976
+ const items = [];
977
+ if (selectAll) {
978
+ items.push({
979
+ id: "select-all",
980
+ type: "select-all",
981
+ original: {
982
+ id: "select-all",
983
+ label: selectAll.label ?? "Select All"
984
+ },
985
+ checkState: selectAll.checkState
986
+ });
987
+ }
988
+ return items;
989
+ }, [selectAll]);
990
+ const { downshiftItems, sectionsMeta } = useMemo(
991
+ () => buildDownshiftItems({
992
+ prefixItems: bulkActionItems,
993
+ pinnedSections,
994
+ groupSections,
995
+ ungroupedItems
996
+ }),
997
+ [bulkActionItems, pinnedSections, groupSections, ungroupedItems]
998
+ );
999
+ const { ref: wrapperDivRef, environment } = useDownshiftEnvironment();
1000
+ const { handleItemClick } = useToggleSelection({
1001
+ options,
1002
+ pinnedSections,
1003
+ selectedOptions,
1004
+ onSelectedOptionsChange
1005
+ });
1006
+ const {
1007
+ isOpen,
1008
+ highlightedIndex,
1009
+ getToggleButtonProps,
1010
+ getLabelProps,
1011
+ getMenuProps,
1012
+ getItemProps,
1013
+ closeMenu,
1014
+ openMenu
1015
+ } = useSelect({
1016
+ isItemDisabled: (item) => {
1017
+ if (!item) return false;
1018
+ return (disabled || item.disabled) ?? false;
1019
+ },
1020
+ environment,
1021
+ selectedItem: null,
1022
+ onSelectedItemChange: ({
1023
+ selectedItem: si
1024
+ }) => {
1025
+ if (si) {
1026
+ if (si.type === "select-all") {
1027
+ selectAll?.onClick();
1028
+ } else if (si.type === "option" || si.type === "pinned-option" || si.type === "grouped-option") {
1029
+ handleItemClick(si.original);
1030
+ }
1031
+ }
1032
+ },
1033
+ onIsOpenChange,
1034
+ items: downshiftItems,
1035
+ itemToString(item) {
1036
+ return item?.original.label ?? "";
1037
+ },
1038
+ stateReducer: (state, actionAndChanges) => stateReducer(state, actionAndChanges, displayAs),
1039
+ ...virtualize && { scrollIntoView: () => {
1040
+ } }
1041
+ });
1042
+ return {
1043
+ wrapperDivRef,
1044
+ getToggleButtonProps,
1045
+ getLabelProps,
1046
+ getMenuProps,
1047
+ getItemProps,
1048
+ highlightedIndex,
1049
+ isOpen,
1050
+ downshiftItems,
1051
+ sectionsMeta,
1052
+ closeMenu,
1053
+ openMenu,
1054
+ toggleMenu: () => isOpen ? closeMenu() : openMenu(),
1055
+ selectedOptions
1056
+ };
1057
+ };
1058
+ function stateReducer(state, actionAndChanges, displayAs) {
1059
+ const { type, changes } = actionAndChanges;
1060
+ switch (type) {
1061
+ case useSelect.stateChangeTypes.ToggleButtonBlur:
1062
+ if (displayAs === "dialog" && state.isOpen) {
1063
+ return { ...changes, isOpen: state.isOpen, selectedItem: null };
1064
+ }
1065
+ return { ...changes, selectedItem: null };
1066
+ case useSelect.stateChangeTypes.ToggleButtonKeyDownEnter:
1067
+ case useSelect.stateChangeTypes.ToggleButtonKeyDownSpaceButton:
1068
+ case useSelect.stateChangeTypes.ItemClick:
1069
+ return {
1070
+ ...changes,
1071
+ isOpen: state.isOpen,
1072
+ highlightedIndex: state.highlightedIndex
1073
+ };
1074
+ case useSelect.stateChangeTypes.ToggleButtonKeyDownEscape:
1075
+ case useSelect.stateChangeTypes.FunctionCloseMenu:
1076
+ return changes;
1077
+ case useSelect.stateChangeTypes.ToggleButtonClick:
1078
+ if (displayAs === "dialog" && state.isOpen) {
1079
+ return { ...changes, isOpen: state.isOpen };
1080
+ }
1081
+ return changes;
1082
+ default:
1083
+ return changes;
1084
+ }
1085
+ }
1086
+
1087
+ const MultiSelectFieldSelectMode = ({
1088
+ id,
1089
+ helperUid,
1090
+ selectedOptions,
1091
+ onSelectedOptionsChange,
1092
+ displayAs,
1093
+ isDisabledOrReadOnly,
1094
+ disabled,
1095
+ readOnly,
1096
+ required,
1097
+ placeholder,
1098
+ size,
1099
+ error,
1100
+ hasHelperText,
1101
+ disableClearButton,
1102
+ prefix,
1103
+ suffix,
1104
+ label,
1105
+ labelNode,
1106
+ hideLabel,
1107
+ hint,
1108
+ errorMessages,
1109
+ warning,
1110
+ description,
1111
+ className,
1112
+ style,
1113
+ layoutStyles,
1114
+ pinned,
1115
+ groupToString,
1116
+ groupSorter,
1117
+ virtualize,
1118
+ options,
1119
+ loading,
1120
+ loadingMore,
1121
+ hasMore,
1122
+ loadOptions,
1123
+ loadMore,
1124
+ initialLoad,
1125
+ initialLoadPerformed,
1126
+ setInitialLoadPerformed,
1127
+ inputWrapperRef,
1128
+ selectAll,
1129
+ singleRow,
1130
+ maxChips,
1131
+ handleRemoveOption,
1132
+ handleClear
1133
+ }) => {
1134
+ const {
1135
+ isOpen,
1136
+ getToggleButtonProps,
1137
+ getLabelProps,
1138
+ getMenuProps,
1139
+ wrapperDivRef,
1140
+ highlightedIndex,
1141
+ getItemProps,
1142
+ downshiftItems,
1143
+ sectionsMeta,
1144
+ closeMenu
1145
+ } = useSelectModeMultiple({
1146
+ displayAs,
1147
+ onSelectedOptionsChange,
1148
+ disabled: isDisabledOrReadOnly,
1149
+ options,
1150
+ pinned,
1151
+ virtualize,
1152
+ groupToString,
1153
+ groupSorter,
1154
+ selectedOptions,
1155
+ selectAll,
1156
+ async onIsOpenChange(changes) {
1157
+ if (initialLoad === "open" && !initialLoadPerformed && changes.isOpen) {
1158
+ await loadOptions("", { initial: true });
1159
+ setInitialLoadPerformed(true);
1160
+ }
1161
+ }
1162
+ });
1163
+ useEffect(() => {
1164
+ const performInitialLoad = async () => {
1165
+ if (initialLoad === "immediate" && !initialLoadPerformed) {
1166
+ await loadOptions("", { initial: true });
1167
+ setInitialLoadPerformed(true);
1168
+ }
1169
+ };
1170
+ performInitialLoad();
1171
+ }, [loadOptions, initialLoadPerformed, initialLoad, setInitialLoadPerformed]);
1172
+ const handleLoadMore = async () => {
1173
+ await loadMore("");
1174
+ };
1175
+ const toggleButtonProps = getToggleButtonProps({
1176
+ disabled: !!disabled,
1177
+ "aria-required": required ? true : void 0,
1178
+ "aria-describedby": hasHelperText ? helperUid : void 0,
1179
+ "aria-invalid": error ? true : void 0
1180
+ });
1181
+ if (displayAs === "dialog") {
1182
+ return /* @__PURE__ */ jsxs(
1183
+ "div",
1184
+ {
1185
+ className: className ? `${styles$1["search-field"]} ${className}` : styles$1["search-field"],
1186
+ style: { ...layoutStyles, ...style },
1187
+ ref: wrapperDivRef,
1188
+ children: [
1189
+ /* @__PURE__ */ jsx(
1190
+ SelectFieldLabel,
1191
+ {
1192
+ label,
1193
+ labelNode,
1194
+ hideLabel,
1195
+ getLabelProps,
1196
+ required
1197
+ }
1198
+ ),
1199
+ /* @__PURE__ */ jsx(
1200
+ MultiSelectFieldTrigger,
1201
+ {
1202
+ disabled,
1203
+ readOnly,
1204
+ placeholder,
1205
+ disableClearButton,
1206
+ toggleButtonProps,
1207
+ onClear: handleClear,
1208
+ id: `${id}-trigger`,
1209
+ inputWrapperRef,
1210
+ size,
1211
+ error: !!error,
1212
+ prefix,
1213
+ suffix,
1214
+ selectedOptions,
1215
+ onRemoveOption: handleRemoveOption,
1216
+ singleRow,
1217
+ maxChips
1218
+ }
1219
+ ),
1220
+ hasHelperText ? /* @__PURE__ */ jsx(
1221
+ FieldMessage,
1222
+ {
1223
+ id: helperUid,
1224
+ hint,
1225
+ error: errorMessages,
1226
+ warning,
1227
+ description
1228
+ }
1229
+ ) : null,
1230
+ /* @__PURE__ */ jsx(
1231
+ FieldDialog,
1232
+ {
1233
+ id: `${id}-dialog`,
1234
+ isOpen,
1235
+ onClose: closeMenu,
1236
+ title: label,
1237
+ children: /* @__PURE__ */ jsx(
1238
+ MultiSelectFieldList,
1239
+ {
1240
+ isOpen: true,
1241
+ items: downshiftItems,
1242
+ getMenuProps: (opts) => getMenuProps({
1243
+ ...opts,
1244
+ style: { ...opts?.style, outline: "none" },
1245
+ onKeyDown: toggleButtonProps.onKeyDown,
1246
+ tabIndex: 0,
1247
+ "aria-activedescendant": toggleButtonProps["aria-activedescendant"]
1248
+ }),
1249
+ getItemProps,
1250
+ highlightedIndex,
1251
+ selectedOptions,
1252
+ hasMore,
1253
+ onLoadMore: handleLoadMore,
1254
+ loading,
1255
+ loadingMore,
1256
+ disabled: isDisabledOrReadOnly,
1257
+ sectionsMeta,
1258
+ virtualize
1259
+ }
1260
+ )
1261
+ }
1262
+ )
1263
+ ]
1264
+ }
1265
+ );
1266
+ }
1267
+ return /* @__PURE__ */ jsxs(
1268
+ "div",
1269
+ {
1270
+ className: className ? `${styles$1["search-field"]} ${className}` : styles$1["search-field"],
1271
+ style: { ...layoutStyles, ...style },
1272
+ children: [
1273
+ /* @__PURE__ */ jsx(
1274
+ SelectFieldLabel,
1275
+ {
1276
+ label,
1277
+ labelNode,
1278
+ hideLabel,
1279
+ getLabelProps,
1280
+ required
1281
+ }
1282
+ ),
1283
+ /* @__PURE__ */ jsx(
1284
+ MultiSelectFieldTrigger,
1285
+ {
1286
+ disabled,
1287
+ readOnly,
1288
+ placeholder,
1289
+ disableClearButton,
1290
+ toggleButtonProps,
1291
+ onClear: handleClear,
1292
+ id: `${id}-trigger`,
1293
+ popoverTarget: `${id}-popover`,
1294
+ inputWrapperRef,
1295
+ size,
1296
+ error: !!error,
1297
+ prefix,
1298
+ suffix,
1299
+ selectedOptions,
1300
+ onRemoveOption: handleRemoveOption,
1301
+ singleRow,
1302
+ maxChips
1303
+ }
1304
+ ),
1305
+ hasHelperText ? /* @__PURE__ */ jsx(
1306
+ FieldMessage,
1307
+ {
1308
+ id: helperUid,
1309
+ hint,
1310
+ error: errorMessages,
1311
+ warning,
1312
+ description
1313
+ }
1314
+ ) : null,
1315
+ /* @__PURE__ */ jsx(
1316
+ FieldPopover,
1317
+ {
1318
+ id: `${id}-popover`,
1319
+ referenceElement: inputWrapperRef,
1320
+ open: isOpen && displayAs === "popover",
1321
+ onClickOutside: closeMenu,
1322
+ children: /* @__PURE__ */ jsx(
1323
+ MultiSelectFieldList,
1324
+ {
1325
+ isOpen,
1326
+ items: downshiftItems,
1327
+ getMenuProps,
1328
+ getItemProps,
1329
+ highlightedIndex,
1330
+ selectedOptions,
1331
+ hasMore,
1332
+ onLoadMore: handleLoadMore,
1333
+ loading,
1334
+ loadingMore,
1335
+ disabled: isDisabledOrReadOnly,
1336
+ sectionsMeta,
1337
+ virtualize
1338
+ }
1339
+ )
1340
+ }
1341
+ )
1342
+ ]
1343
+ }
1344
+ );
1345
+ };
1346
+
1347
+ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
1348
+ const { layoutStyles, componentProps } = useLayoutPropsUtil(propsWithLayout);
1349
+ const [initialLoadPerformed, setInitialLoadPerformed] = useState(false);
1350
+ const inputWrapperRef = useRef(null);
1351
+ const {
1352
+ id: idProp,
1353
+ value: selectedOptions,
1354
+ initialLoad: initialLoadProp = "auto",
1355
+ displayMenuAs: displayMenuAsProp = "auto",
1356
+ lazy,
1357
+ loadOptions: loadOptionsProp,
1358
+ label,
1359
+ labelNode,
1360
+ hideLabel,
1361
+ placeholder,
1362
+ debounceMs = 200,
1363
+ onSelectedOptionsChange,
1364
+ cache,
1365
+ size,
1366
+ error,
1367
+ hint,
1368
+ description,
1369
+ required,
1370
+ disabled,
1371
+ readOnly,
1372
+ prefix,
1373
+ suffix,
1374
+ selectAll: selectAllProp,
1375
+ selectFiltered: selectFilteredProp,
1376
+ singleRow,
1377
+ maxChips,
1378
+ warning,
1379
+ pinned,
1380
+ onSearchChange,
1381
+ className,
1382
+ style,
1383
+ virtualize,
1384
+ disableSearch
1385
+ } = componentProps;
1386
+ const groupToString = "groupToString" in componentProps ? componentProps.groupToString : void 0;
1387
+ const groupSorter = "groupSorter" in componentProps ? componentProps.groupSorter : void 0;
1388
+ const autoId = useId();
1389
+ const id = idProp ?? autoId;
1390
+ const helperUid = useId();
1391
+ warnDeprecatedErrorUsage("MultiSelectField", error);
1392
+ if (disableSearch && selectFilteredProp) {
1393
+ warnOnce(
1394
+ "MultiSelectField: `selectFiltered` has no effect when `disableSearch` is true because there is no search input to produce filtered results."
1395
+ );
1396
+ }
1397
+ const errorMessages = typeof error === "boolean" || error === void 0 ? void 0 : error;
1398
+ const hasHelperText = !!(hint || errorMessages || warning || description);
1399
+ const isDisabledOrReadOnly = (disabled || readOnly) ?? false;
1400
+ const { isMobile } = useAdaptiveView();
1401
+ const displayAs = displayMenuAsProp === "auto" ? isMobile ? "dialog" : "popover" : displayMenuAsProp;
1402
+ const initialLoad = initialLoadProp === "auto" ? "immediate" : initialLoadProp;
1403
+ const pageSize = lazy === "page" && "lazyOptions" in componentProps ? componentProps.lazyOptions?.pageSize ?? DEFAULT_PAGE_SIZE : DEFAULT_PAGE_SIZE;
1404
+ const limit = lazy === "offset" && "lazyOptions" in componentProps ? componentProps.lazyOptions?.limit ?? DEFAULT_PAGE_SIZE : DEFAULT_PAGE_SIZE;
1405
+ const loadingHookConfig = useMemo(() => {
1406
+ const cacheConfig = {
1407
+ enabled: cache?.enabled,
1408
+ maxSize: cache?.maxSize
1409
+ };
1410
+ if (lazy === "page")
1411
+ return {
1412
+ lazy: "page",
1413
+ loadOptions: loadOptionsProp,
1414
+ pageSize,
1415
+ cache: cacheConfig
1416
+ };
1417
+ if (lazy === "offset")
1418
+ return {
1419
+ lazy: "offset",
1420
+ loadOptions: loadOptionsProp,
1421
+ limit,
1422
+ cache: cacheConfig
1423
+ };
1424
+ if (lazy === "group")
1425
+ return {
1426
+ lazy: "group",
1427
+ loadOptions: loadOptionsProp,
1428
+ cache: cacheConfig
1429
+ };
1430
+ return {
1431
+ lazy: false,
1432
+ loadOptions: loadOptionsProp,
1433
+ cache: cacheConfig
1434
+ };
1435
+ }, [lazy, loadOptionsProp, pageSize, limit, cache?.enabled, cache?.maxSize]);
1436
+ const {
1437
+ options,
1438
+ loading,
1439
+ loadingMore,
1440
+ hasMore,
1441
+ loadOptions,
1442
+ loadMore,
1443
+ clearCache
1444
+ } = useSelectFieldLoading(loadingHookConfig);
1445
+ useImperativeHandle(
1446
+ ref,
1447
+ () => ({
1448
+ clearCache,
1449
+ invalidate: () => {
1450
+ clearCache();
1451
+ setInitialLoadPerformed(false);
1452
+ }
1453
+ }),
1454
+ [clearCache]
1455
+ );
1456
+ const handleRemoveOption = useCallback(
1457
+ (option) => {
1458
+ onSelectedOptionsChange(
1459
+ selectedOptions.filter((opt) => opt.id !== option.id)
1460
+ );
1461
+ },
1462
+ [selectedOptions, onSelectedOptionsChange]
1463
+ );
1464
+ const handleClear = useCallback(() => {
1465
+ onSelectedOptionsChange([]);
1466
+ }, [onSelectedOptionsChange]);
1467
+ const disableClearButton = selectedOptions.length === 0 || isDisabledOrReadOnly;
1468
+ const selectAll = selectAllProp ? {
1469
+ label: selectAllProp.label ?? "Select All",
1470
+ onClick: selectAllProp.onClick,
1471
+ checkState: selectAllProp.checkState === true ? "checked" : selectAllProp.checkState === false ? "unchecked" : selectAllProp.checkState ?? "indeterminate"
1472
+ } : void 0;
1473
+ const selectFiltered = selectFilteredProp ? (searchValue) => {
1474
+ const config = selectFilteredProp(searchValue);
1475
+ return {
1476
+ label: config.label,
1477
+ onClick: config.onClick,
1478
+ checkState: config.checkState === true ? "checked" : config.checkState === false ? "unchecked" : config.checkState ?? "indeterminate"
1479
+ };
1480
+ } : void 0;
1481
+ const baseProps = {
1482
+ id,
1483
+ helperUid,
1484
+ selectedOptions,
1485
+ onSelectedOptionsChange,
1486
+ displayAs,
1487
+ isDisabledOrReadOnly,
1488
+ disabled,
1489
+ readOnly,
1490
+ required,
1491
+ placeholder,
1492
+ size,
1493
+ error,
1494
+ hasHelperText,
1495
+ disableClearButton,
1496
+ prefix,
1497
+ suffix,
1498
+ label,
1499
+ labelNode,
1500
+ hideLabel,
1501
+ hint,
1502
+ errorMessages,
1503
+ warning,
1504
+ description,
1505
+ className,
1506
+ style,
1507
+ layoutStyles,
1508
+ pinned,
1509
+ groupToString,
1510
+ groupSorter,
1511
+ virtualize,
1512
+ options,
1513
+ loading,
1514
+ loadingMore,
1515
+ hasMore,
1516
+ loadOptions,
1517
+ loadMore,
1518
+ initialLoad,
1519
+ initialLoadPerformed,
1520
+ setInitialLoadPerformed,
1521
+ inputWrapperRef,
1522
+ selectAll,
1523
+ singleRow,
1524
+ maxChips,
1525
+ handleRemoveOption,
1526
+ handleClear
1527
+ };
1528
+ if (disableSearch) {
1529
+ return /* @__PURE__ */ jsx(MultiSelectFieldSelectMode, { ...baseProps });
1530
+ }
1531
+ const comboboxProps = {
1532
+ ...baseProps,
1533
+ debounceMs,
1534
+ selectFiltered,
1535
+ onSearchChange
1536
+ };
1537
+ return /* @__PURE__ */ jsx(MultiSelectFieldComboboxMode, { ...comboboxProps });
1538
+ });
1539
+ MultiSelectField.displayName = "MultiSelectField";
1540
+
1541
+ const defaultFilter = (options, searchValue) => matchSorter(options, searchValue, {
1542
+ keys: ["label", "searchText"],
1543
+ baseSort: (a, b) => a.index - b.index
1544
+ });
1545
+ const toFilterFn = (filter) => typeof filter === "function" ? filter : (options, searchValue) => matchSorter(options, searchValue, {
1546
+ baseSort: (a, b) => a.index - b.index,
1547
+ ...filter
917
1548
  });
918
1549
  const MultiSelectFieldSync = (props) => {
919
1550
  const {
@@ -981,9 +1612,18 @@ const MultiSelectFieldSync = (props) => {
981
1612
  };
982
1613
  };
983
1614
  }, [selectFilteredProp, options, value, onSelectedOptionsChange, filter]);
1615
+ const fieldRef = useRef(null);
1616
+ const prevOptionsRef = useRef(options);
1617
+ useEffect(() => {
1618
+ if (prevOptionsRef.current !== options) {
1619
+ prevOptionsRef.current = options;
1620
+ fieldRef.current?.invalidate();
1621
+ }
1622
+ }, [options]);
984
1623
  return /* @__PURE__ */ jsx(
985
1624
  MultiSelectField,
986
1625
  {
1626
+ ref: fieldRef,
987
1627
  lazy: false,
988
1628
  loadOptions: (searchValue) => filter(options, searchValue),
989
1629
  debounceMs: 0,
@@ -997,4 +1637,4 @@ const MultiSelectFieldSync = (props) => {
997
1637
  };
998
1638
 
999
1639
  export { MultiSelectField as M, MultiSelectFieldSync as a };
1000
- //# sourceMappingURL=MultiSelectFieldSync-Bc7IphJ7.js.map
1640
+ //# sourceMappingURL=MultiSelectFieldSync-ChDuxvhE.js.map