@servicetitan/anvil2 3.9.0 → 3.10.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 (168) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/Combobox.js +1 -1
  3. package/dist/{DataTable-CRzQKN_P.js → DataTable-D-SKKt5w.js} +53 -16
  4. package/dist/DataTable-D-SKKt5w.js.map +1 -0
  5. package/dist/{DateFieldRange-CHbrYgsD.js → DateFieldRange-DUFfyknZ.js} +51 -31
  6. package/dist/DateFieldRange-DUFfyknZ.js.map +1 -0
  7. package/dist/DateFieldRange.js +1 -1
  8. package/dist/{DateFieldSingle-D-KZ3NL0.js → DateFieldSingle-BZjlO0hX.js} +49 -28
  9. package/dist/DateFieldSingle-BZjlO0hX.js.map +1 -0
  10. package/dist/DateFieldSingle.js +1 -1
  11. package/dist/{DateFieldYearless-DouEX24o.js → DateFieldYearless-TcKb9jE2.js} +4 -2
  12. package/dist/DateFieldYearless-TcKb9jE2.js.map +1 -0
  13. package/dist/DateFieldYearless.js +1 -1
  14. package/dist/{DateFieldYearlessRange-B_bImgyn.js → DateFieldYearlessRange-D9XtRNWi.js} +16 -4
  15. package/dist/DateFieldYearlessRange-D9XtRNWi.js.map +1 -0
  16. package/dist/DateFieldYearlessRange.js +1 -1
  17. package/dist/DrillDown.js +1 -1
  18. package/dist/{FilterBar-CBTAkEri.js → FilterBar-luqnJzAK.js} +27 -6
  19. package/dist/FilterBar-luqnJzAK.js.map +1 -0
  20. package/dist/FilterBar.js +1 -1
  21. package/dist/{MenuFooter-BXcNxNnX.js → MenuFooter--lBF8OjJ.js} +5 -1
  22. package/dist/MenuFooter--lBF8OjJ.js.map +1 -0
  23. package/dist/MultiSelectField.js +1 -1
  24. package/dist/{MultiSelectFieldSync-CpfsWecG.js → MultiSelectFieldSync-HhFKGtQM.js} +60 -15
  25. package/dist/MultiSelectFieldSync-HhFKGtQM.js.map +1 -0
  26. package/dist/MultiSelectMenu.js +1 -1
  27. package/dist/{MultiSelectMenuSync-CtyLYyDE.js → MultiSelectMenuSync-C3Y7jnJQ.js} +22 -8
  28. package/dist/MultiSelectMenuSync-C3Y7jnJQ.js.map +1 -0
  29. package/dist/{Page-B6E3Gbji.js → Page-Pk0-Sxf_.js} +11 -10
  30. package/dist/Page-Pk0-Sxf_.js.map +1 -0
  31. package/dist/Page.js +1 -1
  32. package/dist/{Pagination-DF7iMeJe.js → Pagination-Bx_u6Uea.js} +32 -6
  33. package/dist/Pagination-Bx_u6Uea.js.map +1 -0
  34. package/dist/Pagination.js +1 -1
  35. package/dist/{RichTextEditor-CLo8yoUP.js → RichTextEditor-CTIGe6xA.js} +3 -3
  36. package/dist/{RichTextEditor-CLo8yoUP.js.map → RichTextEditor-CTIGe6xA.js.map} +1 -1
  37. package/dist/RichTextEditor.js +1 -1
  38. package/dist/{SavedFiltersButton-FcYVncxU.js → SavedFiltersButton-CpnoAIrw.js} +250 -164
  39. package/dist/SavedFiltersButton-CpnoAIrw.js.map +1 -0
  40. package/dist/SavedFiltersButton.js +1 -1
  41. package/dist/SelectField.js +1 -1
  42. package/dist/{SelectFieldSync-Bi8HsMYP.js → SelectFieldSync-Dyug8Fgk.js} +35 -7
  43. package/dist/SelectFieldSync-Dyug8Fgk.js.map +1 -0
  44. package/dist/SelectMenu.js +1 -1
  45. package/dist/{SelectMenuSync-DKg4g5nN.js → SelectMenuSync-BkC0FD5P.js} +22 -8
  46. package/dist/SelectMenuSync-BkC0FD5P.js.map +1 -0
  47. package/dist/{SelectOptions-DszNAjxB.js → SelectOptions-B3Vmtb_k.js} +2 -2
  48. package/dist/{SelectOptions-DszNAjxB.js.map → SelectOptions-B3Vmtb_k.js.map} +1 -1
  49. package/dist/{SelectTrigger-DNIc5ttg.js → SelectTrigger-Do1puyA_.js} +2 -2
  50. package/dist/{SelectTrigger-DNIc5ttg.js.map → SelectTrigger-Do1puyA_.js.map} +1 -1
  51. package/dist/SelectTrigger.js +1 -1
  52. package/dist/{SelectTriggerBase-1Cc6EUBw.js → SelectTriggerBase-rxHXMSb4.js} +3 -1
  53. package/dist/SelectTriggerBase-rxHXMSb4.js.map +1 -0
  54. package/dist/Table.js +1 -1
  55. package/dist/{Toolbar-2VQIjU5b.js → Toolbar-BOgHhw7K.js} +12 -3
  56. package/dist/Toolbar-BOgHhw7K.js.map +1 -0
  57. package/dist/{Toolbar-BbImThIu.js → Toolbar-DDWUuQm_.js} +24 -2
  58. package/dist/Toolbar-DDWUuQm_.js.map +1 -0
  59. package/dist/Toolbar.js +2 -2
  60. package/dist/{ToolbarButtonToggle-Bc0XvCM9.js → ToolbarButtonToggle-BbtKfezH.js} +18 -2
  61. package/dist/ToolbarButtonToggle-BbtKfezH.js.map +1 -0
  62. package/dist/TreeSelectField.js +1 -1
  63. package/dist/{TreeSelectFieldSync-DUHVmOQa.js → TreeSelectFieldSync-Cd87uR6b.js} +35 -12
  64. package/dist/TreeSelectFieldSync-Cd87uR6b.js.map +1 -0
  65. package/dist/TreeSelectMenu.js +1 -1
  66. package/dist/{TreeSelectMenuSync-DVoYUG7F.js → TreeSelectMenuSync-88q0ydo5.js} +18 -6
  67. package/dist/TreeSelectMenuSync-88q0ydo5.js.map +1 -0
  68. package/dist/{YearlessDateInputWithPicker-CM9mmz8s.js → YearlessDateInputWithPicker-BquY4bCd.js} +19 -5
  69. package/dist/YearlessDateInputWithPicker-BquY4bCd.js.map +1 -0
  70. package/dist/anvParts-BGg5dgfl.js +43 -0
  71. package/dist/anvParts-BGg5dgfl.js.map +1 -0
  72. package/dist/beta.js +13 -13
  73. package/dist/{bulkActionTypes-BnZNAru6.js → bulkActionTypes-CWcUhKFS.js} +2 -2
  74. package/dist/{bulkActionTypes-BnZNAru6.js.map → bulkActionTypes-CWcUhKFS.js.map} +1 -1
  75. package/dist/{filter-state-XmqhkURU.js → filter-state-BQOX7_rO.js} +152 -80
  76. package/dist/filter-state-BQOX7_rO.js.map +1 -0
  77. package/dist/{index-BwNeldDw.js → index-DjirBR0l.js} +2 -2
  78. package/dist/{index-BwNeldDw.js.map → index-DjirBR0l.js.map} +1 -1
  79. package/dist/index.js +14 -14
  80. package/dist/src/beta/components/FilterBar/FilterBar.d.ts +3 -3
  81. package/dist/src/beta/components/FilterBar/internal/utils/dateListLibraryOptions.d.ts +17 -3
  82. package/dist/src/beta/components/FilterBar/parts.d.ts +38 -0
  83. package/dist/src/beta/components/SavedFiltersButton/parts.d.ts +37 -0
  84. package/dist/src/beta/components/SavedFiltersButton/types.d.ts +2 -1
  85. package/dist/src/beta/components/Table/DataTable/DataTable.d.ts +3 -2
  86. package/dist/src/beta/components/Table/DataTable/parts.d.ts +30 -0
  87. package/dist/src/beta/components/Table/internal/ResizeHandle.d.ts +3 -2
  88. package/dist/src/beta/components/Toolbar/Toolbar.d.ts +4 -4
  89. package/dist/src/beta/components/Toolbar/parts.d.ts +19 -0
  90. package/dist/src/beta/components/TreeSelectField/TreeSelectField.d.ts +6 -5
  91. package/dist/src/beta/components/TreeSelectField/parts.d.ts +23 -0
  92. package/dist/src/beta/components/TreeSelectField/types.d.ts +11 -4
  93. package/dist/src/beta/components/TreeSelectMenu/TreeSelectMenu.d.ts +33 -2
  94. package/dist/src/beta/components/TreeSelectMenu/parts.d.ts +12 -0
  95. package/dist/src/beta/components/TreeSelectMenu/types.d.ts +3 -2
  96. package/dist/src/components/Combobox/ComboboxTypes.d.ts +2 -2
  97. package/dist/src/components/Combobox/parts.d.ts +19 -0
  98. package/dist/src/components/DateFieldRange/DateFieldRange.d.ts +2 -2
  99. package/dist/src/components/DateFieldRange/parts.d.ts +16 -0
  100. package/dist/src/components/DateFieldSingle/DateFieldSingle.d.ts +2 -2
  101. package/dist/src/components/DateFieldSingle/parts.d.ts +16 -0
  102. package/dist/src/components/DateFieldYearless/DateFieldYearless.d.ts +2 -2
  103. package/dist/src/components/DateFieldYearless/parts.d.ts +15 -0
  104. package/dist/src/components/DateFieldYearlessRange/DateFieldYearlessRange.d.ts +2 -2
  105. package/dist/src/components/DateFieldYearlessRange/parts.d.ts +12 -0
  106. package/dist/src/components/DrillDown/DrillDown.d.ts +11 -0
  107. package/dist/src/components/MultiSelectField/internal/MultiSelectFieldComboboxMode.d.ts +1 -1
  108. package/dist/src/components/MultiSelectField/internal/MultiSelectFieldSelectMode.d.ts +1 -1
  109. package/dist/src/components/MultiSelectField/internal/types.d.ts +3 -1
  110. package/dist/src/components/MultiSelectField/parts.d.ts +20 -0
  111. package/dist/src/components/MultiSelectField/types.d.ts +2 -2
  112. package/dist/src/components/MultiSelectMenu/parts.d.ts +12 -0
  113. package/dist/src/components/MultiSelectMenu/types.d.ts +3 -2
  114. package/dist/src/components/Pagination/Pagination.d.ts +4 -3
  115. package/dist/src/components/Pagination/parts.d.ts +28 -0
  116. package/dist/src/components/SelectField/internal/SelectFieldComboboxMode.d.ts +1 -1
  117. package/dist/src/components/SelectField/internal/SelectFieldSelectMode.d.ts +1 -1
  118. package/dist/src/components/SelectField/parts.d.ts +18 -0
  119. package/dist/src/components/SelectField/types.d.ts +7 -2
  120. package/dist/src/components/SelectMenu/internal/useMenuInteraction.d.ts +8 -6
  121. package/dist/src/components/SelectMenu/parts.d.ts +12 -0
  122. package/dist/src/components/SelectMenu/types.d.ts +3 -2
  123. package/dist/src/components/SelectTrigger/internal/SelectTriggerBase.d.ts +6 -5
  124. package/dist/src/components/Toolbar/Toolbar.d.ts +3 -3
  125. package/dist/src/components/Toolbar/parts.d.ts +18 -0
  126. package/dist/src/internal/constants/anvParts.d.ts +81 -0
  127. package/dist/src/internal/testing/anvPartsContract.d.ts +24 -0
  128. package/dist/src/internal/types/selectFieldInternalTypes.d.ts +3 -1
  129. package/dist/{syncFilterUtils-UVNoFsDr.js → syncFilterUtils-YB6gRuuR.js} +11 -4
  130. package/dist/syncFilterUtils-YB6gRuuR.js.map +1 -0
  131. package/dist/{treeSync-CiU5d6rF.js → treeSync-DOen59wP.js} +24 -4
  132. package/dist/treeSync-DOen59wP.js.map +1 -0
  133. package/dist/{useAdaptiveView-C_WvM4-P.js → useAdaptiveView-DmhhcX-B.js} +3 -1
  134. package/dist/useAdaptiveView-DmhhcX-B.js.map +1 -0
  135. package/dist/{useDrilldown-D7DKSs7E.js → useDrilldown-UAm0-l1l.js} +10 -3
  136. package/dist/{useDrilldown-D7DKSs7E.js.map → useDrilldown-UAm0-l1l.js.map} +1 -1
  137. package/dist/{useInfiniteCombobox-COJTJxCZ.js → useInfiniteCombobox-V94SoOiU.js} +70 -23
  138. package/dist/useInfiniteCombobox-V94SoOiU.js.map +1 -0
  139. package/dist/{useMenuInteraction-AgrXU8kv.js → useMenuInteraction-nNF1dsrp.js} +7 -4
  140. package/dist/useMenuInteraction-nNF1dsrp.js.map +1 -0
  141. package/package.json +7 -5
  142. package/dist/DataTable-CRzQKN_P.js.map +0 -1
  143. package/dist/DateFieldRange-CHbrYgsD.js.map +0 -1
  144. package/dist/DateFieldSingle-D-KZ3NL0.js.map +0 -1
  145. package/dist/DateFieldYearless-DouEX24o.js.map +0 -1
  146. package/dist/DateFieldYearlessRange-B_bImgyn.js.map +0 -1
  147. package/dist/FilterBar-CBTAkEri.js.map +0 -1
  148. package/dist/MenuFooter-BXcNxNnX.js.map +0 -1
  149. package/dist/MultiSelectFieldSync-CpfsWecG.js.map +0 -1
  150. package/dist/MultiSelectMenuSync-CtyLYyDE.js.map +0 -1
  151. package/dist/Page-B6E3Gbji.js.map +0 -1
  152. package/dist/Pagination-DF7iMeJe.js.map +0 -1
  153. package/dist/SavedFiltersButton-FcYVncxU.js.map +0 -1
  154. package/dist/SelectFieldSync-Bi8HsMYP.js.map +0 -1
  155. package/dist/SelectMenuSync-DKg4g5nN.js.map +0 -1
  156. package/dist/SelectTriggerBase-1Cc6EUBw.js.map +0 -1
  157. package/dist/Toolbar-2VQIjU5b.js.map +0 -1
  158. package/dist/Toolbar-BbImThIu.js.map +0 -1
  159. package/dist/ToolbarButtonToggle-Bc0XvCM9.js.map +0 -1
  160. package/dist/TreeSelectFieldSync-DUHVmOQa.js.map +0 -1
  161. package/dist/TreeSelectMenuSync-DVoYUG7F.js.map +0 -1
  162. package/dist/YearlessDateInputWithPicker-CM9mmz8s.js.map +0 -1
  163. package/dist/filter-state-XmqhkURU.js.map +0 -1
  164. package/dist/syncFilterUtils-UVNoFsDr.js.map +0 -1
  165. package/dist/treeSync-CiU5d6rF.js.map +0 -1
  166. package/dist/useAdaptiveView-C_WvM4-P.js.map +0 -1
  167. package/dist/useInfiniteCombobox-COJTJxCZ.js.map +0 -1
  168. package/dist/useMenuInteraction-AgrXU8kv.js.map +0 -1
