@servicetitan/anvil2 3.9.0 → 3.10.1

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 (203) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/dist/AiMark-2_O4tKv_.js.map +1 -1
  3. package/dist/Button-Dwh_Nd4l.js.map +1 -1
  4. package/dist/Combobox.js +1 -1
  5. package/dist/{DataTable-CRzQKN_P.js → DataTable-D-SKKt5w.js} +53 -16
  6. package/dist/DataTable-D-SKKt5w.js.map +1 -0
  7. package/dist/{DateFieldRange-CHbrYgsD.js → DateFieldRange-DUFfyknZ.js} +51 -31
  8. package/dist/DateFieldRange-DUFfyknZ.js.map +1 -0
  9. package/dist/DateFieldRange.js +1 -1
  10. package/dist/{DateFieldSingle-D-KZ3NL0.js → DateFieldSingle-BZjlO0hX.js} +49 -28
  11. package/dist/DateFieldSingle-BZjlO0hX.js.map +1 -0
  12. package/dist/DateFieldSingle.js +1 -1
  13. package/dist/{DateFieldYearless-DouEX24o.js → DateFieldYearless-TcKb9jE2.js} +4 -2
  14. package/dist/DateFieldYearless-TcKb9jE2.js.map +1 -0
  15. package/dist/DateFieldYearless.js +1 -1
  16. package/dist/{DateFieldYearlessRange-B_bImgyn.js → DateFieldYearlessRange-D9XtRNWi.js} +16 -4
  17. package/dist/DateFieldYearlessRange-D9XtRNWi.js.map +1 -0
  18. package/dist/DateFieldYearlessRange.js +1 -1
  19. package/dist/{Dialog-Clh3jaX8.js → Dialog-DjJ9wpeo.js} +2 -2
  20. package/dist/{Dialog-Clh3jaX8.js.map → Dialog-DjJ9wpeo.js.map} +1 -1
  21. package/dist/Dialog.js +1 -1
  22. package/dist/DndSort.js.map +1 -1
  23. package/dist/{Drawer-h2Mut1lB.js → Drawer-CZITBE8M.js} +2 -2
  24. package/dist/{Drawer-h2Mut1lB.js.map → Drawer-CZITBE8M.js.map} +1 -1
  25. package/dist/Drawer.js +1 -1
  26. package/dist/DrillDown.css +36 -34
  27. package/dist/DrillDown.js +1 -1
  28. package/dist/DrillDown.module-1VBKDZRA.js +27 -0
  29. package/dist/{DrillDown.module-D1Bf9_yP.js.map → DrillDown.module-1VBKDZRA.js.map} +1 -1
  30. package/dist/{FilterBar-CBTAkEri.js → FilterBar-B_ShYx2G.js} +28 -7
  31. package/dist/FilterBar-B_ShYx2G.js.map +1 -0
  32. package/dist/FilterBar.js +1 -1
  33. package/dist/{MenuFooter-BXcNxNnX.js → MenuFooter--lBF8OjJ.js} +5 -1
  34. package/dist/MenuFooter--lBF8OjJ.js.map +1 -0
  35. package/dist/MultiSelectField.js +1 -1
  36. package/dist/{MultiSelectFieldSync-CpfsWecG.js → MultiSelectFieldSync-B_vuR-ii.js} +220 -156
  37. package/dist/MultiSelectFieldSync-B_vuR-ii.js.map +1 -0
  38. package/dist/MultiSelectFieldSync.css +80 -69
  39. package/dist/MultiSelectMenu.js +1 -1
  40. package/dist/{MultiSelectMenuSync-CtyLYyDE.js → MultiSelectMenuSync-C3Y7jnJQ.js} +22 -8
  41. package/dist/MultiSelectMenuSync-C3Y7jnJQ.js.map +1 -0
  42. package/dist/{Page-B6E3Gbji.js → Page-BHBcuxcE.js} +14 -13
  43. package/dist/Page-BHBcuxcE.js.map +1 -0
  44. package/dist/Page.js +1 -1
  45. package/dist/{Pagination-DF7iMeJe.js → Pagination-Bx_u6Uea.js} +32 -6
  46. package/dist/Pagination-Bx_u6Uea.js.map +1 -0
  47. package/dist/Pagination.js +1 -1
  48. package/dist/{RichTextEditor-CLo8yoUP.js → RichTextEditor-CTIGe6xA.js} +3 -3
  49. package/dist/{RichTextEditor-CLo8yoUP.js.map → RichTextEditor-CTIGe6xA.js.map} +1 -1
  50. package/dist/RichTextEditor.js +1 -1
  51. package/dist/{SavedFiltersButton-FcYVncxU.js → SavedFiltersButton-DV0xxLat.js} +251 -165
  52. package/dist/SavedFiltersButton-DV0xxLat.js.map +1 -0
  53. package/dist/SavedFiltersButton.js +1 -1
  54. package/dist/SelectField.js +1 -1
  55. package/dist/{SelectFieldSync-Bi8HsMYP.js → SelectFieldSync-rwfeNwN2.js} +45 -11
  56. package/dist/SelectFieldSync-rwfeNwN2.js.map +1 -0
  57. package/dist/SelectMenu.js +1 -1
  58. package/dist/{SelectMenuSync-DKg4g5nN.js → SelectMenuSync-BkC0FD5P.js} +22 -8
  59. package/dist/SelectMenuSync-BkC0FD5P.js.map +1 -0
  60. package/dist/{SelectOptions-DszNAjxB.js → SelectOptions-B3Vmtb_k.js} +2 -2
  61. package/dist/{SelectOptions-DszNAjxB.js.map → SelectOptions-B3Vmtb_k.js.map} +1 -1
  62. package/dist/{SelectTrigger-DNIc5ttg.js → SelectTrigger-BAnVo4Ln.js} +2 -2
  63. package/dist/{SelectTrigger-DNIc5ttg.js.map → SelectTrigger-BAnVo4Ln.js.map} +1 -1
  64. package/dist/SelectTrigger.js +1 -1
  65. package/dist/{SelectTriggerBase-1Cc6EUBw.js → SelectTriggerBase-D7zAT0UR.js} +8 -3
  66. package/dist/SelectTriggerBase-D7zAT0UR.js.map +1 -0
  67. package/dist/SelectTriggerBase.css +49 -47
  68. package/dist/SelectTriggerBase.module-mYOfdBGA.js +40 -0
  69. package/dist/SelectTriggerBase.module-mYOfdBGA.js.map +1 -0
  70. package/dist/Tab-Bqfvg8Ce.js.map +1 -1
  71. package/dist/Table.js +1 -1
  72. package/dist/Textarea-B3C7AkPj.js.map +1 -1
  73. package/dist/{Toolbar-2VQIjU5b.js → Toolbar-BOgHhw7K.js} +12 -3
  74. package/dist/Toolbar-BOgHhw7K.js.map +1 -0
  75. package/dist/{Toolbar-BbImThIu.js → Toolbar-DDWUuQm_.js} +24 -2
  76. package/dist/Toolbar-DDWUuQm_.js.map +1 -0
  77. package/dist/Toolbar.js +2 -2
  78. package/dist/{ToolbarButtonToggle-Bc0XvCM9.js → ToolbarButtonToggle-BbtKfezH.js} +18 -2
  79. package/dist/ToolbarButtonToggle-BbtKfezH.js.map +1 -0
  80. package/dist/TreeSelectField.js +1 -1
  81. package/dist/{TreeSelectFieldSync-DUHVmOQa.js → TreeSelectFieldSync-BRQgLPxB.js} +118 -87
  82. package/dist/TreeSelectFieldSync-BRQgLPxB.js.map +1 -0
  83. package/dist/TreeSelectFieldSync.css +44 -36
  84. package/dist/TreeSelectMenu.js +1 -1
  85. package/dist/{TreeSelectMenuSync-DVoYUG7F.js → TreeSelectMenuSync-88q0ydo5.js} +18 -6
  86. package/dist/TreeSelectMenuSync-88q0ydo5.js.map +1 -0
  87. package/dist/{YearlessDateInputWithPicker-CM9mmz8s.js → YearlessDateInputWithPicker-BquY4bCd.js} +19 -5
  88. package/dist/YearlessDateInputWithPicker-BquY4bCd.js.map +1 -0
  89. package/dist/anvParts-BGg5dgfl.js +43 -0
  90. package/dist/anvParts-BGg5dgfl.js.map +1 -0
  91. package/dist/beta.js +13 -13
  92. package/dist/{bulkActionTypes-BnZNAru6.js → bulkActionTypes-CWcUhKFS.js} +2 -2
  93. package/dist/{bulkActionTypes-BnZNAru6.js.map → bulkActionTypes-CWcUhKFS.js.map} +1 -1
  94. package/dist/downshift.esm-xtSnQp44.js.map +1 -1
  95. package/dist/{filter-state-XmqhkURU.js → filter-state-zlL4luoE.js} +153 -81
  96. package/dist/filter-state-zlL4luoE.js.map +1 -0
  97. package/dist/floating-ui.react-dom-CyrxPiI-.js.map +1 -1
  98. package/dist/index-DXeGMe23.js.map +1 -1
  99. package/dist/{index-BwNeldDw.js → index-DjirBR0l.js} +2 -2
  100. package/dist/{index-BwNeldDw.js.map → index-DjirBR0l.js.map} +1 -1
  101. package/dist/index.esm-C2ZhC_8d.js.map +1 -1
  102. package/dist/index.js +16 -16
  103. package/dist/proxy-DEehATlA.js.map +1 -1
  104. package/dist/src/beta/components/FilterBar/FilterBar.d.ts +3 -3
  105. package/dist/src/beta/components/FilterBar/internal/utils/dateListLibraryOptions.d.ts +17 -3
  106. package/dist/src/beta/components/FilterBar/parts.d.ts +38 -0
  107. package/dist/src/beta/components/SavedFiltersButton/parts.d.ts +37 -0
  108. package/dist/src/beta/components/SavedFiltersButton/types.d.ts +2 -1
  109. package/dist/src/beta/components/Table/DataTable/DataTable.d.ts +3 -2
  110. package/dist/src/beta/components/Table/DataTable/parts.d.ts +30 -0
  111. package/dist/src/beta/components/Table/internal/ResizeHandle.d.ts +3 -2
  112. package/dist/src/beta/components/Toolbar/Toolbar.d.ts +4 -4
  113. package/dist/src/beta/components/Toolbar/parts.d.ts +19 -0
  114. package/dist/src/beta/components/TreeSelectField/TreeSelectField.d.ts +6 -5
  115. package/dist/src/beta/components/TreeSelectField/parts.d.ts +23 -0
  116. package/dist/src/beta/components/TreeSelectField/types.d.ts +11 -4
  117. package/dist/src/beta/components/TreeSelectMenu/TreeSelectMenu.d.ts +33 -2
  118. package/dist/src/beta/components/TreeSelectMenu/parts.d.ts +12 -0
  119. package/dist/src/beta/components/TreeSelectMenu/types.d.ts +3 -2
  120. package/dist/src/components/Combobox/ComboboxTypes.d.ts +2 -2
  121. package/dist/src/components/Combobox/parts.d.ts +19 -0
  122. package/dist/src/components/DateFieldRange/DateFieldRange.d.ts +2 -2
  123. package/dist/src/components/DateFieldRange/parts.d.ts +16 -0
  124. package/dist/src/components/DateFieldSingle/DateFieldSingle.d.ts +2 -2
  125. package/dist/src/components/DateFieldSingle/parts.d.ts +16 -0
  126. package/dist/src/components/DateFieldYearless/DateFieldYearless.d.ts +2 -2
  127. package/dist/src/components/DateFieldYearless/parts.d.ts +15 -0
  128. package/dist/src/components/DateFieldYearlessRange/DateFieldYearlessRange.d.ts +2 -2
  129. package/dist/src/components/DateFieldYearlessRange/parts.d.ts +12 -0
  130. package/dist/src/components/DrillDown/DrillDown.d.ts +11 -0
  131. package/dist/src/components/MultiSelectField/internal/MultiSelectFieldComboboxMode.d.ts +1 -1
  132. package/dist/src/components/MultiSelectField/internal/MultiSelectFieldSelectMode.d.ts +1 -1
  133. package/dist/src/components/MultiSelectField/internal/types.d.ts +3 -1
  134. package/dist/src/components/MultiSelectField/parts.d.ts +20 -0
  135. package/dist/src/components/MultiSelectField/types.d.ts +2 -2
  136. package/dist/src/components/MultiSelectMenu/parts.d.ts +12 -0
  137. package/dist/src/components/MultiSelectMenu/types.d.ts +3 -2
  138. package/dist/src/components/Pagination/Pagination.d.ts +4 -3
  139. package/dist/src/components/Pagination/parts.d.ts +28 -0
  140. package/dist/src/components/SelectField/internal/SelectFieldComboboxMode.d.ts +1 -1
  141. package/dist/src/components/SelectField/internal/SelectFieldSelectMode.d.ts +1 -1
  142. package/dist/src/components/SelectField/parts.d.ts +18 -0
  143. package/dist/src/components/SelectField/types.d.ts +7 -2
  144. package/dist/src/components/SelectMenu/internal/useMenuInteraction.d.ts +8 -6
  145. package/dist/src/components/SelectMenu/parts.d.ts +12 -0
  146. package/dist/src/components/SelectMenu/types.d.ts +3 -2
  147. package/dist/src/components/SelectTrigger/internal/SelectTriggerBase.d.ts +6 -5
  148. package/dist/src/components/Toolbar/Toolbar.d.ts +3 -3
  149. package/dist/src/components/Toolbar/parts.d.ts +18 -0
  150. package/dist/src/internal/constants/anvParts.d.ts +81 -0
  151. package/dist/src/internal/testing/anvPartsContract.d.ts +24 -0
  152. package/dist/src/internal/types/selectFieldInternalTypes.d.ts +3 -1
  153. package/dist/{syncFilterUtils-UVNoFsDr.js → syncFilterUtils-YB6gRuuR.js} +11 -4
  154. package/dist/syncFilterUtils-YB6gRuuR.js.map +1 -0
  155. package/dist/{treeSync-CiU5d6rF.js → treeSync-DOen59wP.js} +24 -4
  156. package/dist/treeSync-DOen59wP.js.map +1 -0
  157. package/dist/use-reduced-motion-CqjZZ5QB.js.map +1 -1
  158. package/dist/{useAdaptiveView-C_WvM4-P.js → useAdaptiveView-DmhhcX-B.js} +3 -1
  159. package/dist/useAdaptiveView-DmhhcX-B.js.map +1 -0
  160. package/dist/useChipLayout-BBe6Tzyl.js +90 -0
  161. package/dist/useChipLayout-BBe6Tzyl.js.map +1 -0
  162. package/dist/{useDrillDownContext-iUvoTget.js → useDrillDownContext-D5_NjqY4.js} +2 -2
  163. package/dist/{useDrillDownContext-iUvoTget.js.map → useDrillDownContext-D5_NjqY4.js.map} +1 -1
  164. package/dist/{useDrilldown-D7DKSs7E.js → useDrilldown-glecoaI_.js} +45 -19
  165. package/dist/{useDrilldown-D7DKSs7E.js.map → useDrilldown-glecoaI_.js.map} +1 -1
  166. package/dist/{useInfiniteCombobox-COJTJxCZ.js → useInfiniteCombobox-CVAYoUvh.js} +70 -23
  167. package/dist/useInfiniteCombobox-CVAYoUvh.js.map +1 -0
  168. package/dist/{useMenuInteraction-AgrXU8kv.js → useMenuInteraction-nNF1dsrp.js} +7 -4
  169. package/dist/useMenuInteraction-nNF1dsrp.js.map +1 -0
  170. package/dist/useSize.js.map +1 -1
  171. package/package.json +9 -7
  172. package/dist/DataTable-CRzQKN_P.js.map +0 -1
  173. package/dist/DateFieldRange-CHbrYgsD.js.map +0 -1
  174. package/dist/DateFieldSingle-D-KZ3NL0.js.map +0 -1
  175. package/dist/DateFieldYearless-DouEX24o.js.map +0 -1
  176. package/dist/DateFieldYearlessRange-B_bImgyn.js.map +0 -1
  177. package/dist/DrillDown.module-D1Bf9_yP.js +0 -27
  178. package/dist/FilterBar-CBTAkEri.js.map +0 -1
  179. package/dist/MenuFooter-BXcNxNnX.js.map +0 -1
  180. package/dist/MultiSelectFieldSync-CpfsWecG.js.map +0 -1
  181. package/dist/MultiSelectMenuSync-CtyLYyDE.js.map +0 -1
  182. package/dist/Page-B6E3Gbji.js.map +0 -1
  183. package/dist/Pagination-DF7iMeJe.js.map +0 -1
  184. package/dist/SavedFiltersButton-FcYVncxU.js.map +0 -1
  185. package/dist/SelectFieldSync-Bi8HsMYP.js.map +0 -1
  186. package/dist/SelectMenuSync-DKg4g5nN.js.map +0 -1
  187. package/dist/SelectTriggerBase-1Cc6EUBw.js.map +0 -1
  188. package/dist/SelectTriggerBase.module-Brmw1nYG.js +0 -39
  189. package/dist/SelectTriggerBase.module-Brmw1nYG.js.map +0 -1
  190. package/dist/Toolbar-2VQIjU5b.js.map +0 -1
  191. package/dist/Toolbar-BbImThIu.js.map +0 -1
  192. package/dist/ToolbarButtonToggle-Bc0XvCM9.js.map +0 -1
  193. package/dist/TreeSelectFieldSync-DUHVmOQa.js.map +0 -1
  194. package/dist/TreeSelectMenuSync-DVoYUG7F.js.map +0 -1
  195. package/dist/YearlessDateInputWithPicker-CM9mmz8s.js.map +0 -1
  196. package/dist/filter-state-XmqhkURU.js.map +0 -1
  197. package/dist/syncFilterUtils-UVNoFsDr.js.map +0 -1
  198. package/dist/treeSync-CiU5d6rF.js.map +0 -1
  199. package/dist/useAdaptiveView-C_WvM4-P.js.map +0 -1
  200. package/dist/useChipLayout-BWZfKDgd.js +0 -51
  201. package/dist/useChipLayout-BWZfKDgd.js.map +0 -1
  202. package/dist/useInfiniteCombobox-COJTJxCZ.js.map +0 -1
  203. package/dist/useMenuInteraction-AgrXU8kv.js.map +0 -1
