@ng-forge/dynamic-forms 0.9.0-next.12 → 0.9.0-next.14
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/{ng-forge-dynamic-forms-array-field.component-BgCrTME1.mjs → ng-forge-dynamic-forms-array-field.component-Tw49K5kz.mjs} +9 -9
- package/fesm2022/ng-forge-dynamic-forms-array-field.component-Tw49K5kz.mjs.map +1 -0
- package/fesm2022/{ng-forge-dynamic-forms-container-field.component-VHaBk_1l.mjs → ng-forge-dynamic-forms-container-field.component-CrOIZEL_.mjs} +6 -6
- package/fesm2022/{ng-forge-dynamic-forms-container-field.component-VHaBk_1l.mjs.map → ng-forge-dynamic-forms-container-field.component-CrOIZEL_.mjs.map} +1 -1
- package/fesm2022/{ng-forge-dynamic-forms-container-utils-CGJiiKBY.mjs → ng-forge-dynamic-forms-container-utils-Bx1A5tg-.mjs} +2 -2
- package/fesm2022/{ng-forge-dynamic-forms-container-utils-CGJiiKBY.mjs.map → ng-forge-dynamic-forms-container-utils-Bx1A5tg-.mjs.map} +1 -1
- package/fesm2022/{ng-forge-dynamic-forms-css-wrapper.component-BOdw40ZF.mjs → ng-forge-dynamic-forms-css-wrapper.component-Q2g56KUM.mjs} +5 -5
- package/fesm2022/{ng-forge-dynamic-forms-css-wrapper.component-BOdw40ZF.mjs.map → ng-forge-dynamic-forms-css-wrapper.component-Q2g56KUM.mjs.map} +1 -1
- package/fesm2022/{ng-forge-dynamic-forms-emit-initialization-D72mQxlX.mjs → ng-forge-dynamic-forms-emit-initialization-9l5gPNQc.mjs} +2 -2
- package/fesm2022/{ng-forge-dynamic-forms-emit-initialization-D72mQxlX.mjs.map → ng-forge-dynamic-forms-emit-initialization-9l5gPNQc.mjs.map} +1 -1
- package/fesm2022/{ng-forge-dynamic-forms-group-field.component-BvTQwoLg.mjs → ng-forge-dynamic-forms-group-field.component-DqnhddRH.mjs} +9 -9
- package/fesm2022/ng-forge-dynamic-forms-group-field.component-DqnhddRH.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-integration.mjs +334 -27
- package/fesm2022/ng-forge-dynamic-forms-integration.mjs.map +1 -1
- package/fesm2022/{ng-forge-dynamic-forms-ng-forge-dynamic-forms-BAPGCjUs.mjs → ng-forge-dynamic-forms-ng-forge-dynamic-forms-Be1Lk0qR.mjs} +1558 -172
- package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-Be1Lk0qR.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-page-field.component-n4KTMOTm.mjs +114 -0
- package/fesm2022/{ng-forge-dynamic-forms-page-field.component-DDzmhJNn.mjs.map → ng-forge-dynamic-forms-page-field.component-n4KTMOTm.mjs.map} +1 -1
- package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-CFtnatYj.mjs +34 -0
- package/fesm2022/{ng-forge-dynamic-forms-row-wrapper.component-BIvEUoia.mjs.map → ng-forge-dynamic-forms-row-wrapper.component-CFtnatYj.mjs.map} +1 -1
- package/fesm2022/{ng-forge-dynamic-forms-text-field.component-Bo4zNJXY.mjs → ng-forge-dynamic-forms-text-field.component-C14mlROS.mjs} +5 -5
- package/fesm2022/{ng-forge-dynamic-forms-text-field.component-Bo4zNJXY.mjs.map → ng-forge-dynamic-forms-text-field.component-C14mlROS.mjs.map} +1 -1
- package/fesm2022/ng-forge-dynamic-forms.mjs +1 -1
- package/package.json +1 -1
- package/types/ng-forge-dynamic-forms-integration.d.ts +244 -40
- package/types/ng-forge-dynamic-forms.d.ts +1719 -545
- package/fesm2022/ng-forge-dynamic-forms-array-field.component-BgCrTME1.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-group-field.component-BvTQwoLg.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-BAPGCjUs.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-page-field.component-DDzmhJNn.mjs +0 -114
- package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-BIvEUoia.mjs +0 -34
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, computed, signal, Injector, isDevMode, afterRenderEffect, input, Directive, untracked, ElementRef, EnvironmentInjector, runInInjectionContext } from '@angular/core';
|
|
3
|
-
import {
|
|
2
|
+
import { inject, computed, signal, Injector, isDevMode, afterRenderEffect, input, Directive, untracked, InjectionToken, ElementRef, EnvironmentInjector, runInInjectionContext } from '@angular/core';
|
|
3
|
+
import { injectFieldSignalContext, omit, buildBaseInputs, DEFAULT_PROPS, resolveNonFieldHidden, resolveNonFieldDisabled, RootFormRegistryService, ARRAY_CONTEXT, DynamicFormLogger, AppendArrayItemEvent, PrependArrayItemEvent, InsertArrayItemEvent, RemoveAtIndexEvent, PopArrayItemEvent, ShiftArrayItemEvent, FORM_OPTIONS, resolveSubmitButtonDisabled, resolveNextButtonDisabled, NextPageEvent, PreviousPageEvent, dynamicTextToObservable, interpolateParams, isEqual, applyMetaToElement, DEFAULT_VALIDATION_MESSAGES, EventBus, resolveTokens, resolveDynamicValue, ADDON_ACTION_REGISTRY, writeToFieldValue } from '@ng-forge/dynamic-forms';
|
|
4
4
|
export { createWrappers, isEqual, isWrappersBundle, resolveNonFieldDisabled, resolveNonFieldHidden, wrapperProps } from '@ng-forge/dynamic-forms';
|
|
5
5
|
import { toObservable, toSignal } from '@angular/core/rxjs-interop';
|
|
6
6
|
import { combineLatest, of } from 'rxjs';
|
|
7
7
|
import { switchMap, map } from 'rxjs/operators';
|
|
8
|
+
import { explicitEffect } from 'ngxtension/explicit-effect';
|
|
8
9
|
import { TestBed } from '@angular/core/testing';
|
|
9
10
|
import { form, schema } from '@angular/forms/signals';
|
|
10
11
|
|
|
@@ -23,7 +24,7 @@ import { form, schema } from '@angular/forms/signals';
|
|
|
23
24
|
* @returns The value field context with reactive field tree accessor
|
|
24
25
|
*/
|
|
25
26
|
function resolveValueFieldContext() {
|
|
26
|
-
const context =
|
|
27
|
+
const context = injectFieldSignalContext();
|
|
27
28
|
return {
|
|
28
29
|
getFieldTree: (fieldKey) => {
|
|
29
30
|
// Access context.form here (inside a function that will be called from a computed)
|
|
@@ -110,7 +111,7 @@ function valueFieldMapper(fieldDef) {
|
|
|
110
111
|
* @returns Signal containing Record of input names to values for ngComponentOutlet
|
|
111
112
|
*/
|
|
112
113
|
function checkboxFieldMapper(fieldDef) {
|
|
113
|
-
const context =
|
|
114
|
+
const context = injectFieldSignalContext();
|
|
114
115
|
const defaultProps = inject(DEFAULT_PROPS);
|
|
115
116
|
return computed(() => {
|
|
116
117
|
const omittedFields = omit(fieldDef, ['value']);
|
|
@@ -560,7 +561,7 @@ function submitButtonFieldMapper(fieldDef) {
|
|
|
560
561
|
// =============================================================================
|
|
561
562
|
/** Mapper for next page button — preconfigures NextPageEvent. */
|
|
562
563
|
function nextButtonFieldMapper(fieldDef) {
|
|
563
|
-
const fieldSignalContext =
|
|
564
|
+
const fieldSignalContext = injectFieldSignalContext();
|
|
564
565
|
const rootFormRegistry = inject(RootFormRegistryService);
|
|
565
566
|
const defaultProps = inject(DEFAULT_PROPS);
|
|
566
567
|
const formOptions = inject(FORM_OPTIONS);
|
|
@@ -877,10 +878,10 @@ function createAriaDescribedBySignal(errorsToDisplay, errorId, hintId, hasHint)
|
|
|
877
878
|
class NgForgeFieldShell {
|
|
878
879
|
key = input.required(...(ngDevMode ? [{ debugName: "key" }] : /* istanbul ignore next */ []));
|
|
879
880
|
className = input('', ...(ngDevMode ? [{ debugName: "className" }] : /* istanbul ignore next */ []));
|
|
880
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
881
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.
|
|
881
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgForgeFieldShell, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
882
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: NgForgeFieldShell, isStandalone: true, inputs: { key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: true, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "id": "key()", "attr.data-testid": "key()", "class": "className()" } }, ngImport: i0 });
|
|
882
883
|
}
|
|
883
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
884
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgForgeFieldShell, decorators: [{
|
|
884
885
|
type: Directive,
|
|
885
886
|
args: [{
|
|
886
887
|
host: {
|
|
@@ -1010,10 +1011,10 @@ class NgForgeField {
|
|
|
1010
1011
|
});
|
|
1011
1012
|
}
|
|
1012
1013
|
}
|
|
1013
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
1014
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.
|
|
1014
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgForgeField, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1015
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: NgForgeField, isStandalone: true, inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, meta: { classPropertyName: "meta", publicName: "meta", isSignal: true, isRequired: false, transformFunction: null }, validationMessages: { classPropertyName: "validationMessages", publicName: "validationMessages", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.hidden": "field()().hidden() || null", "attr.aria-disabled": "field()().disabled() || null" } }, ngImport: i0 });
|
|
1015
1016
|
}
|
|
1016
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
1017
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgForgeField, decorators: [{
|
|
1017
1018
|
type: Directive,
|
|
1018
1019
|
args: [{
|
|
1019
1020
|
host: {
|
|
@@ -1124,10 +1125,10 @@ class NgForgeAction {
|
|
|
1124
1125
|
: (this.eventContext() ?? { key: this.key() });
|
|
1125
1126
|
this.eventBus.dispatch(event, ...resolveTokens(args, context));
|
|
1126
1127
|
}
|
|
1127
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
1128
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.
|
|
1128
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgForgeAction, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1129
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: NgForgeAction, isStandalone: true, inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, hidden: { classPropertyName: "hidden", publicName: "hidden", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, event: { classPropertyName: "event", publicName: "event", isSignal: true, isRequired: false, transformFunction: null }, eventArgs: { classPropertyName: "eventArgs", publicName: "eventArgs", isSignal: true, isRequired: false, transformFunction: null }, eventContext: { classPropertyName: "eventContext", publicName: "eventContext", isSignal: true, isRequired: false, transformFunction: null }, props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.hidden": "hidden() || null", "attr.aria-disabled": "disabled() || null" } }, ngImport: i0 });
|
|
1129
1130
|
}
|
|
1130
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
1131
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgForgeAction, decorators: [{
|
|
1131
1132
|
type: Directive,
|
|
1132
1133
|
args: [{
|
|
1133
1134
|
host: {
|
|
@@ -1160,6 +1161,312 @@ function injectNgForgeAction() {
|
|
|
1160
1161
|
return inject(NgForgeAction);
|
|
1161
1162
|
}
|
|
1162
1163
|
|
|
1164
|
+
/**
|
|
1165
|
+
* Universal addon-array plumbing: signal-cached `hidden` resolution and
|
|
1166
|
+
* slot bucketing. Used internally by the `NgForgeAddons` host wrapper —
|
|
1167
|
+
* consumers should compose `NgForgeAddons` directly and inject the
|
|
1168
|
+
* directive instance via `injectNgForgeAddons<TAddon>()`.
|
|
1169
|
+
*/
|
|
1170
|
+
class NgForgeAddonsBase {
|
|
1171
|
+
/** Capture the host's injector so `toSignal` (inside `resolveDynamicValue`) ties to the host's `DestroyRef`. */
|
|
1172
|
+
hostInjector = inject(Injector);
|
|
1173
|
+
/** Addon array mapped from `FieldDef.addons` by `buildBaseInputs`. */
|
|
1174
|
+
addons = input(undefined, ...(ngDevMode ? [{ debugName: "addons" }] : /* istanbul ignore next */ []));
|
|
1175
|
+
/**
|
|
1176
|
+
* Per-addon `hidden` signal cache. Built via `explicitEffect` rather
|
|
1177
|
+
* than `computed` because `toSignal` (inside `resolveDynamicValue` for
|
|
1178
|
+
* Observable inputs) is disallowed in reactive contexts (NG0602).
|
|
1179
|
+
*/
|
|
1180
|
+
_hiddenSignalCache = signal(new Map(), ...(ngDevMode ? [{ debugName: "_hiddenSignalCache" }] : /* istanbul ignore next */ []));
|
|
1181
|
+
hiddenSignalCache = this._hiddenSignalCache.asReadonly();
|
|
1182
|
+
visibleAddons = computed(() => {
|
|
1183
|
+
const list = this.addons() ?? [];
|
|
1184
|
+
const cache = this.hiddenSignalCache();
|
|
1185
|
+
return list.filter((a) => !(cache.get(a)?.() ?? false));
|
|
1186
|
+
}, ...(ngDevMode ? [{ debugName: "visibleAddons" }] : /* istanbul ignore next */ []));
|
|
1187
|
+
hasAddons = computed(() => this.visibleAddons().length > 0, ...(ngDevMode ? [{ debugName: "hasAddons" }] : /* istanbul ignore next */ []));
|
|
1188
|
+
prefixAddons = computed(() => this.visibleAddons().filter((a) => a.slot === 'prefix'), ...(ngDevMode ? [{ debugName: "prefixAddons" }] : /* istanbul ignore next */ []));
|
|
1189
|
+
suffixAddons = computed(() => this.visibleAddons().filter((a) => a.slot === 'suffix'), ...(ngDevMode ? [{ debugName: "suffixAddons" }] : /* istanbul ignore next */ []));
|
|
1190
|
+
/**
|
|
1191
|
+
* Visible addons grouped by their `slot` string. Convenience view for
|
|
1192
|
+
* adapters with non-universal slots (e.g., Ionic `start` / `end`).
|
|
1193
|
+
*/
|
|
1194
|
+
addonsBySlot = computed(() => {
|
|
1195
|
+
const map = new Map();
|
|
1196
|
+
for (const a of this.visibleAddons()) {
|
|
1197
|
+
const bucket = map.get(a.slot) ?? [];
|
|
1198
|
+
bucket.push(a);
|
|
1199
|
+
map.set(a.slot, bucket);
|
|
1200
|
+
}
|
|
1201
|
+
return map;
|
|
1202
|
+
}, ...(ngDevMode ? [{ debugName: "addonsBySlot" }] : /* istanbul ignore next */ []));
|
|
1203
|
+
/** Secondary index keyed by `hidden` value identity. Catches the common case
|
|
1204
|
+
* where a FormConfig re-emit produces structurally-different-but-content-
|
|
1205
|
+
* identical addon objects — without this, every re-emit would spawn a new
|
|
1206
|
+
* `toSignal` subscription for each addon's hidden axis. */
|
|
1207
|
+
_hiddenByValue = new WeakMap();
|
|
1208
|
+
constructor() {
|
|
1209
|
+
explicitEffect([this.addons], ([list]) => {
|
|
1210
|
+
const prev = this._hiddenSignalCache();
|
|
1211
|
+
const next = new Map();
|
|
1212
|
+
for (const a of list ?? []) {
|
|
1213
|
+
// Tier 1: reference identity — the cheapest hit when the same addon
|
|
1214
|
+
// object is reused across emissions.
|
|
1215
|
+
let resolved = prev.get(a);
|
|
1216
|
+
if (!resolved) {
|
|
1217
|
+
// Tier 2: hidden-value identity — when `hidden` is an object
|
|
1218
|
+
// (Signal / Observable / function), the same instance can be passed
|
|
1219
|
+
// through multiple new addon objects on FormConfig re-emit.
|
|
1220
|
+
const h = a.hidden;
|
|
1221
|
+
const valueKey = typeof h === 'object' && h !== null ? h : null;
|
|
1222
|
+
resolved = valueKey ? this._hiddenByValue.get(valueKey) : undefined;
|
|
1223
|
+
if (!resolved) {
|
|
1224
|
+
resolved = resolveDynamicValue(a.hidden, false, this.hostInjector);
|
|
1225
|
+
if (valueKey)
|
|
1226
|
+
this._hiddenByValue.set(valueKey, resolved);
|
|
1227
|
+
}
|
|
1228
|
+
}
|
|
1229
|
+
next.set(a, resolved);
|
|
1230
|
+
}
|
|
1231
|
+
this._hiddenSignalCache.set(next);
|
|
1232
|
+
});
|
|
1233
|
+
}
|
|
1234
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgForgeAddonsBase, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1235
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: NgForgeAddonsBase, isStandalone: true, inputs: { addons: { classPropertyName: "addons", publicName: "addons", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
|
|
1236
|
+
}
|
|
1237
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgForgeAddonsBase, decorators: [{
|
|
1238
|
+
type: Directive,
|
|
1239
|
+
args: [{}]
|
|
1240
|
+
}], ctorParameters: () => [], propDecorators: { addons: [{ type: i0.Input, args: [{ isSignal: true, alias: "addons", required: false }] }] } });
|
|
1241
|
+
/** Forwarded onto `NgForgeAddonsBase` via the `NgForgeAddons` wrapper. */
|
|
1242
|
+
const NG_FORGE_ADDONS_INPUTS = ['addons'];
|
|
1243
|
+
// Compile-time lockstep — drift between the tuple and the declared inputs fails the build.
|
|
1244
|
+
const _NG_FORGE_ADDONS_INPUTS_LOCKSTEP = true;
|
|
1245
|
+
void _NG_FORGE_ADDONS_INPUTS_LOCKSTEP;
|
|
1246
|
+
/**
|
|
1247
|
+
* Host wrapper for `NgForgeAddonsBase`. Consumers compose this directly:
|
|
1248
|
+
*
|
|
1249
|
+
* ```ts
|
|
1250
|
+
* \@Component({
|
|
1251
|
+
* hostDirectives: [NgForgeFieldHost, NgForgeAddons],
|
|
1252
|
+
* template: `
|
|
1253
|
+
* @if (ngfa.hasAddons()) {
|
|
1254
|
+
* <p-inputgroup>
|
|
1255
|
+
* @for (a of ngfa.prefixAddons(); track $index) {
|
|
1256
|
+
* <df-addon-slot [addon]="a" [hidden]="ngfa.hiddenSignalCache().get(a)" />
|
|
1257
|
+
* }
|
|
1258
|
+
* <input ngForgeControl ... />
|
|
1259
|
+
* </p-inputgroup>
|
|
1260
|
+
* }
|
|
1261
|
+
* `,
|
|
1262
|
+
* })
|
|
1263
|
+
* export class MyInputField {
|
|
1264
|
+
* protected readonly ngfa = injectNgForgeAddons<MyInputAddon>();
|
|
1265
|
+
* }
|
|
1266
|
+
* ```
|
|
1267
|
+
*
|
|
1268
|
+
* The wrapper exists so `hostDirectives: [NgForgeAddons]` resolves
|
|
1269
|
+
* cross-package — same constraint that drives `NgForgeFieldHost`.
|
|
1270
|
+
*/
|
|
1271
|
+
class NgForgeAddons {
|
|
1272
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgForgeAddons, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1273
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: NgForgeAddons, isStandalone: true, hostDirectives: [{ directive: NgForgeAddonsBase, inputs: ["addons", "addons"] }], ngImport: i0 });
|
|
1274
|
+
}
|
|
1275
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgForgeAddons, decorators: [{
|
|
1276
|
+
type: Directive,
|
|
1277
|
+
args: [{
|
|
1278
|
+
hostDirectives: [{ directive: NgForgeAddonsBase, inputs: [...NG_FORGE_ADDONS_INPUTS] }],
|
|
1279
|
+
}]
|
|
1280
|
+
}] });
|
|
1281
|
+
/**
|
|
1282
|
+
* Typed inject helper. Always resolves to the underlying
|
|
1283
|
+
* `NgForgeAddonsBase` instance — the wrapper class has no instance
|
|
1284
|
+
* fields of its own.
|
|
1285
|
+
*/
|
|
1286
|
+
function injectNgForgeAddons() {
|
|
1287
|
+
return inject(NgForgeAddonsBase);
|
|
1288
|
+
}
|
|
1289
|
+
|
|
1290
|
+
const ADDON_PRESET_HANDLER = new InjectionToken('ADDON_PRESET_HANDLER');
|
|
1291
|
+
|
|
1292
|
+
/**
|
|
1293
|
+
* Universal click-dispatch plumbing for action-style addons (icon buttons,
|
|
1294
|
+
* labelled buttons, etc.): `disabled` / `loading` resolution from
|
|
1295
|
+
* `DynamicValue<boolean>`, action context construction, and the
|
|
1296
|
+
* `preset / actionRef / action` precedence dispatcher.
|
|
1297
|
+
*
|
|
1298
|
+
* Adapter button kinds (e.g., `prime-button`) compose `NgForgeAddonAction`
|
|
1299
|
+
* and read state via `injectNgForgeAddonAction<TAddon>()`. Preset semantics
|
|
1300
|
+
* are adapter-specific — register an `ADDON_PRESET_HANDLER` at the host
|
|
1301
|
+
* field scope to receive preset dispatches.
|
|
1302
|
+
*/
|
|
1303
|
+
class NgForgeAddonActionBase {
|
|
1304
|
+
// The action registry is form-scoped. `optional: true` matches the
|
|
1305
|
+
// preset handler so addons rendered outside a form that called
|
|
1306
|
+
// `provideAddonActions(...)` degrade gracefully instead of throwing —
|
|
1307
|
+
// `actionRef` dispatches then log an actionable warning and no-op.
|
|
1308
|
+
actionRegistry = inject(ADDON_ACTION_REGISTRY, { optional: true });
|
|
1309
|
+
presetHandler = inject(ADDON_PRESET_HANDLER, { optional: true });
|
|
1310
|
+
logger = inject(DynamicFormLogger);
|
|
1311
|
+
hostInjector = inject(Injector);
|
|
1312
|
+
addon = input.required(...(ngDevMode ? [{ debugName: "addon" }] : /* istanbul ignore next */ []));
|
|
1313
|
+
fieldInputs = input(undefined, ...(ngDevMode ? [{ debugName: "fieldInputs" }] : /* istanbul ignore next */ []));
|
|
1314
|
+
/**
|
|
1315
|
+
* Per-value caches for `disabled` / `loading` signal resolution. Keyed by
|
|
1316
|
+
* the `DynamicValue` identity so a single `toSignal` subscription is
|
|
1317
|
+
* shared across addon-reference swaps that pass the same Observable.
|
|
1318
|
+
* Mirrors `NgForgeAddonsBase._hiddenByValue` — `resolveDynamicValue`
|
|
1319
|
+
* cannot run inside `computed`/`linkedSignal.computation` because
|
|
1320
|
+
* `toSignal` throws in reactive contexts (NG0602), and re-running it on
|
|
1321
|
+
* every recomputation would leak subscriptions on each cycle.
|
|
1322
|
+
*/
|
|
1323
|
+
_disabledByValue = new WeakMap();
|
|
1324
|
+
_loadingByValue = new WeakMap();
|
|
1325
|
+
_resolvedDisabled = signal(undefined, ...(ngDevMode ? [{ debugName: "_resolvedDisabled" }] : /* istanbul ignore next */ []));
|
|
1326
|
+
_resolvedLoading = signal(undefined, ...(ngDevMode ? [{ debugName: "_resolvedLoading" }] : /* istanbul ignore next */ []));
|
|
1327
|
+
disabled = computed(() => this._resolvedDisabled()?.() ?? false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
|
|
1328
|
+
loading = computed(() => this._resolvedLoading()?.() ?? false, ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
|
|
1329
|
+
constructor() {
|
|
1330
|
+
explicitEffect([this.addon], ([addon]) => {
|
|
1331
|
+
this._resolvedDisabled.set(this._resolveAxis(addon.disabled, this._disabledByValue));
|
|
1332
|
+
this._resolvedLoading.set(this._resolveAxis(addon.loading, this._loadingByValue));
|
|
1333
|
+
});
|
|
1334
|
+
}
|
|
1335
|
+
_resolveAxis(value, cache) {
|
|
1336
|
+
const valueKey = typeof value === 'object' && value !== null ? value : null;
|
|
1337
|
+
let resolved = valueKey ? cache.get(valueKey) : undefined;
|
|
1338
|
+
if (!resolved) {
|
|
1339
|
+
resolved = resolveDynamicValue(value, false, this.hostInjector);
|
|
1340
|
+
if (valueKey)
|
|
1341
|
+
cache.set(valueKey, resolved);
|
|
1342
|
+
}
|
|
1343
|
+
return resolved;
|
|
1344
|
+
}
|
|
1345
|
+
/**
|
|
1346
|
+
* Resolve the click handler from the addon's three-axis click variant and
|
|
1347
|
+
* invoke it. Precedence on multi-set: `preset > actionRef > action`. The
|
|
1348
|
+
* validator drops multi-set configs at config-init time; this is
|
|
1349
|
+
* defence-in-depth + a logged warning so the misconfiguration is loud.
|
|
1350
|
+
*/
|
|
1351
|
+
dispatch() {
|
|
1352
|
+
const addon = this.addon();
|
|
1353
|
+
const ctx = this.buildActionContext();
|
|
1354
|
+
const variantsSet = [addon.preset, addon.actionRef, addon.action].filter((v) => v !== undefined).length;
|
|
1355
|
+
if (variantsSet > 1) {
|
|
1356
|
+
this.logger.warn(`Addon button: more than one of preset/actionRef/action configured — dispatching by precedence (preset > actionRef > action). Ship at most one to silence this.`);
|
|
1357
|
+
}
|
|
1358
|
+
if (addon.preset !== undefined) {
|
|
1359
|
+
if (!this.presetHandler) {
|
|
1360
|
+
this.logger.warn(`Addon button: preset '${addon.preset}' is configured but no ADDON_PRESET_HANDLER is registered in this scope. Did the adapter forget to provide one at the host field?`);
|
|
1361
|
+
return;
|
|
1362
|
+
}
|
|
1363
|
+
void this.presetHandler.run(addon.preset, ctx);
|
|
1364
|
+
return;
|
|
1365
|
+
}
|
|
1366
|
+
if (addon.actionRef !== undefined) {
|
|
1367
|
+
const handler = this.actionRegistry?.get(addon.actionRef);
|
|
1368
|
+
if (handler) {
|
|
1369
|
+
handler(ctx);
|
|
1370
|
+
}
|
|
1371
|
+
else {
|
|
1372
|
+
this.logger.warn(`Addon button: actionRef '${addon.actionRef}' is not registered. ` +
|
|
1373
|
+
(this.actionRegistry
|
|
1374
|
+
? `Did you call provideAddonActions({ ${addon.actionRef}: ... })?`
|
|
1375
|
+
: `No provideAddonActions(...) registry is reachable in this scope — was the addon rendered outside a form?`));
|
|
1376
|
+
}
|
|
1377
|
+
return;
|
|
1378
|
+
}
|
|
1379
|
+
if (addon.action !== undefined) {
|
|
1380
|
+
addon.action(ctx);
|
|
1381
|
+
return;
|
|
1382
|
+
}
|
|
1383
|
+
// Decorative — no handler configured.
|
|
1384
|
+
}
|
|
1385
|
+
/**
|
|
1386
|
+
* Build an `AddonActionContext` for handlers from the wrapper-style
|
|
1387
|
+
* `fieldInputs` bag. Returns the field-bound variant when a host field
|
|
1388
|
+
* is reachable, or the orphan variant otherwise.
|
|
1389
|
+
*
|
|
1390
|
+
* Resolution order for `setValue`:
|
|
1391
|
+
* 1. `inputs.setValue` from the forwarded bag (preferred — populated by
|
|
1392
|
+
* `buildFieldInputs` in `DfFieldOutlet`).
|
|
1393
|
+
* 2. Fallback reconstructed from `inputs.field` itself: although
|
|
1394
|
+
* `ReadonlyFieldTree.value` is type-narrowed to `Signal<T>`, the
|
|
1395
|
+
* underlying runtime object is the same `WritableSignal<T>` created
|
|
1396
|
+
* by Signal Forms (the read-only wrapping is type-level only, see
|
|
1397
|
+
* `toReadonlyFieldTree`). Casting back at the writer boundary
|
|
1398
|
+
* produces a working setValue for ANY field depth — top-level OR
|
|
1399
|
+
* nested under groups. This avoids the previous FSC-key navigation
|
|
1400
|
+
* that broke for grouped fields, where `inputs.key` is DOM-mangled
|
|
1401
|
+
* (`'user_address_street'`) and `fsc.form[key]` returns undefined.
|
|
1402
|
+
*
|
|
1403
|
+
* The orphan variant fires only when the bag carries no field tree at
|
|
1404
|
+
* all — genuine "rendered outside a field" scenario.
|
|
1405
|
+
*/
|
|
1406
|
+
buildActionContext() {
|
|
1407
|
+
const inputs = this.fieldInputs();
|
|
1408
|
+
const key = inputs?.key ?? '';
|
|
1409
|
+
const type = inputs?.type ?? '';
|
|
1410
|
+
const tree = inputs?.field;
|
|
1411
|
+
if (tree) {
|
|
1412
|
+
// `writeToFieldValue` centralises the `Signal → WritableSignal` cast and
|
|
1413
|
+
// warns at runtime if Signal Forms ever stops storing a writable signal
|
|
1414
|
+
// here (the alternative — a silent no-op preset — is much worse).
|
|
1415
|
+
const setValue = inputs?.setValue ?? ((next) => writeToFieldValue(tree.value, next, this.logger));
|
|
1416
|
+
return {
|
|
1417
|
+
field: { key, type },
|
|
1418
|
+
form: tree,
|
|
1419
|
+
value: tree.value() ?? undefined,
|
|
1420
|
+
setValue,
|
|
1421
|
+
};
|
|
1422
|
+
}
|
|
1423
|
+
return {
|
|
1424
|
+
field: { key, type },
|
|
1425
|
+
form: null,
|
|
1426
|
+
value: undefined,
|
|
1427
|
+
};
|
|
1428
|
+
}
|
|
1429
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgForgeAddonActionBase, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1430
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: NgForgeAddonActionBase, isStandalone: true, inputs: { addon: { classPropertyName: "addon", publicName: "addon", isSignal: true, isRequired: true, transformFunction: null }, fieldInputs: { classPropertyName: "fieldInputs", publicName: "fieldInputs", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
|
|
1431
|
+
}
|
|
1432
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgForgeAddonActionBase, decorators: [{
|
|
1433
|
+
type: Directive,
|
|
1434
|
+
args: [{}]
|
|
1435
|
+
}], ctorParameters: () => [], propDecorators: { addon: [{ type: i0.Input, args: [{ isSignal: true, alias: "addon", required: true }] }], fieldInputs: [{ type: i0.Input, args: [{ isSignal: true, alias: "fieldInputs", required: false }] }] } });
|
|
1436
|
+
/** Forwarded onto `NgForgeAddonActionBase` via the `NgForgeAddonAction` wrapper. */
|
|
1437
|
+
const NG_FORGE_ADDON_ACTION_INPUTS = ['addon', 'fieldInputs'];
|
|
1438
|
+
const _NG_FORGE_ADDON_ACTION_INPUTS_LOCKSTEP = true;
|
|
1439
|
+
void _NG_FORGE_ADDON_ACTION_INPUTS_LOCKSTEP;
|
|
1440
|
+
/**
|
|
1441
|
+
* Host wrapper for `NgForgeAddonActionBase`. Consumers compose this directly:
|
|
1442
|
+
*
|
|
1443
|
+
* ```ts
|
|
1444
|
+
* \@Component({
|
|
1445
|
+
* hostDirectives: [NgForgeAddonAction],
|
|
1446
|
+
* template: `
|
|
1447
|
+
* <p-button [loading]="action.loading()" [disabled]="action.disabled()"
|
|
1448
|
+
* (onClick)="action.dispatch()" />
|
|
1449
|
+
* `,
|
|
1450
|
+
* })
|
|
1451
|
+
* export class MyButtonAddon {
|
|
1452
|
+
* protected readonly action = injectNgForgeAddonAction<MyButtonAddon>();
|
|
1453
|
+
* }
|
|
1454
|
+
* ```
|
|
1455
|
+
*/
|
|
1456
|
+
class NgForgeAddonAction {
|
|
1457
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgForgeAddonAction, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1458
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: NgForgeAddonAction, isStandalone: true, hostDirectives: [{ directive: NgForgeAddonActionBase, inputs: ["addon", "addon", "fieldInputs", "fieldInputs"] }], ngImport: i0 });
|
|
1459
|
+
}
|
|
1460
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgForgeAddonAction, decorators: [{
|
|
1461
|
+
type: Directive,
|
|
1462
|
+
args: [{
|
|
1463
|
+
hostDirectives: [{ directive: NgForgeAddonActionBase, inputs: [...NG_FORGE_ADDON_ACTION_INPUTS] }],
|
|
1464
|
+
}]
|
|
1465
|
+
}] });
|
|
1466
|
+
function injectNgForgeAddonAction() {
|
|
1467
|
+
return inject(NgForgeAddonActionBase);
|
|
1468
|
+
}
|
|
1469
|
+
|
|
1163
1470
|
/**
|
|
1164
1471
|
* Marker directive applied to the canonical control element of an
|
|
1165
1472
|
* `NgForgeField`-using component. Forwards the field's `meta` AND
|
|
@@ -1201,10 +1508,10 @@ class NgForgeControl {
|
|
|
1201
1508
|
setupMarkerAttrTracking(inject(ElementRef), parent, () => this.target());
|
|
1202
1509
|
parent.markClaimed();
|
|
1203
1510
|
}
|
|
1204
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
1205
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.
|
|
1511
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgForgeControl, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1512
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: NgForgeControl, isStandalone: true, selector: "[ngForgeControl]", inputs: { target: { classPropertyName: "target", publicName: "ngForgeControl", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
|
|
1206
1513
|
}
|
|
1207
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
1514
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgForgeControl, decorators: [{
|
|
1208
1515
|
type: Directive,
|
|
1209
1516
|
args: [{ selector: '[ngForgeControl]' }]
|
|
1210
1517
|
}], ctorParameters: () => [], propDecorators: { target: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngForgeControl", required: false }] }] } });
|
|
@@ -1239,10 +1546,10 @@ class NgForgeHostControl {
|
|
|
1239
1546
|
setupMarkerAttrTracking(inject(ElementRef), parent, () => undefined);
|
|
1240
1547
|
parent.markClaimed();
|
|
1241
1548
|
}
|
|
1242
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
1243
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.
|
|
1549
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgForgeHostControl, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1550
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: NgForgeHostControl, isStandalone: true, ngImport: i0 });
|
|
1244
1551
|
}
|
|
1245
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
1552
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgForgeHostControl, decorators: [{
|
|
1246
1553
|
type: Directive,
|
|
1247
1554
|
args: [{}]
|
|
1248
1555
|
}], ctorParameters: () => [] });
|
|
@@ -1274,10 +1581,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
1274
1581
|
* for the same reason. See https://www.angularspace.com/host-directives-decomposition-unleashed/
|
|
1275
1582
|
*/
|
|
1276
1583
|
class NgForgeFieldHost {
|
|
1277
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
1278
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.
|
|
1584
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgForgeFieldHost, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1585
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: NgForgeFieldHost, isStandalone: true, hostDirectives: [{ directive: NgForgeFieldShell, inputs: ["key", "key", "className", "className"] }, { directive: NgForgeField, inputs: ["field", "field", "label", "label", "placeholder", "placeholder", "tabIndex", "tabIndex", "props", "props", "meta", "meta", "validationMessages", "validationMessages"] }], ngImport: i0 });
|
|
1279
1586
|
}
|
|
1280
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
1587
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgForgeFieldHost, decorators: [{
|
|
1281
1588
|
type: Directive,
|
|
1282
1589
|
args: [{
|
|
1283
1590
|
hostDirectives: [
|
|
@@ -1303,10 +1610,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
1303
1610
|
* ```
|
|
1304
1611
|
*/
|
|
1305
1612
|
class NgForgeActionHost {
|
|
1306
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
1307
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.
|
|
1613
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgForgeActionHost, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1614
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: NgForgeActionHost, isStandalone: true, hostDirectives: [{ directive: NgForgeFieldShell, inputs: ["key", "key", "className", "className"] }, { directive: NgForgeAction, inputs: ["label", "label", "disabled", "disabled", "hidden", "hidden", "tabIndex", "tabIndex", "event", "event", "eventArgs", "eventArgs", "eventContext", "eventContext", "props", "props"] }], ngImport: i0 });
|
|
1308
1615
|
}
|
|
1309
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
1616
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: NgForgeActionHost, decorators: [{
|
|
1310
1617
|
type: Directive,
|
|
1311
1618
|
args: [{
|
|
1312
1619
|
hostDirectives: [
|
|
@@ -1399,5 +1706,5 @@ function provideTestValidationMessages(messages) {
|
|
|
1399
1706
|
* Generated bundle index. Do not edit.
|
|
1400
1707
|
*/
|
|
1401
1708
|
|
|
1402
|
-
export { NG_FORGE_ACTION_INPUTS, NG_FORGE_FIELD_SHELL_INPUTS, NG_FORGE_VALUE_FIELD_INPUTS, NgForgeAction, NgForgeActionHost, NgForgeControl, NgForgeField, NgForgeFieldHost, NgForgeFieldShell, NgForgeHostControl, addArrayItemButtonMapper, buildArrayButtonEventContext, buildValueFieldInputs, buttonFieldMapper, checkboxFieldMapper, createAriaDescribedBySignal, createNgForgeActionFixture, createNgForgeFieldFixture, createResolvedErrorsSignal, datepickerFieldMapper, injectNgForgeAction, injectNgForgeField, insertArrayItemButtonMapper, nextButtonFieldMapper, optionsFieldMapper, popArrayItemButtonMapper, prependArrayItemButtonMapper, previousButtonFieldMapper, provideTestValidationMessages, removeArrayItemButtonMapper, resolveArrayButtonContext, resolveArrayButtonEventArgs, resolveValueFieldContext, setupMetaTracking, shiftArrayItemButtonMapper, shouldShowErrors, submitButtonFieldMapper, valueFieldMapper };
|
|
1709
|
+
export { ADDON_PRESET_HANDLER, NG_FORGE_ACTION_INPUTS, NG_FORGE_ADDONS_INPUTS, NG_FORGE_ADDON_ACTION_INPUTS, NG_FORGE_FIELD_SHELL_INPUTS, NG_FORGE_VALUE_FIELD_INPUTS, NgForgeAction, NgForgeActionHost, NgForgeAddonAction, NgForgeAddonActionBase, NgForgeAddons, NgForgeAddonsBase, NgForgeControl, NgForgeField, NgForgeFieldHost, NgForgeFieldShell, NgForgeHostControl, addArrayItemButtonMapper, buildArrayButtonEventContext, buildValueFieldInputs, buttonFieldMapper, checkboxFieldMapper, createAriaDescribedBySignal, createNgForgeActionFixture, createNgForgeFieldFixture, createResolvedErrorsSignal, datepickerFieldMapper, injectNgForgeAction, injectNgForgeAddonAction, injectNgForgeAddons, injectNgForgeField, insertArrayItemButtonMapper, nextButtonFieldMapper, optionsFieldMapper, popArrayItemButtonMapper, prependArrayItemButtonMapper, previousButtonFieldMapper, provideTestValidationMessages, removeArrayItemButtonMapper, resolveArrayButtonContext, resolveArrayButtonEventArgs, resolveValueFieldContext, setupMetaTracking, shiftArrayItemButtonMapper, shouldShowErrors, submitButtonFieldMapper, valueFieldMapper };
|
|
1403
1710
|
//# sourceMappingURL=ng-forge-dynamic-forms-integration.mjs.map
|