@servicetitan/anvil2 2.2.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 (230) hide show
  1. package/CHANGELOG.md +18 -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-oNlBgZKB.js → Calendar-CkgpKD7Q.js} +2 -2
  24. package/dist/{Calendar-oNlBgZKB.js.map → Calendar-CkgpKD7Q.js.map} +1 -1
  25. package/dist/{Calendar-D0CczOpQ.js → Calendar-CtkL4zYU.js} +3 -3
  26. package/dist/{Calendar-D0CczOpQ.js.map → Calendar-CtkL4zYU.js.map} +1 -1
  27. package/dist/Calendar.js +2 -2
  28. package/dist/{Checkbox-DuzAqrE7.js → Checkbox-CFgjreAl.js} +2 -2
  29. package/dist/{Checkbox-DuzAqrE7.js.map → Checkbox-CFgjreAl.js.map} +1 -1
  30. package/dist/{Checkbox-DIY-6agd.js → Checkbox-CxjZpzPp.js} +3 -3
  31. package/dist/{Checkbox-DIY-6agd.js.map → Checkbox-CxjZpzPp.js.map} +1 -1
  32. package/dist/Checkbox.js +1 -1
  33. package/dist/{Combobox-CSGn20KQ.js → Combobox-B6saoDAP.js} +4 -4
  34. package/dist/{Combobox-CSGn20KQ.js.map → Combobox-B6saoDAP.js.map} +1 -1
  35. package/dist/Combobox.js +1 -1
  36. package/dist/{DataTable-D30sE1Xt.js → DataTable-NzX8SCYT.js} +42 -12
  37. package/dist/{DataTable-D30sE1Xt.js.map → DataTable-NzX8SCYT.js.map} +1 -1
  38. package/dist/DataTable.css +9 -5
  39. package/dist/{DateFieldRange-DBOiqaML.js → DateFieldRange-DgGgNSzN.js} +4 -4
  40. package/dist/{DateFieldRange-DBOiqaML.js.map → DateFieldRange-DgGgNSzN.js.map} +1 -1
  41. package/dist/DateFieldRange.js +1 -1
  42. package/dist/{DateFieldSingle-C4hU55MP.js → DateFieldSingle-BR4nJNVl.js} +4 -4
  43. package/dist/{DateFieldSingle-C4hU55MP.js.map → DateFieldSingle-BR4nJNVl.js.map} +1 -1
  44. package/dist/DateFieldSingle.js +1 -1
  45. package/dist/{DateFieldYearless-BXkUiHIR.js → DateFieldYearless-mqvM2uVP.js} +4 -4
  46. package/dist/{DateFieldYearless-BXkUiHIR.js.map → DateFieldYearless-mqvM2uVP.js.map} +1 -1
  47. package/dist/DateFieldYearless.js +1 -1
  48. package/dist/{DateFieldYearlessRange-CGffFnVT.js → DateFieldYearlessRange-CLuyUoGF.js} +4 -4
  49. package/dist/{DateFieldYearlessRange-CGffFnVT.js.map → DateFieldYearlessRange-CLuyUoGF.js.map} +1 -1
  50. package/dist/DateFieldYearlessRange.js +1 -1
  51. package/dist/{DaysOfTheWeek-DJEDopC9.js → DaysOfTheWeek-D-WPj18i.js} +3 -3
  52. package/dist/{DaysOfTheWeek-DJEDopC9.js.map → DaysOfTheWeek-D-WPj18i.js.map} +1 -1
  53. package/dist/DaysOfTheWeek.js +1 -1
  54. package/dist/{Dialog-BbsZMnCA.js → Dialog-yA2jYtgv.js} +4 -4
  55. package/dist/{Dialog-BbsZMnCA.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-Dhq76ot3.js → Drawer-Dt4dqAxQ.js} +4 -4
  62. package/dist/{Drawer-Dhq76ot3.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-CAuhkCZY.js → FieldDialog-BghhsL2B.js} +121 -36
  69. package/dist/FieldDialog-BghhsL2B.js.map +1 -0
  70. package/dist/FieldMessage-OeP_xSUE.js +132 -0
  71. package/dist/FieldMessage-OeP_xSUE.js.map +1 -0
  72. package/dist/FieldMessage.js +1 -1
  73. package/dist/{Helper-PNGm_U2X.js → Helper-B2UrgJvr.js} +2 -2
  74. package/dist/{Helper-PNGm_U2X.js.map → Helper-B2UrgJvr.js.map} +1 -1
  75. package/dist/{InputMask-Ds0W2fKy.js → InputMask-B7ZnJoR5.js} +2 -2
  76. package/dist/{InputMask-Ds0W2fKy.js.map → InputMask-B7ZnJoR5.js.map} +1 -1
  77. package/dist/InputMask.js +1 -1
  78. package/dist/{ListView-MMmJDM--.js → ListView-CN8zu-cq.js} +2 -2
  79. package/dist/{ListView-MMmJDM--.js.map → ListView-CN8zu-cq.js.map} +1 -1
  80. package/dist/ListView.js +1 -1
  81. package/dist/{Menu-3LIfRdTk.js → Menu-CpRnsr0v.js} +2 -2
  82. package/dist/{Menu-3LIfRdTk.js.map → Menu-CpRnsr0v.js.map} +1 -1
  83. package/dist/Menu.js +1 -1
  84. package/dist/MultiSelectField.js +1 -1
  85. package/dist/{MultiSelectFieldSync-Bey99LzJ.js → MultiSelectFieldSync-ChDuxvhE.js} +876 -255
  86. package/dist/MultiSelectFieldSync-ChDuxvhE.js.map +1 -0
  87. package/dist/{NumberField-CDkEUfXW.js → NumberField-ecubQsaf.js} +4 -4
  88. package/dist/{NumberField-CDkEUfXW.js.map → NumberField-ecubQsaf.js.map} +1 -1
  89. package/dist/NumberField.js +1 -1
  90. package/dist/{Page-BVxybI-j.js → Page-CkcnGPPK.js} +8 -8
  91. package/dist/{Page-BVxybI-j.js.map → Page-CkcnGPPK.js.map} +1 -1
  92. package/dist/Page.js +1 -1
  93. package/dist/{Pagination-DIatYUXX.js → Pagination-DO9NORlw.js} +4 -4
  94. package/dist/{Pagination-DIatYUXX.js.map → Pagination-DO9NORlw.js.map} +1 -1
  95. package/dist/Pagination.js +1 -1
  96. package/dist/{Popover-4C5IVk8T.js → Popover-D_BmwIOW.js} +3 -3
  97. package/dist/{Popover-4C5IVk8T.js.map → Popover-D_BmwIOW.js.map} +1 -1
  98. package/dist/Popover.js +1 -1
  99. package/dist/{ProgressBar-BGwp-qnf.js → ProgressBar-CBhVZIzK.js} +2 -2
  100. package/dist/{ProgressBar-BGwp-qnf.js.map → ProgressBar-CBhVZIzK.js.map} +1 -1
  101. package/dist/ProgressBar.js +1 -1
  102. package/dist/{Radio-D7hNws2b.js → Radio-BMFwnzyz.js} +2 -2
  103. package/dist/{Radio-D7hNws2b.js.map → Radio-BMFwnzyz.js.map} +1 -1
  104. package/dist/{Radio-BRcpSu-d.js → Radio-DtYoRq3m.js} +3 -3
  105. package/dist/{Radio-BRcpSu-d.js.map → Radio-DtYoRq3m.js.map} +1 -1
  106. package/dist/Radio.js +1 -1
  107. package/dist/{SearchField-CoeaOip5.js → SearchField-CtdtcrVV.js} +12 -4
  108. package/dist/SearchField-CtdtcrVV.js.map +1 -0
  109. package/dist/SearchField.js +1 -1
  110. package/dist/{SelectCard-Bag44PmE.js → SelectCard-yWBNnm7t.js} +32 -8
  111. package/dist/SelectCard-yWBNnm7t.js.map +1 -0
  112. package/dist/SelectCard.js +1 -1
  113. package/dist/SelectField.js +1 -1
  114. package/dist/SelectFieldSync-DfP3eETZ.js +1248 -0
  115. package/dist/SelectFieldSync-DfP3eETZ.js.map +1 -0
  116. package/dist/{SelectTrigger-DgsvUfyl.js → SelectTrigger-Cs5CGc4D.js} +2 -2
  117. package/dist/{SelectTrigger-DgsvUfyl.js.map → SelectTrigger-Cs5CGc4D.js.map} +1 -1
  118. package/dist/SelectTrigger.js +1 -1
  119. package/dist/{SelectTriggerBase-OxfNqdIq.js → SelectTriggerBase-Cs827tDp.js} +3 -3
  120. package/dist/{SelectTriggerBase-OxfNqdIq.js.map → SelectTriggerBase-Cs827tDp.js.map} +1 -1
  121. package/dist/{Stepper-D8lkCP8Y.js → Stepper-CzVKDg-N.js} +2 -2
  122. package/dist/{Stepper-D8lkCP8Y.js.map → Stepper-CzVKDg-N.js.map} +1 -1
  123. package/dist/Stepper.js +1 -1
  124. package/dist/{Switch-D0zwZCg4.js → Switch-CEmjmSiL.js} +2 -2
  125. package/dist/{Switch-D0zwZCg4.js.map → Switch-CEmjmSiL.js.map} +1 -1
  126. package/dist/Switch.js +1 -1
  127. package/dist/Table.js +1 -1
  128. package/dist/{TextField-Dfzn2HeL.js → TextField-D9VWORek.js} +2 -2
  129. package/dist/{TextField-Dfzn2HeL.js.map → TextField-D9VWORek.js.map} +1 -1
  130. package/dist/{TextField-BycenT6H.js → TextField-atI4M79b.js} +3 -3
  131. package/dist/{TextField-BycenT6H.js.map → TextField-atI4M79b.js.map} +1 -1
  132. package/dist/TextField.css +29 -25
  133. package/dist/TextField.js +1 -1
  134. package/dist/TextField.module-BP-hDP5m.js +22 -0
  135. package/dist/TextField.module-BP-hDP5m.js.map +1 -0
  136. package/dist/{Textarea-BwbwJP6z.js → Textarea-D-kPIsIN.js} +2 -2
  137. package/dist/{Textarea-BwbwJP6z.js.map → Textarea-D-kPIsIN.js.map} +1 -1
  138. package/dist/Textarea.js +1 -1
  139. package/dist/{TimeField-B0WSzSfJ.js → TimeField-CbdxhawY.js} +3 -3
  140. package/dist/{TimeField-B0WSzSfJ.js.map → TimeField-CbdxhawY.js.map} +1 -1
  141. package/dist/TimeField.js +1 -1
  142. package/dist/Toast.js +2 -2
  143. package/dist/{Toaster-9Q_yaKGu.js → Toaster-B652KIzq.js} +4 -4
  144. package/dist/{Toaster-9Q_yaKGu.js.map → Toaster-B652KIzq.js.map} +1 -1
  145. package/dist/{Toaster-DHo8dnWH.js → Toaster-Bisc1mlh.js} +2 -2
  146. package/dist/{Toaster-DHo8dnWH.js.map → Toaster-Bisc1mlh.js.map} +1 -1
  147. package/dist/{Toolbar-CVOenuCF.js → Toolbar-4VdevLJd.js} +78 -64
  148. package/dist/Toolbar-4VdevLJd.js.map +1 -0
  149. package/dist/Toolbar.css +37 -55
  150. package/dist/Toolbar.js +1 -1
  151. package/dist/{YearlessDateInputWithPicker-ztozRk-X.js → YearlessDateInputWithPicker-BADNBDmy.js} +3 -3
  152. package/dist/{YearlessDateInputWithPicker-ztozRk-X.js.map → YearlessDateInputWithPicker-BADNBDmy.js.map} +1 -1
  153. package/dist/beta/components/MultiSelectField/MultiSelectField.d.ts +1 -10
  154. package/dist/beta/components/MultiSelectField/internal/MultiSelectFieldComboboxMode.d.ts +5 -0
  155. package/dist/beta/components/MultiSelectField/internal/MultiSelectFieldInput.d.ts +0 -2
  156. package/dist/beta/components/MultiSelectField/internal/MultiSelectFieldList.d.ts +3 -7
  157. package/dist/beta/components/MultiSelectField/internal/MultiSelectFieldSelectMode.d.ts +6 -0
  158. package/dist/beta/components/MultiSelectField/internal/MultiSelectFieldTrigger.d.ts +30 -0
  159. package/dist/beta/components/MultiSelectField/internal/types.d.ts +67 -0
  160. package/dist/beta/components/MultiSelectField/internal/useChipLayout.d.ts +19 -0
  161. package/dist/beta/components/MultiSelectField/internal/useComboMultiple.d.ts +1 -2
  162. package/dist/beta/components/MultiSelectField/internal/useSelectModeMultiple.d.ts +40 -0
  163. package/dist/beta/components/MultiSelectField/internal/useToggleSelection.d.ts +21 -0
  164. package/dist/beta/components/MultiSelectField/types.d.ts +7 -0
  165. package/dist/beta/components/SelectField/internal/FieldDialog/FieldDialog.d.ts +1 -1
  166. package/dist/beta/components/SelectField/internal/FieldListBase.d.ts +3 -4
  167. package/dist/beta/components/SelectField/internal/SelectFieldComboboxMode.d.ts +6 -0
  168. package/dist/beta/components/SelectField/internal/SelectFieldInput.d.ts +0 -2
  169. package/dist/beta/components/SelectField/internal/SelectFieldLabel.d.ts +4 -3
  170. package/dist/beta/components/SelectField/internal/SelectFieldList.d.ts +3 -7
  171. package/dist/beta/components/SelectField/internal/SelectFieldListItem.d.ts +2 -4
  172. package/dist/beta/components/SelectField/internal/SelectFieldSelectMode.d.ts +6 -0
  173. package/dist/beta/components/SelectField/internal/SelectFieldTrigger.d.ts +27 -0
  174. package/dist/beta/components/SelectField/internal/buildDownshiftItems.d.ts +22 -0
  175. package/dist/beta/components/SelectField/internal/types.d.ts +57 -0
  176. package/dist/beta/components/SelectField/internal/useCombo.d.ts +1 -5
  177. package/dist/beta/components/SelectField/internal/useProcessedOptions.d.ts +19 -0
  178. package/dist/beta/components/SelectField/internal/useSelectMode.d.ts +34 -0
  179. package/dist/beta/components/SelectField/types.d.ts +7 -0
  180. package/dist/beta/components/Table/DataTable/DataTable.d.ts +9 -2
  181. package/dist/beta/components/Table/DataTable/types.d.ts +20 -0
  182. package/dist/beta/components/Toolbar/Toolbar.d.ts +17 -7
  183. package/dist/beta/components/Toolbar/ToolbarButton.d.ts +0 -1
  184. package/dist/beta/components/Toolbar/ToolbarButtonLink.d.ts +0 -1
  185. package/dist/beta/components/Toolbar/ToolbarButtonToggle.d.ts +0 -1
  186. package/dist/beta/components/Toolbar/ToolbarSearchField.d.ts +2 -3
  187. package/dist/beta/components/Toolbar/ToolbarSelect.d.ts +0 -1
  188. package/dist/beta/components/Toolbar/internal/{ToolbarOverflowContext.d.ts → ToolbarContext.d.ts} +14 -5
  189. package/dist/beta/components/Toolbar/internal/utils/test.d.ts +5 -3
  190. package/dist/beta/components/Toolbar/types.d.ts +5 -1
  191. package/dist/beta.js +7 -7
  192. package/dist/components/ButtonLink/ButtonLink.d.ts +3 -3
  193. package/dist/components/SearchField/SearchField.d.ts +8 -26
  194. package/dist/components/SearchField/internal/SearchField.d.ts +73 -0
  195. package/dist/components/Toolbar/Toolbar.d.ts +11 -5
  196. package/dist/components/Toolbar/ToolbarButton.d.ts +0 -1
  197. package/dist/components/Toolbar/ToolbarButtonLink.d.ts +0 -1
  198. package/dist/components/Toolbar/ToolbarButtonToggle.d.ts +0 -1
  199. package/dist/components/Toolbar/ToolbarSelect.d.ts +0 -1
  200. package/dist/components/Toolbar/internal/{ToolbarOverflowContext.d.ts → ToolbarContext.d.ts} +14 -5
  201. package/dist/components/Toolbar/internal/utils/test.d.ts +5 -3
  202. package/dist/components/Toolbar/types.d.ts +5 -1
  203. package/dist/{index-DFvIVS57.js → index-ClUtwV8V.js} +2 -2
  204. package/dist/{index-DFvIVS57.js.map → index-ClUtwV8V.js.map} +1 -1
  205. package/dist/{index.esm-K9kxJhLx.js → index.esm-BZV0wNKZ.js} +1 -2
  206. package/dist/{index.esm-K9kxJhLx.js.map → index.esm-BZV0wNKZ.js.map} +1 -1
  207. package/dist/index.js +80 -69
  208. package/dist/index.js.map +1 -1
  209. package/dist/index2.css +17 -23
  210. package/dist/{match-sorter.esm-B3vwg1-X.js → match-sorter.esm-adzV1NDp.js} +2 -2
  211. package/dist/{match-sorter.esm-B3vwg1-X.js.map → match-sorter.esm-adzV1NDp.js.map} +1 -1
  212. package/dist/{useDrilldown-jbU4Cs5l.js → useDrilldown-C8TRwNE9.js} +3 -3
  213. package/dist/{useDrilldown-jbU4Cs5l.js.map → useDrilldown-C8TRwNE9.js.map} +1 -1
  214. package/dist/{useInitialFocus-BRRbylek.js → useInitialFocus-CdoVwSbr.js} +2 -2
  215. package/dist/{useInitialFocus-BRRbylek.js.map → useInitialFocus-CdoVwSbr.js.map} +1 -1
  216. package/package.json +3 -2
  217. package/dist/Button.module-Ck7VrMqw.js +0 -26
  218. package/dist/Button.module-Ck7VrMqw.js.map +0 -1
  219. package/dist/ButtonLink-CRlyK750.js.map +0 -1
  220. package/dist/FieldDialog-CAuhkCZY.js.map +0 -1
  221. package/dist/FieldMessage-DS0COrjp.js +0 -132
  222. package/dist/FieldMessage-DS0COrjp.js.map +0 -1
  223. package/dist/MultiSelectFieldSync-Bey99LzJ.js.map +0 -1
  224. package/dist/SearchField-CoeaOip5.js.map +0 -1
  225. package/dist/SelectCard-Bag44PmE.js.map +0 -1
  226. package/dist/SelectFieldSync-CigqXq3T.js +0 -763
  227. package/dist/SelectFieldSync-CigqXq3T.js.map +0 -1
  228. package/dist/TextField.module-pD1felN8.js +0 -20
  229. package/dist/TextField.module-pD1felN8.js.map +0 -1
  230. package/dist/Toolbar-CVOenuCF.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-CAuhkCZY.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-DS0COrjp.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,123 +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(
633
- ref,
634
- () => ({
635
- clearCache,
636
- invalidate: () => {
637
- clearCache();
638
- setInitialLoadPerformed(false);
639
- }
640
- }),
641
- [clearCache]
642
- );
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
+ }) => {
643
575
  const debouncedOptionLoader = useDebouncedCallback((inputValue2) => {
644
576
  loadOptions(inputValue2, { initial: true });
645
577
  }, debounceMs);
646
- const handleRemoveOption = useCallback(
647
- (option) => {
648
- onSelectedOptionsChange(
649
- selectedOptions.filter((opt) => opt.id !== option.id)
650
- );
651
- },
652
- [selectedOptions, onSelectedOptionsChange]
653
- );
654
- const handleClear = useCallback(() => {
655
- onSelectedOptionsChange([]);
656
- }, [onSelectedOptionsChange]);
657
578
  const {
658
579
  isOpen,
659
580
  getToggleButtonProps,
@@ -680,19 +601,8 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
680
601
  groupToString,
681
602
  groupSorter,
682
603
  selectedOptions,
683
- selectAll: selectAll ? {
684
- label: selectAll.label ?? "Select All",
685
- onClick: selectAll.onClick,
686
- checkState: selectAll.checkState === true ? "checked" : selectAll.checkState === false ? "unchecked" : selectAll.checkState ?? "indeterminate"
687
- } : void 0,
688
- selectFiltered: selectFiltered ? (searchValue) => {
689
- const config = selectFiltered(searchValue);
690
- return {
691
- label: config.label,
692
- onClick: config.onClick,
693
- checkState: config.checkState === true ? "checked" : config.checkState === false ? "unchecked" : config.checkState ?? "indeterminate"
694
- };
695
- } : void 0,
604
+ selectAll,
605
+ selectFiltered,
696
606
  async onIsOpenChange(changes) {
697
607
  if (initialLoad === "open" && !initialLoadPerformed && changes.isOpen) {
698
608
  await loadOptions("", { initial: true });
@@ -712,11 +622,10 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
712
622
  }
713
623
  };
714
624
  performInitialLoad();
715
- }, [loadOptions, initialLoadPerformed, initialLoad]);
625
+ }, [loadOptions, initialLoadPerformed, initialLoad, setInitialLoadPerformed]);
716
626
  const handleLoadMore = async () => {
717
627
  await loadMore(inputValue);
718
628
  };
719
- const disableClearButton = selectedOptions.length === 0 || isDisabledOrReadOnly;
720
629
  if (displayAs === "dialog") {
721
630
  return /* @__PURE__ */ jsxs(
722
631
  "div",
@@ -860,7 +769,6 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
860
769
  disableClearButton,
861
770
  onClear: handleClear,
862
771
  id: `${id}-input`,
863
- popoverTarget: `${id}-popover`,
864
772
  inputWrapperRef,
865
773
  size,
866
774
  error: !!error,
@@ -914,6 +822,719 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
914
822
  ]
915
823
  }
916
824
  );
825
+ };
826
+
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 });
917
1538
  });
918
1539
  MultiSelectField.displayName = "MultiSelectField";
919
1540
 
@@ -1016,4 +1637,4 @@ const MultiSelectFieldSync = (props) => {
1016
1637
  };
1017
1638
 
1018
1639
  export { MultiSelectField as M, MultiSelectFieldSync as a };
1019
- //# sourceMappingURL=MultiSelectFieldSync-Bey99LzJ.js.map
1640
+ //# sourceMappingURL=MultiSelectFieldSync-ChDuxvhE.js.map