@servicetitan/anvil2 1.49.3 → 1.49.5

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 (179) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/{Calendar-BkJs1qTF.js → Calendar-BP6r1sP9.js} +2 -2
  3. package/dist/{Calendar-BkJs1qTF.js.map → Calendar-BP6r1sP9.js.map} +1 -1
  4. package/dist/{Calendar-WHERvu2Y.js → Calendar-CLSm88D2.js} +2 -2
  5. package/dist/{Calendar-WHERvu2Y.js.map → Calendar-CLSm88D2.js.map} +1 -1
  6. package/dist/Calendar.js +2 -2
  7. package/dist/{Checkbox-Bhjj-jM4.js → Checkbox-DwuDx-t4.js} +4 -3
  8. package/dist/{Checkbox-Bhjj-jM4.js.map → Checkbox-DwuDx-t4.js.map} +1 -1
  9. package/dist/{Checkbox-C5Qjq_tU.js → Checkbox-PkAk1Saq.js} +2 -2
  10. package/dist/{Checkbox-C5Qjq_tU.js.map → Checkbox-PkAk1Saq.js.map} +1 -1
  11. package/dist/Checkbox.js +2 -2
  12. package/dist/Checkbox.module-D4EgXL0i.js +27 -0
  13. package/dist/Checkbox.module-D4EgXL0i.js.map +1 -0
  14. package/dist/Combobox-DNCq-jkq.js +4281 -0
  15. package/dist/Combobox-DNCq-jkq.js.map +1 -0
  16. package/dist/Combobox.js +1 -1
  17. package/dist/{DataTable-BkNCMaVu.js → DataTable-BIhmpU0v.js} +7 -7
  18. package/dist/{DataTable-BkNCMaVu.js.map → DataTable-BIhmpU0v.js.map} +1 -1
  19. package/dist/{DateField-BNleIuS8.js → DateField-DsGHTMZ1.js} +6 -6
  20. package/dist/{DateField-BNleIuS8.js.map → DateField-DsGHTMZ1.js.map} +1 -1
  21. package/dist/DateField.js +1 -1
  22. package/dist/{DateFieldRange-BBgvno-_.js → DateFieldRange-Ct979nxF.js} +7 -7
  23. package/dist/{DateFieldRange-BBgvno-_.js.map → DateFieldRange-Ct979nxF.js.map} +1 -1
  24. package/dist/DateFieldRange.js +1 -1
  25. package/dist/{DateFieldSingle-Bcwkxogy.js → DateFieldSingle-frMHnRSg.js} +7 -7
  26. package/dist/{DateFieldSingle-Bcwkxogy.js.map → DateFieldSingle-frMHnRSg.js.map} +1 -1
  27. package/dist/DateFieldSingle.js +1 -1
  28. package/dist/{DateFieldYearless-DnVJaBBq.js → DateFieldYearless-po9ieLod.js} +3 -3
  29. package/dist/{DateFieldYearless-DnVJaBBq.js.map → DateFieldYearless-po9ieLod.js.map} +1 -1
  30. package/dist/DateFieldYearless.js +1 -1
  31. package/dist/{DateFieldYearlessRange-BivGidsU.js → DateFieldYearlessRange-Dy8a8O1n.js} +3 -3
  32. package/dist/{DateFieldYearlessRange-BivGidsU.js.map → DateFieldYearlessRange-Dy8a8O1n.js.map} +1 -1
  33. package/dist/DateFieldYearlessRange.js +1 -1
  34. package/dist/{DaysOfTheWeek-Dn6zHxpt.js → DaysOfTheWeek-2_k3T4n4.js} +3 -3
  35. package/dist/{DaysOfTheWeek-Dn6zHxpt.js.map → DaysOfTheWeek-2_k3T4n4.js.map} +1 -1
  36. package/dist/DaysOfTheWeek.js +1 -1
  37. package/dist/{Dialog-CxH4Vnbb.js → Dialog-BT7a5KNT.js} +46 -67
  38. package/dist/Dialog-BT7a5KNT.js.map +1 -0
  39. package/dist/Dialog.css +33 -27
  40. package/dist/Dialog.js +2 -1
  41. package/dist/Dialog.js.map +1 -1
  42. package/dist/DialogCancelButton-sTEfx5kf.js +50 -0
  43. package/dist/DialogCancelButton-sTEfx5kf.js.map +1 -0
  44. package/dist/{Drawer-BLfDJU-e.js → Drawer-scQFylHI.js} +41 -21
  45. package/dist/Drawer-scQFylHI.js.map +1 -0
  46. package/dist/Drawer.css +35 -25
  47. package/dist/Drawer.js +1 -1
  48. package/dist/{DrawerContext-D4tWTLVf.js → DrawerContext-Cs3k160L.js} +127 -2
  49. package/dist/{DrawerContext-D4tWTLVf.js.map → DrawerContext-Cs3k160L.js.map} +1 -1
  50. package/dist/{FieldLabel-CHMCV9wX.js → FieldLabel-BIStrC2x.js} +2 -2
  51. package/dist/{FieldLabel-CHMCV9wX.js.map → FieldLabel-BIStrC2x.js.map} +1 -1
  52. package/dist/FieldLabel.js +1 -1
  53. package/dist/{InputMask-Cd01c3Tj.js → InputMask-A5LDdyxL.js} +3 -3
  54. package/dist/{InputMask-Cd01c3Tj.js.map → InputMask-A5LDdyxL.js.map} +1 -1
  55. package/dist/InputMask.js +1 -1
  56. package/dist/{ListView-CZ5T8bR1.js → ListView-5cRssdYI.js} +2 -2
  57. package/dist/{ListView-CZ5T8bR1.js.map → ListView-5cRssdYI.js.map} +1 -1
  58. package/dist/ListView.js +1 -1
  59. package/dist/{Menu-DUAfSImY.js → Menu-Cn2JJe1Y.js} +2 -2
  60. package/dist/{Menu-DUAfSImY.js.map → Menu-Cn2JJe1Y.js.map} +1 -1
  61. package/dist/Menu.js +1 -1
  62. package/dist/{NumberField-C62E56_v.js → NumberField-BUFymKV3.js} +2 -2
  63. package/dist/{NumberField-C62E56_v.js.map → NumberField-BUFymKV3.js.map} +1 -1
  64. package/dist/NumberField.js +1 -1
  65. package/dist/{Page-CGZQ-nsg.js → Page-Dgpz2WD7.js} +5 -5
  66. package/dist/{Page-CGZQ-nsg.js.map → Page-Dgpz2WD7.js.map} +1 -1
  67. package/dist/Page.js +1 -1
  68. package/dist/{Pagination-BHEEnNas.js → Pagination-CnF6yBr5.js} +2 -2
  69. package/dist/{Pagination-BHEEnNas.js.map → Pagination-CnF6yBr5.js.map} +1 -1
  70. package/dist/Pagination.js +1 -1
  71. package/dist/{Popover-CIPg_ZgX.js → Popover-CcMDyKTj.js} +2 -2
  72. package/dist/{Popover-CIPg_ZgX.js.map → Popover-CcMDyKTj.js.map} +1 -1
  73. package/dist/Popover.js +1 -1
  74. package/dist/{ProgressBar-CUpF9fFW.js → ProgressBar-R_UjSR4o.js} +2 -2
  75. package/dist/{ProgressBar-CUpF9fFW.js.map → ProgressBar-R_UjSR4o.js.map} +1 -1
  76. package/dist/ProgressBar.js +1 -1
  77. package/dist/{Radio-CyCFna1X.js → Radio-CLR1m8N9.js} +2 -2
  78. package/dist/{Radio-CyCFna1X.js.map → Radio-CLR1m8N9.js.map} +1 -1
  79. package/dist/Radio.js +2 -2
  80. package/dist/{RadioGroup-DRS2EjVH.js → RadioGroup-m46C69uO.js} +2 -2
  81. package/dist/{RadioGroup-DRS2EjVH.js.map → RadioGroup-m46C69uO.js.map} +1 -1
  82. package/dist/{SelectCard-lBcnP5j5.js → SelectCard-DViLgRGh.js} +3 -3
  83. package/dist/{SelectCard-lBcnP5j5.js.map → SelectCard-DViLgRGh.js.map} +1 -1
  84. package/dist/SelectCard.js +1 -1
  85. package/dist/SelectField.d.ts +2 -0
  86. package/dist/SelectField.js +2 -0
  87. package/dist/SelectField.js.map +1 -0
  88. package/dist/SelectFieldSync-DF05HvD4.js +1009 -0
  89. package/dist/SelectFieldSync-DF05HvD4.js.map +1 -0
  90. package/dist/SelectFieldSync.css +168 -0
  91. package/dist/{SelectTrigger-qvoGCkb1.js → SelectTrigger-BSzOoRsu.js} +2 -2
  92. package/dist/{SelectTrigger-qvoGCkb1.js.map → SelectTrigger-BSzOoRsu.js.map} +1 -1
  93. package/dist/SelectTrigger.js +1 -1
  94. package/dist/{SelectTriggerBase-C4gebtca.js → SelectTriggerBase-CfmRIFRs.js} +17 -39
  95. package/dist/SelectTriggerBase-CfmRIFRs.js.map +1 -0
  96. package/dist/SelectTriggerBase.module-DUhQNr6j.js +33 -0
  97. package/dist/SelectTriggerBase.module-DUhQNr6j.js.map +1 -0
  98. package/dist/Table.js +1 -1
  99. package/dist/{TextField-CygbgVVt.js → TextField-B08U4_rt.js} +2 -2
  100. package/dist/{TextField-CygbgVVt.js.map → TextField-B08U4_rt.js.map} +1 -1
  101. package/dist/{TextField-CpVkZxMT.js → TextField-D29fTRGR.js} +2 -2
  102. package/dist/{TextField-CpVkZxMT.js.map → TextField-D29fTRGR.js.map} +1 -1
  103. package/dist/TextField.js +1 -1
  104. package/dist/{Textarea-DacevzmW.js → Textarea-Dl4w2-t0.js} +2 -2
  105. package/dist/{Textarea-DacevzmW.js.map → Textarea-Dl4w2-t0.js.map} +1 -1
  106. package/dist/Textarea.js +1 -1
  107. package/dist/{TimeField-BkOB5ESa.js → TimeField-Dpi3fMsn.js} +4 -4
  108. package/dist/{TimeField-BkOB5ESa.js.map → TimeField-Dpi3fMsn.js.map} +1 -1
  109. package/dist/TimeField.js +1 -1
  110. package/dist/Toast.js +2 -2
  111. package/dist/{Toaster-Dg7M4W4U.js → Toaster-B0ogInIl.js} +23 -23
  112. package/dist/{Toaster-Dg7M4W4U.js.map → Toaster-B0ogInIl.js.map} +1 -1
  113. package/dist/{Toaster-BxbR-XcR.js → Toaster-CRNOANCk.js} +2 -2
  114. package/dist/{Toaster-BxbR-XcR.js.map → Toaster-CRNOANCk.js.map} +1 -1
  115. package/dist/Toaster.css +56 -53
  116. package/dist/{Toolbar-is5509wJ.js → Toolbar-CPldWSNJ.js} +11 -11
  117. package/dist/{Toolbar-is5509wJ.js.map → Toolbar-CPldWSNJ.js.map} +1 -1
  118. package/dist/Toolbar.js +1 -1
  119. package/dist/{Tooltip-CZsoFe6C.js → Tooltip-BbfLb3pI.js} +2 -2
  120. package/dist/{Tooltip-CZsoFe6C.js.map → Tooltip-BbfLb3pI.js.map} +1 -1
  121. package/dist/Tooltip.js +1 -1
  122. package/dist/{YearlessDateInputWithPicker-MHLlAdrH.js → YearlessDateInputWithPicker-LiMI-Oer.js} +4 -4
  123. package/dist/{YearlessDateInputWithPicker-MHLlAdrH.js.map → YearlessDateInputWithPicker-LiMI-Oer.js.map} +1 -1
  124. package/dist/assets/icons/st/titan_intelligence.svg +1 -1
  125. package/dist/assets/icons/st/transactional.svg +1 -0
  126. package/dist/assets/icons/st.ts +1 -0
  127. package/dist/beta/components/SelectField/SelectField.d.ts +2 -0
  128. package/dist/beta/components/SelectField/SelectFieldSync.d.ts +39 -0
  129. package/dist/beta/components/SelectField/index.d.ts +3 -0
  130. package/dist/beta/components/SelectField/internal/FieldDialog/FieldDialog.d.ts +8 -0
  131. package/dist/beta/components/SelectField/internal/FieldPopover/FieldPopover.d.ts +8 -0
  132. package/dist/beta/components/SelectField/internal/InView.d.ts +34 -0
  133. package/dist/beta/components/SelectField/internal/SelectFieldInput.d.ts +53 -0
  134. package/dist/beta/components/SelectField/internal/SelectFieldLabel.d.ts +28 -0
  135. package/dist/beta/components/SelectField/internal/SelectFieldList.d.ts +26 -0
  136. package/dist/beta/components/SelectField/internal/SelectFieldListItem.d.ts +14 -0
  137. package/dist/beta/components/SelectField/internal/useCombo.d.ts +30 -0
  138. package/dist/beta/components/SelectField/stories/SelectField.stories.data.d.ts +32 -0
  139. package/dist/beta/components/SelectField/types.d.ts +232 -0
  140. package/dist/beta/components/Table/types.d.ts +1 -1
  141. package/dist/beta/components/index.d.ts +1 -0
  142. package/dist/beta/hooks/index.d.ts +1 -0
  143. package/dist/beta/hooks/useAdaptiveView.d.ts +50 -0
  144. package/dist/beta/index.d.ts +1 -0
  145. package/dist/beta.js +5 -4
  146. package/dist/beta.js.map +1 -1
  147. package/dist/components/ButtonToggle/ButtonToggle.d.ts +1 -1
  148. package/dist/components/Dialog/Dialog.d.ts +3 -1
  149. package/dist/components/Dialog/DialogContent.d.ts +22 -2
  150. package/dist/components/Dialog/internal/DialogContext.d.ts +1 -0
  151. package/dist/components/Drawer/Drawer.d.ts +3 -1
  152. package/dist/components/Drawer/DrawerContent.d.ts +22 -3
  153. package/dist/components/Drawer/internal/DrawerContext.d.ts +4 -0
  154. package/dist/{indeterminate_check_box-RY9zr3xS.js → indeterminate_check_box-B4zobNlt.js} +2 -27
  155. package/dist/{indeterminate_check_box-RY9zr3xS.js.map → indeterminate_check_box-B4zobNlt.js.map} +1 -1
  156. package/dist/index.js +34 -33
  157. package/dist/index.js.map +1 -1
  158. package/dist/internal/hooks/index.d.ts +1 -0
  159. package/dist/internal/hooks/useDebouncedCallback/index.d.ts +1 -0
  160. package/dist/internal/hooks/useDebouncedCallback/useDebouncedCallback.d.ts +28 -0
  161. package/dist/internal/hooks/useSelectFieldLoading/index.d.ts +1 -0
  162. package/dist/internal/hooks/useSelectFieldLoading/useSelectFieldLoading.d.ts +102 -0
  163. package/dist/{Combobox-RjBDpgFV.js → match-sorter.esm-CtBw0MrM.js} +4 -4278
  164. package/dist/match-sorter.esm-CtBw0MrM.js.map +1 -0
  165. package/dist/useDialogScrollLock-BW-aVboo.js +41 -0
  166. package/dist/useDialogScrollLock-BW-aVboo.js.map +1 -0
  167. package/dist/{useInitialFocus-Cl_Txu7W.js → useInitialFocus-BpmW7pDB.js} +4 -41
  168. package/dist/useInitialFocus-BpmW7pDB.js.map +1 -0
  169. package/dist/{usePopoverSupport-CWTCDfN2.js → usePopoverSupport-CCSCHnit.js} +2 -2
  170. package/dist/{usePopoverSupport-CWTCDfN2.js.map → usePopoverSupport-CCSCHnit.js.map} +1 -1
  171. package/dist/{utils-aSAOVHjX.js → utils-CeT0omsG.js} +2 -2
  172. package/dist/{utils-aSAOVHjX.js.map → utils-CeT0omsG.js.map} +1 -1
  173. package/package.json +2 -2
  174. package/dist/Combobox-RjBDpgFV.js.map +0 -1
  175. package/dist/Dialog-CxH4Vnbb.js.map +0 -1
  176. package/dist/Drawer-BLfDJU-e.js.map +0 -1
  177. package/dist/SelectTriggerBase-C4gebtca.js.map +0 -1
  178. package/dist/useInitialFocus-Cl_Txu7W.js.map +0 -1
  179. /package/dist/{indeterminate_check_box.css → Checkbox.css} +0 -0
