@jt-home/mfe-components 1.0.23 → 1.0.25

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,760 @@
1
+ import { defineComponent as k, openBlock as O, createElementBlock as I, createElementVNode as J, render as A, h as n, computed as x, onMounted as W, onBeforeUnmount as T, ref as D, watch as V, nextTick as ae } from "vue";
2
+ import { ElIcon as N } from "element-plus";
3
+ /*! Element Plus Icons Vue v2.3.2 */
4
+ var re = /* @__PURE__ */ k({
5
+ name: "Download",
6
+ __name: "download",
7
+ setup(e) {
8
+ return (t, a) => (O(), I("svg", {
9
+ xmlns: "http://www.w3.org/2000/svg",
10
+ viewBox: "0 0 1024 1024"
11
+ }, [
12
+ J("path", {
13
+ fill: "currentColor",
14
+ d: "M160 832h704a32 32 0 1 1 0 64H160a32 32 0 1 1 0-64m384-253.696 236.288-236.352 45.248 45.248L508.8 704 192 387.2l45.248-45.248L480 584.704V128h64z"
15
+ })
16
+ ]));
17
+ }
18
+ }), ie = re, oe = /* @__PURE__ */ k({
19
+ name: "RefreshLeft",
20
+ __name: "refresh-left",
21
+ setup(e) {
22
+ return (t, a) => (O(), I("svg", {
23
+ xmlns: "http://www.w3.org/2000/svg",
24
+ viewBox: "0 0 1024 1024"
25
+ }, [
26
+ J("path", {
27
+ fill: "currentColor",
28
+ d: "M289.088 296.704h92.992a32 32 0 0 1 0 64H232.96a32 32 0 0 1-32-32V179.712a32 32 0 0 1 64 0v50.56a384 384 0 0 1 643.84 282.88 384 384 0 0 1-383.936 384 384 384 0 0 1-384-384h64a320 320 0 1 0 640 0 320 320 0 0 0-555.712-216.448z"
29
+ })
30
+ ]));
31
+ }
32
+ }), ce = oe, se = /* @__PURE__ */ k({
33
+ name: "ZoomIn",
34
+ __name: "zoom-in",
35
+ setup(e) {
36
+ return (t, a) => (O(), I("svg", {
37
+ xmlns: "http://www.w3.org/2000/svg",
38
+ viewBox: "0 0 1024 1024"
39
+ }, [
40
+ J("path", {
41
+ fill: "currentColor",
42
+ d: "m795.904 750.72 124.992 124.928a32 32 0 0 1-45.248 45.248L750.656 795.904a416 416 0 1 1 45.248-45.248zM480 832a352 352 0 1 0 0-704 352 352 0 0 0 0 704m-32-384v-96a32 32 0 0 1 64 0v96h96a32 32 0 0 1 0 64h-96v96a32 32 0 0 1-64 0v-96h-96a32 32 0 0 1 0-64z"
43
+ })
44
+ ]));
45
+ }
46
+ }), le = se, ue = /* @__PURE__ */ k({
47
+ name: "ZoomOut",
48
+ __name: "zoom-out",
49
+ setup(e) {
50
+ return (t, a) => (O(), I("svg", {
51
+ xmlns: "http://www.w3.org/2000/svg",
52
+ viewBox: "0 0 1024 1024"
53
+ }, [
54
+ J("path", {
55
+ fill: "currentColor",
56
+ d: "m795.904 750.72 124.992 124.928a32 32 0 0 1-45.248 45.248L750.656 795.904a416 416 0 1 1 45.248-45.248zM480 832a352 352 0 1 0 0-704 352 352 0 0 0 0 704M352 448h256a32 32 0 0 1 0 64H352a32 32 0 0 1 0-64"
57
+ })
58
+ ]));
59
+ }
60
+ }), de = ue;
61
+ const ve = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANgAAADYCAMAAAC+/t3fAAAAaVBMVEUAAABWapNVapKeqsLJztx3hKnGzN2yu8////9XapWcqMGps8lXapVYa5RWaZWps8lfcJjS1+KjrsVXapWapr////9sfaKrtMrV2uWBj7B4iKqWob1wgaXr7fOBj6/Ax9dhc5yhq8OKl7Wba+6tAAAAE3RSTlMAgGDuDyVLoYDe2XuXRb68cy6e4BCQEAAAAyZJREFUeNrt29tyokAUheGOQjIoeMhuCQ4e0Pd/yCE1STU4mGq7bXqzZ/23ufoqYblTqkIIIYQQQggNlM42Lzctf5nMD22bKQYVOQ30sTPt6dEO74mKXLoiCgDTi1RFbUMUBhZXluQUDKbnWxWtjMLB2pYqUjmFg8WUzSg0TL+rCKVZeJheRJj9DYWHRRnHbBSYnr+qcSsoKCyeLKcfK/emc2UqH4LFGMcVWVftTC4w/TbmhGQjwvR6RBmNAbMYx4nD7k/I1GF3ZZOH3RtHAbDhcZQAG5SJgOn1Vt0mAzYwIUJgvjJ/2OVo2pcmcoQZWehxpBGue5sJEQTryyTBeuMoCtadEFmwjkwYzIyjNJief02IONj3OAqE/ZVJhJnZj3RS1c4nld04ijiC/5EJhbUyobBWJhT2OY5CYa1MKKyVCYXpdSIUphdbobB2HIXCWplQmJGFhZUn07kyNaFgbUsx1/1tb1Jh+i1hDmu0Y+uEN4xqV9ki5Q27atfmKWtYqd1lW84wqj1kr5xhB+3RkjGMrl4yxrCm9pG984V5ytZJINjpY7hmLNki5XjdP0fGFkZ0qL1kfGEt7erzgsYY1lYefrtWsIZ5NAMMMBNg9gEGmD3sejbVnRpyjAvs5rr3DzDAAOsEmH2AAQZYJ8Ds4wJrSlN1NE3+CDYJu+5NgNkHGGCAdQLMPsAAA0zuEQyYbYABBlgnwOwDDDDAOvVhl5NJ1Fu1O6lHMGA/xQl2rPodpcBq6gfYYIABBpgJsAdiBDvX/cTAxF4egNkEWGDY5Q5s8v9onoZdR3KNC4yOg7AzOccFNvi36POJIy4wqgZgF/KIC6yporuCwNrq/nNW7ckzLjCi/bO//MEF9mCAAQYYYDwCDDAmAQYYkwADjEmAAcYkwABjEmCAMQkwwJgEGGBMAgwwJgEGGJMAA4xJgAHGJMD+B1hGE6hwgK1oAqUOsJz4lymHCuJfrpTM9SicYC/EvUw5lRD3Psde4lP29YSJG8bse+ulvZZ5uFTCV5YZl6hpXKXKs5TlL22jnlCaM7uHV7NEPam02LwwaVYkCiGEEEIIITTUH1Fqd5V0WMtQAAAAAElFTkSuQmCC", me = "data:image/png;base64,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", fe = /* @__PURE__ */ new Set(["jpg", "jpeg", "png", "gif", "webp", "bmp", "svg", "avif", "ico"]), we = /* @__PURE__ */ new Set(["mp4", "webm", "ogg", "ogv", "mov", "m4v"]), pe = /* @__PURE__ */ new Set(["mp3", "wav", "ogg", "oga", "m4a", "aac", "flac"]), he = /* @__PURE__ */ new Set(["html", "htm", "txt", "json", "xml", "csv", "md", "log"]), ge = /* @__PURE__ */ new Set([
62
+ "doc",
63
+ "docx",
64
+ "xls",
65
+ "xlsx",
66
+ "ppt",
67
+ "pptx",
68
+ "zip",
69
+ "rar",
70
+ "7z"
71
+ ]);
72
+ let _ = null, U = null, P = null;
73
+ async function ye() {
74
+ return U || (U = Promise.all([
75
+ import("./pdf-BmBuG7of.js"),
76
+ import("./pdf.worker.min-4PI-nNLo.js")
77
+ ]).then(([e, t]) => (e.GlobalWorkerOptions.workerSrc = t.default, e))), U;
78
+ }
79
+ function Ae(e) {
80
+ return typeof e == "string" ? { url: e } : e;
81
+ }
82
+ function F(e) {
83
+ const [t] = e.split(/[?#]/);
84
+ return t ?? "";
85
+ }
86
+ function K(e, t) {
87
+ if (t?.trim()) return t.trim();
88
+ const a = F(e).split("/").filter(Boolean).pop();
89
+ if (!a) return "附件预览";
90
+ try {
91
+ return decodeURIComponent(a);
92
+ } catch {
93
+ return a;
94
+ }
95
+ }
96
+ function z(e) {
97
+ return F(e).match(/\.([a-z0-9]+)$/i)?.[1]?.toLowerCase() ?? "";
98
+ }
99
+ function _e(e) {
100
+ return e?.trim().replace(/^\./, "").toLowerCase() ?? "";
101
+ }
102
+ function be(e) {
103
+ const t = _e(e);
104
+ return fe.has(t) ? "image" : t === "pdf" ? "pdf" : we.has(t) ? "video" : pe.has(t) ? "audio" : he.has(t) ? "iframe" : ge.has(t) ? "unsupported" : "unknown";
105
+ }
106
+ function Q(e) {
107
+ const t = e.toLowerCase().split(";")[0]?.trim() ?? "";
108
+ return t.startsWith("image/") ? "image" : t === "application/pdf" ? "pdf" : t.startsWith("video/") ? "video" : t.startsWith("audio/") ? "audio" : t.startsWith("text/") ? "iframe" : "unknown";
109
+ }
110
+ function X(e) {
111
+ if (!e.url.trim()) return "empty";
112
+ if (e.mode && e.mode !== "auto") return e.mode;
113
+ if (e.mimeType) {
114
+ const a = Q(e.mimeType);
115
+ if (a !== "unknown") return a;
116
+ }
117
+ const t = be(
118
+ e.extension || z(e.name || "") || z(e.url)
119
+ );
120
+ return t !== "unknown" ? t : "unknown";
121
+ }
122
+ async function je(e) {
123
+ try {
124
+ const a = (await fetch(e, { method: "HEAD" })).headers.get("content-type") ?? "";
125
+ return Q(a);
126
+ } catch {
127
+ return "unknown";
128
+ }
129
+ }
130
+ async function Z(e) {
131
+ const t = await fetch(e);
132
+ if (!t.ok) throw new Error(`fetch failed: ${t.status}`);
133
+ return t.blob();
134
+ }
135
+ function Ee(e, t) {
136
+ const a = z(t);
137
+ return a === "doc" || a === "docx" ? "W" : a === "xls" || a === "xlsx" ? "X" : a === "ppt" || a === "pptx" ? "P" : a === "zip" || a === "rar" || a === "7z" ? "ZIP" : e === "pdf" ? "PDF" : "FILE";
138
+ }
139
+ function $(e, t, a) {
140
+ return n(
141
+ "button",
142
+ {
143
+ class: a,
144
+ type: "button",
145
+ onClick: () => {
146
+ te(e, t);
147
+ }
148
+ },
149
+ [
150
+ n(N, { class: "jt-attachment-preview-service__download-icon" }, () => n(ie)),
151
+ n("span", { class: "jt-attachment-preview-service__download-text" }, "下载")
152
+ ]
153
+ );
154
+ }
155
+ function R(e) {
156
+ return e === "image" || e === "pdf";
157
+ }
158
+ function ee(e) {
159
+ return n("div", { class: "jt-attachment-preview-service__preview-fallback" }, [
160
+ n("img", {
161
+ class: "jt-attachment-preview-service__preview-fallback-icon",
162
+ src: e.icon,
163
+ alt: ""
164
+ }),
165
+ n("div", { class: "jt-attachment-preview-service__unsupported-text" }, "暂不支持预览此类型的文件"),
166
+ n("div", { class: "jt-attachment-preview-service__file-name", title: e.name }, e.name)
167
+ ]);
168
+ }
169
+ function H(e, t) {
170
+ const a = document.createElement("a");
171
+ a.href = e, a.download = t, a.style.display = "none", document.body.appendChild(a), a.click(), a.remove();
172
+ }
173
+ async function te(e, t) {
174
+ try {
175
+ const a = await Z(e), i = URL.createObjectURL(a);
176
+ H(i, t), URL.revokeObjectURL(i);
177
+ } catch {
178
+ H(e, t);
179
+ }
180
+ }
181
+ const xe = k({
182
+ name: "JtAttachmentPreviewPdfCanvas",
183
+ props: {
184
+ url: {
185
+ type: String,
186
+ required: !0
187
+ },
188
+ name: {
189
+ type: String,
190
+ required: !0
191
+ },
192
+ downloadName: {
193
+ type: String,
194
+ required: !0
195
+ },
196
+ downloadable: {
197
+ type: Boolean,
198
+ required: !0
199
+ }
200
+ },
201
+ emits: {
202
+ previewLoad: (e) => e instanceof Event,
203
+ previewError: (e) => e instanceof Event
204
+ },
205
+ setup(e, { emit: t }) {
206
+ const a = D("loading"), i = D([]), r = D([]), s = /* @__PURE__ */ new Map(), l = D("");
207
+ let d = null, h = [], v = 0;
208
+ async function m(o, u) {
209
+ if (!u) return null;
210
+ const w = typeof u == "string" ? await o.getDestination(u) : u;
211
+ return !Array.isArray(w) || !w[0] ? null : await o.getPageIndex(w[0]) + 1;
212
+ }
213
+ async function L(o, u, w = 0) {
214
+ if (!u?.length) return [];
215
+ const j = [];
216
+ for (const E of u) {
217
+ const C = await m(o, E.dest);
218
+ j.push({
219
+ title: E.title || "未命名标题",
220
+ pageNumber: C,
221
+ level: w
222
+ });
223
+ const g = await L(o, E.items, w + 1);
224
+ j.push(...g);
225
+ }
226
+ return j;
227
+ }
228
+ function p() {
229
+ v += 1;
230
+ for (const o of h)
231
+ o.cancel();
232
+ h = [], d?.destroy(), d = null, s.clear();
233
+ }
234
+ async function b() {
235
+ p();
236
+ const o = v;
237
+ a.value = "loading", l.value = "", i.value = [], r.value = [];
238
+ try {
239
+ const u = await ye();
240
+ if (o !== v) return;
241
+ d = u.getDocument({ url: e.url });
242
+ const w = await d.promise;
243
+ if (o !== v) return;
244
+ i.value = Array.from({ length: w.numPages }, (C, g) => g + 1), r.value = await L(w, await w.getOutline()), await ae();
245
+ const j = s.values().next().value, E = Math.max((j?.parentElement?.clientWidth ?? 800) - 32, 320);
246
+ for (const C of i.value) {
247
+ if (o !== v) return;
248
+ const g = await w.getPage(C), y = s.get(C), M = y?.getContext("2d");
249
+ if (!y || !M) continue;
250
+ const G = g.getViewport({ scale: 1 }), S = Math.min(E / G.width, 2), c = g.getViewport({ scale: S }), B = window.devicePixelRatio || 1;
251
+ y.width = Math.floor(c.width * B), y.height = Math.floor(c.height * B), y.style.width = `${Math.floor(c.width)}px`, y.style.height = `${Math.floor(c.height)}px`, M.setTransform(B, 0, 0, B, 0, 0);
252
+ const q = g.render({
253
+ canvas: y,
254
+ canvasContext: M,
255
+ viewport: c
256
+ });
257
+ h.push(q), await q.promise;
258
+ }
259
+ if (o !== v) return;
260
+ a.value = "ready", t("previewLoad", new Event("load"));
261
+ } catch (u) {
262
+ if (o !== v) return;
263
+ a.value = "error", l.value = u instanceof Error ? u.message : "PDF 加载失败", t("previewError", new Event("error"));
264
+ }
265
+ }
266
+ V(() => e.url, b, { immediate: !0 }), T(p);
267
+ function f(o) {
268
+ if (!o) return;
269
+ s.get(o)?.scrollIntoView({ behavior: "smooth", block: "start" });
270
+ }
271
+ return () => n("div", { class: "jt-attachment-preview-service__pdf-viewer" }, [
272
+ a.value === "loading" ? n("div", { class: "jt-attachment-preview-service__pdf-state" }, "PDF 加载中...") : null,
273
+ a.value === "error" ? n("div", { class: "jt-attachment-preview-service__pdf-state" }, [
274
+ ee({
275
+ icon: me,
276
+ name: e.name
277
+ })
278
+ ]) : null,
279
+ null,
280
+ null,
281
+ n(
282
+ "div",
283
+ {
284
+ class: [
285
+ "jt-attachment-preview-service__pdf-layout",
286
+ a.value !== "ready" ? "jt-attachment-preview-service__pdf-layout--hidden" : ""
287
+ ]
288
+ },
289
+ [
290
+ r.value.length ? n("aside", { class: "jt-attachment-preview-service__pdf-outline" }, [
291
+ n("div", { class: "jt-attachment-preview-service__pdf-outline-title" }, "目录"),
292
+ n(
293
+ "div",
294
+ { class: "jt-attachment-preview-service__pdf-outline-list" },
295
+ r.value.map(
296
+ (o, u) => n(
297
+ "button",
298
+ {
299
+ key: `${o.title}-${u}`,
300
+ class: "jt-attachment-preview-service__pdf-outline-item",
301
+ style: { paddingLeft: `${12 + o.level * 14}px` },
302
+ type: "button",
303
+ disabled: !o.pageNumber,
304
+ title: o.title,
305
+ onClick: () => f(o.pageNumber)
306
+ },
307
+ o.title
308
+ )
309
+ )
310
+ )
311
+ ]) : null,
312
+ n(
313
+ "div",
314
+ { class: "jt-attachment-preview-service__pdf-pages" },
315
+ i.value.map(
316
+ (o) => n("canvas", {
317
+ key: o,
318
+ ref: (u) => {
319
+ u instanceof HTMLCanvasElement && s.set(o, u);
320
+ },
321
+ class: "jt-attachment-preview-service__pdf-page"
322
+ })
323
+ )
324
+ )
325
+ ]
326
+ )
327
+ ]);
328
+ }
329
+ }), De = k({
330
+ name: "JtAttachmentPreviewImageTransform",
331
+ props: {
332
+ url: {
333
+ type: String,
334
+ required: !0
335
+ },
336
+ name: {
337
+ type: String,
338
+ required: !0
339
+ },
340
+ downloadName: {
341
+ type: String,
342
+ required: !0
343
+ },
344
+ downloadable: {
345
+ type: Boolean,
346
+ required: !0
347
+ },
348
+ fit: {
349
+ type: String,
350
+ default: "contain"
351
+ }
352
+ },
353
+ emits: {
354
+ previewLoad: (e) => e instanceof Event,
355
+ previewError: (e) => e instanceof Event
356
+ },
357
+ setup(e, { emit: t }) {
358
+ const a = D(null), i = D("ready"), r = D(1), s = D(!1);
359
+ let l = 0, d = 0, h = 0, v = 0, m = 0, L = 0, p = 0;
360
+ const b = x(() => ({
361
+ "--jt-attachment-preview-service-image-fit": e.fit,
362
+ transform: `translate(${l}px, ${d}px) scale(${r.value})`
363
+ }));
364
+ function f() {
365
+ a.value && (a.value.style.transform = `translate(${l}px, ${d}px) scale(${r.value})`);
366
+ }
367
+ function o() {
368
+ p || (p = window.requestAnimationFrame(() => {
369
+ p = 0, f();
370
+ }));
371
+ }
372
+ function u(c) {
373
+ r.value = Math.min(Math.max(Number(c.toFixed(2)), 0.2), 5), r.value <= 1 && (l = 0, d = 0), f();
374
+ }
375
+ function w() {
376
+ u(r.value + 0.2);
377
+ }
378
+ function j() {
379
+ const c = Math.max(Number((r.value - 0.2).toFixed(2)), 0.2);
380
+ r.value = c, c <= 1 && (l = 0, d = 0), f();
381
+ }
382
+ function E() {
383
+ l = 0, d = 0, u(1);
384
+ }
385
+ function C(c) {
386
+ i.value = "ready", t("previewLoad", c);
387
+ }
388
+ function g(c) {
389
+ i.value = "error", t("previewError", c);
390
+ }
391
+ function y(c) {
392
+ r.value <= 1 || (c.preventDefault(), s.value = !0, h = c.clientX, v = c.clientY, m = l, L = d, window.addEventListener("pointermove", M), window.addEventListener("pointerup", G, { once: !0 }));
393
+ }
394
+ function M(c) {
395
+ s.value && (l = m + c.clientX - h, d = L + c.clientY - v, o());
396
+ }
397
+ function G() {
398
+ s.value = !1, window.removeEventListener("pointermove", M);
399
+ }
400
+ function S(c) {
401
+ c.preventDefault(), u(r.value + (c.deltaY < 0 ? 0.1 : -0.1));
402
+ }
403
+ return W(f), V(() => e.url, () => {
404
+ i.value = "ready", E();
405
+ }), T(() => {
406
+ window.removeEventListener("pointermove", M), p && window.cancelAnimationFrame(p);
407
+ }), () => n("div", { class: "jt-attachment-preview-service__image-viewer" }, i.value === "error" ? ee({
408
+ icon: ve,
409
+ name: e.name
410
+ }) : [
411
+ n("img", {
412
+ ref: a,
413
+ class: [
414
+ "jt-attachment-preview-service__media",
415
+ "jt-attachment-preview-service__image",
416
+ r.value > 1 ? "jt-attachment-preview-service__image--draggable" : "",
417
+ s.value ? "jt-attachment-preview-service__image--dragging" : ""
418
+ ],
419
+ src: e.url,
420
+ alt: e.name,
421
+ style: b.value,
422
+ onLoad: C,
423
+ onError: g,
424
+ onPointerdown: y,
425
+ onWheel: S,
426
+ onDragstart: (c) => c.preventDefault(),
427
+ draggable: !1
428
+ }),
429
+ n("div", { class: "jt-attachment-preview-service__image-toolbar" }, [
430
+ n(
431
+ "button",
432
+ {
433
+ class: "jt-attachment-preview-service__image-tool",
434
+ type: "button",
435
+ title: "缩小",
436
+ onClick: j
437
+ },
438
+ [n(N, () => n(de))]
439
+ ),
440
+ n("span", { class: "jt-attachment-preview-service__image-scale" }, `${Math.round(r.value * 100)}%`),
441
+ n(
442
+ "button",
443
+ {
444
+ class: "jt-attachment-preview-service__image-tool",
445
+ type: "button",
446
+ title: "放大",
447
+ onClick: w
448
+ },
449
+ [n(N, () => n(le))]
450
+ ),
451
+ n(
452
+ "button",
453
+ {
454
+ class: "jt-attachment-preview-service__image-tool",
455
+ type: "button",
456
+ title: "复位",
457
+ onClick: E
458
+ },
459
+ [n(N, () => n(ce))]
460
+ )
461
+ ])
462
+ ]);
463
+ }
464
+ }), ke = k({
465
+ name: "JtAttachmentPreviewService",
466
+ props: {
467
+ options: {
468
+ type: Object,
469
+ required: !0
470
+ },
471
+ onDestroy: {
472
+ type: Function,
473
+ required: !0
474
+ }
475
+ },
476
+ setup(e) {
477
+ const t = x(() => K(e.options.url, e.options.name)), a = x(() => e.options.downloadName || t.value), i = x(() => X(e.options)), r = x(() => Ee(i.value, e.options.url)), s = x(() => ({
478
+ zIndex: e.options.zIndex ?? 3e3,
479
+ "--jt-attachment-preview-service-image-fit": e.options.fit ?? "contain"
480
+ }));
481
+ function l() {
482
+ e.options.onClose?.(), e.onDestroy();
483
+ }
484
+ function d(m) {
485
+ m.key === "Escape" && e.options.closeOnPressEscape !== !1 && l();
486
+ }
487
+ function h(m) {
488
+ e.options.onLoad?.(m);
489
+ }
490
+ function v(m) {
491
+ e.options.onError?.(m);
492
+ }
493
+ return W(() => {
494
+ document.addEventListener("keydown", d), document.body.classList.add("jt-attachment-preview-service-lock");
495
+ }), T(() => {
496
+ document.removeEventListener("keydown", d), document.body.classList.remove("jt-attachment-preview-service-lock");
497
+ }), () => {
498
+ const m = e.options.downloadable === !1 ? [] : [$(e.options.url, a.value, "jt-attachment-preview-service__top-download")];
499
+ return n("div", { class: "jt-attachment-preview-service", style: s.value }, [
500
+ n("div", { class: "jt-attachment-preview-service__modal" }, [
501
+ n("div", { class: "jt-attachment-preview-service__header" }, [
502
+ n("div", { class: "jt-attachment-preview-service__filename", title: t.value }, t.value),
503
+ n("div", { class: "jt-attachment-preview-service__header-actions" }, [
504
+ ...m,
505
+ n(
506
+ "button",
507
+ {
508
+ class: "jt-attachment-preview-service__close",
509
+ type: "button",
510
+ "aria-label": "关闭",
511
+ onClick: l
512
+ },
513
+ "×"
514
+ )
515
+ ])
516
+ ]),
517
+ n("div", { class: "jt-attachment-preview-service__body" }, [
518
+ Le({
519
+ type: i.value,
520
+ url: e.options.url,
521
+ name: t.value,
522
+ downloadName: a.value,
523
+ sandbox: e.options.sandbox,
524
+ iconText: r.value,
525
+ downloadable: e.options.downloadable !== !1,
526
+ onLoad: h,
527
+ onError: v
528
+ })
529
+ ])
530
+ ])
531
+ ]);
532
+ };
533
+ }
534
+ }), Y = k({
535
+ name: "JtAttachmentPreviewDetectingService",
536
+ props: {
537
+ options: {
538
+ type: Object,
539
+ required: !0
540
+ },
541
+ onDestroy: {
542
+ type: Function,
543
+ required: !0
544
+ },
545
+ title: {
546
+ type: String,
547
+ default: "正在识别文件类型"
548
+ },
549
+ desc: {
550
+ type: String,
551
+ default: "请稍候,识别完成后将自动预览或下载"
552
+ },
553
+ spinning: {
554
+ type: Boolean,
555
+ default: !0
556
+ }
557
+ },
558
+ setup(e) {
559
+ const t = x(() => K(e.options.url, e.options.name)), a = x(() => ({
560
+ zIndex: e.options.zIndex ?? 3e3
561
+ }));
562
+ function i() {
563
+ e.options.onClose?.(), e.onDestroy();
564
+ }
565
+ function r(s) {
566
+ s.key === "Escape" && e.options.closeOnPressEscape !== !1 && i();
567
+ }
568
+ return W(() => {
569
+ document.addEventListener("keydown", r), document.body.classList.add("jt-attachment-preview-service-lock");
570
+ }), T(() => {
571
+ document.removeEventListener("keydown", r), document.body.classList.remove("jt-attachment-preview-service-lock");
572
+ }), () => n("div", { class: "jt-attachment-preview-service", style: a.value }, [
573
+ n("div", { class: "jt-attachment-preview-service__modal" }, [
574
+ n("div", { class: "jt-attachment-preview-service__header" }, [
575
+ n("div", { class: "jt-attachment-preview-service__filename", title: t.value }, t.value),
576
+ n("div", { class: "jt-attachment-preview-service__header-actions" }, [
577
+ n(
578
+ "button",
579
+ {
580
+ class: "jt-attachment-preview-service__close",
581
+ type: "button",
582
+ "aria-label": "关闭",
583
+ onClick: i
584
+ },
585
+ "×"
586
+ )
587
+ ])
588
+ ]),
589
+ n("div", { class: "jt-attachment-preview-service__body" }, [
590
+ n("div", { class: "jt-attachment-preview-service__detecting" }, [
591
+ e.spinning ? n("span", { class: "jt-attachment-preview-service__detecting-spinner" }) : null,
592
+ n("span", { class: "jt-attachment-preview-service__detecting-title" }, e.title),
593
+ n("span", { class: "jt-attachment-preview-service__detecting-desc" }, e.desc)
594
+ ])
595
+ ])
596
+ ])
597
+ ]);
598
+ }
599
+ });
600
+ function Le(e) {
601
+ return e.type === "empty" ? n("div", { class: "jt-attachment-preview-service__empty" }, "暂无附件") : e.type === "image" ? n(De, {
602
+ url: e.url,
603
+ name: e.name,
604
+ downloadName: e.downloadName,
605
+ downloadable: e.downloadable,
606
+ onPreviewLoad: e.onLoad,
607
+ onPreviewError: e.onError
608
+ }) : e.type === "video" ? n("video", {
609
+ class: "jt-attachment-preview-service__media",
610
+ src: e.url,
611
+ controls: !0,
612
+ onLoadeddata: e.onLoad,
613
+ onError: e.onError
614
+ }) : e.type === "audio" ? n("audio", {
615
+ class: "jt-attachment-preview-service__audio",
616
+ src: e.url,
617
+ controls: !0,
618
+ onLoadeddata: e.onLoad,
619
+ onError: e.onError
620
+ }) : e.type === "pdf" ? n(xe, {
621
+ url: e.url,
622
+ name: e.name,
623
+ downloadName: e.downloadName,
624
+ downloadable: e.downloadable,
625
+ onPreviewLoad: e.onLoad,
626
+ onPreviewError: e.onError
627
+ }) : e.type === "iframe" ? n("iframe", {
628
+ class: "jt-attachment-preview-service__iframe",
629
+ src: e.url,
630
+ title: e.name,
631
+ sandbox: e.sandbox || void 0,
632
+ onLoad: e.onLoad
633
+ }) : n("div", { class: "jt-attachment-preview-service__unsupported" }, [
634
+ n("div", { class: "jt-attachment-preview-service__file-card" }, [
635
+ n("div", { class: "jt-attachment-preview-service__file-icon" }, e.iconText),
636
+ n("div", { class: "jt-attachment-preview-service__unsupported-text" }, "暂不支持预览此类型的文件")
637
+ ]),
638
+ n("div", { class: "jt-attachment-preview-service__file-name", title: e.name }, e.name),
639
+ e.downloadable ? $(e.url, e.downloadName, "jt-attachment-preview-service__primary-download") : null
640
+ ]);
641
+ }
642
+ function ne(e) {
643
+ if (typeof document > "u")
644
+ return { close: () => {
645
+ } };
646
+ _?.close();
647
+ const t = Ae(e), a = t.downloadName || K(t.url, t.name);
648
+ let i = !1, r = null, s = null;
649
+ const l = () => {
650
+ i = !0, r && (A(null, r), r.remove(), r = null), s && (URL.revokeObjectURL(s), s = null), _?.close === l && (_ = null);
651
+ };
652
+ function d() {
653
+ i || (r || (r = document.createElement("div"), document.body.appendChild(r)), A(n(ke, { options: t, onDestroy: l }), r));
654
+ }
655
+ function h() {
656
+ i || (r || (r = document.createElement("div"), document.body.appendChild(r)), A(n(Y, { options: t, onDestroy: l }), r));
657
+ }
658
+ function v() {
659
+ r && (A(null, r), r.remove(), r = null);
660
+ }
661
+ function m() {
662
+ i || te(t.url, a);
663
+ }
664
+ function L(b) {
665
+ if (i) return;
666
+ const f = URL.createObjectURL(b);
667
+ H(f, a), URL.revokeObjectURL(f);
668
+ }
669
+ const p = X(t);
670
+ return R(p) ? d() : p === "unknown" ? (h(), je(t.url).then(async (b) => {
671
+ if (!i) {
672
+ if (R(b)) {
673
+ t.mode = b, d();
674
+ return;
675
+ }
676
+ try {
677
+ const f = await Z(t.url), o = Q(f.type);
678
+ if (R(o)) {
679
+ s = URL.createObjectURL(f), t.url = s, t.mode = o, d();
680
+ return;
681
+ }
682
+ v(), L(f);
683
+ } catch {
684
+ v(), m();
685
+ }
686
+ }
687
+ })) : m(), _ = { close: l }, _;
688
+ }
689
+ function Ce(e) {
690
+ P = e;
691
+ }
692
+ function Me(e) {
693
+ if (typeof document > "u")
694
+ return { close: () => {
695
+ } };
696
+ _?.close();
697
+ let t = !1, a = document.createElement("div");
698
+ document.body.appendChild(a);
699
+ const i = () => {
700
+ t = !0, a && (A(null, a), a.remove(), a = null), _?.close === i && (_ = null);
701
+ }, r = { close: i };
702
+ return _ = r, P ? (A(
703
+ n(Y, {
704
+ options: { url: "", name: "附件预览" },
705
+ title: "正在获取文件信息",
706
+ desc: "请稍候,获取完成后将自动预览或下载",
707
+ spinning: !0,
708
+ onDestroy: i
709
+ }),
710
+ a
711
+ ), P.request(e).then((s) => {
712
+ if (t) return;
713
+ const l = P?.mapResponse(s, e);
714
+ if (!l?.url) {
715
+ A(
716
+ n(Y, {
717
+ options: { url: "", name: "附件预览" },
718
+ title: "文件信息缺少 URL",
719
+ desc: "请检查 mapResponse 是否返回了 url 字段",
720
+ spinning: !1,
721
+ onDestroy: i
722
+ }),
723
+ a
724
+ );
725
+ return;
726
+ }
727
+ ne(l);
728
+ }).catch((s) => {
729
+ if (t) return;
730
+ const l = s instanceof Error ? s.message : "接口请求失败";
731
+ A(
732
+ n(Y, {
733
+ options: { url: "", name: "附件预览" },
734
+ title: "文件信息获取失败",
735
+ desc: l,
736
+ spinning: !1,
737
+ onDestroy: i
738
+ }),
739
+ a
740
+ );
741
+ }), r) : (A(
742
+ n(Y, {
743
+ options: { url: "", name: "附件预览" },
744
+ title: "附件预览未初始化",
745
+ desc: "请先调用 setupJtAttachmentPreview 注册请求配置",
746
+ spinning: !1,
747
+ onDestroy: i
748
+ }),
749
+ a
750
+ ), r);
751
+ }
752
+ const Ne = Object.assign(ne, {
753
+ openByParams: Me,
754
+ setup: Ce
755
+ });
756
+ export {
757
+ Ne as JtAttachmentPreview,
758
+ Me as JtAttachmentPreviewByParams,
759
+ Ce as setupJtAttachmentPreview
760
+ };