ngx-print 1.3.0 → 1.4.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 +35 -0
- package/esm2022/lib/ngx-print.directive.mjs +236 -0
- package/esm2022/lib/ngx-print.module.mjs +16 -0
- package/esm2022/ngx-print.mjs +5 -0
- package/esm2022/public_api.mjs +6 -0
- package/fesm2022/ngx-print.mjs +260 -0
- package/fesm2022/ngx-print.mjs.map +1 -0
- package/index.d.ts +6 -0
- package/lib/ngx-print.directive.d.ts +113 -0
- package/lib/ngx-print.directive.d.ts.map +1 -0
- package/lib/ngx-print.module.d.ts +8 -0
- package/lib/ngx-print.module.d.ts.map +1 -0
- package/ngx-print.d.ts.map +1 -0
- package/package.json +42 -47
- package/{src/public_api.ts → public_api.d.ts} +3 -6
- package/public_api.d.ts.map +1 -0
- package/.editorconfig +0 -13
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -31
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
- package/.nvmrc +0 -1
- package/.travis.yml +0 -40
- package/CHANGELOG.md +0 -10
- package/_config.yml +0 -1
- package/angular.json +0 -48
- package/karma.conf.js +0 -47
- package/ng-package.json +0 -8
- package/src/lib/ngx-print.directive.spec.ts +0 -112
- package/src/lib/ngx-print.directive.ts +0 -193
- package/src/lib/ngx-print.module.ts +0 -10
- package/tsconfig.json +0 -29
- package/tsconfig.lib.json +0 -14
- package/tsconfig.spec.json +0 -17
- package/tslint.json +0 -17
package/README.md
CHANGED
|
@@ -8,6 +8,7 @@ This directive makes printing your HTML sections smooth and easy in your Angular
|
|
|
8
8
|
| ------------ | ------------ |
|
|
9
9
|
| 1.2.1 | 7.0.0 - 14.1.0 |
|
|
10
10
|
| 1.3.x | 15.0.0 |
|
|
11
|
+
| 1.4.x | 16.0.0 |
|
|
11
12
|
## Setup
|
|
12
13
|
|
|
13
14
|
**1-** In your root application folder run:
|
|
@@ -150,6 +151,40 @@ Here some simple styles were added to every `h1` & `h2` tags within the `div` wh
|
|
|
150
151
|
printSectionId="print-section"
|
|
151
152
|
ngxPrint>print</button>
|
|
152
153
|
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
- Some print operations open a second dialog, and automatically closing the popup window happens before the second dialog opens. Set `closeWindow` to false to handle print operations that open a second dialog, like "Microsoft Print to PDF", or "Print using system dialog...":
|
|
157
|
+
|
|
158
|
+
```html
|
|
159
|
+
|
|
160
|
+
<div id="print-section">
|
|
161
|
+
|
|
162
|
+
<!-- ... -->
|
|
163
|
+
|
|
164
|
+
</div>
|
|
165
|
+
|
|
166
|
+
<button
|
|
167
|
+
[closeWindow]="false"
|
|
168
|
+
printSectionId="print-section"
|
|
169
|
+
ngxPrint>print</button>
|
|
170
|
+
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
- Set `bodyClass` to whatever class values are needed for some of your css rules that expect an ancestor to have a certain class. For example, a theme selector:
|
|
174
|
+
|
|
175
|
+
```html
|
|
176
|
+
|
|
177
|
+
<div id="print-section">
|
|
178
|
+
|
|
179
|
+
<!-- ... -->
|
|
180
|
+
|
|
181
|
+
</div>
|
|
182
|
+
|
|
183
|
+
<button
|
|
184
|
+
[bodyClass]="theme-dark"
|
|
185
|
+
printSectionId="print-section"
|
|
186
|
+
ngxPrint>print</button>
|
|
187
|
+
|
|
153
188
|
```
|
|
154
189
|
## Contributors :1st_place_medal:
|
|
155
190
|
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { Directive, HostListener, Input } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class NgxPrintDirective {
|
|
4
|
+
_printStyle = [];
|
|
5
|
+
/**
|
|
6
|
+
* Prevents the print dialog from opening on the window
|
|
7
|
+
*
|
|
8
|
+
* @memberof NgxPrintDirective
|
|
9
|
+
*/
|
|
10
|
+
previewOnly = false;
|
|
11
|
+
/**
|
|
12
|
+
*
|
|
13
|
+
*
|
|
14
|
+
* @memberof NgxPrintDirective
|
|
15
|
+
*/
|
|
16
|
+
printSectionId;
|
|
17
|
+
/**
|
|
18
|
+
*
|
|
19
|
+
*
|
|
20
|
+
* @memberof NgxPrintDirective
|
|
21
|
+
*/
|
|
22
|
+
printTitle;
|
|
23
|
+
/**
|
|
24
|
+
*
|
|
25
|
+
*
|
|
26
|
+
* @memberof NgxPrintDirective
|
|
27
|
+
*/
|
|
28
|
+
useExistingCss = false;
|
|
29
|
+
/**
|
|
30
|
+
* A delay in milliseconds to force the print dialog to wait before opened. Default: 0
|
|
31
|
+
*
|
|
32
|
+
* @memberof NgxPrintDirective
|
|
33
|
+
*/
|
|
34
|
+
printDelay = 0;
|
|
35
|
+
/**
|
|
36
|
+
* Whether to close the window after print() returns.
|
|
37
|
+
*
|
|
38
|
+
*/
|
|
39
|
+
closeWindow = true;
|
|
40
|
+
/**
|
|
41
|
+
* Class attribute to apply to the body element.
|
|
42
|
+
*
|
|
43
|
+
*/
|
|
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();
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
*
|
|
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
|
+
*/
|
|
68
|
+
returnStyleValues() {
|
|
69
|
+
return `<style> ${this._printStyle.join(' ').replace(/,/g, ';')} </style>`;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
*
|
|
73
|
+
*
|
|
74
|
+
* @returns html for the given tag
|
|
75
|
+
*
|
|
76
|
+
* @memberof NgxPrintDirective
|
|
77
|
+
*/
|
|
78
|
+
_styleSheetFile = '';
|
|
79
|
+
/**
|
|
80
|
+
* @memberof NgxPrintDirective
|
|
81
|
+
* @param cssList
|
|
82
|
+
*/
|
|
83
|
+
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;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
*
|
|
164
|
+
*
|
|
165
|
+
* @memberof NgxPrintDirective
|
|
166
|
+
*/
|
|
167
|
+
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();
|
|
204
|
+
}
|
|
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 });
|
|
207
|
+
}
|
|
208
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgxPrintDirective, decorators: [{
|
|
209
|
+
type: Directive,
|
|
210
|
+
args: [{
|
|
211
|
+
selector: "button[ngxPrint]",
|
|
212
|
+
standalone: true
|
|
213
|
+
}]
|
|
214
|
+
}], propDecorators: { previewOnly: [{
|
|
215
|
+
type: Input
|
|
216
|
+
}], printSectionId: [{
|
|
217
|
+
type: Input
|
|
218
|
+
}], printTitle: [{
|
|
219
|
+
type: Input
|
|
220
|
+
}], useExistingCss: [{
|
|
221
|
+
type: Input
|
|
222
|
+
}], printDelay: [{
|
|
223
|
+
type: Input
|
|
224
|
+
}], closeWindow: [{
|
|
225
|
+
type: Input
|
|
226
|
+
}], bodyClass: [{
|
|
227
|
+
type: Input
|
|
228
|
+
}], printStyle: [{
|
|
229
|
+
type: Input
|
|
230
|
+
}], styleSheetFile: [{
|
|
231
|
+
type: Input
|
|
232
|
+
}], print: [{
|
|
233
|
+
type: HostListener,
|
|
234
|
+
args: ['click']
|
|
235
|
+
}] } });
|
|
236
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXByaW50LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbmd4LXByaW50LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSy9ELE1BQU0sT0FBTyxpQkFBaUI7SUFFckIsV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUV4Qjs7OztPQUlHO0lBQ00sV0FBVyxHQUFZLEtBQUssQ0FBQztJQUV0Qzs7OztPQUlHO0lBQ00sY0FBYyxDQUFTO0lBRWhDOzs7O09BSUc7SUFDTSxVQUFVLENBQVM7SUFFNUI7Ozs7T0FJRztJQUNNLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFFaEM7Ozs7T0FJRztJQUNNLFVBQVUsR0FBVyxDQUFDLENBQUM7SUFFaEM7OztPQUdHO0lBQ00sV0FBVyxHQUFZLElBQUksQ0FBQztJQUVyQzs7O09BR0c7SUFDTSxTQUFTLEdBQVcsRUFBRSxDQUFDO0lBRWhDOzs7O09BSUc7SUFDSCxJQUNJLFVBQVUsQ0FBQyxNQUFvRDtRQUNqRSxLQUFLLElBQUksR0FBRyxJQUFJLE1BQU0sRUFBRTtZQUN0QixJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDbEY7U0FDRjtRQUNELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSSxpQkFBaUI7UUFDdEIsT0FBTyxXQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFD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QUdULElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDN0MsT0FBTztZQUNQLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUN4QixJQUFJLENBQUMsd0JBQXdCLEVBQUU7WUFDL0IsTUFBTTtZQUNOLEtBQUs7O2dCQUVELElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3JELGFBQWE7Ozs7Z0JBSVQsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7O21CQUUxQyxJQUFJLENBQUMsVUFBVSxJQUFJOzs7Ozs7OztjQVF4QixDQUFDLENBQUM7UUFDWixRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzVCLENBQUM7d0dBL05VLGlCQUFpQjs0RkFBakIsaUJBQWlCOzs0RkFBakIsaUJBQWlCO2tCQUo3QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs4QkFVVSxXQUFXO3NCQUFuQixLQUFLO2dCQU9HLGNBQWM7c0JBQXRCLEtBQUs7Z0JBT0csVUFBVTtzQkFBbEIsS0FBSztnQkFPRyxjQUFjO3NCQUF0QixLQUFLO2dCQU9HLFVBQVU7c0JBQWxCLEtBQUs7Z0JBTUcsV0FBVztzQkFBbkIsS0FBSztnQkFNRyxTQUFTO3NCQUFqQixLQUFLO2dCQVFGLFVBQVU7c0JBRGIsS0FBSztnQkFzQ0YsY0FBYztzQkFEakIsS0FBSztnQkEyRkMsS0FBSztzQkFEWCxZQUFZO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6IFwiYnV0dG9uW25neFByaW50XVwiLFxyXG4gIHN0YW5kYWxvbmU6IHRydWVcclxufSlcclxuZXhwb3J0IGNsYXNzIE5neFByaW50RGlyZWN0aXZlIHtcclxuXHJcbiAgcHVibGljIF9wcmludFN0eWxlID0gW107XHJcblxyXG4gIC8qKlxyXG4gICAqIFByZXZlbnRzIHRoZSBwcmludCBkaWFsb2cgZnJvbSBvcGVuaW5nIG9uIHRoZSB3aW5kb3dcclxuICAgKlxyXG4gICAqIEBtZW1iZXJvZiBOZ3hQcmludERpcmVjdGl2ZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHByZXZpZXdPbmx5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICpcclxuICAgKiBAbWVtYmVyb2YgTmd4UHJpbnREaXJlY3RpdmVcclxuICAgKi9cclxuICBASW5wdXQoKSBwcmludFNlY3Rpb25JZDogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqXHJcbiAgICogQG1lbWJlcm9mIE5neFByaW50RGlyZWN0aXZlXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHJpbnRUaXRsZTogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqXHJcbiAgICogQG1lbWJlcm9mIE5neFByaW50RGlyZWN0aXZlXHJcbiAgICovXHJcbiAgQElucHV0KCkgdXNlRXhpc3RpbmdDc3MgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQSBkZWxheSBpbiBtaWxsaXNlY29uZHMgdG8gZm9yY2UgdGhlIHByaW50IGRpYWxvZyB0byB3YWl0IGJlZm9yZSBvcGVuZWQuIERlZmF1bHQ6IDBcclxuICAgKlxyXG4gICAqIEBtZW1iZXJvZiBOZ3hQcmludERpcmVjdGl2ZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHByaW50RGVsYXk6IG51bWJlciA9IDA7XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdG8gY2xvc2UgdGhlIHdpbmRvdyBhZnRlciBwcmludCgpIHJldHVybnMuXHJcbiAgICpcclxuICAgKi9cclxuICBASW5wdXQoKSBjbG9zZVdpbmRvdzogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKlxyXG4gICAqIENsYXNzIGF0dHJpYnV0ZSB0byBhcHBseSB0byB0aGUgYm9keSBlbGVtZW50LlxyXG4gICAqXHJcbiAgICovXHJcbiAgQElucHV0KCkgYm9keUNsYXNzOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKlxyXG4gICAqIEBtZW1iZXJvZiBOZ3hQcmludERpcmVjdGl2ZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHByaW50U3R5bGUodmFsdWVzOiB7IFtrZXk6IHN0cmluZ106IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gfSkge1xyXG4gICAgZm9yIChsZXQga2V5IGluIHZhbHVlcykge1xyXG4gICAgICBpZiAodmFsdWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICB0aGlzLl9wcmludFN0eWxlLnB1c2goKGtleSArIEpTT04uc3RyaW5naWZ5KHZhbHVlc1trZXldKSkucmVwbGFjZSgvWydcIl0rL2csICcnKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMucmV0dXJuU3R5bGVWYWx1ZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB0aGUgc3RyaW5nIHRoYXQgY3JlYXRlIHRoZSBzdHlsZXNoZWV0IHdoaWNoIHdpbGwgYmUgaW5qZWN0ZWRcclxuICAgKiBsYXRlciB3aXRoaW4gPHN0eWxlPjwvc3R5bGU+IHRhZy5cclxuICAgKlxyXG4gICAqIC1qb2luL3JlcGxhY2UgdG8gdHJhbnNmb3JtIGFuIGFycmF5IG9iamVjdHMgdG8gY3NzLXN0eWxlZCBzdHJpbmdcclxuICAgKlxyXG4gICAqIEBtZW1iZXJvZiBOZ3hQcmludERpcmVjdGl2ZVxyXG4gICAqL1xyXG4gIHB1YmxpYyByZXR1cm5TdHlsZVZhbHVlcygpIHtcclxuICAgIHJldHVybiBgPHN0eWxlPiAke3RoaXMuX3ByaW50U3R5bGUuam9pbignICcpLnJlcGxhY2UoLywvZywgJzsnKX0gPC9zdHlsZT5gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKlxyXG4gICAqIEByZXR1cm5zIGh0bWwgZm9yIHRoZSBnaXZlbiB0YWdcclxuICAgKlxyXG4gICAqIEBtZW1iZXJvZiBOZ3hQcmludERpcmVjdGl2ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3N0eWxlU2hlZXRGaWxlID0gJyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBtZW1iZXJvZiBOZ3hQcmludERpcmVjdGl2ZVxyXG4gICAqIEBwYXJhbSBjc3NMaXN0XHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgc3R5bGVTaGVldEZpbGUoY3NzTGlzdDogc3RyaW5nKSB7XHJcbiAgICBsZXQgbGlua1RhZ0ZuID0gZnVuY3Rpb24gKGNzc0ZpbGVOYW1lKSB7XHJcbiAgICAgIHJldHVybiBgPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiIGhyZWY9XCIke2Nzc0ZpbGVOYW1lfVwiPmA7XHJcbiAgICB9XHJcbiAgICBpZiAoY3NzTGlzdC5pbmRleE9mKCcsJykgIT09IC0xKSB7XHJcbiAgICAgIGNvbnN0IHZhbHVlQXJyID0gY3NzTGlzdC5zcGxpdCgnLCcpO1xyXG4gICAgICBmb3IgKGxldCB2YWwgb2YgdmFsdWVBcnIpIHtcclxuICAgICAgICB0aGlzLl9zdHlsZVNoZWV0RmlsZSA9IHRoaXMuX3N0eWxlU2hlZXRGaWxlICsgbGlua1RhZ0ZuKHZhbCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3N0eWxlU2hlZXRGaWxlID0gbGlua1RhZ0ZuKGNzc0xpc3QpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHJldHVybnMgc3RyaW5nIHdoaWNoIGNvbnRhaW5zIHRoZSBsaW5rIHRhZ3MgY29udGFpbmluZyB0aGUgY3NzIHdoaWNoIHdpbGxcclxuICAgKiBiZSBpbmplY3RlZCBsYXRlciB3aXRoaW4gPGhlYWQ+PC9oZWFkPiB0YWcuXHJcbiAgICpcclxuICAgKi9cclxuICBwcml2YXRlIHJldHVyblN0eWxlU2hlZXRMaW5rVGFncygpIHtcclxuICAgIHJldHVybiB0aGlzLl9zdHlsZVNoZWV0RmlsZTtcclxuICB9XHJcbiAgcHJpdmF0ZSBnZXRFbGVtZW50VGFnKHRhZzoga2V5b2YgSFRNTEVsZW1lbnRUYWdOYW1lTWFwKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGh0bWw6IHN0cmluZ1tdID0gW107XHJcbiAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZyk7XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZWxlbWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGh0bWwucHVzaChlbGVtZW50c1tpbmRleF0ub3V0ZXJIVE1MKTtcclxuICAgIH1cclxuICAgIHJldHVybiBodG1sLmpvaW4oJ1xcclxcbicpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAqXHJcbiAqIEBkZXNjcmlwdGlvbiBXaGVuIHByaW50aW5nLCB0aGUgZGVmYXVsdCBvcHRpb24gb2YgZm9ybSBlbGVtZW50cyBhcmUgcHJpbnRlZC5cclxuICogSGVyZSB3ZSB1cGRhdGUgd2hhdCB0aGF0IGRlZmF1bHQgaXMgdG8gcHJpbnQgdGhlIGN1cnJlbnQgdmFsdWVzLlxyXG4gKlxyXG4gKiBAcGFyYW0gZWxlbWVudHMgdGhlIGh0bWwgZWxlbWVudCBjb2xsZWN0aW9uIHRvIHNhdmUgZGVmYXVsdHMgdG9cclxuICpcclxuICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVJbnB1dERlZmF1bHRzKGVsZW1lbnRzOiBIVE1MQ29sbGVjdGlvbk9mPEhUTUxJbnB1dEVsZW1lbnQ+KTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTtcclxuICAgICAgZWxlbWVudFsnZGVmYXVsdFZhbHVlJ10gPSBlbGVtZW50LnZhbHVlO1xyXG4gICAgICBpZiAoZWxlbWVudFsnY2hlY2tlZCddKSBlbGVtZW50WydkZWZhdWx0Q2hlY2tlZCddID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSB1cGRhdGVTZWxlY3REZWZhdWx0cyhlbGVtZW50czogSFRNTENvbGxlY3Rpb25PZjxIVE1MU2VsZWN0RWxlbWVudD4pOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldO1xyXG4gICAgICBjb25zdCBzZWxlY3RlZElkeCA9IGVsZW1lbnQuc2VsZWN0ZWRJbmRleDtcclxuICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb246IEhUTUxPcHRpb25FbGVtZW50ID0gZWxlbWVudC5vcHRpb25zW3NlbGVjdGVkSWR4XTtcclxuXHJcbiAgICAgIHNlbGVjdGVkT3B0aW9uLmRlZmF1bHRTZWxlY3RlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgdXBkYXRlVGV4dEFyZWFEZWZhdWx0cyhlbGVtZW50czogSFRNTENvbGxlY3Rpb25PZjxIVE1MVGV4dEFyZWFFbGVtZW50Pik6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBlbGVtZW50ID0gZWxlbWVudHNbaV07XHJcbiAgICAgIGVsZW1lbnRbJ2RlZmF1bHRWYWx1ZSddID0gZWxlbWVudC52YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgdGhlIGh0bWwgY29udGVudHMgb2YgdGhlIHByaW50IHNlY3Rpb24gaWQuXHJcbiAgICogVXBkYXRlcyB0aGUgaHRtbCBlbGVtZW50cyB0byBkZWZhdWx0IHRoZWlyIGZvcm0gdmFsdWVzIHRvIHRoZSBjdXJyZW50IGZvcm0gdmFsdWVzXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gaHRtbCBzZWN0aW9uIHRvIGJlIHByaW50ZWRcclxuICAgKlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0SHRtbENvbnRlbnRzKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgY29uc3QgcHJpbnRDb250ZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucHJpbnRTZWN0aW9uSWQpO1xyXG4gICAgaWYgKCFwcmludENvbnRlbnRzKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBjb25zdCBpbnB1dEVscyA9IHByaW50Q29udGVudHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0Jyk7XHJcbiAgICBjb25zdCBzZWxlY3RFbHMgPSBwcmludENvbnRlbnRzLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzZWxlY3QnKTtcclxuICAgIGNvbnN0IHRleHRBcmVhRWxzID0gcHJpbnRDb250ZW50cy5nZXRFbGVtZW50c0J5VGFnTmFtZSgndGV4dGFyZWEnKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZUlucHV0RGVmYXVsdHMoaW5wdXRFbHMpO1xyXG4gICAgdGhpcy51cGRhdGVTZWxlY3REZWZhdWx0cyhzZWxlY3RFbHMpO1xyXG4gICAgdGhpcy51cGRhdGVUZXh0QXJlYURlZmF1bHRzKHRleHRBcmVhRWxzKTtcclxuXHJcbiAgICByZXR1cm4gcHJpbnRDb250ZW50cy5pbm5lckhUTUw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqXHJcbiAgICogQG1lbWJlcm9mIE5neFByaW50RGlyZWN0aXZlXHJcbiAgICovXHJcbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxyXG4gIHB1YmxpYyBwcmludCgpOiB2b2lkIHtcclxuICAgIGxldCBwcmludENvbnRlbnRzLCBwb3B1cFdpbiwgc3R5bGVzID0gJycsIGxpbmtzID0gJyc7XHJcbiAgICBjb25zdCBiYXNlVGFnID0gdGhpcy5nZXRFbGVtZW50VGFnKCdiYXNlJyk7XHJcblxyXG4gICAgaWYgKHRoaXMudXNlRXhpc3RpbmdDc3MpIHtcclxuICAgICAgc3R5bGVzID0gdGhpcy5nZXRFbGVtZW50VGFnKCdzdHlsZScpO1xyXG4gICAgICBsaW5rcyA9IHRoaXMuZ2V0RWxlbWVudFRhZygnbGluaycpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaW50Q29udGVudHMgPSB0aGlzLmdldEh0bWxDb250ZW50cygpO1xyXG4gICAgcG9wdXBXaW4gPSB3aW5kb3cub3BlbihcIlwiLCBcIl9ibGFua1wiLCBcInRvcD0wLGxlZnQ9MCxoZWlnaHQ9YXV0byx3aWR0aD1hdXRvXCIpO1xyXG4gICAgcG9wdXBXaW4uZG9jdW1lbnQub3BlbigpO1xyXG4gICAgcG9wdXBXaW4uZG9jdW1lbnQud3JpdGUoYFxyXG4gICAgICA8aHRtbD5cclxuICAgICAgICA8aGVhZD5cclxuICAgICAgICAgIDx0aXRsZT4ke3RoaXMucHJpbnRUaXRsZSA/IHRoaXMucHJpbnRUaXRsZSA6IFwiXCJ9PC90aXRsZT5cclxuICAgICAgICAgICR7YmFzZVRhZ31cclxuICAgICAgICAgICR7dGhpcy5yZXR1cm5TdHlsZVZhbHVlcygpfVxyXG4gICAgICAgICAgJHt0aGlzLnJldHVyblN0eWxlU2hlZXRMaW5rVGFncygpfVxyXG4gICAgICAgICAgJHtzdHlsZXN9XHJcbiAgICAgICAgICAke2xpbmtzfVxyXG4gICAgICAgIDwvaGVhZD5cclxuICAgICAgICA8Ym9keSAke3RoaXMuYm9keUNsYXNzID8gYGNsYXNzPVwiJHt0aGlzLmJvZHlDbGFzc31cImAgOiAnJ30+XHJcbiAgICAgICAgICAke3ByaW50Q29udGVudHN9XHJcbiAgICAgICAgICA8c2NyaXB0IGRlZmVyPlxyXG4gICAgICAgICAgICBmdW5jdGlvbiB0cmlnZ2VyUHJpbnQoZXZlbnQpIHtcclxuICAgICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsIHRyaWdnZXJQcmludCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICR7dGhpcy5wcmV2aWV3T25seSB8fCAhdGhpcy5jbG9zZVdpbmRvdyA/ICcnIDogYHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBjbG9zZVdpbmRvdyh3aW5kb3cucHJpbnQoKSk7XHJcbiAgICAgICAgICAgICAgfSwgJHt0aGlzLnByaW50RGVsYXl9KTtgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIGNsb3NlV2luZG93KCl7XHJcbiAgICAgICAgICAgICAgd2luZG93LmNsb3NlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCB0cmlnZ2VyUHJpbnQsIGZhbHNlKTtcclxuICAgICAgICAgIDwvc2NyaXB0PlxyXG4gICAgICAgIDwvYm9keT5cclxuICAgICAgPC9odG1sPmApO1xyXG4gICAgcG9wdXBXaW4uZG9jdW1lbnQuY2xvc2UoKTtcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { NgxPrintDirective } from './ngx-print.directive';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class NgxPrintModule {
|
|
5
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgxPrintModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
6
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: NgxPrintModule, imports: [NgxPrintDirective], exports: [NgxPrintDirective] });
|
|
7
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgxPrintModule });
|
|
8
|
+
}
|
|
9
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgxPrintModule, decorators: [{
|
|
10
|
+
type: NgModule,
|
|
11
|
+
args: [{
|
|
12
|
+
imports: [NgxPrintDirective],
|
|
13
|
+
exports: [NgxPrintDirective]
|
|
14
|
+
}]
|
|
15
|
+
}] });
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXByaW50Lm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbmd4LXByaW50Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQU0xRCxNQUFNLE9BQU8sY0FBYzt3R0FBZCxjQUFjO3lHQUFkLGNBQWMsWUFIZixpQkFBaUIsYUFDakIsaUJBQWlCO3lHQUVoQixjQUFjOzs0RkFBZCxjQUFjO2tCQUoxQixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLGlCQUFpQixDQUFDO29CQUM1QixPQUFPLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztpQkFDN0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOZ3hQcmludERpcmVjdGl2ZSB9IGZyb20gJy4vbmd4LXByaW50LmRpcmVjdGl2ZSc7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gIGltcG9ydHM6IFtOZ3hQcmludERpcmVjdGl2ZV0sXHJcbiAgZXhwb3J0czogW05neFByaW50RGlyZWN0aXZlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmd4UHJpbnRNb2R1bGUgeyB9XHJcbiJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public_api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXByaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25neC1wcmludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpY19hcGknO1xuIl19
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Public API Surface of ngx-print
|
|
3
|
+
*/
|
|
4
|
+
export * from './lib/ngx-print.directive';
|
|
5
|
+
export * from './lib/ngx-print.module';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wdWJsaWNfYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLHdCQUF3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIG5neC1wcmludFxyXG4gKi9cclxuXHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL25neC1wcmludC5kaXJlY3RpdmUnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9uZ3gtcHJpbnQubW9kdWxlJztcclxuIl19
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Directive, Input, HostListener, NgModule } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
class NgxPrintDirective {
|
|
5
|
+
_printStyle = [];
|
|
6
|
+
/**
|
|
7
|
+
* Prevents the print dialog from opening on the window
|
|
8
|
+
*
|
|
9
|
+
* @memberof NgxPrintDirective
|
|
10
|
+
*/
|
|
11
|
+
previewOnly = false;
|
|
12
|
+
/**
|
|
13
|
+
*
|
|
14
|
+
*
|
|
15
|
+
* @memberof NgxPrintDirective
|
|
16
|
+
*/
|
|
17
|
+
printSectionId;
|
|
18
|
+
/**
|
|
19
|
+
*
|
|
20
|
+
*
|
|
21
|
+
* @memberof NgxPrintDirective
|
|
22
|
+
*/
|
|
23
|
+
printTitle;
|
|
24
|
+
/**
|
|
25
|
+
*
|
|
26
|
+
*
|
|
27
|
+
* @memberof NgxPrintDirective
|
|
28
|
+
*/
|
|
29
|
+
useExistingCss = false;
|
|
30
|
+
/**
|
|
31
|
+
* A delay in milliseconds to force the print dialog to wait before opened. Default: 0
|
|
32
|
+
*
|
|
33
|
+
* @memberof NgxPrintDirective
|
|
34
|
+
*/
|
|
35
|
+
printDelay = 0;
|
|
36
|
+
/**
|
|
37
|
+
* Whether to close the window after print() returns.
|
|
38
|
+
*
|
|
39
|
+
*/
|
|
40
|
+
closeWindow = true;
|
|
41
|
+
/**
|
|
42
|
+
* Class attribute to apply to the body element.
|
|
43
|
+
*
|
|
44
|
+
*/
|
|
45
|
+
bodyClass = '';
|
|
46
|
+
/**
|
|
47
|
+
*
|
|
48
|
+
*
|
|
49
|
+
* @memberof NgxPrintDirective
|
|
50
|
+
*/
|
|
51
|
+
set printStyle(values) {
|
|
52
|
+
for (let key in values) {
|
|
53
|
+
if (values.hasOwnProperty(key)) {
|
|
54
|
+
this._printStyle.push((key + JSON.stringify(values[key])).replace(/['"]+/g, ''));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
this.returnStyleValues();
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
*
|
|
61
|
+
*
|
|
62
|
+
* @returns the string that create the stylesheet which will be injected
|
|
63
|
+
* later within <style></style> tag.
|
|
64
|
+
*
|
|
65
|
+
* -join/replace to transform an array objects to css-styled string
|
|
66
|
+
*
|
|
67
|
+
* @memberof NgxPrintDirective
|
|
68
|
+
*/
|
|
69
|
+
returnStyleValues() {
|
|
70
|
+
return `<style> ${this._printStyle.join(' ').replace(/,/g, ';')} </style>`;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
*
|
|
74
|
+
*
|
|
75
|
+
* @returns html for the given tag
|
|
76
|
+
*
|
|
77
|
+
* @memberof NgxPrintDirective
|
|
78
|
+
*/
|
|
79
|
+
_styleSheetFile = '';
|
|
80
|
+
/**
|
|
81
|
+
* @memberof NgxPrintDirective
|
|
82
|
+
* @param cssList
|
|
83
|
+
*/
|
|
84
|
+
set styleSheetFile(cssList) {
|
|
85
|
+
let linkTagFn = function (cssFileName) {
|
|
86
|
+
return `<link rel="stylesheet" type="text/css" href="${cssFileName}">`;
|
|
87
|
+
};
|
|
88
|
+
if (cssList.indexOf(',') !== -1) {
|
|
89
|
+
const valueArr = cssList.split(',');
|
|
90
|
+
for (let val of valueArr) {
|
|
91
|
+
this._styleSheetFile = this._styleSheetFile + linkTagFn(val);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
this._styleSheetFile = linkTagFn(cssList);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* @returns string which contains the link tags containing the css which will
|
|
100
|
+
* be injected later within <head></head> tag.
|
|
101
|
+
*
|
|
102
|
+
*/
|
|
103
|
+
returnStyleSheetLinkTags() {
|
|
104
|
+
return this._styleSheetFile;
|
|
105
|
+
}
|
|
106
|
+
getElementTag(tag) {
|
|
107
|
+
const html = [];
|
|
108
|
+
const elements = document.getElementsByTagName(tag);
|
|
109
|
+
for (let index = 0; index < elements.length; index++) {
|
|
110
|
+
html.push(elements[index].outerHTML);
|
|
111
|
+
}
|
|
112
|
+
return html.join('\r\n');
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
*
|
|
116
|
+
* @description When printing, the default option of form elements are printed.
|
|
117
|
+
* Here we update what that default is to print the current values.
|
|
118
|
+
*
|
|
119
|
+
* @param elements the html element collection to save defaults to
|
|
120
|
+
*
|
|
121
|
+
*/
|
|
122
|
+
updateInputDefaults(elements) {
|
|
123
|
+
for (let i = 0; i < elements.length; i++) {
|
|
124
|
+
const element = elements[i];
|
|
125
|
+
element['defaultValue'] = element.value;
|
|
126
|
+
if (element['checked'])
|
|
127
|
+
element['defaultChecked'] = true;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
updateSelectDefaults(elements) {
|
|
131
|
+
for (let i = 0; i < elements.length; i++) {
|
|
132
|
+
const element = elements[i];
|
|
133
|
+
const selectedIdx = element.selectedIndex;
|
|
134
|
+
const selectedOption = element.options[selectedIdx];
|
|
135
|
+
selectedOption.defaultSelected = true;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
updateTextAreaDefaults(elements) {
|
|
139
|
+
for (let i = 0; i < elements.length; i++) {
|
|
140
|
+
const element = elements[i];
|
|
141
|
+
element['defaultValue'] = element.value;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* @description Retrieves the html contents of the print section id.
|
|
146
|
+
* Updates the html elements to default their form values to the current form values
|
|
147
|
+
*
|
|
148
|
+
* @returns {string | null} html section to be printed
|
|
149
|
+
*
|
|
150
|
+
*/
|
|
151
|
+
getHtmlContents() {
|
|
152
|
+
const printContents = document.getElementById(this.printSectionId);
|
|
153
|
+
if (!printContents)
|
|
154
|
+
return null;
|
|
155
|
+
const inputEls = printContents.getElementsByTagName('input');
|
|
156
|
+
const selectEls = printContents.getElementsByTagName('select');
|
|
157
|
+
const textAreaEls = printContents.getElementsByTagName('textarea');
|
|
158
|
+
this.updateInputDefaults(inputEls);
|
|
159
|
+
this.updateSelectDefaults(selectEls);
|
|
160
|
+
this.updateTextAreaDefaults(textAreaEls);
|
|
161
|
+
return printContents.innerHTML;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
*
|
|
165
|
+
*
|
|
166
|
+
* @memberof NgxPrintDirective
|
|
167
|
+
*/
|
|
168
|
+
print() {
|
|
169
|
+
let printContents, popupWin, styles = '', links = '';
|
|
170
|
+
const baseTag = this.getElementTag('base');
|
|
171
|
+
if (this.useExistingCss) {
|
|
172
|
+
styles = this.getElementTag('style');
|
|
173
|
+
links = this.getElementTag('link');
|
|
174
|
+
}
|
|
175
|
+
printContents = this.getHtmlContents();
|
|
176
|
+
popupWin = window.open("", "_blank", "top=0,left=0,height=auto,width=auto");
|
|
177
|
+
popupWin.document.open();
|
|
178
|
+
popupWin.document.write(`
|
|
179
|
+
<html>
|
|
180
|
+
<head>
|
|
181
|
+
<title>${this.printTitle ? this.printTitle : ""}</title>
|
|
182
|
+
${baseTag}
|
|
183
|
+
${this.returnStyleValues()}
|
|
184
|
+
${this.returnStyleSheetLinkTags()}
|
|
185
|
+
${styles}
|
|
186
|
+
${links}
|
|
187
|
+
</head>
|
|
188
|
+
<body ${this.bodyClass ? `class="${this.bodyClass}"` : ''}>
|
|
189
|
+
${printContents}
|
|
190
|
+
<script defer>
|
|
191
|
+
function triggerPrint(event) {
|
|
192
|
+
window.removeEventListener('load', triggerPrint, false);
|
|
193
|
+
${this.previewOnly || !this.closeWindow ? '' : `setTimeout(function() {
|
|
194
|
+
closeWindow(window.print());
|
|
195
|
+
}, ${this.printDelay});`}
|
|
196
|
+
}
|
|
197
|
+
function closeWindow(){
|
|
198
|
+
window.close();
|
|
199
|
+
}
|
|
200
|
+
window.addEventListener('load', triggerPrint, false);
|
|
201
|
+
</script>
|
|
202
|
+
</body>
|
|
203
|
+
</html>`);
|
|
204
|
+
popupWin.document.close();
|
|
205
|
+
}
|
|
206
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgxPrintDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
207
|
+
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 });
|
|
208
|
+
}
|
|
209
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgxPrintDirective, decorators: [{
|
|
210
|
+
type: Directive,
|
|
211
|
+
args: [{
|
|
212
|
+
selector: "button[ngxPrint]",
|
|
213
|
+
standalone: true
|
|
214
|
+
}]
|
|
215
|
+
}], propDecorators: { previewOnly: [{
|
|
216
|
+
type: Input
|
|
217
|
+
}], printSectionId: [{
|
|
218
|
+
type: Input
|
|
219
|
+
}], printTitle: [{
|
|
220
|
+
type: Input
|
|
221
|
+
}], useExistingCss: [{
|
|
222
|
+
type: Input
|
|
223
|
+
}], printDelay: [{
|
|
224
|
+
type: Input
|
|
225
|
+
}], closeWindow: [{
|
|
226
|
+
type: Input
|
|
227
|
+
}], bodyClass: [{
|
|
228
|
+
type: Input
|
|
229
|
+
}], printStyle: [{
|
|
230
|
+
type: Input
|
|
231
|
+
}], styleSheetFile: [{
|
|
232
|
+
type: Input
|
|
233
|
+
}], print: [{
|
|
234
|
+
type: HostListener,
|
|
235
|
+
args: ['click']
|
|
236
|
+
}] } });
|
|
237
|
+
|
|
238
|
+
class NgxPrintModule {
|
|
239
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgxPrintModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
240
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: NgxPrintModule, imports: [NgxPrintDirective], exports: [NgxPrintDirective] });
|
|
241
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgxPrintModule });
|
|
242
|
+
}
|
|
243
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgxPrintModule, decorators: [{
|
|
244
|
+
type: NgModule,
|
|
245
|
+
args: [{
|
|
246
|
+
imports: [NgxPrintDirective],
|
|
247
|
+
exports: [NgxPrintDirective]
|
|
248
|
+
}]
|
|
249
|
+
}] });
|
|
250
|
+
|
|
251
|
+
/*
|
|
252
|
+
* Public API Surface of ngx-print
|
|
253
|
+
*/
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Generated bundle index. Do not edit.
|
|
257
|
+
*/
|
|
258
|
+
|
|
259
|
+
export { NgxPrintDirective, NgxPrintModule };
|
|
260
|
+
//# sourceMappingURL=ngx-print.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngx-print.mjs","sources":["../../../src/lib/ngx-print.directive.ts","../../../src/lib/ngx-print.module.ts","../../../src/public_api.ts","../../../src/ngx-print.ts"],"sourcesContent":["import { Directive, HostListener, Input } from '@angular/core';\r\n@Directive({\r\n selector: \"button[ngxPrint]\",\r\n standalone: true\r\n})\r\nexport class NgxPrintDirective {\r\n\r\n public _printStyle = [];\r\n\r\n /**\r\n * Prevents the print dialog from opening on the window\r\n *\r\n * @memberof NgxPrintDirective\r\n */\r\n @Input() previewOnly: boolean = false;\r\n\r\n /**\r\n *\r\n *\r\n * @memberof NgxPrintDirective\r\n */\r\n @Input() printSectionId: string;\r\n\r\n /**\r\n *\r\n *\r\n * @memberof NgxPrintDirective\r\n */\r\n @Input() printTitle: string;\r\n\r\n /**\r\n *\r\n *\r\n * @memberof NgxPrintDirective\r\n */\r\n @Input() useExistingCss = false;\r\n\r\n /**\r\n * A delay in milliseconds to force the print dialog to wait before opened. Default: 0\r\n *\r\n * @memberof NgxPrintDirective\r\n */\r\n @Input() printDelay: number = 0;\r\n\r\n /**\r\n * Whether to close the window after print() returns.\r\n *\r\n */\r\n @Input() closeWindow: boolean = true;\r\n\r\n /**\r\n * Class attribute to apply to the body element.\r\n *\r\n */\r\n @Input() bodyClass: string = '';\r\n\r\n /**\r\n *\r\n *\r\n * @memberof NgxPrintDirective\r\n */\r\n @Input()\r\n set printStyle(values: { [key: string]: { [key: string]: string } }) {\r\n for (let key in values) {\r\n if (values.hasOwnProperty(key)) {\r\n this._printStyle.push((key + JSON.stringify(values[key])).replace(/['\"]+/g, ''));\r\n }\r\n }\r\n this.returnStyleValues();\r\n }\r\n\r\n /**\r\n *\r\n *\r\n * @returns the string that create the stylesheet which will be injected\r\n * later within <style></style> tag.\r\n *\r\n * -join/replace to transform an array objects to css-styled string\r\n *\r\n * @memberof NgxPrintDirective\r\n */\r\n public returnStyleValues() {\r\n return `<style> ${this._printStyle.join(' ').replace(/,/g, ';')} </style>`;\r\n }\r\n\r\n /**\r\n *\r\n *\r\n * @returns html for the given tag\r\n *\r\n * @memberof NgxPrintDirective\r\n */\r\n private _styleSheetFile = '';\r\n\r\n /**\r\n * @memberof NgxPrintDirective\r\n * @param cssList\r\n */\r\n @Input()\r\n set styleSheetFile(cssList: string) {\r\n let linkTagFn = function (cssFileName) {\r\n return `<link rel=\"stylesheet\" type=\"text/css\" href=\"${cssFileName}\">`;\r\n }\r\n if (cssList.indexOf(',') !== -1) {\r\n const valueArr = cssList.split(',');\r\n for (let val of valueArr) {\r\n this._styleSheetFile = this._styleSheetFile + linkTagFn(val);\r\n }\r\n } else {\r\n this._styleSheetFile = linkTagFn(cssList);\r\n }\r\n }\r\n\r\n /**\r\n * @returns string which contains the link tags containing the css which will\r\n * be injected later within <head></head> tag.\r\n *\r\n */\r\n private returnStyleSheetLinkTags() {\r\n return this._styleSheetFile;\r\n }\r\n private getElementTag(tag: keyof HTMLElementTagNameMap): string {\r\n const html: string[] = [];\r\n const elements = document.getElementsByTagName(tag);\r\n for (let index = 0; index < elements.length; index++) {\r\n html.push(elements[index].outerHTML);\r\n }\r\n return html.join('\\r\\n');\r\n }\r\n\r\n /**\r\n *\r\n * @description When printing, the default option of form elements are printed.\r\n * Here we update what that default is to print the current values.\r\n *\r\n * @param elements the html element collection to save defaults to\r\n *\r\n */\r\n private updateInputDefaults(elements: HTMLCollectionOf<HTMLInputElement>): void {\r\n for (let i = 0; i < elements.length; i++) {\r\n const element = elements[i];\r\n element['defaultValue'] = element.value;\r\n if (element['checked']) element['defaultChecked'] = true;\r\n }\r\n }\r\n private updateSelectDefaults(elements: HTMLCollectionOf<HTMLSelectElement>): void {\r\n for (let i = 0; i < elements.length; i++) {\r\n const element = elements[i];\r\n const selectedIdx = element.selectedIndex;\r\n const selectedOption: HTMLOptionElement = element.options[selectedIdx];\r\n\r\n selectedOption.defaultSelected = true;\r\n }\r\n }\r\n private updateTextAreaDefaults(elements: HTMLCollectionOf<HTMLTextAreaElement>): void {\r\n for (let i = 0; i < elements.length; i++) {\r\n const element = elements[i];\r\n element['defaultValue'] = element.value;\r\n }\r\n }\r\n\r\n /**\r\n * @description Retrieves the html contents of the print section id.\r\n * Updates the html elements to default their form values to the current form values\r\n *\r\n * @returns {string | null} html section to be printed\r\n *\r\n */\r\n private getHtmlContents(): string | null {\r\n const printContents = document.getElementById(this.printSectionId);\r\n if (!printContents) return null;\r\n\r\n const inputEls = printContents.getElementsByTagName('input');\r\n const selectEls = printContents.getElementsByTagName('select');\r\n const textAreaEls = printContents.getElementsByTagName('textarea');\r\n\r\n this.updateInputDefaults(inputEls);\r\n this.updateSelectDefaults(selectEls);\r\n this.updateTextAreaDefaults(textAreaEls);\r\n\r\n return printContents.innerHTML;\r\n }\r\n\r\n /**\r\n *\r\n *\r\n * @memberof NgxPrintDirective\r\n */\r\n @HostListener('click')\r\n public print(): void {\r\n let printContents, popupWin, styles = '', links = '';\r\n const baseTag = this.getElementTag('base');\r\n\r\n if (this.useExistingCss) {\r\n styles = this.getElementTag('style');\r\n links = this.getElementTag('link');\r\n }\r\n\r\n printContents = this.getHtmlContents();\r\n popupWin = window.open(\"\", \"_blank\", \"top=0,left=0,height=auto,width=auto\");\r\n popupWin.document.open();\r\n popupWin.document.write(`\r\n <html>\r\n <head>\r\n <title>${this.printTitle ? this.printTitle : \"\"}</title>\r\n ${baseTag}\r\n ${this.returnStyleValues()}\r\n ${this.returnStyleSheetLinkTags()}\r\n ${styles}\r\n ${links}\r\n </head>\r\n <body ${this.bodyClass ? `class=\"${this.bodyClass}\"` : ''}>\r\n ${printContents}\r\n <script defer>\r\n function triggerPrint(event) {\r\n window.removeEventListener('load', triggerPrint, false);\r\n ${this.previewOnly || !this.closeWindow ? '' : `setTimeout(function() {\r\n closeWindow(window.print());\r\n }, ${this.printDelay});`}\r\n }\r\n function closeWindow(){\r\n window.close();\r\n }\r\n window.addEventListener('load', triggerPrint, false);\r\n </script>\r\n </body>\r\n </html>`);\r\n popupWin.document.close();\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { NgxPrintDirective } from './ngx-print.directive';\r\n\r\n@NgModule({\r\n imports: [NgxPrintDirective],\r\n exports: [NgxPrintDirective]\r\n})\r\nexport class NgxPrintModule { }\r\n","/*\r\n * Public API Surface of ngx-print\r\n */\r\n\r\nexport * from './lib/ngx-print.directive';\r\nexport * from './lib/ngx-print.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|