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