@ng-forge/dynamic-forms 0.9.0-next.1 → 0.9.0-next.11

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.
Files changed (29) hide show
  1. package/fesm2022/{ng-forge-dynamic-forms-array-field.component-CWxCWVdz.mjs → ng-forge-dynamic-forms-array-field.component-DJ-LiLm_.mjs} +17 -4
  2. package/fesm2022/ng-forge-dynamic-forms-array-field.component-DJ-LiLm_.mjs.map +1 -0
  3. package/fesm2022/{ng-forge-dynamic-forms-container-field.component-PozYj2JC.mjs → ng-forge-dynamic-forms-container-field.component-Pcxg5PQu.mjs} +3 -3
  4. package/fesm2022/{ng-forge-dynamic-forms-container-field.component-PozYj2JC.mjs.map → ng-forge-dynamic-forms-container-field.component-Pcxg5PQu.mjs.map} +1 -1
  5. package/fesm2022/{ng-forge-dynamic-forms-container-utils-DW_P7w-b.mjs → ng-forge-dynamic-forms-container-utils-a4RstR2Z.mjs} +2 -2
  6. package/fesm2022/{ng-forge-dynamic-forms-container-utils-DW_P7w-b.mjs.map → ng-forge-dynamic-forms-container-utils-a4RstR2Z.mjs.map} +1 -1
  7. package/fesm2022/{ng-forge-dynamic-forms-css-wrapper.component-DrtHSaVV.mjs → ng-forge-dynamic-forms-css-wrapper.component-CJACCIEK.mjs} +2 -2
  8. package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-CJACCIEK.mjs.map +1 -0
  9. package/fesm2022/{ng-forge-dynamic-forms-emit-initialization-CSx0gwFc.mjs → ng-forge-dynamic-forms-emit-initialization-Bjf_I0D_.mjs} +2 -2
  10. package/fesm2022/{ng-forge-dynamic-forms-emit-initialization-CSx0gwFc.mjs.map → ng-forge-dynamic-forms-emit-initialization-Bjf_I0D_.mjs.map} +1 -1
  11. package/fesm2022/{ng-forge-dynamic-forms-group-field.component-2yRmHAUp.mjs → ng-forge-dynamic-forms-group-field.component-fzKwPrQr.mjs} +24 -4
  12. package/fesm2022/ng-forge-dynamic-forms-group-field.component-fzKwPrQr.mjs.map +1 -0
  13. package/fesm2022/ng-forge-dynamic-forms-integration.mjs +629 -54
  14. package/fesm2022/ng-forge-dynamic-forms-integration.mjs.map +1 -1
  15. package/fesm2022/{ng-forge-dynamic-forms-ng-forge-dynamic-forms-Ll4W2Z_n.mjs → ng-forge-dynamic-forms-ng-forge-dynamic-forms-o3rJX4vG.mjs} +979 -180
  16. package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-o3rJX4vG.mjs.map +1 -0
  17. package/fesm2022/{ng-forge-dynamic-forms-page-field.component-B_CxX0T-.mjs → ng-forge-dynamic-forms-page-field.component-BX4R9GGa.mjs} +3 -3
  18. package/fesm2022/{ng-forge-dynamic-forms-page-field.component-B_CxX0T-.mjs.map → ng-forge-dynamic-forms-page-field.component-BX4R9GGa.mjs.map} +1 -1
  19. package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-BIvEUoia.mjs.map +1 -1
  20. package/fesm2022/{ng-forge-dynamic-forms-text-field.component-rJMtKX2X.mjs → ng-forge-dynamic-forms-text-field.component-B9SK8Vun.mjs} +2 -2
  21. package/fesm2022/{ng-forge-dynamic-forms-text-field.component-rJMtKX2X.mjs.map → ng-forge-dynamic-forms-text-field.component-B9SK8Vun.mjs.map} +1 -1
  22. package/fesm2022/ng-forge-dynamic-forms.mjs +1 -1
  23. package/package.json +1 -1
  24. package/types/ng-forge-dynamic-forms-integration.d.ts +380 -8
  25. package/types/ng-forge-dynamic-forms.d.ts +1905 -1588
  26. package/fesm2022/ng-forge-dynamic-forms-array-field.component-CWxCWVdz.mjs.map +0 -1
  27. package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-DrtHSaVV.mjs.map +0 -1
  28. package/fesm2022/ng-forge-dynamic-forms-group-field.component-2yRmHAUp.mjs.map +0 -1
  29. package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-Ll4W2Z_n.mjs.map +0 -1
@@ -1,10 +1,10 @@
1
1
  import * as i0 from '@angular/core';
