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