@@ -1,2 +1,2 @@
1
- export { R as RichTextEditor } from './RichTextEditor-CLo8yoUP.js';
1
+ export { R as RichTextEditor } from './RichTextEditor-CTIGe6xA.js';
2
2
  //# sourceMappingURL=RichTextEditor.js.map
@@ -5,16 +5,17 @@ import { S as SvgEdit } from './edit-DQOiktcu.js';
5
5
  import { B as Button } from './Button-Dwh_Nd4l.js';
6
6
  import { T as Text } from './Text-CIoD_RK4.js';
7
7
  import { F as Flex } from './Flex-CRF7gj0_.js';
8
- import { a as OptionsPopover } from './useAdaptiveView-C_WvM4-P.js';
9
- import { O as OptionsPanel } from './syncFilterUtils-UVNoFsDr.js';
10
- import { u as useMenuInteraction } from './useMenuInteraction-AgrXU8kv.js';
11
- import { c as cloneFiltersWithItemRefs, u as updateSingleFilter, b as getAdapter, D as DateListDialog, e as FilterTriggerButton } from './filter-state-XmqhkURU.js';
8
+ import { a as OptionsPopover } from './useAdaptiveView-DmhhcX-B.js';
9
+ import { O as OptionsPanel } from './syncFilterUtils-YB6gRuuR.js';
10
+ import { C as COMMON_PART, A as ANV_PART_ATTR } from './anvParts-BGg5dgfl.js';
11
+ import { u as useMenuInteraction } from './useMenuInteraction-nNF1dsrp.js';
12
+ import { c as cloneFiltersWithItemRefs, u as updateSingleFilter, b as getAdapter, D as DateListDialog, e as FilterTriggerButton } from './filter-state-BQOX7_rO.js';
12
13
  import { D as Drawer } from './Drawer-h2Mut1lB.js';
13
14
  import { T as TextField } from './TextField-D3sRS5q1.js';
14
15
  import { A as Alert } from './Alert-DtM7NDN9.js';
15
16
  import { D as Divider } from './Divider-C7fp5Xb6.js';
16
17
  import { DndSort } from './DndSort.js';
17
- import { u as useDrillDown, D as DrillDown } from './useDrilldown-D7DKSs7E.js';
18
+ import { u as useDrillDown, D as DrillDown } from './useDrilldown-UAm0-l1l.js';
18
19
 
19
20
  import './SavedFiltersButton.css';const footer = "_footer_1cnkf_7";
