@firestitch/form 12.2.5 → 12.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/components/form-dialog-actions/form-dialog-actions.component.d.ts +22 -22
- package/app/consts/error-messages.const.d.ts +19 -19
- package/app/directives/button.directive.d.ts +19 -0
- package/app/directives/form/form.directive.d.ts +113 -108
- package/app/directives/form-dialog-close.directive.d.ts +12 -12
- package/app/directives/index.d.ts +1 -0
- package/app/directives/submit-button.directive.d.ts +31 -31
- package/app/directives/validators/compare.directive.d.ts +15 -15
- package/app/directives/validators/control.directive.d.ts +48 -48
- package/app/directives/validators/daterange.directive.d.ts +13 -13
- package/app/directives/validators/email.directive.d.ts +13 -13
- package/app/directives/validators/emails.directive.d.ts +13 -13
- package/app/directives/validators/function.directive.d.ts +14 -14
- package/app/directives/validators/greater.directive.d.ts +13 -13
- package/app/directives/validators/integer.directive.d.ts +13 -13
- package/app/directives/validators/lesser.directive.d.ts +13 -13
- package/app/directives/validators/max.directive.d.ts +13 -13
- package/app/directives/validators/maxlength.directive.d.ts +13 -13
- package/app/directives/validators/min.directive.d.ts +13 -13
- package/app/directives/validators/minlength.directive.d.ts +13 -13
- package/app/directives/validators/no-fs-validators.directive.d.ts +13 -13
- package/app/directives/validators/numeric.directive.d.ts +13 -13
- package/app/directives/validators/pattern.directive.d.ts +13 -13
- package/app/directives/validators/phone.directive.d.ts +13 -13
- package/app/directives/validators/required.directive.d.ts +16 -16
- package/app/directives/validators/url.directive.d.ts +14 -14
- package/app/directives/validators/validate.directive.d.ts +14 -14
- package/app/enums/confirm-result.d.ts +7 -7
- package/app/enums/form-status.d.ts +9 -9
- package/app/fs-form.module.d.ts +37 -36
- package/app/guards/form-deactivate.guard.d.ts +12 -12
- package/app/helpers/confirm-result-continue.d.ts +1 -1
- package/app/helpers/confirm-unsaved.d.ts +5 -5
- package/app/helpers/get-form-errors.d.ts +2 -2
- package/app/helpers/index.d.ts +2 -2
- package/app/helpers/is-enabled.d.ts +1 -1
- package/app/interfaces/async-validator.d.ts +14 -14
- package/app/interfaces/confirm-config.d.ts +7 -7
- package/app/interfaces/confirm-tab-group.d.ts +10 -10
- package/app/interfaces/form-deactivate.d.ts +4 -4
- package/app/interfaces/index.d.ts +4 -4
- package/app/interfaces/submit-event.d.ts +5 -5
- package/app/interfaces/submitted-event.d.ts +6 -6
- package/app/interfaces/validator.d.ts +13 -13
- package/app/providers/validate-messages.provider.d.ts +25 -25
- package/app/services/fsform.service.d.ts +10 -10
- package/app/validators/validators.d.ts +12 -12
- package/bundles/firestitch-form.umd.js +2755 -2676
- package/bundles/firestitch-form.umd.js.map +1 -1
- package/esm2015/app/components/form-dialog-actions/form-dialog-actions.component.js +90 -89
- package/esm2015/app/consts/error-messages.const.js +19 -19
- package/esm2015/app/directives/button.directive.js +60 -0
- package/esm2015/app/directives/form/form.directive.js +643 -622
- package/esm2015/app/directives/form-dialog-close.directive.js +30 -30
- package/esm2015/app/directives/index.js +2 -0
- package/esm2015/app/directives/submit-button.directive.js +131 -131
- package/esm2015/app/directives/validators/compare.directive.js +48 -48
- package/esm2015/app/directives/validators/control.directive.js +256 -256
- package/esm2015/app/directives/validators/daterange.directive.js +40 -40
- package/esm2015/app/directives/validators/email.directive.js +40 -40
- package/esm2015/app/directives/validators/emails.directive.js +40 -40
- package/esm2015/app/directives/validators/function.directive.js +30 -30
- package/esm2015/app/directives/validators/greater.directive.js +39 -39
- package/esm2015/app/directives/validators/integer.directive.js +40 -40
- package/esm2015/app/directives/validators/lesser.directive.js +39 -39
- package/esm2015/app/directives/validators/max.directive.js +35 -35
- package/esm2015/app/directives/validators/maxlength.directive.js +34 -34
- package/esm2015/app/directives/validators/min.directive.js +35 -35
- package/esm2015/app/directives/validators/minlength.directive.js +34 -34
- package/esm2015/app/directives/validators/no-fs-validators.directive.js +46 -46
- package/esm2015/app/directives/validators/numeric.directive.js +40 -40
- package/esm2015/app/directives/validators/pattern.directive.js +34 -34
- package/esm2015/app/directives/validators/phone.directive.js +40 -40
- package/esm2015/app/directives/validators/required.directive.js +70 -70
- package/esm2015/app/directives/validators/url.directive.js +46 -46
- package/esm2015/app/directives/validators/validate.directive.js +32 -32
- package/esm2015/app/enums/confirm-result.js +8 -8
- package/esm2015/app/enums/form-status.js +10 -10
- package/esm2015/app/fs-form.module.js +181 -176
- package/esm2015/app/guards/form-deactivate.guard.js +39 -39
- package/esm2015/app/helpers/confirm-result-continue.js +4 -4
- package/esm2015/app/helpers/confirm-unsaved.js +69 -69
- package/esm2015/app/helpers/get-form-errors.js +24 -24
- package/esm2015/app/helpers/index.js +2 -2
- package/esm2015/app/helpers/is-enabled.js +3 -3
- package/esm2015/app/interfaces/async-validator.js +1 -1
- package/esm2015/app/interfaces/confirm-config.js +1 -1
- package/esm2015/app/interfaces/confirm-tab-group.js +1 -1
- package/esm2015/app/interfaces/form-deactivate.js +1 -1
- package/esm2015/app/interfaces/index.js +4 -4
- package/esm2015/app/interfaces/submit-event.js +1 -1
- package/esm2015/app/interfaces/submitted-event.js +1 -1
- package/esm2015/app/interfaces/validator.js +1 -1
- package/esm2015/app/providers/validate-messages.provider.js +10 -10
- package/esm2015/app/services/fsform.service.js +24 -24
- package/esm2015/app/validators/validators.js +96 -96
- package/esm2015/firestitch-form.js +4 -4
- package/esm2015/public_api.js +37 -36
- package/fesm2015/firestitch-form.js +2198 -2120
- package/fesm2015/firestitch-form.js.map +1 -1
- package/firestitch-form.d.ts +5 -5
- package/package.json +1 -1
- package/public_api.d.ts +35 -34
- package/styles.scss +1 -1
|
@@ -1,257 +1,257 @@
|
|
|
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
|
-
if (this.messageSelector === false) {
|
|
59
|
-
return '';
|
|
60
|
-
}
|
|
61
|
-
if (this.messageSelector) {
|
|
62
|
-
return this.messageSelector;
|
|
63
|
-
}
|
|
64
|
-
else if (this.formDirective && this.formDirective.messageSelector) {
|
|
65
|
-
return this.formDirective.messageSelector;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
getHintWrapperSelector() {
|
|
69
|
-
if (this.hintSelector === false) {
|
|
70
|
-
return '';
|
|
71
|
-
}
|
|
72
|
-
if (this.hintSelector) {
|
|
73
|
-
return this.hintSelector;
|
|
74
|
-
}
|
|
75
|
-
else if (this.formDirective && this.formDirective.hintSelector) {
|
|
76
|
-
return this.formDirective.hintSelector;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
getWrapperSelector() {
|
|
80
|
-
if (this.wrapperSelector === false) {
|
|
81
|
-
return '';
|
|
82
|
-
}
|
|
83
|
-
if (this.wrapperSelector) {
|
|
84
|
-
return this.wrapperSelector;
|
|
85
|
-
}
|
|
86
|
-
else if (this.formDirective && this.formDirective.wrapperSelector) {
|
|
87
|
-
return this.formDirective.wrapperSelector;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
getlabelSelector() {
|
|
91
|
-
if (this.labelSelector === false) {
|
|
92
|
-
return '';
|
|
93
|
-
}
|
|
94
|
-
if (this.labelSelector) {
|
|
95
|
-
return this.labelSelector;
|
|
96
|
-
}
|
|
97
|
-
else if (this.formDirective && this.formDirective.labelSelector) {
|
|
98
|
-
return this.formDirective.labelSelector;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
getWrapperElement() {
|
|
102
|
-
const wrapper = this.getWrapper(this.elementRef.nativeElement);
|
|
103
|
-
if (wrapper) {
|
|
104
|
-
return wrapper;
|
|
105
|
-
}
|
|
106
|
-
return this.elementRef.nativeElement;
|
|
107
|
-
}
|
|
108
|
-
/*
|
|
109
|
-
<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.
|
|
110
|
-
<input>
|
|
111
|
-
<div class="fs-form-message"> <-- Message Selector. Look for the element with class .fs-form-message or messageSelector
|
|
112
|
-
<div class="fs-form-message"></div>
|
|
113
|
-
<div class="fs-form-hint"></div> <-- Hint Selector. Look for the element with class .fs-form-hint or hintSelector
|
|
114
|
-
</div>
|
|
115
|
-
</mat-form-field>
|
|
116
|
-
*/
|
|
117
|
-
render() {
|
|
118
|
-
var _a;
|
|
119
|
-
if (this.ngControl) {
|
|
120
|
-
const renderer = this.renderer2;
|
|
121
|
-
const wrapper = this.getWrapperElement();
|
|
122
|
-
const error = this.ngControl.dirty ? this.getError(this.ngControl) : null;
|
|
123
|
-
if (!this.getMessageSelector()) {
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
const messageWrapper = wrapper.querySelector(this.getMessageSelector());
|
|
127
|
-
if (!messageWrapper) {
|
|
128
|
-
return console.warn('Failed to locate ' + this.getMessageSelector(), this.elementRef.nativeElement);
|
|
129
|
-
}
|
|
130
|
-
if (this.getlabelSelector()) {
|
|
131
|
-
const labelWrapper = wrapper.querySelector(this.getlabelSelector());
|
|
132
|
-
if (labelWrapper) {
|
|
133
|
-
if (this.appendLabelClass) {
|
|
134
|
-
this.renderer2.addClass(labelWrapper, this.appendLabelClass);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
if (this.appendMessageClass) {
|
|
139
|
-
renderer.addClass(messageWrapper, this.appendMessageClass);
|
|
140
|
-
}
|
|
141
|
-
if (this.getHintWrapperSelector()) {
|
|
142
|
-
const hint = messageWrapper.querySelector(this.getHintWrapperSelector());
|
|
143
|
-
if (hint) {
|
|
144
|
-
renderer.setStyle(hint, 'display', error ? 'none' : 'block');
|
|
145
|
-
if (this.appendHintClass) {
|
|
146
|
-
renderer.addClass(hint, this.appendHintClass);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
let errorWrapper = wrapper.querySelector('.fs-form-error-target');
|
|
151
|
-
if (errorWrapper) {
|
|
152
|
-
errorWrapper.remove();
|
|
153
|
-
}
|
|
154
|
-
wrapper.classList.remove('ng-invalid');
|
|
155
|
-
const shouldErrorBeRendered = this.ngControl.invalid
|
|
156
|
-
&& (this.ngControl.dirty || ((_a = this.formDirective.ngForm) === null || _a === void 0 ? void 0 : _a.submitted));
|
|
157
|
-
if (!shouldErrorBeRendered || !error) {
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
wrapper.classList.add('ng-invalid', 'ng-dirty');
|
|
161
|
-
errorWrapper = renderer.createElement('div');
|
|
162
|
-
renderer.addClass(errorWrapper, 'fs-form-error-target');
|
|
163
|
-
renderer.addClass(errorWrapper, this.appendErrorClass);
|
|
164
|
-
renderer.addClass(errorWrapper, this.appendErrorClass + '-' + error.name);
|
|
165
|
-
const errorText = renderer.createText(error.message);
|
|
166
|
-
renderer.appendChild(errorWrapper, errorText);
|
|
167
|
-
messageWrapper.appendChild(errorWrapper);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
getWrapper(node, count = 0) {
|
|
171
|
-
if (!node || count > 10) {
|
|
172
|
-
return null;
|
|
173
|
-
}
|
|
174
|
-
if (node.parentNode && node.parentNode.querySelector(this.getWrapperSelector())) {
|
|
175
|
-
return node;
|
|
176
|
-
}
|
|
177
|
-
return this.getWrapper(node.parentNode, ++count);
|
|
178
|
-
}
|
|
179
|
-
parseErrorMessage(message, args) {
|
|
180
|
-
values(args)
|
|
181
|
-
.forEach((name) => {
|
|
182
|
-
message = message.replace(/\$\(\d\)/, name);
|
|
183
|
-
});
|
|
184
|
-
return message;
|
|
185
|
-
}
|
|
186
|
-
getError(controlRef) {
|
|
187
|
-
const name = keys(controlRef.control.errors)[0];
|
|
188
|
-
if (!name) {
|
|
189
|
-
return null;
|
|
190
|
-
}
|
|
191
|
-
let message = controlRef.control.errors[name];
|
|
192
|
-
if (this._validateMessages[name]) {
|
|
193
|
-
message = this.parseErrorMessage(this._validateMessages[name], message);
|
|
194
|
-
}
|
|
195
|
-
return { name: name, message: message };
|
|
196
|
-
}
|
|
197
|
-
_setupValidators() {
|
|
198
|
-
const control = this._control;
|
|
199
|
-
if (this.validate) {
|
|
200
|
-
const validators = control.validator
|
|
201
|
-
? [control.validator, this.validate.bind(this)]
|
|
202
|
-
: this.validate.bind(this);
|
|
203
|
-
control.setValidators(validators);
|
|
204
|
-
}
|
|
205
|
-
if (this.validateAsync) {
|
|
206
|
-
const asyncValidators = control.asyncValidator
|
|
207
|
-
? [control.asyncValidator, this.validateAsync.bind(this)]
|
|
208
|
-
: this.validateAsync.bind(this);
|
|
209
|
-
control.setAsyncValidators(asyncValidators);
|
|
210
|
-
}
|
|
211
|
-
control.updateValueAndValidity();
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
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 });
|
|
215
|
-
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: [
|
|
216
|
-
VALIDATE_MESSAGE_PROVIDER
|
|
217
|
-
], ngImport: i0 });
|
|
218
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsControlDirective, decorators: [{
|
|
219
|
-
type: Directive,
|
|
220
|
-
args: [{
|
|
221
|
-
selector: '[fsFormControl]',
|
|
222
|
-
providers: [
|
|
223
|
-
VALIDATE_MESSAGE_PROVIDER
|
|
224
|
-
],
|
|
225
|
-
}]
|
|
226
|
-
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.Injector }, { type: undefined, decorators: [{
|
|
227
|
-
type: Self
|
|
228
|
-
}, {
|
|
229
|
-
type: Inject,
|
|
230
|
-
args: [VALIDATE_MESSAGES]
|
|
231
|
-
}] }, { type: i1.NgControl, decorators: [{
|
|
232
|
-
type: Optional
|
|
233
|
-
}] }, { type: i2.FsFormDirective, decorators: [{
|
|
234
|
-
type: Optional
|
|
235
|
-
}, {
|
|
236
|
-
type: Inject,
|
|
237
|
-
args: [FsFormDirective]
|
|
238
|
-
}] }]; }, propDecorators: { wrapperSelector: [{
|
|
239
|
-
type: Input
|
|
240
|
-
}], messageSelector: [{
|
|
241
|
-
type: Input
|
|
242
|
-
}], hintSelector: [{
|
|
243
|
-
type: Input
|
|
244
|
-
}], labelSelector: [{
|
|
245
|
-
type: Input
|
|
246
|
-
}], appendMessageClass: [{
|
|
247
|
-
type: Input
|
|
248
|
-
}], appendLabelClass: [{
|
|
249
|
-
type: Input
|
|
250
|
-
}], appendErrorClass: [{
|
|
251
|
-
type: Input
|
|
252
|
-
}], appendHintClass: [{
|
|
253
|
-
type: Input
|
|
254
|
-
}], validateMessages: [{
|
|
255
|
-
type: Input
|
|
256
|
-
}] } });
|
|
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
|
+
if (this.messageSelector === false) {
|
|
59
|
+
return '';
|
|
60
|
+
}
|
|
61
|
+
if (this.messageSelector) {
|
|
62
|
+
return this.messageSelector;
|
|
63
|
+
}
|
|
64
|
+
else if (this.formDirective && this.formDirective.messageSelector) {
|
|
65
|
+
return this.formDirective.messageSelector;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
getHintWrapperSelector() {
|
|
69
|
+
if (this.hintSelector === false) {
|
|
70
|
+
return '';
|
|
71
|
+
}
|
|
72
|
+
if (this.hintSelector) {
|
|
73
|
+
return this.hintSelector;
|
|
74
|
+
}
|
|
75
|
+
else if (this.formDirective && this.formDirective.hintSelector) {
|
|
76
|
+
return this.formDirective.hintSelector;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
getWrapperSelector() {
|
|
80
|
+
if (this.wrapperSelector === false) {
|
|
81
|
+
return '';
|
|
82
|
+
}
|
|
83
|
+
if (this.wrapperSelector) {
|
|
84
|
+
return this.wrapperSelector;
|
|
85
|
+
}
|
|
86
|
+
else if (this.formDirective && this.formDirective.wrapperSelector) {
|
|
87
|
+
return this.formDirective.wrapperSelector;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
getlabelSelector() {
|
|
91
|
+
if (this.labelSelector === false) {
|
|
92
|
+
return '';
|
|
93
|
+
}
|
|
94
|
+
if (this.labelSelector) {
|
|
95
|
+
return this.labelSelector;
|
|
96
|
+
}
|
|
97
|
+
else if (this.formDirective && this.formDirective.labelSelector) {
|
|
98
|
+
return this.formDirective.labelSelector;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
getWrapperElement() {
|
|
102
|
+
const wrapper = this.getWrapper(this.elementRef.nativeElement);
|
|
103
|
+
if (wrapper) {
|
|
104
|
+
return wrapper;
|
|
105
|
+
}
|
|
106
|
+
return this.elementRef.nativeElement;
|
|
107
|
+
}
|
|
108
|
+
/*
|
|
109
|
+
<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.
|
|
110
|
+
<input>
|
|
111
|
+
<div class="fs-form-message"> <-- Message Selector. Look for the element with class .fs-form-message or messageSelector
|
|
112
|
+
<div class="fs-form-message"></div>
|
|
113
|
+
<div class="fs-form-hint"></div> <-- Hint Selector. Look for the element with class .fs-form-hint or hintSelector
|
|
114
|
+
</div>
|
|
115
|
+
</mat-form-field>
|
|
116
|
+
*/
|
|
117
|
+
render() {
|
|
118
|
+
var _a;
|
|
119
|
+
if (this.ngControl) {
|
|
120
|
+
const renderer = this.renderer2;
|
|
121
|
+
const wrapper = this.getWrapperElement();
|
|
122
|
+
const error = this.ngControl.dirty ? this.getError(this.ngControl) : null;
|
|
123
|
+
if (!this.getMessageSelector()) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const messageWrapper = wrapper.querySelector(this.getMessageSelector());
|
|
127
|
+
if (!messageWrapper) {
|
|
128
|
+
return console.warn('Failed to locate ' + this.getMessageSelector(), this.elementRef.nativeElement);
|
|
129
|
+
}
|
|
130
|
+
if (this.getlabelSelector()) {
|
|
131
|
+
const labelWrapper = wrapper.querySelector(this.getlabelSelector());
|
|
132
|
+
if (labelWrapper) {
|
|
133
|
+
if (this.appendLabelClass) {
|
|
134
|
+
this.renderer2.addClass(labelWrapper, this.appendLabelClass);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (this.appendMessageClass) {
|
|
139
|
+
renderer.addClass(messageWrapper, this.appendMessageClass);
|
|
140
|
+
}
|
|
141
|
+
if (this.getHintWrapperSelector()) {
|
|
142
|
+
const hint = messageWrapper.querySelector(this.getHintWrapperSelector());
|
|
143
|
+
if (hint) {
|
|
144
|
+
renderer.setStyle(hint, 'display', error ? 'none' : 'block');
|
|
145
|
+
if (this.appendHintClass) {
|
|
146
|
+
renderer.addClass(hint, this.appendHintClass);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
let errorWrapper = wrapper.querySelector('.fs-form-error-target');
|
|
151
|
+
if (errorWrapper) {
|
|
152
|
+
errorWrapper.remove();
|
|
153
|
+
}
|
|
154
|
+
wrapper.classList.remove('ng-invalid');
|
|
155
|
+
const shouldErrorBeRendered = this.ngControl.invalid
|
|
156
|
+
&& (this.ngControl.dirty || ((_a = this.formDirective.ngForm) === null || _a === void 0 ? void 0 : _a.submitted));
|
|
157
|
+
if (!shouldErrorBeRendered || !error) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
wrapper.classList.add('ng-invalid', 'ng-dirty');
|
|
161
|
+
errorWrapper = renderer.createElement('div');
|
|
162
|
+
renderer.addClass(errorWrapper, 'fs-form-error-target');
|
|
163
|
+
renderer.addClass(errorWrapper, this.appendErrorClass);
|
|
164
|
+
renderer.addClass(errorWrapper, this.appendErrorClass + '-' + error.name);
|
|
165
|
+
const errorText = renderer.createText(error.message);
|
|
166
|
+
renderer.appendChild(errorWrapper, errorText);
|
|
167
|
+
messageWrapper.appendChild(errorWrapper);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
getWrapper(node, count = 0) {
|
|
171
|
+
if (!node || count > 10) {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
if (node.parentNode && node.parentNode.querySelector(this.getWrapperSelector())) {
|
|
175
|
+
return node;
|
|
176
|
+
}
|
|
177
|
+
return this.getWrapper(node.parentNode, ++count);
|
|
178
|
+
}
|
|
179
|
+
parseErrorMessage(message, args) {
|
|
180
|
+
values(args)
|
|
181
|
+
.forEach((name) => {
|
|
182
|
+
message = message.replace(/\$\(\d\)/, name);
|
|
183
|
+
});
|
|
184
|
+
return message;
|
|
185
|
+
}
|
|
186
|
+
getError(controlRef) {
|
|
187
|
+
const name = keys(controlRef.control.errors)[0];
|
|
188
|
+
if (!name) {
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
let message = controlRef.control.errors[name];
|
|
192
|
+
if (this._validateMessages[name]) {
|
|
193
|
+
message = this.parseErrorMessage(this._validateMessages[name], message);
|
|
194
|
+
}
|
|
195
|
+
return { name: name, message: message };
|
|
196
|
+
}
|
|
197
|
+
_setupValidators() {
|
|
198
|
+
const control = this._control;
|
|
199
|
+
if (this.validate) {
|
|
200
|
+
const validators = control.validator
|
|
201
|
+
? [control.validator, this.validate.bind(this)]
|
|
202
|
+
: this.validate.bind(this);
|
|
203
|
+
control.setValidators(validators);
|
|
204
|
+
}
|
|
205
|
+
if (this.validateAsync) {
|
|
206
|
+
const asyncValidators = control.asyncValidator
|
|
207
|
+
? [control.asyncValidator, this.validateAsync.bind(this)]
|
|
208
|
+
: this.validateAsync.bind(this);
|
|
209
|
+
control.setAsyncValidators(asyncValidators);
|
|
210
|
+
}
|
|
211
|
+
control.updateValueAndValidity();
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
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 });
|
|
215
|
+
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: [
|
|
216
|
+
VALIDATE_MESSAGE_PROVIDER
|
|
217
|
+
], ngImport: i0 });
|
|
218
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsControlDirective, decorators: [{
|
|
219
|
+
type: Directive,
|
|
220
|
+
args: [{
|
|
221
|
+
selector: '[fsFormControl]',
|
|
222
|
+
providers: [
|
|
223
|
+
VALIDATE_MESSAGE_PROVIDER
|
|
224
|
+
],
|
|
225
|
+
}]
|
|
226
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.Injector }, { type: undefined, decorators: [{
|
|
227
|
+
type: Self
|
|
228
|
+
}, {
|
|
229
|
+
type: Inject,
|
|
230
|
+
args: [VALIDATE_MESSAGES]
|
|
231
|
+
}] }, { type: i1.NgControl, decorators: [{
|
|
232
|
+
type: Optional
|
|
233
|
+
}] }, { type: i2.FsFormDirective, decorators: [{
|
|
234
|
+
type: Optional
|
|
235
|
+
}, {
|
|
236
|
+
type: Inject,
|
|
237
|
+
args: [FsFormDirective]
|
|
238
|
+
}] }]; }, propDecorators: { wrapperSelector: [{
|
|
239
|
+
type: Input
|
|
240
|
+
}], messageSelector: [{
|
|
241
|
+
type: Input
|
|
242
|
+
}], hintSelector: [{
|
|
243
|
+
type: Input
|
|
244
|
+
}], labelSelector: [{
|
|
245
|
+
type: Input
|
|
246
|
+
}], appendMessageClass: [{
|
|
247
|
+
type: Input
|
|
248
|
+
}], appendLabelClass: [{
|
|
249
|
+
type: Input
|
|
250
|
+
}], appendErrorClass: [{
|
|
251
|
+
type: Input
|
|
252
|
+
}], appendHintClass: [{
|
|
253
|
+
type: Input
|
|
254
|
+
}], validateMessages: [{
|
|
255
|
+
type: Input
|
|
256
|
+
}] } });
|
|
257
257
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2RpcmVjdGl2ZXMvdmFsaWRhdG9ycy9jb250cm9sLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsS0FBSyxFQUNMLFVBQVUsRUFDVixTQUFTLEVBQ1QsU0FBUyxFQUNULFFBQVEsRUFDUixRQUFRLEVBQ1IsTUFBTSxFQUNOLElBQUksR0FJTCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFxQyxNQUFNLGdCQUFnQixDQUFDO0FBRTlFLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXpDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLGlCQUFpQixFQUNsQixNQUFNLDRDQUE0QyxDQUFDOzs7O0FBZXBELE1BQU0sT0FBTyxrQkFBa0I7SUF5QjdCLFlBQ1ksVUFBc0IsRUFDdEIsU0FBb0IsRUFDcEIsUUFBa0IsRUFDaUIsaUJBQWlCLEVBQ3hDLFNBQW9CLEVBQ0csYUFBOEI7UUFMakUsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDaUIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFBO1FBQ3hDLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDRyxrQkFBYSxHQUFiLGFBQWEsQ0FBaUI7UUF6QnBFLHVCQUFrQixHQUFHLGlCQUFpQixDQUFDO1FBQ3ZDLHFCQUFnQixHQUFHLGVBQWUsQ0FBQztRQUNuQyxxQkFBZ0IsR0FBRyxlQUFl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dXQsXG4gIEVsZW1lbnRSZWYsXG4gIFJlbmRlcmVyMixcbiAgRGlyZWN0aXZlLFxuICBJbmplY3RvcixcbiAgT3B0aW9uYWwsXG4gIEluamVjdCxcbiAgU2VsZixcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIEFmdGVyQ29udGVudEluaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdDb250cm9sLCBBYnN0cmFjdENvbnRyb2wsIFZhbGlkYXRpb25FcnJvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgdmFsdWVzLCBrZXlzIH0gZnJvbSAnbG9kYXNoLWVzJztcblxuaW1wb3J0IHsgRnNGb3JtRGlyZWN0aXZlIH0gZnJvbSAnLi4vZm9ybS9mb3JtLmRpcmVjdGl2ZSc7XG5pbXBvcnQge1xuICBWQUxJREFURV9NRVNTQUdFX1BST1ZJREVSLFxuICBWQUxJREFURV9NRVNTQUdFU1xufSBmcm9tICcuLi8uLi9wcm92aWRlcnMvdmFsaWRhdGUtbWVzc2FnZXMucHJvdmlkZXInO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgRnNDb250cm9sRGlyZWN0aXZlIHtcbiAgdmFsaWRhdGU/KGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsO1xuICB2YWxpZGF0ZUFzeW5jPyhjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBQcm9taXNlPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPiB8IE9ic2VydmFibGU8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+O1xufVxuXG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tmc0Zvcm1Db250cm9sXScsXG4gIHByb3ZpZGVyczogW1xuICAgIFZBTElEQVRFX01FU1NBR0VfUFJPVklERVJcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRnNDb250cm9sRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuXG4gIEBJbnB1dCgpIHdyYXBwZXJTZWxlY3Rvcjogc3RyaW5nIHwgZmFsc2U7XG4gIEBJbnB1dCgpIG1lc3NhZ2VTZWxlY3Rvcjogc3RyaW5nIHwgZmFsc2U7XG4gIEBJbnB1dCgpIGhpbnRTZWxlY3Rvcjogc3RyaW5nIHwgZmFsc2U7XG4gIEBJbnB1dCgpIGxhYmVsU2VsZWN0b3I6IHN0cmluZyB8IGZhbHNlO1xuICBASW5wdXQoKSBhcHBlbmRNZXNzYWdlQ2xhc3MgPSAnZnMtZm9ybS1tZXNzYWdlJztcbiAgQElucHV0KCkgYXBwZW5kTGFiZWxDbGFzcyA9ICdmcy1mb3JtLWxhYmVsJztcbiAgQElucHV0KCkgYXBwZW5kRXJyb3JDbGFzcyA9ICdmcy1mb3JtLWVycm9yJztcbiAgQElucHV0KCkgYXBwZW5kSGludENsYXNzID0gJ2ZzLWZvcm0taGludCc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCB2YWxpZGF0ZU1lc3NhZ2VzKG1lc3NhZ2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XG4gICAgdGhpcy5fdmFsaWRhdGVNZXNzYWdlcyA9IHtcbiAgICAgIC4uLnRoaXMuX3ZhbGlkYXRlTWVzc2FnZXMsXG4gICAgICAuLi5tZXNzYWdlcyxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGVycm9ycyA9IFtdO1xuXG4gIC8vIHByb3RlY3RlZCBfdmFsaWRhdGVNZXNzYWdlcyA9IHsgLi4uRVJST1JfTUVTU0FHRVMgfTtcbiAgcHJvdGVjdGVkIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG4gIHByb3RlY3RlZCBfY29udHJvbDogQWJzdHJhY3RDb250cm9sO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByb3RlY3RlZCByZW5kZXJlcjI6IFJlbmRlcmVyMixcbiAgICBwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIEBTZWxmKCkgQEluamVjdChWQUxJREFURV9NRVNTQUdFUykgcHJvdGVjdGVkIF92YWxpZGF0ZU1lc3NhZ2VzLFxuICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBuZ0NvbnRyb2w6IE5nQ29udHJvbCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEZzRm9ybURpcmVjdGl2ZSkgcHJpdmF0ZSBmb3JtRGlyZWN0aXZlOiBGc0Zvcm1EaXJlY3RpdmUsXG4gICkge1xuXG4gICAgaWYgKG5nQ29udHJvbCkge1xuICAgICAgdGhpcy5fY29udHJvbCA9IG5nQ29udHJvbC5jb250cm9sO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdUaGUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgbmdNb2RlbCcsIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLl9zZXR1cFZhbGlkYXRvcnMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIGlmICh0aGlzLl9jb250cm9sKSB7XG5cbiAgICAgIC8qXG4gICAgICAgIEVuc3VyZSB0aGF0IHN0YXR1c0NoYW5nZXMgaGFzIG9uZSBzdWJzY3JpcHRpb24gcGVyIGNvbnRyb2wuIE11bHRpcGxlIGNhbiBoYXBwZW5cbiAgICAgICAgd2hlbiBtdWx0aXBsZSBmc0Zvcm0gdmFsaWRhdGlvbiBkaXJlY3RpdmVzIGFyZSBhcHBsaWVkIHRvIHRoZSBzYW1lIGVsZW1lbnRcbiAgICAgICovXG4gICAgICBpZiAoISg8YW55PnRoaXMuX2NvbnRyb2wpLnN0YXR1c0NoYW5nZXNTdWJzY3JpYmUpIHtcblxuICAgICAgICB0aGlzLl9jb250cm9sLnN0YXR1c0NoYW5nZXNcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSh0aGlzLnJlbmRlci5iaW5kKHRoaXMpKTtcblxuICAgICAgICAoPGFueT50aGlzLl9jb250cm9sKS5zdGF0dXNDaGFuZ2VzU3Vic2NyaWJlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0TWVzc2FnZVNlbGVjdG9yKCk6IHN0cmluZyB7XG5cbiAgICBpZiAodGhpcy5tZXNzYWdlU2VsZWN0b3IgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWVzc2FnZVNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXNzYWdlU2VsZWN0b3I7XG5cbiAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybURpcmVjdGl2ZSAmJiB0aGlzLmZvcm1EaXJlY3RpdmUubWVzc2FnZVNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtRGlyZWN0aXZlLm1lc3NhZ2VTZWxlY3RvcjtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0SGludFdyYXBwZXJTZWxlY3RvcigpOiBzdHJpbmcge1xuXG4gICAgaWYgKHRoaXMuaGludFNlbGVjdG9yID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhpbnRTZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIHRoaXMuaGludFNlbGVjdG9yO1xuXG4gICAgfSBlbHNlIGlmICh0aGlzLmZvcm1EaXJlY3RpdmUgJiYgdGhpcy5mb3JtRGlyZWN0aXZlLmhpbnRTZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybURpcmVjdGl2ZS5oaW50U2VsZWN0b3I7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldFdyYXBwZXJTZWxlY3RvcigpOiBzdHJpbmcge1xuXG4gICAgaWYgKHRoaXMud3JhcHBlclNlbGVjdG9yID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGlmICh0aGlzLndyYXBwZXJTZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIHRoaXMud3JhcHBlclNlbGVjdG9yO1xuXG4gICAgfSBlbHNlIGlmICh0aGlzLmZvcm1EaXJlY3RpdmUgJiYgdGhpcy5mb3JtRGlyZWN0aXZlLndyYXBwZXJTZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybURpcmVjdGl2ZS53cmFwcGVyU2VsZWN0b3I7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldGxhYmVsU2VsZWN0b3IoKTogc3RyaW5nIHtcblxuICAgIGlmICh0aGlzLmxhYmVsU2VsZWN0b3IgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubGFiZWxTZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIHRoaXMubGFiZWxTZWxlY3RvcjtcblxuICAgIH0gZWxzZSBpZiAodGhpcy5mb3JtRGlyZWN0aXZlICYmIHRoaXMuZm9ybURpcmVjdGl2ZS5sYWJlbFNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtRGlyZWN0aXZlLmxhYmVsU2VsZWN0b3I7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldFdyYXBwZXJFbGVtZW50KCkge1xuXG4gICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuZ2V0V3JhcHBlcih0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG5cbiAgICBpZiAod3JhcHBlcikge1xuICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgLypcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJtYXQtZm9ybS1maWVsZFwiPiAgPC0tIEZpZWxkIFdyYXBwZXIgQ2xhc3MuIExvb2sgZm9yIHBhcmVudHMgZnJvbSB0aGUgbmF0aXZlIGVsZW1lbnQgd2l0aCB0aGUgbWF0Y2hpbmcgd3JhcHBlclNlbGVjdG9yLiBJZiBub3QgZm91bmQgZGVmYXVsdHMgdG8gbmF0aXZlIGVsZW1lbnQuXG4gICAgICA8aW5wdXQ+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtZm9ybS1tZXNzYWdlXCI+IDwtLSBNZXNzYWdlIFNlbGVjdG9yLiBMb29rIGZvciB0aGUgZWxlbWVudCB3aXRoIGNsYXNzIC5mcy1mb3JtLW1lc3NhZ2Ugb3IgbWVzc2FnZVNlbGVjdG9yXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1mb3JtLW1lc3NhZ2VcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZzLWZvcm0taGludFwiPjwvZGl2PiA8LS0gSGludCBTZWxlY3Rvci4gTG9vayBmb3IgdGhlIGVsZW1lbnQgd2l0aCBjbGFzcyAuZnMtZm9ybS1oaW50IG9yIGhpbnRTZWxlY3RvclxuICAgICAgPC9kaXY+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgKi9cblxuICBwcm90ZWN0ZWQgcmVuZGVyKCkge1xuICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuXG4gICAgICBjb25zdCByZW5kZXJlciA9IHRoaXMucmVuZGVyZXIyO1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuZ2V0V3JhcHBlckVsZW1lbnQoKTtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5uZ0NvbnRyb2wuZGlydHkgPyB0aGlzLmdldEVycm9yKHRoaXMubmdDb250cm9sKSA6IG51bGw7XG5cbiAgICAgIGlmICghdGhpcy5nZXRNZXNzYWdlU2VsZWN0b3IoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2VXcmFwcGVyID0gd3JhcHBlci5xdWVyeVNlbGVjdG9yKHRoaXMuZ2V0TWVzc2FnZVNlbGVjdG9yKCkpO1xuXG4gICAgICBpZiAoIW1lc3NhZ2VXcmFwcGVyKSB7XG4gICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBsb2NhdGUgJyArIHRoaXMuZ2V0TWVzc2FnZVNlbGVjdG9yKCksIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZ2V0bGFiZWxTZWxlY3RvcigpKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsV3JhcHBlciA9IHdyYXBwZXIucXVlcnlTZWxlY3Rvcih0aGlzLmdldGxhYmVsU2VsZWN0b3IoKSk7XG5cbiAgICAgICAgaWYgKGxhYmVsV3JhcHBlcikge1xuICAgICAgICAgIGlmICh0aGlzLmFwcGVuZExhYmVsQ2xhc3MpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIyLmFkZENsYXNzKGxhYmVsV3JhcHBlciwgdGhpcy5hcHBlbmRMYWJlbENsYXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuYXBwZW5kTWVzc2FnZUNsYXNzKSB7XG4gICAgICAgIHJlbmRlcmVyLmFkZENsYXNzKG1lc3NhZ2VXcmFwcGVyLCB0aGlzLmFwcGVuZE1lc3NhZ2VDbGFzcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmdldEhpbnRXcmFwcGVyU2VsZWN0b3IoKSkge1xuICAgICAgICBjb25zdCBoaW50ID0gbWVzc2FnZVdyYXBwZXIucXVlcnlTZWxlY3Rvcih0aGlzLmdldEhpbnRXcmFwcGVyU2VsZWN0b3IoKSk7XG5cbiAgICAgICAgaWYgKGhpbnQpIHtcbiAgICAgICAgICByZW5kZXJlci5zZXRTdHlsZShoaW50LCAnZGlzcGxheScsIGVycm9yID8gJ25vbmUnIDogJ2Jsb2NrJyk7XG5cbiAgICAgICAgICBpZiAodGhpcy5hcHBlbmRIaW50Q2xhc3MpIHtcbiAgICAgICAgICAgIHJlbmRlcmVyLmFkZENsYXNzKGhpbnQsIHRoaXMuYXBwZW5kSGludENsYXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IGVycm9yV3JhcHBlciA9IHdyYXBwZXIucXVlcnlTZWxlY3RvcignLmZzLWZvcm0tZXJyb3ItdGFyZ2V0Jyk7XG4gICAgICBpZiAoZXJyb3JXcmFwcGVyKSB7XG4gICAgICAgIGVycm9yV3JhcHBlci5yZW1vdmUoKTtcbiAgICAgIH1cblxuICAgICAgd3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCduZy1pbnZhbGlkJyk7XG5cbiAgICAgIGNvbnN0IHNob3VsZEVycm9yQmVSZW5kZXJlZCA9IHRoaXMubmdDb250cm9sLmludmFsaWRcbiAgICAgICAgJiYgKHRoaXMubmdDb250cm9sLmRpcnR5IHx8IHRoaXMuZm9ybURpcmVjdGl2ZS5uZ0Zvcm0/LnN1Ym1pdHRlZCk7XG5cbiAgICAgIGlmICghc2hvdWxkRXJyb3JCZVJlbmRlcmVkIHx8ICFlcnJvcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHdyYXBwZXIuY2xhc3NMaXN0LmFkZCgnbmctaW52YWxpZCcsICduZy1kaXJ0eScpO1xuXG4gICAgICBlcnJvcldyYXBwZXIgPSByZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHJlbmRlcmVyLmFkZENsYXNzKGVycm9yV3JhcHBlciwgJ2ZzLWZvcm0tZXJyb3ItdGFyZ2V0Jyk7XG4gICAgICByZW5kZXJlci5hZGRDbGFzcyhlcnJvcldyYXBwZXIsIHRoaXMuYXBwZW5kRXJyb3JDbGFzcyk7XG4gICAgICByZW5kZXJlci5hZGRDbGFzcyhlcnJvcldyYXBwZXIsIHRoaXMuYXBwZW5kRXJyb3JDbGFzcyArICctJyArIGVycm9yLm5hbWUpO1xuXG4gICAgICBjb25zdCBlcnJvclRleHQgPSByZW5kZXJlci5jcmVhdGVUZXh0KGVycm9yLm1lc3NhZ2UpO1xuXG4gICAgICByZW5kZXJlci5hcHBlbmRDaGlsZChlcnJvcldyYXBwZXIsIGVycm9yVGV4dCk7XG4gICAgICBtZXNzYWdlV3JhcHBlci5hcHBlbmRDaGlsZChlcnJvcldyYXBwZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRXcmFwcGVyKG5vZGUsIGNvdW50ID0gMCkge1xuXG4gICAgaWYgKCFub2RlIHx8IGNvdW50ID4gMTApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChub2RlLnBhcmVudE5vZGUgJiYgbm9kZS5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3IodGhpcy5nZXRXcmFwcGVyU2VsZWN0b3IoKSkpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldFdyYXBwZXIobm9kZS5wYXJlbnROb2RlLCArK2NvdW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZUVycm9yTWVzc2FnZShtZXNzYWdlLCBhcmdzKTogc3RyaW5nIHtcbiAgICB2YWx1ZXMoYXJncylcbiAgICAgIC5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgvXFwkXFwoXFxkXFwpLywgbmFtZSk7XG4gICAgICB9KTtcblxuICAgIHJldHVybiBtZXNzYWdlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEVycm9yKGNvbnRyb2xSZWYpOiB7IG5hbWU6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nIH0ge1xuXG4gICAgY29uc3QgbmFtZSA9IGtleXMoY29udHJvbFJlZi5jb250cm9sLmVycm9ycylbMF07XG5cbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBtZXNzYWdlID0gY29udHJvbFJlZi5jb250cm9sLmVycm9yc1tuYW1lXTtcblxuICAgIGlmICh0aGlzLl92YWxpZGF0ZU1lc3NhZ2VzW25hbWVdKSB7XG4gICAgICBtZXNzYWdlID0gdGhpcy5wYXJzZUVycm9yTWVzc2FnZSh0aGlzLl92YWxpZGF0ZU1lc3NhZ2VzW25hbWVdLCBtZXNzYWdlKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBuYW1lOiBuYW1lLCBtZXNzYWdlOiBtZXNzYWdlIH07XG4gIH1cblxuICBwcml2YXRlIF9zZXR1cFZhbGlkYXRvcnMoKTogdm9pZCB7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuX2NvbnRyb2w7XG5cbiAgICBpZiAodGhpcy52YWxpZGF0ZSkge1xuICAgICAgY29uc3QgdmFsaWRhdG9ycyA9IGNvbnRyb2wudmFsaWRhdG9yXG4gICAgICAgID8gWyBjb250cm9sLnZhbGlkYXRvciwgdGhpcy52YWxpZGF0ZS5iaW5kKHRoaXMpXVxuICAgICAgICA6IHRoaXMudmFsaWRhdGUuYmluZCh0aGlzKTtcblxuICAgICAgY29udHJvbC5zZXRWYWxpZGF0b3JzKHZhbGlkYXRvcnMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnZhbGlkYXRlQXN5bmMpIHtcbiAgICAgIGNvbnN0IGFzeW5jVmFsaWRhdG9ycyA9IGNvbnRyb2wuYXN5bmNWYWxpZGF0b3JcbiAgICAgICAgPyBbIGNvbnRyb2wuYXN5bmNWYWxpZGF0b3IsIHRoaXMudmFsaWRhdGVBc3luYy5iaW5kKHRoaXMpXVxuICAgICAgICA6IHRoaXMudmFsaWRhdGVBc3luYy5iaW5kKHRoaXMpO1xuXG4gICAgICBjb250cm9sLnNldEFzeW5jVmFsaWRhdG9ycyhhc3luY1ZhbGlkYXRvcnMpO1xuICAgIH1cblxuICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICB9XG5cbn1cbiJdfQ==
|
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
import { Directive, Input } from '@angular/core';
|
|
2
|
-
import { FsControlDirective } from './control.directive';
|
|
3
|
-
import { FsValidators } from '../../validators/validators';
|
|
4
|
-
import { VALIDATE_MESSAGE_PROVIDER } from '../../providers/validate-messages.provider';
|
|
5
|
-
import { isEnabled } from '../../helpers/is-enabled';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
export class FsFormDateRangeDirective extends FsControlDirective {
|
|
8
|
-
set validationMessage(value) {
|
|
9
|
-
this._validateMessages.dateRange = value;
|
|
10
|
-
}
|
|
11
|
-
ngOnChanges() {
|
|
12
|
-
this._control.updateValueAndValidity();
|
|
13
|
-
}
|
|
14
|
-
validate(control) {
|
|
15
|
-
if (isEnabled(this.fsFormDateRange)) {
|
|
16
|
-
return FsValidators.dateRange(this._control);
|
|
17
|
-
}
|
|
18
|
-
else {
|
|
19
|
-
return null;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
FsFormDateRangeDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsFormDateRangeDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
24
|
-
FsFormDateRangeDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.16", type: FsFormDateRangeDirective, selector: "[fsFormDateRange]", inputs: { fsFormDateRange: "fsFormDateRange", validationMessage: ["fsFormDateRangeMessage", "validationMessage"] }, providers: [
|
|
25
|
-
VALIDATE_MESSAGE_PROVIDER
|
|
26
|
-
], usesInheritance: true, usesOnChanges: true, ngImport: i0 });
|
|
27
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsFormDateRangeDirective, decorators: [{
|
|
28
|
-
type: Directive,
|
|
29
|
-
args: [{
|
|
30
|
-
selector: '[fsFormDateRange]',
|
|
31
|
-
providers: [
|
|
32
|
-
VALIDATE_MESSAGE_PROVIDER
|
|
33
|
-
],
|
|
34
|
-
}]
|
|
35
|
-
}], propDecorators: { fsFormDateRange: [{
|
|
36
|
-
type: Input
|
|
37
|
-
}], validationMessage: [{
|
|
38
|
-
type: Input,
|
|
39
|
-
args: ['fsFormDateRangeMessage']
|
|
40
|
-
}] } });
|
|
1
|
+
import { Directive, Input } from '@angular/core';
|
|
2
|
+
import { FsControlDirective } from './control.directive';
|
|
3
|
+
import { FsValidators } from '../../validators/validators';
|
|
4
|
+
import { VALIDATE_MESSAGE_PROVIDER } from '../../providers/validate-messages.provider';
|
|
5
|
+
import { isEnabled } from '../../helpers/is-enabled';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class FsFormDateRangeDirective extends FsControlDirective {
|
|
8
|
+
set validationMessage(value) {
|
|
9
|
+
this._validateMessages.dateRange = value;
|
|
10
|
+
}
|
|
11
|
+
ngOnChanges() {
|
|
12
|
+
this._control.updateValueAndValidity();
|
|
13
|
+
}
|
|
14
|
+
validate(control) {
|
|
15
|
+
if (isEnabled(this.fsFormDateRange)) {
|
|
16
|
+
return FsValidators.dateRange(this._control);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
FsFormDateRangeDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsFormDateRangeDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
24
|
+
FsFormDateRangeDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.16", type: FsFormDateRangeDirective, selector: "[fsFormDateRange]", inputs: { fsFormDateRange: "fsFormDateRange", validationMessage: ["fsFormDateRangeMessage", "validationMessage"] }, providers: [
|
|
25
|
+
VALIDATE_MESSAGE_PROVIDER
|
|
26
|
+
], usesInheritance: true, usesOnChanges: true, ngImport: i0 });
|
|
27
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsFormDateRangeDirective, decorators: [{
|
|
28
|
+
type: Directive,
|
|
29
|
+
args: [{
|
|
30
|
+
selector: '[fsFormDateRange]',
|
|
31
|
+
providers: [
|
|
32
|
+
VALIDATE_MESSAGE_PROVIDER
|
|
33
|
+
],
|
|
34
|
+
}]
|
|
35
|
+
}], propDecorators: { fsFormDateRange: [{
|
|
36
|
+
type: Input
|
|
37
|
+
}], validationMessage: [{
|
|
38
|
+
type: Input,
|
|
39
|
+
args: ['fsFormDateRangeMessage']
|
|
40
|
+
}] } });
|
|
41
41
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXJhbmdlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvZGlyZWN0aXZlcy92YWxpZGF0b3JzL2RhdGVyYW5nZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFHNUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRXZGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7QUFTckQsTUFBTSxPQUFPLHdCQUF5QixTQUFRLGtCQUFrQjtJQUs5RCxJQUNXLGlCQUFpQixDQUFDLEtBQWE7UUFDeEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDM0MsQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFTSxRQUFRLENBQUMsT0FBd0I7UUFDdEMsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1lBQ25DLE9BQU8sWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDOUM7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDO1NBQ2I7SUFDSCxDQUFDOztzSEFwQlUsd0JBQXdCOzBHQUF4Qix3QkFBd0IsZ0tBSnhCO1FBQ1QseUJBQXlCO0tBQzFCOzRGQUVVLHdCQUF3QjtrQkFOcEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsbUJBQW1CO29CQUM3QixTQUFTLEVBQUU7d0JBQ1QseUJBQXlCO3FCQUMxQjtpQkFDRjs4QkFJUSxlQUFlO3NCQURyQixLQUFLO2dCQUlLLGlCQUFpQjtzQkFEM0IsS0FBSzt1QkFBQyx3QkFBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIElucHV0LCBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVmFsaWRhdGlvbkVycm9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgRnNDb250cm9sRGlyZWN0aXZlIH0gZnJvbSAnLi9jb250cm9sLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBGc1ZhbGlkYXRvcnMgfSBmcm9tICcuLi8uLi92YWxpZGF0b3JzL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHsgVkFMSURBVEVfTUVTU0FHRV9QUk9WSURFUiB9IGZyb20gJy4uLy4uL3Byb3ZpZGVycy92YWxpZGF0ZS1tZXNzYWdlcy5wcm92aWRlcic7XG5pbXBvcnQgeyBGc1ZhbGlkYXRvciB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvdmFsaWRhdG9yJztcbmltcG9ydCB7IGlzRW5hYmxlZCB9IGZyb20gJy4uLy4uL2hlbHBlcnMvaXMtZW5hYmxlZCc7XG5cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2ZzRm9ybURhdGVSYW5nZV0nLFxuICBwcm92aWRlcnM6IFtcbiAgICBWQUxJREFURV9NRVNTQUdFX1BST1ZJREVSXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEZzRm9ybURhdGVSYW5nZURpcmVjdGl2ZSBleHRlbmRzIEZzQ29udHJvbERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgRnNWYWxpZGF0b3Ige1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBmc0Zvcm1EYXRlUmFuZ2U7XG5cbiAgQElucHV0KCdmc0Zvcm1EYXRlUmFuZ2VNZXNzYWdlJylcbiAgcHVibGljIHNldCB2YWxpZGF0aW9uTWVzc2FnZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdmFsaWRhdGVNZXNzYWdlcy5kYXRlUmFuZ2UgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcygpIHtcbiAgICB0aGlzLl9jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgaWYgKGlzRW5hYmxlZCh0aGlzLmZzRm9ybURhdGVSYW5nZSkpIHtcbiAgICAgIHJldHVybiBGc1ZhbGlkYXRvcnMuZGF0ZVJhbmdlKHRoaXMuX2NvbnRyb2wpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|