@servicetitan/anvil2 2.0.4 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/dist/{Calendar-jO-0jbbt.js → Calendar-D0CczOpQ.js} +3 -835
  3. package/dist/Calendar-D0CczOpQ.js.map +1 -0
  4. package/dist/{Calendar-DxLrWESu.js → Calendar-oNlBgZKB.js} +2 -2
  5. package/dist/{Calendar-DxLrWESu.js.map → Calendar-oNlBgZKB.js.map} +1 -1
  6. package/dist/Calendar.js +2 -2
  7. package/dist/{Checkbox-9VbydUcM.js → Checkbox-DIY-6agd.js} +12 -12
  8. package/dist/Checkbox-DIY-6agd.js.map +1 -0
  9. package/dist/{Checkbox-ZXftLNwB.js → Checkbox-DuzAqrE7.js} +2 -2
  10. package/dist/{Checkbox-ZXftLNwB.js.map → Checkbox-DuzAqrE7.js.map} +1 -1
  11. package/dist/Checkbox.js +1 -1
  12. package/dist/{Combobox-CNObHLjp.js → Combobox-CSGn20KQ.js} +14 -7
  13. package/dist/Combobox-CSGn20KQ.js.map +1 -0
  14. package/dist/Combobox.js +1 -1
  15. package/dist/{DataTable-CQpySyDq.js → DataTable-D30sE1Xt.js} +223 -19
  16. package/dist/DataTable-D30sE1Xt.js.map +1 -0
  17. package/dist/{DateFieldRange-BG86w0pX.js → DateFieldRange-DBOiqaML.js} +46 -36
  18. package/dist/DateFieldRange-DBOiqaML.js.map +1 -0
  19. package/dist/DateFieldRange.js +1 -1
  20. package/dist/{DateFieldSingle-Byu_jyye.js → DateFieldSingle-C4hU55MP.js} +38 -29
  21. package/dist/DateFieldSingle-C4hU55MP.js.map +1 -0
  22. package/dist/DateFieldSingle.js +1 -1
  23. package/dist/{DateFieldYearless-Dw1k3_PY.js → DateFieldYearless-BXkUiHIR.js} +14 -13
  24. package/dist/DateFieldYearless-BXkUiHIR.js.map +1 -0
  25. package/dist/DateFieldYearless.js +1 -1
  26. package/dist/{DateFieldYearlessRange--plyld10.js → DateFieldYearlessRange-CGffFnVT.js} +14 -13
  27. package/dist/DateFieldYearlessRange-CGffFnVT.js.map +1 -0
  28. package/dist/DateFieldYearlessRange.js +1 -1
  29. package/dist/{DaysOfTheWeek-vE310Rjp.js → DaysOfTheWeek-DJEDopC9.js} +9 -5
  30. package/dist/DaysOfTheWeek-DJEDopC9.js.map +1 -0
  31. package/dist/DaysOfTheWeek.js +1 -1
  32. package/dist/{Dialog-DZPaz84r.js → Dialog-BbsZMnCA.js} +4 -4
  33. package/dist/{Dialog-DZPaz84r.js.map → Dialog-BbsZMnCA.js.map} +1 -1
  34. package/dist/Dialog.js +1 -1
  35. package/dist/{Drawer-pMQOa2jH.js → Drawer-Dhq76ot3.js} +4 -4
  36. package/dist/{Drawer-pMQOa2jH.js.map → Drawer-Dhq76ot3.js.map} +1 -1
  37. package/dist/Drawer.js +1 -1
  38. package/dist/DrillDown.js +1 -1
  39. package/dist/{FieldDialog-Be54L3E-.js → FieldDialog-CAuhkCZY.js} +541 -142
  40. package/dist/FieldDialog-CAuhkCZY.js.map +1 -0
  41. package/dist/FieldDialog.css +58 -28
  42. package/dist/{FieldLabel-DSrHbw9U.js → FieldLabel-DL0D6fvc.js} +2 -2
  43. package/dist/{FieldLabel-DSrHbw9U.js.map → FieldLabel-DL0D6fvc.js.map} +1 -1
  44. package/dist/FieldLabel.js +1 -1
  45. package/dist/FieldMessage-DS0COrjp.js +132 -0
  46. package/dist/FieldMessage-DS0COrjp.js.map +1 -0
  47. package/dist/FieldMessage.css +18 -4
  48. package/dist/FieldMessage.js +2 -1
  49. package/dist/FieldMessage.js.map +1 -1
  50. package/dist/{Helper-CK-XjpR3.js → Helper-PNGm_U2X.js} +7 -4
  51. package/dist/Helper-PNGm_U2X.js.map +1 -0
  52. package/dist/{InputMask-DoqWRi3t.js → InputMask-Ds0W2fKy.js} +2 -2
  53. package/dist/{InputMask-DoqWRi3t.js.map → InputMask-Ds0W2fKy.js.map} +1 -1
  54. package/dist/InputMask.js +1 -1
  55. package/dist/{ListView-CtRhYAls.js → ListView-MMmJDM--.js} +2 -2
  56. package/dist/{ListView-CtRhYAls.js.map → ListView-MMmJDM--.js.map} +1 -1
  57. package/dist/ListView.js +1 -1
  58. package/dist/MultiSelectField.js +1 -1
  59. package/dist/{MultiSelectFieldSync-xj7jXas-.js → MultiSelectFieldSync-Bey99LzJ.js} +178 -58
  60. package/dist/MultiSelectFieldSync-Bey99LzJ.js.map +1 -0
  61. package/dist/NumberField-CDkEUfXW.js +237 -0
  62. package/dist/NumberField-CDkEUfXW.js.map +1 -0
  63. package/dist/NumberField.js +1 -1
  64. package/dist/{Page-vc7zs4tn.js → Page-BVxybI-j.js} +6 -6
  65. package/dist/{Page-vc7zs4tn.js.map → Page-BVxybI-j.js.map} +1 -1
  66. package/dist/Page.js +1 -1
  67. package/dist/{Popover-OOLK0hUz.js → Popover-4C5IVk8T.js} +7 -6
  68. package/dist/{Popover-OOLK0hUz.js.map → Popover-4C5IVk8T.js.map} +1 -1
  69. package/dist/Popover.css +15 -14
  70. package/dist/Popover.js +1 -1
  71. package/dist/{ProgressBar-HA9RPZfC.js → ProgressBar-BGwp-qnf.js} +16 -11
  72. package/dist/ProgressBar-BGwp-qnf.js.map +1 -0
  73. package/dist/ProgressBar.js +1 -1
  74. package/dist/{Radio-31wKzlZ4.js → Radio-BRcpSu-d.js} +12 -12
  75. package/dist/Radio-BRcpSu-d.js.map +1 -0
  76. package/dist/{Radio-BwWDJuLF.js → Radio-D7hNws2b.js} +2 -2
  77. package/dist/{Radio-BwWDJuLF.js.map → Radio-D7hNws2b.js.map} +1 -1
  78. package/dist/Radio.js +1 -1
  79. package/dist/{SelectCard-C91twG1S.js → SelectCard-Bag44PmE.js} +3 -3
  80. package/dist/{SelectCard-C91twG1S.js.map → SelectCard-Bag44PmE.js.map} +1 -1
  81. package/dist/SelectCard.js +1 -1
  82. package/dist/SelectField.js +1 -1
  83. package/dist/{SelectFieldSync-BFsJssdD.js → SelectFieldSync-CigqXq3T.js} +67 -50
  84. package/dist/SelectFieldSync-CigqXq3T.js.map +1 -0
  85. package/dist/{SelectTrigger-Cxhx9IVo.js → SelectTrigger-DgsvUfyl.js} +2 -2
  86. package/dist/{SelectTrigger-Cxhx9IVo.js.map → SelectTrigger-DgsvUfyl.js.map} +1 -1
  87. package/dist/SelectTrigger.js +1 -1
  88. package/dist/{SelectTriggerBase-aaOWep-V.js → SelectTriggerBase-OxfNqdIq.js} +12 -7
  89. package/dist/SelectTriggerBase-OxfNqdIq.js.map +1 -0
  90. package/dist/{Stepper-Jv9A3Ned.js → Stepper-D8lkCP8Y.js} +11 -2
  91. package/dist/Stepper-D8lkCP8Y.js.map +1 -0
  92. package/dist/Stepper.js +1 -1
  93. package/dist/{Switch-DQICcdAv.js → Switch-D0zwZCg4.js} +2 -2
  94. package/dist/{Switch-DQICcdAv.js.map → Switch-D0zwZCg4.js.map} +1 -1
  95. package/dist/Switch.js +1 -1
  96. package/dist/Table.js +1 -1
  97. package/dist/{TextField-CDiiYSlT.js → TextField-BycenT6H.js} +13 -12
  98. package/dist/TextField-BycenT6H.js.map +1 -0
  99. package/dist/{TextField-CnYxS52Y.js → TextField-Dfzn2HeL.js} +2 -2
  100. package/dist/{TextField-CnYxS52Y.js.map → TextField-Dfzn2HeL.js.map} +1 -1
  101. package/dist/TextField.js +1 -1
  102. package/dist/{Textarea-BnHIDj2P.js → Textarea-BwbwJP6z.js} +13 -12
  103. package/dist/Textarea-BwbwJP6z.js.map +1 -0
  104. package/dist/Textarea.js +1 -1
  105. package/dist/{TimeField-ChqK40k_.js → TimeField-B0WSzSfJ.js} +4 -4
  106. package/dist/{TimeField-ChqK40k_.js.map → TimeField-B0WSzSfJ.js.map} +1 -1
  107. package/dist/TimeField.js +1 -1
  108. package/dist/TimezoneMessage-Cnsl4cHT.js +84 -0
  109. package/dist/TimezoneMessage-Cnsl4cHT.js.map +1 -0
  110. package/dist/TimezoneMessage.css +7 -0
  111. package/dist/Toast.js +2 -2
  112. package/dist/{Toaster-BlycAc63.js → Toaster-9Q_yaKGu.js} +18 -18
  113. package/dist/Toaster-9Q_yaKGu.js.map +1 -0
  114. package/dist/{Toaster-DW_bi2L9.js → Toaster-DHo8dnWH.js} +2 -2
  115. package/dist/{Toaster-DW_bi2L9.js.map → Toaster-DHo8dnWH.js.map} +1 -1
  116. package/dist/{Toolbar-vBomnRKG.js → Toolbar-CVOenuCF.js} +70 -23
  117. package/dist/Toolbar-CVOenuCF.js.map +1 -0
  118. package/dist/Toolbar.js +1 -1
  119. package/dist/{Tooltip-CUiAJXak.js → Tooltip-Bt62hC5J.js} +5 -5
  120. package/dist/{Tooltip-CUiAJXak.js.map → Tooltip-Bt62hC5J.js.map} +1 -1
  121. package/dist/Tooltip.css +9 -8
  122. package/dist/Tooltip.js +1 -1
  123. package/dist/{YearlessDateInputWithPicker-DZSb8sPf.js → YearlessDateInputWithPicker-ztozRk-X.js} +3 -3
  124. package/dist/{YearlessDateInputWithPicker-DZSb8sPf.js.map → YearlessDateInputWithPicker-ztozRk-X.js.map} +1 -1
  125. package/dist/beta/components/MultiSelectField/MultiSelectField.d.ts +2 -0
  126. package/dist/beta/components/MultiSelectField/MultiSelectFieldSync.d.ts +43 -4
  127. package/dist/beta/components/MultiSelectField/internal/MultiSelectFieldList.d.ts +5 -5
  128. package/dist/beta/components/MultiSelectField/internal/useComboMultiple.d.ts +13 -2
  129. package/dist/beta/components/MultiSelectField/stories/MultiSelectField.stories.data.d.ts +1 -0
  130. package/dist/beta/components/MultiSelectField/types.d.ts +52 -8
  131. package/dist/beta/components/SelectField/SelectFieldSync.d.ts +10 -3
  132. package/dist/beta/components/SelectField/internal/FieldListBase.d.ts +6 -5
  133. package/dist/beta/components/SelectField/internal/SelectFieldList.d.ts +4 -2
  134. package/dist/beta/components/SelectField/internal/SelectFieldListItem.d.ts +2 -1
  135. package/dist/beta/components/SelectField/internal/VirtualizedFieldListBase.d.ts +2 -0
  136. package/dist/beta/components/SelectField/internal/useCombo.d.ts +3 -1
  137. package/dist/beta/components/SelectField/internal/useFieldListSections.d.ts +55 -0
  138. package/dist/beta/components/SelectField/stories/SelectField.stories.data.d.ts +1 -0
  139. package/dist/beta/components/SelectField/types.d.ts +24 -6
  140. package/dist/beta/components/Table/DataTable/internal/editable-cells/DataTableEditableNumberCell.d.ts +7 -0
  141. package/dist/beta/components/Table/DataTable/internal/util/getTanStackColumnDef.d.ts +1 -0
  142. package/dist/beta/components/Table/DataTable/stories/DataTable.story-data.d.ts +1 -0
  143. package/dist/beta/components/Table/createColumnHelper.d.ts +36 -9
  144. package/dist/beta/components/Table/types.d.ts +54 -4
  145. package/dist/beta/components/Toolbar/Filters/internal/utils/filter-state.d.ts +1 -0
  146. package/dist/beta.js +7 -7
  147. package/dist/components/ButtonToggle/ButtonToggle.d.ts +1 -1
  148. package/dist/components/Checkbox/Checkbox.d.ts +2 -1
  149. package/dist/components/Checkbox/CheckboxGroup.d.ts +16 -8
  150. package/dist/components/Checkbox/internal/Checkbox.d.ts +1 -1
  151. package/dist/components/DateFieldRange/DateFieldRange.d.ts +8 -1
  152. package/dist/components/DateFieldRange/internal/DateFieldRangeCalendar.d.ts +3 -1
  153. package/dist/components/DateFieldSingle/DateFieldSingle.d.ts +8 -1
  154. package/dist/components/DateFieldSingle/internal/DateFieldSingleCalendar.d.ts +3 -1
  155. package/dist/components/DateFieldSingle/internal/TimezoneMessage.d.ts +6 -0
  156. package/dist/components/DateFieldSingle/internal/utils.d.ts +11 -0
  157. package/dist/components/DateFieldYearless/DateFieldYearless.d.ts +8 -3
  158. package/dist/components/DateFieldYearlessRange/DateFieldYearlessRange.d.ts +12 -1
  159. package/dist/components/DaysOfTheWeek/DaysOfTheWeek.d.ts +20 -6
  160. package/dist/components/Dialog/internal/useInitialFocus.d.ts +5 -1
  161. package/dist/components/FieldMessage/FieldMessage.d.ts +39 -20
  162. package/dist/components/FieldMessage/index.d.ts +1 -0
  163. package/dist/components/FieldMessage/utils.d.ts +7 -0
  164. package/dist/components/NumberField/NumberField.d.ts +24 -2
  165. package/dist/components/Page/Page.d.ts +2 -2
  166. package/dist/components/ProgressBar/ProgressBar.d.ts +8 -3
  167. package/dist/components/Radio/Radio.d.ts +2 -1
  168. package/dist/components/Radio/RadioGroup.d.ts +16 -8
  169. package/dist/components/SelectTrigger/internal/SelectTriggerBase.d.ts +1 -1
  170. package/dist/components/Stepper/Stepper.d.ts +6 -2
  171. package/dist/components/TextField/internal/TextField.d.ts +12 -1
  172. package/dist/components/Textarea/Textarea.d.ts +8 -5
  173. package/dist/index-DXeGMe23.js +836 -0
  174. package/dist/index-DXeGMe23.js.map +1 -0
  175. package/dist/{index.esm-BMOZFPwN.js → index.esm-C2ZhC_8d.js} +2 -2
  176. package/dist/{index.esm-BMOZFPwN.js.map → index.esm-C2ZhC_8d.js.map} +1 -1
  177. package/dist/{useOnClickOutside-Cyqbe1n3.js → index.esm-K9kxJhLx.js} +88 -94
  178. package/dist/index.esm-K9kxJhLx.js.map +1 -0
  179. package/dist/index.js +31 -30
  180. package/dist/index.js.map +1 -1
  181. package/dist/internal/components/Helper/Helper.d.ts +12 -3
  182. package/dist/internal/components/StatusIcon/StatusIcon.d.ts +45 -0
  183. package/dist/internal/components/StatusIcon/index.d.ts +1 -0
  184. package/dist/internal/functions/index.d.ts +1 -0
  185. package/dist/internal/functions/warnOnce.d.ts +5 -0
  186. package/dist/internal/hooks/useNumberField/useNumberField.d.ts +1 -1
  187. package/dist/{useDrilldown-lAdB3FFW.js → useDrilldown-jbU4Cs5l.js} +2 -598
  188. package/dist/useDrilldown-jbU4Cs5l.js.map +1 -0
  189. package/dist/{useInitialFocus-nOW12jQ5.js → useInitialFocus-BRRbylek.js} +2 -2
  190. package/dist/{useInitialFocus-nOW12jQ5.js.map → useInitialFocus-BRRbylek.js.map} +1 -1
  191. package/dist/{NumberField-W1k8V5Qq.js → useNumberField-eMyk7MB8.js} +5 -235
  192. package/dist/useNumberField-eMyk7MB8.js.map +1 -0
  193. package/dist/useOnClickOutside-Zw5vzxSq.js +71 -0
  194. package/dist/useOnClickOutside-Zw5vzxSq.js.map +1 -0
  195. package/dist/utils-pudAMGnO.js +25 -0
  196. package/dist/utils-pudAMGnO.js.map +1 -0
  197. package/package.json +9 -8
  198. package/dist/Calendar-jO-0jbbt.js.map +0 -1
  199. package/dist/Checkbox-9VbydUcM.js.map +0 -1
  200. package/dist/Combobox-CNObHLjp.js.map +0 -1
  201. package/dist/DataTable-CQpySyDq.js.map +0 -1
  202. package/dist/DateFieldRange-BG86w0pX.js.map +0 -1
  203. package/dist/DateFieldSingle-Byu_jyye.js.map +0 -1
  204. package/dist/DateFieldYearless-Dw1k3_PY.js.map +0 -1
  205. package/dist/DateFieldYearlessRange--plyld10.js.map +0 -1
  206. package/dist/DaysOfTheWeek-vE310Rjp.js.map +0 -1
  207. package/dist/FieldDialog-Be54L3E-.js.map +0 -1
  208. package/dist/FieldMessage-tEr6rWXS.js +0 -54
  209. package/dist/FieldMessage-tEr6rWXS.js.map +0 -1
  210. package/dist/Helper-CK-XjpR3.js.map +0 -1
  211. package/dist/MultiSelectFieldSync-xj7jXas-.js.map +0 -1
  212. package/dist/NumberField-W1k8V5Qq.js.map +0 -1
  213. package/dist/ProgressBar-HA9RPZfC.js.map +0 -1
  214. package/dist/Radio-31wKzlZ4.js.map +0 -1
  215. package/dist/SelectFieldSync-BFsJssdD.js.map +0 -1
  216. package/dist/SelectTriggerBase-aaOWep-V.js.map +0 -1
  217. package/dist/Stepper-Jv9A3Ned.js.map +0 -1
  218. package/dist/TextField-CDiiYSlT.js.map +0 -1
  219. package/dist/Textarea-BnHIDj2P.js.map +0 -1
  220. package/dist/Toaster-BlycAc63.js.map +0 -1
  221. package/dist/Toolbar-vBomnRKG.js.map +0 -1
  222. package/dist/useDrilldown-lAdB3FFW.js.map +0 -1
  223. package/dist/useOnClickOutside-Cyqbe1n3.js.map +0 -1
  224. package/dist/utils-BHKRoLps.js +0 -60
  225. package/dist/utils-BHKRoLps.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
