@servicetitan/anvil2 1.50.0 → 1.50.2

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 (199) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/{Calendar-CAYitkfM.js → Calendar-BeFARXwq.js} +2 -2
  3. package/dist/{Calendar-CAYitkfM.js.map → Calendar-BeFARXwq.js.map} +1 -1
  4. package/dist/{Calendar-C9oxHTGG.js → Calendar-M9v994mm.js} +2 -2
  5. package/dist/{Calendar-C9oxHTGG.js.map → Calendar-M9v994mm.js.map} +1 -1
  6. package/dist/Calendar.js +2 -2
  7. package/dist/{Checkbox-DbBeuNdW.js → Checkbox-BwFY38z1.js} +3 -2
  8. package/dist/Checkbox-BwFY38z1.js.map +1 -0
  9. package/dist/{Checkbox-zAKOGEBl.js → Checkbox-Chck2V5C.js} +2 -2
  10. package/dist/{Checkbox-zAKOGEBl.js.map → Checkbox-Chck2V5C.js.map} +1 -1
  11. package/dist/Checkbox.js +2 -2
  12. package/dist/{Combobox-hxGMMb8x.js → Combobox-BTTWNSW1.js} +290 -192
  13. package/dist/Combobox-BTTWNSW1.js.map +1 -0
  14. package/dist/Combobox.js +1 -1
  15. package/dist/{DataTable-DSySFGWC.js → DataTable-hXWouflx.js} +114 -60
  16. package/dist/DataTable-hXWouflx.js.map +1 -0
  17. package/dist/DataTable.css +68 -26
  18. package/dist/{DateField-BT9jJRp5.js → DateField-B8JdMu94.js} +6 -6
  19. package/dist/{DateField-BT9jJRp5.js.map → DateField-B8JdMu94.js.map} +1 -1
  20. package/dist/DateField.js +1 -1
  21. package/dist/{DateFieldRange-ZAic_9mt.js → DateFieldRange-DWAgi_T9.js} +7 -7
  22. package/dist/{DateFieldRange-ZAic_9mt.js.map → DateFieldRange-DWAgi_T9.js.map} +1 -1
  23. package/dist/DateFieldRange.js +1 -1
  24. package/dist/{DateFieldSingle-DAtR8ImE.js → DateFieldSingle-CQ6X-bVX.js} +7 -7
  25. package/dist/{DateFieldSingle-DAtR8ImE.js.map → DateFieldSingle-CQ6X-bVX.js.map} +1 -1
  26. package/dist/DateFieldSingle.js +1 -1
  27. package/dist/{DateFieldYearless-DXO_MPwA.js → DateFieldYearless-D6-NfIHu.js} +4 -4
  28. package/dist/{DateFieldYearless-DXO_MPwA.js.map → DateFieldYearless-D6-NfIHu.js.map} +1 -1
  29. package/dist/DateFieldYearless.js +1 -1
  30. package/dist/{DateFieldYearlessRange-Cg6bbPIi.js → DateFieldYearlessRange-CQM0vibm.js} +4 -4
  31. package/dist/{DateFieldYearlessRange-Cg6bbPIi.js.map → DateFieldYearlessRange-CQM0vibm.js.map} +1 -1
  32. package/dist/DateFieldYearlessRange.js +1 -1
  33. package/dist/{DaysOfTheWeek-9B9d7-hF.js → DaysOfTheWeek-BR-mg77X.js} +3 -3
  34. package/dist/{DaysOfTheWeek-9B9d7-hF.js.map → DaysOfTheWeek-BR-mg77X.js.map} +1 -1
  35. package/dist/DaysOfTheWeek.js +1 -1
  36. package/dist/{Dialog-BwabBKoZ.js → Dialog-Ba2oIATn.js} +8 -8
  37. package/dist/Dialog-Ba2oIATn.js.map +1 -0
  38. package/dist/Dialog.js +2 -2
  39. package/dist/{DialogCancelButton-sTEfx5kf.js → DialogCancelButton-CBHyI0CI.js} +2 -2
  40. package/dist/{DialogCancelButton-sTEfx5kf.js.map → DialogCancelButton-CBHyI0CI.js.map} +1 -1
  41. package/dist/{Drawer-GXeoK-r9.js → Drawer-CWogbC68.js} +7 -7
  42. package/dist/{Drawer-GXeoK-r9.js.map → Drawer-CWogbC68.js.map} +1 -1
  43. package/dist/Drawer.js +1 -1
  44. package/dist/{DrawerContext-Cs3k160L.js → DrawerContext-rJvgnn3O.js} +2 -2
  45. package/dist/{DrawerContext-Cs3k160L.js.map → DrawerContext-rJvgnn3O.js.map} +1 -1
  46. package/dist/FieldDialog-BHgkQOhh.js +519 -0
  47. package/dist/FieldDialog-BHgkQOhh.js.map +1 -0
  48. package/dist/{SelectFieldSync.css → FieldDialog.css} +6 -5
  49. package/dist/{FieldLabel-jqlQ1Ldh.js → FieldLabel-BWOIFXgt.js} +7 -4
  50. package/dist/FieldLabel-BWOIFXgt.js.map +1 -0
  51. package/dist/FieldLabel.js +1 -1
  52. package/dist/{InputMask-CJC9xZHG.js → InputMask-BzY1DJoV.js} +3 -3
  53. package/dist/{InputMask-CJC9xZHG.js.map → InputMask-BzY1DJoV.js.map} +1 -1
  54. package/dist/InputMask.js +1 -1
  55. package/dist/{ListView-D8mfK8Lu.js → ListView-C5OBwbHe.js} +6 -4
  56. package/dist/ListView-C5OBwbHe.js.map +1 -0
  57. package/dist/ListView.js +1 -1
  58. package/dist/{Menu-Cn2JJe1Y.js → Menu-69JwGxYh.js} +2 -2
  59. package/dist/{Menu-Cn2JJe1Y.js.map → Menu-69JwGxYh.js.map} +1 -1
  60. package/dist/Menu.js +1 -1
  61. package/dist/MultiSelectField.d.ts +2 -0
  62. package/dist/MultiSelectField.js +2 -0
  63. package/dist/MultiSelectField.js.map +1 -0
  64. package/dist/MultiSelectFieldSync-B3HNQf7R.js +873 -0
  65. package/dist/MultiSelectFieldSync-B3HNQf7R.js.map +1 -0
  66. package/dist/MultiSelectFieldSync.css +259 -0
  67. package/dist/{NumberField-CjWLnD9X.js → NumberField-CcH25bnO.js} +3 -3
  68. package/dist/{NumberField-CjWLnD9X.js.map → NumberField-CcH25bnO.js.map} +1 -1
  69. package/dist/NumberField.js +1 -1
  70. package/dist/{Page-DEbpjQw0.js → Page-B5HZSjSl.js} +5 -5
  71. package/dist/{Page-DEbpjQw0.js.map → Page-B5HZSjSl.js.map} +1 -1
  72. package/dist/Page.js +1 -1
  73. package/dist/{Pagination-BR8MiRaA.js → Pagination-CkdBaQx6.js} +2 -2
  74. package/dist/{Pagination-BR8MiRaA.js.map → Pagination-CkdBaQx6.js.map} +1 -1
  75. package/dist/Pagination.js +1 -1
  76. package/dist/{Popover-CCXrzBul.js → Popover-D9SmGQTh.js} +6 -5
  77. package/dist/{Popover-CCXrzBul.js.map → Popover-D9SmGQTh.js.map} +1 -1
  78. package/dist/Popover.js +1 -1
  79. package/dist/{ProgressBar-BpKEr6cO.js → ProgressBar-BABkqVmW.js} +2 -2
  80. package/dist/{ProgressBar-BpKEr6cO.js.map → ProgressBar-BABkqVmW.js.map} +1 -1
  81. package/dist/ProgressBar.js +1 -1
  82. package/dist/{Radio-jj0-1dOg.js → Radio-Cds2laHA.js} +2 -2
  83. package/dist/{Radio-jj0-1dOg.js.map → Radio-Cds2laHA.js.map} +1 -1
  84. package/dist/Radio.js +2 -2
  85. package/dist/{RadioGroup-Bxy415eu.js → RadioGroup-COVlUmwy.js} +3 -3
  86. package/dist/{RadioGroup-Bxy415eu.js.map → RadioGroup-COVlUmwy.js.map} +1 -1
  87. package/dist/{SelectCard-CjbsPKZ4.js → SelectCard-C-Kjk5eS.js} +3 -3
  88. package/dist/{SelectCard-CjbsPKZ4.js.map → SelectCard-C-Kjk5eS.js.map} +1 -1
  89. package/dist/SelectCard.js +1 -1
  90. package/dist/SelectField.js +1 -1
  91. package/dist/SelectFieldSync-0CL0RTpg.js +679 -0
  92. package/dist/SelectFieldSync-0CL0RTpg.js.map +1 -0
  93. package/dist/{SelectTrigger-DfVnPiNf.js → SelectTrigger-C1U-PlLz.js} +6 -3
  94. package/dist/SelectTrigger-C1U-PlLz.js.map +1 -0
  95. package/dist/SelectTrigger.js +1 -1
  96. package/dist/{SelectTriggerBase-D8scKtBr.js → SelectTriggerBase-RHD4FTQE.js} +5 -17
  97. package/dist/SelectTriggerBase-RHD4FTQE.js.map +1 -0
  98. package/dist/SelectTriggerBase.css +65 -59
  99. package/dist/SelectTriggerBase.module-B0NFRlQP.js +36 -0
  100. package/dist/SelectTriggerBase.module-B0NFRlQP.js.map +1 -0
  101. package/dist/Table.js +1 -1
  102. package/dist/{TextField-Qv6OqiKQ.js → TextField-BYGSTwkL.js} +2 -2
  103. package/dist/{TextField-Qv6OqiKQ.js.map → TextField-BYGSTwkL.js.map} +1 -1
  104. package/dist/{TextField-DNuEXKyN.js → TextField-BZ3h2mqU.js} +3 -3
  105. package/dist/{TextField-DNuEXKyN.js.map → TextField-BZ3h2mqU.js.map} +1 -1
  106. package/dist/TextField.js +1 -1
  107. package/dist/{Textarea-DdLD4imO.js → Textarea-Cb0Qs2FH.js} +8 -3
  108. package/dist/Textarea-Cb0Qs2FH.js.map +1 -0
  109. package/dist/Textarea.js +1 -1
  110. package/dist/{TimeField-C39hYluo.js → TimeField-DBtJYC7t.js} +4 -4
  111. package/dist/{TimeField-C39hYluo.js.map → TimeField-DBtJYC7t.js.map} +1 -1
  112. package/dist/TimeField.js +1 -1
  113. package/dist/Toast.js +2 -2
  114. package/dist/{Toaster-DJ4tNy-0.js → Toaster-Cerf91qp.js} +2 -2
  115. package/dist/{Toaster-DJ4tNy-0.js.map → Toaster-Cerf91qp.js.map} +1 -1
  116. package/dist/{Toaster-DyDVYq4x.js → Toaster-DDrGllhh.js} +3 -3
  117. package/dist/{Toaster-DyDVYq4x.js.map → Toaster-DDrGllhh.js.map} +1 -1
  118. package/dist/{Toolbar-DEwvVf35.js → Toolbar-K9UFfyvX.js} +326 -171
  119. package/dist/Toolbar-K9UFfyvX.js.map +1 -0
  120. package/dist/Toolbar.css +62 -30
  121. package/dist/Toolbar.js +1 -1
  122. package/dist/{Tooltip-CBy7srE2.js → Tooltip-CkfkiQPz.js} +2 -2
  123. package/dist/{Tooltip-CBy7srE2.js.map → Tooltip-CkfkiQPz.js.map} +1 -1
  124. package/dist/Tooltip.js +1 -1
  125. package/dist/{YearlessDateInputWithPicker-DMGx3gE2.js → YearlessDateInputWithPicker-BIkxKxPi.js} +4 -4
  126. package/dist/{YearlessDateInputWithPicker-DMGx3gE2.js.map → YearlessDateInputWithPicker-BIkxKxPi.js.map} +1 -1
  127. package/dist/beta/components/MultiSelectField/MultiSelectField.d.ts +27 -0
  128. package/dist/beta/components/MultiSelectField/MultiSelectFieldSync.d.ts +63 -0
  129. package/dist/beta/components/MultiSelectField/index.d.ts +3 -0
  130. package/dist/beta/components/MultiSelectField/internal/MultiSelectFieldInput.d.ts +79 -0
  131. package/dist/beta/components/MultiSelectField/internal/MultiSelectFieldList.d.ts +26 -0
  132. package/dist/beta/components/MultiSelectField/internal/useComboMultiple.d.ts +44 -0
  133. package/dist/beta/components/MultiSelectField/stories/MultiSelectField.stories.data.d.ts +19 -0
  134. package/dist/beta/components/MultiSelectField/types.d.ts +311 -0
  135. package/dist/beta/components/SelectField/internal/FieldDialog/FieldDialog.d.ts +3 -1
  136. package/dist/beta/components/SelectField/internal/FieldPopover/FieldPopover.d.ts +1 -0
  137. package/dist/beta/components/SelectField/internal/SelectFieldInput.d.ts +3 -1
  138. package/dist/beta/components/SelectField/internal/SelectFieldLabel.d.ts +11 -3
  139. package/dist/beta/components/SelectField/internal/SelectFieldListItem.d.ts +2 -1
  140. package/dist/beta/components/SelectField/internal/useCombo.d.ts +1 -0
  141. package/dist/beta/components/SelectField/types.d.ts +19 -1
  142. package/dist/beta/components/Table/DataTable/internal/cells/DataTableHeaderCell.d.ts +9 -1
  143. package/dist/beta/components/Table/DataTable/stories/DataTable.story-data.d.ts +1 -0
  144. package/dist/beta/components/Table/internal/ResizeHandle.d.ts +5 -2
  145. package/dist/beta/components/Table/internal/getCommonPinningStyles.d.ts +2 -1
  146. package/dist/beta/components/Toolbar/Filters/internal/utils/filter-state.d.ts +28 -0
  147. package/dist/beta/components/index.d.ts +1 -0
  148. package/dist/beta.js +7 -5
  149. package/dist/beta.js.map +1 -1
  150. package/dist/components/Button/Button.figma.d.ts +1 -0
  151. package/dist/components/Combobox/ComboboxTypes.d.ts +1 -1
  152. package/dist/components/Combobox/internal/ComboboxLegacy/ComboboxLegacyTrigger.d.ts +2 -2
  153. package/dist/components/Combobox/internal/ComboboxLegacy/ComboboxLegacyUtils.d.ts +0 -36
  154. package/dist/components/Combobox/internal/ComboboxUtils.d.ts +0 -57
  155. package/dist/components/FieldLabel/FieldLabel.d.ts +5 -1
  156. package/dist/components/FieldLabel/internal/FieldLabelMoreInfoIcon.d.ts +3 -1
  157. package/dist/components/Icon/Icons.figma.d.ts +11 -0
  158. package/dist/components/ListView/ListView.d.ts +2 -9
  159. package/dist/components/ListView/internal/types.d.ts +12 -0
  160. package/dist/components/SelectTrigger/SelectTrigger.d.ts +1 -1
  161. package/dist/components/Switch/Switch.figma.d.ts +1 -0
  162. package/dist/components/Textarea/Textarea.d.ts +1 -1
  163. package/dist/index.js +34 -34
  164. package/dist/internal/components/Label/Label.d.ts +13 -3
  165. package/dist/internal/hooks/index.d.ts +1 -0
  166. package/dist/internal/hooks/useDownshiftEnvironment/index.d.ts +1 -0
  167. package/dist/internal/hooks/useDownshiftEnvironment/useDownshiftEnvironment.d.ts +36 -0
  168. package/dist/internal/hooks/useOnClickOutside/useOnClickOutside.d.ts +8 -7
  169. package/dist/{match-sorter.esm-CtBw0MrM.js → match-sorter.esm-NrKOPPde.js} +16 -3
  170. package/dist/match-sorter.esm-NrKOPPde.js.map +1 -0
  171. package/dist/types/props.d.ts +5 -0
  172. package/dist/{useInitialFocus-BpmW7pDB.js → useInitialFocus-D_ESGka7.js} +3 -3
  173. package/dist/{useInitialFocus-BpmW7pDB.js.map → useInitialFocus-D_ESGka7.js.map} +1 -1
  174. package/dist/useOnClickOutside-Zw5vzxSq.js +71 -0
  175. package/dist/useOnClickOutside-Zw5vzxSq.js.map +1 -0
  176. package/dist/useOpenCloseTransitionStates-CiTYrLGi.js +68 -0
  177. package/dist/useOpenCloseTransitionStates-CiTYrLGi.js.map +1 -0
  178. package/dist/{usePopoverSupport-CCSCHnit.js → usePopoverSupport-CldZmxFl.js} +2 -2
  179. package/dist/{usePopoverSupport-CCSCHnit.js.map → usePopoverSupport-CldZmxFl.js.map} +1 -1
  180. package/dist/{utils-Bkbn9cyk.js → utils-u8cyv323.js} +2 -2
  181. package/dist/{utils-Bkbn9cyk.js.map → utils-u8cyv323.js.map} +1 -1
  182. package/package.json +4 -3
  183. package/dist/Checkbox-DbBeuNdW.js.map +0 -1
  184. package/dist/Combobox-hxGMMb8x.js.map +0 -1
  185. package/dist/DataTable-DSySFGWC.js.map +0 -1
  186. package/dist/Dialog-BwabBKoZ.js.map +0 -1
  187. package/dist/FieldLabel-jqlQ1Ldh.js.map +0 -1
  188. package/dist/ListView-D8mfK8Lu.js.map +0 -1
  189. package/dist/SelectFieldSync-BOzavAtv.js +0 -1122
  190. package/dist/SelectFieldSync-BOzavAtv.js.map +0 -1
  191. package/dist/SelectTrigger-DfVnPiNf.js.map +0 -1
  192. package/dist/SelectTriggerBase-D8scKtBr.js.map +0 -1
  193. package/dist/SelectTriggerBase.module-Ce49lamD.js +0 -35
  194. package/dist/SelectTriggerBase.module-Ce49lamD.js.map +0 -1
  195. package/dist/Textarea-DdLD4imO.js.map +0 -1
  196. package/dist/Toolbar-DEwvVf35.js.map +0 -1
  197. package/dist/match-sorter.esm-CtBw0MrM.js.map +0 -1
  198. package/dist/useOnClickOutside-BDzuUjmY.js +0 -147
  199. package/dist/useOnClickOutside-BDzuUjmY.js.map +0 -1
