@atscript/vue-table 0.1.131 → 0.1.133

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 (111) hide show
  1. package/dist/as-action-form-dialog.cjs +42 -30
  2. package/dist/as-action-form-dialog.mjs +42 -30
  3. package/dist/{as-action-menu-content-4UfcabUe.mjs → as-action-menu-content-4D7CJNgr.mjs} +1 -1
  4. package/dist/{as-action-menu-content-C5qx9MPE.cjs → as-action-menu-content-DiS37BYK.cjs} +1 -1
  5. package/dist/as-column-menu.d.cts +1 -1
  6. package/dist/as-column-menu.d.mts +1 -1
  7. package/dist/{as-column-menu.vue-DL5N9mKR.d.mts → as-column-menu.vue-CZ8XqHl0.d.cts} +2 -2
  8. package/dist/{as-column-menu.vue-u_DNy3f-.d.cts → as-column-menu.vue-Cuelpv3p.d.mts} +2 -2
  9. package/dist/{as-config-dialog-BehfqIGd.mjs → as-config-dialog-BKsm8OHR.mjs} +30 -22
  10. package/dist/{as-config-dialog-BOYWPYYH.cjs → as-config-dialog-Bt8oP8qg.cjs} +29 -21
  11. package/dist/as-config-dialog.cjs +1 -1
  12. package/dist/as-config-dialog.mjs +1 -1
  13. package/dist/{as-confirm-dialog-bpN4A-KN.mjs → as-confirm-dialog-BV01t7dn.mjs} +12 -9
  14. package/dist/{as-confirm-dialog-UwhDHysk.cjs → as-confirm-dialog-Cw7KErhz.cjs} +12 -9
  15. package/dist/as-confirm-dialog.cjs +1 -1
  16. package/dist/as-confirm-dialog.mjs +1 -1
  17. package/dist/{as-filter-dialog-Dh2Ylthb.cjs → as-filter-dialog-Bxii-mYH.cjs} +31 -23
  18. package/dist/{as-filter-dialog-D1qzq-8b.mjs → as-filter-dialog-Ckrl79kU.mjs} +32 -24
  19. package/dist/as-filter-dialog.cjs +1 -1
  20. package/dist/as-filter-dialog.mjs +1 -1
  21. package/dist/{as-filter-field-DirBmnbb.mjs → as-filter-field-C-IFnj8K.mjs} +4 -4
  22. package/dist/{as-filter-field-DRsDJdpx.cjs → as-filter-field-xBr6TtKo.cjs} +4 -4
  23. package/dist/as-filter-field.cjs +1 -1
  24. package/dist/as-filter-field.mjs +1 -1
  25. package/dist/as-filters-DJEQj7_p.mjs +125 -0
  26. package/dist/as-filters-DuCk8nkk.cjs +130 -0
  27. package/dist/as-filters.cjs +1 -1
  28. package/dist/as-filters.d.cts +1 -1
  29. package/dist/as-filters.d.mts +1 -1
  30. package/dist/as-filters.mjs +1 -1
  31. package/dist/as-filters.vue-BG_ysCkC.d.mts +65 -0
  32. package/dist/as-filters.vue-DcxDnWAU.d.cts +65 -0
  33. package/dist/{as-preset-dialog-CDqCAR7N.mjs → as-preset-dialog-CCIacZ2C.mjs} +70 -20
  34. package/dist/{as-preset-dialog-DpM06jqR.cjs → as-preset-dialog-jZeyXJeJ.cjs} +74 -24
  35. package/dist/as-preset-dialog.cjs +1 -1
  36. package/dist/as-preset-dialog.mjs +1 -1
  37. package/dist/{as-preset-picker-jUS_YDX8.cjs → as-preset-picker-4xXU1KQz.cjs} +45 -21
  38. package/dist/{as-preset-picker-CISaxEZ0.mjs → as-preset-picker-DGSqQl9A.mjs} +39 -15
  39. package/dist/as-preset-picker.cjs +1 -1
  40. package/dist/as-preset-picker.mjs +1 -1
  41. package/dist/{as-row-actions-Bm6Bzyno.cjs → as-row-actions-B_OHWIAt.cjs} +2 -2
  42. package/dist/{as-row-actions-xqJeAdQl.mjs → as-row-actions-pukI1JT7.mjs} +2 -2
  43. package/dist/as-row-actions.cjs +1 -1
  44. package/dist/as-row-actions.mjs +1 -1
  45. package/dist/{as-table-BWUPzjRn.cjs → as-table-BejpMVid.cjs} +22 -4
  46. package/dist/{as-table-CDSG2yED.mjs → as-table-D5_bQ0p5.mjs} +22 -4
  47. package/dist/{as-table-actions-DMxeaczm.mjs → as-table-actions-DKYK_mTO.mjs} +57 -11
  48. package/dist/{as-table-actions-gV4lqqxc.cjs → as-table-actions-qb0gQz2D.cjs} +56 -10
  49. package/dist/as-table-actions.cjs +1 -1
  50. package/dist/as-table-actions.d.cts +1 -1
  51. package/dist/as-table-actions.d.mts +1 -1
  52. package/dist/as-table-actions.mjs +1 -1
  53. package/dist/{as-table-actions.vue-DTGYOsZh.d.mts → as-table-actions.vue-CckRRsL6.d.cts} +1 -1
  54. package/dist/{as-table-actions.vue-WXkllHVw.d.cts → as-table-actions.vue-DsqauvXR.d.mts} +1 -1
  55. package/dist/{as-table-base-BaTE3VSN.mjs → as-table-base-B0arhJI8.mjs} +141 -46
  56. package/dist/{as-table-base-RG2TEIgV.cjs → as-table-base-Dfw012G5.cjs} +141 -46
  57. package/dist/{as-table-header-cell-CIqlO6Lw.cjs → as-table-header-cell-Bb4ddLmQ.cjs} +1 -1
  58. package/dist/{as-table-header-cell-Bdhl5Lox.mjs → as-table-header-cell-q-c_QklI.mjs} +1 -1
  59. package/dist/as-table-header-cell.cjs +1 -1
  60. package/dist/as-table-header-cell.d.cts +1 -1
  61. package/dist/as-table-header-cell.d.mts +1 -1
  62. package/dist/as-table-header-cell.mjs +1 -1
  63. package/dist/{as-table-header-cell.vue-BCszzxtU.d.mts → as-table-header-cell.vue-BjVOEFqz.d.mts} +1 -1
  64. package/dist/{as-table-header-cell.vue-BzTzfGRo.d.cts → as-table-header-cell.vue-qS1Xfc-U.d.cts} +1 -1
  65. package/dist/{as-table-root-BLReUbRH.mjs → as-table-root-Bpsrp0Vz.mjs} +5 -5
  66. package/dist/{as-table-root-DLJ_3Jf4.cjs → as-table-root-CUDO9ybm.cjs} +5 -5
  67. package/dist/as-table-root.cjs +1 -1
  68. package/dist/as-table-root.d.cts +1 -1
  69. package/dist/as-table-root.d.mts +1 -1
  70. package/dist/as-table-root.mjs +1 -1
  71. package/dist/{as-table-root.vue-BqZl6JQ0.d.mts → as-table-root.vue-BPU92_Ns.d.mts} +59 -16
  72. package/dist/{as-table-root.vue-umgSvVUB.d.cts → as-table-root.vue-szvjZsCn.d.cts} +59 -16
  73. package/dist/{as-table-status-DGTZlpyq.mjs → as-table-status-B9jlzPPV.mjs} +53 -37
  74. package/dist/{as-table-status-Du4WLF4k.cjs → as-table-status-BgDexT2x.cjs} +53 -37
  75. package/dist/as-table.cjs +1 -1
  76. package/dist/as-table.d.cts +1 -1
  77. package/dist/as-table.d.mts +1 -1
  78. package/dist/as-table.mjs +1 -1
  79. package/dist/{as-table.vue-DxtfL26P.d.mts → as-table.vue-4WhMA8AM.d.mts} +27 -3
  80. package/dist/{as-table.vue-D9cCjbtr.d.cts → as-table.vue-_urybtQj.d.cts} +27 -3
  81. package/dist/{as-window-table-jD_y9yet.cjs → as-window-table-CXq6UuUx.cjs} +98 -19
  82. package/dist/{as-window-table-DWujiUQy.mjs → as-window-table-S1XWpDHQ.mjs} +98 -19
  83. package/dist/as-window-table.cjs +1 -1
  84. package/dist/as-window-table.d.cts +1 -1
  85. package/dist/as-window-table.d.mts +1 -1
  86. package/dist/as-window-table.mjs +1 -1
  87. package/dist/{as-window-table.vue-BpvgmsC1.d.mts → as-window-table.vue-CWsJvOkL.d.mts} +26 -3
  88. package/dist/{as-window-table.vue-BavmqDeH.d.cts → as-window-table.vue-h1bdyMv7.d.cts} +26 -3
  89. package/dist/error-message-CglODWl4.cjs +18 -0
  90. package/dist/error-message-hPSAu8Ug.mjs +13 -0
  91. package/dist/index.cjs +61 -29
  92. package/dist/index.d.cts +9 -9
  93. package/dist/index.d.mts +9 -9
  94. package/dist/index.mjs +62 -30
  95. package/dist/{types-CTMxE_zA.d.cts → types-BZ0HssRY.d.cts} +126 -4
  96. package/dist/{types-ByU4O0Yf.d.mts → types-CXz-4dPz.d.mts} +126 -4
  97. package/dist/{use-table-CyFcVtUN.mjs → use-table-Bk-jSxOM.mjs} +26 -11
  98. package/dist/{use-table-nvBq1dZ4.cjs → use-table-CdFFqaEx.cjs} +24 -9
  99. package/dist/{use-table-component-DO_kvKSf.cjs → use-table-component-DlLganVc.cjs} +1 -1
  100. package/dist/{use-table-component-K6xj1obF.mjs → use-table-component-KuzZxAP8.mjs} +1 -1
  101. package/dist/{use-table-nav-bridge-DeGeaQX-.mjs → use-table-nav-bridge-B9SSEajW.mjs} +1 -1
  102. package/dist/{use-table-nav-bridge-uOQUDooh.cjs → use-table-nav-bridge-CVUmTjDr.cjs} +1 -1
  103. package/dist/{use-table-state-Oi2ds4_a.cjs → use-table-state-D6dHOFrA.cjs} +329 -53
  104. package/dist/{use-table-state-BxX3SpeW.mjs → use-table-state-DLJbW753.mjs} +295 -55
  105. package/package.json +9 -9
  106. package/dist/as-filters-DCZTHjf5.cjs +0 -51
  107. package/dist/as-filters-beIud9sF.mjs +0 -46
  108. package/dist/as-filters.vue-DmECMd1v.d.mts +0 -10
  109. package/dist/as-filters.vue-fv-tRL2H.d.cts +0 -10
  110. package/dist/preset-aspect-display-IICxAlVo.mjs +0 -43
  111. package/dist/preset-aspect-display-TWwf6j1B.cjs +0 -72
