@webx-ui/module-press 0.1.16 → 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.
- package/dist/PressPage-9Ghxpuqd.js +327 -0
- package/dist/PressPage-9Ghxpuqd.js.map +1 -0
- package/dist/index-C6NYJ0-x.js +349 -0
- package/dist/index-C6NYJ0-x.js.map +1 -0
- package/dist/index.d.ts +7 -1
- package/dist/index.js +8 -654
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
import { defineComponent as ee, ref as B, computed as u, watch as L, onBeforeUnmount as te, openBlock as s, createBlock as i, unref as t, withCtx as n, createVNode as c, createCommentVNode as y, createElementVNode as _, createElementBlock as W, normalizeClass as A, createTextVNode as E, toDisplayString as h, Fragment as le, resolveDynamicComponent as ae } from "vue";
|
|
2
|
+
import { useRoute as oe, useRouter as se } from "vue-router";
|
|
3
|
+
import { WxCard as ne, WxListDetail as re, WxEmpty as O, WxInput as ue, WxIcon as I, WxSkeleton as ie, WxSortableList as ce, WxAvatar as de, WxTooltip as j, WxBadge as F, WxAlert as ve, toast as x, confirm as pe } from "@webx-ui/core";
|
|
4
|
+
import { useAdmin as _e, useTranslate as me, useErrorText as fe, useItemOrder as we, WxListScreen as ye, WxRowMenu as he } from "@webx-ui/module-admin";
|
|
5
|
+
import { c as xe, u as be, P as ge, O as ke, _ as qe } from "./index-C6NYJ0-x.js";
|
|
6
|
+
const We = { class: "wx-press__bar" }, Ce = {
|
|
7
|
+
key: 0,
|
|
8
|
+
class: "wx-outlet-row__logo"
|
|
9
|
+
}, Pe = ["src"], Se = { class: "wx-outlet-row__body" }, Te = { class: "wx-outlet-row__head" }, Ve = { class: "wx-outlet-row__title" }, ze = { class: "wx-outlet-row__facts" }, Be = { class: "wx-outlet-row__count" }, Ae = ["aria-label"], Ee = /* @__PURE__ */ ee({
|
|
10
|
+
__name: "PressPage",
|
|
11
|
+
props: {
|
|
12
|
+
base: { default: "/press" }
|
|
13
|
+
},
|
|
14
|
+
setup(Ie) {
|
|
15
|
+
const C = _e(), P = xe(C), d = oe(), b = se();
|
|
16
|
+
be();
|
|
17
|
+
const a = me("webx-press"), g = fe(), m = B([]), k = B(!0), f = u(() => C.can("press.manage")), $ = u(
|
|
18
|
+
() => C.state.manifest?.modules.find((e) => e.id === "press")?.title ?? a("module.press")
|
|
19
|
+
), q = u({
|
|
20
|
+
get: () => d.query.view === "trashed" ? "trashed" : "",
|
|
21
|
+
set: (e) => {
|
|
22
|
+
const o = {
|
|
23
|
+
...d.query,
|
|
24
|
+
view: e === "" ? void 0 : String(e)
|
|
25
|
+
};
|
|
26
|
+
delete o.outlet, b.replace({ query: o });
|
|
27
|
+
}
|
|
28
|
+
}), r = u(() => q.value === "trashed"), w = u(() => typeof d.query.q == "string" ? d.query.q : ""), S = B(w.value), v = u(() => {
|
|
29
|
+
const e = d.query.outlet;
|
|
30
|
+
return e === "new" ? f.value ? "new" : null : typeof e == "string" && e !== "" && Number(e) || null;
|
|
31
|
+
}), N = u({
|
|
32
|
+
get: () => v.value !== null,
|
|
33
|
+
set: (e) => {
|
|
34
|
+
e || U();
|
|
35
|
+
}
|
|
36
|
+
}), G = u(() => [
|
|
37
|
+
{ value: "", label: a("outlet.all") },
|
|
38
|
+
{ value: "trashed", label: a("outlet.trashed"), icon: "trash" }
|
|
39
|
+
]), T = we(ge, () => ({ q: w.value, filtered: r.value })), R = u(() => f.value && T.sortable.value), H = u(() => w.value !== "" ? a("outlet.empty-search") : r.value ? a("outlet.empty-bin") : a("outlet.empty"));
|
|
40
|
+
async function p() {
|
|
41
|
+
k.value = !0;
|
|
42
|
+
try {
|
|
43
|
+
const e = await P.list({ search: w.value, trashed: r.value });
|
|
44
|
+
m.value = e.data;
|
|
45
|
+
} catch (e) {
|
|
46
|
+
x.danger(g(e));
|
|
47
|
+
} finally {
|
|
48
|
+
k.value = !1;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
L(
|
|
52
|
+
() => [q.value, w.value],
|
|
53
|
+
() => {
|
|
54
|
+
p();
|
|
55
|
+
}
|
|
56
|
+
), p();
|
|
57
|
+
let V;
|
|
58
|
+
L(S, (e) => {
|
|
59
|
+
clearTimeout(V), V = setTimeout(() => {
|
|
60
|
+
b.replace({ query: { ...d.query, q: e.trim() === "" ? void 0 : e } });
|
|
61
|
+
}, 300);
|
|
62
|
+
}), te(() => clearTimeout(V));
|
|
63
|
+
function z(e) {
|
|
64
|
+
b.replace({ query: { ...d.query, outlet: String(e) } });
|
|
65
|
+
}
|
|
66
|
+
function U() {
|
|
67
|
+
const e = { ...d.query };
|
|
68
|
+
delete e.outlet, b.replace({ query: e });
|
|
69
|
+
}
|
|
70
|
+
function J(e) {
|
|
71
|
+
z(e.id), p();
|
|
72
|
+
}
|
|
73
|
+
async function K() {
|
|
74
|
+
try {
|
|
75
|
+
await T.move(m.value.map((e) => e.id));
|
|
76
|
+
} catch (e) {
|
|
77
|
+
x.danger(g(e, a("outlet.reorder-failed"))), await p();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function Q(e) {
|
|
81
|
+
return f.value ? r.value ? [
|
|
82
|
+
{
|
|
83
|
+
key: "restore",
|
|
84
|
+
icon: "refresh",
|
|
85
|
+
label: a("outlet.restore"),
|
|
86
|
+
run: () => {
|
|
87
|
+
Y(e);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
] : [
|
|
91
|
+
{
|
|
92
|
+
key: "delete",
|
|
93
|
+
icon: "trash",
|
|
94
|
+
label: a("outlet.delete"),
|
|
95
|
+
danger: !0,
|
|
96
|
+
run: () => {
|
|
97
|
+
X(e);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
] : [];
|
|
101
|
+
}
|
|
102
|
+
async function X(e) {
|
|
103
|
+
if (await pe({
|
|
104
|
+
title: a("outlet.delete-title", { name: e.title }),
|
|
105
|
+
message: a("outlet.delete-text"),
|
|
106
|
+
confirmText: a("outlet.delete"),
|
|
107
|
+
cancelText: a("outlet.cancel"),
|
|
108
|
+
tone: "danger"
|
|
109
|
+
}))
|
|
110
|
+
try {
|
|
111
|
+
await P.remove(e.id), x.success(a("outlet.deleted")), M(e.id);
|
|
112
|
+
} catch (l) {
|
|
113
|
+
x.danger(g(l));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function M(e) {
|
|
117
|
+
v.value === e && U(), p();
|
|
118
|
+
}
|
|
119
|
+
async function Y(e) {
|
|
120
|
+
try {
|
|
121
|
+
await P.restore(e.id), x.success(a("outlet.restored"));
|
|
122
|
+
} catch (o) {
|
|
123
|
+
x.danger(g(o));
|
|
124
|
+
} finally {
|
|
125
|
+
await p();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function Z(e) {
|
|
129
|
+
return e.published && e.locales.length === 0;
|
|
130
|
+
}
|
|
131
|
+
return (e, o) => (s(), i(t(ye), {
|
|
132
|
+
view: q.value,
|
|
133
|
+
"onUpdate:view": o[4] || (o[4] = (l) => q.value = l),
|
|
134
|
+
title: $.value,
|
|
135
|
+
views: G.value,
|
|
136
|
+
card: !1
|
|
137
|
+
}, {
|
|
138
|
+
default: n(() => [
|
|
139
|
+
c(t(ne), {
|
|
140
|
+
class: "wx-press",
|
|
141
|
+
padding: "none"
|
|
142
|
+
}, {
|
|
143
|
+
default: n(() => [
|
|
144
|
+
c(t(re), {
|
|
145
|
+
open: N.value,
|
|
146
|
+
"onUpdate:open": o[3] || (o[3] = (l) => N.value = l),
|
|
147
|
+
class: "wx-press__panes",
|
|
148
|
+
"list-width": 360,
|
|
149
|
+
"detail-min": 520,
|
|
150
|
+
"detail-label": t(a)("module.press")
|
|
151
|
+
}, {
|
|
152
|
+
list: n(() => [
|
|
153
|
+
_("div", We, [
|
|
154
|
+
c(t(ue), {
|
|
155
|
+
modelValue: S.value,
|
|
156
|
+
"onUpdate:modelValue": o[0] || (o[0] = (l) => S.value = l),
|
|
157
|
+
class: "wx-press__search",
|
|
158
|
+
size: "sm",
|
|
159
|
+
clearable: "",
|
|
160
|
+
placeholder: t(a)("outlet.search"),
|
|
161
|
+
"aria-label": t(a)("outlet.search")
|
|
162
|
+
}, {
|
|
163
|
+
prefix: n(() => [
|
|
164
|
+
c(t(I), {
|
|
165
|
+
name: "search",
|
|
166
|
+
size: "sm"
|
|
167
|
+
})
|
|
168
|
+
]),
|
|
169
|
+
_: 1
|
|
170
|
+
}, 8, ["modelValue", "placeholder", "aria-label"])
|
|
171
|
+
]),
|
|
172
|
+
f.value && !r.value ? (s(), W("button", {
|
|
173
|
+
key: 0,
|
|
174
|
+
type: "button",
|
|
175
|
+
class: A(["wx-press__new", { "is-current": v.value === "new" }]),
|
|
176
|
+
onClick: o[1] || (o[1] = (l) => z("new"))
|
|
177
|
+
}, [
|
|
178
|
+
c(t(I), {
|
|
179
|
+
name: "plus",
|
|
180
|
+
size: "sm"
|
|
181
|
+
}),
|
|
182
|
+
E(" " + h(t(a)("outlet.new")), 1)
|
|
183
|
+
], 2)) : y("", !0),
|
|
184
|
+
k.value && m.value.length === 0 ? (s(), i(t(ie), {
|
|
185
|
+
key: 1,
|
|
186
|
+
class: "wx-press__loading",
|
|
187
|
+
rows: 5
|
|
188
|
+
})) : m.value.length === 0 ? (s(), i(t(O), {
|
|
189
|
+
key: 2,
|
|
190
|
+
title: H.value,
|
|
191
|
+
description: !r.value && w.value === "" ? t(a)("outlet.empty-help") : void 0
|
|
192
|
+
}, null, 8, ["title", "description"])) : (s(), W(le, { key: 3 }, [
|
|
193
|
+
c(t(ce), {
|
|
194
|
+
modelValue: m.value,
|
|
195
|
+
"onUpdate:modelValue": o[2] || (o[2] = (l) => m.value = l),
|
|
196
|
+
class: A(["wx-press__list", { "is-loading": k.value }]),
|
|
197
|
+
plain: "",
|
|
198
|
+
"item-key": "id",
|
|
199
|
+
handle: R.value ? "grip" : "row",
|
|
200
|
+
"item-label": (l) => l.title,
|
|
201
|
+
disabled: !R.value,
|
|
202
|
+
onMove: K
|
|
203
|
+
}, {
|
|
204
|
+
default: n(({ item: l }) => [
|
|
205
|
+
(s(), i(ae(r.value ? "div" : "button"), {
|
|
206
|
+
type: r.value ? void 0 : "button",
|
|
207
|
+
class: A(["wx-outlet-row", { "is-current": v.value === l.id }]),
|
|
208
|
+
onClick: (D) => r.value ? void 0 : z(l.id)
|
|
209
|
+
}, {
|
|
210
|
+
default: n(() => [
|
|
211
|
+
l.logo?.thumb ? (s(), W("span", Ce, [
|
|
212
|
+
_("img", {
|
|
213
|
+
src: l.logo.thumb,
|
|
214
|
+
alt: ""
|
|
215
|
+
}, null, 8, Pe)
|
|
216
|
+
])) : (s(), i(t(de), {
|
|
217
|
+
key: 1,
|
|
218
|
+
class: "wx-outlet-row__initials",
|
|
219
|
+
shape: "square",
|
|
220
|
+
name: l.title,
|
|
221
|
+
size: "md"
|
|
222
|
+
}, null, 8, ["name"])),
|
|
223
|
+
_("span", Se, [
|
|
224
|
+
_("span", Te, [
|
|
225
|
+
_("span", Ve, h(l.title), 1),
|
|
226
|
+
l.featured ? (s(), i(t(j), {
|
|
227
|
+
key: 0,
|
|
228
|
+
content: t(a)("outlet.featured")
|
|
229
|
+
}, {
|
|
230
|
+
default: n(() => [
|
|
231
|
+
c(t(I), {
|
|
232
|
+
class: "wx-outlet-row__featured",
|
|
233
|
+
name: "star",
|
|
234
|
+
size: "sm",
|
|
235
|
+
"aria-label": t(a)("outlet.featured")
|
|
236
|
+
}, null, 8, ["aria-label"])
|
|
237
|
+
]),
|
|
238
|
+
_: 1
|
|
239
|
+
}, 8, ["content"])) : y("", !0)
|
|
240
|
+
]),
|
|
241
|
+
_("span", ze, [
|
|
242
|
+
l.published ? Z(l) ? (s(), i(t(j), {
|
|
243
|
+
key: 1,
|
|
244
|
+
content: t(a)("outlet.visible-nowhere")
|
|
245
|
+
}, {
|
|
246
|
+
default: n(() => [
|
|
247
|
+
c(t(F), {
|
|
248
|
+
type: "warning",
|
|
249
|
+
dot: "",
|
|
250
|
+
size: "sm"
|
|
251
|
+
}, {
|
|
252
|
+
default: n(() => [
|
|
253
|
+
E(h(t(a)("outlet.not-published")), 1)
|
|
254
|
+
]),
|
|
255
|
+
_: 1
|
|
256
|
+
})
|
|
257
|
+
]),
|
|
258
|
+
_: 1
|
|
259
|
+
}, 8, ["content"])) : y("", !0) : (s(), i(t(F), {
|
|
260
|
+
key: 0,
|
|
261
|
+
dot: "",
|
|
262
|
+
size: "sm"
|
|
263
|
+
}, {
|
|
264
|
+
default: n(() => [
|
|
265
|
+
E(h(t(a)("outlet.not-published")), 1)
|
|
266
|
+
]),
|
|
267
|
+
_: 1
|
|
268
|
+
})),
|
|
269
|
+
_("span", Be, h(l.articles_count > 0 ? t(a)("outlet.articles-count", { count: l.articles_count }) : t(a)("outlet.no-articles")), 1),
|
|
270
|
+
l.locales.length > 0 ? (s(), W("span", {
|
|
271
|
+
key: 2,
|
|
272
|
+
class: "wx-outlet-row__locales",
|
|
273
|
+
"aria-label": t(a)("outlet.seen-in", { locales: l.locales.join(", ") })
|
|
274
|
+
}, h(l.locales.join(" · ")), 9, Ae)) : y("", !0)
|
|
275
|
+
])
|
|
276
|
+
])
|
|
277
|
+
]),
|
|
278
|
+
_: 2
|
|
279
|
+
}, 1032, ["type", "class", "onClick"]))
|
|
280
|
+
]),
|
|
281
|
+
actions: n(({ item: l }) => [
|
|
282
|
+
c(t(he), {
|
|
283
|
+
actions: Q(l),
|
|
284
|
+
label: l.title
|
|
285
|
+
}, null, 8, ["actions", "label"])
|
|
286
|
+
]),
|
|
287
|
+
_: 1
|
|
288
|
+
}, 8, ["modelValue", "class", "handle", "item-label", "disabled"]),
|
|
289
|
+
f.value && !r.value ? (s(), i(t(ve), {
|
|
290
|
+
key: 0,
|
|
291
|
+
class: "wx-press__note",
|
|
292
|
+
type: "info",
|
|
293
|
+
description: t(T).hint.value
|
|
294
|
+
}, null, 8, ["description"])) : y("", !0)
|
|
295
|
+
], 64))
|
|
296
|
+
]),
|
|
297
|
+
detail: n(({ inline: l, back: D }) => [
|
|
298
|
+
v.value !== null ? (s(), i(ke, {
|
|
299
|
+
id: v.value === "new" ? null : v.value,
|
|
300
|
+
key: String(v.value),
|
|
301
|
+
inline: l,
|
|
302
|
+
onBack: D,
|
|
303
|
+
onSaved: p,
|
|
304
|
+
onCreated: J,
|
|
305
|
+
onRemoved: M
|
|
306
|
+
}, null, 8, ["id", "inline", "onBack"])) : y("", !0)
|
|
307
|
+
]),
|
|
308
|
+
empty: n(() => [
|
|
309
|
+
c(t(O), {
|
|
310
|
+
title: t(a)("outlet.choose"),
|
|
311
|
+
description: f.value ? t(a)("outlet.choose-help") : void 0
|
|
312
|
+
}, null, 8, ["title", "description"])
|
|
313
|
+
]),
|
|
314
|
+
_: 1
|
|
315
|
+
}, 8, ["open", "detail-label"])
|
|
316
|
+
]),
|
|
317
|
+
_: 1
|
|
318
|
+
})
|
|
319
|
+
]),
|
|
320
|
+
_: 1
|
|
321
|
+
}, 8, ["view", "title", "views"]));
|
|
322
|
+
}
|
|
323
|
+
}), Le = /* @__PURE__ */ qe(Ee, [["__scopeId", "data-v-7ef16f83"]]);
|
|
324
|
+
export {
|
|
325
|
+
Le as default
|
|
326
|
+
};
|
|
327
|
+
//# sourceMappingURL=PressPage-9Ghxpuqd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PressPage-9Ghxpuqd.js","sources":["../src/PressPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, ref, watch } from 'vue'\nimport { useRoute, useRouter, type LocationQueryRaw } from 'vue-router'\nimport {\n confirm,\n toast,\n WxAlert,\n WxAvatar,\n WxBadge,\n WxCard,\n WxEmpty,\n WxIcon,\n WxInput,\n WxListDetail,\n WxSkeleton,\n WxSortableList,\n WxTooltip,\n type TabItem,\n type TabValue,\n} from '@webx-ui/core'\nimport {\n useAdmin,\n useErrorText,\n useItemOrder,\n useTranslate,\n WxListScreen,\n WxRowMenu,\n type RowAction,\n} from '@webx-ui/module-admin'\nimport { createPressApi, PRESS_API } from './api'\nimport { usePressMessages } from './i18n'\nimport OutletPane from './OutletPane.vue'\nimport type { OutletRow, OutletSummary } from './types'\n\n/**\n * The outlets: all of them on the left, the one being written on the right (§4.9, decision 15).\n *\n * The shape of the reviews, for the same reason: an outlet is typed in from a clipping in a\n * minute, and the next one is usually under it. On a phone the form is the whole screen, in the\n * drawer `WxListDetail` raises, and draws its own way back.\n *\n * One order, the general one (decision 6): a drag moves it; a search or the bin shows a\n * selection, so the grips go away and the line under the list says why. The order of the\n * articles is not here — it is the order of the rows in the outlet's form.\n *\n * Everything the screen is looking at lives in the address — the view, the search and the open\n * outlet — so a link to an outlet is a link to it in its list.\n */\nwithDefaults(defineProps<{ base?: string }>(), { base: '/press' })\n\nconst context = useAdmin()\nconst api = createPressApi(context)\nconst route = useRoute()\nconst router = useRouter()\nusePressMessages()\n\nconst t = useTranslate('webx-press')\n/* Not the server's `message`: the panel says how a request failed in its own words. */\nconst message = useErrorText()\n\nconst rows = ref<OutletRow[]>([])\nconst loading = ref(true)\n\nconst canManage = computed(() => context.can('press.manage'))\n\nconst title = computed(\n () =>\n context.state.manifest?.modules.find((module) => module.id === 'press')?.title ??\n t('module.press'),\n)\n\nconst view = computed<TabValue>({\n get: () => (route.query.view === 'trashed' ? 'trashed' : ''),\n set: (value) => {\n const query: LocationQueryRaw = {\n ...route.query,\n view: value === '' ? undefined : String(value),\n }\n\n // An outlet from the list is not an outlet from the bin: the form closes with the view.\n delete query.outlet\n void router.replace({ query })\n },\n})\n\nconst inBin = computed(() => view.value === 'trashed')\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 outlet: a number, `'new'` for one not yet saved, or nothing. */\nconst selected = computed<number | 'new' | null>(() => {\n const raw = route.query.outlet\n\n if (raw === 'new') return canManage.value ? 'new' : null\n\n return typeof raw === 'string' && raw !== '' ? Number(raw) || null : null\n})\n\n/*\n * Open is \"an outlet is chosen\", and closing is un-choosing it — so the address, the list's\n * highlight and the drawer on a phone can never disagree about it.\n */\nconst open = computed({\n get: () => selected.value !== null,\n set: (value) => {\n if (!value) close()\n },\n})\n\nconst views = computed<TabItem[]>(() => [\n { value: '', label: t('outlet.all') },\n { value: 'trashed', label: t('outlet.trashed'), icon: 'trash' },\n])\n\nconst order = useItemOrder(PRESS_API, () => ({ q: q.value, filtered: inBin.value }))\n\n/* Dragged only by somebody who may write, and only in a list that is the whole order. */\nconst sortable = computed(() => canManage.value && order.sortable.value)\n\nconst emptyText = computed(() => {\n if (q.value !== '') return t('outlet.empty-search')\n\n return inBin.value ? t('outlet.empty-bin') : t('outlet.empty')\n})\n\nasync function load(): Promise<void> {\n loading.value = true\n\n try {\n const answer = await api.list({ search: q.value, trashed: inBin.value })\n\n rows.value = answer.data\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nwatch(\n () => [view.value, q.value] as const,\n () => void load(),\n)\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 twenty outlets is not twenty steps of history. */\nfunction choose(id: number | 'new'): void {\n void router.replace({ query: { ...route.query, outlet: String(id) } })\n}\n\nfunction close(): void {\n const query = { ...route.query }\n\n delete query.outlet\n void router.replace({ query })\n}\n\n/** A new outlet was saved: it is a record now, and the list has it. */\nfunction created(outlet: OutletSummary): void {\n choose(outlet.id)\n void load()\n}\n\n/**\n * The order on screen, written as a whole. The list is already in its new order\n * (`WxSortableList` reorders the model before it says so), so a failure has to put it back\n * rather than leave the screen disagreeing with the database.\n */\nasync function reorder(): Promise<void> {\n try {\n await order.move(rows.value.map((row) => row.id))\n } catch (error) {\n toast.danger(message(error, t('outlet.reorder-failed')))\n await load()\n }\n}\n\nfunction actionsFor(row: OutletRow): RowAction[] {\n if (!canManage.value) return []\n\n if (inBin.value) {\n return [\n {\n key: 'restore',\n icon: 'refresh',\n label: t('outlet.restore'),\n run: () => void restore(row),\n },\n ]\n }\n\n return [\n {\n key: 'delete',\n icon: 'trash',\n label: t('outlet.delete'),\n danger: true,\n run: () => void remove(row),\n },\n ]\n}\n\nasync function remove(row: OutletRow): Promise<void> {\n const agreed = await confirm({\n title: t('outlet.delete-title', { name: row.title }),\n message: t('outlet.delete-text'),\n confirmText: t('outlet.delete'),\n cancelText: t('outlet.cancel'),\n tone: 'danger',\n })\n\n if (!agreed) return\n\n try {\n await api.remove(row.id)\n toast.success(t('outlet.deleted'))\n removed(row.id)\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\n/** Gone from the list; and if it was the open one, the form goes with it. */\nfunction removed(id: number): void {\n if (selected.value === id) close()\n\n void load()\n}\n\nasync function restore(row: OutletRow): Promise<void> {\n try {\n await api.restore(row.id)\n toast.success(t('outlet.restored'))\n } catch (error) {\n toast.danger(message(error))\n } finally {\n await load()\n }\n}\n\n/* Published and yet shown in no language: the one state the list has to point out. */\nfunction unseen(row: OutletRow): boolean {\n return row.published && row.locales.length === 0\n}\n</script>\n\n<template>\n <wx-list-screen v-model:view=\"view\" :title=\"title\" :views=\"views\" :card=\"false\">\n <wx-card class=\"wx-press\" padding=\"none\">\n <wx-list-detail\n v-model:open=\"open\"\n class=\"wx-press__panes\"\n :list-width=\"360\"\n :detail-min=\"520\"\n :detail-label=\"t('module.press')\"\n >\n <template #list>\n <div class=\"wx-press__bar\">\n <wx-input\n v-model=\"typed\"\n class=\"wx-press__search\"\n size=\"sm\"\n clearable\n :placeholder=\"t('outlet.search')\"\n :aria-label=\"t('outlet.search')\"\n >\n <template #prefix><wx-icon name=\"search\" size=\"sm\" /></template>\n </wx-input>\n </div>\n\n <!--\n A line of the list rather than a button in the head: the new outlet is written where\n it will stand, beside the ones it joins — and the form opens the way any other does.\n -->\n <button\n v-if=\"canManage && !inBin\"\n type=\"button\"\n class=\"wx-press__new\"\n :class=\"{ 'is-current': selected === 'new' }\"\n @click=\"choose('new')\"\n >\n <wx-icon name=\"plus\" size=\"sm\" />\n {{ t('outlet.new') }}\n </button>\n\n <wx-skeleton v-if=\"loading && rows.length === 0\" class=\"wx-press__loading\" :rows=\"5\" />\n\n <wx-empty\n v-else-if=\"rows.length === 0\"\n :title=\"emptyText\"\n :description=\"!inBin && q === '' ? t('outlet.empty-help') : undefined\"\n />\n\n <template v-else>\n <!-- A grip and not the whole row: the row opens an outlet, and a row that both opens\n and drags is one where one of the two happens by accident. -->\n <wx-sortable-list\n v-model=\"rows\"\n class=\"wx-press__list\"\n :class=\"{ 'is-loading': loading }\"\n plain\n item-key=\"id\"\n :handle=\"sortable ? 'grip' : 'row'\"\n :item-label=\"(item: OutletRow) => item.title\"\n :disabled=\"!sortable\"\n @move=\"reorder\"\n >\n <template #default=\"{ item }\">\n <component\n :is=\"inBin ? 'div' : 'button'\"\n :type=\"inBin ? undefined : 'button'\"\n class=\"wx-outlet-row\"\n :class=\"{ 'is-current': selected === item.id }\"\n @click=\"inBin ? undefined : choose(item.id)\"\n >\n <!-- A logo is wide as often as not: in a square it shrinks to a sliver, so it gets a\n box of its own shape, and only an outlet without one gets initials. -->\n <span v-if=\"item.logo?.thumb\" class=\"wx-outlet-row__logo\">\n <img :src=\"item.logo.thumb\" alt=\"\" />\n </span>\n <wx-avatar\n v-else\n class=\"wx-outlet-row__initials\"\n shape=\"square\"\n :name=\"item.title\"\n size=\"md\"\n />\n\n <span class=\"wx-outlet-row__body\">\n <span class=\"wx-outlet-row__head\">\n <span class=\"wx-outlet-row__title\">{{ item.title }}</span>\n <wx-tooltip v-if=\"item.featured\" :content=\"t('outlet.featured')\">\n <wx-icon\n class=\"wx-outlet-row__featured\"\n name=\"star\"\n size=\"sm\"\n :aria-label=\"t('outlet.featured')\"\n />\n </wx-tooltip>\n </span>\n\n <span class=\"wx-outlet-row__facts\">\n <wx-badge v-if=\"!item.published\" dot size=\"sm\">\n {{ t('outlet.not-published') }}\n </wx-badge>\n <wx-tooltip v-else-if=\"unseen(item)\" :content=\"t('outlet.visible-nowhere')\">\n <wx-badge type=\"warning\" dot size=\"sm\">\n {{ t('outlet.not-published') }}\n </wx-badge>\n </wx-tooltip>\n\n <span class=\"wx-outlet-row__count\">\n {{\n item.articles_count > 0\n ? t('outlet.articles-count', { count: item.articles_count })\n : t('outlet.no-articles')\n }}\n </span>\n\n <span\n v-if=\"item.locales.length > 0\"\n class=\"wx-outlet-row__locales\"\n :aria-label=\"t('outlet.seen-in', { locales: item.locales.join(', ') })\"\n >\n {{ item.locales.join(' · ') }}\n </span>\n </span>\n </span>\n </component>\n </template>\n\n <template #actions=\"{ item }\">\n <wx-row-menu :actions=\"actionsFor(item)\" :label=\"item.title\" />\n </template>\n </wx-sortable-list>\n\n <!-- What a drag does here, or why there is nothing to drag. -->\n <wx-alert\n v-if=\"canManage && !inBin\"\n class=\"wx-press__note\"\n type=\"info\"\n :description=\"order.hint.value\"\n />\n </template>\n </template>\n\n <template #detail=\"{ inline, back }\">\n <outlet-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('outlet.choose')\"\n :description=\"canManage ? t('outlet.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, the way it does on every other list of the panel. The card's\n * corners are the screen's, and the panes paint their own background to the edge: `clip`, not\n * `hidden`, which would make this a scroll container and pin everything sticky inside to a box\n * that never moves (CLAUDE.md §4).\n */\n.wx-press > .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-press__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-press__search {\n flex: 1 1 180px;\n min-width: 0;\n}\n\n.wx-press__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-press__new:hover,\n.wx-press__new.is-current {\n background: var(--wx-bg-subtle);\n}\n\n.wx-press__loading {\n padding: var(--wx-space-12);\n}\n\n.wx-press__list {\n padding-inline: var(--wx-space-8);\n}\n\n.wx-press__list.is-loading {\n opacity: 0.6;\n}\n\n.wx-press__list :deep(.wx-sortable-list__row) {\n gap: var(--wx-space-4);\n padding-inline: var(--wx-space-4);\n border-radius: var(--wx-radius-sm);\n}\n\n.wx-press__list :deep(.wx-sortable-list__row:hover),\n.wx-press__list :deep(.wx-sortable-list__row:has(.is-current)) {\n background: var(--wx-bg-subtle);\n}\n\n.wx-press__note {\n margin: var(--wx-space-8);\n}\n\n.wx-outlet-row {\n display: flex;\n align-items: flex-start;\n gap: var(--wx-space-10);\n /* The row is the target: a short name should not leave half the line dead — and a button,\n unlike a link, is only as wide as what is in it until it is told otherwise. */\n flex: 1 1 auto;\n width: 100%;\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}\n\nbutton.wx-outlet-row {\n cursor: pointer;\n}\n\n.wx-outlet-row__initials {\n flex: none;\n}\n\n/* Twice as wide as the initials beside it, and the logo drawn whole inside: cropped, it loses\n its letters. */\n.wx-outlet-row__logo {\n display: flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 64px;\n height: 32px;\n overflow: hidden;\n border-radius: var(--wx-radius-sm);\n background: var(--wx-bg-subtle);\n}\n\n.wx-outlet-row__logo img {\n display: block;\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n}\n\n.wx-outlet-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-outlet-row__head {\n display: flex;\n align-items: center;\n gap: var(--wx-space-6);\n min-width: 0;\n}\n\n.wx-outlet-row__title {\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-outlet-row.is-current .wx-outlet-row__title {\n color: var(--wx-color-primary);\n}\n\n.wx-outlet-row__featured {\n flex: none;\n color: var(--wx-color-warning);\n}\n\n.wx-outlet-row__facts {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-4) var(--wx-space-8);\n min-width: 0;\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-outlet-row__locales {\n font-family: var(--wx-font-family-mono);\n font-size: var(--wx-font-size-xs);\n text-transform: uppercase;\n}\n</style>\n"],"names":["context","useAdmin","api","createPressApi","route","useRoute","router","useRouter","usePressMessages","t","useTranslate","message","useErrorText","rows","ref","loading","canManage","computed","title","module","view","value","query","inBin","q","typed","selected","raw","open","close","views","order","useItemOrder","PRESS_API","sortable","emptyText","load","answer","error","toast","watch","pause","onBeforeUnmount","choose","id","created","outlet","reorder","row","actionsFor","restore","remove","confirm","removed","unseen","_createBlock","_unref","WxListScreen","$event","_createVNode","WxCard","WxListDetail","_createElementVNode","_hoisted_1","WxInput","WxIcon","_createElementBlock","_normalizeClass","_createTextVNode","WxSkeleton","WxEmpty","_Fragment","WxSortableList","item","_withCtx","_openBlock","_resolveDynamicComponent","_hoisted_2","WxAvatar","_hoisted_4","_hoisted_5","_hoisted_6","_toDisplayString","WxTooltip","_hoisted_7","WxBadge","_hoisted_8","_hoisted_9","WxRowMenu","WxAlert","inline","back","OutletPane"],"mappings":"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"}
|