@webx-ui/module-menu 0.1.22 → 0.2.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,265 @@
1
+ import { defineComponent as G, ref as M, computed as v, watch as V, openBlock as l, createBlock as o, unref as t, withCtx as s, createVNode as r, createCommentVNode as A, createElementBlock as W, Fragment as B, renderList as H, createElementVNode as D, normalizeClass as J, createTextVNode as _, toDisplayString as p } from "vue";
2
+ import { useRoute as K, useRouter as O } from "vue-router";
3
+ import { createModal as Q, WxCard as X, WxListDetail as Y, WxEmpty as L, WxSkeleton as Z, WxText as h, WxIndicator as ee, WxAction as te, toast as i, confirm as ne } from "@webx-ui/core";
4
+ import { useAdmin as ae, useTranslate as le, useErrorText as ue, WxListScreen as se, WxDate as oe, WxRowMenu as re } from "@webx-ui/module-admin";
5
+ import { c as ie, u as ce, _ as me, M as de, a as fe } from "./index-tmF0XKBt.js";
6
+ const ye = {
7
+ key: 2,
8
+ class: "wx-menus__list"
9
+ }, ve = ["onClick"], _e = { class: "wx-menus__name" }, pe = { class: "wx-menus__cache" }, he = /* @__PURE__ */ G({
10
+ __name: "MenusPage",
11
+ setup(ke) {
12
+ const q = ae(), k = ie(q), f = K(), w = O();
13
+ ce();
14
+ const n = le("webx-menu"), x = ue(), c = M([]), T = M(!0), y = M(!1), g = M(!0), b = v(() => q.can("menu.manage")), E = Q(me), P = v(
15
+ () => q.state.manifest?.modules.find((e) => e.id === "menu")?.title ?? n("module.title")
16
+ ), C = v(() => {
17
+ const e = f.query.menu;
18
+ return typeof e == "string" && e !== "" ? e : null;
19
+ }), d = v(() => c.value.find((e) => e.key === C.value) ?? null);
20
+ async function m() {
21
+ T.value = !0;
22
+ try {
23
+ c.value = await k.list();
24
+ } catch (e) {
25
+ i.danger(x(e));
26
+ } finally {
27
+ T.value = !1;
28
+ }
29
+ }
30
+ m(), V([c, d, g], () => {
31
+ !g.value || c.value.length === 0 || d.value !== null || w.replace({ query: { ...f.query, menu: c.value[0].key } });
32
+ }), V(d, (e) => {
33
+ e !== null && g.value && (y.value = !0);
34
+ });
35
+ function I(e) {
36
+ w.replace({ query: { ...f.query, menu: e.key } }), y.value = !0;
37
+ }
38
+ async function R() {
39
+ const e = await E({ menu: null });
40
+ e && (await m(), I(e));
41
+ }
42
+ async function S(e) {
43
+ const u = await E({ menu: e });
44
+ u && (i.success(n("menu.renamed")), C.value === e.key && u.key !== e.key && w.replace({ query: { ...f.query, menu: u.key } }), await m());
45
+ }
46
+ async function $(e) {
47
+ if (await ne({
48
+ title: n("menu.delete-menu-title", { menu: e.title }),
49
+ message: n("menu.delete-menu-text"),
50
+ confirmText: n("menu.delete"),
51
+ cancelText: n("menu.cancel"),
52
+ tone: "danger"
53
+ }))
54
+ try {
55
+ if (await k.remove(e.key), i.success(n("menu.deleted")), C.value === e.key) {
56
+ const a = { ...f.query };
57
+ delete a.menu, w.replace({ query: a }), y.value = !1;
58
+ }
59
+ await m();
60
+ } catch (a) {
61
+ i.danger(x(a));
62
+ }
63
+ }
64
+ async function N(e) {
65
+ try {
66
+ await k.flush(e.key), i.success(n("menu.flushed")), await m();
67
+ } catch (u) {
68
+ i.danger(x(u));
69
+ }
70
+ }
71
+ async function F() {
72
+ try {
73
+ await k.flushAll(), i.success(n("menu.flushed")), await m();
74
+ } catch (e) {
75
+ i.danger(x(e));
76
+ }
77
+ }
78
+ function U(e) {
79
+ return b.value ? [
80
+ { key: "rename", icon: "edit", label: n("menu.rename"), run: () => {
81
+ S(e);
82
+ } },
83
+ { key: "flush", icon: "refresh", label: n("menu.flush"), run: () => {
84
+ N(e);
85
+ } },
86
+ ...e.can.delete ? [
87
+ {
88
+ key: "delete",
89
+ icon: "trash",
90
+ label: n("menu.delete"),
91
+ danger: !0,
92
+ run: () => {
93
+ $(e);
94
+ }
95
+ }
96
+ ] : []
97
+ ] : [];
98
+ }
99
+ const j = v(() => b.value ? [
100
+ {
101
+ key: "flush-all",
102
+ label: n("menu.flush-all"),
103
+ icon: "refresh",
104
+ menu: !0,
105
+ run: () => {
106
+ F();
107
+ }
108
+ },
109
+ {
110
+ key: "new-menu",
111
+ label: n("menu.new-menu"),
112
+ icon: "plus",
113
+ primary: !0,
114
+ run: () => {
115
+ R();
116
+ }
117
+ }
118
+ ] : []);
119
+ return (e, u) => (l(), o(t(se), {
120
+ title: P.value,
121
+ actions: j.value,
122
+ card: !1
123
+ }, {
124
+ default: s(() => [
125
+ r(t(X), {
126
+ class: "wx-menus",
127
+ padding: "none"
128
+ }, {
129
+ default: s(() => [
130
+ r(t(Y), {
131
+ open: y.value,
132
+ "onUpdate:open": u[0] || (u[0] = (a) => y.value = a),
133
+ class: "wx-menus__panes",
134
+ "list-width": 320,
135
+ "detail-min": 420,
136
+ "detail-label": t(n)("menu.menus"),
137
+ onDetailInline: u[1] || (u[1] = (a) => g.value = a)
138
+ }, {
139
+ list: s(() => [
140
+ T.value ? (l(), o(t(Z), {
141
+ key: 0,
142
+ class: "wx-menus__loading",
143
+ rows: 4
144
+ })) : c.value.length === 0 ? (l(), o(t(L), {
145
+ key: 1,
146
+ title: t(n)("menu.no-menus"),
147
+ description: t(n)("menu.no-menus-help")
148
+ }, null, 8, ["title", "description"])) : (l(), W("ul", ye, [
149
+ (l(!0), W(B, null, H(c.value, (a) => (l(), W("li", {
150
+ key: a.key,
151
+ class: "wx-menus__row"
152
+ }, [
153
+ D("button", {
154
+ type: "button",
155
+ class: J(["wx-menus__open", { "is-current": a.key === C.value }]),
156
+ onClick: (z) => I(a)
157
+ }, [
158
+ D("span", _e, [
159
+ r(t(h), {
160
+ truncate: "",
161
+ weight: "medium"
162
+ }, {
163
+ default: s(() => [
164
+ _(p(a.title), 1)
165
+ ]),
166
+ _: 2
167
+ }, 1024),
168
+ r(t(ee), {
169
+ class: "wx-menus__count",
170
+ type: "neutral",
171
+ value: a.items_count,
172
+ label: t(n)("menu.menus")
173
+ }, null, 8, ["value", "label"])
174
+ ]),
175
+ r(t(h), {
176
+ size: "sm",
177
+ tone: "muted",
178
+ mono: "",
179
+ truncate: ""
180
+ }, {
181
+ default: s(() => [
182
+ _(p(a.key), 1)
183
+ ]),
184
+ _: 2
185
+ }, 1024),
186
+ D("span", pe, [
187
+ a.cache.enabled ? a.cache.built_at !== null ? (l(), W(B, { key: 1 }, [
188
+ r(t(h), {
189
+ size: "sm",
190
+ tone: "muted"
191
+ }, {
192
+ default: s(() => [
193
+ _(p(t(n)("menu.cache-built")), 1)
194
+ ]),
195
+ _: 1
196
+ }),
197
+ r(t(oe), {
198
+ value: a.cache.built_at
199
+ }, null, 8, ["value"])
200
+ ], 64)) : (l(), o(t(h), {
201
+ key: 2,
202
+ size: "sm",
203
+ tone: "muted"
204
+ }, {
205
+ default: s(() => [
206
+ _(p(t(n)("menu.cache-empty")), 1)
207
+ ]),
208
+ _: 1
209
+ })) : (l(), o(t(h), {
210
+ key: 0,
211
+ size: "sm",
212
+ tone: "muted"
213
+ }, {
214
+ default: s(() => [
215
+ _(p(t(n)("menu.cache-off")), 1)
216
+ ]),
217
+ _: 1
218
+ }))
219
+ ])
220
+ ], 10, ve),
221
+ b.value && a.cache.enabled ? (l(), o(t(te), {
222
+ key: 0,
223
+ class: "wx-menus__flush",
224
+ icon: "refresh",
225
+ size: "sm",
226
+ title: t(n)("menu.flush"),
227
+ onClick: (z) => N(a)
228
+ }, null, 8, ["title", "onClick"])) : A("", !0),
229
+ b.value ? (l(), o(t(re), {
230
+ key: 1,
231
+ actions: U(a),
232
+ label: a.title
233
+ }, null, 8, ["actions", "label"])) : A("", !0)
234
+ ]))), 128))
235
+ ]))
236
+ ]),
237
+ detail: s(({ inline: a, back: z }) => [
238
+ d.value ? (l(), o(de, {
239
+ key: d.value.key,
240
+ menu: d.value,
241
+ inline: a,
242
+ back: z,
243
+ onChanged: m
244
+ }, null, 8, ["menu", "inline", "back"])) : A("", !0)
245
+ ]),
246
+ empty: s(() => [
247
+ r(t(L), {
248
+ title: t(n)("menu.choose-menu"),
249
+ description: t(n)("menu.choose-menu-help")
250
+ }, null, 8, ["title", "description"])
251
+ ]),
252
+ _: 1
253
+ }, 8, ["open", "detail-label"])
254
+ ]),
255
+ _: 1
256
+ })
257
+ ]),
258
+ _: 1
259
+ }, 8, ["title", "actions"]));
260
+ }
261
+ }), Me = /* @__PURE__ */ fe(he, [["__scopeId", "data-v-63e1d3fa"]]);
262
+ export {
263
+ Me as default
264
+ };
265
+ //# sourceMappingURL=MenusPage-UQffRtpG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MenusPage-UQffRtpG.js","sources":["../src/MenusPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport {\n confirm,\n createModal,\n toast,\n WxAction,\n WxCard,\n WxEmpty,\n WxIndicator,\n WxListDetail,\n WxSkeleton,\n WxText,\n} from '@webx-ui/core'\nimport {\n useAdmin,\n useErrorText,\n useTranslate,\n WxDate,\n WxListScreen,\n WxRowMenu,\n type RowAction,\n type ScreenAction,\n} from '@webx-ui/module-admin'\nimport MenuCreateDialog from './MenuCreateDialog.vue'\nimport MenuTreePane from './MenuTreePane.vue'\nimport { createMenusApi } from './api'\nimport { useMenuMessages } from './i18n'\nimport type { MenuRow } from './types'\n\n/**\n * The section: the menus of the site on the left, the items of one of them on the right (§9).\n *\n * The menus are the list and the tree is the record beside it, rather than the other way round.\n * Somebody who opens this section is arranging a menu, not choosing between four of them — so\n * the first one opens by itself where there is room for it, and on a phone it does not, because\n * there the same line would raise a panel over a list nobody has touched.\n */\nconst admin = useAdmin()\nconst api = createMenusApi(admin)\nconst route = useRoute()\nconst router = useRouter()\nuseMenuMessages()\n\nconst t = useTranslate('webx-menu')\n/* Not the server's `message`: the panel says how a request failed in its own words. */\nconst message = useErrorText()\n\nconst menus = ref<MenuRow[]>([])\nconst loading = ref(true)\nconst open = ref(false)\nconst detailInline = ref(true)\n\nconst canManage = computed(() => admin.can('menu.manage'))\n\nconst edit = createModal<MenuRow, { menu?: MenuRow | null }>(MenuCreateDialog)\n\nconst title = computed(\n () =>\n admin.state.manifest?.modules.find((module) => module.id === 'menu')?.title ??\n t('module.title'),\n)\n\n/**\n * Which menu is open, kept in the address — so that coming back from anywhere lands on the\n * menu somebody was arranging, and so that \"the footer\" is a link they can send.\n */\nconst current = computed<string | null>(() => {\n const asked = route.query.menu\n\n return typeof asked === 'string' && asked !== '' ? asked : null\n})\n\nconst chosen = computed(() => menus.value.find((menu) => menu.key === current.value) ?? null)\n\nasync function load(): Promise<void> {\n loading.value = true\n\n try {\n menus.value = await api.list()\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nvoid load()\n\n/*\n * The first menu, where there is a column to draw it in. A screen whose whole right-hand half\n * says \"choose one\" has spent its width on an instruction; a phone, where the same thing means\n * opening a panel over the list, gets the list.\n */\nwatch([menus, chosen, detailInline], () => {\n if (!detailInline.value || menus.value.length === 0 || chosen.value !== null) return\n\n void router.replace({ query: { ...route.query, menu: menus.value[0].key } })\n})\n\nwatch(chosen, (menu) => {\n if (menu !== null && detailInline.value) open.value = true\n})\n\nfunction choose(menu: MenuRow): void {\n void router.replace({ query: { ...route.query, menu: menu.key } })\n open.value = true\n}\n\nasync function add(): Promise<void> {\n const made = await edit({ menu: null })\n\n if (!made) return\n\n await load()\n choose(made)\n}\n\nasync function rename(menu: MenuRow): Promise<void> {\n const saved = await edit({ menu })\n\n if (!saved) return\n\n toast.success(t('menu.renamed'))\n\n // The key may have changed with it, and the address names the old one.\n if (current.value === menu.key && saved.key !== menu.key) {\n void router.replace({ query: { ...route.query, menu: saved.key } })\n }\n\n await load()\n}\n\nasync function remove(menu: MenuRow): Promise<void> {\n const agreed = await confirm({\n title: t('menu.delete-menu-title', { menu: menu.title }),\n message: t('menu.delete-menu-text'),\n confirmText: t('menu.delete'),\n cancelText: t('menu.cancel'),\n tone: 'danger',\n })\n\n if (!agreed) return\n\n try {\n await api.remove(menu.key)\n toast.success(t('menu.deleted'))\n\n if (current.value === menu.key) {\n const rest = { ...route.query }\n delete rest.menu\n void router.replace({ query: rest })\n open.value = false\n }\n\n await load()\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\n/**\n * Forget what this menu was built into, in every language.\n *\n * The list is loaded again afterwards rather than trusted: the mark under the name is the whole\n * of what this button says out loud, and a button that leaves it reading \"built today at 08:10\"\n * is a button nobody believes the second time.\n */\nasync function flush(menu: MenuRow): Promise<void> {\n try {\n await api.flush(menu.key)\n toast.success(t('menu.flushed'))\n await load()\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\nasync function flushAll(): Promise<void> {\n try {\n await api.flushAll()\n toast.success(t('menu.flushed'))\n await load()\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\nfunction actionsFor(menu: MenuRow): RowAction[] {\n if (!canManage.value) return []\n\n return [\n { key: 'rename', icon: 'edit', label: t('menu.rename'), run: () => void rename(menu) },\n { key: 'flush', icon: 'refresh', label: t('menu.flush'), run: () => void flush(menu) },\n ...(menu.can.delete\n ? [\n {\n key: 'delete',\n icon: 'trash' as const,\n label: t('menu.delete'),\n danger: true,\n run: () => void remove(menu),\n },\n ]\n : []),\n ]\n}\n\nconst actions = computed<ScreenAction[]>(() => {\n if (!canManage.value) return []\n\n return [\n {\n key: 'flush-all',\n label: t('menu.flush-all'),\n icon: 'refresh',\n menu: true,\n run: () => void flushAll(),\n },\n {\n key: 'new-menu',\n label: t('menu.new-menu'),\n icon: 'plus',\n primary: true,\n run: () => void add(),\n },\n ]\n})\n</script>\n\n<template>\n <wx-list-screen :title=\"title\" :actions=\"actions\" :card=\"false\">\n <wx-card class=\"wx-menus\" padding=\"none\">\n <wx-list-detail\n v-model:open=\"open\"\n class=\"wx-menus__panes\"\n :list-width=\"320\"\n :detail-min=\"420\"\n :detail-label=\"t('menu.menus')\"\n @detail-inline=\"detailInline = $event\"\n >\n <template #list>\n <wx-skeleton v-if=\"loading\" class=\"wx-menus__loading\" :rows=\"4\" />\n\n <wx-empty\n v-else-if=\"menus.length === 0\"\n :title=\"t('menu.no-menus')\"\n :description=\"t('menu.no-menus-help')\"\n />\n\n <ul v-else class=\"wx-menus__list\">\n <li v-for=\"menu in menus\" :key=\"menu.key\" class=\"wx-menus__row\">\n <button\n type=\"button\"\n class=\"wx-menus__open\"\n :class=\"{ 'is-current': menu.key === current }\"\n @click=\"choose(menu)\"\n >\n <span class=\"wx-menus__name\">\n <wx-text truncate weight=\"medium\">{{ menu.title }}</wx-text>\n <wx-indicator\n class=\"wx-menus__count\"\n type=\"neutral\"\n :value=\"menu.items_count\"\n :label=\"t('menu.menus')\"\n />\n </span>\n\n <wx-text size=\"sm\" tone=\"muted\" mono truncate>{{ menu.key }}</wx-text>\n\n <!--\n When the cache was built, in the panel's own words — and it is a sentence\n rather than a date, because \"built\" is the part that answers the question\n somebody pressed the button next to it to ask.\n -->\n <span class=\"wx-menus__cache\">\n <wx-text v-if=\"!menu.cache.enabled\" size=\"sm\" tone=\"muted\">\n {{ t('menu.cache-off') }}\n </wx-text>\n <template v-else-if=\"menu.cache.built_at !== null\">\n <wx-text size=\"sm\" tone=\"muted\">{{ t('menu.cache-built') }}</wx-text>\n <wx-date :value=\"menu.cache.built_at\" />\n </template>\n <wx-text v-else size=\"sm\" tone=\"muted\">{{ t('menu.cache-empty') }}</wx-text>\n </span>\n </button>\n\n <!--\n The reset stands in the row and not only in the `···`: it is what somebody\n presses to test the guess that they are looking at something stale, and a guess\n behind a menu is one they check by reloading the site instead (§9).\n -->\n <wx-action\n v-if=\"canManage && menu.cache.enabled\"\n class=\"wx-menus__flush\"\n icon=\"refresh\"\n size=\"sm\"\n :title=\"t('menu.flush')\"\n @click=\"flush(menu)\"\n />\n\n <wx-row-menu v-if=\"canManage\" :actions=\"actionsFor(menu)\" :label=\"menu.title\" />\n </li>\n </ul>\n </template>\n\n <template #detail=\"{ inline, back }\">\n <menu-tree-pane\n v-if=\"chosen\"\n :key=\"chosen.key\"\n :menu=\"chosen\"\n :inline=\"inline\"\n :back=\"back\"\n @changed=\"load\"\n />\n </template>\n\n <template #empty>\n <wx-empty :title=\"t('menu.choose-menu')\" :description=\"t('menu.choose-menu-help')\" />\n </template>\n </wx-list-detail>\n </wx-card>\n </wx-list-screen>\n</template>\n\n<style>\n/*\n * What scrolls here is the page, the way it does on every other list of the panel.\n *\n * The card's corners are the screen's corners, and the two panes inside are square and paint\n * their own background to the edge — without the clip they cover the rounding. `clip` and not\n * `hidden`: `hidden` would make this a scroll container, and everything sticky inside would pin\n * itself to a box that never moves (CLAUDE.md §4).\n */\n.wx-menus > .wx-card__body {\n display: flex;\n flex-direction: column;\n overflow: clip;\n border-radius: inherit;\n}\n</style>\n\n<style scoped>\n.wx-menus__loading {\n padding: var(--wx-space-16);\n}\n\n.wx-menus__list {\n margin: 0;\n padding: var(--wx-space-8);\n list-style: none;\n}\n\n.wx-menus__row {\n display: flex;\n align-items: center;\n gap: var(--wx-space-4);\n margin: 0;\n padding-inline: var(--wx-space-8);\n border-radius: var(--wx-radius-sm);\n}\n\n.wx-menus__row:has(.is-current) {\n background: var(--wx-bg-subtle);\n}\n\n.wx-menus__open {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--wx-space-2);\n /* The row is the target: a menu called `header` should not leave the line dead. */\n flex: 1 1 auto;\n min-width: 0;\n padding-block: var(--wx-space-8);\n padding-inline: 0;\n border: 0;\n background: none;\n font: inherit;\n color: inherit;\n text-align: start;\n cursor: pointer;\n}\n\n.wx-menus__open.is-current {\n color: var(--wx-color-primary);\n}\n\n.wx-menus__name {\n display: flex;\n align-items: center;\n gap: var(--wx-space-6);\n min-width: 0;\n max-width: 100%;\n}\n\n.wx-menus__count {\n flex: 0 0 auto;\n}\n\n.wx-menus__cache {\n display: flex;\n align-items: center;\n gap: var(--wx-space-4);\n min-width: 0;\n}\n\n/*\n * `:deep()`, because `WxAction` carries its tooltip's portal beside the button and so has a\n * fragment for a root — Vue puts the scope attribute only on a child with a single root, and\n * without this the rule matches nothing at all, silently (CLAUDE.md §4).\n */\n.wx-menus__row > :deep(.wx-menus__flush) {\n flex: 0 0 auto;\n}\n</style>\n"],"names":["admin","useAdmin","api","createMenusApi","route","useRoute","router","useRouter","useMenuMessages","t","useTranslate","message","useErrorText","menus","ref","loading","open","detailInline","canManage","computed","edit","createModal","MenuCreateDialog","title","module","current","asked","chosen","menu","load","error","toast","watch","choose","add","made","rename","saved","remove","confirm","rest","flush","flushAll","actionsFor","actions","_createBlock","_unref","WxListScreen","_createVNode","WxCard","WxListDetail","$event","_cache","WxSkeleton","WxEmpty","_openBlock","_createElementBlock","_hoisted_1","_Fragment","_renderList","_createElementVNode","_hoisted_3","WxText","_createTextVNode","_toDisplayString","WxIndicator","_hoisted_4","WxDate","WxAction","WxRowMenu","_withCtx","inline","back","MenuTreePane"],"mappings":"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"}