@ng-forge/dynamic-forms 1.2.0-next.1 → 1.2.0-next.10
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/README.md +11 -11
- package/fesm2022/{ng-forge-dynamic-forms-array-field.component-BVnXnaNw.mjs → ng-forge-dynamic-forms-array-field.component-CSCKq_1K.mjs} +9 -13
- package/fesm2022/ng-forge-dynamic-forms-array-field.component-CSCKq_1K.mjs.map +1 -0
- package/fesm2022/{ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-CkqvXXs_.mjs → ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-CTOTwzzw.mjs} +29 -7
- package/fesm2022/ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-CTOTwzzw.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-bootstrap-web-mcp-BtjqeJOj.mjs +1054 -0
- package/fesm2022/ng-forge-dynamic-forms-bootstrap-web-mcp-BtjqeJOj.mjs.map +1 -0
- package/fesm2022/{ng-forge-dynamic-forms-container-field.component-CM1pY9v5.mjs → ng-forge-dynamic-forms-container-field.component-Dc3ROhHL.mjs} +14 -17
- package/fesm2022/ng-forge-dynamic-forms-container-field.component-Dc3ROhHL.mjs.map +1 -0
- package/fesm2022/{ng-forge-dynamic-forms-css-wrapper.component-D_yRuLpu.mjs → ng-forge-dynamic-forms-css-wrapper.component-BzgX8lAD.mjs} +5 -5
- package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-BzgX8lAD.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-debounce-C9F4v1Ke.mjs +17 -0
- package/fesm2022/ng-forge-dynamic-forms-debounce-C9F4v1Ke.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-field-errors-wrapper.component-CIKbWqYA.mjs +25 -0
- package/fesm2022/ng-forge-dynamic-forms-field-errors-wrapper.component-CIKbWqYA.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-form-schema.service-Dx5Dlb15.mjs +24 -0
- package/fesm2022/ng-forge-dynamic-forms-form-schema.service-Dx5Dlb15.mjs.map +1 -0
- package/fesm2022/{ng-forge-dynamic-forms-group-field.component-D4JhDffB.mjs → ng-forge-dynamic-forms-group-field.component-DAC3P9DC.mjs} +9 -13
- package/fesm2022/ng-forge-dynamic-forms-group-field.component-DAC3P9DC.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-integration.mjs +43 -105
- package/fesm2022/ng-forge-dynamic-forms-integration.mjs.map +1 -1
- package/fesm2022/ng-forge-dynamic-forms-internal.mjs +290 -116
- package/fesm2022/ng-forge-dynamic-forms-internal.mjs.map +1 -1
- package/fesm2022/{ng-forge-dynamic-forms-ng-forge-dynamic-forms-ZiNaCWHl.mjs → ng-forge-dynamic-forms-ng-forge-dynamic-forms-CXQe_5td.mjs} +1871 -1632
- package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-CXQe_5td.mjs.map +1 -0
- package/fesm2022/{ng-forge-dynamic-forms-page-field.component-Wbz6S8iH.mjs → ng-forge-dynamic-forms-page-field.component-DPKJcwUO.mjs} +57 -16
- package/fesm2022/ng-forge-dynamic-forms-page-field.component-DPKJcwUO.mjs.map +1 -0
- package/fesm2022/{ng-forge-dynamic-forms-row-wrapper.component-BBWmqQA_.mjs → ng-forge-dynamic-forms-row-wrapper.component-DMEeKZny.mjs} +5 -5
- package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-DMEeKZny.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-schema-builder-BvDTzfdM.mjs +570 -0
- package/fesm2022/ng-forge-dynamic-forms-schema-builder-BvDTzfdM.mjs.map +1 -0
- package/fesm2022/{ng-forge-dynamic-forms-text-field.component-C-f80sbk.mjs → ng-forge-dynamic-forms-text-field.component-BB-jutBq.mjs} +4 -4
- package/fesm2022/{ng-forge-dynamic-forms-text-field.component-C-f80sbk.mjs.map → ng-forge-dynamic-forms-text-field.component-BB-jutBq.mjs.map} +1 -1
- package/fesm2022/ng-forge-dynamic-forms.mjs +2 -2
- package/package.json +2 -2
- package/types/ng-forge-dynamic-forms-integration.d.ts +7 -31
- package/types/ng-forge-dynamic-forms-internal.d.ts +669 -308
- package/types/ng-forge-dynamic-forms.d.ts +287 -33
- package/fesm2022/ng-forge-dynamic-forms-array-field.component-BVnXnaNw.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-CkqvXXs_.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-container-field.component-CM1pY9v5.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-container-utils-BZFz6ztF.mjs +0 -24
- package/fesm2022/ng-forge-dynamic-forms-container-utils-BZFz6ztF.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-D_yRuLpu.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-emit-initialization-DhHwU6FJ.mjs +0 -17
- package/fesm2022/ng-forge-dynamic-forms-emit-initialization-DhHwU6FJ.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-group-field.component-D4JhDffB.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-ZiNaCWHl.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-page-field.component-Wbz6S8iH.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-BBWmqQA_.mjs.map +0 -1
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, computed, isSignal, inject, Injector, input, signal, ChangeDetectionStrategy, Component, untracked, Injectable, linkedSignal, resourceFromSnapshots, Pipe } from '@angular/core';
|
|
2
|
+
import { InjectionToken, computed, isSignal, inject, Injector, input, signal, ChangeDetectionStrategy, Component, untracked, Injectable, linkedSignal, resourceFromSnapshots, Pipe, viewChild, ViewContainerRef, Directive, forwardRef } from '@angular/core';
|
|
3
3
|
import { NgComponentOutlet } from '@angular/common';
|
|
4
4
|
import { explicitEffect } from 'ngxtension/explicit-effect';
|
|
5
5
|
import { toSignal, toObservable, rxResource } from '@angular/core/rxjs-interop';
|
|
6
6
|
import { isObservable, defer, combineLatest, pipe, debounceTime, distinctUntilChanged, map, tap, catchError, of, from, startWith, Subject, filter, TimeoutError, throwError } from 'rxjs';
|
|
7
7
|
import { HttpClient } from '@angular/common/http';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { switchMap, map as map$1, scan, filter as filter$1, take, timeout, catchError as catchError$1, shareReplay } from 'rxjs/operators';
|
|
9
|
+
import { email, min, max, minLength, maxLength, pattern, required, validateTree, validate, validateAsync, validateHttp } from '@angular/forms/signals';
|
|
10
10
|
|
|
11
11
|
const ADDON_TYPE_DEFINITIONS = new InjectionToken('ADDON_TYPE_DEFINITIONS');
|
|
12
12
|
|
|
@@ -155,14 +155,14 @@ class DfAddonSlot {
|
|
|
155
155
|
});
|
|
156
156
|
});
|
|
157
157
|
}
|
|
158
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
159
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.
|
|
158
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DfAddonSlot, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
159
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: DfAddonSlot, isStandalone: true, selector: "df-addon-slot", inputs: { addon: { classPropertyName: "addon", publicName: "addon", isSignal: true, isRequired: true, transformFunction: null }, fieldInputs: { classPropertyName: "fieldInputs", publicName: "fieldInputs", isSignal: true, isRequired: false, transformFunction: null }, hidden: { classPropertyName: "hidden", publicName: "hidden", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.slot": "slotAttr()", "class": "className()", "style.display": "isHidden() ? \"none\" : null" } }, ngImport: i0, template: `
|
|
160
160
|
@if (resolvedComponent(); as cmp) {
|
|
161
161
|
<ng-container *ngComponentOutlet="cmp; inputs: typeInputs()" />
|
|
162
162
|
}
|
|
163
163
|
`, isInline: true, dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
164
164
|
}
|
|
165
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
165
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DfAddonSlot, decorators: [{
|
|
166
166
|
type: Component,
|
|
167
167
|
args: [{
|
|
168
168
|
selector: 'df-addon-slot',
|
|
@@ -295,7 +295,11 @@ function hasTargetProperty(config) {
|
|
|
295
295
|
}
|
|
296
296
|
|
|
297
297
|
const FORM_VALUE_ACCESS_PATTERN = /\bformValue\s*(?:\.|\[)/;
|
|
298
|
-
const
|
|
298
|
+
const ID_START = String.raw `[\p{ID_Start}$_]`;
|
|
299
|
+
const ID_PART = String.raw `[\p{ID_Continue}$]`;
|
|
300
|
+
const DOTTED_PATH = String.raw `${ID_START}${ID_PART}*(?:\.${ID_START}${ID_PART}*)*`;
|
|
301
|
+
const BRACKET_KEY = String.raw `[\p{ID_Continue}$.\-]+`;
|
|
302
|
+
const FORM_VALUE_PATTERN = new RegExp(String.raw `\bformValue\s*(?:\.(${DOTTED_PATH})|\[\s*'(${BRACKET_KEY})'\s*\]|\[\s*"(${BRACKET_KEY})"\s*\])`, 'gu');
|
|
299
303
|
function isCrossFieldExpression(expr, context) {
|
|
300
304
|
if (expr === undefined || typeof expr === 'boolean' || isFormStateCondition(expr)) {
|
|
301
305
|
return false;
|
|
@@ -576,6 +580,8 @@ class ExpressionParserError extends DynamicFormError {
|
|
|
576
580
|
}
|
|
577
581
|
}
|
|
578
582
|
|
|
583
|
+
const IDENTIFIER_START = /[\p{ID_Start}$_]/u;
|
|
584
|
+
const IDENTIFIER_PART = /[\p{ID_Continue}$]/u;
|
|
579
585
|
class Tokenizer {
|
|
580
586
|
position = 0;
|
|
581
587
|
expression;
|
|
@@ -608,7 +614,7 @@ class Tokenizer {
|
|
|
608
614
|
if (/[0-9]/.test(char)) {
|
|
609
615
|
return this.readNumber();
|
|
610
616
|
}
|
|
611
|
-
if (
|
|
617
|
+
if (IDENTIFIER_START.test(this.codePointAt(this.position))) {
|
|
612
618
|
return this.readIdentifierOrKeyword();
|
|
613
619
|
}
|
|
614
620
|
return this.readOperatorOrPunctuation();
|
|
@@ -667,12 +673,20 @@ class Tokenizer {
|
|
|
667
673
|
readIdentifierOrKeyword() {
|
|
668
674
|
const start = this.position;
|
|
669
675
|
let value = '';
|
|
670
|
-
while (this.position < this.expression.length
|
|
671
|
-
|
|
672
|
-
|
|
676
|
+
while (this.position < this.expression.length) {
|
|
677
|
+
const char = this.codePointAt(this.position);
|
|
678
|
+
if (!IDENTIFIER_PART.test(char)) {
|
|
679
|
+
break;
|
|
680
|
+
}
|
|
681
|
+
value += char;
|
|
682
|
+
this.position += char.length;
|
|
673
683
|
}
|
|
674
684
|
const type = this.getKeywordType(value);
|
|
675
685
|
return { type, value, position: start };
|
|
686
|
+
}
|
|
687
|
+
codePointAt(position) {
|
|
688
|
+
const codePoint = this.expression.codePointAt(position);
|
|
689
|
+
return codePoint === undefined ? '' : String.fromCodePoint(codePoint);
|
|
676
690
|
}
|
|
677
691
|
getKeywordType(value) {
|
|
678
692
|
switch (value) {
|
|
@@ -1562,10 +1576,14 @@ function safeReadPathKeys(fieldContext) {
|
|
|
1562
1576
|
}
|
|
1563
1577
|
|
|
1564
1578
|
function createFieldValueProxy(getRootForm, getRootFormValue) {
|
|
1565
|
-
const
|
|
1579
|
+
const resolveAccessor = (key) => {
|
|
1566
1580
|
const root = getRootForm();
|
|
1567
1581
|
const accessor = root?.[key];
|
|
1568
|
-
|
|
1582
|
+
return typeof accessor === 'function' ? accessor : undefined;
|
|
1583
|
+
};
|
|
1584
|
+
const readField = (key) => {
|
|
1585
|
+
const accessor = resolveAccessor(key);
|
|
1586
|
+
if (accessor) {
|
|
1569
1587
|
const state = untracked(() => accessor());
|
|
1570
1588
|
const valueSig = state && state.value;
|
|
1571
1589
|
if (typeof valueSig === 'function') {
|
|
@@ -1584,8 +1602,7 @@ function createFieldValueProxy(getRootForm, getRootFormValue) {
|
|
|
1584
1602
|
has(_target, prop) {
|
|
1585
1603
|
if (typeof prop === 'symbol')
|
|
1586
1604
|
return false;
|
|
1587
|
-
|
|
1588
|
-
if (root && prop in root)
|
|
1605
|
+
if (resolveAccessor(prop))
|
|
1589
1606
|
return true;
|
|
1590
1607
|
return prop in getRootFormValue();
|
|
1591
1608
|
},
|
|
@@ -1887,10 +1904,10 @@ class FieldContextRegistryService {
|
|
|
1887
1904
|
},
|
|
1888
1905
|
};
|
|
1889
1906
|
}
|
|
1890
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
1891
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.
|
|
1907
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FieldContextRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1908
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FieldContextRegistryService });
|
|
1892
1909
|
}
|
|
1893
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
1910
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FieldContextRegistryService, decorators: [{
|
|
1894
1911
|
type: Injectable
|
|
1895
1912
|
}] });
|
|
1896
1913
|
|
|
@@ -2019,10 +2036,10 @@ class FunctionRegistryService {
|
|
|
2019
2036
|
this.clearAsyncValidators();
|
|
2020
2037
|
this.clearHttpValidators();
|
|
2021
2038
|
}
|
|
2022
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
2023
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.
|
|
2039
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FunctionRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
2040
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FunctionRegistryService });
|
|
2024
2041
|
}
|
|
2025
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
2042
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FunctionRegistryService, decorators: [{
|
|
2026
2043
|
type: Injectable
|
|
2027
2044
|
}] });
|
|
2028
2045
|
|
|
@@ -2648,6 +2665,187 @@ function injectNonFieldEvaluationContext(fieldDef, options = {}) {
|
|
|
2648
2665
|
};
|
|
2649
2666
|
}
|
|
2650
2667
|
|
|
2668
|
+
function dynamicTextToObservable(value, injector) {
|
|
2669
|
+
if (value === undefined) {
|
|
2670
|
+
return of('');
|
|
2671
|
+
}
|
|
2672
|
+
if (isObservable(value)) {
|
|
2673
|
+
return value;
|
|
2674
|
+
}
|
|
2675
|
+
if (isSignal(value)) {
|
|
2676
|
+
return untracked(() => toObservable(value, { injector }));
|
|
2677
|
+
}
|
|
2678
|
+
return of(String(value));
|
|
2679
|
+
}
|
|
2680
|
+
|
|
2681
|
+
const PLACEHOLDER_PATTERN = /\{\{([^{}]*)\}\}/g;
|
|
2682
|
+
function interpolateParams(message, error) {
|
|
2683
|
+
const params = extractErrorParams(error);
|
|
2684
|
+
return message.replace(PLACEHOLDER_PATTERN, (placeholder, rawKey) => {
|
|
2685
|
+
const key = rawKey.trim();
|
|
2686
|
+
return Object.hasOwn(params, key) ? safeToString(params[key]) : placeholder;
|
|
2687
|
+
});
|
|
2688
|
+
}
|
|
2689
|
+
function safeToString(value) {
|
|
2690
|
+
if (value === null || value === undefined) {
|
|
2691
|
+
return '';
|
|
2692
|
+
}
|
|
2693
|
+
if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
|
|
2694
|
+
return String(value);
|
|
2695
|
+
}
|
|
2696
|
+
if (value instanceof RegExp) {
|
|
2697
|
+
return value.toString();
|
|
2698
|
+
}
|
|
2699
|
+
if (value instanceof Date) {
|
|
2700
|
+
return value.toISOString();
|
|
2701
|
+
}
|
|
2702
|
+
if (Array.isArray(value)) {
|
|
2703
|
+
return value.join(', ');
|
|
2704
|
+
}
|
|
2705
|
+
try {
|
|
2706
|
+
if (typeof value === 'object' && value.toString !== Object.prototype.toString) {
|
|
2707
|
+
return value.toString();
|
|
2708
|
+
}
|
|
2709
|
+
return JSON.stringify(value);
|
|
2710
|
+
}
|
|
2711
|
+
catch {
|
|
2712
|
+
return '[object]';
|
|
2713
|
+
}
|
|
2714
|
+
}
|
|
2715
|
+
function extractErrorParams(error) {
|
|
2716
|
+
const params = {};
|
|
2717
|
+
if ('min' in error)
|
|
2718
|
+
params.min = error.min;
|
|
2719
|
+
if ('max' in error)
|
|
2720
|
+
params.max = error.max;
|
|
2721
|
+
if ('pattern' in error)
|
|
2722
|
+
params.pattern = error.pattern;
|
|
2723
|
+
if ('actual' in error)
|
|
2724
|
+
params.actual = error.actual;
|
|
2725
|
+
if ('expected' in error)
|
|
2726
|
+
params.expected = error.expected;
|
|
2727
|
+
if ('requiredLength' in error) {
|
|
2728
|
+
params.requiredLength = error.requiredLength;
|
|
2729
|
+
}
|
|
2730
|
+
else if ('minLength' in error) {
|
|
2731
|
+
params.requiredLength = error.minLength;
|
|
2732
|
+
params.minLength = error.minLength;
|
|
2733
|
+
}
|
|
2734
|
+
else if ('maxLength' in error) {
|
|
2735
|
+
params.requiredLength = error.maxLength;
|
|
2736
|
+
params.maxLength = error.maxLength;
|
|
2737
|
+
}
|
|
2738
|
+
if ('actualLength' in error)
|
|
2739
|
+
params.actualLength = error.actualLength;
|
|
2740
|
+
Object.keys(error).forEach((key) => {
|
|
2741
|
+
if (key !== 'kind' && !(key in params)) {
|
|
2742
|
+
params[key] = error[key];
|
|
2743
|
+
}
|
|
2744
|
+
});
|
|
2745
|
+
return params;
|
|
2746
|
+
}
|
|
2747
|
+
|
|
2748
|
+
function createResolvedErrorsSignal(field, validationMessages, defaultValidationMessages = signal(undefined), injector = inject(Injector)) {
|
|
2749
|
+
const logger = injector.get(DynamicFormLogger);
|
|
2750
|
+
const messages = computed(() => validationMessages() ?? {}, /* @ts-ignore */
|
|
2751
|
+
...(ngDevMode ? [{ debugName: "messages" }] : /* istanbul ignore next */ []));
|
|
2752
|
+
const defaultMessages = computed(() => defaultValidationMessages() ?? {}, /* @ts-ignore */
|
|
2753
|
+
...(ngDevMode ? [{ debugName: "defaultMessages" }] : /* istanbul ignore next */ []));
|
|
2754
|
+
const errors = computed(() => field()?.().errors() ?? [], /* @ts-ignore */
|
|
2755
|
+
...(ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []));
|
|
2756
|
+
const errors$ = toObservable(errors, { injector });
|
|
2757
|
+
const messages$ = toObservable(messages, { injector });
|
|
2758
|
+
const defaultMessages$ = toObservable(defaultMessages, { injector });
|
|
2759
|
+
const resolvedErrors$ = combineLatest([errors$, messages$, defaultMessages$]).pipe(switchMap(([currentErrors, msgs, defaultMsgs]) => {
|
|
2760
|
+
if (!currentErrors || currentErrors.length === 0) {
|
|
2761
|
+
return of([]);
|
|
2762
|
+
}
|
|
2763
|
+
const errorResolvers = currentErrors.map((error) => resolveErrorMessage(error, msgs, defaultMsgs, injector, logger));
|
|
2764
|
+
return errorResolvers.length > 0
|
|
2765
|
+
? combineLatest(errorResolvers).pipe(map$1((errors) => errors.filter((e) => e !== null)))
|
|
2766
|
+
: of([]);
|
|
2767
|
+
}));
|
|
2768
|
+
return toSignal(resolvedErrors$, { initialValue: [], injector });
|
|
2769
|
+
}
|
|
2770
|
+
function isMessageResolver(message) {
|
|
2771
|
+
return typeof message === 'function' && !isSignal(message);
|
|
2772
|
+
}
|
|
2773
|
+
function resolveMessageFunction(resolver, error, logger) {
|
|
2774
|
+
try {
|
|
2775
|
+
return resolver(error) ?? error.message ?? '';
|
|
2776
|
+
}
|
|
2777
|
+
catch (err) {
|
|
2778
|
+
logger.error(`Validation message resolver for error kind "${error.kind}" threw; falling back to error.message.`, err);
|
|
2779
|
+
return error.message ?? '';
|
|
2780
|
+
}
|
|
2781
|
+
}
|
|
2782
|
+
function resolveErrorMessage(error, fieldMessages, defaultMessages, injector, logger) {
|
|
2783
|
+
const fieldMessage = fieldMessages[error.kind];
|
|
2784
|
+
const defaultMessage = defaultMessages[error.kind];
|
|
2785
|
+
const messageToUse = fieldMessage ?? defaultMessage ?? error.message;
|
|
2786
|
+
if (!messageToUse) {
|
|
2787
|
+
logger.warn(`No validation message found for error kind "${error.kind}". ` +
|
|
2788
|
+
`Please provide a message via field-level validationMessages or form-level defaultValidationMessages.`);
|
|
2789
|
+
return of(null);
|
|
2790
|
+
}
|
|
2791
|
+
const isSchemaMessage = fieldMessage === undefined && defaultMessage === undefined;
|
|
2792
|
+
const messageText = isMessageResolver(messageToUse) ? resolveMessageFunction(messageToUse, error, logger) : messageToUse;
|
|
2793
|
+
const messageObservable = isSchemaMessage
|
|
2794
|
+
? of(messageToUse) : dynamicTextToObservable(messageText, injector);
|
|
2795
|
+
return messageObservable.pipe(map$1((msg) => ({
|
|
2796
|
+
kind: error.kind,
|
|
2797
|
+
message: interpolateParams(msg, error),
|
|
2798
|
+
})));
|
|
2799
|
+
}
|
|
2800
|
+
|
|
2801
|
+
function shouldShowErrors(field) {
|
|
2802
|
+
return computed(() => {
|
|
2803
|
+
const control = field()?.();
|
|
2804
|
+
if (!control)
|
|
2805
|
+
return false;
|
|
2806
|
+
return control.invalid() && control.touched() && control.errors().length > 0;
|
|
2807
|
+
});
|
|
2808
|
+
}
|
|
2809
|
+
|
|
2810
|
+
const FIELD_ERROR_DISPLAY = new InjectionToken('FIELD_ERROR_DISPLAY');
|
|
2811
|
+
function injectFieldErrors(options) {
|
|
2812
|
+
const injector = options.injector ?? inject(Injector);
|
|
2813
|
+
const defaultValidationMessages = inject(DEFAULT_VALIDATION_MESSAGES, { optional: true });
|
|
2814
|
+
const fieldSignalContext = inject(FIELD_SIGNAL_CONTEXT, { optional: true });
|
|
2815
|
+
const fieldState = computed(() => {
|
|
2816
|
+
const inputs = options.fieldInputs();
|
|
2817
|
+
if (!inputs)
|
|
2818
|
+
return undefined;
|
|
2819
|
+
if (inputs.field)
|
|
2820
|
+
return inputs.field;
|
|
2821
|
+
const parentTree = fieldSignalContext?.form;
|
|
2822
|
+
const node = inputs.key ? parentTree?.[inputs.key] : undefined;
|
|
2823
|
+
return node ? node() : undefined;
|
|
2824
|
+
}, /* @ts-ignore */
|
|
2825
|
+
...(ngDevMode ? [{ debugName: "fieldState" }] : /* istanbul ignore next */ []));
|
|
2826
|
+
const fieldTree = computed(() => {
|
|
2827
|
+
const state = fieldState();
|
|
2828
|
+
return state ? (() => state) : undefined;
|
|
2829
|
+
}, /* @ts-ignore */
|
|
2830
|
+
...(ngDevMode ? [{ debugName: "fieldTree" }] : /* istanbul ignore next */ []));
|
|
2831
|
+
const messages = computed(() => options.validationMessages?.() ?? options.fieldInputs()?.validationMessages, /* @ts-ignore */
|
|
2832
|
+
...(ngDevMode ? [{ debugName: "messages" }] : /* istanbul ignore next */ []));
|
|
2833
|
+
const errors = createResolvedErrorsSignal(fieldTree, messages, computed(() => defaultValidationMessages?.()), injector);
|
|
2834
|
+
const showErrors = shouldShowErrors(fieldTree);
|
|
2835
|
+
return {
|
|
2836
|
+
errors,
|
|
2837
|
+
showErrors,
|
|
2838
|
+
errorsToDisplay: computed(() => (showErrors() ? errors() : [])),
|
|
2839
|
+
errorId: computed(() => `${options.fieldInputs()?.key ?? ''}-error`),
|
|
2840
|
+
};
|
|
2841
|
+
}
|
|
2842
|
+
|
|
2843
|
+
function rowError(ctx, index, key, error) {
|
|
2844
|
+
const rows = ctx.fieldTree;
|
|
2845
|
+
const fieldTree = rows?.[index]?.[key];
|
|
2846
|
+
return fieldTree ? { ...error, fieldTree } : error;
|
|
2847
|
+
}
|
|
2848
|
+
|
|
2651
2849
|
function isFunctionHttpValidator(config) {
|
|
2652
2850
|
const c = config;
|
|
2653
2851
|
return typeof c.functionName === 'string' || (c.fn !== null && typeof c.fn === 'object');
|
|
@@ -2759,7 +2957,8 @@ function applyPatternValidator(path, value, expression, when) {
|
|
|
2759
2957
|
function createConditionalLogic(when) {
|
|
2760
2958
|
return when ? createLogicFunction(when) : undefined;
|
|
2761
2959
|
}
|
|
2762
|
-
function applyValidator(config,
|
|
2960
|
+
function applyValidator(config,
|
|
2961
|
+
fieldPath, attachment = 'field') {
|
|
2763
2962
|
const path = fieldPath;
|
|
2764
2963
|
switch (config.type) {
|
|
2765
2964
|
case 'required':
|
|
@@ -2806,7 +3005,7 @@ function applyValidator(config, fieldPath) {
|
|
|
2806
3005
|
}
|
|
2807
3006
|
break;
|
|
2808
3007
|
case 'custom':
|
|
2809
|
-
applyCustomValidator(config, path);
|
|
3008
|
+
applyCustomValidator(config, path, attachment);
|
|
2810
3009
|
break;
|
|
2811
3010
|
case 'async':
|
|
2812
3011
|
applyAsyncValidator(config, path);
|
|
@@ -2816,7 +3015,7 @@ function applyValidator(config, fieldPath) {
|
|
|
2816
3015
|
break;
|
|
2817
3016
|
}
|
|
2818
3017
|
}
|
|
2819
|
-
function applyCustomValidator(config, fieldPath) {
|
|
3018
|
+
function applyCustomValidator(config, fieldPath, attachment = 'field') {
|
|
2820
3019
|
let validatorFn;
|
|
2821
3020
|
if (config.expression) {
|
|
2822
3021
|
validatorFn = createExpressionValidator(config);
|
|
@@ -2828,11 +3027,16 @@ function applyCustomValidator(config, fieldPath) {
|
|
|
2828
3027
|
throw new DynamicFormError('Custom validator requires one of "expression", "functionName", or "fn".');
|
|
2829
3028
|
}
|
|
2830
3029
|
const whenLogic = createConditionalLogic(config.when);
|
|
2831
|
-
|
|
3030
|
+
const run = (ctx) => {
|
|
2832
3031
|
if (whenLogic && !whenLogic(ctx))
|
|
2833
3032
|
return null;
|
|
2834
3033
|
return validatorFn(ctx);
|
|
2835
|
-
}
|
|
3034
|
+
};
|
|
3035
|
+
if (attachment === 'tree') {
|
|
3036
|
+
validateTree(fieldPath, run);
|
|
3037
|
+
return;
|
|
3038
|
+
}
|
|
3039
|
+
validate(fieldPath, run);
|
|
2836
3040
|
}
|
|
2837
3041
|
function createFunctionValidator(config) {
|
|
2838
3042
|
const logger = inject(DynamicFormLogger);
|
|
@@ -2984,8 +3188,9 @@ function applyDeclarativeHttpValidator(config, fieldPath) {
|
|
|
2984
3188
|
},
|
|
2985
3189
|
});
|
|
2986
3190
|
}
|
|
2987
|
-
function applyValidators(configs,
|
|
2988
|
-
|
|
3191
|
+
function applyValidators(configs,
|
|
3192
|
+
fieldPath, attachment = 'field') {
|
|
3193
|
+
configs.forEach((config) => applyValidator(config, fieldPath, attachment));
|
|
2989
3194
|
}
|
|
2990
3195
|
|
|
2991
3196
|
function isCheckedField(field) {
|
|
@@ -3141,10 +3346,10 @@ class EventBus {
|
|
|
3141
3346
|
}
|
|
3142
3347
|
return this.pipeline$.pipe(filter((event) => event.type === eventType));
|
|
3143
3348
|
}
|
|
3144
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
3145
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.
|
|
3349
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EventBus, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
3350
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EventBus });
|
|
3146
3351
|
}
|
|
3147
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
3352
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EventBus, decorators: [{
|
|
3148
3353
|
type: Injectable
|
|
3149
3354
|
}] });
|
|
3150
3355
|
|
|
@@ -3358,6 +3563,10 @@ const WRAPPER_COMPONENT_CACHE = new InjectionToken('WRAPPER_COMPONENT_CACHE', {
|
|
|
3358
3563
|
providedIn: 'root',
|
|
3359
3564
|
factory: () => new Map(),
|
|
3360
3565
|
});
|
|
3566
|
+
const WRAPPER_COMPONENT_LOAD_CACHE = new InjectionToken('WRAPPER_COMPONENT_LOAD_CACHE', {
|
|
3567
|
+
providedIn: 'root',
|
|
3568
|
+
factory: () => new Map(),
|
|
3569
|
+
});
|
|
3361
3570
|
const WRAPPER_AUTO_ASSOCIATIONS = new InjectionToken('WRAPPER_AUTO_ASSOCIATIONS', {
|
|
3362
3571
|
providedIn: 'root',
|
|
3363
3572
|
factory: () => new Map(),
|
|
@@ -3471,28 +3680,15 @@ function isDisplayOnlyField(field) {
|
|
|
3471
3680
|
}
|
|
3472
3681
|
|
|
3473
3682
|
|
|
3474
|
-
function dynamicTextToObservable(value, injector) {
|
|
3475
|
-
if (value === undefined) {
|
|
3476
|
-
return of('');
|
|
3477
|
-
}
|
|
3478
|
-
if (isObservable(value)) {
|
|
3479
|
-
return value;
|
|
3480
|
-
}
|
|
3481
|
-
if (isSignal(value)) {
|
|
3482
|
-
return untracked(() => toObservable(value, { injector }));
|
|
3483
|
-
}
|
|
3484
|
-
return of(String(value));
|
|
3485
|
-
}
|
|
3486
|
-
|
|
3487
3683
|
class DynamicTextPipe {
|
|
3488
3684
|
injector = inject(Injector);
|
|
3489
3685
|
transform(value) {
|
|
3490
3686
|
return dynamicTextToObservable(value ?? undefined, this.injector);
|
|
3491
3687
|
}
|
|
3492
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
3493
|
-
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.
|
|
3688
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DynamicTextPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
3689
|
+
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.1.5", ngImport: i0, type: DynamicTextPipe, isStandalone: true, name: "dynamicText" });
|
|
3494
3690
|
}
|
|
3495
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
3691
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DynamicTextPipe, decorators: [{
|
|
3496
3692
|
type: Pipe,
|
|
3497
3693
|
args: [{
|
|
3498
3694
|
name: 'dynamicText',
|
|
@@ -3545,75 +3741,15 @@ function setupInitializationTracking(options) {
|
|
|
3545
3741
|
}), shareReplay({ bufferSize: 1, refCount: false }));
|
|
3546
3742
|
}
|
|
3547
3743
|
|
|
3548
|
-
function interpolateParams(message, error) {
|
|
3549
|
-
let result = message;
|
|
3550
|
-
const params = extractErrorParams(error);
|
|
3551
|
-
Object.entries(params).forEach(([key, value]) => {
|
|
3552
|
-
const placeholder = new RegExp(`{{\\s*${key}\\s*}}`, 'g');
|
|
3553
|
-
result = result.replace(placeholder, safeToString(value));
|
|
3554
|
-
});
|
|
3555
|
-
return result;
|
|
3556
|
-
}
|
|
3557
|
-
function safeToString(value) {
|
|
3558
|
-
if (value === null || value === undefined) {
|
|
3559
|
-
return '';
|
|
3560
|
-
}
|
|
3561
|
-
if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
|
|
3562
|
-
return String(value);
|
|
3563
|
-
}
|
|
3564
|
-
if (value instanceof RegExp) {
|
|
3565
|
-
return value.toString();
|
|
3566
|
-
}
|
|
3567
|
-
if (value instanceof Date) {
|
|
3568
|
-
return value.toISOString();
|
|
3569
|
-
}
|
|
3570
|
-
if (Array.isArray(value)) {
|
|
3571
|
-
return value.join(', ');
|
|
3572
|
-
}
|
|
3573
|
-
try {
|
|
3574
|
-
if (typeof value === 'object' && value.toString !== Object.prototype.toString) {
|
|
3575
|
-
return value.toString();
|
|
3576
|
-
}
|
|
3577
|
-
return JSON.stringify(value);
|
|
3578
|
-
}
|
|
3579
|
-
catch {
|
|
3580
|
-
return '[object]';
|
|
3581
|
-
}
|
|
3582
|
-
}
|
|
3583
|
-
function extractErrorParams(error) {
|
|
3584
|
-
const params = {};
|
|
3585
|
-
if ('min' in error)
|
|
3586
|
-
params.min = error.min;
|
|
3587
|
-
if ('max' in error)
|
|
3588
|
-
params.max = error.max;
|
|
3589
|
-
if ('pattern' in error)
|
|
3590
|
-
params.pattern = error.pattern;
|
|
3591
|
-
if ('actual' in error)
|
|
3592
|
-
params.actual = error.actual;
|
|
3593
|
-
if ('expected' in error)
|
|
3594
|
-
params.expected = error.expected;
|
|
3595
|
-
if ('requiredLength' in error) {
|
|
3596
|
-
params.requiredLength = error.requiredLength;
|
|
3597
|
-
}
|
|
3598
|
-
else if ('minLength' in error) {
|
|
3599
|
-
params.requiredLength = error.minLength;
|
|
3600
|
-
params.minLength = error.minLength;
|
|
3601
|
-
}
|
|
3602
|
-
else if ('maxLength' in error) {
|
|
3603
|
-
params.requiredLength = error.maxLength;
|
|
3604
|
-
params.maxLength = error.maxLength;
|
|
3605
|
-
}
|
|
3606
|
-
if ('actualLength' in error)
|
|
3607
|
-
params.actualLength = error.actualLength;
|
|
3608
|
-
Object.keys(error).forEach((key) => {
|
|
3609
|
-
if (key !== 'kind' && !(key in params)) {
|
|
3610
|
-
params[key] = error[key];
|
|
3611
|
-
}
|
|
3612
|
-
});
|
|
3613
|
-
return params;
|
|
3614
|
-
}
|
|
3615
|
-
|
|
3616
3744
|
function isEqual(a, b) {
|
|
3745
|
+
if (a === b)
|
|
3746
|
+
return true;
|
|
3747
|
+
if (typeof a === 'number' && typeof b === 'number')
|
|
3748
|
+
return Object.is(a, b);
|
|
3749
|
+
if (a == null || b == null)
|
|
3750
|
+
return false;
|
|
3751
|
+
if (typeof a !== 'object' || typeof b !== 'object')
|
|
3752
|
+
return Object.is(a, b);
|
|
3617
3753
|
return isEqualInternal(a, b, new WeakMap(), new WeakMap());
|
|
3618
3754
|
}
|
|
3619
3755
|
function isEqualInternal(a, b, seenA, seenB) {
|
|
@@ -3775,6 +3911,22 @@ function memoize(fn, resolverOrOptions) {
|
|
|
3775
3911
|
function normalizeFieldsArray(fields) {
|
|
3776
3912
|
return Array.isArray(fields) ? [...fields] : Object.values(fields);
|
|
3777
3913
|
}
|
|
3914
|
+
function getChangedKeysWithin(previous, current, keys) {
|
|
3915
|
+
const changed = new Set();
|
|
3916
|
+
if (keys.size === 0)
|
|
3917
|
+
return changed;
|
|
3918
|
+
const before = previous ?? {};
|
|
3919
|
+
const after = current ?? {};
|
|
3920
|
+
for (const key of keys) {
|
|
3921
|
+
const inBefore = key in before;
|
|
3922
|
+
const inAfter = key in after;
|
|
3923
|
+
if (!inBefore && !inAfter)
|
|
3924
|
+
continue;
|
|
3925
|
+
if (inBefore !== inAfter || !isEqual(before[key], after[key]))
|
|
3926
|
+
changed.add(key);
|
|
3927
|
+
}
|
|
3928
|
+
return changed;
|
|
3929
|
+
}
|
|
3778
3930
|
function getChangedKeys(previous, current) {
|
|
3779
3931
|
const changedKeys = new Set();
|
|
3780
3932
|
if (!previous && !current)
|
|
@@ -3807,7 +3959,29 @@ function createWarningTracker() {
|
|
|
3807
3959
|
return { warnedKeys: new Set() };
|
|
3808
3960
|
}
|
|
3809
3961
|
|
|
3962
|
+
class FieldErrorsWrapperBase {
|
|
3963
|
+
fieldComponent = viewChild.required('fieldComponent', { ...(ngDevMode ? { debugName: "fieldComponent" } : /* istanbul ignore next */ {}), read: ViewContainerRef });
|
|
3964
|
+
validationMessages = input(/* @ts-ignore */
|
|
3965
|
+
...(ngDevMode ? [undefined, { debugName: "validationMessages" }] : /* istanbul ignore next */ []));
|
|
3966
|
+
fieldInputs = input(/* @ts-ignore */
|
|
3967
|
+
...(ngDevMode ? [undefined, { debugName: "fieldInputs" }] : /* istanbul ignore next */ []));
|
|
3968
|
+
claimedKey = computed(() => this.fieldInputs()?.key, /* @ts-ignore */
|
|
3969
|
+
...(ngDevMode ? [{ debugName: "claimedKey" }] : /* istanbul ignore next */ []));
|
|
3970
|
+
ngf = injectFieldErrors({
|
|
3971
|
+
fieldInputs: this.fieldInputs,
|
|
3972
|
+
validationMessages: this.validationMessages,
|
|
3973
|
+
});
|
|
3974
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FieldErrorsWrapperBase, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
3975
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "22.1.5", type: FieldErrorsWrapperBase, isStandalone: true, inputs: { validationMessages: { classPropertyName: "validationMessages", publicName: "validationMessages", isSignal: true, isRequired: false, transformFunction: null }, fieldInputs: { classPropertyName: "fieldInputs", publicName: "fieldInputs", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "fieldComponent", first: true, predicate: ["fieldComponent"], descendants: true, read: ViewContainerRef, isSignal: true }], ngImport: i0 });
|
|
3976
|
+
}
|
|
3977
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FieldErrorsWrapperBase, decorators: [{
|
|
3978
|
+
type: Directive
|
|
3979
|
+
}], propDecorators: { fieldComponent: [{ type: i0.ViewChild, args: ['fieldComponent', { ...{ read: ViewContainerRef }, isSignal: true }] }], validationMessages: [{ type: i0.Input, args: [{ isSignal: true, alias: "validationMessages", required: false }] }], fieldInputs: [{ type: i0.Input, args: [{ isSignal: true, alias: "fieldInputs", required: false }] }] } });
|
|
3980
|
+
function provideFieldErrorDisplay(wrapper) {
|
|
3981
|
+
return { provide: FIELD_ERROR_DISPLAY, useExisting: forwardRef(wrapper) };
|
|
3982
|
+
}
|
|
3983
|
+
|
|
3810
3984
|
|
|
3811
3985
|
|
|
3812
|
-
export { ADDON_ACTION_HANDLERS, ADDON_ACTION_REGISTRY, ADDON_TYPE_COMPONENT_CACHE, ADDON_TYPE_DEFINITIONS, ADDON_TYPE_REGISTRY, ARRAY_CONTEXT, AsyncConditionFunctionCacheService, ComponentInitializedEvent, DEFAULT_PROPS, DEFAULT_VALIDATION_MESSAGES, DEFAULT_WRAPPERS, DEPRECATION_WARNING_TRACKER, DF_FIELD_TEMPLATES, DfAddonSlot, DynamicFormError, DynamicFormLogger, DynamicTextPipe, DynamicValueFunctionCacheService, EMIT_FORM_VALUE_ON_EVENTS, EXTERNAL_DATA, EventBus, ExpressionParser, ExpressionParserError, FIELD_REGISTRY, FIELD_SIGNAL_CONTEXT, FORM_ID_PREFIX, FORM_OPTIONS, FieldContextRegistryService, FunctionRegistryService, GROUP_CONTEXT, HTTP_CONDITION_CACHE, HttpConditionCache, HttpConditionFunctionCacheService, INITIALIZATION_TIMEOUT_MS, LogicFunctionCacheService, NoopLogger, READONLY_FIELD_TREE_CACHE, RootFormRegistryService, TokenType, WRAPPER_AUTO_ASSOCIATIONS, WRAPPER_COMPONENT_CACHE, WRAPPER_REGISTRY, applyMetaToElement, applyValidator, applyValidators, arrayFieldMapper, assertNever, baseFieldMapper, buildBaseInputs, buildClassName, compareValues, containerFieldMapper, createAddonActionRegistry, createDebouncedLogicFunction, createDefaultDerivationLogConfig, createDynamicValueFunction, createFieldValueProxy, createFormFieldStateMap, createFormStateLogicFunction, createInitializationTracker, createLogicFunction, createWarningTracker, deepMergeDefaults, derivedFromDeferred, detectFormMode, dynamicTextToObservable, evaluateCondition, evaluateNonFieldDisabled, evaluateNonFieldHidden, extractExpressionDependencies, extractStringDependencies, getArrayLength, getChangedKeys, getFieldValueHandling, getGridClassString, getNestedValue, groupFieldMapper, hasChildFields, hasCrossFieldWhenCondition, hasFormValue, hasNestedProperty, hasTargetProperty, injectAddonTypeRegistry, injectFieldSignalContext, injectFieldsSupportingAddons, injectNonFieldEvaluationContext, interpolateParams, isArrayField, isCheckedField, isContainerField, isCrossFieldBuiltInValidator, isCrossFieldExpression, isCrossFieldSchema, isCrossFieldStateLogic, isCrossFieldValidator, isDerivationLogicConfig, isDisplayOnlyField, isEqual, isFieldBoundContext, isFormStateCondition, isFunctionHttpValidator, isGenericContainerField, isGroupField, isHiddenField, isLeafField, isNonPagedForm, isPageField, isPagedForm, isResourceBasedValidator, isRowField, isSimplifiedArrayField, isStateLogicConfig, isValidNonPagedForm, isValidPagedForm, isValueBearingField, isValueField, isWrapperTypeDefinition, keyBy, mapValues, memoize, normalizeFieldsArray, omit, pageFieldMapper, readFieldStateInfo, resolveDynamicValue, resolveHttpRequest, resolveNextButtonDisabled, resolveNonFieldDisabled, resolveNonFieldHidden, resolveSubmitButtonDisabled, resolveTokens, rowFieldMapper, runPresetAction, setupInitializationTracking, shouldLog, textFieldMapper, toReadonlyFieldTree, toReadonlyFieldTreeCached, validatePageNesting, withPreviousValue, writeToFieldValue };
|
|
3986
|
+
export { ADDON_ACTION_HANDLERS, ADDON_ACTION_REGISTRY, ADDON_TYPE_COMPONENT_CACHE, ADDON_TYPE_DEFINITIONS, ADDON_TYPE_REGISTRY, ARRAY_CONTEXT, AsyncConditionFunctionCacheService, ComponentInitializedEvent, DEFAULT_PROPS, DEFAULT_VALIDATION_MESSAGES, DEFAULT_WRAPPERS, DEPRECATION_WARNING_TRACKER, DF_FIELD_TEMPLATES, DfAddonSlot, DynamicFormError, DynamicFormLogger, DynamicTextPipe, DynamicValueFunctionCacheService, EMIT_FORM_VALUE_ON_EVENTS, EXTERNAL_DATA, EventBus, ExpressionParser, ExpressionParserError, FIELD_ERROR_DISPLAY, FIELD_REGISTRY, FIELD_SIGNAL_CONTEXT, FORM_ID_PREFIX, FORM_OPTIONS, FieldContextRegistryService, FieldErrorsWrapperBase, FunctionRegistryService, GROUP_CONTEXT, HTTP_CONDITION_CACHE, HttpConditionCache, HttpConditionFunctionCacheService, INITIALIZATION_TIMEOUT_MS, LogicFunctionCacheService, NoopLogger, READONLY_FIELD_TREE_CACHE, RootFormRegistryService, TokenType, WRAPPER_AUTO_ASSOCIATIONS, WRAPPER_COMPONENT_CACHE, WRAPPER_COMPONENT_LOAD_CACHE, WRAPPER_REGISTRY, applyMetaToElement, applyValidator, applyValidators, arrayFieldMapper, assertNever, baseFieldMapper, buildBaseInputs, buildClassName, compareValues, containerFieldMapper, createAddonActionRegistry, createDebouncedLogicFunction, createDefaultDerivationLogConfig, createDynamicValueFunction, createFieldValueProxy, createFormFieldStateMap, createFormStateLogicFunction, createInitializationTracker, createLogicFunction, createResolvedErrorsSignal, createWarningTracker, deepMergeDefaults, derivedFromDeferred, detectFormMode, dynamicTextToObservable, evaluateCondition, evaluateNonFieldDisabled, evaluateNonFieldHidden, extractExpressionDependencies, extractStringDependencies, getArrayLength, getChangedKeys, getChangedKeysWithin, getFieldValueHandling, getGridClassString, getNestedValue, groupFieldMapper, hasChildFields, hasCrossFieldWhenCondition, hasFormValue, hasNestedProperty, hasTargetProperty, injectAddonTypeRegistry, injectFieldErrors, injectFieldSignalContext, injectFieldsSupportingAddons, injectNonFieldEvaluationContext, interpolateParams, isArrayField, isCheckedField, isContainerField, isCrossFieldBuiltInValidator, isCrossFieldExpression, isCrossFieldSchema, isCrossFieldStateLogic, isCrossFieldValidator, isDerivationLogicConfig, isDisplayOnlyField, isEqual, isFieldBoundContext, isFormStateCondition, isFunctionHttpValidator, isGenericContainerField, isGroupField, isHiddenField, isLeafField, isNonPagedForm, isPageField, isPagedForm, isResourceBasedValidator, isRowField, isSimplifiedArrayField, isStateLogicConfig, isValidNonPagedForm, isValidPagedForm, isValueBearingField, isValueField, isWrapperTypeDefinition, keyBy, mapValues, memoize, normalizeFieldsArray, omit, pageFieldMapper, provideFieldErrorDisplay, readFieldStateInfo, resolveDynamicValue, resolveHttpRequest, resolveNextButtonDisabled, resolveNonFieldDisabled, resolveNonFieldHidden, resolveSubmitButtonDisabled, resolveTokens, rowError, rowFieldMapper, runPresetAction, setupInitializationTracking, shouldLog, shouldShowErrors, textFieldMapper, toReadonlyFieldTree, toReadonlyFieldTreeCached, validatePageNesting, withPreviousValue, writeToFieldValue };
|
|
3813
3987
|
//# sourceMappingURL=ng-forge-dynamic-forms-internal.mjs.map
|