ngx-nz-formly 0.0.5 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +352 -8
  2. package/esm2022/lib/components/nz-formly-button/nz-formly-button.component.mjs +21 -0
  3. package/esm2022/lib/components/nz-formly-field-checkbox/nz-formly-field-checkbox.component.mjs +33 -0
  4. package/esm2022/lib/components/nz-formly-field-input/nz-formly-field-input.component.mjs +105 -0
  5. package/esm2022/lib/components/nz-formly-field-input/phone-mask.config.mjs +1463 -0
  6. package/esm2022/lib/components/nz-formly-field-radio/nz-formly-field-radio.component.mjs +39 -0
  7. package/esm2022/lib/components/nz-formly-field-select/nz-formly-field-select.component.mjs +34 -0
  8. package/esm2022/lib/components/nz-formly-field-switch/nz-formly-field-switch.component.mjs +38 -0
  9. package/esm2022/lib/ngx-nz-formly-props.model.mjs +6 -0
  10. package/esm2022/lib/ngx-nz-formly-type-safe.model.mjs +44 -0
  11. package/esm2022/lib/ngx-nz-formly-validators.mjs +52 -0
  12. package/esm2022/lib/ngx-nz-formly.module.mjs +263 -0
  13. package/esm2022/lib/wrappers/nz-formly-default-wrapper/nz-formly-default-wrapper.component.mjs +37 -0
  14. package/esm2022/lib/wrappers/nz-formly-label-wrapper/nz-formly-label-wrapper.component.mjs +13 -0
  15. package/esm2022/ngx-nz-formly.mjs +5 -0
  16. package/esm2022/public-api.mjs +5 -0
  17. package/fesm2022/ngx-nz-formly.mjs +2101 -0
  18. package/fesm2022/ngx-nz-formly.mjs.map +1 -0
  19. package/index.d.ts +5 -0
  20. package/lib/components/nz-formly-button/nz-formly-button.component.d.ts +8 -0
  21. package/lib/components/nz-formly-field-checkbox/nz-formly-field-checkbox.component.d.ts +13 -0
  22. package/lib/components/nz-formly-field-input/nz-formly-field-input.component.d.ts +24 -0
  23. package/lib/components/nz-formly-field-input/phone-mask.config.d.ts +11 -0
  24. package/lib/components/nz-formly-field-radio/nz-formly-field-radio.component.d.ts +14 -0
  25. package/lib/components/nz-formly-field-select/nz-formly-field-select.component.d.ts +13 -0
  26. package/lib/components/nz-formly-field-switch/nz-formly-field-switch.component.d.ts +14 -0
  27. package/lib/ngx-nz-formly-props.model.d.ts +145 -0
  28. package/lib/ngx-nz-formly-type-safe.model.d.ts +14 -0
  29. package/lib/ngx-nz-formly-validators.d.ts +16 -0
  30. package/lib/ngx-nz-formly.module.d.ts +2 -0
  31. package/lib/wrappers/nz-formly-default-wrapper/nz-formly-default-wrapper.component.d.ts +7 -0
  32. package/lib/wrappers/nz-formly-label-wrapper/nz-formly-label-wrapper.component.d.ts +7 -0
  33. package/package.json +56 -43
  34. package/ng-package.json +0 -7
  35. package/src/lib/components/nz-formly-button/nz-formly-button.component.html +0 -16
  36. package/src/lib/components/nz-formly-button/nz-formly-button.component.scss +0 -0
  37. package/src/lib/components/nz-formly-button/nz-formly-button.component.ts +0 -18
  38. package/src/lib/components/nz-formly-field-checkbox/nz-formly-field-checkbox.component.html +0 -9
  39. package/src/lib/components/nz-formly-field-checkbox/nz-formly-field-checkbox.component.scss +0 -8
  40. package/src/lib/components/nz-formly-field-checkbox/nz-formly-field-checkbox.component.ts +0 -38
  41. package/src/lib/components/nz-formly-field-input/nz-formly-field-input.component.html +0 -33
  42. package/src/lib/components/nz-formly-field-input/nz-formly-field-input.component.scss +0 -7
  43. package/src/lib/components/nz-formly-field-input/nz-formly-field-input.component.ts +0 -118
  44. package/src/lib/components/nz-formly-field-input/phone-mask.config.ts +0 -1469
  45. package/src/lib/components/nz-formly-field-radio/nz-formly-field-radio.component.html +0 -32
  46. package/src/lib/components/nz-formly-field-radio/nz-formly-field-radio.component.scss +0 -0
  47. package/src/lib/components/nz-formly-field-radio/nz-formly-field-radio.component.ts +0 -44
  48. package/src/lib/components/nz-formly-field-select/nz-formly-field-select.component.html +0 -54
  49. package/src/lib/components/nz-formly-field-select/nz-formly-field-select.component.scss +0 -3
  50. package/src/lib/components/nz-formly-field-select/nz-formly-field-select.component.ts +0 -38
  51. package/src/lib/components/nz-formly-field-switch/nz-formly-field-switch.component.html +0 -10
  52. package/src/lib/components/nz-formly-field-switch/nz-formly-field-switch.component.scss +0 -0
  53. package/src/lib/components/nz-formly-field-switch/nz-formly-field-switch.component.ts +0 -44
  54. package/src/lib/ngx-nz-formly-props.model.ts +0 -158
  55. package/src/lib/ngx-nz-formly-type-safe.model.ts +0 -81
  56. package/src/lib/ngx-nz-formly-validators.ts +0 -92
  57. package/src/lib/ngx-nz-formly.module.ts +0 -260
  58. package/src/lib/wrappers/nz-formly-default-wrapper/nz-formly-default-wrapper.component.html +0 -16
  59. package/src/lib/wrappers/nz-formly-default-wrapper/nz-formly-default-wrapper.component.scss +0 -12
  60. package/src/lib/wrappers/nz-formly-default-wrapper/nz-formly-default-wrapper.component.ts +0 -25
  61. package/src/lib/wrappers/nz-formly-label-wrapper/nz-formly-label-wrapper.component.html +0 -27
  62. package/src/lib/wrappers/nz-formly-label-wrapper/nz-formly-label-wrapper.component.scss +0 -55
  63. package/src/lib/wrappers/nz-formly-label-wrapper/nz-formly-label-wrapper.component.ts +0 -12
  64. package/tsconfig.lib.json +0 -14
  65. package/tsconfig.lib.prod.json +0 -10
  66. package/tsconfig.spec.json +0 -14
  67. /package/{src/public-api.ts → public-api.d.ts} +0 -0
