@atscript/vue-table 0.1.58

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 (202) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +24 -0
  3. package/dist/as-action-form-dialog.cjs +221 -0
  4. package/dist/as-action-form-dialog.d.cts +6 -0
  5. package/dist/as-action-form-dialog.d.mts +7 -0
  6. package/dist/as-action-form-dialog.mjs +221 -0
  7. package/dist/as-action-menu-content-CXsdPn42.mjs +104 -0
  8. package/dist/as-action-menu-content-CyUfBrWH.cjs +109 -0
  9. package/dist/as-cell-array-CXeZzZqt.cjs +69 -0
  10. package/dist/as-cell-array-DOQKR6t5.mjs +64 -0
  11. package/dist/as-cell-array.cjs +3 -0
  12. package/dist/as-cell-array.d.cts +2 -0
  13. package/dist/as-cell-array.d.mts +2 -0
  14. package/dist/as-cell-array.mjs +3 -0
  15. package/dist/as-cell-array.vue-DZGM2VHh.d.mts +12 -0
  16. package/dist/as-cell-array.vue-pFs5GcCR.d.cts +12 -0
  17. package/dist/as-cell-date-CTrvxS1h.cjs +78 -0
  18. package/dist/as-cell-date-Cq49RHmL.mjs +73 -0
  19. package/dist/as-cell-date.cjs +3 -0
  20. package/dist/as-cell-date.d.cts +2 -0
  21. package/dist/as-cell-date.d.mts +2 -0
  22. package/dist/as-cell-date.mjs +3 -0
  23. package/dist/as-cell-date.vue-BBSps2B2.d.cts +12 -0
  24. package/dist/as-cell-date.vue-Zlt4mHWb.d.mts +12 -0
  25. package/dist/as-cell-json-BynWIs1d.mjs +37 -0
  26. package/dist/as-cell-json-DvHvQ6IL.cjs +42 -0
  27. package/dist/as-cell-json-popover-BWdNs1YU.cjs +70 -0
  28. package/dist/as-cell-json-popover-DUq25I0L.mjs +65 -0
  29. package/dist/as-cell-json.cjs +3 -0
  30. package/dist/as-cell-json.d.cts +2 -0
  31. package/dist/as-cell-json.d.mts +2 -0
  32. package/dist/as-cell-json.mjs +3 -0
  33. package/dist/as-cell-json.vue-C6wg4ARZ.d.cts +12 -0
  34. package/dist/as-cell-json.vue-CESWuCer.d.mts +12 -0
  35. package/dist/as-cell-number-0_WrSCzu.cjs +76 -0
  36. package/dist/as-cell-number-Bc1C97Vg.mjs +71 -0
  37. package/dist/as-cell-number.cjs +3 -0
  38. package/dist/as-cell-number.d.cts +2 -0
  39. package/dist/as-cell-number.d.mts +2 -0
  40. package/dist/as-cell-number.mjs +3 -0
  41. package/dist/as-cell-number.vue-1Oq7nVI3.d.mts +12 -0
  42. package/dist/as-cell-number.vue-CJ2K5zeM.d.cts +12 -0
  43. package/dist/as-cell-union-C1w3B38J.mjs +88 -0
  44. package/dist/as-cell-union-CFAI0utz.cjs +93 -0
  45. package/dist/as-cell-union.cjs +4 -0
  46. package/dist/as-cell-union.d.cts +2 -0
  47. package/dist/as-cell-union.d.mts +2 -0
  48. package/dist/as-cell-union.mjs +4 -0
  49. package/dist/as-cell-union.vue-CslPM_c2.d.cts +12 -0
  50. package/dist/as-cell-union.vue-NnDmQZOA.d.mts +12 -0
  51. package/dist/as-column-menu-CH9Htz0Q.cjs +220 -0
  52. package/dist/as-column-menu-DCfhorMP.mjs +215 -0
  53. package/dist/as-column-menu.cjs +2 -0
  54. package/dist/as-column-menu.d.cts +2 -0
  55. package/dist/as-column-menu.d.mts +2 -0
  56. package/dist/as-column-menu.mjs +2 -0
  57. package/dist/as-column-menu.vue-C9e6wJ3z.d.mts +47 -0
  58. package/dist/as-column-menu.vue-o0qFdzoL.d.cts +47 -0
  59. package/dist/as-config-dialog-d2k7_l0U.cjs +699 -0
  60. package/dist/as-config-dialog-vRklaKbi.mjs +688 -0
  61. package/dist/as-config-dialog.cjs +3 -0
  62. package/dist/as-config-dialog.d.cts +2 -0
  63. package/dist/as-config-dialog.d.mts +2 -0
  64. package/dist/as-config-dialog.mjs +3 -0
  65. package/dist/as-config-dialog.vue-C6Q62xF5.d.mts +7 -0
  66. package/dist/as-config-dialog.vue-DvvJi3xx.d.cts +7 -0
  67. package/dist/as-confirm-dialog-BLh3Ju4-.mjs +52 -0
  68. package/dist/as-confirm-dialog-BgpIEE2z.cjs +57 -0
  69. package/dist/as-confirm-dialog.cjs +3 -0
  70. package/dist/as-confirm-dialog.d.cts +2 -0
  71. package/dist/as-confirm-dialog.d.mts +2 -0
  72. package/dist/as-confirm-dialog.mjs +3 -0
  73. package/dist/as-confirm-dialog.vue-CXxLpzbu.d.cts +7 -0
  74. package/dist/as-confirm-dialog.vue-pas8jGhv.d.mts +7 -0
  75. package/dist/as-filter-dialog-C0HMpUPT.mjs +610 -0
  76. package/dist/as-filter-dialog-DcGvIV3h.cjs +621 -0
  77. package/dist/as-filter-dialog.cjs +15 -0
  78. package/dist/as-filter-dialog.d.cts +2 -0
  79. package/dist/as-filter-dialog.d.mts +2 -0
  80. package/dist/as-filter-dialog.mjs +15 -0
  81. package/dist/as-filter-dialog.vue-BV2J8PgZ.d.cts +7 -0
  82. package/dist/as-filter-dialog.vue-RDZjp4gJ.d.mts +7 -0
  83. package/dist/as-filter-field-B_tYzvvl.cjs +984 -0
  84. package/dist/as-filter-field-Bqvu2ASN.mjs +943 -0
  85. package/dist/as-filter-field.cjs +9 -0
  86. package/dist/as-filter-field.d.cts +2 -0
  87. package/dist/as-filter-field.d.mts +2 -0
  88. package/dist/as-filter-field.mjs +9 -0
  89. package/dist/as-filter-field.vue-ByQ8xIGq.d.cts +11 -0
  90. package/dist/as-filter-field.vue-QY8wi5S5.d.mts +11 -0
  91. package/dist/as-filter-input--nr72iwX.cjs +106 -0
  92. package/dist/as-filter-input-P1i0CW2-.mjs +101 -0
  93. package/dist/as-filter-input.cjs +2 -0
  94. package/dist/as-filter-input.d.cts +2 -0
  95. package/dist/as-filter-input.d.mts +2 -0
  96. package/dist/as-filter-input.mjs +2 -0
  97. package/dist/as-filter-input.vue-CBQ71eNg.d.mts +18 -0
  98. package/dist/as-filter-input.vue-CS4nOk_Q.d.cts +18 -0
  99. package/dist/as-filters-Bxa9ZEMm.mjs +44 -0
  100. package/dist/as-filters-xRT2qv56.cjs +49 -0
  101. package/dist/as-filters.cjs +10 -0
  102. package/dist/as-filters.d.cts +2 -0
  103. package/dist/as-filters.d.mts +2 -0
  104. package/dist/as-filters.mjs +10 -0
  105. package/dist/as-filters.vue-BsMgYUcX.d.mts +10 -0
  106. package/dist/as-filters.vue-fv-tRL2H.d.cts +10 -0
  107. package/dist/as-preset-dialog-BaTfwMnh.cjs +569 -0
  108. package/dist/as-preset-dialog-BdDRgwf_.mjs +564 -0
  109. package/dist/as-preset-dialog.cjs +4 -0
  110. package/dist/as-preset-dialog.d.cts +2 -0
  111. package/dist/as-preset-dialog.d.mts +2 -0
  112. package/dist/as-preset-dialog.mjs +4 -0
  113. package/dist/as-preset-dialog.vue-Bzv-ON9W.d.mts +7 -0
  114. package/dist/as-preset-dialog.vue-DP9fy00Y.d.cts +7 -0
  115. package/dist/as-preset-picker-BQbNEiy9.mjs +427 -0
  116. package/dist/as-preset-picker-Ce3crTQy.cjs +432 -0
  117. package/dist/as-preset-picker.cjs +4 -0
  118. package/dist/as-preset-picker.d.cts +2 -0
  119. package/dist/as-preset-picker.d.mts +2 -0
  120. package/dist/as-preset-picker.mjs +4 -0
  121. package/dist/as-preset-picker.vue-CTBk6leV.d.mts +7 -0
  122. package/dist/as-preset-picker.vue-DfXS3pGl.d.cts +7 -0
  123. package/dist/as-row-actions-B6Kob6gt.cjs +120 -0
  124. package/dist/as-row-actions-CeWBBGqh.mjs +115 -0
  125. package/dist/as-row-actions.cjs +4 -0
  126. package/dist/as-row-actions.d.cts +2 -0
  127. package/dist/as-row-actions.d.mts +2 -0
  128. package/dist/as-row-actions.mjs +4 -0
  129. package/dist/as-row-actions.vue-BPaQfGev.d.mts +11 -0
  130. package/dist/as-row-actions.vue-Bvcc2tUN.d.cts +11 -0
  131. package/dist/as-table-Cnw2fOqZ.mjs +204 -0
  132. package/dist/as-table-DlDFxdXI.cjs +209 -0
  133. package/dist/as-table-actions-BK1Thy2G.cjs +142 -0
  134. package/dist/as-table-actions-BpMiNFni.mjs +137 -0
  135. package/dist/as-table-actions.cjs +4 -0
  136. package/dist/as-table-actions.d.cts +2 -0
  137. package/dist/as-table-actions.d.mts +2 -0
  138. package/dist/as-table-actions.mjs +4 -0
  139. package/dist/as-table-actions.vue-B7Q-JA3z.d.cts +47 -0
  140. package/dist/as-table-actions.vue-Bs1Jl1ep.d.mts +47 -0
  141. package/dist/as-table-base-D0k4k7k_.mjs +646 -0
  142. package/dist/as-table-base-VIz-B_6_.cjs +651 -0
  143. package/dist/as-table-cell-value-B1CiJYFn.mjs +26 -0
  144. package/dist/as-table-cell-value-CuxRtFn9.cjs +31 -0
  145. package/dist/as-table-cell-value.cjs +3 -0
  146. package/dist/as-table-cell-value.d.cts +2 -0
  147. package/dist/as-table-cell-value.d.mts +2 -0
  148. package/dist/as-table-cell-value.mjs +3 -0
  149. package/dist/as-table-cell-value.vue-BgFDv2JQ.d.cts +12 -0
  150. package/dist/as-table-cell-value.vue-BuPCQ8YA.d.mts +12 -0
  151. package/dist/as-table-header-cell-C3zeZUZo.cjs +117 -0
  152. package/dist/as-table-header-cell-CBn_ioCe.mjs +112 -0
  153. package/dist/as-table-header-cell.cjs +3 -0
  154. package/dist/as-table-header-cell.d.cts +2 -0
  155. package/dist/as-table-header-cell.d.mts +2 -0
  156. package/dist/as-table-header-cell.mjs +3 -0
  157. package/dist/as-table-header-cell.vue-Bc_DSsGY.d.cts +31 -0
  158. package/dist/as-table-header-cell.vue-DNMOHfek.d.mts +31 -0
  159. package/dist/as-table-root-Br6WcGRo.cjs +263 -0
  160. package/dist/as-table-root-gG7pTIdD.mjs +258 -0
  161. package/dist/as-table-root.cjs +28 -0
  162. package/dist/as-table-root.d.cts +2 -0
  163. package/dist/as-table-root.d.mts +2 -0
  164. package/dist/as-table-root.mjs +28 -0
  165. package/dist/as-table-root.vue-5_OhVwse.d.mts +2258 -0
  166. package/dist/as-table-root.vue-CSqEtIll.d.cts +2258 -0
  167. package/dist/as-table-status-BjRGGuhC.mjs +683 -0
  168. package/dist/as-table-status-DWYoJIMC.cjs +724 -0
  169. package/dist/as-table.cjs +10 -0
  170. package/dist/as-table.d.cts +2 -0
  171. package/dist/as-table.d.mts +2 -0
  172. package/dist/as-table.mjs +10 -0
  173. package/dist/as-table.vue-BTYg-e3Z.d.mts +81 -0
  174. package/dist/as-table.vue-wdRARLIe.d.cts +81 -0
  175. package/dist/as-window-table-CKIfo3M_.mjs +709 -0
  176. package/dist/as-window-table-DE7_NyEP.cjs +714 -0
  177. package/dist/as-window-table.cjs +9 -0
  178. package/dist/as-window-table.d.cts +2 -0
  179. package/dist/as-window-table.d.mts +2 -0
  180. package/dist/as-window-table.mjs +9 -0
  181. package/dist/as-window-table.vue-Bf8xGC9M.d.mts +86 -0
  182. package/dist/as-window-table.vue-CA8qsrz4.d.cts +86 -0
  183. package/dist/format-cell-B2xMDYO9.mjs +27 -0
  184. package/dist/format-cell-D4mqaN0E.cjs +32 -0
  185. package/dist/get-cell-value-CZSVfDLg.cjs +19 -0
  186. package/dist/get-cell-value-DiH84HKL.mjs +14 -0
  187. package/dist/index.cjs +598 -0
  188. package/dist/index.d.cts +21 -0
  189. package/dist/index.d.mts +21 -0
  190. package/dist/index.mjs +505 -0
  191. package/dist/preset-aspect-display-BYeiSgcc.mjs +43 -0
  192. package/dist/preset-aspect-display-y8aal_EF.cjs +72 -0
  193. package/dist/types-BvvXN72P.d.mts +531 -0
  194. package/dist/types-CNMmF6W2.d.cts +531 -0
  195. package/dist/use-cell-locale-1uQaFTLQ.mjs +23 -0
  196. package/dist/use-cell-locale-B480_QYK.cjs +34 -0
  197. package/dist/use-table-column-handlers-CGYAY2xH.cjs +65 -0
  198. package/dist/use-table-column-handlers-t6xi1yCE.mjs +54 -0
  199. package/dist/use-table-state-C4JbonEZ.mjs +1822 -0
  200. package/dist/use-table-state-MU-vuzui.cjs +1917 -0
  201. package/package.json +195 -0
  202. package/styles.d.ts +2 -0
