@firestitch/form 12.4.11 → 12.4.13

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 (103) hide show
  1. package/app/components/form-dialog-actions/form-dialog-actions.component.d.ts +23 -23
  2. package/app/consts/error-messages.const.d.ts +19 -19
  3. package/app/directives/button.directive.d.ts +35 -35
  4. package/app/directives/form/form.directive.d.ts +122 -122
  5. package/app/directives/form-dialog-close.directive.d.ts +12 -12
  6. package/app/directives/index.d.ts +2 -2
  7. package/app/directives/submit-button.directive.d.ts +6 -6
  8. package/app/directives/validators/compare.directive.d.ts +15 -15
  9. package/app/directives/validators/control.directive.d.ts +48 -48
  10. package/app/directives/validators/daterange.directive.d.ts +13 -13
  11. package/app/directives/validators/email.directive.d.ts +13 -13
  12. package/app/directives/validators/emails.directive.d.ts +13 -13
  13. package/app/directives/validators/function.directive.d.ts +15 -15
  14. package/app/directives/validators/greater.directive.d.ts +13 -13
  15. package/app/directives/validators/integer.directive.d.ts +13 -13
  16. package/app/directives/validators/lesser.directive.d.ts +13 -13
  17. package/app/directives/validators/max.directive.d.ts +13 -13
  18. package/app/directives/validators/maxlength.directive.d.ts +13 -13
  19. package/app/directives/validators/min.directive.d.ts +13 -13
  20. package/app/directives/validators/minlength.directive.d.ts +13 -13
  21. package/app/directives/validators/no-fs-validators.directive.d.ts +13 -13
  22. package/app/directives/validators/numeric.directive.d.ts +13 -13
  23. package/app/directives/validators/pattern.directive.d.ts +13 -13
  24. package/app/directives/validators/phone.directive.d.ts +13 -13
  25. package/app/directives/validators/required.directive.d.ts +16 -16
  26. package/app/directives/validators/url.directive.d.ts +14 -14
  27. package/app/directives/validators/validate.directive.d.ts +15 -15
  28. package/app/enums/confirm-result.d.ts +7 -7
  29. package/app/enums/form-status.d.ts +10 -10
  30. package/app/fs-form.module.d.ts +37 -37
  31. package/app/guards/form-deactivate.guard.d.ts +14 -14
  32. package/app/helpers/confirm-result-continue.d.ts +1 -1
  33. package/app/helpers/confirm-unsaved.d.ts +5 -5
  34. package/app/helpers/get-active-route.d.ts +2 -2
  35. package/app/helpers/get-form-errors.d.ts +2 -2
  36. package/app/helpers/index.d.ts +2 -2
  37. package/app/helpers/is-enabled.d.ts +1 -1
  38. package/app/interfaces/async-validator.d.ts +14 -14
  39. package/app/interfaces/confirm-config.d.ts +7 -7
  40. package/app/interfaces/confirm-tab-group.d.ts +10 -10
  41. package/app/interfaces/index.d.ts +4 -4
  42. package/app/interfaces/submit-event.d.ts +6 -6
  43. package/app/interfaces/submitted-event.d.ts +7 -7
  44. package/app/interfaces/validator.d.ts +13 -13
  45. package/app/providers/validate-messages.provider.d.ts +25 -25
  46. package/app/services/fsform.service.d.ts +16 -16
  47. package/app/validators/validators.d.ts +12 -12
  48. package/bundles/firestitch-form.umd.js +2839 -2836
  49. package/bundles/firestitch-form.umd.js.map +1 -1
  50. package/esm2015/app/components/form-dialog-actions/form-dialog-actions.component.js +91 -91
  51. package/esm2015/app/consts/error-messages.const.js +19 -19
  52. package/esm2015/app/directives/button.directive.js +152 -152
  53. package/esm2015/app/directives/form/form.directive.js +696 -696
  54. package/esm2015/app/directives/form-dialog-close.directive.js +30 -30
  55. package/esm2015/app/directives/index.js +2 -2
  56. package/esm2015/app/directives/submit-button.directive.js +13 -13
  57. package/esm2015/app/directives/validators/compare.directive.js +48 -48
  58. package/esm2015/app/directives/validators/control.directive.js +265 -262
  59. package/esm2015/app/directives/validators/daterange.directive.js +40 -40
  60. package/esm2015/app/directives/validators/email.directive.js +40 -40
  61. package/esm2015/app/directives/validators/emails.directive.js +40 -40
  62. package/esm2015/app/directives/validators/function.directive.js +40 -40
  63. package/esm2015/app/directives/validators/greater.directive.js +39 -39
  64. package/esm2015/app/directives/validators/integer.directive.js +40 -40
  65. package/esm2015/app/directives/validators/lesser.directive.js +39 -39
  66. package/esm2015/app/directives/validators/max.directive.js +35 -35
  67. package/esm2015/app/directives/validators/maxlength.directive.js +34 -34
  68. package/esm2015/app/directives/validators/min.directive.js +35 -35
  69. package/esm2015/app/directives/validators/minlength.directive.js +34 -34
  70. package/esm2015/app/directives/validators/no-fs-validators.directive.js +46 -46
  71. package/esm2015/app/directives/validators/numeric.directive.js +40 -40
  72. package/esm2015/app/directives/validators/pattern.directive.js +34 -34
  73. package/esm2015/app/directives/validators/phone.directive.js +40 -40
  74. package/esm2015/app/directives/validators/required.directive.js +70 -70
  75. package/esm2015/app/directives/validators/url.directive.js +46 -46
  76. package/esm2015/app/directives/validators/validate.directive.js +42 -42
  77. package/esm2015/app/enums/confirm-result.js +8 -8
  78. package/esm2015/app/enums/form-status.js +11 -11
  79. package/esm2015/app/fs-form.module.js +180 -180
  80. package/esm2015/app/guards/form-deactivate.guard.js +44 -44
  81. package/esm2015/app/helpers/confirm-result-continue.js +4 -4
  82. package/esm2015/app/helpers/confirm-unsaved.js +71 -71
  83. package/esm2015/app/helpers/get-active-route.js +6 -6
  84. package/esm2015/app/helpers/get-form-errors.js +24 -24
  85. package/esm2015/app/helpers/index.js +2 -2
  86. package/esm2015/app/helpers/is-enabled.js +3 -3
  87. package/esm2015/app/interfaces/async-validator.js +1 -1
  88. package/esm2015/app/interfaces/confirm-config.js +1 -1
  89. package/esm2015/app/interfaces/confirm-tab-group.js +1 -1
  90. package/esm2015/app/interfaces/index.js +4 -4
  91. package/esm2015/app/interfaces/submit-event.js +1 -1
  92. package/esm2015/app/interfaces/submitted-event.js +1 -1
  93. package/esm2015/app/interfaces/validator.js +1 -1
  94. package/esm2015/app/providers/validate-messages.provider.js +10 -10
  95. package/esm2015/app/services/fsform.service.js +39 -39
  96. package/esm2015/app/validators/validators.js +97 -97
  97. package/esm2015/firestitch-form.js +4 -4
  98. package/esm2015/public_api.js +36 -36
  99. package/fesm2015/firestitch-form.js +2276 -2273
  100. package/fesm2015/firestitch-form.js.map +1 -1
  101. package/firestitch-form.d.ts +5 -5
  102. package/package.json +1 -1
  103. package/public_api.d.ts +34 -34