@@ -1,5 +1,6 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import { B as Button } from './Button-Dwh_Nd4l.js';
3
+ import { C as COMMON_PART, A as ANV_PART_ATTR } from './anvParts-BGg5dgfl.js';
3
4
 
4
5
  import './MenuFooter.css';const stack = "_stack_o8ro5_1";
5
6
  const leading = "_leading_o8ro5_26";
@@ -30,6 +31,7 @@ const ClearButton = ({
30
31
  onClick,
31
32
  disabled,
32
33
  className: fullWidth ? styles["clear-full"] : void 0,
34
+ ...{ [ANV_PART_ATTR]: COMMON_PART.clearButton },
33
35
  children: label
34
36
  }
35
37
  );
@@ -50,6 +52,7 @@ const ConfirmationRow = ({
50
52
  size: "small",
51
53
  onMouseDown: preventBlur,
52
54
  onClick: onCancel,
55
+ ...{ [ANV_PART_ATTR]: COMMON_PART.cancelButton },
53
56
  children: cancelLabel
54
57
  }
55
58
  ),
@@ -61,6 +64,7 @@ const ConfirmationRow = ({
61
64
  onMouseDown: preventBlur,
62
65
  onClick: onApply,
63
66
  disabled: applyDisabled,
67
+ ...{ [ANV_PART_ATTR]: COMMON_PART.applyButton },
64
68
  children: applyLabel
65
69
  }
66
70
  )