- import { useMemo, useCallback, useRef, useState, useLayoutEffect, forwardRef, useId, useImperativeHandle, useEffect } from 'react';
2
+ import { forwardRef, useMemo, useCallback, useRef, useState, useLayoutEffect, useId, useImperativeHandle, useEffect } from 'react';
3
3
  import { u as useDownshiftEnvironment, a as useCombobox, m as matchSorter } from './match-sorter.esm-B3vwg1-X.js';
4
- import { F as FieldListBase, a as usePinnedOptions, b as useGroupedOptions, s as sortGroupSections, u as useAdaptiveView, D as DEFAULT_PAGE_SIZE, c as useSelectFieldLoading, d as useDebouncedCallback, S as SelectFieldLabel, e as FieldDialog, f as FieldPopover } from './FieldDialog-Be54L3E-.js';
4
+ import { V as VirtualizedFieldListBase, F as FieldListBase, a as usePinnedOptions, b as useGroupedOptions, s as sortGroupSections, u as useAdaptiveView, D as DEFAULT_PAGE_SIZE, c as useSelectFieldLoading, d as useDebouncedCallback, S as SelectFieldLabel, e as FieldDialog, f as FieldPopover } from './FieldDialog-CAuhkCZY.js';
5
5
  import { c as cx } from './index-SvGbrGuT.js';