20
21
  const styles = {
@@ -22,6 +23,35 @@ const styles = {
22
23
  footer: footer
23
24
  };
24
25
 
26
+ const PARTS = {
27
+ // Common roles (shared values)
28
+ input: COMMON_PART.input,
29
+ cancelButton: COMMON_PART.cancelButton,
30
+ applyButton: COMMON_PART.applyButton,
31
+ // SavedFiltersButton-specific roles
32
+ /** Popover footer CTA that opens the Save Current Filter drawer. */
33
+ saveCurrentButton: "save-current-button",
34
+ /** Popover footer CTA that opens the Edit Saved Filters drawer. */
35
+ manageButton: "manage-button",
36
+ /** Save Current Filter drawer shell. */
37
+ addDrawer: "add-drawer",
38
+ /** Edit Saved Filters drawer shell. */
39
+ editDrawer: "edit-drawer",
40
+ /**
41
+ * Per-preset edit drilldown screen inside the Edit drawer (visible after
42
+ * clicking an edit-row-button).
43
+ */
44
+ drilldown: "drilldown",
45
+ /** Per-preset Edit affordance in the Edit drawer list (use with `data-id`). */
46
+ editRowButton: "edit-row-button",
47
+ /** Drilldown Delete Filter action. */
48
+ deleteButton: "delete-button",
49
+ /** Drilldown Update Filter action. */
50
+ updateButton: "update-button",
51
+ /** Edit drawer list-view Close action. */
52
+ closeButton: "close-button"
53
+ };
54
+
25
55
  const AddSavedFilterDrawer = ({
26
56
  open,
27
57
  onClose,
@@ -63,40 +93,58 @@ const AddSavedFilterDrawer = ({
63
93
  if (submitting) return;
64
94
  onClose();
65
95
  };
66
- return /* @__PURE__ */ jsxs(Drawer, { open, onClose: handleCancel, children: [
67
- /* @__PURE__ */ jsx(Drawer.Header, { children: "Save Current Filter" }),
68
- /* @__PURE__ */ jsx(Drawer.Content, { children: /* @__PURE__ */ jsx(Flex, { direction: "column", gap: "4", grow: 1, children: /* @__PURE__ */ jsx(
69
- TextField,
70
- {
71
- label: "Filter Name",
72
- placeholder: "Name this filter",
73
- value: name,
74
- onChange: (e) => setName(e?.target.value ?? ""),
75
- disabled: submitting,
76
- required: true,
77
- error: submitError ?? validationError,
78
- onKeyDown: (e) => {
79
- if (e.key === "Enter" && canSubmit) {
80
- e.preventDefault();
81
- handleAdd();
96
+ return /* @__PURE__ */ jsxs(
97
+ Drawer,
98
+ {
99
+ open,
100
+ onClose: handleCancel,
101
+ ...{ [ANV_PART_ATTR]: PARTS.addDrawer },
102
+ children: [
103
+ /* @__PURE__ */ jsx(Drawer.Header, { children: "Save Current Filter" }),
104
+ /* @__PURE__ */ jsx(Drawer.Content, { children: /* @__PURE__ */ jsx(Flex, { direction: "column", gap: "4", grow: 1, children: /* @__PURE__ */ jsx(
105
+ TextField,
106
+ {
107
+ label: "Filter Name",
108
+ placeholder: "Name this filter",
109
+ value: name,
110
+ onChange: (e) => setName(e?.target.value ?? ""),
111
+ disabled: submitting,
112
+ required: true,
113
+ error: submitError ?? validationError,
114
+ onKeyDown: (e) => {
115
+ if (e.key === "Enter" && canSubmit) {
116
+ e.preventDefault();
117
+ handleAdd();
118
+ }
119
+ },
120
+ ...{ [ANV_PART_ATTR]: PARTS.input }
82
121
  }
83
- }
84
- }
85
- ) }) }),
86
- /* @__PURE__ */ jsx(Drawer.Footer, { children: /* @__PURE__ */ jsxs(Flex, { justifyContent: "flex-end", gap: "3", grow: 1, children: [
87
- /* @__PURE__ */ jsx(Button, { onClick: handleCancel, disabled: submitting, children: "Cancel" }),
88
- /* @__PURE__ */ jsx(
89
- Button,
90
- {
91
- appearance: "primary",
92
- onClick: handleAdd,
93
- disabled: !canSubmit,
94
- loading: submitting,
95
- children: "Add Saved Filter"
96
- }
97
- )
98
- ] }) })
99
- ] });
122
+ ) }) }),
123
+ /* @__PURE__ */ jsx(Drawer.Footer, { children: /* @__PURE__ */ jsxs(Flex, { justifyContent: "flex-end", gap: "3", grow: 1, children: [
124
+ /* @__PURE__ */ jsx(
125
+ Button,
126
+ {
127
+ onClick: handleCancel,
128
+ disabled: submitting,
129
+ ...{ [ANV_PART_ATTR]: PARTS.cancelButton },
130
+ children: "Cancel"
131
+ }
132
+ ),
133
+ /* @__PURE__ */ jsx(
134
+ Button,
135
+ {
136
+ appearance: "primary",
137
+ onClick: handleAdd,
138
+ disabled: !canSubmit,
139
+ loading: submitting,
140
+ ...{ [ANV_PART_ATTR]: PARTS.applyButton },
141
+ children: "Add Saved Filter"
142
+ }
143
+ )
144
+ ] }) })
145
+ ]
146
+ }
147
+ );
100
148
  };
101
149
 
102
150
  const DEFAULT_ALERT_TEXT = {
@@ -298,142 +346,174 @@ const EditSavedFiltersDrawer = ({
298
346
  const dateListDialogInitialValue = dateListDialogSelected && dateListDialogSelected.id === dateListDialogState?.libraryId && dateListDialogSelected.value !== null ? dateListDialogSelected.value : void 0;
299
347
  const drilldownTitle = drilldownTarget?.name ?? "Edit Saved Filter";
300
348
  return /* @__PURE__ */ jsxs(Fragment, { children: [
301
- /* @__PURE__ */ jsxs(Drawer, { open, onClose, ...drillDownProps, children: [
302
- /* @__PURE__ */ jsx(Drawer.Header, { children: "Edit Saved Filters" }),
303
- /* @__PURE__ */ jsx(Drawer.Content, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "4", grow: 1, children: [
304
- listAlert && /* @__PURE__ */ jsx(Alert, { title: listAlert.title, status: listAlert.status }),
305
- savedFilters.length === 0 ? /* @__PURE__ */ jsx(Text, { subdued: true, size: "small", children: "No saved filters to edit." }) : onReorder ? /* @__PURE__ */ jsx(DndSort, { onDrop: handleDrop, children: /* @__PURE__ */ jsx(
306
- DndSort.Zone,
307
- {
308
- sortable: true,
309
- id: "saved-filters-zone",
310
- label: "Saved filters",
311
- orientation: "vertical",
312
- sortedIds,
313
- gap: "2",
314
- children: savedFilters.map((saved) => /* @__PURE__ */ jsx(
315
- DndSort.Card,
349
+ /* @__PURE__ */ jsxs(
350
+ Drawer,
351
+ {
352
+ open,
353
+ onClose,
354
+ ...drillDownProps,
355
+ ...{ [ANV_PART_ATTR]: PARTS.editDrawer },
356
+ children: [
357
+ /* @__PURE__ */ jsx(Drawer.Header, { children: "Edit Saved Filters" }),
358
+ /* @__PURE__ */ jsx(Drawer.Content, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "4", grow: 1, children: [
359
+ listAlert && /* @__PURE__ */ jsx(Alert, { title: listAlert.title, status: listAlert.status }),
360
+ savedFilters.length === 0 ? /* @__PURE__ */ jsx(Text, { subdued: true, size: "small", children: "No saved filters to edit." }) : onReorder ? /* @__PURE__ */ jsx(DndSort, { onDrop: handleDrop, children: /* @__PURE__ */ jsx(
361
+ DndSort.Zone,
316
362
  {
317
- id: saved.id,
318
- label: saved.name,
319
- dragOnlyWithHandle: true,
320
- children: /* @__PURE__ */ jsxs(
363
+ sortable: true,
364
+ id: "saved-filters-zone",
365
+ label: "Saved filters",
366
+ orientation: "vertical",
367
+ sortedIds,
368
+ gap: "2",
369
+ children: savedFilters.map((saved) => /* @__PURE__ */ jsx(
370
+ DndSort.Card,
371
+ {
372
+ id: saved.id,
373
+ label: saved.name,
374
+ dragOnlyWithHandle: true,
375
+ children: /* @__PURE__ */ jsxs(
376
+ Flex,
377
+ {
378
+ alignItems: "center",
379
+ justifyContent: "space-between",
380
+ gap: "2",
381
+ grow: 1,
382
+ children: [
383
+ /* @__PURE__ */ jsx(Text, { children: saved.name }),
384
+ !saved.disableEdit && /* @__PURE__ */ jsx(
385
+ Button,
386
+ {
387
+ appearance: "secondary",
388
+ size: "small",
389
+ icon: SvgEdit,
390
+ "aria-label": `Edit ${saved.name}`,
391
+ "data-id": saved.id,
392
+ onClick: () => handleEdit(saved.id),
393
+ ...{ [ANV_PART_ATTR]: PARTS.editRowButton }
394
+ }
395
+ )
396
+ ]
397
+ }
398
+ )
399
+ },
400
+ saved.id
401
+ ))
402
+ }
403
+ ) }) : /* @__PURE__ */ jsx(Flex, { direction: "column", gap: "2", children: savedFilters.map((saved) => /* @__PURE__ */ jsxs(
404
+ Flex,
405
+ {
406
+ alignItems: "center",
407
+ justifyContent: "space-between",
408
+ gap: "2",
409
+ children: [
410
+ /* @__PURE__ */ jsx(Text, { children: saved.name }),
411
+ !saved.disableEdit && /* @__PURE__ */ jsx(
412
+ Button,
413
+ {
414
+ appearance: "secondary",
415
+ size: "small",
416
+ icon: SvgEdit,
417
+ "aria-label": `Edit ${saved.name}`,
418
+ "data-id": saved.id,
419
+ onClick: () => handleEdit(saved.id),
420
+ ...{ [ANV_PART_ATTR]: PARTS.editRowButton }
421
+ }
422
+ )
423
+ ]
424
+ },
425
+ saved.id
426
+ )) })
427
+ ] }) }),
428
+ /* @__PURE__ */ jsx(Drawer.Footer, { children: /* @__PURE__ */ jsx(Flex, { justifyContent: "flex-end", grow: 1, children: /* @__PURE__ */ jsx(
429
+ Button,
430
+ {
431
+ onClick: onClose,
432
+ ...{ [ANV_PART_ATTR]: PARTS.closeButton },
433
+ children: "Close"
434
+ }
435
+ ) }) }),
436
+ /* @__PURE__ */ jsxs(
437
+ DrillDown,
438
+ {
439
+ index: EDIT_INDEX,
440
+ interactive: dateListDialogState === null,
441
+ ...{ [ANV_PART_ATTR]: PARTS.drilldown },
442
+ children: [
443
+ /* @__PURE__ */ jsx(DrillDown.Header, { children: drilldownTitle }),
444
+ /* @__PURE__ */ jsx(DrillDown.Content, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "4", grow: 1, children: [
445
+ drilldownAlert && /* @__PURE__ */ jsx(
446
+ Alert,
447
+ {
448
+ title: drilldownAlert.title,
449
+ status: drilldownAlert.status
450
+ }
451
+ ),
452
+ /* @__PURE__ */ jsx(
453
+ TextField,
454
+ {
455
+ label: "Filter Name",
456
+ placeholder: "Name this filter",
457
+ value: drilldownName,
458
+ onChange: (e) => setDrilldownName(e?.target.value ?? ""),
459
+ disabled: submitting !== null,
460
+ required: true,
461
+ error: submitError ?? validationError,
462
+ ...{ [ANV_PART_ATTR]: PARTS.input }
463
+ }
464
+ ),
465
+ /* @__PURE__ */ jsx(Divider, {}),
466
+ drilldownForm
467
+ ] }) }),
468
+ /* @__PURE__ */ jsx(DrillDown.Footer, { children: /* @__PURE__ */ jsxs(
321
469
  Flex,
322
470
  {
323
- alignItems: "center",
324
- justifyContent: "space-between",
325
- gap: "2",
471
+ justifyContent: drilldownTarget?.disableDelete ? "flex-end" : "space-between",
472
+ gap: "3",
326
473
  grow: 1,
327
474
  children: [
328
- /* @__PURE__ */ jsx(Text, { children: saved.name }),
329
- !saved.disableEdit && /* @__PURE__ */ jsx(
475
+ !drilldownTarget?.disableDelete && /* @__PURE__ */ jsx(
330
476
  Button,
331
477
  {
332
- appearance: "secondary",
333
- size: "small",
334
- icon: SvgEdit,
335
- "aria-label": `Edit ${saved.name}`,
336
- onClick: () => handleEdit(saved.id)
478
+ appearance: "danger-secondary",
479
+ onClick: handleDelete,
480
+ loading: submitting === "delete",
481
+ disabled: submitting !== null,
482
+ ...{ [ANV_PART_ATTR]: PARTS.deleteButton },
483
+ children: "Delete Filter"
337
484
  }
338
- )
485
+ ),
486
+ /* @__PURE__ */ jsxs(Flex, { gap: "3", children: [
487
+ /* @__PURE__ */ jsx(
488
+ Button,
489
+ {
490
+ onClick: handleBackToList,
491
+ disabled: submitting !== null,
492
+ ...{ [ANV_PART_ATTR]: PARTS.cancelButton },
493
+ children: "Cancel"
494
+ }
495
+ ),
496
+ /* @__PURE__ */ jsx(
497
+ Button,
498
+ {
499
+ appearance: "primary",
500
+ onClick: handleUpdate,
501
+ disabled: !canSubmit,
502
+ loading: submitting === "update",
503
+ ...{ [ANV_PART_ATTR]: PARTS.updateButton },
504
+ children: "Update Filter"
505
+ }
506
+ )
507
+ ] })
339
508
  ]
340
509
  }
341
- )
342
- },
343
- saved.id
344
- ))
345
- }
346
- ) }) : /* @__PURE__ */ jsx(Flex, { direction: "column", gap: "2", children: savedFilters.map((saved) => /* @__PURE__ */ jsxs(
347
- Flex,
348
- {
349
- alignItems: "center",
350
- justifyContent: "space-between",
351
- gap: "2",
352
- children: [
353
- /* @__PURE__ */ jsx(Text, { children: saved.name }),
354
- !saved.disableEdit && /* @__PURE__ */ jsx(
355
- Button,
356
- {
357
- appearance: "secondary",
358
- size: "small",
359
- icon: SvgEdit,
360
- "aria-label": `Edit ${saved.name}`,
361
- onClick: () => handleEdit(saved.id)
362
- }
363
- )
364
- ]
365
- },
366
- saved.id
367
- )) })
368
- ] }) }),
369
- /* @__PURE__ */ jsx(Drawer.Footer, { children: /* @__PURE__ */ jsx(Flex, { justifyContent: "flex-end", grow: 1, children: /* @__PURE__ */ jsx(Button, { onClick: onClose, children: "Close" }) }) }),
370
- /* @__PURE__ */ jsxs(DrillDown, { index: EDIT_INDEX, children: [
371
- /* @__PURE__ */ jsx(DrillDown.Header, { children: drilldownTitle }),
372
- /* @__PURE__ */ jsx(DrillDown.Content, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "4", grow: 1, children: [
373
- drilldownAlert && /* @__PURE__ */ jsx(
374
- Alert,
375
- {
376
- title: drilldownAlert.title,
377
- status: drilldownAlert.status
378
- }
379
- ),
380
- /* @__PURE__ */ jsx(
381
- TextField,
382
- {
383
- label: "Filter Name",
384
- placeholder: "Name this filter",
385
- value: drilldownName,
386
- onChange: (e) => setDrilldownName(e?.target.value ?? ""),
387
- disabled: submitting !== null,
388
- required: true,
389
- error: submitError ?? validationError
510
+ ) })
511
+ ]
390
512
  }
391
- ),
392
- /* @__PURE__ */ jsx(Divider, {}),
393
- drilldownForm
394
- ] }) }),
395
- /* @__PURE__ */ jsx(DrillDown.Footer, { children: /* @__PURE__ */ jsxs(
396
- Flex,
397
- {
398
- justifyContent: drilldownTarget?.disableDelete ? "flex-end" : "space-between",
399
- gap: "3",
400
- grow: 1,
401
- children: [
402
- !drilldownTarget?.disableDelete && /* @__PURE__ */ jsx(
403
- Button,
404
- {
405
- appearance: "danger-secondary",
406
- onClick: handleDelete,
407
- loading: submitting === "delete",
408
- disabled: submitting !== null,
409
- children: "Delete Filter"
410
- }
411
- ),
412
- /* @__PURE__ */ jsxs(Flex, { gap: "3", children: [
413
- /* @__PURE__ */ jsx(
414
- Button,
415
- {
416
- onClick: handleBackToList,
417
- disabled: submitting !== null,
418
- children: "Cancel"
419
- }
420
- ),
421
- /* @__PURE__ */ jsx(
422
- Button,
423
- {
424
- appearance: "primary",
425
- onClick: handleUpdate,
426
- disabled: !canSubmit,
427
- loading: submitting === "update",
428
- children: "Update Filter"
429
- }
430
- )
431
- ] })
432
- ]
433
- }
434
- ) })
435
- ] })
436
- ] }),
513
+ )
514
+ ]
515
+ }
516
+ ),
437
517
  /* @__PURE__ */ jsx(
438
518
  DateListDialog,
439
519
  {
@@ -455,6 +535,9 @@ const EditSavedFiltersDrawer = ({
455
535
  };
456
536
 
457
537
  const SavedFiltersButton = (props) => {
538
+ const dataAttributes = Object.fromEntries(
539
+ Object.entries(props).filter(([key]) => key.startsWith("data-"))
540
+ );
458
541
  const {
459
542
  savedFilters,
460
543
  currentFilters,
@@ -555,6 +638,7 @@ const SavedFiltersButton = (props) => {
555
638
  icon: { before: SvgAdd },
556
639
  style: { width: "100%" },
557
640
  onClick: handleSaveCurrentClick,
641
+ ...{ [ANV_PART_ATTR]: PARTS.saveCurrentButton },
558
642
  children: "Save Current Filter"
559
643
  }
560
644
  ),
@@ -567,6 +651,7 @@ const SavedFiltersButton = (props) => {
567
651
  style: { width: "100%" },
568
652
  onClick: handleEditClick,
569
653
  disabled: savedFilters.length === 0,
654
+ ...{ [ANV_PART_ATTR]: PARTS.manageButton },
570
655
  children: "Edit Saved Filters"
571
656
  }
572
657
  )
@@ -578,6 +663,7 @@ const SavedFiltersButton = (props) => {
578
663
  FilterTriggerButton,
579
664
  {
580
665
  ...triggerProps,
666
+ ...dataAttributes,
581
667
  filterId: "saved-filters",
582
668
  label,
583
669
  isSelected: !!(activeSavedFilterId ?? false)
@@ -648,4 +734,4 @@ const SavedFiltersButton = (props) => {
648
734
  SavedFiltersButton.displayName = "SavedFiltersButton";
649
735
 
650
736
  export { SavedFiltersButton as S };
651
- //# sourceMappingURL=SavedFiltersButton-FcYVncxU.js.map
737
+ //# sourceMappingURL=SavedFiltersButton-CpnoAIrw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SavedFiltersButton-CpnoAIrw.js","sources":["../src/beta/components/SavedFiltersButton/parts.ts","../src/beta/components/SavedFiltersButton/internal/AddSavedFilterDrawer.tsx","../src/beta/components/SavedFiltersButton/internal/EditSavedFiltersDrawer.tsx","../src/beta/components/SavedFiltersButton/SavedFiltersButton.tsx"],"sourcesContent":["import { COMMON_PART } from \"../../../internal/constants/anvParts\";\n\n/**\n * `data-anv-part` names for SavedFiltersButton's interactive sub-elements.\n *\n * The trigger is stamped by FilterTriggerButton (`FilterBar` PARTS.trigger) —\n * do not redeclare `trigger` here. Popover / menu / option parts come from\n * shared OptionsPopover / OptionsPanel internals.\n *\n * Scope in-wrapper queries by the consumer's `data-cy` on the trigger.\n * Drawers and their contents render in the top layer — target those parts\n * by attribute directly. Edit-row buttons also carry `data-id={preset.id}`.\n */\nexport const PARTS = {\n // Common roles (shared values)\n input: COMMON_PART.input,\n cancelButton: COMMON_PART.cancelButton,\n applyButton: COMMON_PART.applyButton,\n\n // SavedFiltersButton-specific roles\n /** Popover footer CTA that opens the Save Current Filter drawer. */\n saveCurrentButton: \"save-current-button\",\n /** Popover footer CTA that opens the Edit Saved Filters drawer. */\n manageButton: \"manage-button\",\n /** Save Current Filter drawer shell. */\n addDrawer: \"add-drawer\",\n /** Edit Saved Filters drawer shell. */\n editDrawer: \"edit-drawer\",\n /**\n * Per-preset edit drilldown screen inside the Edit drawer (visible after\n * clicking an edit-row-button).\n */\n drilldown: \"drilldown\",\n /** Per-preset Edit affordance in the Edit drawer list (use with `data-id`). */\n editRowButton: \"edit-row-button\",\n /** Drilldown Delete Filter action. */\n deleteButton: \"delete-button\",\n /** Drilldown Update Filter action. */\n updateButton: \"update-button\",\n /** Edit drawer list-view Close action. */\n closeButton: \"close-button\",\n} as const;\n","import { useEffect, useState } from \"react\";\nimport Button from \"../../../../components/Button\";\nimport Drawer from \"../../../../components/Drawer\";\nimport Flex from \"../../../../components/Flex\";\nimport { TextField } from \"../../../../components/TextField\";\nimport { ANV_PART_ATTR } from \"../../../../internal/constants/anvParts\";\nimport type { Filter } from \"../../FilterBar/internal/types\";\nimport { PARTS } from \"../parts\";\n\ntype AddSavedFilterDrawerProps = {\n open: boolean;\n onClose: () => void;\n /** Snapshot of filters captured when the drawer opened. */\n filtersSnapshot: Filter[];\n onSave: (payload: {\n name: string;\n filters: Filter[];\n }) => void | Promise<void>;\n /**\n * Consumer-supplied name validator. Returning a string blocks Add and is\n * surfaced as the field's error message; `undefined` allows submit.\n */\n validateName?: (name: string) => string | undefined;\n};\n\n/**\n * Drawer rendered when the user clicks \"Save Current Filter\" in the\n * SavedFiltersButton popover. Captures a name and emits `onSave` with the\n * filters snapshot. Supports async `onSave`; while pending the Add button\n * shows a loading spinner and the form is disabled.\n *\n * If `onSave` rejects, the drawer stays open with the current input so the\n * user can retry or cancel. On success the drawer closes.\n */\nexport const AddSavedFilterDrawer = ({\n open,\n onClose,\n filtersSnapshot,\n onSave,\n validateName,\n}: AddSavedFilterDrawerProps) => {\n const [name, setName] = useState(\"\");\n const [submitting, setSubmitting] = useState(false);\n const [submitError, setSubmitError] = useState<string | undefined>(undefined);\n // After a successful save, the consumer will likely add the just-saved\n // name into their `savedFilters` list synchronously. If we keep running\n // `validateName` against the current input we'll flash a \"name already\n // exists\" error (the validator now sees our own freshly-created preset)\n // before the parent unmounts us. This flag suspends validation between\n // `onSave` resolving and the drawer actually closing.\n const [justSubmitted, setJustSubmitted] = useState(false);\n\n // Reset state every time the drawer opens. We don't reset on close so the\n // closing animation can flush without snapping the visible state mid-tween.\n useEffect(() => {\n if (open) {\n setName(\"\");\n setSubmitting(false);\n setSubmitError(undefined);\n setJustSubmitted(false);\n }\n }, [open]);\n\n const trimmed = name.trim();\n const validationError =\n !justSubmitted && validateName ? validateName(trimmed) : undefined;\n const canSubmit = trimmed.length > 0 && !validationError && !submitting;\n\n const handleAdd = async () => {\n if (!canSubmit) return;\n setSubmitting(true);\n setSubmitError(undefined);\n try {\n await onSave({ name: trimmed, filters: filtersSnapshot });\n // Suspend validation; the parent will close us synchronously, but the\n // closing transition keeps us mounted for a beat — long enough to\n // re-render with the consumer's updated savedFilters list, which\n // otherwise would now collide with our input value.\n setJustSubmitted(true);\n onClose();\n } catch (err) {\n setSubmitError(\n err instanceof Error && err.message\n ? err.message\n : \"Failed to save filter.\",\n );\n setSubmitting(false);\n }\n };\n\n const handleCancel = () => {\n if (submitting) return;\n onClose();\n };\n\n return (\n <Drawer\n open={open}\n onClose={handleCancel}\n {...{ [ANV_PART_ATTR]: PARTS.addDrawer }}\n >\n <Drawer.Header>Save Current Filter</Drawer.Header>\n <Drawer.Content>\n <Flex direction=\"column\" gap=\"4\" grow={1}>\n <TextField\n label=\"Filter Name\"\n placeholder=\"Name this filter\"\n value={name}\n onChange={(e) => setName(e?.target.value ?? \"\")}\n disabled={submitting}\n required\n error={submitError ?? validationError}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && canSubmit) {\n e.preventDefault();\n handleAdd();\n }\n }}\n {...{ [ANV_PART_ATTR]: PARTS.input }}\n />\n </Flex>\n </Drawer.Content>\n <Drawer.Footer>\n <Flex justifyContent=\"flex-end\" gap=\"3\" grow={1}>\n <Button\n onClick={handleCancel}\n disabled={submitting}\n {...{ [ANV_PART_ATTR]: PARTS.cancelButton }}\n >\n Cancel\n </Button>\n <Button\n appearance=\"primary\"\n onClick={handleAdd}\n disabled={!canSubmit}\n loading={submitting}\n {...{ [ANV_PART_ATTR]: PARTS.applyButton }}\n >\n Add Saved Filter\n </Button>\n </Flex>\n </Drawer.Footer>\n </Drawer>\n );\n};\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport IconEdit from \"@servicetitan/hammer-icon/mdi/round/edit.svg\";\nimport Alert from \"../../../../components/Alert\";\nimport Button from \"../../../../components/Button\";\nimport Divider from \"../../../../components/Divider\";\nimport {\n DndSort,\n type DndSortChangeEvent,\n} from \"../../../../components/DndSort\";\nimport Drawer from \"../../../../components/Drawer\";\nimport { DrillDown, useDrillDown } from \"../../../../components/DrillDown\";\nimport Flex from \"../../../../components/Flex\";\nimport Text from \"../../../../components/Text\";\nimport { TextField } from \"../../../../components/TextField\";\nimport { ANV_PART_ATTR } from \"../../../../internal/constants/anvParts\";\nimport { DateListDialog } from \"../../FilterBar/FilterDateList\";\nimport { getAdapter } from \"../../FilterBar/internal/adapters\";\nimport {\n cloneFiltersWithItemRefs,\n updateSingleFilter,\n} from \"../../FilterBar/internal/utils/filter-state\";\nimport type {\n DateListFilter,\n DateListLibraryOptionId,\n Filter,\n} from \"../../FilterBar/internal/types\";\nimport { PARTS } from \"../parts\";\nimport type { SavedFilter, SavedFiltersAlertText } from \"../types\";\n\n/**\n * Settled outcome of a delete or update operation. Surfaced as an Alert on\n * the list view of the drawer; persists until the drawer closes or another\n * outcome replaces it.\n */\ntype DrawerAlert = {\n status: \"success\" | \"danger\";\n title: string;\n};\n\ntype EditSavedFiltersDrawerProps = {\n open: boolean;\n onClose: () => void;\n savedFilters: SavedFilter[];\n /** Drilldown's \"Update Filter\" action. May return a promise. */\n onUpdate?: (\n id: string,\n update: { name: string; filters: SavedFilter[\"filters\"] },\n ) => void | Promise<void>;\n /** Drilldown's \"Delete Filter\" action. May return a promise. */\n onDelete?: (id: string) => void | Promise<void>;\n /**\n * Optional drag-to-reorder callback. When provided, the list view renders\n * each row as a `DndSort.Card` with a drag handle and emits the new\n * `orderedIds` after a drop. When omitted, the list renders as a static\n * stack with no handles.\n */\n onReorder?: (orderedIds: string[]) => void | Promise<void>;\n /**\n * Optional validator for the name field in the drilldown. The `currentId`\n * is set to the preset being edited so the consumer can permit the row's\n * own name in uniqueness checks.\n */\n validateName?: (name: string, currentId?: string) => string | undefined;\n /** Optional override for the auto-managed alert text. */\n alertText?: SavedFiltersAlertText;\n};\n\nconst DEFAULT_ALERT_TEXT: Required<SavedFiltersAlertText> = {\n saveSuccess: \"Filter saved.\",\n saveError: \"Failed to save filter.\",\n updateSuccess: \"Filter updated.\",\n updateError: \"Failed to update filter.\",\n deleteSuccess: \"Filter deleted.\",\n deleteError: \"Failed to delete filter.\",\n reorderError: \"Failed to reorder filters.\",\n};\n\n/** The per-preset edit screen lives at drilldown index 0. */\nconst EDIT_INDEX = 0;\n\n/**\n * Drawer that lets the user manage existing saved filters. Composed of two\n * views — a list of presets (the Drawer host) and a per-preset edit screen\n * (a `DrillDown` child) that reuses the FilterBar adapter `renderDrawer`\n * machinery to render edit fields. Navigation between the two is driven by\n * `useDrillDown`, which also wires the back-button affordance built into\n * `DrillDown.Header`.\n */\nexport const EditSavedFiltersDrawer = ({\n open,\n onClose,\n savedFilters,\n onUpdate,\n onDelete,\n onReorder,\n validateName,\n alertText,\n}: EditSavedFiltersDrawerProps) => {\n const { setIndex, back, drillDownProps } = useDrillDown();\n\n // Which preset the user clicked Edit on. `null` while on the list view.\n // We track this ourselves because DrillDown only tracks \"which screen is\n // active,\" not \"which preset is being edited.\"\n const [editingId, setEditingId] = useState<string | null>(null);\n\n // Drilldown-local form state. Re-seeded whenever a new preset is opened\n // (i.e. editingId changes); not re-seeded on each parent re-render so the\n // consumer can hot-swap `savedFilters` mid-edit without clobbering edits.\n const [drilldownName, setDrilldownName] = useState(\"\");\n const [drilldownDraft, setDrilldownDraft] = useState<Filter[]>([]);\n const [dateListDialogState, setDateListDialogState] = useState<{\n filterId: string;\n libraryId: DateListLibraryOptionId;\n } | null>(null);\n const [submitting, setSubmitting] = useState<\"update\" | \"delete\" | null>(\n null,\n );\n const [submitError, setSubmitError] = useState<string | null>(null);\n\n const seededForRef = useRef<string | null>(null);\n\n // Alerts surface settled outcomes from update / delete / reorder.\n // listAlert appears at the top of the list view (most outcomes return\n // there); drilldownAlert appears at the top of the drilldown content when\n // an Update failed and we need to keep the user's in-progress edits\n // available for retry.\n const [listAlert, setListAlert] = useState<DrawerAlert | null>(null);\n const [drilldownAlert, setDrilldownAlert] = useState<DrawerAlert | null>(\n null,\n );\n\n // Reset everything on drawer close so the next open starts at the list\n // with no stale state.\n useEffect(() => {\n if (!open) {\n setEditingId(null);\n seededForRef.current = null;\n setSubmitError(null);\n setSubmitting(null);\n setListAlert(null);\n setDrilldownAlert(null);\n setIndex(undefined);\n }\n }, [open, setIndex]);\n\n const drilldownTarget = editingId\n ? savedFilters.find((s) => s.id === editingId)\n : undefined;\n\n // Seed the drilldown form when entering edit on a new preset. Not\n // re-seeded when the consumer's savedFilters array updates mid-edit —\n // once a drilldown is open, the user's edits are authoritative until\n // they Update, Delete, or Cancel.\n useEffect(() => {\n if (!editingId || !drilldownTarget) return;\n if (seededForRef.current === editingId) return;\n seededForRef.current = editingId;\n setDrilldownName(drilldownTarget.name);\n setDrilldownDraft(cloneFiltersWithItemRefs(drilldownTarget.filters));\n setSubmitError(null);\n }, [editingId, drilldownTarget]);\n\n const resolvedAlertText = useMemo(\n () => ({ ...DEFAULT_ALERT_TEXT, ...alertText }),\n [alertText],\n );\n\n const handleEdit = useCallback(\n (id: string) => {\n setListAlert(null);\n setEditingId(id);\n setIndex(EDIT_INDEX);\n },\n [setIndex],\n );\n\n // DndSort's drop event carries the new id ordering for the zone; we hand\n // that straight to the consumer so they can re-sort `savedFilters`. The\n // callback may return a promise — a rejection surfaces as a danger alert\n // on the list view (matching the delete-failure pattern) so failures\n // aren't invisible. A thrown `Error` with a message takes precedence over\n // the configured `reorderError` text, mirroring update / delete.\n const handleDrop = useCallback(\n (event: DndSortChangeEvent) => {\n if (!onReorder || !event.valid || !event.zoneSort) return;\n Promise.resolve(onReorder(event.zoneSort.map((id) => String(id)))).catch(\n (err) => {\n console.error(\n \"SavedFiltersButton onReorderSavedFilters failed:\",\n err,\n );\n setListAlert({\n status: \"danger\",\n title:\n err instanceof Error && err.message\n ? err.message\n : resolvedAlertText.reorderError,\n });\n },\n );\n },\n [onReorder, resolvedAlertText],\n );\n\n const sortedIds = useMemo(\n () => savedFilters.map((s) => s.id),\n [savedFilters],\n );\n\n // Pop back to the list. Clears form scratch state so the next drilldown\n // entry seeds fresh, and clears the drilldown's error alert.\n const handleBackToList = useCallback(() => {\n seededForRef.current = null;\n setEditingId(null);\n setSubmitError(null);\n setDrilldownAlert(null);\n back();\n }, [back]);\n\n const handleDraftChange = useCallback((filterId: string, value: unknown) => {\n setDrilldownDraft((prev) => updateSingleFilter(prev, filterId, value));\n }, []);\n\n const requestDateListDialog = useCallback(\n (filterId: string, libraryId: DateListLibraryOptionId) => {\n setDateListDialogState({ filterId, libraryId });\n },\n [],\n );\n\n // Render the per-filter form fields by delegating to each adapter's\n // renderDrawer — the exact same machinery FilterDrawer uses, so any\n // adapter that works there works here too.\n const drilldownForm = useMemo(() => {\n if (!drilldownTarget) return null;\n return drilldownDraft.map((draftFilter) => {\n const originalFilter =\n drilldownTarget.filters.find((f) => f.id === draftFilter.id) ??\n draftFilter;\n return getAdapter(draftFilter).renderDrawer({\n originalFilter,\n draftFilter,\n onDraftChange: handleDraftChange,\n requestDateListDialog,\n });\n });\n }, [\n drilldownDraft,\n drilldownTarget,\n handleDraftChange,\n requestDateListDialog,\n ]);\n\n const trimmedName = drilldownName.trim();\n const validationError =\n validateName && editingId\n ? validateName(trimmedName, editingId)\n : undefined;\n const canSubmit =\n editingId !== null &&\n trimmedName.length > 0 &&\n !validationError &&\n submitting === null;\n\n const handleUpdate = useCallback(async () => {\n if (!editingId || !onUpdate || !canSubmit) return;\n setSubmitting(\"update\");\n setSubmitError(null);\n setDrilldownAlert(null);\n try {\n await onUpdate(editingId, {\n name: trimmedName,\n filters: drilldownDraft,\n });\n // Success: pop back to the list with a success alert.\n seededForRef.current = null;\n setEditingId(null);\n back();\n setSubmitting(null);\n setListAlert({\n status: \"success\",\n title: resolvedAlertText.updateSuccess,\n });\n } catch (err) {\n // Failure: stay in drilldown so the user can adjust and retry. The\n // server error surfaces as a drilldown-level alert above the form.\n setDrilldownAlert({\n status: \"danger\",\n title:\n err instanceof Error && err.message\n ? err.message\n : resolvedAlertText.updateError,\n });\n setSubmitting(null);\n }\n }, [\n editingId,\n onUpdate,\n canSubmit,\n trimmedName,\n drilldownDraft,\n resolvedAlertText,\n back,\n ]);\n\n const handleDelete = useCallback(async () => {\n if (!editingId || !onDelete || submitting !== null) return;\n if (drilldownTarget?.disableDelete) return;\n setSubmitting(\"delete\");\n setSubmitError(null);\n setDrilldownAlert(null);\n try {\n await onDelete(editingId);\n // Success: pop back to the list with a success alert.\n seededForRef.current = null;\n setEditingId(null);\n back();\n setSubmitting(null);\n setListAlert({\n status: \"success\",\n title: resolvedAlertText.deleteSuccess,\n });\n } catch (err) {\n // Failure: pop back to the list with an error alert — the drilldown\n // had nothing to preserve since the user was trying to remove the\n // row entirely.\n seededForRef.current = null;\n setEditingId(null);\n back();\n setSubmitting(null);\n setListAlert({\n status: \"danger\",\n title:\n err instanceof Error && err.message\n ? err.message\n : resolvedAlertText.deleteError,\n });\n }\n }, [\n editingId,\n onDelete,\n submitting,\n drilldownTarget,\n resolvedAlertText,\n back,\n ]);\n\n // dateList dialog target derives from drilldownDraft (so the dialog can\n // pre-seed from whatever's currently in the draft).\n const dateListDialogTarget = dateListDialogState\n ? drilldownDraft.find(\n (f): f is DateListFilter =>\n f.id === dateListDialogState.filterId && f.type === \"dateList\",\n )\n : undefined;\n const dateListDialogSelected = dateListDialogTarget?.selectedOption;\n const dateListDialogInitialValue =\n dateListDialogSelected &&\n dateListDialogSelected.id === dateListDialogState?.libraryId &&\n dateListDialogSelected.value !== null\n ? dateListDialogSelected.value\n : undefined;\n\n const drilldownTitle = drilldownTarget?.name ?? \"Edit Saved Filter\";\n\n return (\n <>\n <Drawer\n open={open}\n onClose={onClose}\n {...drillDownProps}\n {...{ [ANV_PART_ATTR]: PARTS.editDrawer }}\n >\n {/* Host view — the saved-filters list. Visible whenever no\n DrillDown screen is active. */}\n <Drawer.Header>Edit Saved Filters</Drawer.Header>\n <Drawer.Content>\n <Flex direction=\"column\" gap=\"4\" grow={1}>\n {listAlert && (\n <Alert title={listAlert.title} status={listAlert.status} />\n )}\n {savedFilters.length === 0 ? (\n <Text subdued size=\"small\">\n No saved filters to edit.\n </Text>\n ) : onReorder ? (\n <DndSort onDrop={handleDrop}>\n <DndSort.Zone\n sortable\n id=\"saved-filters-zone\"\n label=\"Saved filters\"\n orientation=\"vertical\"\n sortedIds={sortedIds}\n gap=\"2\"\n >\n {savedFilters.map((saved) => (\n <DndSort.Card\n key={saved.id}\n id={saved.id}\n label={saved.name}\n dragOnlyWithHandle\n >\n <Flex\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap=\"2\"\n grow={1}\n >\n <Text>{saved.name}</Text>\n {!saved.disableEdit && (\n <Button\n appearance=\"secondary\"\n size=\"small\"\n icon={IconEdit}\n aria-label={`Edit ${saved.name}`}\n data-id={saved.id}\n onClick={() => handleEdit(saved.id)}\n {...{ [ANV_PART_ATTR]: PARTS.editRowButton }}\n />\n )}\n </Flex>\n </DndSort.Card>\n ))}\n </DndSort.Zone>\n </DndSort>\n ) : (\n <Flex direction=\"column\" gap=\"2\">\n {savedFilters.map((saved) => (\n <Flex\n key={saved.id}\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap=\"2\"\n >\n <Text>{saved.name}</Text>\n {!saved.disableEdit && (\n <Button\n appearance=\"secondary\"\n size=\"small\"\n icon={IconEdit}\n aria-label={`Edit ${saved.name}`}\n data-id={saved.id}\n onClick={() => handleEdit(saved.id)}\n {...{ [ANV_PART_ATTR]: PARTS.editRowButton }}\n />\n )}\n </Flex>\n ))}\n </Flex>\n )}\n </Flex>\n </Drawer.Content>\n <Drawer.Footer>\n <Flex justifyContent=\"flex-end\" grow={1}>\n <Button\n onClick={onClose}\n {...{ [ANV_PART_ATTR]: PARTS.closeButton }}\n >\n Close\n </Button>\n </Flex>\n </Drawer.Footer>\n\n {/* Per-preset edit screen. `DrillDown.Header` brings its own back\n button (aria-label \"Previous\"); we hook into `back()` via our\n handleBackToList to clear local form scratch state when popping\n back to the list. */}\n <DrillDown\n index={EDIT_INDEX}\n interactive={dateListDialogState === null}\n {...{ [ANV_PART_ATTR]: PARTS.drilldown }}\n >\n <DrillDown.Header>{drilldownTitle}</DrillDown.Header>\n <DrillDown.Content>\n <Flex direction=\"column\" gap=\"4\" grow={1}>\n {drilldownAlert && (\n <Alert\n title={drilldownAlert.title}\n status={drilldownAlert.status}\n />\n )}\n <TextField\n label=\"Filter Name\"\n placeholder=\"Name this filter\"\n value={drilldownName}\n onChange={(e) => setDrilldownName(e?.target.value ?? \"\")}\n disabled={submitting !== null}\n required\n error={submitError ?? validationError}\n {...{ [ANV_PART_ATTR]: PARTS.input }}\n />\n <Divider />\n {drilldownForm}\n </Flex>\n </DrillDown.Content>\n <DrillDown.Footer>\n <Flex\n justifyContent={\n drilldownTarget?.disableDelete ? \"flex-end\" : \"space-between\"\n }\n gap=\"3\"\n grow={1}\n >\n {!drilldownTarget?.disableDelete && (\n <Button\n appearance=\"danger-secondary\"\n onClick={handleDelete}\n loading={submitting === \"delete\"}\n disabled={submitting !== null}\n {...{ [ANV_PART_ATTR]: PARTS.deleteButton }}\n >\n Delete Filter\n </Button>\n )}\n <Flex gap=\"3\">\n <Button\n onClick={handleBackToList}\n disabled={submitting !== null}\n {...{ [ANV_PART_ATTR]: PARTS.cancelButton }}\n >\n Cancel\n </Button>\n <Button\n appearance=\"primary\"\n onClick={handleUpdate}\n disabled={!canSubmit}\n loading={submitting === \"update\"}\n {...{ [ANV_PART_ATTR]: PARTS.updateButton }}\n >\n Update Filter\n </Button>\n </Flex>\n </Flex>\n </DrillDown.Footer>\n </DrillDown>\n </Drawer>\n <DateListDialog\n libraryId={dateListDialogState?.libraryId ?? null}\n parentFilterId={dateListDialogState?.filterId ?? \"\"}\n initialValue={dateListDialogInitialValue}\n mode={dateListDialogTarget?.mode}\n dialogCtaLabel=\"Save\"\n onCommit={(option) => {\n if (dateListDialogState) {\n handleDraftChange(dateListDialogState.filterId, option);\n }\n setDateListDialogState(null);\n }}\n onCancel={() => setDateListDialogState(null)}\n />\n </>\n );\n};\n","import {\n type KeyboardEvent,\n type ReactElement,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport IconAdd from \"@servicetitan/hammer-icon/mdi/round/add.svg\";\nimport IconEdit from \"@servicetitan/hammer-icon/mdi/round/edit.svg\";\n\nimport Button from \"../../../components/Button\";\nimport { Text } from \"../../../components/Text\";\nimport { Flex } from \"../../../components/Flex\";\nimport { OptionsPopover } from \"../../../internal/components/OptionsPopover/OptionsPopover\";\nimport { OptionsPanel } from \"../../../internal/components/OptionsPanel\";\nimport { ANV_PART_ATTR } from \"../../../internal/constants/anvParts\";\nimport type { SelectItem } from \"../../../internal/types/selectFieldInternalTypes\";\nimport type { CheckState, DataAttributes } from \"../../../types\";\nimport { useMenuInteraction } from \"../../../components/SelectMenu/internal/useMenuInteraction\";\nimport { FilterTriggerButton } from \"../FilterBar/FilterTriggerButton\";\nimport styles from \"./SavedFiltersButton.module.scss\";\nimport { PARTS } from \"./parts\";\nimport type { SavedFiltersButtonProps } from \"./types\";\nimport { AddSavedFilterDrawer } from \"./internal/AddSavedFilterDrawer\";\nimport { EditSavedFiltersDrawer } from \"./internal/EditSavedFiltersDrawer\";\n\n/**\n * `SavedFiltersButton` is an opt-in companion to FilterBar that lets users\n * apply, save, edit, and delete preset filter selections. It is fully\n * stateless: the consumer owns the `savedFilters` array and writes its own\n * persistence (server, localStorage, etc.) by reacting to the callbacks the\n * component fires.\n *\n * Visually it's a single Button trigger that opens a popover listing the\n * presets, with two footer actions:\n *\n * - **Save Current Filter** opens a drawer that snapshots `currentFilters`\n * into a new preset.\n * - **Edit Saved Filters** opens a drawer listing every preset with edit\n * affordances; clicking edit on a row drills into a per-preset form\n * reusing the FilterBar adapter `renderDrawer` machinery.\n *\n * Apply, save, update, and delete are all delivered as consumer callbacks\n * (`onApplySavedFilter`, `onSaveCurrentFilter`, `onUpdateSavedFilter`,\n * `onDeleteSavedFilter`). Promise-returning callbacks are supported with\n * loading state on the relevant submit button and success/error alerts on\n * the parent drawer.\n *\n * @example\n * <SavedFiltersButton\n * savedFilters={presets}\n * currentFilters={filters}\n * onApplySavedFilter={(preset) => setFilters(preset.filters)}\n * onSaveCurrentFilter={async ({ name, filters }) => {\n * await api.savePreset({ name, filters });\n * refetchPresets();\n * }}\n * onUpdateSavedFilter={async (id, update) => api.updatePreset(id, update)}\n * onDeleteSavedFilter={async (id) => api.deletePreset(id)}\n * />\n */\nexport const SavedFiltersButton = (props: SavedFiltersButtonProps) => {\n // Root is a fragment — forward consumer `data-*` onto the trigger (Path B).\n const dataAttributes = Object.fromEntries(\n Object.entries(props).filter(([key]) => key.startsWith(\"data-\")),\n ) as DataAttributes;\n\n const {\n savedFilters,\n currentFilters,\n onApplySavedFilter,\n onSaveCurrentFilter,\n onUpdateSavedFilter,\n onDeleteSavedFilter,\n onReorderSavedFilters,\n validateName,\n alertText,\n activeSavedFilterId,\n label: labelProp,\n emptyState,\n } = props;\n\n const DEFAULT_LABEL = \"Saved Filters\";\n const label = labelProp\n ? labelProp\n : activeSavedFilterId\n ? savedFilters.find((sf) => sf.id === activeSavedFilterId)?.name ||\n DEFAULT_LABEL\n : DEFAULT_LABEL;\n\n const triggerRef = useRef<HTMLButtonElement>(null);\n\n // Synthesize SelectItems so we can reuse the SelectMenu list machinery\n // (OptionsPanel, useMenuInteraction). Each row is one saved filter; the\n // row's id mirrors the preset id.\n const items = useMemo<SelectItem[]>(\n () =>\n savedFilters.map((saved) => ({\n id: saved.id,\n type: \"option\" as const,\n original: { id: saved.id, label: saved.name },\n })),\n [savedFilters],\n );\n\n // Active-preset state is consumer-owned via `activeSavedFilterId`. When\n // the prop names a preset we mark just that row checked; when it's\n // undefined the list reads as a clean unchecked menu (no row has the\n // single-select check affordance).\n const selectedItemIds = useMemo<Set<string | number>>(\n () => (activeSavedFilterId ? new Set([activeSavedFilterId]) : new Set()),\n [activeSavedFilterId],\n );\n const getCheckedState = useCallback(\n (item: SelectItem): CheckState =>\n item.id === activeSavedFilterId ? \"checked\" : \"unchecked\",\n [activeSavedFilterId],\n );\n\n const handleItemActivate = useCallback(\n (item: SelectItem) => {\n const saved = savedFilters.find((s) => s.id === item.id);\n if (saved) onApplySavedFilter(saved);\n },\n [savedFilters, onApplySavedFilter],\n );\n\n // We use the SelectMenu menu-interaction hook as-is so keyboard and focus\n // behavior matches the platform's other menu surfaces. Popover-vs-dialog\n // adaptation is fixed to \"popover\" here — saved filters always render\n // inline in a popover even on mobile, since the heavy editing UX lives in\n // the drawer flows.\n const [isOpen, setIsOpen] = useState(false);\n const {\n closeMenu,\n highlightedIndex,\n getTriggerProps,\n getMenuProps,\n getItemProps,\n } = useMenuInteraction({\n items,\n sectionsMeta: [],\n onItemActivate: handleItemActivate,\n selectedItemIds,\n displayAs: \"popover\",\n closeOnActivate: true,\n id: \"saved-filters\",\n triggerRef,\n label,\n isOpen,\n setIsOpen,\n });\n\n const handleClickOutside = useCallback(() => {\n closeMenu({ restoreFocus: false });\n }, [closeMenu]);\n\n const triggerProps = getTriggerProps();\n\n const [addOpen, setAddOpen] = useState(false);\n const [editOpen, setEditOpen] = useState(false);\n // Snapshot of `currentFilters` captured at the moment the Save drawer\n // opens, so subsequent edits to the bar don't change what gets saved.\n const [filtersSnapshot, setFiltersSnapshot] = useState<typeof currentFilters>(\n [],\n );\n\n const handleSaveCurrentClick = useCallback(() => {\n setFiltersSnapshot(currentFilters);\n closeMenu({ restoreFocus: false });\n setAddOpen(true);\n }, [closeMenu, currentFilters]);\n\n const handleEditClick = useCallback(() => {\n closeMenu({ restoreFocus: false });\n setEditOpen(true);\n }, [closeMenu]);\n\n // Pressing Enter on a row activates via useMenuInteraction; the popover\n // closes on activation, so footer button focus does not contend with it.\n const handleFooterKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n closeMenu();\n }\n };\n\n const footer: ReactElement = (\n <Flex\n direction=\"column\"\n gap=\"2\"\n className={styles[\"footer\"]}\n onKeyDown={handleFooterKeyDown}\n >\n <Button\n appearance=\"secondary\"\n size=\"small\"\n icon={{ before: IconAdd }}\n style={{ width: \"100%\" }}\n onClick={handleSaveCurrentClick}\n {...{ [ANV_PART_ATTR]: PARTS.saveCurrentButton }}\n >\n Save Current Filter\n </Button>\n <Button\n appearance=\"secondary\"\n size=\"small\"\n icon={{ before: IconEdit }}\n style={{ width: \"100%\" }}\n onClick={handleEditClick}\n disabled={savedFilters.length === 0}\n {...{ [ANV_PART_ATTR]: PARTS.manageButton }}\n >\n Edit Saved Filters\n </Button>\n </Flex>\n );\n\n return (\n <>\n {/*\n FilterTriggerButton renders the same ghost/toolbar-sized chrome the\n FilterBar uses for every filter trigger, so the saved-filters entry\n point reads as just another control in the bar. `isSelected` mirrors\n whether the consumer has named an active preset via\n `activeSavedFilterId`.\n */}\n <FilterTriggerButton\n {...triggerProps}\n {...dataAttributes}\n filterId=\"saved-filters\"\n label={label}\n isSelected={!!(activeSavedFilterId ?? false)}\n />\n <OptionsPopover\n id=\"saved-filters-popover\"\n referenceElement={triggerRef}\n open={isOpen}\n onClose={handleClickOutside}\n width={280}\n footer={footer}\n >\n {items.length === 0 ? (\n <Flex\n direction=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n className={styles[\"empty-state\"]}\n >\n {typeof emptyState === \"string\" || emptyState == null ? (\n <Text subdued size=\"small\">\n {emptyState ?? \"No saved filters yet.\"}\n </Text>\n ) : (\n emptyState\n )}\n </Flex>\n ) : (\n <OptionsPanel\n isOpen={isOpen}\n items={items}\n getMenuProps={getMenuProps}\n getItemProps={getItemProps}\n highlightedIndex={highlightedIndex}\n getCheckedState={getCheckedState}\n selectionType=\"single\"\n hasMore={false}\n onLoadMore={() => {}}\n loading={false}\n loadingMore={false}\n />\n )}\n </OptionsPopover>\n <AddSavedFilterDrawer\n open={addOpen}\n onClose={() => setAddOpen(false)}\n filtersSnapshot={filtersSnapshot}\n onSave={onSaveCurrentFilter}\n validateName={validateName ? (name) => validateName(name) : undefined}\n />\n <EditSavedFiltersDrawer\n open={editOpen}\n onClose={() => setEditOpen(false)}\n savedFilters={savedFilters}\n onUpdate={onUpdateSavedFilter}\n onDelete={onDeleteSavedFilter}\n onReorder={onReorderSavedFilters}\n validateName={validateName}\n alertText={alertText}\n />\n </>\n );\n};\n\nSavedFiltersButton.displayName = \"SavedFiltersButton\";\n"],"names":["IconEdit","IconAdd"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export { S as SavedFiltersButton } from './SavedFiltersButton-FcYVncxU.js';
1
+ export { S as SavedFiltersButton } from './SavedFiltersButton-CpnoAIrw.js';
2
2
  //# sourceMappingURL=SavedFiltersButton.js.map
@@ -1,2 +1,2 @@
1
- export { S as SelectField, a as SelectFieldSync } from './SelectFieldSync-Bi8HsMYP.js';
1
+ export { S as SelectField, a as SelectFieldSync } from './SelectFieldSync-Dyug8Fgk.js';
2
2
  //# sourceMappingURL=SelectField.js.map