@@ -1,262 +1,265 @@
1
- import { Input, ElementRef, Renderer2, Directive, Injector, Optional, Inject, Self, } from '@angular/core';
2
- import { NgControl } from '@angular/forms';
3
- import { Subject } from 'rxjs';
4
- import { takeUntil } from 'rxjs/operators';
5
- import { values, keys } from 'lodash-es';
6
- import { FsFormDirective } from '../form/form.directive';
7
- import { VALIDATE_MESSAGE_PROVIDER, VALIDATE_MESSAGES } from '../../providers/validate-messages.provider';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "@angular/forms";
10
- import * as i2 from "../form/form.directive";
11
- export class FsControlDirective {
12
- constructor(elementRef, renderer2, injector, _validateMessages, ngControl, formDirective) {
13
- this.elementRef = elementRef;
14
- this.renderer2 = renderer2;
15
- this.injector = injector;
16
- this._validateMessages = _validateMessages;
17
- this.ngControl = ngControl;
18
- this.formDirective = formDirective;
19
- this.appendMessageClass = 'fs-form-message';
20
- this.appendLabelClass = 'fs-form-label';
21
- this.appendErrorClass = 'fs-form-error';
22
- this.appendHintClass = 'fs-form-hint';
23
- this.errors = [];
24
- // protected _validateMessages = { ...ERROR_MESSAGES };
25
- this._destroy$ = new Subject();
26
- if (ngControl) {
27
- this._control = ngControl.control;
28
- }
29
- else {
30
- console.error('The element does not have a valid ngModel', this.elementRef.nativeElement);
31
- }
32
- }
33
- set validateMessages(messages) {
34
- this._validateMessages = Object.assign(Object.assign({}, this._validateMessages), messages);
35
- }
36
- ngOnInit() {
37
- this._setupValidators();
38
- }
39
- ngOnDestroy() {
40
- this._destroy$.next();
41
- this._destroy$.complete();
42
- }
43
- ngAfterContentInit() {
44
- if (this._control) {
45
- this._control.statusChanges
46
- .pipe(takeUntil(this._destroy$))
47
- .subscribe(this.render.bind(this));
48
- }
49
- }
50
- getMessageSelector() {
51
- var _a;
52
- if (this.messageSelector === false) {
53
- return '';
54
- }
55
- if (this.messageSelector) {
56
- return this.messageSelector;
57
- }
58
- else if ((_a = this.formDirective) === null || _a === void 0 ? void 0 : _a.messageSelector) {
59
- return this.formDirective.messageSelector;
60
- }
61
- }
62
- getHintWrapperSelector() {
63
- var _a;
64
- if (this.hintSelector === false) {
65
- return '';
66
- }
67
- if (this.hintSelector) {
68
- return this.hintSelector;
69
- }
70
- else if ((_a = this.formDirective) === null || _a === void 0 ? void 0 : _a.hintSelector) {
71
- return this.formDirective.hintSelector;
72
- }
73
- }
74
- getWrapperSelector() {
75
- var _a;
76
- if (this.wrapperSelector === false) {
77
- return '';
78
- }
79
- if (this.wrapperSelector) {
80
- return this.wrapperSelector;
81
- }
82
- else if ((_a = this.formDirective) === null || _a === void 0 ? void 0 : _a.wrapperSelector) {
83
- return this.formDirective.wrapperSelector;
84
- }
85
- }
86
- getlabelSelector() {
87
- var _a;
88
- if (this.labelSelector === false) {
89
- return '';
90
- }
91
- if (this.labelSelector) {
92
- return this.labelSelector;
93
- }
94
- else if ((_a = this.formDirective) === null || _a === void 0 ? void 0 : _a.labelSelector) {
95
- return this.formDirective.labelSelector;
96
- }
97
- }
98
- getWrapperElement() {
99
- const wrapper = this.getWrapper(this.elementRef.nativeElement);
100
- if (wrapper) {
101
- return wrapper;
102
- }
103
- return this.elementRef.nativeElement;
104
- }
105
- /*
106
- <mat-form-field class="mat-form-field"> <-- Field Wrapper Class. Look for parents from the native element with the matching wrapperSelector. If not found defaults to native element.
107
- <input>
108
- <div class="fs-form-message"> <-- Message Selector. Look for the element with class .fs-form-message or messageSelector
109
- <div class="fs-form-message"></div>
110
- <div class="fs-form-hint"></div> <-- Hint Selector. Look for the element with class .fs-form-hint or hintSelector
111
- </div>
112
- </mat-form-field>
113
- */
114
- render() {
115
- var _a, _b;
116
- if (this._control.statusChangesSubscribe) {
117
- return;
118
- }
119
- this._control.statusChangesSubscribe = true;
120
- if (this.ngControl) {
121
- const renderer = this.renderer2;
122
- const wrapper = this.getWrapperElement();
123
- const error = this.ngControl.dirty ? this.getError(this.ngControl) : null;
124
- const shouldErrorBeRendered = this.ngControl.invalid
125
- && (this.ngControl.dirty || ((_b = (_a = this.formDirective) === null || _a === void 0 ? void 0 : _a.ngForm) === null || _b === void 0 ? void 0 : _b.submitted));
126
- if (shouldErrorBeRendered && error) {
127
- wrapper.classList.add('ng-invalid', 'ng-dirty');
128
- }
129
- else {
130
- wrapper.classList.remove('ng-invalid');
131
- }
132
- if (!this.getMessageSelector()) {
133
- return;
134
- }
135
- const messageWrapper = wrapper.querySelector(this.getMessageSelector());
136
- if (!messageWrapper) {
137
- return console.warn('Failed to locate ' + this.getMessageSelector(), this.elementRef.nativeElement);
138
- }
139
- if (this.getlabelSelector()) {
140
- const labelWrapper = wrapper.querySelector(this.getlabelSelector());
141
- if (labelWrapper) {
142
- if (this.appendLabelClass) {
143
- this.renderer2.addClass(labelWrapper, this.appendLabelClass);
144
- }
145
- }
146
- }
147
- if (this.appendMessageClass) {
148
- renderer.addClass(messageWrapper, this.appendMessageClass);
149
- }
150
- if (this.getHintWrapperSelector()) {
151
- const hint = messageWrapper.querySelector(this.getHintWrapperSelector());
152
- if (hint) {
153
- renderer.setStyle(hint, 'display', error ? 'none' : 'block');
154
- if (this.appendHintClass) {
155
- renderer.addClass(hint, this.appendHintClass);
156
- }
157
- }
158
- }
159
- let errorWrapper = wrapper.querySelector('.fs-form-error-target');
160
- if (errorWrapper) {
161
- errorWrapper.remove();
162
- }
163
- if (!shouldErrorBeRendered || !error) {
164
- return;
165
- }
166
- errorWrapper = renderer.createElement('div');
167
- renderer.addClass(errorWrapper, 'fs-form-error-target');
168
- renderer.addClass(errorWrapper, this.appendErrorClass);
169
- renderer.addClass(errorWrapper, this.appendErrorClass + '-' + error.name);
170
- const errorText = renderer.createText(error.message);
171
- renderer.appendChild(errorWrapper, errorText);
172
- messageWrapper.appendChild(errorWrapper);
173
- }
174
- }
175
- getWrapper(node, count = 0) {
176
- if (!node || count > 10) {
177
- return null;
178
- }
179
- if (node.parentNode && node.parentNode.querySelector(this.getWrapperSelector())) {
180
- return node;
181
- }
182
- return this.getWrapper(node.parentNode, ++count);
183
- }
184
- parseErrorMessage(message, args) {
185
- values(args)
186
- .forEach((name) => {
187
- message = message.replace(/\$\(\d\)/, name);
188
- });
189
- return message;
190
- }
191
- getError(controlRef) {
192
- const name = keys(controlRef.control.errors)[0];
193
- if (!name) {
194
- return null;
195
- }
196
- let message = controlRef.control.errors[name];
197
- if (this._validateMessages[name]) {
198
- message = this.parseErrorMessage(this._validateMessages[name], message);
199
- }
200
- return { name: name, message: message };
201
- }
202
- _setupValidators() {
203
- const control = this._control;
204
- if (this.validate) {
205
- const validators = control.validator
206
- ? [control.validator, this.validate.bind(this)]
207
- : this.validate.bind(this);
208
- control.setValidators(validators);
209
- }
210
- if (this.validateAsync) {
211
- const asyncValidators = control.asyncValidator
212
- ? [control.asyncValidator, this.validateAsync.bind(this)]
213
- : this.validateAsync.bind(this);
214
- control.setAsyncValidators(asyncValidators);
215
- }
216
- control.updateValueAndValidity();
217
- }
218
- }
219
- FsControlDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsControlDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.Injector }, { token: VALIDATE_MESSAGES, self: true }, { token: i1.NgControl, optional: true }, { token: FsFormDirective, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
220
- FsControlDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.16", type: FsControlDirective, selector: "[fsFormControl]", inputs: { wrapperSelector: "wrapperSelector", messageSelector: "messageSelector", hintSelector: "hintSelector", labelSelector: "labelSelector", appendMessageClass: "appendMessageClass", appendLabelClass: "appendLabelClass", appendErrorClass: "appendErrorClass", appendHintClass: "appendHintClass", validateMessages: "validateMessages" }, providers: [
221
- VALIDATE_MESSAGE_PROVIDER
222
- ], ngImport: i0 });
223
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsControlDirective, decorators: [{
224
- type: Directive,
225
- args: [{
226
- selector: '[fsFormControl]',
227
- providers: [
228
- VALIDATE_MESSAGE_PROVIDER
229
- ],
230
- }]
231
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.Injector }, { type: undefined, decorators: [{
232
- type: Self
233
- }, {
234
- type: Inject,
235
- args: [VALIDATE_MESSAGES]
236
- }] }, { type: i1.NgControl, decorators: [{
237
- type: Optional
238
- }] }, { type: i2.FsFormDirective, decorators: [{
239
- type: Optional
240
- }, {
241
- type: Inject,
242
- args: [FsFormDirective]
243
- }] }]; }, propDecorators: { wrapperSelector: [{
244
- type: Input
245
- }], messageSelector: [{
246
- type: Input
247
- }], hintSelector: [{
248
- type: Input
249
- }], labelSelector: [{
250
- type: Input
251
- }], appendMessageClass: [{
252
- type: Input
253
- }], appendLabelClass: [{
254
- type: Input
255
- }], appendErrorClass: [{
256
- type: Input
257
- }], appendHintClass: [{
258
- type: Input
259
- }], validateMessages: [{
260
- type: Input
261
- }] } });
262
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2RpcmVjdGl2ZXMvdmFsaWRhdG9ycy9jb250cm9sLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsS0FBSyxFQUNMLFVBQVUsRUFDVixTQUFTLEVBQ1QsU0FBUyxFQUNULFFBQVEsRUFDUixRQUFRLEVBQ1IsTUFBTSxFQUNOLElBQUksR0FJTCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFxQyxNQUFNLGdCQUFnQixDQUFDO0FBRTlFLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXpDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLGlCQUFpQixFQUNsQixNQUFNLDRDQUE0QyxDQUFDOzs7O0FBZXBELE1BQU0sT0FBTyxrQkFBa0I7SUF5QjdCLFlBQ1ksVUFBc0IsRUFDdEIsU0FBb0IsRUFDcEIsUUFBa0IsRUFDaUIsaUJBQWlCLEVBQ3hDLFNBQW9CLEVBQ0ssYUFBOEI7UUFMbkUsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDaUIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFBO1FBQ3hDLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDSyxrQkFBYSxHQUFiLGFBQWEsQ0FBaUI7UUF6QnRFLHVCQUFrQixHQUFHLGlCQUFpQixDQUFDO1FBQ3ZDLHFCQUFnQixHQUFHLGVBQWUsQ0FBQztRQUNuQyxxQkFBZ0IsR0FBRyxlQUFl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biAgRWxlbWVudFJlZixcbiAgUmVuZGVyZXIyLFxuICBEaXJlY3RpdmUsXG4gIEluamVjdG9yLFxuICBPcHRpb25hbCxcbiAgSW5qZWN0LFxuICBTZWxmLFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ0NvbnRyb2wsIEFic3RyYWN0Q29udHJvbCwgVmFsaWRhdGlvbkVycm9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyB2YWx1ZXMsIGtleXMgfSBmcm9tICdsb2Rhc2gtZXMnO1xuXG5pbXBvcnQgeyBGc0Zvcm1EaXJlY3RpdmUgfSBmcm9tICcuLi9mb3JtL2Zvcm0uZGlyZWN0aXZlJztcbmltcG9ydCB7XG4gIFZBTElEQVRFX01FU1NBR0VfUFJPVklERVIsXG4gIFZBTElEQVRFX01FU1NBR0VTXG59IGZyb20gJy4uLy4uL3Byb3ZpZGVycy92YWxpZGF0ZS1tZXNzYWdlcy5wcm92aWRlcic7XG5cblxuZXhwb3J0IGludGVyZmFjZSBGc0NvbnRyb2xEaXJlY3RpdmUge1xuICB2YWxpZGF0ZT8oY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGw7XG4gIHZhbGlkYXRlQXN5bmM/KGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFByb21pc2U8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+IHwgT2JzZXJ2YWJsZTxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD47XG59XG5cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2ZzRm9ybUNvbnRyb2xdJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAgVkFMSURBVEVfTUVTU0FHRV9QUk9WSURFUlxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBGc0NvbnRyb2xEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG5cbiAgQElucHV0KCkgd3JhcHBlclNlbGVjdG9yOiBzdHJpbmcgfCBmYWxzZTtcbiAgQElucHV0KCkgbWVzc2FnZVNlbGVjdG9yOiBzdHJpbmcgfCBmYWxzZTtcbiAgQElucHV0KCkgaGludFNlbGVjdG9yOiBzdHJpbmcgfCBmYWxzZTtcbiAgQElucHV0KCkgbGFiZWxTZWxlY3Rvcjogc3RyaW5nIHwgZmFsc2U7XG4gIEBJbnB1dCgpIGFwcGVuZE1lc3NhZ2VDbGFzcyA9ICdmcy1mb3JtLW1lc3NhZ2UnO1xuICBASW5wdXQoKSBhcHBlbmRMYWJlbENsYXNzID0gJ2ZzLWZvcm0tbGFiZWwnO1xuICBASW5wdXQoKSBhcHBlbmRFcnJvckNsYXNzID0gJ2ZzLWZvcm0tZXJyb3InO1xuICBASW5wdXQoKSBhcHBlbmRIaW50Q2xhc3MgPSAnZnMtZm9ybS1oaW50JztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHZhbGlkYXRlTWVzc2FnZXMobWVzc2FnZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgICB0aGlzLl92YWxpZGF0ZU1lc3NhZ2VzID0ge1xuICAgICAgLi4udGhpcy5fdmFsaWRhdGVNZXNzYWdlcyxcbiAgICAgIC4uLm1lc3NhZ2VzLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZXJyb3JzID0gW107XG5cbiAgLy8gcHJvdGVjdGVkIF92YWxpZGF0ZU1lc3NhZ2VzID0geyAuLi5FUlJPUl9NRVNTQUdFUyB9O1xuICBwcm90ZWN0ZWQgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcbiAgcHJvdGVjdGVkIF9jb250cm9sOiBBYnN0cmFjdENvbnRyb2w7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJvdGVjdGVkIHJlbmRlcmVyMjogUmVuZGVyZXIyLFxuICAgIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgQFNlbGYoKSBASW5qZWN0KFZBTElEQVRFX01FU1NBR0VTKSBwcm90ZWN0ZWQgX3ZhbGlkYXRlTWVzc2FnZXMsXG4gICAgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIG5nQ29udHJvbDogTmdDb250cm9sLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRnNGb3JtRGlyZWN0aXZlKSBwcm90ZWN0ZWQgZm9ybURpcmVjdGl2ZTogRnNGb3JtRGlyZWN0aXZlLFxuICApIHtcblxuICAgIGlmIChuZ0NvbnRyb2wpIHtcbiAgICAgIHRoaXMuX2NvbnRyb2wgPSBuZ0NvbnRyb2wuY29udHJvbDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignVGhlIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIG5nTW9kZWwnLCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5fc2V0dXBWYWxpZGF0b3JzKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICBpZiAodGhpcy5fY29udHJvbCkge1xuICAgICAgdGhpcy5fY29udHJvbC5zdGF0dXNDaGFuZ2VzXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHRoaXMucmVuZGVyLmJpbmQodGhpcykpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRNZXNzYWdlU2VsZWN0b3IoKTogc3RyaW5nIHtcblxuICAgIGlmICh0aGlzLm1lc3NhZ2VTZWxlY3RvciA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tZXNzYWdlU2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VTZWxlY3RvcjtcblxuICAgIH0gZWxzZSBpZiAodGhpcy5mb3JtRGlyZWN0aXZlPy5tZXNzYWdlU2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1EaXJlY3RpdmUubWVzc2FnZVNlbGVjdG9yO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRIaW50V3JhcHBlclNlbGVjdG9yKCk6IHN0cmluZyB7XG5cbiAgICBpZiAodGhpcy5oaW50U2VsZWN0b3IgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGludFNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5oaW50U2VsZWN0b3I7XG5cbiAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybURpcmVjdGl2ZT8uaGludFNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtRGlyZWN0aXZlLmhpbnRTZWxlY3RvcjtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0V3JhcHBlclNlbGVjdG9yKCk6IHN0cmluZyB7XG5cbiAgICBpZiAodGhpcy53cmFwcGVyU2VsZWN0b3IgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMud3JhcHBlclNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gdGhpcy53cmFwcGVyU2VsZWN0b3I7XG5cbiAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybURpcmVjdGl2ZT8ud3JhcHBlclNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtRGlyZWN0aXZlLndyYXBwZXJTZWxlY3RvcjtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0bGFiZWxTZWxlY3RvcigpOiBzdHJpbmcge1xuXG4gICAgaWYgKHRoaXMubGFiZWxTZWxlY3RvciA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sYWJlbFNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYWJlbFNlbGVjdG9yO1xuXG4gICAgfSBlbHNlIGlmICh0aGlzLmZvcm1EaXJlY3RpdmU/LmxhYmVsU2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1EaXJlY3RpdmUubGFiZWxTZWxlY3RvcjtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0V3JhcHBlckVsZW1lbnQoKSB7XG5cbiAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5nZXRXcmFwcGVyKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcblxuICAgIGlmICh3cmFwcGVyKSB7XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICAvKlxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm1hdC1mb3JtLWZpZWxkXCI+ICA8LS0gRmllbGQgV3JhcHBlciBDbGFzcy4gTG9vayBmb3IgcGFyZW50cyBmcm9tIHRoZSBuYXRpdmUgZWxlbWVudCB3aXRoIHRoZSBtYXRjaGluZyB3cmFwcGVyU2VsZWN0b3IuIElmIG5vdCBmb3VuZCBkZWZhdWx0cyB0byBuYXRpdmUgZWxlbWVudC5cbiAgICAgIDxpbnB1dD5cbiAgICAgIDxkaXYgY2xhc3M9XCJmcy1mb3JtLW1lc3NhZ2VcIj4gPC0tIE1lc3NhZ2UgU2VsZWN0b3IuIExvb2sgZm9yIHRoZSBlbGVtZW50IHdpdGggY2xhc3MgLmZzLWZvcm0tbWVzc2FnZSBvciBtZXNzYWdlU2VsZWN0b3JcbiAgICAgICAgPGRpdiBjbGFzcz1cImZzLWZvcm0tbWVzc2FnZVwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtZm9ybS1oaW50XCI+PC9kaXY+IDwtLSBIaW50IFNlbGVjdG9yLiBMb29rIGZvciB0aGUgZWxlbWVudCB3aXRoIGNsYXNzIC5mcy1mb3JtLWhpbnQgb3IgaGludFNlbGVjdG9yXG4gICAgICA8L2Rpdj5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAqL1xuXG4gIHByb3RlY3RlZCByZW5kZXIoKSB7XG4gICAgaWYgKCg8YW55PnRoaXMuX2NvbnRyb2wpLnN0YXR1c0NoYW5nZXNTdWJzY3JpYmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAoPGFueT50aGlzLl9jb250cm9sKS5zdGF0dXNDaGFuZ2VzU3Vic2NyaWJlID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuICAgICAgY29uc3QgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyMjtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLmdldFdyYXBwZXJFbGVtZW50KCk7XG4gICAgICBjb25zdCBlcnJvciA9IHRoaXMubmdDb250cm9sLmRpcnR5ID8gdGhpcy5nZXRFcnJvcih0aGlzLm5nQ29udHJvbCkgOiBudWxsO1xuICAgICAgY29uc3Qgc2hvdWxkRXJyb3JCZVJlbmRlcmVkID0gdGhpcy5uZ0NvbnRyb2wuaW52YWxpZFxuICAgICAgICAmJiAodGhpcy5uZ0NvbnRyb2wuZGlydHkgfHwgdGhpcy5mb3JtRGlyZWN0aXZlPy5uZ0Zvcm0/LnN1Ym1pdHRlZCk7XG5cbiAgICAgIGlmIChzaG91bGRFcnJvckJlUmVuZGVyZWQgJiYgZXJyb3IpIHtcbiAgICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCduZy1pbnZhbGlkJywgJ25nLWRpcnR5Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3cmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoJ25nLWludmFsaWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmdldE1lc3NhZ2VTZWxlY3RvcigpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWVzc2FnZVdyYXBwZXIgPSB3cmFwcGVyLnF1ZXJ5U2VsZWN0b3IodGhpcy5nZXRNZXNzYWdlU2VsZWN0b3IoKSk7XG5cbiAgICAgIGlmICghbWVzc2FnZVdyYXBwZXIpIHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGxvY2F0ZSAnICsgdGhpcy5nZXRNZXNzYWdlU2VsZWN0b3IoKSwgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5nZXRsYWJlbFNlbGVjdG9yKCkpIHtcbiAgICAgICAgY29uc3QgbGFiZWxXcmFwcGVyID0gd3JhcHBlci5xdWVyeVNlbGVjdG9yKHRoaXMuZ2V0bGFiZWxTZWxlY3RvcigpKTtcblxuICAgICAgICBpZiAobGFiZWxXcmFwcGVyKSB7XG4gICAgICAgICAgaWYgKHRoaXMuYXBwZW5kTGFiZWxDbGFzcykge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlcjIuYWRkQ2xhc3MobGFiZWxXcmFwcGVyLCB0aGlzLmFwcGVuZExhYmVsQ2xhc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5hcHBlbmRNZXNzYWdlQ2xhc3MpIHtcbiAgICAgICAgcmVuZGVyZXIuYWRkQ2xhc3MobWVzc2FnZVdyYXBwZXIsIHRoaXMuYXBwZW5kTWVzc2FnZUNsYXNzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZ2V0SGludFdyYXBwZXJTZWxlY3RvcigpKSB7XG4gICAgICAgIGNvbnN0IGhpbnQgPSBtZXNzYWdlV3JhcHBlci5xdWVyeVNlbGVjdG9yKHRoaXMuZ2V0SGludFdyYXBwZXJTZWxlY3RvcigpKTtcblxuICAgICAgICBpZiAoaGludCkge1xuICAgICAgICAgIHJlbmRlcmVyLnNldFN0eWxlKGhpbnQsICdkaXNwbGF5JywgZXJyb3IgPyAnbm9uZScgOiAnYmxvY2snKTtcblxuICAgICAgICAgIGlmICh0aGlzLmFwcGVuZEhpbnRDbGFzcykge1xuICAgICAgICAgICAgcmVuZGVyZXIuYWRkQ2xhc3MoaGludCwgdGhpcy5hcHBlbmRIaW50Q2xhc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgZXJyb3JXcmFwcGVyID0gd3JhcHBlci5xdWVyeVNlbGVjdG9yKCcuZnMtZm9ybS1lcnJvci10YXJnZXQnKTtcbiAgICAgIGlmIChlcnJvcldyYXBwZXIpIHtcbiAgICAgICAgZXJyb3JXcmFwcGVyLnJlbW92ZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXNob3VsZEVycm9yQmVSZW5kZXJlZCB8fCAhZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBlcnJvcldyYXBwZXIgPSByZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHJlbmRlcmVyLmFkZENsYXNzKGVycm9yV3JhcHBlciwgJ2ZzLWZvcm0tZXJyb3ItdGFyZ2V0Jyk7XG4gICAgICByZW5kZXJlci5hZGRDbGFzcyhlcnJvcldyYXBwZXIsIHRoaXMuYXBwZW5kRXJyb3JDbGFzcyk7XG4gICAgICByZW5kZXJlci5hZGRDbGFzcyhlcnJvcldyYXBwZXIsIHRoaXMuYXBwZW5kRXJyb3JDbGFzcyArICctJyArIGVycm9yLm5hbWUpO1xuXG4gICAgICBjb25zdCBlcnJvclRleHQgPSByZW5kZXJlci5jcmVhdGVUZXh0KGVycm9yLm1lc3NhZ2UpO1xuXG4gICAgICByZW5kZXJlci5hcHBlbmRDaGlsZChlcnJvcldyYXBwZXIsIGVycm9yVGV4dCk7XG4gICAgICBtZXNzYWdlV3JhcHBlci5hcHBlbmRDaGlsZChlcnJvcldyYXBwZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRXcmFwcGVyKG5vZGUsIGNvdW50ID0gMCkge1xuXG4gICAgaWYgKCFub2RlIHx8IGNvdW50ID4gMTApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChub2RlLnBhcmVudE5vZGUgJiYgbm9kZS5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3IodGhpcy5nZXRXcmFwcGVyU2VsZWN0b3IoKSkpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldFdyYXBwZXIobm9kZS5wYXJlbnROb2RlLCArK2NvdW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZUVycm9yTWVzc2FnZShtZXNzYWdlLCBhcmdzKTogc3RyaW5nIHtcbiAgICB2YWx1ZXMoYXJncylcbiAgICAgIC5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgvXFwkXFwoXFxkXFwpLywgbmFtZSk7XG4gICAgICB9KTtcblxuICAgIHJldHVybiBtZXNzYWdlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEVycm9yKGNvbnRyb2xSZWYpOiB7IG5hbWU6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nIH0ge1xuXG4gICAgY29uc3QgbmFtZSA9IGtleXMoY29udHJvbFJlZi5jb250cm9sLmVycm9ycylbMF07XG5cbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBtZXNzYWdlID0gY29udHJvbFJlZi5jb250cm9sLmVycm9yc1tuYW1lXTtcblxuICAgIGlmICh0aGlzLl92YWxpZGF0ZU1lc3NhZ2VzW25hbWVdKSB7XG4gICAgICBtZXNzYWdlID0gdGhpcy5wYXJzZUVycm9yTWVzc2FnZSh0aGlzLl92YWxpZGF0ZU1lc3NhZ2VzW25hbWVdLCBtZXNzYWdlKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBuYW1lOiBuYW1lLCBtZXNzYWdlOiBtZXNzYWdlIH07XG4gIH1cblxuICBwcml2YXRlIF9zZXR1cFZhbGlkYXRvcnMoKTogdm9pZCB7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuX2NvbnRyb2w7XG5cbiAgICBpZiAodGhpcy52YWxpZGF0ZSkge1xuICAgICAgY29uc3QgdmFsaWRhdG9ycyA9IGNvbnRyb2wudmFsaWRhdG9yXG4gICAgICAgID8gWyBjb250cm9sLnZhbGlkYXRvciwgdGhpcy52YWxpZGF0ZS5iaW5kKHRoaXMpXVxuICAgICAgICA6IHRoaXMudmFsaWRhdGUuYmluZCh0aGlzKTtcblxuICAgICAgY29udHJvbC5zZXRWYWxpZGF0b3JzKHZhbGlkYXRvcnMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnZhbGlkYXRlQXN5bmMpIHtcbiAgICAgIGNvbnN0IGFzeW5jVmFsaWRhdG9ycyA9IGNvbnRyb2wuYXN5bmNWYWxpZGF0b3JcbiAgICAgICAgPyBbIGNvbnRyb2wuYXN5bmNWYWxpZGF0b3IsIHRoaXMudmFsaWRhdGVBc3luYy5iaW5kKHRoaXMpXVxuICAgICAgICA6IHRoaXMudmFsaWRhdGVBc3luYy5iaW5kKHRoaXMpO1xuXG4gICAgICBjb250cm9sLnNldEFzeW5jVmFsaWRhdG9ycyhhc3luY1ZhbGlkYXRvcnMpO1xuICAgIH1cblxuICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICB9XG5cbn1cbiJdfQ==
1
+ import { Input, ElementRef, Renderer2, Directive, Injector, Optional, Inject, Self, } from '@angular/core';
2
+ import { NgControl } from '@angular/forms';
3
+ import { Subject } from 'rxjs';
4
+ import { takeUntil } from 'rxjs/operators';
5
+ import { values, keys } from 'lodash-es';
6
+ import { FsFormDirective } from '../form/form.directive';
7
+ import { VALIDATE_MESSAGE_PROVIDER, VALIDATE_MESSAGES } from '../../providers/validate-messages.provider';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/forms";
10
+ import * as i2 from "../form/form.directive";
11
+ export class FsControlDirective {
12
+ constructor(elementRef, renderer2, injector, _validateMessages, ngControl, formDirective) {
13
+ this.elementRef = elementRef;
14
+ this.renderer2 = renderer2;
15
+ this.injector = injector;
16
+ this._validateMessages = _validateMessages;
17
+ this.ngControl = ngControl;
18
+ this.formDirective = formDirective;
19
+ this.appendMessageClass = 'fs-form-message';
20
+ this.appendLabelClass = 'fs-form-label';
21
+ this.appendErrorClass = 'fs-form-error';
22
+ this.appendHintClass = 'fs-form-hint';
23
+ this.errors = [];
24
+ // protected _validateMessages = { ...ERROR_MESSAGES };
25
+ this._destroy$ = new Subject();
26
+ if (ngControl) {
27
+ this._control = ngControl.control;
28
+ }
29
+ else {
30
+ console.error('The element does not have a valid ngModel', this.elementRef.nativeElement);
31
+ }
32
+ }
33
+ set validateMessages(messages) {
34
+ this._validateMessages = Object.assign(Object.assign({}, this._validateMessages), messages);
35
+ }
36
+ ngOnInit() {
37
+ this._setupValidators();
38
+ }
39
+ ngOnDestroy() {
40
+ this._destroy$.next();
41
+ this._destroy$.complete();
42
+ }
43
+ ngAfterContentInit() {
44
+ if (this._control) {
45
+ /*
46
+ Ensure that statusChanges has one subscription per control. Multiple can happen
47
+ when multiple fsForm validation directives are applied to the same element
48
+ */
49
+ if (!this._control.statusChangesSubscribe) {
50
+ this._control.statusChanges
51
+ .pipe(takeUntil(this._destroy$))
52
+ .subscribe(this.render.bind(this));
53
+ this._control.statusChangesSubscribe = true;
54
+ }
55
+ }
56
+ }
57
+ getMessageSelector() {
58
+ var _a;
59
+ if (this.messageSelector === false) {
60
+ return '';
61
+ }
62
+ if (this.messageSelector) {
63
+ return this.messageSelector;
64
+ }
65
+ else if ((_a = this.formDirective) === null || _a === void 0 ? void 0 : _a.messageSelector) {
66
+ return this.formDirective.messageSelector;
67
+ }
68
+ }
69
+ getHintWrapperSelector() {
70
+ var _a;
71
+ if (this.hintSelector === false) {
72
+ return '';
73
+ }
74
+ if (this.hintSelector) {
75
+ return this.hintSelector;
76
+ }
77
+ else if ((_a = this.formDirective) === null || _a === void 0 ? void 0 : _a.hintSelector) {
78
+ return this.formDirective.hintSelector;
79
+ }
80
+ }
81
+ getWrapperSelector() {
82
+ var _a;
83
+ if (this.wrapperSelector === false) {
84
+ return '';
85
+ }
86
+ if (this.wrapperSelector) {
87
+ return this.wrapperSelector;
88
+ }
89
+ else if ((_a = this.formDirective) === null || _a === void 0 ? void 0 : _a.wrapperSelector) {
90
+ return this.formDirective.wrapperSelector;
91
+ }
92
+ }
93
+ getlabelSelector() {
94
+ var _a;
95
+ if (this.labelSelector === false) {
96
+ return '';
97
+ }
98
+ if (this.labelSelector) {
99
+ return this.labelSelector;
100
+ }
101
+ else if ((_a = this.formDirective) === null || _a === void 0 ? void 0 : _a.labelSelector) {
102
+ return this.formDirective.labelSelector;
103
+ }
104
+ }
105
+ getWrapperElement() {
106
+ const wrapper = this.getWrapper(this.elementRef.nativeElement);
107
+ if (wrapper) {
108
+ return wrapper;
109
+ }
110
+ return this.elementRef.nativeElement;
111
+ }
112
+ /*
113
+ <mat-form-field class="mat-form-field"> <-- Field Wrapper Class. Look for parents from the native element with the matching wrapperSelector. If not found defaults to native element.
114
+ <input>
115
+ <div class="fs-form-message"> <-- Message Selector. Look for the element with class .fs-form-message or messageSelector
116
+ <div class="fs-form-message"></div>
117
+ <div class="fs-form-hint"></div> <-- Hint Selector. Look for the element with class .fs-form-hint or hintSelector
118
+ </div>
119
+ </mat-form-field>
120
+ */
121
+ render() {
122
+ var _a, _b;
123
+ if (this.ngControl) {
124
+ const renderer = this.renderer2;
125
+ const wrapper = this.getWrapperElement();
126
+ const error = this.ngControl.dirty ? this.getError(this.ngControl) : null;
127
+ const shouldErrorBeRendered = this.ngControl.invalid
128
+ && (this.ngControl.dirty || ((_b = (_a = this.formDirective) === null || _a === void 0 ? void 0 : _a.ngForm) === null || _b === void 0 ? void 0 : _b.submitted));
129
+ if (shouldErrorBeRendered && error) {
130
+ wrapper.classList.add('ng-invalid', 'ng-dirty');
131
+ }
132
+ else {
133
+ wrapper.classList.remove('ng-invalid');
134
+ }
135
+ if (!this.getMessageSelector()) {
136
+ return;
137
+ }
138
+ const messageWrapper = wrapper.querySelector(this.getMessageSelector());
139
+ if (!messageWrapper) {
140
+ return console.warn('Failed to locate ' + this.getMessageSelector(), this.elementRef.nativeElement);
141
+ }
142
+ if (this.getlabelSelector()) {
143
+ const labelWrapper = wrapper.querySelector(this.getlabelSelector());
144
+ if (labelWrapper) {
145
+ if (this.appendLabelClass) {
146
+ this.renderer2.addClass(labelWrapper, this.appendLabelClass);
147
+ }
148
+ }
149
+ }
150
+ if (this.appendMessageClass) {
151
+ renderer.addClass(messageWrapper, this.appendMessageClass);
152
+ }
153
+ if (this.getHintWrapperSelector()) {
154
+ const hint = messageWrapper.querySelector(this.getHintWrapperSelector());
155
+ if (hint) {
156
+ renderer.setStyle(hint, 'display', error ? 'none' : 'block');
157
+ if (this.appendHintClass) {
158
+ renderer.addClass(hint, this.appendHintClass);
159
+ }
160
+ }
161
+ }
162
+ let errorWrapper = wrapper.querySelector('.fs-form-error-target');
163
+ if (errorWrapper) {
164
+ errorWrapper.remove();
165
+ }
166
+ if (!shouldErrorBeRendered || !error) {
167
+ return;
168
+ }
169
+ errorWrapper = renderer.createElement('div');
170
+ renderer.addClass(errorWrapper, 'fs-form-error-target');
171
+ renderer.addClass(errorWrapper, this.appendErrorClass);
172
+ renderer.addClass(errorWrapper, this.appendErrorClass + '-' + error.name);
173
+ const errorText = renderer.createText(error.message);
174
+ renderer.appendChild(errorWrapper, errorText);
175
+ messageWrapper.appendChild(errorWrapper);
176
+ }
177
+ }
178
+ getWrapper(node, count = 0) {
179
+ if (!node || count > 10) {
180
+ return null;
181
+ }
182
+ if (node.parentNode && node.parentNode.querySelector(this.getWrapperSelector())) {
183
+ return node;
184
+ }
185
+ return this.getWrapper(node.parentNode, ++count);
186
+ }
187
+ parseErrorMessage(message, args) {
188
+ values(args)
189
+ .forEach((name) => {
190
+ message = message.replace(/\$\(\d\)/, name);
191
+ });
192
+ return message;
193
+ }
194
+ getError(controlRef) {
195
+ const name = keys(controlRef.control.errors)[0];
196
+ if (!name) {
197
+ return null;
198
+ }
199
+ let message = controlRef.control.errors[name];
200
+ if (this._validateMessages[name]) {
201
+ message = this.parseErrorMessage(this._validateMessages[name], message);
202
+ }
203
+ return { name: name, message: message };
204
+ }
205
+ _setupValidators() {
206
+ const control = this._control;
207
+ if (this.validate) {
208
+ const validators = control.validator
209
+ ? [control.validator, this.validate.bind(this)]
210
+ : this.validate.bind(this);
211
+ control.setValidators(validators);
212
+ }
213
+ if (this.validateAsync) {
214
+ const asyncValidators = control.asyncValidator
215
+ ? [control.asyncValidator, this.validateAsync.bind(this)]
216
+ : this.validateAsync.bind(this);
217
+ control.setAsyncValidators(asyncValidators);
218
+ }
219
+ control.updateValueAndValidity();
220
+ }
221
+ }
222
+ FsControlDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsControlDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.Injector }, { token: VALIDATE_MESSAGES, self: true }, { token: i1.NgControl, optional: true }, { token: FsFormDirective, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
223
+ FsControlDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.16", type: FsControlDirective, selector: "[fsFormControl]", inputs: { wrapperSelector: "wrapperSelector", messageSelector: "messageSelector", hintSelector: "hintSelector", labelSelector: "labelSelector", appendMessageClass: "appendMessageClass", appendLabelClass: "appendLabelClass", appendErrorClass: "appendErrorClass", appendHintClass: "appendHintClass", validateMessages: "validateMessages" }, providers: [
224
+ VALIDATE_MESSAGE_PROVIDER
225
+ ], ngImport: i0 });
226
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsControlDirective, decorators: [{
227
+ type: Directive,
228
+ args: [{
229
+ selector: '[fsFormControl]',
230
+ providers: [
231
+ VALIDATE_MESSAGE_PROVIDER
232
+ ],
233
+ }]
234
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.Injector }, { type: undefined, decorators: [{
235
+ type: Self
236
+ }, {
237
+ type: Inject,
238
+ args: [VALIDATE_MESSAGES]
239
+ }] }, { type: i1.NgControl, decorators: [{
240
+ type: Optional
241
+ }] }, { type: i2.FsFormDirective, decorators: [{
242
+ type: Optional
243
+ }, {
244
+ type: Inject,
245
+ args: [FsFormDirective]
246
+ }] }]; }, propDecorators: { wrapperSelector: [{
247
+ type: Input
248
+ }], messageSelector: [{
249
+ type: Input
250
+ }], hintSelector: [{
251
+ type: Input
252
+ }], labelSelector: [{
253
+ type: Input
254
+ }], appendMessageClass: [{
255
+ type: Input
256
+ }], appendLabelClass: [{
257
+ type: Input
258
+ }], appendErrorClass: [{
259
+ type: Input
260
+ }], appendHintClass: [{
261
+ type: Input
262
+ }], validateMessages: [{
263
+ type: Input
264
+ }] } });
265
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2RpcmVjdGl2ZXMvdmFsaWRhdG9ycy9jb250cm9sLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsS0FBSyxFQUNMLFVBQVUsRUFDVixTQUFTLEVBQ1QsU0FBUyxFQUNULFFBQVEsRUFDUixRQUFRLEVBQ1IsTUFBTSxFQUNOLElBQUksR0FJTCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFxQyxNQUFNLGdCQUFnQixDQUFDO0FBRTlFLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXpDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLGlCQUFpQixFQUNsQixNQUFNLDRDQUE0QyxDQUFDOzs7O0FBZXBELE1BQU0sT0FBTyxrQkFBa0I7SUF5QjdCLFlBQ1ksVUFBc0IsRUFDdEIsU0FBb0IsRUFDcEIsUUFBa0IsRUFDaUIsaUJBQWlCLEVBQ3hDLFNBQW9CLEVBQ0ssYUFBOEI7UUFMbkUsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDaUIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFBO1FBQ3hDLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDSyxrQkFBYSxHQUFiLGFBQWEsQ0FBaUI7UUF6QnRFLHVCQUFrQixHQUFHLGlCQUFpQixDQUFDO1FBQ3ZDLHFCQUFnQixHQUFHLGVBQWUsQ0FBQztRQUNuQyxxQkFBZ0IsR0FBRyxlQUFl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ICBJbnB1dCxcbiAgRWxlbWVudFJlZixcbiAgUmVuZGVyZXIyLFxuICBEaXJlY3RpdmUsXG4gIEluamVjdG9yLFxuICBPcHRpb25hbCxcbiAgSW5qZWN0LFxuICBTZWxmLFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ0NvbnRyb2wsIEFic3RyYWN0Q29udHJvbCwgVmFsaWRhdGlvbkVycm9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyB2YWx1ZXMsIGtleXMgfSBmcm9tICdsb2Rhc2gtZXMnO1xuXG5pbXBvcnQgeyBGc0Zvcm1EaXJlY3RpdmUgfSBmcm9tICcuLi9mb3JtL2Zvcm0uZGlyZWN0aXZlJztcbmltcG9ydCB7XG4gIFZBTElEQVRFX01FU1NBR0VfUFJPVklERVIsXG4gIFZBTElEQVRFX01FU1NBR0VTXG59IGZyb20gJy4uLy4uL3Byb3ZpZGVycy92YWxpZGF0ZS1tZXNzYWdlcy5wcm92aWRlcic7XG5cblxuZXhwb3J0IGludGVyZmFjZSBGc0NvbnRyb2xEaXJlY3RpdmUge1xuICB2YWxpZGF0ZT8oY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGw7XG4gIHZhbGlkYXRlQXN5bmM/KGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFByb21pc2U8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+IHwgT2JzZXJ2YWJsZTxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD47XG59XG5cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2ZzRm9ybUNvbnRyb2xdJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAgVkFMSURBVEVfTUVTU0FHRV9QUk9WSURFUlxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBGc0NvbnRyb2xEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG5cbiAgQElucHV0KCkgd3JhcHBlclNlbGVjdG9yOiBzdHJpbmcgfCBmYWxzZTtcbiAgQElucHV0KCkgbWVzc2FnZVNlbGVjdG9yOiBzdHJpbmcgfCBmYWxzZTtcbiAgQElucHV0KCkgaGludFNlbGVjdG9yOiBzdHJpbmcgfCBmYWxzZTtcbiAgQElucHV0KCkgbGFiZWxTZWxlY3Rvcjogc3RyaW5nIHwgZmFsc2U7XG4gIEBJbnB1dCgpIGFwcGVuZE1lc3NhZ2VDbGFzcyA9ICdmcy1mb3JtLW1lc3NhZ2UnO1xuICBASW5wdXQoKSBhcHBlbmRMYWJlbENsYXNzID0gJ2ZzLWZvcm0tbGFiZWwnO1xuICBASW5wdXQoKSBhcHBlbmRFcnJvckNsYXNzID0gJ2ZzLWZvcm0tZXJyb3InO1xuICBASW5wdXQoKSBhcHBlbmRIaW50Q2xhc3MgPSAnZnMtZm9ybS1oaW50JztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHZhbGlkYXRlTWVzc2FnZXMobWVzc2FnZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgICB0aGlzLl92YWxpZGF0ZU1lc3NhZ2VzID0ge1xuICAgICAgLi4udGhpcy5fdmFsaWRhdGVNZXNzYWdlcyxcbiAgICAgIC4uLm1lc3NhZ2VzLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZXJyb3JzID0gW107XG5cbiAgLy8gcHJvdGVjdGVkIF92YWxpZGF0ZU1lc3NhZ2VzID0geyAuLi5FUlJPUl9NRVNTQUdFUyB9O1xuICBwcm90ZWN0ZWQgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcbiAgcHJvdGVjdGVkIF9jb250cm9sOiBBYnN0cmFjdENvbnRyb2w7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJvdGVjdGVkIHJlbmRlcmVyMjogUmVuZGVyZXIyLFxuICAgIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgQFNlbGYoKSBASW5qZWN0KFZBTElEQVRFX01FU1NBR0VTKSBwcm90ZWN0ZWQgX3ZhbGlkYXRlTWVzc2FnZXMsXG4gICAgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIG5nQ29udHJvbDogTmdDb250cm9sLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRnNGb3JtRGlyZWN0aXZlKSBwcm90ZWN0ZWQgZm9ybURpcmVjdGl2ZTogRnNGb3JtRGlyZWN0aXZlLFxuICApIHtcblxuICAgIGlmIChuZ0NvbnRyb2wpIHtcbiAgICAgIHRoaXMuX2NvbnRyb2wgPSBuZ0NvbnRyb2wuY29udHJvbDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignVGhlIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIG5nTW9kZWwnLCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5fc2V0dXBWYWxpZGF0b3JzKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICBpZiAodGhpcy5fY29udHJvbCkge1xuXG4gICAgICAvKlxuICAgICAgICBFbnN1cmUgdGhhdCBzdGF0dXNDaGFuZ2VzIGhhcyBvbmUgc3Vic2NyaXB0aW9uIHBlciBjb250cm9sLiBNdWx0aXBsZSBjYW4gaGFwcGVuXG4gICAgICAgIHdoZW4gbXVsdGlwbGUgZnNGb3JtIHZhbGlkYXRpb24gZGlyZWN0aXZlcyBhcmUgYXBwbGllZCB0byB0aGUgc2FtZSBlbGVtZW50XG4gICAgICAqL1xuICAgICAgaWYgKCEoPGFueT50aGlzLl9jb250cm9sKS5zdGF0dXNDaGFuZ2VzU3Vic2NyaWJlKSB7XG5cbiAgICAgICAgdGhpcy5fY29udHJvbC5zdGF0dXNDaGFuZ2VzXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUodGhpcy5yZW5kZXIuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgKDxhbnk+dGhpcy5fY29udHJvbCkuc3RhdHVzQ2hhbmdlc1N1YnNjcmliZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldE1lc3NhZ2VTZWxlY3RvcigpOiBzdHJpbmcge1xuXG4gICAgaWYgKHRoaXMubWVzc2FnZVNlbGVjdG9yID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1lc3NhZ2VTZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZVNlbGVjdG9yO1xuXG4gICAgfSBlbHNlIGlmICh0aGlzLmZvcm1EaXJlY3RpdmU/Lm1lc3NhZ2VTZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybURpcmVjdGl2ZS5tZXNzYWdlU2VsZWN0b3I7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldEhpbnRXcmFwcGVyU2VsZWN0b3IoKTogc3RyaW5nIHtcblxuICAgIGlmICh0aGlzLmhpbnRTZWxlY3RvciA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oaW50U2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiB0aGlzLmhpbnRTZWxlY3RvcjtcblxuICAgIH0gZWxzZSBpZiAodGhpcy5mb3JtRGlyZWN0aXZlPy5oaW50U2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1EaXJlY3RpdmUuaGludFNlbGVjdG9yO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRXcmFwcGVyU2VsZWN0b3IoKTogc3RyaW5nIHtcblxuICAgIGlmICh0aGlzLndyYXBwZXJTZWxlY3RvciA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBpZiAodGhpcy53cmFwcGVyU2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiB0aGlzLndyYXBwZXJTZWxlY3RvcjtcblxuICAgIH0gZWxzZSBpZiAodGhpcy5mb3JtRGlyZWN0aXZlPy53cmFwcGVyU2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1EaXJlY3RpdmUud3JhcHBlclNlbGVjdG9yO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRsYWJlbFNlbGVjdG9yKCk6IHN0cmluZyB7XG5cbiAgICBpZiAodGhpcy5sYWJlbFNlbGVjdG9yID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxhYmVsU2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhYmVsU2VsZWN0b3I7XG5cbiAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybURpcmVjdGl2ZT8ubGFiZWxTZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybURpcmVjdGl2ZS5sYWJlbFNlbGVjdG9yO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRXcmFwcGVyRWxlbWVudCgpIHtcblxuICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLmdldFdyYXBwZXIodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuXG4gICAgaWYgKHdyYXBwZXIpIHtcbiAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIC8qXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibWF0LWZvcm0tZmllbGRcIj4gIDwtLSBGaWVsZCBXcmFwcGVyIENsYXNzLiBMb29rIGZvciBwYXJlbnRzIGZyb20gdGhlIG5hdGl2ZSBlbGVtZW50IHdpdGggdGhlIG1hdGNoaW5nIHdyYXBwZXJTZWxlY3Rvci4gSWYgbm90IGZvdW5kIGRlZmF1bHRzIHRvIG5hdGl2ZSBlbGVtZW50LlxuICAgICAgPGlucHV0PlxuICAgICAgPGRpdiBjbGFzcz1cImZzLWZvcm0tbWVzc2FnZVwiPiA8LS0gTWVzc2FnZSBTZWxlY3Rvci4gTG9vayBmb3IgdGhlIGVsZW1lbnQgd2l0aCBjbGFzcyAuZnMtZm9ybS1tZXNzYWdlIG9yIG1lc3NhZ2VTZWxlY3RvclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtZm9ybS1tZXNzYWdlXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1mb3JtLWhpbnRcIj48L2Rpdj4gPC0tIEhpbnQgU2VsZWN0b3IuIExvb2sgZm9yIHRoZSBlbGVtZW50IHdpdGggY2xhc3MgLmZzLWZvcm0taGludCBvciBoaW50U2VsZWN0b3JcbiAgICAgIDwvZGl2PlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICovXG5cbiAgcHJvdGVjdGVkIHJlbmRlcigpIHtcbiAgICBpZiAodGhpcy5uZ0NvbnRyb2wpIHtcbiAgICAgIGNvbnN0IHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcjI7XG4gICAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5nZXRXcmFwcGVyRWxlbWVudCgpO1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLm5nQ29udHJvbC5kaXJ0eSA/IHRoaXMuZ2V0RXJyb3IodGhpcy5uZ0NvbnRyb2wpIDogbnVsbDtcbiAgICAgIGNvbnN0IHNob3VsZEVycm9yQmVSZW5kZXJlZCA9IHRoaXMubmdDb250cm9sLmludmFsaWRcbiAgICAgICAgJiYgKHRoaXMubmdDb250cm9sLmRpcnR5IHx8IHRoaXMuZm9ybURpcmVjdGl2ZT8ubmdGb3JtPy5zdWJtaXR0ZWQpO1xuXG4gICAgICBpZiAoc2hvdWxkRXJyb3JCZVJlbmRlcmVkICYmIGVycm9yKSB7XG4gICAgICAgIHdyYXBwZXIuY2xhc3NMaXN0LmFkZCgnbmctaW52YWxpZCcsICduZy1kaXJ0eScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCduZy1pbnZhbGlkJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5nZXRNZXNzYWdlU2VsZWN0b3IoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2VXcmFwcGVyID0gd3JhcHBlci5xdWVyeVNlbGVjdG9yKHRoaXMuZ2V0TWVzc2FnZVNlbGVjdG9yKCkpO1xuXG4gICAgICBpZiAoIW1lc3NhZ2VXcmFwcGVyKSB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBsb2NhdGUgJyArIHRoaXMuZ2V0TWVzc2FnZVNlbGVjdG9yKCksIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZ2V0bGFiZWxTZWxlY3RvcigpKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsV3JhcHBlciA9IHdyYXBwZXIucXVlcnlTZWxlY3Rvcih0aGlzLmdldGxhYmVsU2VsZWN0b3IoKSk7XG5cbiAgICAgICAgaWYgKGxhYmVsV3JhcHBlcikge1xuICAgICAgICAgIGlmICh0aGlzLmFwcGVuZExhYmVsQ2xhc3MpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIyLmFkZENsYXNzKGxhYmVsV3JhcHBlciwgdGhpcy5hcHBlbmRMYWJlbENsYXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuYXBwZW5kTWVzc2FnZUNsYXNzKSB7XG4gICAgICAgIHJlbmRlcmVyLmFkZENsYXNzKG1lc3NhZ2VXcmFwcGVyLCB0aGlzLmFwcGVuZE1lc3NhZ2VDbGFzcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmdldEhpbnRXcmFwcGVyU2VsZWN0b3IoKSkge1xuICAgICAgICBjb25zdCBoaW50ID0gbWVzc2FnZVdyYXBwZXIucXVlcnlTZWxlY3Rvcih0aGlzLmdldEhpbnRXcmFwcGVyU2VsZWN0b3IoKSk7XG5cbiAgICAgICAgaWYgKGhpbnQpIHtcbiAgICAgICAgICByZW5kZXJlci5zZXRTdHlsZShoaW50LCAnZGlzcGxheScsIGVycm9yID8gJ25vbmUnIDogJ2Jsb2NrJyk7XG5cbiAgICAgICAgICBpZiAodGhpcy5hcHBlbmRIaW50Q2xhc3MpIHtcbiAgICAgICAgICAgIHJlbmRlcmVyLmFkZENsYXNzKGhpbnQsIHRoaXMuYXBwZW5kSGludENsYXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IGVycm9yV3JhcHBlciA9IHdyYXBwZXIucXVlcnlTZWxlY3RvcignLmZzLWZvcm0tZXJyb3ItdGFyZ2V0Jyk7XG4gICAgICBpZiAoZXJyb3JXcmFwcGVyKSB7XG4gICAgICAgIGVycm9yV3JhcHBlci5yZW1vdmUoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzaG91bGRFcnJvckJlUmVuZGVyZWQgfHwgIWVycm9yKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZXJyb3JXcmFwcGVyID0gcmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICByZW5kZXJlci5hZGRDbGFzcyhlcnJvcldyYXBwZXIsICdmcy1mb3JtLWVycm9yLXRhcmdldCcpO1xuICAgICAgcmVuZGVyZXIuYWRkQ2xhc3MoZXJyb3JXcmFwcGVyLCB0aGlzLmFwcGVuZEVycm9yQ2xhc3MpO1xuICAgICAgcmVuZGVyZXIuYWRkQ2xhc3MoZXJyb3JXcmFwcGVyLCB0aGlzLmFwcGVuZEVycm9yQ2xhc3MgKyAnLScgKyBlcnJvci5uYW1lKTtcblxuICAgICAgY29uc3QgZXJyb3JUZXh0ID0gcmVuZGVyZXIuY3JlYXRlVGV4dChlcnJvci5tZXNzYWdlKTtcblxuICAgICAgcmVuZGVyZXIuYXBwZW5kQ2hpbGQoZXJyb3JXcmFwcGVyLCBlcnJvclRleHQpO1xuICAgICAgbWVzc2FnZVdyYXBwZXIuYXBwZW5kQ2hpbGQoZXJyb3JXcmFwcGVyKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0V3JhcHBlcihub2RlLCBjb3VudCA9IDApIHtcblxuICAgIGlmICghbm9kZSB8fCBjb3VudCA+IDEwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5wYXJlbnROb2RlICYmIG5vZGUucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yKHRoaXMuZ2V0V3JhcHBlclNlbGVjdG9yKCkpKSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRXcmFwcGVyKG5vZGUucGFyZW50Tm9kZSwgKytjb3VudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VFcnJvck1lc3NhZ2UobWVzc2FnZSwgYXJncyk6IHN0cmluZyB7XG4gICAgdmFsdWVzKGFyZ3MpXG4gICAgICAuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoL1xcJFxcKFxcZFxcKS8sIG5hbWUpO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRFcnJvcihjb250cm9sUmVmKTogeyBuYW1lOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyB9IHtcblxuICAgIGNvbnN0IG5hbWUgPSBrZXlzKGNvbnRyb2xSZWYuY29udHJvbC5lcnJvcnMpWzBdO1xuXG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgbWVzc2FnZSA9IGNvbnRyb2xSZWYuY29udHJvbC5lcnJvcnNbbmFtZV07XG5cbiAgICBpZiAodGhpcy5fdmFsaWRhdGVNZXNzYWdlc1tuYW1lXSkge1xuICAgICAgbWVzc2FnZSA9IHRoaXMucGFyc2VFcnJvck1lc3NhZ2UodGhpcy5fdmFsaWRhdGVNZXNzYWdlc1tuYW1lXSwgbWVzc2FnZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgbmFtZTogbmFtZSwgbWVzc2FnZTogbWVzc2FnZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0dXBWYWxpZGF0b3JzKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLl9jb250cm9sO1xuXG4gICAgaWYgKHRoaXMudmFsaWRhdGUpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBjb250cm9sLnZhbGlkYXRvclxuICAgICAgICA/IFsgY29udHJvbC52YWxpZGF0b3IsIHRoaXMudmFsaWRhdGUuYmluZCh0aGlzKV1cbiAgICAgICAgOiB0aGlzLnZhbGlkYXRlLmJpbmQodGhpcyk7XG5cbiAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy52YWxpZGF0ZUFzeW5jKSB7XG4gICAgICBjb25zdCBhc3luY1ZhbGlkYXRvcnMgPSBjb250cm9sLmFzeW5jVmFsaWRhdG9yXG4gICAgICAgID8gWyBjb250cm9sLmFzeW5jVmFsaWRhdG9yLCB0aGlzLnZhbGlkYXRlQXN5bmMuYmluZCh0aGlzKV1cbiAgICAgICAgOiB0aGlzLnZhbGlkYXRlQXN5bmMuYmluZCh0aGlzKTtcblxuICAgICAgY29udHJvbC5zZXRBc3luY1ZhbGlkYXRvcnMoYXN5bmNWYWxpZGF0b3JzKTtcbiAgICB9XG5cbiAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgfVxuXG59XG4iXX0=