@@ -0,0 +1,65 @@
1
+ import * as vue from "vue";
2
+
3
+ //#region src/components/as-filters.vue.d.ts
4
+ declare const _default: typeof __VLS_export;
5
+ declare const __VLS_export: vue.DefineComponent<{
6
+ filterFields?: string[];
7
+ /**
8
+ * Hard cap on how many filter fields render inline. Deterministic and
9
+ * count-based — this component never measures the toolbar. Width-driven
10
+ * responsiveness stays with the host, which already knows its own
11
+ * breakpoints and can feed a shorter `filterFields` list (or a smaller
12
+ * `maxVisible`).
13
+ *
14
+ * Omitted (the default) → every field renders inline, exactly as before.
15
+ *
16
+ * @since 0.1.133
17
+ */
18
+ maxVisible?: number;
19
+ /**
20
+ * What happens to the fields past `maxVisible`:
21
+ * - `'popover'` (the default whenever `maxVisible` is set) — they move into
22
+ * a popover behind a "More filters" trigger, which badges the number of
23
+ * ACTIVE hidden filters so nothing silently narrows the table from
24
+ * off-screen.
25
+ * - `'none'` — they are not rendered at all. Pick this only when the host
26
+ * surfaces them elsewhere (e.g. its own filter dialog); an active filter
27
+ * on a dropped field still applies to the query.
28
+ *
29
+ * Ignored when `maxVisible` is omitted.
30
+ *
31
+ * @since 0.1.133
32
+ */
33
+ overflow?: "popover" | "none";
34
+ }, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<{
35
+ filterFields?: string[];
36
+ /**
37
+ * Hard cap on how many filter fields render inline. Deterministic and
38
+ * count-based — this component never measures the toolbar. Width-driven
39
+ * responsiveness stays with the host, which already knows its own
40
+ * breakpoints and can feed a shorter `filterFields` list (or a smaller
41
+ * `maxVisible`).
42
+ *
43
+ * Omitted (the default) → every field renders inline, exactly as before.
44
+ *
45
+ * @since 0.1.133
46
+ */
47
+ maxVisible?: number;
48
+ /**
49
+ * What happens to the fields past `maxVisible`:
50
+ * - `'popover'` (the default whenever `maxVisible` is set) — they move into
51
+ * a popover behind a "More filters" trigger, which badges the number of
52
+ * ACTIVE hidden filters so nothing silently narrows the table from
53
+ * off-screen.
54
+ * - `'none'` — they are not rendered at all. Pick this only when the host
55
+ * surfaces them elsewhere (e.g. its own filter dialog); an active filter
56
+ * on a dropped field still applies to the query.
57
+ *
58
+ * Ignored when `maxVisible` is omitted.
59
+ *
60
+ * @since 0.1.133
61
+ */
62
+ overflow?: "popover" | "none";
63
+ }> & Readonly<{}>, {}, {}, {}, {}, string, vue.ComponentProvideOptions, false, {}, any>;
64
+ //#endregion
65
+ export { _default as t };
@@ -1,9 +1,9 @@
1
- import { a as useTableContext } from "./use-table-state-BxX3SpeW.mjs";
1
+ import { a as useTableContext, c as ASPECT_ICONS, d as readPresetLabel, l as ASPECT_LABELS, u as ownerNameOf } from "./use-table-state-DLJbW753.mjs";
2
2
  import { t as useSeedOnOpen } from "./use-seed-on-open-DO3A1kIb.mjs";