6
6
  import { B as Button } from './Button-l7pTJdPc.js';
7
7
  import { C as Chip } from './Chip-Bc7jiIJ1.js';
@@ -10,20 +10,18 @@ import { m as mergeRefs } from './useMergeRefs-Dfmtq9cI.js';
10
10
  import { S as SvgChevronRight } from './chevron_right-BdpsxX7x.js';
11
11
  import { S as SvgClose } from './close-DZj38AEh.js';
12
12
  import { s as styles$1 } from './SelectTriggerBase.module-B0NFRlQP.js';
13
+ import { F as FieldMessage } from './FieldMessage-DS0COrjp.js';
14
+ import { w as warnDeprecatedErrorUsage } from './utils-pudAMGnO.js';
13
15
  import { u as useLayoutPropsUtil } from './useLayoutPropsUtil-loxbyklF.js';
14
- import { F as FieldMessage } from './FieldMessage-tEr6rWXS.js';
15
16
 
16
- import './MultiSelectFieldSync.css';const MultiSelectFieldList = ({
17
- selectedOptions,
18
- ...rest
19
- }) => {
17
+ import './MultiSelectFieldSync.css';const MultiSelectFieldList = forwardRef(({ selectedOptions, items, virtualize, ...rest }, ref) => {
20
18
  const selectedIds = useMemo(
21
19
  () => new Set(selectedOptions.map((opt) => opt.id)),
22
20
  [selectedOptions]
23
21
  );
24
22
  const getCheckedState = useCallback(
25
23
  (item) => {
26
- if (item.type === "select-all") {
24
+ if (item.type === "select-all" || item.type === "select-filtered") {
27
25
  return item.checkState ?? "indeterminate";
28
26
  }
29
27
  const checkId = item.type === "pinned-option" ? item.original.id : item.id;
@@ -31,15 +29,18 @@ import './MultiSelectFieldSync.css';const MultiSelectFieldList = ({
31
29
  },
32
30
  [selectedIds]
33
31
  );
32
+ const ListComponent = virtualize ? VirtualizedFieldListBase : FieldListBase;
34
33
  return /* @__PURE__ */ jsx(
35
- FieldListBase,
34
+ ListComponent,
36
35
  {
37
36
  ...rest,
37
+ ref,
38
+ items,
38
39
  selectionType: "multiple",
39
40
  getCheckedState
40
41
  }
41
42
  );
42
- };
43
+ });
43
44
  MultiSelectFieldList.displayName = "MultiSelectFieldList";
44
45
 
45
46
  const input = "_input_1t7vf_2";
@@ -256,12 +257,15 @@ const useComboMultiple = ({
256
257
  groupToString,
257
258
  groupSorter,
258
259
  selectAll,
260
+ selectFiltered,
259
261
  selectedOptions,
260
262
  onSelectedOptionsChange,
261
263
  onInputValueChange,
262
264
  onIsOpenChange,
263
265
  displayAs = "popover",
264
- disabled
266
+ disabled,
267
+ loading = false,
268
+ virtualize = false
265
269
  }) => {
266
270
  const [inputValue, setInputValue] = useState("");
267
271
  const { pinnedSections } = usePinnedOptions(pinned, inputValue);
@@ -278,7 +282,20 @@ const useComboMultiple = ({
278
282
  const { downshiftItems, sectionsMeta } = useMemo(() => {
279
283
  const items = [];
280
284
  const meta = [];
281
- if (selectAll) {
285
+ const hasSearchTerm = inputValue.trim().length > 0;
286
+ const hasResults = ungroupedItems.length > 0 || groupSections.some((s) => s.options.length > 0) || pinnedSections.some((s) => s.options.length > 0);
287
+ if (hasSearchTerm && selectFiltered && hasResults && !loading) {
288
+ const config = selectFiltered(inputValue);
289
+ items.push({
290
+ id: "select-filtered",
291
+ type: "select-filtered",
292
+ original: {
293
+ id: "select-filtered",
294
+ label: config.label ?? `Select items matching "${inputValue}"`
295
+ },
296
+ checkState: config.checkState
297
+ });
298
+ } else if (!hasSearchTerm && selectAll) {
282
299
  items.push({
283
300
  id: "select-all",
284
301
  type: "select-all",
@@ -339,8 +356,17 @@ const useComboMultiple = ({
339
356
  });
340
357
  });
341
358
  return { downshiftItems: items, sectionsMeta: meta };
342
- }, [groupSections, ungroupedItems, pinnedSections, selectAll]);
359
+ }, [
360
+ groupSections,
361
+ ungroupedItems,
362
+ pinnedSections,
363
+ selectAll,
364
+ selectFiltered,
365
+ inputValue,
366
+ loading
367
+ ]);
343
368
  const { ref: wrapperDivRef, environment } = useDownshiftEnvironment();
369
+ const highlightChangeTypeRef = useRef("");
344
370
  const allPinnedOptions = useMemo(() => {
345
371
  return pinnedSections.flatMap((section) => section.options);
346
372
  }, [pinnedSections]);
@@ -385,19 +411,53 @@ const useComboMultiple = ({
385
411
  onSelectedItemChange: ({
386
412
  selectedItem: si
387
413
  }) => {
388
- console.log("selectedItem", si);
389
414
  if (si) {
390
415
  if (si.type === "select-all") {
391
416
  selectAll?.onClick();
417
+ } else if (si.type === "select-filtered") {
418
+ selectFiltered?.(inputValue).onClick();
392
419
  } else if (si.type === "option" || si.type === "pinned-option" || si.type === "grouped-option") {
393
420
  handleItemClick(si.original);
394
421
  }
395
422
  }
396
423
  },
424
+ onHighlightedIndexChange: ({ type }) => {
425
+ highlightChangeTypeRef.current = type;
426
+ },
397
427
  onInputValueChange: (changes) => {
398
428
  setInputValue(changes.inputValue ?? "");
399
429
  onInputValueChange?.(changes);
400
430
  },
431
+ scrollIntoView: virtualize ? () => {
432
+ } : (node, menuNode) => {
433
+ if (!node || !menuNode) return;
434
+ const firstItem = downshiftItems[0];
435
+ const hasBulkAction = firstItem?.type === "select-all" || firstItem?.type === "select-filtered";
436
+ if (!hasBulkAction) {
437
+ const nodeRect2 = node.getBoundingClientRect();
438
+ const menuRect2 = menuNode.getBoundingClientRect();
439
+ if (nodeRect2.bottom > menuRect2.bottom || nodeRect2.top < menuRect2.top) {
440
+ node.scrollIntoView({ block: "nearest" });
441
+ }
442
+ return;
443
+ }
444
+ const bulkActionEl = menuNode.querySelector(
445
+ '[data-type="select-all"], [data-type="select-filtered"]'
446
+ );
447
+ if (node === bulkActionEl) {
448
+ menuNode.scrollTop = 0;
449
+ return;
450
+ }
451
+ const stickyHeight = bulkActionEl?.getBoundingClientRect().height ?? 0;
452
+ const nodeRect = node.getBoundingClientRect();
453
+ const menuRect = menuNode.getBoundingClientRect();
454
+ const visibleTop = menuRect.top + stickyHeight;
455
+ if (nodeRect.top < visibleTop) {
456
+ menuNode.scrollTop -= visibleTop - nodeRect.top;
457
+ } else if (nodeRect.bottom > menuRect.bottom) {
458
+ menuNode.scrollTop += nodeRect.bottom - menuRect.bottom;
459
+ }
460
+ },
401
461
  onIsOpenChange,
402
462
  items: downshiftItems,
403
463
  itemToString(item) {
@@ -414,6 +474,7 @@ const useComboMultiple = ({
414
474
  getInputProps,
415
475
  getItemProps,
416
476
  highlightedIndex,
477
+ highlightChangeTypeRef,
417
478
  isOpen,
418
479
  downshiftItems,
419
480
  sectionsMeta,
@@ -427,7 +488,6 @@ function stateReducer(state, actionAndChanges, displayAs) {
427
488
  const { type, changes } = actionAndChanges;
428
489
  switch (type) {
429
490
  case useCombobox.stateChangeTypes.InputBlur:
430
- console.log("inputBlur", changes, state);
431
491
  if (displayAs === "dialog" && state.isOpen) {
432
492
  return {
433
493
  ...changes,
@@ -467,6 +527,11 @@ function stateReducer(state, actionAndChanges, displayAs) {
467
527
  inputValue: state.inputValue
468
528
  // Preserve input value for continued filtering
469
529
  };
530
+ case useCombobox.stateChangeTypes.ControlledPropUpdatedSelectedItem:
531
+ return {
532
+ ...changes,
533
+ inputValue: state.inputValue
534
+ };
470
535
  default:
471
536
  return changes;
472
537
  }
@@ -494,33 +559,30 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
494
559
  error,
495
560
  hint,
496
561
  description,
497
- errorAriaLive: errorAriaLiveProp = "assertive",
498
562
  required,
499
563
  disabled,
500
564
  readOnly,
501
565
  prefix,
502
566
  suffix,
503
567
  selectAll,
568
+ selectFiltered,
504
569
  singleRow,
505
570
  maxChips,
571
+ warning,
506
572
  pinned,
573
+ onSearchChange,
507
574
  className,
508
- style
575
+ style,
576
+ virtualize
509
577
  } = componentProps;
510
578
  const groupToString = "groupToString" in componentProps ? componentProps.groupToString : void 0;
511
579
  const groupSorter = "groupSorter" in componentProps ? componentProps.groupSorter : void 0;
512
580
  const autoId = useId();
513
581
  const id = idProp ?? autoId;
514
582
  const helperUid = useId();
515
- const [shouldAriaLive, setShouldAriaLive] = useState(false);
516
- const handleFocus = () => {
517
- setShouldAriaLive(true);
518
- };
519
- const handleBlur = () => {
520
- setShouldAriaLive(false);
521
- };
522
- const errorMessage = typeof error !== "boolean" ? error : void 0;
523
- const hasHelperText = hint || errorMessage || description;
583
+ warnDeprecatedErrorUsage("MultiSelectField", error);
584
+ const errorMessages = typeof error === "boolean" || error === void 0 ? void 0 : error;
585
+ const hasHelperText = hint || errorMessages || warning || description;
524
586
  const isDisabledOrReadOnly = (disabled || readOnly) ?? false;
525
587
  const { isMobile } = useAdaptiveView();
526
588
  const displayAs = displayMenuAsProp === "auto" ? isMobile ? "dialog" : "popover" : displayMenuAsProp;
@@ -567,7 +629,17 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
567
629
  loadMore,
568
630
  clearCache
569
631
  } = useSelectFieldLoading(loadingHookConfig);
570
- useImperativeHandle(ref, () => ({ clearCache }), [clearCache]);
632
+ useImperativeHandle(
633
+ ref,
634
+ () => ({
635
+ clearCache,
636
+ invalidate: () => {
637
+ clearCache();
638
+ setInitialLoadPerformed(false);
639
+ }
640
+ }),
641
+ [clearCache]
642
+ );
571
643
  const debouncedOptionLoader = useDebouncedCallback((inputValue2) => {
572
644
  loadOptions(inputValue2, { initial: true });
573
645
  }, debounceMs);
@@ -590,6 +662,7 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
590
662
  getInputProps,
591
663
  wrapperDivRef,
592
664
  highlightedIndex,
665
+ highlightChangeTypeRef,
593
666
  getItemProps,
594
667
  inputValue,
595
668
  downshiftItems,
@@ -601,14 +674,24 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
601
674
  onSelectedOptionsChange,
602
675
  disabled: isDisabledOrReadOnly,
603
676
  options,
677
+ loading,
604
678
  pinned,
679
+ virtualize,
605
680
  groupToString,
606
681
  groupSorter,
607
682
  selectedOptions,
608
683
  selectAll: selectAll ? {
609
684
  label: selectAll.label ?? "Select All",
610
685
  onClick: selectAll.onClick,
611
- checkState: selectAll.isChecked === true ? "checked" : selectAll.isChecked === false ? "unchecked" : selectAll.isChecked ?? "indeterminate"
686
+ checkState: selectAll.checkState === true ? "checked" : selectAll.checkState === false ? "unchecked" : selectAll.checkState ?? "indeterminate"
687
+ } : void 0,
688
+ selectFiltered: selectFiltered ? (searchValue) => {
689
+ const config = selectFiltered(searchValue);
690
+ return {
691
+ label: config.label,
692
+ onClick: config.onClick,
693
+ checkState: config.checkState === true ? "checked" : config.checkState === false ? "unchecked" : config.checkState ?? "indeterminate"
694
+ };
612
695
  } : void 0,
613
696
  async onIsOpenChange(changes) {
614
697
  if (initialLoad === "open" && !initialLoadPerformed && changes.isOpen) {
@@ -618,6 +701,7 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
618
701
  },
619
702
  onInputValueChange: ({ inputValue: iv }) => {
620
703
  debouncedOptionLoader(iv ?? "");
704
+ onSearchChange?.(iv ?? "");
621
705
  }
622
706
  });
623
707
  useEffect(() => {
@@ -664,9 +748,7 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
664
748
  id: `${id}-input`,
665
749
  inputProps: getInputProps({
666
750
  "aria-describedby": hasHelperText ? helperUid : void 0,
667
- "aria-invalid": error ? true : void 0,
668
- onFocus: handleFocus,
669
- onBlur: handleBlur
751
+ "aria-invalid": error ? true : void 0
670
752
  }),
671
753
  size,
672
754
  error: !!error,
@@ -684,8 +766,8 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
684
766
  {
685
767
  id: helperUid,
686
768
  hint,
687
- errorMessage,
688
- errorAriaLive: isOpen || shouldAriaLive ? errorAriaLiveProp : "off",
769
+ error: errorMessages,
770
+ warning,
689
771
  description
690
772
  }
691
773
  ) : null,
@@ -729,6 +811,7 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
729
811
  getMenuProps,
730
812
  getItemProps,
731
813
  highlightedIndex,
814
+ highlightChangeTypeRef,
732
815
  selectedOptions,
733
816
  hasMore,
734
817
  onLoadMore: handleLoadMore,
@@ -736,10 +819,7 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
736
819
  loadingMore,
737
820
  disabled: isDisabledOrReadOnly,
738
821
  sectionsMeta,
739
- style: {
740
- paddingInline: 24,
741
- paddingBlockEnd: 24
742
- }
822
+ virtualize
743
823
  }
744
824
  )
745
825
  }
@@ -772,9 +852,7 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
772
852
  inputProps: getInputProps({
773
853
  popovertarget: `${id}-popover`,
774
854
  "aria-describedby": hasHelperText ? helperUid : void 0,
775
- "aria-invalid": error ? true : void 0,
776
- onFocus: handleFocus,
777
- onBlur: handleBlur
855
+ "aria-invalid": error ? true : void 0
778
856
  }),
779
857
  toggleButtonProps: getToggleButtonProps(),
780
858
  disableToggleButton: false,
@@ -800,8 +878,8 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
800
878
  {
801
879
  id: helperUid,
802
880
  hint,
803
- errorMessage,
804
- errorAriaLive: isOpen || shouldAriaLive ? errorAriaLiveProp : "off",
881
+ error: errorMessages,
882
+ warning,
805
883
  description
806
884
  }
807
885
  ) : null,
@@ -820,6 +898,7 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
820
898
  getMenuProps,
821
899
  getItemProps,
822
900
  highlightedIndex,
901
+ highlightChangeTypeRef,
823
902
  selectedOptions,
824
903
  hasMore,
825
904
  onLoadMore: handleLoadMore,
@@ -827,9 +906,7 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
827
906
  loadingMore,
828
907
  disabled: isDisabledOrReadOnly,
829
908
  sectionsMeta,
830
- style: {
831
- padding: 8
832
- }
909
+ virtualize
833
910
  }
834
911
  )
835
912
  }
@@ -840,25 +917,25 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
840
917
  });
841
918
  MultiSelectField.displayName = "MultiSelectField";
842
919
 
843
- const defaultFilter = (options, searchValue) => {
844
- return matchSorter(options, searchValue, {
845
- keys: ["label", "searchText"]
846
- });
847
- };
920
+ const defaultFilter = (options, searchValue) => matchSorter(options, searchValue, {
921
+ keys: ["label", "searchText"],
922
+ baseSort: (a, b) => a.index - b.index
923
+ });
924
+ const toFilterFn = (filter) => typeof filter === "function" ? filter : (options, searchValue) => matchSorter(options, searchValue, {
925
+ baseSort: (a, b) => a.index - b.index,
926
+ ...filter
927
+ });
848
928
  const MultiSelectFieldSync = (props) => {
849
929
  const {
850
930
  options,
851
931
  filter: filterProp = defaultFilter,
852
932
  selectAll: selectAllProp,
933
+ selectFiltered: selectFilteredProp,
853
934
  value,
854
935
  onSelectedOptionsChange,
855
936
  ...rest
856
937
  } = props;
857
- const filter = typeof filterProp === "function" ? filterProp : (options2, searchValue) => matchSorter(
858
- options2,
859
- searchValue,
860
- filterProp
861
- );
938
+ const filter = useMemo(() => toFilterFn(filterProp), [filterProp]);
862
939
  const selectAllConfig = useMemo(() => {
863
940
  if (!selectAllProp) return void 0;
864
941
  const enabledOptions = options.filter((opt) => !opt.disabled);
@@ -867,7 +944,7 @@ const MultiSelectFieldSync = (props) => {
867
944
  const allSelected = selectedCount === totalCount;
868
945
  const labelProp = typeof selectAllProp === "object" ? selectAllProp.label : void 0;
869
946
  const label = typeof labelProp === "function" ? labelProp(allSelected) : labelProp;
870
- const isChecked = allSelected ? "checked" : selectedCount > 0 ? "indeterminate" : "unchecked";
947
+ const checkState = allSelected ? "checked" : selectedCount > 0 ? "indeterminate" : "unchecked";
871
948
  const handleClick = () => {
872
949
  if (allSelected) {
873
950
  onSelectedOptionsChange([]);
@@ -878,22 +955,65 @@ const MultiSelectFieldSync = (props) => {
878
955
  return {
879
956
  label,
880
957
  onClick: handleClick,
881
- isChecked
958
+ checkState
882
959
  };
883
960
  }, [selectAllProp, options, value, onSelectedOptionsChange]);
961
+ const selectFilteredConfig = useMemo(() => {
962
+ if (!selectFilteredProp) return void 0;
963
+ return (searchValue) => {
964
+ const filteredOptions = filter(options, searchValue);
965
+ const enabledFilteredOptions = filteredOptions.filter(
966
+ (opt) => !opt.disabled
967
+ );
968
+ const selectedIds = new Set(value.map((v) => v.id));
969
+ const allFilteredSelected = enabledFilteredOptions.length > 0 && enabledFilteredOptions.every((opt) => selectedIds.has(opt.id));
970
+ const someFilteredSelected = enabledFilteredOptions.some(
971
+ (opt) => selectedIds.has(opt.id)
972
+ );
973
+ const label = typeof selectFilteredProp === "function" ? selectFilteredProp(searchValue).label : void 0;
974
+ const checkState = allFilteredSelected ? "checked" : someFilteredSelected ? "indeterminate" : "unchecked";
975
+ const handleClick = () => {
976
+ if (allFilteredSelected) {
977
+ const filteredIds = new Set(enabledFilteredOptions.map((o) => o.id));
978
+ onSelectedOptionsChange(value.filter((v) => !filteredIds.has(v.id)));
979
+ } else {
980
+ const currentIds = new Set(value.map((v) => v.id));
981
+ const newSelections = enabledFilteredOptions.filter(
982
+ (opt) => !currentIds.has(opt.id)
983
+ );
984
+ onSelectedOptionsChange([...value, ...newSelections]);
985
+ }
986
+ };
987
+ return {
988
+ label,
989
+ onClick: handleClick,
990
+ checkState
991
+ };
992
+ };
993
+ }, [selectFilteredProp, options, value, onSelectedOptionsChange, filter]);
994
+ const fieldRef = useRef(null);
995
+ const prevOptionsRef = useRef(options);
996
+ useEffect(() => {
997
+ if (prevOptionsRef.current !== options) {
998
+ prevOptionsRef.current = options;
999
+ fieldRef.current?.invalidate();
1000
+ }
1001
+ }, [options]);
884
1002
  return /* @__PURE__ */ jsx(
885
1003
  MultiSelectField,
886
1004
  {
1005
+ ref: fieldRef,
887
1006
  lazy: false,
888
1007
  loadOptions: (searchValue) => filter(options, searchValue),
889
1008
  debounceMs: 0,
890
1009
  value,
891
1010
  onSelectedOptionsChange,
892
1011
  selectAll: selectAllConfig,
1012
+ selectFiltered: selectFilteredConfig,
893
1013
  ...rest
894
1014
  }
895
1015
  );
896
1016
  };
897
1017
 
898
1018
  export { MultiSelectField as M, MultiSelectFieldSync as a };
899
- //# sourceMappingURL=MultiSelectFieldSync-xj7jXas-.js.map
1019
+ //# sourceMappingURL=MultiSelectFieldSync-Bey99LzJ.js.map