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