@@ -0,0 +1,1009 @@
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-DUhQNr6j.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-BIStrC2x.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
+
25
+ const DEFAULT_PAGE_SIZE = 20;
26
+ const DEFAULT_CACHE_MAX_SIZE = 15;
27
+ function useSelectFieldLoading(config) {
28
+ const { lazy, loadOptions: loadOptionsProp, cache: cacheConfig } = config;
29
+ const cacheEnabled = cacheConfig?.enabled !== false;
30
+ const cacheMaxSize = cacheConfig?.maxSize ?? DEFAULT_CACHE_MAX_SIZE;
31
+ const [options, setOptions] = useState([]);
32
+ const [hasMoreToLoad, setHasMoreToLoad] = useState(false);
33
+ const [previousGroup, setPreviousGroup] = useState(
34
+ null
35
+ );
36
+ const [previousPage, setPreviousPage] = useState(0);
37
+ const [previousOffset, setPreviousOffset] = useState(0);
38
+ const [loading, setLoading] = useState(false);
39
+ const [loadingMore, setLoadingMore] = useState(false);
40
+ const [stateCache, setStateCache] = useState(
41
+ () => /* @__PURE__ */ new Map()
42
+ );
43
+ const currentSearchValueRef = useRef("");
44
+ const appendOptions = useCallback((newOptions) => {
45
+ setOptions((prevOptions) => prevOptions.concat(newOptions));
46
+ }, []);
47
+ const pageSize = lazy === "page" ? config.pageSize : DEFAULT_PAGE_SIZE;
48
+ const limit = lazy === "offset" ? config.limit : DEFAULT_PAGE_SIZE;
49
+ const restoreFromCache = useCallback((cached) => {
50
+ setOptions(cached.options);
51
+ setHasMoreToLoad(cached.hasMore);
52
+ setPreviousPage(cached.previousPage);
53
+ setPreviousOffset(cached.previousOffset);
54
+ setPreviousGroup(cached.previousGroup);
55
+ }, []);
56
+ useEffect(() => {
57
+ if (!cacheEnabled) return;
58
+ const searchValue = currentSearchValueRef.current;
59
+ if (options.length === 0) return;
60
+ setStateCache((prev) => {
61
+ if (prev.size >= cacheMaxSize) {
62
+ prev.clear();
63
+ }
64
+ prev.set(searchValue, {
65
+ options,
66
+ hasMore: hasMoreToLoad,
67
+ previousPage,
68
+ previousOffset,
69
+ previousGroup
70
+ });
71
+ return new Map(prev);
72
+ });
73
+ }, [
74
+ cacheEnabled,
75
+ cacheMaxSize,
76
+ options,
77
+ hasMoreToLoad,
78
+ previousPage,
79
+ previousOffset,
80
+ previousGroup
81
+ ]);
82
+ const loadOptions = useCallback(
83
+ async (searchValue, options2) => {
84
+ const isInitial = !!options2?.initial;
85
+ if (isInitial && cacheEnabled) {
86
+ const cached = stateCache.get(searchValue);
87
+ if (cached) {
88
+ currentSearchValueRef.current = searchValue;
89
+ restoreFromCache(cached);
90
+ return;
91
+ }
92
+ }
93
+ if (isInitial) {
94
+ currentSearchValueRef.current = searchValue;
95
+ }
96
+ (isInitial ? setLoading : setLoadingMore)(true);
97
+ try {
98
+ if (!lazy) {
99
+ const result = await loadOptionsProp(searchValue);
100
+ const resolved = Array.isArray(result) ? result : await result;
101
+ (isInitial ? setOptions : appendOptions)(resolved);
102
+ } else {
103
+ let result;
104
+ if (lazy === "page") {
105
+ const page = isInitial ? 0 : previousPage;
106
+ result = await loadOptionsProp(searchValue, page, pageSize);
107
+ setPreviousPage(isInitial ? 1 : page + 1);
108
+ } else if (lazy === "offset") {
109
+ const offset = isInitial ? 0 : previousOffset;
110
+ result = await loadOptionsProp(searchValue, offset, limit);
111
+ setPreviousOffset(isInitial ? limit : offset + limit);
112
+ } else if (lazy === "group") {
113
+ const group = isInitial ? null : previousGroup;
114
+ result = await loadOptionsProp(searchValue, group);
115
+ setPreviousGroup(
116
+ result.options[result.options.length - 1]?.group ?? null
117
+ );
118
+ } else {
119
+ throw new Error(
120
+ `Invalid lazy mode: ${lazy}. Expected 'page', 'offset', or 'group'.`
121
+ );
122
+ }
123
+ setHasMoreToLoad(result.hasMore ?? false);
124
+ (isInitial ? setOptions : appendOptions)(result.options);
125
+ }
126
+ } finally {
127
+ (isInitial ? setLoading : setLoadingMore)(false);
128
+ }
129
+ },
130
+ [
131
+ lazy,
132
+ pageSize,
133
+ limit,
134
+ loadOptionsProp,
135
+ appendOptions,
136
+ previousPage,
137
+ previousOffset,
138
+ previousGroup,
139
+ cacheEnabled,
140
+ stateCache,
141
+ restoreFromCache
142
+ ]
143
+ );
144
+ const loadMore = useCallback(
145
+ async (searchValue) => {
146
+ await loadOptions(searchValue, { initial: false });
147
+ },
148
+ [loadOptions]
149
+ );
150
+ const reset = useCallback(() => {
151
+ setOptions([]);
152
+ setHasMoreToLoad(false);
153
+ setPreviousGroup(null);
154
+ setPreviousPage(0);
155
+ setPreviousOffset(0);
156
+ setLoading(false);
157
+ setLoadingMore(false);
158
+ }, []);
159
+ const clearCache = useCallback(() => {
160
+ setStateCache(/* @__PURE__ */ new Map());
161
+ }, []);
162
+ return {
163
+ options,
164
+ loading,
165
+ loadingMore,
166
+ hasMore: hasMoreToLoad,
167
+ loadOptions,
168
+ loadMore,
169
+ reset,
170
+ clearCache
171
+ };
172
+ }
173
+
174
+ const empty = "_empty_dbxri_5";
175
+ const scroller = "_scroller_dbxri_19";
176
+ const styles$3 = {
177
+ "select-field-list": "_select-field-list_dbxri_2",
178
+ empty: empty,
179
+ "load-more": "_load-more_dbxri_12",
180
+ scroller: scroller};
181
+
182
+ const highlighted = "_highlighted_15431_26";
183
+ const disabled = "_disabled_15431_29";
184
+ const single = "_single_15431_33";
185
+ const selected = "_selected_15431_33";
186
+ const checkbox = "_checkbox_15431_36";
187
+ const checked = "_checked_15431_40";
188
+ const unchecked = "_unchecked_15431_43";
189
+ const indeterminate = "_indeterminate_15431_46";
190
+ const styles$2 = {
191
+ "select-field-list-item": "_select-field-list-item_15431_2",
192
+ highlighted: highlighted,
193
+ disabled: disabled,
194
+ single: single,
195
+ selected: selected,
196
+ checkbox: checkbox,
197
+ checked: checked,
198
+ unchecked: unchecked,
199
+ indeterminate: indeterminate
200
+ };
201
+
202
+ const SelectFieldListItem = ({
203
+ item,
204
+ index,
205
+ highlighted,
206
+ disabled,
207
+ getItemProps,
208
+ selectionType,
209
+ checked
210
+ }) => {
211
+ const checkbox = useMemo(() => {
212
+ if (checked === "indeterminate")
213
+ return {
214
+ icon: SvgIndeterminateCheckBox,
215
+ class: styles$2["indeterminate"]
216
+ };
217
+ if (checked) return { icon: SvgCheckBox, class: styles$2["checked"] };
218
+ return { icon: SvgCheckBoxOutlineBlank, class: styles$2["unchecked"] };
219
+ }, [checked]);
220
+ return /* @__PURE__ */ jsxs(
221
+ "li",
222
+ {
223
+ ...getItemProps({
224
+ item,
225
+ index,
226
+ className: cx(styles$2["select-field-list-item"], {
227
+ [styles$2.highlighted]: highlighted,
228
+ [styles$2.selected]: checked,
229
+ [styles$2.disabled]: disabled,
230
+ [styles$2.single]: selectionType === "single",
231
+ [styles$2.multiple]: selectionType === "multiple"
232
+ })
233
+ }),
234
+ children: [
235
+ selectionType === "multiple" && /* @__PURE__ */ jsx("div", { "aria-hidden": true, children: /* @__PURE__ */ jsx(
236
+ Icon,
237
+ {
238
+ size: "large",
239
+ svg: checkbox.icon,
240
+ className: cx(styles$2["checkbox"], checkbox.class)
241
+ }
242
+ ) }),
243
+ /* @__PURE__ */ jsxs(Flex, { grow: 1, shrink: 1, direction: "column", gap: "1", children: [
244
+ /* @__PURE__ */ jsx(Text, { size: "medium", children: item.original.content?.title ?? item.original.label }),
245
+ item.original.content?.description && /* @__PURE__ */ jsx(Text, { size: "small", children: item.original.content?.description })
246
+ ] }),
247
+ selectionType === "single" && checked && /* @__PURE__ */ jsx(
248
+ Icon,
249
+ {
250
+ size: "medium",
251
+ svg: SvgCheck,
252
+ className: cx(styles$2["checkbox"], styles$2["checked"])
253
+ }
254
+ )
255
+ ]
256
+ },
257
+ item.id
258
+ );
259
+ };
260
+
261
+ const InView = ({
262
+ children,
263
+ onVisibilityChange,
264
+ rootMargin
265
+ }) => {
266
+ const { ref } = useIntersectionObserver({
267
+ onChange: (isIntersecting) => {
268
+ onVisibilityChange?.(isIntersecting);
269
+ },
270
+ rootMargin
271
+ });
272
+ return /* @__PURE__ */ jsx("div", { ref, children });
273
+ };
274
+
275
+ const SelectFieldList = ({
276
+ isOpen,
277
+ items,
278
+ getMenuProps,
279
+ getItemProps,
280
+ highlightedIndex,
281
+ selectedOption,
282
+ hasMore,
283
+ onLoadMore,
284
+ loading,
285
+ loadingMore,
286
+ disableAutoLoadMore,
287
+ disabled,
288
+ className,
289
+ style
290
+ }) => {
291
+ const handleLoaderVisibilityChange = (visible) => {
292
+ if (visible && !disableAutoLoadMore) {
293
+ onLoadMore();
294
+ }
295
+ };
296
+ return /* @__PURE__ */ jsxs(
297
+ "div",
298
+ {
299
+ ...getMenuProps({
300
+ className: cx(styles$3["scroller"], className),
301
+ style
302
+ }),
303
+ children: [
304
+ /* @__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(
305
+ SelectFieldListItem,
306
+ {
307
+ item,
308
+ index,
309
+ getItemProps,
310
+ selectionType: "single",
311
+ checked: selectedOption?.id === item.original.id,
312
+ highlighted: highlightedIndex === index,
313
+ disabled: disabled ?? false
314
+ },
315
+ item.id
316
+ )) : /* @__PURE__ */ jsx("div", { className: styles$3["empty"], children: /* @__PURE__ */ jsx(Text, { subdued: true, size: "small", children: "No match found" }) }) }) }),
317
+ loadingMore ? /* @__PURE__ */ jsxs("div", { className: styles$3["load-more"], children: [
318
+ /* @__PURE__ */ jsx(Spinner, { size: "small" }),
319
+ /* @__PURE__ */ jsx(SrOnly, { children: "Loading more..." })
320
+ ] }) : hasMore && !loading ? /* @__PURE__ */ jsx(
321
+ InView,
322
+ {
323
+ onVisibilityChange: handleLoaderVisibilityChange,
324
+ rootMargin: "0px 0px -100px 0px",
325
+ children: /* @__PURE__ */ jsx("div", { className: styles$3["load-more"], children: /* @__PURE__ */ jsx(Button, { appearance: "secondary", size: "small", onClick: onLoadMore, children: "Load more" }) })
326
+ }
327
+ ) : null
328
+ ]
329
+ }
330
+ );
331
+ };
332
+ SelectFieldList.displayName = "SelectFieldList";
333
+
334
+ const SelectFieldInput = ({
335
+ placeholder,
336
+ size,
337
+ disableClearButton,
338
+ disableToggleButton,
339
+ disabled,
340
+ onClear,
341
+ id,
342
+ inputWrapperRef,
343
+ htmlInputWrapperProps,
344
+ inputProps,
345
+ toggleButtonProps
346
+ }) => {
347
+ const inputWrapperClassNames = cx(styles$4["input-wrapper"], {
348
+ [styles$4["small"]]: size === "small",
349
+ [styles$4["large"]]: size === "large",
350
+ [styles$4["no-clear-button"]]: disableClearButton
351
+ });
352
+ return /* @__PURE__ */ jsxs(
353
+ "div",
354
+ {
355
+ ref: inputWrapperRef,
356
+ ...htmlInputWrapperProps,
357
+ className: cx(inputWrapperClassNames, htmlInputWrapperProps?.className),
358
+ children: [
359
+ /* @__PURE__ */ jsx(
360
+ "input",
361
+ {
362
+ id,
363
+ placeholder,
364
+ ...inputProps,
365
+ className: cx(styles$4["input"], inputProps?.className)
366
+ }
367
+ ),
368
+ /* @__PURE__ */ jsxs("div", { className: styles$4["buttons-wrapper"], children: [
369
+ disableClearButton ? null : /* @__PURE__ */ jsx("div", { className: styles$4["close-button-wrapper"], children: /* @__PURE__ */ jsx(
370
+ Button,
371
+ {
372
+ icon: SvgClose,
373
+ "aria-label": "clear selection",
374
+ appearance: "ghost",
375
+ size: "small",
376
+ className: styles$4["close-button"],
377
+ onClick: () => {
378
+ onClear?.();
379
+ }
380
+ }
381
+ ) }),
382
+ disableToggleButton ? null : /* @__PURE__ */ jsx("div", { className: styles$4["toggle-button-wrapper"], children: /* @__PURE__ */ jsx(
383
+ Button,
384
+ {
385
+ icon: SvgChevronRight,
386
+ "aria-label": "toggle menu",
387
+ appearance: "ghost",
388
+ size: "small",
389
+ disabled,
390
+ ...toggleButtonProps,
391
+ className: cx(
392
+ styles$4["toggle-button"],
393
+ toggleButtonProps?.className
394
+ )
395
+ }
396
+ ) })
397
+ ] })
398
+ ]
399
+ }
400
+ );
401
+ };
402
+ SelectFieldInput.displayName = "SelectFieldInput";
403
+
404
+ const SelectFieldLabel = ({
405
+ label,
406
+ getLabelProps
407
+ }) => {
408
+ return /* @__PURE__ */ jsx(FieldLabel, { ...getLabelProps(), children: label });
409
+ };
410
+
411
+ function useDebouncedCallback(callback, delay = 300) {
412
+ const timeoutRef = useRef(null);
413
+ const callbackRef = useRef(callback);
414
+ useEffect(() => {
415
+ callbackRef.current = callback;
416
+ }, [callback]);
417
+ useEffect(() => {
418
+ return () => {
419
+ if (timeoutRef.current) {
420
+ clearTimeout(timeoutRef.current);
421
+ timeoutRef.current = null;
422
+ }
423
+ };
424
+ }, [delay]);
425
+ const debouncedCallback = useCallback(
426
+ ((...args) => {
427
+ if (timeoutRef.current) {
428
+ clearTimeout(timeoutRef.current);
429
+ }
430
+ timeoutRef.current = setTimeout(() => {
431
+ callbackRef.current(...args);
432
+ timeoutRef.current = null;
433
+ }, delay);
434
+ }),
435
+ [delay]
436
+ );
437
+ return debouncedCallback;
438
+ }
439
+
440
+ const useCombo = ({
441
+ options,
442
+ pinnedOptions,
443
+ selectAll,
444
+ selectedOption,
445
+ onSelectedOptionChange,
446
+ onInputValueChange,
447
+ onIsOpenChange,
448
+ displayAs = "popover",
449
+ disableHighlightOnOpen = false
450
+ }) => {
451
+ const downshiftItems = useMemo(() => {
452
+ const items = options.map(
453
+ mapOptionToDownshiftItem
454
+ );
455
+ if (selectAll) {
456
+ items.unshift({
457
+ id: "select-all",
458
+ type: "select-all",
459
+ original: { id: "select-all", label: selectAll.label ?? "Select All" }
460
+ });
461
+ }
462
+ return items;
463
+ }, [options, pinnedOptions, selectAll]);
464
+ const selectedDownshiftItem = useMemo(() => {
465
+ return selectedOption ? mapOptionToDownshiftItem(selectedOption) : null;
466
+ }, [selectedOption]);
467
+ const {
468
+ isOpen,
469
+ highlightedIndex,
470
+ getToggleButtonProps,
471
+ getLabelProps,
472
+ getMenuProps,
473
+ getInputProps,
474
+ getItemProps,
475
+ inputValue,
476
+ closeMenu,
477
+ openMenu,
478
+ setHighlightedIndex
479
+ } = useCombobox({
480
+ selectedItem: selectedDownshiftItem,
481
+ onSelectedItemChange: ({
482
+ selectedItem: si
483
+ }) => {
484
+ if (si && si.type === "option") {
485
+ onSelectedOptionChange(si.original);
486
+ } else {
487
+ onSelectedOptionChange(null);
488
+ }
489
+ },
490
+ onInputValueChange,
491
+ onIsOpenChange: (changes) => {
492
+ onIsOpenChange?.(changes);
493
+ if (changes.isOpen && !disableHighlightOnOpen) {
494
+ const selectedItemIndex = downshiftItems.findIndex(
495
+ (item) => item.id === selectedDownshiftItem?.id
496
+ );
497
+ setHighlightedIndex(selectedItemIndex);
498
+ }
499
+ },
500
+ items: downshiftItems,
501
+ itemToString(item) {
502
+ return item?.original.label ?? "";
503
+ },
504
+ stateReducer: (state, actionAndChanges) => stateReducer(state, actionAndChanges, displayAs)
505
+ });
506
+ return {
507
+ inputValue,
508
+ getToggleButtonProps,
509
+ getLabelProps,
510
+ getMenuProps,
511
+ getInputProps,
512
+ getItemProps,
513
+ highlightedIndex,
514
+ isOpen,
515
+ downshiftItems,
516
+ closeMenu,
517
+ openMenu
518
+ };
519
+ };
520
+ function mapOptionToDownshiftItem(option) {
521
+ return {
522
+ id: option.id,
523
+ type: "option",
524
+ original: option
525
+ };
526
+ }
527
+ function stateReducer(state, actionAndChanges, displayAs) {
528
+ const { type, changes } = actionAndChanges;
529
+ switch (type) {
530
+ case useCombobox.stateChangeTypes.InputBlur:
531
+ if (displayAs === "dialog" && state.isOpen) {
532
+ return {
533
+ ...changes,
534
+ isOpen: state.isOpen
535
+ };
536
+ }
537
+ return {
538
+ ...changes,
539
+ inputValue: state.selectedItem?.original.label ?? state.inputValue
540
+ };
541
+ case useCombobox.stateChangeTypes.InputKeyDownEscape:
542
+ case useCombobox.stateChangeTypes.FunctionCloseMenu:
543
+ return {
544
+ ...changes,
545
+ inputValue: state.selectedItem?.original.label ?? state.inputValue
546
+ };
547
+ case useCombobox.stateChangeTypes.InputClick:
548
+ if (displayAs === "dialog" && state.isOpen) {
549
+ return {
550
+ ...changes,
551
+ isOpen: state.isOpen
552
+ };
553
+ }
554
+ return changes;
555
+ case useCombobox.stateChangeTypes.InputKeyDownEnter:
556
+ case useCombobox.stateChangeTypes.ItemClick:
557
+ return changes;
558
+ default:
559
+ return changes;
560
+ }
561
+ }
562
+
563
+ const styles$1 = {
564
+ "field-popover": "_field-popover_aeggh_2"
565
+ };
566
+
567
+ const FieldPopover = (props) => {
568
+ const ref = useRef(null);
569
+ const { id, children, referenceElement, open } = props;
570
+ useEffect(() => {
571
+ if (open) {
572
+ ref.current?.showPopover();
573
+ } else {
574
+ ref.current?.hidePopover();
575
+ }
576
+ }, [open]);
577
+ const updatePosition = useCallback(async () => {
578
+ if (!ref.current || !referenceElement.current) return;
579
+ const position = await computePosition(
580
+ referenceElement.current,
581
+ ref.current,
582
+ {
583
+ placement: "bottom-start",
584
+ middleware: [
585
+ offset(8),
586
+ autoPlacement({
587
+ allowedPlacements: ["bottom-start", "top-start"],
588
+ padding: 8
589
+ }),
590
+ size({
591
+ padding: 8,
592
+ apply({ rects, elements, availableHeight }) {
593
+ Object.assign(elements.floating.style, {
594
+ width: `${rects.reference.width}px`,
595
+ maxHeight: `${Math.max(0, availableHeight)}px`
596
+ });
597
+ }
598
+ })
599
+ ]
600
+ }
601
+ );
602
+ ref.current.style.left = `${position.x}px`;
603
+ ref.current.style.top = `${position.y}px`;
604
+ }, [ref, referenceElement]);
605
+ useEffect(() => {
606
+ if (!ref.current || !referenceElement.current || !open) return;
607
+ const cleanup = autoUpdate(
608
+ referenceElement.current,
609
+ ref.current,
610
+ updatePosition
611
+ );
612
+ return () => {
613
+ cleanup();
614
+ };
615
+ }, [referenceElement, ref, updatePosition, open]);
616
+ return /* @__PURE__ */ jsx("div", { ref, id, className: styles$1["field-popover"], popover: "manual", children });
617
+ };
618
+
619
+ function detectCoarsePointer() {
620
+ if (typeof window === "undefined" || !window.matchMedia) {
621
+ return false;
622
+ }
623
+ return window.matchMedia("(pointer: coarse)").matches;
624
+ }
625
+ function useAdaptiveView() {
626
+ const breakpoint = useBreakpoint();
627
+ const [hasCoarsePointer, setHasCoarsePointer] = useState(detectCoarsePointer);
628
+ useEffect(() => {
629
+ setHasCoarsePointer(detectCoarsePointer());
630
+ const mediaQuery = window.matchMedia("(pointer: coarse)");
631
+ const handleChange = (e) => {
632
+ setHasCoarsePointer(e.matches);
633
+ };
634
+ mediaQuery.addEventListener("change", handleChange);
635
+ return () => mediaQuery.removeEventListener("change", handleChange);
636
+ }, []);
637
+ const isSmallScreen = !breakpoint?.md;
638
+ const isMobile = isSmallScreen && hasCoarsePointer;
639
+ return {
640
+ view: isMobile ? "mobile" : "desktop",
641
+ isMobile,
642
+ isDesktop: !isMobile
643
+ };
644
+ }
645
+
646
+ const header = "_header_dcw9s_33";
647
+ const field = "_field_dcw9s_2";
648
+ const content = "_content_dcw9s_44";
649
+ const styles = {
650
+ "field-dialog": "_field-dialog_dcw9s_2",
651
+ "field-dialog-visual-viewport-height": "_field-dialog-visual-viewport-height_dcw9s_16",
652
+ header: header,
653
+ field: field,
654
+ content: content
655
+ };
656
+
657
+ const FieldDialog = ({
658
+ id,
659
+ isOpen,
660
+ onClose,
661
+ field,
662
+ children,
663
+ title
664
+ }) => {
665
+ const elRef = useRef(null);
666
+ const visualViewportHeightRef = useRef(null);
667
+ useDialogScrollLock({
668
+ open: isOpen,
669
+ id,
670
+ enableScrollChaining: false,
671
+ elementRef: elRef
672
+ });
673
+ useEffect(() => {
674
+ if (isOpen) {
675
+ elRef.current?.showModal();
676
+ } else {
677
+ elRef.current?.close();
678
+ }
679
+ }, [isOpen]);
680
+ useEffect(() => {
681
+ if (isOpen) {
682
+ const handleResize = () => {
683
+ if (!visualViewportHeightRef.current) return;
684
+ visualViewportHeightRef.current.style.height = `${window.visualViewport?.height ?? 0}px`;
685
+ visualViewportHeightRef.current.style.maxHeight = `${window.visualViewport?.height ?? 0}px`;
686
+ };
687
+ window.visualViewport?.addEventListener("resize", handleResize);
688
+ return () => {
689
+ window.visualViewport?.removeEventListener("resize", handleResize);
690
+ };
691
+ }
692
+ }, [isOpen]);
693
+ return /* @__PURE__ */ jsx(
694
+ "dialog",
695
+ {
696
+ ref: elRef,
697
+ id,
698
+ "data-anv": "field-dialog",
699
+ className: styles["field-dialog"],
700
+ onKeyDown: (e) => {
701
+ if (e.code === "Escape") {
702
+ e.preventDefault();
703
+ onClose();
704
+ }
705
+ },
706
+ children: /* @__PURE__ */ jsxs(
707
+ "div",
708
+ {
709
+ className: styles["field-dialog-visual-viewport-height"],
710
+ ref: visualViewportHeightRef,
711
+ children: [
712
+ /* @__PURE__ */ jsxs(Flex, { direction: "row", className: styles["header"], children: [
713
+ /* @__PURE__ */ jsx(Text, { variant: "headline", el: "h1", children: title }),
714
+ /* @__PURE__ */ jsx("span", { className: styles["close-container"], children: /* @__PURE__ */ jsx(DialogContext.Provider, { value: { close: onClose }, children: /* @__PURE__ */ jsx(
715
+ DialogCancelButton,
716
+ {
717
+ className: styles["close-button"],
718
+ size: "small",
719
+ appearance: "ghost",
720
+ "aria-label": "Close dialog",
721
+ icon: SvgClose
722
+ }
723
+ ) }) })
724
+ ] }),
725
+ /* @__PURE__ */ jsx(Flex, { direction: "column", className: styles["field"], children: field }),
726
+ /* @__PURE__ */ jsx(Flex, { direction: "column", className: styles["content"], children })
727
+ ]
728
+ }
729
+ )
730
+ }
731
+ );
732
+ };
733
+
734
+ const SelectField = forwardRef(
735
+ (propsWithLayout, ref) => {
736
+ const { layoutStyles, componentProps } = useLayoutPropsUtil(propsWithLayout);
737
+ const [initialLoadPerformed, setInitialLoadPerformed] = useState(false);
738
+ const inputWrapperRef = useRef(null);
739
+ const {
740
+ id: idProp,
741
+ value: selectedOption,
742
+ initialLoad: initialLoadProp = "auto",
743
+ displayMenuAs: displayMenuAsProp = "auto",
744
+ lazy,
745
+ loadOptions: loadOptionsProp,
746
+ label,
747
+ placeholder,
748
+ disableClearButton: disableClearButtonProp = false,
749
+ debounceMs = 200,
750
+ onSelectedOptionChange,
751
+ cache,
752
+ size
753
+ } = componentProps;
754
+ const autoId = useId();
755
+ const id = idProp ?? autoId;
756
+ const { isMobile } = useAdaptiveView();
757
+ const displayAs = displayMenuAsProp === "auto" ? isMobile ? "dialog" : "popover" : displayMenuAsProp;
758
+ const initialLoad = initialLoadProp === "auto" ? "immediate" : initialLoadProp;
759
+ const pageSize = lazy === "page" && "lazyOptions" in componentProps ? componentProps.lazyOptions?.pageSize ?? DEFAULT_PAGE_SIZE : DEFAULT_PAGE_SIZE;
760
+ const limit = lazy === "offset" && "lazyOptions" in componentProps ? componentProps.lazyOptions?.limit ?? DEFAULT_PAGE_SIZE : DEFAULT_PAGE_SIZE;
761
+ const loadingHookConfig = useMemo(() => {
762
+ const cacheConfig = {
763
+ enabled: cache?.enabled,
764
+ maxSize: cache?.maxSize
765
+ };
766
+ if (lazy === "page")
767
+ return {
768
+ lazy: "page",
769
+ loadOptions: loadOptionsProp,
770
+ pageSize,
771
+ cache: cacheConfig
772
+ };
773
+ if (lazy === "offset")
774
+ return {
775
+ lazy: "offset",
776
+ loadOptions: loadOptionsProp,
777
+ limit,
778
+ cache: cacheConfig
779
+ };
780
+ if (lazy === "group")
781
+ return {
782
+ lazy: "group",
783
+ loadOptions: loadOptionsProp,
784
+ cache: cacheConfig
785
+ };
786
+ return {
787
+ lazy: false,
788
+ loadOptions: loadOptionsProp,
789
+ cache: cacheConfig
790
+ };
791
+ }, [
792
+ lazy,
793
+ loadOptionsProp,
794
+ pageSize,
795
+ limit,
796
+ cache?.enabled,
797
+ cache?.maxSize
798
+ ]);
799
+ const {
800
+ options,
801
+ loading,
802
+ loadingMore,
803
+ hasMore,
804
+ loadOptions,
805
+ loadMore,
806
+ clearCache
807
+ } = useSelectFieldLoading(loadingHookConfig);
808
+ useImperativeHandle(ref, () => ({ clearCache }), [clearCache]);
809
+ const debouncedOptionLoader = useDebouncedCallback((inputValue2) => {
810
+ loadOptions(selectedOption?.label === inputValue2 ? "" : inputValue2, {
811
+ initial: true
812
+ });
813
+ }, debounceMs);
814
+ const adjustInputValueForSelectedOption = useCallback(
815
+ (inputValue2) => {
816
+ if (selectedOption?.label === inputValue2) {
817
+ return "";
818
+ } else {
819
+ return inputValue2;
820
+ }
821
+ },
822
+ [selectedOption?.label]
823
+ );
824
+ const {
825
+ isOpen,
826
+ getToggleButtonProps,
827
+ getLabelProps,
828
+ getMenuProps,
829
+ getInputProps,
830
+ highlightedIndex,
831
+ getItemProps,
832
+ inputValue,
833
+ downshiftItems,
834
+ closeMenu
835
+ } = useCombo({
836
+ displayAs,
837
+ options,
838
+ pinnedOptions: [],
839
+ selectedOption,
840
+ onSelectedOptionChange: (selectedOption2) => {
841
+ onSelectedOptionChange(selectedOption2);
842
+ },
843
+ async onIsOpenChange(changes) {
844
+ if (initialLoad === "open" && !initialLoadPerformed && changes.isOpen) {
845
+ await loadOptions(adjustInputValueForSelectedOption(inputValue), {
846
+ initial: true
847
+ });
848
+ setInitialLoadPerformed(true);
849
+ }
850
+ },
851
+ onInputValueChange: ({ inputValue: iv }) => {
852
+ debouncedOptionLoader(iv);
853
+ }
854
+ });
855
+ useEffect(() => {
856
+ const performInitialLoad = async () => {
857
+ if (initialLoad === "immediate" && !initialLoadPerformed) {
858
+ await loadOptions(adjustInputValueForSelectedOption(inputValue), {
859
+ initial: true
860
+ });
861
+ setInitialLoadPerformed(true);
862
+ }
863
+ };
864
+ performInitialLoad();
865
+ }, [
866
+ loadOptions,
867
+ initialLoadPerformed,
868
+ initialLoad,
869
+ inputValue,
870
+ adjustInputValueForSelectedOption
871
+ ]);
872
+ const handleLoadMore = async () => {
873
+ await loadMore(adjustInputValueForSelectedOption(inputValue));
874
+ };
875
+ const disableClearButton = disableClearButtonProp || !selectedOption;
876
+ if (displayAs === "dialog") {
877
+ return /* @__PURE__ */ jsxs("div", { className: styles$4["search-field"], style: { ...layoutStyles }, children: [
878
+ /* @__PURE__ */ jsx(SelectFieldLabel, { label, getLabelProps }),
879
+ /* @__PURE__ */ jsx(
880
+ SelectFieldInput,
881
+ {
882
+ disableToggleButton: false,
883
+ placeholder,
884
+ disableClearButton,
885
+ toggleButtonProps: getToggleButtonProps(),
886
+ onClear: () => onSelectedOptionChange(null),
887
+ id: `${id}-input`,
888
+ inputProps: getInputProps(),
889
+ size
890
+ }
891
+ ),
892
+ /* @__PURE__ */ jsx(
893
+ FieldDialog,
894
+ {
895
+ id: `${id}-dialog`,
896
+ isOpen,
897
+ onClose: closeMenu,
898
+ title: label,
899
+ field: /* @__PURE__ */ jsx(
900
+ SelectFieldInput,
901
+ {
902
+ inputProps: getInputProps(),
903
+ disableToggleButton: true,
904
+ placeholder,
905
+ disableClearButton,
906
+ onClear: () => onSelectedOptionChange(null),
907
+ id: `${id}-dialog-input`,
908
+ inputWrapperRef,
909
+ size: "medium"
910
+ }
911
+ ),
912
+ children: /* @__PURE__ */ jsx(
913
+ SelectFieldList,
914
+ {
915
+ isOpen: true,
916
+ items: downshiftItems,
917
+ getMenuProps,
918
+ getItemProps,
919
+ highlightedIndex,
920
+ selectedOption,
921
+ hasMore,
922
+ onLoadMore: handleLoadMore,
923
+ loading,
924
+ loadingMore,
925
+ style: {
926
+ paddingInline: 24,
927
+ paddingBlockEnd: 24
928
+ }
929
+ }
930
+ )
931
+ }
932
+ )
933
+ ] });
934
+ }
935
+ return /* @__PURE__ */ jsxs("div", { className: styles$4["search-field"], style: { ...layoutStyles }, children: [
936
+ /* @__PURE__ */ jsx(SelectFieldLabel, { label, getLabelProps }),
937
+ /* @__PURE__ */ jsx(
938
+ SelectFieldInput,
939
+ {
940
+ inputProps: getInputProps({
941
+ popovertarget: `${id}-popover`
942
+ }),
943
+ toggleButtonProps: getToggleButtonProps(),
944
+ disableToggleButton: false,
945
+ placeholder,
946
+ disableClearButton,
947
+ onClear: () => onSelectedOptionChange(null),
948
+ id: `${id}-input`,
949
+ popoverTarget: `${id}-popover`,
950
+ inputWrapperRef,
951
+ size
952
+ }
953
+ ),
954
+ /* @__PURE__ */ jsx(
955
+ FieldPopover,
956
+ {
957
+ id: `${id}-popover`,
958
+ referenceElement: inputWrapperRef,
959
+ open: isOpen && displayAs === "popover",
960
+ children: /* @__PURE__ */ jsx(
961
+ SelectFieldList,
962
+ {
963
+ isOpen,
964
+ items: downshiftItems,
965
+ getMenuProps,
966
+ getItemProps,
967
+ highlightedIndex,
968
+ selectedOption,
969
+ hasMore,
970
+ onLoadMore: handleLoadMore,
971
+ loading,
972
+ loadingMore,
973
+ style: {
974
+ padding: 8
975
+ }
976
+ }
977
+ )
978
+ }
979
+ )
980
+ ] });
981
+ }
982
+ );
983
+ SelectField.displayName = "SelectField";
984
+
985
+ const defaultFilter = (options, searchValue) => {
986
+ return matchSorter(options, searchValue, {
987
+ keys: ["label", "searchText"]
988
+ });
989
+ };
990
+ const SelectFieldSync = (props) => {
991
+ const { options, filter: filterProp = defaultFilter, ...rest } = props;
992
+ const filter = typeof filterProp === "function" ? filterProp : (options2, searchValue) => matchSorter(
993
+ options2,
994
+ searchValue,
995
+ filterProp
996
+ );
997
+ return /* @__PURE__ */ jsx(
998
+ SelectField,
999
+ {
1000
+ lazy: false,
1001
+ loadOptions: (searchValue) => filter(options, searchValue),
1002
+ debounceMs: 0,
1003
+ ...rest
1004
+ }
1005
+ );
1006
+ };
1007
+
1008
+ export { SelectField as S, SelectFieldSync as a, useAdaptiveView as u };
1009
+ //# sourceMappingURL=SelectFieldSync-DF05HvD4.js.map