@servicetitan/anvil2 2.2.0 → 2.4.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 (243) hide show
  1. package/CHANGELOG.md +36 -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-Drqb3GVU.js} +4 -4
  34. package/dist/{Combobox-CSGn20KQ.js.map → Combobox-Drqb3GVU.js.map} +1 -1
  35. package/dist/Combobox.js +1 -1
  36. package/dist/{DataTable-D30sE1Xt.js → DataTable-BLuJ4FtH.js} +311 -51
  37. package/dist/DataTable-BLuJ4FtH.js.map +1 -0
  38. package/dist/DataTable.css +9 -5
  39. package/dist/{DateFieldRange-DBOiqaML.js → DateFieldRange-CvlOeE4v.js} +4 -4
  40. package/dist/{DateFieldRange-DBOiqaML.js.map → DateFieldRange-CvlOeE4v.js.map} +1 -1
  41. package/dist/DateFieldRange.js +1 -1
  42. package/dist/{DateFieldSingle-C4hU55MP.js → DateFieldSingle-9UHxIxIA.js} +4 -4
  43. package/dist/{DateFieldSingle-C4hU55MP.js.map → DateFieldSingle-9UHxIxIA.js.map} +1 -1
  44. package/dist/DateFieldSingle.js +1 -1
  45. package/dist/{DateFieldYearless-BXkUiHIR.js → DateFieldYearless-HNydELvO.js} +4 -4
  46. package/dist/{DateFieldYearless-BXkUiHIR.js.map → DateFieldYearless-HNydELvO.js.map} +1 -1
  47. package/dist/DateFieldYearless.js +1 -1
  48. package/dist/{DateFieldYearlessRange-CGffFnVT.js → DateFieldYearlessRange-COb8v2CG.js} +4 -4
  49. package/dist/{DateFieldYearlessRange-CGffFnVT.js.map → DateFieldYearlessRange-COb8v2CG.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-DEAR058v.js} +3 -3
  55. package/dist/{Dialog-BbsZMnCA.js.map → Dialog-DEAR058v.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-CnMskBQl.js} +3 -3
  62. package/dist/{Drawer-Dhq76ot3.js.map → Drawer-CnMskBQl.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-C5mwMjrr.js} +120 -35
  69. package/dist/FieldDialog-C5mwMjrr.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-BnPzYM72.js} +876 -255
  86. package/dist/MultiSelectFieldSync-BnPzYM72.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-qOkG6psI.js} +7 -7
  91. package/dist/{Page-BVxybI-j.js.map → Page-qOkG6psI.js.map} +1 -1
  92. package/dist/Page.js +1 -1
  93. package/dist/{Pagination-DIatYUXX.js → Pagination-BuiyhZlJ.js} +14 -7
  94. package/dist/Pagination-BuiyhZlJ.js.map +1 -0
  95. package/dist/Pagination.js +1 -1
  96. package/dist/{Popover-4C5IVk8T.js → Popover-CYWYCj7l.js} +2 -2
  97. package/dist/{Popover-4C5IVk8T.js.map → Popover-CYWYCj7l.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-DCrafdbx.js +1248 -0
  115. package/dist/SelectFieldSync-DCrafdbx.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/{Tab-CeXt6A_D.js → Tab-DXivEqur.js} +47 -6
  128. package/dist/Tab-DXivEqur.js.map +1 -0
  129. package/dist/Tab.js +1 -1
  130. package/dist/Table.js +1 -1
  131. package/dist/{TextField-Dfzn2HeL.js → TextField-D9VWORek.js} +2 -2
  132. package/dist/{TextField-Dfzn2HeL.js.map → TextField-D9VWORek.js.map} +1 -1
  133. package/dist/{TextField-BycenT6H.js → TextField-atI4M79b.js} +3 -3
  134. package/dist/{TextField-BycenT6H.js.map → TextField-atI4M79b.js.map} +1 -1
  135. package/dist/TextField.css +29 -25
  136. package/dist/TextField.js +1 -1
  137. package/dist/TextField.module-BP-hDP5m.js +22 -0
  138. package/dist/TextField.module-BP-hDP5m.js.map +1 -0
  139. package/dist/{Textarea-BwbwJP6z.js → Textarea-D-kPIsIN.js} +2 -2
  140. package/dist/{Textarea-BwbwJP6z.js.map → Textarea-D-kPIsIN.js.map} +1 -1
  141. package/dist/Textarea.js +1 -1
  142. package/dist/{TimeField-B0WSzSfJ.js → TimeField-DREFzFkw.js} +3 -3
  143. package/dist/{TimeField-B0WSzSfJ.js.map → TimeField-DREFzFkw.js.map} +1 -1
  144. package/dist/TimeField.js +1 -1
  145. package/dist/Toast.js +2 -2
  146. package/dist/{Toaster-9Q_yaKGu.js → Toaster-B652KIzq.js} +4 -4
  147. package/dist/{Toaster-9Q_yaKGu.js.map → Toaster-B652KIzq.js.map} +1 -1
  148. package/dist/{Toaster-DHo8dnWH.js → Toaster-Bisc1mlh.js} +2 -2
  149. package/dist/{Toaster-DHo8dnWH.js.map → Toaster-Bisc1mlh.js.map} +1 -1
  150. package/dist/{Toolbar-CVOenuCF.js → Toolbar-jfZ-CupZ.js} +77 -63
  151. package/dist/Toolbar-jfZ-CupZ.js.map +1 -0
  152. package/dist/Toolbar.css +37 -55
  153. package/dist/Toolbar.js +1 -1
  154. package/dist/{YearlessDateInputWithPicker-ztozRk-X.js → YearlessDateInputWithPicker-mW5KykHZ.js} +3 -3
  155. package/dist/{YearlessDateInputWithPicker-ztozRk-X.js.map → YearlessDateInputWithPicker-mW5KykHZ.js.map} +1 -1
  156. package/dist/beta/components/MultiSelectField/MultiSelectField.d.ts +1 -10
  157. package/dist/beta/components/MultiSelectField/internal/MultiSelectFieldComboboxMode.d.ts +5 -0
  158. package/dist/beta/components/MultiSelectField/internal/MultiSelectFieldInput.d.ts +0 -2
  159. package/dist/beta/components/MultiSelectField/internal/MultiSelectFieldList.d.ts +3 -7
  160. package/dist/beta/components/MultiSelectField/internal/MultiSelectFieldSelectMode.d.ts +6 -0
  161. package/dist/beta/components/MultiSelectField/internal/MultiSelectFieldTrigger.d.ts +30 -0
  162. package/dist/beta/components/MultiSelectField/internal/types.d.ts +67 -0
  163. package/dist/beta/components/MultiSelectField/internal/useChipLayout.d.ts +19 -0
  164. package/dist/beta/components/MultiSelectField/internal/useComboMultiple.d.ts +1 -2
  165. package/dist/beta/components/MultiSelectField/internal/useSelectModeMultiple.d.ts +40 -0
  166. package/dist/beta/components/MultiSelectField/internal/useToggleSelection.d.ts +21 -0
  167. package/dist/beta/components/MultiSelectField/types.d.ts +7 -0
  168. package/dist/beta/components/SelectField/internal/FieldDialog/FieldDialog.d.ts +1 -1
  169. package/dist/beta/components/SelectField/internal/FieldListBase.d.ts +3 -4
  170. package/dist/beta/components/SelectField/internal/SelectFieldComboboxMode.d.ts +6 -0
  171. package/dist/beta/components/SelectField/internal/SelectFieldInput.d.ts +0 -2
  172. package/dist/beta/components/SelectField/internal/SelectFieldLabel.d.ts +4 -3
  173. package/dist/beta/components/SelectField/internal/SelectFieldList.d.ts +3 -7
  174. package/dist/beta/components/SelectField/internal/SelectFieldListItem.d.ts +2 -4
  175. package/dist/beta/components/SelectField/internal/SelectFieldSelectMode.d.ts +6 -0
  176. package/dist/beta/components/SelectField/internal/SelectFieldTrigger.d.ts +27 -0
  177. package/dist/beta/components/SelectField/internal/buildDownshiftItems.d.ts +22 -0
  178. package/dist/beta/components/SelectField/internal/types.d.ts +57 -0
  179. package/dist/beta/components/SelectField/internal/useCombo.d.ts +1 -5
  180. package/dist/beta/components/SelectField/internal/useProcessedOptions.d.ts +19 -0
  181. package/dist/beta/components/SelectField/internal/useSelectMode.d.ts +34 -0
  182. package/dist/beta/components/SelectField/types.d.ts +7 -0
  183. package/dist/beta/components/Table/DataTable/DataTable.d.ts +21 -2
  184. package/dist/beta/components/Table/DataTable/internal/editable-cells/DataTableEditableBooleanCell.d.ts +7 -0
  185. package/dist/beta/components/Table/DataTable/internal/util/getTanStackColumnDef.d.ts +4 -0
  186. package/dist/beta/components/Table/DataTable/types.d.ts +20 -0
  187. package/dist/beta/components/Table/createColumnHelper.d.ts +18 -7
  188. package/dist/beta/components/Table/types.d.ts +44 -3
  189. package/dist/beta/components/Toolbar/Toolbar.d.ts +17 -7
  190. package/dist/beta/components/Toolbar/ToolbarButton.d.ts +0 -1
  191. package/dist/beta/components/Toolbar/ToolbarButtonLink.d.ts +0 -1
  192. package/dist/beta/components/Toolbar/ToolbarButtonToggle.d.ts +0 -1
  193. package/dist/beta/components/Toolbar/ToolbarSearchField.d.ts +2 -3
  194. package/dist/beta/components/Toolbar/ToolbarSelect.d.ts +0 -1
  195. package/dist/beta/components/Toolbar/internal/{ToolbarOverflowContext.d.ts → ToolbarContext.d.ts} +14 -5
  196. package/dist/beta/components/Toolbar/internal/utils/test.d.ts +5 -3
  197. package/dist/beta/components/Toolbar/types.d.ts +5 -1
  198. package/dist/beta.js +7 -7
  199. package/dist/components/ButtonLink/ButtonLink.d.ts +3 -3
  200. package/dist/components/Pagination/Pagination.d.ts +3 -0
  201. package/dist/components/Pagination/internal/PaginationItemsPerPageMenu.d.ts +5 -0
  202. package/dist/components/SearchField/SearchField.d.ts +8 -26
  203. package/dist/components/SearchField/internal/SearchField.d.ts +73 -0
  204. package/dist/components/Tab/Tab.d.ts +41 -2
  205. package/dist/components/Tab/internal/TabContext.d.ts +1 -1
  206. package/dist/components/Toolbar/Toolbar.d.ts +11 -5
  207. package/dist/components/Toolbar/ToolbarButton.d.ts +0 -1
  208. package/dist/components/Toolbar/ToolbarButtonLink.d.ts +0 -1
  209. package/dist/components/Toolbar/ToolbarButtonToggle.d.ts +0 -1
  210. package/dist/components/Toolbar/ToolbarSelect.d.ts +0 -1
  211. package/dist/components/Toolbar/internal/{ToolbarOverflowContext.d.ts → ToolbarContext.d.ts} +14 -5
  212. package/dist/components/Toolbar/internal/utils/test.d.ts +5 -3
  213. package/dist/components/Toolbar/types.d.ts +5 -1
  214. package/dist/{index-DFvIVS57.js → index-ClUtwV8V.js} +2 -2
  215. package/dist/{index-DFvIVS57.js.map → index-ClUtwV8V.js.map} +1 -1
  216. package/dist/index.js +81 -70
  217. package/dist/index.js.map +1 -1
  218. package/dist/index2.css +17 -23
  219. package/dist/internal/components/ManualTestLayout/ManualTestLayout.d.ts +16 -0
  220. package/dist/internal/components/ManualTestLayout/index.d.ts +1 -0
  221. package/dist/internal/components/index.d.ts +1 -0
  222. package/dist/{match-sorter.esm-B3vwg1-X.js → match-sorter.esm-adzV1NDp.js} +2 -2
  223. package/dist/{match-sorter.esm-B3vwg1-X.js.map → match-sorter.esm-adzV1NDp.js.map} +1 -1
  224. package/dist/{useDrilldown-jbU4Cs5l.js → useDrilldown-hUxMOdnz.js} +2 -2
  225. package/dist/{useDrilldown-jbU4Cs5l.js.map → useDrilldown-hUxMOdnz.js.map} +1 -1
  226. package/package.json +5 -4
  227. package/dist/Button.module-Ck7VrMqw.js +0 -26
  228. package/dist/Button.module-Ck7VrMqw.js.map +0 -1
  229. package/dist/ButtonLink-CRlyK750.js.map +0 -1
  230. package/dist/DataTable-D30sE1Xt.js.map +0 -1
  231. package/dist/FieldDialog-CAuhkCZY.js.map +0 -1
  232. package/dist/FieldMessage-DS0COrjp.js +0 -132
  233. package/dist/FieldMessage-DS0COrjp.js.map +0 -1
  234. package/dist/MultiSelectFieldSync-Bey99LzJ.js.map +0 -1
  235. package/dist/Pagination-DIatYUXX.js.map +0 -1
  236. package/dist/SearchField-CoeaOip5.js.map +0 -1
  237. package/dist/SelectCard-Bag44PmE.js.map +0 -1
  238. package/dist/SelectFieldSync-CigqXq3T.js +0 -763
  239. package/dist/SelectFieldSync-CigqXq3T.js.map +0 -1
  240. package/dist/Tab-CeXt6A_D.js.map +0 -1
  241. package/dist/TextField.module-pD1felN8.js +0 -20
  242. package/dist/TextField.module-pD1felN8.js.map +0 -1
  243. package/dist/Toolbar-CVOenuCF.js.map +0 -1
@@ -0,0 +1,1248 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { useCallback, useState, useMemo, useRef, useEffect, forwardRef, 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 } from './utils-pudAMGnO.js';
5
+ import { V as VirtualizedFieldListBase, F as FieldListBase, a as useProcessedOptions, b as buildDownshiftItems, m as mapOptionToDownshiftItem, 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-C5mwMjrr.js';
6
+ import { s as styles } from './SelectTriggerBase.module-B0NFRlQP.js';
7
+ import { c as cx } from './index-SvGbrGuT.js';
8
+ import { B as Button } from './Button-DrNDkO2f.js';
9
+ import { S as SvgChevronRight } from './chevron_right-BdpsxX7x.js';
10
+ import { S as SvgClose } from './close-DZj38AEh.js';
11
+ import { F as FieldMessage } from './FieldMessage-OeP_xSUE.js';
12
+ import { u as useMergeRefs } from './useMergeRefs-Dfmtq9cI.js';
13
+ import { u as useLayoutPropsUtil } from './useLayoutPropsUtil-loxbyklF.js';
14
+
15
+ const SelectFieldList = ({
16
+ selectedOption,
17
+ virtualize,
18
+ ...rest
19
+ }) => {
20
+ const getCheckedState = useCallback(
21
+ (item) => selectedOption?.id === item.original.id ? "checked" : "unchecked",
22
+ [selectedOption]
23
+ );
24
+ const ListComponent = virtualize ? VirtualizedFieldListBase : FieldListBase;
25
+ return /* @__PURE__ */ jsx(
26
+ ListComponent,
27
+ {
28
+ ...rest,
29
+ selectionType: "single",
30
+ getCheckedState
31
+ }
32
+ );
33
+ };
34
+ SelectFieldList.displayName = "SelectFieldList";
35
+
36
+ const SelectFieldInput = ({
37
+ placeholder,
38
+ size,
39
+ disableClearButton,
40
+ disableToggleButton,
41
+ disabled,
42
+ readOnly,
43
+ required,
44
+ error,
45
+ onClear,
46
+ id,
47
+ inputWrapperRef,
48
+ htmlInputWrapperProps,
49
+ inputProps,
50
+ toggleButtonProps,
51
+ prefix,
52
+ suffix
53
+ }) => {
54
+ const inputWrapperClassNames = cx(styles["input-wrapper"], {
55
+ [styles["small"]]: size === "small",
56
+ [styles["large"]]: size === "large",
57
+ [styles["no-clear-button"]]: disableClearButton,
58
+ [styles["no-toggle-button"]]: disableToggleButton,
59
+ [styles["disabled"]]: disabled || readOnly
60
+ });
61
+ return /* @__PURE__ */ jsxs(
62
+ "div",
63
+ {
64
+ ref: inputWrapperRef,
65
+ ...htmlInputWrapperProps,
66
+ className: cx(inputWrapperClassNames, htmlInputWrapperProps?.className),
67
+ children: [
68
+ prefix ? /* @__PURE__ */ jsx("div", { className: styles["prefix"], children: prefix }) : null,
69
+ /* @__PURE__ */ jsx(
70
+ "input",
71
+ {
72
+ id,
73
+ placeholder,
74
+ disabled,
75
+ readOnly,
76
+ required,
77
+ ...inputProps,
78
+ className: cx(styles["input"], inputProps?.className, {
79
+ [styles["error"]]: error
80
+ })
81
+ }
82
+ ),
83
+ suffix ? /* @__PURE__ */ jsx("div", { className: styles["suffix"], children: suffix }) : null,
84
+ /* @__PURE__ */ jsxs("div", { className: styles["buttons-wrapper"], children: [
85
+ disableClearButton ? null : /* @__PURE__ */ jsx("div", { className: styles["close-button-wrapper"], children: /* @__PURE__ */ jsx(
86
+ Button,
87
+ {
88
+ icon: SvgClose,
89
+ "aria-label": "clear selection",
90
+ appearance: "ghost",
91
+ size: "small",
92
+ className: styles["close-button"],
93
+ onClick: () => {
94
+ onClear?.();
95
+ }
96
+ }
97
+ ) }),
98
+ disableToggleButton ? null : /* @__PURE__ */ jsx("div", { className: styles["toggle-button-wrapper"], children: /* @__PURE__ */ jsx(
99
+ Button,
100
+ {
101
+ icon: SvgChevronRight,
102
+ "aria-label": "toggle menu",
103
+ appearance: "ghost",
104
+ size: "small",
105
+ disabled,
106
+ ...toggleButtonProps,
107
+ className: cx(
108
+ styles["toggle-button"],
109
+ toggleButtonProps?.className
110
+ )
111
+ }
112
+ ) })
113
+ ] })
114
+ ]
115
+ }
116
+ );
117
+ };
118
+ SelectFieldInput.displayName = "SelectFieldInput";
119
+
120
+ const useCombo = ({
121
+ options,
122
+ pinned,
123
+ groupToString,
124
+ groupSorter,
125
+ selectedOption,
126
+ onSelectedOptionChange,
127
+ onInputValueChange,
128
+ onIsOpenChange,
129
+ displayAs = "popover",
130
+ disableHighlightOnOpen = false,
131
+ disabled,
132
+ virtualize = false
133
+ }) => {
134
+ const [inputValue, setInputValue] = useState(selectedOption?.label ?? "");
135
+ const effectiveSearchValue = selectedOption?.label === inputValue ? "" : inputValue;
136
+ const { pinnedSections, ungroupedItems, groupSections } = useProcessedOptions(
137
+ {
138
+ options,
139
+ pinned,
140
+ searchValue: effectiveSearchValue,
141
+ groupToString,
142
+ groupSorter
143
+ }
144
+ );
145
+ const { downshiftItems, sectionsMeta } = useMemo(
146
+ () => buildDownshiftItems({
147
+ pinnedSections,
148
+ groupSections,
149
+ ungroupedItems
150
+ }),
151
+ [pinnedSections, groupSections, ungroupedItems]
152
+ );
153
+ const selectedDownshiftItem = useMemo(() => {
154
+ return selectedOption ? mapOptionToDownshiftItem(selectedOption) : null;
155
+ }, [selectedOption]);
156
+ const { ref: wrapperDivRef, environment } = useDownshiftEnvironment();
157
+ const highlightChangeTypeRef = useRef("");
158
+ const {
159
+ isOpen,
160
+ highlightedIndex,
161
+ getToggleButtonProps,
162
+ getLabelProps,
163
+ getMenuProps,
164
+ getInputProps,
165
+ getItemProps,
166
+ closeMenu,
167
+ openMenu,
168
+ setHighlightedIndex
169
+ } = useCombobox({
170
+ isItemDisabled: (item, _index) => {
171
+ if (!item) {
172
+ return false;
173
+ }
174
+ return (disabled || item.disabled) ?? false;
175
+ },
176
+ environment,
177
+ selectedItem: selectedDownshiftItem,
178
+ inputValue,
179
+ // Controlled input value
180
+ onSelectedItemChange: ({
181
+ selectedItem: si
182
+ }) => {
183
+ if (si && (si.type === "option" || si.type === "pinned-option" || si.type === "grouped-option")) {
184
+ onSelectedOptionChange(si.original);
185
+ } else {
186
+ onSelectedOptionChange(null);
187
+ }
188
+ },
189
+ onInputValueChange: (changes) => {
190
+ setInputValue(changes.inputValue ?? "");
191
+ onInputValueChange?.(changes);
192
+ },
193
+ onHighlightedIndexChange: ({ type }) => {
194
+ highlightChangeTypeRef.current = type;
195
+ },
196
+ onIsOpenChange: (changes) => {
197
+ onIsOpenChange?.(changes);
198
+ if (changes.isOpen && !disableHighlightOnOpen) {
199
+ const selectedItemIndex = downshiftItems.findIndex(
200
+ (item) => item.original.id === selectedOption?.id
201
+ );
202
+ setHighlightedIndex(selectedItemIndex);
203
+ }
204
+ },
205
+ items: downshiftItems,
206
+ itemToString(item) {
207
+ return item?.original.label ?? "";
208
+ },
209
+ stateReducer: (state, actionAndChanges) => stateReducer$1(state, actionAndChanges, displayAs),
210
+ ...virtualize && { scrollIntoView: () => {
211
+ } }
212
+ });
213
+ return {
214
+ inputValue,
215
+ wrapperDivRef,
216
+ getToggleButtonProps,
217
+ getLabelProps,
218
+ getMenuProps,
219
+ getInputProps,
220
+ getItemProps,
221
+ highlightedIndex,
222
+ highlightChangeTypeRef,
223
+ isOpen,
224
+ downshiftItems,
225
+ sectionsMeta,
226
+ closeMenu,
227
+ openMenu
228
+ };
229
+ };
230
+ function stateReducer$1(state, actionAndChanges, displayAs) {
231
+ const { type, changes } = actionAndChanges;
232
+ switch (type) {
233
+ case useCombobox.stateChangeTypes.InputBlur:
234
+ if (displayAs === "dialog" && state.isOpen) {
235
+ return {
236
+ ...changes,
237
+ isOpen: state.isOpen
238
+ };
239
+ }
240
+ return {
241
+ ...changes,
242
+ inputValue: state.selectedItem?.original.label ?? state.inputValue
243
+ };
244
+ case useCombobox.stateChangeTypes.InputKeyDownEscape:
245
+ case useCombobox.stateChangeTypes.FunctionCloseMenu:
246
+ return {
247
+ ...changes,
248
+ inputValue: state.selectedItem?.original.label ?? state.inputValue
249
+ };
250
+ case useCombobox.stateChangeTypes.InputClick:
251
+ if (displayAs === "dialog" && state.isOpen) {
252
+ return {
253
+ ...changes,
254
+ isOpen: state.isOpen
255
+ };
256
+ }
257
+ return changes;
258
+ case useCombobox.stateChangeTypes.InputKeyDownEnter:
259
+ case useCombobox.stateChangeTypes.ItemClick:
260
+ return changes;
261
+ default:
262
+ return changes;
263
+ }
264
+ }
265
+
266
+ const SelectFieldComboboxMode = ({
267
+ id,
268
+ helperUid,
269
+ selectedOption,
270
+ onSelectedOptionChange,
271
+ displayAs,
272
+ isDisabledOrReadOnly,
273
+ disabled,
274
+ readOnly,
275
+ required,
276
+ placeholder,
277
+ size,
278
+ error,
279
+ hasHelperText,
280
+ disableClearButton,
281
+ prefix,
282
+ suffix,
283
+ label,
284
+ labelNode,
285
+ hideLabel,
286
+ hint,
287
+ errorMessages,
288
+ warning,
289
+ description,
290
+ className,
291
+ style,
292
+ layoutStyles,
293
+ pinned,
294
+ groupToString,
295
+ groupSorter,
296
+ virtualize,
297
+ options,
298
+ loading,
299
+ loadingMore,
300
+ hasMore,
301
+ loadOptions,
302
+ loadMore,
303
+ initialLoad,
304
+ initialLoadPerformed,
305
+ setInitialLoadPerformed,
306
+ inputWrapperRef,
307
+ debounceMs
308
+ }) => {
309
+ const debouncedOptionLoader = useDebouncedCallback((inputValue2) => {
310
+ loadOptions(selectedOption?.label === inputValue2 ? "" : inputValue2, {
311
+ initial: true
312
+ });
313
+ }, debounceMs);
314
+ const adjustInputValueForSelectedOption = useCallback(
315
+ (inputValue2) => {
316
+ return selectedOption?.label === inputValue2 ? "" : inputValue2;
317
+ },
318
+ [selectedOption?.label]
319
+ );
320
+ const {
321
+ isOpen,
322
+ getToggleButtonProps,
323
+ getLabelProps,
324
+ getMenuProps,
325
+ getInputProps,
326
+ wrapperDivRef,
327
+ highlightedIndex,
328
+ highlightChangeTypeRef,
329
+ getItemProps,
330
+ inputValue,
331
+ downshiftItems,
332
+ closeMenu,
333
+ sectionsMeta
334
+ } = useCombo({
335
+ displayAs,
336
+ disabled: isDisabledOrReadOnly,
337
+ options,
338
+ pinned,
339
+ groupToString,
340
+ groupSorter,
341
+ selectedOption,
342
+ virtualize,
343
+ onSelectedOptionChange: (opt) => onSelectedOptionChange(opt),
344
+ async onIsOpenChange(changes) {
345
+ if (initialLoad === "open" && !initialLoadPerformed && changes.isOpen) {
346
+ await loadOptions(adjustInputValueForSelectedOption(inputValue), {
347
+ initial: true
348
+ });
349
+ setInitialLoadPerformed(true);
350
+ }
351
+ },
352
+ onInputValueChange: ({ inputValue: iv }) => {
353
+ debouncedOptionLoader(iv ?? "");
354
+ }
355
+ });
356
+ useEffect(() => {
357
+ const performInitialLoad = async () => {
358
+ if (initialLoad === "immediate" && !initialLoadPerformed) {
359
+ await loadOptions(adjustInputValueForSelectedOption(inputValue), {
360
+ initial: true
361
+ });
362
+ setInitialLoadPerformed(true);
363
+ }
364
+ };
365
+ performInitialLoad();
366
+ }, [
367
+ loadOptions,
368
+ initialLoadPerformed,
369
+ initialLoad,
370
+ inputValue,
371
+ adjustInputValueForSelectedOption,
372
+ setInitialLoadPerformed
373
+ ]);
374
+ const handleLoadMore = async () => {
375
+ await loadMore(adjustInputValueForSelectedOption(inputValue));
376
+ };
377
+ if (displayAs === "dialog") {
378
+ return /* @__PURE__ */ jsxs(
379
+ "div",
380
+ {
381
+ className: className ? `${styles["search-field"]} ${className}` : styles["search-field"],
382
+ style: { ...layoutStyles, ...style },
383
+ ref: wrapperDivRef,
384
+ children: [
385
+ /* @__PURE__ */ jsx(
386
+ SelectFieldLabel,
387
+ {
388
+ label,
389
+ labelNode,
390
+ hideLabel,
391
+ getLabelProps,
392
+ required
393
+ }
394
+ ),
395
+ /* @__PURE__ */ jsx(
396
+ SelectFieldInput,
397
+ {
398
+ disabled,
399
+ readOnly,
400
+ required,
401
+ disableToggleButton: false,
402
+ placeholder,
403
+ disableClearButton,
404
+ toggleButtonProps: getToggleButtonProps(),
405
+ onClear: () => onSelectedOptionChange(null),
406
+ id: `${id}-input`,
407
+ inputProps: getInputProps({
408
+ "aria-describedby": hasHelperText ? helperUid : void 0,
409
+ "aria-invalid": error ? true : void 0
410
+ }),
411
+ size,
412
+ error: !!error,
413
+ prefix,
414
+ suffix
415
+ }
416
+ ),
417
+ hasHelperText ? /* @__PURE__ */ jsx(
418
+ FieldMessage,
419
+ {
420
+ id: helperUid,
421
+ hint,
422
+ error: errorMessages,
423
+ warning,
424
+ description
425
+ }
426
+ ) : null,
427
+ /* @__PURE__ */ jsx(
428
+ FieldDialog,
429
+ {
430
+ id: `${id}-dialog`,
431
+ isOpen,
432
+ onClose: closeMenu,
433
+ title: label,
434
+ field: /* @__PURE__ */ jsx(
435
+ SelectFieldInput,
436
+ {
437
+ disabled,
438
+ readOnly,
439
+ inputProps: getInputProps(),
440
+ disableToggleButton: true,
441
+ placeholder,
442
+ disableClearButton,
443
+ onClear: () => onSelectedOptionChange(null),
444
+ id: `${id}-dialog-input`,
445
+ inputWrapperRef,
446
+ size: "medium",
447
+ error: !!error,
448
+ prefix,
449
+ suffix
450
+ }
451
+ ),
452
+ initialFocusResolver: (elements) => {
453
+ return elements.find((element) => element.tagName === "INPUT") || elements[0];
454
+ },
455
+ children: /* @__PURE__ */ jsx(
456
+ SelectFieldList,
457
+ {
458
+ isOpen: true,
459
+ items: downshiftItems,
460
+ sectionsMeta,
461
+ getMenuProps,
462
+ getItemProps,
463
+ highlightedIndex,
464
+ highlightChangeTypeRef,
465
+ selectedOption,
466
+ hasMore,
467
+ onLoadMore: handleLoadMore,
468
+ loading,
469
+ loadingMore,
470
+ disabled: isDisabledOrReadOnly,
471
+ virtualize
472
+ }
473
+ )
474
+ }
475
+ )
476
+ ]
477
+ }
478
+ );
479
+ }
480
+ return /* @__PURE__ */ jsxs(
481
+ "div",
482
+ {
483
+ className: className ? `${styles["search-field"]} ${className}` : styles["search-field"],
484
+ style: { ...layoutStyles, ...style },
485
+ children: [
486
+ /* @__PURE__ */ jsx(
487
+ SelectFieldLabel,
488
+ {
489
+ label,
490
+ labelNode,
491
+ hideLabel,
492
+ getLabelProps,
493
+ required
494
+ }
495
+ ),
496
+ /* @__PURE__ */ jsx(
497
+ SelectFieldInput,
498
+ {
499
+ disabled,
500
+ readOnly,
501
+ required,
502
+ inputProps: getInputProps({
503
+ popovertarget: `${id}-popover`,
504
+ "aria-describedby": hasHelperText ? helperUid : void 0,
505
+ "aria-invalid": error ? true : void 0
506
+ }),
507
+ toggleButtonProps: getToggleButtonProps(),
508
+ disableToggleButton: false,
509
+ placeholder,
510
+ disableClearButton,
511
+ onClear: () => onSelectedOptionChange(null),
512
+ id: `${id}-input`,
513
+ inputWrapperRef,
514
+ size,
515
+ error: !!error,
516
+ prefix,
517
+ suffix
518
+ }
519
+ ),
520
+ hasHelperText ? /* @__PURE__ */ jsx(
521
+ FieldMessage,
522
+ {
523
+ id: helperUid,
524
+ hint,
525
+ error: errorMessages,
526
+ warning,
527
+ description
528
+ }
529
+ ) : null,
530
+ /* @__PURE__ */ jsx(
531
+ FieldPopover,
532
+ {
533
+ id: `${id}-popover`,
534
+ referenceElement: inputWrapperRef,
535
+ open: isOpen && displayAs === "popover",
536
+ onClickOutside: closeMenu,
537
+ children: /* @__PURE__ */ jsx(
538
+ SelectFieldList,
539
+ {
540
+ isOpen,
541
+ items: downshiftItems,
542
+ sectionsMeta,
543
+ getMenuProps,
544
+ getItemProps,
545
+ highlightedIndex,
546
+ highlightChangeTypeRef,
547
+ selectedOption,
548
+ hasMore,
549
+ onLoadMore: handleLoadMore,
550
+ loading,
551
+ loadingMore,
552
+ disabled: isDisabledOrReadOnly,
553
+ virtualize
554
+ }
555
+ )
556
+ }
557
+ )
558
+ ]
559
+ }
560
+ );
561
+ };
562
+
563
+ const SelectFieldTrigger = ({
564
+ placeholder,
565
+ size,
566
+ disableClearButton,
567
+ disabled,
568
+ readOnly,
569
+ error,
570
+ onClear,
571
+ id,
572
+ inputWrapperRef,
573
+ toggleButtonProps,
574
+ displayValue,
575
+ prefix,
576
+ suffix,
577
+ popoverTarget
578
+ }) => {
579
+ const { ref: downshiftRef, ...restToggleButtonProps } = toggleButtonProps ?? {};
580
+ const mergedRef = useMergeRefs([inputWrapperRef, downshiftRef]);
581
+ const inputWrapperClassNames = cx(styles["input-wrapper"], {
582
+ [styles["small"]]: size === "small",
583
+ [styles["large"]]: size === "large",
584
+ [styles["no-clear-button"]]: disableClearButton,
585
+ [styles["disabled"]]: disabled || readOnly
586
+ });
587
+ return /* @__PURE__ */ jsxs("div", { style: { position: "relative" }, children: [
588
+ /* @__PURE__ */ jsxs(
589
+ "div",
590
+ {
591
+ ref: mergedRef,
592
+ ...restToggleButtonProps,
593
+ popovertarget: popoverTarget,
594
+ id,
595
+ className: cx(inputWrapperClassNames, restToggleButtonProps?.className),
596
+ children: [
597
+ prefix ? /* @__PURE__ */ jsx("div", { className: styles["prefix"], children: prefix }) : null,
598
+ /* @__PURE__ */ jsx(
599
+ "div",
600
+ {
601
+ className: cx(styles["input"], {
602
+ [styles["error"]]: error
603
+ }),
604
+ children: displayValue ? /* @__PURE__ */ jsx("span", { children: displayValue }) : /* @__PURE__ */ jsx("span", { className: styles["fake-placeholder"], children: placeholder })
605
+ }
606
+ ),
607
+ suffix ? /* @__PURE__ */ jsx("div", { className: styles["suffix"], children: suffix }) : null,
608
+ /* @__PURE__ */ jsx("div", { className: styles["buttons-wrapper"], children: /* @__PURE__ */ jsx("div", { className: styles["toggle-button-wrapper"], children: /* @__PURE__ */ jsx(
609
+ Button,
610
+ {
611
+ icon: SvgChevronRight,
612
+ "aria-label": "toggle menu",
613
+ appearance: "ghost",
614
+ size: "small",
615
+ disabled,
616
+ tabIndex: -1,
617
+ className: styles["toggle-button"]
618
+ }
619
+ ) }) })
620
+ ]
621
+ }
622
+ ),
623
+ disableClearButton ? null : /* @__PURE__ */ jsx(
624
+ "div",
625
+ {
626
+ className: styles["buttons-wrapper"],
627
+ style: { insetInlineEnd: "2rem" },
628
+ children: /* @__PURE__ */ jsx("div", { className: styles["close-button-wrapper"], children: /* @__PURE__ */ jsx(
629
+ Button,
630
+ {
631
+ icon: SvgClose,
632
+ "aria-label": "clear selection",
633
+ appearance: "ghost",
634
+ size: "small",
635
+ className: styles["close-button"],
636
+ onClick: (e) => {
637
+ e.stopPropagation();
638
+ onClear?.();
639
+ }
640
+ }
641
+ ) })
642
+ }
643
+ )
644
+ ] });
645
+ };
646
+ SelectFieldTrigger.displayName = "SelectFieldTrigger";
647
+
648
+ const useSelectMode = ({
649
+ options,
650
+ pinned,
651
+ groupToString,
652
+ groupSorter,
653
+ selectedOption,
654
+ onSelectedOptionChange,
655
+ onIsOpenChange,
656
+ displayAs = "popover",
657
+ disableHighlightOnOpen = false,
658
+ disabled,
659
+ virtualize = false
660
+ }) => {
661
+ const { pinnedSections, ungroupedItems, groupSections } = useProcessedOptions(
662
+ {
663
+ options,
664
+ pinned,
665
+ searchValue: "",
666
+ groupToString,
667
+ groupSorter
668
+ }
669
+ );
670
+ const { downshiftItems, sectionsMeta } = useMemo(
671
+ () => buildDownshiftItems({
672
+ pinnedSections,
673
+ groupSections,
674
+ ungroupedItems
675
+ }),
676
+ [pinnedSections, groupSections, ungroupedItems]
677
+ );
678
+ const selectedDownshiftItem = useMemo(() => {
679
+ return selectedOption ? mapOptionToDownshiftItem(selectedOption) : null;
680
+ }, [selectedOption]);
681
+ const { ref: wrapperDivRef, environment } = useDownshiftEnvironment();
682
+ const highlightChangeTypeRef = useRef("");
683
+ const {
684
+ isOpen,
685
+ highlightedIndex,
686
+ getToggleButtonProps,
687
+ getLabelProps,
688
+ getMenuProps,
689
+ getItemProps,
690
+ closeMenu,
691
+ openMenu,
692
+ setHighlightedIndex
693
+ } = useSelect({
694
+ isItemDisabled: (item) => {
695
+ if (!item) return false;
696
+ return (disabled || item.disabled) ?? false;
697
+ },
698
+ environment,
699
+ selectedItem: selectedDownshiftItem,
700
+ onSelectedItemChange: ({
701
+ selectedItem: si
702
+ }) => {
703
+ if (si && (si.type === "option" || si.type === "pinned-option" || si.type === "grouped-option")) {
704
+ onSelectedOptionChange(si.original);
705
+ } else {
706
+ onSelectedOptionChange(null);
707
+ }
708
+ },
709
+ onHighlightedIndexChange: ({ type }) => {
710
+ highlightChangeTypeRef.current = type;
711
+ },
712
+ onIsOpenChange: (changes) => {
713
+ onIsOpenChange?.(changes);
714
+ if (changes.isOpen && !disableHighlightOnOpen) {
715
+ const selectedItemIndex = downshiftItems.findIndex(
716
+ (item) => item.original.id === selectedOption?.id
717
+ );
718
+ setHighlightedIndex(selectedItemIndex);
719
+ }
720
+ },
721
+ items: downshiftItems,
722
+ itemToString(item) {
723
+ return item?.original.label ?? "";
724
+ },
725
+ stateReducer: (state, actionAndChanges) => stateReducer(state, actionAndChanges, displayAs),
726
+ ...virtualize && { scrollIntoView: () => {
727
+ } }
728
+ });
729
+ return {
730
+ wrapperDivRef,
731
+ getToggleButtonProps,
732
+ getLabelProps,
733
+ getMenuProps,
734
+ getItemProps,
735
+ highlightedIndex,
736
+ highlightChangeTypeRef,
737
+ isOpen,
738
+ downshiftItems,
739
+ sectionsMeta,
740
+ closeMenu,
741
+ openMenu
742
+ };
743
+ };
744
+ function stateReducer(state, actionAndChanges, displayAs) {
745
+ const { type, changes } = actionAndChanges;
746
+ switch (type) {
747
+ case useSelect.stateChangeTypes.ToggleButtonBlur:
748
+ if (displayAs === "dialog" && state.isOpen) {
749
+ return { ...changes, isOpen: state.isOpen };
750
+ }
751
+ return changes;
752
+ case useSelect.stateChangeTypes.ToggleButtonKeyDownEscape:
753
+ case useSelect.stateChangeTypes.FunctionCloseMenu:
754
+ return changes;
755
+ case useSelect.stateChangeTypes.ToggleButtonClick:
756
+ if (displayAs === "dialog" && state.isOpen) {
757
+ return { ...changes, isOpen: state.isOpen };
758
+ }
759
+ return changes;
760
+ case useSelect.stateChangeTypes.ToggleButtonKeyDownEnter:
761
+ case useSelect.stateChangeTypes.ItemClick:
762
+ return changes;
763
+ default:
764
+ return changes;
765
+ }
766
+ }
767
+
768
+ const SelectFieldSelectMode = ({
769
+ id,
770
+ helperUid,
771
+ selectedOption,
772
+ onSelectedOptionChange,
773
+ displayAs,
774
+ isDisabledOrReadOnly,
775
+ disabled,
776
+ readOnly,
777
+ placeholder,
778
+ size,
779
+ error,
780
+ hasHelperText,
781
+ disableClearButton,
782
+ prefix,
783
+ suffix,
784
+ label,
785
+ labelNode,
786
+ hideLabel,
787
+ hint,
788
+ errorMessages,
789
+ warning,
790
+ description,
791
+ className,
792
+ style,
793
+ layoutStyles,
794
+ pinned,
795
+ groupToString,
796
+ groupSorter,
797
+ virtualize,
798
+ options,
799
+ loading,
800
+ loadingMore,
801
+ hasMore,
802
+ loadOptions,
803
+ loadMore,
804
+ initialLoad,
805
+ initialLoadPerformed,
806
+ setInitialLoadPerformed,
807
+ inputWrapperRef,
808
+ required
809
+ }) => {
810
+ const {
811
+ isOpen,
812
+ getToggleButtonProps,
813
+ getLabelProps,
814
+ getMenuProps,
815
+ wrapperDivRef,
816
+ highlightedIndex,
817
+ highlightChangeTypeRef,
818
+ getItemProps,
819
+ downshiftItems,
820
+ closeMenu,
821
+ sectionsMeta
822
+ } = useSelectMode({
823
+ displayAs,
824
+ disabled: isDisabledOrReadOnly,
825
+ options,
826
+ pinned,
827
+ groupToString,
828
+ groupSorter,
829
+ selectedOption,
830
+ virtualize,
831
+ onSelectedOptionChange: (opt) => onSelectedOptionChange(opt),
832
+ async onIsOpenChange(changes) {
833
+ if (initialLoad === "open" && !initialLoadPerformed && changes.isOpen) {
834
+ await loadOptions("", { initial: true });
835
+ setInitialLoadPerformed(true);
836
+ }
837
+ }
838
+ });
839
+ useEffect(() => {
840
+ const performInitialLoad = async () => {
841
+ if (initialLoad === "immediate" && !initialLoadPerformed) {
842
+ await loadOptions("", { initial: true });
843
+ setInitialLoadPerformed(true);
844
+ }
845
+ };
846
+ performInitialLoad();
847
+ }, [loadOptions, initialLoadPerformed, initialLoad, setInitialLoadPerformed]);
848
+ const handleLoadMore = async () => {
849
+ await loadMore("");
850
+ };
851
+ const toggleButtonProps = getToggleButtonProps({
852
+ disabled: !!disabled,
853
+ "aria-required": required ? true : void 0,
854
+ "aria-describedby": hasHelperText ? helperUid : void 0,
855
+ "aria-invalid": error ? true : void 0
856
+ });
857
+ if (displayAs === "dialog") {
858
+ return /* @__PURE__ */ jsxs(
859
+ "div",
860
+ {
861
+ className: className ? `${styles["search-field"]} ${className}` : styles["search-field"],
862
+ style: { ...layoutStyles, ...style },
863
+ ref: wrapperDivRef,
864
+ children: [
865
+ /* @__PURE__ */ jsx(
866
+ SelectFieldLabel,
867
+ {
868
+ label,
869
+ labelNode,
870
+ hideLabel,
871
+ getLabelProps,
872
+ required
873
+ }
874
+ ),
875
+ /* @__PURE__ */ jsx(
876
+ SelectFieldTrigger,
877
+ {
878
+ disabled,
879
+ readOnly,
880
+ placeholder,
881
+ disableClearButton,
882
+ toggleButtonProps,
883
+ onClear: () => onSelectedOptionChange(null),
884
+ id: `${id}-trigger`,
885
+ inputWrapperRef,
886
+ displayValue: selectedOption?.label,
887
+ size,
888
+ error: !!error,
889
+ prefix,
890
+ suffix
891
+ }
892
+ ),
893
+ hasHelperText ? /* @__PURE__ */ jsx(
894
+ FieldMessage,
895
+ {
896
+ id: helperUid,
897
+ hint,
898
+ error: errorMessages,
899
+ warning,
900
+ description
901
+ }
902
+ ) : null,
903
+ /* @__PURE__ */ jsx(
904
+ FieldDialog,
905
+ {
906
+ id: `${id}-dialog`,
907
+ isOpen,
908
+ onClose: closeMenu,
909
+ title: label,
910
+ children: /* @__PURE__ */ jsx(
911
+ SelectFieldList,
912
+ {
913
+ isOpen: true,
914
+ items: downshiftItems,
915
+ sectionsMeta,
916
+ getMenuProps: (opts) => getMenuProps({
917
+ ...opts,
918
+ style: { ...opts?.style, outline: "none" },
919
+ onKeyDown: toggleButtonProps.onKeyDown,
920
+ tabIndex: 0,
921
+ "aria-activedescendant": toggleButtonProps["aria-activedescendant"]
922
+ }),
923
+ getItemProps,
924
+ highlightedIndex,
925
+ highlightChangeTypeRef,
926
+ selectedOption,
927
+ hasMore,
928
+ onLoadMore: handleLoadMore,
929
+ loading,
930
+ loadingMore,
931
+ disabled: isDisabledOrReadOnly,
932
+ virtualize
933
+ }
934
+ )
935
+ }
936
+ )
937
+ ]
938
+ }
939
+ );
940
+ }
941
+ return /* @__PURE__ */ jsxs(
942
+ "div",
943
+ {
944
+ className: className ? `${styles["search-field"]} ${className}` : styles["search-field"],
945
+ style: { ...layoutStyles, ...style },
946
+ children: [
947
+ /* @__PURE__ */ jsx(
948
+ SelectFieldLabel,
949
+ {
950
+ label,
951
+ labelNode,
952
+ hideLabel,
953
+ getLabelProps,
954
+ required
955
+ }
956
+ ),
957
+ /* @__PURE__ */ jsx(
958
+ SelectFieldTrigger,
959
+ {
960
+ disabled,
961
+ readOnly,
962
+ placeholder,
963
+ disableClearButton,
964
+ toggleButtonProps,
965
+ onClear: () => onSelectedOptionChange(null),
966
+ id: `${id}-trigger`,
967
+ popoverTarget: `${id}-popover`,
968
+ inputWrapperRef,
969
+ displayValue: selectedOption?.label,
970
+ size,
971
+ error: !!error,
972
+ prefix,
973
+ suffix
974
+ }
975
+ ),
976
+ hasHelperText ? /* @__PURE__ */ jsx(
977
+ FieldMessage,
978
+ {
979
+ id: helperUid,
980
+ hint,
981
+ error: errorMessages,
982
+ warning,
983
+ description
984
+ }
985
+ ) : null,
986
+ /* @__PURE__ */ jsx(
987
+ FieldPopover,
988
+ {
989
+ id: `${id}-popover`,
990
+ referenceElement: inputWrapperRef,
991
+ open: isOpen && displayAs === "popover",
992
+ onClickOutside: closeMenu,
993
+ children: /* @__PURE__ */ jsx(
994
+ SelectFieldList,
995
+ {
996
+ isOpen,
997
+ items: downshiftItems,
998
+ sectionsMeta,
999
+ getMenuProps,
1000
+ getItemProps,
1001
+ highlightedIndex,
1002
+ highlightChangeTypeRef,
1003
+ selectedOption,
1004
+ hasMore,
1005
+ onLoadMore: handleLoadMore,
1006
+ loading,
1007
+ loadingMore,
1008
+ disabled: isDisabledOrReadOnly,
1009
+ virtualize
1010
+ }
1011
+ )
1012
+ }
1013
+ )
1014
+ ]
1015
+ }
1016
+ );
1017
+ };
1018
+
1019
+ const SelectField = forwardRef(
1020
+ (propsWithLayout, ref) => {
1021
+ const { layoutStyles, componentProps } = useLayoutPropsUtil(propsWithLayout);
1022
+ const [initialLoadPerformed, setInitialLoadPerformed] = useState(false);
1023
+ const inputWrapperRef = useRef(null);
1024
+ const {
1025
+ id: idProp,
1026
+ value: selectedOption,
1027
+ initialLoad: initialLoadProp = "auto",
1028
+ displayMenuAs: displayMenuAsProp = "auto",
1029
+ lazy,
1030
+ loadOptions: loadOptionsProp,
1031
+ label,
1032
+ labelNode,
1033
+ hideLabel,
1034
+ placeholder,
1035
+ disableClearButton: disableClearButtonProp = false,
1036
+ debounceMs = 200,
1037
+ onSelectedOptionChange,
1038
+ cache,
1039
+ size,
1040
+ error,
1041
+ hint,
1042
+ description,
1043
+ errorAriaLive: _errorAriaLive,
1044
+ required,
1045
+ disabled,
1046
+ readOnly,
1047
+ prefix,
1048
+ suffix,
1049
+ warning,
1050
+ className,
1051
+ style,
1052
+ pinned,
1053
+ virtualize,
1054
+ disableSearch
1055
+ } = componentProps;
1056
+ const groupToString = "groupToString" in componentProps ? componentProps.groupToString : void 0;
1057
+ const groupSorter = "groupSorter" in componentProps ? componentProps.groupSorter : void 0;
1058
+ const autoId = useId();
1059
+ const id = idProp ?? autoId;
1060
+ const helperUid = useId();
1061
+ warnDeprecatedErrorUsage("SelectField", error);
1062
+ const errorMessages = typeof error === "boolean" || error === void 0 ? void 0 : error;
1063
+ const hasHelperText = !!(hint || errorMessages || warning || description);
1064
+ const isDisabledOrReadOnly = (disabled || readOnly) ?? false;
1065
+ const { isMobile } = useAdaptiveView();
1066
+ const displayAs = displayMenuAsProp === "auto" ? isMobile ? "dialog" : "popover" : displayMenuAsProp;
1067
+ const initialLoad = initialLoadProp === "auto" ? "immediate" : initialLoadProp;
1068
+ const pageSize = lazy === "page" && "lazyOptions" in componentProps ? componentProps.lazyOptions?.pageSize ?? DEFAULT_PAGE_SIZE : DEFAULT_PAGE_SIZE;
1069
+ const limit = lazy === "offset" && "lazyOptions" in componentProps ? componentProps.lazyOptions?.limit ?? DEFAULT_PAGE_SIZE : DEFAULT_PAGE_SIZE;
1070
+ const loadingHookConfig = useMemo(() => {
1071
+ const cacheConfig = {
1072
+ enabled: cache?.enabled,
1073
+ maxSize: cache?.maxSize
1074
+ };
1075
+ if (lazy === "page")
1076
+ return {
1077
+ lazy: "page",
1078
+ loadOptions: loadOptionsProp,
1079
+ pageSize,
1080
+ cache: cacheConfig
1081
+ };
1082
+ if (lazy === "offset")
1083
+ return {
1084
+ lazy: "offset",
1085
+ loadOptions: loadOptionsProp,
1086
+ limit,
1087
+ cache: cacheConfig
1088
+ };
1089
+ if (lazy === "group")
1090
+ return {
1091
+ lazy: "group",
1092
+ loadOptions: loadOptionsProp,
1093
+ cache: cacheConfig
1094
+ };
1095
+ return {
1096
+ lazy: false,
1097
+ loadOptions: loadOptionsProp,
1098
+ cache: cacheConfig
1099
+ };
1100
+ }, [
1101
+ lazy,
1102
+ loadOptionsProp,
1103
+ pageSize,
1104
+ limit,
1105
+ cache?.enabled,
1106
+ cache?.maxSize
1107
+ ]);
1108
+ const {
1109
+ options,
1110
+ loading,
1111
+ loadingMore,
1112
+ hasMore,
1113
+ loadOptions,
1114
+ loadMore,
1115
+ clearCache
1116
+ } = useSelectFieldLoading(loadingHookConfig);
1117
+ useImperativeHandle(
1118
+ ref,
1119
+ () => ({
1120
+ clearCache,
1121
+ invalidate: () => {
1122
+ clearCache();
1123
+ setInitialLoadPerformed(false);
1124
+ }
1125
+ }),
1126
+ [clearCache]
1127
+ );
1128
+ const disableClearButton = disableClearButtonProp || !selectedOption || isDisabledOrReadOnly;
1129
+ const baseProps = {
1130
+ id,
1131
+ helperUid,
1132
+ selectedOption,
1133
+ onSelectedOptionChange,
1134
+ displayAs,
1135
+ isDisabledOrReadOnly,
1136
+ disabled,
1137
+ readOnly,
1138
+ required,
1139
+ placeholder,
1140
+ size,
1141
+ error,
1142
+ hasHelperText,
1143
+ disableClearButton,
1144
+ prefix,
1145
+ suffix,
1146
+ label,
1147
+ labelNode,
1148
+ hideLabel,
1149
+ hint,
1150
+ errorMessages,
1151
+ warning,
1152
+ description,
1153
+ className,
1154
+ style,
1155
+ layoutStyles,
1156
+ pinned,
1157
+ groupToString,
1158
+ groupSorter,
1159
+ virtualize,
1160
+ options,
1161
+ loading,
1162
+ loadingMore,
1163
+ hasMore,
1164
+ loadOptions,
1165
+ loadMore,
1166
+ initialLoad,
1167
+ initialLoadPerformed,
1168
+ setInitialLoadPerformed,
1169
+ inputWrapperRef
1170
+ };
1171
+ if (disableSearch) {
1172
+ return /* @__PURE__ */ jsx(SelectFieldSelectMode, { ...baseProps });
1173
+ }
1174
+ const comboboxProps = {
1175
+ ...baseProps,
1176
+ debounceMs
1177
+ };
1178
+ return /* @__PURE__ */ jsx(SelectFieldComboboxMode, { ...comboboxProps });
1179
+ }
1180
+ );
1181
+ SelectField.displayName = "SelectField";
1182
+
1183
+ const defaultFilter = (options, searchValue) => matchSorter(options, searchValue, {
1184
+ keys: ["label", "searchText"],
1185
+ baseSort: (a, b) => a.index - b.index
1186
+ });
1187
+ const toFilterFn = (filter) => typeof filter === "function" ? filter : (options, searchValue) => matchSorter(options, searchValue, {
1188
+ baseSort: (a, b) => a.index - b.index,
1189
+ ...filter
1190
+ });
1191
+ const sortByGroup = (options, groupSorter) => {
1192
+ const groupOrder = /* @__PURE__ */ new Map();
1193
+ const uniqueGroups = [];
1194
+ options.forEach((opt) => {
1195
+ if (!groupOrder.has(opt.group)) {
1196
+ groupOrder.set(opt.group, uniqueGroups.length);
1197
+ uniqueGroups.push(opt.group);
1198
+ }
1199
+ });
1200
+ uniqueGroups.sort((a, b) => {
1201
+ if (a === void 0 && b === void 0) return 0;
1202
+ if (a === void 0) return 1;
1203
+ if (b === void 0) return -1;
1204
+ return groupSorter(a, b);
1205
+ });
1206
+ uniqueGroups.forEach((group, index) => {
1207
+ groupOrder.set(group, index);
1208
+ });
1209
+ return [...options].sort((a, b) => {
1210
+ const orderA = groupOrder.get(a.group) ?? Infinity;
1211
+ const orderB = groupOrder.get(b.group) ?? Infinity;
1212
+ return orderA - orderB;
1213
+ });
1214
+ };
1215
+ const SelectFieldSync = (props) => {
1216
+ const {
1217
+ options,
1218
+ filter: filterProp = defaultFilter,
1219
+ groupSorter,
1220
+ ...rest
1221
+ } = props;
1222
+ const filter = useMemo(() => toFilterFn(filterProp), [filterProp]);
1223
+ const loadOptions = (searchValue) => {
1224
+ const filtered = filter(options, searchValue);
1225
+ return groupSorter ? sortByGroup(filtered, groupSorter) : filtered;
1226
+ };
1227
+ const fieldRef = useRef(null);
1228
+ const prevOptionsRef = useRef(options);
1229
+ useEffect(() => {
1230
+ if (prevOptionsRef.current !== options) {
1231
+ prevOptionsRef.current = options;
1232
+ fieldRef.current?.invalidate();
1233
+ }
1234
+ }, [options]);
1235
+ return /* @__PURE__ */ jsx(
1236
+ SelectField,
1237
+ {
1238
+ ref: fieldRef,
1239
+ lazy: false,
1240
+ loadOptions,
1241
+ debounceMs: 0,
1242
+ ...rest
1243
+ }
1244
+ );
1245
+ };
1246
+
1247
+ export { SelectField as S, SelectFieldSync as a };
1248
+ //# sourceMappingURL=SelectFieldSync-DCrafdbx.js.map