ngx-print 1.4.0 → 1.5.1

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.md CHANGED
@@ -9,6 +9,7 @@ This directive makes printing your HTML sections smooth and easy in your Angular
9
9
  | 1.2.1 | 7.0.0 - 14.1.0 |
10
10
  | 1.3.x | 15.0.0 |
11
11
  | 1.4.x | 16.0.0 |
12
+ | 1.5.x | 17.0.0 |
12
13
  ## Setup
13
14
 
14
15
  **1-** In your root application folder run:
@@ -186,9 +187,60 @@ Here some simple styles were added to every `h1` & `h2` tags within the `div` wh
186
187
  ngxPrint>print</button>
187
188
 
188
189
  ```
190
+
191
+ - To print in a new tab rather than a new window set the property `openNewTab` to true. By default `openNewTab` is false and ngxPrint will open a new print window.
192
+
193
+ ```html
194
+ <button
195
+ [openNewTab]="true"
196
+ ngxPrint>print</button>
197
+ ```
198
+
199
+ ## Using NgxPrint as a service (v1.5+)
200
+ Inject the NgxPrintService in the constructor of your component or service:
201
+
202
+ ```typescript
203
+ constructor(private printService: NgxPrintService) { }
204
+ ```
205
+
206
+ ### Printing a Section
207
+ ```typescript
208
+ import { PrintOptions } from './path-to-your/print-options.model';
209
+
210
+ printMe() {
211
+ const customPrintOptions: PrintOptions = new PrintOptions({
212
+ printSectionId: 'print-section',
213
+ // Add any other print options as needed
214
+ });
215
+ this.printService.print(customPrintOptions)
216
+ }
217
+ ```
218
+
219
+ ### Print Options Object
220
+ The print options object allows you to specify how the print job should be handled. All of which have default values that you can optionally override, although printSectionId is required. It contains the following properties:
221
+ ```typescript
222
+ printSectionId: string = null;
223
+ printTitle: string = null;
224
+ useExistingCss: boolean = false;
225
+ bodyClass: string = '';
226
+ openNewTab: boolean = false;
227
+ previewOnly: boolean = false;
228
+ closeWindow: boolean = true;
229
+ printDelay: number = 0;
230
+ ```
231
+
232
+ ### Setting PrintStyles or StyleSheets
233
+ ```typescript
234
+ // Optional property for css as a key-value pair
235
+ this.printService.printStyle = styleSheet;
236
+
237
+ // Optional property for a css file location
238
+ this.printService.styleSheetFile = fileLocation;
239
+ ```
240
+
189
241
  ## Contributors :1st_place_medal:
190
242
 
191
- Huge thanks to: [deeplotia](https://github.com/deeplotia) , [Ben L](https://github.com/broem) , [Gavyn McKenzie](https://github.com/gavmck) , [silenceway](https://github.com/silenceway), [Muhammad Ahsan Ayaz](https://github.com/AhsanAyaz) and to all `ngx-print` users
243
+ Huge thanks to: [deeplotia](https://github.com/deeplotia) , [Ben L](https://github.com/broem) , [Gavyn McKenzie](https://github.com/gavmck) , [silenceway](https://github.com/silenceway), [Muhammad Ahsan Ayaz](https://github.com/AhsanAyaz), [Core121](https://github.com/Core121) and to all `ngx-print` users
192
244
 
193
245
  ## Donation
194
246
 
@@ -0,0 +1,229 @@
1
+ import { Injectable } from "@angular/core";
2
+ import * as i0 from "@angular/core";
3
+ export class PrintBase {
4
+ _printStyle = [];
5
+ _styleSheetFile = '';
6
+ //#region Getters and Setters
7
+ /**
8
+ * Sets the print styles based on the provided values.
9
+ *
10
+ * @param {Object} values - Key-value pairs representing print styles.
11
+ * @protected
12
+ */
13
+ setPrintStyle(values) {
14
+ this._printStyle = [];
15
+ for (let key in values) {
16
+ if (values.hasOwnProperty(key)) {
17
+ this._printStyle.push((key + JSON.stringify(values[key])).replace(/['"]+/g, ''));
18
+ }
19
+ }
20
+ }
21
+ /**
22
+ *
23
+ *
24
+ * @returns the string that create the stylesheet which will be injected
25
+ * later within <style></style> tag.
26
+ *
27
+ * -join/replace to transform an array objects to css-styled string
28
+ */
29
+ returnStyleValues() {
30
+ return `<style> ${this._printStyle.join(' ').replace(/,/g, ';')} </style>`;
31
+ }
32
+ /**
33
+ * @returns string which contains the link tags containing the css which will
34
+ * be injected later within <head></head> tag.
35
+ *
36
+ */
37
+ returnStyleSheetLinkTags() {
38
+ return this._styleSheetFile;
39
+ }
40
+ /**
41
+ * Sets the style sheet file based on the provided CSS list.
42
+ *
43
+ * @param {string} cssList - CSS file or list of CSS files.
44
+ * @protected
45
+ */
46
+ setStyleSheetFile(cssList) {
47
+ let linkTagFn = function (cssFileName) {
48
+ return `<link rel="stylesheet" type="text/css" href="${cssFileName}">`;
49
+ };
50
+ if (cssList.indexOf(',') !== -1) {
51
+ const valueArr = cssList.split(',');
52
+ this._styleSheetFile = valueArr.map(val => linkTagFn(val)).join('');
53
+ }
54
+ else {
55
+ this._styleSheetFile = linkTagFn(cssList);
56
+ }
57
+ }
58
+ //#endregion
59
+ //#region Private methods used by PrintBase
60
+ /**
61
+ * Updates the default values for input elements.
62
+ *
63
+ * @param {HTMLCollectionOf<HTMLInputElement>} elements - Collection of input elements.
64
+ * @private
65
+ */
66
+ updateInputDefaults(elements) {
67
+ for (let i = 0; i < elements.length; i++) {
68
+ const element = elements[i];
69
+ element['defaultValue'] = element.value;
70
+ if (element['checked'])
71
+ element['defaultChecked'] = true;
72
+ }
73
+ }
74
+ /**
75
+ * Updates the default values for select elements.
76
+ *
77
+ * @param {HTMLCollectionOf<HTMLSelectElement>} elements - Collection of select elements.
78
+ * @private
79
+ */
80
+ updateSelectDefaults(elements) {
81
+ for (let i = 0; i < elements.length; i++) {
82
+ const element = elements[i];
83
+ const selectedIdx = element.selectedIndex;
84
+ const selectedOption = element.options[selectedIdx];
85
+ selectedOption.defaultSelected = true;
86
+ }
87
+ }
88
+ /**
89
+ * Updates the default values for textarea elements.
90
+ *
91
+ * @param {HTMLCollectionOf<HTMLTextAreaElement>} elements - Collection of textarea elements.
92
+ * @private
93
+ */
94
+ updateTextAreaDefaults(elements) {
95
+ for (let i = 0; i < elements.length; i++) {
96
+ const element = elements[i];
97
+ element['defaultValue'] = element.value;
98
+ }
99
+ }
100
+ /**
101
+ * Converts a canvas element to an image and returns its HTML string.
102
+ *
103
+ * @param {HTMLCanvasElement} element - The canvas element to convert.
104
+ * @returns {string} - HTML string of the image.
105
+ * @private
106
+ */
107
+ canvasToImageHtml(element) {
108
+ const dataUrl = element.toDataURL();
109
+ return `<img src="${dataUrl}" style="max-width: 100%;">`;
110
+ }
111
+ /**
112
+ * Includes canvas contents in the print section via img tags.
113
+ *
114
+ * @param {HTMLCollectionOf<HTMLCanvasElement>} elements - Collection of canvas elements.
115
+ * @private
116
+ */
117
+ updateCanvasToImage(elements) {
118
+ for (let i = 0; i < elements.length; i++) {
119
+ const element = this.canvasToImageHtml(elements[i]);
120
+ elements[i].insertAdjacentHTML('afterend', element);
121
+ elements[i].remove();
122
+ }
123
+ }
124
+ /**
125
+ * Retrieves the HTML content of a specified printing section.
126
+ *
127
+ * @param {string} printSectionId - Id of the printing section.
128
+ * @returns {string | null} - HTML content of the printing section, or null if not found.
129
+ * @private
130
+ */
131
+ getHtmlContents(printSectionId) {
132
+ const printContents = document.getElementById(printSectionId);
133
+ if (!printContents)
134
+ return null;
135
+ const inputEls = printContents.getElementsByTagName('input');
136
+ const selectEls = printContents.getElementsByTagName('select');
137
+ const textAreaEls = printContents.getElementsByTagName('textarea');
138
+ const canvasEls = printContents.getElementsByTagName('canvas');
139
+ this.updateInputDefaults(inputEls);
140
+ this.updateSelectDefaults(selectEls);
141
+ this.updateTextAreaDefaults(textAreaEls);
142
+ this.updateCanvasToImage(canvasEls);
143
+ return printContents.innerHTML;
144
+ }
145
+ /**
146
+ * Retrieves the HTML content of elements with the specified tag.
147
+ *
148
+ * @param {keyof HTMLElementTagNameMap} tag - HTML tag name.
149
+ * @returns {string} - Concatenated outerHTML of elements with the specified tag.
150
+ * @private
151
+ */
152
+ getElementTag(tag) {
153
+ const html = [];
154
+ const elements = document.getElementsByTagName(tag);
155
+ for (let index = 0; index < elements.length; index++) {
156
+ html.push(elements[index].outerHTML);
157
+ }
158
+ return html.join('\r\n');
159
+ }
160
+ //#endregion
161
+ /**
162
+ * Prints the specified content using the provided print options.
163
+ *
164
+ * @param {PrintOptions} printOptions - Options for printing.
165
+ * @public
166
+ */
167
+ print(printOptions) {
168
+ let styles = '', links = '', popOut = 'top=0,left=0,height=auto,width=auto';
169
+ const baseTag = this.getElementTag('base');
170
+ if (printOptions.useExistingCss) {
171
+ styles = this.getElementTag('style');
172
+ links = this.getElementTag('link');
173
+ }
174
+ // If the openNewTab option is set to true, then set the popOut option to an empty string.
175
+ // This will cause the print dialog to open in a new tab.
176
+ if (printOptions.openNewTab) {
177
+ popOut = '';
178
+ }
179
+ const printContents = this.getHtmlContents(printOptions.printSectionId);
180
+ if (!printContents) {
181
+ // Handle the case where the specified print section is not found.
182
+ console.error(`Print section with id ${printOptions.printSectionId} not found.`);
183
+ return;
184
+ }
185
+ const popupWin = window.open("", "_blank", popOut);
186
+ if (!popupWin) {
187
+ // the popup window could not be opened.
188
+ console.error('Could not open print window.');
189
+ return;
190
+ }
191
+ popupWin.document.open();
192
+ popupWin.document.write(`
193
+ <html>
194
+ <head>
195
+ <title>${printOptions.printTitle ? printOptions.printTitle : ""}</title>
196
+ ${baseTag}
197
+ ${this.returnStyleValues()}
198
+ ${this.returnStyleSheetLinkTags()}
199
+ ${styles}
200
+ ${links}
201
+ </head>
202
+ <body ${printOptions.bodyClass ? `class="${printOptions.bodyClass}"` : ''}>
203
+ ${printContents}
204
+ <script defer>
205
+ function triggerPrint(event) {
206
+ window.removeEventListener('load', triggerPrint, false);
207
+ ${printOptions.previewOnly ? '' : `setTimeout(function() {
208
+ closeWindow(window.print());
209
+ }, ${printOptions.printDelay});`}
210
+ }
211
+ function closeWindow(){
212
+ ${printOptions.closeWindow ? 'window.close();' : ''}
213
+ }
214
+ window.addEventListener('load', triggerPrint, false);
215
+ </script>
216
+ </body>
217
+ </html>`);
218
+ popupWin.document.close();
219
+ }
220
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: PrintBase, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
221
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: PrintBase, providedIn: 'root' });
222
+ }
223
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: PrintBase, decorators: [{
224
+ type: Injectable,
225
+ args: [{
226
+ providedIn: 'root'
227
+ }]
228
+ }] });
229
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXByaW50LmJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL25neC1wcmludC5iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBTTNDLE1BQU0sT0FBTyxTQUFTO0lBRVYsV0FBVyxHQUFhLEVBQUUsQ0FBQztJQUMzQixlQUFlLEdBQVcsRUFBRSxDQUFDO0lBRXJDLDZCQUE2QjtJQUM3Qjs7Ozs7T0FLRztJQUNPLGFBQWEsQ0FBQyxNQUFvRDtRQUN4RSxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixLQUFLLElBQUksR0FBRyxJQUFJLE1BQU0sRUFBRTtZQUNwQixJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDcEY7U0FDSjtJQUNMLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksaUJBQWlCO1FBQ3BCLE9BQU8sV0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUM7SUFDL0UsQ0FBQztJQUVEOzs7O0tBSUM7SUFDTyx3QkFBd0I7UUFDNUIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLGlCQUFpQixDQUFDLE9BQWU7UUFDdkMsSUFBSSxTQUFTLEdBQUcsVUFBVSxXQUFXO1lBQ2pDLE9BQU8sZ0RBQWdELFdBQVcsSUFBSSxDQUFDO1FBQzNFLENBQUMsQ0FB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QUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDckUsYUFBYTs7OztvQkFJVCxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOzt1QkFFN0IsWUFBWSxDQUFDLFVBQVUsSUFBSTs7O29CQUc5QixZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRTs7Ozs7a0JBS25ELENBQUMsQ0FBQztRQUNaLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDOUIsQ0FBQzt1R0FqUFEsU0FBUzsyR0FBVCxTQUFTLGNBRk4sTUFBTTs7MkZBRVQsU0FBUztrQkFIckIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgUHJpbnRPcHRpb25zIH0gZnJvbSBcIi4vcHJpbnQtb3B0aW9uc1wiO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQcmludEJhc2Uge1xyXG5cclxuICAgIHByaXZhdGUgX3ByaW50U3R5bGU6IHN0cmluZ1tdID0gW107XHJcbiAgICBwcml2YXRlIF9zdHlsZVNoZWV0RmlsZTogc3RyaW5nID0gJyc7XHJcblxyXG4gICAgLy8jcmVnaW9uIEdldHRlcnMgYW5kIFNldHRlcnNcclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgcHJpbnQgc3R5bGVzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCB2YWx1ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlcyAtIEtleS12YWx1ZSBwYWlycyByZXByZXNlbnRpbmcgcHJpbnQgc3R5bGVzLlxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgc2V0UHJpbnRTdHlsZSh2YWx1ZXM6IHsgW2tleTogc3RyaW5nXTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB9KSB7XHJcbiAgICAgICAgdGhpcy5fcHJpbnRTdHlsZSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGtleSBpbiB2YWx1ZXMpIHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wcmludFN0eWxlLnB1c2goKGtleSArIEpTT04uc3RyaW5naWZ5KHZhbHVlc1trZXldKSkucmVwbGFjZSgvWydcIl0rL2csICcnKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHRoZSBzdHJpbmcgdGhhdCBjcmVhdGUgdGhlIHN0eWxlc2hlZXQgd2hpY2ggd2lsbCBiZSBpbmplY3RlZFxyXG4gICAgICogbGF0ZXIgd2l0aGluIDxzdHlsZT48L3N0eWxlPiB0YWcuXHJcbiAgICAgKlxyXG4gICAgICogLWpvaW4vcmVwbGFjZSB0byB0cmFuc2Zvcm0gYW4gYXJyYXkgb2JqZWN0cyB0byBjc3Mtc3R5bGVkIHN0cmluZ1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmV0dXJuU3R5bGVWYWx1ZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIGA8c3R5bGU+ICR7dGhpcy5fcHJpbnRTdHlsZS5qb2luKCcgJykucmVwbGFjZSgvLC9nLCAnOycpfSA8L3N0eWxlPmA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICogQHJldHVybnMgc3RyaW5nIHdoaWNoIGNvbnRhaW5zIHRoZSBsaW5rIHRhZ3MgY29udGFpbmluZyB0aGUgY3NzIHdoaWNoIHdpbGxcclxuICAgKiBiZSBpbmplY3RlZCBsYXRlciB3aXRoaW4gPGhlYWQ+PC9oZWFkPiB0YWcuXHJcbiAgICpcclxuICAgKi9cclxuICAgIHByaXZhdGUgcmV0dXJuU3R5bGVTaGVldExpbmtUYWdzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdHlsZVNoZWV0RmlsZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHN0eWxlIHNoZWV0IGZpbGUgYmFzZWQgb24gdGhlIHByb3ZpZGVkIENTUyBsaXN0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjc3NMaXN0IC0gQ1NTIGZpbGUgb3IgbGlzdCBvZiBDU1MgZmlsZXMuXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBzZXRTdHlsZVNoZWV0RmlsZShjc3NMaXN0OiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgbGlua1RhZ0ZuID0gZnVuY3Rpb24gKGNzc0ZpbGVOYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBgPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiIGhyZWY9XCIke2Nzc0ZpbGVOYW1lfVwiPmA7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKGNzc0xpc3QuaW5kZXhPZignLCcpICE9PSAtMSkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZUFyciA9IGNzc0xpc3Quc3BsaXQoJywnKTtcclxuICAgICAgICAgICAgdGhpcy5fc3R5bGVTaGVldEZpbGUgPSB2YWx1ZUFyci5tYXAodmFsID0+IGxpbmtUYWdGbih2YWwpKS5qb2luKCcnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9zdHlsZVNoZWV0RmlsZSA9IGxpbmtUYWdGbihjc3NMaXN0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFByaXZhdGUgbWV0aG9kcyB1c2VkIGJ5IFByaW50QmFzZVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIGlucHV0IGVsZW1lbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7SFRNTENvbGxlY3Rpb25PZjxIVE1MSW5wdXRFbGVtZW50Pn0gZWxlbWVudHMgLSBDb2xsZWN0aW9uIG9mIGlucHV0IGVsZW1lbnRzLlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVJbnB1dERlZmF1bHRzKGVsZW1lbnRzOiBIVE1MQ29sbGVjdGlvbk9mPEhUTUxJbnB1dEVsZW1lbnQ+KTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZWxlbWVudHNbaV07XHJcbiAgICAgICAgICAgIGVsZW1lbnRbJ2RlZmF1bHRWYWx1ZSddID0gZWxlbWVudC52YWx1ZTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnRbJ2NoZWNrZWQnXSkgZWxlbWVudFsnZGVmYXVsdENoZWNrZWQnXSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHNlbGVjdCBlbGVtZW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxDb2xsZWN0aW9uT2Y8SFRNTFNlbGVjdEVsZW1lbnQ+fSBlbGVtZW50cyAtIENvbGxlY3Rpb24gb2Ygc2VsZWN0IGVsZW1lbnRzLlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVTZWxlY3REZWZhdWx0cyhlbGVtZW50czogSFRNTENvbGxlY3Rpb25PZjxIVE1MU2VsZWN0RWxlbWVudD4pOiB2b2lkIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJZHggPSBlbGVtZW50LnNlbGVjdGVkSW5kZXg7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uOiBIVE1MT3B0aW9uRWxlbWVudCA9IGVsZW1lbnQub3B0aW9uc1tzZWxlY3RlZElkeF07XHJcblxyXG4gICAgICAgICAgICBzZWxlY3RlZE9wdGlvbi5kZWZhdWx0U2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0ZXh0YXJlYSBlbGVtZW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxDb2xsZWN0aW9uT2Y8SFRNTFRleHRBcmVhRWxlbWVudD59IGVsZW1lbnRzIC0gQ29sbGVjdGlvbiBvZiB0ZXh0YXJlYSBlbGVtZW50cy5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlVGV4dEFyZWFEZWZhdWx0cyhlbGVtZW50czogSFRNTENvbGxlY3Rpb25PZjxIVE1MVGV4dEFyZWFFbGVtZW50Pik6IHZvaWQge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBlbGVtZW50WydkZWZhdWx0VmFsdWUnXSA9IGVsZW1lbnQudmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydHMgYSBjYW52YXMgZWxlbWVudCB0byBhbiBpbWFnZSBhbmQgcmV0dXJucyBpdHMgSFRNTCBzdHJpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtIVE1MQ2FudmFzRWxlbWVudH0gZWxlbWVudCAtIFRoZSBjYW52YXMgZWxlbWVudCB0byBjb252ZXJ0LlxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gLSBIVE1MIHN0cmluZyBvZiB0aGUgaW1hZ2UuXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNhbnZhc1RvSW1hZ2VIdG1sKGVsZW1lbnQ6IEhUTUxDYW52YXNFbGVtZW50KTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBkYXRhVXJsID0gZWxlbWVudC50b0RhdGFVUkwoKTtcclxuICAgICAgICByZXR1cm4gYDxpbWcgc3JjPVwiJHtkYXRhVXJsfVwiIHN0eWxlPVwibWF4LXdpZHRoOiAxMDAlO1wiPmA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmNsdWRlcyBjYW52YXMgY29udGVudHMgaW4gdGhlIHByaW50IHNlY3Rpb24gdmlhIGltZyB0YWdzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7SFRNTENvbGxlY3Rpb25PZjxIVE1MQ2FudmFzRWxlbWVudD59IGVsZW1lbnRzIC0gQ29sbGVjdGlvbiBvZiBjYW52YXMgZWxlbWVudHMuXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZUNhbnZhc1RvSW1hZ2UoZWxlbWVudHM6IEhUTUxDb2xsZWN0aW9uT2Y8SFRNTENhbnZhc0VsZW1lbnQ+KTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5jYW52YXNUb0ltYWdlSHRtbChlbGVtZW50c1tpXSk7XHJcbiAgICAgICAgICAgIGVsZW1lbnRzW2ldLmluc2VydEFkamFjZW50SFRNTCgnYWZ0ZXJlbmQnLCBlbGVtZW50KTtcclxuICAgICAgICAgICAgZWxlbWVudHNbaV0ucmVtb3ZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSBIVE1MIGNvbnRlbnQgb2YgYSBzcGVjaWZpZWQgcHJpbnRpbmcgc2VjdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJpbnRTZWN0aW9uSWQgLSBJZCBvZiB0aGUgcHJpbnRpbmcgc2VjdGlvbi5cclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfSAtIEhUTUwgY29udGVudCBvZiB0aGUgcHJpbnRpbmcgc2VjdGlvbiwgb3IgbnVsbCBpZiBub3QgZm91bmQuXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldEh0bWxDb250ZW50cyhwcmludFNlY3Rpb25JZDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgcHJpbnRDb250ZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHByaW50U2VjdGlvbklkKTtcclxuICAgICAgICBpZiAoIXByaW50Q29udGVudHMpIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgICBjb25zdCBpbnB1dEVscyA9IHByaW50Q29udGVudHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0Jyk7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0RWxzID0gcHJpbnRDb250ZW50cy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2VsZWN0Jyk7XHJcbiAgICAgICAgY29uc3QgdGV4dEFyZWFFbHMgPSBwcmludENvbnRlbnRzLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0ZXh0YXJlYScpO1xyXG4gICAgICAgIGNvbnN0IGNhbnZhc0VscyA9IHByaW50Q29udGVudHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2NhbnZhcycpO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZUlucHV0RGVmYXVsdHMoaW5wdXRFbHMpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2VsZWN0RGVmYXVsdHMoc2VsZWN0RWxzKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVRleHRBcmVhRGVmYXVsdHModGV4dEFyZWFFbHMpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ2FudmFzVG9JbWFnZShjYW52YXNFbHMpO1xyXG5cclxuICAgICAgICByZXR1cm4gcHJpbnRDb250ZW50cy5pbm5lckhUTUw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIEhUTUwgY29udGVudCBvZiBlbGVtZW50cyB3aXRoIHRoZSBzcGVjaWZpZWQgdGFnLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7a2V5b2YgSFRNTEVsZW1lbnRUYWdOYW1lTWFwfSB0YWcgLSBIVE1MIHRhZyBuYW1lLlxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gLSBDb25jYXRlbmF0ZWQgb3V0ZXJIVE1MIG9mIGVsZW1lbnRzIHdpdGggdGhlIHNwZWNpZmllZCB0YWcuXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldEVsZW1lbnRUYWcodGFnOiBrZXlvZiBIVE1MRWxlbWVudFRhZ05hbWVNYXApOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGh0bWw6IHN0cmluZ1tdID0gW107XHJcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWcpO1xyXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBlbGVtZW50cy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgICAgaHRtbC5wdXNoKGVsZW1lbnRzW2luZGV4XS5vdXRlckhUTUwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaHRtbC5qb2luKCdcXHJcXG4nKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByaW50cyB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgdXNpbmcgdGhlIHByb3ZpZGVkIHByaW50IG9wdGlvbnMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQcmludE9wdGlvbnN9IHByaW50T3B0aW9ucyAtIE9wdGlvbnMgZm9yIHByaW50aW5nLlxyXG4gICAgICogQHB1YmxpY1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgcHJpbnQocHJpbnRPcHRpb25zOiBQcmludE9wdGlvbnMpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgbGV0IHN0eWxlcyA9ICcnLCBsaW5rcyA9ICcnLCBwb3BPdXQgPSAndG9wPTAsbGVmdD0wLGhlaWdodD1hdXRvLHdpZHRoPWF1dG8nO1xyXG4gICAgICAgIGNvbnN0IGJhc2VUYWcgPSB0aGlzLmdldEVsZW1lbnRUYWcoJ2Jhc2UnKTtcclxuXHJcbiAgICAgICAgaWYgKHByaW50T3B0aW9ucy51c2VFeGlzdGluZ0Nzcykge1xyXG4gICAgICAgICAgICBzdHlsZXMgPSB0aGlzLmdldEVsZW1lbnRUYWcoJ3N0eWxlJyk7XHJcbiAgICAgICAgICAgIGxpbmtzID0gdGhpcy5nZXRFbGVtZW50VGFnKCdsaW5rJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiB0aGUgb3Blbk5ld1RhYiBvcHRpb24gaXMgc2V0IHRvIHRydWUsIHRoZW4gc2V0IHRoZSBwb3BPdXQgb3B0aW9uIHRvIGFuIGVtcHR5IHN0cmluZy4gXHJcbiAgICAgICAgLy8gVGhpcyB3aWxsIGNhdXNlIHRoZSBwcmludCBkaWFsb2cgdG8gb3BlbiBpbiBhIG5ldyB0YWIuXHJcbiAgICAgICAgaWYgKHByaW50T3B0aW9ucy5vcGVuTmV3VGFiKSB7XHJcbiAgICAgICAgICAgIHBvcE91dCA9ICcnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcHJpbnRDb250ZW50cyA9IHRoaXMuZ2V0SHRtbENvbnRlbnRzKHByaW50T3B0aW9ucy5wcmludFNlY3Rpb25JZCk7XHJcbiAgICAgICAgaWYgKCFwcmludENvbnRlbnRzKSB7XHJcbiAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgc3BlY2lmaWVkIHByaW50IHNlY3Rpb24gaXMgbm90IGZvdW5kLlxyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBQcmludCBzZWN0aW9uIHdpdGggaWQgJHtwcmludE9wdGlvbnMucHJpbnRTZWN0aW9uSWR9IG5vdCBmb3VuZC5gKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcG9wdXBXaW4gPSB3aW5kb3cub3BlbihcIlwiLCBcIl9ibGFua1wiLCBwb3BPdXQpO1xyXG5cclxuICAgICAgICBpZiAoIXBvcHVwV2luKSB7XHJcbiAgICAgICAgICAgIC8vIHRoZSBwb3B1cCB3aW5kb3cgY291bGQgbm90IGJlIG9wZW5lZC5cclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ291bGQgbm90IG9wZW4gcHJpbnQgd2luZG93LicpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwb3B1cFdpbi5kb2N1bWVudC5vcGVuKCk7XHJcbiAgICAgICAgcG9wdXBXaW4uZG9jdW1lbnQud3JpdGUoYFxyXG4gICAgICAgICAgPGh0bWw+XHJcbiAgICAgICAgICAgIDxoZWFkPlxyXG4gICAgICAgICAgICAgIDx0aXRsZT4ke3ByaW50T3B0aW9ucy5wcmludFRpdGxlID8gcHJpbnRPcHRpb25zLnByaW50VGl0bGUgOiBcIlwifTwvdGl0bGU+XHJcbiAgICAgICAgICAgICAgJHtiYXNlVGFnfVxyXG4gICAgICAgICAgICAgICR7dGhpcy5yZXR1cm5TdHlsZVZhbHVlcygpfVxyXG4gICAgICAgICAgICAgICR7dGhpcy5yZXR1cm5TdHlsZVNoZWV0TGlua1RhZ3MoKX1cclxuICAgICAgICAgICAgICAke3N0eWxlc31cclxuICAgICAgICAgICAgICAke2xpbmtzfVxyXG4gICAgICAgICAgICA8L2hlYWQ+XHJcbiAgICAgICAgICAgIDxib2R5ICR7cHJpbnRPcHRpb25zLmJvZHlDbGFzcyA/IGBjbGFzcz1cIiR7cHJpbnRPcHRpb25zLmJvZHlDbGFzc31cImAgOiAnJ30+XHJcbiAgICAgICAgICAgICAgJHtwcmludENvbnRlbnRzfVxyXG4gICAgICAgICAgICAgIDxzY3JpcHQgZGVmZXI+XHJcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiB0cmlnZ2VyUHJpbnQoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWQnLCB0cmlnZ2VyUHJpbnQsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgJHtwcmludE9wdGlvbnMucHJldmlld09ubHkgPyAnJyA6IGBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlV2luZG93KHdpbmRvdy5wcmludCgpKTtcclxuICAgICAgICAgICAgICAgICAgfSwgJHtwcmludE9wdGlvbnMucHJpbnREZWxheX0pO2B9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjbG9zZVdpbmRvdygpe1xyXG4gICAgICAgICAgICAgICAgICAke3ByaW50T3B0aW9ucy5jbG9zZVdpbmRvdyA/ICd3aW5kb3cuY2xvc2UoKTsnIDogJyd9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHRyaWdnZXJQcmludCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgIDwvc2NyaXB0PlxyXG4gICAgICAgICAgICA8L2JvZHk+XHJcbiAgICAgICAgICA8L2h0bWw+YCk7XHJcbiAgICAgICAgcG9wdXBXaW4uZG9jdW1lbnQuY2xvc2UoKTtcclxuICAgIH1cclxufVxyXG4iXX0=
@@ -1,163 +1,84 @@
1
1
  import { Directive, HostListener, Input } from '@angular/core';
2
+ import { PrintBase } from './ngx-print.base';
3
+ import { PrintOptions } from './print-options';
2
4
  import * as i0 from "@angular/core";
3
- export class NgxPrintDirective {
4
- _printStyle = [];
5
+ export class NgxPrintDirective extends PrintBase {
6
+ printOptions = new PrintOptions();
5
7
  /**
6
8
  * Prevents the print dialog from opening on the window
7
9
  *
8
10
  * @memberof NgxPrintDirective
9
11
  */
10
- previewOnly = false;
12
+ set previewOnly(value) {
13
+ this.printOptions = { ...this.printOptions, previewOnly: value };
14
+ }
11
15
  /**
12
16
  *
13
17
  *
14
18
  * @memberof NgxPrintDirective
15
19
  */
16
- printSectionId;
20
+ set printSectionId(value) {
21
+ this.printOptions = { ...this.printOptions, printSectionId: value };
22
+ }
17
23
  /**
18
24
  *
19
25
  *
20
26
  * @memberof NgxPrintDirective
21
27
  */
22
- printTitle;
28
+ set printTitle(value) {
29
+ this.printOptions = { ...this.printOptions, printTitle: value };
30
+ }
23
31
  /**
24
32
  *
25
33
  *
26
34
  * @memberof NgxPrintDirective
27
35
  */
28
- useExistingCss = false;
36
+ set useExistingCss(value) {
37
+ this.printOptions = { ...this.printOptions, useExistingCss: value };
38
+ }
29
39
  /**
30
40
  * A delay in milliseconds to force the print dialog to wait before opened. Default: 0
31
41
  *
32
42
  * @memberof NgxPrintDirective
33
43
  */
34
- printDelay = 0;
44
+ set printDelay(value) {
45
+ this.printOptions = { ...this.printOptions, printDelay: value };
46
+ }
35
47
  /**
36
48
  * Whether to close the window after print() returns.
37
49
  *
38
50
  */
39
- closeWindow = true;
51
+ set closeWindow(value) {
52
+ this.printOptions = { ...this.printOptions, closeWindow: value };
53
+ }
40
54
  /**
41
55
  * Class attribute to apply to the body element.
42
56
  *
43
57
  */
44
- bodyClass = '';
45
- /**
46
- *
47
- *
48
- * @memberof NgxPrintDirective
49
- */
50
- set printStyle(values) {
51
- for (let key in values) {
52
- if (values.hasOwnProperty(key)) {
53
- this._printStyle.push((key + JSON.stringify(values[key])).replace(/['"]+/g, ''));
54
- }
55
- }
56
- this.returnStyleValues();
58
+ set bodyClass(value) {
59
+ this.printOptions = { ...this.printOptions, bodyClass: value };
57
60
  }
58
61
  /**
62
+ * Whether to open a new window or default to new window.
59
63
  *
60
- *
61
- * @returns the string that create the stylesheet which will be injected
62
- * later within <style></style> tag.
63
- *
64
- * -join/replace to transform an array objects to css-styled string
65
- *
66
- * @memberof NgxPrintDirective
67
64
  */
68
- returnStyleValues() {
69
- return `<style> ${this._printStyle.join(' ').replace(/,/g, ';')} </style>`;
65
+ set openNewTab(value) {
66
+ this.printOptions = { ...this.printOptions, openNewTab: value };
70
67
  }
71
68
  /**
72
69
  *
73
70
  *
74
- * @returns html for the given tag
75
- *
76
71
  * @memberof NgxPrintDirective
77
72
  */
78
- _styleSheetFile = '';
73
+ set printStyle(values) {
74
+ super.setPrintStyle(values);
75
+ }
79
76
  /**
80
77
  * @memberof NgxPrintDirective
81
78
  * @param cssList
82
79
  */
83
80
  set styleSheetFile(cssList) {
84
- let linkTagFn = function (cssFileName) {
85
- return `<link rel="stylesheet" type="text/css" href="${cssFileName}">`;
86
- };
87
- if (cssList.indexOf(',') !== -1) {
88
- const valueArr = cssList.split(',');
89
- for (let val of valueArr) {
90
- this._styleSheetFile = this._styleSheetFile + linkTagFn(val);
91
- }
92
- }
93
- else {
94
- this._styleSheetFile = linkTagFn(cssList);
95
- }
96
- }
97
- /**
98
- * @returns string which contains the link tags containing the css which will
99
- * be injected later within <head></head> tag.
100
- *
101
- */
102
- returnStyleSheetLinkTags() {
103
- return this._styleSheetFile;
104
- }
105
- getElementTag(tag) {
106
- const html = [];
107
- const elements = document.getElementsByTagName(tag);
108
- for (let index = 0; index < elements.length; index++) {
109
- html.push(elements[index].outerHTML);
110
- }
111
- return html.join('\r\n');
112
- }
113
- /**
114
- *
115
- * @description When printing, the default option of form elements are printed.
116
- * Here we update what that default is to print the current values.
117
- *
118
- * @param elements the html element collection to save defaults to
119
- *
120
- */
121
- updateInputDefaults(elements) {
122
- for (let i = 0; i < elements.length; i++) {
123
- const element = elements[i];
124
- element['defaultValue'] = element.value;
125
- if (element['checked'])
126
- element['defaultChecked'] = true;
127
- }
128
- }
129
- updateSelectDefaults(elements) {
130
- for (let i = 0; i < elements.length; i++) {
131
- const element = elements[i];
132
- const selectedIdx = element.selectedIndex;
133
- const selectedOption = element.options[selectedIdx];
134
- selectedOption.defaultSelected = true;
135
- }
136
- }
137
- updateTextAreaDefaults(elements) {
138
- for (let i = 0; i < elements.length; i++) {
139
- const element = elements[i];
140
- element['defaultValue'] = element.value;
141
- }
142
- }
143
- /**
144
- * @description Retrieves the html contents of the print section id.
145
- * Updates the html elements to default their form values to the current form values
146
- *
147
- * @returns {string | null} html section to be printed
148
- *
149
- */
150
- getHtmlContents() {
151
- const printContents = document.getElementById(this.printSectionId);
152
- if (!printContents)
153
- return null;
154
- const inputEls = printContents.getElementsByTagName('input');
155
- const selectEls = printContents.getElementsByTagName('select');
156
- const textAreaEls = printContents.getElementsByTagName('textarea');
157
- this.updateInputDefaults(inputEls);
158
- this.updateSelectDefaults(selectEls);
159
- this.updateTextAreaDefaults(textAreaEls);
160
- return printContents.innerHTML;
81
+ super.setStyleSheetFile(cssList);
161
82
  }
162
83
  /**
163
84
  *
@@ -165,47 +86,12 @@ export class NgxPrintDirective {
165
86
  * @memberof NgxPrintDirective
166
87
  */
167
88
  print() {
168
- let printContents, popupWin, styles = '', links = '';
169
- const baseTag = this.getElementTag('base');
170
- if (this.useExistingCss) {
171
- styles = this.getElementTag('style');
172
- links = this.getElementTag('link');
173
- }
174
- printContents = this.getHtmlContents();
175
- popupWin = window.open("", "_blank", "top=0,left=0,height=auto,width=auto");
176
- popupWin.document.open();
177
- popupWin.document.write(`
178
- <html>
179
- <head>
180
- <title>${this.printTitle ? this.printTitle : ""}</title>
181
- ${baseTag}
182
- ${this.returnStyleValues()}
183
- ${this.returnStyleSheetLinkTags()}
184
- ${styles}
185
- ${links}
186
- </head>
187
- <body ${this.bodyClass ? `class="${this.bodyClass}"` : ''}>
188
- ${printContents}
189
- <script defer>
190
- function triggerPrint(event) {
191
- window.removeEventListener('load', triggerPrint, false);
192
- ${this.previewOnly || !this.closeWindow ? '' : `setTimeout(function() {
193
- closeWindow(window.print());
194
- }, ${this.printDelay});`}
195
- }
196
- function closeWindow(){
197
- window.close();
198
- }
199
- window.addEventListener('load', triggerPrint, false);
200
- </script>
201
- </body>
202
- </html>`);
203
- popupWin.document.close();
89
+ super.print(this.printOptions);
204
90
  }
205
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgxPrintDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
206
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: NgxPrintDirective, isStandalone: true, selector: "button[ngxPrint]", inputs: { previewOnly: "previewOnly", printSectionId: "printSectionId", printTitle: "printTitle", useExistingCss: "useExistingCss", printDelay: "printDelay", closeWindow: "closeWindow", bodyClass: "bodyClass", printStyle: "printStyle", styleSheetFile: "styleSheetFile" }, host: { listeners: { "click": "print()" } }, ngImport: i0 });
91
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: NgxPrintDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
92
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.4", type: NgxPrintDirective, isStandalone: true, selector: "button[ngxPrint]", inputs: { previewOnly: "previewOnly", printSectionId: "printSectionId", printTitle: "printTitle", useExistingCss: "useExistingCss", printDelay: "printDelay", closeWindow: "closeWindow", bodyClass: "bodyClass", openNewTab: "openNewTab", printStyle: "printStyle", styleSheetFile: "styleSheetFile" }, host: { listeners: { "click": "print()" } }, usesInheritance: true, ngImport: i0 });
207
93
  }
208
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgxPrintDirective, decorators: [{
94
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: NgxPrintDirective, decorators: [{
209
95
  type: Directive,
210
96
  args: [{
211
97
  selector: "button[ngxPrint]",
@@ -225,6 +111,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
225
111
  type: Input
226
112
  }], bodyClass: [{
227
113
  type: Input
114
+ }], openNewTab: [{
115
+ type: Input
228
116
  }], printStyle: [{
229
117
  type: Input
230
118
  }], styleSheetFile: [{
@@ -233,4 +121,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
233
121
  type: HostListener,
234
122
  args: ['click']
235
123
  }] } });
236
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXByaW50LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbmd4LXByaW50LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSy9ELE1BQU0sT0FBTyxpQkFBaUI7SUFFckIsV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUV4Qjs7OztPQUlHO0lBQ00sV0FBVyxHQUFZLEtBQUssQ0FBQztJQUV0Qzs7OztPQUlHO0lBQ00sY0FBYyxDQUFTO0lBRWhDOzs7O09BSUc7SUFDTSxVQUFVLENBQVM7SUFFNUI7Ozs7T0FJRztJQUNNLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFFaEM7Ozs7T0FJRztJQUNNLFVBQVUsR0FBVyxDQUFDLENBQUM7SUFFaEM7OztPQUdHO0lBQ00sV0FBVyxHQUFZLElBQUksQ0FBQztJQUVyQzs7O09BR0c7SUFDTSxTQUFTLEdBQVcsRUFBRSxDQUFDO0lBRWhDOzs7O09BSUc7SUFDSCxJQUNJLFVBQVUsQ0FBQyxNQUFvRDtRQUNqRSxLQUFLLElBQUksR0FBRyxJQUFJLE1BQU0sRUFBRTtZQUN0QixJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDbEY7U0FDRjtRQUNELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSSxpQkFBaUI7UUFDdEIsT0FBTyxXQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFD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QUdULElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDN0MsT0FBTztZQUNQLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUN4QixJQUFJLENBQUMsd0JBQXdCLEVBQUU7WUFDL0IsTUFBTTtZQUNOLEtBQUs7O2dCQUVELElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3JELGFBQWE7Ozs7Z0JBSVQsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7O21CQUUxQyxJQUFJLENBQUMsVUFBVSxJQUFJOzs7Ozs7OztjQVF4QixDQUFDLENBQUM7UUFDWixRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzVCLENBQUM7d0dBL05VLGlCQUFpQjs0RkFBakIsaUJBQWlCOzs0RkFBakIsaUJBQWlCO2tCQUo3QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs4QkFVVSxXQUFXO3NCQUFuQixLQUFLO2dCQU9HLGNBQWM7c0JBQXRCLEtBQUs7Z0JBT0csVUFBVTtzQkFBbEIsS0FBSztnQkFPRyxjQUFjO3NCQUF0QixLQUFLO2dCQU9HLFVBQVU7c0JBQWxCLEtBQUs7Z0JBTUcsV0FBVztzQkFBbkIsS0FBSztnQkFNRyxTQUFTO3NCQUFqQixLQUFLO2dCQVFGLFVBQVU7c0JBRGIsS0FBSztnQkFzQ0YsY0FBYztzQkFEakIsS0FBSztnQkEyRkMsS0FBSztzQkFEWCxZQUFZO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6IFwiYnV0dG9uW25neFByaW50XVwiLFxyXG4gIHN0YW5kYWxvbmU6IHRydWVcclxufSlcclxuZXhwb3J0IGNsYXNzIE5neFByaW50RGlyZWN0aXZlIHtcclxuXHJcbiAgcHVibGljIF9wcmludFN0eWxlID0gW107XHJcblxyXG4gIC8qKlxyXG4gICAqIFByZXZlbnRzIHRoZSBwcmludCBkaWFsb2cgZnJvbSBvcGVuaW5nIG9uIHRoZSB3aW5kb3dcclxuICAgKlxyXG4gICAqIEBtZW1iZXJvZiBOZ3hQcmludERpcmVjdGl2ZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHByZXZpZXdPbmx5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICpcclxuICAgKiBAbWVtYmVyb2YgTmd4UHJpbnREaXJlY3RpdmVcclxuICAgKi9cclxuICBASW5wdXQoKSBwcmludFNlY3Rpb25JZDogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqXHJcbiAgICogQG1lbWJlcm9mIE5neFByaW50RGlyZWN0aXZlXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHJpbnRUaXRsZTogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqXHJcbiAgICogQG1lbWJlcm9mIE5neFByaW50RGlyZWN0aXZlXHJcbiAgICovXHJcbiAgQElucHV0KCkgdXNlRXhpc3RpbmdDc3MgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQSBkZWxheSBpbiBtaWxsaXNlY29uZHMgdG8gZm9yY2UgdGhlIHByaW50IGRpYWxvZyB0byB3YWl0IGJlZm9yZSBvcGVuZWQuIERlZmF1bHQ6IDBcclxuICAgKlxyXG4gICAqIEBtZW1iZXJvZiBOZ3hQcmludERpcmVjdGl2ZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHByaW50RGVsYXk6IG51bWJlciA9IDA7XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdG8gY2xvc2UgdGhlIHdpbmRvdyBhZnRlciBwcmludCgpIHJldHVybnMuXHJcbiAgICpcclxuICAgKi9cclxuICBASW5wdXQoKSBjbG9zZVdpbmRvdzogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKlxyXG4gICAqIENsYXNzIGF0dHJpYnV0ZSB0byBhcHBseSB0byB0aGUgYm9keSBlbGVtZW50LlxyXG4gICAqXHJcbiAgICovXHJcbiAgQElucHV0KCkgYm9keUNsYXNzOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKlxyXG4gICAqIEBtZW1iZXJvZiBOZ3hQcmludERpcmVjdGl2ZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHByaW50U3R5bGUodmFsdWVzOiB7IFtrZXk6IHN0cmluZ106IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gfSkge1xyXG4gICAgZm9yIChsZXQga2V5IGluIHZhbHVlcykge1xyXG4gICAgICBpZiAodmFsdWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICB0aGlzLl9wcmludFN0eWxlLnB1c2goKGtleSArIEpTT04uc3RyaW5naWZ5KHZhbHVlc1trZXldKSkucmVwbGFjZSgvWydcIl0rL2csICcnKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMucmV0dXJuU3R5bGVWYWx1ZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB0aGUgc3RyaW5nIHRoYXQgY3JlYXRlIHRoZSBzdHlsZXNoZWV0IHdoaWNoIHdpbGwgYmUgaW5qZWN0ZWRcclxuICAgKiBsYXRlciB3aXRoaW4gPHN0eWxlPjwvc3R5bGU+IHRhZy5cclxuICAgKlxyXG4gICAqIC1qb2luL3JlcGxhY2UgdG8gdHJhbnNmb3JtIGFuIGFycmF5IG9iamVjdHMgdG8gY3NzLXN0eWxlZCBzdHJpbmdcclxuICAgKlxyXG4gICAqIEBtZW1iZXJvZiBOZ3hQcmludERpcmVjdGl2ZVxyXG4gICAqL1xyXG4gIHB1YmxpYyByZXR1cm5TdHlsZVZhbHVlcygpIHtcclxuICAgIHJldHVybiBgPHN0eWxlPiAke3RoaXMuX3ByaW50U3R5bGUuam9pbignICcpLnJlcGxhY2UoLywvZywgJzsnKX0gPC9zdHlsZT5gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKlxyXG4gICAqIEByZXR1cm5zIGh0bWwgZm9yIHRoZSBnaXZlbiB0YWdcclxuICAgKlxyXG4gICAqIEBtZW1iZXJvZiBOZ3hQcmludERpcmVjdGl2ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3N0eWxlU2hlZXRGaWxlID0gJyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBtZW1iZXJvZiBOZ3hQcmludERpcmVjdGl2ZVxyXG4gICAqIEBwYXJhbSBjc3NMaXN0XHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgc3R5bGVTaGVldEZpbGUoY3NzTGlzdDogc3RyaW5nKSB7XHJcbiAgICBsZXQgbGlua1RhZ0ZuID0gZnVuY3Rpb24gKGNzc0ZpbGVOYW1lKSB7XHJcbiAgICAgIHJldHVybiBgPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiIGhyZWY9XCIke2Nzc0ZpbGVOYW1lfVwiPmA7XHJcbiAgICB9XHJcbiAgICBpZiAoY3NzTGlzdC5pbmRleE9mKCcsJykgIT09IC0xKSB7XHJcbiAgICAgIGNvbnN0IHZhbHVlQXJyID0gY3NzTGlzdC5zcGxpdCgnLCcpO1xyXG4gICAgICBmb3IgKGxldCB2YWwgb2YgdmFsdWVBcnIpIHtcclxuICAgICAgICB0aGlzLl9zdHlsZVNoZWV0RmlsZSA9IHRoaXMuX3N0eWxlU2hlZXRGaWxlICsgbGlua1RhZ0ZuKHZhbCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3N0eWxlU2hlZXRGaWxlID0gbGlua1RhZ0ZuKGNzc0xpc3QpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHJldHVybnMgc3RyaW5nIHdoaWNoIGNvbnRhaW5zIHRoZSBsaW5rIHRhZ3MgY29udGFpbmluZyB0aGUgY3NzIHdoaWNoIHdpbGxcclxuICAgKiBiZSBpbmplY3RlZCBsYXRlciB3aXRoaW4gPGhlYWQ+PC9oZWFkPiB0YWcuXHJcbiAgICpcclxuICAgKi9cclxuICBwcml2YXRlIHJldHVyblN0eWxlU2hlZXRMaW5rVGFncygpIHtcclxuICAgIHJldHVybiB0aGlzLl9zdHlsZVNoZWV0RmlsZTtcclxuICB9XHJcbiAgcHJpdmF0ZSBnZXRFbGVtZW50VGFnKHRhZzoga2V5b2YgSFRNTEVsZW1lbnRUYWdOYW1lTWFwKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGh0bWw6IHN0cmluZ1tdID0gW107XHJcbiAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZyk7XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZWxlbWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGh0bWwucHVzaChlbGVtZW50c1tpbmRleF0ub3V0ZXJIVE1MKTtcclxuICAgIH1cclxuICAgIHJldHVybiBodG1sLmpvaW4oJ1xcclxcbicpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAqXHJcbiAqIEBkZXNjcmlwdGlvbiBXaGVuIHByaW50aW5nLCB0aGUgZGVmYXVsdCBvcHRpb24gb2YgZm9ybSBlbGVtZW50cyBhcmUgcHJpbnRlZC5cclxuICogSGVyZSB3ZSB1cGRhdGUgd2hhdCB0aGF0IGRlZmF1bHQgaXMgdG8gcHJpbnQgdGhlIGN1cnJlbnQgdmFsdWVzLlxyXG4gKlxyXG4gKiBAcGFyYW0gZWxlbWVudHMgdGhlIGh0bWwgZWxlbWVudCBjb2xsZWN0aW9uIHRvIHNhdmUgZGVmYXVsdHMgdG9cclxuICpcclxuICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVJbnB1dERlZmF1bHRzKGVsZW1lbnRzOiBIVE1MQ29sbGVjdGlvbk9mPEhUTUxJbnB1dEVsZW1lbnQ+KTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTtcclxuICAgICAgZWxlbWVudFsnZGVmYXVsdFZhbHVlJ10gPSBlbGVtZW50LnZhbHVlO1xyXG4gICAgICBpZiAoZWxlbWVudFsnY2hlY2tlZCddKSBlbGVtZW50WydkZWZhdWx0Q2hlY2tlZCddID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSB1cGRhdGVTZWxlY3REZWZhdWx0cyhlbGVtZW50czogSFRNTENvbGxlY3Rpb25PZjxIVE1MU2VsZWN0RWxlbWVudD4pOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldO1xyXG4gICAgICBjb25zdCBzZWxlY3RlZElkeCA9IGVsZW1lbnQuc2VsZWN0ZWRJbmRleDtcclxuICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb246IEhUTUxPcHRpb25FbGVtZW50ID0gZWxlbWVudC5vcHRpb25zW3NlbGVjdGVkSWR4XTtcclxuXHJcbiAgICAgIHNlbGVjdGVkT3B0aW9uLmRlZmF1bHRTZWxlY3RlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgdXBkYXRlVGV4dEFyZWFEZWZhdWx0cyhlbGVtZW50czogSFRNTENvbGxlY3Rpb25PZjxIVE1MVGV4dEFyZWFFbGVtZW50Pik6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBlbGVtZW50ID0gZWxlbWVudHNbaV07XHJcbiAgICAgIGVsZW1lbnRbJ2RlZmF1bHRWYWx1ZSddID0gZWxlbWVudC52YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgdGhlIGh0bWwgY29udGVudHMgb2YgdGhlIHByaW50IHNlY3Rpb24gaWQuXHJcbiAgICogVXBkYXRlcyB0aGUgaHRtbCBlbGVtZW50cyB0byBkZWZhdWx0IHRoZWlyIGZvcm0gdmFsdWVzIHRvIHRoZSBjdXJyZW50IGZvcm0gdmFsdWVzXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gaHRtbCBzZWN0aW9uIHRvIGJlIHByaW50ZWRcclxuICAgKlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0SHRtbENvbnRlbnRzKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgY29uc3QgcHJpbnRDb250ZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucHJpbnRTZWN0aW9uSWQpO1xyXG4gICAgaWYgKCFwcmludENvbnRlbnRzKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBjb25zdCBpbnB1dEVscyA9IHByaW50Q29udGVudHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0Jyk7XHJcbiAgICBjb25zdCBzZWxlY3RFbHMgPSBwcmludENvbnRlbnRzLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzZWxlY3QnKTtcclxuICAgIGNvbnN0IHRleHRBcmVhRWxzID0gcHJpbnRDb250ZW50cy5nZXRFbGVtZW50c0J5VGFnTmFtZSgndGV4dGFyZWEnKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZUlucHV0RGVmYXVsdHMoaW5wdXRFbHMpO1xyXG4gICAgdGhpcy51cGRhdGVTZWxlY3REZWZhdWx0cyhzZWxlY3RFbHMpO1xyXG4gICAgdGhpcy51cGRhdGVUZXh0QXJlYURlZmF1bHRzKHRleHRBcmVhRWxzKTtcclxuXHJcbiAgICByZXR1cm4gcHJpbnRDb250ZW50cy5pbm5lckhUTUw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqXHJcbiAgICogQG1lbWJlcm9mIE5neFByaW50RGlyZWN0aXZlXHJcbiAgICovXHJcbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxyXG4gIHB1YmxpYyBwcmludCgpOiB2b2lkIHtcclxuICAgIGxldCBwcmludENvbnRlbnRzLCBwb3B1cFdpbiwgc3R5bGVzID0gJycsIGxpbmtzID0gJyc7XHJcbiAgICBjb25zdCBiYXNlVGFnID0gdGhpcy5nZXRFbGVtZW50VGFnKCdiYXNlJyk7XHJcblxyXG4gICAgaWYgKHRoaXMudXNlRXhpc3RpbmdDc3MpIHtcclxuICAgICAgc3R5bGVzID0gdGhpcy5nZXRFbGVtZW50VGFnKCdzdHlsZScpO1xyXG4gICAgICBsaW5rcyA9IHRoaXMuZ2V0RWxlbWVudFRhZygnbGluaycpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaW50Q29udGVudHMgPSB0aGlzLmdldEh0bWxDb250ZW50cygpO1xyXG4gICAgcG9wdXBXaW4gPSB3aW5kb3cub3BlbihcIlwiLCBcIl9ibGFua1wiLCBcInRvcD0wLGxlZnQ9MCxoZWlnaHQ9YXV0byx3aWR0aD1hdXRvXCIpO1xyXG4gICAgcG9wdXBXaW4uZG9jdW1lbnQub3BlbigpO1xyXG4gICAgcG9wdXBXaW4uZG9jdW1lbnQud3JpdGUoYFxyXG4gICAgICA8aHRtbD5cclxuICAgICAgICA8aGVhZD5cclxuICAgICAgICAgIDx0aXRsZT4ke3RoaXMucHJpbnRUaXRsZSA/IHRoaXMucHJpbnRUaXRsZSA6IFwiXCJ9PC90aXRsZT5cclxuICAgICAgICAgICR7YmFzZVRhZ31cclxuICAgICAgICAgICR7dGhpcy5yZXR1cm5TdHlsZVZhbHVlcygpfVxyXG4gICAgICAgICAgJHt0aGlzLnJldHVyblN0eWxlU2hlZXRMaW5rVGFncygpfVxyXG4gICAgICAgICAgJHtzdHlsZXN9XHJcbiAgICAgICAgICAke2xpbmtzfVxyXG4gICAgICAgIDwvaGVhZD5cclxuICAgICAgICA8Ym9keSAke3RoaXMuYm9keUNsYXNzID8gYGNsYXNzPVwiJHt0aGlzLmJvZHlDbGFzc31cImAgOiAnJ30+XHJcbiAgICAgICAgICAke3ByaW50Q29udGVudHN9XHJcbiAgICAgICAgICA8c2NyaXB0IGRlZmVyPlxyXG4gICAgICAgICAgICBmdW5jdGlvbiB0cmlnZ2VyUHJpbnQoZXZlbnQpIHtcclxuICAgICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsIHRyaWdnZXJQcmludCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICR7dGhpcy5wcmV2aWV3T25seSB8fCAhdGhpcy5jbG9zZVdpbmRvdyA/ICcnIDogYHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBjbG9zZVdpbmRvdyh3aW5kb3cucHJpbnQoKSk7XHJcbiAgICAgICAgICAgICAgfSwgJHt0aGlzLnByaW50RGVsYXl9KTtgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIGNsb3NlV2luZG93KCl7XHJcbiAgICAgICAgICAgICAgd2luZG93LmNsb3NlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCB0cmlnZ2VyUHJpbnQsIGZhbHNlKTtcclxuICAgICAgICAgIDwvc2NyaXB0PlxyXG4gICAgICAgIDwvYm9keT5cclxuICAgICAgPC9odG1sPmApO1xyXG4gICAgcG9wdXBXaW4uZG9jdW1lbnQuY2xvc2UoKTtcclxuICB9XHJcbn1cclxuIl19
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXByaW50LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbmd4LXByaW50LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFLL0MsTUFBTSxPQUFPLGlCQUFrQixTQUFRLFNBQVM7SUFDdEMsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFDMUM7Ozs7T0FJRztJQUNILElBQWEsV0FBVyxDQUFDLEtBQWM7UUFDckMsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDbkUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFhLGNBQWMsQ0FBQyxLQUFhO1FBQ3ZDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3RFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBYSxVQUFVLENBQUMsS0FBYTtRQUNuQyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQWEsY0FBYyxDQUFDLEtBQWM7UUFDeEMsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDdEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFhLFVBQVUsQ0FBQyxLQUFhO1FBQ25DLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ2xFLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFhLFdBQVcsQ0FBQyxLQUFjO1FBQ3JDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ25FLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFhLFNBQVMsQ0FBQyxLQUFhO1FBQ2xDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ2pFLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFhLFVBQVUsQ0FBQyxLQUFjO1FBQ3BDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ2xFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFDSSxVQUFVLENBQUMsTUFBb0Q7UUFDakUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBR0Q7OztPQUdHO0lBQ0gsSUFDSSxjQUFjLENBQUMsT0FBZTtRQUNoQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7O09BSUc7SUFFSSxLQUFLO1FBQ1YsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDakMsQ0FBQzt1R0FuR1UsaUJBQWlCOzJGQUFqQixpQkFBaUI7OzJGQUFqQixpQkFBaUI7a0JBSjdCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOzhCQVFjLFdBQVc7c0JBQXZCLEtBQUs7Z0JBU08sY0FBYztzQkFBMUIsS0FBSztnQkFTTyxVQUFVO3NCQUF0QixLQUFLO2dCQVNPLGNBQWM7c0JBQTFCLEtBQUs7Z0JBU08sVUFBVTtzQkFBdEIsS0FBSztnQkFRTyxXQUFXO3NCQUF2QixLQUFLO2dCQVFPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBUU8sVUFBVTtzQkFBdEIsS0FBSztnQkFVRixVQUFVO3NCQURiLEtBQUs7Z0JBV0YsY0FBYztzQkFEakIsS0FBSztnQkFXQyxLQUFLO3NCQURYLFlBQVk7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgSG9zdExpc3RlbmVyLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBQcmludEJhc2UgfSBmcm9tICcuL25neC1wcmludC5iYXNlJztcclxuaW1wb3J0IHsgUHJpbnRPcHRpb25zIH0gZnJvbSAnLi9wcmludC1vcHRpb25zJztcclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6IFwiYnV0dG9uW25neFByaW50XVwiLFxyXG4gIHN0YW5kYWxvbmU6IHRydWVcclxufSlcclxuZXhwb3J0IGNsYXNzIE5neFByaW50RGlyZWN0aXZlIGV4dGVuZHMgUHJpbnRCYXNlIHtcclxuICBwcml2YXRlIHByaW50T3B0aW9ucyA9IG5ldyBQcmludE9wdGlvbnMoKTtcclxuICAvKipcclxuICAgKiBQcmV2ZW50cyB0aGUgcHJpbnQgZGlhbG9nIGZyb20gb3BlbmluZyBvbiB0aGUgd2luZG93XHJcbiAgICpcclxuICAgKiBAbWVtYmVyb2YgTmd4UHJpbnREaXJlY3RpdmVcclxuICAgKi9cclxuICBASW5wdXQoKSBzZXQgcHJldmlld09ubHkodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMucHJpbnRPcHRpb25zID0geyAuLi50aGlzLnByaW50T3B0aW9ucywgcHJldmlld09ubHk6IHZhbHVlIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqXHJcbiAgICogQG1lbWJlcm9mIE5neFByaW50RGlyZWN0aXZlXHJcbiAgICovXHJcbiAgQElucHV0KCkgc2V0IHByaW50U2VjdGlvbklkKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMucHJpbnRPcHRpb25zID0geyAuLi50aGlzLnByaW50T3B0aW9ucywgcHJpbnRTZWN0aW9uSWQ6IHZhbHVlIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqXHJcbiAgICogQG1lbWJlcm9mIE5neFByaW50RGlyZWN0aXZlXHJcbiAgICovXHJcbiAgQElucHV0KCkgc2V0IHByaW50VGl0bGUodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5wcmludE9wdGlvbnMgPSB7IC4uLnRoaXMucHJpbnRPcHRpb25zLCBwcmludFRpdGxlOiB2YWx1ZSB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKlxyXG4gICAqIEBtZW1iZXJvZiBOZ3hQcmludERpcmVjdGl2ZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNldCB1c2VFeGlzdGluZ0Nzcyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5wcmludE9wdGlvbnMgPSB7IC4uLnRoaXMucHJpbnRPcHRpb25zLCB1c2VFeGlzdGluZ0NzczogdmFsdWUgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgZGVsYXkgaW4gbWlsbGlzZWNvbmRzIHRvIGZvcmNlIHRoZSBwcmludCBkaWFsb2cgdG8gd2FpdCBiZWZvcmUgb3BlbmVkLiBEZWZhdWx0OiAwXHJcbiAgICpcclxuICAgKiBAbWVtYmVyb2YgTmd4UHJpbnREaXJlY3RpdmVcclxuICAgKi9cclxuICBASW5wdXQoKSBzZXQgcHJpbnREZWxheSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnByaW50T3B0aW9ucyA9IHsgLi4udGhpcy5wcmludE9wdGlvbnMsIHByaW50RGVsYXk6IHZhbHVlIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIGNsb3NlIHRoZSB3aW5kb3cgYWZ0ZXIgcHJpbnQoKSByZXR1cm5zLlxyXG4gICAqXHJcbiAgICovXHJcbiAgQElucHV0KCkgc2V0IGNsb3NlV2luZG93KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnByaW50T3B0aW9ucyA9IHsgLi4udGhpcy5wcmludE9wdGlvbnMsIGNsb3NlV2luZG93OiB2YWx1ZSB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xhc3MgYXR0cmlidXRlIHRvIGFwcGx5IHRvIHRoZSBib2R5IGVsZW1lbnQuXHJcbiAgICpcclxuICAgKi9cclxuICBASW5wdXQoKSBzZXQgYm9keUNsYXNzKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMucHJpbnRPcHRpb25zID0geyAuLi50aGlzLnByaW50T3B0aW9ucywgYm9keUNsYXNzOiB2YWx1ZSB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0byBvcGVuIGEgbmV3IHdpbmRvdyBvciBkZWZhdWx0IHRvIG5ldyB3aW5kb3cuXHJcbiAgICpcclxuICAgKi9cclxuICBASW5wdXQoKSBzZXQgb3Blbk5ld1RhYih2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5wcmludE9wdGlvbnMgPSB7IC4uLnRoaXMucHJpbnRPcHRpb25zLCBvcGVuTmV3VGFiOiB2YWx1ZSB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKlxyXG4gICAqIEBtZW1iZXJvZiBOZ3hQcmludERpcmVjdGl2ZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHByaW50U3R5bGUodmFsdWVzOiB7IFtrZXk6IHN0cmluZ106IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gfSkge1xyXG4gICAgc3VwZXIuc2V0UHJpbnRTdHlsZSh2YWx1ZXMpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIEBtZW1iZXJvZiBOZ3hQcmludERpcmVjdGl2ZVxyXG4gICAqIEBwYXJhbSBjc3NMaXN0XHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgc3R5bGVTaGVldEZpbGUoY3NzTGlzdDogc3RyaW5nKSB7XHJcbiAgICBzdXBlci5zZXRTdHlsZVNoZWV0RmlsZShjc3NMaXN0KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICpcclxuICAgKiBAbWVtYmVyb2YgTmd4UHJpbnREaXJlY3RpdmVcclxuICAgKi9cclxuICBASG9zdExpc3RlbmVyKCdjbGljaycpXHJcbiAgcHVibGljIHByaW50KCk6IHZvaWQge1xyXG4gICAgc3VwZXIucHJpbnQodGhpcy5wcmludE9wdGlvbnMpO1xyXG4gIH1cclxufVxyXG4iXX0=