package/README.md CHANGED
@@ -1,17 +1,51 @@
1
1
  # NgxNzFormly
2
2
 
3
- This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 16.2.0.
3
+ This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 16.2.0.<br>
4
+ The only best library to integrate [ngx-formly](https://formly.dev/)
5
+ with [ng-zorro](https://ng.ant.design/docs/introduce/en)
4
6
 
5
7
  ## Installation
6
8
 
7
- Angular version `16.x.x`
9
+ Angular version `16.x.x` <br>
10
+ Adding ``ngx-nz-formly`` to your application is super easy but in order to use ``ngx-nz-formly`` you should install
11
+ three more packages.
12
+
13
+ ### Install ng-zorro-antd
14
+
15
+ ```bash
16
+ $ npm install ng-zorro-antd --save
17
+ ```
18
+
19
+ Import the pre-built stylesheet in ``angular.json``
20
+
21
+ ```json
22
+ {
23
+ "styles": [
24
+ "node_modules/ng-zorro-antd/ng-zorro-antd.min.css"
25
+ ]
26
+ }
27
+ ```
28
+
29
+ ### Install ngx-formly
30
+
8
31
  ```bash
9
- $ npm install --save ngx-nz-formly
32
+ $ npm install @angular/forms @ngx-formly/core --save
10
33
  ```
11
34
 
12
- ## Quick Start
35
+ ### Install ngx-mask
36
+
37
+ ```bash
38
+ $ npm insatll ngx-mask --save
39
+ ```
40
+
41
+ ### Install ngx-nz-formly
42
+
43
+ ```bash
44
+ $ npm install ngx-nz-formly --save
45
+ ```
46
+
47
+ Last step is to add below modules to ``app.module.ts``
13
48
 
14
- Adding ``ngx-nz-formly`` to your application is super easy. All you need is to add the following modules to imports in ``app.module.ts``.
15
49
  ```
16
50
  @NgModule({
17
51
  declarations: [...],
@@ -30,6 +64,316 @@ Adding ``ngx-nz-formly`` to your application is super easy. All you need is to a
30
64
  })
31
65
  export class AppModule {}
32
66
  ```
33
- As an explanation, ``HttpClientModule`` and ``providers`` relates to Ant design setup.
34
- In order to use special masks on inputs, you need to add ``NgxMaskModule``, too. At last, we have ``OverlayModule``, ``BrowserAnimationsModule`` and ``FormlyModule`` to complete the setup.
35
- Finally, you need ``NzFormlyForRoot`` config to FormlyModule for root to be able to have your formly with Ant Design.
67
+
68
+ As an explanation, ``HttpClientModule`` and ``providers`` relates to Ant design setup. In order to use special masks on
69
+ inputs, you need to add ``NgxMaskModule``, too. At last, we have ``OverlayModule``, ``BrowserAnimationsModule``
70
+ and ``FormlyModule`` to complete the setup. Finally, you need ``NzFormlyForRoot`` config to FormlyModule for root to be
71
+ able to have your formly with Ant Design.
72
+
73
+ ## Usage
74
+
75
+ add below html code to your ``app.component.html``
76
+
77
+ ```html
78
+
79
+ <formly-form
80
+ [form]="form"
81
+ [fields]="fields"
82
+ [model]="model"
83
+ ></formly-form>
84
+ ```
85
+
86
+ Finally, your ``app.component.ts`` file could be something like following box. So please take this as sample
87
+ documentation of available features, until I write one
88
+
89
+ ```ts
90
+ import {Component, OnInit} from "@angular/core";
91
+ import {FormControl, FormGroup} from "@angular/forms";
92
+ import {FormlyFieldConfig} from "@ngx-formly/core";
93
+ import {BehaviorSubject, concatMap, delay, from, of} from "rxjs";
94
+ import {NzOptionComponent} from "ng-zorro-antd/select";
95
+ import {NzFormlyFieldBuilder} from "../../projects/ngx-nz-formly";
96
+
97
+ class FormModel {
98
+ firstName: string;
99
+ lastName: string;
100
+ phoneNumber: string;
101
+ email: string;
102
+ password: string;
103
+ budget: number;
104
+ age: number;
105
+ olderThan20: boolean;
106
+ allowNotifications: boolean;
107
+ city: any;
108
+ gender: string;
109
+
110
+ constructor(element: any) {
111
+ this.firstName = element?.firstName;
112
+ this.lastName = element?.lastName;
113
+ this.phoneNumber = element?.phoneNumber;
114
+ this.email = element?.email;
115
+ this.password = element?.password;
116
+ this.budget = element?.budget;
117
+ this.age = element?.age;
118
+ this.olderThan20 = element?.olderThan20;
119
+ this.allowNotifications = element?.allowNotifications;
120
+ this.city = element?.city;
121
+ this.gender = element?.gender;
122
+ }
123
+ }
124
+
125
+ @Component({
126
+ selector: "app-root",
127
+ templateUrl: "./app.component.html",
128
+ styleUrls: ["./app.component.scss"],
129
+ })
130
+ export class AppComponent implements OnInit {
131
+ model = new FormModel({});
132
+ form = new FormGroup({});
133
+ fields: FormlyFieldConfig[] = [];
134
+ labelObs$ = new BehaviorSubject("Label");
135
+
136
+ ngOnInit() {
137
+ this.initForm();
138
+ from(["Label 1", "Label 2", "Label 3"])
139
+ .pipe(concatMap(item => of(item).pipe(delay(1000))))
140
+ .subscribe(item => this.labelObs$.next(item));
141
+ }
142
+
143
+ initForm() {
144
+ const fb = new NzFormlyFieldBuilder<FormModel>();
145
+ this.fields = [
146
+ fb.input("firstName", {
147
+ className: "flex-50 px-2",
148
+ props: {
149
+ labelPosition: "float",
150
+ required: true,
151
+ minLen: 3,
152
+ labelObs: this.labelObs$,
153
+ focus: () => console.log("input focused"),
154
+ blur: () => console.log("input blurred"),
155
+ styles: {
156
+ labelWidth: "110px",
157
+ wrapperClass: "mb-4",
158
+ },
159
+ },
160
+ validators: {
161
+ validation: ["minLen"],
162
+ },
163
+ }),
164
+ fb.input("lastName", {
165
+ className: "flex-50 px-2",
166
+ props: {
167
+ required: true,
168
+ maxLen: 10,
169
+ label: "Last Name",
170
+ styles: {
171
+ labelWidth: "110px",
172
+ wrapperClass: "mb-4",
173
+ },
174
+ },
175
+ validators: {
176
+ validation: ["maxLen"],
177
+ },
178
+ }),
179
+ fb.input("phoneNumber", {
180
+ className: "flex-50 px-2",
181
+ props: {
182
+ label: "Phone No",
183
+ mask: "phone",
184
+ placeholder: "e.x. 9127403028",
185
+ styles: {
186
+ labelWidth: "110px",
187
+ wrapperClass: "mb-4",
188
+ },
189
+ },
190
+ }),
191
+ fb.input("email", {
192
+ className: "flex-50 px-2",
193
+ props: {
194
+ required: true,
195
+ label: "Email address",
196
+ placeholder: "e.x. sajjad@gmail.com",
197
+ styles: {
198
+ labelWidth: "110px",
199
+ wrapperClass: "mb-4",
200
+ },
201
+ change: (field, event) => console.log("input changed to:", event),
202
+ },
203
+ validators: {
204
+ validation: ["email"],
205
+ },
206
+ }),
207
+ fb.input("password", {
208
+ className: "flex-50 px-2",
209
+ props: {
210
+ required: true,
211
+ type: "password",
212
+ label: "Password",
213
+ placeholder: "use complex one",
214
+ styles: {
215
+ labelWidth: "110px",
216
+ wrapperClass: "mb-4",
217
+ },
218
+ },
219
+ validators: {
220
+ validation: ["password"],
221
+ },
222
+ }),
223
+ fb.input("budget", {
224
+ className: "flex-50 px-2",
225
+ props: {
226
+ nzPrefix: "$",
227
+ label: "Budget",
228
+ mask: "separator.2",
229
+ thousandSeparator: ",",
230
+ nzAddOnBeforeIcon: "wallet",
231
+ placeholder: "e.x. 2000",
232
+ styles: {
233
+ labelWidth: "110px",
234
+ wrapperClass: "mb-4",
235
+ },
236
+ change: (field, event) => console.log("number changed to:", event),
237
+ focus: () => console.log("number focused"),
238
+ blur: () => console.log("number blurred"),
239
+ },
240
+ validators: {
241
+ custom: {
242
+ expression: (control: FormControl) => control.value > 2500,
243
+ message: "Your budget is less than expected budget",
244
+ },
245
+ },
246
+ }),
247
+ fb.checkbox("olderThan20", {
248
+ className: "flex-50 px-2 mb-4",
249
+ props: {
250
+ label: "I am older that 20",
251
+ change: (field, event) => console.log("checkbox changed to:", event),
252
+ },
253
+ }),
254
+ fb.input("age", {
255
+ className: "flex-50 px-2",
256
+ props: {
257
+ minValue: 20,
258
+ maxValue: 100,
259
+ label: "Age",
260
+ placeholder: "enter your age",
261
+ styles: {
262
+ labelWidth: "110px",
263
+ wrapperClass: "mb-4",
264
+ },
265
+ },
266
+ expressionProperties: {
267
+ "props.disabled": model => !model.olderThan20,
268
+ },
269
+ validators: {
270
+ validation: ["minValue", "maxValue"],
271
+ },
272
+ }),
273
+ fb.switch("allowNotifications", {
274
+ className: "flex-50 px-2",
275
+ props: {
276
+ nzCheckedChildren: "1",
277
+ nzUnCheckedChildren: "0",
278
+ label: "Allow notifications",
279
+ styles: {
280
+ labelWidth: "auto",
281
+ wrapperClass: "mb-4",
282
+ },
283
+ change: (field, event) => console.log("switch changed to:", event),
284
+ },
285
+ expressionProperties: {
286
+ "props.hidden": model => !model.olderThan20,
287
+ },
288
+ }),
289
+ fb.select("city", {
290
+ className: "flex-50 px-2",
291
+ props: {
292
+ objectValue: false,
293
+ label: "City",
294
+ nzAllowClear: true,
295
+ nzShowSearch: true,
296
+ placeholder: "select your city",
297
+ styles: {
298
+ labelWidth: "110px",
299
+ wrapperClass: "mb-4",
300
+ },
301
+ nzOptionOverflowSize: 4,
302
+ nzOptions: [
303
+ {
304
+ label: "Zanjan",
305
+ value: "Znj",
306
+ nzCustomContent: `<strong>Zanjan</strong>`,
307
+ },
308
+ {
309
+ label: "Tehran",
310
+ value: "Teh",
311
+ nzCustomContent: `<i>Tehran</i>`,
312
+ },
313
+ {label: "Isfahan", value: "Isf"},
314
+ {label: "Shiraz", value: "Shi"},
315
+ {label: "Gilan", value: "Gil"},
316
+ ],
317
+ nzFilterOption: (input?: string, option?: NzOptionComponent) => {
318
+ return option?.nzLabel?.toString().includes(input || "") || false;
319
+ },
320
+ compareWith: (o1: any, o2: any): boolean => o1?.value == o2?.value,
321
+ nzOpenChange: event => console.log("selection open status:", event),
322
+ nzScrollToBottom: () => console.log("scroll"),
323
+ nzOnSearch: event => console.log("search", event),
324
+ change: (field, event) => console.log("selection changed to:", event),
325
+ },
326
+ expressionProperties: {
327
+ "props.disabled": model => !model.olderThan20,
328
+ },
329
+ }),
330
+ fb.radio("gender", {
331
+ className: "flex-50 px-2",
332
+ props: {
333
+ label: "Gender",
334
+ nzType: "nz-radio-button",
335
+ styles: {
336
+ labelWidth: "110px",
337
+ },
338
+ nzOptions: [
339
+ {
340
+ label: "Male",
341
+ value: "Male",
342
+ },
343
+ {
344
+ label: "Female",
345
+ value: "Female",
346
+ },
347
+ {
348
+ label: "None",
349
+ value: null,
350
+ },
351
+ ],
352
+ nzButtonStyle: "solid",
353
+ change: (field, event) => console.log("Radio changed to:", event),
354
+ },
355
+ }),
356
+ fb.button({
357
+ className: "flex-50 px-2",
358
+ props: {
359
+ text: "Reset",
360
+ nzType: "primary",
361
+ nzLoading: false,
362
+ nzDanger: false,
363
+ nzBlock: true,
364
+ click: () => console.log("clicked"),
365
+ },
366
+ }),
367
+ ];
368
+ }
369
+
370
+ onSubmit() {
371
+ console.log(this.model);
372
+ }
373
+ }
374
+ ```
375
+
376
+ ## Appreciate
377
+
378
+ At last, I want to thank every one of you who supports and use the provided library. Be sure that there are lots of more
379
+ features coming up. So please share your feedbacks and comments with me. I will be so happy of getting more of them.
@@ -0,0 +1,21 @@
1
+ import { Component } from "@angular/core";
2
+ import { FieldType } from "@ngx-formly/core";
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ import * as i2 from "ng-zorro-antd/button";
6
+ import * as i3 from "ng-zorro-antd/core/transition-patch";
7
+ import * as i4 from "ng-zorro-antd/core/wave";
8
+ export class NzFormlyButtonComponent extends FieldType {
9
+ onClick() {
10
+ if (typeof this.props?.click == "function") {
11
+ this.props.click();
12
+ }
13
+ }
14
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NzFormlyButtonComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
15
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NzFormlyButtonComponent, selector: "app-nz-formly-button", usesInheritance: true, ngImport: i0, template: "<button\r\n nz-button\r\n type=\"button\"\r\n [disabled]=\"props.disabled\"\r\n [nzGhost]=\"props.nzGhost\"\r\n [nzLoading]=\"props.nzLoading\"\r\n [nzShape]=\"props.nzShape\"\r\n [nzSize]=\"props.nzSize\"\r\n [nzType]=\"props.nzType\"\r\n [nzBlock]=\"props.nzBlock\"\r\n [nzDanger]=\"props.nzDanger\"\r\n [ngClass]=\"props.classList\"\r\n (click)=\"onClick()\"\r\n>\r\n {{props.text}}\r\n</button>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i2.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i3.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i4.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }] });
16
+ }
17
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NzFormlyButtonComponent, decorators: [{
18
+ type: Component,
19
+ args: [{ selector: "app-nz-formly-button", template: "<button\r\n nz-button\r\n type=\"button\"\r\n [disabled]=\"props.disabled\"\r\n [nzGhost]=\"props.nzGhost\"\r\n [nzLoading]=\"props.nzLoading\"\r\n [nzShape]=\"props.nzShape\"\r\n [nzSize]=\"props.nzSize\"\r\n [nzType]=\"props.nzType\"\r\n [nzBlock]=\"props.nzBlock\"\r\n [nzDanger]=\"props.nzDanger\"\r\n [ngClass]=\"props.classList\"\r\n (click)=\"onClick()\"\r\n>\r\n {{props.text}}\r\n</button>\r\n" }]
20
+ }] });
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnotZm9ybWx5LWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbnotZm9ybWx5L3NyYy9saWIvY29tcG9uZW50cy9uei1mb3JtbHktYnV0dG9uL256LWZvcm1seS1idXR0b24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW56LWZvcm1seS9zcmMvbGliL2NvbXBvbmVudHMvbnotZm9ybWx5LWJ1dHRvbi9uei1mb3JtbHktYnV0dG9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7O0FBUWhFLE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxTQUU1QztJQUNDLE9BQU87UUFDTCxJQUFJLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLElBQUksVUFBVSxFQUFFO1lBQzFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDcEI7SUFDSCxDQUFDO3dHQVBVLHVCQUF1Qjs0RkFBdkIsdUJBQXVCLG1GQ1RwQyxpYUFnQkE7OzRGRFBhLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBGaWVsZFR5cGUsIEZvcm1seUZpZWxkQ29uZmlnIH0gZnJvbSBcIkBuZ3gtZm9ybWx5L2NvcmVcIjtcclxuaW1wb3J0IHsgTnpGb3JtbHlCdXR0b25Qcm9wcyB9IGZyb20gXCIuLi8uLi9uZ3gtbnotZm9ybWx5LXByb3BzLm1vZGVsXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhcHAtbnotZm9ybWx5LWJ1dHRvblwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vbnotZm9ybWx5LWJ1dHRvbi5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi9uei1mb3JtbHktYnV0dG9uLmNvbXBvbmVudC5zY3NzXCJdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTnpGb3JtbHlCdXR0b25Db21wb25lbnQgZXh0ZW5kcyBGaWVsZFR5cGU8XHJcbiAgRm9ybWx5RmllbGRDb25maWc8TnpGb3JtbHlCdXR0b25Qcm9wcz5cclxuPiB7XHJcbiAgb25DbGljaygpIHtcclxuICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcz8uY2xpY2sgPT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgIHRoaXMucHJvcHMuY2xpY2soKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGJ1dHRvblxyXG4gIG56LWJ1dHRvblxyXG4gIHR5cGU9XCJidXR0b25cIlxyXG4gIFtkaXNhYmxlZF09XCJwcm9wcy5kaXNhYmxlZFwiXHJcbiAgW256R2hvc3RdPVwicHJvcHMubnpHaG9zdFwiXHJcbiAgW256TG9hZGluZ109XCJwcm9wcy5uekxvYWRpbmdcIlxyXG4gIFtuelNoYXBlXT1cInByb3BzLm56U2hhcGVcIlxyXG4gIFtuelNpemVdPVwicHJvcHMubnpTaXplXCJcclxuICBbbnpUeXBlXT1cInByb3BzLm56VHlwZVwiXHJcbiAgW256QmxvY2tdPVwicHJvcHMubnpCbG9ja1wiXHJcbiAgW256RGFuZ2VyXT1cInByb3BzLm56RGFuZ2VyXCJcclxuICBbbmdDbGFzc109XCJwcm9wcy5jbGFzc0xpc3RcIlxyXG4gIChjbGljayk9XCJvbkNsaWNrKClcIlxyXG4+XHJcbiAge3twcm9wcy50ZXh0fX1cclxuPC9idXR0b24+XHJcbiJdfQ==
@@ -0,0 +1,33 @@
1
+ import { Component } from "@angular/core";
2
+ import { FieldType } from "@ngx-formly/core";
3
+ import { Subject, takeUntil, tap } from "rxjs";
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@ngx-formly/core";
6
+ import * as i2 from "@angular/forms";
7
+ import * as i3 from "ng-zorro-antd/checkbox";
8
+ export class NzFormlyFieldCheckboxComponent extends FieldType {
9
+ unSubscribeAll$ = new Subject();
10
+ ngOnInit() {
11
+ this.formControl.valueChanges
12
+ .pipe(takeUntil(this.unSubscribeAll$), tap((value) => {
13
+ if (typeof this.props?.change == "function") {
14
+ this.props.change(this.field, value);
15
+ }
16
+ }))
17
+ .subscribe();
18
+ }
19
+ get fieldID() {
20
+ return "control-" + this.field.key;
21
+ }
22
+ ngOnDestroy() {
23
+ this.unSubscribeAll$.next();
24
+ this.unSubscribeAll$.complete();
25
+ }
26
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NzFormlyFieldCheckboxComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
27
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NzFormlyFieldCheckboxComponent, selector: "app-nz-formly-field-checkbox", usesInheritance: true, ngImport: i0, template: "<label\r\n nz-checkbox\r\n [nzId]=\"fieldID\"\r\n [formControl]=\"formControl\"\r\n [formlyAttributes]=\"field\"\r\n [nzDisabled]=\"props.disabled\"\r\n>\r\n {{props.label}}\r\n</label>\r\n", styles: ["label{display:flex;font-size:100%;font-weight:600;min-height:30px;width:-moz-fit-content;width:fit-content;align-items:center}\n"], dependencies: [{ kind: "directive", type: i1.ɵFormlyAttributes, selector: "[formlyAttributes]", inputs: ["formlyAttributes", "id"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i3.NzCheckboxComponent, selector: "[nz-checkbox]", inputs: ["nzValue", "nzAutoFocus", "nzDisabled", "nzIndeterminate", "nzChecked", "nzId"], outputs: ["nzCheckedChange"], exportAs: ["nzCheckbox"] }] });
28
+ }
29
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NzFormlyFieldCheckboxComponent, decorators: [{
30
+ type: Component,
31
+ args: [{ selector: "app-nz-formly-field-checkbox", template: "<label\r\n nz-checkbox\r\n [nzId]=\"fieldID\"\r\n [formControl]=\"formControl\"\r\n [formlyAttributes]=\"field\"\r\n [nzDisabled]=\"props.disabled\"\r\n>\r\n {{props.label}}\r\n</label>\r\n", styles: ["label{display:flex;font-size:100%;font-weight:600;min-height:30px;width:-moz-fit-content;width:fit-content;align-items:center}\n"] }]
32
+ }] });
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnotZm9ybWx5LWZpZWxkLWNoZWNrYm94LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1uei1mb3JtbHkvc3JjL2xpYi9jb21wb25lbnRzL256LWZvcm1seS1maWVsZC1jaGVja2JveC9uei1mb3JtbHktZmllbGQtY2hlY2tib3guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW56LWZvcm1seS9zcmMvbGliL2NvbXBvbmVudHMvbnotZm9ybWx5LWZpZWxkLWNoZWNrYm94L256LWZvcm1seS1maWVsZC1jaGVja2JveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFtQixNQUFNLGtCQUFrQixDQUFDO0FBRTlELE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7QUFPL0MsTUFBTSxPQUFPLDhCQUNYLFNBQVEsU0FBaUQ7SUFHekQsZUFBZSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFdEMsUUFBUTtRQUNOLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWTthQUMxQixJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFDL0IsR0FBRyxDQUFDLENBQUMsS0FBYSxFQUFFLEVBQUU7WUFDcEIsSUFBSSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxJQUFJLFVBQVUsRUFBRTtnQkFDM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQzthQUN0QztRQUNILENBQUMsQ0FBQyxDQUNIO2FBQ0EsU0FBUyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xDLENBQUM7d0dBMUJVLDhCQUE4Qjs0RkFBOUIsOEJBQThCLDJGQ1YzQyxxTUFTQTs7NEZEQ2EsOEJBQThCO2tCQUwxQyxTQUFTOytCQUNFLDhCQUE4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBGaWVsZFR5cGUsIEZpZWxkVHlwZUNvbmZpZyB9IGZyb20gXCJAbmd4LWZvcm1seS9jb3JlXCI7XHJcbmltcG9ydCB7IE56Rm9ybWx5Q2hlY2tib3hQcm9wcyB9IGZyb20gXCIuLi8uLi9uZ3gtbnotZm9ybWx5LXByb3BzLm1vZGVsXCI7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImFwcC1uei1mb3JtbHktZmllbGQtY2hlY2tib3hcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL256LWZvcm1seS1maWVsZC1jaGVja2JveC5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi9uei1mb3JtbHktZmllbGQtY2hlY2tib3guY29tcG9uZW50LnNjc3NcIl0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOekZvcm1seUZpZWxkQ2hlY2tib3hDb21wb25lbnRcclxuICBleHRlbmRzIEZpZWxkVHlwZTxGaWVsZFR5cGVDb25maWc8TnpGb3JtbHlDaGVja2JveFByb3BzPj5cclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95XHJcbntcclxuICB1blN1YnNjcmliZUFsbCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuU3Vic2NyaWJlQWxsJCksXHJcbiAgICAgICAgdGFwKCh2YWx1ZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHM/LmNoYW5nZSA9PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5jaGFuZ2UodGhpcy5maWVsZCwgdmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIGdldCBmaWVsZElEKCkge1xyXG4gICAgcmV0dXJuIFwiY29udHJvbC1cIiArIHRoaXMuZmllbGQua2V5O1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLnVuU3Vic2NyaWJlQWxsJC5uZXh0KCk7XHJcbiAgICB0aGlzLnVuU3Vic2NyaWJlQWxsJC5jb21wbGV0ZSgpO1xyXG4gIH1cclxufVxyXG4iLCI8bGFiZWxcclxuICBuei1jaGVja2JveFxyXG4gIFtueklkXT1cImZpZWxkSURcIlxyXG4gIFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiXHJcbiAgW2Zvcm1seUF0dHJpYnV0ZXNdPVwiZmllbGRcIlxyXG4gIFtuekRpc2FibGVkXT1cInByb3BzLmRpc2FibGVkXCJcclxuPlxyXG4gIHt7cHJvcHMubGFiZWx9fVxyXG48L2xhYmVsPlxyXG4iXX0=
@@ -0,0 +1,105 @@
1
+ import { Component } from "@angular/core";
2
+ import { FieldType } from "@ngx-formly/core";
3
+ import { debounceTime, Subject, takeUntil, tap } from "rxjs";
4
+ import { CountryMasks2 } from "./phone-mask.config";
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ import * as i2 from "@ngx-formly/core";
8
+ import * as i3 from "@angular/forms";
9
+ import * as i4 from "ngx-mask";
10
+ import * as i5 from "ng-zorro-antd/input";
11
+ import * as i6 from "ng-zorro-antd/core/transition-patch";
12
+ import * as i7 from "ng-zorro-antd/icon";
13
+ const DefaultPhoneMask = {
14
+ countryShortName: "IR",
15
+ prefix: "+98",
16
+ globalMask: "+00(000)000-0000",
17
+ };
18
+ export class NzFormlyFieldInputComponent extends FieldType {
19
+ mask;
20
+ unSubscribeAll$ = new Subject();
21
+ ngAfterViewInit() {
22
+ this.createInitState();
23
+ this.onValueChange();
24
+ }
25
+ createInitState() {
26
+ if (this.props.mask === "phone") {
27
+ this.mask = DefaultPhoneMask.globalMask;
28
+ this.handlePhoneMask();
29
+ }
30
+ else {
31
+ this.mask = this.props.mask;
32
+ }
33
+ }
34
+ handlePhoneMask() {
35
+ this.formControl.valueChanges
36
+ .pipe(takeUntil(this.unSubscribeAll$), tap((value) => {
37
+ if (value == "") {
38
+ // hint: without setTimeout we don't have Ctrl + A -> delete
39
+ setTimeout(() => {
40
+ this.mask = DefaultPhoneMask.globalMask;
41
+ });
42
+ }
43
+ else {
44
+ let mask = this.findAppropriateMask(value);
45
+ if (mask && this.mask !== mask.globalMask) {
46
+ this.mask = mask.globalMask?.replace(/#|[1-9]/g, "0");
47
+ }
48
+ }
49
+ }))
50
+ .subscribe();
51
+ }
52
+ onValueChange() {
53
+ this.formControl.valueChanges
54
+ .pipe(takeUntil(this.unSubscribeAll$), debounceTime(300), tap((value) => {
55
+ if (typeof this.props?.change == "function") {
56
+ this.props.change(this.field, value);
57
+ }
58
+ }))
59
+ .subscribe();
60
+ }
61
+ findAppropriateMask(value) {
62
+ let newMask = CountryMasks2.filter(item => this.exactEquality(value, item.prefix)).find(item => value.length <= item.globalMask.length);
63
+ if (newMask)
64
+ return newMask;
65
+ return null;
66
+ }
67
+ exactEquality(str, prefix) {
68
+ // hint: replace function removes all characters except numbers to return clean numeric string
69
+ // hint: index of convince us to match prefix on first index of input value
70
+ let new_str = str.replace(/[^0-9.]/g, "");
71
+ let new_prefix = prefix.replace(/[^0-9.]/g, "");
72
+ return new_str.indexOf(new_prefix) == 0;
73
+ }
74
+ changeShowPassword(input) {
75
+ if (input.type === "password") {
76
+ input.type = "text";
77
+ }
78
+ else {
79
+ input.type = "password";
80
+ }
81
+ }
82
+ showPassword(input) {
83
+ return input.type === "text";
84
+ }
85
+ get type() {
86
+ return this.props.type ?? "text";
87
+ }
88
+ get fieldID() {
89
+ return "control-" + this.field.key;
90
+ }
91
+ get status() {
92
+ return this.formControl.touched && this.formControl.invalid ? "error" : "";
93
+ }
94
+ ngOnDestroy() {
95
+ this.unSubscribeAll$.next();
96
+ this.unSubscribeAll$.complete();
97
+ }
98
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NzFormlyFieldInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
99
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NzFormlyFieldInputComponent, selector: "app-nz-formly-field-input", usesInheritance: true, ngImport: i0, template: "<nz-input-group\r\n [nzAddOnAfter]=\"props.nzAddOnAfter\"\r\n [nzAddOnBefore]=\"props.nzAddOnBefore\"\r\n [nzAddOnAfterIcon]=\"props.nzAddOnAfterIcon\"\r\n [nzAddOnBeforeIcon]=\"props.nzAddOnBeforeIcon\"\r\n [nzPrefix]=\"props.nzPrefix\"\r\n [nzSuffix]=\"props.nzSuffix\"\r\n [nzSize]=\"props.nzSize || 'default'\"\r\n>\r\n <input\r\n #input\r\n nz-input\r\n [id]=\"fieldID\"\r\n [formControl]=\"formControl\"\r\n [formlyAttributes]=\"field\"\r\n [mask]=\"mask\"\r\n [thousandSeparator]=\"props.thousandSeparator\"\r\n [type]=\"type\"\r\n [nzStatus]=\"status\"\r\n [disabled]=\"props.disabled\"\r\n [readonly]=\"props.readonly\"\r\n [placeholder]=\"props.placeholder\"\r\n [nzBorderless]=\"props.nzBorderless\"\r\n />\r\n <div class=\"show-password\" *ngIf=\"props.type === 'password'\">\r\n <span\r\n nz-icon\r\n nzTheme=\"outline\"\r\n (click)=\"changeShowPassword(input)\"\r\n [nzType]=\"showPassword(input) ? 'eye-invisible' : 'eye'\"\r\n ></span>\r\n </div>\r\n</nz-input-group>\r\n", styles: [".show-password{z-index:5;opacity:.6;cursor:pointer;position:absolute;inset-inline-end:10px}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵFormlyAttributes, selector: "[formlyAttributes]", inputs: ["formlyAttributes", "id"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.NgxMaskDirective, selector: "input[mask], textarea[mask]", inputs: ["mask", "specialCharacters", "patterns", "prefix", "suffix", "thousandSeparator", "decimalMarker", "dropSpecialCharacters", "hiddenInput", "showMaskTyped", "placeHolderCharacter", "shownMaskExpression", "showTemplate", "clearIfNotMatch", "validation", "separatorLimit", "allowNegativeNumbers", "leadZeroDateTime", "leadZero", "triggerOnMaskChange", "apm", "inputTransformFn", "outputTransformFn", "keepCharacterPositions"], outputs: ["maskFilled"], exportAs: ["mask", "ngxMask"] }, { kind: "directive", type: i5.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i5.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzStatus", "nzSuffix", "nzSize", "nzSearch", "nzCompact"], exportAs: ["nzInputGroup"] }, { kind: "directive", type: i5.NzInputGroupWhitSuffixOrPrefixDirective, selector: "nz-input-group[nzSuffix], nz-input-group[nzPrefix]" }, { kind: "directive", type: i6.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i7.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }] });
100
+ }
101
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NzFormlyFieldInputComponent, decorators: [{
102
+ type: Component,
103
+ args: [{ selector: "app-nz-formly-field-input", template: "<nz-input-group\r\n [nzAddOnAfter]=\"props.nzAddOnAfter\"\r\n [nzAddOnBefore]=\"props.nzAddOnBefore\"\r\n [nzAddOnAfterIcon]=\"props.nzAddOnAfterIcon\"\r\n [nzAddOnBeforeIcon]=\"props.nzAddOnBeforeIcon\"\r\n [nzPrefix]=\"props.nzPrefix\"\r\n [nzSuffix]=\"props.nzSuffix\"\r\n [nzSize]=\"props.nzSize || 'default'\"\r\n>\r\n <input\r\n #input\r\n nz-input\r\n [id]=\"fieldID\"\r\n [formControl]=\"formControl\"\r\n [formlyAttributes]=\"field\"\r\n [mask]=\"mask\"\r\n [thousandSeparator]=\"props.thousandSeparator\"\r\n [type]=\"type\"\r\n [nzStatus]=\"status\"\r\n [disabled]=\"props.disabled\"\r\n [readonly]=\"props.readonly\"\r\n [placeholder]=\"props.placeholder\"\r\n [nzBorderless]=\"props.nzBorderless\"\r\n />\r\n <div class=\"show-password\" *ngIf=\"props.type === 'password'\">\r\n <span\r\n nz-icon\r\n nzTheme=\"outline\"\r\n (click)=\"changeShowPassword(input)\"\r\n [nzType]=\"showPassword(input) ? 'eye-invisible' : 'eye'\"\r\n ></span>\r\n </div>\r\n</nz-input-group>\r\n", styles: [".show-password{z-index:5;opacity:.6;cursor:pointer;position:absolute;inset-inline-end:10px}\n"] }]
104
+ }] });
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnotZm9ybWx5LWZpZWxkLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1uei1mb3JtbHkvc3JjL2xpYi9jb21wb25lbnRzL256LWZvcm1seS1maWVsZC1pbnB1dC9uei1mb3JtbHktZmllbGQtaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW56LWZvcm1seS9zcmMvbGliL2NvbXBvbmVudHMvbnotZm9ybWx5LWZpZWxkLWlucHV0L256LWZvcm1seS1maWVsZC1pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFtQixNQUFNLGtCQUFrQixDQUFDO0FBRTlELE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0QsT0FBTyxFQUFtQixhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7O0FBRXJFLE1BQU0sZ0JBQWdCLEdBQW9CO0lBQ3hDLGdCQUFnQixFQUFFLElBQUk7SUFDdEIsTUFBTSxFQUFFLEtBQUs7SUFDYixVQUFVLEVBQUUsa0JBQWtCO0NBQy9CLENBQUM7QUFPRixNQUFNLE9BQU8sMkJBQ1gsU0FBUSxTQUE4QztJQUd0RCxJQUFJLENBQXFCO0lBQ3pCLGVBQWUsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBRXRDLGVBQWU7UUFDYixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUU7WUFDL0IsSUFBSSxDQUFD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QUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7SUFDckMsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzdFLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xDLENBQUM7d0dBbkdVLDJCQUEyQjs0RkFBM0IsMkJBQTJCLHdGQ2pCeEMsbWtDQWlDQTs7NEZEaEJhLDJCQUEyQjtrQkFMdkMsU0FBUzsrQkFDRSwyQkFBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIE9uRGVzdHJveSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEZpZWxkVHlwZSwgRmllbGRUeXBlQ29uZmlnIH0gZnJvbSBcIkBuZ3gtZm9ybWx5L2NvcmVcIjtcclxuaW1wb3J0IHsgTnpGb3JtbHlJbnB1dFByb3BzIH0gZnJvbSBcIi4uLy4uL25neC1uei1mb3JtbHktcHJvcHMubW9kZWxcIjtcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBTdWJqZWN0LCB0YWtlVW50aWwsIHRhcCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IENvdW50cnlDb2RlTWFzaywgQ291bnRyeU1hc2tzMiB9IGZyb20gXCIuL3Bob25lLW1hc2suY29uZmlnXCI7XHJcblxyXG5jb25zdCBEZWZhdWx0UGhvbmVNYXNrOiBDb3VudHJ5Q29kZU1hc2sgPSB7XHJcbiAgY291bnRyeVNob3J0TmFtZTogXCJJUlwiLFxyXG4gIHByZWZpeDogXCIrOThcIixcclxuICBnbG9iYWxNYXNrOiBcIiswMCgwMDApMDAwLTAwMDBcIixcclxufTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImFwcC1uei1mb3JtbHktZmllbGQtaW5wdXRcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL256LWZvcm1seS1maWVsZC1pbnB1dC5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi9uei1mb3JtbHktZmllbGQtaW5wdXQuY29tcG9uZW50LnNjc3NcIl0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOekZvcm1seUZpZWxkSW5wdXRDb21wb25lbnRcclxuICBleHRlbmRzIEZpZWxkVHlwZTxGaWVsZFR5cGVDb25maWc8TnpGb3JtbHlJbnB1dFByb3BzPj5cclxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveVxyXG57XHJcbiAgbWFzazogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHVuU3Vic2NyaWJlQWxsJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMuY3JlYXRlSW5pdFN0YXRlKCk7XHJcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZUluaXRTdGF0ZSgpIHtcclxuICAgIGlmICh0aGlzLnByb3BzLm1hc2sgPT09IFwicGhvbmVcIikge1xyXG4gICAgICB0aGlzLm1hc2sgPSBEZWZhdWx0UGhvbmVNYXNrLmdsb2JhbE1hc2s7XHJcbiAgICAgIHRoaXMuaGFuZGxlUGhvbmVNYXNrKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm1hc2sgPSB0aGlzLnByb3BzLm1hc2s7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVQaG9uZU1hc2soKSB7XHJcbiAgICB0aGlzLmZvcm1Db250cm9sLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy51blN1YnNjcmliZUFsbCQpLFxyXG4gICAgICAgIHRhcCgodmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgaWYgKHZhbHVlID09IFwiXCIpIHtcclxuICAgICAgICAgICAgLy8gaGludDogd2l0aG91dCBzZXRUaW1lb3V0IHdlIGRvbid0IGhhdmUgQ3RybCArIEEgLT4gZGVsZXRlXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMubWFzayA9IERlZmF1bHRQaG9uZU1hc2suZ2xvYmFsTWFzaztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgbWFzayA9IHRoaXMuZmluZEFwcHJvcHJpYXRlTWFzayh2YWx1ZSk7XHJcbiAgICAgICAgICAgIGlmIChtYXNrICYmIHRoaXMubWFzayAhPT0gbWFzay5nbG9iYWxNYXNrKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5tYXNrID0gbWFzay5nbG9iYWxNYXNrPy5yZXBsYWNlKC8jfFsxLTldL2csIFwiMFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIG9uVmFsdWVDaGFuZ2UoKSB7XHJcbiAgICB0aGlzLmZvcm1Db250cm9sLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy51blN1YnNjcmliZUFsbCQpLFxyXG4gICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxyXG4gICAgICAgIHRhcCgodmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzPy5jaGFuZ2UgPT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMuY2hhbmdlKHRoaXMuZmllbGQsIHZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBmaW5kQXBwcm9wcmlhdGVNYXNrKHZhbHVlOiBzdHJpbmcpOiBDb3VudHJ5Q29kZU1hc2sgfCBudWxsIHtcclxuICAgIGxldCBuZXdNYXNrID0gQ291bnRyeU1hc2tzMi5maWx0ZXIoaXRlbSA9PlxyXG4gICAgICB0aGlzLmV4YWN0RXF1YWxpdHkodmFsdWUsIGl0ZW0ucHJlZml4KSxcclxuICAgICkuZmluZChpdGVtID0+IHZhbHVlLmxlbmd0aCA8PSBpdGVtLmdsb2JhbE1hc2subGVuZ3RoKTtcclxuICAgIGlmIChuZXdNYXNrKSByZXR1cm4gbmV3TWFzaztcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZXhhY3RFcXVhbGl0eShzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIC8vIGhpbnQ6IHJlcGxhY2UgZnVuY3Rpb24gcmVtb3ZlcyBhbGwgY2hhcmFjdGVycyBleGNlcHQgbnVtYmVycyB0byByZXR1cm4gY2xlYW4gbnVtZXJpYyBzdHJpbmdcclxuICAgIC8vIGhpbnQ6IGluZGV4IG9mIGNvbnZpbmNlIHVzIHRvIG1hdGNoIHByZWZpeCBvbiBmaXJzdCBpbmRleCBvZiBpbnB1dCB2YWx1ZVxyXG4gICAgbGV0IG5ld19zdHIgPSBzdHIucmVwbGFjZSgvW14wLTkuXS9nLCBcIlwiKTtcclxuICAgIGxldCBuZXdfcHJlZml4ID0gcHJlZml4LnJlcGxhY2UoL1teMC05Ll0vZywgXCJcIik7XHJcbiAgICByZXR1cm4gbmV3X3N0ci5pbmRleE9mKG5ld19wcmVmaXgpID09IDA7XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VTaG93UGFzc3dvcmQoaW5wdXQ6IGFueSkge1xyXG4gICAgaWYgKGlucHV0LnR5cGUgPT09IFwicGFzc3dvcmRcIikge1xyXG4gICAgICBpbnB1dC50eXBlID0gXCJ0ZXh0XCI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpbnB1dC50eXBlID0gXCJwYXNzd29yZFwiO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2hvd1Bhc3N3b3JkKGlucHV0OiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBpbnB1dC50eXBlID09PSBcInRleHRcIjtcclxuICB9XHJcblxyXG4gIGdldCB0eXBlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucHJvcHMudHlwZSA/PyBcInRleHRcIjtcclxuICB9XHJcblxyXG4gIGdldCBmaWVsZElEKCkge1xyXG4gICAgcmV0dXJuIFwiY29udHJvbC1cIiArIHRoaXMuZmllbGQua2V5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHN0YXR1cygpIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1Db250cm9sLnRvdWNoZWQgJiYgdGhpcy5mb3JtQ29udHJvbC5pbnZhbGlkID8gXCJlcnJvclwiIDogXCJcIjtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy51blN1YnNjcmliZUFsbCQubmV4dCgpO1xyXG4gICAgdGhpcy51blN1YnNjcmliZUFsbCQuY29tcGxldGUoKTtcclxuICB9XHJcbn1cclxuIiwiPG56LWlucHV0LWdyb3VwXHJcbiAgW256QWRkT25BZnRlcl09XCJwcm9wcy5uekFkZE9uQWZ0ZXJcIlxyXG4gIFtuekFkZE9uQmVmb3JlXT1cInByb3BzLm56QWRkT25CZWZvcmVcIlxyXG4gIFtuekFkZE9uQWZ0ZXJJY29uXT1cInByb3BzLm56QWRkT25BZnRlckljb25cIlxyXG4gIFtuekFkZE9uQmVmb3JlSWNvbl09XCJwcm9wcy5uekFkZE9uQmVmb3JlSWNvblwiXHJcbiAgW256UHJlZml4XT1cInByb3BzLm56UHJlZml4XCJcclxuICBbbnpTdWZmaXhdPVwicHJvcHMubnpTdWZmaXhcIlxyXG4gIFtuelNpemVdPVwicHJvcHMubnpTaXplIHx8ICdkZWZhdWx0J1wiXHJcbj5cclxuICA8aW5wdXRcclxuICAgICAgI2lucHV0XHJcbiAgICAgIG56LWlucHV0XHJcbiAgICAgIFtpZF09XCJmaWVsZElEXCJcclxuICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcclxuICAgICAgW2Zvcm1seUF0dHJpYnV0ZXNdPVwiZmllbGRcIlxyXG4gICAgICBbbWFza109XCJtYXNrXCJcclxuICAgICAgW3Rob3VzYW5kU2VwYXJhdG9yXT1cInByb3BzLnRob3VzYW5kU2VwYXJhdG9yXCJcclxuICAgICAgW3R5cGVdPVwidHlwZVwiXHJcbiAgICAgIFtuelN0YXR1c109XCJzdGF0dXNcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwicHJvcHMuZGlzYWJsZWRcIlxyXG4gICAgICBbcmVhZG9ubHldPVwicHJvcHMucmVhZG9ubHlcIlxyXG4gICAgICBbcGxhY2Vob2xkZXJdPVwicHJvcHMucGxhY2Vob2xkZXJcIlxyXG4gICAgICBbbnpCb3JkZXJsZXNzXT1cInByb3BzLm56Qm9yZGVybGVzc1wiXHJcbiAgLz5cclxuICA8ZGl2IGNsYXNzPVwic2hvdy1wYXNzd29yZFwiICpuZ0lmPVwicHJvcHMudHlwZSA9PT0gJ3Bhc3N3b3JkJ1wiPlxyXG4gICAgPHNwYW5cclxuICAgICAgbnotaWNvblxyXG4gICAgICBuelRoZW1lPVwib3V0bGluZVwiXHJcbiAgICAgIChjbGljayk9XCJjaGFuZ2VTaG93UGFzc3dvcmQoaW5wdXQpXCJcclxuICAgICAgW256VHlwZV09XCJzaG93UGFzc3dvcmQoaW5wdXQpID8gJ2V5ZS1pbnZpc2libGUnIDogJ2V5ZSdcIlxyXG4gICAgPjwvc3Bhbj5cclxuICA8L2Rpdj5cclxuPC9uei1pbnB1dC1ncm91cD5cclxuIl19