@webx-ui/module-blog 0.7.3 → 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.
@@ -0,0 +1,197 @@
1
+ import { defineComponent as M, ref as C, computed as _, watch as T, onBeforeUnmount as $, openBlock as s, createBlock as d, unref as t, withCtx as r, createVNode as u, createCommentVNode as W, createElementVNode as i, createElementBlock as v, normalizeClass as A, createTextVNode as B, toDisplayString as p, Fragment as F, renderList as j } from "vue";
2
+ import { useRoute as G, useRouter as H } from "vue-router";
3
+ import { WxCard as J, WxListDetail as K, WxEmpty as N, WxInput as O, WxIcon as E, WxSkeleton as Q, WxAvatar as X, WxBadge as I, toast as Y } from "@webx-ui/core";
4
+ import { useAdmin as Z, useTranslate as ee, useErrorText as te, WxListScreen as oe } from "@webx-ui/module-admin";
5
+ import { d as ae, u as se, A as le, a as ne } from "./index-DqN5h0Ej.js";
6
+ const re = { class: "wx-authors__bar" }, ue = ["onClick"], ie = { class: "wx-author-row__body" }, ce = { class: "wx-author-row__name" }, de = { class: "wx-author-row__meta" }, pe = { key: 0 }, he = { class: "wx-author-row__facts" }, me = /* @__PURE__ */ M({
7
+ __name: "AuthorsPage",
8
+ props: {
9
+ base: { default: "/blog" }
10
+ },
11
+ setup(_e) {
12
+ const y = Z(), L = ae(y), c = G(), x = H();
13
+ se();
14
+ const a = ee("webx-blog"), P = te(), f = C([]), w = C(!0), g = _(() => y.can("blog.authors.manage")), R = _(
15
+ () => y.state.manifest?.modules.find((e) => e.id === "authors")?.title ?? a("module.authors")
16
+ ), h = _(() => typeof c.query.q == "string" ? c.query.q : ""), b = C(h.value), n = _(() => {
17
+ const e = c.query.author;
18
+ return e === "new" ? g.value ? "new" : null : typeof e == "string" && e !== "" && Number(e) || null;
19
+ }), z = _({
20
+ get: () => n.value !== null,
21
+ set: (e) => {
22
+ e || V();
23
+ }
24
+ });
25
+ async function m() {
26
+ w.value = !0;
27
+ try {
28
+ f.value = await L.list(h.value);
29
+ } catch (e) {
30
+ Y.danger(P(e));
31
+ } finally {
32
+ w.value = !1;
33
+ }
34
+ }
35
+ T(h, () => {
36
+ m();
37
+ }), m();
38
+ let k;
39
+ T(b, (e) => {
40
+ clearTimeout(k), k = setTimeout(() => {
41
+ x.replace({ query: { ...c.query, q: e.trim() === "" ? void 0 : e } });
42
+ }, 300);
43
+ }), $(() => clearTimeout(k));
44
+ function q(e) {
45
+ const l = { ...c.query, author: String(e) };
46
+ e !== "new" && delete l.account, x.replace({ query: l });
47
+ }
48
+ function V() {
49
+ const e = { ...c.query };
50
+ delete e.author, delete e.account, x.replace({ query: e });
51
+ }
52
+ function U(e) {
53
+ q(e.id), m();
54
+ }
55
+ function D(e) {
56
+ n.value === e && V(), m();
57
+ }
58
+ return (e, l) => (s(), d(t(oe), {
59
+ title: R.value,
60
+ card: !1
61
+ }, {
62
+ default: r(() => [
63
+ u(t(J), {
64
+ class: "wx-authors",
65
+ padding: "none"
66
+ }, {
67
+ default: r(() => [
68
+ u(t(K), {
69
+ open: z.value,
70
+ "onUpdate:open": l[2] || (l[2] = (o) => z.value = o),
71
+ class: "wx-authors__panes",
72
+ "list-width": 360,
73
+ "detail-min": 460,
74
+ "detail-label": t(a)("module.authors")
75
+ }, {
76
+ list: r(() => [
77
+ i("div", re, [
78
+ u(t(O), {
79
+ modelValue: b.value,
80
+ "onUpdate:modelValue": l[0] || (l[0] = (o) => b.value = o),
81
+ class: "wx-authors__search",
82
+ size: "sm",
83
+ clearable: "",
84
+ placeholder: t(a)("author.search"),
85
+ "aria-label": t(a)("author.search")
86
+ }, {
87
+ prefix: r(() => [
88
+ u(t(E), {
89
+ name: "search",
90
+ size: "sm"
91
+ })
92
+ ]),
93
+ _: 1
94
+ }, 8, ["modelValue", "placeholder", "aria-label"])
95
+ ]),
96
+ g.value ? (s(), v("button", {
97
+ key: 0,
98
+ type: "button",
99
+ class: A(["wx-authors__new", { "is-current": n.value === "new" }]),
100
+ onClick: l[1] || (l[1] = (o) => q("new"))
101
+ }, [
102
+ u(t(E), {
103
+ name: "plus",
104
+ size: "sm"
105
+ }),
106
+ B(" " + p(t(a)("author.new")), 1)
107
+ ], 2)) : W("", !0),
108
+ w.value && f.value.length === 0 ? (s(), d(t(Q), {
109
+ key: 1,
110
+ class: "wx-authors__loading",
111
+ rows: 4
112
+ })) : f.value.length === 0 ? (s(), d(t(N), {
113
+ key: 2,
114
+ title: h.value === "" ? t(a)("author.empty") : t(a)("author.empty-search"),
115
+ description: h.value === "" ? t(a)("author.empty-help") : void 0
116
+ }, null, 8, ["title", "description"])) : (s(), v("ul", {
117
+ key: 3,
118
+ class: A(["wx-authors__list", { "is-loading": w.value }])
119
+ }, [
120
+ (s(!0), v(F, null, j(f.value, (o) => (s(), v("li", {
121
+ key: o.id
122
+ }, [
123
+ i("button", {
124
+ type: "button",
125
+ class: A(["wx-author-row", { "is-current": n.value === o.id }]),
126
+ onClick: (S) => q(o.id)
127
+ }, [
128
+ u(t(X), {
129
+ class: "wx-author-row__photo",
130
+ src: o.photo ?? void 0,
131
+ name: o.name,
132
+ size: "md"
133
+ }, null, 8, ["src", "name"]),
134
+ i("span", ie, [
135
+ i("span", ce, p(o.name), 1),
136
+ i("span", de, [
137
+ o.user ? (s(), v("span", pe, p(o.user.name), 1)) : W("", !0),
138
+ i("span", null, p(t(a)("author.articles", { count: o.articles_count })), 1)
139
+ ]),
140
+ i("span", he, [
141
+ o.open ? (s(), d(t(I), {
142
+ key: 0,
143
+ dot: "",
144
+ size: "sm",
145
+ type: "success"
146
+ }, {
147
+ default: r(() => [
148
+ B(p(t(a)("author.page-open")), 1)
149
+ ]),
150
+ _: 1
151
+ })) : (s(), d(t(I), {
152
+ key: 1,
153
+ dot: "",
154
+ size: "sm"
155
+ }, {
156
+ default: r(() => [
157
+ B(p(t(a)("author.page-closed")), 1)
158
+ ]),
159
+ _: 1
160
+ }))
161
+ ])
162
+ ])
163
+ ], 10, ue)
164
+ ]))), 128))
165
+ ], 2))
166
+ ]),
167
+ detail: r(({ inline: o, back: S }) => [
168
+ n.value !== null ? (s(), d(le, {
169
+ id: n.value === "new" ? null : n.value,
170
+ key: String(n.value),
171
+ inline: o,
172
+ onBack: S,
173
+ onSaved: m,
174
+ onCreated: U,
175
+ onRemoved: D
176
+ }, null, 8, ["id", "inline", "onBack"])) : W("", !0)
177
+ ]),
178
+ empty: r(() => [
179
+ u(t(N), {
180
+ title: t(a)("author.choose"),
181
+ description: g.value ? t(a)("author.choose-help") : void 0
182
+ }, null, 8, ["title", "description"])
183
+ ]),
184
+ _: 1
185
+ }, 8, ["open", "detail-label"])
186
+ ]),
187
+ _: 1
188
+ })
189
+ ]),
190
+ _: 1
191
+ }, 8, ["title"]));
192
+ }
193
+ }), ge = /* @__PURE__ */ ne(me, [["__scopeId", "data-v-b0022a2f"]]);
194
+ export {
195
+ ge as default
196
+ };
197
+ //# sourceMappingURL=AuthorsPage-BN6sRqyE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthorsPage-BN6sRqyE.js","sources":["../src/AuthorsPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, ref, watch } from 'vue'\nimport { useRoute, useRouter, type LocationQueryRaw } from 'vue-router'\nimport {\n toast,\n WxAvatar,\n WxBadge,\n WxCard,\n WxEmpty,\n WxIcon,\n WxInput,\n WxListDetail,\n WxSkeleton,\n} from '@webx-ui/core'\nimport { useAdmin, useErrorText, useTranslate, WxListScreen } from '@webx-ui/module-admin'\nimport AuthorPane from './AuthorPane.vue'\nimport { createAuthorsApi, type AuthorRow } from './authors'\nimport { useBlogMessages } from './i18n'\n\n/**\n * The authors: every profile on the left, the one being written on the right (§19.5 of the blog\n * spec) — the shape of the team, without its order and its bin: the people who write one site are\n * a short list, and a profile that goes takes nothing with it but a name on a page.\n *\n * The search and the open profile live in the address, so a link to an author — the one the panel\n * on the site and the article editor make — is a link to them in their list.\n */\nwithDefaults(defineProps<{ base?: string }>(), { base: '/blog' })\n\nconst context = useAdmin()\nconst api = createAuthorsApi(context)\nconst route = useRoute()\nconst router = useRouter()\nuseBlogMessages()\n\nconst t = useTranslate('webx-blog')\n/* Not the server's `message`: the panel says how a request failed in its own words. */\nconst message = useErrorText()\n\nconst rows = ref<AuthorRow[]>([])\nconst loading = ref(true)\n\nconst canManage = computed(() => context.can('blog.authors.manage'))\n\nconst title = computed(\n () =>\n context.state.manifest?.modules.find((module) => module.id === 'authors')?.title ??\n t('module.authors'),\n)\n\nconst q = computed(() => (typeof route.query.q === 'string' ? route.query.q : ''))\n\n/* What is typed, ahead of the address: the address follows it after a pause. */\nconst typed = ref(q.value)\n\n/** The open profile: a number, `'new'` for one not yet saved, or nothing. */\nconst selected = computed<number | 'new' | null>(() => {\n const raw = route.query.author\n\n if (raw === 'new') return canManage.value ? 'new' : null\n\n return typeof raw === 'string' && raw !== '' ? Number(raw) || null : null\n})\n\n/* Open is \"a profile is chosen\", so the address, the highlight and the drawer always agree. */\nconst open = computed({\n get: () => selected.value !== null,\n set: (value) => {\n if (!value) close()\n },\n})\n\nasync function load(): Promise<void> {\n loading.value = true\n\n try {\n rows.value = await api.list(q.value)\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nwatch(q, () => void load())\nvoid load()\n\nlet pause: ReturnType<typeof setTimeout> | undefined\n\nwatch(typed, (value) => {\n clearTimeout(pause)\n pause = setTimeout(() => {\n void router.replace({ query: { ...route.query, q: value.trim() === '' ? undefined : value } })\n }, 300)\n})\n\nonBeforeUnmount(() => clearTimeout(pause))\n\n/* `replace` and not `push`: going through the authors is not a step of history each. */\nfunction choose(id: number | 'new'): void {\n const query: LocationQueryRaw = { ...route.query, author: String(id) }\n\n // The account the article editor asked a profile for belongs to that one new profile only.\n if (id !== 'new') delete query.account\n void router.replace({ query })\n}\n\nfunction close(): void {\n const query = { ...route.query }\n\n delete query.author\n delete query.account\n void router.replace({ query })\n}\n\n/** A new profile was saved: it is a record now, and the list has it. */\nfunction created(author: AuthorRow): void {\n choose(author.id)\n void load()\n}\n\nfunction removed(id: number): void {\n if (selected.value === id) close()\n\n void load()\n}\n</script>\n\n<template>\n <wx-list-screen :title=\"title\" :card=\"false\">\n <wx-card class=\"wx-authors\" padding=\"none\">\n <wx-list-detail\n v-model:open=\"open\"\n class=\"wx-authors__panes\"\n :list-width=\"360\"\n :detail-min=\"460\"\n :detail-label=\"t('module.authors')\"\n >\n <template #list>\n <div class=\"wx-authors__bar\">\n <wx-input\n v-model=\"typed\"\n class=\"wx-authors__search\"\n size=\"sm\"\n clearable\n :placeholder=\"t('author.search')\"\n :aria-label=\"t('author.search')\"\n >\n <template #prefix><wx-icon name=\"search\" size=\"sm\" /></template>\n </wx-input>\n </div>\n\n <button\n v-if=\"canManage\"\n type=\"button\"\n class=\"wx-authors__new\"\n :class=\"{ 'is-current': selected === 'new' }\"\n @click=\"choose('new')\"\n >\n <wx-icon name=\"plus\" size=\"sm\" />\n {{ t('author.new') }}\n </button>\n\n <wx-skeleton v-if=\"loading && rows.length === 0\" class=\"wx-authors__loading\" :rows=\"4\" />\n\n <wx-empty\n v-else-if=\"rows.length === 0\"\n :title=\"q === '' ? t('author.empty') : t('author.empty-search')\"\n :description=\"q === '' ? t('author.empty-help') : undefined\"\n />\n\n <ul v-else class=\"wx-authors__list\" :class=\"{ 'is-loading': loading }\">\n <li v-for=\"item in rows\" :key=\"item.id\">\n <button\n type=\"button\"\n class=\"wx-author-row\"\n :class=\"{ 'is-current': selected === item.id }\"\n @click=\"choose(item.id)\"\n >\n <wx-avatar\n class=\"wx-author-row__photo\"\n :src=\"item.photo ?? undefined\"\n :name=\"item.name\"\n size=\"md\"\n />\n\n <span class=\"wx-author-row__body\">\n <span class=\"wx-author-row__name\">{{ item.name }}</span>\n\n <span class=\"wx-author-row__meta\">\n <span v-if=\"item.user\">{{ item.user.name }}</span>\n <span>{{ t('author.articles', { count: item.articles_count }) }}</span>\n </span>\n\n <span class=\"wx-author-row__facts\">\n <wx-badge v-if=\"item.open\" dot size=\"sm\" type=\"success\">\n {{ t('author.page-open') }}\n </wx-badge>\n <wx-badge v-else dot size=\"sm\">{{ t('author.page-closed') }}</wx-badge>\n </span>\n </span>\n </button>\n </li>\n </ul>\n </template>\n\n <template #detail=\"{ inline, back }\">\n <author-pane\n v-if=\"selected !== null\"\n :id=\"selected === 'new' ? null : selected\"\n :key=\"String(selected)\"\n :inline=\"inline\"\n @back=\"back\"\n @saved=\"load\"\n @created=\"created\"\n @removed=\"removed\"\n />\n </template>\n\n <template #empty>\n <wx-empty\n :title=\"t('author.choose')\"\n :description=\"canManage ? t('author.choose-help') : undefined\"\n />\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, as on every other list of the panel: `clip`, not `hidden`, which\n * would make the card a scroll container and pin everything sticky inside it (CLAUDE.md §4).\n */\n.wx-authors > .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-authors__bar {\n display: flex;\n gap: var(--wx-space-8);\n padding: var(--wx-space-12) var(--wx-space-12) var(--wx-space-8);\n}\n\n.wx-authors__search {\n flex: 1 1 180px;\n min-width: 0;\n}\n\n.wx-authors__new {\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n width: calc(100% - 2 * var(--wx-space-8));\n margin: 0 var(--wx-space-8) var(--wx-space-4);\n padding: var(--wx-space-8);\n border: 1px dashed var(--wx-border-default);\n border-radius: var(--wx-radius-sm);\n background: none;\n font: inherit;\n color: var(--wx-color-primary);\n text-align: start;\n cursor: pointer;\n}\n\n.wx-authors__new:hover,\n.wx-authors__new.is-current {\n background: var(--wx-bg-subtle);\n}\n\n.wx-authors__loading {\n padding: var(--wx-space-12);\n}\n\n.wx-authors__list {\n margin: 0;\n padding: 0 var(--wx-space-8) var(--wx-space-8);\n list-style: none;\n}\n\n.wx-authors__list.is-loading {\n opacity: 0.6;\n}\n\n.wx-author-row {\n display: flex;\n align-items: flex-start;\n gap: var(--wx-space-10);\n width: 100%;\n min-width: 0;\n padding: var(--wx-space-8) var(--wx-space-4);\n border: 0;\n border-radius: var(--wx-radius-sm);\n background: none;\n font: inherit;\n color: inherit;\n text-align: start;\n cursor: pointer;\n}\n\n.wx-author-row:hover,\n.wx-author-row.is-current {\n background: var(--wx-bg-subtle);\n}\n\n.wx-author-row__photo {\n flex: none;\n}\n\n.wx-author-row__body {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n gap: var(--wx-space-2);\n min-width: 0;\n}\n\n.wx-author-row__name {\n min-width: 0;\n overflow: hidden;\n font-weight: var(--wx-font-weight-medium);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wx-author-row.is-current .wx-author-row__name {\n color: var(--wx-color-primary);\n}\n\n.wx-author-row__meta {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wx-space-2) var(--wx-space-8);\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-author-row__facts {\n display: flex;\n margin-top: var(--wx-space-2);\n}\n</style>\n"],"names":["context","useAdmin","api","createAuthorsApi","route","useRoute","router","useRouter","useBlogMessages","t","useTranslate","message","useErrorText","rows","ref","loading","canManage","computed","title","module","q","typed","selected","raw","open","value","close","load","error","toast","watch","pause","onBeforeUnmount","choose","id","query","created","author","removed","_createBlock","_unref","WxListScreen","_createVNode","WxCard","WxListDetail","$event","_createElementVNode","_hoisted_1","WxInput","WxIcon","_createElementBlock","_normalizeClass","_createTextVNode","WxSkeleton","WxEmpty","_Fragment","_renderList","item","WxAvatar","_hoisted_3","_hoisted_4","_toDisplayString","_hoisted_5","_openBlock","_hoisted_6","_hoisted_7","WxBadge","_withCtx","inline","back","AuthorPane"],"mappings":"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"}