@@ -0,0 +1,564 @@
1
+ import { a as useTableContext } from "./use-table-state-C4JbonEZ.mjs";
2
+ import { a as readPresetLabel, i as ownerNameOf, n as ASPECT_LABELS, r as aspectsOf, t as ASPECT_ICONS } from "./preset-aspect-display-BYeiSgcc.mjs";
3
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, isRef, nextTick, normalizeClass, openBlock, ref, renderList, toDisplayString, unref, vModelText, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
4
+ import { isSystemPresetId, setsEqual } from "@atscript/ui-table";
5
+ import { DialogClose, DialogContent, DialogOverlay, DialogPortal, DialogRoot, DialogTitle } from "reka-ui";
6
+ //#region src/components/defaults/as-preset-dialog.vue?vue&type=script&setup=true&lang.ts
7
+ const _hoisted_1 = { class: "as-preset-dialog-header" };
8
+ const _hoisted_2 = { class: "as-preset-dialog-counter" };
9
+ const _hoisted_3 = { class: "as-preset-dialog-toolbar" };
10
+ const _hoisted_4 = { class: "as-preset-dialog-search" };
11
+ const _hoisted_5 = { class: "as-preset-dialog-body" };
12
+ const _hoisted_6 = {
13
+ key: 0,
14
+ class: "as-preset-dialog-empty"
15
+ };
16
+ const _hoisted_7 = { class: "as-preset-dialog-section-header" };
17
+ const _hoisted_8 = ["data-deleted"];
18
+ const _hoisted_9 = [
19
+ "value",
20
+ "checked",
21
+ "onChange",
22
+ "title"
23
+ ];
24
+ const _hoisted_10 = [
25
+ "data-on",
26
+ "aria-pressed",
27
+ "title",
28
+ "onClick"
29
+ ];
30
+ const _hoisted_11 = [
31
+ "data-on",
32
+ "aria-pressed",
33
+ "title",
34
+ "onClick"
35
+ ];
36
+ const _hoisted_12 = {
37
+ key: 1,
38
+ class: "as-preset-dialog-row-fav-spacer",
39
+ "aria-hidden": "true"
40
+ };
41
+ const _hoisted_13 = { class: "as-preset-dialog-row-label" };
42
+ const _hoisted_14 = ["onKeydown"];
43
+ const _hoisted_15 = [
44
+ "data-pending",
45
+ "title",
46
+ "onMousedown"
47
+ ];
48
+ const _hoisted_16 = ["data-pending"];
49
+ const _hoisted_17 = { class: "as-preset-dialog-row-owner" };
50
+ const _hoisted_18 = {
51
+ key: 0,
52
+ class: "as-preset-dialog-row-owner-self"
53
+ };
54
+ const _hoisted_19 = { class: "as-preset-dialog-aspect-strip" };
55
+ const _hoisted_20 = ["data-on", "title"];
56
+ const _hoisted_21 = [
57
+ "data-on",
58
+ "aria-pressed",
59
+ "title",
60
+ "onClick"
61
+ ];
62
+ const _hoisted_22 = ["title"];
63
+ const _hoisted_23 = {
64
+ key: 4,
65
+ class: "as-preset-dialog-row-public-spacer",
66
+ "aria-hidden": "true"
67
+ };
68
+ const _hoisted_24 = [
69
+ "data-on",
70
+ "aria-pressed",
71
+ "title",
72
+ "onClick"
73
+ ];
74
+ const _hoisted_25 = {
75
+ key: 6,
76
+ class: "as-preset-dialog-row-delete-spacer",
77
+ "aria-hidden": "true"
78
+ };
79
+ const _hoisted_26 = { class: "as-preset-dialog-footer" };
80
+ const _hoisted_27 = { class: "as-preset-dialog-footer-status" };
81
+ const _hoisted_28 = {
82
+ key: 0,
83
+ class: "as-preset-dialog-footer-unsaved"
84
+ };
85
+ const _hoisted_29 = { class: "as-preset-dialog-footer-actions" };
86
+ const _hoisted_30 = ["disabled"];
87
+ //#endregion
88
+ //#region src/components/defaults/as-preset-dialog.vue
89
+ var as_preset_dialog_default = /* @__PURE__ */ defineComponent({
90
+ __name: "as-preset-dialog",
91
+ setup(__props) {
92
+ const { state } = useTableContext();
93
+ const isOpen = computed({
94
+ get: () => state.preset.dialogOpen.value,
95
+ set: (val) => {
96
+ state.preset.dialogOpen.value = val;
97
+ }
98
+ });
99
+ const ownedCount = computed(() => {
100
+ const me = state.preset.currentUser.value;
101
+ if (me === null) return 0;
102
+ let n = 0;
103
+ for (const row of state.preset.presets.value) if (row.user === me) n++;
104
+ return n;
105
+ });
106
+ const presetLimit = computed(() => state.preset.capabilities.value?.presetLimit ?? null);
107
+ const counterText = computed(() => presetLimit.value !== null ? `${ownedCount.value} / ${presetLimit.value}` : `${ownedCount.value}`);
108
+ const serverFavIds = computed(() => {
109
+ const arr = (state.preset.userConf.value?.data)?.favPresetIds;
110
+ return new Set(arr ?? []);
111
+ });
112
+ const serverDefaultId = computed(() => (state.preset.userConf.value?.data)?.defaultPresetId ?? null);
113
+ const serverPublicIds = computed(() => {
114
+ const out = /* @__PURE__ */ new Set();
115
+ for (const row of state.preset.presets.value) if (row.public === true) out.add(row.id);
116
+ return out;
117
+ });
118
+ const pendingFavIds = ref(/* @__PURE__ */ new Set());
119
+ const pendingDefaultId = ref(null);
120
+ const pendingPublicIds = ref(/* @__PURE__ */ new Set());
121
+ const pendingLabels = ref(/* @__PURE__ */ new Map());
122
+ const pendingActiveId = ref(null);
123
+ const pendingDeleteIds = ref(/* @__PURE__ */ new Set());
124
+ function syncPendingFromServer() {
125
+ pendingFavIds.value = new Set(serverFavIds.value);
126
+ pendingDefaultId.value = serverDefaultId.value;
127
+ pendingPublicIds.value = new Set(serverPublicIds.value);
128
+ pendingLabels.value = /* @__PURE__ */ new Map();
129
+ pendingActiveId.value = state.preset.activeId.value;
130
+ pendingDeleteIds.value = /* @__PURE__ */ new Set();
131
+ }
132
+ watch(isOpen, (open) => {
133
+ if (open) {
134
+ syncPendingFromServer();
135
+ searchQuery.value = "";
136
+ cancelRename();
137
+ nextTick(() => searchInputRef.value?.focus());
138
+ }
139
+ });
140
+ watch([
141
+ serverFavIds,
142
+ serverDefaultId,
143
+ serverPublicIds,
144
+ state.preset.activeId
145
+ ], () => {
146
+ if (!isOpen.value) return;
147
+ if (!isDirty.value) syncPendingFromServer();
148
+ });
149
+ const isDirty = computed(() => {
150
+ if (!setsEqual(pendingFavIds.value, serverFavIds.value)) return true;
151
+ if (pendingDefaultId.value !== serverDefaultId.value) return true;
152
+ if (!setsEqual(pendingPublicIds.value, serverPublicIds.value)) return true;
153
+ if (pendingLabels.value.size > 0) return true;
154
+ if (pendingActiveId.value !== state.preset.activeId.value) return true;
155
+ if (pendingDeleteIds.value.size > 0) return true;
156
+ return false;
157
+ });
158
+ const allRows = computed(() => {
159
+ const out = [];
160
+ for (const sp of state.preset.systemPresets.value) out.push({
161
+ id: sp.id,
162
+ label: sp.label,
163
+ kind: "system",
164
+ isPublic: false,
165
+ ownerLabel: "—",
166
+ aspects: [...state.preset.availableAspects],
167
+ pendingLabel: false
168
+ });
169
+ const stored = [];
170
+ for (const row of state.preset.presets.value) {
171
+ const isOwned = state.preset.isOwned(row.id);
172
+ const original = readPresetLabel(row);
173
+ const pending = pendingLabels.value.get(row.id);
174
+ const liveLabel = pending ?? original;
175
+ stored.push({
176
+ id: row.id,
177
+ label: liveLabel,
178
+ kind: isOwned ? "owned" : "public",
179
+ isPublic: pendingPublicIds.value.has(row.id),
180
+ ownerLabel: isOwned ? "you" : ownerNameOf(row, "—"),
181
+ aspects: aspectsOf(row, state.preset.availableAspects),
182
+ pendingLabel: pending !== void 0 && pending !== original
183
+ });
184
+ }
185
+ stored.sort((a, b) => a.label.localeCompare(b.label, void 0, { sensitivity: "base" }));
186
+ return [...out, ...stored];
187
+ });
188
+ const searchQuery = ref("");
189
+ const searchInputRef = ref(null);
190
+ const sections = computed(() => {
191
+ const q = searchQuery.value.trim().toLowerCase();
192
+ const matches = (r) => !q || r.label.toLowerCase().includes(q) || r.ownerLabel.toLowerCase().includes(q);
193
+ const sys = [];
194
+ const own = [];
195
+ const shared = [];
196
+ for (const r of allRows.value) {
197
+ if (!matches(r)) continue;
198
+ if (r.kind === "system") sys.push(r);
199
+ else if (r.kind === "owned") own.push(r);
200
+ else shared.push(r);
201
+ }
202
+ const out = [];
203
+ if (sys.length > 0) out.push({
204
+ kind: "system",
205
+ label: "System",
206
+ rows: sys
207
+ });
208
+ if (own.length > 0) out.push({
209
+ kind: "owned",
210
+ label: "My presets",
211
+ rows: own
212
+ });
213
+ if (shared.length > 0) out.push({
214
+ kind: "public",
215
+ label: "Shared by others",
216
+ rows: shared
217
+ });
218
+ return out;
219
+ });
220
+ const totalFiltered = computed(() => sections.value.reduce((sum, s) => sum + s.rows.length, 0));
221
+ function toggleFavPending(id) {
222
+ const next = new Set(pendingFavIds.value);
223
+ if (next.has(id)) next.delete(id);
224
+ else next.add(id);
225
+ pendingFavIds.value = next;
226
+ }
227
+ function setDefaultPending(id) {
228
+ pendingDefaultId.value = pendingDefaultId.value === id ? null : id;
229
+ }
230
+ function togglePublicPending(id) {
231
+ const next = new Set(pendingPublicIds.value);
232
+ if (next.has(id)) next.delete(id);
233
+ else next.add(id);
234
+ pendingPublicIds.value = next;
235
+ }
236
+ function setActivePending(id) {
237
+ pendingActiveId.value = id;
238
+ }
239
+ function toggleDeletePending(id) {
240
+ const next = new Set(pendingDeleteIds.value);
241
+ if (!next.has(id)) {
242
+ next.add(id);
243
+ if (editingId.value === id) cancelRename();
244
+ } else next.delete(id);
245
+ pendingDeleteIds.value = next;
246
+ }
247
+ const editingId = ref(null);
248
+ const editingValue = ref("");
249
+ let renameInputRef = null;
250
+ function startRename(row) {
251
+ if (row.kind !== "owned") return;
252
+ editingId.value = row.id;
253
+ editingValue.value = row.label;
254
+ }
255
+ watch(editingId, (id) => {
256
+ if (!id) {
257
+ renameInputRef = null;
258
+ return;
259
+ }
260
+ requestAnimationFrame(() => {
261
+ requestAnimationFrame(() => {
262
+ renameInputRef?.focus();
263
+ renameInputRef?.select();
264
+ });
265
+ });
266
+ }, { flush: "post" });
267
+ function cancelRename() {
268
+ editingId.value = null;
269
+ editingValue.value = "";
270
+ }
271
+ /**
272
+ * Live writeback to `pendingLabels`. Called on every keystroke via
273
+ * `@input` so Save lights up the moment the value diverges from the
274
+ * server label. Empty string is treated as "revert" (drop the pending
275
+ * entry) so accidentally clearing the input doesn't queue a blank-name
276
+ * rename.
277
+ */
278
+ function onRenameInput() {
279
+ if (!editingId.value) return;
280
+ const id = editingId.value;
281
+ const next = editingValue.value.trim();
282
+ const row = state.preset.presetsById.value.get(id);
283
+ const original = row ? readPresetLabel(row) : "";
284
+ const map = new Map(pendingLabels.value);
285
+ if (!next || next === original) map.delete(id);
286
+ else map.set(id, next);
287
+ pendingLabels.value = map;
288
+ }
289
+ function commitRename() {
290
+ cancelRename();
291
+ }
292
+ const saving = ref(false);
293
+ async function save() {
294
+ if (!isDirty.value || saving.value) return;
295
+ saving.value = true;
296
+ try {
297
+ await state.preset.batch(async () => {
298
+ const deleted = pendingDeleteIds.value;
299
+ if (!setsEqual(pendingFavIds.value, serverFavIds.value)) {
300
+ const cleaned = [];
301
+ for (const id of pendingFavIds.value) {
302
+ if (isSystemPresetId(id)) continue;
303
+ if (deleted.has(id)) continue;
304
+ if (!state.preset.presetsById.value.has(id)) continue;
305
+ if (state.preset.isOwned(id)) continue;
306
+ cleaned.push(id);
307
+ }
308
+ await state.preset.setFavorites(cleaned);
309
+ }
310
+ if (pendingDefaultId.value !== serverDefaultId.value) {
311
+ const next = pendingDefaultId.value && deleted.has(pendingDefaultId.value) ? null : pendingDefaultId.value;
312
+ if (next !== serverDefaultId.value) await state.preset.setDefault(next);
313
+ }
314
+ if (pendingLabels.value.size > 0) for (const [id, label] of pendingLabels.value) {
315
+ if (deleted.has(id)) continue;
316
+ try {
317
+ await state.preset.rename(id, label);
318
+ } catch (_err) {}
319
+ }
320
+ if (!setsEqual(pendingPublicIds.value, serverPublicIds.value)) {
321
+ const flips = [];
322
+ for (const id of pendingPublicIds.value) {
323
+ if (deleted.has(id)) continue;
324
+ if (!serverPublicIds.value.has(id)) flips.push(id);
325
+ }
326
+ for (const id of serverPublicIds.value) {
327
+ if (deleted.has(id)) continue;
328
+ if (!pendingPublicIds.value.has(id)) flips.push(id);
329
+ }
330
+ for (const id of flips) try {
331
+ await state.preset.togglePublic(id);
332
+ } catch (_err) {}
333
+ }
334
+ if (deleted.size > 0) for (const id of deleted) try {
335
+ await state.preset.remove(id);
336
+ } catch (_err) {}
337
+ });
338
+ if (pendingActiveId.value !== null && pendingActiveId.value !== state.preset.activeId.value && !pendingDeleteIds.value.has(pendingActiveId.value)) state.preset.apply(pendingActiveId.value);
339
+ state.preset.dialogOpen.value = false;
340
+ } finally {
341
+ saving.value = false;
342
+ }
343
+ }
344
+ function discardOrClose() {
345
+ syncPendingFromServer();
346
+ state.preset.dialogOpen.value = false;
347
+ }
348
+ function rowFavTitle(row) {
349
+ if (row.kind !== "public") return "";
350
+ return pendingFavIds.value.has(row.id) ? "Favorited — click to remove" : "Click to add to favorites";
351
+ }
352
+ function rowDefaultTitle(row) {
353
+ return row.id === pendingDefaultId.value ? "Default — click to unpin" : "Click to pin as default";
354
+ }
355
+ function rowPublicTitle(row) {
356
+ if (row.kind === "system") return "";
357
+ if (row.kind === "owned") return row.isPublic ? "Public — click to make private" : "Private — click to make public";
358
+ return "Public preset shared with everyone";
359
+ }
360
+ function canToggleRowPublic(row) {
361
+ if (row.kind !== "owned") return false;
362
+ const caps = state.preset.capabilities.value;
363
+ if (caps === null) return true;
364
+ return caps.canPublish || row.isPublic;
365
+ }
366
+ return (_ctx, _cache) => {
367
+ return openBlock(), createBlock(unref(DialogRoot), {
368
+ open: isOpen.value,
369
+ "onUpdate:open": _cache[4] || (_cache[4] = ($event) => isOpen.value = $event)
370
+ }, {
371
+ default: withCtx(() => [createVNode(unref(DialogPortal), null, {
372
+ default: withCtx(() => [createVNode(unref(DialogOverlay), { class: "as-preset-dialog-overlay" }), createVNode(unref(DialogContent), {
373
+ class: "as-preset-dialog-content",
374
+ onEscapeKeyDown: _cache[2] || (_cache[2] = (ev) => {
375
+ ev.preventDefault();
376
+ discardOrClose();
377
+ }),
378
+ onPointerDownOutside: _cache[3] || (_cache[3] = (ev) => {
379
+ ev.preventDefault();
380
+ discardOrClose();
381
+ })
382
+ }, {
383
+ default: withCtx(() => [
384
+ createElementVNode("header", _hoisted_1, [
385
+ createVNode(unref(DialogTitle), { class: "as-preset-dialog-title" }, {
386
+ default: withCtx(() => [..._cache[5] || (_cache[5] = [createTextVNode("Presets", -1)])]),
387
+ _: 1
388
+ }),
389
+ createElementVNode("span", _hoisted_2, toDisplayString(counterText.value), 1),
390
+ createVNode(unref(DialogClose), {
391
+ class: "as-preset-dialog-close",
392
+ "aria-label": "Close",
393
+ onClick: withModifiers(discardOrClose, ["prevent"])
394
+ }, {
395
+ default: withCtx(() => [..._cache[6] || (_cache[6] = [createElementVNode("span", {
396
+ class: "i-as-close",
397
+ "aria-hidden": "true"
398
+ }, null, -1)])]),
399
+ _: 1
400
+ })
401
+ ]),
402
+ createElementVNode("div", _hoisted_3, [createElementVNode("div", _hoisted_4, [_cache[7] || (_cache[7] = createElementVNode("span", {
403
+ class: "i-as-search as-preset-dialog-search-icon",
404
+ "aria-hidden": "true"
405
+ }, null, -1)), withDirectives(createElementVNode("input", {
406
+ ref_key: "searchInputRef",
407
+ ref: searchInputRef,
408
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => searchQuery.value = $event),
409
+ type: "search",
410
+ class: "as-preset-dialog-search-input",
411
+ placeholder: "Search by name or owner…"
412
+ }, null, 512), [[vModelText, searchQuery.value]])]), _cache[8] || (_cache[8] = createElementVNode("div", { class: "as-preset-dialog-legend" }, [
413
+ createElementVNode("span", { class: "as-preset-dialog-legend-item" }, [createElementVNode("span", {
414
+ class: "i-as-pin as-preset-dialog-legend-icon",
415
+ "aria-hidden": "true"
416
+ }), createElementVNode("span", null, "default")]),
417
+ createElementVNode("span", { class: "as-preset-dialog-legend-item" }, [createElementVNode("span", {
418
+ class: "i-as-star as-preset-dialog-legend-icon",
419
+ "aria-hidden": "true"
420
+ }), createElementVNode("span", null, "favorite")]),
421
+ createElementVNode("span", { class: "as-preset-dialog-legend-item" }, [createElementVNode("span", {
422
+ class: "i-as-eye-off as-preset-dialog-legend-icon",
423
+ "aria-hidden": "true"
424
+ }), createElementVNode("span", null, "public")]),
425
+ createElementVNode("span", { class: "as-preset-dialog-legend-item" }, [createElementVNode("span", {
426
+ class: "i-as-trash as-preset-dialog-legend-icon",
427
+ "aria-hidden": "true"
428
+ }), createElementVNode("span", null, "delete")])
429
+ ], -1))]),
430
+ createElementVNode("div", _hoisted_5, [totalFiltered.value === 0 ? (openBlock(), createElementBlock("p", _hoisted_6, " No presets match \"" + toDisplayString(searchQuery.value) + "\". ", 1)) : (openBlock(true), createElementBlock(Fragment, { key: 1 }, renderList(sections.value, (section) => {
431
+ return openBlock(), createElementBlock(Fragment, { key: section.kind }, [createElementVNode("div", _hoisted_7, toDisplayString(section.label), 1), (openBlock(true), createElementBlock(Fragment, null, renderList(section.rows, (row) => {
432
+ return openBlock(), createElementBlock("div", {
433
+ key: row.id,
434
+ class: "as-preset-dialog-row",
435
+ "data-deleted": pendingDeleteIds.value.has(row.id) ? "" : void 0
436
+ }, [
437
+ createCommentVNode(" First column: pick which preset becomes active on Save.\n Radio (single-select — exactly one preset is applied at\n a time). Clicking it sets `pendingActiveId`; the actual\n `applyPreset` runs in the Save batch. "),
438
+ createElementVNode("input", {
439
+ type: "radio",
440
+ name: "as-preset-dialog-active",
441
+ class: "as-preset-dialog-row-active",
442
+ value: row.id,
443
+ checked: row.id === pendingActiveId.value,
444
+ onChange: ($event) => setActivePending(row.id),
445
+ title: row.id === pendingActiveId.value ? "This preset will be applied" : "Click to apply this preset on Save"
446
+ }, null, 40, _hoisted_9),
447
+ createElementVNode("button", {
448
+ type: "button",
449
+ class: "as-preset-dialog-row-default",
450
+ "data-on": row.id === pendingDefaultId.value ? "" : void 0,
451
+ "aria-pressed": row.id === pendingDefaultId.value,
452
+ title: rowDefaultTitle(row),
453
+ onClick: ($event) => setDefaultPending(row.id)
454
+ }, [createElementVNode("span", {
455
+ class: normalizeClass(row.id === pendingDefaultId.value ? "i-as-pin-filled" : "i-as-pin"),
456
+ "aria-hidden": "true"
457
+ }, null, 2)], 8, _hoisted_10),
458
+ createCommentVNode(" Star: only meaningful for non-owned, non-system rows. Own\n + system rows already render in the picker so the star\n would be a no-op. Keep a sized spacer so the column-grid\n stays aligned. "),
459
+ row.kind === "public" ? (openBlock(), createElementBlock("button", {
460
+ key: 0,
461
+ type: "button",
462
+ class: "as-preset-dialog-row-fav",
463
+ "data-on": pendingFavIds.value.has(row.id) ? "" : void 0,
464
+ "aria-pressed": pendingFavIds.value.has(row.id),
465
+ title: rowFavTitle(row),
466
+ onClick: ($event) => toggleFavPending(row.id)
467
+ }, [createElementVNode("span", {
468
+ class: normalizeClass(pendingFavIds.value.has(row.id) ? "i-as-star-filled" : "i-as-star"),
469
+ "aria-hidden": "true"
470
+ }, null, 2)], 8, _hoisted_11)) : (openBlock(), createElementBlock("span", _hoisted_12)),
471
+ createElementVNode("div", _hoisted_13, [editingId.value === row.id ? withDirectives((openBlock(), createElementBlock("input", {
472
+ key: 0,
473
+ ref_for: true,
474
+ ref: (el) => {
475
+ if (el) isRef(renameInputRef) ? renameInputRef.value = el : renameInputRef = el;
476
+ },
477
+ "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => editingValue.value = $event),
478
+ class: "as-preset-dialog-row-rename",
479
+ type: "text",
480
+ onInput: onRenameInput,
481
+ onKeydown: [withKeys(withModifiers(commitRename, ["prevent"]), ["enter"]), withKeys(withModifiers(cancelRename, ["prevent"]), ["escape"])],
482
+ onBlur: commitRename
483
+ }, null, 40, _hoisted_14)), [[vModelText, editingValue.value]]) : row.kind === "owned" && !pendingDeleteIds.value.has(row.id) ? (openBlock(), createElementBlock("span", {
484
+ key: 1,
485
+ class: "as-preset-dialog-row-label-text cursor-pointer",
486
+ "data-pending": row.pendingLabel ? "" : void 0,
487
+ title: row.pendingLabel ? "Modified — click to keep editing" : "Click to rename",
488
+ onMousedown: withModifiers(($event) => startRename(row), ["prevent", "stop"])
489
+ }, toDisplayString(row.label), 41, _hoisted_15)) : (openBlock(), createElementBlock("span", {
490
+ key: 2,
491
+ class: "as-preset-dialog-row-label-text",
492
+ "data-pending": row.pendingLabel ? "" : void 0
493
+ }, toDisplayString(row.label), 9, _hoisted_16))]),
494
+ createElementVNode("span", _hoisted_17, [row.kind === "owned" ? (openBlock(), createElementBlock("span", _hoisted_18, "you")) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [createTextVNode(toDisplayString(row.ownerLabel), 1)], 64))]),
495
+ createElementVNode("div", _hoisted_19, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(state).preset.availableAspects, (a) => {
496
+ return openBlock(), createElementBlock("span", {
497
+ key: a,
498
+ class: "as-preset-dialog-aspect-chip",
499
+ "data-on": row.aspects.includes(a) ? "" : void 0,
500
+ title: unref(ASPECT_LABELS)[a]
501
+ }, [createElementVNode("span", {
502
+ class: normalizeClass(unref(ASPECT_ICONS)[a]),
503
+ "aria-hidden": "true"
504
+ }, null, 2)], 8, _hoisted_20);
505
+ }), 128))]),
506
+ canToggleRowPublic(row) ? (openBlock(), createElementBlock("button", {
507
+ key: 2,
508
+ type: "button",
509
+ class: "as-preset-dialog-row-public-toggle",
510
+ "data-on": row.isPublic ? "" : void 0,
511
+ "aria-pressed": row.isPublic,
512
+ title: rowPublicTitle(row),
513
+ onClick: ($event) => togglePublicPending(row.id)
514
+ }, [createElementVNode("span", {
515
+ class: normalizeClass(row.isPublic ? "i-as-eye" : "i-as-eye-off"),
516
+ "aria-hidden": "true"
517
+ }, null, 2)], 8, _hoisted_21)) : row.kind === "public" ? (openBlock(), createElementBlock("span", {
518
+ key: 3,
519
+ class: "as-preset-dialog-row-public-indicator",
520
+ title: rowPublicTitle(row)
521
+ }, [..._cache[9] || (_cache[9] = [createElementVNode("span", {
522
+ class: "i-as-eye",
523
+ "aria-hidden": "true"
524
+ }, null, -1)])], 8, _hoisted_22)) : (openBlock(), createElementBlock("span", _hoisted_23)),
525
+ row.kind === "owned" ? (openBlock(), createElementBlock("button", {
526
+ key: 5,
527
+ type: "button",
528
+ class: "as-preset-dialog-row-delete",
529
+ "data-on": pendingDeleteIds.value.has(row.id) ? "" : void 0,
530
+ "aria-pressed": pendingDeleteIds.value.has(row.id),
531
+ title: pendingDeleteIds.value.has(row.id) ? "Marked for deletion — click to undo" : "Mark for deletion (applied on Save)",
532
+ onClick: ($event) => toggleDeletePending(row.id)
533
+ }, [..._cache[10] || (_cache[10] = [createElementVNode("span", {
534
+ class: "i-as-trash",
535
+ "aria-hidden": "true"
536
+ }, null, -1)])], 8, _hoisted_24)) : (openBlock(), createElementBlock("span", _hoisted_25))
537
+ ], 8, _hoisted_8);
538
+ }), 128))], 64);
539
+ }), 128))]),
540
+ createElementVNode("footer", _hoisted_26, [createElementVNode("div", _hoisted_27, [isDirty.value ? (openBlock(), createElementBlock("span", _hoisted_28, [..._cache[11] || (_cache[11] = [createElementVNode("span", {
541
+ class: "as-preset-dialog-footer-unsaved-dot",
542
+ "aria-hidden": "true"
543
+ }, null, -1), createTextVNode(" unsaved changes ", -1)])])) : createCommentVNode("v-if", true)]), createElementVNode("div", _hoisted_29, [createElementVNode("button", {
544
+ type: "button",
545
+ class: "as-preset-dialog-footer-close",
546
+ onClick: discardOrClose
547
+ }, " Cancel "), createElementVNode("button", {
548
+ type: "button",
549
+ class: "as-preset-dialog-footer-save",
550
+ disabled: !isDirty.value || saving.value,
551
+ onClick: save
552
+ }, toDisplayString(saving.value ? "Saving…" : "Save"), 9, _hoisted_30)])])
553
+ ]),
554
+ _: 1
555
+ })]),
556
+ _: 1
557
+ })]),
558
+ _: 1
559
+ }, 8, ["open"]);
560
+ };
561
+ }
562
+ });
563
+ //#endregion
564
+ export { as_preset_dialog_default as t };
@@ -0,0 +1,4 @@
1
+ require("./use-table-state-MU-vuzui.cjs");
2
+ require("./preset-aspect-display-y8aal_EF.cjs");
3
+ const require_as_preset_dialog = require("./as-preset-dialog-BaTfwMnh.cjs");
4
+ module.exports = require_as_preset_dialog.as_preset_dialog_default;
@@ -0,0 +1,2 @@
1
+ import { t as _default } from "./as-preset-dialog.vue-DP9fy00Y.cjs";
2
+ export = _default;
@@ -0,0 +1,2 @@
1
+ import { t as _default } from "./as-preset-dialog.vue-Bzv-ON9W.mjs";
2
+ export { _default as default };
@@ -0,0 +1,4 @@
1
+ import "./use-table-state-C4JbonEZ.mjs";
2
+ import "./preset-aspect-display-BYeiSgcc.mjs";
3
+ import { t as as_preset_dialog_default } from "./as-preset-dialog-BdDRgwf_.mjs";
4
+ export { as_preset_dialog_default as default };
@@ -0,0 +1,7 @@
1
+ import * as vue from "vue";
2
+
3
+ //#region src/components/defaults/as-preset-dialog.vue.d.ts
4
+ declare const __VLS_export: vue.DefineComponent<{}, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
5
+ declare const _default: typeof __VLS_export;
6
+ //#endregion
7
+ export { _default as t };
@@ -0,0 +1,7 @@
1
+ import * as vue from "vue";
2
+
3
+ //#region src/components/defaults/as-preset-dialog.vue.d.ts
4
+ declare const __VLS_export: vue.DefineComponent<{}, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
5
+ declare const _default: typeof __VLS_export;
6
+ //#endregion
7
+ export { _default as t };