@ng-forge/dynamic-forms 1.3.0-next.2 → 1.3.0-next.3

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 (92) hide show
  1. package/fesm2022/ng-forge-dynamic-forms-active-page-initialized.event-CiKN-mcc.mjs +12 -0
  2. package/fesm2022/ng-forge-dynamic-forms-active-page-initialized.event-CiKN-mcc.mjs.map +1 -0
  3. package/fesm2022/ng-forge-dynamic-forms-array-field.component-Dv9mPnJ3.mjs +770 -0
  4. package/fesm2022/ng-forge-dynamic-forms-array-field.component-Dv9mPnJ3.mjs.map +1 -0
  5. package/fesm2022/ng-forge-dynamic-forms-array-item-registry.service-D-AxVLdk.mjs +83 -0
  6. package/fesm2022/ng-forge-dynamic-forms-array-item-registry.service-D-AxVLdk.mjs.map +1 -0
  7. package/fesm2022/ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-EuYCbquo.mjs +1887 -0
  8. package/fesm2022/ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-EuYCbquo.mjs.map +1 -0
  9. package/fesm2022/ng-forge-dynamic-forms-bootstrap-web-mcp-2wQK_wPp.mjs +954 -0
  10. package/fesm2022/ng-forge-dynamic-forms-bootstrap-web-mcp-2wQK_wPp.mjs.map +1 -0
  11. package/fesm2022/ng-forge-dynamic-forms-container-field-processors-C_JRvaVt.mjs +117 -0
  12. package/fesm2022/ng-forge-dynamic-forms-container-field-processors-C_JRvaVt.mjs.map +1 -0
  13. package/fesm2022/ng-forge-dynamic-forms-container-field.component-Bg7Win9n.mjs +228 -0
  14. package/fesm2022/ng-forge-dynamic-forms-container-field.component-Bg7Win9n.mjs.map +1 -0
  15. package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-R2yc-H0T.mjs +102 -0
  16. package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-R2yc-H0T.mjs.map +1 -0
  17. package/fesm2022/ng-forge-dynamic-forms-debounce-CG3uP5B-.mjs +4 -0
  18. package/fesm2022/{ng-forge-dynamic-forms-debounce-C9F4v1Ke.mjs.map → ng-forge-dynamic-forms-debounce-CG3uP5B-.mjs.map} +1 -1
  19. package/fesm2022/ng-forge-dynamic-forms-default-value-D5M4MNE-.mjs +77 -0
  20. package/fesm2022/ng-forge-dynamic-forms-default-value-D5M4MNE-.mjs.map +1 -0
  21. package/fesm2022/ng-forge-dynamic-forms-dev-mode-4rbYBBo_.mjs +4 -0
  22. package/fesm2022/ng-forge-dynamic-forms-dev-mode-4rbYBBo_.mjs.map +1 -0
  23. package/fesm2022/ng-forge-dynamic-forms-df-field-outlet.directive-CQsDMV-s.mjs +644 -0
  24. package/fesm2022/ng-forge-dynamic-forms-df-field-outlet.directive-CQsDMV-s.mjs.map +1 -0
  25. package/fesm2022/ng-forge-dynamic-forms-field-errors-wrapper.component-DKgkpIpG.mjs +56 -0
  26. package/fesm2022/ng-forge-dynamic-forms-field-errors-wrapper.component-DKgkpIpG.mjs.map +1 -0
  27. package/fesm2022/ng-forge-dynamic-forms-form-schema.service-Dd-gHJ_7.mjs +38 -0
  28. package/fesm2022/{ng-forge-dynamic-forms-form-schema.service-Dx5Dlb15.mjs.map → ng-forge-dynamic-forms-form-schema.service-Dd-gHJ_7.mjs.map} +1 -1
  29. package/fesm2022/ng-forge-dynamic-forms-form-state-manager-DcOXRFRL.mjs +1522 -0
  30. package/fesm2022/ng-forge-dynamic-forms-form-state-manager-DcOXRFRL.mjs.map +1 -0
  31. package/fesm2022/ng-forge-dynamic-forms-group-field.component-BjZi0bhq.mjs +292 -0
  32. package/fesm2022/ng-forge-dynamic-forms-group-field.component-BjZi0bhq.mjs.map +1 -0
  33. package/fesm2022/ng-forge-dynamic-forms-integration.mjs +1318 -843
  34. package/fesm2022/ng-forge-dynamic-forms-integration.mjs.map +1 -1
  35. package/fesm2022/ng-forge-dynamic-forms-internal.mjs +3326 -3641
  36. package/fesm2022/ng-forge-dynamic-forms-internal.mjs.map +1 -1
  37. package/fesm2022/ng-forge-dynamic-forms-page-field.component-BRjQmWC9.mjs +295 -0
  38. package/fesm2022/ng-forge-dynamic-forms-page-field.component-BRjQmWC9.mjs.map +1 -0
  39. package/fesm2022/ng-forge-dynamic-forms-resolve-field-ByGa5cpo.mjs +329 -0
  40. package/fesm2022/ng-forge-dynamic-forms-resolve-field-ByGa5cpo.mjs.map +1 -0
  41. package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-CuFycQb-.mjs +81 -0
  42. package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-CuFycQb-.mjs.map +1 -0
  43. package/fesm2022/ng-forge-dynamic-forms-schema-builder-C62afItJ.mjs +400 -0
  44. package/fesm2022/ng-forge-dynamic-forms-schema-builder-C62afItJ.mjs.map +1 -0
  45. package/fesm2022/ng-forge-dynamic-forms-schema-registry.service-axBV9FBH.mjs +45 -0
  46. package/fesm2022/ng-forge-dynamic-forms-schema-registry.service-axBV9FBH.mjs.map +1 -0
  47. package/fesm2022/ng-forge-dynamic-forms-schema.mjs +8 -14
  48. package/fesm2022/ng-forge-dynamic-forms-schema.mjs.map +1 -1
  49. package/fesm2022/ng-forge-dynamic-forms-testing.mjs +68 -73
  50. package/fesm2022/ng-forge-dynamic-forms-testing.mjs.map +1 -1
  51. package/fesm2022/ng-forge-dynamic-forms-text-field.component--MAh_h4Q.mjs +257 -0
  52. package/fesm2022/ng-forge-dynamic-forms-text-field.component--MAh_h4Q.mjs.map +1 -0
  53. package/fesm2022/ng-forge-dynamic-forms-validation-execution.token-BFyySKtp.mjs +8 -0
  54. package/fesm2022/ng-forge-dynamic-forms-validation-execution.token-BFyySKtp.mjs.map +1 -0
  55. package/fesm2022/ng-forge-dynamic-forms-with-logger-config-BAATqYY0.mjs +94 -0
  56. package/fesm2022/ng-forge-dynamic-forms-with-logger-config-BAATqYY0.mjs.map +1 -0
  57. package/fesm2022/ng-forge-dynamic-forms-wrapper-chain-BnntfNU1.mjs +115 -0
  58. package/fesm2022/ng-forge-dynamic-forms-wrapper-chain-BnntfNU1.mjs.map +1 -0
  59. package/fesm2022/ng-forge-dynamic-forms.mjs +2136 -3
  60. package/fesm2022/ng-forge-dynamic-forms.mjs.map +1 -1
  61. package/package.json +1 -1
  62. package/types/ng-forge-dynamic-forms-integration.d.ts +543 -415
  63. package/types/ng-forge-dynamic-forms-internal.d.ts +2319 -2436
  64. package/types/ng-forge-dynamic-forms-schema.d.ts +13 -16
  65. package/types/ng-forge-dynamic-forms-testing.d.ts +34 -37
  66. package/types/ng-forge-dynamic-forms.d.ts +735 -722
  67. package/fesm2022/ng-forge-dynamic-forms-array-field.component-CSCKq_1K.mjs +0 -750
  68. package/fesm2022/ng-forge-dynamic-forms-array-field.component-CSCKq_1K.mjs.map +0 -1
  69. package/fesm2022/ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-CTOTwzzw.mjs +0 -2394
  70. package/fesm2022/ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-CTOTwzzw.mjs.map +0 -1
  71. package/fesm2022/ng-forge-dynamic-forms-bootstrap-web-mcp-BtjqeJOj.mjs +0 -1054
  72. package/fesm2022/ng-forge-dynamic-forms-bootstrap-web-mcp-BtjqeJOj.mjs.map +0 -1
  73. package/fesm2022/ng-forge-dynamic-forms-container-field.component-Dc3ROhHL.mjs +0 -86
  74. package/fesm2022/ng-forge-dynamic-forms-container-field.component-Dc3ROhHL.mjs.map +0 -1
  75. package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-BzgX8lAD.mjs +0 -33
  76. package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-BzgX8lAD.mjs.map +0 -1
  77. package/fesm2022/ng-forge-dynamic-forms-debounce-C9F4v1Ke.mjs +0 -17
  78. package/fesm2022/ng-forge-dynamic-forms-field-errors-wrapper.component-CIKbWqYA.mjs +0 -25
  79. package/fesm2022/ng-forge-dynamic-forms-field-errors-wrapper.component-CIKbWqYA.mjs.map +0 -1
  80. package/fesm2022/ng-forge-dynamic-forms-form-schema.service-Dx5Dlb15.mjs +0 -24
  81. package/fesm2022/ng-forge-dynamic-forms-group-field.component-DAC3P9DC.mjs +0 -177
  82. package/fesm2022/ng-forge-dynamic-forms-group-field.component-DAC3P9DC.mjs.map +0 -1
  83. package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-CXQe_5td.mjs +0 -5133
  84. package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-CXQe_5td.mjs.map +0 -1
  85. package/fesm2022/ng-forge-dynamic-forms-page-field.component-DPKJcwUO.mjs +0 -176
  86. package/fesm2022/ng-forge-dynamic-forms-page-field.component-DPKJcwUO.mjs.map +0 -1
  87. package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-DMEeKZny.mjs +0 -19
  88. package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-DMEeKZny.mjs.map +0 -1
  89. package/fesm2022/ng-forge-dynamic-forms-schema-builder-BvDTzfdM.mjs +0 -570
  90. package/fesm2022/ng-forge-dynamic-forms-schema-builder-BvDTzfdM.mjs.map +0 -1
  91. package/fesm2022/ng-forge-dynamic-forms-text-field.component-BB-jutBq.mjs +0 -126
  92. package/fesm2022/ng-forge-dynamic-forms-text-field.component-BB-jutBq.mjs.map +0 -1
