@webx-ui/module-banners 0.2.4 → 0.3.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.
@@ -0,0 +1,591 @@
1
+ import { defineComponent as H, ref as T, useTemplateRef as pe, onMounted as ve, nextTick as be, openBlock as r, createBlock as _, unref as e, isRef as ye, withCtx as i, createVNode as d, createElementVNode as z, withKeys as Y, createTextVNode as R, toDisplayString as C, computed as V, watch as A, createElementBlock as U, createSlots as fe, createCommentVNode as L, Fragment as te, normalizeClass as K, resolveDynamicComponent as me, renderList as _e } from "vue";
2
+ import { useRoute as se, useRouter as re } from "vue-router";
3
+ import { useModal as ke, useLocales as we, WxDialog as ge, WxFormItem as Z, WxInput as ee, WxSpace as xe, WxButton as ae, WxTooltip as he, WxIcon as O, WxSegmented as We, WxSkeleton as oe, WxEmpty as j, WxSortableList as Be, WxBadge as le, WxAlert as Ve, toast as x, confirm as ie, createModal as qe, WxCard as Pe, WxListDetail as $e, WxText as ne, WxIndicator as ze } from "@webx-ui/core";
4
+ import { useAdmin as G, useTranslate as J, useErrorText as ce, WxScreenHead as Ce, WxRowMenu as ue, WxListScreen as Te } from "@webx-ui/module-admin";
5
+ import { c as Q, u as X, _ as de } from "./index-3RALKrkh.js";
6
+ const Se = /* @__PURE__ */ H({
7
+ name: "WxBannerPlaceDialog",
8
+ __name: "PlaceDialog",
9
+ props: {
10
+ place: { default: null }
11
+ },
12
+ setup(M) {
13
+ const h = M, { open: b, resolve: D, dismiss: S } = ke(), k = Q(G()), t = we();
14
+ X();
15
+ const p = J("webx-banners"), a = h.place !== null;
16
+ function q() {
17
+ if (h.place === null) return {};
18
+ if (h.place.titles) return { ...h.place.titles };
19
+ const c = t.list.value[0]?.code;
20
+ return c === void 0 ? {} : { [c]: h.place.title };
21
+ }
22
+ const u = T(h.place?.key ?? ""), m = T(q()), W = T(!1), P = T({}), v = pe("field");
23
+ ve(async () => {
24
+ await be(), v.value?.querySelector("input")?.focus();
25
+ });
26
+ function I() {
27
+ return Object.values(m.value).some((c) => c.trim() !== "");
28
+ }
29
+ function w(c) {
30
+ const y = Object.keys(P.value).find((g) => g === c || g.startsWith(`${c}.`));
31
+ return y === void 0 ? void 0 : P.value[y]?.[0];
32
+ }
33
+ async function B() {
34
+ if (!(!I() || W.value)) {
35
+ W.value = !0, P.value = {};
36
+ try {
37
+ D(
38
+ a && h.place !== null ? await k.renamePlace(h.place.key, m.value) : await k.createPlace({ key: u.value.trim(), title: m.value })
39
+ );
40
+ } catch (c) {
41
+ P.value = c.body?.errors ?? {};
42
+ } finally {
43
+ W.value = !1;
44
+ }
45
+ }
46
+ }
47
+ return (c, y) => (r(), _(e(ge), {
48
+ open: e(b),
49
+ "onUpdate:open": y[3] || (y[3] = (g) => ye(b) ? b.value = g : null),
50
+ title: a ? e(p)("places.rename-title") : e(p)("places.new-title"),
51
+ width: 440
52
+ }, {
53
+ footer: i(() => [
54
+ d(e(xe), { size: "sm" }, {
55
+ default: i(() => [
56
+ d(e(ae), {
57
+ variant: "outline",
58
+ onClick: y[2] || (y[2] = (g) => e(S)())
59
+ }, {
60
+ default: i(() => [
61
+ R(C(e(p)("places.cancel")), 1)
62
+ ]),
63
+ _: 1
64
+ }),
65
+ d(e(ae), {
66
+ type: "primary",
67
+ loading: W.value,
68
+ disabled: !I() || u.value.trim() === "",
69
+ onClick: B
70
+ }, {
71
+ default: i(() => [
72
+ R(C(a ? e(p)("places.save") : e(p)("places.create")), 1)
73
+ ]),
74
+ _: 1
75
+ }, 8, ["loading", "disabled"])
76
+ ]),
77
+ _: 1
78
+ })
79
+ ]),
80
+ default: i(() => [
81
+ d(e(Z), {
82
+ label: e(p)("places.field-title"),
83
+ error: w("title"),
84
+ required: ""
85
+ }, {
86
+ default: i(() => [
87
+ z("div", {
88
+ ref_key: "field",
89
+ ref: v
90
+ }, [
91
+ d(e(ee), {
92
+ modelValue: m.value,
93
+ "onUpdate:modelValue": y[0] || (y[0] = (g) => m.value = g),
94
+ localized: "",
95
+ "aria-label": e(p)("places.field-title"),
96
+ onKeyup: Y(B, ["enter"])
97
+ }, null, 8, ["modelValue", "aria-label"])
98
+ ], 512)
99
+ ]),
100
+ _: 1
101
+ }, 8, ["label", "error"]),
102
+ d(e(Z), {
103
+ label: e(p)("places.field-key"),
104
+ error: w("key"),
105
+ help: a ? void 0 : e(p)("places.key-help"),
106
+ required: ""
107
+ }, {
108
+ default: i(() => [
109
+ d(e(ee), {
110
+ modelValue: u.value,
111
+ "onUpdate:modelValue": y[1] || (y[1] = (g) => u.value = g),
112
+ disabled: a,
113
+ "aria-label": e(p)("places.field-key"),
114
+ autocomplete: "off",
115
+ onKeyup: Y(B, ["enter"])
116
+ }, null, 8, ["modelValue", "aria-label"])
117
+ ]),
118
+ _: 1
119
+ }, 8, ["label", "error", "help"])
120
+ ]),
121
+ _: 1
122
+ }, 8, ["open", "title"]));
123
+ }
124
+ }), Ie = { class: "wx-banner-place" }, Me = ["aria-label"], De = { class: "wx-banner-place__usage" }, Ue = {
125
+ key: 0,
126
+ class: "wx-banner-place__layout"
127
+ }, Le = { class: "wx-banner-row__thumb" }, Re = ["src"], Ee = { class: "wx-banner-row__body" }, Fe = { class: "wx-banner-row__title" }, Ne = {
128
+ key: 0,
129
+ class: "wx-banner-row__facts"
130
+ }, Ae = /* @__PURE__ */ H({
131
+ name: "WxBannerPlacePane",
132
+ __name: "PlacePane",
133
+ props: {
134
+ place: {},
135
+ base: {},
136
+ inline: { type: Boolean, default: !0 }
137
+ },
138
+ emits: ["back", "changed"],
139
+ setup(M, { emit: h }) {
140
+ const b = M, D = h, S = G(), k = Q(S), t = se(), p = re();
141
+ X();
142
+ const a = J("webx-banners"), q = ce(), u = T([]), m = T(!0), W = V(() => S.can("banners.manage")), P = V({
143
+ get: () => t.query.view === "trashed" ? "trashed" : "live",
144
+ set: (n) => {
145
+ p.replace({
146
+ query: { ...t.query, view: n === "trashed" ? "trashed" : void 0 }
147
+ });
148
+ }
149
+ }), v = V(() => P.value === "trashed"), I = V(() => [
150
+ { value: "live", label: a("banner.all") },
151
+ { value: "trashed", label: a("banner.trashed"), icon: "trash" }
152
+ ]), w = V(() => W.value && !v.value && u.value.length > 1), B = V(() => ["single", "random", "slider"].includes(b.place.layout) ? a(`places.layout-${b.place.layout}`) : "");
153
+ async function c() {
154
+ m.value = !0;
155
+ try {
156
+ u.value = await k.list(b.place.key, v.value);
157
+ } catch (n) {
158
+ x.danger(q(n));
159
+ } finally {
160
+ m.value = !1;
161
+ }
162
+ }
163
+ A(v, () => {
164
+ c();
165
+ }), c();
166
+ function y(n) {
167
+ return `${b.base}/${n.id}`;
168
+ }
169
+ function g() {
170
+ p.push({ path: `${b.base}/new`, query: { place: b.place.key } });
171
+ }
172
+ async function F() {
173
+ try {
174
+ await k.reorder(
175
+ b.place.key,
176
+ u.value.map((n) => n.id)
177
+ );
178
+ } catch (n) {
179
+ x.danger(q(n, a("banner.reorder-failed"))), await c();
180
+ }
181
+ }
182
+ async function E(n) {
183
+ try {
184
+ const f = await k.get(n.id);
185
+ await k.save(n.id, { ...f.values, enabled: !n.enabled }), x.success(n.enabled ? a("banner.switched-off") : a("banner.switched-on"));
186
+ } catch (f) {
187
+ x.danger(q(f));
188
+ } finally {
189
+ await c();
190
+ }
191
+ }
192
+ async function N(n) {
193
+ if (await ie({
194
+ title: a("banner.delete-title", { name: n.title }),
195
+ message: a("banner.delete-text"),
196
+ confirmText: a("banner.delete"),
197
+ cancelText: a("banner.cancel"),
198
+ tone: "danger"
199
+ }))
200
+ try {
201
+ await k.remove(n.id), x.success(a("banner.deleted")), D("changed");
202
+ } catch (o) {
203
+ x.danger(q(o));
204
+ } finally {
205
+ await c();
206
+ }
207
+ }
208
+ async function l(n) {
209
+ try {
210
+ await k.restore(n.id), x.success(a("banner.restored")), D("changed");
211
+ } catch (f) {
212
+ x.danger(q(f));
213
+ } finally {
214
+ await c();
215
+ }
216
+ }
217
+ function $(n) {
218
+ if (v.value)
219
+ return W.value ? [
220
+ {
221
+ key: "restore",
222
+ icon: "refresh",
223
+ label: a("banner.restore"),
224
+ run: () => {
225
+ l(n);
226
+ }
227
+ }
228
+ ] : [];
229
+ const f = {
230
+ key: "open",
231
+ icon: "edit",
232
+ label: a("banner.open"),
233
+ run: () => {
234
+ p.push(y(n));
235
+ }
236
+ };
237
+ return W.value ? [
238
+ f,
239
+ {
240
+ key: "toggle",
241
+ icon: n.enabled ? "eye-off" : "eye",
242
+ label: n.enabled ? a("banner.disable") : a("banner.enable"),
243
+ run: () => {
244
+ E(n);
245
+ }
246
+ },
247
+ {
248
+ key: "delete",
249
+ icon: "trash",
250
+ label: a("banner.delete"),
251
+ danger: !0,
252
+ run: () => {
253
+ N(n);
254
+ }
255
+ }
256
+ ] : [f];
257
+ }
258
+ const s = V(
259
+ () => W.value && !v.value ? [{ key: "new", label: a("banner.new"), icon: "plus", primary: !0, run: g }] : []
260
+ );
261
+ return (n, f) => (r(), U("div", Ie, [
262
+ d(e(Ce), {
263
+ level: 3,
264
+ back: !b.inline,
265
+ "back-label": e(a)("places.places"),
266
+ title: M.place.title,
267
+ actions: s.value,
268
+ "collapse-below": 420,
269
+ onBack: f[0] || (f[0] = (o) => D("back"))
270
+ }, fe({ _: 2 }, [
271
+ M.place.declared ? {
272
+ name: "title-after",
273
+ fn: i(() => [
274
+ d(e(he), {
275
+ content: e(a)("places.declared-help")
276
+ }, {
277
+ default: i(() => [
278
+ z("span", {
279
+ class: "wx-banner-place__lock",
280
+ tabindex: "0",
281
+ "aria-label": e(a)("places.declared")
282
+ }, [
283
+ d(e(O), {
284
+ name: "lock",
285
+ size: "sm"
286
+ })
287
+ ], 8, Me)
288
+ ]),
289
+ _: 1
290
+ }, 8, ["content"])
291
+ ]),
292
+ key: "0"
293
+ } : void 0
294
+ ]), 1032, ["back", "back-label", "title", "actions"]),
295
+ z("p", De, [
296
+ z("span", null, C(e(a)("places.usage")), 1),
297
+ z("code", null, "banners('" + C(M.place.key) + "')", 1),
298
+ B.value ? (r(), U("span", Ue, "· " + C(B.value), 1)) : L("", !0)
299
+ ]),
300
+ d(e(We), {
301
+ modelValue: P.value,
302
+ "onUpdate:modelValue": f[1] || (f[1] = (o) => P.value = o),
303
+ class: "wx-banner-place__views",
304
+ size: "sm",
305
+ options: I.value,
306
+ "aria-label": e(a)("banner.all")
307
+ }, null, 8, ["modelValue", "options", "aria-label"]),
308
+ m.value && u.value.length === 0 ? (r(), _(e(oe), {
309
+ key: 0,
310
+ rows: 4
311
+ })) : u.value.length === 0 ? (r(), _(e(j), {
312
+ key: 1,
313
+ title: v.value ? e(a)("banner.empty-bin") : e(a)("banner.empty"),
314
+ description: v.value ? void 0 : e(a)("banner.empty-help")
315
+ }, null, 8, ["title", "description"])) : (r(), U(te, { key: 2 }, [
316
+ d(e(Be), {
317
+ modelValue: u.value,
318
+ "onUpdate:modelValue": f[2] || (f[2] = (o) => u.value = o),
319
+ class: K(["wx-banner-place__list", { "is-loading": m.value }]),
320
+ hoverable: "",
321
+ plain: "",
322
+ "item-key": "id",
323
+ handle: w.value ? "grip" : "row",
324
+ "item-label": (o) => o.title,
325
+ disabled: !w.value,
326
+ onMove: F
327
+ }, {
328
+ default: i(({ item: o }) => [
329
+ (r(), _(me(v.value ? "div" : "router-link"), {
330
+ to: v.value ? void 0 : y(o),
331
+ class: K(["wx-banner-row", { "is-off": !o.enabled && !v.value }])
332
+ }, {
333
+ default: i(() => [
334
+ z("span", Le, [
335
+ o.thumb ? (r(), U("img", {
336
+ key: 0,
337
+ src: o.thumb,
338
+ alt: "",
339
+ loading: "lazy"
340
+ }, null, 8, Re)) : (r(), _(e(O), {
341
+ key: 1,
342
+ name: "image",
343
+ size: "sm",
344
+ "aria-label": e(a)("banner.no-picture")
345
+ }, null, 8, ["aria-label"]))
346
+ ]),
347
+ z("span", Ee, [
348
+ z("span", Fe, C(o.title), 1),
349
+ o.video || !o.enabled && !v.value ? (r(), U("span", Ne, [
350
+ o.video ? (r(), _(e(le), {
351
+ key: 0,
352
+ size: "sm",
353
+ type: "info"
354
+ }, {
355
+ default: i(() => [
356
+ R(C(e(a)("banner.video")), 1)
357
+ ]),
358
+ _: 1
359
+ })) : L("", !0),
360
+ !o.enabled && !v.value ? (r(), _(e(le), {
361
+ key: 1,
362
+ dot: "",
363
+ size: "sm"
364
+ }, {
365
+ default: i(() => [
366
+ R(C(e(a)("banner.disabled")), 1)
367
+ ]),
368
+ _: 1
369
+ })) : L("", !0)
370
+ ])) : L("", !0)
371
+ ])
372
+ ]),
373
+ _: 2
374
+ }, 1032, ["to", "class"]))
375
+ ]),
376
+ actions: i(({ item: o }) => [
377
+ d(e(ue), {
378
+ actions: $(o),
379
+ label: o.title
380
+ }, null, 8, ["actions", "label"])
381
+ ]),
382
+ _: 1
383
+ }, 8, ["modelValue", "class", "handle", "item-label", "disabled"]),
384
+ w.value ? (r(), _(e(Ve), {
385
+ key: 0,
386
+ class: "wx-banner-place__note",
387
+ type: "info",
388
+ description: e(a)("banner.order")
389
+ }, null, 8, ["description"])) : L("", !0)
390
+ ], 64))
391
+ ]));
392
+ }
393
+ }), Ke = /* @__PURE__ */ de(Ae, [["__scopeId", "data-v-48d645bf"]]), Oe = {
394
+ key: 2,
395
+ class: "wx-banners__list"
396
+ }, je = ["onClick"], He = { class: "wx-banners__name" }, Ge = /* @__PURE__ */ H({
397
+ __name: "BannersPage",
398
+ props: {
399
+ base: { default: "/banners" }
400
+ },
401
+ setup(M) {
402
+ const h = M, b = G(), D = Q(b), S = se(), k = re();
403
+ X();
404
+ const t = J("webx-banners"), p = ce(), a = T([]), q = T(!0), u = T(!1), m = T(!0), W = V(() => b.can("banners.manage")), P = qe(Se), v = V(
405
+ () => b.state.manifest?.modules.find((l) => l.id === "banners")?.title ?? t("module.banners")
406
+ ), I = V(() => {
407
+ const l = S.query.place;
408
+ return typeof l == "string" && l !== "" ? l : null;
409
+ }), w = V(() => a.value.find((l) => l.key === I.value) ?? null);
410
+ async function B() {
411
+ q.value = !0;
412
+ try {
413
+ a.value = await D.places();
414
+ } catch (l) {
415
+ x.danger(p(l));
416
+ } finally {
417
+ q.value = !1;
418
+ }
419
+ }
420
+ B(), A([a, w, m], () => {
421
+ !m.value || a.value.length === 0 || w.value !== null || k.replace({ query: { ...S.query, place: a.value[0].key } });
422
+ }), A(w, (l) => {
423
+ l !== null && m.value && (u.value = !0);
424
+ }), I.value !== null && (u.value = !0);
425
+ function c(l) {
426
+ const $ = { ...S.query, place: l.key };
427
+ delete $.view, k.replace({ query: $ }), u.value = !0;
428
+ }
429
+ async function y() {
430
+ const l = await P({ place: null });
431
+ l && (x.success(t("places.created")), await B(), c(l));
432
+ }
433
+ async function g(l) {
434
+ await P({ place: l }) && (x.success(t("places.renamed")), await B());
435
+ }
436
+ async function F(l) {
437
+ if (await ie({
438
+ title: t("places.delete-title", { place: l.title }),
439
+ message: t("places.delete-text"),
440
+ confirmText: t("places.delete"),
441
+ cancelText: t("places.cancel"),
442
+ tone: "danger"
443
+ }))
444
+ try {
445
+ if (await D.removePlace(l.key), x.success(t("places.deleted")), I.value === l.key) {
446
+ const s = { ...S.query };
447
+ delete s.place, delete s.view, k.replace({ query: s }), u.value = !1;
448
+ }
449
+ } catch (s) {
450
+ x.danger(p(s));
451
+ } finally {
452
+ await B();
453
+ }
454
+ }
455
+ function E(l) {
456
+ return !W.value || l.declared ? [] : [
457
+ { key: "rename", icon: "edit", label: t("places.rename"), run: () => {
458
+ g(l);
459
+ } },
460
+ {
461
+ key: "delete",
462
+ icon: "trash",
463
+ // Said in the line itself, since a switched-off line cannot carry a tooltip: an empty
464
+ // place is the only kind that goes (decision 1).
465
+ label: l.count > 0 ? t("places.delete-empty-first") : t("places.delete"),
466
+ danger: !0,
467
+ disabled: l.count > 0,
468
+ run: () => {
469
+ F(l);
470
+ }
471
+ }
472
+ ];
473
+ }
474
+ const N = V(
475
+ () => W.value ? [{ key: "new-place", label: t("places.new"), icon: "plus", run: () => {
476
+ y();
477
+ } }] : []
478
+ );
479
+ return (l, $) => (r(), _(e(Te), {
480
+ title: v.value,
481
+ actions: N.value,
482
+ card: !1
483
+ }, {
484
+ default: i(() => [
485
+ d(e(Pe), {
486
+ class: "wx-banners",
487
+ padding: "none"
488
+ }, {
489
+ default: i(() => [
490
+ d(e($e), {
491
+ open: u.value,
492
+ "onUpdate:open": $[0] || ($[0] = (s) => u.value = s),
493
+ class: "wx-banners__panes",
494
+ "list-width": 300,
495
+ "detail-min": 440,
496
+ "detail-label": e(t)("places.places"),
497
+ onDetailInline: $[1] || ($[1] = (s) => m.value = s)
498
+ }, {
499
+ list: i(() => [
500
+ q.value && a.value.length === 0 ? (r(), _(e(oe), {
501
+ key: 0,
502
+ class: "wx-banners__loading",
503
+ rows: 3
504
+ })) : a.value.length === 0 ? (r(), _(e(j), {
505
+ key: 1,
506
+ title: e(t)("places.empty"),
507
+ description: e(t)("places.empty-help")
508
+ }, null, 8, ["title", "description"])) : (r(), U("ul", Oe, [
509
+ (r(!0), U(te, null, _e(a.value, (s) => (r(), U("li", {
510
+ key: s.key,
511
+ class: "wx-banners__row"
512
+ }, [
513
+ z("button", {
514
+ type: "button",
515
+ class: K(["wx-banners__open", { "is-current": s.key === I.value }]),
516
+ onClick: (n) => c(s)
517
+ }, [
518
+ z("span", He, [
519
+ d(e(ne), {
520
+ truncate: "",
521
+ weight: "medium"
522
+ }, {
523
+ default: i(() => [
524
+ R(C(s.title), 1)
525
+ ]),
526
+ _: 2
527
+ }, 1024),
528
+ s.declared ? (r(), _(e(O), {
529
+ key: 0,
530
+ class: "wx-banners__lock",
531
+ name: "lock",
532
+ size: "sm",
533
+ "aria-label": e(t)("places.declared")
534
+ }, null, 8, ["aria-label"])) : L("", !0),
535
+ d(e(ze), {
536
+ class: "wx-banners__count",
537
+ type: "neutral",
538
+ value: s.count,
539
+ label: e(t)("places.count")
540
+ }, null, 8, ["value", "label"])
541
+ ]),
542
+ d(e(ne), {
543
+ size: "sm",
544
+ tone: "muted",
545
+ mono: "",
546
+ truncate: ""
547
+ }, {
548
+ default: i(() => [
549
+ R("banners('" + C(s.key) + "')", 1)
550
+ ]),
551
+ _: 2
552
+ }, 1024)
553
+ ], 10, je),
554
+ E(s).length > 0 ? (r(), _(e(ue), {
555
+ key: 0,
556
+ actions: E(s),
557
+ label: s.title
558
+ }, null, 8, ["actions", "label"])) : L("", !0)
559
+ ]))), 128))
560
+ ]))
561
+ ]),
562
+ detail: i(({ inline: s, back: n }) => [
563
+ w.value ? (r(), _(Ke, {
564
+ key: w.value.key,
565
+ place: w.value,
566
+ base: h.base,
567
+ inline: s,
568
+ onBack: n,
569
+ onChanged: B
570
+ }, null, 8, ["place", "base", "inline", "onBack"])) : L("", !0)
571
+ ]),
572
+ empty: i(() => [
573
+ d(e(j), {
574
+ title: e(t)("places.choose"),
575
+ description: e(t)("places.choose-help")
576
+ }, null, 8, ["title", "description"])
577
+ ]),
578
+ _: 1
579
+ }, 8, ["open", "detail-label"])
580
+ ]),
581
+ _: 1
582
+ })
583
+ ]),
584
+ _: 1
585
+ }, 8, ["title", "actions"]));
586
+ }
587
+ }), ea = /* @__PURE__ */ de(Ge, [["__scopeId", "data-v-615232f0"]]);
588
+ export {
589
+ ea as default
590
+ };
591
+ //# sourceMappingURL=BannersPage-Dl_BCozz.js.map