ngx-print 1.4.0 → 1.5.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.
- package/README.md +43 -1
- package/esm2022/lib/ngx-print.base.mjs +193 -0
- package/esm2022/lib/ngx-print.directive.mjs +32 -153
- package/esm2022/lib/ngx-print.module.mjs +5 -5
- package/esm2022/lib/ngx-print.service.mjs +53 -0
- package/esm2022/lib/print-options.mjs +15 -0
- package/esm2022/public_api.mjs +3 -1
- package/fesm2022/ngx-print.mjs +260 -127
- package/fesm2022/ngx-print.mjs.map +1 -1
- package/lib/ngx-print.base.d.ts +86 -0
- package/lib/ngx-print.base.d.ts.map +1 -0
- package/lib/ngx-print.directive.d.ts +10 -54
- package/lib/ngx-print.directive.d.ts.map +1 -1
- package/lib/ngx-print.service.d.ts +44 -0
- package/lib/ngx-print.service.d.ts.map +1 -0
- package/lib/print-options.d.ts +11 -0
- package/lib/print-options.d.ts.map +1 -0
- package/package.json +1 -1
- package/public_api.d.ts +2 -0
- package/public_api.d.ts.map +1 -1
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,50 @@ 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
|
+
## Using NgxPrint as a service
|
|
191
|
+
Inject the NgxPrintService in the constructor of your component or service:
|
|
192
|
+
|
|
193
|
+
```typescript
|
|
194
|
+
constructor(private printService: NgxPrintService) { }
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Printing a Section
|
|
198
|
+
```typescript
|
|
199
|
+
import { PrintOptions } from './path-to-your/print-options.model';
|
|
200
|
+
|
|
201
|
+
printMe() {
|
|
202
|
+
const customPrintOptions: PrintOptions = new PrintOptions({
|
|
203
|
+
printSectionId: 'print-section',
|
|
204
|
+
// Add any other print options as needed
|
|
205
|
+
});
|
|
206
|
+
this.printService.print(customPrintOptions)
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### Print Options Object
|
|
211
|
+
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:
|
|
212
|
+
```typescript
|
|
213
|
+
printSectionId: string = null;
|
|
214
|
+
printTitle: string = null;
|
|
215
|
+
useExistingCss: boolean = false;
|
|
216
|
+
bodyClass: string = '';
|
|
217
|
+
previewOnly: boolean = false;
|
|
218
|
+
closeWindow: boolean = true;
|
|
219
|
+
printDelay: number = 0;
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Setting PrintStyles or StyleSheets
|
|
223
|
+
```typescript
|
|
224
|
+
// Optional property for css as a key-value pair
|
|
225
|
+
this.printService.printStyle = styleSheet;
|
|
226
|
+
|
|
227
|
+
// Optional property for a css file location
|
|
228
|
+
this.printService.styleSheetFile = fileLocation;
|
|
229
|
+
```
|
|
230
|
+
|
|
189
231
|
## Contributors :1st_place_medal:
|
|
190
232
|
|
|
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
|
|
233
|
+
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
234
|
|
|
193
235
|
## Donation
|
|
194
236
|
|
|
@@ -0,0 +1,193 @@
|
|
|
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
|
+
* Retrieves the HTML content of a specified printing section.
|
|
102
|
+
*
|
|
103
|
+
* @param {string} printSectionId - Id of the printing section.
|
|
104
|
+
* @returns {string | null} - HTML content of the printing section, or null if not found.
|
|
105
|
+
* @private
|
|
106
|
+
*/
|
|
107
|
+
getHtmlContents(printSectionId) {
|
|
108
|
+
const printContents = document.getElementById(printSectionId);
|
|
109
|
+
if (!printContents)
|
|
110
|
+
return null;
|
|
111
|
+
const inputEls = printContents.getElementsByTagName('input');
|
|
112
|
+
const selectEls = printContents.getElementsByTagName('select');
|
|
113
|
+
const textAreaEls = printContents.getElementsByTagName('textarea');
|
|
114
|
+
this.updateInputDefaults(inputEls);
|
|
115
|
+
this.updateSelectDefaults(selectEls);
|
|
116
|
+
this.updateTextAreaDefaults(textAreaEls);
|
|
117
|
+
return printContents.innerHTML;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Retrieves the HTML content of elements with the specified tag.
|
|
121
|
+
*
|
|
122
|
+
* @param {keyof HTMLElementTagNameMap} tag - HTML tag name.
|
|
123
|
+
* @returns {string} - Concatenated outerHTML of elements with the specified tag.
|
|
124
|
+
* @private
|
|
125
|
+
*/
|
|
126
|
+
getElementTag(tag) {
|
|
127
|
+
const html = [];
|
|
128
|
+
const elements = document.getElementsByTagName(tag);
|
|
129
|
+
for (let index = 0; index < elements.length; index++) {
|
|
130
|
+
html.push(elements[index].outerHTML);
|
|
131
|
+
}
|
|
132
|
+
return html.join('\r\n');
|
|
133
|
+
}
|
|
134
|
+
//#endregion
|
|
135
|
+
/**
|
|
136
|
+
* Prints the specified content using the provided print options.
|
|
137
|
+
*
|
|
138
|
+
* @param {PrintOptions} printOptions - Options for printing.
|
|
139
|
+
* @public
|
|
140
|
+
*/
|
|
141
|
+
print(printOptions) {
|
|
142
|
+
let styles = '', links = '';
|
|
143
|
+
const baseTag = this.getElementTag('base');
|
|
144
|
+
if (printOptions.useExistingCss) {
|
|
145
|
+
styles = this.getElementTag('style');
|
|
146
|
+
links = this.getElementTag('link');
|
|
147
|
+
}
|
|
148
|
+
const printContents = this.getHtmlContents(printOptions.printSectionId);
|
|
149
|
+
if (!printContents) {
|
|
150
|
+
// Handle the case where the specified print section is not found.
|
|
151
|
+
console.error(`Print section with id ${printOptions.printSectionId} not found.`);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const popupWin = window.open("", "_blank", "top=0,left=0,height=auto,width=auto");
|
|
155
|
+
popupWin.document.open();
|
|
156
|
+
popupWin.document.write(`
|
|
157
|
+
<html>
|
|
158
|
+
<head>
|
|
159
|
+
<title>${printOptions.printTitle ? printOptions.printTitle : ""}</title>
|
|
160
|
+
${baseTag}
|
|
161
|
+
${this.returnStyleValues()}
|
|
162
|
+
${this.returnStyleSheetLinkTags()}
|
|
163
|
+
${styles}
|
|
164
|
+
${links}
|
|
165
|
+
</head>
|
|
166
|
+
<body ${printOptions.bodyClass ? `class="${printOptions.bodyClass}"` : ''}>
|
|
167
|
+
${printContents}
|
|
168
|
+
<script defer>
|
|
169
|
+
function triggerPrint(event) {
|
|
170
|
+
window.removeEventListener('load', triggerPrint, false);
|
|
171
|
+
${printOptions.previewOnly ? '' : `setTimeout(function() {
|
|
172
|
+
closeWindow(window.print());
|
|
173
|
+
}, ${printOptions.printDelay});`}
|
|
174
|
+
}
|
|
175
|
+
function closeWindow(){
|
|
176
|
+
${printOptions.closeWindow ? 'window.close();' : ''}
|
|
177
|
+
}
|
|
178
|
+
window.addEventListener('load', triggerPrint, false);
|
|
179
|
+
</script>
|
|
180
|
+
</body>
|
|
181
|
+
</html>`);
|
|
182
|
+
popupWin.document.close();
|
|
183
|
+
}
|
|
184
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: PrintBase, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
185
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: PrintBase, providedIn: 'root' });
|
|
186
|
+
}
|
|
187
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: PrintBase, decorators: [{
|
|
188
|
+
type: Injectable,
|
|
189
|
+
args: [{
|
|
190
|
+
providedIn: 'root'
|
|
191
|
+
}]
|
|
192
|
+
}] });
|
|
193
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXByaW50LmJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL25neC1wcmludC5iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBTTNDLE1BQU0sT0FBTyxTQUFTO0lBRVYsV0FBVyxHQUFhLEVBQUUsQ0FBQztJQUMzQixlQUFlLEdBQVcsRUFBRSxDQUFDO0lBRXJDLDZCQUE2QjtJQUM3Qjs7Ozs7T0FLRztJQUNPLGFBQWEsQ0FBQyxNQUFvRDtRQUN4RSxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixLQUFLLElBQUksR0FBRyxJQUFJLE1BQU0sRUFBRTtZQUNwQixJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDcEY7U0FDSjtJQUNMLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksaUJBQWlCO1FBQ3BCLE9BQU8sV0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUM7SUFDL0UsQ0FBQztJQUVEOzs7O0tBSUM7SUFDTyx3QkFBd0I7UUFDNUIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLGlCQUFpQixDQUFDLE9BQWU7UUFDdkMsSUFBSSxTQUFTLEdBQUcsVUFBVSxXQUFXO1lBQ2pDLE9BQU8sZ0RBQWdELFdBQVcsSUFBSSxDQUFDO1FBQzNFLENBQUMsQ0FB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RTtnQkFDN0QsT0FBTztnQkFDUCxJQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtnQkFDL0IsTUFBTTtnQkFDTixLQUFLOztvQkFFRCxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLFlBQVksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDckUsYUFBYTs7OztvQkFJVCxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOzt1QkFFN0IsWUFBWSxDQUFDLFVBQVUsSUFBSTs7O29CQUc5QixZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRTs7Ozs7a0JBS25ELENBQUMsQ0FBQztRQUNaLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDOUIsQ0FBQzt1R0F4TVEsU0FBUzsyR0FBVCxTQUFTLGNBRk4sTUFBTTs7MkZBRVQsU0FBUztrQkFIckIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgUHJpbnRPcHRpb25zIH0gZnJvbSBcIi4vcHJpbnQtb3B0aW9uc1wiO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQcmludEJhc2Uge1xyXG5cclxuICAgIHByaXZhdGUgX3ByaW50U3R5bGU6IHN0cmluZ1tdID0gW107XHJcbiAgICBwcml2YXRlIF9zdHlsZVNoZWV0RmlsZTogc3RyaW5nID0gJyc7XHJcblxyXG4gICAgLy8jcmVnaW9uIEdldHRlcnMgYW5kIFNldHRlcnNcclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgcHJpbnQgc3R5bGVzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCB2YWx1ZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlcyAtIEtleS12YWx1ZSBwYWlycyByZXByZXNlbnRpbmcgcHJpbnQgc3R5bGVzLlxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgc2V0UHJpbnRTdHlsZSh2YWx1ZXM6IHsgW2tleTogc3RyaW5nXTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB9KSB7XHJcbiAgICAgICAgdGhpcy5fcHJpbnRTdHlsZSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGtleSBpbiB2YWx1ZXMpIHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wcmludFN0eWxlLnB1c2goKGtleSArIEpTT04uc3RyaW5naWZ5KHZhbHVlc1trZXldKSkucmVwbGFjZSgvWydcIl0rL2csICcnKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHRoZSBzdHJpbmcgdGhhdCBjcmVhdGUgdGhlIHN0eWxlc2hlZXQgd2hpY2ggd2lsbCBiZSBpbmplY3RlZFxyXG4gICAgICogbGF0ZXIgd2l0aGluIDxzdHlsZT48L3N0eWxlPiB0YWcuXHJcbiAgICAgKlxyXG4gICAgICogLWpvaW4vcmVwbGFjZSB0byB0cmFuc2Zvcm0gYW4gYXJyYXkgb2JqZWN0cyB0byBjc3Mtc3R5bGVkIHN0cmluZ1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmV0dXJuU3R5bGVWYWx1ZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIGA8c3R5bGU+ICR7dGhpcy5fcHJpbnRTdHlsZS5qb2luKCcgJykucmVwbGFjZSgvLC9nLCAnOycpfSA8L3N0eWxlPmA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICogQHJldHVybnMgc3RyaW5nIHdoaWNoIGNvbnRhaW5zIHRoZSBsaW5rIHRhZ3MgY29udGFpbmluZyB0aGUgY3NzIHdoaWNoIHdpbGxcclxuICAgKiBiZSBpbmplY3RlZCBsYXRlciB3aXRoaW4gPGhlYWQ+PC9oZWFkPiB0YWcuXHJcbiAgICpcclxuICAgKi9cclxuICAgIHByaXZhdGUgcmV0dXJuU3R5bGVTaGVldExpbmtUYWdzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdHlsZVNoZWV0RmlsZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHN0eWxlIHNoZWV0IGZpbGUgYmFzZWQgb24gdGhlIHByb3ZpZGVkIENTUyBsaXN0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjc3NMaXN0IC0gQ1NTIGZpbGUgb3IgbGlzdCBvZiBDU1MgZmlsZXMuXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBzZXRTdHlsZVNoZWV0RmlsZShjc3NMaXN0OiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgbGlua1RhZ0ZuID0gZnVuY3Rpb24gKGNzc0ZpbGVOYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBgPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiIGhyZWY9XCIke2Nzc0ZpbGVOYW1lfVwiPmA7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKGNzc0xpc3QuaW5kZXhPZignLCcpICE9PSAtMSkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZUFyciA9IGNzc0xpc3Quc3BsaXQoJywnKTtcclxuICAgICAgICAgICAgdGhpcy5fc3R5bGVTaGVldEZpbGUgPSB2YWx1ZUFyci5tYXAodmFsID0+IGxpbmtUYWdGbih2YWwpKS5qb2luKCcnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9zdHlsZVNoZWV0RmlsZSA9IGxpbmtUYWdGbihjc3NMaXN0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLy8jcmVnaW9uIFByaXZhdGUgbWV0aG9kcyB1c2VkIGJ5IFByaW50QmFzZVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIGlucHV0IGVsZW1lbnRzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7SFRNTENvbGxlY3Rpb25PZjxIVE1MSW5wdXRFbGVtZW50Pn0gZWxlbWVudHMgLSBDb2xsZWN0aW9uIG9mIGlucHV0IGVsZW1lbnRzLlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVJbnB1dERlZmF1bHRzKGVsZW1lbnRzOiBIVE1MQ29sbGVjdGlvbk9mPEhUTUxJbnB1dEVsZW1lbnQ+KTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZWxlbWVudHNbaV07XHJcbiAgICAgICAgICAgIGVsZW1lbnRbJ2RlZmF1bHRWYWx1ZSddID0gZWxlbWVudC52YWx1ZTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnRbJ2NoZWNrZWQnXSkgZWxlbWVudFsnZGVmYXVsdENoZWNrZWQnXSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHNlbGVjdCBlbGVtZW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxDb2xsZWN0aW9uT2Y8SFRNTFNlbGVjdEVsZW1lbnQ+fSBlbGVtZW50cyAtIENvbGxlY3Rpb24gb2Ygc2VsZWN0IGVsZW1lbnRzLlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVTZWxlY3REZWZhdWx0cyhlbGVtZW50czogSFRNTENvbGxlY3Rpb25PZjxIVE1MU2VsZWN0RWxlbWVudD4pOiB2b2lkIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJZHggPSBlbGVtZW50LnNlbGVjdGVkSW5kZXg7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uOiBIVE1MT3B0aW9uRWxlbWVudCA9IGVsZW1lbnQub3B0aW9uc1tzZWxlY3RlZElkeF07XHJcblxyXG4gICAgICAgICAgICBzZWxlY3RlZE9wdGlvbi5kZWZhdWx0U2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0ZXh0YXJlYSBlbGVtZW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxDb2xsZWN0aW9uT2Y8SFRNTFRleHRBcmVhRWxlbWVudD59IGVsZW1lbnRzIC0gQ29sbGVjdGlvbiBvZiB0ZXh0YXJlYSBlbGVtZW50cy5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlVGV4dEFyZWFEZWZhdWx0cyhlbGVtZW50czogSFRNTENvbGxlY3Rpb25PZjxIVE1MVGV4dEFyZWFFbGVtZW50Pik6IHZvaWQge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBlbGVtZW50WydkZWZhdWx0VmFsdWUnXSA9IGVsZW1lbnQudmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSBIVE1MIGNvbnRlbnQgb2YgYSBzcGVjaWZpZWQgcHJpbnRpbmcgc2VjdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJpbnRTZWN0aW9uSWQgLSBJZCBvZiB0aGUgcHJpbnRpbmcgc2VjdGlvbi5cclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfSAtIEhUTUwgY29udGVudCBvZiB0aGUgcHJpbnRpbmcgc2VjdGlvbiwgb3IgbnVsbCBpZiBub3QgZm91bmQuXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldEh0bWxDb250ZW50cyhwcmludFNlY3Rpb25JZDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgcHJpbnRDb250ZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHByaW50U2VjdGlvbklkKTtcclxuICAgICAgICBpZiAoIXByaW50Q29udGVudHMpIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgICBjb25zdCBpbnB1dEVscyA9IHByaW50Q29udGVudHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0Jyk7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0RWxzID0gcHJpbnRDb250ZW50cy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2VsZWN0Jyk7XHJcbiAgICAgICAgY29uc3QgdGV4dEFyZWFFbHMgPSBwcmludENvbnRlbnRzLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0ZXh0YXJlYScpO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZUlucHV0RGVmYXVsdHMoaW5wdXRFbHMpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2VsZWN0RGVmYXVsdHMoc2VsZWN0RWxzKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVRleHRBcmVhRGVmYXVsdHModGV4dEFyZWFFbHMpO1xyXG5cclxuICAgICAgICByZXR1cm4gcHJpbnRDb250ZW50cy5pbm5lckhUTUw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIEhUTUwgY29udGVudCBvZiBlbGVtZW50cyB3aXRoIHRoZSBzcGVjaWZpZWQgdGFnLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7a2V5b2YgSFRNTEVsZW1lbnRUYWdOYW1lTWFwfSB0YWcgLSBIVE1MIHRhZyBuYW1lLlxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gLSBDb25jYXRlbmF0ZWQgb3V0ZXJIVE1MIG9mIGVsZW1lbnRzIHdpdGggdGhlIHNwZWNpZmllZCB0YWcuXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldEVsZW1lbnRUYWcodGFnOiBrZXlvZiBIVE1MRWxlbWVudFRhZ05hbWVNYXApOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGh0bWw6IHN0cmluZ1tdID0gW107XHJcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWcpO1xyXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBlbGVtZW50cy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgICAgaHRtbC5wdXNoKGVsZW1lbnRzW2luZGV4XS5vdXRlckhUTUwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaHRtbC5qb2luKCdcXHJcXG4nKTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByaW50cyB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgdXNpbmcgdGhlIHByb3ZpZGVkIHByaW50IG9wdGlvbnMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQcmludE9wdGlvbnN9IHByaW50T3B0aW9ucyAtIE9wdGlvbnMgZm9yIHByaW50aW5nLlxyXG4gICAgICogQHB1YmxpY1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgcHJpbnQocHJpbnRPcHRpb25zOiBQcmludE9wdGlvbnMpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgbGV0IHN0eWxlcyA9ICcnLCBsaW5rcyA9ICcnO1xyXG4gICAgICAgIGNvbnN0IGJhc2VUYWcgPSB0aGlzLmdldEVsZW1lbnRUYWcoJ2Jhc2UnKTtcclxuXHJcbiAgICAgICAgaWYgKHByaW50T3B0aW9ucy51c2VFeGlzdGluZ0Nzcykge1xyXG4gICAgICAgICAgICBzdHlsZXMgPSB0aGlzLmdldEVsZW1lbnRUYWcoJ3N0eWxlJyk7XHJcbiAgICAgICAgICAgIGxpbmtzID0gdGhpcy5nZXRFbGVtZW50VGFnKCdsaW5rJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwcmludENvbnRlbnRzID0gdGhpcy5nZXRIdG1sQ29udGVudHMocHJpbnRPcHRpb25zLnByaW50U2VjdGlvbklkKTtcclxuICAgICAgICBpZiAoIXByaW50Q29udGVudHMpIHtcclxuICAgICAgICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBzcGVjaWZpZWQgcHJpbnQgc2VjdGlvbiBpcyBub3QgZm91bmQuXHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFByaW50IHNlY3Rpb24gd2l0aCBpZCAke3ByaW50T3B0aW9ucy5wcmludFNlY3Rpb25JZH0gbm90IGZvdW5kLmApO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwb3B1cFdpbiA9IHdpbmRvdy5vcGVuKFwiXCIsIFwiX2JsYW5rXCIsIFwidG9wPTAsbGVmdD0wLGhlaWdodD1hdXRvLHdpZHRoPWF1dG9cIik7XHJcbiAgICAgICAgcG9wdXBXaW4uZG9jdW1lbnQub3BlbigpO1xyXG4gICAgICAgIHBvcHVwV2luLmRvY3VtZW50LndyaXRlKGBcclxuICAgICAgICAgIDxodG1sPlxyXG4gICAgICAgICAgICA8aGVhZD5cclxuICAgICAgICAgICAgICA8dGl0bGU+JHtwcmludE9wdGlvbnMucHJpbnRUaXRsZSA/IHByaW50T3B0aW9ucy5wcmludFRpdGxlIDogXCJcIn08L3RpdGxlPlxyXG4gICAgICAgICAgICAgICR7YmFzZVRhZ31cclxuICAgICAgICAgICAgICAke3RoaXMucmV0dXJuU3R5bGVWYWx1ZXMoKX1cclxuICAgICAgICAgICAgICAke3RoaXMucmV0dXJuU3R5bGVTaGVldExpbmtUYWdzKCl9XHJcbiAgICAgICAgICAgICAgJHtzdHlsZXN9XHJcbiAgICAgICAgICAgICAgJHtsaW5rc31cclxuICAgICAgICAgICAgPC9oZWFkPlxyXG4gICAgICAgICAgICA8Ym9keSAke3ByaW50T3B0aW9ucy5ib2R5Q2xhc3MgPyBgY2xhc3M9XCIke3ByaW50T3B0aW9ucy5ib2R5Q2xhc3N9XCJgIDogJyd9PlxyXG4gICAgICAgICAgICAgICR7cHJpbnRDb250ZW50c31cclxuICAgICAgICAgICAgICA8c2NyaXB0IGRlZmVyPlxyXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gdHJpZ2dlclByaW50KGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgdHJpZ2dlclByaW50LCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICR7cHJpbnRPcHRpb25zLnByZXZpZXdPbmx5ID8gJycgOiBgc2V0VGltZW91dChmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICBjbG9zZVdpbmRvdyh3aW5kb3cucHJpbnQoKSk7XHJcbiAgICAgICAgICAgICAgICAgIH0sICR7cHJpbnRPcHRpb25zLnByaW50RGVsYXl9KTtgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY2xvc2VXaW5kb3coKXtcclxuICAgICAgICAgICAgICAgICAgJHtwcmludE9wdGlvbnMuY2xvc2VXaW5kb3cgPyAnd2luZG93LmNsb3NlKCk7JyA6ICcnfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCB0cmlnZ2VyUHJpbnQsIGZhbHNlKTtcclxuICAgICAgICAgICAgICA8L3NjcmlwdD5cclxuICAgICAgICAgICAgPC9ib2R5PlxyXG4gICAgICAgICAgPC9odG1sPmApO1xyXG4gICAgICAgIHBvcHVwV2luLmRvY3VtZW50LmNsb3NlKCk7XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
@@ -1,163 +1,77 @@
|
|
|
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
|
-
|
|
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
|
|
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, printSectionId: value };
|
|
30
|
+
}
|
|
23
31
|
/**
|
|
24
32
|
*
|
|
25
33
|
*
|
|
26
34
|
* @memberof NgxPrintDirective
|
|
27
35
|
*/
|
|
28
|
-
useExistingCss
|
|
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
|
|
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
|
|
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
|
/**
|
|
59
62
|
*
|
|
60
63
|
*
|
|
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
64
|
* @memberof NgxPrintDirective
|
|
67
65
|
*/
|
|
68
|
-
|
|
69
|
-
|
|
66
|
+
set printStyle(values) {
|
|
67
|
+
super.setPrintStyle(values);
|
|
70
68
|
}
|
|
71
|
-
/**
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
* @returns html for the given tag
|
|
75
|
-
*
|
|
76
|
-
* @memberof NgxPrintDirective
|
|
77
|
-
*/
|
|
78
|
-
_styleSheetFile = '';
|
|
79
69
|
/**
|
|
80
70
|
* @memberof NgxPrintDirective
|
|
81
71
|
* @param cssList
|
|
82
72
|
*/
|
|
83
73
|
set styleSheetFile(cssList) {
|
|
84
|
-
|
|
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;
|
|
74
|
+
super.setStyleSheetFile(cssList);
|
|
161
75
|
}
|
|
162
76
|
/**
|
|
163
77
|
*
|
|
@@ -165,47 +79,12 @@ export class NgxPrintDirective {
|
|
|
165
79
|
* @memberof NgxPrintDirective
|
|
166
80
|
*/
|
|
167
81
|
print() {
|
|
168
|
-
|
|
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();
|
|
82
|
+
super.print(this.printOptions);
|
|
204
83
|
}
|
|
205
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
206
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
84
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: NgxPrintDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
85
|
+
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", printStyle: "printStyle", styleSheetFile: "styleSheetFile" }, host: { listeners: { "click": "print()" } }, usesInheritance: true, ngImport: i0 });
|
|
207
86
|
}
|
|
208
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
87
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: NgxPrintDirective, decorators: [{
|
|
209
88
|
type: Directive,
|
|
210
89
|
args: [{
|
|
211
90
|
selector: "button[ngxPrint]",
|
|
@@ -233,4 +112,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
233
112
|
type: HostListener,
|
|
234
113
|
args: ['click']
|
|
235
114
|
}] } });
|
|
236
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXByaW50LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbmd4LXByaW50LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSy9ELE1BQU0sT0FBTyxpQkFBaUI7SUFFckIsV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUV4Qjs7OztPQUlHO0lBQ00sV0FBVyxHQUFZLEtBQUssQ0FBQztJQUV0Qzs7OztPQUlHO0lBQ00sY0FBYyxDQUFTO0lBRWhDOzs7O09BSUc7SUFDTSxVQUFVLENBQVM7SUFFNUI7Ozs7T0FJRztJQUNNLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFFaEM7Ozs7T0FJRztJQUNNLFVBQVUsR0FBVyxDQUFDLENBQUM7SUFFaEM7OztPQUdHO0lBQ00sV0FBVyxHQUFZLElBQUksQ0FBQztJQUVyQzs7O09BR0c7SUFDTSxTQUFTLEdBQVcsRUFBRSxDQUFDO0lBRWhDOzs7O09BSUc7SUFDSCxJQUNJLFVBQVUsQ0FBQyxNQUFvRDtRQUNqRSxLQUFLLElBQUksR0FBRyxJQUFJLE1BQU0sRUFBRTtZQUN0QixJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDbEY7U0FDRjtRQUNELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSSxpQkFBaUI7UUFDdEIsT0FBTyxXQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFD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QUdULElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDN0MsT0FBTztZQUNQLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUN4QixJQUFJLENBQUMsd0JBQXdCLEVBQUU7WUFDL0IsTUFBTTtZQUNOLEtBQUs7O2dCQUVELElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3JELGFBQWE7Ozs7Z0JBSVQsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7O21CQUUxQyxJQUFJLENBQUMsVUFBVSxJQUFJOzs7Ozs7OztjQVF4QixDQUFDLENBQUM7UUFDWixRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzVCLENBQUM7d0dBL05VLGlCQUFpQjs0RkFBakIsaUJBQWlCOzs0RkFBakIsaUJBQWlCO2tCQUo3QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs4QkFVVSxXQUFXO3NCQUFuQixLQUFLO2dCQU9HLGNBQWM7c0JBQXRCLEtBQUs7Z0JBT0csVUFBVTtzQkFBbEIsS0FBSztnQkFPRyxjQUFjO3NCQUF0QixLQUFLO2dCQU9HLFVBQVU7c0JBQWxCLEtBQUs7Z0JBTUcsV0FBVztzQkFBbkIsS0FBSztnQkFNRyxTQUFTO3NCQUFqQixLQUFLO2dCQVFGLFVBQVU7c0JBRGIsS0FBSztnQkFzQ0YsY0FBYztzQkFEakIsS0FBSztnQkEyRkMsS0FBSztzQkFEWCxZQUFZO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6IFwiYnV0dG9uW25neFByaW50XVwiLFxyXG4gIHN0YW5kYWxvbmU6IHRydWVcclxufSlcclxuZXhwb3J0IGNsYXNzIE5neFByaW50RGlyZWN0aXZlIHtcclxuXHJcbiAgcHVibGljIF9wcmludFN0eWxlID0gW107XHJcblxyXG4gIC8qKlxyXG4gICAqIFByZXZlbnRzIHRoZSBwcmludCBkaWFsb2cgZnJvbSBvcGVuaW5nIG9uIHRoZSB3aW5kb3dcclxuICAgKlxyXG4gICAqIEBtZW1iZXJvZiBOZ3hQcmludERpcmVjdGl2ZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHByZXZpZXdPbmx5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICpcclxuICAgKiBAbWVtYmVyb2YgTmd4UHJpbnREaXJlY3RpdmVcclxuICAgKi9cclxuICBASW5wdXQoKSBwcmludFNlY3Rpb25JZDogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqXHJcbiAgICogQG1lbWJlcm9mIE5neFByaW50RGlyZWN0aXZlXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHJpbnRUaXRsZTogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqXHJcbiAgICogQG1lbWJlcm9mIE5neFByaW50RGlyZWN0aXZlXHJcbiAgICovXHJcbiAgQElucHV0KCkgdXNlRXhpc3RpbmdDc3MgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQSBkZWxheSBpbiBtaWxsaXNlY29uZHMgdG8gZm9yY2UgdGhlIHByaW50IGRpYWxvZyB0byB3YWl0IGJlZm9yZSBvcGVuZWQuIERlZmF1bHQ6IDBcclxuICAgKlxyXG4gICAqIEBtZW1iZXJvZiBOZ3hQcmludERpcmVjdGl2ZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHByaW50RGVsYXk6IG51bWJlciA9IDA7XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdG8gY2xvc2UgdGhlIHdpbmRvdyBhZnRlciBwcmludCgpIHJldHVybnMuXHJcbiAgICpcclxuICAgKi9cclxuICBASW5wdXQoKSBjbG9zZVdpbmRvdzogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKlxyXG4gICAqIENsYXNzIGF0dHJpYnV0ZSB0byBhcHBseSB0byB0aGUgYm9keSBlbGVtZW50LlxyXG4gICAqXHJcbiAgICovXHJcbiAgQElucHV0KCkgYm9keUNsYXNzOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKlxyXG4gICAqIEBtZW1iZXJvZiBOZ3hQcmludERpcmVjdGl2ZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHByaW50U3R5bGUodmFsdWVzOiB7IFtrZXk6IHN0cmluZ106IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gfSkge1xyXG4gICAgZm9yIChsZXQga2V5IGluIHZhbHVlcykge1xyXG4gICAgICBpZiAodmFsdWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICB0aGlzLl9wcmludFN0eWxlLnB1c2goKGtleSArIEpTT04uc3RyaW5naWZ5KHZhbHVlc1trZXldKSkucmVwbGFjZSgvWydcIl0rL2csICcnKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMucmV0dXJuU3R5bGVWYWx1ZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB0aGUgc3RyaW5nIHRoYXQgY3JlYXRlIHRoZSBzdHlsZXNoZWV0IHdoaWNoIHdpbGwgYmUgaW5qZWN0ZWRcclxuICAgKiBsYXRlciB3aXRoaW4gPHN0eWxlPjwvc3R5bGU+IHRhZy5cclxuICAgKlxyXG4gICAqIC1qb2luL3JlcGxhY2UgdG8gdHJhbnNmb3JtIGFuIGFycmF5IG9iamVjdHMgdG8gY3NzLXN0eWxlZCBzdHJpbmdcclxuICAgKlxyXG4gICAqIEBtZW1iZXJvZiBOZ3hQcmludERpcmVjdGl2ZVxyXG4gICAqL1xyXG4gIHB1YmxpYyByZXR1cm5TdHlsZVZhbHVlcygpIHtcclxuICAgIHJldHVybiBgPHN0eWxlPiAke3RoaXMuX3ByaW50U3R5bGUuam9pbignICcpLnJlcGxhY2UoLywvZywgJzsnKX0gPC9zdHlsZT5gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKlxyXG4gICAqIEByZXR1cm5zIGh0bWwgZm9yIHRoZSBnaXZlbiB0YWdcclxuICAgKlxyXG4gICAqIEBtZW1iZXJvZiBOZ3hQcmludERpcmVjdGl2ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3N0eWxlU2hlZXRGaWxlID0gJyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBtZW1iZXJvZiBOZ3hQcmludERpcmVjdGl2ZVxyXG4gICAqIEBwYXJhbSBjc3NMaXN0XHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgc3R5bGVTaGVldEZpbGUoY3NzTGlzdDogc3RyaW5nKSB7XHJcbiAgICBsZXQgbGlua1RhZ0ZuID0gZnVuY3Rpb24gKGNzc0ZpbGVOYW1lKSB7XHJcbiAgICAgIHJldHVybiBgPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiIGhyZWY9XCIke2Nzc0ZpbGVOYW1lfVwiPmA7XHJcbiAgICB9XHJcbiAgICBpZiAoY3NzTGlzdC5pbmRleE9mKCcsJykgIT09IC0xKSB7XHJcbiAgICAgIGNvbnN0IHZhbHVlQXJyID0gY3NzTGlzdC5zcGxpdCgnLCcpO1xyXG4gICAgICBmb3IgKGxldCB2YWwgb2YgdmFsdWVBcnIpIHtcclxuICAgICAgICB0aGlzLl9zdHlsZVNoZWV0RmlsZSA9IHRoaXMuX3N0eWxlU2hlZXRGaWxlICsgbGlua1RhZ0ZuKHZhbCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3N0eWxlU2hlZXRGaWxlID0gbGlua1RhZ0ZuKGNzc0xpc3QpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHJldHVybnMgc3RyaW5nIHdoaWNoIGNvbnRhaW5zIHRoZSBsaW5rIHRhZ3MgY29udGFpbmluZyB0aGUgY3NzIHdoaWNoIHdpbGxcclxuICAgKiBiZSBpbmplY3RlZCBsYXRlciB3aXRoaW4gPGhlYWQ+PC9oZWFkPiB0YWcuXHJcbiAgICpcclxuICAgKi9cclxuICBwcml2YXRlIHJldHVyblN0eWxlU2hlZXRMaW5rVGFncygpIHtcclxuICAgIHJldHVybiB0aGlzLl9zdHlsZVNoZWV0RmlsZTtcclxuICB9XHJcbiAgcHJpdmF0ZSBnZXRFbGVtZW50VGFnKHRhZzoga2V5b2YgSFRNTEVsZW1lbnRUYWdOYW1lTWFwKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGh0bWw6IHN0cmluZ1tdID0gW107XHJcbiAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZyk7XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZWxlbWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGh0bWwucHVzaChlbGVtZW50c1tpbmRleF0ub3V0ZXJIVE1MKTtcclxuICAgIH1cclxuICAgIHJldHVybiBodG1sLmpvaW4oJ1xcclxcbicpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAqXHJcbiAqIEBkZXNjcmlwdGlvbiBXaGVuIHByaW50aW5nLCB0aGUgZGVmYXVsdCBvcHRpb24gb2YgZm9ybSBlbGVtZW50cyBhcmUgcHJpbnRlZC5cclxuICogSGVyZSB3ZSB1cGRhdGUgd2hhdCB0aGF0IGRlZmF1bHQgaXMgdG8gcHJpbnQgdGhlIGN1cnJlbnQgdmFsdWVzLlxyXG4gKlxyXG4gKiBAcGFyYW0gZWxlbWVudHMgdGhlIGh0bWwgZWxlbWVudCBjb2xsZWN0aW9uIHRvIHNhdmUgZGVmYXVsdHMgdG9cclxuICpcclxuICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVJbnB1dERlZmF1bHRzKGVsZW1lbnRzOiBIVE1MQ29sbGVjdGlvbk9mPEhUTUxJbnB1dEVsZW1lbnQ+KTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTtcclxuICAgICAgZWxlbWVudFsnZGVmYXVsdFZhbHVlJ10gPSBlbGVtZW50LnZhbHVlO1xyXG4gICAgICBpZiAoZWxlbWVudFsnY2hlY2tlZCddKSBlbGVtZW50WydkZWZhdWx0Q2hlY2tlZCddID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSB1cGRhdGVTZWxlY3REZWZhdWx0cyhlbGVtZW50czogSFRNTENvbGxlY3Rpb25PZjxIVE1MU2VsZWN0RWxlbWVudD4pOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldO1xyXG4gICAgICBjb25zdCBzZWxlY3RlZElkeCA9IGVsZW1lbnQuc2VsZWN0ZWRJbmRleDtcclxuICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb246IEhUTUxPcHRpb25FbGVtZW50ID0gZWxlbWVudC5vcHRpb25zW3NlbGVjdGVkSWR4XTtcclxuXHJcbiAgICAgIHNlbGVjdGVkT3B0aW9uLmRlZmF1bHRTZWxlY3RlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgdXBkYXRlVGV4dEFyZWFEZWZhdWx0cyhlbGVtZW50czogSFRNTENvbGxlY3Rpb25PZjxIVE1MVGV4dEFyZWFFbGVtZW50Pik6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBlbGVtZW50ID0gZWxlbWVudHNbaV07XHJcbiAgICAgIGVsZW1lbnRbJ2RlZmF1bHRWYWx1ZSddID0gZWxlbWVudC52YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgdGhlIGh0bWwgY29udGVudHMgb2YgdGhlIHByaW50IHNlY3Rpb24gaWQuXHJcbiAgICogVXBkYXRlcyB0aGUgaHRtbCBlbGVtZW50cyB0byBkZWZhdWx0IHRoZWlyIGZvcm0gdmFsdWVzIHRvIHRoZSBjdXJyZW50IGZvcm0gdmFsdWVzXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gaHRtbCBzZWN0aW9uIHRvIGJlIHByaW50ZWRcclxuICAgKlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0SHRtbENvbnRlbnRzKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgY29uc3QgcHJpbnRDb250ZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucHJpbnRTZWN0aW9uSWQpO1xyXG4gICAgaWYgKCFwcmludENvbnRlbnRzKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBjb25zdCBpbnB1dEVscyA9IHByaW50Q29udGVudHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0Jyk7XHJcbiAgICBjb25zdCBzZWxlY3RFbHMgPSBwcmludENvbnRlbnRzLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzZWxlY3QnKTtcclxuICAgIGNvbnN0IHRleHRBcmVhRWxzID0gcHJpbnRDb250ZW50cy5nZXRFbGVtZW50c0J5VGFnTmFtZSgndGV4dGFyZWEnKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZUlucHV0RGVmYXVsdHMoaW5wdXRFbHMpO1xyXG4gICAgdGhpcy51cGRhdGVTZWxlY3REZWZhdWx0cyhzZWxlY3RFbHMpO1xyXG4gICAgdGhpcy51cGRhdGVUZXh0QXJlYURlZmF1bHRzKHRleHRBcmVhRWxzKTtcclxuXHJcbiAgICByZXR1cm4gcHJpbnRDb250ZW50cy5pbm5lckhUTUw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqXHJcbiAgICogQG1lbWJlcm9mIE5neFByaW50RGlyZWN0aXZlXHJcbiAgICovXHJcbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxyXG4gIHB1YmxpYyBwcmludCgpOiB2b2lkIHtcclxuICAgIGxldCBwcmludENvbnRlbnRzLCBwb3B1cFdpbiwgc3R5bGVzID0gJycsIGxpbmtzID0gJyc7XHJcbiAgICBjb25zdCBiYXNlVGFnID0gdGhpcy5nZXRFbGVtZW50VGFnKCdiYXNlJyk7XHJcblxyXG4gICAgaWYgKHRoaXMudXNlRXhpc3RpbmdDc3MpIHtcclxuICAgICAgc3R5bGVzID0gdGhpcy5nZXRFbGVtZW50VGFnKCdzdHlsZScpO1xyXG4gICAgICBsaW5rcyA9IHRoaXMuZ2V0RWxlbWVudFRhZygnbGluaycpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaW50Q29udGVudHMgPSB0aGlzLmdldEh0bWxDb250ZW50cygpO1xyXG4gICAgcG9wdXBXaW4gPSB3aW5kb3cub3BlbihcIlwiLCBcIl9ibGFua1wiLCBcInRvcD0wLGxlZnQ9MCxoZWlnaHQ9YXV0byx3aWR0aD1hdXRvXCIpO1xyXG4gICAgcG9wdXBXaW4uZG9jdW1lbnQub3BlbigpO1xyXG4gICAgcG9wdXBXaW4uZG9jdW1lbnQud3JpdGUoYFxyXG4gICAgICA8aHRtbD5cclxuICAgICAgICA8aGVhZD5cclxuICAgICAgICAgIDx0aXRsZT4ke3RoaXMucHJpbnRUaXRsZSA/IHRoaXMucHJpbnRUaXRsZSA6IFwiXCJ9PC90aXRsZT5cclxuICAgICAgICAgICR7YmFzZVRhZ31cclxuICAgICAgICAgICR7dGhpcy5yZXR1cm5TdHlsZVZhbHVlcygpfVxyXG4gICAgICAgICAgJHt0aGlzLnJldHVyblN0eWxlU2hlZXRMaW5rVGFncygpfVxyXG4gICAgICAgICAgJHtzdHlsZXN9XHJcbiAgICAgICAgICAke2xpbmtzfVxyXG4gICAgICAgIDwvaGVhZD5cclxuICAgICAgICA8Ym9keSAke3RoaXMuYm9keUNsYXNzID8gYGNsYXNzPVwiJHt0aGlzLmJvZHlDbGFzc31cImAgOiAnJ30+XHJcbiAgICAgICAgICAke3ByaW50Q29udGVudHN9XHJcbiAgICAgICAgICA8c2NyaXB0IGRlZmVyPlxyXG4gICAgICAgICAgICBmdW5jdGlvbiB0cmlnZ2VyUHJpbnQoZXZlbnQpIHtcclxuICAgICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsIHRyaWdnZXJQcmludCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICR7dGhpcy5wcmV2aWV3T25seSB8fCAhdGhpcy5jbG9zZVdpbmRvdyA/ICcnIDogYHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBjbG9zZVdpbmRvdyh3aW5kb3cucHJpbnQoKSk7XHJcbiAgICAgICAgICAgICAgfSwgJHt0aGlzLnByaW50RGVsYXl9KTtgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIGNsb3NlV2luZG93KCl7XHJcbiAgICAgICAgICAgICAgd2luZG93LmNsb3NlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCB0cmlnZ2VyUHJpbnQsIGZhbHNlKTtcclxuICAgICAgICAgIDwvc2NyaXB0PlxyXG4gICAgICAgIDwvYm9keT5cclxuICAgICAgPC9odG1sPmApO1xyXG4gICAgcG9wdXBXaW4uZG9jdW1lbnQuY2xvc2UoKTtcclxuICB9XHJcbn1cclxuIl19
|
|
115
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXByaW50LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbmd4LXByaW50LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFLL0MsTUFBTSxPQUFPLGlCQUFrQixTQUFRLFNBQVM7SUFDdEMsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFDMUM7Ozs7T0FJRztJQUNILElBQWEsV0FBVyxDQUFDLEtBQWM7UUFDckMsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDbkUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFhLGNBQWMsQ0FBQyxLQUFhO1FBQ3ZDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3RFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBYSxVQUFVLENBQUMsS0FBYTtRQUNuQyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUN0RSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQWEsY0FBYyxDQUFDLEtBQWM7UUFDeEMsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDdEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFhLFVBQVUsQ0FBQyxLQUFhO1FBQ25DLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ2xFLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFhLFdBQVcsQ0FBQyxLQUFjO1FBQ3JDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ25FLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFhLFNBQVMsQ0FBQyxLQUFhO1FBQ2xDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ2pFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFDSSxVQUFVLENBQUMsTUFBb0Q7UUFDakUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBR0Q7OztPQUdHO0lBQ0gsSUFDSSxjQUFjLENBQUMsT0FBZTtRQUNoQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7O09BSUc7SUFFSSxLQUFLO1FBQ1YsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDakMsQ0FBQzt1R0EzRlUsaUJBQWlCOzJGQUFqQixpQkFBaUI7OzJGQUFqQixpQkFBaUI7a0JBSjdCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOzhCQVFjLFdBQVc7c0JBQXZCLEtBQUs7Z0JBU08sY0FBYztzQkFBMUIsS0FBSztnQkFTTyxVQUFVO3NCQUF0QixLQUFLO2dCQVNPLGNBQWM7c0JBQTFCLEtBQUs7Z0JBU08sVUFBVTtzQkFBdEIsS0FBSztnQkFRTyxXQUFXO3NCQUF2QixLQUFLO2dCQVFPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBVUYsVUFBVTtzQkFEYixLQUFLO2dCQVdGLGNBQWM7c0JBRGpCLEtBQUs7Z0JBV0MsS0FBSztzQkFEWCxZQUFZO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUHJpbnRCYXNlIH0gZnJvbSAnLi9uZ3gtcHJpbnQuYmFzZSc7XHJcbmltcG9ydCB7IFByaW50T3B0aW9ucyB9IGZyb20gJy4vcHJpbnQtb3B0aW9ucyc7XHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiBcImJ1dHRvbltuZ3hQcmludF1cIixcclxuICBzdGFuZGFsb25lOiB0cnVlXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hQcmludERpcmVjdGl2ZSBleHRlbmRzIFByaW50QmFzZSB7XHJcbiAgcHJpdmF0ZSBwcmludE9wdGlvbnMgPSBuZXcgUHJpbnRPcHRpb25zKCk7XHJcbiAgLyoqXHJcbiAgICogUHJldmVudHMgdGhlIHByaW50IGRpYWxvZyBmcm9tIG9wZW5pbmcgb24gdGhlIHdpbmRvd1xyXG4gICAqXHJcbiAgICogQG1lbWJlcm9mIE5neFByaW50RGlyZWN0aXZlXHJcbiAgICovXHJcbiAgQElucHV0KCkgc2V0IHByZXZpZXdPbmx5KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnByaW50T3B0aW9ucyA9IHsgLi4udGhpcy5wcmludE9wdGlvbnMsIHByZXZpZXdPbmx5OiB2YWx1ZSB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKlxyXG4gICAqIEBtZW1iZXJvZiBOZ3hQcmludERpcmVjdGl2ZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNldCBwcmludFNlY3Rpb25JZCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnByaW50T3B0aW9ucyA9IHsgLi4udGhpcy5wcmludE9wdGlvbnMsIHByaW50U2VjdGlvbklkOiB2YWx1ZSB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKlxyXG4gICAqIEBtZW1iZXJvZiBOZ3hQcmludERpcmVjdGl2ZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNldCBwcmludFRpdGxlKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMucHJpbnRPcHRpb25zID0geyAuLi50aGlzLnByaW50T3B0aW9ucywgcHJpbnRTZWN0aW9uSWQ6IHZhbHVlIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqXHJcbiAgICogQG1lbWJlcm9mIE5neFByaW50RGlyZWN0aXZlXHJcbiAgICovXHJcbiAgQElucHV0KCkgc2V0IHVzZUV4aXN0aW5nQ3NzKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnByaW50T3B0aW9ucyA9IHsgLi4udGhpcy5wcmludE9wdGlvbnMsIHVzZUV4aXN0aW5nQ3NzOiB2YWx1ZSB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQSBkZWxheSBpbiBtaWxsaXNlY29uZHMgdG8gZm9yY2UgdGhlIHByaW50IGRpYWxvZyB0byB3YWl0IGJlZm9yZSBvcGVuZWQuIERlZmF1bHQ6IDBcclxuICAgKlxyXG4gICAqIEBtZW1iZXJvZiBOZ3hQcmludERpcmVjdGl2ZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNldCBwcmludERlbGF5KHZhbHVlOiBudW1iZXIpIHtcclxuICAgIHRoaXMucHJpbnRPcHRpb25zID0geyAuLi50aGlzLnByaW50T3B0aW9ucywgcHJpbnREZWxheTogdmFsdWUgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdG8gY2xvc2UgdGhlIHdpbmRvdyBhZnRlciBwcmludCgpIHJldHVybnMuXHJcbiAgICpcclxuICAgKi9cclxuICBASW5wdXQoKSBzZXQgY2xvc2VXaW5kb3codmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMucHJpbnRPcHRpb25zID0geyAuLi50aGlzLnByaW50T3B0aW9ucywgY2xvc2VXaW5kb3c6IHZhbHVlIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGFzcyBhdHRyaWJ1dGUgdG8gYXBwbHkgdG8gdGhlIGJvZHkgZWxlbWVudC5cclxuICAgKlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNldCBib2R5Q2xhc3ModmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5wcmludE9wdGlvbnMgPSB7IC4uLnRoaXMucHJpbnRPcHRpb25zLCBib2R5Q2xhc3M6IHZhbHVlIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqXHJcbiAgICogQG1lbWJlcm9mIE5neFByaW50RGlyZWN0aXZlXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgcHJpbnRTdHlsZSh2YWx1ZXM6IHsgW2tleTogc3RyaW5nXTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB9KSB7XHJcbiAgICBzdXBlci5zZXRQcmludFN0eWxlKHZhbHVlcyk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQG1lbWJlcm9mIE5neFByaW50RGlyZWN0aXZlXHJcbiAgICogQHBhcmFtIGNzc0xpc3RcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBzdHlsZVNoZWV0RmlsZShjc3NMaXN0OiBzdHJpbmcpIHtcclxuICAgIHN1cGVyLnNldFN0eWxlU2hlZXRGaWxlKGNzc0xpc3QpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKlxyXG4gICAqIEBtZW1iZXJvZiBOZ3hQcmludERpcmVjdGl2ZVxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJylcclxuICBwdWJsaWMgcHJpbnQoKTogdm9pZCB7XHJcbiAgICBzdXBlci5wcmludCh0aGlzLnByaW50T3B0aW9ucyk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -2,15 +2,15 @@ import { NgModule } from '@angular/core';
|
|
|
2
2
|
import { NgxPrintDirective } from './ngx-print.directive';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export class NgxPrintModule {
|
|
5
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
6
|
-
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "
|
|
7
|
-
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "
|
|
5
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: NgxPrintModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
6
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.0.4", ngImport: i0, type: NgxPrintModule, imports: [NgxPrintDirective], exports: [NgxPrintDirective] });
|
|
7
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: NgxPrintModule });
|
|
8
8
|
}
|
|
9
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
9
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: NgxPrintModule, decorators: [{
|
|
10
10
|
type: NgModule,
|
|
11
11
|
args: [{
|
|
12
12
|
imports: [NgxPrintDirective],
|
|
13
13
|
exports: [NgxPrintDirective]
|
|
14
14
|
}]
|
|
15
15
|
}] });
|
|
16
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXByaW50Lm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbmd4LXByaW50Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQU0xRCxNQUFNLE9BQU8sY0FBYzt1R0FBZCxjQUFjO3dHQUFkLGNBQWMsWUFIZixpQkFBaUIsYUFDakIsaUJBQWlCO3dHQUVoQixjQUFjOzsyRkFBZCxjQUFjO2tCQUoxQixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLGlCQUFpQixDQUFDO29CQUM1QixPQUFPLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztpQkFDN0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOZ3hQcmludERpcmVjdGl2ZSB9IGZyb20gJy4vbmd4LXByaW50LmRpcmVjdGl2ZSc7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gIGltcG9ydHM6IFtOZ3hQcmludERpcmVjdGl2ZV0sXHJcbiAgZXhwb3J0czogW05neFByaW50RGlyZWN0aXZlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmd4UHJpbnRNb2R1bGUgeyB9XHJcbiJdfQ==
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Injectable } from "@angular/core";
|
|
2
|
+
import { PrintBase } from "./ngx-print.base";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* Service for handling printing functionality in Angular applications.
|
|
6
|
+
* Extends the base printing class (PrintBase).
|
|
7
|
+
*
|
|
8
|
+
* @export
|
|
9
|
+
* @class NgxPrintService
|
|
10
|
+
* @extends {PrintBase}
|
|
11
|
+
*/
|
|
12
|
+
export class NgxPrintService extends PrintBase {
|
|
13
|
+
/**
|
|
14
|
+
* Initiates the printing process using the provided print options.
|
|
15
|
+
*
|
|
16
|
+
* @param {PrintOptions} printOptions - Options for configuring the printing process.
|
|
17
|
+
* @memberof NgxPrintService
|
|
18
|
+
* @returns {void}
|
|
19
|
+
*/
|
|
20
|
+
print(printOptions) {
|
|
21
|
+
// Call the print method in the parent class
|
|
22
|
+
super.print(printOptions);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Sets the print style for the printing process.
|
|
26
|
+
*
|
|
27
|
+
* @param {{ [key: string]: { [key: string]: string } }} values - A dictionary representing the print styles.
|
|
28
|
+
* @memberof NgxPrintService
|
|
29
|
+
* @setter
|
|
30
|
+
*/
|
|
31
|
+
set printStyle(values) {
|
|
32
|
+
super.setPrintStyle(values);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Sets the stylesheet file for the printing process.
|
|
36
|
+
*
|
|
37
|
+
* @param {string} cssList - A string representing the path to the stylesheet file.
|
|
38
|
+
* @memberof NgxPrintService
|
|
39
|
+
* @setter
|
|
40
|
+
*/
|
|
41
|
+
set styleSheetFile(cssList) {
|
|
42
|
+
super.setStyleSheetFile(cssList);
|
|
43
|
+
}
|
|
44
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: NgxPrintService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
|
|
45
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: NgxPrintService, providedIn: "root" });
|
|
46
|
+
}
|
|
47
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: NgxPrintService, decorators: [{
|
|
48
|
+
type: Injectable,
|
|
49
|
+
args: [{
|
|
50
|
+
providedIn: "root",
|
|
51
|
+
}]
|
|
52
|
+
}] });
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXByaW50LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL25neC1wcmludC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDOztBQUc3Qzs7Ozs7OztHQU9HO0FBSUgsTUFBTSxPQUFPLGVBQWdCLFNBQVEsU0FBUztJQUU1Qzs7Ozs7O09BTUc7SUFDSSxLQUFLLENBQUMsWUFBMEI7UUFDckMsNENBQTRDO1FBQzVDLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILElBQUksVUFBVSxDQUFDLE1BQW9EO1FBQ2pFLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUdEOzs7Ozs7T0FNRztJQUNILElBQUksY0FBYyxDQUFDLE9BQWU7UUFDaEMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLENBQUM7dUdBbkNVLGVBQWU7MkdBQWYsZUFBZSxjQUZkLE1BQU07OzJGQUVQLGVBQWU7a0JBSDNCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFByaW50QmFzZSB9IGZyb20gXCIuL25neC1wcmludC5iYXNlXCI7XHJcbmltcG9ydCB7IFByaW50T3B0aW9ucyB9IGZyb20gXCIuL3ByaW50LW9wdGlvbnNcIjtcclxuXHJcbi8qKlxyXG4gKiBTZXJ2aWNlIGZvciBoYW5kbGluZyBwcmludGluZyBmdW5jdGlvbmFsaXR5IGluIEFuZ3VsYXIgYXBwbGljYXRpb25zLlxyXG4gKiBFeHRlbmRzIHRoZSBiYXNlIHByaW50aW5nIGNsYXNzIChQcmludEJhc2UpLlxyXG4gKlxyXG4gKiBAZXhwb3J0XHJcbiAqIEBjbGFzcyBOZ3hQcmludFNlcnZpY2VcclxuICogQGV4dGVuZHMge1ByaW50QmFzZX1cclxuICovXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiBcInJvb3RcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIE5neFByaW50U2VydmljZSBleHRlbmRzIFByaW50QmFzZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEluaXRpYXRlcyB0aGUgcHJpbnRpbmcgcHJvY2VzcyB1c2luZyB0aGUgcHJvdmlkZWQgcHJpbnQgb3B0aW9ucy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UHJpbnRPcHRpb25zfSBwcmludE9wdGlvbnMgLSBPcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgcHJpbnRpbmcgcHJvY2Vzcy5cclxuICAgKiBAbWVtYmVyb2YgTmd4UHJpbnRTZXJ2aWNlXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIHByaW50KHByaW50T3B0aW9uczogUHJpbnRPcHRpb25zKTogdm9pZCB7XHJcbiAgICAvLyBDYWxsIHRoZSBwcmludCBtZXRob2QgaW4gdGhlIHBhcmVudCBjbGFzc1xyXG4gICAgc3VwZXIucHJpbnQocHJpbnRPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHByaW50IHN0eWxlIGZvciB0aGUgcHJpbnRpbmcgcHJvY2Vzcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IH19IHZhbHVlcyAtIEEgZGljdGlvbmFyeSByZXByZXNlbnRpbmcgdGhlIHByaW50IHN0eWxlcy5cclxuICAgKiBAbWVtYmVyb2YgTmd4UHJpbnRTZXJ2aWNlXHJcbiAgICogQHNldHRlclxyXG4gICAqL1xyXG4gIHNldCBwcmludFN0eWxlKHZhbHVlczogeyBba2V5OiBzdHJpbmddOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IH0pIHtcclxuICAgIHN1cGVyLnNldFByaW50U3R5bGUodmFsdWVzKTtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBzdHlsZXNoZWV0IGZpbGUgZm9yIHRoZSBwcmludGluZyBwcm9jZXNzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNzc0xpc3QgLSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhdGggdG8gdGhlIHN0eWxlc2hlZXQgZmlsZS5cclxuICAgKiBAbWVtYmVyb2YgTmd4UHJpbnRTZXJ2aWNlXHJcbiAgICogQHNldHRlclxyXG4gICAqL1xyXG4gIHNldCBzdHlsZVNoZWV0RmlsZShjc3NMaXN0OiBzdHJpbmcpIHtcclxuICAgIHN1cGVyLnNldFN0eWxlU2hlZXRGaWxlKGNzc0xpc3QpO1xyXG4gIH1cclxufVxyXG4iXX0=
|