@sumaris-net/ngx-components 18.6.11 → 18.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/doc/changelog.md +3 -0
  2. package/esm2022/public_api.mjs +1 -2
  3. package/esm2022/src/app/admin/services/validator/person.validator.mjs +1 -1
  4. package/esm2022/src/app/core/account/account.page.mjs +18 -20
  5. package/esm2022/src/app/core/form/properties/properties.table.mjs +28 -32
  6. package/esm2022/src/app/core/form/properties/properties.utils.mjs +14 -1
  7. package/esm2022/src/app/core/home/home.mjs +1 -3
  8. package/esm2022/src/app/core/services/account.service.mjs +22 -7
  9. package/esm2022/src/app/core/services/local-settings.service.mjs +9 -2
  10. package/esm2022/src/app/core/services/model/account.model.mjs +32 -13
  11. package/esm2022/src/app/core/services/model/entity.model.mjs +1 -1
  12. package/esm2022/src/app/core/services/platform.service.mjs +4 -3
  13. package/esm2022/src/app/core/services/validator/base.validator.class.mjs +3 -3
  14. package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +1 -1
  15. package/esm2022/src/app/core/table/entities-table-datasource.class.mjs +1 -1
  16. package/esm2022/src/app/shared/markdown/markdown.component.mjs +81 -55
  17. package/esm2022/src/app/shared/markdown/markdown.modal.mjs +10 -17
  18. package/esm2022/src/app/shared/markdown/markdown.service.mjs +3 -4
  19. package/esm2022/src/app/shared/markdown/markdown.utils.mjs +1 -8
  20. package/esm2022/src/app/shared/markdown/testing/markdown.test.mjs +7 -16
  21. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +1 -1
  22. package/esm2022/src/app/shared/named-filter/named-filter.model.mjs +1 -1
  23. package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +3 -3
  24. package/esm2022/src/app/social/user-event/user-event.model.mjs +1 -1
  25. package/fesm2022/sumaris-net.ngx-components.mjs +214 -408
  26. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  27. package/package.json +1 -1
  28. package/public_api.d.ts +0 -1
  29. package/src/app/admin/services/validator/person.validator.d.ts +1 -1
  30. package/src/app/core/account/account.page.d.ts +2 -0
  31. package/src/app/core/form/properties/properties.table.d.ts +4 -10
  32. package/src/app/core/form/properties/properties.utils.d.ts +4 -0
  33. package/src/app/core/services/account.service.d.ts +2 -0
  34. package/src/app/core/services/local-settings.service.d.ts +1 -0
  35. package/src/app/core/services/model/account.model.d.ts +17 -2
  36. package/src/app/core/services/model/entity.model.d.ts +2 -2
  37. package/src/app/core/services/validator/base.validator.class.d.ts +5 -5
  38. package/src/app/core/table/entities-async-table-datasource.class.d.ts +2 -2
  39. package/src/app/core/table/entities-table-datasource.class.d.ts +2 -2
  40. package/src/app/shared/inputs.d.ts +1 -1
  41. package/src/app/shared/markdown/markdown.component.d.ts +7 -12
  42. package/src/app/shared/markdown/markdown.modal.d.ts +2 -9
  43. package/src/app/shared/markdown/markdown.utils.d.ts +0 -1
  44. package/src/app/shared/markdown/testing/markdown.test.d.ts +1 -4
  45. package/src/app/shared/named-filter/named-filter-selector.component.d.ts +3 -1
  46. package/src/app/shared/named-filter/named-filter.model.d.ts +2 -2
  47. package/src/app/social/user-event/user-event.model.d.ts +2 -2
  48. package/src/assets/i18n/en-US.json +2 -3
  49. package/src/assets/i18n/en.json +1 -2
  50. package/src/assets/i18n/fr.json +1 -2
  51. package/src/assets/manifest.json +1 -1
  52. package/esm2022/src/app/shared/print/print.service.mjs +0 -254
  53. package/src/app/shared/print/print.service.d.ts +0 -60
