ets-fe-ng-sdk 20.0.0 → 20.0.2
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/fesm2022/ets-fe-ng-sdk.mjs +81 -87
- package/fesm2022/ets-fe-ng-sdk.mjs.map +1 -1
- package/index.d.ts +28 -32
- package/package.json +20 -61
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as i2$2 from '@angular/forms';
|
|
2
2
|
import { FormControl, Validators, FormGroup, FormArray, FormBuilder, NG_VALUE_ACCESSOR, FormsModule, ReactiveFormsModule, UntypedFormArray } from '@angular/forms';
|
|
3
|
-
import { ReplaySubject, filter, debounceTime, lastValueFrom, Observable, BehaviorSubject, isObservable, merge, of, firstValueFrom, throwError, interval,
|
|
3
|
+
import { ReplaySubject, filter, debounceTime, lastValueFrom, Observable, BehaviorSubject, isObservable, merge, of, firstValueFrom, throwError, interval, map as map$1, startWith, switchMap, forkJoin, catchError as catchError$1, first, distinctUntilChanged, tap as tap$1, fromEvent, mergeMap, debounce, timer, Subject, distinct, concat } from 'rxjs';
|
|
4
4
|
import 'zone.js/plugins/zone-error';
|
|
5
5
|
import * as i0 from '@angular/core';
|
|
6
|
-
import { signal, computed, Injectable, inject, APP_INITIALIZER, isDevMode, Pipe, NgModule, input, Directive, booleanAttribute, ChangeDetectorRef, model, output, effect, ViewChild, Input,
|
|
6
|
+
import { signal, computed, Injectable, inject, APP_INITIALIZER, isDevMode, Pipe, NgModule, input, Directive, booleanAttribute, ChangeDetectorRef, model, output, effect, ViewChild, Input, Component, EventEmitter, Output, forwardRef, ChangeDetectionStrategy, HostListener, HostBinding, viewChild, linkedSignal, viewChildren, Inject, DestroyRef, contentChild, ElementRef, InjectionToken, ErrorHandler } from '@angular/core';
|
|
7
7
|
import * as i1$1 from '@angular/common';
|
|
8
8
|
import { Location, CurrencyPipe, TitleCasePipe, DatePipe, DecimalPipe, CommonModule, NgClass, JsonPipe, AsyncPipe, NgIf, NgFor, UpperCasePipe, NgTemplateOutlet, NgSwitch, NgSwitchCase, NgSwitchDefault, NgStyle } from '@angular/common';
|
|
9
9
|
import { faSpoon, faTable, faCircleExclamation, faHandshake, faPercent, faPlay, faArrowsH, faBank, faReceipt, faTag, faTruck, faStop, faRecycle, faUsers, faUnlock, faUpload, faBellSlash, faEye, faSearch, faSave, faArrowLeft, faPen, faPause, faArrowRight, faLock, faInfoCircle, faFileImport, faHome, faHistory, faUserShield, faPenFancy, faFilter, faFile, faFileExport, faEdit, faDownload, faTrash, faCogs, faClone, faListAlt, faCheck, faCancel, faMoneyCheck, faSlidersH, faPlus } from '@fortawesome/free-solid-svg-icons';
|
|
@@ -25,7 +25,7 @@ import { AES, enc } from 'crypto-js';
|
|
|
25
25
|
import * as i3 from '@angular/cdk/layout';
|
|
26
26
|
import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
|
|
27
27
|
import Papa from 'papaparse';
|
|
28
|
-
import { toSignal,
|
|
28
|
+
import { toSignal, rxResource, toObservable, outputFromObservable } from '@angular/core/rxjs-interop';
|
|
29
29
|
import * as Sentry from '@sentry/angular';
|
|
30
30
|
import * as i2$1 from '@fortawesome/angular-fontawesome';
|
|
31
31
|
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
|
|
@@ -5986,33 +5986,38 @@ class BtnComponent {
|
|
|
5986
5986
|
/** Form to bind to the button for validation */
|
|
5987
5987
|
this.form = input(...(ngDevMode ? [undefined, { debugName: "form" }] : []));
|
|
5988
5988
|
/** Subject for form changes */
|
|
5989
|
-
this.
|
|
5989
|
+
this.formStateRes = rxResource({
|
|
5990
|
+
params: () => this.form(),
|
|
5991
|
+
stream: (o) => (o.params ? o.params.events.pipe(map$1(() => o.params.valid == true)) : of(null)),
|
|
5992
|
+
});
|
|
5990
5993
|
/** Signal for form validity state */
|
|
5991
|
-
this.formState =
|
|
5994
|
+
this.formState = computed(() => this.formStateRes.value(), ...(ngDevMode ? [{ debugName: "formState" }] : []));
|
|
5992
5995
|
/** Multiple forms to bind to the button for validation */
|
|
5993
5996
|
this.forms = input(...(ngDevMode ? [undefined, { debugName: "forms" }] : []));
|
|
5994
|
-
/** Subject for forms changes */
|
|
5995
|
-
this.forms$ = new ReplaySubject(1);
|
|
5996
5997
|
/** Signal for multiple forms validity state */
|
|
5997
|
-
this.
|
|
5998
|
-
|
|
5999
|
-
|
|
6000
|
-
|
|
6001
|
-
|
|
6002
|
-
|
|
6003
|
-
|
|
6004
|
-
|
|
6005
|
-
|
|
6006
|
-
|
|
6007
|
-
|
|
6008
|
-
|
|
6009
|
-
|
|
6010
|
-
|
|
6011
|
-
|
|
6012
|
-
|
|
6013
|
-
|
|
6014
|
-
|
|
6015
|
-
|
|
5998
|
+
this.formsStateRes = rxResource({
|
|
5999
|
+
params: () => this.forms(),
|
|
6000
|
+
stream: (o) => o.params?.length
|
|
6001
|
+
? merge(...o.params.map((form) => form.events)).pipe(debounceTime(300), map$1(() => {
|
|
6002
|
+
const forms = this.forms();
|
|
6003
|
+
if (!forms?.length)
|
|
6004
|
+
return null;
|
|
6005
|
+
const fs = {
|
|
6006
|
+
// pending: true,
|
|
6007
|
+
// dirty: true,
|
|
6008
|
+
// invalid: true,
|
|
6009
|
+
// pristine: true,
|
|
6010
|
+
valid: true,
|
|
6011
|
+
};
|
|
6012
|
+
forms.forEach((x) => {
|
|
6013
|
+
if (!x.valid)
|
|
6014
|
+
fs.valid = false;
|
|
6015
|
+
});
|
|
6016
|
+
return fs;
|
|
6017
|
+
}))
|
|
6018
|
+
: of(null),
|
|
6019
|
+
});
|
|
6020
|
+
this.formsState = computed(() => this.formStateRes.value(), ...(ngDevMode ? [{ debugName: "formsState" }] : []));
|
|
6016
6021
|
/** Tooltip message to display */
|
|
6017
6022
|
this.help = input(...(ngDevMode ? [undefined, { debugName: "help" }] : []));
|
|
6018
6023
|
/** Delay before showing tooltip in milliseconds */
|
|
@@ -6064,8 +6069,7 @@ class BtnComponent {
|
|
|
6064
6069
|
const disabled = this.disabled(), valid = this.valid() !== false, onFormInvalid = this.onFormInvalid(), formIsValid = this.formState(), forms = this.formsState();
|
|
6065
6070
|
return (disabled ||
|
|
6066
6071
|
!valid ||
|
|
6067
|
-
(onFormInvalid == OnFormInvalid.disable &&
|
|
6068
|
-
(formIsValid === false || forms?.valid === false)) ||
|
|
6072
|
+
(onFormInvalid == OnFormInvalid.disable && (formIsValid === false || forms === false)) ||
|
|
6069
6073
|
false);
|
|
6070
6074
|
}, ...(ngDevMode ? [{ debugName: "isDisabled" }] : []));
|
|
6071
6075
|
effect(() => {
|
|
@@ -6073,14 +6077,6 @@ class BtnComponent {
|
|
|
6073
6077
|
if (this.debug())
|
|
6074
6078
|
debugger;
|
|
6075
6079
|
});
|
|
6076
|
-
effect(() => {
|
|
6077
|
-
this.form$.next(this.form() || null);
|
|
6078
|
-
this.cdr.detectChanges();
|
|
6079
|
-
});
|
|
6080
|
-
effect(() => {
|
|
6081
|
-
this.forms$.next(this.forms() || null);
|
|
6082
|
-
this.cdr.detectChanges();
|
|
6083
|
-
});
|
|
6084
6080
|
}
|
|
6085
6081
|
ngAfterViewChecked() {
|
|
6086
6082
|
//Called after every check of the component's view. Applies to components only.
|
|
@@ -6130,11 +6126,11 @@ class BtnComponent {
|
|
|
6130
6126
|
this.disabled.set(false);
|
|
6131
6127
|
}
|
|
6132
6128
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: BtnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
6133
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.4", type: BtnComponent, isStandalone: true, selector: "app-btn", inputs: { formSchema: { classPropertyName: "formSchema", publicName: "formSchema", isSignal: true, isRequired: false, transformFunction: null }, debug: { classPropertyName: "debug", publicName: "debug", isSignal: true, isRequired: false, transformFunction: null }, centerBtn: { classPropertyName: "centerBtn", publicName: "centerBtn", isSignal: true, isRequired: false, transformFunction: null }, danger: { classPropertyName: "danger", publicName: "danger", isSignal: true, isRequired: false, transformFunction: null }, warning: { classPropertyName: "warning", publicName: "warning", isSignal: true, isRequired: false, transformFunction: null }, verbose: { classPropertyName: "verbose", publicName: "verbose", isSignal: true, isRequired: false, transformFunction: null }, translatorOptions: { classPropertyName: "translatorOptions", publicName: "translatorOptions", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, _icon: { classPropertyName: "_icon", publicName: "icon", isSignal: false, isRequired: false, transformFunction: null }, _rightIcon: { classPropertyName: "_rightIcon", publicName: "rightIcon", isSignal: false, isRequired: false, transformFunction: null }, _leftIcon: { classPropertyName: "_leftIcon", publicName: "leftIcon", isSignal: false, isRequired: false, transformFunction: null }, _type: { classPropertyName: "_type", publicName: "type", isSignal: false, isRequired: false, transformFunction: null }, _group: { classPropertyName: "_group", publicName: "group", isSignal: false, isRequired: false, transformFunction: null }, actionType: { classPropertyName: "actionType", publicName: "actionType", isSignal: true, isRequired: false, transformFunction: null }, animate: { classPropertyName: "animate", publicName: "animate", isSignal: true, isRequired: false, transformFunction: null }, excludeLogging: { classPropertyName: "excludeLogging", publicName: "excludeLogging", isSignal: false, isRequired: false, transformFunction: booleanAttribute2 }, loggingValue: { classPropertyName: "loggingValue", publicName: "loggingValue", isSignal: false, isRequired: false, transformFunction: null }, badge: { classPropertyName: "badge", publicName: "badge", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, customIcon: { classPropertyName: "customIcon", publicName: "customIcon", isSignal: false, isRequired: false, transformFunction: null }, form: { classPropertyName: "form", publicName: "form", isSignal: true, isRequired: false, transformFunction: null }, forms: { classPropertyName: "forms", publicName: "forms", isSignal: true, isRequired: false, transformFunction: null }, help: { classPropertyName: "help", publicName: "help", isSignal: true, isRequired: false, transformFunction: null }, helpShowDelay: { classPropertyName: "helpShowDelay", publicName: "helpShowDelay", isSignal: true, isRequired: false, transformFunction: null }, _iconBtn: { classPropertyName: "_iconBtn", publicName: "iconBtn", isSignal: false, isRequired: false, transformFunction: booleanAttribute2 }, mclass: { classPropertyName: "mclass", publicName: "mclass", isSignal: true, isRequired: false, transformFunction: null }, showHelpIcon: { classPropertyName: "showHelpIcon", publicName: "showHelpIcon", isSignal: true, isRequired: false, transformFunction: null }, _rightCustomIcon: { classPropertyName: "_rightCustomIcon", publicName: "rightCustomIcon", isSignal: false, isRequired: false, transformFunction: null }, leftCustomIcon: { classPropertyName: "leftCustomIcon", publicName: "leftCustomIcon", isSignal: true, isRequired: false, transformFunction: null }, text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null }, valid: { classPropertyName: "valid", publicName: "valid", isSignal: true, isRequired: false, transformFunction: null }, mini: { classPropertyName: "mini", publicName: "mini", isSignal: true, isRequired: false, transformFunction: null }, onFormInvalid: { classPropertyName: "onFormInvalid", publicName: "onFormInvalid", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { loading: "loadingChange", leftCustomIcon: "leftCustomIconChange", mclick: "mclick", disabled: "disabledChange" }, viewQueries: [{ propertyName: "innerText", first: true, predicate: ["innerText"], descendants: true }], ngImport: i0, template: "@if (verbose()) {\n <div class=\"\">formState():{{ formState() | json }}</div>\n <div class=\"\">form():{{ form()?.getRawValue() | json }}</div>\n}\n<span\n class=\"{{ class() }} d-flex align-items-center justify-content-center\"\n [ngClass]=\"{ disabled: isDisabled(), mini: mini() }\"\n (click)=\"btnS.checkForm(this)\">\n @if (showHelpIcon() && help()) {\n <i\n class=\"fa fa-info-circle me-2 text-primary\"\n [matTooltipShowDelay]=\"helpShowDelay()\"\n [matTooltip]=\"help() | appTranslate: translatorOptions() | async\"></i>\n }\n <button\n type=\"{{ actionType() }}\"\n class=\"{{ mclass() }} {{ _mclass() || 'btn' }} d-flex align-items-center \"\n [matBadge]=\"badge()\"\n [ngClass]=\"ngClass()\"\n [disabled]=\"isDisabled()\"\n (click)=\"click($event)\"\n [matTooltipShowDelay]=\"helpShowDelay()\"\n [matTooltip]=\"showHelpIcon() ? null : (help() | appTranslate: translatorOptions() | async)\">\n @if (showLeftDisabledIcon()) {\n <fa-icon [icon]=\"lockedIcon()\" />\n } @else if (showLeftCustomIcon()) {\n <i class=\"{{ leftCustomIcon() }}\"></i>\n } @else if (showLeftIcon()) {\n <fa-icon [icon]=\"leftIcon()\" />\n }\n\n @if (computedText()) {\n <span\n class=\"\"\n [ngClass]=\"{\n 'ms-1': leftIcon() || leftCustomIcon(),\n 'me-1': rightIcon() || rightCustomIcon(),\n }\">\n {{ computedText() | appTranslate: translatorOptions() | async }}\n </span>\n } @else {\n <span\n class=\" \"\n [ngClass]=\"{\n 'ms-1': innerText.innerText && (leftIcon() || leftCustomIcon()),\n 'me-1': innerText.innerText && (rightIcon() || rightCustomIcon()),\n }\"\n #innerText\n [debug]=\"debug()\"\n appTranslator>\n <ng-content></ng-content>\n </span>\n }\n\n @if (loading()) {\n <span class=\"fa fa-spinner ms-{{ iconBtn() ? '' : '2' }} fa-spin\"></span>\n } @else if (showRightDisabledIcon()) {\n <fa-icon [icon]=\"lockedIcon()\" />\n } @else if (showRightCustomIcon()) {\n <i class=\"{{ rightCustomIcon() }}\"></i>\n } @else if (showRightIcon()) {\n <fa-icon [icon]=\"rightIcon()\" />\n }\n </button>\n</span>\n", styles: [".lite{padding:0}.disabled{cursor:not-allowed}.invalid{border:3px solid var(--bs-danger)}.mini button{height:auto!important;min-height:unset;padding:2px 5px}@keyframes animateDanger{0%{background-color:red;border-color:red;background-image:none;color:#fff}50%{background-color:red;border-color:red;background-image:none;color:#fff}}@keyframes animateWarning{0%{background-color:#ff8107;border-color:#ff8107;background-image:none;color:#000}50%{background-color:#ff8107;border-color:#ff8107;background-image:none;color:#000}}.isDanger{animation-name:animateDanger;animation-duration:1s;animation-iteration-count:infinite}.isWarning{animation-name:animateWarning;animation-duration:1s;animation-iteration-count:infinite}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "directive", type: i2.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i2$1.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"], outputs: ["iconChange", "titleChange", "animationChange", "maskChange", "flipChange", "sizeChange", "pullChange", "borderChange", "inverseChange", "symbolChange", "rotateChange", "fixedWidthChange", "transformChange", "a11yRoleChange"] }, { kind: "directive", type: TranslatorDirective, selector: "[appTranslator]", inputs: ["appTranslator", "debug", "translateOptions"] }, { kind: "pipe", type: JsonPipe, name: "json" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: SDKTranslatePipe, name: "appTranslate" }]
|
|
6129
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.4", type: BtnComponent, isStandalone: true, selector: "app-btn", inputs: { formSchema: { classPropertyName: "formSchema", publicName: "formSchema", isSignal: true, isRequired: false, transformFunction: null }, debug: { classPropertyName: "debug", publicName: "debug", isSignal: true, isRequired: false, transformFunction: null }, centerBtn: { classPropertyName: "centerBtn", publicName: "centerBtn", isSignal: true, isRequired: false, transformFunction: null }, danger: { classPropertyName: "danger", publicName: "danger", isSignal: true, isRequired: false, transformFunction: null }, warning: { classPropertyName: "warning", publicName: "warning", isSignal: true, isRequired: false, transformFunction: null }, verbose: { classPropertyName: "verbose", publicName: "verbose", isSignal: true, isRequired: false, transformFunction: null }, translatorOptions: { classPropertyName: "translatorOptions", publicName: "translatorOptions", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, _icon: { classPropertyName: "_icon", publicName: "icon", isSignal: false, isRequired: false, transformFunction: null }, _rightIcon: { classPropertyName: "_rightIcon", publicName: "rightIcon", isSignal: false, isRequired: false, transformFunction: null }, _leftIcon: { classPropertyName: "_leftIcon", publicName: "leftIcon", isSignal: false, isRequired: false, transformFunction: null }, _type: { classPropertyName: "_type", publicName: "type", isSignal: false, isRequired: false, transformFunction: null }, _group: { classPropertyName: "_group", publicName: "group", isSignal: false, isRequired: false, transformFunction: null }, actionType: { classPropertyName: "actionType", publicName: "actionType", isSignal: true, isRequired: false, transformFunction: null }, animate: { classPropertyName: "animate", publicName: "animate", isSignal: true, isRequired: false, transformFunction: null }, excludeLogging: { classPropertyName: "excludeLogging", publicName: "excludeLogging", isSignal: false, isRequired: false, transformFunction: booleanAttribute2 }, loggingValue: { classPropertyName: "loggingValue", publicName: "loggingValue", isSignal: false, isRequired: false, transformFunction: null }, badge: { classPropertyName: "badge", publicName: "badge", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, customIcon: { classPropertyName: "customIcon", publicName: "customIcon", isSignal: false, isRequired: false, transformFunction: null }, form: { classPropertyName: "form", publicName: "form", isSignal: true, isRequired: false, transformFunction: null }, forms: { classPropertyName: "forms", publicName: "forms", isSignal: true, isRequired: false, transformFunction: null }, help: { classPropertyName: "help", publicName: "help", isSignal: true, isRequired: false, transformFunction: null }, helpShowDelay: { classPropertyName: "helpShowDelay", publicName: "helpShowDelay", isSignal: true, isRequired: false, transformFunction: null }, _iconBtn: { classPropertyName: "_iconBtn", publicName: "iconBtn", isSignal: false, isRequired: false, transformFunction: booleanAttribute2 }, mclass: { classPropertyName: "mclass", publicName: "mclass", isSignal: true, isRequired: false, transformFunction: null }, showHelpIcon: { classPropertyName: "showHelpIcon", publicName: "showHelpIcon", isSignal: true, isRequired: false, transformFunction: null }, _rightCustomIcon: { classPropertyName: "_rightCustomIcon", publicName: "rightCustomIcon", isSignal: false, isRequired: false, transformFunction: null }, leftCustomIcon: { classPropertyName: "leftCustomIcon", publicName: "leftCustomIcon", isSignal: true, isRequired: false, transformFunction: null }, text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null }, valid: { classPropertyName: "valid", publicName: "valid", isSignal: true, isRequired: false, transformFunction: null }, mini: { classPropertyName: "mini", publicName: "mini", isSignal: true, isRequired: false, transformFunction: null }, onFormInvalid: { classPropertyName: "onFormInvalid", publicName: "onFormInvalid", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { loading: "loadingChange", leftCustomIcon: "leftCustomIconChange", mclick: "mclick", disabled: "disabledChange" }, viewQueries: [{ propertyName: "innerText", first: true, predicate: ["innerText"], descendants: true }], ngImport: i0, template: "@if (verbose()) {\n <div class=\"\">formState():{{ formState() | json }}</div>\n <div class=\"\">form():{{ form()?.getRawValue() | json }}</div>\n}\n<span\n class=\"{{ class() }} d-flex align-items-center justify-content-center\"\n [ngClass]=\"{ disabled: isDisabled(), mini: mini() }\"\n (click)=\"btnS.checkForm(this)\">\n @if (showHelpIcon() && help()) {\n <i\n class=\"fa fa-info-circle me-2 text-primary\"\n [matTooltipShowDelay]=\"helpShowDelay()\"\n [matTooltip]=\"help() | appTranslate: translatorOptions() | async\"></i>\n }\n <button\n type=\"{{ actionType() }}\"\n class=\"{{ mclass() }} {{ _mclass() || 'btn' }} d-flex align-items-center \"\n [matBadge]=\"badge()\"\n [ngClass]=\"ngClass()\"\n [disabled]=\"isDisabled()\"\n (click)=\"click($event)\"\n [matTooltipShowDelay]=\"helpShowDelay()\"\n [matTooltip]=\"showHelpIcon() ? null : (help() | appTranslate: translatorOptions() | async)\">\n @if (showLeftDisabledIcon()) {\n <fa-icon [icon]=\"lockedIcon()\" />\n } @else if (showLeftCustomIcon()) {\n <i class=\"{{ leftCustomIcon() }}\"></i>\n } @else if (showLeftIcon()) {\n <fa-icon [icon]=\"leftIcon()\" />\n }\n\n @if (computedText()) {\n <span\n class=\"\"\n [ngClass]=\"{\n 'ms-1': leftIcon() || leftCustomIcon(),\n 'me-1': rightIcon() || rightCustomIcon(),\n }\">\n {{ computedText() | appTranslate: translatorOptions() | async }}\n </span>\n } @else {\n <span\n class=\" \"\n [ngClass]=\"{\n 'ms-1': innerText.innerText && (leftIcon() || leftCustomIcon()),\n 'me-1': innerText.innerText && (rightIcon() || rightCustomIcon()),\n }\"\n #innerText\n [debug]=\"debug()\"\n appTranslator>\n <ng-content></ng-content>\n </span>\n }\n\n @if (loading()) {\n <span class=\"fa fa-spinner ms-{{ iconBtn() ? '' : '2' }} fa-spin\"></span>\n } @else if (showRightDisabledIcon()) {\n <fa-icon [icon]=\"lockedIcon()\" />\n } @else if (showRightCustomIcon()) {\n <i class=\"{{ rightCustomIcon() }}\"></i>\n } @else if (showRightIcon()) {\n <fa-icon [icon]=\"rightIcon()\" />\n }\n </button>\n</span>\n", styles: [".lite{padding:0}.disabled{cursor:not-allowed}.invalid{border:3px solid var(--bs-danger)}.mini button{height:auto!important;min-height:unset;padding:2px 5px}@keyframes animateDanger{0%{background-color:red;border-color:red;background-image:none;color:#fff}50%{background-color:red;border-color:red;background-image:none;color:#fff}}@keyframes animateWarning{0%{background-color:#ff8107;border-color:#ff8107;background-image:none;color:#000}50%{background-color:#ff8107;border-color:#ff8107;background-image:none;color:#000}}.isDanger{animation-name:animateDanger;animation-duration:1s;animation-iteration-count:infinite}.isWarning{animation-name:animateWarning;animation-duration:1s;animation-iteration-count:infinite}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "directive", type: i2.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i2$1.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"], outputs: ["iconChange", "titleChange", "animationChange", "maskChange", "flipChange", "sizeChange", "pullChange", "borderChange", "inverseChange", "symbolChange", "rotateChange", "fixedWidthChange", "transformChange", "a11yRoleChange"] }, { kind: "directive", type: TranslatorDirective, selector: "[appTranslator]", inputs: ["appTranslator", "debug", "translateOptions"] }, { kind: "pipe", type: JsonPipe, name: "json" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: SDKTranslatePipe, name: "appTranslate" }] }); }
|
|
6134
6130
|
}
|
|
6135
6131
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: BtnComponent, decorators: [{
|
|
6136
6132
|
type: Component,
|
|
6137
|
-
args: [{ selector: 'app-btn',
|
|
6133
|
+
args: [{ selector: 'app-btn', imports: [
|
|
6138
6134
|
NgClass,
|
|
6139
6135
|
MatTooltipModule,
|
|
6140
6136
|
MatBadgeModule,
|
|
@@ -8293,11 +8289,15 @@ class ValidationMessageComponent {
|
|
|
8293
8289
|
/** Computed control that resolves to either the direct control or the one from the input component */
|
|
8294
8290
|
this.computedControl = computed(() => this.control() || this.input()?.control(), ...(ngDevMode ? [{ debugName: "computedControl" }] : []));
|
|
8295
8291
|
/** Signal that notifies when the form field changes */
|
|
8296
|
-
this.
|
|
8297
|
-
|
|
8292
|
+
this.formEventsRes = rxResource({
|
|
8293
|
+
params: () => this.computedControl(),
|
|
8294
|
+
stream: (o) => o.params?.events,
|
|
8295
|
+
});
|
|
8296
|
+
this.formFieldNotifier = computed(() => {
|
|
8298
8297
|
if (this.debug())
|
|
8299
8298
|
debugger;
|
|
8300
|
-
|
|
8299
|
+
return this.formEventsRes.value();
|
|
8300
|
+
}, ...(ngDevMode ? [{ debugName: "formFieldNotifier" }] : []));
|
|
8301
8301
|
/** Computed minimum length from various sources */
|
|
8302
8302
|
this.minLength = computed(() => {
|
|
8303
8303
|
const t = this._minLength(), i = this.input()?.minLength(), i2 = this.input()?.minSignal();
|
|
@@ -8377,7 +8377,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImpor
|
|
|
8377
8377
|
SDKTranslatePipe,
|
|
8378
8378
|
forwardRef(() => ErrorMessagePipe),
|
|
8379
8379
|
MatTooltipModule,
|
|
8380
|
-
SDKTranslateNoLoaderPipe
|
|
8380
|
+
SDKTranslateNoLoaderPipe,
|
|
8381
8381
|
], template: "<div class=\"text-danger\" [class.applyMargin]=\"applyMargin()\" (click)=\"logErrors()\" [ngClass]=\"{ hideOverflow: hideOverflow() }\" #el>\n @for (error of computedErrors(); track error) {\n <div class=\"d-flex gap-1\">\n <i class=\"fa fa-info-circle\" aria-hidden=\"true\"></i>\n <span\n class=\"me-2 errormssg\"\n [matTooltip]=\"ele.innerText\"\n [matTooltipDisabled]=\"\n ele.scrollHeight <= ele.offsetHeight && ele.scrollWidth <= ele.offsetWidth\n \"\n [innerHTML]=\"error | appTranslateNL: translationConfig | async\"\n #ele></span>\n </div>\n }\n</div>\n", styles: [".text-danger{min-height:25px;position:relative}.applyMargin{margin-top:5px}.errormssg{display:flex;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%;font-size:.8rem}.hideOverflow{height:25px;overflow:hidden}\n"] }]
|
|
8382
8382
|
}] });
|
|
8383
8383
|
/**
|
|
@@ -10513,8 +10513,11 @@ class InputBase {
|
|
|
10513
10513
|
};
|
|
10514
10514
|
/** Observable of value changes from the control */
|
|
10515
10515
|
this.valueChanges = toObservable(this.control).pipe(startWith(this.control()), filter((c) => !!c), switchMap((c) => c?.valueChanges?.pipe(startWith(c?.getRawValue()), map$1(() => c?.getRawValue()))));
|
|
10516
|
-
this.
|
|
10517
|
-
|
|
10516
|
+
this.formChangedRes = rxResource({
|
|
10517
|
+
params: () => this.control(),
|
|
10518
|
+
stream: (o) => (o.params ? o.params.events?.pipe() : of(null)),
|
|
10519
|
+
});
|
|
10520
|
+
this.formFieldNotifier = computed(() => this.formChangedRes.value(), ...(ngDevMode ? [{ debugName: "formFieldNotifier" }] : []));
|
|
10518
10521
|
/** Signal for whether the input is valid */
|
|
10519
10522
|
this.validSignal = computed(() => {
|
|
10520
10523
|
this.formFieldNotifier();
|
|
@@ -17287,44 +17290,44 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImpor
|
|
|
17287
17290
|
* in nested form structures.
|
|
17288
17291
|
*/
|
|
17289
17292
|
class FormErrorComponent {
|
|
17290
|
-
// readonly errors = signal<{ formControl: AbstractControl; label: string; parent?: string }[]>([]);
|
|
17291
|
-
set form(v) {
|
|
17292
|
-
// debugger;
|
|
17293
|
-
this.sub?.clear();
|
|
17294
|
-
this.sub.push((Array.isArray(v)
|
|
17295
|
-
? merge(...v.map((f) => f.statusChanges)).pipe(debounceTime(600), map$1((formStatus) => {
|
|
17296
|
-
if (formStatus == 'INVALID' ||
|
|
17297
|
-
formStatus == 'PENDING' ||
|
|
17298
|
-
v.some((f) => f.status == 'INVALID' || f.status == 'PENDING'))
|
|
17299
|
-
return (uniqBy(v.flatMap((f) => this.getErrorMessages(f)), (i) => i.label) || []);
|
|
17300
|
-
else {
|
|
17301
|
-
return [];
|
|
17302
|
-
}
|
|
17303
|
-
}))
|
|
17304
|
-
: v.statusChanges.pipe(debounceTime(600), map$1((formStatus) => {
|
|
17305
|
-
if (v.status == 'INVALID' || v.status == 'PENDING')
|
|
17306
|
-
return this.getErrorMessages(v);
|
|
17307
|
-
else {
|
|
17308
|
-
return [];
|
|
17309
|
-
}
|
|
17310
|
-
}))).subscribe((r) => this.errors.set(r)));
|
|
17311
|
-
}
|
|
17312
17293
|
/**
|
|
17313
17294
|
* Creates an instance of FormErrorComponent.
|
|
17314
17295
|
* @param el Reference to the component's host element
|
|
17315
17296
|
* @param uS Utility service for formatting and other operations
|
|
17316
17297
|
* @param destroyerRef Reference for handling component destruction
|
|
17317
17298
|
*/
|
|
17318
|
-
constructor(el, uS
|
|
17299
|
+
constructor(el, uS) {
|
|
17319
17300
|
this.el = el;
|
|
17320
17301
|
this.uS = uS;
|
|
17321
|
-
|
|
17322
|
-
|
|
17323
|
-
this.
|
|
17302
|
+
// readonly errors = signal<{ formControl: AbstractControl; label: string; parent?: string }[]>([]);
|
|
17303
|
+
this.form = input(...(ngDevMode ? [undefined, { debugName: "form" }] : []));
|
|
17304
|
+
this.formErrorRes = rxResource({
|
|
17305
|
+
params: () => this.form(),
|
|
17306
|
+
stream: (o) => {
|
|
17307
|
+
const v = o.params;
|
|
17308
|
+
if (!v)
|
|
17309
|
+
return of(null);
|
|
17310
|
+
return Array.isArray(v)
|
|
17311
|
+
? merge(...v.map((f) => f.statusChanges)).pipe(debounceTime(600), map$1((formStatus) => {
|
|
17312
|
+
if (formStatus == 'INVALID' ||
|
|
17313
|
+
formStatus == 'PENDING' ||
|
|
17314
|
+
v.some((f) => f.status == 'INVALID' || f.status == 'PENDING'))
|
|
17315
|
+
return (uniqBy(v.flatMap((f) => this.getErrorMessages(f)), (i) => i.label) || []);
|
|
17316
|
+
else {
|
|
17317
|
+
return [];
|
|
17318
|
+
}
|
|
17319
|
+
}))
|
|
17320
|
+
: v.statusChanges.pipe(debounceTime(600), map$1((formStatus) => {
|
|
17321
|
+
if (v.status == 'INVALID' || v.status == 'PENDING')
|
|
17322
|
+
return this.getErrorMessages(v);
|
|
17323
|
+
else {
|
|
17324
|
+
return [];
|
|
17325
|
+
}
|
|
17326
|
+
}));
|
|
17327
|
+
},
|
|
17328
|
+
});
|
|
17324
17329
|
/** Signal containing all errors from the monitored form(s) */
|
|
17325
|
-
this.errors =
|
|
17326
|
-
/** Computed signal filtering to only invalid or pending form controls */
|
|
17327
|
-
this.cErrors = computed(() => this.errors()?.filter((x) => x.formControl.invalid || x.formControl.pending), ...(ngDevMode ? [{ debugName: "cErrors" }] : []));
|
|
17330
|
+
this.errors = computed(() => this.formErrorRes.value()?.filter((x) => x.formControl.invalid || x.formControl.pending), ...(ngDevMode ? [{ debugName: "errors" }] : []));
|
|
17328
17331
|
// protected form?: Form;
|
|
17329
17332
|
// protected forms?: Form[];
|
|
17330
17333
|
/** Input signal to enable custom result display */
|
|
@@ -17336,18 +17339,11 @@ class FormErrorComponent {
|
|
|
17336
17339
|
/** Input signal for extra-large grid column count */
|
|
17337
17340
|
this.xxlGridNo = input(3, ...(ngDevMode ? [{ debugName: "xxlGridNo" }] : []));
|
|
17338
17341
|
/** Computed signal indicating if any errors exist */
|
|
17339
|
-
this.hasError = computed(() => this.
|
|
17342
|
+
this.hasError = computed(() => this.errors()?.length > 0, ...(ngDevMode ? [{ debugName: "hasError" }] : []));
|
|
17340
17343
|
/** Reference to the result template */
|
|
17341
17344
|
this.resultTemplateRef = viewChild('resultTemplate', ...(ngDevMode ? [{ debugName: "resultTemplateRef" }] : []));
|
|
17342
17345
|
/** Reference to the error container element */
|
|
17343
17346
|
this.errContRef = viewChild('errCont', ...(ngDevMode ? [{ debugName: "errContRef" }] : []));
|
|
17344
|
-
// effect(() => {
|
|
17345
|
-
// console.log('errored forms', this.errors());
|
|
17346
|
-
// console.log('cErrored forms', this.cErrors());
|
|
17347
|
-
// });
|
|
17348
|
-
this.destroyerRef.onDestroy(() => {
|
|
17349
|
-
this.sub?.clear();
|
|
17350
|
-
});
|
|
17351
17347
|
}
|
|
17352
17348
|
/**
|
|
17353
17349
|
* Recursively collects error messages from a form or form control.
|
|
@@ -17399,8 +17395,8 @@ class FormErrorComponent {
|
|
|
17399
17395
|
errCont.scrollIntoView();
|
|
17400
17396
|
}, 500);
|
|
17401
17397
|
}
|
|
17402
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: FormErrorComponent, deps: [{ token: i0.ElementRef }, { token: UtilityService }
|
|
17403
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.4", type: FormErrorComponent, isStandalone: true, selector: "form-error", inputs: { form: { classPropertyName: "form", publicName: "form", isSignal:
|
|
17398
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: FormErrorComponent, deps: [{ token: i0.ElementRef }, { token: UtilityService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
17399
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.4", type: FormErrorComponent, isStandalone: true, selector: "form-error", inputs: { form: { classPropertyName: "form", publicName: "form", isSignal: true, isRequired: false, transformFunction: null }, customResult: { classPropertyName: "customResult", publicName: "customResult", isSignal: true, isRequired: false, transformFunction: null }, inline: { classPropertyName: "inline", publicName: "inline", isSignal: true, isRequired: false, transformFunction: null }, lgGridNo: { classPropertyName: "lgGridNo", publicName: "lgGridNo", isSignal: true, isRequired: false, transformFunction: null }, xxlGridNo: { classPropertyName: "xxlGridNo", publicName: "xxlGridNo", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "resultTemplateRef", first: true, predicate: ["resultTemplate"], descendants: true, isSignal: true }, { propertyName: "errContRef", first: true, predicate: ["errCont"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (hasError()) {\n <div class=\"d-flex justify-content-end\" [class.mt-2]=\"!inline()\">\n <app-btn\n text=\"Form Errors\"\n icon=\"info\"\n type=\"clear\"\n mclass=\"btn-outline-warning\"\n (mclick)=\"toggleErrors()\" />\n </div>\n}\n@if (!customResult()) {\n <ng-container *ngTemplateOutlet=\"resultTemplate\" />\n}\n<ng-template #resultTemplate>\n @if (hasError()) { \n <div class=\"border form-error-container p-3 mt-2\" #errCont [hidden]=\"true\">\n <div class=\"row row-cols-lg-{{ lgGridNo() }} row-cols-xxl-{{ xxlGridNo() }}\">\n @if (false) {\n <div class=\"col-lg-12 d-flex\">\n <div>\n <div class=\"pe-3\">{{ 'Form errors' | appTranslate | async }}</div>\n <!-- <hr class=\"my-0\"> -->\n </div>\n </div>\n }\n @for (item of errors(); track item.label + item.parent) {\n @if (item.formControl) {\n <div class=\"error-item-case\">\n @if (item.parent) {\n <app-info-icon text=\"Group: {{ item.parent }}\" />\n <!-- <div class=\"\" [matTooltip]=\"item.parent\">Parent</div> -->\n }\n <app-validation-message\n [label]=\"item.label | titlecase\"\n [ignoreDirtiness]=\"true\"\n [applyMargin]=\"false\"\n [control]=\"item.formControl\" />\n </div>\n }\n }\n </div>\n </div>\n }\n</ng-template>\n", styles: [":host ::ng-deep .errormssg{color:#870000}:host .form-error-container{border-radius:10px}:host app-info-icon{margin-right:5px;height:18px}:host app-info-icon ::ng-deep i{font-size:18px}:host .error-item-case{display:flex}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ValidationMessageComponent, selector: "app-validation-message", inputs: ["maxLength", "minLength", "control", "customMessage", "debug", "applyMargin", "ignoreDirtiness", "input", "label", "hideOverflow"], outputs: ["labelChange"] }, { kind: "component", type: BtnComponent, selector: "app-btn", inputs: ["formSchema", "debug", "centerBtn", "danger", "warning", "verbose", "translatorOptions", "loading", "icon", "rightIcon", "leftIcon", "type", "group", "actionType", "animate", "excludeLogging", "loggingValue", "badge", "class", "customIcon", "form", "forms", "help", "helpShowDelay", "iconBtn", "mclass", "showHelpIcon", "rightCustomIcon", "leftCustomIcon", "text", "valid", "mini", "onFormInvalid", "disabled"], outputs: ["loadingChange", "leftCustomIconChange", "mclick", "disabledChange"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "component", type: InfoIconComponent, selector: "app-info-icon", inputs: ["text", "coloured", "left", "right"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: SDKTranslatePipe, name: "appTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
17404
17400
|
}
|
|
17405
17401
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: FormErrorComponent, decorators: [{
|
|
17406
17402
|
type: Component,
|
|
@@ -17411,10 +17407,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImpor
|
|
|
17411
17407
|
BtnComponent,
|
|
17412
17408
|
MatTooltipModule,
|
|
17413
17409
|
InfoIconComponent,
|
|
17414
|
-
], template: "@if (hasError()) {\n <div class=\"d-flex justify-content-end\" [class.mt-2]=\"!inline()\">\n <app-btn\n text=\"Form Errors\"\n icon=\"info\"\n type=\"clear\"\n mclass=\"btn-outline-warning\"\n (mclick)=\"toggleErrors()\" />\n </div>\n}\n@if (!customResult()) {\n <ng-container *ngTemplateOutlet=\"resultTemplate\" />\n}\n<ng-template #resultTemplate>\n @if (hasError()) { \n <div class=\"border form-error-container p-3 mt-2\" #errCont [hidden]=\"true\">\n <div class=\"row row-cols-lg-{{ lgGridNo() }} row-cols-xxl-{{ xxlGridNo() }}\">\n @if (false) {\n <div class=\"col-lg-12 d-flex\">\n <div>\n <div class=\"pe-3\">{{ 'Form errors' | appTranslate | async }}</div>\n <!-- <hr class=\"my-0\"> -->\n </div>\n </div>\n }\n @for (item of
|
|
17415
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: UtilityService }
|
|
17416
|
-
type: Input
|
|
17417
|
-
}] } });
|
|
17410
|
+
], template: "@if (hasError()) {\n <div class=\"d-flex justify-content-end\" [class.mt-2]=\"!inline()\">\n <app-btn\n text=\"Form Errors\"\n icon=\"info\"\n type=\"clear\"\n mclass=\"btn-outline-warning\"\n (mclick)=\"toggleErrors()\" />\n </div>\n}\n@if (!customResult()) {\n <ng-container *ngTemplateOutlet=\"resultTemplate\" />\n}\n<ng-template #resultTemplate>\n @if (hasError()) { \n <div class=\"border form-error-container p-3 mt-2\" #errCont [hidden]=\"true\">\n <div class=\"row row-cols-lg-{{ lgGridNo() }} row-cols-xxl-{{ xxlGridNo() }}\">\n @if (false) {\n <div class=\"col-lg-12 d-flex\">\n <div>\n <div class=\"pe-3\">{{ 'Form errors' | appTranslate | async }}</div>\n <!-- <hr class=\"my-0\"> -->\n </div>\n </div>\n }\n @for (item of errors(); track item.label + item.parent) {\n @if (item.formControl) {\n <div class=\"error-item-case\">\n @if (item.parent) {\n <app-info-icon text=\"Group: {{ item.parent }}\" />\n <!-- <div class=\"\" [matTooltip]=\"item.parent\">Parent</div> -->\n }\n <app-validation-message\n [label]=\"item.label | titlecase\"\n [ignoreDirtiness]=\"true\"\n [applyMargin]=\"false\"\n [control]=\"item.formControl\" />\n </div>\n }\n }\n </div>\n </div>\n }\n</ng-template>\n", styles: [":host ::ng-deep .errormssg{color:#870000}:host .form-error-container{border-radius:10px}:host app-info-icon{margin-right:5px;height:18px}:host app-info-icon ::ng-deep i{font-size:18px}:host .error-item-case{display:flex}\n"] }]
|
|
17411
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: UtilityService }] });
|
|
17418
17412
|
/**
|
|
17419
17413
|
* Utility function to check if a control has validation errors.
|
|
17420
17414
|
* @param control The form control to check
|