@@ -1,750 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { signal, computed, runInInjectionContext, Injector, linkedSignal, inject, DestroyRef, EnvironmentInjector, input, ChangeDetectionStrategy, Component } from '@angular/core';
3
- import { m as mapFieldToInputs, f as createHiddenSignal, g as createRenderReadySignal, i as injectFieldRegistry, A as ArrayItemRegistryService, h as getNormalizedArrayMetadata, j as emitComponentInitialized, d as initializationComponentPath, k as getFieldDefaultValue, D as DfFieldOutlet } from './ng-forge-dynamic-forms-ng-forge-dynamic-forms-CXQe_5td.mjs';
4
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
5
- import { of, from, map, catchError, forkJoin, filter, firstValueFrom, tap } from 'rxjs';
6
- import { explicitEffect } from 'ngxtension/explicit-effect';
7
- import { isEqual, FIELD_SIGNAL_CONTEXT, ARRAY_CONTEXT, GROUP_CONTEXT, DynamicFormLogger, injectFieldSignalContext, EventBus, getFieldValueHandling, isGroupField } from '@ng-forge/dynamic-forms/internal';
8
-
9
- class ArrayFieldStateMachine {
10
- _state = signal('idle', /* @ts-ignore */
11
- ...(ngDevMode ? [{ debugName: "_state" }] : /* istanbul ignore next */ []));
12
- _runId = signal(0, /* @ts-ignore */
13
- ...(ngDevMode ? [{ debugName: "_runId" }] : /* istanbul ignore next */ []));
14
- lastEmittedRunId = -1;
15
- _hasEverEmitted = false;
16
- state = this._state.asReadonly();
17
- runId = this._runId.asReadonly();
18
- get hasEverEmitted() {
19
- return this._hasEverEmitted;
20
- }
21
- dispatch(op) {
22
- const nextId = this._runId() + 1;
23
- this._runId.set(nextId);
24
- switch (op.kind) {
25
- case 'clear':
26
- case 'initial':
27
- case 'recreate':
28
- this._state.set('pending');
29
- break;
30
- case 'append':
31
- break;
32
- }
33
- return {
34
- id: nextId,
35
- isStale: () => this._runId() !== nextId,
36
- resolve: () => {
37
- if (this._runId() === nextId && this._state() === 'pending') {
38
- this._state.set('settled');
39
- }
40
- },
41
- };
42
- }
43
- shouldEmit(allReady) {
44
- if (this._state() !== 'settled' || !allReady)
45
- return false;
46
- if (this.lastEmittedRunId === this._runId())
47
- return false;
48
- this.lastEmittedRunId = this._runId();
49
- this._hasEverEmitted = true;
50
- this._state.set('idle');
51
- return true;
52
- }
53
- }
54
-
55
- function getArrayValue(value, key) {
56
- const arrayValue = value?.[key];
57
- return Array.isArray(arrayValue) ? arrayValue : [];
58
- }
59
- function determineDifferentialOperation(currentItems, newLength) {
60
- const currentLength = currentItems.length;
61
- if (newLength === 0) {
62
- return { type: 'clear' };
63
- }
64
- if (currentLength === 0) {
65
- return { type: 'initial', fieldTreesLength: newLength };
66
- }
67
- if (newLength > currentLength) {
68
- return { type: 'append', startIndex: currentLength, endIndex: newLength };
69
- }
70
- if (newLength < currentLength) {
71
- return { type: 'recreate' };
72
- }
73
- return { type: 'none' };
74
- }
75
-
76
- function createArrayItemInjectorAndInputs(options) {
77
- const { template, indexSignal, parentFieldSignalContext, parentInjector, registry, arrayField, primitiveFieldKey } = options;
78
- const itemFormAccessor = computed(() => {
79
- const parentForm = parentFieldSignalContext.form;
80
- const index = indexSignal();
81
- const arrayFieldTree = parentForm[arrayField.key];
82
- if (!arrayFieldTree) {
83
- return undefined;
84
- }
85
- return arrayFieldTree[index];
86
- }, { ...(ngDevMode ? { debugName: "itemFormAccessor" } : /* istanbul ignore next */ {}), equal: isEqual });
87
- const injector = createItemInjector({
88
- itemFormAccessor,
89
- indexSignal,
90
- parentFieldSignalContext,
91
- parentInjector,
92
- arrayField,
93
- primitiveFieldKey,
94
- });
95
- const inputs = runInInjectionContext(injector, () => {
96
- return mapFieldToInputs(template, registry);
97
- });
98
- return { injector, inputs };
99
- }
100
- function createItemInjector(options) {
101
- const { itemFormAccessor, indexSignal, parentFieldSignalContext, parentInjector, arrayField, primitiveFieldKey } = options;
102
- const arrayContext = {
103
- arrayKey: arrayField.key,
104
- index: indexSignal,
105
- get formValue() {
106
- return parentFieldSignalContext.value();
107
- },
108
- field: arrayField,
109
- };
110
- let cachedPrimitiveRaw;
111
- let cachedPrimitiveWrapped;
112
- return Injector.create({
113
- parent: parentInjector,
114
- providers: [
115
- {
116
- provide: FIELD_SIGNAL_CONTEXT,
117
- useFactory: (injector) => ({
118
- injector,
119
- value: parentFieldSignalContext.value,
120
- defaultValues: () => ({}),
121
- get form() {
122
- const raw = itemFormAccessor();
123
- if (!raw) {
124
- return {};
125
- }
126
- if (primitiveFieldKey) {
127
- if (raw !== cachedPrimitiveRaw) {
128
- cachedPrimitiveRaw = raw;
129
- cachedPrimitiveWrapped = { [primitiveFieldKey]: raw };
130
- }
131
- return cachedPrimitiveWrapped;
132
- }
133
- return raw;
134
- },
135
- }),
136
- deps: [Injector],
137
- },
138
- { provide: ARRAY_CONTEXT, useValue: arrayContext },
139
- { provide: GROUP_CONTEXT, useValue: EMPTY_GROUP_CONTEXT },
140
- ],
141
- });
142
- }
143
- const EMPTY_GROUP_CONTEXT = { groupPath: signal('') };
144
-
145
- function resolveArrayItem(options) {
146
- const { index, templates, arrayField, itemPositionMap, parentFieldSignalContext, parentInjector, registry, destroyRef, loadTypeComponent, generateItemId, existingItemId, primitiveFieldKey, } = options;
147
- if (templates.length === 0) {
148
- return of(undefined);
149
- }
150
- const itemId = existingItemId ?? generateItemId();
151
- const indexSignal = linkedSignal(() => {
152
- const positionMap = itemPositionMap();
153
- return positionMap.get(itemId) ?? index;
154
- }, /* @ts-ignore */
155
- ...(ngDevMode ? [{ debugName: "indexSignal" }] : /* istanbul ignore next */ []));
156
- const fieldObservables = templates.map((template) => from(loadTypeComponent(template.type)).pipe(map((component) => {
157
- if (destroyRef.destroyed) {
158
- return undefined;
159
- }
160
- if (!component) {
161
- return undefined;
162
- }
163
- const { injector, inputs } = createArrayItemInjectorAndInputs({
164
- template,
165
- indexSignal,
166
- parentFieldSignalContext,
167
- parentInjector,
168
- registry,
169
- arrayField,
170
- primitiveFieldKey,
171
- });
172
- if (!inputs) {
173
- return undefined;
174
- }
175
- return {
176
- key: template.key,
177
- fieldDef: template,
178
- component,
179
- injector,
180
- inputs,
181
- renderReady: createRenderReadySignal(inputs, registry.get(template.type)),
182
- hidden: createHiddenSignal(inputs),
183
- };
184
- }), catchError((error) => {
185
- if (!destroyRef.destroyed) {
186
- const logger = parentInjector.get(DynamicFormLogger);
187
- logger.error(`Failed to load component for field type '${template.type}' at index ${index} ` +
188
- `within array '${arrayField.key}'. Ensure the field type is registered in your field registry.`, error);
189
- }
190
- return of(undefined);
191
- })));
192
- return forkJoin(fieldObservables).pipe(map((fields) => {
193
- const validFields = fields.filter((f) => f !== undefined);
194
- if (validFields.length === 0) {
195
- return undefined;
196
- }
197
- return {
198
- id: itemId,
199
- fields: validFields,
200
- };
201
- }));
202
- }
203
-
204
- const ARRAY_EVENT_TYPES = [
205
- 'append-array-item',
206
- 'prepend-array-item',
207
- 'insert-array-item',
208
- 'move-array-item',
209
- 'pop-array-item',
210
- 'shift-array-item',
211
- 'remove-at-index',
212
- ];
213
- function toArrayAction(event) {
214
- switch (event.type) {
215
- case 'append-array-item':
216
- return { action: 'add', template: event.template };
217
- case 'prepend-array-item':
218
- return { action: 'add', template: event.template, index: 0 };
219
- case 'insert-array-item':
220
- return { action: 'add', template: event.template, index: event.index };
221
- case 'move-array-item':
222
- return { action: 'move', fromIndex: event.fromIndex, toIndex: event.toIndex };
223
- case 'pop-array-item':
224
- return { action: 'remove' };
225
- case 'shift-array-item':
226
- return { action: 'remove', index: 0 };
227
- case 'remove-at-index':
228
- return { action: 'remove', index: event.index };
229
- }
230
- }
231
- function observeArrayActions(eventBus, arrayKey) {
232
- return eventBus.on(ARRAY_EVENT_TYPES).pipe(filter((event) => event.arrayKey === arrayKey()), map(toArrayAction));
233
- }
234
-
235
- class ArrayFieldComponent {
236
- destroyRef = inject(DestroyRef);
237
- fieldRegistry = injectFieldRegistry();
238
- parentFieldSignalContext = injectFieldSignalContext();
239
- parentInjector = inject(Injector);
240
- environmentInjector = inject(EnvironmentInjector);
241
- eventBus = inject(EventBus);
242
- logger = inject(DynamicFormLogger);
243
- arrayItemRegistry = inject(ArrayItemRegistryService);
244
- groupContext = inject(GROUP_CONTEXT, { optional: true });
245
- slot = computed(() => this.arrayItemRegistry.slotFor(this.field().key), /* @ts-ignore */
246
- ...(ngDevMode ? [{ debugName: "slot" }] : /* istanbul ignore next */ []));
247
- generateItemId = () => this.slot().nextId();
248
- field = input.required(/* @ts-ignore */
249
- ...(ngDevMode ? [{ debugName: "field" }] : /* istanbul ignore next */ []));
250
- key = input.required(/* @ts-ignore */
251
- ...(ngDevMode ? [{ debugName: "key" }] : /* istanbul ignore next */ []));
252
- className = input(/* @ts-ignore */
253
- ...(ngDevMode ? [undefined, { debugName: "className" }] : /* istanbul ignore next */ []));
254
- hidden = input(false, /* @ts-ignore */
255
- ...(ngDevMode ? [{ debugName: "hidden" }] : /* istanbul ignore next */ []));
256
- hostClasses = computed(() => {
257
- const base = 'df-field df-array';
258
- const custom = this.className();
259
- return custom ? `${base} ${custom}` : base;
260
- }, /* @ts-ignore */
261
- ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
262
- rawFieldRegistry = computed(() => this.fieldRegistry.raw, /* @ts-ignore */
263
- ...(ngDevMode ? [{ debugName: "rawFieldRegistry" }] : /* istanbul ignore next */ []));
264
- autoRemoveButton = computed(() => {
265
- const metadata = getNormalizedArrayMetadata(this.field());
266
- return metadata?.autoRemoveButton;
267
- }, /* @ts-ignore */
268
- ...(ngDevMode ? [{ debugName: "autoRemoveButton" }] : /* istanbul ignore next */ []));
269
- primitiveFieldKey = linkedSignal(() => {
270
- const metadata = getNormalizedArrayMetadata(this.field());
271
- if (metadata?.primitiveFieldKey) {
272
- return metadata.primitiveFieldKey;
273
- }
274
- const definitions = this.field().fields || [];
275
- if (definitions.length > 0 && !Array.isArray(definitions[0])) {
276
- return definitions[0].key;
277
- }
278
- return undefined;
279
- }, /* @ts-ignore */
280
- ...(ngDevMode ? [{ debugName: "primitiveFieldKey" }] : /* istanbul ignore next */ []));
281
- rawItemTemplates = computed(() => {
282
- const arrayField = this.field();
283
- const definitions = arrayField.fields || [];
284
- return definitions.map((def) => {
285
- return (Array.isArray(def) ? def : [def]);
286
- });
287
- }, /* @ts-ignore */
288
- ...(ngDevMode ? [{ debugName: "rawItemTemplates" }] : /* istanbul ignore next */ []));
289
- fallbackTemplate = computed(() => {
290
- const raw = getNormalizedArrayMetadata(this.field())?.template;
291
- if (!raw)
292
- return undefined;
293
- return (Array.isArray(raw) ? [...raw] : [raw]);
294
- }, /* @ts-ignore */
295
- ...(ngDevMode ? [{ debugName: "fallbackTemplate" }] : /* istanbul ignore next */ []));
296
- itemTemplates = computed(() => {
297
- const raw = this.rawItemTemplates();
298
- const removeButton = this.autoRemoveButton();
299
- if (!removeButton)
300
- return raw;
301
- return raw.map((normalized) => {
302
- return [...normalized, removeButton];
303
- });
304
- }, /* @ts-ignore */
305
- ...(ngDevMode ? [{ debugName: "itemTemplates" }] : /* istanbul ignore next */ []));
306
- arrayFieldTree = computed(() => {
307
- const parentForm = this.parentFieldSignalContext.form;
308
- return parentForm[this.field().key];
309
- }, /* @ts-ignore */
310
- ...(ngDevMode ? [{ debugName: "arrayFieldTree" }] : /* istanbul ignore next */ []));
311
- currentArrayValue = computed(() => {
312
- const tree = this.arrayFieldTree();
313
- if (tree) {
314
- const value = tree().value();
315
- return Array.isArray(value) ? value : [];
316
- }
317
- return getArrayValue(this.parentFieldSignalContext.value(), this.field().key);
318
- }, /* @ts-ignore */
319
- ...(ngDevMode ? [{ debugName: "currentArrayValue" }] : /* istanbul ignore next */ []));
320
- arrayFieldTrees = computed(() => {
321
- const arrayValue = this.currentArrayValue();
322
- if (arrayValue.length === 0)
323
- return [];
324
- const arrayFieldTree = this.arrayFieldTree();
325
- if (!arrayFieldTree)
326
- return arrayValue.map(() => null);
327
- const items = [];
328
- for (let i = 0; i < arrayValue.length; i++) {
329
- const itemFieldTree = arrayFieldTree[i];
330
- items.push(itemFieldTree ?? null);
331
- }
332
- return items;
333
- }, /* @ts-ignore */
334
- ...(ngDevMode ? [{ debugName: "arrayFieldTrees" }] : /* istanbul ignore next */ []));
335
- resolvedItemsSignal = signal([], /* @ts-ignore */
336
- ...(ngDevMode ? [{ debugName: "resolvedItemsSignal" }] : /* istanbul ignore next */ []));
337
- fsm = new ArrayFieldStateMachine();
338
- itemPositionMap = computed(() => {
339
- const items = this.resolvedItemsSignal();
340
- return new Map(items.map((item, idx) => [item.id, idx]));
341
- }, /* @ts-ignore */
342
- ...(ngDevMode ? [{ debugName: "itemPositionMap" }] : /* istanbul ignore next */ []));
343
- resolvedItems = computed(() => this.resolvedItemsSignal(), /* @ts-ignore */
344
- ...(ngDevMode ? [{ debugName: "resolvedItems" }] : /* istanbul ignore next */ []));
345
- allResolvedFieldsRenderReady = computed(() => this.resolvedItems().every((item) => item.fields.every((field) => field.renderReady())), /* @ts-ignore */
346
- ...(ngDevMode ? [{ debugName: "allResolvedFieldsRenderReady" }] : /* istanbul ignore next */ []));
347
- atMaxLength = computed(() => {
348
- const maxLength = this.field().maxLength;
349
- if (maxLength === undefined)
350
- return false;
351
- return this.currentArrayValue().length >= maxLength;
352
- }, /* @ts-ignore */
353
- ...(ngDevMode ? [{ debugName: "atMaxLength" }] : /* istanbul ignore next */ []));
354
- autoRemoveCache = new WeakMap();
355
- constructor() {
356
- this.setupEffects();
357
- this.setupEventHandlers();
358
- }
359
- setupEffects() {
360
- explicitEffect([this.arrayFieldTrees], ([fieldTrees]) => {
361
- this.performDifferentialUpdate(fieldTrees);
362
- });
363
- explicitEffect([this.fsm.state, this.allResolvedFieldsRenderReady], ([, allReady]) => {
364
- if (this.fsm.shouldEmit(allReady)) {
365
- emitComponentInitialized(this.eventBus, 'array', initializationComponentPath(this.field().key, this.groupContext?.groupPath()), this.parentInjector);
366
- }
367
- });
368
- }
369
- setupEventHandlers() {
370
- observeArrayActions(this.eventBus, () => this.key())
371
- .pipe(takeUntilDestroyed())
372
- .subscribe((action) => {
373
- if (action.action === 'add') {
374
- const templates = Array.isArray(action.template) ? action.template : action.template ? [action.template] : [];
375
- if (templates.length === 0) {
376
- this.logger.error(`Cannot add item to array '${this.key()}': template is REQUIRED. ` +
377
- 'Buttons must specify an explicit template property. ' +
378
- 'There is no default template - each add operation must provide its own.');
379
- return;
380
- }
381
- void this.handleAddFromEvent(action.template, action.index);
382
- }
383
- else if (action.action === 'move') {
384
- this.moveItem(action.fromIndex, action.toIndex);
385
- }
386
- else {
387
- this.removeItem(action.index);
388
- }
389
- });
390
- }
391
- async handleAddFromEvent(template, index) {
392
- const templates = Array.isArray(template) ? [...template] : [template];
393
- const isSingleField = !Array.isArray(template);
394
- const isPrimitiveItem = isSingleField && getFieldValueHandling(templates[0].type, this.rawFieldRegistry()) !== 'flatten';
395
- if (isPrimitiveItem && templates[0].key && !this.primitiveFieldKey()) {
396
- this.primitiveFieldKey.set(templates[0].key);
397
- }
398
- if (templates.length === 0) {
399
- this.logger.error(`Cannot add item to array '${this.field().key}': no field templates provided. ` +
400
- 'Buttons must specify an explicit template property when adding array items.');
401
- return;
402
- }
403
- const arrayKey = this.field().key;
404
- const parentForm = this.parentFieldSignalContext.form;
405
- const currentValue = parentForm().value();
406
- const currentArray = getArrayValue(currentValue, arrayKey);
407
- const insertIndex = index !== undefined ? Math.min(index, currentArray.length) : currentArray.length;
408
- let value;
409
- if (isPrimitiveItem) {
410
- value = getFieldDefaultValue(templates[0], this.rawFieldRegistry());
411
- }
412
- else {
413
- value = {};
414
- for (const templateField of templates) {
415
- const rawValue = getFieldDefaultValue(templateField, this.rawFieldRegistry());
416
- const valueHandling = getFieldValueHandling(templateField.type, this.rawFieldRegistry());
417
- const isContainer = templateField.type === 'group' || templateField.type === 'row' || templateField.type === 'container';
418
- if (isContainer) {
419
- if (isGroupField(templateField)) {
420
- value = { ...value, [templateField.key]: rawValue };
421
- }
422
- else {
423
- value = { ...value, ...rawValue };
424
- }
425
- }
426
- else if (valueHandling === 'include' && templateField.key) {
427
- value = { ...value, [templateField.key]: rawValue };
428
- }
429
- }
430
- }
431
- const run = this.fsm.dispatch({ kind: 'append' });
432
- const resolveTemplates = this.withAutoRemove(templates);
433
- const resolvedItem = await firstValueFrom(resolveArrayItem({
434
- index: insertIndex,
435
- templates: resolveTemplates,
436
- arrayField: this.field(),
437
- itemPositionMap: this.itemPositionMap,
438
- parentFieldSignalContext: this.parentFieldSignalContext,
439
- parentInjector: this.parentInjector,
440
- registry: this.rawFieldRegistry(),
441
- destroyRef: this.destroyRef,
442
- loadTypeComponent: (type) => this.fieldRegistry.loadTypeComponent(type),
443
- generateItemId: this.generateItemId,
444
- primitiveFieldKey: isPrimitiveItem ? templates[0].key : undefined,
445
- }).pipe(catchError((error) => {
446
- this.logger.error(`Failed to resolve array item at index ${insertIndex}:`, error);
447
- return of(undefined);
448
- })));
449
- if (run.isStale() || !resolvedItem) {
450
- return;
451
- }
452
- this.slot().templates.set(resolvedItem.id, templates);
453
- this.slot().itemOrder.splice(insertIndex, 0, resolvedItem.id);
454
- this.resolvedItemsSignal.update((current) => {
455
- const newItems = [...current];
456
- newItems.splice(insertIndex, 0, resolvedItem);
457
- return newItems;
458
- });
459
- const newArray = [...currentArray];
460
- newArray.splice(insertIndex, 0, value);
461
- parentForm().value.set({ ...currentValue, [arrayKey]: newArray });
462
- }
463
- performDifferentialUpdate(fieldTrees) {
464
- const resolvedItems = this.resolvedItemsSignal();
465
- const operation = determineDifferentialOperation(resolvedItems, fieldTrees.length);
466
- if (operation.type === 'none') {
467
- return;
468
- }
469
- switch (operation.type) {
470
- case 'clear': {
471
- this.slot().templates.clear();
472
- this.resolvedItemsSignal.set([]);
473
- const run = this.fsm.dispatch({ kind: 'clear' });
474
- if (resolvedItems.length === 0 && !this.fsm.hasEverEmitted) {
475
- run.resolve();
476
- }
477
- break;
478
- }
479
- case 'initial': {
480
- const slot = this.slot();
481
- const useSurvival = slot.itemOrder.length === fieldTrees.length && fieldTrees.length > 0;
482
- const positionalTemplates = useSurvival ? slot.itemOrder.map((id) => slot.templates.get(id)) : undefined;
483
- const existingItemIds = useSurvival ? slot.itemOrder.slice() : undefined;
484
- const run = this.fsm.dispatch({ kind: 'initial' });
485
- void this.resolveAllItems(fieldTrees, run, positionalTemplates, existingItemIds);
486
- break;
487
- }
488
- case 'append': {
489
- const run = this.fsm.dispatch({ kind: 'append' });
490
- void this.appendItems(fieldTrees, operation.startIndex, operation.endIndex, run);
491
- break;
492
- }
493
- case 'recreate': {
494
- const positionalTemplates = resolvedItems.map((item) => {
495
- return this.slot().templates.get(item.id);
496
- });
497
- this.resolvedItemsSignal.set([]);
498
- const run = this.fsm.dispatch({ kind: 'recreate' });
499
- void this.resolveAllItems(fieldTrees, run, positionalTemplates);
500
- break;
501
- }
502
- }
503
- }
504
- async resolveAllItems(fieldTrees, run, positionalTemplates, existingItemIds) {
505
- if (fieldTrees.length === 0) {
506
- this.resolvedItemsSignal.set([]);
507
- return;
508
- }
509
- const safeItemObservables = fieldTrees.map((_, i) => this.createResolveItemObservable(i, positionalTemplates?.[i], existingItemIds?.[i]).pipe(catchError((error) => {
510
- this.logger.error(`Failed to resolve array item at index ${i}:`, error);
511
- return of(undefined);
512
- })));
513
- try {
514
- const items = await firstValueFrom(forkJoin(safeItemObservables).pipe(map((items) => items.filter((item) => item !== undefined))));
515
- if (!run.isStale()) {
516
- if (positionalTemplates) {
517
- const newItemIds = new Set(items.map((item) => item.id));
518
- for (const existingId of this.slot().templates.keys()) {
519
- if (!newItemIds.has(existingId)) {
520
- this.slot().templates.delete(existingId);
521
- }
522
- }
523
- items.forEach((item, idx) => {
524
- const template = positionalTemplates[idx];
525
- if (template) {
526
- this.slot().templates.set(item.id, template);
527
- }
528
- });
529
- }
530
- const slot = this.slot();
531
- slot.itemOrder.length = 0;
532
- for (const item of items)
533
- slot.itemOrder.push(item.id);
534
- this.resolvedItemsSignal.set(items);
535
- run.resolve();
536
- }
537
- }
538
- catch (err) {
539
- this.logger.error('Failed to resolve array items:', err);
540
- this.resolvedItemsSignal.set([]);
541
- }
542
- }
543
- async appendItems(fieldTrees, startIndex, endIndex, run) {
544
- const itemsToResolve = fieldTrees.slice(startIndex, endIndex);
545
- if (itemsToResolve.length === 0)
546
- return;
547
- const safeItemObservables = itemsToResolve.map((_, i) => {
548
- const index = startIndex + i;
549
- return this.createResolveItemObservable(index).pipe(catchError((error) => {
550
- this.logger.error(`Failed to resolve array item at index ${index}:`, error);
551
- return of(undefined);
552
- }));
553
- });
554
- try {
555
- const newItems = await firstValueFrom(forkJoin(safeItemObservables).pipe(map((items) => items.filter((item) => item !== undefined))));
556
- if (!run.isStale()) {
557
- const slot = this.slot();
558
- for (const item of newItems)
559
- slot.itemOrder.push(item.id);
560
- this.resolvedItemsSignal.update((current) => [...current, ...newItems]);
561
- }
562
- }
563
- catch (err) {
564
- this.logger.error('Failed to append array items:', err);
565
- }
566
- }
567
- createResolveItemObservable(index, overrideTemplate, existingItemId) {
568
- const itemTemplates = this.itemTemplates();
569
- const primitiveKey = this.primitiveFieldKey();
570
- if (overrideTemplate && overrideTemplate.length > 0) {
571
- return resolveArrayItem({
572
- index,
573
- templates: this.withAutoRemove(overrideTemplate),
574
- arrayField: this.field(),
575
- itemPositionMap: this.itemPositionMap,
576
- parentFieldSignalContext: this.parentFieldSignalContext,
577
- parentInjector: this.parentInjector,
578
- registry: this.rawFieldRegistry(),
579
- destroyRef: this.destroyRef,
580
- loadTypeComponent: (type) => this.fieldRegistry.loadTypeComponent(type),
581
- generateItemId: this.generateItemId,
582
- existingItemId,
583
- primitiveFieldKey: primitiveKey,
584
- });
585
- }
586
- const templates = itemTemplates[index];
587
- if (templates && templates.length > 0) {
588
- return resolveArrayItem({
589
- index,
590
- templates: templates,
591
- arrayField: this.field(),
592
- itemPositionMap: this.itemPositionMap,
593
- parentFieldSignalContext: this.parentFieldSignalContext,
594
- parentInjector: this.parentInjector,
595
- registry: this.rawFieldRegistry(),
596
- destroyRef: this.destroyRef,
597
- loadTypeComponent: (type) => this.fieldRegistry.loadTypeComponent(type),
598
- generateItemId: this.generateItemId,
599
- existingItemId,
600
- primitiveFieldKey: primitiveKey,
601
- });
602
- }
603
- const fallback = this.fallbackTemplate();
604
- if (fallback && fallback.length > 0) {
605
- return resolveArrayItem({
606
- index,
607
- templates: this.withAutoRemove(fallback),
608
- arrayField: this.field(),
609
- itemPositionMap: this.itemPositionMap,
610
- parentFieldSignalContext: this.parentFieldSignalContext,
611
- parentInjector: this.parentInjector,
612
- registry: this.rawFieldRegistry(),
613
- destroyRef: this.destroyRef,
614
- loadTypeComponent: (type) => this.fieldRegistry.loadTypeComponent(type),
615
- generateItemId: this.generateItemId,
616
- existingItemId,
617
- primitiveFieldKey: primitiveKey,
618
- }).pipe(tap((item) => {
619
- if (item)
620
- this.slot().templates.set(item.id, fallback);
621
- }));
622
- }
623
- this.logger.warn(`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.`);
624
- return of(undefined);
625
- }
626
- withAutoRemove(templates) {
627
- const removeButton = this.autoRemoveButton();
628
- if (!removeButton)
629
- return templates;
630
- let cached = this.autoRemoveCache.get(templates);
631
- if (cached)
632
- return cached;
633
- cached = [...templates, removeButton];
634
- this.autoRemoveCache.set(templates, cached);
635
- return cached;
636
- }
637
- moveItem(fromIndex, toIndex) {
638
- const arrayKey = this.field().key;
639
- const parentForm = this.parentFieldSignalContext.form;
640
- const currentValue = parentForm().value();
641
- const currentArray = getArrayValue(currentValue, arrayKey);
642
- const length = currentArray.length;
643
- if (fromIndex < 0 || fromIndex >= length) {
644
- this.logger.warn(`moveArrayItem fromIndex ${fromIndex} is out of bounds for array '${arrayKey}' with length ${length}. Operation skipped.`);
645
- return;
646
- }
647
- if (toIndex < 0 || toIndex >= length) {
648
- this.logger.warn(`moveArrayItem toIndex ${toIndex} is out of bounds for array '${arrayKey}' with length ${length}. Operation skipped.`);
649
- return;
650
- }
651
- if (fromIndex === toIndex)
652
- return;
653
- const rawTemplates = this.rawItemTemplates();
654
- const currentItems = this.resolvedItemsSignal();
655
- const lo = Math.min(fromIndex, toIndex);
656
- const hi = Math.max(fromIndex, toIndex);
657
- for (let i = lo; i <= hi; i++) {
658
- const item = currentItems[i];
659
- if (item && !this.slot().templates.has(item.id) && i < rawTemplates.length) {
660
- this.slot().templates.set(item.id, rawTemplates[i]);
661
- }
662
- }
663
- this.resolvedItemsSignal.update((current) => {
664
- const newItems = [...current];
665
- const [moved] = newItems.splice(fromIndex, 1);
666
- newItems.splice(toIndex, 0, moved);
667
- return newItems;
668
- });
669
- this.slot().moveItem(fromIndex, toIndex);
670
- const newArray = [...currentArray];
671
- const [movedValue] = newArray.splice(fromIndex, 1);
672
- newArray.splice(toIndex, 0, movedValue);
673
- parentForm().value.set({ ...currentValue, [arrayKey]: newArray });
674
- }
675
- removeItem(index) {
676
- const arrayKey = this.field().key;
677
- const parentForm = this.parentFieldSignalContext.form;
678
- const currentValue = parentForm().value();
679
- const currentArray = getArrayValue(currentValue, arrayKey);
680
- if (currentArray.length === 0)
681
- return;
682
- let removeIndex;
683
- if (index === undefined || index === -1) {
684
- removeIndex = currentArray.length - 1;
685
- }
686
- else if (index < -1 || index >= currentArray.length) {
687
- this.logger.warn(`removeArrayItem index ${index} is out of bounds for array '${arrayKey}' with length ${currentArray.length}. Operation skipped.`);
688
- return;
689
- }
690
- else {
691
- removeIndex = index;
692
- }
693
- const removedItem = this.resolvedItemsSignal()[removeIndex];
694
- if (removedItem) {
695
- this.slot().templates.delete(removedItem.id);
696
- }
697
- this.slot().removeAt(removeIndex);
698
- this.resolvedItemsSignal.update((current) => {
699
- const newItems = [...current];
700
- newItems.splice(removeIndex, 1);
701
- return newItems;
702
- });
703
- const newArray = [...currentArray];
704
- newArray.splice(removeIndex, 1);
705
- parentForm().value.set({ ...currentValue, [arrayKey]: newArray });
706
- }
707
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: ArrayFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
708
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: ArrayFieldComponent, isStandalone: true, selector: "array-field", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: true, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, hidden: { classPropertyName: "hidden", publicName: "hidden", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "hostClasses()", "class.df-container-hidden": "hidden()", "attr.aria-hidden": "hidden() || null", "id": "`${key()}`", "attr.data-testid": "key()" } }, ngImport: i0, template: `
709
- @for (item of resolvedItems(); track item.id; let i = $index) {
710
- <div
711
- class="df-array-item"
712
- role="group"
713
- [attr.aria-label]="'Item ' + (i + 1)"
714
- [attr.data-array-item-id]="item.id"
715
- [attr.data-array-item-index]="i"
716
- >
717
- @for (field of item.fields; track $index) {
718
- <ng-container *dfFieldOutlet="field; environmentInjector: environmentInjector" />
719
- }
720
- </div>
721
- }
722
- `, isInline: true, styles: [".df-form{display:grid;grid-template-columns:1fr;gap:var(--df-grid-row-gap, .5rem);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, .5rem);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, .5rem);--df-grid-row-gap: var(--df-grid-row-gap-sm, .5rem)}.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, 12),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, .5rem);--df-grid-row-gap: var(--df-grid-row-gap-md, .5rem)}.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, .5rem);--df-grid-row-gap: var(--df-grid-row-gap-lg, .5rem)}.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, .5rem);--df-grid-row-gap: var(--df-grid-row-gap-xl, .5rem)}.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{display:grid;grid-template-columns:1fr;gap:var(--df-array-item-gap, var(--df-grid-row-gap, .5rem));width:100%}:host>*{grid-column:1/-1}:host.df-container-hidden{display:none}.df-array-item{display:grid;grid-template-columns:1fr;gap:var(--df-grid-row-gap, .5rem);width:100%}.df-array-item>*{grid-column:1/-1}\n"], dependencies: [{ kind: "directive", type: DfFieldOutlet, selector: "[dfFieldOutlet]", inputs: ["dfFieldOutlet", "dfFieldOutletEnvironmentInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
723
- }
724
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: ArrayFieldComponent, decorators: [{
725
- type: Component,
726
- args: [{ selector: 'array-field', imports: [DfFieldOutlet], template: `
727
- @for (item of resolvedItems(); track item.id; let i = $index) {
728
- <div
729
- class="df-array-item"
730
- role="group"
731
- [attr.aria-label]="'Item ' + (i + 1)"
732
- [attr.data-array-item-id]="item.id"
733
- [attr.data-array-item-index]="i"
734
- >
735
- @for (field of item.fields; track $index) {
736
- <ng-container *dfFieldOutlet="field; environmentInjector: environmentInjector" />
737
- }
738
- </div>
739
- }
740
- `, host: {
741
- '[class]': 'hostClasses()',
742
- '[class.df-container-hidden]': 'hidden()',
743
- '[attr.aria-hidden]': 'hidden() || null',
744
- '[id]': '`${key()}`',
745
- '[attr.data-testid]': 'key()',
746
- }, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".df-form{display:grid;grid-template-columns:1fr;gap:var(--df-grid-row-gap, .5rem);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, .5rem);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, .5rem);--df-grid-row-gap: var(--df-grid-row-gap-sm, .5rem)}.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, 12),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, .5rem);--df-grid-row-gap: var(--df-grid-row-gap-md, .5rem)}.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, .5rem);--df-grid-row-gap: var(--df-grid-row-gap-lg, .5rem)}.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, .5rem);--df-grid-row-gap: var(--df-grid-row-gap-xl, .5rem)}.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{display:grid;grid-template-columns:1fr;gap:var(--df-array-item-gap, var(--df-grid-row-gap, .5rem));width:100%}:host>*{grid-column:1/-1}:host.df-container-hidden{display:none}.df-array-item{display:grid;grid-template-columns:1fr;gap:var(--df-grid-row-gap, .5rem);width:100%}.df-array-item>*{grid-column:1/-1}\n"] }]
747
- }], 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 }] }] } });
748
-
749
- export { ArrayFieldComponent, ArrayFieldComponent as default };
750
- //# sourceMappingURL=ng-forge-dynamic-forms-array-field.component-CSCKq_1K.mjs.map