@@ -1,254 +0,0 @@
1
- import { Toasts } from '../toast/toasts';
2
- import { Inject, Injectable } from '@angular/core';
3
- import { DOCUMENT } from '@angular/common';
4
- import { isNil } from '../functions';
5
- import { waitForTrue } from '../observables';
6
- import { mergeMap, timer } from 'rxjs';
7
- import { isChrome } from '../platforms';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "@ionic/angular";
10
- import * as i2 from "@ngx-translate/core";
11
- import * as i3 from "../storage/storage.service";
12
- export const PRINT_LOADING_STORAGE_KEY_PREFIX = 'print-loading-';
13
- export class PrintService {
14
- toastController;
15
- translate;
16
- storage;
17
- document;
18
- printId = 0;
19
- constructor(toastController, translate, storage, document) {
20
- this.toastController = toastController;
21
- this.translate = translate;
22
- this.storage = storage;
23
- this.document = document;
24
- }
25
- nextJobId() {
26
- return ++this.printId;
27
- }
28
- async printElement(element, opts) {
29
- if (!element)
30
- throw new Error("Missing required 'element' argument");
31
- return this.printHTML(element.innerHTML, opts);
32
- }
33
- async printHTML(html, opts) {
34
- if (!html)
35
- throw new Error("Missing required 'html' argument");
36
- // Create iframe
37
- const iframe = this.createPrintIframeByHtml(html, opts);
38
- return this.printIframe(iframe, opts);
39
- }
40
- async printUrl(url, opts) {
41
- if (!url)
42
- throw new Error("Missing required 'url' argument");
43
- // Create iframe
44
- const iframe = this.createPrintIframeByUrl(url);
45
- return this.printIframe(iframe, opts);
46
- }
47
- async printIframe(iframe, opts) {
48
- if (!iframe)
49
- throw new Error("Missing required 'iframe' argument");
50
- const printId = opts?.id ?? this.printId++;
51
- const toastId = `printing-${printId}`;
52
- const showLoadingToast = opts?.showToast !== false;
53
- if (showLoadingToast)
54
- await this.showToast({
55
- id: toastId,
56
- message: opts?.toastMessage || 'COMMON.PLEASE_WAIT',
57
- duration: 0,
58
- });
59
- try {
60
- // Wait end of iframe load
61
- await this.waitIdle(iframe, { id: printId });
62
- // Print (and wait end of print)
63
- await this.print(iframe);
64
- }
65
- catch (err) {
66
- console.error('[print-service] Failed to create hidden iframe', err);
67
- }
68
- finally {
69
- iframe.remove();
70
- if (showLoadingToast)
71
- await this.toastController.dismiss(null, null, toastId);
72
- }
73
- }
74
- async markAsLoading(id) {
75
- console.debug(`[print-service] Mark print job #${id} as loading`);
76
- await this.storage.set(PRINT_LOADING_STORAGE_KEY_PREFIX + id, '1');
77
- }
78
- async markAsLoaded(id) {
79
- console.debug(`[print-service] Mark print job #${id} as loaded`);
80
- await this.storage.remove(PRINT_LOADING_STORAGE_KEY_PREFIX + id);
81
- }
82
- async isLoaded(id) {
83
- const result = await this.storage.get(PRINT_LOADING_STORAGE_KEY_PREFIX + id);
84
- return isNil(result);
85
- }
86
- async isLoading(id) {
87
- return !(await this.isLoaded(id));
88
- }
89
- /* -- protected functions -- */
90
- createPrintIframeByUrl(url) {
91
- // Create a iframe with '?print-pdf'
92
- const iframe = this.document.createElement('iframe');
93
- iframe.classList.add('cdk-visually-hidden');
94
- iframe.style.width = '100%';
95
- iframe.style.height = '100%';
96
- this.document.body.appendChild(iframe);
97
- iframe.src = url;
98
- return iframe;
99
- }
100
- createPrintIframeByHtml(html, opts) {
101
- if (!html)
102
- throw new Error("Missing required 'html' argument");
103
- const lang = this.document.documentElement?.lang || 'en';
104
- // Create an empty iframe
105
- const iframe = this.document.createElement('iframe');
106
- iframe.classList.add('cdk-visually-hidden');
107
- iframe.style.width = '100%';
108
- iframe.style.height = '100%';
109
- this.document.body.appendChild(iframe);
110
- // Write iframe content
111
- const iframeDocument = iframe.contentDocument || iframe.contentWindow?.document;
112
- if (iframeDocument) {
113
- iframeDocument.open();
114
- iframeDocument.write(`
115
- <!DOCTYPE html>
116
- <html lang="${lang}" class="print-pdf">
117
- <head>
118
- <title>${opts?.title || ''}</title>
119
- <style>
120
- @media print {
121
- body {
122
- font-family: 'Roboto', Helvetica, Arial, sans-serif;
123
- margin: 0;
124
- padding: 0;
125
- overflow: hidden;
126
- }
127
- img {
128
- max-width: 100%;
129
- height: auto;
130
- page-break-inside: avoid;
131
- }
132
- }
133
- ${opts?.inlineStyle || ''}
134
- </style>
135
- </head>
136
- <body>
137
- ${html}
138
- </body>
139
- </html>
140
- `);
141
- iframeDocument.close();
142
- }
143
- // Set iframe style
144
- // FIXME - Ignore style injection, because it failed in Firefox (e.g. on user manual) and Chrome (e.g. in privacy policy)
145
- // Nothing appear in the print dialog
146
- //this.applyDocumentStyleToIframe(iframe);
147
- return iframe;
148
- }
149
- /**
150
- * Applies the styles from the provided document, including external stylesheets and inline styles,
151
- * to the specified iframe's document.
152
- *
153
- * @param {HTMLIFrameElement} iframe - The iframe to which the styles are applied.
154
- * @return {void} Does not return a value.
155
- */
156
- applyDocumentStyleToIframe(iframe) {
157
- const iframeDocument = iframe.contentDocument || iframe.contentWindow?.document;
158
- if (iframeDocument) {
159
- // Récupérer tous les styles (liens CSS)
160
- const links = Array.from(this.document.querySelectorAll('style,link[rel="stylesheet"]'));
161
- links.forEach((element) => {
162
- // Insert inline style
163
- if (element.tagName === 'STYLE') {
164
- const newStyle = iframeDocument.createElement('style');
165
- newStyle.innerHTML = element.innerHTML;
166
- iframeDocument.head.appendChild(newStyle);
167
- console.debug('[print-service] Add style to iframe', newStyle);
168
- }
169
- // Insert link to stylesheet file
170
- else if (element.tagName === 'LINK' && element.getAttribute('href')) {
171
- const newLink = iframeDocument.createElement('link');
172
- newLink.rel = 'stylesheet';
173
- newLink.href = element.getAttribute('href');
174
- iframeDocument.head.appendChild(newLink);
175
- console.debug('[print-service] Add stylesheet to iframe: ', newLink.href);
176
- }
177
- });
178
- }
179
- }
180
- async waitIdle(iframe, opts) {
181
- // Wait job finished
182
- const printId = opts?.id || this.printId;
183
- await waitForTrue(timer(500, 500).pipe(mergeMap(() => this.isLoaded(printId))), { timeout: opts?.timeout });
184
- // Wait end of iframe load
185
- await new Promise((resolve, reject) => {
186
- const iframeWindow = iframe.contentWindow?.window || iframe.contentWindow;
187
- if (iframeWindow.document.readyState === 'complete') {
188
- resolve();
189
- }
190
- else {
191
- // Stop if timeout reached
192
- if (opts?.timeout > 0) {
193
- setTimeout(() => reject('timeout'), opts.timeout);
194
- }
195
- const readyListener = () => {
196
- if (iframeWindow.document.readyState === 'complete') {
197
- resolve();
198
- iframeWindow.document.removeEventListener('readystatechange', readyListener);
199
- }
200
- };
201
- iframeWindow.document.addEventListener('readystatechange', readyListener);
202
- }
203
- });
204
- }
205
- /**
206
- * Triggers the print functionality of the given iframe and resolves or rejects based on the print completion or timeout.
207
- *
208
- * @param {HTMLIFrameElement} iframe - The iframe element to be printed.
209
- * @param {{timeout?: number}} [opts] - An optional configuration object.
210
- * @param {number} [opts.timeout] - The maximum time in milliseconds to wait for the print to complete before rejecting the promise.
211
- * @return {Promise<void>} A promise that resolves after the print is completed or rejects if a timeout occurs.
212
- */
213
- print(iframe, opts) {
214
- return new Promise((resolve, reject) => {
215
- const iframeWindow = iframe.contentWindow?.window || iframe.contentWindow;
216
- // Stop if timeout reached
217
- if (opts?.timeout > 0) {
218
- setTimeout(() => reject('timeout'), opts.timeout);
219
- }
220
- // On Chrome
221
- if (isChrome(window)) {
222
- // Wait after print event, to resolve the promise
223
- const afterPrintListener = () => {
224
- console.debug('[print-service] After print');
225
- resolve();
226
- // Remove the listener
227
- iframeWindow.removeEventListener('afterprint', afterPrintListener);
228
- };
229
- iframeWindow.addEventListener('afterprint', afterPrintListener);
230
- iframe.contentWindow.window.print();
231
- }
232
- // Otherwise (e.g. Firefox)
233
- else {
234
- iframe.contentWindow.window.print();
235
- resolve();
236
- }
237
- });
238
- }
239
- async showToast(opts) {
240
- if (!this.toastController)
241
- throw new Error("Missing toastController in component's constructor");
242
- return await Toasts.show(this.toastController, this.translate, opts);
243
- }
244
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PrintService, deps: [{ token: i1.ToastController }, { token: i2.TranslateService }, { token: i3.StorageService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
245
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PrintService, providedIn: 'root' });
246
- }
247
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PrintService, decorators: [{
248
- type: Injectable,
249
- args: [{ providedIn: 'root' }]
250
- }], ctorParameters: () => [{ type: i1.ToastController }, { type: i2.TranslateService }, { type: i3.StorageService }, { type: Document, decorators: [{
251
- type: Inject,
252
- args: [DOCUMENT]
253
- }] }] });
254
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL3ByaW50L3ByaW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQixNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUkzRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7Ozs7QUFVeEMsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsZ0JBQWdCLENBQUM7QUFHakUsTUFBTSxPQUFPLFlBQVk7SUFJWDtJQUNBO0lBQ0E7SUFDa0I7SUFOdEIsT0FBTyxHQUFHLENBQUMsQ0FBQztJQUVwQixZQUNZLGVBQWdDLEVBQ2hDLFNBQTJCLEVBQzNCLE9BQXVCLEVBQ0wsUUFBa0I7UUFIcEMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBQ0wsYUFBUSxHQUFSLFFBQVEsQ0FBVTtJQUM3QyxDQUFDO0lBRUosU0FBUztRQUNQLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQW9CLEVBQUUsSUFBbUI7UUFDMUQsSUFBSSxDQUFDLE9BQU87WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxD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alFVLFlBQVksK0dBT2IsUUFBUTs0R0FQUCxZQUFZLGNBREMsTUFBTTs7NEZBQ25CLFlBQVk7a0JBRHhCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFRN0IsTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2hvd1RvYXN0T3B0aW9ucywgVG9hc3RzIH0gZnJvbSAnLi4vdG9hc3QvdG9hc3RzJztcbmltcG9ydCB7IE92ZXJsYXlFdmVudERldGFpbCB9IGZyb20gJ0Bpb25pYy9jb3JlJztcbmltcG9ydCB7IFRvYXN0Q29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi9zdG9yYWdlL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBpc05pbCB9IGZyb20gJy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyB3YWl0Rm9yVHJ1ZSB9IGZyb20gJy4uL29ic2VydmFibGVzJztcbmltcG9ydCB7IG1lcmdlTWFwLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgaXNDaHJvbWUgfSBmcm9tICcuLi9wbGF0Zm9ybXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByaW50T3B0aW9ucyB7XG4gIGlkPzogc3RyaW5nIHwgbnVtYmVyO1xuICB0aXRsZT86IHN0cmluZztcbiAgc2hvd1RvYXN0PzogYm9vbGVhbjtcbiAgdG9hc3RNZXNzYWdlPzogc3RyaW5nO1xuICBzdHlsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IFBSSU5UX0xPQURJTkdfU1RPUkFHRV9LRVlfUFJFRklYID0gJ3ByaW50LWxvYWRpbmctJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBQcmludFNlcnZpY2Uge1xuICBwcml2YXRlIHByaW50SWQgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCB0b2FzdENvbnRyb2xsZXI6IFRvYXN0Q29udHJvbGxlcixcbiAgICBwcm90ZWN0ZWQgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBzdG9yYWdlOiBTdG9yYWdlU2VydmljZSxcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcm90ZWN0ZWQgZG9jdW1lbnQ6IERvY3VtZW50XG4gICkge31cblxuICBuZXh0Sm9iSWQoKSB7XG4gICAgcmV0dXJuICsrdGhpcy5wcmludElkO1xuICB9XG5cbiAgYXN5bmMgcHJpbnRFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRzPzogUHJpbnRPcHRpb25zKSB7XG4gICAgaWYgKCFlbGVtZW50KSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIHJlcXVpcmVkICdlbGVtZW50JyBhcmd1bWVudFwiKTtcblxuICAgIHJldHVybiB0aGlzLnByaW50SFRNTChlbGVtZW50LmlubmVySFRNTCwgb3B0cyk7XG4gIH1cblxuICBhc3luYyBwcmludEhUTUwoaHRtbDogc3RyaW5nLCBvcHRzPzogUHJpbnRPcHRpb25zKSB7XG4gICAgaWYgKCFodG1sKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIHJlcXVpcmVkICdodG1sJyBhcmd1bWVudFwiKTtcblxuICAgIC8vIENyZWF0ZSBpZnJhbWVcbiAgICBjb25zdCBpZnJhbWUgPSB0aGlzLmNyZWF0ZVByaW50SWZyYW1lQnlIdG1sKGh0bWwsIG9wdHMpO1xuXG4gICAgcmV0dXJuIHRoaXMucHJpbnRJZnJhbWUoaWZyYW1lLCBvcHRzKTtcbiAgfVxuXG4gIGFzeW5jIHByaW50VXJsKHVybDogc3RyaW5nLCBvcHRzPzogT21pdDxQcmludE9wdGlvbnMsICdzdHlsZSc+KSB7XG4gICAgaWYgKCF1cmwpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgcmVxdWlyZWQgJ3VybCcgYXJndW1lbnRcIik7XG5cbiAgICAvLyBDcmVhdGUgaWZyYW1lXG4gICAgY29uc3QgaWZyYW1lID0gdGhpcy5jcmVhdGVQcmludElmcmFtZUJ5VXJsKHVybCk7XG5cbiAgICByZXR1cm4gdGhpcy5wcmludElmcmFtZShpZnJhbWUsIG9wdHMpO1xuICB9XG5cbiAgYXN5bmMgcHJpbnRJZnJhbWUoaWZyYW1lOiBIVE1MSUZyYW1lRWxlbWVudCwgb3B0cz86IFByaW50T3B0aW9ucykge1xuICAgIGlmICghaWZyYW1lKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIHJlcXVpcmVkICdpZnJhbWUnIGFyZ3VtZW50XCIpO1xuXG4gICAgY29uc3QgcHJpbnRJZCA9IG9wdHM/LmlkID8/IHRoaXMucHJpbnRJZCsrO1xuICAgIGNvbnN0IHRvYXN0SWQgPSBgcHJpbnRpbmctJHtwcmludElkfWA7XG4gICAgY29uc3Qgc2hvd0xvYWRpbmdUb2FzdCA9IG9wdHM/LnNob3dUb2FzdCAhPT0gZmFsc2U7XG4gICAgaWYgKHNob3dMb2FkaW5nVG9hc3QpXG4gICAgICBhd2FpdCB0aGlzLnNob3dUb2FzdCh7XG4gICAgICAgIGlkOiB0b2FzdElkLFxuICAgICAgICBtZXNzYWdlOiBvcHRzPy50b2FzdE1lc3NhZ2UgfHwgJ0NPTU1PTi5QTEVBU0VfV0FJVCcsXG4gICAgICAgIGR1cmF0aW9uOiAwLFxuICAgICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gV2FpdCBlbmQgb2YgaWZyYW1lIGxvYWRcbiAgICAgIGF3YWl0IHRoaXMud2FpdElkbGUoaWZyYW1lLCB7IGlkOiBwcmludElkIH0pO1xuXG4gICAgICAvLyBQcmludCAoYW5kIHdhaXQgZW5kIG9mIHByaW50KVxuICAgICAgYXdhaXQgdGhpcy5wcmludChpZnJhbWUpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignW3ByaW50LXNlcnZpY2VdIEZhaWxlZCB0byBjcmVhdGUgaGlkZGVuIGlmcmFtZScsIGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmcmFtZS5yZW1vdmUoKTtcbiAgICAgIGlmIChzaG93TG9hZGluZ1RvYXN0KSBhd2FpdCB0aGlzLnRvYXN0Q29udHJvbGxlci5kaXNtaXNzKG51bGwsIG51bGwsIHRvYXN0SWQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG1hcmtBc0xvYWRpbmcoaWQ6IHN0cmluZyB8IG51bWJlcikge1xuICAgIGNvbnNvbGUuZGVidWcoYFtwcmludC1zZXJ2aWNlXSBNYXJrIHByaW50IGpvYiAjJHtpZH0gYXMgbG9hZGluZ2ApO1xuICAgIGF3YWl0IHRoaXMuc3RvcmFnZS5zZXQoUFJJTlRfTE9BRElOR19TVE9SQUdFX0tFWV9QUkVGSVggKyBpZCwgJzEnKTtcbiAgfVxuXG4gIGFzeW5jIG1hcmtBc0xvYWRlZChpZDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgY29uc29sZS5kZWJ1ZyhgW3ByaW50LXNlcnZpY2VdIE1hcmsgcHJpbnQgam9iICMke2lkfSBhcyBsb2FkZWRgKTtcbiAgICBhd2FpdCB0aGlzLnN0b3JhZ2UucmVtb3ZlKFBSSU5UX0xPQURJTkdfU1RPUkFHRV9LRVlfUFJFRklYICsgaWQpO1xuICB9XG5cbiAgYXN5bmMgaXNMb2FkZWQoaWQ6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXQoUFJJTlRfTE9BRElOR19TVE9SQUdFX0tFWV9QUkVGSVggKyBpZCk7XG4gICAgcmV0dXJuIGlzTmlsKHJlc3VsdCk7XG4gIH1cblxuICBhc3luYyBpc0xvYWRpbmcoaWQ6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiAhKGF3YWl0IHRoaXMuaXNMb2FkZWQoaWQpKTtcbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBmdW5jdGlvbnMgLS0gKi9cblxuICBwcm90ZWN0ZWQgY3JlYXRlUHJpbnRJZnJhbWVCeVVybCh1cmw6IHN0cmluZyk6IEhUTUxJRnJhbWVFbGVtZW50IHtcbiAgICAvLyBDcmVhdGUgYSBpZnJhbWUgd2l0aCAnP3ByaW50LXBkZidcbiAgICBjb25zdCBpZnJhbWUgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgIGlmcmFtZS5jbGFzc0xpc3QuYWRkKCdjZGstdmlzdWFsbHktaGlkZGVuJyk7XG4gICAgaWZyYW1lLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG4gICAgdGhpcy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gICAgaWZyYW1lLnNyYyA9IHVybDtcbiAgICByZXR1cm4gaWZyYW1lO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVByaW50SWZyYW1lQnlIdG1sKGh0bWw6IHN0cmluZywgb3B0cz86IHsgdGl0bGU/OiBzdHJpbmc7IGlubGluZVN0eWxlPzogc3RyaW5nIH0pOiBIVE1MSUZyYW1lRWxlbWVudCB7XG4gICAgaWYgKCFodG1sKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIHJlcXVpcmVkICdodG1sJyBhcmd1bWVudFwiKTtcblxuICAgIGNvbnN0IGxhbmcgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudD8ubGFuZyB8fCAnZW4nO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGVtcHR5IGlmcmFtZVxuICAgIGNvbnN0IGlmcmFtZSA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgaWZyYW1lLmNsYXNzTGlzdC5hZGQoJ2Nkay12aXN1YWxseS1oaWRkZW4nKTtcbiAgICBpZnJhbWUuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgaWZyYW1lLnN0eWxlLmhlaWdodCA9ICcxMDAlJztcbiAgICB0aGlzLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcblxuICAgIC8vIFdyaXRlIGlmcmFtZSBjb250ZW50XG4gICAgY29uc3QgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudERvY3VtZW50IHx8IGlmcmFtZS5jb250ZW50V2luZG93Py5kb2N1bWVudDtcbiAgICBpZiAoaWZyYW1lRG9jdW1lbnQpIHtcbiAgICAgIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgICAgIGlmcmFtZURvY3VtZW50LndyaXRlKGBcbiAgICAgICAgPCFET0NUWVBFIGh0bWw+XG4gICAgICAgIDxodG1sIGxhbmc9XCIke2xhbmd9XCIgY2xhc3M9XCJwcmludC1wZGZcIj5cbiAgICAgICAgICA8aGVhZD5cbiAgICAgICAgICAgIDx0aXRsZT4ke29wdHM/LnRpdGxlIHx8ICcnfTwvdGl0bGU+XG4gICAgICAgICAgICA8c3R5bGU+XG4gICAgICAgICAgICBAbWVkaWEgcHJpbnQge1xuICAgICAgICAgICAgICBib2R5IHtcbiAgICAgICAgICAgICAgICBmb250LWZhbWlseTogJ1JvYm90bycsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gICAgICAgICAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICAgICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpbWcge1xuICAgICAgICAgICAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGF1dG87XG4gICAgICAgICAgICAgICAgcGFnZS1icmVhay1pbnNpZGU6IGF2b2lkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAke29wdHM/LmlubGluZVN0eWxlIHx8ICcnfVxuICAgICAgICAgIDwvc3R5bGU+XG4gICAgICAgICAgPC9oZWFkPlxuICAgICAgICAgIDxib2R5PlxuICAgICAgICAgICAgJHtodG1sfVxuICAgICAgICAgIDwvYm9keT5cbiAgICAgICAgPC9odG1sPlxuICAgICAgYCk7XG4gICAgICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICAgIH1cblxuICAgIC8vIFNldCBpZnJhbWUgc3R5bGVcbiAgICAvLyBGSVhNRSAtIElnbm9yZSBzdHlsZSBpbmplY3Rpb24sIGJlY2F1c2UgaXQgZmFpbGVkIGluIEZpcmVmb3ggKGUuZy4gb24gdXNlciBtYW51YWwpIGFuZCBDaHJvbWUgKGUuZy4gaW4gcHJpdmFjeSBwb2xpY3kpXG4gICAgLy8gICAgICAgICBOb3RoaW5nIGFwcGVhciBpbiB0aGUgcHJpbnQgZGlhbG9nXG4gICAgLy90aGlzLmFwcGx5RG9jdW1lbnRTdHlsZVRvSWZyYW1lKGlmcmFtZSk7XG5cbiAgICByZXR1cm4gaWZyYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhlIHN0eWxlcyBmcm9tIHRoZSBwcm92aWRlZCBkb2N1bWVudCwgaW5jbHVkaW5nIGV4dGVybmFsIHN0eWxlc2hlZXRzIGFuZCBpbmxpbmUgc3R5bGVzLFxuICAgKiB0byB0aGUgc3BlY2lmaWVkIGlmcmFtZSdzIGRvY3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge0hUTUxJRnJhbWVFbGVtZW50fSBpZnJhbWUgLSBUaGUgaWZyYW1lIHRvIHdoaWNoIHRoZSBzdHlsZXMgYXJlIGFwcGxpZWQuXG4gICAqIEByZXR1cm4ge3ZvaWR9IERvZXMgbm90IHJldHVybiBhIHZhbHVlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFwcGx5RG9jdW1lbnRTdHlsZVRvSWZyYW1lKGlmcmFtZTogSFRNTElGcmFtZUVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQgfHwgaWZyYW1lLmNvbnRlbnRXaW5kb3c/LmRvY3VtZW50O1xuICAgIGlmIChpZnJhbWVEb2N1bWVudCkge1xuICAgICAgLy8gUsOpY3Vww6lyZXIgdG91cyBsZXMgc3R5bGVzIChsaWVucyBDU1MpXG4gICAgICBjb25zdCBsaW5rcyA9IEFycmF5LmZyb20odGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzdHlsZSxsaW5rW3JlbD1cInN0eWxlc2hlZXRcIl0nKSk7XG4gICAgICBsaW5rcy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgIC8vIEluc2VydCBpbmxpbmUgc3R5bGVcbiAgICAgICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ1NUWUxFJykge1xuICAgICAgICAgIGNvbnN0IG5ld1N0eWxlID0gaWZyYW1lRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICBuZXdTdHlsZS5pbm5lckhUTUwgPSBlbGVtZW50LmlubmVySFRNTDtcbiAgICAgICAgICBpZnJhbWVEb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKG5ld1N0eWxlKTtcblxuICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1twcmludC1zZXJ2aWNlXSBBZGQgc3R5bGUgdG8gaWZyYW1lJywgbmV3U3R5bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5zZXJ0IGxpbmsgdG8gc3R5bGVzaGVldCBmaWxlXG4gICAgICAgIGVsc2UgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0xJTksnICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdocmVmJykpIHtcbiAgICAgICAgICBjb25zdCBuZXdMaW5rID0gaWZyYW1lRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICAgIG5ld0xpbmsucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgICAgICAgIG5ld0xpbmsuaHJlZiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG4gICAgICAgICAgaWZyYW1lRG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChuZXdMaW5rKTtcblxuICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1twcmludC1zZXJ2aWNlXSBBZGQgc3R5bGVzaGVldCB0byBpZnJhbWU6ICcsIG5ld0xpbmsuaHJlZik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyB3YWl0SWRsZShpZnJhbWU6IEhUTUxJRnJhbWVFbGVtZW50LCBvcHRzPzogeyBpZD86IG51bWJlciB8IHN0cmluZzsgdGltZW91dD86IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gV2FpdCBqb2IgZmluaXNoZWRcbiAgICBjb25zdCBwcmludElkID0gb3B0cz8uaWQgfHwgdGhpcy5wcmludElkO1xuICAgIGF3YWl0IHdhaXRGb3JUcnVlKHRpbWVyKDUwMCwgNTAwKS5waXBlKG1lcmdlTWFwKCgpID0+IHRoaXMuaXNMb2FkZWQocHJpbnRJZCkpKSwgeyB0aW1lb3V0OiBvcHRzPy50aW1lb3V0IH0pO1xuXG4gICAgLy8gV2FpdCBlbmQgb2YgaWZyYW1lIGxvYWRcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBpZnJhbWVXaW5kb3cgPSBpZnJhbWUuY29udGVudFdpbmRvdz8ud2luZG93IHx8IGlmcmFtZS5jb250ZW50V2luZG93O1xuICAgICAgaWYgKGlmcmFtZVdpbmRvdy5kb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFN0b3AgaWYgdGltZW91dCByZWFjaGVkXG4gICAgICAgIGlmIChvcHRzPy50aW1lb3V0ID4gMCkge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KCd0aW1lb3V0JyksIG9wdHMudGltZW91dCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWFkeUxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICAgIGlmIChpZnJhbWVXaW5kb3cuZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuXG4gICAgICAgICAgICBpZnJhbWVXaW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVhZHlzdGF0ZWNoYW5nZScsIHJlYWR5TGlzdGVuZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWZyYW1lV2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3JlYWR5c3RhdGVjaGFuZ2UnLCByZWFkeUxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyB0aGUgcHJpbnQgZnVuY3Rpb25hbGl0eSBvZiB0aGUgZ2l2ZW4gaWZyYW1lIGFuZCByZXNvbHZlcyBvciByZWplY3RzIGJhc2VkIG9uIHRoZSBwcmludCBjb21wbGV0aW9uIG9yIHRpbWVvdXQuXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTElGcmFtZUVsZW1lbnR9IGlmcmFtZSAtIFRoZSBpZnJhbWUgZWxlbWVudCB0byBiZSBwcmludGVkLlxuICAgKiBAcGFyYW0ge3t0aW1lb3V0PzogbnVtYmVyfX0gW29wdHNdIC0gQW4gb3B0aW9uYWwgY29uZmlndXJhdGlvbiBvYmplY3QuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy50aW1lb3V0XSAtIFRoZSBtYXhpbXVtIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIHRoZSBwcmludCB0byBjb21wbGV0ZSBiZWZvcmUgcmVqZWN0aW5nIHRoZSBwcm9taXNlLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgcHJpbnQgaXMgY29tcGxldGVkIG9yIHJlamVjdHMgaWYgYSB0aW1lb3V0IG9jY3Vycy5cbiAgICovXG4gIHByb3RlY3RlZCBwcmludChpZnJhbWU6IEhUTUxJRnJhbWVFbGVtZW50LCBvcHRzPzogeyB0aW1lb3V0PzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgaWZyYW1lV2luZG93ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3c/LndpbmRvdyB8fCBpZnJhbWUuY29udGVudFdpbmRvdztcblxuICAgICAgLy8gU3RvcCBpZiB0aW1lb3V0IHJlYWNoZWRcbiAgICAgIGlmIChvcHRzPy50aW1lb3V0ID4gMCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHJlamVjdCgndGltZW91dCcpLCBvcHRzLnRpbWVvdXQpO1xuICAgICAgfVxuXG4gICAgICAvLyBPbiBDaHJvbWVcbiAgICAgIGlmIChpc0Nocm9tZSh3aW5kb3cpKSB7XG4gICAgICAgIC8vIFdhaXQgYWZ0ZXIgcHJpbnQgZXZlbnQsIHRvIHJlc29sdmUgdGhlIHByb21pc2VcbiAgICAgICAgY29uc3QgYWZ0ZXJQcmludExpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1twcmludC1zZXJ2aWNlXSBBZnRlciBwcmludCcpO1xuXG4gICAgICAgICAgcmVzb2x2ZSgpO1xuXG4gICAgICAgICAgLy8gUmVtb3ZlIHRoZSBsaXN0ZW5lclxuICAgICAgICAgIGlmcmFtZVdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdhZnRlcnByaW50JywgYWZ0ZXJQcmludExpc3RlbmVyKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWZyYW1lV2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2FmdGVycHJpbnQnLCBhZnRlclByaW50TGlzdGVuZXIpO1xuICAgICAgICBpZnJhbWUuY29udGVudFdpbmRvdy53aW5kb3cucHJpbnQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gT3RoZXJ3aXNlIChlLmcuIEZpcmVmb3gpXG4gICAgICBlbHNlIHtcbiAgICAgICAgaWZyYW1lLmNvbnRlbnRXaW5kb3cud2luZG93LnByaW50KCk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2hvd1RvYXN0PFQgPSBhbnk+KG9wdHM6IFNob3dUb2FzdE9wdGlvbnMpOiBQcm9taXNlPE92ZXJsYXlFdmVudERldGFpbDxUPj4ge1xuICAgIGlmICghdGhpcy50b2FzdENvbnRyb2xsZXIpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgdG9hc3RDb250cm9sbGVyIGluIGNvbXBvbmVudCdzIGNvbnN0cnVjdG9yXCIpO1xuICAgIHJldHVybiBhd2FpdCBUb2FzdHMuc2hvdyh0aGlzLnRvYXN0Q29udHJvbGxlciwgdGhpcy50cmFuc2xhdGUsIG9wdHMpO1xuICB9XG59XG4iXX0=
@@ -1,60 +0,0 @@
1
- import { ToastController } from '@ionic/angular';
2
- import { TranslateService } from '@ngx-translate/core';
3
- import { StorageService } from '../storage/storage.service';
4
- import * as i0 from "@angular/core";
5
- export interface PrintOptions {
6
- id?: string | number;
7
- title?: string;
8
- showToast?: boolean;
9
- toastMessage?: string;
10
- style?: string;
11
- }
12
- export declare const PRINT_LOADING_STORAGE_KEY_PREFIX = "print-loading-";
13
- export declare class PrintService {
14
- protected toastController: ToastController;
15
- protected translate: TranslateService;
16
- protected storage: StorageService;
17
- protected document: Document;
18
- private printId;
19
- constructor(toastController: ToastController, translate: TranslateService, storage: StorageService, document: Document);
20
- nextJobId(): number;
21
- printElement(element: HTMLElement, opts?: PrintOptions): Promise<void>;
22
- printHTML(html: string, opts?: PrintOptions): Promise<void>;
23
- printUrl(url: string, opts?: Omit<PrintOptions, 'style'>): Promise<void>;
24
- printIframe(iframe: HTMLIFrameElement, opts?: PrintOptions): Promise<void>;
25
- markAsLoading(id: string | number): Promise<void>;
26
- markAsLoaded(id: string | number): Promise<void>;
27
- isLoaded(id: string | number): Promise<boolean>;
28
- isLoading(id: string | number): Promise<boolean>;
29
- protected createPrintIframeByUrl(url: string): HTMLIFrameElement;
30
- protected createPrintIframeByHtml(html: string, opts?: {
31
- title?: string;
32
- inlineStyle?: string;
33
- }): HTMLIFrameElement;
34
- /**
35
- * Applies the styles from the provided document, including external stylesheets and inline styles,
36
- * to the specified iframe's document.
37
- *
38
- * @param {HTMLIFrameElement} iframe - The iframe to which the styles are applied.
39
- * @return {void} Does not return a value.
40
- */
41
- protected applyDocumentStyleToIframe(iframe: HTMLIFrameElement): void;
42
- protected waitIdle(iframe: HTMLIFrameElement, opts?: {
43
- id?: number | string;
44
- timeout?: number;
45
- }): Promise<void>;
46
- /**
47
- * Triggers the print functionality of the given iframe and resolves or rejects based on the print completion or timeout.
48
- *
49
- * @param {HTMLIFrameElement} iframe - The iframe element to be printed.
50
- * @param {{timeout?: number}} [opts] - An optional configuration object.
51
- * @param {number} [opts.timeout] - The maximum time in milliseconds to wait for the print to complete before rejecting the promise.
52
- * @return {Promise<void>} A promise that resolves after the print is completed or rejects if a timeout occurs.
53
- */
54
- protected print(iframe: HTMLIFrameElement, opts?: {
55
- timeout?: number;
56
- }): Promise<void>;
57
- private showToast;
58
- static ɵfac: i0.ɵɵFactoryDeclaration<PrintService, never>;
59
- static ɵprov: i0.ɵɵInjectableDeclaration<PrintService>;
60
- }