ngx-doc-viewer 21.0.1 → 21.0.6

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.
@@ -2,7 +2,7 @@ import * as i0 from '@angular/core';
2
2
  import { EventEmitter, TemplateRef, ViewChildren, ContentChild, Input, Output, Component, NgModule } from '@angular/core';
3
3
  import * as i2 from '@angular/common';
4
4
  import { CommonModule } from '@angular/common';
5
- import { getViewerDetails, isLocalFile, replaceLocalUrl, getDocxToHtml, googleCheckSubscription, getViewerRecoveryPlan, iframeIsLoaded } from 'docviewhelper';
5
+ import { getViewerDetails, isLocalFile, replaceLocalUrl, getDocxToHtml, googleCheckSubscription, ViewerRecoveryController, iframeIsLoaded } from 'docviewhelper';
6
6
  export * from 'docviewhelper';
7
7
  import * as i1 from '@angular/platform-browser';
8
8
 
@@ -51,13 +51,7 @@ class NgxDocViewerComponent {
51
51
  errorTemplateContext = this.createTemplateContext();
52
52
  checkIFrameSubscription = undefined;
53
53
  loadVersion = 0;
54
- externalLoadTimeoutId = undefined;
55
- googleFinalRetryTimeoutId = undefined;
56
- googleFinalRetriedSourceKey = undefined;
57
- currentGoogleSourceKey = undefined;
58
- officeRetryTimeoutId = undefined;
59
- officeAutoRetriedSourceKey = undefined;
60
- currentOfficeSourceKey = undefined;
54
+ recovery = undefined;
61
55
  lastEmittedPhase = undefined;
62
56
  constructor(domSanitizer, ngZone, cdr) {
63
57
  this.domSanitizer = domSanitizer;
@@ -65,9 +59,7 @@ class NgxDocViewerComponent {
65
59
  this.cdr = cdr;
66
60
  }
67
61
  ngOnDestroy() {
68
- this.clearExternalLoadTimeout();
69
- this.clearGoogleFinalRetry();
70
- this.clearOfficeRetry();
62
+ this.recovery?.dispose();
71
63
  if (this.checkIFrameSubscription) {
72
64
  this.checkIFrameSubscription.unsubscribe();
73
65
  }
@@ -101,7 +93,8 @@ class NgxDocViewerComponent {
101
93
  changes['viewerUrl'].previousValue)) {
102
94
  let viewerDetails = getViewerDetails(this.url, this.configuredViewer, this.queryParams, this.viewerUrl);
103
95
  const loadVersion = ++this.loadVersion;
104
- this.clearExternalLoadTimeout();
96
+ const recovery = this.ensureRecovery();
97
+ recovery.clearTimers();
105
98
  this.externalViewer = viewerDetails.externalViewer;
106
99
  if (viewerDetails.externalViewer &&
107
100
  this.overrideLocalhost &&
@@ -109,21 +102,10 @@ class NgxDocViewerComponent {
109
102
  const newUrl = replaceLocalUrl(this.url, this.overrideLocalhost);
110
103
  viewerDetails = getViewerDetails(newUrl, this.configuredViewer, this.queryParams, this.viewerUrl);
111
104
  }
112
- const officeSourceKey = this.configuredViewer === 'office' ? viewerDetails.url : undefined;
113
- if (officeSourceKey !== this.currentOfficeSourceKey) {
114
- this.officeAutoRetriedSourceKey = undefined;
115
- }
116
- this.currentOfficeSourceKey = officeSourceKey;
117
- const googleSourceKey = this.configuredViewer === 'google' ? viewerDetails.url : undefined;
118
- if (googleSourceKey !== this.currentGoogleSourceKey) {
119
- this.googleFinalRetriedSourceKey = undefined;
120
- }
121
- this.currentGoogleSourceKey = googleSourceKey;
105
+ recovery.trackSource(viewerDetails.url);
122
106
  this.docHtml = '';
123
107
  this.errorText = '';
124
108
  this.failedUrl = this.url;
125
- this.clearGoogleFinalRetry();
126
- this.clearOfficeRetry();
127
109
  this.updateTemplateContexts();
128
110
  if (this.checkIFrameSubscription) {
129
111
  this.checkIFrameSubscription.unsubscribe();
@@ -146,9 +128,11 @@ class NgxDocViewerComponent {
146
128
  this.fullUrl = iframeUrl;
147
129
  this.showIframe = true;
148
130
  this.updateTemplateContexts();
149
- this.scheduleExternalLoadTimeout(loadVersion);
131
+ const plan = recovery.beginExternalLoad(() => loadVersion === this.loadVersion);
150
132
  this.cdr.detectChanges();
151
- this.scheduleViewerRecovery();
133
+ if (plan.modes.includes('google-probe')) {
134
+ this.scheduleGoogleProbe();
135
+ }
152
136
  }
153
137
  else if (this.configuredViewer === 'mammoth') {
154
138
  this.setRenderPhase('loading');
@@ -185,9 +169,8 @@ class NgxDocViewerComponent {
185
169
  retryLoad() {
186
170
  this.retryNonce += 1;
187
171
  const retryVersion = ++this.loadVersion;
188
- this.clearExternalLoadTimeout();
189
- this.clearGoogleFinalRetry();
190
- this.clearOfficeRetry();
172
+ const recovery = this.ensureRecovery();
173
+ recovery.clearTimers();
191
174
  this.errorText = '';
192
175
  this.setRenderPhase(this.url ? 'loading' : 'idle');
193
176
  this.updateTemplateContexts();
@@ -213,8 +196,10 @@ class NgxDocViewerComponent {
213
196
  this.fullUrl =
214
197
  this.domSanitizer.bypassSecurityTrustResourceUrl(finalUrl);
215
198
  this.showIframe = true;
216
- this.scheduleExternalLoadTimeout(retryVersion);
217
- this.scheduleViewerRecovery();
199
+ const plan = recovery.beginExternalLoad(() => retryVersion === this.loadVersion);
200
+ if (plan.modes.includes('google-probe')) {
201
+ this.scheduleGoogleProbe();
202
+ }
218
203
  this.updateTemplateContexts();
219
204
  this.cdr.detectChanges();
220
205
  }
@@ -223,30 +208,36 @@ class NgxDocViewerComponent {
223
208
  this.checkIFrameSubscription = googleCheckSubscription();
224
209
  this.checkIFrameSubscription.subscribe(iframe, this.googleCheckInterval, this.googleMaxChecks);
225
210
  }
226
- scheduleViewerRecovery() {
227
- const recoveryPlan = getViewerRecoveryPlan({
211
+ ensureRecovery() {
212
+ if (!this.recovery) {
213
+ this.recovery = new ViewerRecoveryController(this.buildRecoveryConfig(), {
214
+ triggerRetry: () => this.ngZone.run(() => this.retryLoad()),
215
+ reportTimeout: () => this.ngZone.run(() => {
216
+ if (this.renderPhase !== 'loading') {
217
+ return;
218
+ }
219
+ this.errorText = `The ${this.configuredViewer} viewer did not finish loading in time.`;
220
+ this.setRenderPhase('error');
221
+ this.updateTemplateContexts();
222
+ this.cdr.detectChanges();
223
+ }),
224
+ });
225
+ }
226
+ this.recovery.configure(this.buildRecoveryConfig());
227
+ return this.recovery;
228
+ }
229
+ buildRecoveryConfig() {
230
+ return {
228
231
  viewer: this.configuredViewer,
229
232
  googleCheckContentLoaded: this.googleCheckContentLoaded,
233
+ googleCheckInterval: this.googleCheckInterval,
234
+ googleMaxChecks: this.googleMaxChecks,
230
235
  googleFinalRetryDelay: this.googleFinalRetryDelay,
231
236
  officeAutoRetry: this.officeAutoRetry,
232
- });
233
- for (const mode of recoveryPlan.modes) {
234
- if (mode === 'google-probe') {
235
- this.scheduleGoogleRecovery();
236
- }
237
- if (mode === 'google-final-retry') {
238
- continue;
239
- }
240
- if (mode === 'office-auto-retry') {
241
- this.scheduleOfficeRetry();
242
- }
243
- }
237
+ officeRetryDelay: this.officeRetryDelay,
238
+ };
244
239
  }
245
- scheduleGoogleRecovery() {
246
- if (this.configuredViewer !== 'google' ||
247
- !this.googleCheckContentLoaded) {
248
- return;
249
- }
240
+ scheduleGoogleProbe() {
250
241
  // see:
251
242
  // https://stackoverflow.com/questions/40414039/google-docs-viewer-returning-204-responses-no-longer-working-alternatives
252
243
  // hack to reload iframe if it's not loaded.
@@ -262,9 +253,7 @@ class NgxDocViewerComponent {
262
253
  iframeLoaded() {
263
254
  const iframe = this.iframes?.first?.nativeElement;
264
255
  if (iframe && iframeIsLoaded(iframe)) {
265
- this.clearExternalLoadTimeout();
266
- this.clearGoogleFinalRetry();
267
- this.clearOfficeRetry();
256
+ this.recovery?.notifyLoaded();
268
257
  this.setRenderPhase('ready');
269
258
  this.updateTemplateContexts();
270
259
  this.loaded.emit(undefined);
@@ -274,9 +263,7 @@ class NgxDocViewerComponent {
274
263
  }
275
264
  }
276
265
  objectLoaded() {
277
- this.clearExternalLoadTimeout();
278
- this.clearGoogleFinalRetry();
279
- this.clearOfficeRetry();
266
+ this.recovery?.notifyLoaded();
280
267
  this.setRenderPhase('ready');
281
268
  this.updateTemplateContexts();
282
269
  }
@@ -309,84 +296,6 @@ class NgxDocViewerComponent {
309
296
  });
310
297
  }
311
298
  }
312
- scheduleExternalLoadTimeout(loadVersion) {
313
- this.clearExternalLoadTimeout();
314
- const timeoutMs = this.configuredViewer === 'google'
315
- ? Math.max(this.googleCheckInterval * this.googleMaxChecks + 2000, 15000)
316
- : 15000;
317
- this.externalLoadTimeoutId = window.setTimeout(() => {
318
- if (loadVersion !== this.loadVersion || this.renderPhase !== 'loading') {
319
- return;
320
- }
321
- if (this.scheduleGoogleFinalRetry()) {
322
- return;
323
- }
324
- this.ngZone.run(() => {
325
- this.errorText = `The ${this.configuredViewer} viewer did not finish loading in time.`;
326
- this.setRenderPhase('error');
327
- this.updateTemplateContexts();
328
- this.cdr.detectChanges();
329
- });
330
- }, timeoutMs);
331
- }
332
- clearExternalLoadTimeout() {
333
- if (this.externalLoadTimeoutId) {
334
- window.clearTimeout(this.externalLoadTimeoutId);
335
- this.externalLoadTimeoutId = undefined;
336
- }
337
- }
338
- clearGoogleFinalRetry() {
339
- if (this.googleFinalRetryTimeoutId) {
340
- window.clearTimeout(this.googleFinalRetryTimeoutId);
341
- this.googleFinalRetryTimeoutId = undefined;
342
- }
343
- }
344
- clearOfficeRetry() {
345
- if (this.officeRetryTimeoutId) {
346
- window.clearTimeout(this.officeRetryTimeoutId);
347
- this.officeRetryTimeoutId = undefined;
348
- }
349
- }
350
- scheduleOfficeRetry() {
351
- if (this.configuredViewer !== 'office' ||
352
- !this.officeAutoRetry ||
353
- !this.currentOfficeSourceKey ||
354
- this.officeAutoRetriedSourceKey === this.currentOfficeSourceKey) {
355
- return;
356
- }
357
- this.clearOfficeRetry();
358
- this.officeRetryTimeoutId = window.setTimeout(() => {
359
- if (!this.currentOfficeSourceKey ||
360
- this.officeAutoRetriedSourceKey === this.currentOfficeSourceKey) {
361
- return;
362
- }
363
- this.officeAutoRetriedSourceKey = this.currentOfficeSourceKey;
364
- this.ngZone.run(() => this.retryLoad());
365
- }, this.officeRetryDelay);
366
- }
367
- scheduleGoogleFinalRetry() {
368
- const recoveryPlan = getViewerRecoveryPlan({
369
- viewer: this.configuredViewer,
370
- googleCheckContentLoaded: this.googleCheckContentLoaded,
371
- googleFinalRetryDelay: this.googleFinalRetryDelay,
372
- officeAutoRetry: this.officeAutoRetry,
373
- });
374
- if (!recoveryPlan.modes.includes('google-final-retry') ||
375
- !this.currentGoogleSourceKey ||
376
- this.googleFinalRetriedSourceKey === this.currentGoogleSourceKey) {
377
- return false;
378
- }
379
- this.clearGoogleFinalRetry();
380
- this.googleFinalRetryTimeoutId = window.setTimeout(() => {
381
- if (!this.currentGoogleSourceKey ||
382
- this.googleFinalRetriedSourceKey === this.currentGoogleSourceKey) {
383
- return;
384
- }
385
- this.googleFinalRetriedSourceKey = this.currentGoogleSourceKey;
386
- this.ngZone.run(() => this.retryLoad());
387
- }, this.googleFinalRetryDelay);
388
- return true;
389
- }
390
299
  get displayedErrorText() {
391
300
  return this.errorTextOverride || this.errorText || 'Unable to load document.';
392
301
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-doc-viewer.mjs","sources":["../../../../packages/ngx-doc-viewer/src/lib/document-viewer.component.ts","../../../../packages/ngx-doc-viewer/src/lib/document-viewer.component.html","../../../../packages/ngx-doc-viewer/src/lib/document-viewer.module.ts","../../../../packages/ngx-doc-viewer/src/ngx-doc-viewer.ts"],"sourcesContent":["import {\n Component,\n Input,\n NgZone,\n OnDestroy,\n OnChanges,\n SimpleChanges,\n Output,\n ViewChildren,\n QueryList,\n ElementRef,\n ChangeDetectorRef,\n ContentChild,\n TemplateRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { EventEmitter } from '@angular/core';\nimport {\n getDocxToHtml,\n getViewerDetails,\n getViewerRecoveryPlan,\n googleCheckSubscription,\n iframeIsLoaded,\n isLocalFile,\n replaceLocalUrl,\n IFrameReloader,\n} from 'docviewhelper';\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport type viewerType = 'google' | 'office' | 'mammoth' | 'pdf' | 'url';\ntype ViewerRenderPhase = 'idle' | 'loading' | 'ready' | 'error';\ninterface ViewerTemplateContext {\n $implicit: ViewerStateContext;\n state: ViewerStateContext;\n}\nexport interface ViewerStateContext {\n viewer: viewerType;\n url: string;\n phase: ViewerRenderPhase;\n errorText: string;\n retry: () => void;\n actionUrl: string;\n}\n@Component({\n selector: 'ngx-doc-viewer',\n standalone: true,\n imports: [CommonModule],\n templateUrl: 'document-viewer.component.html',\n styles: [\n `\n :host {\n display: block;\n }\n .container {\n width: 100%;\n height: 100%;\n position: relative;\n }\n .inline-document-shell {\n width: 100%;\n height: 100%;\n overflow: auto;\n background:\n linear-gradient(180deg, #eef2f7 0%, #f8fafc 100%);\n padding: 24px;\n }\n .inline-document-page {\n max-width: 900px;\n min-height: 100%;\n margin: 0 auto;\n background: #fff;\n border: 1px solid #dbe4f0;\n border-radius: 18px;\n box-shadow:\n 0 18px 40px -24px rgba(15, 23, 42, 0.3),\n 0 6px 18px -10px rgba(15, 23, 42, 0.18);\n padding: 40px 48px;\n }\n .inline-document-page,\n .inline-document-page * {\n box-sizing: border-box;\n }\n .inline-document-page {\n color: #1e293b;\n font-family:\n Georgia, Cambria, 'Times New Roman', Times, serif;\n font-size: 18px;\n line-height: 1.7;\n }\n .inline-document-page p,\n .inline-document-page ul,\n .inline-document-page ol,\n .inline-document-page blockquote,\n .inline-document-page table {\n margin: 0 0 1.1em;\n }\n .inline-document-page h1,\n .inline-document-page h2,\n .inline-document-page h3,\n .inline-document-page h4,\n .inline-document-page h5,\n .inline-document-page h6 {\n margin: 1.4em 0 0.65em;\n color: #0f172a;\n line-height: 1.25;\n }\n .inline-document-page h1:first-child,\n .inline-document-page h2:first-child,\n .inline-document-page h3:first-child,\n .inline-document-page p:first-child {\n margin-top: 0;\n }\n .inline-document-page table {\n width: 100%;\n border-collapse: collapse;\n }\n .inline-document-page td,\n .inline-document-page th {\n padding: 6px 10px;\n vertical-align: top;\n }\n .inline-document-page img {\n max-width: 100%;\n height: auto;\n }\n .inline-document-page hr {\n border: 0;\n border-top: 1px solid #dbe4f0;\n margin: 1.5em 0;\n }\n .loading-overlay {\n position: absolute;\n inset: 0;\n z-index: 1001;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.88);\n color: #475569;\n font-size: 14px;\n font-weight: 600;\n letter-spacing: 0.02em;\n text-align: center;\n padding: 16px;\n }\n .error-overlay {\n position: absolute;\n inset: 0;\n z-index: 1001;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.94);\n color: #991b1b;\n font-size: 14px;\n font-weight: 600;\n letter-spacing: 0.02em;\n text-align: center;\n padding: 16px;\n }\n .overlay-popout-google {\n width: 40px;\n height: 40px;\n right: 26px;\n top: 11.5px;\n position: absolute;\n z-index: 1000;\n }\n .overlay-popout-office {\n width: 100px;\n height: 20px;\n right: 0;\n bottom: 0;\n position: absolute;\n z-index: 1000;\n }\n .office-reload-btn {\n position: absolute;\n top: 8px;\n right: 8px;\n z-index: 1001;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n border: 1px solid rgba(0, 0, 0, 0.12);\n background: rgba(255, 255, 255, 0.85);\n color: #475569;\n font-size: 16px;\n line-height: 1;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0.5;\n transition: opacity 0.15s;\n padding: 0;\n }\n .office-reload-btn:hover {\n opacity: 1;\n }\n .overlay-full {\n width: 100%;\n height: 100%;\n right: 0;\n top: 0;\n position: absolute;\n z-index: 1000;\n }\n iframe {\n width: 100%;\n height: 100%;\n }\n @media (max-width: 768px) {\n .inline-document-shell {\n padding: 12px;\n }\n .inline-document-page {\n border-radius: 12px;\n padding: 22px 18px;\n }\n }\n `,\n ],\n})\nexport class NgxDocViewerComponent\n implements OnChanges, OnDestroy\n{\n @Output() loaded: EventEmitter<void> = new EventEmitter();\n @Output() loading: EventEmitter<ViewerStateContext> = new EventEmitter();\n @Output() error: EventEmitter<ViewerStateContext> = new EventEmitter();\n @Output() phaseChange: EventEmitter<ViewerStateContext> = new EventEmitter();\n @Input() url = '';\n @Input() queryParams = '';\n @Input() viewerUrl = '';\n @Input() googleCheckInterval = 3000;\n @Input() googleMaxChecks = 5;\n @Input() googleFinalRetryDelay = 0;\n @Input() disableContent: 'none' | 'all' | 'popout' | 'popout-hide' = 'none';\n @Input() googleCheckContentLoaded = true;\n @Input() viewer: viewerType = 'google';\n @Input() overrideLocalhost = '';\n @Input() loadingText = 'Loading document...';\n @Input() errorTextOverride = '';\n @Input() retryButtonText = 'Retry';\n @Input() officeAutoRetry = false;\n @Input() officeRetryDelay = 3000;\n @Input() officeReloadButtonText = '↻';\n @Input() officeReloadButtonTitle = 'Reload document';\n @Input() secondaryActionText = '';\n @Input() secondaryActionMode: 'open' | 'download' = 'open';\n @ContentChild('loadingContent', { read: TemplateRef })\n loadingTemplate?: TemplateRef<unknown>;\n @ContentChild('errorContent', { read: TemplateRef })\n errorTemplate?: TemplateRef<unknown>;\n @ContentChild('errorActions', { read: TemplateRef })\n errorActionsTemplate?: TemplateRef<unknown>;\n @ContentChild('officeReloadContent', { read: TemplateRef })\n officeReloadTemplate?: TemplateRef<unknown>;\n @ViewChildren('iframe') iframes?: QueryList<ElementRef> = undefined;\n\n public fullUrl?: SafeResourceUrl = undefined;\n public externalViewer = false;\n public docHtml = '';\n public configuredViewer: viewerType = 'google';\n public showIframe = true;\n public renderPhase: ViewerRenderPhase = 'idle';\n public errorText = '';\n public failedUrl = '';\n public retryNonce = 0;\n public loadingTemplateContext: ViewerTemplateContext = this.createTemplateContext();\n public errorTemplateContext: ViewerTemplateContext = this.createTemplateContext();\n private checkIFrameSubscription?: IFrameReloader = undefined;\n private loadVersion = 0;\n private externalLoadTimeoutId?: number = undefined;\n private googleFinalRetryTimeoutId?: number = undefined;\n private googleFinalRetriedSourceKey?: string = undefined;\n private currentGoogleSourceKey?: string = undefined;\n private officeRetryTimeoutId?: number = undefined;\n private officeAutoRetriedSourceKey?: string = undefined;\n private currentOfficeSourceKey?: string = undefined;\n private lastEmittedPhase?: ViewerRenderPhase = undefined;\n\n constructor(\n private domSanitizer: DomSanitizer,\n private ngZone: NgZone,\n private cdr: ChangeDetectorRef,\n ) {}\n\n ngOnDestroy(): void {\n this.clearExternalLoadTimeout();\n this.clearGoogleFinalRetry();\n this.clearOfficeRetry();\n if (this.checkIFrameSubscription) {\n this.checkIFrameSubscription.unsubscribe();\n }\n }\n\n async ngOnChanges(changes: SimpleChanges): Promise<void> {\n if (\n changes &&\n changes['retryNonce'] &&\n changes['retryNonce'].firstChange\n ) {\n return;\n }\n if (\n changes &&\n changes['viewer'] &&\n (changes['viewer'].firstChange ||\n changes['viewer'].currentValue !== changes['viewer'].previousValue)\n ) {\n if (\n this.viewer !== 'google' &&\n this.viewer !== 'office' &&\n this.viewer !== 'mammoth' &&\n this.viewer !== 'pdf' &&\n this.viewer !== 'url'\n ) {\n console.error(\n `Unsupported viewer: '${this.viewer}'. Supported viewers: google, office, mammoth and pdf`,\n );\n }\n this.configuredViewer = this.viewer;\n this.updateTemplateContexts();\n }\n\n if (\n (changes['url'] &&\n changes['url'].currentValue !== changes['url'].previousValue) ||\n (changes['viewer'] &&\n changes['viewer'].currentValue !== changes['viewer'].previousValue) ||\n (changes['viewerUrl'] &&\n changes['viewerUrl'].currentValue !==\n changes['viewerUrl'].previousValue)\n ) {\n let viewerDetails = getViewerDetails(\n this.url,\n this.configuredViewer,\n this.queryParams,\n this.viewerUrl,\n );\n const loadVersion = ++this.loadVersion;\n this.clearExternalLoadTimeout();\n this.externalViewer = viewerDetails.externalViewer;\n if (\n viewerDetails.externalViewer &&\n this.overrideLocalhost &&\n isLocalFile(this.url)\n ) {\n const newUrl = replaceLocalUrl(this.url, this.overrideLocalhost);\n viewerDetails = getViewerDetails(\n newUrl,\n this.configuredViewer,\n this.queryParams,\n this.viewerUrl,\n );\n }\n const officeSourceKey =\n this.configuredViewer === 'office' ? viewerDetails.url : undefined;\n if (officeSourceKey !== this.currentOfficeSourceKey) {\n this.officeAutoRetriedSourceKey = undefined;\n }\n this.currentOfficeSourceKey = officeSourceKey;\n const googleSourceKey =\n this.configuredViewer === 'google' ? viewerDetails.url : undefined;\n if (googleSourceKey !== this.currentGoogleSourceKey) {\n this.googleFinalRetriedSourceKey = undefined;\n }\n this.currentGoogleSourceKey = googleSourceKey;\n this.docHtml = '';\n this.errorText = '';\n this.failedUrl = this.url;\n this.clearGoogleFinalRetry();\n this.clearOfficeRetry();\n this.updateTemplateContexts();\n if (this.checkIFrameSubscription) {\n this.checkIFrameSubscription.unsubscribe();\n }\n if (!this.url) {\n this.fullUrl = undefined;\n this.showIframe = false;\n this.externalViewer = false;\n this.setRenderPhase('idle');\n this.updateTemplateContexts();\n } else if (\n viewerDetails.externalViewer ||\n this.configuredViewer === 'url' ||\n this.configuredViewer === 'pdf'\n ) {\n this.setRenderPhase('loading');\n const iframeUrl = this.domSanitizer.bypassSecurityTrustResourceUrl(\n viewerDetails.url,\n );\n this.fullUrl = undefined;\n this.showIframe = false;\n this.cdr.detectChanges();\n this.fullUrl = iframeUrl;\n this.showIframe = true;\n this.updateTemplateContexts();\n this.scheduleExternalLoadTimeout(loadVersion);\n this.cdr.detectChanges();\n this.scheduleViewerRecovery();\n } else if (this.configuredViewer === 'mammoth') {\n this.setRenderPhase('loading');\n this.externalViewer = false;\n this.fullUrl = undefined;\n this.showIframe = false;\n try {\n const docHtml = await getDocxToHtml(this.url);\n if (loadVersion !== this.loadVersion) {\n return;\n }\n this.ngZone.run(() => {\n this.docHtml = docHtml;\n this.setRenderPhase('ready');\n this.updateTemplateContexts();\n this.cdr.detectChanges();\n });\n } catch (error) {\n if (loadVersion !== this.loadVersion) {\n return;\n }\n this.ngZone.run(() => {\n this.errorText =\n error instanceof Error ? error.message : 'Unable to load document.';\n this.setRenderPhase('error');\n this.updateTemplateContexts();\n this.cdr.detectChanges();\n });\n }\n }\n }\n }\n\n retryLoad() {\n this.retryNonce += 1;\n const retryVersion = ++this.loadVersion;\n this.clearExternalLoadTimeout();\n this.clearGoogleFinalRetry();\n this.clearOfficeRetry();\n this.errorText = '';\n this.setRenderPhase(this.url ? 'loading' : 'idle');\n this.updateTemplateContexts();\n\n if (!this.url) {\n return;\n }\n\n if (this.configuredViewer === 'mammoth') {\n this.docHtml = '';\n void this.reloadMammoth(retryVersion);\n return;\n }\n\n if (\n this.configuredViewer === 'google' ||\n this.configuredViewer === 'office' ||\n this.configuredViewer === 'url' ||\n this.configuredViewer === 'pdf'\n ) {\n const details = getViewerDetails(\n this.url,\n this.configuredViewer,\n this.queryParams,\n this.viewerUrl,\n );\n const finalUrl =\n details.externalViewer && this.overrideLocalhost && isLocalFile(this.url)\n ? getViewerDetails(\n replaceLocalUrl(this.url, this.overrideLocalhost),\n this.configuredViewer,\n this.queryParams,\n this.viewerUrl,\n ).url\n : details.url;\n\n this.fullUrl = undefined;\n this.showIframe = false;\n this.cdr.detectChanges();\n this.fullUrl =\n this.domSanitizer.bypassSecurityTrustResourceUrl(finalUrl);\n this.showIframe = true;\n this.scheduleExternalLoadTimeout(retryVersion);\n this.scheduleViewerRecovery();\n this.updateTemplateContexts();\n this.cdr.detectChanges();\n }\n }\n\n private reloadIframe(iframe: HTMLIFrameElement) {\n this.checkIFrameSubscription = googleCheckSubscription();\n this.checkIFrameSubscription.subscribe(\n iframe,\n this.googleCheckInterval,\n this.googleMaxChecks,\n );\n }\n\n private scheduleViewerRecovery() {\n const recoveryPlan = getViewerRecoveryPlan({\n viewer: this.configuredViewer,\n googleCheckContentLoaded: this.googleCheckContentLoaded,\n googleFinalRetryDelay: this.googleFinalRetryDelay,\n officeAutoRetry: this.officeAutoRetry,\n });\n for (const mode of recoveryPlan.modes) {\n if (mode === 'google-probe') {\n this.scheduleGoogleRecovery();\n }\n if (mode === 'google-final-retry') {\n continue;\n }\n if (mode === 'office-auto-retry') {\n this.scheduleOfficeRetry();\n }\n }\n }\n\n private scheduleGoogleRecovery() {\n if (\n this.configuredViewer !== 'google' ||\n !this.googleCheckContentLoaded\n ) {\n return;\n }\n // see:\n // https://stackoverflow.com/questions/40414039/google-docs-viewer-returning-204-responses-no-longer-working-alternatives\n // hack to reload iframe if it's not loaded.\n this.ngZone.runOutsideAngular(() => {\n window.setTimeout(() => {\n const iframe = this.iframes?.first?.nativeElement as HTMLIFrameElement;\n if (iframe) {\n this.reloadIframe(iframe);\n }\n }, 0);\n });\n }\n\n iframeLoaded() {\n const iframe = this.iframes?.first?.nativeElement as HTMLIFrameElement;\n if (iframe && iframeIsLoaded(iframe)) {\n this.clearExternalLoadTimeout();\n this.clearGoogleFinalRetry();\n this.clearOfficeRetry();\n this.setRenderPhase('ready');\n this.updateTemplateContexts();\n this.loaded.emit(undefined);\n if (this.checkIFrameSubscription) {\n this.checkIFrameSubscription.unsubscribe();\n }\n }\n }\n\n objectLoaded() {\n this.clearExternalLoadTimeout();\n this.clearGoogleFinalRetry();\n this.clearOfficeRetry();\n this.setRenderPhase('ready');\n this.updateTemplateContexts();\n }\n\n private async reloadMammoth(loadVersion: number) {\n this.externalViewer = false;\n this.fullUrl = undefined;\n this.showIframe = false;\n try {\n const docHtml = await getDocxToHtml(this.url);\n if (loadVersion !== this.loadVersion) {\n return;\n }\n this.ngZone.run(() => {\n this.docHtml = docHtml;\n this.setRenderPhase('ready');\n this.updateTemplateContexts();\n this.cdr.detectChanges();\n });\n } catch (error) {\n if (loadVersion !== this.loadVersion) {\n return;\n }\n this.ngZone.run(() => {\n this.errorText =\n error instanceof Error ? error.message : 'Unable to load document.';\n this.setRenderPhase('error');\n this.updateTemplateContexts();\n this.cdr.detectChanges();\n });\n }\n }\n\n private scheduleExternalLoadTimeout(loadVersion: number) {\n this.clearExternalLoadTimeout();\n const timeoutMs =\n this.configuredViewer === 'google'\n ? Math.max(this.googleCheckInterval * this.googleMaxChecks + 2000, 15000)\n : 15000;\n this.externalLoadTimeoutId = window.setTimeout(() => {\n if (loadVersion !== this.loadVersion || this.renderPhase !== 'loading') {\n return;\n }\n if (this.scheduleGoogleFinalRetry()) {\n return;\n }\n this.ngZone.run(() => {\n this.errorText = `The ${this.configuredViewer} viewer did not finish loading in time.`;\n this.setRenderPhase('error');\n this.updateTemplateContexts();\n this.cdr.detectChanges();\n });\n }, timeoutMs);\n }\n\n private clearExternalLoadTimeout() {\n if (this.externalLoadTimeoutId) {\n window.clearTimeout(this.externalLoadTimeoutId);\n this.externalLoadTimeoutId = undefined;\n }\n }\n\n private clearGoogleFinalRetry() {\n if (this.googleFinalRetryTimeoutId) {\n window.clearTimeout(this.googleFinalRetryTimeoutId);\n this.googleFinalRetryTimeoutId = undefined;\n }\n }\n\n private clearOfficeRetry() {\n if (this.officeRetryTimeoutId) {\n window.clearTimeout(this.officeRetryTimeoutId);\n this.officeRetryTimeoutId = undefined;\n }\n }\n\n private scheduleOfficeRetry() {\n if (\n this.configuredViewer !== 'office' ||\n !this.officeAutoRetry ||\n !this.currentOfficeSourceKey ||\n this.officeAutoRetriedSourceKey === this.currentOfficeSourceKey\n ) {\n return;\n }\n this.clearOfficeRetry();\n this.officeRetryTimeoutId = window.setTimeout(() => {\n if (\n !this.currentOfficeSourceKey ||\n this.officeAutoRetriedSourceKey === this.currentOfficeSourceKey\n ) {\n return;\n }\n this.officeAutoRetriedSourceKey = this.currentOfficeSourceKey;\n this.ngZone.run(() => this.retryLoad());\n }, this.officeRetryDelay);\n }\n\n private scheduleGoogleFinalRetry() {\n const recoveryPlan = getViewerRecoveryPlan({\n viewer: this.configuredViewer,\n googleCheckContentLoaded: this.googleCheckContentLoaded,\n googleFinalRetryDelay: this.googleFinalRetryDelay,\n officeAutoRetry: this.officeAutoRetry,\n });\n if (\n !recoveryPlan.modes.includes('google-final-retry') ||\n !this.currentGoogleSourceKey ||\n this.googleFinalRetriedSourceKey === this.currentGoogleSourceKey\n ) {\n return false;\n }\n this.clearGoogleFinalRetry();\n this.googleFinalRetryTimeoutId = window.setTimeout(() => {\n if (\n !this.currentGoogleSourceKey ||\n this.googleFinalRetriedSourceKey === this.currentGoogleSourceKey\n ) {\n return;\n }\n this.googleFinalRetriedSourceKey = this.currentGoogleSourceKey;\n this.ngZone.run(() => this.retryLoad());\n }, this.googleFinalRetryDelay);\n return true;\n }\n\n get displayedErrorText() {\n return this.errorTextOverride || this.errorText || 'Unable to load document.';\n }\n\n private updateTemplateContexts() {\n const state = this.createStateContext();\n this.loadingTemplateContext = { $implicit: state, state };\n this.errorTemplateContext = { $implicit: state, state };\n }\n\n private createTemplateContext(): ViewerTemplateContext {\n const state = this.createStateContext();\n return { $implicit: state, state };\n }\n\n private createStateContext(): ViewerStateContext {\n return {\n viewer: this.configuredViewer,\n url: this.failedUrl || this.url,\n phase: this.renderPhase,\n errorText: this.displayedErrorText,\n retry: () => this.retryLoad(),\n actionUrl: this.failedUrl || this.url,\n };\n }\n\n private setRenderPhase(phase: ViewerRenderPhase) {\n this.renderPhase = phase;\n this.emitLifecycleIfNeeded();\n }\n\n private emitLifecycleIfNeeded() {\n if (this.lastEmittedPhase === this.renderPhase) {\n return;\n }\n this.lastEmittedPhase = this.renderPhase;\n const state = this.createStateContext();\n this.phaseChange.emit(state);\n if (this.renderPhase === 'loading') {\n this.loading.emit(state);\n }\n if (this.renderPhase === 'error') {\n this.error.emit(state);\n }\n }\n}\n","<div class=\"container\">\n <div *ngIf=\"renderPhase === 'loading'\" class=\"loading-overlay\">\n <ng-container *ngIf=\"loadingTemplate; else defaultLoadingTemplate\">\n <ng-container *ngTemplateOutlet=\"loadingTemplate; context: loadingTemplateContext\"></ng-container>\n </ng-container>\n <ng-template #defaultLoadingTemplate>{{ loadingText }}</ng-template>\n </div>\n <div *ngIf=\"renderPhase === 'error'\" class=\"error-overlay\">\n <ng-container *ngIf=\"errorTemplate; else defaultErrorTemplate\">\n <ng-container *ngTemplateOutlet=\"errorTemplate; context: errorTemplateContext\"></ng-container>\n </ng-container>\n <ng-template #defaultErrorTemplate>\n <div>\n <div>{{ displayedErrorText }}</div>\n <div *ngIf=\"configuredViewer\" style=\"margin-top: 8px; color: #475569;\">\n Viewer: {{ configuredViewer }}\n </div>\n <div *ngIf=\"failedUrl\" style=\"margin-top: 4px; color: #64748b; font-size: 12px; word-break: break-word;\">\n {{ failedUrl }}\n </div>\n <ng-container *ngIf=\"errorActionsTemplate; else defaultErrorActions\">\n <ng-container *ngTemplateOutlet=\"errorActionsTemplate; context: errorTemplateContext\"></ng-container>\n </ng-container>\n <ng-template #defaultErrorActions>\n <div style=\"margin-top: 14px; display: flex; gap: 8px; justify-content: center; flex-wrap: wrap;\">\n <button\n type=\"button\"\n (click)=\"retryLoad()\"\n style=\"border: 1px solid #fecaca; background: #fff; color: #991b1b; border-radius: 999px; padding: 8px 14px; font: inherit; cursor: pointer;\"\n >\n {{ retryButtonText }}\n </button>\n <a\n *ngIf=\"secondaryActionText && failedUrl\"\n [href]=\"failedUrl\"\n [attr.target]=\"secondaryActionMode === 'open' ? '_blank' : null\"\n [attr.rel]=\"secondaryActionMode === 'open' ? 'noreferrer' : null\"\n [attr.download]=\"secondaryActionMode === 'download' ? '' : null\"\n style=\"border: 1px solid #cbd5e1; background: #fff; color: #334155; border-radius: 999px; padding: 8px 14px; text-decoration: none; font: inherit;\"\n >\n {{ secondaryActionText }}\n </a>\n </div>\n </ng-template>\n </div>\n </ng-template>\n </div>\n\n <ng-container *ngIf=\"!externalViewer\">\n <div *ngIf=\"configuredViewer !== 'pdf'\" class=\"inline-document-shell\">\n <div class=\"inline-document-page\" [innerHTML]=\"docHtml\"></div>\n </div>\n <object\n (load)=\"objectLoaded()\"\n *ngIf=\"fullUrl && configuredViewer === 'pdf'\"\n [data]=\"fullUrl\"\n type=\"application/pdf\"\n width=\"100%\"\n height=\"100%\"\n >\n <p>\n Your browser does not support PDFs.\n <a [href]=\"fullUrl\">Download the PDF</a>.\n </p>\n </object>\n </ng-container>\n\n <button\n *ngIf=\"configuredViewer === 'office' && renderPhase === 'ready'\"\n class=\"office-reload-btn\"\n type=\"button\"\n [attr.title]=\"officeReloadButtonTitle\"\n (click)=\"retryLoad()\"\n >\n <ng-container *ngIf=\"officeReloadTemplate; else defaultOfficeReloadTemplate\">\n <ng-container *ngTemplateOutlet=\"officeReloadTemplate; context: errorTemplateContext\"></ng-container>\n </ng-container>\n <ng-template #defaultOfficeReloadTemplate>{{ officeReloadButtonText }}</ng-template>\n </button>\n\n <ng-container *ngIf=\"externalViewer\">\n <iframe\n (load)=\"iframeLoaded()\"\n *ngIf=\"fullUrl && showIframe && disableContent === 'none'\"\n #iframe\n id=\"iframe-doc-viewer\"\n frameBorder=\"0\"\n allow=\"clipboard-read; clipboard-write\"\n [src]=\"fullUrl\"\n ></iframe>\n <div class=\"container\" *ngIf=\"disableContent !== 'none'\">\n <div\n [class.overlay-full]=\"disableContent === 'all'\"\n [class.overlay-popout-google]=\"\n configuredViewer === 'google' &&\n (disableContent === 'popout' || disableContent === 'popout-hide')\n \"\n [class.overlay-popout-office]=\"\n configuredViewer === 'office' &&\n (disableContent === 'popout' || disableContent === 'popout-hide')\n \"\n [style.background-color]=\"\n disableContent === 'popout-hide' ? '#fff' : 'transparent'\n \"\n ></div>\n <iframe\n (load)=\"iframeLoaded()\"\n *ngIf=\"fullUrl && showIframe\"\n #iframe\n id=\"iframe\"\n frameBorder=\"0\"\n allow=\"clipboard-read; clipboard-write\"\n [src]=\"fullUrl\"\n ></iframe>\n </div>\n </ng-container>\n</div>\n","import { NgxDocViewerComponent } from './document-viewer.component';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n imports: [CommonModule, NgxDocViewerComponent],\n exports: [NgxDocViewerComponent],\n})\nexport class NgxDocViewerModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-doc-viewer.mjs","sources":["../../../../packages/ngx-doc-viewer/src/lib/document-viewer.component.ts","../../../../packages/ngx-doc-viewer/src/lib/document-viewer.component.html","../../../../packages/ngx-doc-viewer/src/lib/document-viewer.module.ts","../../../../packages/ngx-doc-viewer/src/ngx-doc-viewer.ts"],"sourcesContent":["import {\n Component,\n Input,\n NgZone,\n OnDestroy,\n OnChanges,\n SimpleChanges,\n Output,\n ViewChildren,\n QueryList,\n ElementRef,\n ChangeDetectorRef,\n ContentChild,\n TemplateRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { EventEmitter } from '@angular/core';\nimport {\n getDocxToHtml,\n getViewerDetails,\n googleCheckSubscription,\n iframeIsLoaded,\n isLocalFile,\n replaceLocalUrl,\n IFrameReloader,\n ViewerRecoveryConfig,\n ViewerRecoveryController,\n} from 'docviewhelper';\n\n \nexport type viewerType = 'google' | 'office' | 'mammoth' | 'pdf' | 'url';\ntype ViewerRenderPhase = 'idle' | 'loading' | 'ready' | 'error';\ninterface ViewerTemplateContext {\n $implicit: ViewerStateContext;\n state: ViewerStateContext;\n}\nexport interface ViewerStateContext {\n viewer: viewerType;\n url: string;\n phase: ViewerRenderPhase;\n errorText: string;\n retry: () => void;\n actionUrl: string;\n}\n@Component({\n selector: 'ngx-doc-viewer',\n standalone: true,\n imports: [CommonModule],\n templateUrl: 'document-viewer.component.html',\n styles: [\n `\n :host {\n display: block;\n }\n .container {\n width: 100%;\n height: 100%;\n position: relative;\n }\n .inline-document-shell {\n width: 100%;\n height: 100%;\n overflow: auto;\n background:\n linear-gradient(180deg, #eef2f7 0%, #f8fafc 100%);\n padding: 24px;\n }\n .inline-document-page {\n max-width: 900px;\n min-height: 100%;\n margin: 0 auto;\n background: #fff;\n border: 1px solid #dbe4f0;\n border-radius: 18px;\n box-shadow:\n 0 18px 40px -24px rgba(15, 23, 42, 0.3),\n 0 6px 18px -10px rgba(15, 23, 42, 0.18);\n padding: 40px 48px;\n }\n .inline-document-page,\n .inline-document-page * {\n box-sizing: border-box;\n }\n .inline-document-page {\n color: #1e293b;\n font-family:\n Georgia, Cambria, 'Times New Roman', Times, serif;\n font-size: 18px;\n line-height: 1.7;\n }\n .inline-document-page p,\n .inline-document-page ul,\n .inline-document-page ol,\n .inline-document-page blockquote,\n .inline-document-page table {\n margin: 0 0 1.1em;\n }\n .inline-document-page h1,\n .inline-document-page h2,\n .inline-document-page h3,\n .inline-document-page h4,\n .inline-document-page h5,\n .inline-document-page h6 {\n margin: 1.4em 0 0.65em;\n color: #0f172a;\n line-height: 1.25;\n }\n .inline-document-page h1:first-child,\n .inline-document-page h2:first-child,\n .inline-document-page h3:first-child,\n .inline-document-page p:first-child {\n margin-top: 0;\n }\n .inline-document-page table {\n width: 100%;\n border-collapse: collapse;\n }\n .inline-document-page td,\n .inline-document-page th {\n padding: 6px 10px;\n vertical-align: top;\n }\n .inline-document-page img {\n max-width: 100%;\n height: auto;\n }\n .inline-document-page hr {\n border: 0;\n border-top: 1px solid #dbe4f0;\n margin: 1.5em 0;\n }\n .loading-overlay {\n position: absolute;\n inset: 0;\n z-index: 1001;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.88);\n color: #475569;\n font-size: 14px;\n font-weight: 600;\n letter-spacing: 0.02em;\n text-align: center;\n padding: 16px;\n }\n .error-overlay {\n position: absolute;\n inset: 0;\n z-index: 1001;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.94);\n color: #991b1b;\n font-size: 14px;\n font-weight: 600;\n letter-spacing: 0.02em;\n text-align: center;\n padding: 16px;\n }\n .overlay-popout-google {\n width: 40px;\n height: 40px;\n right: 26px;\n top: 11.5px;\n position: absolute;\n z-index: 1000;\n }\n .overlay-popout-office {\n width: 100px;\n height: 20px;\n right: 0;\n bottom: 0;\n position: absolute;\n z-index: 1000;\n }\n .office-reload-btn {\n position: absolute;\n top: 8px;\n right: 8px;\n z-index: 1001;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n border: 1px solid rgba(0, 0, 0, 0.12);\n background: rgba(255, 255, 255, 0.85);\n color: #475569;\n font-size: 16px;\n line-height: 1;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0.5;\n transition: opacity 0.15s;\n padding: 0;\n }\n .office-reload-btn:hover {\n opacity: 1;\n }\n .overlay-full {\n width: 100%;\n height: 100%;\n right: 0;\n top: 0;\n position: absolute;\n z-index: 1000;\n }\n iframe {\n width: 100%;\n height: 100%;\n }\n @media (max-width: 768px) {\n .inline-document-shell {\n padding: 12px;\n }\n .inline-document-page {\n border-radius: 12px;\n padding: 22px 18px;\n }\n }\n `,\n ],\n})\nexport class NgxDocViewerComponent\n implements OnChanges, OnDestroy\n{\n @Output() loaded: EventEmitter<void> = new EventEmitter();\n @Output() loading: EventEmitter<ViewerStateContext> = new EventEmitter();\n @Output() error: EventEmitter<ViewerStateContext> = new EventEmitter();\n @Output() phaseChange: EventEmitter<ViewerStateContext> = new EventEmitter();\n @Input() url = '';\n @Input() queryParams = '';\n @Input() viewerUrl = '';\n @Input() googleCheckInterval = 3000;\n @Input() googleMaxChecks = 5;\n @Input() googleFinalRetryDelay = 0;\n @Input() disableContent: 'none' | 'all' | 'popout' | 'popout-hide' = 'none';\n @Input() googleCheckContentLoaded = true;\n @Input() viewer: viewerType = 'google';\n @Input() overrideLocalhost = '';\n @Input() loadingText = 'Loading document...';\n @Input() errorTextOverride = '';\n @Input() retryButtonText = 'Retry';\n @Input() officeAutoRetry = false;\n @Input() officeRetryDelay = 3000;\n @Input() officeReloadButtonText = '↻';\n @Input() officeReloadButtonTitle = 'Reload document';\n @Input() secondaryActionText = '';\n @Input() secondaryActionMode: 'open' | 'download' = 'open';\n @ContentChild('loadingContent', { read: TemplateRef })\n loadingTemplate?: TemplateRef<unknown>;\n @ContentChild('errorContent', { read: TemplateRef })\n errorTemplate?: TemplateRef<unknown>;\n @ContentChild('errorActions', { read: TemplateRef })\n errorActionsTemplate?: TemplateRef<unknown>;\n @ContentChild('officeReloadContent', { read: TemplateRef })\n officeReloadTemplate?: TemplateRef<unknown>;\n @ViewChildren('iframe') iframes?: QueryList<ElementRef> = undefined;\n\n public fullUrl?: SafeResourceUrl = undefined;\n public externalViewer = false;\n public docHtml = '';\n public configuredViewer: viewerType = 'google';\n public showIframe = true;\n public renderPhase: ViewerRenderPhase = 'idle';\n public errorText = '';\n public failedUrl = '';\n public retryNonce = 0;\n public loadingTemplateContext: ViewerTemplateContext = this.createTemplateContext();\n public errorTemplateContext: ViewerTemplateContext = this.createTemplateContext();\n private checkIFrameSubscription?: IFrameReloader = undefined;\n private loadVersion = 0;\n private recovery?: ViewerRecoveryController = undefined;\n private lastEmittedPhase?: ViewerRenderPhase = undefined;\n\n constructor(\n private domSanitizer: DomSanitizer,\n private ngZone: NgZone,\n private cdr: ChangeDetectorRef,\n ) {}\n\n ngOnDestroy(): void {\n this.recovery?.dispose();\n if (this.checkIFrameSubscription) {\n this.checkIFrameSubscription.unsubscribe();\n }\n }\n\n async ngOnChanges(changes: SimpleChanges): Promise<void> {\n if (\n changes &&\n changes['retryNonce'] &&\n changes['retryNonce'].firstChange\n ) {\n return;\n }\n if (\n changes &&\n changes['viewer'] &&\n (changes['viewer'].firstChange ||\n changes['viewer'].currentValue !== changes['viewer'].previousValue)\n ) {\n if (\n this.viewer !== 'google' &&\n this.viewer !== 'office' &&\n this.viewer !== 'mammoth' &&\n this.viewer !== 'pdf' &&\n this.viewer !== 'url'\n ) {\n console.error(\n `Unsupported viewer: '${this.viewer}'. Supported viewers: google, office, mammoth and pdf`,\n );\n }\n this.configuredViewer = this.viewer;\n this.updateTemplateContexts();\n }\n\n if (\n (changes['url'] &&\n changes['url'].currentValue !== changes['url'].previousValue) ||\n (changes['viewer'] &&\n changes['viewer'].currentValue !== changes['viewer'].previousValue) ||\n (changes['viewerUrl'] &&\n changes['viewerUrl'].currentValue !==\n changes['viewerUrl'].previousValue)\n ) {\n let viewerDetails = getViewerDetails(\n this.url,\n this.configuredViewer,\n this.queryParams,\n this.viewerUrl,\n );\n const loadVersion = ++this.loadVersion;\n const recovery = this.ensureRecovery();\n recovery.clearTimers();\n this.externalViewer = viewerDetails.externalViewer;\n if (\n viewerDetails.externalViewer &&\n this.overrideLocalhost &&\n isLocalFile(this.url)\n ) {\n const newUrl = replaceLocalUrl(this.url, this.overrideLocalhost);\n viewerDetails = getViewerDetails(\n newUrl,\n this.configuredViewer,\n this.queryParams,\n this.viewerUrl,\n );\n }\n recovery.trackSource(viewerDetails.url);\n this.docHtml = '';\n this.errorText = '';\n this.failedUrl = this.url;\n this.updateTemplateContexts();\n if (this.checkIFrameSubscription) {\n this.checkIFrameSubscription.unsubscribe();\n }\n if (!this.url) {\n this.fullUrl = undefined;\n this.showIframe = false;\n this.externalViewer = false;\n this.setRenderPhase('idle');\n this.updateTemplateContexts();\n } else if (\n viewerDetails.externalViewer ||\n this.configuredViewer === 'url' ||\n this.configuredViewer === 'pdf'\n ) {\n this.setRenderPhase('loading');\n const iframeUrl = this.domSanitizer.bypassSecurityTrustResourceUrl(\n viewerDetails.url,\n );\n this.fullUrl = undefined;\n this.showIframe = false;\n this.cdr.detectChanges();\n this.fullUrl = iframeUrl;\n this.showIframe = true;\n this.updateTemplateContexts();\n const plan = recovery.beginExternalLoad(\n () => loadVersion === this.loadVersion,\n );\n this.cdr.detectChanges();\n if (plan.modes.includes('google-probe')) {\n this.scheduleGoogleProbe();\n }\n } else if (this.configuredViewer === 'mammoth') {\n this.setRenderPhase('loading');\n this.externalViewer = false;\n this.fullUrl = undefined;\n this.showIframe = false;\n try {\n const docHtml = await getDocxToHtml(this.url);\n if (loadVersion !== this.loadVersion) {\n return;\n }\n this.ngZone.run(() => {\n this.docHtml = docHtml;\n this.setRenderPhase('ready');\n this.updateTemplateContexts();\n this.cdr.detectChanges();\n });\n } catch (error) {\n if (loadVersion !== this.loadVersion) {\n return;\n }\n this.ngZone.run(() => {\n this.errorText =\n error instanceof Error ? error.message : 'Unable to load document.';\n this.setRenderPhase('error');\n this.updateTemplateContexts();\n this.cdr.detectChanges();\n });\n }\n }\n }\n }\n\n retryLoad() {\n this.retryNonce += 1;\n const retryVersion = ++this.loadVersion;\n const recovery = this.ensureRecovery();\n recovery.clearTimers();\n this.errorText = '';\n this.setRenderPhase(this.url ? 'loading' : 'idle');\n this.updateTemplateContexts();\n\n if (!this.url) {\n return;\n }\n\n if (this.configuredViewer === 'mammoth') {\n this.docHtml = '';\n void this.reloadMammoth(retryVersion);\n return;\n }\n\n if (\n this.configuredViewer === 'google' ||\n this.configuredViewer === 'office' ||\n this.configuredViewer === 'url' ||\n this.configuredViewer === 'pdf'\n ) {\n const details = getViewerDetails(\n this.url,\n this.configuredViewer,\n this.queryParams,\n this.viewerUrl,\n );\n const finalUrl =\n details.externalViewer && this.overrideLocalhost && isLocalFile(this.url)\n ? getViewerDetails(\n replaceLocalUrl(this.url, this.overrideLocalhost),\n this.configuredViewer,\n this.queryParams,\n this.viewerUrl,\n ).url\n : details.url;\n\n this.fullUrl = undefined;\n this.showIframe = false;\n this.cdr.detectChanges();\n this.fullUrl =\n this.domSanitizer.bypassSecurityTrustResourceUrl(finalUrl);\n this.showIframe = true;\n const plan = recovery.beginExternalLoad(\n () => retryVersion === this.loadVersion,\n );\n if (plan.modes.includes('google-probe')) {\n this.scheduleGoogleProbe();\n }\n this.updateTemplateContexts();\n this.cdr.detectChanges();\n }\n }\n\n private reloadIframe(iframe: HTMLIFrameElement) {\n this.checkIFrameSubscription = googleCheckSubscription();\n this.checkIFrameSubscription.subscribe(\n iframe,\n this.googleCheckInterval,\n this.googleMaxChecks,\n );\n }\n\n private ensureRecovery(): ViewerRecoveryController {\n if (!this.recovery) {\n this.recovery = new ViewerRecoveryController(this.buildRecoveryConfig(), {\n triggerRetry: () => this.ngZone.run(() => this.retryLoad()),\n reportTimeout: () =>\n this.ngZone.run(() => {\n if (this.renderPhase !== 'loading') {\n return;\n }\n this.errorText = `The ${this.configuredViewer} viewer did not finish loading in time.`;\n this.setRenderPhase('error');\n this.updateTemplateContexts();\n this.cdr.detectChanges();\n }),\n });\n }\n this.recovery.configure(this.buildRecoveryConfig());\n return this.recovery;\n }\n\n private buildRecoveryConfig(): ViewerRecoveryConfig {\n return {\n viewer: this.configuredViewer,\n googleCheckContentLoaded: this.googleCheckContentLoaded,\n googleCheckInterval: this.googleCheckInterval,\n googleMaxChecks: this.googleMaxChecks,\n googleFinalRetryDelay: this.googleFinalRetryDelay,\n officeAutoRetry: this.officeAutoRetry,\n officeRetryDelay: this.officeRetryDelay,\n };\n }\n\n private scheduleGoogleProbe() {\n // see:\n // https://stackoverflow.com/questions/40414039/google-docs-viewer-returning-204-responses-no-longer-working-alternatives\n // hack to reload iframe if it's not loaded.\n this.ngZone.runOutsideAngular(() => {\n window.setTimeout(() => {\n const iframe = this.iframes?.first?.nativeElement as HTMLIFrameElement;\n if (iframe) {\n this.reloadIframe(iframe);\n }\n }, 0);\n });\n }\n\n iframeLoaded() {\n const iframe = this.iframes?.first?.nativeElement as HTMLIFrameElement;\n if (iframe && iframeIsLoaded(iframe)) {\n this.recovery?.notifyLoaded();\n this.setRenderPhase('ready');\n this.updateTemplateContexts();\n this.loaded.emit(undefined);\n if (this.checkIFrameSubscription) {\n this.checkIFrameSubscription.unsubscribe();\n }\n }\n }\n\n objectLoaded() {\n this.recovery?.notifyLoaded();\n this.setRenderPhase('ready');\n this.updateTemplateContexts();\n }\n\n private async reloadMammoth(loadVersion: number) {\n this.externalViewer = false;\n this.fullUrl = undefined;\n this.showIframe = false;\n try {\n const docHtml = await getDocxToHtml(this.url);\n if (loadVersion !== this.loadVersion) {\n return;\n }\n this.ngZone.run(() => {\n this.docHtml = docHtml;\n this.setRenderPhase('ready');\n this.updateTemplateContexts();\n this.cdr.detectChanges();\n });\n } catch (error) {\n if (loadVersion !== this.loadVersion) {\n return;\n }\n this.ngZone.run(() => {\n this.errorText =\n error instanceof Error ? error.message : 'Unable to load document.';\n this.setRenderPhase('error');\n this.updateTemplateContexts();\n this.cdr.detectChanges();\n });\n }\n }\n\n get displayedErrorText() {\n return this.errorTextOverride || this.errorText || 'Unable to load document.';\n }\n\n private updateTemplateContexts() {\n const state = this.createStateContext();\n this.loadingTemplateContext = { $implicit: state, state };\n this.errorTemplateContext = { $implicit: state, state };\n }\n\n private createTemplateContext(): ViewerTemplateContext {\n const state = this.createStateContext();\n return { $implicit: state, state };\n }\n\n private createStateContext(): ViewerStateContext {\n return {\n viewer: this.configuredViewer,\n url: this.failedUrl || this.url,\n phase: this.renderPhase,\n errorText: this.displayedErrorText,\n retry: () => this.retryLoad(),\n actionUrl: this.failedUrl || this.url,\n };\n }\n\n private setRenderPhase(phase: ViewerRenderPhase) {\n this.renderPhase = phase;\n this.emitLifecycleIfNeeded();\n }\n\n private emitLifecycleIfNeeded() {\n if (this.lastEmittedPhase === this.renderPhase) {\n return;\n }\n this.lastEmittedPhase = this.renderPhase;\n const state = this.createStateContext();\n this.phaseChange.emit(state);\n if (this.renderPhase === 'loading') {\n this.loading.emit(state);\n }\n if (this.renderPhase === 'error') {\n this.error.emit(state);\n }\n }\n}\n","<div class=\"container\">\n <div *ngIf=\"renderPhase === 'loading'\" class=\"loading-overlay\">\n <ng-container *ngIf=\"loadingTemplate; else defaultLoadingTemplate\">\n <ng-container *ngTemplateOutlet=\"loadingTemplate; context: loadingTemplateContext\"></ng-container>\n </ng-container>\n <ng-template #defaultLoadingTemplate>{{ loadingText }}</ng-template>\n </div>\n <div *ngIf=\"renderPhase === 'error'\" class=\"error-overlay\">\n <ng-container *ngIf=\"errorTemplate; else defaultErrorTemplate\">\n <ng-container *ngTemplateOutlet=\"errorTemplate; context: errorTemplateContext\"></ng-container>\n </ng-container>\n <ng-template #defaultErrorTemplate>\n <div>\n <div>{{ displayedErrorText }}</div>\n <div *ngIf=\"configuredViewer\" style=\"margin-top: 8px; color: #475569;\">\n Viewer: {{ configuredViewer }}\n </div>\n <div *ngIf=\"failedUrl\" style=\"margin-top: 4px; color: #64748b; font-size: 12px; word-break: break-word;\">\n {{ failedUrl }}\n </div>\n <ng-container *ngIf=\"errorActionsTemplate; else defaultErrorActions\">\n <ng-container *ngTemplateOutlet=\"errorActionsTemplate; context: errorTemplateContext\"></ng-container>\n </ng-container>\n <ng-template #defaultErrorActions>\n <div style=\"margin-top: 14px; display: flex; gap: 8px; justify-content: center; flex-wrap: wrap;\">\n <button\n type=\"button\"\n (click)=\"retryLoad()\"\n style=\"border: 1px solid #fecaca; background: #fff; color: #991b1b; border-radius: 999px; padding: 8px 14px; font: inherit; cursor: pointer;\"\n >\n {{ retryButtonText }}\n </button>\n <a\n *ngIf=\"secondaryActionText && failedUrl\"\n [href]=\"failedUrl\"\n [attr.target]=\"secondaryActionMode === 'open' ? '_blank' : null\"\n [attr.rel]=\"secondaryActionMode === 'open' ? 'noreferrer' : null\"\n [attr.download]=\"secondaryActionMode === 'download' ? '' : null\"\n style=\"border: 1px solid #cbd5e1; background: #fff; color: #334155; border-radius: 999px; padding: 8px 14px; text-decoration: none; font: inherit;\"\n >\n {{ secondaryActionText }}\n </a>\n </div>\n </ng-template>\n </div>\n </ng-template>\n </div>\n\n <ng-container *ngIf=\"!externalViewer\">\n <div *ngIf=\"configuredViewer !== 'pdf'\" class=\"inline-document-shell\">\n <div class=\"inline-document-page\" [innerHTML]=\"docHtml\"></div>\n </div>\n <object\n (load)=\"objectLoaded()\"\n *ngIf=\"fullUrl && configuredViewer === 'pdf'\"\n [data]=\"fullUrl\"\n type=\"application/pdf\"\n width=\"100%\"\n height=\"100%\"\n >\n <p>\n Your browser does not support PDFs.\n <a [href]=\"fullUrl\">Download the PDF</a>.\n </p>\n </object>\n </ng-container>\n\n <button\n *ngIf=\"configuredViewer === 'office' && renderPhase === 'ready'\"\n class=\"office-reload-btn\"\n type=\"button\"\n [attr.title]=\"officeReloadButtonTitle\"\n (click)=\"retryLoad()\"\n >\n <ng-container *ngIf=\"officeReloadTemplate; else defaultOfficeReloadTemplate\">\n <ng-container *ngTemplateOutlet=\"officeReloadTemplate; context: errorTemplateContext\"></ng-container>\n </ng-container>\n <ng-template #defaultOfficeReloadTemplate>{{ officeReloadButtonText }}</ng-template>\n </button>\n\n <ng-container *ngIf=\"externalViewer\">\n <iframe\n (load)=\"iframeLoaded()\"\n *ngIf=\"fullUrl && showIframe && disableContent === 'none'\"\n #iframe\n id=\"iframe-doc-viewer\"\n frameBorder=\"0\"\n allow=\"clipboard-read; clipboard-write\"\n [src]=\"fullUrl\"\n ></iframe>\n <div class=\"container\" *ngIf=\"disableContent !== 'none'\">\n <div\n [class.overlay-full]=\"disableContent === 'all'\"\n [class.overlay-popout-google]=\"\n configuredViewer === 'google' &&\n (disableContent === 'popout' || disableContent === 'popout-hide')\n \"\n [class.overlay-popout-office]=\"\n configuredViewer === 'office' &&\n (disableContent === 'popout' || disableContent === 'popout-hide')\n \"\n [style.background-color]=\"\n disableContent === 'popout-hide' ? '#fff' : 'transparent'\n \"\n ></div>\n <iframe\n (load)=\"iframeLoaded()\"\n *ngIf=\"fullUrl && showIframe\"\n #iframe\n id=\"iframe\"\n frameBorder=\"0\"\n allow=\"clipboard-read; clipboard-write\"\n [src]=\"fullUrl\"\n ></iframe>\n </div>\n </ng-container>\n</div>\n","import { NgxDocViewerComponent } from './document-viewer.component';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n imports: [CommonModule, NgxDocViewerComponent],\n exports: [NgxDocViewerComponent],\n})\nexport class NgxDocViewerModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-doc-viewer",
3
- "version": "21.0.1",
3
+ "version": "21.0.6",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "description": "Angular document viewer.",
@@ -25,7 +25,16 @@
25
25
  "@angular/platform-browser": ">= 15.0.0",
26
26
  "@angular/common": ">= 15.0.0"
27
27
  },
28
+ "main": "./fesm2022/ngx-doc-viewer.mjs",
29
+ "module": "./fesm2022/ngx-doc-viewer.mjs",
30
+ "types": "./types/ngx-doc-viewer.d.ts",
31
+ "exports": {
32
+ ".": {
33
+ "types": "./types/ngx-doc-viewer.d.ts",
34
+ "default": "./fesm2022/ngx-doc-viewer.mjs"
35
+ }
36
+ },
28
37
  "dependencies": {
29
- "docviewhelper": "0.1.1"
38
+ "docviewhelper": "0.1.6"
30
39
  }
31
40
  }
@@ -63,30 +63,19 @@ declare class NgxDocViewerComponent implements OnChanges, OnDestroy {
63
63
  errorTemplateContext: ViewerTemplateContext;
64
64
  private checkIFrameSubscription?;
65
65
  private loadVersion;
66
- private externalLoadTimeoutId?;
67
- private googleFinalRetryTimeoutId?;
68
- private googleFinalRetriedSourceKey?;
69
- private currentGoogleSourceKey?;
70
- private officeRetryTimeoutId?;
71
- private officeAutoRetriedSourceKey?;
72
- private currentOfficeSourceKey?;
66
+ private recovery?;
73
67
  private lastEmittedPhase?;
74
68
  constructor(domSanitizer: DomSanitizer, ngZone: NgZone, cdr: ChangeDetectorRef);
75
69
  ngOnDestroy(): void;
76
70
  ngOnChanges(changes: SimpleChanges): Promise<void>;
77
71
  retryLoad(): void;
78
72
  private reloadIframe;
79
- private scheduleViewerRecovery;
80
- private scheduleGoogleRecovery;
73
+ private ensureRecovery;
74
+ private buildRecoveryConfig;
75
+ private scheduleGoogleProbe;
81
76
  iframeLoaded(): void;
82
77
  objectLoaded(): void;
83
78
  private reloadMammoth;
84
- private scheduleExternalLoadTimeout;
85
- private clearExternalLoadTimeout;
86
- private clearGoogleFinalRetry;
87
- private clearOfficeRetry;
88
- private scheduleOfficeRetry;
89
- private scheduleGoogleFinalRetry;
90
79
  get displayedErrorText(): string;
91
80
  private updateTemplateContexts;
92
81
  private createTemplateContext;