2
- import { computed, runInInjectionContext, Injector, linkedSignal, inject, DestroyRef, EnvironmentInjector, input, signal, ChangeDetectionStrategy, Component } from '@angular/core';
3
- import { R as RootFormRegistryService, g as isEqual, m as mapFieldToInputs, F as FIELD_SIGNAL_CONTEXT, A as ARRAY_CONTEXT, j as createRenderReadySignal, D as DynamicFormLogger, i as injectFieldRegistry, E as EventBus, k as ARRAY_TEMPLATE_REGISTRY, l as ARRAY_ITEM_ID_GENERATOR, n as getNormalizedArrayMetadata, o as getFieldValueHandling, p as getFieldDefaultValue, q as isGroupField, f as DfFieldOutlet, s as createArrayItemIdGenerator } from './ng-forge-dynamic-forms-ng-forge-dynamic-forms-Ll4W2Z_n.mjs';
2
+ import { computed, runInInjectionContext, Injector, signal, linkedSignal, inject, DestroyRef, EnvironmentInjector, input, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { R as RootFormRegistryService, g as isEqual, m as mapFieldToInputs, F as FIELD_SIGNAL_CONTEXT, A as ARRAY_CONTEXT, G as GROUP_CONTEXT, j as createRenderReadySignal, D as DynamicFormLogger, i as injectFieldRegistry, E as EventBus, k as ARRAY_TEMPLATE_REGISTRY, l as ARRAY_ITEM_ID_GENERATOR, n as getNormalizedArrayMetadata, o as getFieldValueHandling, p as getFieldDefaultValue, q as isGroupField, f as DfFieldOutlet, s as createArrayItemIdGenerator } from './ng-forge-dynamic-forms-ng-forge-dynamic-forms-o3rJX4vG.mjs';
4
4
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
5
5
  import { of, from, map, catchError, forkJoin, filter, firstValueFrom, tap } from 'rxjs';
6
6
  import { explicitEffect } from 'ngxtension/explicit-effect';
7
- import { e as emitComponentInitialized } from './ng-forge-dynamic-forms-emit-initialization-CSx0gwFc.mjs';
7
+ import { e as emitComponentInitialized } from './ng-forge-dynamic-forms-emit-initialization-Bjf_I0D_.mjs';
8
8
 
9
9
  /**
10
10
  * Safely extracts an array value from a model object.
@@ -173,9 +173,22 @@ function createItemInjector(options) {
173
173
  deps: [Injector],
174
174
  },
175
175
  { provide: ARRAY_CONTEXT, useValue: arrayContext },
176
+ // Reset GROUP_CONTEXT at the array boundary: inner groups inside each
177
+ // item start their path fresh, matching how value-derivation and
178
+ // property-derivation collectors key entries
179
+ // (`{arrayKey}.$.{innerGroupPath}.{fieldKey}`). Without this, an outer
180
+ // group around the array would leak into descendants' DOM IDs and
181
+ // override-store keys, drifting from the collector.
182
+ { provide: GROUP_CONTEXT, useValue: EMPTY_GROUP_CONTEXT },
176
183
  ],
177
184
  });
178
185
  }
186
+ /**
187
+ * Sentinel `GroupContext` provided at array item boundaries. Static `signal('')`
188
+ * means `applyGroupPrefix` no-ops (empty path) and any inner group composes its
189
+ * own path from this empty base.
190
+ */
191
+ const EMPTY_GROUP_CONTEXT = { groupPath: signal('') };
179
192
 
180
193
  /**
181
194
  * Resolves a single array item with all its fields for declarative rendering.
@@ -1002,4 +1015,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
1002
1015
  }], ctorParameters: () => [], propDecorators: { field: [{ type: i0.Input, args: [{ isSignal: true, alias: "field", required: true }] }], key: [{ type: i0.Input, args: [{ isSignal: true, alias: "key", required: true }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], hidden: [{ type: i0.Input, args: [{ isSignal: true, alias: "hidden", required: false }] }] } });
1003
1016
 
1004
1017
  export { ArrayFieldComponent, ArrayFieldComponent as default };
1005
- //# sourceMappingURL=ng-forge-dynamic-forms-array-field.component-CWxCWVdz.mjs.map
1018
+ //# sourceMappingURL=ng-forge-dynamic-forms-array-field.component-DJ-LiLm_.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ng-forge-dynamic-forms-array-field.component-DJ-LiLm_.mjs","sources":["../../../../packages/dynamic-forms/src/lib/utils/array-field/array-field.types.ts","../../../../packages/dynamic-forms/src/lib/utils/array-field/create-array-item-injector.ts","../../../../packages/dynamic-forms/src/lib/utils/array-field/resolve-array-item.ts","../../../../packages/dynamic-forms/src/lib/utils/array-field/array-event-handler.ts","../../../../packages/dynamic-forms/src/lib/fields/array/array-field.component.ts"],"sourcesContent":["import { Injector, Signal, type Type } from '@angular/core';\nimport type { FieldDef } from '../../definitions/base/field-def';\n\n/**\n * A single field within a resolved array item.\n *\n * Structurally compatible with `ResolvedField` so the same DfFieldOutlet\n * directive can render both top-level and array-item fields.\n */\nexport interface ResolvedArrayItemField {\n /** Field key (used for tracking and test IDs). */\n key: string;\n /** Original field definition — used by DfFieldOutlet to resolve wrappers. */\n fieldDef: FieldDef<unknown>;\n /** The loaded component type. */\n component: Type<unknown>;\n /** Injector providing ARRAY_CONTEXT and FIELD_SIGNAL_CONTEXT. */\n injector: Injector;\n /** Inputs signal for DfFieldOutlet — evaluated in template for reactivity. */\n inputs: Signal<Record<string, unknown>>;\n /** Whether required mapped inputs are available for safe component instantiation. */\n renderReady: Signal<boolean>;\n}\n\n/**\n * Resolved array item ready for declarative rendering with ngComponentOutlet.\n * Each item has a stable unique ID and a linkedSignal-based index that\n * automatically updates when items are added/removed.\n * Supports multiple fields per array item (e.g., name + email without a wrapper).\n */\nexport interface ResolvedArrayItem {\n /** Unique identifier for this item (stable across position changes). */\n id: string;\n /** All fields to render for this array item. */\n fields: ResolvedArrayItemField[];\n}\n\n/**\n * Safely extracts an array value from a model object.\n * Returns empty array if the key doesn't exist or value isn't an array.\n */\nexport function getArrayValue<TModel>(value: Partial<TModel> | undefined, key: string): unknown[] {\n const arrayValue = (value as Record<string, unknown>)?.[key];\n return Array.isArray(arrayValue) ? arrayValue : [];\n}\n\n/**\n * Discriminated union of possible differential update operations.\n * Enables optimized array updates without full recreation when possible.\n */\nexport type DifferentialUpdateOperation =\n | { type: 'clear' }\n | { type: 'initial'; fieldTreesLength: number }\n | { type: 'append'; startIndex: number; endIndex: number }\n | { type: 'recreate' }\n | { type: 'none' };\n\n/**\n * Determines the optimal differential update operation based on current and new state.\n *\n * Operations:\n * - Clear all (empty array)\n * - Initial render (no existing items)\n * - Append only (items added at end)\n * - Recreate (items removed - we can't know which items, so recreate all)\n * - None (same length - items update via linkedSignal)\n *\n * Note: We always use 'recreate' for removals because we can't determine which\n * specific items were removed. Operations like shift, removeAtIndex remove from\n * the middle, not just the end. Each array item has its own local form that\n * doesn't reactively track parent changes, so we must recreate to get correct values.\n */\nexport function determineDifferentialOperation(currentItems: ResolvedArrayItem[], newLength: number): DifferentialUpdateOperation {\n const currentLength = currentItems.length;\n\n if (newLength === 0) {\n return { type: 'clear' };\n }\n\n if (currentLength === 0) {\n return { type: 'initial', fieldTreesLength: newLength };\n }\n\n // For all length changes, we optimize by assuming existing items stay in place.\n // Items handle their own value updates via linkedSignal - no need to compare snapshots.\n // Snapshot comparison was causing false \"recreate\" when existing items had been edited.\n\n if (newLength > currentLength) {\n // Items added - append new ones, existing items stay\n return { type: 'append', startIndex: currentLength, endIndex: newLength };\n }\n\n if (newLength < currentLength) {\n // Items removed - must recreate because we don't know which items were removed.\n // shift() removes from index 0, removeAtIndex() removes from any position.\n // Each item's local form is initialized with its value at creation time and\n // doesn't reactively track parent array changes.\n return { type: 'recreate' };\n }\n\n // Same length - no structural change, items update via linkedSignal\n return { type: 'none' };\n}\n","import { computed, Injector, runInInjectionContext, signal, Signal } from '@angular/core';\nimport { FieldTree } from '@angular/forms/signals';\nimport { ArrayField } from '../../definitions/default/array-field';\nimport { FieldDef } from '../../definitions/base/field-def';\nimport { ArrayContext, FieldSignalContext, GroupContext } from '../../mappers/types';\nimport { ARRAY_CONTEXT, FIELD_SIGNAL_CONTEXT, GROUP_CONTEXT } from '../../models/field-signal-context.token';\nimport { FieldTypeDefinition } from '../../models/field-type';\nimport { mapFieldToInputs } from '../field-mapper/field-mapper';\nimport { RootFormRegistryService } from '../../core/registry/root-form-registry.service';\nimport { isEqual } from '../object-utils';\n\n/**\n * Options for creating an array item injector.\n */\nexport interface CreateArrayItemInjectorOptions<TModel extends Record<string, unknown>> {\n /** The field template defining the array item structure. */\n template: FieldDef<unknown>;\n /** Signal containing the current index (uses linkedSignal for auto-updates). */\n indexSignal: Signal<number>;\n /** Parent context for accessing form state and values. */\n parentFieldSignalContext: FieldSignalContext<TModel>;\n /** Parent injector for creating scoped child injector. */\n parentInjector: Injector;\n /** Field registry for looking up field type definitions. */\n registry: Map<string, FieldTypeDefinition>;\n /** The array field definition containing this item. */\n arrayField: ArrayField;\n /**\n * For primitive array items, the key of the value field in the template (e.g., 'value').\n * When set, the form getter wraps the raw FormControl in `{ [primitiveFieldKey]: FormControl }`\n * so that `getFieldTree(key)` can navigate to the control by key.\n *\n * Primitive items store flat values (e.g., `['angular']` not `[{value: 'angular'}]`),\n * so the FieldTree at `rootForm['arrayKey'][index]` is a FormControl, not a FormGroup.\n * Without wrapping, `getFieldTree('value')` would access the FormControl's `.value`\n * property (a WritableSignal) instead of a child FieldTree.\n */\n primitiveFieldKey?: string;\n}\n\n/**\n * Result of creating an array item injector.\n */\nexport interface ArrayItemInjectorResult {\n /** Scoped injector providing ARRAY_CONTEXT and FIELD_SIGNAL_CONTEXT. */\n injector: Injector;\n /** Inputs signal for ngComponentOutlet, mapped from the field template. Undefined for componentless fields. */\n inputs: Signal<Record<string, unknown>> | undefined;\n}\n\n/**\n * Creates an injector and inputs for an array item.\n *\n * Uses direct root form binding - components bind directly to the root form's\n * FieldTree for array items (rootForm['arrayKey'][index]). This architecture:\n *\n * - Eliminates the need for local forms and bidirectional sync\n * - Allows Zod/StandardSchema validation errors to flow naturally to components\n * - Reduces complexity by having a single source of truth (the root form)\n *\n * The FieldSignalContext.form property uses a getter that evaluates a computed\n * signal, making form access reactive to index changes (when items reorder,\n * the component points to the correct array position).\n */\nexport function createArrayItemInjectorAndInputs<TModel extends Record<string, unknown>>(\n options: CreateArrayItemInjectorOptions<TModel>,\n): ArrayItemInjectorResult {\n const { template, indexSignal, parentFieldSignalContext, parentInjector, registry, arrayField, primitiveFieldKey } = options;\n\n // Get root form registry - it's guaranteed to be available since root form\n // is registered before resolvedFields computes (dependency chain ensures this)\n const rootFormRegistry = parentInjector.get(RootFormRegistryService);\n\n // Create a computed that derives the array item's FieldTree from root form.\n // Uses isEqual to prevent unnecessary re-computation when index changes but value is same.\n const itemFormAccessor = computed(\n () => {\n const rootForm = rootFormRegistry.rootForm();\n if (!rootForm) {\n return undefined;\n }\n\n const index = indexSignal();\n // Navigate: rootForm['arrayKey'][index]\n const arrayFieldTree = (rootForm as Record<string, unknown>)[arrayField.key];\n if (!arrayFieldTree) {\n return undefined;\n }\n\n return (arrayFieldTree as unknown[])[index] as FieldTree<unknown> | undefined;\n },\n { equal: isEqual },\n );\n\n const injector = createItemInjector({\n itemFormAccessor,\n indexSignal,\n parentFieldSignalContext,\n parentInjector,\n arrayField,\n primitiveFieldKey,\n });\n\n // mapFieldToInputs automatically reads ARRAY_CONTEXT from the injector\n // and applies the index suffix to keys for unique DOM IDs\n const inputs = runInInjectionContext(injector, () => {\n return mapFieldToInputs(template, registry);\n });\n\n return { injector, inputs };\n}\n\ninterface CreateItemInjectorOptions<TModel extends Record<string, unknown>> {\n itemFormAccessor: Signal<FieldTree<unknown> | undefined>;\n indexSignal: Signal<number>;\n parentFieldSignalContext: FieldSignalContext<TModel>;\n parentInjector: Injector;\n arrayField: ArrayField;\n primitiveFieldKey?: string;\n}\n\n/**\n * Creates a scoped injector for an array item.\n * Provides both FIELD_SIGNAL_CONTEXT (for form access) and ARRAY_CONTEXT (for position awareness).\n *\n * The FIELD_SIGNAL_CONTEXT.form uses a getter that evaluates itemFormAccessor() on access.\n * This makes form access reactive - when mappers access context.form['fieldKey'], the getter runs,\n * evaluating the computed which tracks indexSignal as a dependency. This ensures components\n * automatically update when array items reorder.\n *\n * Uses `useFactory` with `deps: [Injector]` to provide FIELD_SIGNAL_CONTEXT. Angular resolves\n * the `Injector` dep as the child injector being created, eliminating any temporal gap.\n */\nfunction createItemInjector<TModel extends Record<string, unknown>>(options: CreateItemInjectorOptions<TModel>): Injector {\n const { itemFormAccessor, indexSignal, parentFieldSignalContext, parentInjector, arrayField, primitiveFieldKey } = options;\n\n // Use getter for formValue to ensure it's always current, not a stale snapshot.\n // Components accessing arrayContext.formValue will get the current value.\n const arrayContext: ArrayContext = {\n arrayKey: arrayField.key,\n index: indexSignal,\n get formValue() {\n return parentFieldSignalContext.value();\n },\n field: arrayField,\n };\n\n // Cache for the primitive wrapper object — avoids creating a new { [primitiveFieldKey]: raw }\n // on every form getter access, which would defeat reference-equality checks downstream.\n let cachedPrimitiveRaw: FieldTree<unknown> | undefined;\n let cachedPrimitiveWrapped: FieldTree<Record<string, unknown>> | undefined;\n\n return Injector.create({\n parent: parentInjector,\n providers: [\n {\n provide: FIELD_SIGNAL_CONTEXT,\n // Angular resolves `Injector` in deps as the child injector being created,\n // so no temporal gap exists — the injector reference is immediately available.\n useFactory: (injector: Injector): FieldSignalContext<Record<string, unknown>> => ({\n injector,\n value: parentFieldSignalContext.value,\n // Array items don't propagate parent default values because each item's defaults\n // are determined by its template fields at creation time (via getFieldDefaultValue).\n // The parent's defaultValues contain top-level form defaults, not per-item defaults.\n defaultValues: () => ({}),\n get form(): FieldTree<Record<string, unknown>> {\n const raw = itemFormAccessor();\n if (!raw) {\n // During initialization or transitions, the FieldTree may not be available yet.\n // This occurs in the window between item creation and Angular's form tree construction.\n // Return an empty object so that downstream getFieldTree(key) calls return undefined\n // rather than causing a runtime error on a truly undefined value.\n return {} as FieldTree<Record<string, unknown>>;\n }\n\n // For primitive array items, the FieldTree is a FormControl (the item IS the control).\n // Wrap it in an object so getFieldTree(primitiveFieldKey) returns the FormControl itself.\n // Without this, getFieldTree('value') would access FormControl['value'] (the WritableSignal),\n // not a child FieldTree, causing NG0950 errors.\n if (primitiveFieldKey) {\n // Cache the wrapper to preserve reference identity when raw hasn't changed\n if (raw !== cachedPrimitiveRaw) {\n cachedPrimitiveRaw = raw;\n cachedPrimitiveWrapped = { [primitiveFieldKey]: raw } as FieldTree<Record<string, unknown>>;\n }\n return cachedPrimitiveWrapped!;\n }\n\n return raw as FieldTree<Record<string, unknown>>;\n },\n }),\n deps: [Injector],\n },\n { provide: ARRAY_CONTEXT, useValue: arrayContext },\n // Reset GROUP_CONTEXT at the array boundary: inner groups inside each\n // item start their path fresh, matching how value-derivation and\n // property-derivation collectors key entries\n // (`{arrayKey}.$.{innerGroupPath}.{fieldKey}`). Without this, an outer\n // group around the array would leak into descendants' DOM IDs and\n // override-store keys, drifting from the collector.\n { provide: GROUP_CONTEXT, useValue: EMPTY_GROUP_CONTEXT },\n ],\n });\n}\n\n/**\n * Sentinel `GroupContext` provided at array item boundaries. Static `signal('')`\n * means `applyGroupPrefix` no-ops (empty path) and any inner group composes its\n * own path from this empty base.\n */\nconst EMPTY_GROUP_CONTEXT: GroupContext = { groupPath: signal('') };\n","import { DestroyRef, Injector, linkedSignal, Signal, Type } from '@angular/core';\nimport { catchError, forkJoin, from, map, Observable, of } from 'rxjs';\nimport { ArrayField } from '../../definitions/default/array-field';\nimport { FieldDef } from '../../definitions/base/field-def';\nimport { FieldSignalContext } from '../../mappers/types';\nimport { DynamicFormLogger } from '../../providers/features/logger/logger.token';\nimport { FieldTypeDefinition } from '../../models/field-type';\nimport { ResolvedArrayItem, ResolvedArrayItemField } from './array-field.types';\nimport { createArrayItemInjectorAndInputs } from './create-array-item-injector';\nimport { createRenderReadySignal } from '../resolve-field/resolve-field';\n\n/**\n * Options for resolving an array item.\n */\nexport interface ResolveArrayItemOptions<TModel extends Record<string, unknown>> {\n /** The initial index of this item in the array. */\n index: number;\n /** The field templates defining the array item structure (supports multiple sibling fields). */\n templates: FieldDef<unknown>[];\n /** The array field definition containing this item. */\n arrayField: ArrayField;\n /** Map signal for O(1) position lookup. Keys are item IDs, values are indices. */\n itemPositionMap: Signal<Map<string, number>>;\n /** Parent context for accessing form state and values. */\n parentFieldSignalContext: FieldSignalContext<TModel>;\n /** Parent injector for creating scoped child injector. */\n parentInjector: Injector;\n /** Field registry for looking up field type definitions. */\n registry: Map<string, FieldTypeDefinition>;\n /** DestroyRef to abort resolution if component is destroyed. */\n destroyRef: DestroyRef;\n /**\n * Function to async load the component for the field type.\n * Returns undefined for componentless fields (e.g., hidden fields).\n */\n loadTypeComponent: (type: string) => Promise<Type<unknown> | undefined>;\n /**\n * Function to generate unique item IDs. Scoped to the array component instance\n * to ensure SSR hydration compatibility (server and client generate same IDs).\n */\n generateItemId: () => string;\n /**\n * For primitive array items, the key of the value field in the template.\n * Passed through to createArrayItemInjectorAndInputs for form context wrapping.\n */\n primitiveFieldKey?: string;\n}\n\n/**\n * Resolves a single array item with all its fields for declarative rendering.\n *\n * Uses linkedSignal for the index, which automatically updates when itemOrderSignal changes.\n * This enables position-aware updates without recreating components when items are reordered.\n * Supports multiple sibling templates (e.g., name + email without a wrapper).\n */\nexport function resolveArrayItem<TModel extends Record<string, unknown>>(\n options: ResolveArrayItemOptions<TModel>,\n): Observable<ResolvedArrayItem | undefined> {\n const {\n index,\n templates,\n arrayField,\n itemPositionMap,\n parentFieldSignalContext,\n parentInjector,\n registry,\n destroyRef,\n loadTypeComponent,\n generateItemId,\n primitiveFieldKey,\n } = options;\n\n if (templates.length === 0) {\n return of(undefined);\n }\n\n // Generate ONE id for this array item (shared by all fields for tracking)\n const itemId = generateItemId();\n\n // O(1) position lookup via Map instead of O(n) indexOf()\n const indexSignal = linkedSignal(() => {\n const positionMap = itemPositionMap();\n return positionMap.get(itemId) ?? index;\n });\n\n // Resolve all templates in parallel\n const fieldObservables = templates.map((template) =>\n from(loadTypeComponent(template.type)).pipe(\n map((component): ResolvedArrayItemField | undefined => {\n if (destroyRef.destroyed) {\n return undefined;\n }\n\n // Componentless fields (e.g., hidden) return undefined - nothing to render\n if (!component) {\n return undefined;\n }\n\n const { injector, inputs } = createArrayItemInjectorAndInputs({\n template,\n indexSignal,\n parentFieldSignalContext,\n parentInjector,\n registry,\n arrayField,\n primitiveFieldKey,\n });\n\n // Array item templates should always have inputs (componentless fields are handled above)\n if (!inputs) {\n return undefined;\n }\n\n return {\n key: template.key,\n fieldDef: template,\n component,\n injector,\n inputs,\n renderReady: createRenderReadySignal(inputs, registry.get(template.type)),\n };\n }),\n catchError((error) => {\n if (!destroyRef.destroyed) {\n const logger = parentInjector.get(DynamicFormLogger);\n logger.error(\n `Failed to load component for field type '${template.type}' at index ${index} ` +\n `within array '${arrayField.key}'. Ensure the field type is registered in your field registry.`,\n error,\n );\n }\n return of(undefined);\n }),\n ),\n );\n\n return forkJoin(fieldObservables).pipe(\n map((fields) => {\n const validFields = fields.filter((f): f is ResolvedArrayItemField => f !== undefined);\n\n // If no fields resolved, return undefined\n if (validFields.length === 0) {\n return undefined;\n }\n\n return {\n id: itemId,\n fields: validFields,\n };\n }),\n );\n}\n","import { filter, map, Observable } from 'rxjs';\nimport { AppendArrayItemEvent } from '../../events/constants/append-array-item.event';\nimport { PrependArrayItemEvent } from '../../events/constants/prepend-array-item.event';\nimport { InsertArrayItemEvent } from '../../events/constants/insert-array-item.event';\nimport { MoveArrayItemEvent } from '../../events/constants/move-array-item.event';\nimport { PopArrayItemEvent } from '../../events/constants/pop-array-item.event';\nimport { ShiftArrayItemEvent } from '../../events/constants/shift-array-item.event';\nimport { RemoveAtIndexEvent } from '../../events/constants/remove-at-index.event';\nimport { EventBus } from '../../events/event.bus';\nimport { FieldDef } from '../../definitions/base/field-def';\n\n/**\n * Union type of all array manipulation events.\n */\nexport type ArrayEvent =\n | AppendArrayItemEvent\n | PrependArrayItemEvent\n | InsertArrayItemEvent\n | MoveArrayItemEvent\n | PopArrayItemEvent\n | ShiftArrayItemEvent\n | RemoveAtIndexEvent;\n\n/**\n * All array event type discriminants.\n */\nconst ARRAY_EVENT_TYPES: ArrayEvent['type'][] = [\n 'append-array-item',\n 'prepend-array-item',\n 'insert-array-item',\n 'move-array-item',\n 'pop-array-item',\n 'shift-array-item',\n 'remove-at-index',\n];\n\n/**\n * Normalized action representing an array manipulation.\n * Template can be:\n * - Single FieldDef for primitive items (field's value is extracted directly)\n * - Array of FieldDefs for object items (fields merged into object)\n */\nexport type ArrayAction =\n | { action: 'add'; template: FieldDef<unknown> | readonly FieldDef<unknown>[]; index?: number }\n | { action: 'remove'; index?: number }\n | { action: 'move'; fromIndex: number; toIndex: number };\n\n/**\n * Converts an array event to a normalized action.\n * Uses a switch for full type safety with discriminated union narrowing.\n */\nfunction toArrayAction(event: ArrayEvent): ArrayAction {\n switch (event.type) {\n case 'append-array-item':\n return { action: 'add', template: event.template };\n case 'prepend-array-item':\n return { action: 'add', template: event.template, index: 0 };\n case 'insert-array-item':\n return { action: 'add', template: event.template, index: event.index };\n case 'move-array-item':\n return { action: 'move', fromIndex: event.fromIndex, toIndex: event.toIndex };\n case 'pop-array-item':\n return { action: 'remove' };\n case 'shift-array-item':\n return { action: 'remove', index: 0 };\n case 'remove-at-index':\n return { action: 'remove', index: event.index };\n }\n}\n\n/**\n * Creates an observable stream of normalized array actions for a specific array key.\n *\n * @param eventBus - The event bus to subscribe to\n * @param arrayKey - Function returning the array key to filter events for\n * @returns Observable of normalized ArrayAction objects\n *\n * @example\n * ```typescript\n * observeArrayActions(this.eventBus, () => this.key())\n * .pipe(takeUntilDestroyed())\n * .subscribe(action => {\n * if (action.action === 'add') {\n * this.addItem(action.template, action.index);\n * } else {\n * this.removeItem(action.index);\n * }\n * });\n * ```\n */\nexport function observeArrayActions(eventBus: EventBus, arrayKey: () => string): Observable<ArrayAction> {\n return eventBus.on<ArrayEvent>(ARRAY_EVENT_TYPES).pipe(\n filter((event) => event.arrayKey === arrayKey()),\n map(toArrayAction),\n );\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n EnvironmentInjector,\n inject,\n Injector,\n input,\n linkedSignal,\n Signal,\n signal,\n} from '@angular/core';\nimport { DfFieldOutlet } from '../../directives/df-field-outlet.directive';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { catchError, firstValueFrom, forkJoin, map, Observable, of, tap } from 'rxjs';\nimport { explicitEffect } from 'ngxtension/explicit-effect';\nimport { ArrayField, ArrayItemDefinition, ArrayItemTemplate } from '../../definitions/default/array-field';\nimport { isGroupField } from '../../definitions/default/group-field';\nimport { injectFieldRegistry } from '../../utils/inject-field-registry/inject-field-registry';\nimport { FieldTree } from '@angular/forms/signals';\nimport { FieldDef } from '../../definitions/base/field-def';\nimport { getFieldDefaultValue } from '../../utils/default-value/default-value';\nimport { getFieldValueHandling } from '../../models/field-type';\nimport { emitComponentInitialized } from '../../utils/emit-initialization/emit-initialization';\nimport { EventBus } from '../../events/event.bus';\nimport { FieldSignalContext } from '../../mappers/types';\nimport {\n ARRAY_ITEM_ID_GENERATOR,\n ARRAY_TEMPLATE_REGISTRY,\n createArrayItemIdGenerator,\n FIELD_SIGNAL_CONTEXT,\n} from '../../models/field-signal-context.token';\nimport { determineDifferentialOperation, getArrayValue, ResolvedArrayItem } from '../../utils/array-field/array-field.types';\nimport { resolveArrayItem } from '../../utils/array-field/resolve-array-item';\nimport { observeArrayActions } from '../../utils/array-field/array-event-handler';\nimport { DynamicFormLogger } from '../../providers/features/logger/logger.token';\nimport { ArrayFieldTree } from '../../core/field-tree-utils';\nimport { getNormalizedArrayMetadata } from '../../utils/array-field/normalized-array-metadata';\n\n/**\n * Container component for rendering dynamic arrays of fields.\n *\n * Supports add/remove/move operations via the arrayEvent() builder API.\n * Uses differential updates to optimize rendering - only recreates items when necessary.\n * Each item gets a scoped injector with ARRAY_CONTEXT for position-aware operations.\n * Supports multiple sibling fields per array item (e.g., name + email without a wrapper).\n */\n@Component({\n selector: 'array-field',\n imports: [DfFieldOutlet],\n template: `\n @for (item of resolvedItems(); track item.id; let i = $index) {\n <div\n class=\"df-array-item\"\n role=\"group\"\n [attr.aria-label]=\"'Item ' + (i + 1)\"\n [attr.data-array-item-id]=\"item.id\"\n [attr.data-array-item-index]=\"i\"\n >\n @for (field of item.fields; track $index) {\n <ng-container *dfFieldOutlet=\"field; environmentInjector: environmentInjector\" />\n }\n </div>\n }\n `,\n styleUrl: './array-field.component.scss',\n host: {\n '[class]': 'hostClasses()',\n '[class.df-container-hidden]': 'hidden()',\n '[attr.aria-hidden]': 'hidden() || null',\n '[id]': '`${key()}`',\n '[attr.data-testid]': 'key()',\n },\n providers: [\n // Each array gets its own template registry to track templates used for dynamically added items\n { provide: ARRAY_TEMPLATE_REGISTRY, useFactory: () => new Map<string, FieldDef<unknown>[]>() },\n // Each array gets its own ID generator for SSR hydration compatibility\n { provide: ARRAY_ITEM_ID_GENERATOR, useFactory: createArrayItemIdGenerator },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport default class ArrayFieldComponent<TModel extends Record<string, unknown> = Record<string, unknown>> {\n // ─────────────────────────────────────────────────────────────────────────────\n // Dependencies\n // ─────────────────────────────────────────────────────────────────────────────\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly fieldRegistry = injectFieldRegistry();\n private readonly parentFieldSignalContext = inject(FIELD_SIGNAL_CONTEXT) as FieldSignalContext<TModel>;\n private readonly parentInjector = inject(Injector);\n protected readonly environmentInjector = inject(EnvironmentInjector);\n private readonly eventBus = inject(EventBus);\n private readonly logger = inject(DynamicFormLogger);\n private readonly templateRegistry = inject(ARRAY_TEMPLATE_REGISTRY);\n private readonly generateItemId = inject(ARRAY_ITEM_ID_GENERATOR);\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Inputs\n // ─────────────────────────────────────────────────────────────────────────────\n\n field = input.required<ArrayField>();\n key = input.required<string>();\n className = input<string>();\n hidden = input(false);\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Computed Signals\n // ─────────────────────────────────────────────────────────────────────────────\n\n readonly hostClasses = computed(() => {\n const base = 'df-field df-array';\n const custom = this.className();\n return custom ? `${base} ${custom}` : base;\n });\n\n private readonly rawFieldRegistry = computed(() => this.fieldRegistry.raw);\n\n /**\n * Gets the auto-remove button FieldDef from normalization metadata.\n * Set by simplified array normalization for primitive arrays with remove buttons.\n * The button is rendered alongside each item without wrapping in a row,\n * preserving flat primitive form values.\n */\n private readonly autoRemoveButton = computed<FieldDef<unknown> | undefined>(() => {\n const metadata = getNormalizedArrayMetadata(this.field());\n return metadata?.autoRemoveButton;\n });\n\n /**\n * For primitive array items, the key of the value field template (e.g., 'value').\n * Used to wrap the FormControl in the item context so getFieldTree(key) works.\n * Returns undefined for object arrays (FormGroup items have natural child navigation).\n *\n * Detection order:\n * 1. Normalization metadata (for simplified arrays — always available at normalization time)\n * 2. Existing item definitions (non-empty full-API arrays)\n * 3. Dynamically discovered key from handleAddFromEvent (empty full-API arrays)\n *\n * Uses linkedSignal: recomputes when field() changes, supports manual set()\n * for the dynamic discovery case.\n */\n private readonly primitiveFieldKey = linkedSignal<string | undefined>(() => {\n // Priority 1: Normalization metadata (simplified arrays always have this)\n const metadata = getNormalizedArrayMetadata(this.field());\n if (metadata?.primitiveFieldKey) {\n return metadata.primitiveFieldKey;\n }\n\n // Priority 2: Existing item definitions (full-API arrays with initial items)\n const definitions = (this.field().fields as ArrayItemDefinition[]) || [];\n if (definitions.length > 0 && !Array.isArray(definitions[0])) {\n return (definitions[0] as FieldDef<unknown>).key;\n }\n\n return undefined;\n });\n\n /**\n * Normalized item templates WITHOUT auto-remove button appended.\n * Each element is normalized to an array: single FieldDef → [FieldDef], array stays as-is.\n *\n * Used by moveItem() to stash raw templates into the templateRegistry, preserving\n * the invariant that registry entries are pre-synthesis (withAutoRemove() adds the\n * button during resolution).\n */\n private readonly rawItemTemplates = computed<ArrayItemTemplate[]>(() => {\n const arrayField = this.field();\n const definitions = (arrayField.fields as ArrayItemDefinition[]) || [];\n\n return definitions.map((def) => {\n return (Array.isArray(def) ? def : [def]) as ArrayItemTemplate;\n });\n });\n\n /**\n * Resolves the effective fallback template for this array — used when the form\n * value contains an item with no registered template (i.e., items that were\n * neither added via event handlers nor covered by a positional entry in `fields`).\n *\n * Populated from `SimplifiedArrayField.template` via normalization metadata, so every\n * simplified array gets an automatic default. Returns undefined for full-API arrays;\n * `createResolveItemObservable` then falls back to warn-and-drop.\n *\n * Homogeneous arrays only — all fallback items receive the same template.\n */\n private readonly fallbackTemplate = computed<FieldDef<unknown>[] | undefined>(() => {\n const raw = getNormalizedArrayMetadata(this.field())?.template;\n if (!raw) return undefined;\n return (Array.isArray(raw) ? [...raw] : [raw]) as FieldDef<unknown>[];\n });\n\n /**\n * Gets the item templates (field definitions) for the array.\n * Each element can be either:\n * - A single FieldDef (primitive item) - normalized to [FieldDef]\n * - An array of FieldDefs (object item) - used as-is\n *\n * When auto-remove is configured, the remove button is appended to each item's\n * template list for rendering. This is purely visual — the form schema uses the\n * original primitive item definition (single FieldDef → FormControl → flat value).\n *\n * Returns normalized templates where all items are arrays for consistent handling.\n */\n private readonly itemTemplates = computed<ArrayItemTemplate[]>(() => {\n const raw = this.rawItemTemplates();\n const removeButton = this.autoRemoveButton();\n\n if (!removeButton) return raw;\n\n return raw.map((normalized) => {\n return [...normalized, removeButton] as unknown as ArrayItemTemplate;\n });\n });\n\n private readonly arrayFieldTrees = computed<readonly (FieldTree<unknown> | null)[]>(() => {\n const arrayKey = this.field().key;\n const parentForm = this.parentFieldSignalContext.form;\n const arrayValue = getArrayValue(this.parentFieldSignalContext.value(), arrayKey);\n\n if (arrayValue.length === 0) return [];\n\n const arrayFieldTree = (parentForm as Record<string, ArrayFieldTree<unknown>>)[arrayKey];\n if (!arrayFieldTree) return arrayValue.map(() => null);\n\n // Access array items via bracket notation - Angular Signal Forms arrays support this\n const items: (FieldTree<unknown> | null)[] = [];\n for (let i = 0; i < arrayValue.length; i++) {\n // Access item FieldTree directly via numeric indexing (ArrayFieldTree supports this)\n const itemFieldTree = arrayFieldTree[i];\n items.push(itemFieldTree ?? null);\n }\n\n return items;\n });\n\n // ─────────────────────────────────────────────────────────────────────────────\n // State Signals\n // ─────────────────────────────────────────────────────────────────────────────\n\n private readonly resolvedItemsSignal = signal<ResolvedArrayItem[]>([]);\n private readonly updateVersion = signal(0);\n private readonly pendingInitializationCycle = signal<number | null>(null);\n private readonly settledInitializationCycle = signal<number | null>(null);\n\n /**\n * Map of item IDs to their current positions. O(1) lookup vs O(n) indexOf().\n * Used by child linkedSignals to reactively track their position in the array.\n */\n private readonly itemPositionMap = computed(() => {\n const items = this.resolvedItemsSignal();\n return new Map(items.map((item, idx) => [item.id, idx]));\n });\n\n /** Read-only view of resolved items for template consumption. */\n readonly resolvedItems = computed(() => this.resolvedItemsSignal());\n\n private readonly allResolvedFieldsRenderReady = computed(() =>\n this.resolvedItems().every((item) => item.fields.every((field) => field.renderReady())),\n );\n\n /**\n * Whether the array has reached its configured maxLength.\n * Exposed as a public signal so add-button components can bind [disabled]=\"atMaxLength()\".\n */\n readonly atMaxLength: Signal<boolean> = computed(() => {\n const maxLength = this.field().maxLength;\n if (maxLength === undefined) return false;\n const arrayKey = this.field().key;\n const currentArray = getArrayValue(this.parentFieldSignalContext.value(), arrayKey);\n return currentArray.length >= maxLength;\n });\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Auto-remove Cache\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Caches the result of appending the auto-remove button to template arrays.\n * Keyed by template array reference — cache hits occur during recreate/resolution\n * operations where stored template references are reused. Add operations via\n * handleAddFromEvent always create a fresh `[...template]` copy (line ~277),\n * so each add is a cache miss by design (the spread is needed for mutability).\n */\n private readonly autoRemoveCache = new WeakMap<readonly FieldDef<unknown>[], FieldDef<unknown>[]>();\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Constructor\n // ─────────────────────────────────────────────────────────────────────────────\n\n constructor() {\n this.setupEffects();\n this.setupEventHandlers();\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Private Methods\n // ─────────────────────────────────────────────────────────────────────────────\n\n private setupEffects(): void {\n // Sync field components when array data changes\n explicitEffect([this.arrayFieldTrees], ([fieldTrees]) => {\n this.performDifferentialUpdate(fieldTrees);\n });\n\n explicitEffect(\n [this.pendingInitializationCycle, this.settledInitializationCycle, this.allResolvedFieldsRenderReady],\n ([pending, settled, allReady]) => {\n if (pending !== null && settled === pending && allReady) {\n emitComponentInitialized(this.eventBus, 'array', this.field().key, this.parentInjector);\n this.pendingInitializationCycle.set(null);\n }\n },\n );\n }\n\n private setupEventHandlers(): void {\n observeArrayActions(this.eventBus, () => this.key())\n .pipe(takeUntilDestroyed())\n .subscribe((action) => {\n if (action.action === 'add') {\n // Template can be single FieldDef (primitive) or FieldDef[] (object)\n const templates = Array.isArray(action.template) ? action.template : action.template ? [action.template] : [];\n if (templates.length === 0) {\n this.logger.error(\n `Cannot add item to array '${this.key()}': template is REQUIRED. ` +\n 'Buttons must specify an explicit template property. ' +\n 'There is no default template - each add operation must provide its own.',\n );\n return;\n }\n void this.handleAddFromEvent(action.template, action.index);\n } else if (action.action === 'move') {\n this.moveItem(action.fromIndex, action.toIndex);\n } else {\n this.removeItem(action.index);\n }\n });\n }\n\n /**\n * Handles add operations from events (append, prepend, insert).\n * Creates resolved items FIRST, then updates form value.\n * This ensures prepend/insert work correctly - differential update sees \"none\"\n * because resolved items count already matches the new array length.\n *\n * Supports both primitive (single FieldDef) and object (FieldDef[]) templates.\n */\n private async handleAddFromEvent(template: FieldDef<unknown> | readonly FieldDef<unknown>[], index?: number): Promise<void> {\n // Normalize template to mutable array for consistent handling.\n // A single FieldDef with valueHandling: 'flatten' (container, row) is an object item\n // whose children should be flattened — NOT a primitive item. Only true leaf fields\n // (input, checkbox, etc.) are primitive when passed as a single FieldDef.\n const templates: FieldDef<unknown>[] = Array.isArray(template) ? [...template] : [template];\n const isSingleField = !Array.isArray(template);\n const isPrimitiveItem = isSingleField && getFieldValueHandling(templates[0].type, this.rawFieldRegistry()) !== 'flatten';\n\n // Track primitive field key for full-API arrays that start empty.\n // Simplified arrays already have this info from normalization metadata.\n if (isPrimitiveItem && templates[0].key && !this.primitiveFieldKey()) {\n this.primitiveFieldKey.set(templates[0].key);\n }\n\n if (templates.length === 0) {\n this.logger.error(\n `Cannot add item to array '${this.field().key}': no field templates provided. ` +\n 'Buttons must specify an explicit template property when adding array items.',\n );\n return;\n }\n\n const arrayKey = this.field().key;\n const parentForm = this.parentFieldSignalContext.form;\n const currentValue = parentForm().value() as TModel;\n const currentArray = getArrayValue(currentValue as Partial<TModel>, arrayKey);\n const insertIndex = index !== undefined ? Math.min(index, currentArray.length) : currentArray.length;\n\n // Compute default value\n let value: unknown;\n\n if (isPrimitiveItem) {\n // Primitive item: single field's value is extracted directly\n value = getFieldDefaultValue(templates[0], this.rawFieldRegistry());\n } else {\n // Object item: merge all template defaults into an object\n value = {};\n for (const templateField of templates) {\n const rawValue = getFieldDefaultValue(templateField, this.rawFieldRegistry());\n const valueHandling = getFieldValueHandling(templateField.type, this.rawFieldRegistry());\n const isContainer = templateField.type === 'group' || templateField.type === 'row' || templateField.type === 'container';\n\n if (isContainer) {\n if (isGroupField(templateField)) {\n // Groups wrap their fields under the group key\n value = { ...(value as Record<string, unknown>), [templateField.key]: rawValue };\n } else {\n // Rows and containers flatten their fields directly\n value = { ...(value as Record<string, unknown>), ...(rawValue as Record<string, unknown>) };\n }\n } else if (valueHandling === 'include' && templateField.key) {\n value = { ...(value as Record<string, unknown>), [templateField.key]: rawValue };\n }\n }\n }\n\n // Increment version and create resolved item BEFORE updating value\n this.updateVersion.update((v) => v + 1);\n const currentVersion = this.updateVersion();\n\n // Append auto-remove button to resolution templates (for rendering only)\n const resolveTemplates = this.withAutoRemove(templates);\n\n // Resolve the new item\n const resolvedItem = await firstValueFrom(\n resolveArrayItem({\n index: insertIndex,\n templates: resolveTemplates,\n arrayField: this.field(),\n itemPositionMap: this.itemPositionMap,\n parentFieldSignalContext: this.parentFieldSignalContext,\n parentInjector: this.parentInjector,\n registry: this.rawFieldRegistry(),\n destroyRef: this.destroyRef,\n loadTypeComponent: (type: string) => this.fieldRegistry.loadTypeComponent(type),\n generateItemId: this.generateItemId,\n primitiveFieldKey: isPrimitiveItem ? templates[0].key : undefined,\n }).pipe(\n catchError((error) => {\n this.logger.error(`Failed to resolve array item at index ${insertIndex}:`, error);\n return of(undefined);\n }),\n ),\n );\n\n if (currentVersion !== this.updateVersion() || !resolvedItem) {\n return;\n }\n\n // Store the template used for this item so it can be re-used during recreate operations\n this.templateRegistry.set(resolvedItem.id, templates);\n\n // Insert resolved item at correct position\n this.resolvedItemsSignal.update((current) => {\n const newItems = [...current];\n newItems.splice(insertIndex, 0, resolvedItem);\n return newItems;\n });\n\n // Update form value - differential update sees \"none\" (lengths match)\n const newArray = [...currentArray];\n newArray.splice(insertIndex, 0, value);\n // The `as any` is required because Angular Signal Forms uses complex conditional types\n // that cannot infer the correct type when setting a dynamically-keyed property\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parentForm().value.set({ ...currentValue, [arrayKey]: newArray } as any);\n }\n\n private performDifferentialUpdate(fieldTrees: readonly (FieldTree<unknown> | null)[]): void {\n const resolvedItems = this.resolvedItemsSignal();\n const operation = determineDifferentialOperation(resolvedItems, fieldTrees.length);\n\n // Only increment version for operations that do actual work.\n // \"none\" operations (value-only changes) should not interfere with async add operations.\n if (operation.type === 'none') {\n return;\n }\n\n this.updateVersion.update((v) => v + 1);\n const currentVersion = this.updateVersion();\n\n switch (operation.type) {\n case 'clear':\n // Clean up template registry when all items are removed\n this.templateRegistry.clear();\n this.resolvedItemsSignal.set([]);\n if (resolvedItems.length === 0 && this.pendingInitializationCycle() === null && this.settledInitializationCycle() === null) {\n this.pendingInitializationCycle.set(currentVersion);\n this.settledInitializationCycle.set(currentVersion);\n }\n break;\n case 'initial':\n this.pendingInitializationCycle.set(currentVersion);\n this.settledInitializationCycle.set(null);\n void this.resolveAllItems(fieldTrees, currentVersion);\n break;\n case 'append':\n void this.appendItems(fieldTrees, operation.startIndex, operation.endIndex, currentVersion);\n break;\n case 'recreate': {\n // Capture templates by item ID so each item is recreated with its original template,\n // even after move operations that change positions. Registry entries (from dynamic adds\n // or moves) take priority over positional itemTemplates lookup.\n const positionalTemplates: (FieldDef<unknown>[] | undefined)[] = resolvedItems.map((item) => {\n // Registry entries (from dynamic adds or moves) take priority;\n // unmoved initial items return undefined → falls through to itemTemplates[idx] during resolve.\n return this.templateRegistry.get(item.id);\n });\n\n this.resolvedItemsSignal.set([]);\n this.pendingInitializationCycle.set(currentVersion);\n this.settledInitializationCycle.set(null);\n void this.resolveAllItems(fieldTrees, currentVersion, positionalTemplates);\n break;\n }\n }\n }\n\n private async resolveAllItems(\n fieldTrees: readonly (FieldTree<unknown> | null)[],\n updateId: number,\n positionalTemplates?: (FieldDef<unknown>[] | undefined)[],\n ): Promise<void> {\n if (fieldTrees.length === 0) {\n this.resolvedItemsSignal.set([]);\n return;\n }\n\n // Wrap each item observable to catch individual errors\n const safeItemObservables = fieldTrees.map((_, i) =>\n this.createResolveItemObservable(i, positionalTemplates?.[i]).pipe(\n catchError((error) => {\n this.logger.error(`Failed to resolve array item at index ${i}:`, error);\n return of(undefined);\n }),\n ),\n );\n\n try {\n const items = await firstValueFrom(\n forkJoin(safeItemObservables).pipe(map((items) => items.filter((item): item is ResolvedArrayItem => item !== undefined))),\n );\n\n if (updateId === this.updateVersion()) {\n // Update template registry with new item IDs for dynamically added items\n if (positionalTemplates) {\n // Clean up old entries and add new ones\n const newItemIds = new Set(items.map((item) => item.id));\n for (const existingId of this.templateRegistry.keys()) {\n if (!newItemIds.has(existingId)) {\n this.templateRegistry.delete(existingId);\n }\n }\n items.forEach((item, idx) => {\n const template = positionalTemplates[idx];\n if (template) {\n this.templateRegistry.set(item.id, template);\n }\n });\n }\n this.resolvedItemsSignal.set(items);\n if (this.pendingInitializationCycle() === updateId) {\n this.settledInitializationCycle.set(updateId);\n }\n }\n } catch (err) {\n this.logger.error('Failed to resolve array items:', err);\n this.resolvedItemsSignal.set([]);\n }\n }\n\n private async appendItems(\n fieldTrees: readonly (FieldTree<unknown> | null)[],\n startIndex: number,\n endIndex: number,\n updateId: number,\n ): Promise<void> {\n const itemsToResolve = fieldTrees.slice(startIndex, endIndex);\n if (itemsToResolve.length === 0) return;\n\n // Wrap each item observable to catch individual errors\n const safeItemObservables = itemsToResolve.map((_, i) => {\n const index = startIndex + i;\n return this.createResolveItemObservable(index).pipe(\n catchError((error) => {\n this.logger.error(`Failed to resolve array item at index ${index}:`, error);\n return of(undefined);\n }),\n );\n });\n\n try {\n const newItems = await firstValueFrom(\n forkJoin(safeItemObservables).pipe(map((items) => items.filter((item): item is ResolvedArrayItem => item !== undefined))),\n );\n\n if (updateId === this.updateVersion()) {\n this.resolvedItemsSignal.update((current) => [...current, ...newItems]);\n }\n } catch (err) {\n this.logger.error('Failed to append array items:', err);\n }\n }\n\n /**\n * Creates an observable that resolves a single array item.\n *\n * Template resolution order:\n * 1. Use overrideTemplate if provided (from recreate with stored templates)\n * 2. Use itemTemplates[index] if within defined templates range\n * 3. Use the simplified-array fallback template (from normalization metadata) for\n * untracked items present in the form value (e.g., external `value.set`, parent\n * two-way binding, initial values beyond what was declared via simplified `value`).\n * Registers the resolved item in templateRegistry so subsequent recreates use\n * Priority 1.\n * 4. Return undefined (item cannot be resolved without a template)\n */\n private createResolveItemObservable(index: number, overrideTemplate?: FieldDef<unknown>[]): Observable<ResolvedArrayItem | undefined> {\n const itemTemplates = this.itemTemplates();\n const primitiveKey = this.primitiveFieldKey();\n\n // Priority 1: Use override template (from recreate with stored templates)\n if (overrideTemplate && overrideTemplate.length > 0) {\n return resolveArrayItem({\n index,\n templates: this.withAutoRemove(overrideTemplate),\n arrayField: this.field(),\n itemPositionMap: this.itemPositionMap,\n parentFieldSignalContext: this.parentFieldSignalContext,\n parentInjector: this.parentInjector,\n registry: this.rawFieldRegistry(),\n destroyRef: this.destroyRef,\n loadTypeComponent: (type: string) => this.fieldRegistry.loadTypeComponent(type),\n generateItemId: this.generateItemId,\n primitiveFieldKey: primitiveKey,\n });\n }\n\n // Priority 2: Use defined template at this index\n const templates = itemTemplates[index];\n if (templates && templates.length > 0) {\n return resolveArrayItem({\n index,\n templates: templates as FieldDef<unknown>[],\n arrayField: this.field(),\n itemPositionMap: this.itemPositionMap,\n parentFieldSignalContext: this.parentFieldSignalContext,\n parentInjector: this.parentInjector,\n registry: this.rawFieldRegistry(),\n destroyRef: this.destroyRef,\n loadTypeComponent: (type: string) => this.fieldRegistry.loadTypeComponent(type),\n generateItemId: this.generateItemId,\n primitiveFieldKey: primitiveKey,\n });\n }\n\n // Priority 3: Use the metadata fallback template for untracked items in the form value.\n // Homogeneous only — every fallback item receives the same template regardless of value shape.\n const fallback = this.fallbackTemplate();\n if (fallback && fallback.length > 0) {\n return resolveArrayItem({\n index,\n templates: this.withAutoRemove(fallback),\n arrayField: this.field(),\n itemPositionMap: this.itemPositionMap,\n parentFieldSignalContext: this.parentFieldSignalContext,\n parentInjector: this.parentInjector,\n registry: this.rawFieldRegistry(),\n destroyRef: this.destroyRef,\n loadTypeComponent: (type: string) => this.fieldRegistry.loadTypeComponent(type),\n generateItemId: this.generateItemId,\n primitiveFieldKey: primitiveKey,\n }).pipe(\n tap((item) => {\n // Register the fallback template against the generated item id so subsequent\n // recreates hit Priority 1 instead of re-resolving via this branch.\n if (item) this.templateRegistry.set(item.id, fallback);\n }),\n );\n }\n\n // Priority 4: no template available. Full-API arrays are positional by design —\n // `fields` declares one template per item, so values extending past `fields.length`\n // (e.g., from external `value.set`, parent two-way binding, or initial values on a\n // `fields: []` array) have no template to render. Use the simplified array API\n // (`template` + `value`) when you need homogeneous arrays with value-driven items.\n this.logger.warn(\n `No template found for array item at index ${index}. This likely occured for a Full-API array element that was created from the DynamicForm's value being set directly, which is currently not supported. Consider using the simplified array API.`,\n );\n return of(undefined);\n }\n\n /**\n * Appends the auto-remove button to a templates array for rendering.\n * The button is added for visual rendering only — it doesn't affect the form schema.\n * Original templates are stored in templateRegistry WITHOUT the remove button,\n * so this method is called during resolution to add it dynamically.\n *\n * Uses a WeakMap cache keyed by template array reference. Cache hits occur\n * during recreate/resolution paths where stored templates are reused.\n * Add operations always pass a fresh `[...template]` copy, so they miss\n * the cache intentionally (the copy is needed for mutable item construction).\n */\n private withAutoRemove(templates: FieldDef<unknown>[]): FieldDef<unknown>[] {\n const removeButton = this.autoRemoveButton();\n if (!removeButton) return templates;\n\n let cached = this.autoRemoveCache.get(templates);\n if (cached) return cached;\n\n cached = [...templates, removeButton];\n this.autoRemoveCache.set(templates, cached);\n return cached;\n }\n\n /**\n * Handles move operations — reorders an existing item without destroying it.\n * Updates resolvedItems and form value atomically. Since the array length\n * doesn't change, `determineDifferentialOperation` returns 'none' and no\n * recreate is triggered. The `@for` loop tracks by `item.id`, so Angular\n * moves the DOM node instead of destroying/recreating. The `itemPositionMap`\n * computed auto-recomputes, propagating new indices to child linkedSignals.\n */\n private moveItem(fromIndex: number, toIndex: number): void {\n const arrayKey = this.field().key;\n const parentForm = this.parentFieldSignalContext.form;\n const currentValue = parentForm().value() as TModel;\n const currentArray = getArrayValue(currentValue as Partial<TModel>, arrayKey);\n const length = currentArray.length;\n\n if (fromIndex < 0 || fromIndex >= length) {\n this.logger.warn(\n `moveArrayItem fromIndex ${fromIndex} is out of bounds for array '${arrayKey}' with length ${length}. Operation skipped.`,\n );\n return;\n }\n\n if (toIndex < 0 || toIndex >= length) {\n this.logger.warn(\n `moveArrayItem toIndex ${toIndex} is out of bounds for array '${arrayKey}' with length ${length}. Operation skipped.`,\n );\n return;\n }\n\n if (fromIndex === toIndex) return;\n\n // Register raw (pre-auto-remove) templates for all items whose position will change.\n // Initial items use itemTemplates[currentIndex] during recreate, but after\n // a move their position no longer matches their original template. Stashing\n // the template by item ID lets the recreate path resolve the correct one.\n // We use rawItemTemplates (without auto-remove button) because the recreate path\n // calls withAutoRemove() during resolution — storing the synthesized version would\n // cause duplicate remove buttons.\n const rawTemplates = this.rawItemTemplates();\n const currentItems = this.resolvedItemsSignal();\n const lo = Math.min(fromIndex, toIndex);\n const hi = Math.max(fromIndex, toIndex);\n for (let i = lo; i <= hi; i++) {\n const item = currentItems[i];\n if (item && !this.templateRegistry.has(item.id) && i < rawTemplates.length) {\n this.templateRegistry.set(item.id, rawTemplates[i] as FieldDef<unknown>[]);\n }\n }\n\n // Reorder resolvedItems — splice preserves object identity (no destroy/recreate)\n this.resolvedItemsSignal.update((current) => {\n const newItems = [...current];\n const [moved] = newItems.splice(fromIndex, 1);\n newItems.splice(toIndex, 0, moved);\n return newItems;\n });\n\n // Reorder form value array the same way\n const newArray = [...currentArray];\n const [movedValue] = newArray.splice(fromIndex, 1);\n newArray.splice(toIndex, 0, movedValue);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parentForm().value.set({ ...currentValue, [arrayKey]: newArray } as any);\n }\n\n /**\n * Handles remove operations from events (pop, shift, removeAt).\n * Updates resolvedItems FIRST, then form value - this ensures differential\n * update sees \"none\" (lengths match) and avoids unnecessary recreates.\n * Remaining items' linkedSignal indices auto-update via itemPositionMap.\n */\n private removeItem(index?: number): void {\n const arrayKey = this.field().key;\n const parentForm = this.parentFieldSignalContext.form;\n const currentValue = parentForm().value() as TModel;\n const currentArray = getArrayValue(currentValue as Partial<TModel>, arrayKey);\n\n if (currentArray.length === 0) return;\n\n // When index is undefined or -1, remove the last item.\n let removeIndex: number;\n if (index === undefined || index === -1) {\n removeIndex = currentArray.length - 1;\n } else if (index < -1 || index >= currentArray.length) {\n this.logger.warn(\n `removeArrayItem index ${index} is out of bounds for array '${arrayKey}' with length ${currentArray.length}. Operation skipped.`,\n );\n return;\n } else {\n removeIndex = index;\n }\n\n // Update resolvedItems FIRST - remove the item at the specified index.\n // This ensures differential update sees \"none\" (lengths already match).\n // Remaining items' linkedSignal indices auto-update via itemPositionMap.\n //\n // When the item is removed from resolvedItemsSignal, the @for loop removes the DOM element\n // and NgComponentOutlet destroys the component view, triggering DestroyRef callbacks.\n // Async validators use Angular's resource API tied to the form-level schema path — when the\n // array value is updated below, the resource's params re-evaluate. If the removed item's path\n // no longer exists, params returns undefined, cancelling the pending validation automatically.\n const removedItem = this.resolvedItemsSignal()[removeIndex];\n if (removedItem) {\n this.templateRegistry.delete(removedItem.id);\n }\n this.resolvedItemsSignal.update((current) => {\n const newItems = [...current];\n newItems.splice(removeIndex, 1);\n return newItems;\n });\n\n // Update the parent form with the new array value\n const newArray = [...currentArray];\n newArray.splice(removeIndex, 1);\n\n // The `as any` is required due to Angular Signal Forms' complex conditional types\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parentForm().value.set({ ...currentValue, [arrayKey]: newArray } as any);\n }\n}\n\nexport { ArrayFieldComponent };\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { inject, DestroyRef, Injector, EnvironmentInjector, viewChild, TemplateRef, ViewContainerRef, input, computed, ChangeDetectionStrategy, Component } from '@angular/core';
3
- import { i as injectFieldRegistry, E as EventBus, D as DynamicFormLogger, W as WRAPPER_AUTO_ASSOCIATIONS, a as DEFAULT_WRAPPERS, d as derivedFromDeferred, c as createFieldResolutionPipe, r as resolveWrappers, b as isSameWrapperChain, e as createWrapperChainController, f as DfFieldOutlet } from './ng-forge-dynamic-forms-ng-forge-dynamic-forms-Ll4W2Z_n.mjs';
4
- import { c as computeContainerHostClasses, s as setupContainerInitEffect } from './ng-forge-dynamic-forms-container-utils-DW_P7w-b.mjs';
3
+ import { i as injectFieldRegistry, E as EventBus, D as DynamicFormLogger, W as WRAPPER_AUTO_ASSOCIATIONS, a as DEFAULT_WRAPPERS, d as derivedFromDeferred, c as createFieldResolutionPipe, r as resolveWrappers, b as isSameWrapperChain, e as createWrapperChainController, f as DfFieldOutlet } from './ng-forge-dynamic-forms-ng-forge-dynamic-forms-o3rJX4vG.mjs';
4
+ import { c as computeContainerHostClasses, s as setupContainerInitEffect } from './ng-forge-dynamic-forms-container-utils-a4RstR2Z.mjs';
5
5
 
6
6
  /**
7
7
  * Layout container that wraps child fields with UI chrome.
@@ -84,4 +84,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
84
84
  }], ctorParameters: () => [], propDecorators: { childrenTpl: [{ type: i0.ViewChild, args: ['childrenTpl', { ...{ read: TemplateRef }, isSignal: true }] }], wrapperContainer: [{ type: i0.ViewChild, args: ['wrapperContainer', { ...{ read: ViewContainerRef }, isSignal: true }] }], field: [{ type: i0.Input, args: [{ isSignal: true, alias: "field", required: true }] }], key: [{ type: i0.Input, args: [{ isSignal: true, alias: "key", required: true }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], hidden: [{ type: i0.Input, args: [{ isSignal: true, alias: "hidden", required: false }] }] } });
85
85
 
86
86
  export { ContainerFieldComponent, ContainerFieldComponent as default };
87
- //# sourceMappingURL=ng-forge-dynamic-forms-container-field.component-PozYj2JC.mjs.map
87
+ //# sourceMappingURL=ng-forge-dynamic-forms-container-field.component-Pcxg5PQu.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ng-forge-dynamic-forms-container-field.component-PozYj2JC.mjs","sources":["../../../../packages/dynamic-forms/src/lib/fields/container/container-field.component.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n EnvironmentInjector,\n inject,\n Injector,\n input,\n TemplateRef,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { DfFieldOutlet } from '../../directives/df-field-outlet.directive';\nimport { derivedFromDeferred } from '../../utils/derived-from-deferred/derived-from-deferred';\nimport { createFieldResolutionPipe, ResolvedField } from '../../utils/resolve-field/resolve-field';\nimport { computeContainerHostClasses, setupContainerInitEffect } from '../../utils/container-utils/container-utils';\nimport { ContainerField } from '../../definitions/default/container-field';\nimport { injectFieldRegistry } from '../../utils/inject-field-registry/inject-field-registry';\nimport { EventBus } from '../../events/event.bus';\nimport { FieldDef } from '../../definitions/base/field-def';\nimport { DynamicFormLogger } from '../../providers/features/logger/logger.token';\nimport { WRAPPER_AUTO_ASSOCIATIONS } from '../../models/wrapper-type';\nimport { DEFAULT_WRAPPERS } from '../../models/field-signal-context.token';\nimport { isSameWrapperChain, resolveWrappers } from '../../utils/resolve-wrappers/resolve-wrappers';\nimport { createWrapperChainController } from '../../utils/wrapper-chain/wrapper-chain-controller';\n\n/**\n * Layout container that wraps child fields with UI chrome.\n *\n * Resolves children like a row, then chains wrapper components around them\n * using imperative `ViewContainerRef.createComponent()` — each wrapper's\n * `#fieldComponent` slot hosts the next wrapper or the children template.\n *\n * Does not create a new form context - fields share the parent's context.\n * Field values are flattened into the parent form (no nesting under container key).\n * Purely a visual/layout container with no impact on form structure.\n */\n@Component({\n selector: 'div[container-field]',\n imports: [DfFieldOutlet],\n template: `\n <ng-template #childrenTpl>\n @for (field of resolvedFields(); track field.key) {\n <ng-container *dfFieldOutlet=\"field; environmentInjector: environmentInjector\" />\n }\n </ng-template>\n <ng-container #wrapperContainer></ng-container>\n `,\n styleUrl: './container-field.component.scss',\n host: {\n '[class]': 'hostClasses()',\n '[class.disabled]': 'disabled()',\n '[class.df-container-hidden]': 'hidden()',\n '[attr.aria-hidden]': 'hidden() || null',\n '[id]': '`${key()}`',\n '[attr.data-testid]': 'key()',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport default class ContainerFieldComponent {\n private readonly destroyRef = inject(DestroyRef);\n private readonly fieldRegistry = injectFieldRegistry();\n private readonly injector = inject(Injector);\n protected readonly environmentInjector = inject(EnvironmentInjector);\n private readonly eventBus = inject(EventBus);\n private readonly logger = inject(DynamicFormLogger);\n private readonly wrapperAutoAssociations = inject(WRAPPER_AUTO_ASSOCIATIONS);\n private readonly defaultWrappersSignal = inject(DEFAULT_WRAPPERS, { optional: true });\n\n private readonly childrenTpl = viewChild.required('childrenTpl', { read: TemplateRef });\n private readonly wrapperContainer = viewChild.required('wrapperContainer', { read: ViewContainerRef });\n\n field = input.required<ContainerField>();\n key = input.required<string>();\n className = input<string>();\n hidden = input(false);\n\n readonly hostClasses = computed(() => computeContainerHostClasses('container', this.className()));\n readonly disabled = computed(() => this.field().disabled || false);\n\n private readonly rawFieldRegistry = computed(() => this.fieldRegistry.raw);\n private readonly fieldsSource = computed(() => (this.field().fields || []) as FieldDef<unknown>[]);\n\n protected readonly resolvedFields = derivedFromDeferred(\n this.fieldsSource,\n createFieldResolutionPipe(() => ({\n loadTypeComponent: (type: string) => this.fieldRegistry.loadTypeComponent(type),\n registry: this.rawFieldRegistry(),\n injector: this.injector,\n destroyRef: this.destroyRef,\n onError: (fieldDef: FieldDef<unknown>, error: unknown) => {\n const fieldKey = fieldDef.key || '<no key>';\n\n const containerKey = this.field().key || '<no key>';\n this.logger.error(\n `Failed to load component for field type '${fieldDef.type}' (key: ${fieldKey}) ` +\n `within container '${containerKey}'. Ensure the field type is registered in your field registry.`,\n error,\n );\n },\n })),\n { initialValue: [] as ResolvedField[], injector: this.injector },\n );\n\n private readonly wrappers = computed(() => resolveWrappers(this.field(), this.defaultWrappersSignal?.(), this.wrapperAutoAssociations), {\n equal: isSameWrapperChain,\n });\n\n constructor() {\n setupContainerInitEffect(this.resolvedFields, this.eventBus, 'container', () => this.field().key, this.injector);\n\n createWrapperChainController({\n vcr: this.wrapperContainer,\n wrappers: this.wrappers,\n renderInnermost: (slot) => slot.createEmbeddedView(this.childrenTpl()),\n });\n }\n}\n\nexport { ContainerFieldComponent };\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ng-forge-dynamic-forms-container-field.component-Pcxg5PQu.mjs","sources":["../../../../packages/dynamic-forms/src/lib/fields/container/container-field.component.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n EnvironmentInjector,\n inject,\n Injector,\n input,\n TemplateRef,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { DfFieldOutlet } from '../../directives/df-field-outlet.directive';\nimport { derivedFromDeferred } from '../../utils/derived-from-deferred/derived-from-deferred';\nimport { createFieldResolutionPipe, ResolvedField } from '../../utils/resolve-field/resolve-field';\nimport { computeContainerHostClasses, setupContainerInitEffect } from '../../utils/container-utils/container-utils';\nimport { ContainerField } from '../../definitions/default/container-field';\nimport { injectFieldRegistry } from '../../utils/inject-field-registry/inject-field-registry';\nimport { EventBus } from '../../events/event.bus';\nimport { FieldDef } from '../../definitions/base/field-def';\nimport { DynamicFormLogger } from '../../providers/features/logger/logger.token';\nimport { WRAPPER_AUTO_ASSOCIATIONS } from '../../models/wrapper-type';\nimport { DEFAULT_WRAPPERS } from '../../models/field-signal-context.token';\nimport { isSameWrapperChain, resolveWrappers } from '../../utils/resolve-wrappers/resolve-wrappers';\nimport { createWrapperChainController } from '../../utils/wrapper-chain/wrapper-chain-controller';\n\n/**\n * Layout container that wraps child fields with UI chrome.\n *\n * Resolves children like a row, then chains wrapper components around them\n * using imperative `ViewContainerRef.createComponent()` — each wrapper's\n * `#fieldComponent` slot hosts the next wrapper or the children template.\n *\n * Does not create a new form context - fields share the parent's context.\n * Field values are flattened into the parent form (no nesting under container key).\n * Purely a visual/layout container with no impact on form structure.\n */\n@Component({\n selector: 'div[container-field]',\n imports: [DfFieldOutlet],\n template: `\n <ng-template #childrenTpl>\n @for (field of resolvedFields(); track field.key) {\n <ng-container *dfFieldOutlet=\"field; environmentInjector: environmentInjector\" />\n }\n </ng-template>\n <ng-container #wrapperContainer></ng-container>\n `,\n styleUrl: './container-field.component.scss',\n host: {\n '[class]': 'hostClasses()',\n '[class.disabled]': 'disabled()',\n '[class.df-container-hidden]': 'hidden()',\n '[attr.aria-hidden]': 'hidden() || null',\n '[id]': '`${key()}`',\n '[attr.data-testid]': 'key()',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport default class ContainerFieldComponent {\n private readonly destroyRef = inject(DestroyRef);\n private readonly fieldRegistry = injectFieldRegistry();\n private readonly injector = inject(Injector);\n protected readonly environmentInjector = inject(EnvironmentInjector);\n private readonly eventBus = inject(EventBus);\n private readonly logger = inject(DynamicFormLogger);\n private readonly wrapperAutoAssociations = inject(WRAPPER_AUTO_ASSOCIATIONS);\n private readonly defaultWrappersSignal = inject(DEFAULT_WRAPPERS, { optional: true });\n\n private readonly childrenTpl = viewChild.required('childrenTpl', { read: TemplateRef });\n private readonly wrapperContainer = viewChild.required('wrapperContainer', { read: ViewContainerRef });\n\n field = input.required<ContainerField>();\n key = input.required<string>();\n className = input<string>();\n hidden = input(false);\n\n readonly hostClasses = computed(() => computeContainerHostClasses('container', this.className()));\n readonly disabled = computed(() => this.field().disabled || false);\n\n private readonly rawFieldRegistry = computed(() => this.fieldRegistry.raw);\n private readonly fieldsSource = computed(() => (this.field().fields || []) as FieldDef<unknown>[]);\n\n protected readonly resolvedFields = derivedFromDeferred(\n this.fieldsSource,\n createFieldResolutionPipe(() => ({\n loadTypeComponent: (type: string) => this.fieldRegistry.loadTypeComponent(type),\n registry: this.rawFieldRegistry(),\n injector: this.injector,\n destroyRef: this.destroyRef,\n onError: (fieldDef: FieldDef<unknown>, error: unknown) => {\n const fieldKey = fieldDef.key || '<no key>';\n\n const containerKey = this.field().key || '<no key>';\n this.logger.error(\n `Failed to load component for field type '${fieldDef.type}' (key: ${fieldKey}) ` +\n `within container '${containerKey}'. Ensure the field type is registered in your field registry.`,\n error,\n );\n },\n })),\n { initialValue: [] as ResolvedField[], injector: this.injector },\n );\n\n private readonly wrappers = computed(() => resolveWrappers(this.field(), this.defaultWrappersSignal?.(), this.wrapperAutoAssociations), {\n equal: isSameWrapperChain,\n });\n\n constructor() {\n setupContainerInitEffect(this.resolvedFields, this.eventBus, 'container', () => this.field().key, this.injector);\n\n createWrapperChainController({\n vcr: this.wrapperContainer,\n wrappers: this.wrappers,\n renderInnermost: (slot) => slot.createEmbeddedView(this.childrenTpl()),\n });\n }\n}\n\nexport { ContainerFieldComponent };\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { computed } from '@angular/core';
2
2
  import { explicitEffect } from 'ngxtension/explicit-effect';
3
- import { e as emitComponentInitialized } from './ng-forge-dynamic-forms-emit-initialization-CSx0gwFc.mjs';
3
+ import { e as emitComponentInitialized } from './ng-forge-dynamic-forms-emit-initialization-Bjf_I0D_.mjs';
4
4
 
5
5
  /**
6
6
  * Computes the host class string for a container component.
@@ -45,4 +45,4 @@ function setupContainerInitEffect(resolvedFields, eventBus, componentType, field
45
45
  }
46
46
 
47
47
  export { computeContainerHostClasses as c, setupContainerInitEffect as s };
48
- //# sourceMappingURL=ng-forge-dynamic-forms-container-utils-DW_P7w-b.mjs.map
48
+ //# sourceMappingURL=ng-forge-dynamic-forms-container-utils-a4RstR2Z.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ng-forge-dynamic-forms-container-utils-DW_P7w-b.mjs","sources":["../../../../packages/dynamic-forms/src/lib/utils/container-utils/container-utils.ts"],"sourcesContent":["import { computed, Injector, Signal } from '@angular/core';\nimport { explicitEffect } from 'ngxtension/explicit-effect';\nimport { EventBus } from '../../events/event.bus';\nimport { emitComponentInitialized, InitializationComponentType } from '../emit-initialization/emit-initialization';\nimport { ResolvedField } from '../resolve-field/resolve-field';\n\n/**\n * Computes the host class string for a container component.\n *\n * All containers follow the pattern: `df-field df-{type}` + optional custom class.\n *\n * @param containerType - The CSS class suffix (e.g., 'group', 'row', 'page-field')\n * @param className - Optional custom class name to append\n * @returns The computed host class string\n */\nexport function computeContainerHostClasses(containerType: string, className: string | undefined): string {\n const base = `df-field df-${containerType}`;\n return className ? `${base} ${className}` : base;\n}\n\n/**\n * Sets up the initialization effect common to all container components.\n *\n * When resolved fields become non-empty, emits a ComponentInitializedEvent\n * via afterNextRender to signal the container is ready.\n *\n * `componentType` may be a static value or a lazy getter — the latter lets\n * virtual field types preserve their original type on the emitted event\n * instead of collapsing to the host component's type.\n *\n * @param resolvedFields - Signal of resolved fields\n * @param eventBus - EventBus for dispatching initialization events\n * @param componentType - Static type, or a getter evaluated at emission time\n * @param fieldKeyFn - Function returning the field's key\n * @param injector - Injector for afterNextRender scheduling\n */\nexport function setupContainerInitEffect(\n resolvedFields: Signal<ResolvedField[]>,\n eventBus: EventBus,\n componentType: InitializationComponentType | (() => InitializationComponentType),\n fieldKeyFn: () => string,\n injector: Injector,\n): void {\n const allReady = computed(() => {\n const fields = resolvedFields();\n return fields.length > 0 && fields.every((field) => field.renderReady());\n });\n\n explicitEffect([allReady], ([ready]) => {\n if (ready) {\n const type = typeof componentType === 'function' ? componentType() : componentType;\n emitComponentInitialized(eventBus, type, fieldKeyFn(), injector);\n }\n });\n}\n"],"names":[],"mappings":";;;;AAMA;;;;;;;;AAQG;AACG,SAAU,2BAA2B,CAAC,aAAqB,EAAE,SAA6B,EAAA;AAC9F,IAAA,MAAM,IAAI,GAAG,CAAA,YAAA,EAAe,aAAa,EAAE;AAC3C,IAAA,OAAO,SAAS,GAAG,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,GAAG,IAAI;AAClD;AAEA;;;;;;;;;;;;;;;AAeG;AACG,SAAU,wBAAwB,CACtC,cAAuC,EACvC,QAAkB,EAClB,aAAgF,EAChF,UAAwB,EACxB,QAAkB,EAAA;AAElB,IAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAC7B,QAAA,MAAM,MAAM,GAAG,cAAc,EAAE;QAC/B,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC;AAC1E,IAAA,CAAC,+EAAC;IAEF,cAAc,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,KAAI;QACrC,IAAI,KAAK,EAAE;AACT,YAAA,MAAM,IAAI,GAAG,OAAO,aAAa,KAAK,UAAU,GAAG,aAAa,EAAE,GAAG,aAAa;YAClF,wBAAwB,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,QAAQ,CAAC;QAClE;AACF,IAAA,CAAC,CAAC;AACJ;;;;"}
1
+ {"version":3,"file":"ng-forge-dynamic-forms-container-utils-a4RstR2Z.mjs","sources":["../../../../packages/dynamic-forms/src/lib/utils/container-utils/container-utils.ts"],"sourcesContent":["import { computed, Injector, Signal } from '@angular/core';\nimport { explicitEffect } from 'ngxtension/explicit-effect';\nimport { EventBus } from '../../events/event.bus';\nimport { emitComponentInitialized, InitializationComponentType } from '../emit-initialization/emit-initialization';\nimport { ResolvedField } from '../resolve-field/resolve-field';\n\n/**\n * Computes the host class string for a container component.\n *\n * All containers follow the pattern: `df-field df-{type}` + optional custom class.\n *\n * @param containerType - The CSS class suffix (e.g., 'group', 'row', 'page-field')\n * @param className - Optional custom class name to append\n * @returns The computed host class string\n */\nexport function computeContainerHostClasses(containerType: string, className: string | undefined): string {\n const base = `df-field df-${containerType}`;\n return className ? `${base} ${className}` : base;\n}\n\n/**\n * Sets up the initialization effect common to all container components.\n *\n * When resolved fields become non-empty, emits a ComponentInitializedEvent\n * via afterNextRender to signal the container is ready.\n *\n * `componentType` may be a static value or a lazy getter — the latter lets\n * virtual field types preserve their original type on the emitted event\n * instead of collapsing to the host component's type.\n *\n * @param resolvedFields - Signal of resolved fields\n * @param eventBus - EventBus for dispatching initialization events\n * @param componentType - Static type, or a getter evaluated at emission time\n * @param fieldKeyFn - Function returning the field's key\n * @param injector - Injector for afterNextRender scheduling\n */\nexport function setupContainerInitEffect(\n resolvedFields: Signal<ResolvedField[]>,\n eventBus: EventBus,\n componentType: InitializationComponentType | (() => InitializationComponentType),\n fieldKeyFn: () => string,\n injector: Injector,\n): void {\n const allReady = computed(() => {\n const fields = resolvedFields();\n return fields.length > 0 && fields.every((field) => field.renderReady());\n });\n\n explicitEffect([allReady], ([ready]) => {\n if (ready) {\n const type = typeof componentType === 'function' ? componentType() : componentType;\n emitComponentInitialized(eventBus, type, fieldKeyFn(), injector);\n }\n });\n}\n"],"names":[],"mappings":";;;;AAMA;;;;;;;;AAQG;AACG,SAAU,2BAA2B,CAAC,aAAqB,EAAE,SAA6B,EAAA;AAC9F,IAAA,MAAM,IAAI,GAAG,CAAA,YAAA,EAAe,aAAa,EAAE;AAC3C,IAAA,OAAO,SAAS,GAAG,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,GAAG,IAAI;AAClD;AAEA;;;;;;;;;;;;;;;AAeG;AACG,SAAU,wBAAwB,CACtC,cAAuC,EACvC,QAAkB,EAClB,aAAgF,EAChF,UAAwB,EACxB,QAAkB,EAAA;AAElB,IAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAC7B,QAAA,MAAM,MAAM,GAAG,cAAc,EAAE;QAC/B,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC;AAC1E,IAAA,CAAC,+EAAC;IAEF,cAAc,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,KAAI;QACrC,IAAI,KAAK,EAAE;AACT,YAAA,MAAM,IAAI,GAAG,OAAO,aAAa,KAAK,UAAU,GAAG,aAAa,EAAE,GAAG,aAAa;YAClF,wBAAwB,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,QAAQ,CAAC;QAClE;AACF,IAAA,CAAC,CAAC;AACJ;;;;"}
@@ -2,7 +2,7 @@ import * as i0 from '@angular/core';
2
2
  import { viewChild, ViewContainerRef, input, ChangeDetectionStrategy, Component } from '@angular/core';
3
3
  import { pipe, switchMap } from 'rxjs';
4
4
  import { derivedFrom } from 'ngxtension/derived-from';
5
- import { w as dynamicTextToObservable } from './ng-forge-dynamic-forms-ng-forge-dynamic-forms-Ll4W2Z_n.mjs';
5
+ import { w as dynamicTextToObservable } from './ng-forge-dynamic-forms-ng-forge-dynamic-forms-o3rJX4vG.mjs';
6
6
 
7
7
  /**
8
8
  * Built-in CSS wrapper component.
@@ -47,4 +47,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
47
47
  }], propDecorators: { fieldComponent: [{ type: i0.ViewChild, args: ['fieldComponent', { ...{ read: ViewContainerRef }, isSignal: true }] }], cssClasses: [{ type: i0.Input, args: [{ isSignal: true, alias: "cssClasses", required: false }] }], fieldInputs: [{ type: i0.Input, args: [{ isSignal: true, alias: "fieldInputs", required: false }] }] } });
48
48
 
49
49
  export { CssWrapperComponent, CssWrapperComponent as default };
50
- //# sourceMappingURL=ng-forge-dynamic-forms-css-wrapper.component-DrtHSaVV.mjs.map
50
+ //# sourceMappingURL=ng-forge-dynamic-forms-css-wrapper.component-CJACCIEK.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ng-forge-dynamic-forms-css-wrapper.component-CJACCIEK.mjs","sources":["../../../../packages/dynamic-forms/src/lib/wrappers/css/css-wrapper.component.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input, Signal, ViewContainerRef, viewChild } from '@angular/core';\nimport { pipe, switchMap } from 'rxjs';\nimport { derivedFrom } from 'ngxtension/derived-from';\nimport { FieldWrapper } from '../../models/wrapper-type';\nimport { DynamicText } from '../../models/types/dynamic-text';\nimport { dynamicTextToObservable } from '../../utils/dynamic-text-to-observable';\nimport { WrapperFieldInputs } from '../wrapper-field-inputs';\n\n/**\n * Built-in CSS wrapper component.\n *\n * Applies CSS classes from the `cssClasses` config property to the host element,\n * wrapping the inner content (next wrapper or children) in its ViewContainerRef slot.\n *\n * Receives `cssClasses` as an individual Angular input (set by the outlet via\n * `setInput()`). `fieldInputs` carries the wrapped field's mapper outputs +\n * a read-only view of its form state (via `ReadonlyFieldTree`).\n *\n * @example\n * ```typescript\n * {\n * type: 'container',\n * key: 'styled',\n * wrappers: [{ type: 'css', cssClasses: 'card p-4' }],\n * fields: [...]\n * }\n * ```\n */\n@Component({\n selector: 'df-css-wrapper',\n template: `<ng-container #fieldComponent></ng-container>`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'resolvedClasses()',\n },\n})\nexport default class CssWrapperComponent implements FieldWrapper {\n readonly fieldComponent = viewChild.required('fieldComponent', { read: ViewContainerRef });\n\n readonly cssClasses = input<DynamicText>();\n readonly fieldInputs = input<WrapperFieldInputs>();\n\n readonly resolvedClasses: Signal<string> = derivedFrom([this.cssClasses], pipe(switchMap(([value]) => dynamicTextToObservable(value))), {\n initialValue: '',\n });\n}\n\nexport { CssWrapperComponent };\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { afterNextRender } from '@angular/core';
2
- import { D as DynamicFormLogger, t as ComponentInitializedEvent } from './ng-forge-dynamic-forms-ng-forge-dynamic-forms-Ll4W2Z_n.mjs';
2
+ import { D as DynamicFormLogger, t as ComponentInitializedEvent } from './ng-forge-dynamic-forms-ng-forge-dynamic-forms-o3rJX4vG.mjs';
3
3
 
4
4
  /**
5
5
  * Emits a component initialization event after the next render cycle.
@@ -26,4 +26,4 @@ function emitComponentInitialized(eventBus, componentType, componentKey, injecto
26
26
  }
27
27
 
28
28
  export { emitComponentInitialized as e };
29
- //# sourceMappingURL=ng-forge-dynamic-forms-emit-initialization-CSx0gwFc.mjs.map
29
+ //# sourceMappingURL=ng-forge-dynamic-forms-emit-initialization-Bjf_I0D_.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ng-forge-dynamic-forms-emit-initialization-CSx0gwFc.mjs","sources":["../../../../packages/dynamic-forms/src/lib/utils/emit-initialization/emit-initialization.ts"],"sourcesContent":["import { afterNextRender, Injector } from '@angular/core';\nimport { EventBus } from '../../events/event.bus';\nimport { ComponentInitializedEvent } from '../../events/constants/component-initialized.event';\nimport { DynamicFormLogger } from '../../providers/features/logger/logger.token';\n\n/**\n * Component type for initialization events.\n */\nexport type InitializationComponentType = 'dynamic-form' | 'group' | 'page' | 'array' | 'container';\n\n/**\n * Emits a component initialization event after the next render cycle.\n *\n * This utility is used by container components (group, page, array, container) to signal\n * that their child fields have been resolved and rendered. The event is dispatched\n * through the EventBus and is used by the initialization tracking system.\n *\n * @param eventBus - The EventBus instance to dispatch the event on\n * @param componentType - The type of component being initialized\n * @param componentKey - The unique key/id of the component\n * @param injector - The injector to use for afterNextRender scheduling\n */\nexport function emitComponentInitialized(\n eventBus: EventBus,\n componentType: InitializationComponentType,\n componentKey: string,\n injector: Injector,\n): void {\n const logger = injector.get(DynamicFormLogger);\n\n afterNextRender(\n () => {\n try {\n eventBus.dispatch(ComponentInitializedEvent, componentType, componentKey);\n } catch (error: unknown) {\n logger.error(`Failed to emit initialization event for ${componentType} '${componentKey}'`, error);\n }\n },\n { injector },\n );\n}\n"],"names":[],"mappings":";;;AAUA;;;;;;;;;;;AAWG;AACG,SAAU,wBAAwB,CACtC,QAAkB,EAClB,aAA0C,EAC1C,YAAoB,EACpB,QAAkB,EAAA;IAElB,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAE9C,eAAe,CACb,MAAK;AACH,QAAA,IAAI;YACF,QAAQ,CAAC,QAAQ,CAAC,yBAAyB,EAAE,aAAa,EAAE,YAAY,CAAC;QAC3E;QAAE,OAAO,KAAc,EAAE;YACvB,MAAM,CAAC,KAAK,CAAC,CAAA,wCAAA,EAA2C,aAAa,CAAA,EAAA,EAAK,YAAY,CAAA,CAAA,CAAG,EAAE,KAAK,CAAC;QACnG;AACF,IAAA,CAAC,EACD,EAAE,QAAQ,EAAE,CACb;AACH;;;;"}
1
+ {"version":3,"file":"ng-forge-dynamic-forms-emit-initialization-Bjf_I0D_.mjs","sources":["../../../../packages/dynamic-forms/src/lib/utils/emit-initialization/emit-initialization.ts"],"sourcesContent":["import { afterNextRender, Injector } from '@angular/core';\nimport { EventBus } from '../../events/event.bus';\nimport { ComponentInitializedEvent } from '../../events/constants/component-initialized.event';\nimport { DynamicFormLogger } from '../../providers/features/logger/logger.token';\n\n/**\n * Component type for initialization events.\n */\nexport type InitializationComponentType = 'dynamic-form' | 'group' | 'page' | 'array' | 'container';\n\n/**\n * Emits a component initialization event after the next render cycle.\n *\n * This utility is used by container components (group, page, array, container) to signal\n * that their child fields have been resolved and rendered. The event is dispatched\n * through the EventBus and is used by the initialization tracking system.\n *\n * @param eventBus - The EventBus instance to dispatch the event on\n * @param componentType - The type of component being initialized\n * @param componentKey - The unique key/id of the component\n * @param injector - The injector to use for afterNextRender scheduling\n */\nexport function emitComponentInitialized(\n eventBus: EventBus,\n componentType: InitializationComponentType,\n componentKey: string,\n injector: Injector,\n): void {\n const logger = injector.get(DynamicFormLogger);\n\n afterNextRender(\n () => {\n try {\n eventBus.dispatch(ComponentInitializedEvent, componentType, componentKey);\n } catch (error: unknown) {\n logger.error(`Failed to emit initialization event for ${componentType} '${componentKey}'`, error);\n }\n },\n { injector },\n );\n}\n"],"names":[],"mappings":";;;AAUA;;;;;;;;;;;AAWG;AACG,SAAU,wBAAwB,CACtC,QAAkB,EAClB,aAA0C,EAC1C,YAAoB,EACpB,QAAkB,EAAA;IAElB,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAE9C,eAAe,CACb,MAAK;AACH,QAAA,IAAI;YACF,QAAQ,CAAC,QAAQ,CAAC,yBAAyB,EAAE,aAAa,EAAE,YAAY,CAAC;QAC3E;QAAE,OAAO,KAAc,EAAE;YACvB,MAAM,CAAC,KAAK,CAAC,CAAA,wCAAA,EAA2C,aAAa,CAAA,EAAA,EAAK,YAAY,CAAA,CAAA,CAAG,EAAE,KAAK,CAAC;QACnG;AACF,IAAA,CAAC,EACD,EAAE,QAAQ,EAAE,CACb;AACH;;;;"}
@@ -1,9 +1,9 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { inject, DestroyRef, Injector, EnvironmentInjector, input, computed, linkedSignal, runInInjectionContext, untracked, ChangeDetectionStrategy, Component } from '@angular/core';
3
- import { i as injectFieldRegistry, F as FIELD_SIGNAL_CONTEXT, E as EventBus, D as DynamicFormLogger, C as CONTAINER_FIELD_PROCESSORS, g as isEqual, h as createSchemaFromFields, d as derivedFromDeferred, c as createFieldResolutionPipe, f as DfFieldOutlet } from './ng-forge-dynamic-forms-ng-forge-dynamic-forms-Ll4W2Z_n.mjs';
3
+ import { i as injectFieldRegistry, F as FIELD_SIGNAL_CONTEXT, G as GROUP_CONTEXT, E as EventBus, D as DynamicFormLogger, C as CONTAINER_FIELD_PROCESSORS, g as isEqual, h as createSchemaFromFields, d as derivedFromDeferred, c as createFieldResolutionPipe, f as DfFieldOutlet } from './ng-forge-dynamic-forms-ng-forge-dynamic-forms-o3rJX4vG.mjs';
4
4
  import { outputFromObservable, toObservable } from '@angular/core/rxjs-interop';
5
5
  import { explicitEffect } from 'ngxtension/explicit-effect';
6
- import { c as computeContainerHostClasses, s as setupContainerInitEffect } from './ng-forge-dynamic-forms-container-utils-DW_P7w-b.mjs';
6
+ import { c as computeContainerHostClasses, s as setupContainerInitEffect } from './ng-forge-dynamic-forms-container-utils-a4RstR2Z.mjs';
7
7
  import { form } from '@angular/forms/signals';
8
8
 
9
9
  /**
@@ -20,6 +20,7 @@ class GroupFieldComponent {
20
20
  destroyRef = inject(DestroyRef);
21
21
  fieldRegistry = injectFieldRegistry();
22
22
  parentFieldSignalContext = inject(FIELD_SIGNAL_CONTEXT);
23
+ parentGroupContext = inject(GROUP_CONTEXT, { optional: true });
23
24
  injector = inject(Injector);
24
25
  environmentInjector = inject(EnvironmentInjector);
25
26
  eventBus = inject(EventBus);
@@ -116,9 +117,25 @@ class GroupFieldComponent {
116
117
  },
117
118
  };
118
119
  })();
120
+ /**
121
+ * Group context propagated to descendants — carries the dot-separated path of
122
+ * group ancestors so child fields can scope their DOM IDs (issue #401).
123
+ * Reactive via `computed()`: a nested group composes its path from the parent
124
+ * context signal + its own key, so the chain stays consistent if either changes.
125
+ */
126
+ groupContext = {
127
+ groupPath: computed(() => {
128
+ const ownKey = this.field().key;
129
+ const parentPath = this.parentGroupContext?.groupPath();
130
+ return parentPath ? `${parentPath}.${ownKey}` : ownKey;
131
+ }),
132
+ };
119
133
  groupInjector = Injector.create({
120
134
  parent: this.injector,
121
- providers: [{ provide: FIELD_SIGNAL_CONTEXT, useValue: this.groupFieldSignalContext }],
135
+ providers: [
136
+ { provide: FIELD_SIGNAL_CONTEXT, useValue: this.groupFieldSignalContext },
137
+ { provide: GROUP_CONTEXT, useValue: this.groupContext },
138
+ ],
122
139
  });
123
140
  // ─────────────────────────────────────────────────────────────────────────────
124
141
  // Outputs
@@ -177,10 +194,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
177
194
  '[class.disabled]': 'disabled()',
178
195
  '[class.df-container-hidden]': 'hidden()',
179
196
  '[attr.aria-hidden]': 'hidden() || null',
197
+ // The group element's own id is the plain `key()` — only its DESCENDANTS
198
+ // compose scoped ids via GROUP_CONTEXT (e.g. children of an `address`
199
+ // group render as `address_street`). The group selector is `#address`.
180
200
  '[id]': '`${key()}`',
181
201
  '[attr.data-testid]': 'key()',
182
202
  }, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host,.df-form{--df-grid-columns: 12;--df-grid-gap: .5rem;--df-grid-row-gap: .5rem;--df-breakpoint-sm: 576px;--df-breakpoint-md: 768px;--df-breakpoint-lg: 992px;--df-breakpoint-xl: 1200px;--df-grid-gap-sm: .5rem;--df-grid-gap-md: .5rem;--df-grid-gap-lg: .5rem;--df-grid-gap-xl: .5rem;--df-grid-row-gap-sm: .5rem;--df-grid-row-gap-md: .5rem;--df-grid-row-gap-lg: .5rem;--df-grid-row-gap-xl: .5rem;--df-array-item-gap: var(--df-grid-row-gap);--df-group-gap: var(--df-grid-gap);--df-group-padding: var(--df-grid-gap)}.df-form{display:grid;grid-template-columns:1fr;gap:var(--df-grid-row-gap);width:100%}.df-form>*{grid-column:1/-1}.df-row{display:grid;grid-template-columns:repeat(var(--df-grid-columns, 12),1fr);gap:var(--df-grid-gap);align-items:start;width:100%}.df-row>*:not([class*=df-col-]){grid-column:1/-1}.df-col-1{grid-column:span 1}.df-col-2{grid-column:span 2}.df-col-3{grid-column:span 3}.df-col-4{grid-column:span 4}.df-col-5{grid-column:span 5}.df-col-6{grid-column:span 6}.df-col-7{grid-column:span 7}.df-col-8{grid-column:span 8}.df-col-9{grid-column:span 9}.df-col-10{grid-column:span 10}.df-col-11{grid-column:span 11}.df-col-12{grid-column:span 12}.df-col-auto{grid-column:span auto;width:auto}.df-col-full{grid-column:1/-1}.df-col-start-1{grid-column-start:1}.df-col-start-2{grid-column-start:2}.df-col-start-3{grid-column-start:3}.df-col-start-4{grid-column-start:4}.df-col-start-5{grid-column-start:5}.df-col-start-6{grid-column-start:6}.df-col-start-7{grid-column-start:7}.df-col-start-8{grid-column-start:8}.df-col-start-9{grid-column-start:9}.df-col-start-10{grid-column-start:10}.df-col-start-11{grid-column-start:11}.df-col-start-12{grid-column-start:12}.df-col-end-1{grid-column-end:1}.df-col-end-2{grid-column-end:2}.df-col-end-3{grid-column-end:3}.df-col-end-4{grid-column-end:4}.df-col-end-5{grid-column-end:5}.df-col-end-6{grid-column-end:6}.df-col-end-7{grid-column-end:7}.df-col-end-8{grid-column-end:8}.df-col-end-9{grid-column-end:9}.df-col-end-10{grid-column-end:10}.df-col-end-11{grid-column-end:11}.df-col-end-12{grid-column-end:12}.df-col-end-13{grid-column-end:13}@media(max-width:576px){.df-form{--df-grid-gap: var(--df-grid-gap-sm);--df-grid-row-gap: var(--df-grid-row-gap-sm)}.df-row{grid-template-columns:1fr}.df-row>*{grid-column:1/-1!important}.df-row.df-row-mobile-keep-cols{grid-template-columns:repeat(var(--df-grid-columns),1fr)}.df-row.df-row-mobile-keep-cols>*{grid-column:revert!important}}@media(min-width:577px)and (max-width:768px){.df-form{--df-grid-gap: var(--df-grid-gap-md);--df-grid-row-gap: var(--df-grid-row-gap-md)}.df-row{--df-grid-columns: 6}.df-col-sm-1{grid-column:span 1}.df-col-sm-2{grid-column:span 2}.df-col-sm-3{grid-column:span 3}.df-col-sm-4{grid-column:span 4}.df-col-sm-5{grid-column:span 5}.df-col-sm-6{grid-column:span 6}.df-col-sm-full{grid-column:1/-1}}@media(min-width:769px)and (max-width:992px){.df-form{--df-grid-gap: var(--df-grid-gap-lg);--df-grid-row-gap: var(--df-grid-row-gap-lg)}.df-col-md-1{grid-column:span 1}.df-col-md-2{grid-column:span 2}.df-col-md-3{grid-column:span 3}.df-col-md-4{grid-column:span 4}.df-col-md-5{grid-column:span 5}.df-col-md-6{grid-column:span 6}.df-col-md-7{grid-column:span 7}.df-col-md-8{grid-column:span 8}.df-col-md-9{grid-column:span 9}.df-col-md-10{grid-column:span 10}.df-col-md-11{grid-column:span 11}.df-col-md-12{grid-column:span 12}.df-col-md-full{grid-column:1/-1}}@media(min-width:993px){.df-form{--df-grid-gap: var(--df-grid-gap-xl);--df-grid-row-gap: var(--df-grid-row-gap-xl)}.df-col-lg-1{grid-column:span 1}.df-col-lg-2{grid-column:span 2}.df-col-lg-3{grid-column:span 3}.df-col-lg-4{grid-column:span 4}.df-col-lg-5{grid-column:span 5}.df-col-lg-6{grid-column:span 6}.df-col-lg-7{grid-column:span 7}.df-col-lg-8{grid-column:span 8}.df-col-lg-9{grid-column:span 9}.df-col-lg-10{grid-column:span 10}.df-col-lg-11{grid-column:span 11}.df-col-lg-12{grid-column:span 12}.df-col-lg-full{grid-column:1/-1}}.df-gap-none{--df-grid-gap: 0}.df-gap-xs{--df-grid-gap: .25rem}.df-gap-sm{--df-grid-gap: .5rem}.df-gap-md{--df-grid-gap: 1rem}.df-gap-lg{--df-grid-gap: 1.5rem}.df-gap-xl{--df-grid-gap: 2rem}.df-row-gap-none{--df-grid-row-gap: 0}.df-row-gap-xs{--df-grid-row-gap: .25rem}.df-row-gap-sm{--df-grid-row-gap: .5rem}.df-row-gap-md{--df-grid-row-gap: 1rem}.df-row-gap-lg{--df-grid-row-gap: 1.5rem}.df-row-gap-xl{--df-grid-row-gap: 2rem}.df-field{display:block;width:100%;min-width:0;overflow:hidden;margin:0}.df-group,.df-page{display:block;width:100%}.df-form.disabled,.df-row.disabled,.df-field.disabled{opacity:.6;pointer-events:none}.df-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.df-sr-only-focusable:focus,.df-sr-only-focusable:active{position:static;width:auto;height:auto;padding:inherit;margin:inherit;overflow:visible;clip:auto;white-space:normal}.df-live-region{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.df-form :focus-visible{outline:2px solid var(--df-focus-color, #005fcc);outline-offset:2px}.df-group:focus-within{outline:1px dashed var(--df-focus-color, #005fcc);outline-offset:4px}:host{border:none;margin:0;padding:0;min-width:0;display:grid;grid-template-columns:1fr;gap:var(--df-grid-row-gap, .5rem);width:100%}:host>*{grid-column:1/-1}:host.df-container-hidden{display:none}\n"] }]
183
203
  }], ctorParameters: () => [], propDecorators: { field: [{ type: i0.Input, args: [{ isSignal: true, alias: "field", required: true }] }], key: [{ type: i0.Input, args: [{ isSignal: true, alias: "key", required: true }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], hidden: [{ type: i0.Input, args: [{ isSignal: true, alias: "hidden", required: false }] }], validityChange: [{ type: i0.Output, args: ["validityChange"] }], dirtyChange: [{ type: i0.Output, args: ["dirtyChange"] }], submitted: [{ type: i0.Output, args: ["submitted"] }] } });
184
204
 
185
205
  export { GroupFieldComponent, GroupFieldComponent as default };
186
- //# sourceMappingURL=ng-forge-dynamic-forms-group-field.component-2yRmHAUp.mjs.map
206
+ //# sourceMappingURL=ng-forge-dynamic-forms-group-field.component-fzKwPrQr.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ng-forge-dynamic-forms-group-field.component-fzKwPrQr.mjs","sources":["../../../../packages/dynamic-forms/src/lib/fields/group/group-field.component.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n EnvironmentInjector,\n inject,\n Injector,\n input,\n linkedSignal,\n runInInjectionContext,\n untracked,\n} from '@angular/core';\nimport { DfFieldOutlet } from '../../directives/df-field-outlet.directive';\nimport { outputFromObservable, toObservable } from '@angular/core/rxjs-interop';\nimport { explicitEffect } from 'ngxtension/explicit-effect';\nimport { derivedFromDeferred } from '../../utils/derived-from-deferred/derived-from-deferred';\nimport { createFieldResolutionPipe, ResolvedField } from '../../utils/resolve-field/resolve-field';\nimport { computeContainerHostClasses, setupContainerInitEffect } from '../../utils/container-utils/container-utils';\nimport { CONTAINER_FIELD_PROCESSORS } from '../../utils/container-utils/container-field-processors';\nimport { isEqual } from '../../utils/object-utils';\nimport { DynamicFormLogger } from '../../providers/features/logger/logger.token';\nimport { GroupField } from '../../definitions/default/group-field';\nimport { injectFieldRegistry } from '../../utils/inject-field-registry/inject-field-registry';\nimport { FieldTree, form } from '@angular/forms/signals';\nimport { FieldDef } from '../../definitions/base/field-def';\nimport { FieldSignalContext, GroupContext } from '../../mappers/types';\nimport { FIELD_SIGNAL_CONTEXT, GROUP_CONTEXT } from '../../models/field-signal-context.token';\nimport { createSchemaFromFields } from '../../core/schema-builder';\nimport { EventBus } from '../../events/event.bus';\nimport { SubmitEvent } from '../../events/constants/submit.event';\n\n/**\n * Container component for rendering nested form groups.\n *\n * Creates a scoped form context with its own validation state.\n * Child fields receive a FIELD_SIGNAL_CONTEXT scoped to this group's form instance.\n * Group values are nested under the group's key in the parent form.\n */\n@Component({\n selector: 'fieldset[group-field]',\n imports: [DfFieldOutlet],\n template: `\n @for (field of resolvedFields(); track field.key) {\n <ng-container *dfFieldOutlet=\"field; environmentInjector: environmentInjector\" />\n }\n `,\n styleUrl: './group-field.component.scss',\n host: {\n '[class]': 'hostClasses()',\n role: 'group',\n '[class.disabled]': 'disabled()',\n '[class.df-container-hidden]': 'hidden()',\n '[attr.aria-hidden]': 'hidden() || null',\n // The group element's own id is the plain `key()` — only its DESCENDANTS\n // compose scoped ids via GROUP_CONTEXT (e.g. children of an `address`\n // group render as `address_street`). The group selector is `#address`.\n '[id]': '`${key()}`',\n '[attr.data-testid]': 'key()',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport default class GroupFieldComponent<TModel extends Record<string, unknown> = Record<string, unknown>> {\n // ─────────────────────────────────────────────────────────────────────────────\n // Dependencies\n // ─────────────────────────────────────────────────────────────────────────────\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly fieldRegistry = injectFieldRegistry();\n private readonly parentFieldSignalContext = inject(FIELD_SIGNAL_CONTEXT) as FieldSignalContext<TModel>;\n private readonly parentGroupContext = inject(GROUP_CONTEXT, { optional: true });\n private readonly injector = inject(Injector);\n protected readonly environmentInjector = inject(EnvironmentInjector);\n private readonly eventBus = inject(EventBus);\n private readonly logger = inject(DynamicFormLogger);\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Memoized Functions\n // ─────────────────────────────────────────────────────────────────────────────\n\n private readonly fieldProcessors = inject(CONTAINER_FIELD_PROCESSORS);\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Inputs\n // ─────────────────────────────────────────────────────────────────────────────\n\n field = input.required<GroupField>();\n key = input.required<string>();\n className = input<string>();\n hidden = input(false);\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Computed Signals\n // ─────────────────────────────────────────────────────────────────────────────\n\n readonly hostClasses = computed(() => computeContainerHostClasses('group', this.className()));\n\n private readonly rawFieldRegistry = computed(() => this.fieldRegistry.raw);\n\n private readonly formSetup = computed(() => {\n const groupField = this.field();\n const registry = this.rawFieldRegistry();\n\n if (groupField.fields && groupField.fields.length > 0) {\n const flattenedFields = this.fieldProcessors.memoizedFlattenFields(groupField.fields, registry);\n const flattenedFieldsForRendering = this.fieldProcessors.memoizedFlattenFieldsForRendering(groupField.fields, registry);\n const fieldsById = this.fieldProcessors.memoizedKeyBy(flattenedFields);\n const defaultValues = this.fieldProcessors.memoizedDefaultValues(fieldsById, registry);\n\n return {\n fields: flattenedFieldsForRendering,\n schemaFields: flattenedFields,\n originalFields: groupField.fields,\n defaultValues,\n registry,\n };\n }\n\n return {\n fields: [],\n schemaFields: [],\n originalFields: [],\n defaultValues: {},\n registry,\n };\n });\n\n readonly defaultValues = linkedSignal(() => this.formSetup().defaultValues);\n\n /**\n * Entity computed from parent value, group key, and defaults.\n * Uses deep equality check to prevent unnecessary updates when\n * object spread creates new references with identical values.\n */\n private readonly entity = linkedSignal(\n () => {\n const parentValue = this.parentFieldSignalContext.value();\n const groupKey = this.field().key;\n const defaults = this.defaultValues();\n const groupValue = (parentValue as Record<string, unknown>)?.[groupKey] || {};\n return { ...defaults, ...groupValue };\n },\n {\n debugName: 'GroupFieldComponent.entity',\n equal: isEqual,\n },\n );\n\n private readonly form = computed(() => {\n return runInInjectionContext(this.injector, () => {\n const setup = this.formSetup();\n\n if (setup.schemaFields.length > 0) {\n const schema = createSchemaFromFields(setup.schemaFields, setup.registry);\n return untracked(() => form(this.entity, schema));\n }\n\n return untracked(() => form(this.entity));\n });\n });\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Public State Signals\n // ─────────────────────────────────────────────────────────────────────────────\n\n readonly formValue = computed(() => this.entity());\n readonly valid = computed(() => this.form()().valid());\n readonly invalid = computed(() => this.form()().invalid());\n readonly dirty = computed(() => this.form()().dirty());\n readonly touched = computed(() => this.form()().touched());\n readonly errors = computed(() => this.form()().errors());\n readonly disabled = computed(() => this.form()().disabled());\n\n private readonly nestedFieldTree = computed((): FieldTree<Record<string, unknown>> | undefined => {\n const parentForm = this.parentFieldSignalContext.form as Record<string, FieldTree<Record<string, unknown>>>;\n const groupKey = this.field().key;\n return parentForm[groupKey];\n });\n\n private readonly groupFieldSignalContext: FieldSignalContext<Record<string, unknown>> = (() => {\n const nestedFieldTree = this.nestedFieldTree;\n return {\n injector: this.injector,\n value: this.parentFieldSignalContext.value,\n defaultValues: this.defaultValues,\n get form() {\n return nestedFieldTree() ?? ({} as FieldTree<Record<string, unknown>>);\n },\n };\n })();\n\n /**\n * Group context propagated to descendants — carries the dot-separated path of\n * group ancestors so child fields can scope their DOM IDs (issue #401).\n * Reactive via `computed()`: a nested group composes its path from the parent\n * context signal + its own key, so the chain stays consistent if either changes.\n */\n private readonly groupContext: GroupContext = {\n groupPath: computed(() => {\n const ownKey = this.field().key;\n const parentPath = this.parentGroupContext?.groupPath();\n return parentPath ? `${parentPath}.${ownKey}` : ownKey;\n }),\n };\n\n private readonly groupInjector = Injector.create({\n parent: this.injector,\n providers: [\n { provide: FIELD_SIGNAL_CONTEXT, useValue: this.groupFieldSignalContext },\n { provide: GROUP_CONTEXT, useValue: this.groupContext },\n ],\n });\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Outputs\n // ─────────────────────────────────────────────────────────────────────────────\n\n readonly validityChange = outputFromObservable(toObservable(this.valid));\n readonly dirtyChange = outputFromObservable(toObservable(this.dirty));\n readonly submitted = outputFromObservable(this.eventBus.on<SubmitEvent>('submit'));\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Field Resolution\n // ─────────────────────────────────────────────────────────────────────────────\n\n private readonly fieldsSource = computed(() => this.formSetup().fields);\n\n protected readonly resolvedFields = derivedFromDeferred(\n this.fieldsSource,\n createFieldResolutionPipe(() => ({\n loadTypeComponent: (type: string) => this.fieldRegistry.loadTypeComponent(type),\n registry: this.rawFieldRegistry(),\n injector: this.groupInjector,\n destroyRef: this.destroyRef,\n onError: (fieldDef: FieldDef<unknown>, error: unknown) => {\n const fieldKey = fieldDef.key || '<no key>';\n this.logger.error(\n `Failed to load component for field type '${fieldDef.type}' (key: ${fieldKey}) ` +\n `within group '${this.field().key}'. Ensure the field type is registered in your field registry.`,\n error,\n );\n },\n })),\n { initialValue: [] as ResolvedField[], injector: this.injector },\n );\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Constructor\n // ─────────────────────────────────────────────────────────────────────────────\n\n constructor() {\n this.setupEffects();\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Private Methods\n // ─────────────────────────────────────────────────────────────────────────────\n\n private setupEffects(): void {\n setupContainerInitEffect(this.resolvedFields, this.eventBus, 'group', () => this.field().key, this.injector);\n\n explicitEffect(\n [this.nestedFieldTree, this.field],\n ([tree, field]) => {\n if (!tree) {\n this.logger.warn(\n `Group field \"${field.key}\" not found in parent form. ` + `Ensure the parent form schema includes this group field.`,\n );\n }\n },\n { defer: true },\n );\n }\n}\n\nexport { GroupFieldComponent };\n"],"names":[],"mappings":"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"}