3
- import { a as readPresetLabel, i as ownerNameOf, n as ASPECT_LABELS, r as aspectsOf, t as ASPECT_ICONS } from "./preset-aspect-display-IICxAlVo.mjs";
3
+ import { t as errorMessage } from "./error-message-hPSAu8Ug.mjs";
4
4
  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";
5
5
  import { isSystemPresetId, setsEqual } from "@atscript/ui-table";
6
- import { DialogClose, DialogContent, DialogOverlay, DialogPortal, DialogRoot, DialogTitle } from "reka-ui";
6
+ import { DialogClose, DialogContent, DialogDescription, DialogOverlay, DialogPortal, DialogRoot, DialogTitle } from "reka-ui";
7
7
  //#region src/components/defaults/as-preset-dialog.vue?vue&type=script&setup=true&lang.ts
8
8
  const _hoisted_1 = { class: "as-preset-dialog-header" };
9
9
  const _hoisted_2 = { class: "as-preset-dialog-counter" };
@@ -81,10 +81,15 @@ const _hoisted_26 = { class: "as-preset-dialog-footer" };
81
81
  const _hoisted_27 = { class: "as-preset-dialog-footer-status" };
82
82
  const _hoisted_28 = {
83
83
  key: 0,
84
+ class: "as-preset-dialog-footer-error",
85
+ role: "alert"
86
+ };
87
+ const _hoisted_29 = {
88
+ key: 1,
84
89
  class: "as-preset-dialog-footer-unsaved"
85
90
  };
86
- const _hoisted_29 = { class: "as-preset-dialog-footer-actions" };
87
- const _hoisted_30 = ["disabled"];
91
+ const _hoisted_30 = { class: "as-preset-dialog-footer-actions" };
92
+ const _hoisted_31 = ["disabled"];
88
93
  //#endregion
89
94
  //#region src/components/defaults/as-preset-dialog.vue