@@ -1,1122 +0,0 @@
1
- import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
- import { u as useCombobox, m as matchSorter } from './match-sorter.esm-CtBw0MrM.js';
3
- import { useState, useRef, useCallback, useEffect, useMemo, forwardRef, useId, useImperativeHandle } from 'react';
4
- import { S as Spinner } from './Spinner-xEFwsq8_.js';
5
- import { B as Button } from './Button-92_FKAyV.js';
6
- import { c as cx } from './index-tZvMCc77.js';
7
- import { F as Flex } from './Flex-CjPHUTeq.js';
8
- import { I as Icon } from './Icon-BSuTVNaa.js';
9
- import { S as SvgIndeterminateCheckBox, a as SvgCheckBox, b as SvgCheckBoxOutlineBlank } from './indeterminate_check_box-B4zobNlt.js';
10
- import { S as SvgCheck } from './check-Cf67OWrZ.js';
11
- import { T as Text } from './Text-kPA-VzsB.js';
12
- import { u as useIntersectionObserver } from './useIntersectionObserver-BEmMDO3P.js';
13
- import { S as SrOnly } from './SrOnly-CTsYSuby.js';
14
- import { s as styles$4 } from './SelectTriggerBase.module-Ce49lamD.js';
15
- import { S as SvgChevronRight } from './chevron_right-BdpsxX7x.js';
16
- import { S as SvgClose } from './close-DZj38AEh.js';
17
- import { F as FieldLabel } from './FieldLabel-jqlQ1Ldh.js';
18
- import { B as computePosition, A as autoUpdate, o as offset, L as autoPlacement, i as size, D as DialogContext } from './DrawerContext-Cs3k160L.js';
19
- import { u as useBreakpoint } from './useBreakpoint-BGCsBhQ7.js';
20
- import './anvil-fonts.css';import './SelectFieldSync.css';/* empty css */
21
- import { D as DialogCancelButton } from './DialogCancelButton-sTEfx5kf.js';
22
- import { u as useDialogScrollLock } from './useDialogScrollLock-BW-aVboo.js';
23
- import { u as useLayoutPropsUtil } from './useLayoutPropsUtil-BlIWftBb.js';
24
- import { F as FieldMessage } from './FieldMessage-DdCUxZz-.js';
25
-
26
- const DEFAULT_PAGE_SIZE = 20;
27
- const DEFAULT_CACHE_MAX_SIZE = 15;
28
- function useSelectFieldLoading(config) {
29
- const { lazy, loadOptions: loadOptionsProp, cache: cacheConfig } = config;
30
- const cacheEnabled = cacheConfig?.enabled !== false;
31
- const cacheMaxSize = cacheConfig?.maxSize ?? DEFAULT_CACHE_MAX_SIZE;
32
- const [options, setOptions] = useState([]);
33
- const [hasMoreToLoad, setHasMoreToLoad] = useState(false);
34
- const [previousGroup, setPreviousGroup] = useState(
35
- null
36
- );
37
- const [previousPage, setPreviousPage] = useState(0);
38
- const [previousOffset, setPreviousOffset] = useState(0);
39
- const [loading, setLoading] = useState(false);
40
- const [loadingMore, setLoadingMore] = useState(false);
41
- const [stateCache, setStateCache] = useState(
42
- () => /* @__PURE__ */ new Map()
43
- );
44
- const currentSearchValueRef = useRef("");
45
- const appendOptions = useCallback((newOptions) => {
46
- setOptions((prevOptions) => prevOptions.concat(newOptions));
47
- }, []);
48
- const pageSize = lazy === "page" ? config.pageSize : DEFAULT_PAGE_SIZE;
49
- const limit = lazy === "offset" ? config.limit : DEFAULT_PAGE_SIZE;
50
- const restoreFromCache = useCallback((cached) => {
51
- setOptions(cached.options);
52
- setHasMoreToLoad(cached.hasMore);
53
- setPreviousPage(cached.previousPage);
54
- setPreviousOffset(cached.previousOffset);
55
- setPreviousGroup(cached.previousGroup);
56
- }, []);
57
- useEffect(() => {
58
- if (!cacheEnabled) return;
59
- const searchValue = currentSearchValueRef.current;
60
- if (options.length === 0) return;
61
- setStateCache((prev) => {
62
- if (prev.size >= cacheMaxSize) {
63
- prev.clear();
64
- }
65
- prev.set(searchValue, {
66
- options,
67
- hasMore: hasMoreToLoad,
68
- previousPage,
69
- previousOffset,
70
- previousGroup
71
- });
72
- return new Map(prev);
73
- });
74
- }, [
75
- cacheEnabled,
76
- cacheMaxSize,
77
- options,
78
- hasMoreToLoad,
79
- previousPage,
80
- previousOffset,
81
- previousGroup
82
- ]);
83
- const loadOptions = useCallback(
84
- async (searchValue, options2) => {
85
- const isInitial = !!options2?.initial;
86
- if (isInitial && cacheEnabled) {
87
- const cached = stateCache.get(searchValue);
88
- if (cached) {
89
- currentSearchValueRef.current = searchValue;
90
- restoreFromCache(cached);
91
- return;
92
- }
93
- }
94
- if (isInitial) {
95
- currentSearchValueRef.current = searchValue;
96
- }
97
- (isInitial ? setLoading : setLoadingMore)(true);
98
- try {
99
- if (!lazy) {
100
- const result = await loadOptionsProp(searchValue);
101
- const resolved = Array.isArray(result) ? result : await result;
102
- (isInitial ? setOptions : appendOptions)(resolved);
103
- } else {
104
- let result;
105
- if (lazy === "page") {
106
- const page = isInitial ? 0 : previousPage;
107
- result = await loadOptionsProp(searchValue, page, pageSize);
108
- setPreviousPage(isInitial ? 1 : page + 1);
109
- } else if (lazy === "offset") {
110
- const offset = isInitial ? 0 : previousOffset;
111
- result = await loadOptionsProp(searchValue, offset, limit);
112
- setPreviousOffset(isInitial ? limit : offset + limit);
113
- } else if (lazy === "group") {
114
- const group = isInitial ? null : previousGroup;
115
- result = await loadOptionsProp(searchValue, group);
116
- setPreviousGroup(
117
- result.options[result.options.length - 1]?.group ?? null
118
- );
119
- } else {
120
- throw new Error(
121
- `Invalid lazy mode: ${lazy}. Expected 'page', 'offset', or 'group'.`
122
- );
123
- }
124
- setHasMoreToLoad(result.hasMore ?? false);
125
- (isInitial ? setOptions : appendOptions)(result.options);
126
- }
127
- } finally {
128
- (isInitial ? setLoading : setLoadingMore)(false);
129
- }
130
- },
131
- [
132
- lazy,
133
- pageSize,
134
- limit,
135
- loadOptionsProp,
136
- appendOptions,
137
- previousPage,
138
- previousOffset,
139
- previousGroup,
140
- cacheEnabled,
141
- stateCache,
142
- restoreFromCache
143
- ]
144
- );
145
- const loadMore = useCallback(
146
- async (searchValue) => {
147
- await loadOptions(searchValue, { initial: false });
148
- },
149
- [loadOptions]
150
- );
151
- const reset = useCallback(() => {
152
- setOptions([]);
153
- setHasMoreToLoad(false);
154
- setPreviousGroup(null);
155
- setPreviousPage(0);
156
- setPreviousOffset(0);
157
- setLoading(false);
158
- setLoadingMore(false);
159
- }, []);
160
- const clearCache = useCallback(() => {
161
- setStateCache(/* @__PURE__ */ new Map());
162
- }, []);
163
- return {
164
- options,
165
- loading,
166
- loadingMore,
167
- hasMore: hasMoreToLoad,
168
- loadOptions,
169
- loadMore,
170
- reset,
171
- clearCache
172
- };
173
- }
174
-
175
- const empty = "_empty_dbxri_5";
176
- const scroller = "_scroller_dbxri_19";
177
- const styles$3 = {
178
- "select-field-list": "_select-field-list_dbxri_2",
179
- empty: empty,
180
- "load-more": "_load-more_dbxri_12",
181
- scroller: scroller};
182
-
183
- const highlighted = "_highlighted_15431_26";
184
- const disabled = "_disabled_15431_29";
185
- const single = "_single_15431_33";
186
- const selected = "_selected_15431_33";
187
- const checkbox = "_checkbox_15431_36";
188
- const checked = "_checked_15431_40";
189
- const unchecked = "_unchecked_15431_43";
190
- const indeterminate = "_indeterminate_15431_46";
191
- const styles$2 = {
192
- "select-field-list-item": "_select-field-list-item_15431_2",
193
- highlighted: highlighted,
194
- disabled: disabled,
195
- single: single,
196
- selected: selected,
197
- checkbox: checkbox,
198
- checked: checked,
199
- unchecked: unchecked,
200
- indeterminate: indeterminate
201
- };
202
-
203
- const SelectFieldListItem = ({
204
- item,
205
- index,
206
- highlighted,
207
- disabled,
208
- getItemProps,
209
- selectionType,
210
- checked
211
- }) => {
212
- const checkbox = useMemo(() => {
213
- if (checked === "indeterminate")
214
- return {
215
- icon: SvgIndeterminateCheckBox,
216
- class: styles$2["indeterminate"]
217
- };
218
- if (checked) return { icon: SvgCheckBox, class: styles$2["checked"] };
219
- return { icon: SvgCheckBoxOutlineBlank, class: styles$2["unchecked"] };
220
- }, [checked]);
221
- return /* @__PURE__ */ jsxs(
222
- "li",
223
- {
224
- ...getItemProps({
225
- item,
226
- index,
227
- className: cx(styles$2["select-field-list-item"], {
228
- [styles$2.highlighted]: highlighted,
229
- [styles$2.selected]: checked,
230
- [styles$2.disabled]: disabled,
231
- [styles$2.single]: selectionType === "single",
232
- [styles$2.multiple]: selectionType === "multiple"
233
- })
234
- }),
235
- children: [
236
- selectionType === "multiple" && /* @__PURE__ */ jsx("div", { "aria-hidden": true, children: /* @__PURE__ */ jsx(
237
- Icon,
238
- {
239
- size: "large",
240
- svg: checkbox.icon,
241
- className: cx(styles$2["checkbox"], checkbox.class)
242
- }
243
- ) }),
244
- /* @__PURE__ */ jsxs(Flex, { grow: 1, shrink: 1, direction: "column", gap: "1", children: [
245
- /* @__PURE__ */ jsx(Text, { size: "medium", children: item.original.content?.title ?? item.original.label }),
246
- item.original.content?.description && /* @__PURE__ */ jsx(Text, { size: "small", children: item.original.content?.description })
247
- ] }),
248
- selectionType === "single" && checked && /* @__PURE__ */ jsx(
249
- Icon,
250
- {
251
- size: "medium",
252
- svg: SvgCheck,
253
- className: cx(styles$2["checkbox"], styles$2["checked"])
254
- }
255
- )
256
- ]
257
- },
258
- item.id
259
- );
260
- };
261
-
262
- const InView = ({
263
- children,
264
- onVisibilityChange,
265
- rootMargin
266
- }) => {
267
- const { ref } = useIntersectionObserver({
268
- onChange: (isIntersecting) => {
269
- onVisibilityChange?.(isIntersecting);
270
- },
271
- rootMargin
272
- });
273
- return /* @__PURE__ */ jsx("div", { ref, children });
274
- };
275
-
276
- const SelectFieldList = ({
277
- isOpen,
278
- items,
279
- getMenuProps,
280
- getItemProps,
281
- highlightedIndex,
282
- selectedOption,
283
- hasMore,
284
- onLoadMore,
285
- loading,
286
- loadingMore,
287
- disableAutoLoadMore,
288
- disabled,
289
- className,
290
- style
291
- }) => {
292
- const handleLoaderVisibilityChange = (visible) => {
293
- if (visible && !disableAutoLoadMore) {
294
- onLoadMore();
295
- }
296
- };
297
- return /* @__PURE__ */ jsxs(
298
- "div",
299
- {
300
- ...getMenuProps({
301
- className: cx(styles$3["scroller"], className),
302
- style
303
- }),
304
- children: [
305
- /* @__PURE__ */ jsx("ul", { className: cx(styles$3["select-field-list"]), children: isOpen && /* @__PURE__ */ jsx(Fragment, { children: loading ? /* @__PURE__ */ jsx("div", { className: styles$3["empty"], children: /* @__PURE__ */ jsx(Spinner, { size: "medium" }) }) : items.length > 0 ? items.map((item, index) => /* @__PURE__ */ jsx(
306
- SelectFieldListItem,
307
- {
308
- item,
309
- index,
310
- getItemProps,
311
- selectionType: "single",
312
- checked: selectedOption?.id === item.original.id,
313
- highlighted: highlightedIndex === index,
314
- disabled: (disabled || item.disabled) ?? false
315
- },
316
- item.id
317
- )) : /* @__PURE__ */ jsx("div", { className: styles$3["empty"], children: /* @__PURE__ */ jsx(Text, { subdued: true, size: "small", children: "No match found" }) }) }) }),
318
- loadingMore ? /* @__PURE__ */ jsxs("div", { className: styles$3["load-more"], children: [
319
- /* @__PURE__ */ jsx(Spinner, { size: "small" }),
320
- /* @__PURE__ */ jsx(SrOnly, { children: "Loading more..." })
321
- ] }) : hasMore && !loading ? /* @__PURE__ */ jsx(
322
- InView,
323
- {
324
- onVisibilityChange: handleLoaderVisibilityChange,
325
- rootMargin: "0px 0px -100px 0px",
326
- children: /* @__PURE__ */ jsx("div", { className: styles$3["load-more"], children: /* @__PURE__ */ jsx(Button, { appearance: "secondary", size: "small", onClick: onLoadMore, children: "Load more" }) })
327
- }
328
- ) : null
329
- ]
330
- }
331
- );
332
- };
333
- SelectFieldList.displayName = "SelectFieldList";
334
-
335
- const SelectFieldInput = ({
336
- placeholder,
337
- size,
338
- disableClearButton,
339
- disableToggleButton,
340
- disabled,
341
- readOnly,
342
- error,
343
- onClear,
344
- id,
345
- inputWrapperRef,
346
- htmlInputWrapperProps,
347
- inputProps,
348
- toggleButtonProps,
349
- prefix,
350
- suffix
351
- }) => {
352
- const inputWrapperClassNames = cx(styles$4["input-wrapper"], {
353
- [styles$4["small"]]: size === "small",
354
- [styles$4["large"]]: size === "large",
355
- [styles$4["no-clear-button"]]: disableClearButton,
356
- [styles$4["disabled"]]: disabled || readOnly
357
- });
358
- return /* @__PURE__ */ jsxs(
359
- "div",
360
- {
361
- ref: inputWrapperRef,
362
- ...htmlInputWrapperProps,
363
- className: cx(inputWrapperClassNames, htmlInputWrapperProps?.className),
364
- children: [
365
- prefix ? /* @__PURE__ */ jsx("div", { className: styles$4["prefix"], children: prefix }) : null,
366
- /* @__PURE__ */ jsx(
367
- "input",
368
- {
369
- id,
370
- placeholder,
371
- disabled,
372
- readOnly,
373
- ...inputProps,
374
- className: cx(styles$4["input"], inputProps?.className, {
375
- [styles$4["error"]]: error
376
- })
377
- }
378
- ),
379
- suffix ? /* @__PURE__ */ jsx("div", { className: styles$4["suffix"], children: suffix }) : null,
380
- /* @__PURE__ */ jsxs("div", { className: styles$4["buttons-wrapper"], children: [
381
- disableClearButton ? null : /* @__PURE__ */ jsx("div", { className: styles$4["close-button-wrapper"], children: /* @__PURE__ */ jsx(
382
- Button,
383
- {
384
- icon: SvgClose,
385
- "aria-label": "clear selection",
386
- appearance: "ghost",
387
- size: "small",
388
- className: styles$4["close-button"],
389
- onClick: () => {
390
- onClear?.();
391
- }
392
- }
393
- ) }),
394
- disableToggleButton ? null : /* @__PURE__ */ jsx("div", { className: styles$4["toggle-button-wrapper"], children: /* @__PURE__ */ jsx(
395
- Button,
396
- {
397
- icon: SvgChevronRight,
398
- "aria-label": "toggle menu",
399
- appearance: "ghost",
400
- size: "small",
401
- disabled,
402
- ...toggleButtonProps,
403
- className: cx(
404
- styles$4["toggle-button"],
405
- toggleButtonProps?.className
406
- )
407
- }
408
- ) })
409
- ] })
410
- ]
411
- }
412
- );
413
- };
414
- SelectFieldInput.displayName = "SelectFieldInput";
415
-
416
- const SelectFieldLabel = ({
417
- label,
418
- getLabelProps,
419
- required,
420
- moreInfo,
421
- openMoreInfo
422
- }) => {
423
- return /* @__PURE__ */ jsx(
424
- FieldLabel,
425
- {
426
- ...getLabelProps(),
427
- required,
428
- moreInfo,
429
- openMoreInfo,
430
- children: label
431
- }
432
- );
433
- };
434
-
435
- function useDebouncedCallback(callback, delay = 300) {
436
- const timeoutRef = useRef(null);
437
- const callbackRef = useRef(callback);
438
- useEffect(() => {
439
- callbackRef.current = callback;
440
- }, [callback]);
441
- useEffect(() => {
442
- return () => {
443
- if (timeoutRef.current) {
444
- clearTimeout(timeoutRef.current);
445
- timeoutRef.current = null;
446
- }
447
- };
448
- }, [delay]);
449
- const debouncedCallback = useCallback(
450
- ((...args) => {
451
- if (timeoutRef.current) {
452
- clearTimeout(timeoutRef.current);
453
- }
454
- timeoutRef.current = setTimeout(() => {
455
- callbackRef.current(...args);
456
- timeoutRef.current = null;
457
- }, delay);
458
- }),
459
- [delay]
460
- );
461
- return debouncedCallback;
462
- }
463
-
464
- const useCombo = ({
465
- options,
466
- pinnedOptions,
467
- selectAll,
468
- selectedOption,
469
- onSelectedOptionChange,
470
- onInputValueChange,
471
- onIsOpenChange,
472
- displayAs = "popover",
473
- disableHighlightOnOpen = false,
474
- disabled
475
- }) => {
476
- const downshiftItems = useMemo(() => {
477
- const items = options.map(
478
- mapOptionToDownshiftItem
479
- );
480
- if (selectAll) {
481
- items.unshift({
482
- id: "select-all",
483
- type: "select-all",
484
- original: { id: "select-all", label: selectAll.label ?? "Select All" }
485
- });
486
- }
487
- return items;
488
- }, [options, pinnedOptions, selectAll]);
489
- const selectedDownshiftItem = useMemo(() => {
490
- return selectedOption ? mapOptionToDownshiftItem(selectedOption) : null;
491
- }, [selectedOption]);
492
- const {
493
- isOpen,
494
- highlightedIndex,
495
- getToggleButtonProps,
496
- getLabelProps,
497
- getMenuProps,
498
- getInputProps,
499
- getItemProps,
500
- inputValue,
501
- closeMenu,
502
- openMenu,
503
- setHighlightedIndex
504
- } = useCombobox({
505
- isItemDisabled: (item, _index) => {
506
- if (!item) {
507
- return false;
508
- }
509
- return (disabled || item.disabled) ?? false;
510
- },
511
- selectedItem: selectedDownshiftItem,
512
- onSelectedItemChange: ({
513
- selectedItem: si
514
- }) => {
515
- if (si && si.type === "option") {
516
- onSelectedOptionChange(si.original);
517
- } else {
518
- onSelectedOptionChange(null);
519
- }
520
- },
521
- onInputValueChange,
522
- onIsOpenChange: (changes) => {
523
- onIsOpenChange?.(changes);
524
- if (changes.isOpen && !disableHighlightOnOpen) {
525
- const selectedItemIndex = downshiftItems.findIndex(
526
- (item) => item.id === selectedDownshiftItem?.id
527
- );
528
- setHighlightedIndex(selectedItemIndex);
529
- }
530
- },
531
- items: downshiftItems,
532
- itemToString(item) {
533
- return item?.original.label ?? "";
534
- },
535
- stateReducer: (state, actionAndChanges) => stateReducer(state, actionAndChanges, displayAs)
536
- });
537
- return {
538
- inputValue,
539
- getToggleButtonProps,
540
- getLabelProps,
541
- getMenuProps,
542
- getInputProps,
543
- getItemProps,
544
- highlightedIndex,
545
- isOpen,
546
- downshiftItems,
547
- closeMenu,
548
- openMenu
549
- };
550
- };
551
- function mapOptionToDownshiftItem(option) {
552
- return {
553
- id: option.id,
554
- type: "option",
555
- disabled: option.disabled ?? false,
556
- original: option
557
- };
558
- }
559
- function stateReducer(state, actionAndChanges, displayAs) {
560
- const { type, changes } = actionAndChanges;
561
- switch (type) {
562
- case useCombobox.stateChangeTypes.InputBlur:
563
- if (displayAs === "dialog" && state.isOpen) {
564
- return {
565
- ...changes,
566
- isOpen: state.isOpen
567
- };
568
- }
569
- return {
570
- ...changes,
571
- inputValue: state.selectedItem?.original.label ?? state.inputValue
572
- };
573
- case useCombobox.stateChangeTypes.InputKeyDownEscape:
574
- case useCombobox.stateChangeTypes.FunctionCloseMenu:
575
- return {
576
- ...changes,
577
- inputValue: state.selectedItem?.original.label ?? state.inputValue
578
- };
579
- case useCombobox.stateChangeTypes.InputClick:
580
- if (displayAs === "dialog" && state.isOpen) {
581
- return {
582
- ...changes,
583
- isOpen: state.isOpen
584
- };
585
- }
586
- return changes;
587
- case useCombobox.stateChangeTypes.InputKeyDownEnter:
588
- case useCombobox.stateChangeTypes.ItemClick:
589
- return changes;
590
- default:
591
- return changes;
592
- }
593
- }
594
-
595
- const styles$1 = {
596
- "field-popover": "_field-popover_aeggh_2"
597
- };
598
-
599
- const FieldPopover = (props) => {
600
- const ref = useRef(null);
601
- const { id, children, referenceElement, open } = props;
602
- useEffect(() => {
603
- if (open) {
604
- ref.current?.showPopover();
605
- } else {
606
- ref.current?.hidePopover();
607
- }
608
- }, [open]);
609
- const updatePosition = useCallback(async () => {
610
- if (!ref.current || !referenceElement.current) return;
611
- const position = await computePosition(
612
- referenceElement.current,
613
- ref.current,
614
- {
615
- placement: "bottom-start",
616
- middleware: [
617
- offset(8),
618
- autoPlacement({
619
- allowedPlacements: ["bottom-start", "top-start"],
620
- padding: 8
621
- }),
622
- size({
623
- padding: 8,
624
- apply({ rects, elements, availableHeight }) {
625
- Object.assign(elements.floating.style, {
626
- width: `${rects.reference.width}px`,
627
- maxHeight: `${Math.max(0, availableHeight)}px`
628
- });
629
- }
630
- })
631
- ]
632
- }
633
- );
634
- ref.current.style.left = `${position.x}px`;
635
- ref.current.style.top = `${position.y}px`;
636
- }, [ref, referenceElement]);
637
- useEffect(() => {
638
- if (!ref.current || !referenceElement.current || !open) return;
639
- const cleanup = autoUpdate(
640
- referenceElement.current,
641
- ref.current,
642
- updatePosition
643
- );
644
- return () => {
645
- cleanup();
646
- };
647
- }, [referenceElement, ref, updatePosition, open]);
648
- return /* @__PURE__ */ jsx("div", { ref, id, className: styles$1["field-popover"], popover: "manual", children });
649
- };
650
-
651
- function detectCoarsePointer() {
652
- if (typeof window === "undefined" || !window.matchMedia) {
653
- return false;
654
- }
655
- return window.matchMedia("(pointer: coarse)").matches;
656
- }
657
- function useAdaptiveView() {
658
- const breakpoint = useBreakpoint();
659
- const [hasCoarsePointer, setHasCoarsePointer] = useState(detectCoarsePointer);
660
- useEffect(() => {
661
- setHasCoarsePointer(detectCoarsePointer());
662
- const mediaQuery = window.matchMedia("(pointer: coarse)");
663
- const handleChange = (e) => {
664
- setHasCoarsePointer(e.matches);
665
- };
666
- mediaQuery.addEventListener("change", handleChange);
667
- return () => mediaQuery.removeEventListener("change", handleChange);
668
- }, []);
669
- const isSmallScreen = !breakpoint?.md;
670
- const isMobile = isSmallScreen && hasCoarsePointer;
671
- return {
672
- view: isMobile ? "mobile" : "desktop",
673
- isMobile,
674
- isDesktop: !isMobile
675
- };
676
- }
677
-
678
- const header = "_header_dcw9s_33";
679
- const field = "_field_dcw9s_2";
680
- const content = "_content_dcw9s_44";
681
- const styles = {
682
- "field-dialog": "_field-dialog_dcw9s_2",
683
- "field-dialog-visual-viewport-height": "_field-dialog-visual-viewport-height_dcw9s_16",
684
- header: header,
685
- field: field,
686
- content: content
687
- };
688
-
689
- const FieldDialog = ({
690
- id,
691
- isOpen,
692
- onClose,
693
- field,
694
- children,
695
- title
696
- }) => {
697
- const elRef = useRef(null);
698
- const visualViewportHeightRef = useRef(null);
699
- useDialogScrollLock({
700
- open: isOpen,
701
- id,
702
- enableScrollChaining: false,
703
- elementRef: elRef
704
- });
705
- useEffect(() => {
706
- if (isOpen) {
707
- elRef.current?.showModal();
708
- } else {
709
- elRef.current?.close();
710
- }
711
- }, [isOpen]);
712
- useEffect(() => {
713
- if (isOpen) {
714
- const handleResize = () => {
715
- if (!visualViewportHeightRef.current) return;
716
- visualViewportHeightRef.current.style.height = `${window.visualViewport?.height ?? 0}px`;
717
- visualViewportHeightRef.current.style.maxHeight = `${window.visualViewport?.height ?? 0}px`;
718
- };
719
- window.visualViewport?.addEventListener("resize", handleResize);
720
- return () => {
721
- window.visualViewport?.removeEventListener("resize", handleResize);
722
- };
723
- }
724
- }, [isOpen]);
725
- return /* @__PURE__ */ jsx(
726
- "dialog",
727
- {
728
- ref: elRef,
729
- id,
730
- "data-anv": "field-dialog",
731
- className: styles["field-dialog"],
732
- onKeyDown: (e) => {
733
- if (e.code === "Escape") {
734
- e.preventDefault();
735
- onClose();
736
- }
737
- },
738
- children: /* @__PURE__ */ jsxs(
739
- "div",
740
- {
741
- className: styles["field-dialog-visual-viewport-height"],
742
- ref: visualViewportHeightRef,
743
- children: [
744
- /* @__PURE__ */ jsxs(Flex, { direction: "row", className: styles["header"], children: [
745
- /* @__PURE__ */ jsx(Text, { variant: "headline", el: "h1", children: title }),
746
- /* @__PURE__ */ jsx("span", { className: styles["close-container"], children: /* @__PURE__ */ jsx(DialogContext.Provider, { value: { close: onClose }, children: /* @__PURE__ */ jsx(
747
- DialogCancelButton,
748
- {
749
- className: styles["close-button"],
750
- size: "small",
751
- appearance: "ghost",
752
- "aria-label": "Close dialog",
753
- icon: SvgClose
754
- }
755
- ) }) })
756
- ] }),
757
- /* @__PURE__ */ jsx(Flex, { direction: "column", className: styles["field"], children: field }),
758
- /* @__PURE__ */ jsx(Flex, { direction: "column", className: styles["content"], children })
759
- ]
760
- }
761
- )
762
- }
763
- );
764
- };
765
-
766
- const SelectField = forwardRef(
767
- (propsWithLayout, ref) => {
768
- const { layoutStyles, componentProps } = useLayoutPropsUtil(propsWithLayout);
769
- const [initialLoadPerformed, setInitialLoadPerformed] = useState(false);
770
- const inputWrapperRef = useRef(null);
771
- const {
772
- id: idProp,
773
- value: selectedOption,
774
- initialLoad: initialLoadProp = "auto",
775
- displayMenuAs: displayMenuAsProp = "auto",
776
- lazy,
777
- loadOptions: loadOptionsProp,
778
- label,
779
- placeholder,
780
- disableClearButton: disableClearButtonProp = false,
781
- debounceMs = 200,
782
- onSelectedOptionChange,
783
- cache,
784
- size,
785
- error,
786
- hint,
787
- description,
788
- errorAriaLive: errorAriaLiveProp = "assertive",
789
- required,
790
- disabled,
791
- readOnly,
792
- prefix,
793
- suffix
794
- } = componentProps;
795
- const autoId = useId();
796
- const id = idProp ?? autoId;
797
- const helperUid = useId();
798
- const [hasFocus, setHasFocus] = useState(false);
799
- const handleFocus = () => {
800
- setHasFocus(true);
801
- };
802
- const handleBlur = () => {
803
- setHasFocus(false);
804
- };
805
- const errorMessage = typeof error !== "boolean" ? error : void 0;
806
- const hasHelperText = hint || errorMessage || description;
807
- const isDisabledOrReadOnly = (disabled || readOnly) ?? false;
808
- const { isMobile } = useAdaptiveView();
809
- const displayAs = displayMenuAsProp === "auto" ? isMobile ? "dialog" : "popover" : displayMenuAsProp;
810
- const initialLoad = initialLoadProp === "auto" ? "immediate" : initialLoadProp;
811
- const pageSize = lazy === "page" && "lazyOptions" in componentProps ? componentProps.lazyOptions?.pageSize ?? DEFAULT_PAGE_SIZE : DEFAULT_PAGE_SIZE;
812
- const limit = lazy === "offset" && "lazyOptions" in componentProps ? componentProps.lazyOptions?.limit ?? DEFAULT_PAGE_SIZE : DEFAULT_PAGE_SIZE;
813
- const loadingHookConfig = useMemo(() => {
814
- const cacheConfig = {
815
- enabled: cache?.enabled,
816
- maxSize: cache?.maxSize
817
- };
818
- if (lazy === "page")
819
- return {
820
- lazy: "page",
821
- loadOptions: loadOptionsProp,
822
- pageSize,
823
- cache: cacheConfig
824
- };
825
- if (lazy === "offset")
826
- return {
827
- lazy: "offset",
828
- loadOptions: loadOptionsProp,
829
- limit,
830
- cache: cacheConfig
831
- };
832
- if (lazy === "group")
833
- return {
834
- lazy: "group",
835
- loadOptions: loadOptionsProp,
836
- cache: cacheConfig
837
- };
838
- return {
839
- lazy: false,
840
- loadOptions: loadOptionsProp,
841
- cache: cacheConfig
842
- };
843
- }, [
844
- lazy,
845
- loadOptionsProp,
846
- pageSize,
847
- limit,
848
- cache?.enabled,
849
- cache?.maxSize
850
- ]);
851
- const {
852
- options,
853
- loading,
854
- loadingMore,
855
- hasMore,
856
- loadOptions,
857
- loadMore,
858
- clearCache
859
- } = useSelectFieldLoading(loadingHookConfig);
860
- useImperativeHandle(ref, () => ({ clearCache }), [clearCache]);
861
- const debouncedOptionLoader = useDebouncedCallback((inputValue2) => {
862
- loadOptions(selectedOption?.label === inputValue2 ? "" : inputValue2, {
863
- initial: true
864
- });
865
- }, debounceMs);
866
- const adjustInputValueForSelectedOption = useCallback(
867
- (inputValue2) => {
868
- if (selectedOption?.label === inputValue2) {
869
- return "";
870
- } else {
871
- return inputValue2;
872
- }
873
- },
874
- [selectedOption?.label]
875
- );
876
- const {
877
- isOpen,
878
- getToggleButtonProps,
879
- getLabelProps,
880
- getMenuProps,
881
- getInputProps,
882
- highlightedIndex,
883
- getItemProps,
884
- inputValue,
885
- downshiftItems,
886
- closeMenu
887
- } = useCombo({
888
- displayAs,
889
- disabled: isDisabledOrReadOnly,
890
- options,
891
- pinnedOptions: [],
892
- selectedOption,
893
- onSelectedOptionChange: (selectedOption2) => {
894
- onSelectedOptionChange(selectedOption2);
895
- },
896
- async onIsOpenChange(changes) {
897
- if (initialLoad === "open" && !initialLoadPerformed && changes.isOpen) {
898
- await loadOptions(adjustInputValueForSelectedOption(inputValue), {
899
- initial: true
900
- });
901
- setInitialLoadPerformed(true);
902
- }
903
- },
904
- onInputValueChange: ({ inputValue: iv }) => {
905
- debouncedOptionLoader(iv);
906
- }
907
- });
908
- useEffect(() => {
909
- const performInitialLoad = async () => {
910
- if (initialLoad === "immediate" && !initialLoadPerformed) {
911
- await loadOptions(adjustInputValueForSelectedOption(inputValue), {
912
- initial: true
913
- });
914
- setInitialLoadPerformed(true);
915
- }
916
- };
917
- performInitialLoad();
918
- }, [
919
- loadOptions,
920
- initialLoadPerformed,
921
- initialLoad,
922
- inputValue,
923
- adjustInputValueForSelectedOption
924
- ]);
925
- const handleLoadMore = async () => {
926
- await loadMore(adjustInputValueForSelectedOption(inputValue));
927
- };
928
- const disableClearButton = disableClearButtonProp || !selectedOption || isDisabledOrReadOnly;
929
- if (displayAs === "dialog") {
930
- return /* @__PURE__ */ jsxs("div", { className: styles$4["search-field"], style: { ...layoutStyles }, children: [
931
- /* @__PURE__ */ jsx(
932
- SelectFieldLabel,
933
- {
934
- label,
935
- getLabelProps,
936
- required
937
- }
938
- ),
939
- /* @__PURE__ */ jsx(
940
- SelectFieldInput,
941
- {
942
- disabled,
943
- readOnly,
944
- disableToggleButton: false,
945
- placeholder,
946
- disableClearButton,
947
- toggleButtonProps: getToggleButtonProps(),
948
- onClear: () => onSelectedOptionChange(null),
949
- id: `${id}-input`,
950
- inputProps: getInputProps({
951
- "aria-describedby": hasHelperText ? helperUid : void 0,
952
- "aria-invalid": error ? true : void 0,
953
- onFocus: handleFocus,
954
- onBlur: handleBlur
955
- }),
956
- size,
957
- error: !!error,
958
- prefix,
959
- suffix
960
- }
961
- ),
962
- hasHelperText ? /* @__PURE__ */ jsx(
963
- FieldMessage,
964
- {
965
- id: helperUid,
966
- hint,
967
- errorMessage,
968
- errorAriaLive: isOpen || hasFocus ? errorAriaLiveProp : "off",
969
- description
970
- }
971
- ) : null,
972
- /* @__PURE__ */ jsx(
973
- FieldDialog,
974
- {
975
- id: `${id}-dialog`,
976
- isOpen,
977
- onClose: closeMenu,
978
- title: label,
979
- field: /* @__PURE__ */ jsx(
980
- SelectFieldInput,
981
- {
982
- disabled,
983
- readOnly,
984
- inputProps: getInputProps(),
985
- disableToggleButton: true,
986
- placeholder,
987
- disableClearButton,
988
- onClear: () => onSelectedOptionChange(null),
989
- id: `${id}-dialog-input`,
990
- inputWrapperRef,
991
- size: "medium",
992
- error: !!error,
993
- prefix,
994
- suffix
995
- }
996
- ),
997
- children: /* @__PURE__ */ jsx(
998
- SelectFieldList,
999
- {
1000
- isOpen: true,
1001
- items: downshiftItems,
1002
- getMenuProps,
1003
- getItemProps,
1004
- highlightedIndex,
1005
- selectedOption,
1006
- hasMore,
1007
- onLoadMore: handleLoadMore,
1008
- loading,
1009
- loadingMore,
1010
- disabled: isDisabledOrReadOnly,
1011
- style: {
1012
- paddingInline: 24,
1013
- paddingBlockEnd: 24
1014
- }
1015
- }
1016
- )
1017
- }
1018
- )
1019
- ] });
1020
- }
1021
- return /* @__PURE__ */ jsxs("div", { className: styles$4["search-field"], style: { ...layoutStyles }, children: [
1022
- /* @__PURE__ */ jsx(
1023
- SelectFieldLabel,
1024
- {
1025
- label,
1026
- getLabelProps,
1027
- required
1028
- }
1029
- ),
1030
- /* @__PURE__ */ jsx(
1031
- SelectFieldInput,
1032
- {
1033
- disabled,
1034
- readOnly,
1035
- inputProps: getInputProps({
1036
- popovertarget: `${id}-popover`,
1037
- "aria-describedby": hasHelperText ? helperUid : void 0,
1038
- "aria-invalid": error ? true : void 0,
1039
- onFocus: handleFocus,
1040
- onBlur: handleBlur
1041
- }),
1042
- toggleButtonProps: getToggleButtonProps(),
1043
- disableToggleButton: false,
1044
- placeholder,
1045
- disableClearButton,
1046
- onClear: () => onSelectedOptionChange(null),
1047
- id: `${id}-input`,
1048
- popoverTarget: `${id}-popover`,
1049
- inputWrapperRef,
1050
- size,
1051
- error: !!error,
1052
- prefix,
1053
- suffix
1054
- }
1055
- ),
1056
- hasHelperText ? /* @__PURE__ */ jsx(
1057
- FieldMessage,
1058
- {
1059
- id: helperUid,
1060
- hint,
1061
- errorMessage,
1062
- errorAriaLive: isOpen || hasFocus ? errorAriaLiveProp : "off",
1063
- description
1064
- }
1065
- ) : null,
1066
- /* @__PURE__ */ jsx(
1067
- FieldPopover,
1068
- {
1069
- id: `${id}-popover`,
1070
- referenceElement: inputWrapperRef,
1071
- open: isOpen && displayAs === "popover",
1072
- children: /* @__PURE__ */ jsx(
1073
- SelectFieldList,
1074
- {
1075
- isOpen,
1076
- items: downshiftItems,
1077
- getMenuProps,
1078
- getItemProps,
1079
- highlightedIndex,
1080
- selectedOption,
1081
- hasMore,
1082
- onLoadMore: handleLoadMore,
1083
- loading,
1084
- loadingMore,
1085
- disabled: isDisabledOrReadOnly,
1086
- style: {
1087
- padding: 8
1088
- }
1089
- }
1090
- )
1091
- }
1092
- )
1093
- ] });
1094
- }
1095
- );
1096
- SelectField.displayName = "SelectField";
1097
-
1098
- const defaultFilter = (options, searchValue) => {
1099
- return matchSorter(options, searchValue, {
1100
- keys: ["label", "searchText"]
1101
- });
1102
- };
1103
- const SelectFieldSync = (props) => {
1104
- const { options, filter: filterProp = defaultFilter, ...rest } = props;
1105
- const filter = typeof filterProp === "function" ? filterProp : (options2, searchValue) => matchSorter(
1106
- options2,
1107
- searchValue,
1108
- filterProp
1109
- );
1110
- return /* @__PURE__ */ jsx(
1111
- SelectField,
1112
- {
1113
- lazy: false,
1114
- loadOptions: (searchValue) => filter(options, searchValue),
1115
- debounceMs: 0,
1116
- ...rest
1117
- }
1118
- );
1119
- };
1120
-
1121
- export { SelectField as S, SelectFieldSync as a, useAdaptiveView as u };
1122
- //# sourceMappingURL=SelectFieldSync-BOzavAtv.js.map