@@ -112,4 +116,4 @@ const MenuFooter = ({
112
116
  MenuFooter.displayName = "MenuFooter";
113
117
 
114
118
  export { MenuFooter as M };
115
- //# sourceMappingURL=MenuFooter-BXcNxNnX.js.map
119
+ //# sourceMappingURL=MenuFooter--lBF8OjJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MenuFooter--lBF8OjJ.js","sources":["../src/internal/components/MenuFooter/MenuFooter.tsx"],"sourcesContent":["import type { MouseEvent, ReactNode } from \"react\";\nimport Button from \"../../../components/Button\";\nimport styles from \"./MenuFooter.module.scss\";\nimport { ANV_PART_ATTR, COMMON_PART } from \"../../constants/anvParts\";\n\n// Safari does not focus buttons on mousedown the way Chrome / Firefox do.\n// Combined with the popover's focusout listener, that means clicking a footer\n// button can fire focusout with relatedTarget=null and close the popover\n// before the click handler runs. Preventing the default on mousedown keeps the\n// previously focused element focused, sidestepping the focusout entirely.\nconst preventBlur = (e: MouseEvent<HTMLButtonElement>) => {\n e.preventDefault();\n};\n\nexport type MenuFooterClearConfig = {\n onClick: () => void;\n label?: string;\n disabled?: boolean;\n};\n\nexport type MenuFooterConfirmationConfig = {\n onApply: () => void;\n onCancel: () => void;\n applyLabel?: string;\n cancelLabel?: string;\n applyDisabled?: boolean;\n};\n\nexport type MenuFooterProps = {\n /** Clear-selection button config. Omit to suppress. */\n clear?: MenuFooterClearConfig;\n /** Apply/Cancel pair config. Omit when not in confirmation mode. */\n confirmation?: MenuFooterConfirmationConfig;\n /**\n * Pre-rendered add-new affordance (AddNewItemButton or similar). Layout owns\n * its row vs. inline placement; the caller just provides the node.\n */\n addNew?: ReactNode;\n};\n\nconst ClearButton = ({\n onClick,\n label = \"Clear\",\n disabled,\n fullWidth,\n}: MenuFooterClearConfig & { fullWidth?: boolean }) => (\n <Button\n appearance=\"secondary\"\n size=\"small\"\n onMouseDown={preventBlur}\n onClick={onClick}\n disabled={disabled}\n className={fullWidth ? styles[\"clear-full\"] : undefined}\n {...{ [ANV_PART_ATTR]: COMMON_PART.clearButton }}\n >\n {label}\n </Button>\n);\n\n/**\n * Single justified-flex row containing the Apply/Cancel pair, with an optional\n * leading element on the opposite side.\n */\nconst ConfirmationRow = ({\n applyLabel = \"Apply\",\n cancelLabel = \"Cancel\",\n onApply,\n onCancel,\n applyDisabled,\n leading,\n}: MenuFooterConfirmationConfig & { leading?: ReactNode }) => (\n <div className={styles[\"confirmation-row\"]}>\n {leading ? <div className={styles[\"leading\"]}>{leading}</div> : null}\n <div className={styles[\"trailing\"]}>\n <Button\n appearance=\"secondary\"\n size=\"small\"\n onMouseDown={preventBlur}\n onClick={onCancel}\n {...{ [ANV_PART_ATTR]: COMMON_PART.cancelButton }}\n >\n {cancelLabel}\n </Button>\n <Button\n appearance=\"primary\"\n size=\"small\"\n onMouseDown={preventBlur}\n onClick={onApply}\n disabled={applyDisabled}\n {...{ [ANV_PART_ATTR]: COMMON_PART.applyButton }}\n >\n {applyLabel}\n </Button>\n </div>\n </div>\n);\n\n/**\n * MenuFooter composes the footer of a menu popover/dialog from up to three\n * optional pieces: a clear-selection button, an Apply/Cancel pair, and an\n * add-new affordance.\n *\n * Layout rules:\n * - clear + confirmation + addNew → [addNew full-width row] / [clear | apply cancel]\n * - clear + confirmation → [clear | apply cancel]\n * - clear + addNew → [addNew] / [clear] (stacked, both full-width)\n * - clear → [clear] (full-width)\n * - confirmation + addNew → [addNew | apply cancel] (addNew on the leading side)\n * - confirmation → [apply | cancel]\n * - addNew → [addNew]\n * - (none) → null\n */\nexport const MenuFooter = ({\n clear,\n confirmation,\n addNew,\n}: MenuFooterProps) => {\n // Branches with confirmation\n if (confirmation) {\n if (clear && addNew) {\n return (\n <div className={styles[\"stack\"]}>\n <div className={styles[\"stack-row\"]}>{addNew}</div>\n <ConfirmationRow\n {...confirmation}\n leading={<ClearButton {...clear} />}\n />\n </div>\n );\n }\n if (clear) {\n return (\n <ConfirmationRow\n {...confirmation}\n leading={<ClearButton {...clear} />}\n />\n );\n }\n return <ConfirmationRow {...confirmation} leading={addNew} />;\n }\n\n // Branches without confirmation\n if (clear && addNew) {\n return (\n <div className={styles[\"stack\"]}>\n <div className={styles[\"stack-row\"]}>{addNew}</div>\n <div className={styles[\"stack-row\"]}>\n <ClearButton {...clear} fullWidth />\n </div>\n </div>\n );\n }\n if (clear) {\n return (\n <div className={styles[\"stack-row\"]}>\n <ClearButton {...clear} fullWidth />\n </div>\n );\n }\n if (addNew) {\n return <>{addNew}</>;\n }\n return null;\n};\n\nMenuFooter.displayName = \"MenuFooter\";\n"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export { M as MultiSelectField, a as MultiSelectFieldSync } from './MultiSelectFieldSync-CpfsWecG.js';
1
+ export { M as MultiSelectField, a as MultiSelectFieldSync } from './MultiSelectFieldSync-B_vuR-ii.js';
2
2
  //# sourceMappingURL=MultiSelectField.js.map
@@ -1,7 +1,7 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { useRef, useState, useMemo, useEffect, forwardRef, useId, useCallback } from 'react';
3
3
  import { w as warnDeprecatedErrorUsage } from './utils-CM48ODEJ.js';
4
- import { a as useToggleSelection, M as MultiSelectOptions, u as useBulkActionRunner, r as resolveBulkActionCheckState, b as resolveBulkActionLabel } from './bulkActionTypes-BnZNAru6.js';
4
+ import { a as useToggleSelection, M as MultiSelectOptions, u as useBulkActionRunner, r as resolveBulkActionCheckState, b as resolveBulkActionLabel } from './bulkActionTypes-CWcUhKFS.js';
5
5
  import { c as cx } from './index-De1g9FRV.js';
6
6
  import { B as Button } from './Button-Dwh_Nd4l.js';
7
7
  import { C as Chip } from './Chip-D6Q0J0Xe.js';
@@ -9,48 +9,59 @@ import { F as Flex } from './Flex-CRF7gj0_.js';
9
9
  import { m as mergeRefs, u as useMergeRefs } 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
- import { u as useChipLayout } from './useChipLayout-BWZfKDgd.js';
12
+ import { u as useChipLayout } from './useChipLayout-BBe6Tzyl.js';
13
+ import { C as COMMON_PART, A as ANV_PART_ATTR } from './anvParts-BGg5dgfl.js';
13
14
  import { S as SelectFieldLabel } from './SelectFieldLabel-CjY6zFJA.js';
14
- import { s as styles$1 } from './SelectTriggerBase.module-Brmw1nYG.js';
15
+ import { s as styles$1 } from './SelectTriggerBase.module-mYOfdBGA.js';
15
16
  import { u as useDownshiftEnvironment, a as useCombobox, b as useSelect } from './downshift.esm-xtSnQp44.js';
16
- import { a as useProcessedOptions, b as buildSelectItems, s as shouldShowAddNewItem, A as AddNewItemButton, u as useSelectOrchestration, d as defaultSyncFilter, t as toSyncFilterFn } from './syncFilterUtils-UVNoFsDr.js';
17
- import { O as OptionsDialog, a as OptionsPopover } from './useAdaptiveView-C_WvM4-P.js';
17
+ import { a as useProcessedOptions, b as buildSelectItems, s as shouldShowAddNewItem, A as AddNewItemButton, u as useSelectOrchestration, d as defaultSyncFilter, t as toSyncFilterFn } from './syncFilterUtils-YB6gRuuR.js';
18
+ import { O as OptionsDialog, a as OptionsPopover } from './useAdaptiveView-DmhhcX-B.js';
18
19
  import { F as FieldMessage } from './FieldMessage-mTGdycSA.js';
19
20
  import { u as useDebouncedCallback } from './useDebouncedCallback-DLkapjcP.js';
20
21
  import { u as useLayoutPropsUtil } from './useLayoutPropsUtil-DjqeAJZ9.js';
21
22
  import { w as warnOnce } from './warnOnce-Y9PRHcU4.js';
22
23
 
23
- import './MultiSelectFieldSync.css';const input = "_input_184hn_26";
24
- const error = "_error_184hn_54";
25
- const disabled = "_disabled_184hn_61";
26
- const highlight = "_highlight_184hn_70";
27
- const chip = "_chip_184hn_143";
28
- const prefix = "_prefix_184hn_233";
29
- const suffix = "_suffix_184hn_234";
30
- const small = "_small_184hn_309";
31
- const large = "_large_184hn_315";
24
+ import './MultiSelectFieldSync.css';const input = "_input_14qyc_26";
25
+ const error = "_error_14qyc_55";
26
+ const disabled = "_disabled_14qyc_62";
27
+ const highlight = "_highlight_14qyc_74";
28
+ const chip = "_chip_14qyc_157";
29
+ const prefix = "_prefix_14qyc_247";
30
+ const suffix = "_suffix_14qyc_248";
31
+ const small = "_small_14qyc_323";
32
+ const large = "_large_14qyc_329";
32
33
  const styles = {
33
- "input-wrapper": "_input-wrapper_184hn_26",
34
+ "input-wrapper": "_input-wrapper_14qyc_26",
34
35
  input: input,
35
36
  error: error,
36
37
  disabled: disabled,
38
+ "is-disabled": "_is-disabled_14qyc_68",
37
39
  highlight: highlight,
38
- "input-flex": "_input-flex_184hn_74",
39
- "rows-wrapper": "_rows-wrapper_184hn_132",
40
- "chip-wrapper": "_chip-wrapper_184hn_143",
40
+ "input-flex": "_input-flex_14qyc_78",
41
+ "rows-wrapper": "_rows-wrapper_14qyc_136",
42
+ "chip-wrapper": "_chip-wrapper_14qyc_157",
41
43
  chip: chip,
42
- "buttons-wrapper": "_buttons-wrapper_184hn_155",
43
- "close-button-wrapper": "_close-button-wrapper_184hn_172",
44
- "close-button": "_close-button_184hn_172",
45
- "toggle-button-wrapper": "_toggle-button-wrapper_184hn_195",
46
- "toggle-button": "_toggle-button_184hn_195",
44
+ "buttons-wrapper": "_buttons-wrapper_14qyc_169",
45
+ "close-button-wrapper": "_close-button-wrapper_14qyc_186",
46
+ "close-button": "_close-button_14qyc_186",
47
+ "toggle-button-wrapper": "_toggle-button-wrapper_14qyc_209",
48
+ "toggle-button": "_toggle-button_14qyc_209",
47
49
  prefix: prefix,
48
50
  suffix: suffix,
49
- "no-clear-button": "_no-clear-button_184hn_301",
50
- "no-toggle-button": "_no-toggle-button_184hn_305",
51
+ "no-clear-button": "_no-clear-button_14qyc_315",
52
+ "no-toggle-button": "_no-toggle-button_14qyc_319",
51
53
  small: small,
52
54
  large: large};
53
55
 
56
+ const PARTS = {
57
+ trigger: COMMON_PART.trigger,
58
+ input: COMMON_PART.input,
59
+ chip: COMMON_PART.chip,
60
+ overflowChip: COMMON_PART.overflowChip,
61
+ clearButton: COMMON_PART.clearButton,
62
+ toggleButton: COMMON_PART.toggleButton
63
+ };
64
+
54
65
  const MultiSelectFieldInput = ({
55
66
  placeholder,
56
67
  size,
@@ -89,17 +100,24 @@ const MultiSelectFieldInput = ({
89
100
  [styles["no-clear-button"]]: disableClearButton,
90
101
  [styles["no-toggle-button"]]: disableToggleButton,
91
102
  [styles["disabled"]]: disabled || readOnly,
103
+ [styles["is-disabled"]]: disabled,
92
104
  [styles["highlight"]]: isHighlighted
93
105
  });
94
106
  const handleInputKeyDown = (e) => {
95
107
  if (e.key === "Backspace" && !inputProps?.value && selectedOptions.length > 0 && onRemoveOption && !disabled && !readOnly) {
96
- onRemoveOption(selectedOptions[selectedOptions.length - 1]);
108
+ const lastRemovable = [...selectedOptions].reverse().find((option) => !option.disabled);
109
+ if (lastRemovable) {
110
+ onRemoveOption(lastRemovable);
111
+ }
97
112
  }
98
113
  if (inputProps?.onKeyDown) {
99
114
  inputProps.onKeyDown(e);
100
115
  }
101
116
  };
102
117
  const handleWrapperClick = (e) => {
118
+ if (disabled) {
119
+ return;
120
+ }
103
121
  const target = e.target;
104
122
  if (target.closest("button") || target.tagName === "INPUT") {
105
123
  return;
@@ -115,55 +133,67 @@ const MultiSelectFieldInput = ({
115
133
  ref: inputWrapperRef,
116
134
  ...htmlInputWrapperProps,
117
135
  className: cx(inputWrapperClassNames, htmlInputWrapperProps?.className),
136
+ "aria-disabled": disabled || void 0,
118
137
  onClick: handleWrapperClick,
119
138
  children: [
120
139
  prefix ? /* @__PURE__ */ jsx("div", { className: styles["prefix"], children: prefix }) : null,
121
- /* @__PURE__ */ jsxs("div", { className: styles["rows-wrapper"], ref: rowsRef, children: [
122
- selectedOptions.length > 0 && onRemoveOption ? selectedOptions.slice(0, displayCount).map((option, index) => /* @__PURE__ */ jsx(
123
- "div",
124
- {
125
- className: styles["chip-wrapper"],
126
- children: /* @__PURE__ */ jsx(
140
+ /* @__PURE__ */ jsxs(
141
+ "div",
142
+ {
143
+ className: styles["rows-wrapper"],
144
+ ref: rowsRef,
145
+ "data-single-row": singleRow || void 0,
146
+ children: [
147
+ selectedOptions.length > 0 && onRemoveOption ? selectedOptions.slice(0, displayCount).map((option, index) => /* @__PURE__ */ jsx(
148
+ "div",
149
+ {
150
+ className: styles["chip-wrapper"],
151
+ children: /* @__PURE__ */ jsx(
152
+ Chip,
153
+ {
154
+ ...getChipProps?.(option),
155
+ ...{ [ANV_PART_ATTR]: PARTS.chip },
156
+ label: option.label,
157
+ onClose: disabled || readOnly || option.disabled ? void 0 : () => onRemoveOption(option),
158
+ className: styles["chip"],
159
+ title: option.label
160
+ }
161
+ )
162
+ },
163
+ `selected-item-${option.id}-${index}`
164
+ )) : null,
165
+ hiddenCount > 0 ? /* @__PURE__ */ jsx("div", { className: styles["chip-wrapper"], children: /* @__PURE__ */ jsx(
127
166
  Chip,
128
167
  {
129
- ...getChipProps?.(option),
130
- label: option.label,
131
- onClose: disabled || readOnly ? void 0 : () => onRemoveOption(option),
168
+ label: `+${hiddenCount}`,
132
169
  className: styles["chip"],
133
- title: option.label
170
+ title: selectedOptions.slice(displayCount).map((option) => option.label).join(", "),
171
+ ...{ [ANV_PART_ATTR]: PARTS.overflowChip }
134
172
  }
135
- )
136
- },
137
- `selected-item-${option.id}-${index}`
138
- )) : null,
139
- hiddenCount > 0 ? /* @__PURE__ */ jsx("div", { className: styles["chip-wrapper"], children: /* @__PURE__ */ jsx(
140
- Chip,
141
- {
142
- label: `+${hiddenCount}`,
143
- className: styles["chip"],
144
- title: selectedOptions.slice(displayCount).map((option) => option.label).join(", ")
145
- }
146
- ) }) : null,
147
- /* @__PURE__ */ jsxs(Flex, { className: styles["input-flex"], alignItems: "center", children: [
148
- /* @__PURE__ */ jsx(
149
- "input",
150
- {
151
- id,
152
- type: "text",
153
- placeholder,
154
- disabled,
155
- readOnly,
156
- ...inputProps,
157
- ref: mergedInputRef,
158
- onKeyDown: handleInputKeyDown,
159
- className: cx(styles["input"], inputProps?.className, {
160
- [styles["error"]]: error
161
- })
162
- }
163
- ),
164
- suffix ? /* @__PURE__ */ jsx("div", { className: styles["suffix"], children: suffix }) : null
165
- ] })
166
- ] }),
173
+ ) }) : null,
174
+ /* @__PURE__ */ jsxs(Flex, { className: styles["input-flex"], alignItems: "center", children: [
175
+ /* @__PURE__ */ jsx(
176
+ "input",
177
+ {
178
+ id,
179
+ type: "text",
180
+ placeholder,
181
+ disabled,
182
+ readOnly,
183
+ ...inputProps,
184
+ ...{ [ANV_PART_ATTR]: PARTS.input },
185
+ ref: mergedInputRef,
186
+ onKeyDown: handleInputKeyDown,
187
+ className: cx(styles["input"], inputProps?.className, {
188
+ [styles["error"]]: error
189
+ })
190
+ }
191
+ ),
192
+ suffix ? /* @__PURE__ */ jsx("div", { className: styles["suffix"], children: suffix }) : null
193
+ ] })
194
+ ]
195
+ }
196
+ ),
167
197
  /* @__PURE__ */ jsxs("div", { className: styles["buttons-wrapper"], children: [
168
198
  disableClearButton ? null : /* @__PURE__ */ jsx("div", { className: styles["close-button-wrapper"], children: /* @__PURE__ */ jsx(
169
199
  Button,
@@ -173,6 +203,7 @@ const MultiSelectFieldInput = ({
173
203
  appearance: "ghost",
174
204
  size: "small",
175
205
  className: styles["close-button"],
206
+ ...{ [ANV_PART_ATTR]: PARTS.clearButton },
176
207
  onClick: () => {
177
208
  onClear?.();
178
209
  }
@@ -185,8 +216,9 @@ const MultiSelectFieldInput = ({
185
216
  "aria-label": "toggle menu",
186
217
  appearance: "ghost",
187
218
  size: "small",
188
- disabled,
189
219
  ...toggleButtonProps,
220
+ disabled,
221
+ ...{ [ANV_PART_ATTR]: PARTS.toggleButton },
190
222
  className: cx(
191
223
  styles["toggle-button"],
192
224
  toggleButtonProps?.className
@@ -496,7 +528,8 @@ const MultiSelectFieldComboboxMode = ({
496
528
  addItemLabel,
497
529
  onAddNewItem,
498
530
  handleRemoveOption,
499
- handleClear
531
+ handleClear,
532
+ dataAttributes
500
533
  }) => {
501
534
  const listRef = useRef(null);
502
535
  const debouncedOptionLoader = useDebouncedCallback((inputValue2) => {
@@ -572,6 +605,8 @@ const MultiSelectFieldComboboxMode = ({
572
605
  return /* @__PURE__ */ jsxs(
573
606
  "div",
574
607
  {
608
+ ...dataAttributes,
609
+ "data-anv": "multi-select-field",
575
610
  className: className ? `${styles$1["search-field"]} ${className}` : styles$1["search-field"],
576
611
  style: { ...layoutStyles, ...style },
577
612
  ref: wrapperDivRef,
@@ -597,7 +632,7 @@ const MultiSelectFieldComboboxMode = ({
597
632
  disableToggleButton: false,
598
633
  placeholder,
599
634
  disableClearButton,
600
- toggleButtonProps: getToggleButtonProps(),
635
+ toggleButtonProps: getToggleButtonProps({ disabled: !!disabled }),
601
636
  onClear: handleClear,
602
637
  id: `${id}-input`,
603
638
  inputProps: getInputProps({
@@ -689,6 +724,8 @@ const MultiSelectFieldComboboxMode = ({
689
724
  return /* @__PURE__ */ jsxs(
690
725
  "div",
691
726
  {
727
+ ...dataAttributes,
728
+ "data-anv": "multi-select-field",
692
729
  className: className ? `${styles$1["search-field"]} ${className}` : styles$1["search-field"],
693
730
  style: { ...layoutStyles, ...style },
694
731
  children: [
@@ -715,7 +752,7 @@ const MultiSelectFieldComboboxMode = ({
715
752
  "aria-describedby": [hasHelperText && helperUid, moreInfo && moreInfoId].filter(Boolean).join(" ") || void 0,
716
753
  "aria-invalid": error ? true : void 0
717
754
  }),
718
- toggleButtonProps: getToggleButtonProps(),
755
+ toggleButtonProps: getToggleButtonProps({ disabled: !!disabled }),
719
756
  disableToggleButton: false,
720
757
  placeholder,
721
758
  disableClearButton,
@@ -813,63 +850,93 @@ const MultiSelectFieldTrigger = ({
813
850
  [styles["large"]]: size === "large",
814
851
  [styles["no-clear-button"]]: disableClearButton,
815
852
  [styles["disabled"]]: disabled || readOnly,
853
+ [styles["is-disabled"]]: disabled,
816
854
  [styles["highlight"]]: isHighlighted
817
855
  });
818
- return /* @__PURE__ */ jsxs("div", { style: { position: "relative" }, children: [
819
- /* @__PURE__ */ jsxs(
820
- "div",
821
- {
822
- ref: mergedRef,
823
- ...restToggleButtonProps,
824
- popoverTarget,
825
- id,
826
- className: cx(inputWrapperClassNames, restToggleButtonProps?.className),
827
- children: [
828
- prefix ? /* @__PURE__ */ jsx("div", { className: styles["prefix"], children: prefix }) : null,
829
- /* @__PURE__ */ jsxs("div", { className: styles["rows-wrapper"], ref: rowsRef, children: [
830
- selectedOptions.length > 0 && onRemoveOption ? selectedOptions.slice(0, displayCount).map((option, index) => /* @__PURE__ */ jsx(
831
- "div",
832
- {
833
- className: styles["chip-wrapper"],
834
- children: /* @__PURE__ */ jsx(
835
- Chip,
836
- {
837
- ...getChipProps?.(option),
838
- label: option.label,
839
- onClose: disabled || readOnly ? void 0 : (e) => {
840
- e.stopPropagation();
841
- onRemoveOption(option);
842
- triggerRef.current?.focus();
843
- },
844
- className: styles["chip"],
845
- title: option.label
846
- }
847
- )
848
- },
849
- `selected-item-${option.id}-${index}`
850
- )) : null,
851
- hiddenCount > 0 ? /* @__PURE__ */ jsx("div", { className: styles["chip-wrapper"], children: /* @__PURE__ */ jsx(
852
- Chip,
853
- {
854
- label: `+${hiddenCount}`,
855
- className: styles["chip"],
856
- title: selectedOptions.slice(displayCount).map((option) => option.label).join(", ")
857
- }
858
- ) }) : null,
859
- selectedOptions.length === 0 ? /* @__PURE__ */ jsxs(Flex, { className: styles["input-flex"], alignItems: "center", children: [
860
- /* @__PURE__ */ jsx(
856
+ return /* @__PURE__ */ jsxs(
857
+ "div",
858
+ {
859
+ ref: mergedRef,
860
+ ...restToggleButtonProps,
861
+ popoverTarget,
862
+ id,
863
+ "aria-disabled": disabled || void 0,
864
+ onClick: disabled ? void 0 : restToggleButtonProps.onClick,
865
+ onKeyDown: disabled ? void 0 : restToggleButtonProps.onKeyDown,
866
+ ...{ [ANV_PART_ATTR]: PARTS.trigger },
867
+ className: cx(inputWrapperClassNames, restToggleButtonProps?.className),
868
+ children: [
869
+ prefix ? /* @__PURE__ */ jsx("div", { className: styles["prefix"], children: prefix }) : null,
870
+ /* @__PURE__ */ jsxs(
871
+ "div",
872
+ {
873
+ className: styles["rows-wrapper"],
874
+ ref: rowsRef,
875
+ "data-single-row": singleRow || void 0,
876
+ children: [
877
+ selectedOptions.length > 0 && onRemoveOption ? selectedOptions.slice(0, displayCount).map((option, index) => /* @__PURE__ */ jsx(
861
878
  "div",
862
879
  {
863
- className: cx(styles["input"], {
864
- [styles["error"]]: error
865
- }),
866
- children: placeholder
880
+ className: styles["chip-wrapper"],
881
+ children: /* @__PURE__ */ jsx(
882
+ Chip,
883
+ {
884
+ ...getChipProps?.(option),
885
+ ...{ [ANV_PART_ATTR]: PARTS.chip },
886
+ label: option.label,
887
+ onClose: disabled || readOnly || option.disabled ? void 0 : (e) => {
888
+ e.stopPropagation();
889
+ onRemoveOption(option);
890
+ triggerRef.current?.focus();
891
+ },
892
+ className: styles["chip"],
893
+ title: option.label
894
+ }
895
+ )
896
+ },
897
+ `selected-item-${option.id}-${index}`
898
+ )) : null,
899
+ hiddenCount > 0 ? /* @__PURE__ */ jsx("div", { className: styles["chip-wrapper"], children: /* @__PURE__ */ jsx(
900
+ Chip,
901
+ {
902
+ label: `+${hiddenCount}`,
903
+ className: styles["chip"],
904
+ title: selectedOptions.slice(displayCount).map((option) => option.label).join(", "),
905
+ ...{ [ANV_PART_ATTR]: PARTS.overflowChip }
867
906
  }
868
- ),
869
- suffix ? /* @__PURE__ */ jsx("div", { className: styles["suffix"], children: suffix }) : null
870
- ] }) : null
871
- ] }),
872
- /* @__PURE__ */ jsx("div", { className: styles["buttons-wrapper"], children: /* @__PURE__ */ jsx("div", { className: styles["toggle-button-wrapper"], children: /* @__PURE__ */ jsx(
907
+ ) }) : null,
908
+ selectedOptions.length === 0 ? /* @__PURE__ */ jsxs(Flex, { className: styles["input-flex"], alignItems: "center", children: [
909
+ /* @__PURE__ */ jsx(
910
+ "div",
911
+ {
912
+ className: cx(styles["input"], {
913
+ [styles["error"]]: error
914
+ }),
915
+ children: placeholder
916
+ }
917
+ ),
918
+ suffix ? /* @__PURE__ */ jsx("div", { className: styles["suffix"], children: suffix }) : null
919
+ ] }) : null
920
+ ]
921
+ }
922
+ ),
923
+ /* @__PURE__ */ jsxs("div", { className: styles["buttons-wrapper"], children: [
924
+ disableClearButton ? null : /* @__PURE__ */ jsx("div", { className: styles["close-button-wrapper"], children: /* @__PURE__ */ jsx(
925
+ Button,
926
+ {
927
+ icon: SvgClose,
928
+ "aria-label": "clear selection",
929
+ appearance: "ghost",
930
+ size: "small",
931
+ className: styles["close-button"],
932
+ ...{ [ANV_PART_ATTR]: PARTS.clearButton },
933
+ onClick: (e) => {
934
+ e.stopPropagation();
935
+ onClear?.();
936
+ }
937
+ }
938
+ ) }),
939
+ /* @__PURE__ */ jsx("div", { className: styles["toggle-button-wrapper"], children: /* @__PURE__ */ jsx(
873
940
  Button,
874
941
  {
875
942
  icon: SvgChevronRight,
@@ -878,34 +945,14 @@ const MultiSelectFieldTrigger = ({
878
945
  size: "small",
879
946
  disabled,
880
947
  tabIndex: -1,
948
+ ...{ [ANV_PART_ATTR]: PARTS.toggleButton },
881
949
  className: styles["toggle-button"]
882
950
  }
883
- ) }) })
884
- ]
885
- }
886
- ),
887
- disableClearButton ? null : /* @__PURE__ */ jsx(
888
- "div",
889
- {
890
- className: styles["buttons-wrapper"],
891
- style: { insetInlineEnd: "2rem" },
892
- children: /* @__PURE__ */ jsx("div", { className: styles["close-button-wrapper"], children: /* @__PURE__ */ jsx(
893
- Button,
894
- {
895
- icon: SvgClose,
896
- "aria-label": "clear selection",
897
- appearance: "ghost",
898
- size: "small",
899
- className: styles["close-button"],
900
- onClick: (e) => {
901
- e.stopPropagation();
902
- onClear?.();
903
- }
904
- }
905
- ) })
906
- }
907
- )
908
- ] });
951
+ ) })
952
+ ] })
953
+ ]
954
+ }
955
+ );
909
956
  };
910
957
  MultiSelectFieldTrigger.displayName = "MultiSelectFieldTrigger";
911
958
 
@@ -1110,7 +1157,8 @@ const MultiSelectFieldSelectMode = ({
1110
1157
  addItemLabel,
1111
1158
  onAddNewItem,
1112
1159
  handleRemoveOption,
1113
- handleClear
1160
+ handleClear,
1161
+ dataAttributes
1114
1162
  }) => {
1115
1163
  const listRef = useRef(null);
1116
1164
  const {
@@ -1180,6 +1228,8 @@ const MultiSelectFieldSelectMode = ({
1180
1228
  return /* @__PURE__ */ jsxs(
1181
1229
  "div",
1182
1230
  {
1231
+ ...dataAttributes,
1232
+ "data-anv": "multi-select-field",
1183
1233
  className: className ? `${styles$1["search-field"]} ${className}` : styles$1["search-field"],
1184
1234
  style: { ...layoutStyles, ...style },
1185
1235
  ref: wrapperDivRef,
@@ -1271,6 +1321,8 @@ const MultiSelectFieldSelectMode = ({
1271
1321
  return /* @__PURE__ */ jsxs(
1272
1322
  "div",
1273
1323
  {
1324
+ ...dataAttributes,
1325
+ "data-anv": "multi-select-field",
1274
1326
  className: className ? `${styles$1["search-field"]} ${className}` : styles$1["search-field"],
1275
1327
  style: { ...layoutStyles, ...style },
1276
1328
  children: [
@@ -1357,6 +1409,9 @@ const MultiSelectFieldSelectMode = ({
1357
1409
 
1358
1410
  const MultiSelectField = forwardRef((propsWithLayout, ref) => {
1359
1411
  const { layoutStyles, componentProps } = useLayoutPropsUtil(propsWithLayout);
1412
+ const dataAttributes = Object.fromEntries(
1413
+ Object.entries(componentProps).filter(([key]) => key.startsWith("data-"))
1414
+ );
1360
1415
  const inputWrapperRef = useRef(null);
1361
1416
  const {
1362
1417
  id: idProp,
@@ -1435,6 +1490,10 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
1435
1490
  });
1436
1491
  const handleRemoveOption = useCallback(
1437
1492
  (option) => {
1493
+ const target = selectedOptions.find((opt) => opt.id === option.id);
1494
+ if (target?.disabled) {
1495
+ return;
1496
+ }
1438
1497
  onSelectedOptionsChange(
1439
1498
  selectedOptions.filter((opt) => opt.id !== option.id)
1440
1499
  );
@@ -1442,9 +1501,13 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
1442
1501
  [selectedOptions, onSelectedOptionsChange]
1443
1502
  );
1444
1503
  const handleClear = useCallback(() => {
1445
- onSelectedOptionsChange([]);
1446
- }, [onSelectedOptionsChange]);
1447
- const disableClearButton = selectedOptions.length === 0 || isDisabledOrReadOnly;
1504
+ const lockedOptions = selectedOptions.filter((opt) => opt.disabled);
1505
+ onSelectedOptionsChange(lockedOptions);
1506
+ }, [selectedOptions, onSelectedOptionsChange]);
1507
+ const removableSelectedCount = selectedOptions.filter(
1508
+ (opt) => !opt.disabled
1509
+ ).length;
1510
+ const disableClearButton = removableSelectedCount === 0 || isDisabledOrReadOnly;
1448
1511
  const { pending: bulkPending, runBulk } = useBulkActionRunner({
1449
1512
  setDraft: onSelectedOptionsChange
1450
1513
  });
@@ -1531,7 +1594,8 @@ const MultiSelectField = forwardRef((propsWithLayout, ref) => {
1531
1594
  addItemLabel,
1532
1595
  onAddNewItem,
1533
1596
  handleRemoveOption,
1534
- handleClear
1597
+ handleClear,
1598
+ dataAttributes
1535
1599
  };
1536
1600
  if (disableSearch) {
1537
1601
  return /* @__PURE__ */ jsx(MultiSelectFieldSelectMode, { ...baseProps });
@@ -1661,4 +1725,4 @@ const MultiSelectFieldSync = (props) => {
1661
1725
  };
1662
1726
 
1663
1727
  export { MultiSelectField as M, MultiSelectFieldSync as a };
1664
- //# sourceMappingURL=MultiSelectFieldSync-CpfsWecG.js.map
1728
+ //# sourceMappingURL=MultiSelectFieldSync-B_vuR-ii.js.map