@file-viewer/web 2.0.9 → 2.0.11
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/README.en.md +28 -17
- package/README.md +28 -17
- package/dist/element.d.ts +91 -0
- package/dist/element.js +466 -0
- package/dist/flyfish-file-viewer-web.iife.js +271 -268
- package/dist/global.d.ts +5 -2
- package/dist/global.js +6 -2
- package/dist/index.d.ts +6 -0
- package/dist/index.js +5 -0
- package/package.json +2 -2
- package/viewer/flyfish-viewer-manifest.json +1 -1
- package/viewer/vendor/docx/docx.worker.js +1 -1
package/dist/element.js
ADDED
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
import { fileViewerCoreRendererRegistry } from '@file-viewer/core';
|
|
2
|
+
import { mountViewer as mountCoreViewer, } from './controller.js';
|
|
3
|
+
export const FILE_VIEWER_ELEMENT_TAG = 'flyfish-file-viewer';
|
|
4
|
+
const ElementBase = (typeof HTMLElement === 'undefined'
|
|
5
|
+
? class {
|
|
6
|
+
}
|
|
7
|
+
: HTMLElement);
|
|
8
|
+
const observedAttributes = [
|
|
9
|
+
'src',
|
|
10
|
+
'url',
|
|
11
|
+
'filename',
|
|
12
|
+
'name',
|
|
13
|
+
'type',
|
|
14
|
+
'size',
|
|
15
|
+
'theme',
|
|
16
|
+
'toolbar',
|
|
17
|
+
'toolbar-position',
|
|
18
|
+
'watermark',
|
|
19
|
+
'search',
|
|
20
|
+
'options',
|
|
21
|
+
];
|
|
22
|
+
const parseBooleanLike = (value) => {
|
|
23
|
+
if (value === null) {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
const normalized = value.trim().toLowerCase();
|
|
27
|
+
if (!normalized || ['true', '1', 'yes', 'on'].includes(normalized)) {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
if (['false', '0', 'no', 'off'].includes(normalized)) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
return undefined;
|
|
34
|
+
};
|
|
35
|
+
const parseNumberLike = (value) => {
|
|
36
|
+
if (value === null || value.trim() === '') {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
const numeric = Number(value);
|
|
40
|
+
return Number.isFinite(numeric) ? numeric : undefined;
|
|
41
|
+
};
|
|
42
|
+
const parseJsonObject = (value) => {
|
|
43
|
+
if (!value) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
const trimmed = value.trim();
|
|
47
|
+
if (!trimmed || (trimmed[0] !== '{' && trimmed[0] !== '[')) {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
return JSON.parse(trimmed);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
console.warn('[file-viewer-web] Failed to parse JSON attribute.', error);
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
const mergeViewerOptions = (...optionsList) => {
|
|
59
|
+
const validOptions = optionsList.filter(Boolean);
|
|
60
|
+
if (!validOptions.length) {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
return Object.assign({}, ...validOptions);
|
|
64
|
+
};
|
|
65
|
+
const mergeMountOptions = (current, next) => ({
|
|
66
|
+
...current,
|
|
67
|
+
...next,
|
|
68
|
+
options: next.options === undefined
|
|
69
|
+
? current.options
|
|
70
|
+
: mergeViewerOptions(current.options, next.options),
|
|
71
|
+
});
|
|
72
|
+
const callUnique = (callbacks, argument) => {
|
|
73
|
+
for (const callback of new Set(callbacks.filter(Boolean))) {
|
|
74
|
+
callback === null || callback === void 0 ? void 0 : callback(argument);
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
const toKebabEventName = (event) => `viewer-${event.type}`;
|
|
78
|
+
export class FileViewerElement extends ElementBase {
|
|
79
|
+
constructor() {
|
|
80
|
+
super(...arguments);
|
|
81
|
+
this.mountNode = null;
|
|
82
|
+
this.controller = null;
|
|
83
|
+
this.pendingUpdate = false;
|
|
84
|
+
this.mountOptions = {};
|
|
85
|
+
this.internalCoreOptions = {};
|
|
86
|
+
}
|
|
87
|
+
static get observedAttributes() {
|
|
88
|
+
return [...observedAttributes];
|
|
89
|
+
}
|
|
90
|
+
get src() {
|
|
91
|
+
return this.mountOptions.url || this.getAttribute('src') || this.getAttribute('url') || undefined;
|
|
92
|
+
}
|
|
93
|
+
set src(value) {
|
|
94
|
+
this.setMountOptions({ url: value || undefined });
|
|
95
|
+
}
|
|
96
|
+
get url() {
|
|
97
|
+
return this.src;
|
|
98
|
+
}
|
|
99
|
+
set url(value) {
|
|
100
|
+
this.setMountOptions({ url: value || undefined });
|
|
101
|
+
}
|
|
102
|
+
get file() {
|
|
103
|
+
return this.mountOptions.file;
|
|
104
|
+
}
|
|
105
|
+
set file(value) {
|
|
106
|
+
this.setMountOptions({ file: value });
|
|
107
|
+
}
|
|
108
|
+
get buffer() {
|
|
109
|
+
return this.mountOptions.buffer;
|
|
110
|
+
}
|
|
111
|
+
set buffer(value) {
|
|
112
|
+
this.setMountOptions({ buffer: value });
|
|
113
|
+
}
|
|
114
|
+
get name() {
|
|
115
|
+
return this.mountOptions.name || this.getAttribute('name') || undefined;
|
|
116
|
+
}
|
|
117
|
+
set name(value) {
|
|
118
|
+
this.setMountOptions({ name: value || undefined });
|
|
119
|
+
}
|
|
120
|
+
get filename() {
|
|
121
|
+
return this.mountOptions.filename || this.getAttribute('filename') || this.name;
|
|
122
|
+
}
|
|
123
|
+
set filename(value) {
|
|
124
|
+
this.setMountOptions({ filename: value || undefined });
|
|
125
|
+
}
|
|
126
|
+
get type() {
|
|
127
|
+
return this.mountOptions.type || this.getAttribute('type') || undefined;
|
|
128
|
+
}
|
|
129
|
+
set type(value) {
|
|
130
|
+
this.setMountOptions({ type: value || undefined });
|
|
131
|
+
}
|
|
132
|
+
get size() {
|
|
133
|
+
var _a;
|
|
134
|
+
return (_a = this.mountOptions.size) !== null && _a !== void 0 ? _a : parseNumberLike(this.getAttribute('size'));
|
|
135
|
+
}
|
|
136
|
+
set size(value) {
|
|
137
|
+
this.setMountOptions({ size: value });
|
|
138
|
+
}
|
|
139
|
+
get options() {
|
|
140
|
+
return this.mountOptions.options;
|
|
141
|
+
}
|
|
142
|
+
set options(value) {
|
|
143
|
+
this.setMountOptions({ options: value });
|
|
144
|
+
}
|
|
145
|
+
get source() {
|
|
146
|
+
return {
|
|
147
|
+
...this.mountOptions,
|
|
148
|
+
coreOptions: this.internalCoreOptions,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
set source(value) {
|
|
152
|
+
const { coreOptions, ...mountOptions } = value || {};
|
|
153
|
+
this.mountOptions = mountOptions;
|
|
154
|
+
this.internalCoreOptions = coreOptions || {};
|
|
155
|
+
this.remountOrUpdate();
|
|
156
|
+
}
|
|
157
|
+
get coreOptions() {
|
|
158
|
+
return this.internalCoreOptions;
|
|
159
|
+
}
|
|
160
|
+
set coreOptions(value) {
|
|
161
|
+
this.internalCoreOptions = value || {};
|
|
162
|
+
this.remount();
|
|
163
|
+
}
|
|
164
|
+
connectedCallback() {
|
|
165
|
+
this.mount();
|
|
166
|
+
}
|
|
167
|
+
disconnectedCallback() {
|
|
168
|
+
this.destroy();
|
|
169
|
+
}
|
|
170
|
+
attributeChangedCallback(name, oldValue, newValue) {
|
|
171
|
+
if (oldValue !== newValue) {
|
|
172
|
+
this.scheduleUpdate();
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
async load(options) {
|
|
176
|
+
var _a;
|
|
177
|
+
this.mountOptions = mergeMountOptions(this.mountOptions, options);
|
|
178
|
+
if (!this.controller && this.isConnected) {
|
|
179
|
+
this.mount();
|
|
180
|
+
}
|
|
181
|
+
await ((_a = this.controller) === null || _a === void 0 ? void 0 : _a.load(this.createEffectiveMountOptions()));
|
|
182
|
+
}
|
|
183
|
+
async update(options = {}) {
|
|
184
|
+
var _a;
|
|
185
|
+
this.mountOptions = mergeMountOptions(this.mountOptions, options);
|
|
186
|
+
if (!this.controller && this.isConnected) {
|
|
187
|
+
this.mount();
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
await ((_a = this.controller) === null || _a === void 0 ? void 0 : _a.update(this.createEffectiveMountOptions()));
|
|
191
|
+
}
|
|
192
|
+
reload() {
|
|
193
|
+
var _a, _b;
|
|
194
|
+
return (_b = (_a = this.controller) === null || _a === void 0 ? void 0 : _a.reload()) !== null && _b !== void 0 ? _b : Promise.resolve();
|
|
195
|
+
}
|
|
196
|
+
destroy() {
|
|
197
|
+
var _a;
|
|
198
|
+
(_a = this.controller) === null || _a === void 0 ? void 0 : _a.destroy();
|
|
199
|
+
this.controller = null;
|
|
200
|
+
if (this.mountNode) {
|
|
201
|
+
this.mountNode.innerHTML = '';
|
|
202
|
+
}
|
|
203
|
+
this.pendingUpdate = false;
|
|
204
|
+
}
|
|
205
|
+
getController() {
|
|
206
|
+
return this.controller;
|
|
207
|
+
}
|
|
208
|
+
getApi() {
|
|
209
|
+
var _a, _b;
|
|
210
|
+
return (_b = (_a = this.controller) === null || _a === void 0 ? void 0 : _a.getApi()) !== null && _b !== void 0 ? _b : null;
|
|
211
|
+
}
|
|
212
|
+
downloadOriginalFile() {
|
|
213
|
+
var _a, _b;
|
|
214
|
+
return (_b = (_a = this.controller) === null || _a === void 0 ? void 0 : _a.downloadOriginalFile()) !== null && _b !== void 0 ? _b : Promise.resolve();
|
|
215
|
+
}
|
|
216
|
+
printRenderedHtml() {
|
|
217
|
+
var _a, _b;
|
|
218
|
+
return (_b = (_a = this.controller) === null || _a === void 0 ? void 0 : _a.printRenderedHtml()) !== null && _b !== void 0 ? _b : Promise.resolve();
|
|
219
|
+
}
|
|
220
|
+
exportRenderedHtml() {
|
|
221
|
+
var _a, _b;
|
|
222
|
+
return (_b = (_a = this.controller) === null || _a === void 0 ? void 0 : _a.exportRenderedHtml()) !== null && _b !== void 0 ? _b : Promise.resolve();
|
|
223
|
+
}
|
|
224
|
+
zoomIn() {
|
|
225
|
+
var _a, _b;
|
|
226
|
+
return (_b = (_a = this.controller) === null || _a === void 0 ? void 0 : _a.zoomIn()) !== null && _b !== void 0 ? _b : Promise.resolve(null);
|
|
227
|
+
}
|
|
228
|
+
zoomOut() {
|
|
229
|
+
var _a, _b;
|
|
230
|
+
return (_b = (_a = this.controller) === null || _a === void 0 ? void 0 : _a.zoomOut()) !== null && _b !== void 0 ? _b : Promise.resolve(null);
|
|
231
|
+
}
|
|
232
|
+
resetZoom() {
|
|
233
|
+
var _a, _b;
|
|
234
|
+
return (_b = (_a = this.controller) === null || _a === void 0 ? void 0 : _a.resetZoom()) !== null && _b !== void 0 ? _b : Promise.resolve(null);
|
|
235
|
+
}
|
|
236
|
+
searchDocument(query) {
|
|
237
|
+
var _a, _b;
|
|
238
|
+
return (_b = (_a = this.controller) === null || _a === void 0 ? void 0 : _a.searchDocument(query)) !== null && _b !== void 0 ? _b : Promise.resolve(null);
|
|
239
|
+
}
|
|
240
|
+
clearDocumentSearch() {
|
|
241
|
+
var _a, _b;
|
|
242
|
+
return (_b = (_a = this.controller) === null || _a === void 0 ? void 0 : _a.clearDocumentSearch()) !== null && _b !== void 0 ? _b : Promise.resolve(null);
|
|
243
|
+
}
|
|
244
|
+
nextSearchResult() {
|
|
245
|
+
var _a, _b;
|
|
246
|
+
return (_b = (_a = this.controller) === null || _a === void 0 ? void 0 : _a.nextSearchResult()) !== null && _b !== void 0 ? _b : Promise.resolve(null);
|
|
247
|
+
}
|
|
248
|
+
previousSearchResult() {
|
|
249
|
+
var _a, _b;
|
|
250
|
+
return (_b = (_a = this.controller) === null || _a === void 0 ? void 0 : _a.previousSearchResult()) !== null && _b !== void 0 ? _b : Promise.resolve(null);
|
|
251
|
+
}
|
|
252
|
+
collectDocumentAnchors() {
|
|
253
|
+
var _a, _b;
|
|
254
|
+
return (_b = (_a = this.controller) === null || _a === void 0 ? void 0 : _a.collectDocumentAnchors()) !== null && _b !== void 0 ? _b : Promise.resolve([]);
|
|
255
|
+
}
|
|
256
|
+
scrollToAnchor(anchor) {
|
|
257
|
+
var _a, _b;
|
|
258
|
+
return (_b = (_a = this.controller) === null || _a === void 0 ? void 0 : _a.scrollToAnchor(anchor)) !== null && _b !== void 0 ? _b : Promise.resolve(false);
|
|
259
|
+
}
|
|
260
|
+
scrollToLine(line) {
|
|
261
|
+
var _a, _b;
|
|
262
|
+
return (_b = (_a = this.controller) === null || _a === void 0 ? void 0 : _a.scrollToLine(line)) !== null && _b !== void 0 ? _b : Promise.resolve(false);
|
|
263
|
+
}
|
|
264
|
+
getDocumentTextChunks() {
|
|
265
|
+
var _a, _b;
|
|
266
|
+
return (_b = (_a = this.controller) === null || _a === void 0 ? void 0 : _a.getDocumentTextChunks()) !== null && _b !== void 0 ? _b : [];
|
|
267
|
+
}
|
|
268
|
+
getOperationAvailability() {
|
|
269
|
+
var _a, _b;
|
|
270
|
+
return (_b = (_a = this.controller) === null || _a === void 0 ? void 0 : _a.getOperationAvailability()) !== null && _b !== void 0 ? _b : null;
|
|
271
|
+
}
|
|
272
|
+
getZoomState() {
|
|
273
|
+
var _a, _b;
|
|
274
|
+
return (_b = (_a = this.controller) === null || _a === void 0 ? void 0 : _a.getZoomState()) !== null && _b !== void 0 ? _b : null;
|
|
275
|
+
}
|
|
276
|
+
getSearchState() {
|
|
277
|
+
var _a, _b;
|
|
278
|
+
return (_b = (_a = this.controller) === null || _a === void 0 ? void 0 : _a.getSearchState()) !== null && _b !== void 0 ? _b : null;
|
|
279
|
+
}
|
|
280
|
+
getState() {
|
|
281
|
+
var _a, _b;
|
|
282
|
+
return (_b = (_a = this.controller) === null || _a === void 0 ? void 0 : _a.getState()) !== null && _b !== void 0 ? _b : null;
|
|
283
|
+
}
|
|
284
|
+
subscribe(listener) {
|
|
285
|
+
var _a, _b;
|
|
286
|
+
return (_b = (_a = this.controller) === null || _a === void 0 ? void 0 : _a.subscribe(listener)) !== null && _b !== void 0 ? _b : (() => { });
|
|
287
|
+
}
|
|
288
|
+
setMountOptions(options) {
|
|
289
|
+
this.mountOptions = mergeMountOptions(this.mountOptions, options);
|
|
290
|
+
this.scheduleUpdate();
|
|
291
|
+
}
|
|
292
|
+
mount() {
|
|
293
|
+
if (this.controller || !this.isConnected) {
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
const node = this.ensureMountNode();
|
|
297
|
+
try {
|
|
298
|
+
this.controller = mountCoreViewer(node, this.createEffectiveMountOptions(), {
|
|
299
|
+
registry: fileViewerCoreRendererRegistry,
|
|
300
|
+
...this.internalCoreOptions,
|
|
301
|
+
});
|
|
302
|
+
this.dispatchTypedEvent('viewer-ready', {
|
|
303
|
+
controller: this.controller,
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
catch (error) {
|
|
307
|
+
this.dispatchError(error);
|
|
308
|
+
throw error;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
remount() {
|
|
312
|
+
if (!this.isConnected) {
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
this.destroy();
|
|
316
|
+
this.mount();
|
|
317
|
+
}
|
|
318
|
+
remountOrUpdate() {
|
|
319
|
+
if (this.controller) {
|
|
320
|
+
void this.update();
|
|
321
|
+
}
|
|
322
|
+
else if (this.isConnected) {
|
|
323
|
+
this.mount();
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
ensureMountNode() {
|
|
327
|
+
if (this.mountNode) {
|
|
328
|
+
return this.mountNode;
|
|
329
|
+
}
|
|
330
|
+
const node = document.createElement('div');
|
|
331
|
+
node.className = 'file-viewer-web-host';
|
|
332
|
+
node.style.width = '100%';
|
|
333
|
+
node.style.height = '100%';
|
|
334
|
+
node.style.minWidth = '0';
|
|
335
|
+
node.style.minHeight = '0';
|
|
336
|
+
this.mountNode = node;
|
|
337
|
+
this.appendChild(node);
|
|
338
|
+
if (!this.style.display) {
|
|
339
|
+
this.style.display = 'block';
|
|
340
|
+
}
|
|
341
|
+
return node;
|
|
342
|
+
}
|
|
343
|
+
createEffectiveMountOptions() {
|
|
344
|
+
const attributeOptions = this.readAttributeMountOptions();
|
|
345
|
+
const propertyOptions = this.mountOptions;
|
|
346
|
+
const onEventCallbacks = [attributeOptions.onEvent, propertyOptions.onEvent];
|
|
347
|
+
const onStateCallbacks = [attributeOptions.onStateChange, propertyOptions.onStateChange];
|
|
348
|
+
return {
|
|
349
|
+
...attributeOptions,
|
|
350
|
+
...propertyOptions,
|
|
351
|
+
options: mergeViewerOptions(attributeOptions.options, propertyOptions.options),
|
|
352
|
+
onEvent: event => {
|
|
353
|
+
callUnique(onEventCallbacks, event);
|
|
354
|
+
this.dispatchViewerEvent(event);
|
|
355
|
+
},
|
|
356
|
+
onStateChange: (state, event) => {
|
|
357
|
+
callUnique(onStateCallbacks.map(callback => callback ? nextState => callback(nextState, event) : undefined), state);
|
|
358
|
+
this.dispatchTypedEvent('viewer-state-change', {
|
|
359
|
+
state,
|
|
360
|
+
event,
|
|
361
|
+
});
|
|
362
|
+
},
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
readAttributeMountOptions() {
|
|
366
|
+
const url = this.getAttribute('src') || this.getAttribute('url') || undefined;
|
|
367
|
+
const filename = this.getAttribute('filename') || undefined;
|
|
368
|
+
const name = this.getAttribute('name') || undefined;
|
|
369
|
+
const type = this.getAttribute('type') || undefined;
|
|
370
|
+
const size = parseNumberLike(this.getAttribute('size'));
|
|
371
|
+
const options = this.readAttributeViewerOptions();
|
|
372
|
+
return {
|
|
373
|
+
...(url ? { url } : {}),
|
|
374
|
+
...(filename ? { filename } : {}),
|
|
375
|
+
...(name ? { name } : {}),
|
|
376
|
+
...(type ? { type } : {}),
|
|
377
|
+
...(size === undefined ? {} : { size }),
|
|
378
|
+
...(options ? { options } : {}),
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
readAttributeViewerOptions() {
|
|
382
|
+
const options = parseJsonObject(this.getAttribute('options')) || {};
|
|
383
|
+
const theme = this.getAttribute('theme');
|
|
384
|
+
if (theme) {
|
|
385
|
+
options.theme = theme;
|
|
386
|
+
}
|
|
387
|
+
const toolbar = this.getAttribute('toolbar');
|
|
388
|
+
const toolbarJson = parseJsonObject(toolbar);
|
|
389
|
+
const toolbarBoolean = parseBooleanLike(toolbar);
|
|
390
|
+
if (toolbarJson !== undefined) {
|
|
391
|
+
options.toolbar = toolbarJson;
|
|
392
|
+
}
|
|
393
|
+
else if (toolbarBoolean !== undefined) {
|
|
394
|
+
options.toolbar = toolbarBoolean;
|
|
395
|
+
}
|
|
396
|
+
const toolbarPosition = this.getAttribute('toolbar-position');
|
|
397
|
+
if (toolbarPosition) {
|
|
398
|
+
options.toolbar = {
|
|
399
|
+
...(typeof options.toolbar === 'object' && options.toolbar ? options.toolbar : {}),
|
|
400
|
+
position: toolbarPosition,
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
const watermark = this.getAttribute('watermark');
|
|
404
|
+
const watermarkJson = parseJsonObject(watermark);
|
|
405
|
+
const watermarkBoolean = parseBooleanLike(watermark);
|
|
406
|
+
if (watermarkJson !== undefined) {
|
|
407
|
+
options.watermark = watermarkJson;
|
|
408
|
+
}
|
|
409
|
+
else if (watermarkBoolean !== undefined) {
|
|
410
|
+
options.watermark = watermarkBoolean;
|
|
411
|
+
}
|
|
412
|
+
else if (watermark) {
|
|
413
|
+
options.watermark = { enabled: true, text: watermark };
|
|
414
|
+
}
|
|
415
|
+
const search = this.getAttribute('search');
|
|
416
|
+
const searchJson = parseJsonObject(search);
|
|
417
|
+
const searchBoolean = parseBooleanLike(search);
|
|
418
|
+
if (searchJson !== undefined) {
|
|
419
|
+
options.search = searchJson;
|
|
420
|
+
}
|
|
421
|
+
else if (searchBoolean !== undefined) {
|
|
422
|
+
options.search = searchBoolean;
|
|
423
|
+
}
|
|
424
|
+
return Object.keys(options).length ? options : undefined;
|
|
425
|
+
}
|
|
426
|
+
scheduleUpdate() {
|
|
427
|
+
if (!this.isConnected || !this.controller || this.pendingUpdate) {
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
this.pendingUpdate = true;
|
|
431
|
+
queueMicrotask(() => {
|
|
432
|
+
this.pendingUpdate = false;
|
|
433
|
+
if (!this.controller) {
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
436
|
+
this.controller.update(this.createEffectiveMountOptions()).catch(error => {
|
|
437
|
+
this.dispatchError(error);
|
|
438
|
+
});
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
dispatchViewerEvent(event) {
|
|
442
|
+
this.dispatchTypedEvent('viewer-event', event);
|
|
443
|
+
this.dispatchTypedEvent(toKebabEventName(event), event);
|
|
444
|
+
}
|
|
445
|
+
dispatchError(error) {
|
|
446
|
+
this.dispatchTypedEvent('viewer-error', { error });
|
|
447
|
+
}
|
|
448
|
+
dispatchTypedEvent(name, detail) {
|
|
449
|
+
this.dispatchEvent(new CustomEvent(name, {
|
|
450
|
+
bubbles: true,
|
|
451
|
+
composed: true,
|
|
452
|
+
detail,
|
|
453
|
+
}));
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
export const defineFileViewerElement = (tagName = FILE_VIEWER_ELEMENT_TAG) => {
|
|
457
|
+
if (typeof window === 'undefined' || !window.customElements) {
|
|
458
|
+
return undefined;
|
|
459
|
+
}
|
|
460
|
+
const existing = window.customElements.get(tagName);
|
|
461
|
+
if (existing) {
|
|
462
|
+
return existing;
|
|
463
|
+
}
|
|
464
|
+
window.customElements.define(tagName, FileViewerElement);
|
|
465
|
+
return FileViewerElement;
|
|
466
|
+
};
|