@webx-ui/module-admin 0.9.0 → 0.12.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.
package/dist/index.js CHANGED
@@ -1,17 +1,275 @@
1
- import { defineComponent as W, useModel as pe, openBlock as p, createElementBlock as b, normalizeClass as le, createBlock as _, unref as r, withCtx as g, createTextVNode as R, toDisplayString as C, createCommentVNode as E, renderSlot as z, Fragment as U, mergeModels as oe, inject as G, reactive as se, computed as k, mergeProps as $e, watch as J, resolveComponent as A, renderList as F, ref as L, watchEffect as Te, onUnmounted as Se, createVNode as x, createElementVNode as M, isRef as Ae, createApp as Ce, h as O, withModifiers as ve, nextTick as Le, withKeys as Re } from "vue";
2
- import { useRouter as ge, useRoute as ze, createRouter as We, createWebHistory as Ee, RouterLink as Ue } from "vue-router";
3
- import { WxHeading as Ie, WxTabs as De, WxCard as me, WxRichText as Me, WxResult as Be, useResponsiveShell as Ne, shellLayoutFor as Pe, WxToaster as Ve, WebxUI as He, localesKey as Fe, WxAlert as Oe, WxSkeleton as we, WxActions as je, WxDropdownItem as qe, WxAction as de, WxPopover as Ke, WxInput as Ye, WxButton as Y, WxDialog as Xe, WxTooltip as Ge, WxText as X, WxEmpty as Je, WxAvatar as Qe, WxTextarea as fe, toast as P, confirm as Ze } from "@webx-ui/core";
4
- import { WxScreenRenderer as et } from "@webx-ui/schema";
5
- const tt = ["data-wx-fill"], nt = {
1
+ import { inject as te, reactive as oe, defineComponent as R, computed as x, openBlock as h, createBlock as w, unref as i, withModifiers as pe, withCtx as g, createElementBlock as k, Fragment as I, renderList as P, createCommentVNode as z, createVNode as _, createTextVNode as W, toDisplayString as C, useSlots as Le, useTemplateRef as ze, normalizeClass as H, renderSlot as L, createElementVNode as M, createSlots as ge, useModel as be, mergeModels as ie, mergeProps as We, watch as Y, resolveComponent as U, ref as A, watchEffect as Ae, onUnmounted as Re, isRef as Ee, createApp as Ue, h as G, onBeforeUnmount as Be, nextTick as Ie, withKeys as Me } from "vue";
2
+ import { RouterLink as De, useRouter as we, useRoute as Ne, createRouter as Pe, createWebHistory as Ve } from "vue-router";
3
+ import { WxAction as K, WxActions as Fe, WxDropdownItem as He, useElementWidth as Oe, WxHeading as je, WxText as q, WxButton as j, WxIcon as ye, WxTabs as qe, WxCard as me, WxRichText as Ye, WxResult as Ke, useResponsiveShell as Xe, shellLayoutFor as Ge, WxToaster as Je, WebxUI as Qe, dateLocaleKey as Ze, localesKey as et, WxAlert as tt, WxSkeleton as xe, WxBadge as nt, WxPopover as at, WxInput as lt, WxDialog as st, WxTooltip as ot, WxEmpty as it, WxAvatar as rt, WxTextarea as fe, toast as F, confirm as ut } from "@webx-ui/core";
4
+ import { WxScreenRenderer as dt } from "@webx-ui/schema";
5
+ const ne = /* @__PURE__ */ Symbol("webx-i18n");
6
+ function Ln() {
7
+ const e = te(ne, null);
8
+ if (e === null)
9
+ throw new Error("useI18n() was called outside a panel created by createAdmin().");
10
+ return e;
11
+ }
12
+ function B(e) {
13
+ const n = te(ne, null);
14
+ return n === null ? de().scope(e) : n.scope(e);
15
+ }
16
+ function ct(e, n) {
17
+ e.provide(ne, n);
18
+ }
19
+ function de(e = {}) {
20
+ const n = e.fallback ?? "en", t = oe({
21
+ locale: e.locale ?? n,
22
+ fallback: n,
23
+ panelLocales: [],
24
+ contentLocales: []
25
+ }), a = {}, u = oe({ value: {} });
26
+ function s(o, r, m) {
27
+ let v = o[r]?.[m[0] ?? ""];
28
+ for (const f of m.slice(1)) {
29
+ if (typeof v != "object" || v === null)
30
+ return null;
31
+ v = v[f];
32
+ }
33
+ return typeof v == "string" ? v : null;
34
+ }
35
+ function l(o, r, m) {
36
+ const [v, f] = r.includes("::") ? r.split("::", 2) : [o, r], d = f.split("."), p = s(u.value, v, d) ?? s(a, v, d) ?? // Not an empty string: a key on screen is ugly, but it says which key, and a blank
37
+ // label says nothing to anybody trying to fix it.
38
+ r;
39
+ return m === void 0 ? p : mt(p, m);
40
+ }
41
+ return {
42
+ state: t,
43
+ defaults(o, r) {
44
+ a[o] = { ...a[o], ...r };
45
+ },
46
+ load(o, r, m) {
47
+ u.value = o ?? {}, t.locale = r ?? t.locale, m !== void 0 && (t.fallback = m);
48
+ },
49
+ scope(o) {
50
+ return (r, m) => l(o, r, m);
51
+ },
52
+ t: (o, r) => l("", o, r)
53
+ };
54
+ }
55
+ function mt(e, n) {
56
+ let t = e;
57
+ for (const [a, u] of Object.entries(n))
58
+ t = t.replaceAll(`:${a}`, String(u));
59
+ return t;
60
+ }
61
+ const ft = /* @__PURE__ */ R({
62
+ __name: "BackButton",
63
+ props: {
64
+ to: {},
65
+ label: { default: void 0 },
66
+ size: { default: "sm" }
67
+ },
68
+ setup(e) {
69
+ const n = e, t = B("webx-admin"), a = x(() => n.label ?? t("editor.back"));
70
+ return (u, s) => (h(), w(i(K), {
71
+ icon: "arrow-left",
72
+ class: "wx-back-button",
73
+ as: i(De),
74
+ to: e.to,
75
+ title: a.value,
76
+ size: e.size,
77
+ "tooltip-side": "bottom"
78
+ }, null, 8, ["as", "to", "title", "size"]));
79
+ }
80
+ }), vt = {
6
81
  key: 0,
7
- class: "wx-list-screen__head"
8
- }, at = {
9
- key: 1,
10
- class: "wx-list-screen__actions"
11
- }, lt = /* @__PURE__ */ W({
82
+ class: "wx-dropdown__divider"
83
+ }, ht = /* @__PURE__ */ R({
84
+ __name: "RowMenu",
85
+ props: {
86
+ actions: {},
87
+ label: { default: void 0 },
88
+ size: { default: "sm" }
89
+ },
90
+ setup(e) {
91
+ const n = B("webx-admin"), t = e, a = x(() => [
92
+ ...t.actions.filter((s) => !s.danger),
93
+ ...t.actions.filter((s) => s.danger)
94
+ ]), u = x(() => {
95
+ const s = a.value.find((l) => l.danger);
96
+ return s && a.value[0] !== s ? s.key : null;
97
+ });
98
+ return (s, l) => a.value.length > 0 ? (h(), w(i(Fe), {
99
+ key: 0,
100
+ class: "wx-row-menu",
101
+ collapse: "always",
102
+ align: "end",
103
+ size: e.size,
104
+ "aria-label": e.label,
105
+ onClick: l[0] || (l[0] = pe(() => {
106
+ }, ["stop"]))
107
+ }, {
108
+ trigger: g(() => [
109
+ _(i(K), {
110
+ type: "more",
111
+ size: e.size,
112
+ title: i(n)("editor.more")
113
+ }, null, 8, ["size", "title"])
114
+ ]),
115
+ collapsed: g(() => [
116
+ (h(!0), k(I, null, P(a.value, (o) => (h(), k(I, {
117
+ key: o.key
118
+ }, [
119
+ o.key === u.value ? (h(), k("hr", vt)) : z("", !0),
120
+ _(i(He), {
121
+ icon: o.icon,
122
+ tone: o.danger ? "danger" : "default",
123
+ href: o.href,
124
+ target: o.href ? o.target ?? "_blank" : void 0,
125
+ disabled: o.disabled,
126
+ onClick: (r) => o.run?.()
127
+ }, {
128
+ default: g(() => [
129
+ W(C(o.label), 1)
130
+ ]),
131
+ _: 2
132
+ }, 1032, ["icon", "tone", "href", "target", "disabled", "onClick"])
133
+ ], 64))), 128))
134
+ ]),
135
+ _: 1
136
+ }, 8, ["size", "aria-label"])) : z("", !0);
137
+ }
138
+ }), N = (e, n) => {
139
+ const t = e.__vccOpts || e;
140
+ for (const [a, u] of n)
141
+ t[a] = u;
142
+ return t;
143
+ }, ke = /* @__PURE__ */ N(ht, [["__scopeId", "data-v-cab01f7f"]]), pt = ["data-level"], gt = {
144
+ key: 0,
145
+ class: "wx-screen-head__trail"
146
+ }, bt = { class: "wx-screen-head__name" }, wt = {
147
+ key: 4,
148
+ class: "wx-screen-head__actions"
149
+ }, yt = /* @__PURE__ */ R({
150
+ __name: "ScreenHead",
151
+ props: {
152
+ title: { default: void 0 },
153
+ subtitle: { default: void 0 },
154
+ back: { type: Boolean, default: void 0 },
155
+ backLabel: { default: void 0 },
156
+ level: { default: 2 },
157
+ actions: { default: void 0 },
158
+ collapseBelow: { default: 720 },
159
+ divider: { type: Boolean, default: !1 }
160
+ },
161
+ emits: ["back"],
162
+ setup(e, { emit: n }) {
163
+ const t = e, a = n, u = B("webx-admin"), s = Le(), l = ze("root"), o = Oe(l), r = x(() => o.value > 0 && o.value < t.collapseBelow), m = x(() => t.actions ?? []), v = x(
164
+ () => m.value.find((c) => c.primary) ?? null
165
+ ), f = x(() => r.value ? v.value ? [v.value] : [] : m.value.filter((c) => !c.menu && !c.danger)), d = x(() => r.value ? m.value.filter((c) => c !== v.value) : m.value.filter((c) => c.menu || c.danger)), p = x(
166
+ () => t.back && t.back !== !0 ? t.back : null
167
+ ), b = x(
168
+ () => f.value.length > 0 || d.value.length > 0 || !!s.extra
169
+ );
170
+ return (c, y) => (h(), k("div", {
171
+ ref_key: "root",
172
+ ref: l,
173
+ class: H(["wx-screen-head", {
174
+ "is-narrow": r.value,
175
+ "has-button": f.value.length > 0,
176
+ "has-trail": !!c.$slots.trail,
177
+ "has-divider": e.divider
178
+ }]),
179
+ "data-level": e.level
180
+ }, [
181
+ c.$slots.trail ? (h(), k("div", gt, [
182
+ L(c.$slots, "trail", {}, void 0, !0)
183
+ ])) : z("", !0),
184
+ p.value ? (h(), w(ft, {
185
+ key: 1,
186
+ class: "wx-screen-head__back",
187
+ to: p.value,
188
+ label: e.backLabel,
189
+ "tooltip-side": "bottom"
190
+ }, null, 8, ["to", "label"])) : e.back ? (h(), w(i(K), {
191
+ key: 2,
192
+ class: "wx-screen-head__back",
193
+ icon: "arrow-left",
194
+ size: "sm",
195
+ "tooltip-side": "bottom",
196
+ title: e.backLabel ?? i(u)("editor.back"),
197
+ onClick: y[0] || (y[0] = ($) => a("back"))
198
+ }, null, 8, ["title"])) : z("", !0),
199
+ M("div", bt, [
200
+ e.title ? (h(), w(i(je), {
201
+ key: 0,
202
+ level: e.level,
203
+ truncate: "",
204
+ class: "wx-screen-head__title"
205
+ }, {
206
+ default: g(() => [
207
+ W(C(e.title), 1)
208
+ ]),
209
+ _: 1
210
+ }, 8, ["level"])) : z("", !0),
211
+ L(c.$slots, "title-after", {}, void 0, !0)
212
+ ]),
213
+ e.subtitle || c.$slots.subtitle ? (h(), w(i(q), {
214
+ key: 3,
215
+ class: "wx-screen-head__subtitle",
216
+ size: "sm",
217
+ tone: "muted",
218
+ truncate: ""
219
+ }, {
220
+ default: g(() => [
221
+ L(c.$slots, "subtitle", {}, () => [
222
+ W(C(e.subtitle), 1)
223
+ ], !0)
224
+ ]),
225
+ _: 3
226
+ })) : z("", !0),
227
+ b.value ? (h(), k("div", wt, [
228
+ L(c.$slots, "extra", {}, void 0, !0),
229
+ (h(!0), k(I, null, P(f.value, ($) => (h(), w(i(j), {
230
+ key: $.key,
231
+ class: H(["wx-screen-head__button", { "is-primary": $.primary }]),
232
+ type: $.primary ? "primary" : "default",
233
+ variant: $.primary ? "solid" : $.variant ?? "outline",
234
+ loading: $.loading,
235
+ disabled: $.disabled,
236
+ href: $.href,
237
+ target: $.href ? $.target ?? "_blank" : void 0,
238
+ rel: $.href ? "noopener" : void 0,
239
+ onClick: (X) => $.run?.()
240
+ }, ge({
241
+ default: g(() => [
242
+ W(" " + C($.label), 1)
243
+ ]),
244
+ _: 2
245
+ }, [
246
+ $.icon ? {
247
+ name: "icon",
248
+ fn: g(() => [
249
+ _(i(ye), {
250
+ name: $.icon
251
+ }, null, 8, ["name"])
252
+ ]),
253
+ key: "0"
254
+ } : void 0
255
+ ]), 1032, ["class", "type", "variant", "loading", "disabled", "href", "target", "rel", "onClick"]))), 128)),
256
+ d.value.length > 0 ? (h(), w(ke, {
257
+ key: 0,
258
+ actions: d.value,
259
+ size: "lg",
260
+ label: e.title ?? i(u)("editor.more")
261
+ }, null, 8, ["actions", "label"])) : z("", !0)
262
+ ])) : z("", !0)
263
+ ], 10, pt));
264
+ }
265
+ }), xt = /* @__PURE__ */ N(yt, [["__scopeId", "data-v-e27d184e"]]), kt = ["data-wx-fill"], _t = /* @__PURE__ */ R({
12
266
  __name: "ListScreen",
13
- props: /* @__PURE__ */ oe({
267
+ props: /* @__PURE__ */ ie({
14
268
  title: { default: void 0 },
269
+ subtitle: { default: void 0 },
270
+ back: { default: void 0 },
271
+ backLabel: { default: void 0 },
272
+ actions: { default: void 0 },
15
273
  views: { default: void 0 },
16
274
  card: { type: Boolean, default: !0 },
17
275
  padding: { default: void 0 },
@@ -23,129 +281,71 @@ const tt = ["data-wx-fill"], nt = {
23
281
  }),
24
282
  emits: ["update:view"],
25
283
  setup(e) {
26
- const n = pe(e, "view");
27
- return (t, a) => (p(), b("div", {
28
- class: le(["wx-list-screen", { "is-fill": e.fill }]),
284
+ const n = be(e, "view");
285
+ return (t, a) => (h(), k("div", {
286
+ class: H(["wx-list-screen", { "is-fill": e.fill }]),
29
287
  "data-wx-fill": e.fill ? "" : void 0
30
288
  }, [
31
- e.title || t.$slots.actions ? (p(), b("div", nt, [
32
- e.title ? (p(), _(r(Ie), {
33
- key: 0,
34
- level: 2,
35
- class: "wx-list-screen__title"
36
- }, {
37
- default: g(() => [
38
- R(C(e.title), 1)
289
+ e.title || e.actions || t.$slots.actions ? (h(), w(xt, {
290
+ key: 0,
291
+ class: "wx-list-screen__head",
292
+ title: e.title,
293
+ subtitle: e.subtitle,
294
+ back: e.back,
295
+ "back-label": e.backLabel,
296
+ actions: e.actions,
297
+ "collapse-below": 480
298
+ }, ge({ _: 2 }, [
299
+ t.$slots.actions ? {
300
+ name: "extra",
301
+ fn: g(() => [
302
+ L(t.$slots, "actions", {}, void 0, !0)
39
303
  ]),
40
- _: 1
41
- })) : E("", !0),
42
- t.$slots.actions ? (p(), b("div", at, [
43
- z(t.$slots, "actions", {}, void 0, !0)
44
- ])) : E("", !0)
45
- ])) : E("", !0),
46
- e.views && e.views.length > 0 ? (p(), _(r(De), {
304
+ key: "0"
305
+ } : void 0
306
+ ]), 1032, ["title", "subtitle", "back", "back-label", "actions"])) : z("", !0),
307
+ e.views && e.views.length > 0 ? (h(), w(i(qe), {
47
308
  key: 1,
48
309
  modelValue: n.value,
49
- "onUpdate:modelValue": a[0] || (a[0] = (i) => n.value = i),
310
+ "onUpdate:modelValue": a[0] || (a[0] = (u) => n.value = u),
50
311
  class: "wx-list-screen__views",
51
312
  items: e.views,
52
313
  "collapse-below": e.collapseBelow,
53
314
  "aria-label": e.title
54
315
  }, {
55
316
  default: g(() => [
56
- e.card ? (p(), _(r(me), {
317
+ e.card ? (h(), w(i(me), {
57
318
  key: 0,
58
319
  class: "wx-list-screen__card",
59
320
  padding: e.padding
60
321
  }, {
61
322
  default: g(() => [
62
- z(t.$slots, "default", {}, void 0, !0)
323
+ L(t.$slots, "default", {}, void 0, !0)
63
324
  ]),
64
325
  _: 3
65
- }, 8, ["padding"])) : z(t.$slots, "default", {}, void 0, !0, 1)
326
+ }, 8, ["padding"])) : L(t.$slots, "default", {}, void 0, !0, 1)
66
327
  ]),
67
328
  _: 3
68
- }, 8, ["modelValue", "items", "collapse-below", "aria-label"])) : (p(), b(U, { key: 2 }, [
69
- e.card ? (p(), _(r(me), {
329
+ }, 8, ["modelValue", "items", "collapse-below", "aria-label"])) : (h(), k(I, { key: 2 }, [
330
+ e.card ? (h(), w(i(me), {
70
331
  key: 0,
71
332
  class: "wx-list-screen__card",
72
333
  padding: e.padding
73
334
  }, {
74
335
  default: g(() => [
75
- z(t.$slots, "default", {}, void 0, !0)
336
+ L(t.$slots, "default", {}, void 0, !0)
76
337
  ]),
77
338
  _: 3
78
- }, 8, ["padding"])) : z(t.$slots, "default", {}, void 0, !0, 1)
339
+ }, 8, ["padding"])) : L(t.$slots, "default", {}, void 0, !0, 1)
79
340
  ], 64))
80
- ], 10, tt));
81
- }
82
- }), V = (e, n) => {
83
- const t = e.__vccOpts || e;
84
- for (const [a, i] of n)
85
- t[a] = i;
86
- return t;
87
- }, ot = /* @__PURE__ */ V(lt, [["__scopeId", "data-v-7586ed04"]]), Q = /* @__PURE__ */ Symbol("webx-i18n");
88
- function fn() {
89
- const e = G(Q, null);
90
- if (e === null)
91
- throw new Error("useI18n() was called outside a panel created by createAdmin().");
92
- return e;
93
- }
94
- function I(e) {
95
- const n = G(Q, null);
96
- return n === null ? ue().scope(e) : n.scope(e);
97
- }
98
- function st(e, n) {
99
- e.provide(Q, n);
100
- }
101
- function ue(e = {}) {
102
- const n = e.fallback ?? "en", t = se({
103
- locale: e.locale ?? n,
104
- fallback: n,
105
- panelLocales: [],
106
- contentLocales: []
107
- }), a = {}, i = se({ value: {} });
108
- function o(d, s, c) {
109
- let f = d[s]?.[c[0] ?? ""];
110
- for (const m of c.slice(1)) {
111
- if (typeof f != "object" || f === null)
112
- return null;
113
- f = f[m];
114
- }
115
- return typeof f == "string" ? f : null;
341
+ ], 10, kt));
116
342
  }
117
- function l(d, s, c) {
118
- const [f, m] = s.includes("::") ? s.split("::", 2) : [d, s], u = m.split("."), v = o(i.value, f, u) ?? o(a, f, u) ?? // Not an empty string: a key on screen is ugly, but it says which key, and a blank
119
- // label says nothing to anybody trying to fix it.
120
- s;
121
- return c === void 0 ? v : it(v, c);
122
- }
123
- return {
124
- state: t,
125
- defaults(d, s) {
126
- a[d] = { ...a[d], ...s };
127
- },
128
- load(d, s, c) {
129
- i.value = d ?? {}, t.locale = s ?? t.locale, c !== void 0 && (t.fallback = c);
130
- },
131
- scope(d) {
132
- return (s, c) => l(d, s, c);
133
- },
134
- t: (d, s) => l("", d, s)
135
- };
136
- }
137
- function it(e, n) {
138
- let t = e;
139
- for (const [a, i] of Object.entries(n))
140
- t = t.replaceAll(`:${a}`, String(i));
141
- return t;
142
- }
143
- const rt = /* @__PURE__ */ W({
343
+ }), $t = /* @__PURE__ */ N(_t, [["__scopeId", "data-v-8c7e5ad1"]]), St = /* @__PURE__ */ R({
144
344
  name: "WxRichTextField",
145
345
  inheritAttrs: !1,
146
346
  __name: "RichTextField",
147
347
  setup(e) {
148
- const n = H(), t = I("webx-admin"), a = k(() => n.pickImage ?? void 0), i = k(() => ({
348
+ const n = O(), t = B("webx-admin"), a = x(() => n.pickImage ?? void 0), u = x(() => ({
149
349
  bold: t("rich-text.bold"),
150
350
  italic: t("rich-text.italic"),
151
351
  strike: t("rich-text.strike"),
@@ -178,107 +378,108 @@ const rt = /* @__PURE__ */ W({
178
378
  cancel: t("rich-text.cancel"),
179
379
  uploading: t("rich-text.uploading")
180
380
  }));
181
- return (o, l) => (p(), _(r(Me), $e(o.$attrs, {
182
- labels: i.value,
381
+ return (s, l) => (h(), w(i(Ye), We(s.$attrs, {
382
+ labels: u.value,
183
383
  "pick-image": a.value
184
384
  }), null, 16, ["labels", "pick-image"]));
185
385
  }
186
- }), dt = {
187
- "wx-list": { component: ot, kind: "layout", labelProp: "title" },
386
+ }), Tt = {
387
+ "wx-list": { component: $t, kind: "layout", labelProp: "title" },
188
388
  // Full width: an editor shares a row with nothing, and a form of two columns would give it
189
389
  // half a line to write a page of text in.
190
- "wx-rich-text": { component: rt, kind: "field", wide: !0 }
191
- }, ye = /* @__PURE__ */ Symbol("webx-admin");
192
- function H() {
193
- const e = G(ye, null);
390
+ "wx-rich-text": { component: St, kind: "field", wide: !0 }
391
+ }, _e = /* @__PURE__ */ Symbol("webx-admin");
392
+ function O() {
393
+ const e = te(_e, null);
194
394
  if (e === null)
195
395
  throw new Error("useAdmin() was called outside a panel created by createAdmin().");
196
396
  return e;
197
397
  }
198
- function ut(e) {
199
- const n = se({
398
+ function Ct(e) {
399
+ const n = oe({
200
400
  status: "loading",
201
401
  manifest: null,
202
402
  user: null,
203
403
  error: null
204
- }), t = k(() => {
205
- const u = n.manifest;
206
- if (u === null)
404
+ }), t = x(() => {
405
+ const d = n.manifest;
406
+ if (d === null)
207
407
  return [];
208
- const v = [];
209
- for (const w of u.modules) {
210
- const h = e.modules.find((D) => D.id === w.id);
211
- if (h === void 0)
408
+ const p = [];
409
+ for (const b of d.modules) {
410
+ const c = e.modules.find(($) => $.id === b.id);
411
+ if (c === void 0)
212
412
  continue;
213
- const y = h.path ?? h.routes?.[0]?.path;
214
- y !== void 0 && v.push({
215
- id: w.id,
216
- title: w.title,
217
- icon: w.icon,
413
+ const y = c.path ?? c.routes?.[0]?.path;
414
+ y !== void 0 && p.push({
415
+ id: b.id,
416
+ title: b.title,
417
+ icon: b.icon,
218
418
  path: y,
219
- group: w.group ?? null
419
+ group: b.group ?? null
220
420
  });
221
421
  }
222
- return v;
223
- }), a = k(() => {
224
- const u = n.manifest?.groups ?? [], v = [], w = /* @__PURE__ */ new Map();
225
- for (const h of t.value)
226
- if (h.group !== null && u.some((y) => y.id === h.group)) {
227
- const y = w.get(h.group) ?? [];
228
- y.push(h), w.set(h.group, y);
422
+ return p;
423
+ }), a = x(() => {
424
+ const d = n.manifest?.groups ?? [], p = [], b = /* @__PURE__ */ new Map();
425
+ for (const c of t.value)
426
+ if (c.group !== null && d.some((y) => y.id === c.group)) {
427
+ const y = b.get(c.group) ?? [];
428
+ y.push(c), b.set(c.group, y);
229
429
  } else
230
- v.push(h);
430
+ p.push(c);
231
431
  return {
232
- top: v,
233
- groups: u.filter((h) => w.has(h.id)).map((h) => ({
234
- id: h.id,
235
- title: h.title,
236
- entries: w.get(h.id) ?? []
432
+ top: p,
433
+ groups: d.filter((c) => b.has(c.id)).map((c) => ({
434
+ id: c.id,
435
+ title: c.title,
436
+ icon: c.icon ?? null,
437
+ entries: b.get(c.id) ?? []
237
438
  }))
238
439
  };
239
- }), i = { ...dt };
240
- for (const u of e.modules)
241
- Object.assign(i, u.types);
242
- Object.assign(i, e.types);
243
- const o = e.modules.find((u) => u.pickImage !== void 0)?.pickImage, l = /* @__PURE__ */ new Map();
244
- async function d(u) {
245
- const v = `${e.i18n.state.locale}:${u}`;
246
- let w = l.get(v);
247
- return w === void 0 && (w = e.http.get(`${e.apiPath}/screens/${u}`).then((h) => h.data.root).catch((h) => {
248
- throw l.delete(v), h;
249
- }), l.set(v, w)), w;
440
+ }), u = { ...Tt };
441
+ for (const d of e.modules)
442
+ Object.assign(u, d.types);
443
+ Object.assign(u, e.types);
444
+ const s = e.modules.find((d) => d.pickImage !== void 0)?.pickImage, l = /* @__PURE__ */ new Map();
445
+ async function o(d) {
446
+ const p = `${e.i18n.state.locale}:${d}`;
447
+ let b = l.get(p);
448
+ return b === void 0 && (b = e.http.get(`${e.apiPath}/screens/${d}`).then((c) => c.data.root).catch((c) => {
449
+ throw l.delete(p), c;
450
+ }), l.set(p, b)), b;
250
451
  }
251
- let s = null;
252
- async function c() {
452
+ let r = null;
453
+ async function m() {
253
454
  n.status = "loading", n.error = null;
254
455
  try {
255
- if (s !== null && (n.user = await s(), n.user === null)) {
456
+ if (r !== null && (n.user = await r(), n.user === null)) {
256
457
  n.manifest = null, n.status = "unauthenticated";
257
458
  return;
258
459
  }
259
- const u = await e.loadManifest();
260
- n.manifest = u, e.i18n.state.contentLocales = u.locales ?? [], e.i18n.state.panelLocales = u.panelLocales ?? e.i18n.state.panelLocales, u.locale !== void 0 && u.locale !== e.i18n.state.locale && await m(u.locale), n.status = "ready";
261
- } catch (u) {
262
- if (mt(u)) {
460
+ const d = await e.loadManifest();
461
+ n.manifest = d, e.i18n.state.contentLocales = d.locales ?? [], e.i18n.state.panelLocales = d.panelLocales ?? e.i18n.state.panelLocales, d.locale !== void 0 && d.locale !== e.i18n.state.locale && await f(d.locale), n.status = "ready";
462
+ } catch (d) {
463
+ if (zt(d)) {
263
464
  n.manifest = null, n.user = null, n.status = "unauthenticated";
264
465
  return;
265
466
  }
266
- n.error = u instanceof Error ? u.message : String(u), n.status = "error";
467
+ n.error = d instanceof Error ? d.message : String(d), n.status = "error";
267
468
  }
268
469
  }
269
- async function f() {
470
+ async function v() {
270
471
  if (n.manifest !== null)
271
472
  try {
272
473
  n.manifest = await e.loadManifest();
273
474
  } catch {
274
475
  }
275
476
  }
276
- async function m(u) {
477
+ async function f(d) {
277
478
  if (e.loadDictionary === void 0) {
278
- e.i18n.state.locale = u;
479
+ e.i18n.state.locale = d;
279
480
  return;
280
481
  }
281
- await e.loadDictionary(u), await f();
482
+ await e.loadDictionary(d), await v();
282
483
  }
283
484
  return {
284
485
  http: e.http,
@@ -289,169 +490,169 @@ function ut(e) {
289
490
  modules: e.modules,
290
491
  nav: t,
291
492
  groups: a,
292
- types: i,
293
- pickImage: o ?? null,
294
- reload: c,
295
- refreshManifest: f,
296
- setLocale: m,
297
- setUser(u) {
298
- n.user = u;
493
+ types: u,
494
+ pickImage: s ?? null,
495
+ reload: m,
496
+ refreshManifest: v,
497
+ setLocale: f,
498
+ setUser(d) {
499
+ n.user = d;
299
500
  },
300
- useSessionLoader(u) {
301
- s = u;
501
+ useSessionLoader(d) {
502
+ r = d;
302
503
  },
303
- can(u) {
304
- const v = n.user;
305
- return v === null ? !1 : v.isSuper || v.permissions.includes(u);
504
+ can(d) {
505
+ const p = n.user;
506
+ return p === null ? !1 : p.isSuper || p.permissions.includes(d);
306
507
  },
307
- loadScreen: d,
308
- screenPatch(u) {
309
- return e.screens?.[u] ?? [];
508
+ loadScreen: o,
509
+ screenPatch(d) {
510
+ return e.screens?.[d] ?? [];
310
511
  }
311
512
  };
312
513
  }
313
- function ct(e, n) {
314
- e.provide(ye, n);
514
+ function Lt(e, n) {
515
+ e.provide(_e, n);
315
516
  }
316
- function mt(e) {
517
+ function zt(e) {
317
518
  return typeof e == "object" && e !== null && "status" in e && e.status === 401;
318
519
  }
319
- const ft = /* @__PURE__ */ W({
520
+ const Wt = /* @__PURE__ */ R({
320
521
  __name: "AdminLanding",
321
522
  props: {
322
523
  landing: { default: null }
323
524
  },
324
525
  setup(e) {
325
- const n = e, t = H(), a = ge(), i = I("webx-admin"), o = k(() => {
526
+ const n = e, t = O(), a = we(), u = B("webx-admin"), s = x(() => {
326
527
  const l = t.nav.value;
327
- return l.length === 0 ? null : ((n.landing === null ? void 0 : l.find((s) => s.path === n.landing)) ?? l[0])?.path ?? null;
528
+ return l.length === 0 ? null : ((n.landing === null ? void 0 : l.find((r) => r.path === n.landing)) ?? l[0])?.path ?? null;
328
529
  });
329
- return J(
330
- o,
530
+ return Y(
531
+ s,
331
532
  (l) => {
332
533
  l !== null && a.replace(l);
333
534
  },
334
535
  { immediate: !0 }
335
- ), (l, d) => o.value === null && r(t).state.status === "ready" ? (p(), _(r(Be), {
536
+ ), (l, o) => s.value === null && i(t).state.status === "ready" ? (h(), w(i(Ke), {
336
537
  key: 0,
337
538
  status: "info",
338
- title: r(i)("shell.empty-title"),
339
- description: r(i)("shell.empty-description")
340
- }, null, 8, ["title", "description"])) : E("", !0);
539
+ title: i(u)("shell.empty-title"),
540
+ description: i(u)("shell.empty-description")
541
+ }, null, 8, ["title", "description"])) : z("", !0);
341
542
  }
342
- }), ht = /* @__PURE__ */ W({
543
+ }), At = /* @__PURE__ */ R({
343
544
  __name: "AdminNav",
344
545
  props: {
345
546
  collapsed: { type: Boolean }
346
547
  },
347
548
  emits: ["select"],
348
549
  setup(e, { emit: n }) {
349
- const t = n, a = H(), i = I("webx-admin"), o = ge(), l = ze(), d = k({
350
- get: () => a.nav.value.find((c) => l.path.startsWith(c.path))?.id ?? "",
351
- set: (s) => {
352
- const c = a.nav.value.find((f) => f.id === s);
353
- c !== void 0 && o.push(c.path);
550
+ const t = n, a = O(), u = B("webx-admin"), s = we(), l = Ne(), o = x({
551
+ get: () => a.nav.value.find((m) => l.path.startsWith(m.path))?.id ?? "",
552
+ set: (r) => {
553
+ const m = a.nav.value.find((v) => v.id === r);
554
+ m !== void 0 && s.push(m.path);
354
555
  }
355
556
  });
356
- return (s, c) => {
357
- const f = A("wx-menu-item"), m = A("wx-submenu"), u = A("wx-menu");
358
- return p(), _(u, {
359
- modelValue: d.value,
360
- "onUpdate:modelValue": c[0] || (c[0] = (v) => d.value = v),
557
+ return (r, m) => {
558
+ const v = U("wx-menu-item"), f = U("wx-submenu"), d = U("wx-menu");
559
+ return h(), w(d, {
560
+ modelValue: o.value,
561
+ "onUpdate:modelValue": m[0] || (m[0] = (p) => o.value = p),
361
562
  collapsed: e.collapsed,
362
- label: r(i)("nav.sections"),
363
- onSelect: c[1] || (c[1] = (v) => t("select"))
563
+ label: i(u)("nav.sections"),
564
+ onSelect: m[1] || (m[1] = (p) => t("select"))
364
565
  }, {
365
566
  default: g(() => [
366
- (p(!0), b(U, null, F(r(a).groups.value.top, (v) => (p(), _(f, {
367
- key: v.id,
368
- value: v.id,
369
- icon: v.icon ?? void 0,
370
- label: v.title
567
+ (h(!0), k(I, null, P(i(a).groups.value.top, (p) => (h(), w(v, {
568
+ key: p.id,
569
+ value: p.id,
570
+ icon: p.icon ?? void 0,
571
+ label: p.title
371
572
  }, null, 8, ["value", "icon", "label"]))), 128)),
372
- (p(!0), b(U, null, F(r(a).groups.value.groups, (v) => (p(), _(m, {
373
- key: v.id,
374
- value: `group:${v.id}`,
375
- title: v.title,
376
- icon: "gear"
573
+ (h(!0), k(I, null, P(i(a).groups.value.groups, (p) => (h(), w(f, {
574
+ key: p.id,
575
+ value: `group:${p.id}`,
576
+ title: p.title,
577
+ icon: p.icon ?? "gear"
377
578
  }, {
378
579
  default: g(() => [
379
- (p(!0), b(U, null, F(v.entries, (w) => (p(), _(f, {
380
- key: w.id,
381
- value: w.id,
382
- icon: w.icon ?? void 0,
383
- label: w.title
580
+ (h(!0), k(I, null, P(p.entries, (b) => (h(), w(v, {
581
+ key: b.id,
582
+ value: b.id,
583
+ icon: b.icon ?? void 0,
584
+ label: b.title
384
585
  }, null, 8, ["value", "icon", "label"]))), 128))
385
586
  ]),
386
587
  _: 2
387
- }, 1032, ["value", "title"]))), 128))
588
+ }, 1032, ["value", "title", "icon"]))), 128))
388
589
  ]),
389
590
  _: 1
390
591
  }, 8, ["modelValue", "collapsed", "label"]);
391
592
  };
392
593
  }
393
- }), pt = {
594
+ }), Rt = {
394
595
  key: 0,
395
596
  class: "wx-root wx-admin-plain"
396
- }, vt = {
597
+ }, Et = {
397
598
  key: 1,
398
599
  class: "wx-root wx-admin-plain"
399
- }, gt = {
600
+ }, Ut = {
400
601
  key: 2,
401
602
  class: "wx-root wx-admin-plain"
402
- }, wt = ["src", "alt", "width", "height"], yt = ["src", "alt", "width", "height"], xt = ["src", "alt"], bt = { class: "wx-admin__user" }, _t = { class: "wx-admin__user wx-admin__user--drawer" }, kt = /* @__PURE__ */ W({
603
+ }, Bt = ["src", "alt", "width", "height"], It = ["src", "alt", "width", "height"], Mt = ["src", "alt"], Dt = { class: "wx-admin__user" }, Nt = { class: "wx-admin__user wx-admin__user--drawer" }, Pt = /* @__PURE__ */ R({
403
604
  __name: "AdminShell",
404
605
  setup(e) {
405
- const n = H(), t = I("webx-admin"), a = L(null), { width: i, layout: o, collapsed: l, showAside: d, drawerOpen: s, toggle: c, close: f } = Ne(
606
+ const n = O(), t = B("webx-admin"), a = A(null), { width: u, layout: s, collapsed: l, showAside: o, drawerOpen: r, toggle: m, close: v } = Xe(
406
607
  a,
407
608
  { persist: "webx-admin-shell" }
408
- ), m = k(() => n.state.manifest?.title ?? ""), u = k(() => n.state.manifest?.branding?.logo ?? null), v = k(() => n.state.manifest?.branding?.mark ?? null), w = k(() => Pe(i.value, null));
409
- return Te(() => {
410
- typeof document > "u" || (document.documentElement.dataset.wxShell = w.value);
411
- }), Se(() => {
609
+ ), f = x(() => n.state.manifest?.title ?? ""), d = x(() => n.state.manifest?.branding?.logo ?? null), p = x(() => n.state.manifest?.branding?.mark ?? null), b = x(() => Ge(u.value, null));
610
+ return Ae(() => {
611
+ typeof document > "u" || (document.documentElement.dataset.wxShell = b.value);
612
+ }), Re(() => {
412
613
  typeof document < "u" && delete document.documentElement.dataset.wxShell;
413
- }), (h, y) => {
414
- const D = A("router-view"), Z = A("wx-loading"), ee = A("wx-button"), te = A("wx-result"), N = A("wx-action"), $ = A("wx-text"), S = A("wx-header"), T = A("wx-aside"), B = A("wx-main"), _e = A("wx-container"), ke = A("wx-drawer");
415
- return p(), b(U, null, [
416
- x(r(Ve)),
417
- r(n).state.status === "unauthenticated" ? (p(), b("div", pt, [
418
- x(D)
419
- ])) : r(n).state.status === "loading" ? (p(), b("div", vt, [
420
- x(Z, {
421
- label: r(t)("shell.loading")
614
+ }), (c, y) => {
615
+ const $ = U("router-view"), X = U("wx-loading"), ae = U("wx-button"), le = U("wx-result"), V = U("wx-action"), S = U("wx-text"), E = U("wx-header"), T = U("wx-aside"), D = U("wx-main"), Te = U("wx-container"), Ce = U("wx-drawer");
616
+ return h(), k(I, null, [
617
+ _(i(Je)),
618
+ i(n).state.status === "unauthenticated" ? (h(), k("div", Rt, [
619
+ _($)
620
+ ])) : i(n).state.status === "loading" ? (h(), k("div", Et, [
621
+ _(X, {
622
+ label: i(t)("shell.loading")
422
623
  }, null, 8, ["label"])
423
- ])) : r(n).state.status === "error" ? (p(), b("div", gt, [
424
- x(te, {
624
+ ])) : i(n).state.status === "error" ? (h(), k("div", Ut, [
625
+ _(le, {
425
626
  status: "error",
426
- title: r(t)("shell.error-title"),
427
- description: r(n).state.error
627
+ title: i(t)("shell.error-title"),
628
+ description: i(n).state.error
428
629
  }, {
429
630
  default: g(() => [
430
- x(ee, {
631
+ _(ae, {
431
632
  type: "primary",
432
- onClick: y[0] || (y[0] = (ce) => r(n).reload())
633
+ onClick: y[0] || (y[0] = (ce) => i(n).reload())
433
634
  }, {
434
635
  default: g(() => [
435
- R(C(r(t)("shell.retry")), 1)
636
+ W(C(i(t)("shell.retry")), 1)
436
637
  ]),
437
638
  _: 1
438
639
  })
439
640
  ]),
440
641
  _: 1
441
642
  }, 8, ["title", "description"])
442
- ])) : (p(), b("div", {
643
+ ])) : (h(), k("div", {
443
644
  key: 3,
444
645
  ref_key: "shellEl",
445
646
  ref: a,
446
- class: le(["wx-root wx-admin", `wx-admin--${w.value}`])
647
+ class: H(["wx-root wx-admin", `wx-admin--${b.value}`])
447
648
  }, [
448
- x(_e, {
449
- direction: r(o) === "drawer" ? "vertical" : "horizontal",
649
+ _(Te, {
650
+ direction: i(s) === "drawer" ? "vertical" : "horizontal",
450
651
  "full-height": "",
451
652
  class: "wx-admin__frame"
452
653
  }, {
453
654
  default: g(() => [
454
- r(o) === "drawer" ? (p(), _(S, {
655
+ i(s) === "drawer" ? (h(), w(E, {
455
656
  key: 0,
456
657
  class: "wx-admin__header",
457
658
  floating: "",
@@ -461,126 +662,126 @@ const ft = /* @__PURE__ */ W({
461
662
  height: "var(--wx-admin-header-height)"
462
663
  }, {
463
664
  end: g(() => [
464
- z(h.$slots, "user", { expanded: !1 }, void 0, !0)
665
+ L(c.$slots, "user", { expanded: !1 }, void 0, !0)
465
666
  ]),
466
667
  default: g(() => [
467
- x(N, {
668
+ _(V, {
468
669
  icon: "menu",
469
- title: r(t)("nav.menu"),
470
- onClick: r(c)
670
+ title: i(t)("nav.menu"),
671
+ onClick: i(m)
471
672
  }, null, 8, ["title", "onClick"]),
472
- z(h.$slots, "brand", {}, () => [
473
- u.value ? (p(), b("img", {
673
+ L(c.$slots, "brand", {}, () => [
674
+ d.value ? (h(), k("img", {
474
675
  key: 0,
475
676
  class: "wx-admin__logo",
476
- src: u.value.url,
477
- alt: m.value,
478
- width: u.value.width ?? void 0,
479
- height: u.value.height ?? void 0
480
- }, null, 8, wt)) : (p(), _($, {
677
+ src: d.value.url,
678
+ alt: f.value,
679
+ width: d.value.width ?? void 0,
680
+ height: d.value.height ?? void 0
681
+ }, null, 8, Bt)) : (h(), w(S, {
481
682
  key: 1,
482
683
  weight: "semibold",
483
684
  truncate: ""
484
685
  }, {
485
686
  default: g(() => [
486
- R(C(m.value), 1)
687
+ W(C(f.value), 1)
487
688
  ]),
488
689
  _: 1
489
690
  }))
490
691
  ], !0)
491
692
  ]),
492
693
  _: 3
493
- })) : E("", !0),
494
- r(d) ? (p(), _(T, {
694
+ })) : z("", !0),
695
+ i(o) ? (h(), w(T, {
495
696
  key: 1,
496
697
  class: "wx-admin__aside",
497
698
  sticky: "",
498
699
  floating: "",
499
700
  scroll: "",
500
701
  bordered: !1,
501
- collapsed: r(l),
702
+ collapsed: i(l),
502
703
  width: 220,
503
704
  "collapsed-width": 56
504
705
  }, {
505
706
  top: g(() => [
506
707
  M("div", {
507
- class: le(["wx-admin__brand", { "wx-admin__brand--stacked": r(l) && v.value }])
708
+ class: H(["wx-admin__brand", { "wx-admin__brand--stacked": i(l) && p.value }])
508
709
  }, [
509
- r(l) ? v.value ? (p(), b("img", {
710
+ i(l) ? p.value ? (h(), k("img", {
510
711
  key: 1,
511
712
  class: "wx-admin__mark",
512
- src: v.value.url,
513
- alt: m.value
514
- }, null, 8, xt)) : E("", !0) : z(h.$slots, "brand", {}, () => [
515
- u.value ? (p(), b("img", {
713
+ src: p.value.url,
714
+ alt: f.value
715
+ }, null, 8, Mt)) : z("", !0) : L(c.$slots, "brand", {}, () => [
716
+ d.value ? (h(), k("img", {
516
717
  key: 0,
517
718
  class: "wx-admin__logo",
518
- src: u.value.url,
519
- alt: m.value,
520
- width: u.value.width ?? void 0,
521
- height: u.value.height ?? void 0
522
- }, null, 8, yt)) : (p(), _($, {
719
+ src: d.value.url,
720
+ alt: f.value,
721
+ width: d.value.width ?? void 0,
722
+ height: d.value.height ?? void 0
723
+ }, null, 8, It)) : (h(), w(S, {
523
724
  key: 1,
524
725
  weight: "semibold",
525
726
  truncate: "",
526
727
  class: "wx-admin__title"
527
728
  }, {
528
729
  default: g(() => [
529
- R(C(m.value), 1)
730
+ W(C(f.value), 1)
530
731
  ]),
531
732
  _: 1
532
733
  }))
533
734
  ], !0, 0),
534
- x(N, {
735
+ _(V, {
535
736
  icon: "sidebar",
536
- title: r(l) ? r(t)("nav.expand") : r(t)("nav.collapse"),
537
- onClick: r(c)
737
+ title: i(l) ? i(t)("nav.expand") : i(t)("nav.collapse"),
738
+ onClick: i(m)
538
739
  }, null, 8, ["title", "onClick"])
539
740
  ], 2)
540
741
  ]),
541
742
  bottom: g(() => [
542
- M("div", bt, [
543
- z(h.$slots, "user", {
544
- expanded: !r(l)
743
+ M("div", Dt, [
744
+ L(c.$slots, "user", {
745
+ expanded: !i(l)
545
746
  }, void 0, !0)
546
747
  ])
547
748
  ]),
548
749
  default: g(() => [
549
- z(h.$slots, "nav", { collapsed: r(l) }, void 0, !0)
750
+ L(c.$slots, "nav", { collapsed: i(l) }, void 0, !0)
550
751
  ]),
551
752
  _: 3
552
- }, 8, ["collapsed"])) : E("", !0),
553
- x(B, {
753
+ }, 8, ["collapsed"])) : z("", !0),
754
+ _(D, {
554
755
  padding: "none",
555
756
  class: "wx-admin__screen"
556
757
  }, {
557
758
  default: g(() => [
558
- x(D)
759
+ _($)
559
760
  ]),
560
761
  _: 1
561
762
  })
562
763
  ]),
563
764
  _: 3
564
765
  }, 8, ["direction"]),
565
- x(ke, {
566
- open: r(s),
567
- "onUpdate:open": y[1] || (y[1] = (ce) => Ae(s) ? s.value = ce : null),
766
+ _(Ce, {
767
+ open: i(r),
768
+ "onUpdate:open": y[1] || (y[1] = (ce) => Ee(r) ? r.value = ce : null),
568
769
  class: "wx-admin__drawer",
569
- title: m.value === "" ? r(t)("nav.menu") : m.value,
770
+ title: f.value === "" ? i(t)("nav.menu") : f.value,
570
771
  side: "left",
571
772
  size: 260,
572
773
  "full-screen": !1,
573
774
  closable: ""
574
775
  }, {
575
776
  footer: g(() => [
576
- M("div", _t, [
577
- z(h.$slots, "user", { expanded: !0 }, void 0, !0)
777
+ M("div", Nt, [
778
+ L(c.$slots, "user", { expanded: !0 }, void 0, !0)
578
779
  ])
579
780
  ]),
580
781
  default: g(() => [
581
- z(h.$slots, "nav", {
782
+ L(c.$slots, "nav", {
582
783
  collapsed: !1,
583
- select: r(f)
784
+ select: i(v)
584
785
  }, void 0, !0)
585
786
  ]),
586
787
  _: 3
@@ -589,10 +790,10 @@ const ft = /* @__PURE__ */ W({
589
790
  ], 64);
590
791
  };
591
792
  }
592
- }), $t = /* @__PURE__ */ V(kt, [["__scopeId", "data-v-5baa6cbf"]]);
593
- class ie extends Error {
594
- constructor(n, t, a = {}, i = null, o = null) {
595
- super(n), this.status = t, this.errors = a, this.retryAfter = i, this.body = o, this.name = "HttpError";
793
+ }), Vt = /* @__PURE__ */ N(Pt, [["__scopeId", "data-v-5baa6cbf"]]);
794
+ class re extends Error {
795
+ constructor(n, t, a = {}, u = null, s = null) {
796
+ super(n), this.status = t, this.errors = a, this.retryAfter = u, this.body = s, this.name = "HttpError";
596
797
  }
597
798
  status;
598
799
  errors;
@@ -609,76 +810,76 @@ class ie extends Error {
609
810
  return this.status === 429;
610
811
  }
611
812
  }
612
- const Tt = /* @__PURE__ */ new Set(["POST", "PUT", "PATCH", "DELETE"]);
613
- function St(e = {}) {
614
- const n = (e.baseUrl ?? "").replace(/\/$/, ""), t = e.csrfUrl ?? "/sanctum/csrf-cookie", a = e.fetch ?? globalThis.fetch.bind(globalThis), i = e.onUnauthenticated, o = e.headers;
813
+ const Ft = /* @__PURE__ */ new Set(["POST", "PUT", "PATCH", "DELETE"]);
814
+ function Ht(e = {}) {
815
+ const n = (e.baseUrl ?? "").replace(/\/$/, ""), t = e.csrfUrl ?? "/sanctum/csrf-cookie", a = e.fetch ?? globalThis.fetch.bind(globalThis), u = e.onUnauthenticated, s = e.headers;
615
816
  let l = !1;
616
- async function d(c = !1) {
617
- l && !c && he("XSRF-TOKEN") !== null || (await a(t, { credentials: "same-origin" }), l = !0);
817
+ async function o(m = !1) {
818
+ l && !m && ve("XSRF-TOKEN") !== null || (await a(t, { credentials: "same-origin" }), l = !0);
618
819
  }
619
- async function s(c, f, m, u = {}, v = !1) {
620
- const w = Tt.has(c);
621
- w && await d();
622
- const h = {
820
+ async function r(m, v, f, d = {}, p = !1) {
821
+ const b = Ft.has(m);
822
+ b && await o();
823
+ const c = {
623
824
  Accept: "application/json",
624
825
  "X-Requested-With": "XMLHttpRequest",
625
826
  // Standing headers first, so a caller can still override one for a single request.
626
- ...o?.(),
627
- ...u.headers
827
+ ...s?.(),
828
+ ...d.headers
628
829
  };
629
- if (w) {
630
- const D = he("XSRF-TOKEN");
631
- D !== null && (h["X-XSRF-TOKEN"] = D);
830
+ if (b) {
831
+ const $ = ve("XSRF-TOKEN");
832
+ $ !== null && (c["X-XSRF-TOKEN"] = $);
632
833
  }
633
- m !== void 0 && (h["Content-Type"] = "application/json");
634
- const y = await a(Ct(n, f, u.query), {
635
- method: c,
834
+ f !== void 0 && (c["Content-Type"] = "application/json");
835
+ const y = await a(jt(n, v, d.query), {
836
+ method: m,
636
837
  credentials: "same-origin",
637
- headers: h,
638
- signal: u.signal,
639
- body: m === void 0 ? void 0 : JSON.stringify(m)
838
+ headers: c,
839
+ signal: d.signal,
840
+ body: f === void 0 ? void 0 : JSON.stringify(f)
640
841
  });
641
- if (y.status === 419 && w && !v)
642
- return await d(!0), s(c, f, m, u, !0);
643
- if (y.status === 401 && i?.(), !y.ok)
644
- throw await At(y);
842
+ if (y.status === 419 && b && !p)
843
+ return await o(!0), r(m, v, f, d, !0);
844
+ if (y.status === 401 && u?.(), !y.ok)
845
+ throw await Ot(y);
645
846
  if (y.status !== 204)
646
847
  return await y.json();
647
848
  }
648
849
  return {
649
- get: (c, f) => s("GET", c, void 0, f),
650
- post: (c, f, m) => s("POST", c, f, m),
651
- put: (c, f, m) => s("PUT", c, f, m),
652
- patch: (c, f, m) => s("PATCH", c, f, m),
653
- delete: (c, f) => s("DELETE", c, void 0, f)
850
+ get: (m, v) => r("GET", m, void 0, v),
851
+ post: (m, v, f) => r("POST", m, v, f),
852
+ put: (m, v, f) => r("PUT", m, v, f),
853
+ patch: (m, v, f) => r("PATCH", m, v, f),
854
+ delete: (m, v) => r("DELETE", m, void 0, v)
654
855
  };
655
856
  }
656
- async function At(e) {
857
+ async function Ot(e) {
657
858
  let n = null;
658
859
  try {
659
860
  n = await e.json();
660
861
  } catch {
661
862
  }
662
- const t = n ?? {}, a = typeof t.message == "string" && t.message !== "" ? t.message : e.statusText || `Request failed with ${e.status}`, i = t.errors !== null && typeof t.errors == "object" ? t.errors : {}, o = e.headers.get("Retry-After"), l = o === null ? null : Number.parseInt(o, 10);
663
- return new ie(
863
+ const t = n ?? {}, a = typeof t.message == "string" && t.message !== "" ? t.message : e.statusText || `Request failed with ${e.status}`, u = t.errors !== null && typeof t.errors == "object" ? t.errors : {}, s = e.headers.get("Retry-After"), l = s === null ? null : Number.parseInt(s, 10);
864
+ return new re(
664
865
  a,
665
866
  e.status,
666
- i,
867
+ u,
667
868
  Number.isFinite(l) ? l : null,
668
869
  n
669
870
  );
670
871
  }
671
- function Ct(e, n, t) {
672
- const i = /^https?:\/\//i.test(n) ? n : `${e}/${n.replace(/^\//, "")}`;
872
+ function jt(e, n, t) {
873
+ const u = /^https?:\/\//i.test(n) ? n : `${e}/${n.replace(/^\//, "")}`;
673
874
  if (t === void 0)
674
- return i;
675
- const o = new URLSearchParams();
676
- for (const [d, s] of Object.entries(t))
677
- s != null && o.set(d, String(s));
678
- const l = o.toString();
679
- return l === "" ? i : `${i}${i.includes("?") ? "&" : "?"}${l}`;
875
+ return u;
876
+ const s = new URLSearchParams();
877
+ for (const [o, r] of Object.entries(t))
878
+ r != null && s.set(o, String(r));
879
+ const l = s.toString();
880
+ return l === "" ? u : `${u}${u.includes("?") ? "&" : "?"}${l}`;
680
881
  }
681
- function he(e) {
882
+ function ve(e) {
682
883
  if (typeof document > "u")
683
884
  return null;
684
885
  for (const n of document.cookie.split(";")) {
@@ -688,7 +889,7 @@ function he(e) {
688
889
  }
689
890
  return null;
690
891
  }
691
- const xe = {
892
+ const $e = {
692
893
  shell: {
693
894
  loading: "Loading the panel…",
694
895
  "error-title": "The panel could not start",
@@ -709,8 +910,13 @@ const xe = {
709
910
  // the way to rename it. A module that opens an editor should not be inventing these.
710
911
  editor: {
711
912
  back: "Back",
913
+ // The head's ··· on a screen that has no name to give the menu.
914
+ more: "More",
712
915
  rename: "Rename",
713
- save: "Save"
916
+ save: "Save",
917
+ // Said out loud to a screen reader while the little wheel turns, and after it stops.
918
+ saving: "Saving…",
919
+ saved: "Saved"
714
920
  },
715
921
  // The page behind a '?'. Only the heading is the panel's: what the page says belongs to
716
922
  // whatever is being explained, and travels with that module's own words.
@@ -719,6 +925,13 @@ const xe = {
719
925
  },
720
926
  // When something happened, said the way a person would. The month names and the order of
721
927
  // the parts come from `Intl` — only the words that no formatter knows are here.
928
+ // The two words every list needs the moment it has filters: what the funnel is called,
929
+ // and the way out of all of them at once. The names of the filters themselves belong to
930
+ // whatever is being filtered, and travel with that module's own words.
931
+ filters: {
932
+ title: "Filters",
933
+ reset: "Reset all"
934
+ },
722
935
  dates: {
723
936
  today: "today at :time",
724
937
  yesterday: "yesterday at :time",
@@ -797,197 +1010,200 @@ const xe = {
797
1010
  forbidden: "You may not read the notes of this record.",
798
1011
  "not-yours": "A note is edited by whoever wrote it."
799
1012
  }
800
- }, be = "webx.locale";
801
- function hn(e = {}) {
802
- const n = e.manifestUrl ?? Ut() ?? "/api/cms/manifest", t = e.apiPath ?? n.replace(/\/manifest\/?$/, ""), a = e.basePath ?? "/cms", i = e.modules ?? [], o = [...e.routes ?? []];
803
- for (const h of i)
804
- o.push(...h.routes ?? []);
805
- if (!o.some((h) => h.path === "/")) {
806
- const h = i.find((y) => y.landing === !0);
807
- o.push({
1013
+ }, Se = "webx.locale";
1014
+ function zn(e = {}) {
1015
+ const n = e.manifestUrl ?? Jt() ?? "/api/cms/manifest", t = e.apiPath ?? n.replace(/\/manifest\/?$/, ""), a = e.basePath ?? "/cms", u = e.modules ?? [], s = [...e.routes ?? []];
1016
+ for (const c of u)
1017
+ s.push(...c.routes ?? []);
1018
+ if (!s.some((c) => c.path === "/")) {
1019
+ const c = u.find((y) => y.landing === !0);
1020
+ s.push({
808
1021
  path: "/",
809
1022
  name: "webx.home",
810
- component: ft,
811
- props: { landing: h?.path ?? h?.routes?.[0]?.path ?? null }
1023
+ component: Wt,
1024
+ props: { landing: c?.path ?? c?.routes?.[0]?.path ?? null }
812
1025
  });
813
1026
  }
814
- const l = We({
815
- history: Ee(a),
816
- routes: o
817
- }), d = ue({ locale: e.locale ?? Rt() }), s = e.http ?? St({
1027
+ const l = Pe({
1028
+ history: Ve(a),
1029
+ routes: s
1030
+ }), o = de({ locale: e.locale ?? Yt() }), r = e.http ?? Ht({
818
1031
  baseUrl: "",
819
1032
  onUnauthenticated: () => {
820
- f.setUser(null), f.state.status = "unauthenticated";
1033
+ v.setUser(null), v.state.status = "unauthenticated";
821
1034
  },
822
1035
  // Every request says which language the panel is currently showing. It decides what
823
1036
  // the server writes its own messages in — a 422 under a field — for anybody who has
824
1037
  // not stored a preference yet, which is everybody until they choose one. Without it,
825
1038
  // signing in on a Russian sign-in screen lands in an English panel.
826
- headers: () => ({ "X-Webx-Locale": d.state.locale })
1039
+ headers: () => ({ "X-Webx-Locale": o.state.locale })
827
1040
  });
828
- d.defaults("webx-admin", xe);
829
- async function c(h) {
830
- const y = await s.get(`${t}/translations/${h}`);
831
- d.load(y.data.namespaces, y.data.locale, y.data.fallback), zt(y.data.locale), Et(y.data.locale, d.state.panelLocales);
1041
+ o.defaults("webx-admin", $e);
1042
+ async function m(c) {
1043
+ const y = await r.get(`${t}/translations/${c}`);
1044
+ o.load(y.data.namespaces, y.data.locale, y.data.fallback), Kt(y.data.locale), Gt(y.data.locale, o.state.panelLocales);
832
1045
  }
833
- const f = ut({
834
- http: s,
1046
+ const v = Ct({
1047
+ http: r,
835
1048
  basePath: a,
836
1049
  apiPath: t,
837
- modules: i,
838
- i18n: d,
839
- loadDictionary: c,
1050
+ modules: u,
1051
+ i18n: o,
1052
+ loadDictionary: m,
840
1053
  types: e.types,
841
1054
  screens: e.screens,
842
- loadManifest: async () => (await s.get(n)).data
843
- }), m = Ce(Lt(e));
844
- m.use(He), ct(m, f), st(m, d);
845
- const u = L("");
846
- m.provide(Fe, {
847
- list: k(
848
- () => d.state.contentLocales.map((h) => ({
849
- code: h.code,
850
- label: h.code.toUpperCase()
1055
+ loadManifest: async () => (await r.get(n)).data
1056
+ }), f = Ue(qt(e));
1057
+ f.use(Qe), Lt(f, v), ct(f, o);
1058
+ const d = A("");
1059
+ f.provide(
1060
+ Ze,
1061
+ x(() => o.state.locale)
1062
+ ), f.provide(et, {
1063
+ list: x(
1064
+ () => o.state.contentLocales.map((c) => ({
1065
+ code: c.code,
1066
+ label: c.code.toUpperCase()
851
1067
  }))
852
1068
  ),
853
- active: k({
854
- get: () => u.value || (d.state.contentLocales[0]?.code ?? ""),
855
- set: (h) => {
856
- u.value = h;
1069
+ active: x({
1070
+ get: () => d.value || (o.state.contentLocales[0]?.code ?? ""),
1071
+ set: (c) => {
1072
+ d.value = c;
857
1073
  }
858
1074
  })
859
1075
  });
860
- const v = {
861
- app: m,
1076
+ const p = {
1077
+ app: f,
862
1078
  router: l,
863
- context: f,
864
- i18n: d,
1079
+ context: v,
1080
+ i18n: o,
865
1081
  async mount() {
866
- await Promise.all([w(), c(d.state.locale)]).catch(() => {
867
- }), m.mount(e.el ?? "#webx-app"), await f.reload();
1082
+ await Promise.all([b(), m(o.state.locale)]).catch(() => {
1083
+ }), f.mount(e.el ?? "#webx-app"), await v.reload();
868
1084
  }
869
1085
  };
870
- async function w() {
871
- const h = await s.get(`${t}/locales`);
872
- d.state.panelLocales = h.data.panel, d.state.contentLocales = h.data.content;
1086
+ async function b() {
1087
+ const c = await r.get(`${t}/locales`);
1088
+ o.state.panelLocales = c.data.panel, o.state.contentLocales = c.data.content;
873
1089
  }
874
- for (const h of e.plugins ?? [])
875
- h.install(v);
876
- return m.use(l), v;
1090
+ for (const c of e.plugins ?? [])
1091
+ c.install(p);
1092
+ return f.use(l), p;
877
1093
  }
878
- function Lt(e) {
1094
+ function qt(e) {
879
1095
  const n = {
880
1096
  // The menu is the panel's own: it is the manifest, drawn.
881
1097
  // The shell hands in what a choice means where it drew the menu — in the drawer it is what
882
1098
  // closes it, and a drawer that stays open over the section it just opened is a drawer the
883
1099
  // reader has to dismiss by hand.
884
- nav: (t) => O(ht, { collapsed: t.collapsed === !0, onSelect: t.select })
1100
+ nav: (t) => G(At, { collapsed: t.collapsed === !0, onSelect: t.select })
885
1101
  };
886
- return e.brand !== void 0 && (n.brand = () => O(e.brand)), e.userMenu !== void 0 && (n.user = (t) => O(e.userMenu, { expanded: t.expanded === !0 })), { render: () => O($t, null, n) };
1102
+ return e.brand !== void 0 && (n.brand = () => G(e.brand)), e.userMenu !== void 0 && (n.user = (t) => G(e.userMenu, { expanded: t.expanded === !0 })), { render: () => G(Vt, null, n) };
887
1103
  }
888
- function Rt() {
889
- const e = Wt(be);
1104
+ function Yt() {
1105
+ const e = Xt(Se);
890
1106
  return e !== null ? e : typeof document < "u" && document.documentElement.lang !== "" ? document.documentElement.lang : typeof navigator > "u" ? "en" : navigator.language;
891
1107
  }
892
- function zt(e) {
1108
+ function Kt(e) {
893
1109
  try {
894
- localStorage.setItem(be, e);
1110
+ localStorage.setItem(Se, e);
895
1111
  } catch {
896
1112
  }
897
1113
  }
898
- function Wt(e) {
1114
+ function Xt(e) {
899
1115
  try {
900
1116
  return localStorage.getItem(e);
901
1117
  } catch {
902
1118
  return null;
903
1119
  }
904
1120
  }
905
- function Et(e, n) {
1121
+ function Gt(e, n) {
906
1122
  typeof document > "u" || (document.documentElement.lang = e, document.documentElement.dir = n.find((t) => t.code === e)?.direction ?? "ltr");
907
1123
  }
908
- function Ut() {
1124
+ function Jt() {
909
1125
  return typeof document > "u" ? null : document.querySelector('meta[name="webx-manifest"]')?.getAttribute("content") ?? null;
910
1126
  }
911
- function It(e) {
1127
+ function Qt(e) {
912
1128
  const n = e.replace(/\r\n?/g, `
913
1129
  `).split(`
914
1130
  `), t = [];
915
1131
  let a = 0;
916
1132
  for (; a < n.length; ) {
917
- const i = n[a] ?? "";
918
- if (i.trim() === "") {
1133
+ const u = n[a] ?? "";
1134
+ if (u.trim() === "") {
919
1135
  a += 1;
920
1136
  continue;
921
1137
  }
922
- if (/^```([\w-]*)\s*$/.exec(i)) {
923
- const s = [];
1138
+ if (/^```([\w-]*)\s*$/.exec(u)) {
1139
+ const r = [];
924
1140
  for (a += 1; a < n.length && !/^```\s*$/.test(n[a] ?? ""); )
925
- s.push(n[a] ?? ""), a += 1;
926
- a += 1, t.push(`<pre><code>${re(s.join(`
1141
+ r.push(n[a] ?? ""), a += 1;
1142
+ a += 1, t.push(`<pre><code>${ue(r.join(`
927
1143
  `))}</code></pre>`);
928
1144
  continue;
929
1145
  }
930
- const l = /^(#{1,4})\s+(.*)$/.exec(i);
1146
+ const l = /^(#{1,4})\s+(.*)$/.exec(u);
931
1147
  if (l) {
932
- const s = Math.min(l[1].length + 1, 5);
933
- t.push(`<h${s}>${ne(l[2] ?? "")}</h${s}>`), a += 1;
1148
+ const r = Math.min(l[1].length + 1, 5);
1149
+ t.push(`<h${r}>${se(l[2] ?? "")}</h${r}>`), a += 1;
934
1150
  continue;
935
1151
  }
936
- if (q(i)) {
937
- const s = /^\s*\d+[.)]\s+/.test(i), c = [];
938
- for (; a < n.length && q(n[a] ?? ""); )
939
- for (c.push((n[a] ?? "").replace(/^\s*(?:[-*+]|\d+[.)])\s+/, "")), a += 1; a < n.length; ) {
940
- const m = n[a] ?? "";
941
- if (m.trim() === "" || q(m) || /^(#{1,4})\s/.test(m) || /^```/.test(m))
1152
+ if (Q(u)) {
1153
+ const r = /^\s*\d+[.)]\s+/.test(u), m = [];
1154
+ for (; a < n.length && Q(n[a] ?? ""); )
1155
+ for (m.push((n[a] ?? "").replace(/^\s*(?:[-*+]|\d+[.)])\s+/, "")), a += 1; a < n.length; ) {
1156
+ const f = n[a] ?? "";
1157
+ if (f.trim() === "" || Q(f) || /^(#{1,4})\s/.test(f) || /^```/.test(f))
942
1158
  break;
943
- c[c.length - 1] += ` ${m.trim()}`, a += 1;
1159
+ m[m.length - 1] += ` ${f.trim()}`, a += 1;
944
1160
  }
945
- const f = s ? "ol" : "ul";
946
- t.push(`<${f}>${c.map((m) => `<li>${ne(m)}</li>`).join("")}</${f}>`);
1161
+ const v = r ? "ol" : "ul";
1162
+ t.push(`<${v}>${m.map((f) => `<li>${se(f)}</li>`).join("")}</${v}>`);
947
1163
  continue;
948
1164
  }
949
- const d = [];
1165
+ const o = [];
950
1166
  for (; a < n.length; ) {
951
- const s = n[a] ?? "";
952
- if (s.trim() === "" || q(s) || /^(#{1,4})\s/.test(s) || /^```/.test(s)) break;
953
- d.push(s.trim()), a += 1;
1167
+ const r = n[a] ?? "";
1168
+ if (r.trim() === "" || Q(r) || /^(#{1,4})\s/.test(r) || /^```/.test(r)) break;
1169
+ o.push(r.trim()), a += 1;
954
1170
  }
955
- t.push(`<p>${ne(d.join(" "))}</p>`);
1171
+ t.push(`<p>${se(o.join(" "))}</p>`);
956
1172
  }
957
1173
  return t.join("");
958
1174
  }
959
- const j = "\0";
960
- function q(e) {
1175
+ const J = "\0";
1176
+ function Q(e) {
961
1177
  return /^\s*(?:[-*+]|\d+[.)])\s+/.test(e);
962
1178
  }
963
- function ne(e) {
964
- const n = [], t = e.replace(/`([^`]+)`/g, (i, o) => (n.push(`<code>${re(o)}</code>`), `${j}${n.length - 1}${j}`));
965
- return re(t).replace(
1179
+ function se(e) {
1180
+ const n = [], t = e.replace(/`([^`]+)`/g, (u, s) => (n.push(`<code>${ue(s)}</code>`), `${J}${n.length - 1}${J}`));
1181
+ return ue(t).replace(
966
1182
  /\[([^\]]+)\]\((https?:\/\/[^\s)]+)\)/g,
967
1183
  '<a href="$2" target="_blank" rel="noopener">$1</a>'
968
1184
  ).replace(/\*\*([^*]+)\*\*/g, "<strong>$1</strong>").replace(
969
- new RegExp(`${j}(\\d+)${j}`, "g"),
970
- (i, o) => n[Number(o)] ?? ""
1185
+ new RegExp(`${J}(\\d+)${J}`, "g"),
1186
+ (u, s) => n[Number(s)] ?? ""
971
1187
  );
972
1188
  }
973
- function re(e) {
1189
+ function ue(e) {
974
1190
  return e.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
975
1191
  }
976
- function Dt(e) {
1192
+ function Zt(e) {
977
1193
  const n = e.scope("webx-admin"), t = /* @__PURE__ */ new Map();
978
- function a(o, l, d) {
979
- const s = e.state.locale, c = `${s}:${o}`;
980
- let f = t.get(c);
981
- return f === void 0 && (f = new Intl.DateTimeFormat(s, l), t.set(c, f)), f.format(d);
1194
+ function a(s, l, o) {
1195
+ const r = e.state.locale, m = `${r}:${s}`;
1196
+ let v = t.get(m);
1197
+ return v === void 0 && (v = new Intl.DateTimeFormat(r, l), t.set(m, v)), v.format(o);
982
1198
  }
983
- const i = (o) => a("time", { hour: "2-digit", minute: "2-digit", hourCycle: "h23" }, o);
1199
+ const u = (s) => a("time", { hour: "2-digit", minute: "2-digit", hourCycle: "h23" }, s);
984
1200
  return {
985
- short(o) {
986
- const l = ae(o);
1201
+ short(s) {
1202
+ const l = ee(s);
987
1203
  if (l === null)
988
1204
  return n("dates.never");
989
- const d = /* @__PURE__ */ new Date(), s = Nt(l, d);
990
- return s === 0 ? n("dates.today", { time: i(l) }) : s === -1 ? n("dates.yesterday", { time: i(l) }) : l.getFullYear() === d.getFullYear() ? a(
1205
+ const o = /* @__PURE__ */ new Date(), r = he(l, o);
1206
+ return r === 0 ? n("dates.today", { time: u(l) }) : r === -1 ? n("dates.yesterday", { time: u(l) }) : l.getFullYear() === o.getFullYear() ? a(
991
1207
  "this-year",
992
1208
  {
993
1209
  day: "numeric",
@@ -999,73 +1215,80 @@ function Dt(e) {
999
1215
  l
1000
1216
  ) : a("earlier", { day: "numeric", month: "long", year: "numeric" }, l);
1001
1217
  },
1002
- exact(o) {
1003
- const l = ae(o);
1218
+ compact(s) {
1219
+ const l = ee(s);
1220
+ if (l === null)
1221
+ return n("dates.never");
1222
+ const o = /* @__PURE__ */ new Date();
1223
+ return he(l, o) === 0 ? u(l) : l.getFullYear() === o.getFullYear() ? a("compact", { day: "numeric", month: "short" }, l) : a("compact-earlier", { dateStyle: "short" }, l);
1224
+ },
1225
+ exact(s) {
1226
+ const l = ee(s);
1004
1227
  return l === null ? "" : a("exact", { dateStyle: "long", timeStyle: "medium", hourCycle: "h23" }, l);
1005
1228
  },
1006
- iso(o) {
1007
- const l = ae(o);
1229
+ iso(s) {
1230
+ const l = ee(s);
1008
1231
  return l === null ? "" : l.toISOString();
1009
1232
  }
1010
1233
  };
1011
1234
  }
1012
- function Mt() {
1013
- const e = G(Q, null);
1014
- return Dt(e ?? Bt());
1235
+ function en() {
1236
+ const e = te(ne, null);
1237
+ return Zt(e ?? tn());
1015
1238
  }
1016
- let K = null;
1017
- function Bt() {
1018
- return K === null && (K = ue(), K.defaults("webx-admin", xe)), K;
1239
+ let Z = null;
1240
+ function tn() {
1241
+ return Z === null && (Z = de(), Z.defaults("webx-admin", $e)), Z;
1019
1242
  }
1020
- function ae(e) {
1243
+ function ee(e) {
1021
1244
  if (e == null || e === "")
1022
1245
  return null;
1023
1246
  const n = e instanceof Date ? e : new Date(e);
1024
1247
  return Number.isNaN(n.getTime()) ? null : n;
1025
1248
  }
1026
- function Nt(e, n) {
1249
+ function he(e, n) {
1027
1250
  const t = (a) => Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());
1028
1251
  return Math.round((t(e) - t(n)) / 864e5);
1029
1252
  }
1030
- function Pt(e, n, t) {
1031
- const a = e instanceof ie ? e.status : Ht(e);
1253
+ function nn(e, n, t) {
1254
+ const a = e instanceof re ? e.status : ln(e);
1032
1255
  if (a === 422)
1033
- return Ft(e) ?? t ?? n("errors.unknown");
1256
+ return sn(e) ?? t ?? n("errors.unknown");
1034
1257
  if (a === 401) return n("errors.signed-out");
1035
1258
  if (a === 403) return n("errors.forbidden");
1036
1259
  if (a === 404) return n("errors.gone");
1037
1260
  if (a === 409) return n("errors.conflict");
1038
1261
  if (a === 429) {
1039
- const i = e instanceof ie ? e.retryAfter : null;
1040
- return i === null ? n("errors.throttled") : n("errors.throttled-in", { seconds: i });
1262
+ const u = e instanceof re ? e.retryAfter : null;
1263
+ return u === null ? n("errors.throttled") : n("errors.throttled-in", { seconds: u });
1041
1264
  }
1042
1265
  return a !== null && a >= 500 ? n("errors.server") : a === null ? n("errors.offline") : t ?? n("errors.unknown");
1043
1266
  }
1044
- function Vt() {
1045
- const e = I("webx-admin");
1046
- return (n, t) => Pt(n, e, t);
1267
+ function an() {
1268
+ const e = B("webx-admin");
1269
+ return (n, t) => nn(n, e, t);
1047
1270
  }
1048
- function Ht(e) {
1271
+ function ln(e) {
1049
1272
  const n = e?.status;
1050
1273
  return typeof n == "number" ? n : null;
1051
1274
  }
1052
- function Ft(e) {
1275
+ function sn(e) {
1053
1276
  const t = e?.body?.message;
1054
1277
  return typeof t == "string" && t !== "" ? t : null;
1055
1278
  }
1056
- function Ot(e, n, t) {
1057
- const a = `${e.apiPath}/entities/${n}/${t}/notes`, i = (l) => `${e.apiPath}/notes/${l}`, o = (l) => l.data;
1279
+ function on(e, n, t) {
1280
+ const a = `${e.apiPath}/entities/${n}/${t}/notes`, u = (l) => `${e.apiPath}/notes/${l}`, s = (l) => l.data;
1058
1281
  return {
1059
- list: () => e.http.get(a).then(o),
1060
- add: (l) => e.http.post(a, { body: l }).then(o),
1061
- save: (l, d) => e.http.put(i(l), { body: d }).then(o),
1062
- remove: (l) => e.http.delete(i(l)).then(() => {
1282
+ list: () => e.http.get(a).then(s),
1283
+ add: (l) => e.http.post(a, { body: l }).then(s),
1284
+ save: (l, o) => e.http.put(u(l), { body: o }).then(s),
1285
+ remove: (l) => e.http.delete(u(l)).then(() => {
1063
1286
  })
1064
1287
  };
1065
1288
  }
1066
- const jt = { class: "wx-screen-host" }, pn = /* @__PURE__ */ W({
1289
+ const rn = { class: "wx-screen-host" }, Wn = /* @__PURE__ */ R({
1067
1290
  __name: "Screen",
1068
- props: /* @__PURE__ */ oe({
1291
+ props: /* @__PURE__ */ ie({
1069
1292
  name: {},
1070
1293
  errors: { default: void 0 },
1071
1294
  disabled: { type: Boolean, default: !1 },
@@ -1076,39 +1299,39 @@ const jt = { class: "wx-screen-host" }, pn = /* @__PURE__ */ W({
1076
1299
  modelValue: { default: () => ({}) },
1077
1300
  modelModifiers: {}
1078
1301
  }),
1079
- emits: /* @__PURE__ */ oe(["loaded"], ["update:modelValue"]),
1302
+ emits: /* @__PURE__ */ ie(["loaded"], ["update:modelValue"]),
1080
1303
  setup(e, { expose: n, emit: t }) {
1081
- const a = e, i = t, o = pe(e, "modelValue"), l = H(), d = I("webx-admin"), s = L(null), c = L(null);
1082
- async function f() {
1083
- s.value = null, c.value = null;
1304
+ const a = e, u = t, s = be(e, "modelValue"), l = O(), o = B("webx-admin"), r = A(null), m = A(null);
1305
+ async function v() {
1306
+ r.value = null, m.value = null;
1084
1307
  try {
1085
- const m = await l.loadScreen(a.name);
1086
- s.value = m, i("loaded", m);
1087
- } catch (m) {
1088
- c.value = m instanceof Error ? m.message : String(m);
1308
+ const f = await l.loadScreen(a.name);
1309
+ r.value = f, u("loaded", f);
1310
+ } catch (f) {
1311
+ m.value = f instanceof Error ? f.message : String(f);
1089
1312
  }
1090
1313
  }
1091
- return J([() => a.name, () => l.i18n.state.locale], () => {
1092
- f();
1093
- }, { immediate: !0 }), n({ reload: f }), (m, u) => (p(), b("div", jt, [
1094
- c.value ? (p(), _(r(Oe), {
1314
+ return Y([() => a.name, () => l.i18n.state.locale], () => {
1315
+ v();
1316
+ }, { immediate: !0 }), n({ reload: v }), (f, d) => (h(), k("div", rn, [
1317
+ m.value ? (h(), w(i(tt), {
1095
1318
  key: 0,
1096
1319
  type: "danger",
1097
- title: r(d)("shell.error-title"),
1098
- description: c.value
1099
- }, null, 8, ["title", "description"])) : s.value === null ? (p(), _(r(we), {
1320
+ title: i(o)("shell.error-title"),
1321
+ description: m.value
1322
+ }, null, 8, ["title", "description"])) : r.value === null ? (h(), w(i(xe), {
1100
1323
  key: 1,
1101
1324
  rows: 4
1102
- })) : (p(), _(r(et), {
1325
+ })) : (h(), w(i(dt), {
1103
1326
  key: 2,
1104
- modelValue: o.value,
1105
- "onUpdate:modelValue": u[0] || (u[0] = (v) => o.value = v),
1106
- root: s.value,
1107
- patch: r(l).screenPatch(e.name),
1108
- types: r(l).types,
1327
+ modelValue: s.value,
1328
+ "onUpdate:modelValue": d[0] || (d[0] = (p) => s.value = p),
1329
+ root: r.value,
1330
+ patch: i(l).screenPatch(e.name),
1331
+ types: i(l).types,
1109
1332
  errors: e.errors,
1110
- translate: r(l).i18n.t,
1111
- can: r(l).can,
1333
+ translate: i(l).i18n.t,
1334
+ can: i(l).can,
1112
1335
  disabled: e.disabled,
1113
1336
  "label-position": e.labelPosition,
1114
1337
  "label-width": e.labelWidth,
@@ -1116,77 +1339,63 @@ const jt = { class: "wx-screen-host" }, pn = /* @__PURE__ */ W({
1116
1339
  }, null, 8, ["modelValue", "root", "patch", "types", "errors", "translate", "can", "disabled", "label-position", "label-width", "size"]))
1117
1340
  ]));
1118
1341
  }
1119
- }), qt = {
1120
- key: 0,
1121
- class: "wx-dropdown__divider"
1122
- }, Kt = /* @__PURE__ */ W({
1123
- __name: "RowMenu",
1342
+ }), An = 76, un = {
1343
+ class: "wx-save-state",
1344
+ role: "status",
1345
+ "aria-live": "polite"
1346
+ }, dn = /* @__PURE__ */ R({
1347
+ __name: "SaveState",
1124
1348
  props: {
1125
- actions: {},
1126
- label: { default: void 0 },
1127
- size: { default: "sm" }
1349
+ state: {},
1350
+ linger: { default: 2e3 }
1128
1351
  },
1129
1352
  setup(e) {
1130
- const n = e, t = k(() => [
1131
- ...n.actions.filter((i) => !i.danger),
1132
- ...n.actions.filter((i) => i.danger)
1133
- ]), a = k(() => {
1134
- const i = t.value.find((o) => o.danger);
1135
- return i && t.value[0] !== i ? i.key : null;
1136
- });
1137
- return (i, o) => t.value.length > 0 ? (p(), _(r(je), {
1138
- key: 0,
1139
- class: "wx-row-menu",
1140
- collapse: "always",
1141
- align: "end",
1142
- size: e.size,
1143
- "aria-label": e.label,
1144
- onClick: o[0] || (o[0] = ve(() => {
1145
- }, ["stop"]))
1146
- }, {
1147
- collapsed: g(() => [
1148
- (p(!0), b(U, null, F(t.value, (l) => (p(), b(U, {
1149
- key: l.key
1150
- }, [
1151
- l.key === a.value ? (p(), b("hr", qt)) : E("", !0),
1152
- x(r(qe), {
1153
- icon: l.icon,
1154
- tone: l.danger ? "danger" : "default",
1155
- href: l.href,
1156
- target: l.href ? l.target ?? "_blank" : void 0,
1157
- disabled: l.disabled,
1158
- onClick: (d) => l.run?.()
1159
- }, {
1160
- default: g(() => [
1161
- R(C(l.label), 1)
1162
- ]),
1163
- _: 2
1164
- }, 1032, ["icon", "tone", "href", "target", "disabled", "onClick"])
1165
- ], 64))), 128))
1166
- ]),
1167
- _: 1
1168
- }, 8, ["size", "aria-label"])) : E("", !0);
1353
+ const n = e, t = B("webx-admin"), a = A(!1);
1354
+ let u = null;
1355
+ Y(
1356
+ () => n.state,
1357
+ (l, o) => {
1358
+ u !== null && clearTimeout(u), a.value = o === "saving" && l === "saved", a.value && (u = window.setTimeout(() => {
1359
+ a.value = !1, u = null;
1360
+ }, n.linger));
1361
+ }
1362
+ );
1363
+ const s = x(
1364
+ () => n.state === "saving" ? "saving" : a.value ? "saved" : null
1365
+ );
1366
+ return Be(() => {
1367
+ u !== null && clearTimeout(u);
1368
+ }), (l, o) => (h(), k("span", un, [
1369
+ s.value ? (h(), w(i(ye), {
1370
+ key: 0,
1371
+ class: H(["wx-save-state__mark", { "is-saved": s.value === "saved" }]),
1372
+ name: s.value === "saving" ? "loader" : "check",
1373
+ spin: s.value === "saving",
1374
+ label: i(t)(`editor.${s.value}`)
1375
+ }, null, 8, ["class", "name", "spin", "label"])) : z("", !0)
1376
+ ]));
1169
1377
  }
1170
- }), Yt = /* @__PURE__ */ V(Kt, [["__scopeId", "data-v-4a08eb39"]]), vn = /* @__PURE__ */ W({
1171
- __name: "BackButton",
1378
+ }), Rn = /* @__PURE__ */ N(dn, [["__scopeId", "data-v-216e5e44"]]), En = /* @__PURE__ */ R({
1379
+ __name: "FilterChips",
1172
1380
  props: {
1173
- to: {},
1174
- label: { default: void 0 },
1175
- size: { default: "sm" }
1381
+ filters: {}
1176
1382
  },
1177
1383
  setup(e) {
1178
- const n = e, t = I("webx-admin"), a = k(() => n.label ?? t("editor.back"));
1179
- return (i, o) => (p(), _(r(de), {
1180
- icon: "arrow-left",
1181
- class: "wx-back-button",
1182
- as: r(Ue),
1183
- to: e.to,
1184
- title: a.value,
1185
- size: e.size,
1186
- "tooltip-side": "bottom"
1187
- }, null, 8, ["as", "to", "title", "size"]));
1384
+ return (n, t) => (h(!0), k(I, null, P(e.filters, (a) => (h(), w(i(nt), {
1385
+ key: a.key,
1386
+ class: "wx-filter-chip",
1387
+ size: "sm",
1388
+ round: "",
1389
+ closable: "",
1390
+ onClose: (u) => a.clear()
1391
+ }, {
1392
+ default: g(() => [
1393
+ W(C(a.label), 1)
1394
+ ]),
1395
+ _: 2
1396
+ }, 1032, ["onClose"]))), 128));
1188
1397
  }
1189
- }), Xt = { class: "wx-rename__footer" }, Gt = /* @__PURE__ */ W({
1398
+ }), cn = { class: "wx-rename__footer" }, mn = /* @__PURE__ */ R({
1190
1399
  __name: "RenameButton",
1191
1400
  props: {
1192
1401
  name: { default: "" },
@@ -1197,31 +1406,31 @@ const jt = { class: "wx-screen-host" }, pn = /* @__PURE__ */ W({
1197
1406
  },
1198
1407
  emits: ["rename"],
1199
1408
  setup(e, { emit: n }) {
1200
- const t = e, a = n, i = I("webx-admin"), o = L(!1), l = L(t.name), d = L(null), s = k(() => t.label ?? i("editor.rename"));
1201
- J(o, async (f) => {
1202
- f && (l.value = t.name, await Le(), d.value?.focus(), d.value?.select());
1409
+ const t = e, a = n, u = B("webx-admin"), s = A(!1), l = A(t.name), o = A(null), r = x(() => t.label ?? u("editor.rename"));
1410
+ Y(s, async (v) => {
1411
+ v && (l.value = t.name, await Ie(), o.value?.focus(), o.value?.select());
1203
1412
  });
1204
- function c() {
1205
- const f = l.value.trim();
1206
- if (f === "" || f === t.name) {
1207
- o.value = !1;
1413
+ function m() {
1414
+ const v = l.value.trim();
1415
+ if (v === "" || v === t.name) {
1416
+ s.value = !1;
1208
1417
  return;
1209
1418
  }
1210
- a("rename", f), o.value = !1;
1419
+ a("rename", v), s.value = !1;
1211
1420
  }
1212
- return (f, m) => (p(), _(r(Ke), {
1213
- open: o.value,
1214
- "onUpdate:open": m[2] || (m[2] = (u) => o.value = u),
1215
- title: s.value,
1421
+ return (v, f) => (h(), w(i(at), {
1422
+ open: s.value,
1423
+ "onUpdate:open": f[2] || (f[2] = (d) => s.value = d),
1424
+ title: r.value,
1216
1425
  width: 320,
1217
1426
  side: "bottom",
1218
1427
  align: "start",
1219
1428
  teleport: ""
1220
1429
  }, {
1221
1430
  trigger: g(() => [
1222
- x(r(de), {
1431
+ _(i(K), {
1223
1432
  type: "edit",
1224
- title: s.value,
1433
+ title: r.value,
1225
1434
  size: e.size,
1226
1435
  disabled: e.disabled
1227
1436
  }, null, 8, ["title", "size", "disabled"])
@@ -1229,25 +1438,25 @@ const jt = { class: "wx-screen-host" }, pn = /* @__PURE__ */ W({
1229
1438
  default: g(() => [
1230
1439
  M("form", {
1231
1440
  class: "wx-rename",
1232
- onSubmit: ve(c, ["prevent"])
1441
+ onSubmit: pe(m, ["prevent"])
1233
1442
  }, [
1234
- x(r(Ye), {
1443
+ _(i(lt), {
1235
1444
  ref_key: "field",
1236
- ref: d,
1445
+ ref: o,
1237
1446
  modelValue: l.value,
1238
- "onUpdate:modelValue": m[0] || (m[0] = (u) => l.value = u),
1239
- "aria-label": s.value,
1447
+ "onUpdate:modelValue": f[0] || (f[0] = (d) => l.value = d),
1448
+ "aria-label": r.value,
1240
1449
  placeholder: e.placeholder,
1241
- onKeydown: m[1] || (m[1] = Re((u) => o.value = !1, ["esc"]))
1450
+ onKeydown: f[1] || (f[1] = Me((d) => s.value = !1, ["esc"]))
1242
1451
  }, null, 8, ["modelValue", "aria-label", "placeholder"]),
1243
- M("div", Xt, [
1244
- x(r(Y), {
1452
+ M("div", cn, [
1453
+ _(i(j), {
1245
1454
  type: "primary",
1246
1455
  size: "sm",
1247
1456
  "native-type": "submit"
1248
1457
  }, {
1249
1458
  default: g(() => [
1250
- R(C(r(i)("editor.save")), 1)
1459
+ W(C(i(u)("editor.save")), 1)
1251
1460
  ]),
1252
1461
  _: 1
1253
1462
  })
@@ -1257,7 +1466,7 @@ const jt = { class: "wx-screen-host" }, pn = /* @__PURE__ */ W({
1257
1466
  _: 1
1258
1467
  }, 8, ["open", "title"]));
1259
1468
  }
1260
- }), gn = /* @__PURE__ */ V(Gt, [["__scopeId", "data-v-d879e8d3"]]), Jt = ["innerHTML"], Qt = /* @__PURE__ */ W({
1469
+ }), Un = /* @__PURE__ */ N(mn, [["__scopeId", "data-v-d879e8d3"]]), fn = ["innerHTML"], vn = /* @__PURE__ */ R({
1261
1470
  __name: "HelpButton",
1262
1471
  props: {
1263
1472
  body: {},
@@ -1267,81 +1476,82 @@ const jt = { class: "wx-screen-host" }, pn = /* @__PURE__ */ W({
1267
1476
  width: { default: 720 }
1268
1477
  },
1269
1478
  setup(e) {
1270
- const n = e, t = I("webx-admin"), a = L(!1), i = k(() => n.title ?? t("help.title")), o = k(() => It(n.body));
1271
- return (l, d) => (p(), b(U, null, [
1272
- x(r(de), {
1479
+ const n = e, t = B("webx-admin"), a = A(!1), u = x(() => n.title ?? t("help.title")), s = x(() => Qt(n.body));
1480
+ return (l, o) => (h(), k(I, null, [
1481
+ _(i(K), {
1273
1482
  type: "details",
1274
1483
  icon: "question",
1275
1484
  tone: "neutral",
1276
1485
  size: e.size,
1277
- title: e.label ?? i.value,
1278
- onClick: d[0] || (d[0] = (s) => a.value = !0)
1486
+ title: e.label ?? u.value,
1487
+ onClick: o[0] || (o[0] = (r) => a.value = !0)
1279
1488
  }, null, 8, ["size", "title"]),
1280
- x(r(Xe), {
1489
+ _(i(st), {
1281
1490
  open: a.value,
1282
- "onUpdate:open": d[1] || (d[1] = (s) => a.value = s),
1283
- title: i.value,
1491
+ "onUpdate:open": o[1] || (o[1] = (r) => a.value = r),
1492
+ title: u.value,
1284
1493
  width: e.width
1285
1494
  }, {
1286
1495
  default: g(() => [
1287
1496
  M("div", {
1288
1497
  class: "wx-help",
1289
- innerHTML: o.value
1290
- }, null, 8, Jt)
1498
+ innerHTML: s.value
1499
+ }, null, 8, fn)
1291
1500
  ]),
1292
1501
  _: 1
1293
1502
  }, 8, ["open", "title", "width"])
1294
1503
  ], 64));
1295
1504
  }
1296
- }), wn = /* @__PURE__ */ V(Qt, [["__scopeId", "data-v-6c280d42"]]), Zt = /* @__PURE__ */ W({
1505
+ }), Bn = /* @__PURE__ */ N(vn, [["__scopeId", "data-v-6c280d42"]]), hn = /* @__PURE__ */ R({
1297
1506
  name: "WxDate",
1298
1507
  __name: "DateText",
1299
1508
  props: {
1300
1509
  value: {},
1510
+ compact: { type: Boolean, default: !1 },
1301
1511
  size: { default: "sm" },
1302
1512
  tone: { default: "muted" }
1303
1513
  },
1304
1514
  setup(e) {
1305
- const n = e, t = Mt(), a = k(() => t.short(n.value)), i = k(() => t.exact(n.value)), o = k(() => t.iso(n.value));
1306
- return (l, d) => i.value ? (p(), _(r(Ge), {
1515
+ const n = e, t = en(), a = x(() => n.compact ? t.compact(n.value) : t.short(n.value)), u = x(() => t.exact(n.value)), s = x(() => t.iso(n.value));
1516
+ return (l, o) => u.value ? (h(), w(i(ot), {
1307
1517
  key: 0,
1308
- content: i.value
1518
+ content: u.value
1309
1519
  }, {
1310
1520
  default: g(() => [
1311
- x(r(X), {
1521
+ _(i(q), {
1312
1522
  as: "time",
1313
- datetime: o.value,
1523
+ datetime: s.value,
1314
1524
  size: e.size,
1315
1525
  tone: e.tone
1316
1526
  }, {
1317
1527
  default: g(() => [
1318
- R(C(a.value), 1)
1528
+ W(C(a.value), 1)
1319
1529
  ]),
1320
1530
  _: 1
1321
1531
  }, 8, ["datetime", "size", "tone"])
1322
1532
  ]),
1323
1533
  _: 1
1324
- }, 8, ["content"])) : (p(), _(r(X), {
1534
+ }, 8, ["content"])) : (h(), w(i(q), {
1325
1535
  key: 1,
1326
1536
  size: e.size,
1327
1537
  tone: e.tone
1328
1538
  }, {
1329
1539
  default: g(() => [
1330
- R(C(a.value), 1)
1540
+ W(C(a.value), 1)
1331
1541
  ]),
1332
1542
  _: 1
1333
1543
  }, 8, ["size", "tone"]));
1334
1544
  }
1335
- }), en = { class: "wx-notes" }, tn = {
1545
+ }), pn = { class: "wx-notes" }, gn = {
1336
1546
  key: 3,
1337
1547
  class: "wx-notes__list"
1338
- }, nn = { class: "wx-note__body" }, an = { class: "wx-note__head" }, ln = { class: "wx-note__buttons" }, on = {
1548
+ }, bn = { class: "wx-note__body" }, wn = { class: "wx-note__head" }, yn = { class: "wx-note__buttons" }, xn = {
1339
1549
  key: 1,
1340
1550
  class: "wx-note__text"
1341
- }, sn = {
1551
+ }, kn = {
1342
1552
  key: 4,
1343
1553
  class: "wx-notes__new"
1344
- }, rn = /* @__PURE__ */ W({
1554
+ }, _n = /* @__PURE__ */ R({
1345
1555
  name: "WxNotes",
1346
1556
  __name: "NotesFeed",
1347
1557
  props: {
@@ -1352,217 +1562,221 @@ const jt = { class: "wx-screen-host" }, pn = /* @__PURE__ */ W({
1352
1562
  },
1353
1563
  emits: ["change"],
1354
1564
  setup(e, { emit: n }) {
1355
- const t = e, a = n, i = H(), o = I("webx-admin"), l = Vt(), d = L([]), s = L(!0), c = L(""), f = L(!1), m = L(null), u = L(""), v = k(() => Ot(i, t.type, t.id)), w = k(() => t.title ?? o("notes.title"));
1356
- async function h() {
1357
- s.value = !0;
1565
+ const t = e, a = n, u = O(), s = B("webx-admin"), l = an(), o = A([]), r = A(!0), m = A(""), v = A(!1), f = A(null), d = A(""), p = x(() => on(u, t.type, t.id)), b = x(() => t.title ?? s("notes.title"));
1566
+ async function c() {
1567
+ r.value = !0;
1358
1568
  try {
1359
- d.value = await v.value.list();
1360
- } catch ($) {
1361
- P.danger(l($));
1569
+ o.value = await p.value.list();
1570
+ } catch (S) {
1571
+ F.danger(l(S));
1362
1572
  } finally {
1363
- s.value = !1;
1573
+ r.value = !1;
1364
1574
  }
1365
1575
  }
1366
- J(
1576
+ Y(
1367
1577
  () => [t.type, t.id],
1368
1578
  () => {
1369
- m.value = null, c.value = "", h();
1579
+ f.value = null, m.value = "", c();
1370
1580
  },
1371
1581
  { immediate: !0 }
1372
1582
  );
1373
1583
  async function y() {
1374
- const $ = c.value.trim();
1375
- if (!($ === "" || f.value)) {
1376
- f.value = !0;
1584
+ const S = m.value.trim();
1585
+ if (!(S === "" || v.value)) {
1586
+ v.value = !0;
1377
1587
  try {
1378
- d.value = [...d.value, await v.value.add($)], c.value = "", a("change");
1379
- } catch (S) {
1380
- P.danger(l(S));
1588
+ o.value = [...o.value, await p.value.add(S)], m.value = "", a("change");
1589
+ } catch (E) {
1590
+ F.danger(l(E));
1381
1591
  } finally {
1382
- f.value = !1;
1592
+ v.value = !1;
1383
1593
  }
1384
1594
  }
1385
1595
  }
1386
- function D($) {
1387
- m.value = $.id, u.value = $.body;
1596
+ function $(S) {
1597
+ f.value = S.id, d.value = S.body;
1388
1598
  }
1389
- async function Z($) {
1390
- const S = u.value.trim();
1391
- if (S !== "")
1599
+ async function X(S) {
1600
+ const E = d.value.trim();
1601
+ if (E !== "")
1392
1602
  try {
1393
- const T = await v.value.save($.id, S);
1394
- d.value = d.value.map((B) => B.id === T.id ? T : B), m.value = null, P.success(o("notes.saved")), a("change");
1603
+ const T = await p.value.save(S.id, E);
1604
+ o.value = o.value.map((D) => D.id === T.id ? T : D), f.value = null, F.success(s("notes.saved")), a("change");
1395
1605
  } catch (T) {
1396
- P.danger(l(T));
1606
+ F.danger(l(T));
1397
1607
  }
1398
1608
  }
1399
- async function ee($) {
1400
- if (await Ze({
1401
- title: o("notes.delete-title"),
1402
- message: o("notes.delete-text"),
1403
- confirmText: o("notes.delete"),
1404
- cancelText: o("notes.cancel"),
1609
+ async function ae(S) {
1610
+ if (await ut({
1611
+ title: s("notes.delete-title"),
1612
+ message: s("notes.delete-text"),
1613
+ confirmText: s("notes.delete"),
1614
+ cancelText: s("notes.cancel"),
1405
1615
  tone: "danger"
1406
1616
  }))
1407
1617
  try {
1408
- await v.value.remove($.id), d.value = d.value.filter((T) => T.id !== $.id), P.success(o("notes.deleted")), a("change");
1618
+ await p.value.remove(S.id), o.value = o.value.filter((T) => T.id !== S.id), F.success(s("notes.deleted")), a("change");
1409
1619
  } catch (T) {
1410
- P.danger(l(T));
1620
+ F.danger(l(T));
1411
1621
  }
1412
1622
  }
1413
- function te($) {
1414
- return !t.can || !$.is_mine ? [] : [
1415
- { key: "edit", icon: "edit", label: o("notes.edit"), run: () => D($) },
1623
+ function le(S) {
1624
+ return !t.can || !S.is_mine ? [] : [
1625
+ { key: "edit", icon: "edit", label: s("notes.edit"), run: () => $(S) },
1416
1626
  {
1417
1627
  key: "delete",
1418
1628
  icon: "trash",
1419
- label: o("notes.delete"),
1629
+ label: s("notes.delete"),
1420
1630
  danger: !0,
1421
1631
  run: () => {
1422
- ee($);
1632
+ ae(S);
1423
1633
  }
1424
1634
  }
1425
1635
  ];
1426
1636
  }
1427
- function N($) {
1428
- return $.author?.name ?? o("notes.unknown-author");
1637
+ function V(S) {
1638
+ return S.author?.name ?? s("notes.unknown-author");
1429
1639
  }
1430
- return ($, S) => (p(), b("section", en, [
1431
- w.value ? (p(), _(r(X), {
1640
+ return (S, E) => (h(), k("section", pn, [
1641
+ b.value ? (h(), w(i(q), {
1432
1642
  key: 0,
1433
1643
  weight: "medium",
1434
1644
  class: "wx-notes__title"
1435
1645
  }, {
1436
1646
  default: g(() => [
1437
- R(C(w.value), 1)
1647
+ W(C(b.value), 1)
1438
1648
  ]),
1439
1649
  _: 1
1440
- })) : E("", !0),
1441
- s.value ? (p(), _(r(we), {
1650
+ })) : z("", !0),
1651
+ r.value ? (h(), w(i(xe), {
1442
1652
  key: 1,
1443
1653
  rows: 2
1444
- })) : d.value.length === 0 ? (p(), _(r(Je), {
1654
+ })) : o.value.length === 0 ? (h(), w(i(it), {
1445
1655
  key: 2,
1446
1656
  size: "sm",
1447
- description: r(o)("notes.empty")
1448
- }, null, 8, ["description"])) : (p(), b("ul", tn, [
1449
- (p(!0), b(U, null, F(d.value, (T) => (p(), b("li", {
1657
+ description: i(s)("notes.empty")
1658
+ }, null, 8, ["description"])) : (h(), k("ul", gn, [
1659
+ (h(!0), k(I, null, P(o.value, (T) => (h(), k("li", {
1450
1660
  key: T.id,
1451
1661
  class: "wx-note"
1452
1662
  }, [
1453
- x(r(Qe), {
1454
- name: N(T),
1663
+ _(i(rt), {
1664
+ name: V(T),
1455
1665
  size: "sm",
1456
1666
  tone: "auto"
1457
1667
  }, null, 8, ["name"]),
1458
- M("div", nn, [
1459
- M("div", an, [
1460
- x(r(X), {
1668
+ M("div", bn, [
1669
+ M("div", wn, [
1670
+ _(i(q), {
1461
1671
  size: "sm",
1462
1672
  weight: "medium",
1463
1673
  truncate: ""
1464
1674
  }, {
1465
1675
  default: g(() => [
1466
- R(C(N(T)), 1)
1676
+ W(C(V(T)), 1)
1467
1677
  ]),
1468
1678
  _: 2
1469
1679
  }, 1024),
1470
- x(Zt, {
1680
+ _(hn, {
1471
1681
  value: T.created_at
1472
1682
  }, null, 8, ["value"]),
1473
- x(Yt, {
1474
- actions: te(T),
1475
- label: N(T)
1683
+ _(ke, {
1684
+ actions: le(T),
1685
+ label: V(T)
1476
1686
  }, null, 8, ["actions", "label"])
1477
1687
  ]),
1478
- m.value === T.id ? (p(), b(U, { key: 0 }, [
1479
- x(r(fe), {
1480
- modelValue: u.value,
1481
- "onUpdate:modelValue": S[0] || (S[0] = (B) => u.value = B),
1688
+ f.value === T.id ? (h(), k(I, { key: 0 }, [
1689
+ _(i(fe), {
1690
+ modelValue: d.value,
1691
+ "onUpdate:modelValue": E[0] || (E[0] = (D) => d.value = D),
1482
1692
  autosize: { minRows: 2, maxRows: 10 }
1483
1693
  }, null, 8, ["modelValue"]),
1484
- M("div", ln, [
1485
- x(r(Y), {
1694
+ M("div", yn, [
1695
+ _(i(j), {
1486
1696
  size: "sm",
1487
1697
  type: "primary",
1488
- onClick: (B) => Z(T)
1698
+ onClick: (D) => X(T)
1489
1699
  }, {
1490
1700
  default: g(() => [
1491
- R(C(r(o)("notes.save")), 1)
1701
+ W(C(i(s)("notes.save")), 1)
1492
1702
  ]),
1493
1703
  _: 1
1494
1704
  }, 8, ["onClick"]),
1495
- x(r(Y), {
1705
+ _(i(j), {
1496
1706
  size: "sm",
1497
1707
  variant: "text",
1498
- onClick: S[1] || (S[1] = (B) => m.value = null)
1708
+ onClick: E[1] || (E[1] = (D) => f.value = null)
1499
1709
  }, {
1500
1710
  default: g(() => [
1501
- R(C(r(o)("notes.cancel")), 1)
1711
+ W(C(i(s)("notes.cancel")), 1)
1502
1712
  ]),
1503
1713
  _: 1
1504
1714
  })
1505
1715
  ])
1506
- ], 64)) : (p(), b("p", on, C(T.body), 1))
1716
+ ], 64)) : (h(), k("p", xn, C(T.body), 1))
1507
1717
  ])
1508
1718
  ]))), 128))
1509
1719
  ])),
1510
- e.can ? (p(), b("div", sn, [
1511
- x(r(fe), {
1512
- modelValue: c.value,
1513
- "onUpdate:modelValue": S[2] || (S[2] = (T) => c.value = T),
1514
- placeholder: r(o)("notes.placeholder"),
1720
+ e.can ? (h(), k("div", kn, [
1721
+ _(i(fe), {
1722
+ modelValue: m.value,
1723
+ "onUpdate:modelValue": E[2] || (E[2] = (T) => m.value = T),
1724
+ placeholder: i(s)("notes.placeholder"),
1515
1725
  autosize: { minRows: 2, maxRows: 8 }
1516
1726
  }, null, 8, ["modelValue", "placeholder"]),
1517
- x(r(Y), {
1727
+ _(i(j), {
1518
1728
  size: "sm",
1519
1729
  type: "primary",
1520
- disabled: c.value.trim() === "",
1521
- loading: f.value,
1730
+ disabled: m.value.trim() === "",
1731
+ loading: v.value,
1522
1732
  onClick: y
1523
1733
  }, {
1524
1734
  default: g(() => [
1525
- R(C(r(o)("notes.add")), 1)
1735
+ W(C(i(s)("notes.add")), 1)
1526
1736
  ]),
1527
1737
  _: 1
1528
1738
  }, 8, ["disabled", "loading"])
1529
- ])) : E("", !0)
1739
+ ])) : z("", !0)
1530
1740
  ]));
1531
1741
  }
1532
- }), yn = /* @__PURE__ */ V(rn, [["__scopeId", "data-v-71004c1a"]]);
1742
+ }), In = /* @__PURE__ */ N(_n, [["__scopeId", "data-v-71004c1a"]]);
1533
1743
  export {
1534
- ft as AdminLanding,
1535
- ht as AdminNav,
1536
- $t as AdminShell,
1537
- ie as HttpError,
1538
- vn as WxBackButton,
1539
- Zt as WxDate,
1540
- wn as WxHelpButton,
1541
- ot as WxListScreen,
1542
- yn as WxNotes,
1543
- gn as WxRenameButton,
1544
- rt as WxRichTextField,
1545
- Yt as WxRowMenu,
1546
- pn as WxScreen,
1547
- ye as adminKey,
1548
- xe as adminMessages,
1549
- dt as adminTypes,
1550
- hn as createAdmin,
1551
- ut as createAdminContext,
1552
- Dt as createDates,
1553
- St as createHttp,
1554
- ue as createI18n,
1555
- Ot as createNotesApi,
1556
- Pt as errorText,
1557
- Q as i18nKey,
1558
- ct as provideAdmin,
1559
- st as provideI18n,
1560
- he as readCookie,
1561
- It as renderMarkdown,
1562
- H as useAdmin,
1563
- Mt as useDates,
1564
- Vt as useErrorText,
1565
- fn as useI18n,
1566
- I as useTranslate
1744
+ Wt as AdminLanding,
1745
+ At as AdminNav,
1746
+ Vt as AdminShell,
1747
+ re as HttpError,
1748
+ ft as WxBackButton,
1749
+ hn as WxDate,
1750
+ En as WxFilterChips,
1751
+ Bn as WxHelpButton,
1752
+ $t as WxListScreen,
1753
+ In as WxNotes,
1754
+ Un as WxRenameButton,
1755
+ St as WxRichTextField,
1756
+ ke as WxRowMenu,
1757
+ Rn as WxSaveState,
1758
+ Wn as WxScreen,
1759
+ xt as WxScreenHead,
1760
+ _e as adminKey,
1761
+ $e as adminMessages,
1762
+ Tt as adminTypes,
1763
+ zn as createAdmin,
1764
+ Ct as createAdminContext,
1765
+ Zt as createDates,
1766
+ Ht as createHttp,
1767
+ de as createI18n,
1768
+ on as createNotesApi,
1769
+ nn as errorText,
1770
+ ne as i18nKey,
1771
+ Lt as provideAdmin,
1772
+ ct as provideI18n,
1773
+ ve as readCookie,
1774
+ Qt as renderMarkdown,
1775
+ An as rowMenuWidth,
1776
+ O as useAdmin,
1777
+ en as useDates,
1778
+ an as useErrorText,
1779
+ Ln as useI18n,
1780
+ B as useTranslate
1567
1781
  };
1568
1782
  //# sourceMappingURL=index.js.map