90
95
  var as_preset_dialog_default = /* @__PURE__ */ defineComponent({
@@ -162,7 +167,7 @@ var as_preset_dialog_default = /* @__PURE__ */ defineComponent({
162
167
  kind: "system",
163
168
  isPublic: false,
164
169
  ownerLabel: "—",
165
- aspects: [...state.preset.availableAspects],
170
+ aspects: state.preset.ownedAspects(sp.id),
166
171
  pendingLabel: false
167
172
  });
168
173
  const stored = [];
@@ -177,7 +182,7 @@ var as_preset_dialog_default = /* @__PURE__ */ defineComponent({
177
182
  kind: isOwned ? "owned" : "public",
178
183
  isPublic: pendingPublicIds.value.has(row.id),
179
184
  ownerLabel: isOwned ? "you" : ownerNameOf(row, "—"),
180
- aspects: aspectsOf(row, state.preset.availableAspects),
185
+ aspects: state.preset.ownedAspects(row.id),
181
186
  pendingLabel: pending !== void 0 && pending !== original
182
187
  });
183
188
  }
@@ -289,9 +294,15 @@ var as_preset_dialog_default = /* @__PURE__ */ defineComponent({
289
294
  cancelRename();
290
295
  }
291
296
  const saving = ref(false);
297
+ const errorText = ref("");
292
298
  async function save() {
293
299
  if (!isDirty.value || saving.value) return;
294
300
  saving.value = true;
301
+ errorText.value = "";
302
+ const failedLabels = /* @__PURE__ */ new Map();
303
+ const failedPublicIds = /* @__PURE__ */ new Set();
304
+ const failedDeleteIds = /* @__PURE__ */ new Set();
305
+ const failures = [];
295
306
  try {
296
307
  await state.preset.batch(async () => {
297
308
  const deleted = pendingDeleteIds.value;
@@ -304,17 +315,28 @@ var as_preset_dialog_default = /* @__PURE__ */ defineComponent({
304
315
  if (state.preset.isOwned(id)) continue;
305
316
  cleaned.push(id);
306
317
  }
307
- await state.preset.setFavorites(cleaned);
318
+ try {
319
+ await state.preset.setFavorites(cleaned);
320
+ } catch (err) {
321
+ failures.push(errorMessage(err, "The change could not be saved."));
322
+ }
308
323
  }
309
324
  if (pendingDefaultId.value !== serverDefaultId.value) {
310
325
  const next = pendingDefaultId.value && deleted.has(pendingDefaultId.value) ? null : pendingDefaultId.value;
311
- if (next !== serverDefaultId.value) await state.preset.setDefault(next);
326
+ if (next !== serverDefaultId.value) try {
327
+ await state.preset.setDefault(next);
328
+ } catch (err) {
329
+ failures.push(errorMessage(err, "The change could not be saved."));
330
+ }
312
331
  }
313
332
  if (pendingLabels.value.size > 0) for (const [id, label] of pendingLabels.value) {
314
333
  if (deleted.has(id)) continue;
315
334
  try {
316
335
  await state.preset.rename(id, label);
317
- } catch (_err) {}
336
+ } catch (err) {
337
+ failedLabels.set(id, label);
338
+ failures.push(errorMessage(err, "The change could not be saved."));
339
+ }
318
340
  }
319
341
  if (!setsEqual(pendingPublicIds.value, serverPublicIds.value)) {
320
342
  const flips = [];
@@ -328,12 +350,35 @@ var as_preset_dialog_default = /* @__PURE__ */ defineComponent({
328
350
  }
329
351
  for (const id of flips) try {
330
352
  await state.preset.togglePublic(id);
331
- } catch (_err) {}
353
+ } catch (err) {
354
+ failedPublicIds.add(id);
355
+ failures.push(errorMessage(err, "The change could not be saved."));
356
+ }
332
357
  }
333
358
  if (deleted.size > 0) for (const id of deleted) try {
334
359
  await state.preset.remove(id);
335
- } catch (_err) {}
360
+ } catch (err) {
361
+ failedDeleteIds.add(id);
362
+ failures.push(errorMessage(err, "The change could not be saved."));
363
+ }
336
364
  });
365
+ if (failures.length > 0) {
366
+ syncPendingFromServer();
367
+ if (failedLabels.size > 0) {
368
+ const labels = new Map(pendingLabels.value);
369
+ for (const [id, label] of failedLabels) labels.set(id, label);
370
+ pendingLabels.value = labels;
371
+ }
372
+ if (failedPublicIds.size > 0) {
373
+ const publics = new Set(pendingPublicIds.value);
374
+ for (const id of failedPublicIds) if (publics.has(id)) publics.delete(id);
375
+ else publics.add(id);
376
+ pendingPublicIds.value = publics;
377
+ }
378
+ if (failedDeleteIds.size > 0) pendingDeleteIds.value = new Set([...pendingDeleteIds.value, ...failedDeleteIds]);
379
+ errorText.value = failures.length === 1 ? failures[0] : `${failures.length} changes could not be saved.`;
380
+ return;
381
+ }
337
382
  if (pendingActiveId.value !== null && pendingActiveId.value !== state.preset.activeId.value && !pendingDeleteIds.value.has(pendingActiveId.value)) state.preset.apply(pendingActiveId.value);
338
383
  state.preset.dialogOpen.value = false;
339
384
  } finally {
@@ -342,6 +387,7 @@ var as_preset_dialog_default = /* @__PURE__ */ defineComponent({
342
387
  }
343
388
  function discardOrClose() {
344
389
  syncPendingFromServer();
390
+ errorText.value = "";
345
391
  state.preset.dialogOpen.value = false;
346
392
  }
347
393
  function rowFavTitle(row) {
@@ -385,20 +431,24 @@ var as_preset_dialog_default = /* @__PURE__ */ defineComponent({
385
431
  default: withCtx(() => [..._cache[5] || (_cache[5] = [createTextVNode("Presets", -1)])]),
386
432
  _: 1
387
433
  }),
434
+ createVNode(unref(DialogDescription), { class: "sr-only" }, {
435
+ default: withCtx(() => [..._cache[6] || (_cache[6] = [createTextVNode(" Rename, share, favorite, pin as default or delete your saved table views. ", -1)])]),
436
+ _: 1
437
+ }),
388
438
  createElementVNode("span", _hoisted_2, toDisplayString(counterText.value), 1),
389
439
  createVNode(unref(DialogClose), {
390
440
  class: "as-preset-dialog-close",
391
441
  "aria-label": "Close",
392
442
  onClick: withModifiers(discardOrClose, ["prevent"])
393
443
  }, {
394
- default: withCtx(() => [..._cache[6] || (_cache[6] = [createElementVNode("span", {
444
+ default: withCtx(() => [..._cache[7] || (_cache[7] = [createElementVNode("span", {
395
445
  class: "i-as-close",
396
446
  "aria-hidden": "true"
397
447
  }, null, -1)])]),
398
448
  _: 1
399
449
  })
400
450
  ]),
401
- createElementVNode("div", _hoisted_3, [createElementVNode("div", _hoisted_4, [_cache[7] || (_cache[7] = createElementVNode("span", {
451
+ createElementVNode("div", _hoisted_3, [createElementVNode("div", _hoisted_4, [_cache[8] || (_cache[8] = createElementVNode("span", {
402
452
  class: "i-as-search as-preset-dialog-search-icon",
403
453
  "aria-hidden": "true"
404
454
  }, null, -1)), withDirectives(createElementVNode("input", {
@@ -408,7 +458,7 @@ var as_preset_dialog_default = /* @__PURE__ */ defineComponent({
408
458
  type: "search",
409
459
  class: "as-preset-dialog-search-input",
410
460
  placeholder: "Search by name or owner…"
411
- }, null, 512), [[vModelText, searchQuery.value]])]), _cache[8] || (_cache[8] = createElementVNode("div", { class: "as-preset-dialog-legend" }, [
461
+ }, null, 512), [[vModelText, searchQuery.value]])]), _cache[9] || (_cache[9] = createElementVNode("div", { class: "as-preset-dialog-legend" }, [
412
462
  createElementVNode("span", { class: "as-preset-dialog-legend-item" }, [createElementVNode("span", {
413
463
  class: "i-as-pin as-preset-dialog-legend-icon",
414
464
  "aria-hidden": "true"
@@ -517,7 +567,7 @@ var as_preset_dialog_default = /* @__PURE__ */ defineComponent({
517
567
  key: 3,
518
568
  class: "as-preset-dialog-row-public-indicator",
519
569
  title: rowPublicTitle(row)
520
- }, [..._cache[9] || (_cache[9] = [createElementVNode("span", {
570
+ }, [..._cache[10] || (_cache[10] = [createElementVNode("span", {
521
571
  class: "i-as-eye",
522
572
  "aria-hidden": "true"
523
573
  }, null, -1)])], 8, _hoisted_22)) : (openBlock(), createElementBlock("span", _hoisted_23)),
@@ -529,17 +579,17 @@ var as_preset_dialog_default = /* @__PURE__ */ defineComponent({
529
579
  "aria-pressed": pendingDeleteIds.value.has(row.id),
530
580
  title: pendingDeleteIds.value.has(row.id) ? "Marked for deletion — click to undo" : "Mark for deletion (applied on Save)",
531
581
  onClick: ($event) => toggleDeletePending(row.id)
532
- }, [..._cache[10] || (_cache[10] = [createElementVNode("span", {
582
+ }, [..._cache[11] || (_cache[11] = [createElementVNode("span", {
533
583
  class: "i-as-trash",
534
584
  "aria-hidden": "true"
535
585
  }, null, -1)])], 8, _hoisted_24)) : (openBlock(), createElementBlock("span", _hoisted_25))
536
586
  ], 8, _hoisted_8);
537
587
  }), 128))], 64);
538
588
  }), 128))]),
539
- createElementVNode("footer", _hoisted_26, [createElementVNode("div", _hoisted_27, [isDirty.value ? (openBlock(), createElementBlock("span", _hoisted_28, [..._cache[11] || (_cache[11] = [createElementVNode("span", {
589
+ createElementVNode("footer", _hoisted_26, [createElementVNode("div", _hoisted_27, [errorText.value ? (openBlock(), createElementBlock("span", _hoisted_28, toDisplayString(errorText.value), 1)) : isDirty.value ? (openBlock(), createElementBlock("span", _hoisted_29, [..._cache[12] || (_cache[12] = [createElementVNode("span", {
540
590
  class: "as-preset-dialog-footer-unsaved-dot",
541
591
  "aria-hidden": "true"
542
- }, null, -1), createTextVNode(" unsaved changes ", -1)])])) : createCommentVNode("v-if", true)]), createElementVNode("div", _hoisted_29, [createElementVNode("button", {
592
+ }, null, -1), createTextVNode(" unsaved changes ", -1)])])) : createCommentVNode("v-if", true)]), createElementVNode("div", _hoisted_30, [createElementVNode("button", {
543
593
  type: "button",
544
594
  class: "as-preset-dialog-footer-close",
545
595
  onClick: discardOrClose
@@ -548,7 +598,7 @@ var as_preset_dialog_default = /* @__PURE__ */ defineComponent({
548
598
  class: "as-preset-dialog-footer-save",
549
599
  disabled: !isDirty.value || saving.value,
550
600
  onClick: save
551
- }, toDisplayString(saving.value ? "Saving…" : "Save"), 9, _hoisted_30)])])
601
+ }, toDisplayString(saving.value ? "Saving…" : "Save"), 9, _hoisted_31)])])
552
602
  ]),
553
603
  _: 1
554
604
  })]),
@@ -1,6 +1,6 @@
1
- const require_use_table_state = require("./use-table-state-Oi2ds4_a.cjs");
1
+ const require_use_table_state = require("./use-table-state-D6dHOFrA.cjs");
2
2
  const require_use_seed_on_open = require("./use-seed-on-open-Dg9I89fU.cjs");
3
- const require_preset_aspect_display = require("./preset-aspect-display-TWwf6j1B.cjs");
3
+ const require_error_message = require("./error-message-CglODWl4.cjs");
4
4
  let vue = require("vue");
5
5
  let _atscript_ui_table = require("@atscript/ui-table");
6
6
  let reka_ui = require("reka-ui");
@@ -81,10 +81,15 @@ const _hoisted_26 = { class: "as-preset-dialog-footer" };
81
81
  const _hoisted_27 = { class: "as-preset-dialog-footer-status" };
82
82
  const _hoisted_28 = {
83
83
  key: 0,
84
+ class: "as-preset-dialog-footer-error",
85
+ role: "alert"
86
+ };
87
+ const _hoisted_29 = {
88
+ key: 1,
84
89
  class: "as-preset-dialog-footer-unsaved"
85
90
  };
86
- const _hoisted_29 = { class: "as-preset-dialog-footer-actions" };
87
- const _hoisted_30 = ["disabled"];
91
+ const _hoisted_30 = { class: "as-preset-dialog-footer-actions" };
92
+ const _hoisted_31 = ["disabled"];
88
93
  //#endregion
89
94
  //#region src/components/defaults/as-preset-dialog.vue
90
95
  var as_preset_dialog_default = /* @__PURE__ */ (0, vue.defineComponent)({
@@ -162,13 +167,13 @@ var as_preset_dialog_default = /* @__PURE__ */ (0, vue.defineComponent)({
162
167
  kind: "system",
163
168
  isPublic: false,
164
169
  ownerLabel: "—",
165
- aspects: [...state.preset.availableAspects],
170
+ aspects: state.preset.ownedAspects(sp.id),
166
171
  pendingLabel: false
167
172
  });
168
173
  const stored = [];
169
174
  for (const row of state.preset.presets.value) {
170
175
  const isOwned = state.preset.isOwned(row.id);
171
- const original = require_preset_aspect_display.readPresetLabel(row);
176
+ const original = require_use_table_state.readPresetLabel(row);
172
177
  const pending = pendingLabels.value.get(row.id);
173
178
  const liveLabel = pending ?? original;
174
179
  stored.push({
@@ -176,8 +181,8 @@ var as_preset_dialog_default = /* @__PURE__ */ (0, vue.defineComponent)({
176
181
  label: liveLabel,
177
182
  kind: isOwned ? "owned" : "public",
178
183
  isPublic: pendingPublicIds.value.has(row.id),
179
- ownerLabel: isOwned ? "you" : require_preset_aspect_display.ownerNameOf(row, "—"),
180
- aspects: require_preset_aspect_display.aspectsOf(row, state.preset.availableAspects),
184
+ ownerLabel: isOwned ? "you" : require_use_table_state.ownerNameOf(row, "—"),
185
+ aspects: state.preset.ownedAspects(row.id),
181
186
  pendingLabel: pending !== void 0 && pending !== original
182
187
  });
183
188
  }
@@ -279,7 +284,7 @@ var as_preset_dialog_default = /* @__PURE__ */ (0, vue.defineComponent)({
279
284
  const id = editingId.value;
280
285
  const next = editingValue.value.trim();
281
286
  const row = state.preset.presetsById.value.get(id);
282
- const original = row ? require_preset_aspect_display.readPresetLabel(row) : "";
287
+ const original = row ? require_use_table_state.readPresetLabel(row) : "";
283
288
  const map = new Map(pendingLabels.value);
284
289
  if (!next || next === original) map.delete(id);
285
290
  else map.set(id, next);
@@ -289,9 +294,15 @@ var as_preset_dialog_default = /* @__PURE__ */ (0, vue.defineComponent)({
289
294
  cancelRename();
290
295
  }
291
296
  const saving = (0, vue.ref)(false);
297
+ const errorText = (0, vue.ref)("");
292
298
  async function save() {
293
299
  if (!isDirty.value || saving.value) return;
294
300
  saving.value = true;
301
+ errorText.value = "";
302
+ const failedLabels = /* @__PURE__ */ new Map();
303
+ const failedPublicIds = /* @__PURE__ */ new Set();
304
+ const failedDeleteIds = /* @__PURE__ */ new Set();
305
+ const failures = [];
295
306
  try {
296
307
  await state.preset.batch(async () => {
297
308
  const deleted = pendingDeleteIds.value;
@@ -304,17 +315,28 @@ var as_preset_dialog_default = /* @__PURE__ */ (0, vue.defineComponent)({
304
315
  if (state.preset.isOwned(id)) continue;
305
316
  cleaned.push(id);
306
317
  }
307
- await state.preset.setFavorites(cleaned);
318
+ try {
319
+ await state.preset.setFavorites(cleaned);
320
+ } catch (err) {
321
+ failures.push(require_error_message.errorMessage(err, "The change could not be saved."));
322
+ }
308
323
  }
309
324
  if (pendingDefaultId.value !== serverDefaultId.value) {
310
325
  const next = pendingDefaultId.value && deleted.has(pendingDefaultId.value) ? null : pendingDefaultId.value;
311
- if (next !== serverDefaultId.value) await state.preset.setDefault(next);
326
+ if (next !== serverDefaultId.value) try {
327
+ await state.preset.setDefault(next);
328
+ } catch (err) {
329
+ failures.push(require_error_message.errorMessage(err, "The change could not be saved."));
330
+ }
312
331
  }
313
332
  if (pendingLabels.value.size > 0) for (const [id, label] of pendingLabels.value) {
314
333
  if (deleted.has(id)) continue;
315
334
  try {
316
335
  await state.preset.rename(id, label);
317
- } catch (_err) {}
336
+ } catch (err) {
337
+ failedLabels.set(id, label);
338
+ failures.push(require_error_message.errorMessage(err, "The change could not be saved."));
339
+ }
318
340
  }
319
341
  if (!(0, _atscript_ui_table.setsEqual)(pendingPublicIds.value, serverPublicIds.value)) {
320
342
  const flips = [];
@@ -328,12 +350,35 @@ var as_preset_dialog_default = /* @__PURE__ */ (0, vue.defineComponent)({
328
350
  }
329
351
  for (const id of flips) try {
330
352
  await state.preset.togglePublic(id);
331
- } catch (_err) {}
353
+ } catch (err) {
354
+ failedPublicIds.add(id);
355
+ failures.push(require_error_message.errorMessage(err, "The change could not be saved."));
356
+ }
332
357
  }
333
358
  if (deleted.size > 0) for (const id of deleted) try {
334
359
  await state.preset.remove(id);
335
- } catch (_err) {}
360
+ } catch (err) {
361
+ failedDeleteIds.add(id);
362
+ failures.push(require_error_message.errorMessage(err, "The change could not be saved."));
363
+ }
336
364
  });
365
+ if (failures.length > 0) {
366
+ syncPendingFromServer();
367
+ if (failedLabels.size > 0) {
368
+ const labels = new Map(pendingLabels.value);
369
+ for (const [id, label] of failedLabels) labels.set(id, label);
370
+ pendingLabels.value = labels;
371
+ }
372
+ if (failedPublicIds.size > 0) {
373
+ const publics = new Set(pendingPublicIds.value);
374
+ for (const id of failedPublicIds) if (publics.has(id)) publics.delete(id);
375
+ else publics.add(id);
376
+ pendingPublicIds.value = publics;
377
+ }
378
+ if (failedDeleteIds.size > 0) pendingDeleteIds.value = new Set([...pendingDeleteIds.value, ...failedDeleteIds]);
379
+ errorText.value = failures.length === 1 ? failures[0] : `${failures.length} changes could not be saved.`;
380
+ return;
381
+ }
337
382
  if (pendingActiveId.value !== null && pendingActiveId.value !== state.preset.activeId.value && !pendingDeleteIds.value.has(pendingActiveId.value)) state.preset.apply(pendingActiveId.value);
338
383
  state.preset.dialogOpen.value = false;
339
384
  } finally {
@@ -342,6 +387,7 @@ var as_preset_dialog_default = /* @__PURE__ */ (0, vue.defineComponent)({
342
387
  }
343
388
  function discardOrClose() {
344
389
  syncPendingFromServer();
390
+ errorText.value = "";
345
391
  state.preset.dialogOpen.value = false;
346
392
  }
347
393
  function rowFavTitle(row) {
@@ -385,20 +431,24 @@ var as_preset_dialog_default = /* @__PURE__ */ (0, vue.defineComponent)({
385
431
  default: (0, vue.withCtx)(() => [..._cache[5] || (_cache[5] = [(0, vue.createTextVNode)("Presets", -1)])]),
386
432
  _: 1
387
433
  }),
434
+ (0, vue.createVNode)((0, vue.unref)(reka_ui.DialogDescription), { class: "sr-only" }, {
435
+ default: (0, vue.withCtx)(() => [..._cache[6] || (_cache[6] = [(0, vue.createTextVNode)(" Rename, share, favorite, pin as default or delete your saved table views. ", -1)])]),
436
+ _: 1
437
+ }),
388
438
  (0, vue.createElementVNode)("span", _hoisted_2, (0, vue.toDisplayString)(counterText.value), 1),
389
439
  (0, vue.createVNode)((0, vue.unref)(reka_ui.DialogClose), {
390
440
  class: "as-preset-dialog-close",
391
441
  "aria-label": "Close",
392
442
  onClick: (0, vue.withModifiers)(discardOrClose, ["prevent"])
393
443
  }, {
394
- default: (0, vue.withCtx)(() => [..._cache[6] || (_cache[6] = [(0, vue.createElementVNode)("span", {
444
+ default: (0, vue.withCtx)(() => [..._cache[7] || (_cache[7] = [(0, vue.createElementVNode)("span", {
395
445
  class: "i-as-close",
396
446
  "aria-hidden": "true"
397
447
  }, null, -1)])]),
398
448
  _: 1
399
449
  })
400
450
  ]),
401
- (0, vue.createElementVNode)("div", _hoisted_3, [(0, vue.createElementVNode)("div", _hoisted_4, [_cache[7] || (_cache[7] = (0, vue.createElementVNode)("span", {
451
+ (0, vue.createElementVNode)("div", _hoisted_3, [(0, vue.createElementVNode)("div", _hoisted_4, [_cache[8] || (_cache[8] = (0, vue.createElementVNode)("span", {
402
452
  class: "i-as-search as-preset-dialog-search-icon",
403
453
  "aria-hidden": "true"
404
454
  }, null, -1)), (0, vue.withDirectives)((0, vue.createElementVNode)("input", {
@@ -408,7 +458,7 @@ var as_preset_dialog_default = /* @__PURE__ */ (0, vue.defineComponent)({
408
458
  type: "search",
409
459
  class: "as-preset-dialog-search-input",
410
460
  placeholder: "Search by name or owner…"
411
- }, null, 512), [[vue.vModelText, searchQuery.value]])]), _cache[8] || (_cache[8] = (0, vue.createElementVNode)("div", { class: "as-preset-dialog-legend" }, [
461
+ }, null, 512), [[vue.vModelText, searchQuery.value]])]), _cache[9] || (_cache[9] = (0, vue.createElementVNode)("div", { class: "as-preset-dialog-legend" }, [
412
462
  (0, vue.createElementVNode)("span", { class: "as-preset-dialog-legend-item" }, [(0, vue.createElementVNode)("span", {
413
463
  class: "i-as-pin as-preset-dialog-legend-icon",
414
464
  "aria-hidden": "true"
@@ -496,9 +546,9 @@ var as_preset_dialog_default = /* @__PURE__ */ (0, vue.defineComponent)({
496
546
  key: a,
497
547
  class: "as-preset-dialog-aspect-chip",
498
548
  "data-on": row.aspects.includes(a) ? "" : void 0,
499
- title: (0, vue.unref)(require_preset_aspect_display.ASPECT_LABELS)[a]
549
+ title: (0, vue.unref)(require_use_table_state.ASPECT_LABELS)[a]
500
550
  }, [(0, vue.createElementVNode)("span", {
501
- class: (0, vue.normalizeClass)((0, vue.unref)(require_preset_aspect_display.ASPECT_ICONS)[a]),
551
+ class: (0, vue.normalizeClass)((0, vue.unref)(require_use_table_state.ASPECT_ICONS)[a]),
502
552
  "aria-hidden": "true"
503
553
  }, null, 2)], 8, _hoisted_20);
504
554
  }), 128))]),
@@ -517,7 +567,7 @@ var as_preset_dialog_default = /* @__PURE__ */ (0, vue.defineComponent)({
517
567
  key: 3,
518
568
  class: "as-preset-dialog-row-public-indicator",
519
569
  title: rowPublicTitle(row)
520
- }, [..._cache[9] || (_cache[9] = [(0, vue.createElementVNode)("span", {
570
+ }, [..._cache[10] || (_cache[10] = [(0, vue.createElementVNode)("span", {
521
571
  class: "i-as-eye",
522
572
  "aria-hidden": "true"
523
573
  }, null, -1)])], 8, _hoisted_22)) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_23)),
@@ -529,17 +579,17 @@ var as_preset_dialog_default = /* @__PURE__ */ (0, vue.defineComponent)({
529
579
  "aria-pressed": pendingDeleteIds.value.has(row.id),
530
580
  title: pendingDeleteIds.value.has(row.id) ? "Marked for deletion — click to undo" : "Mark for deletion (applied on Save)",
531
581
  onClick: ($event) => toggleDeletePending(row.id)
532
- }, [..._cache[10] || (_cache[10] = [(0, vue.createElementVNode)("span", {
582
+ }, [..._cache[11] || (_cache[11] = [(0, vue.createElementVNode)("span", {
533
583
  class: "i-as-trash",
534
584
  "aria-hidden": "true"
535
585
  }, null, -1)])], 8, _hoisted_24)) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_25))
536
586
  ], 8, _hoisted_8);
537
587
  }), 128))], 64);
538
588
  }), 128))]),
539
- (0, vue.createElementVNode)("footer", _hoisted_26, [(0, vue.createElementVNode)("div", _hoisted_27, [isDirty.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_28, [..._cache[11] || (_cache[11] = [(0, vue.createElementVNode)("span", {
589
+ (0, vue.createElementVNode)("footer", _hoisted_26, [(0, vue.createElementVNode)("div", _hoisted_27, [errorText.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_28, (0, vue.toDisplayString)(errorText.value), 1)) : isDirty.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_29, [..._cache[12] || (_cache[12] = [(0, vue.createElementVNode)("span", {
540
590
  class: "as-preset-dialog-footer-unsaved-dot",
541
591
  "aria-hidden": "true"
542
- }, null, -1), (0, vue.createTextVNode)(" unsaved changes ", -1)])])) : (0, vue.createCommentVNode)("v-if", true)]), (0, vue.createElementVNode)("div", _hoisted_29, [(0, vue.createElementVNode)("button", {
592
+ }, null, -1), (0, vue.createTextVNode)(" unsaved changes ", -1)])])) : (0, vue.createCommentVNode)("v-if", true)]), (0, vue.createElementVNode)("div", _hoisted_30, [(0, vue.createElementVNode)("button", {
543
593
  type: "button",
544
594
  class: "as-preset-dialog-footer-close",
545
595
  onClick: discardOrClose
@@ -548,7 +598,7 @@ var as_preset_dialog_default = /* @__PURE__ */ (0, vue.defineComponent)({
548
598
  class: "as-preset-dialog-footer-save",
549
599
  disabled: !isDirty.value || saving.value,
550
600
  onClick: save
551
- }, (0, vue.toDisplayString)(saving.value ? "Saving…" : "Save"), 9, _hoisted_30)])])
601
+ }, (0, vue.toDisplayString)(saving.value ? "Saving…" : "Save"), 9, _hoisted_31)])])
552
602
  ]),
553
603
  _: 1
554
604
  })]),
@@ -1,2 +1,2 @@
1
- const require_as_preset_dialog = require("./as-preset-dialog-DpM06jqR.cjs");
1
+ const require_as_preset_dialog = require("./as-preset-dialog-jZeyXJeJ.cjs");
2
2
  module.exports = require_as_preset_dialog.as_preset_dialog_default;
@@ -1,2 +1,2 @@
1
- import { t as as_preset_dialog_default } from "./as-preset-dialog-CDqCAR7N.mjs";
1
+ import { t as as_preset_dialog_default } from "./as-preset-dialog-CCIacZ2C.mjs";
2
2
  export { as_preset_dialog_default as default };