@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
@@ -0,0 +1,873 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { useMemo, useRef, useState, useLayoutEffect, useCallback, forwardRef, useId, useImperativeHandle, useEffect } from 'react';
3
+ import { u as useDownshiftEnvironment, a as useCombobox, m as matchSorter } from './match-sorter.esm-NrKOPPde.js';
4
+ import { S as Spinner } from './Spinner-xEFwsq8_.js';
5
+ import { B as Button } from './Button-92_FKAyV.js';
6
+ import { s as styles$1, S as SelectFieldListItem, I as InView, u as useAdaptiveView, D as DEFAULT_PAGE_SIZE, a as useSelectFieldLoading, b as useDebouncedCallback, c as SelectFieldLabel, F as FieldDialog, d as FieldPopover } from './FieldDialog-BHgkQOhh.js';
7
+ import { c as cx } from './index-tZvMCc77.js';
8
+ import { T as Text } from './Text-kPA-VzsB.js';
9
+ import { S as SrOnly } from './SrOnly-CTsYSuby.js';
10
+ import { C as Chip } from './Chip-UqdorCE2.js';
11
+ import { F as Flex } from './Flex-CjPHUTeq.js';
12
+ import { m as mergeRefs } from './useMergeRefs-Dfmtq9cI.js';
13
+ import { S as SvgChevronRight } from './chevron_right-BdpsxX7x.js';
14
+ import { S as SvgClose } from './close-DZj38AEh.js';
15
+ import { s as styles$2 } from './SelectTriggerBase.module-B0NFRlQP.js';
16
+ import { u as useLayoutPropsUtil } from './useLayoutPropsUtil-BlIWftBb.js';
17
+ import { F as FieldMessage } from './FieldMessage-DdCUxZz-.js';
18
+
19
+ import './MultiSelectFieldSync.css';const MultiSelectFieldList = ({
20
+ isOpen,
21
+ items,
22
+ getMenuProps,
23
+ getItemProps,
24
+ highlightedIndex,
25
+ selectedOptions,
26
+ hasMore,
27
+ onLoadMore,
28
+ loading,
29
+ loadingMore,
30
+ disableAutoLoadMore,
31
+ disabled,
32
+ className,
33
+ style
34
+ }) => {
35
+ const handleLoaderVisibilityChange = (visible) => {
36
+ if (visible && !disableAutoLoadMore) {
37
+ onLoadMore();
38
+ }
39
+ };
40
+ const selectedIds = useMemo(
41
+ () => new Set(selectedOptions.map((opt) => opt.id)),
42
+ [selectedOptions]
43
+ );
44
+ const getCheckedState = (item) => {
45
+ if (item.type === "select-all") {
46
+ return item.checkState ?? "indeterminate";
47
+ }
48
+ return selectedIds.has(item.id) ? "checked" : "unchecked";
49
+ };
50
+ return /* @__PURE__ */ jsxs(
51
+ "div",
52
+ {
53
+ ...getMenuProps({
54
+ className: cx(styles$1["scroller"], className),
55
+ style
56
+ }),
57
+ children: [
58
+ /* @__PURE__ */ jsx("ul", { className: cx(styles$1["select-field-list"]), children: isOpen && /* @__PURE__ */ jsx(Fragment, { children: loading ? /* @__PURE__ */ jsx("div", { className: styles$1["empty"], children: /* @__PURE__ */ jsx(Spinner, { size: "medium" }) }) : items.length > 0 ? items.map((item, index) => /* @__PURE__ */ jsx(
59
+ SelectFieldListItem,
60
+ {
61
+ item,
62
+ index,
63
+ getItemProps,
64
+ selectionType: "multiple",
65
+ checked: getCheckedState(item),
66
+ highlighted: highlightedIndex === index,
67
+ disabled: (disabled || item.disabled) ?? false
68
+ },
69
+ item.id
70
+ )) : /* @__PURE__ */ jsx("div", { className: styles$1["empty"], children: /* @__PURE__ */ jsx(Text, { subdued: true, size: "small", children: "No match found" }) }) }) }),
71
+ loadingMore ? /* @__PURE__ */ jsxs("div", { className: styles$1["load-more"], children: [
72
+ /* @__PURE__ */ jsx(Spinner, { size: "small" }),
73
+ /* @__PURE__ */ jsx(SrOnly, { children: "Loading more..." })
74
+ ] }) : hasMore && !loading ? /* @__PURE__ */ jsx(
75
+ InView,
76
+ {
77
+ onVisibilityChange: handleLoaderVisibilityChange,
78
+ rootMargin: "0px 0px -100px 0px",
79
+ children: /* @__PURE__ */ jsx("div", { className: styles$1["load-more"], children: /* @__PURE__ */ jsx(Button, { appearance: "secondary", size: "small", onClick: onLoadMore, children: "Load more" }) })
80
+ }
81
+ ) : null
82
+ ]
83
+ }
84
+ );
85
+ };
86
+ MultiSelectFieldList.displayName = "MultiSelectFieldList";
87
+
88
+ const input = "_input_1t7vf_2";
89
+ const prefix = "_prefix_1t7vf_52";
90
+ const suffix = "_suffix_1t7vf_53";
91
+ const chip = "_chip_1t7vf_98";
92
+ const small = "_small_1t7vf_193";
93
+ const large = "_large_1t7vf_196";
94
+ const disabled = "_disabled_1t7vf_202";
95
+ const error = "_error_1t7vf_214";
96
+ const styles = {
97
+ "input-wrapper": "_input-wrapper_1t7vf_2",
98
+ "buttons-wrapper": "_buttons-wrapper_1t7vf_11",
99
+ input: input,
100
+ "toggle-button-wrapper": "_toggle-button-wrapper_1t7vf_38",
101
+ "close-button-wrapper": "_close-button-wrapper_1t7vf_39",
102
+ prefix: prefix,
103
+ suffix: suffix,
104
+ "no-clear-button": "_no-clear-button_1t7vf_79",
105
+ "no-toggle-button": "_no-toggle-button_1t7vf_82",
106
+ "rows-wrapper": "_rows-wrapper_1t7vf_88",
107
+ "chip-wrapper": "_chip-wrapper_1t7vf_98",
108
+ chip: chip,
109
+ "input-flex": "_input-flex_1t7vf_108",
110
+ "close-button": "_close-button_1t7vf_39",
111
+ "toggle-button": "_toggle-button_1t7vf_38",
112
+ small: small,
113
+ large: large,
114
+ disabled: disabled,
115
+ error: error};
116
+
117
+ const hasMultipleRows = (container) => {
118
+ const children = Array.from(container.children);
119
+ if (children.length <= 1) return false;
120
+ const firstTop = children[0].getBoundingClientRect().top;
121
+ return children.some(
122
+ (child) => child.getBoundingClientRect().top !== firstTop
123
+ );
124
+ };
125
+ const MultiSelectFieldInput = ({
126
+ placeholder,
127
+ size,
128
+ disableClearButton,
129
+ disableToggleButton,
130
+ disabled,
131
+ readOnly,
132
+ error,
133
+ onClear,
134
+ id,
135
+ inputWrapperRef,
136
+ htmlInputWrapperProps,
137
+ inputProps,
138
+ toggleButtonProps,
139
+ prefix,
140
+ suffix,
141
+ selectedOptions = [],
142
+ onRemoveOption,
143
+ singleRow,
144
+ maxChips,
145
+ onWrapperClick
146
+ }) => {
147
+ const rowsRef = useRef(null);
148
+ const inputRef = useRef(null);
149
+ const externalRef = inputProps?.ref;
150
+ const mergedInputRef = mergeRefs([inputRef, externalRef]);
151
+ const [visibleCount, setVisibleCount] = useState(null);
152
+ const prevSelectedLengthRef = useRef(selectedOptions.length);
153
+ useLayoutEffect(() => {
154
+ if (prevSelectedLengthRef.current !== selectedOptions.length) {
155
+ prevSelectedLengthRef.current = selectedOptions.length;
156
+ setVisibleCount(null);
157
+ }
158
+ }, [selectedOptions.length]);
159
+ useLayoutEffect(() => {
160
+ if (!singleRow || !rowsRef.current) {
161
+ setVisibleCount(null);
162
+ return;
163
+ }
164
+ if (visibleCount === null) {
165
+ if (hasMultipleRows(rowsRef.current)) {
166
+ const firstRowTop = rowsRef.current.children[0]?.getBoundingClientRect().top;
167
+ const firstRowCount = Array.from(rowsRef.current.children).filter(
168
+ (c) => c.getBoundingClientRect().top === firstRowTop
169
+ ).length;
170
+ setVisibleCount(Math.max(firstRowCount - 1, 0));
171
+ }
172
+ return;
173
+ }
174
+ if (hasMultipleRows(rowsRef.current) && visibleCount > 0) {
175
+ setVisibleCount(visibleCount - 1);
176
+ }
177
+ }, [singleRow, selectedOptions.length, visibleCount]);
178
+ const maxAllowed = maxChips ?? 10;
179
+ const displayCount = singleRow && visibleCount !== null ? Math.min(visibleCount, maxAllowed) : Math.min(selectedOptions.length, maxAllowed);
180
+ const hiddenCount = selectedOptions.length - displayCount;
181
+ const inputWrapperClassNames = cx(styles["input-wrapper"], {
182
+ [styles["small"]]: size === "small",
183
+ [styles["large"]]: size === "large",
184
+ [styles["no-clear-button"]]: disableClearButton,
185
+ [styles["no-toggle-button"]]: disableToggleButton,
186
+ [styles["disabled"]]: disabled || readOnly
187
+ });
188
+ const handleInputKeyDown = (e) => {
189
+ if (e.key === "Backspace" && !inputProps?.value && selectedOptions.length > 0 && onRemoveOption && !disabled && !readOnly) {
190
+ onRemoveOption(selectedOptions[selectedOptions.length - 1]);
191
+ }
192
+ if (inputProps?.onKeyDown) {
193
+ inputProps.onKeyDown(e);
194
+ }
195
+ };
196
+ const handleWrapperClick = (e) => {
197
+ const target = e.target;
198
+ if (target.closest("button") || target.tagName === "INPUT") {
199
+ return;
200
+ }
201
+ onWrapperClick?.(e);
202
+ inputRef.current?.focus();
203
+ };
204
+ return (
205
+ // eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events -- Click-to-focus container; Despite the disabled rules, this remains accessible. Keyboard interaction is provided by the input and nested buttons are filtered out in the handler.
206
+ /* @__PURE__ */ jsxs(
207
+ "div",
208
+ {
209
+ ref: inputWrapperRef,
210
+ ...htmlInputWrapperProps,
211
+ className: cx(inputWrapperClassNames, htmlInputWrapperProps?.className),
212
+ onClick: handleWrapperClick,
213
+ children: [
214
+ prefix ? /* @__PURE__ */ jsx("div", { className: styles["prefix"], children: prefix }) : null,
215
+ /* @__PURE__ */ jsxs("div", { className: styles["rows-wrapper"], ref: rowsRef, children: [
216
+ selectedOptions.length > 0 && onRemoveOption ? selectedOptions.slice(0, displayCount).map((option, index) => /* @__PURE__ */ jsx(
217
+ "div",
218
+ {
219
+ className: styles["chip-wrapper"],
220
+ children: /* @__PURE__ */ jsx(
221
+ Chip,
222
+ {
223
+ label: option.label,
224
+ onClose: disabled || readOnly ? void 0 : () => onRemoveOption(option),
225
+ className: styles["chip"],
226
+ title: option.label
227
+ }
228
+ )
229
+ },
230
+ `selected-item-${option.id}-${index}`
231
+ )) : null,
232
+ hiddenCount > 0 ? /* @__PURE__ */ jsx("div", { className: styles["chip-wrapper"], children: /* @__PURE__ */ jsx(
233
+ Chip,
234
+ {
235
+ label: `+${hiddenCount}`,
236
+ className: styles["chip"],
237
+ title: selectedOptions.slice(displayCount).map((option) => option.label).join(", ")
238
+ }
239
+ ) }) : null,
240
+ /* @__PURE__ */ jsxs(Flex, { className: styles["input-flex"], alignItems: "center", children: [
241
+ /* @__PURE__ */ jsx(
242
+ "input",
243
+ {
244
+ id,
245
+ placeholder,
246
+ disabled,
247
+ readOnly,
248
+ ...inputProps,
249
+ ref: mergedInputRef,
250
+ onKeyDown: handleInputKeyDown,
251
+ className: cx(styles["input"], inputProps?.className, {
252
+ [styles["error"]]: error
253
+ })
254
+ }
255
+ ),
256
+ suffix ? /* @__PURE__ */ jsx("div", { className: styles["suffix"], children: suffix }) : null
257
+ ] })
258
+ ] }),
259
+ /* @__PURE__ */ jsxs("div", { className: styles["buttons-wrapper"], children: [
260
+ disableClearButton ? null : /* @__PURE__ */ jsx("div", { className: styles["close-button-wrapper"], children: /* @__PURE__ */ jsx(
261
+ Button,
262
+ {
263
+ icon: SvgClose,
264
+ "aria-label": "clear selection",
265
+ appearance: "ghost",
266
+ size: "small",
267
+ className: styles["close-button"],
268
+ onClick: () => {
269
+ onClear?.();
270
+ }
271
+ }
272
+ ) }),
273
+ disableToggleButton ? null : /* @__PURE__ */ jsx("div", { className: styles["toggle-button-wrapper"], children: /* @__PURE__ */ jsx(
274
+ Button,
275
+ {
276
+ icon: SvgChevronRight,
277
+ "aria-label": "toggle menu",
278
+ appearance: "ghost",
279
+ size: "small",
280
+ disabled,
281
+ ...toggleButtonProps,
282
+ className: cx(
283
+ styles["toggle-button"],
284
+ toggleButtonProps?.className
285
+ )
286
+ }
287
+ ) })
288
+ ] })
289
+ ]
290
+ }
291
+ )
292
+ );
293
+ };
294
+ MultiSelectFieldInput.displayName = "MultiSelectFieldInput";
295
+
296
+ const useComboMultiple = ({
297
+ options,
298
+ pinnedOptions,
299
+ selectAll,
300
+ selectedOptions,
301
+ onSelectedOptionsChange,
302
+ onInputValueChange,
303
+ onIsOpenChange,
304
+ displayAs = "popover",
305
+ disabled
306
+ }) => {
307
+ const downshiftItems = useMemo(() => {
308
+ const items = options.map(
309
+ mapOptionToDownshiftItem
310
+ );
311
+ if (selectAll) {
312
+ items.unshift({
313
+ id: "select-all",
314
+ type: "select-all",
315
+ original: {
316
+ id: "select-all",
317
+ label: selectAll.label ?? "Select All"
318
+ },
319
+ checkState: selectAll.checkState
320
+ });
321
+ }
322
+ return items;
323
+ }, [options, pinnedOptions, selectAll]);
324
+ const { ref: wrapperDivRef, environment } = useDownshiftEnvironment();
325
+ const handleItemClick = useCallback(
326
+ (option) => {
327
+ const isSelected = selectedOptions.some((opt) => opt.id === option.id);
328
+ if (isSelected) {
329
+ onSelectedOptionsChange(
330
+ selectedOptions.filter((opt) => opt.id !== option.id)
331
+ );
332
+ } else {
333
+ const fullOption = options.find((opt) => opt.id === option.id);
334
+ if (fullOption) {
335
+ onSelectedOptionsChange([...selectedOptions, fullOption]);
336
+ }
337
+ }
338
+ },
339
+ [selectedOptions, onSelectedOptionsChange, options]
340
+ );
341
+ const {
342
+ isOpen,
343
+ highlightedIndex,
344
+ getToggleButtonProps,
345
+ getLabelProps,
346
+ getMenuProps,
347
+ getInputProps,
348
+ getItemProps,
349
+ inputValue,
350
+ closeMenu,
351
+ openMenu,
352
+ toggleMenu
353
+ } = useCombobox({
354
+ isItemDisabled: (item, _index) => {
355
+ if (!item) {
356
+ return false;
357
+ }
358
+ return (disabled || item.disabled) ?? false;
359
+ },
360
+ environment,
361
+ // For multi-select, we don't track a single selected item
362
+ selectedItem: null,
363
+ onSelectedItemChange: ({
364
+ selectedItem: si
365
+ }) => {
366
+ console.log("selectedItem", si);
367
+ if (si) {
368
+ if (si.type === "select-all") {
369
+ selectAll?.onClick();
370
+ } else if (si.type === "option") {
371
+ handleItemClick(si.original);
372
+ }
373
+ }
374
+ },
375
+ onInputValueChange,
376
+ onIsOpenChange,
377
+ items: downshiftItems,
378
+ itemToString(item) {
379
+ return item?.original.label ?? "";
380
+ },
381
+ stateReducer: (state, actionAndChanges) => stateReducer(state, actionAndChanges, displayAs)
382
+ });
383
+ return {
384
+ inputValue,
385
+ wrapperDivRef,
386
+ getToggleButtonProps,
387
+ getLabelProps,
388
+ getMenuProps,
389
+ getInputProps,
390
+ getItemProps,
391
+ highlightedIndex,
392
+ isOpen,
393
+ downshiftItems,
394
+ closeMenu,
395
+ openMenu,
396
+ toggleMenu,
397
+ selectedOptions
398
+ };
399
+ };
400
+ function mapOptionToDownshiftItem(option) {
401
+ return {
402
+ id: option.id,
403
+ type: "option",
404
+ disabled: option.disabled ?? false,
405
+ original: option
406
+ };
407
+ }
408
+ function stateReducer(state, actionAndChanges, displayAs) {
409
+ const { type, changes } = actionAndChanges;
410
+ switch (type) {
411
+ case useCombobox.stateChangeTypes.InputBlur:
412
+ console.log("inputBlur", changes, state);
413
+ if (displayAs === "dialog" && state.isOpen) {
414
+ return {
415
+ ...changes,
416
+ isOpen: state.isOpen,
417
+ // Preserve input value for multi-select
418
+ inputValue: state.inputValue
419
+ };
420
+ }
421
+ return {
422
+ ...changes,
423
+ // For multi-select, preserve the input value on blur
424
+ inputValue: state.inputValue
425
+ };
426
+ case useCombobox.stateChangeTypes.InputKeyDownEscape:
427
+ case useCombobox.stateChangeTypes.FunctionCloseMenu:
428
+ return {
429
+ ...changes,
430
+ // Clear input value when menu is closed
431
+ inputValue: ""
432
+ };
433
+ case useCombobox.stateChangeTypes.InputClick:
434
+ if (displayAs === "dialog" && state.isOpen) {
435
+ return {
436
+ ...changes,
437
+ isOpen: state.isOpen
438
+ };
439
+ }
440
+ return changes;
441
+ case useCombobox.stateChangeTypes.InputKeyDownEnter:
442
+ case useCombobox.stateChangeTypes.ItemClick:
443
+ return {
444
+ ...changes,
445
+ isOpen: state.isOpen,
446
+ // Keep menu open
447
+ highlightedIndex: state.highlightedIndex,
448
+ // Preserve highlight position
449
+ inputValue: state.inputValue
450
+ // Preserve input value for continued filtering
451
+ };
452
+ default:
453
+ return changes;
454
+ }
455
+ }
456
+
457
+ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
458
+ const { layoutStyles, componentProps } = useLayoutPropsUtil(propsWithLayout);
459
+ const [initialLoadPerformed, setInitialLoadPerformed] = useState(false);
460
+ const inputWrapperRef = useRef(null);
461
+ const {
462
+ id: idProp,
463
+ value: selectedOptions,
464
+ initialLoad: initialLoadProp = "auto",
465
+ displayMenuAs: displayMenuAsProp = "auto",
466
+ lazy,
467
+ loadOptions: loadOptionsProp,
468
+ label,
469
+ labelNode,
470
+ hideLabel,
471
+ placeholder,
472
+ debounceMs = 200,
473
+ onSelectedOptionsChange,
474
+ cache,
475
+ size,
476
+ error,
477
+ hint,
478
+ description,
479
+ errorAriaLive: errorAriaLiveProp = "assertive",
480
+ required,
481
+ disabled,
482
+ readOnly,
483
+ prefix,
484
+ suffix,
485
+ selectAll,
486
+ singleRow,
487
+ maxChips,
488
+ className,
489
+ style
490
+ } = componentProps;
491
+ const autoId = useId();
492
+ const id = idProp ?? autoId;
493
+ const helperUid = useId();
494
+ const [shouldAriaLive, setShouldAriaLive] = useState(false);
495
+ const handleFocus = () => {
496
+ setShouldAriaLive(true);
497
+ };
498
+ const handleBlur = () => {
499
+ setShouldAriaLive(false);
500
+ };
501
+ const errorMessage = typeof error !== "boolean" ? error : void 0;
502
+ const hasHelperText = hint || errorMessage || description;
503
+ const isDisabledOrReadOnly = (disabled || readOnly) ?? false;
504
+ const { isMobile } = useAdaptiveView();
505
+ const displayAs = displayMenuAsProp === "auto" ? isMobile ? "dialog" : "popover" : displayMenuAsProp;
506
+ const initialLoad = initialLoadProp === "auto" ? "immediate" : initialLoadProp;
507
+ const pageSize = lazy === "page" && "lazyOptions" in componentProps ? componentProps.lazyOptions?.pageSize ?? DEFAULT_PAGE_SIZE : DEFAULT_PAGE_SIZE;
508
+ const limit = lazy === "offset" && "lazyOptions" in componentProps ? componentProps.lazyOptions?.limit ?? DEFAULT_PAGE_SIZE : DEFAULT_PAGE_SIZE;
509
+ const loadingHookConfig = useMemo(() => {
510
+ const cacheConfig = {
511
+ enabled: cache?.enabled,
512
+ maxSize: cache?.maxSize
513
+ };
514
+ if (lazy === "page")
515
+ return {
516
+ lazy: "page",
517
+ loadOptions: loadOptionsProp,
518
+ pageSize,
519
+ cache: cacheConfig
520
+ };
521
+ if (lazy === "offset")
522
+ return {
523
+ lazy: "offset",
524
+ loadOptions: loadOptionsProp,
525
+ limit,
526
+ cache: cacheConfig
527
+ };
528
+ if (lazy === "group")
529
+ return {
530
+ lazy: "group",
531
+ loadOptions: loadOptionsProp,
532
+ cache: cacheConfig
533
+ };
534
+ return {
535
+ lazy: false,
536
+ loadOptions: loadOptionsProp,
537
+ cache: cacheConfig
538
+ };
539
+ }, [lazy, loadOptionsProp, pageSize, limit, cache?.enabled, cache?.maxSize]);
540
+ const {
541
+ options,
542
+ loading,
543
+ loadingMore,
544
+ hasMore,
545
+ loadOptions,
546
+ loadMore,
547
+ clearCache
548
+ } = useSelectFieldLoading(loadingHookConfig);
549
+ useImperativeHandle(ref, () => ({ clearCache }), [clearCache]);
550
+ const debouncedOptionLoader = useDebouncedCallback((inputValue2) => {
551
+ loadOptions(inputValue2, { initial: true });
552
+ }, debounceMs);
553
+ const handleRemoveOption = useCallback(
554
+ (option) => {
555
+ onSelectedOptionsChange(
556
+ selectedOptions.filter((opt) => opt.id !== option.id)
557
+ );
558
+ },
559
+ [selectedOptions, onSelectedOptionsChange]
560
+ );
561
+ const handleClear = useCallback(() => {
562
+ onSelectedOptionsChange([]);
563
+ }, [onSelectedOptionsChange]);
564
+ const {
565
+ isOpen,
566
+ getToggleButtonProps,
567
+ getLabelProps,
568
+ getMenuProps,
569
+ getInputProps,
570
+ wrapperDivRef,
571
+ highlightedIndex,
572
+ getItemProps,
573
+ inputValue,
574
+ downshiftItems,
575
+ closeMenu,
576
+ toggleMenu
577
+ } = useComboMultiple({
578
+ displayAs,
579
+ onSelectedOptionsChange,
580
+ disabled: isDisabledOrReadOnly,
581
+ options,
582
+ pinnedOptions: [],
583
+ selectedOptions,
584
+ selectAll: selectAll ? {
585
+ label: selectAll.label ?? "Select All",
586
+ onClick: selectAll.onClick,
587
+ checkState: selectAll.isChecked === true ? "checked" : selectAll.isChecked === false ? "unchecked" : selectAll.isChecked ?? "indeterminate"
588
+ } : void 0,
589
+ async onIsOpenChange(changes) {
590
+ if (initialLoad === "open" && !initialLoadPerformed && changes.isOpen) {
591
+ await loadOptions("", { initial: true });
592
+ setInitialLoadPerformed(true);
593
+ }
594
+ },
595
+ onInputValueChange: ({ inputValue: iv }) => {
596
+ debouncedOptionLoader(iv ?? "");
597
+ }
598
+ });
599
+ useEffect(() => {
600
+ const performInitialLoad = async () => {
601
+ if (initialLoad === "immediate" && !initialLoadPerformed) {
602
+ await loadOptions("", { initial: true });
603
+ setInitialLoadPerformed(true);
604
+ }
605
+ };
606
+ performInitialLoad();
607
+ }, [loadOptions, initialLoadPerformed, initialLoad]);
608
+ const handleLoadMore = async () => {
609
+ await loadMore(inputValue);
610
+ };
611
+ const disableClearButton = selectedOptions.length === 0 || isDisabledOrReadOnly;
612
+ if (displayAs === "dialog") {
613
+ return /* @__PURE__ */ jsxs(
614
+ "div",
615
+ {
616
+ className: className ? `${styles$2["search-field"]} ${className}` : styles$2["search-field"],
617
+ style: { ...layoutStyles, ...style },
618
+ ref: wrapperDivRef,
619
+ children: [
620
+ /* @__PURE__ */ jsx(
621
+ SelectFieldLabel,
622
+ {
623
+ label,
624
+ labelNode,
625
+ hideLabel,
626
+ getLabelProps,
627
+ required
628
+ }
629
+ ),
630
+ /* @__PURE__ */ jsx(
631
+ MultiSelectFieldInput,
632
+ {
633
+ disabled,
634
+ readOnly,
635
+ disableToggleButton: false,
636
+ placeholder,
637
+ disableClearButton,
638
+ toggleButtonProps: getToggleButtonProps(),
639
+ onClear: handleClear,
640
+ id: `${id}-input`,
641
+ inputProps: getInputProps({
642
+ "aria-describedby": hasHelperText ? helperUid : void 0,
643
+ "aria-invalid": error ? true : void 0,
644
+ onFocus: handleFocus,
645
+ onBlur: handleBlur
646
+ }),
647
+ size,
648
+ error: !!error,
649
+ prefix,
650
+ suffix,
651
+ selectedOptions,
652
+ onRemoveOption: handleRemoveOption,
653
+ singleRow,
654
+ maxChips,
655
+ onWrapperClick: toggleMenu
656
+ }
657
+ ),
658
+ hasHelperText ? /* @__PURE__ */ jsx(
659
+ FieldMessage,
660
+ {
661
+ id: helperUid,
662
+ hint,
663
+ errorMessage,
664
+ errorAriaLive: isOpen || shouldAriaLive ? errorAriaLiveProp : "off",
665
+ description
666
+ }
667
+ ) : null,
668
+ /* @__PURE__ */ jsx(
669
+ FieldDialog,
670
+ {
671
+ id: `${id}-dialog`,
672
+ isOpen,
673
+ onClose: closeMenu,
674
+ title: label,
675
+ initialFocusResolver: (elements) => {
676
+ return elements.find((element) => element.tagName === "INPUT") || elements[0];
677
+ },
678
+ field: /* @__PURE__ */ jsx(
679
+ MultiSelectFieldInput,
680
+ {
681
+ disabled,
682
+ readOnly,
683
+ inputProps: getInputProps(),
684
+ disableToggleButton: true,
685
+ placeholder,
686
+ disableClearButton,
687
+ onClear: handleClear,
688
+ id: `${id}-dialog-input`,
689
+ inputWrapperRef,
690
+ size: "medium",
691
+ error: !!error,
692
+ prefix,
693
+ suffix,
694
+ selectedOptions,
695
+ onRemoveOption: handleRemoveOption,
696
+ singleRow: true,
697
+ maxChips: 20
698
+ }
699
+ ),
700
+ children: /* @__PURE__ */ jsx(
701
+ MultiSelectFieldList,
702
+ {
703
+ isOpen: true,
704
+ items: downshiftItems,
705
+ getMenuProps,
706
+ getItemProps,
707
+ highlightedIndex,
708
+ selectedOptions,
709
+ hasMore,
710
+ onLoadMore: handleLoadMore,
711
+ loading,
712
+ loadingMore,
713
+ disabled: isDisabledOrReadOnly,
714
+ style: {
715
+ paddingInline: 24,
716
+ paddingBlockEnd: 24
717
+ }
718
+ }
719
+ )
720
+ }
721
+ )
722
+ ]
723
+ }
724
+ );
725
+ }
726
+ return /* @__PURE__ */ jsxs(
727
+ "div",
728
+ {
729
+ className: className ? `${styles$2["search-field"]} ${className}` : styles$2["search-field"],
730
+ style: { ...layoutStyles, ...style },
731
+ children: [
732
+ /* @__PURE__ */ jsx(
733
+ SelectFieldLabel,
734
+ {
735
+ label,
736
+ labelNode,
737
+ hideLabel,
738
+ getLabelProps,
739
+ required
740
+ }
741
+ ),
742
+ /* @__PURE__ */ jsx(
743
+ MultiSelectFieldInput,
744
+ {
745
+ disabled,
746
+ readOnly,
747
+ inputProps: getInputProps({
748
+ popovertarget: `${id}-popover`,
749
+ "aria-describedby": hasHelperText ? helperUid : void 0,
750
+ "aria-invalid": error ? true : void 0,
751
+ onFocus: handleFocus,
752
+ onBlur: handleBlur
753
+ }),
754
+ toggleButtonProps: getToggleButtonProps(),
755
+ disableToggleButton: false,
756
+ placeholder,
757
+ disableClearButton,
758
+ onClear: handleClear,
759
+ id: `${id}-input`,
760
+ popoverTarget: `${id}-popover`,
761
+ inputWrapperRef,
762
+ size,
763
+ error: !!error,
764
+ prefix,
765
+ suffix,
766
+ selectedOptions,
767
+ onRemoveOption: handleRemoveOption,
768
+ singleRow,
769
+ maxChips,
770
+ onWrapperClick: toggleMenu
771
+ }
772
+ ),
773
+ hasHelperText ? /* @__PURE__ */ jsx(
774
+ FieldMessage,
775
+ {
776
+ id: helperUid,
777
+ hint,
778
+ errorMessage,
779
+ errorAriaLive: isOpen || shouldAriaLive ? errorAriaLiveProp : "off",
780
+ description
781
+ }
782
+ ) : null,
783
+ /* @__PURE__ */ jsx(
784
+ FieldPopover,
785
+ {
786
+ id: `${id}-popover`,
787
+ referenceElement: inputWrapperRef,
788
+ open: isOpen && displayAs === "popover",
789
+ onClickOutside: closeMenu,
790
+ children: /* @__PURE__ */ jsx(
791
+ MultiSelectFieldList,
792
+ {
793
+ isOpen,
794
+ items: downshiftItems,
795
+ getMenuProps,
796
+ getItemProps,
797
+ highlightedIndex,
798
+ selectedOptions,
799
+ hasMore,
800
+ onLoadMore: handleLoadMore,
801
+ loading,
802
+ loadingMore,
803
+ disabled: isDisabledOrReadOnly,
804
+ style: {
805
+ padding: 8
806
+ }
807
+ }
808
+ )
809
+ }
810
+ )
811
+ ]
812
+ }
813
+ );
814
+ });
815
+ MultiSelectField.displayName = "MultiSelectField";
816
+
817
+ const defaultFilter = (options, searchValue) => {
818
+ return matchSorter(options, searchValue, {
819
+ keys: ["label", "searchText"]
820
+ });
821
+ };
822
+ const MultiSelectFieldSync = (props) => {
823
+ const {
824
+ options,
825
+ filter: filterProp = defaultFilter,
826
+ selectAll: selectAllProp,
827
+ value,
828
+ onSelectedOptionsChange,
829
+ ...rest
830
+ } = props;
831
+ const filter = typeof filterProp === "function" ? filterProp : (options2, searchValue) => matchSorter(
832
+ options2,
833
+ searchValue,
834
+ filterProp
835
+ );
836
+ const selectAllConfig = useMemo(() => {
837
+ if (!selectAllProp) return void 0;
838
+ const enabledOptions = options.filter((opt) => !opt.disabled);
839
+ const selectedCount = value.length;
840
+ const totalCount = enabledOptions.length;
841
+ const allSelected = selectedCount === totalCount;
842
+ const labelProp = typeof selectAllProp === "object" ? selectAllProp.label : void 0;
843
+ const label = typeof labelProp === "function" ? labelProp(allSelected) : labelProp;
844
+ const isChecked = allSelected ? "checked" : selectedCount > 0 ? "indeterminate" : "unchecked";
845
+ const handleClick = () => {
846
+ if (allSelected) {
847
+ onSelectedOptionsChange([]);
848
+ } else {
849
+ onSelectedOptionsChange(enabledOptions);
850
+ }
851
+ };
852
+ return {
853
+ label,
854
+ onClick: handleClick,
855
+ isChecked
856
+ };
857
+ }, [selectAllProp, options, value, onSelectedOptionsChange]);
858
+ return /* @__PURE__ */ jsx(
859
+ MultiSelectField,
860
+ {
861
+ lazy: false,
862
+ loadOptions: (searchValue) => filter(options, searchValue),
863
+ debounceMs: 0,
864
+ value,
865
+ onSelectedOptionsChange,
866
+ selectAll: selectAllConfig,
867
+ ...rest
868
+ }
869
+ );
870
+ };
871
+
872
+ export { MultiSelectField as M, MultiSelectFieldSync as a };
873
+ //# sourceMappingURL=MultiSelectFieldSync-B3HNQf7R.js.map