@ng-forge/dynamic-forms 1.3.0-next.2 → 1.3.0-next.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/ng-forge-dynamic-forms-active-page-initialized.event-bnrwNw7Y.mjs +156 -0
- package/fesm2022/ng-forge-dynamic-forms-active-page-initialized.event-bnrwNw7Y.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-array-field.component-Dv9mPnJ3.mjs +770 -0
- package/fesm2022/ng-forge-dynamic-forms-array-field.component-Dv9mPnJ3.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-array-item-registry.service-D-AxVLdk.mjs +83 -0
- package/fesm2022/ng-forge-dynamic-forms-array-item-registry.service-D-AxVLdk.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-B6WH0Etk.mjs +1887 -0
- package/fesm2022/ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-B6WH0Etk.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-bootstrap-web-mcp-VjJn-JeD.mjs +954 -0
- package/fesm2022/ng-forge-dynamic-forms-bootstrap-web-mcp-VjJn-JeD.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-container-field-processors-C_JRvaVt.mjs +117 -0
- package/fesm2022/ng-forge-dynamic-forms-container-field-processors-C_JRvaVt.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-container-field.component-Bg7Win9n.mjs +228 -0
- package/fesm2022/ng-forge-dynamic-forms-container-field.component-Bg7Win9n.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-R2yc-H0T.mjs +102 -0
- package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-R2yc-H0T.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-debounce-CG3uP5B-.mjs +4 -0
- package/fesm2022/{ng-forge-dynamic-forms-debounce-C9F4v1Ke.mjs.map → ng-forge-dynamic-forms-debounce-CG3uP5B-.mjs.map} +1 -1
- package/fesm2022/ng-forge-dynamic-forms-default-value-D5M4MNE-.mjs +77 -0
- package/fesm2022/ng-forge-dynamic-forms-default-value-D5M4MNE-.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-dev-mode-4rbYBBo_.mjs +4 -0
- package/fesm2022/ng-forge-dynamic-forms-dev-mode-4rbYBBo_.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-df-field-outlet.directive-CQsDMV-s.mjs +644 -0
- package/fesm2022/ng-forge-dynamic-forms-df-field-outlet.directive-CQsDMV-s.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-field-errors-wrapper.component-DKgkpIpG.mjs +56 -0
- package/fesm2022/ng-forge-dynamic-forms-field-errors-wrapper.component-DKgkpIpG.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-form-schema.service-Dd-gHJ_7.mjs +38 -0
- 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
- package/fesm2022/ng-forge-dynamic-forms-form-state-manager-BJKBX4FL.mjs +1545 -0
- package/fesm2022/ng-forge-dynamic-forms-form-state-manager-BJKBX4FL.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-group-field.component-BjZi0bhq.mjs +292 -0
- package/fesm2022/ng-forge-dynamic-forms-group-field.component-BjZi0bhq.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-integration.mjs +1318 -843
- package/fesm2022/ng-forge-dynamic-forms-integration.mjs.map +1 -1
- package/fesm2022/ng-forge-dynamic-forms-internal.mjs +3421 -3641
- package/fesm2022/ng-forge-dynamic-forms-internal.mjs.map +1 -1
- package/fesm2022/ng-forge-dynamic-forms-page-field.component-Bsd8YpzL.mjs +327 -0
- package/fesm2022/ng-forge-dynamic-forms-page-field.component-Bsd8YpzL.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-resolve-field-ByGa5cpo.mjs +329 -0
- package/fesm2022/ng-forge-dynamic-forms-resolve-field-ByGa5cpo.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-CuFycQb-.mjs +81 -0
- package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-CuFycQb-.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-schema-builder-C62afItJ.mjs +400 -0
- package/fesm2022/ng-forge-dynamic-forms-schema-builder-C62afItJ.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-schema-registry.service-axBV9FBH.mjs +45 -0
- package/fesm2022/ng-forge-dynamic-forms-schema-registry.service-axBV9FBH.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-schema.mjs +8 -14
- package/fesm2022/ng-forge-dynamic-forms-schema.mjs.map +1 -1
- package/fesm2022/ng-forge-dynamic-forms-testing.mjs +68 -73
- package/fesm2022/ng-forge-dynamic-forms-testing.mjs.map +1 -1
- package/fesm2022/ng-forge-dynamic-forms-text-field.component--MAh_h4Q.mjs +257 -0
- package/fesm2022/ng-forge-dynamic-forms-text-field.component--MAh_h4Q.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-validation-execution.token-BFyySKtp.mjs +8 -0
- package/fesm2022/ng-forge-dynamic-forms-validation-execution.token-BFyySKtp.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-with-logger-config-BAATqYY0.mjs +94 -0
- package/fesm2022/ng-forge-dynamic-forms-with-logger-config-BAATqYY0.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-wrapper-chain-BnntfNU1.mjs +115 -0
- package/fesm2022/ng-forge-dynamic-forms-wrapper-chain-BnntfNU1.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms.mjs +2195 -3
- package/fesm2022/ng-forge-dynamic-forms.mjs.map +1 -1
- package/package.json +1 -1
- package/types/ng-forge-dynamic-forms-integration.d.ts +543 -415
- package/types/ng-forge-dynamic-forms-internal.d.ts +2329 -2437
- package/types/ng-forge-dynamic-forms-schema.d.ts +13 -16
- package/types/ng-forge-dynamic-forms-testing.d.ts +34 -37
- package/types/ng-forge-dynamic-forms.d.ts +796 -722
- package/fesm2022/ng-forge-dynamic-forms-array-field.component-CSCKq_1K.mjs +0 -750
- package/fesm2022/ng-forge-dynamic-forms-array-field.component-CSCKq_1K.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-CTOTwzzw.mjs +0 -2394
- package/fesm2022/ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-CTOTwzzw.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-bootstrap-web-mcp-BtjqeJOj.mjs +0 -1054
- package/fesm2022/ng-forge-dynamic-forms-bootstrap-web-mcp-BtjqeJOj.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-container-field.component-Dc3ROhHL.mjs +0 -86
- package/fesm2022/ng-forge-dynamic-forms-container-field.component-Dc3ROhHL.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-BzgX8lAD.mjs +0 -33
- package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-BzgX8lAD.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-debounce-C9F4v1Ke.mjs +0 -17
- package/fesm2022/ng-forge-dynamic-forms-field-errors-wrapper.component-CIKbWqYA.mjs +0 -25
- package/fesm2022/ng-forge-dynamic-forms-field-errors-wrapper.component-CIKbWqYA.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-form-schema.service-Dx5Dlb15.mjs +0 -24
- package/fesm2022/ng-forge-dynamic-forms-group-field.component-DAC3P9DC.mjs +0 -177
- package/fesm2022/ng-forge-dynamic-forms-group-field.component-DAC3P9DC.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-CXQe_5td.mjs +0 -5133
- package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-CXQe_5td.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-page-field.component-DPKJcwUO.mjs +0 -176
- package/fesm2022/ng-forge-dynamic-forms-page-field.component-DPKJcwUO.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-DMEeKZny.mjs +0 -19
- package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-DMEeKZny.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-schema-builder-BvDTzfdM.mjs +0 -570
- package/fesm2022/ng-forge-dynamic-forms-schema-builder-BvDTzfdM.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-text-field.component-BB-jutBq.mjs +0 -126
- package/fesm2022/ng-forge-dynamic-forms-text-field.component-BB-jutBq.mjs.map +0 -1
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import { t as DEV_MODE } from "./ng-forge-dynamic-forms-dev-mode-4rbYBBo_.mjs";
|
|
2
|
+
import { a as resolveDefaultExport } from "./ng-forge-dynamic-forms-wrapper-chain-BnntfNU1.mjs";
|
|
3
|
+
import { InjectionToken, computed, inject, isSignal, runInInjectionContext, signal } from "@angular/core";
|
|
4
|
+
import { catchError, forkJoin, from, map, of, pipe, scan, switchMap } from "rxjs";
|
|
5
|
+
import { ARRAY_CONTEXT, DynamicFormError, FIELD_REGISTRY, FORM_ID_PREFIX, GROUP_CONTEXT, baseFieldMapper, hasTargetProperty, isDerivationLogicConfig, isEqual } from "@ng-forge/dynamic-forms/internal";
|
|
6
|
+
const COMPONENT_CACHE = new InjectionToken("COMPONENT_CACHE", {
|
|
7
|
+
providedIn: "root",
|
|
8
|
+
factory: () => /* @__PURE__ */ new Map()
|
|
9
|
+
});
|
|
10
|
+
const COMPONENT_LOAD_CACHE = new InjectionToken("COMPONENT_LOAD_CACHE", {
|
|
11
|
+
providedIn: "root",
|
|
12
|
+
factory: () => /* @__PURE__ */ new Map()
|
|
13
|
+
});
|
|
14
|
+
function injectFieldRegistry() {
|
|
15
|
+
const registry = inject(FIELD_REGISTRY);
|
|
16
|
+
const componentCache = inject(COMPONENT_CACHE);
|
|
17
|
+
const componentLoadCache = inject(COMPONENT_LOAD_CACHE);
|
|
18
|
+
return {
|
|
19
|
+
getType(name) {
|
|
20
|
+
return registry.get(name);
|
|
21
|
+
},
|
|
22
|
+
hasType(name) {
|
|
23
|
+
return registry.has(name);
|
|
24
|
+
},
|
|
25
|
+
async loadTypeComponent(name) {
|
|
26
|
+
const fieldType = registry.get(name);
|
|
27
|
+
if (!fieldType) throw new DynamicFormError(`Field type "${name}" is not registered`);
|
|
28
|
+
if (!fieldType.loadComponent) return;
|
|
29
|
+
const cached = componentCache.get(name);
|
|
30
|
+
if (cached) return cached;
|
|
31
|
+
const pending = componentLoadCache.get(name);
|
|
32
|
+
if (pending) return pending;
|
|
33
|
+
try {
|
|
34
|
+
const load = fieldType.loadComponent().then(resolveDefaultExport).then((component) => {
|
|
35
|
+
if (component) componentCache.set(name, component);
|
|
36
|
+
return component;
|
|
37
|
+
}).catch((error) => {
|
|
38
|
+
throw new DynamicFormError(`Failed to load component for field type "${name}": ${error}`);
|
|
39
|
+
}).finally(() => componentLoadCache.delete(name));
|
|
40
|
+
componentLoadCache.set(name, load);
|
|
41
|
+
return load;
|
|
42
|
+
} catch (error) {
|
|
43
|
+
throw new DynamicFormError(`Failed to load component for field type "${name}": ${error}`);
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
getLoadedComponent(name) {
|
|
47
|
+
return componentCache.get(name);
|
|
48
|
+
},
|
|
49
|
+
getTypes() {
|
|
50
|
+
return Array.from(registry.values());
|
|
51
|
+
},
|
|
52
|
+
registerTypes(types) {
|
|
53
|
+
types.forEach((type) => {
|
|
54
|
+
registry.set(type.name, type);
|
|
55
|
+
});
|
|
56
|
+
},
|
|
57
|
+
get raw() {
|
|
58
|
+
return registry;
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const EMPTY_OVERRIDES = Object.freeze({});
|
|
63
|
+
function createPropertyOverrideStore() {
|
|
64
|
+
const store = /* @__PURE__ */ new Map();
|
|
65
|
+
const registeredFields = /* @__PURE__ */ new Set();
|
|
66
|
+
function getOrCreateSignal(fieldKey) {
|
|
67
|
+
let existing = store.get(fieldKey);
|
|
68
|
+
if (!existing) {
|
|
69
|
+
existing = signal(EMPTY_OVERRIDES);
|
|
70
|
+
store.set(fieldKey, existing);
|
|
71
|
+
}
|
|
72
|
+
return existing;
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
getOverrides(fieldKey) {
|
|
76
|
+
return getOrCreateSignal(fieldKey);
|
|
77
|
+
},
|
|
78
|
+
setOverride(fieldKey, targetProperty, value) {
|
|
79
|
+
const fieldSignal = getOrCreateSignal(fieldKey);
|
|
80
|
+
const current = fieldSignal();
|
|
81
|
+
if (value === void 0) {
|
|
82
|
+
if (!(targetProperty in current)) return;
|
|
83
|
+
const { [targetProperty]: _, ...rest } = current;
|
|
84
|
+
fieldSignal.set(Object.keys(rest).length === 0 ? EMPTY_OVERRIDES : rest);
|
|
85
|
+
} else {
|
|
86
|
+
const currentValue = current[targetProperty];
|
|
87
|
+
if (isEqual(currentValue, value)) return;
|
|
88
|
+
fieldSignal.set({
|
|
89
|
+
...current,
|
|
90
|
+
[targetProperty]: value
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
registerField(fieldKey) {
|
|
95
|
+
registeredFields.add(fieldKey);
|
|
96
|
+
},
|
|
97
|
+
hasField(fieldKey) {
|
|
98
|
+
return registeredFields.has(fieldKey);
|
|
99
|
+
},
|
|
100
|
+
clear() {
|
|
101
|
+
store.clear();
|
|
102
|
+
registeredFields.clear();
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
const PROPERTY_OVERRIDE_STORE = new InjectionToken("PROPERTY_OVERRIDE_STORE");
|
|
107
|
+
const KNOWN_FIELD_PROPERTIES = /* @__PURE__ */ new Set([
|
|
108
|
+
"label",
|
|
109
|
+
"placeholder",
|
|
110
|
+
"disabled",
|
|
111
|
+
"readonly",
|
|
112
|
+
"required",
|
|
113
|
+
"className",
|
|
114
|
+
"tabIndex",
|
|
115
|
+
"validationMessages",
|
|
116
|
+
"options",
|
|
117
|
+
"props",
|
|
118
|
+
"hint",
|
|
119
|
+
"tooltip",
|
|
120
|
+
"prefix",
|
|
121
|
+
"suffix",
|
|
122
|
+
"min",
|
|
123
|
+
"max",
|
|
124
|
+
"minLength",
|
|
125
|
+
"maxLength",
|
|
126
|
+
"step",
|
|
127
|
+
"pattern",
|
|
128
|
+
"rows",
|
|
129
|
+
"cols",
|
|
130
|
+
"multiple",
|
|
131
|
+
"appearance"
|
|
132
|
+
]);
|
|
133
|
+
function applyPropertyOverrides(inputs, overrides) {
|
|
134
|
+
const keys = Object.keys(overrides);
|
|
135
|
+
if (keys.length === 0) return inputs;
|
|
136
|
+
const result = { ...inputs };
|
|
137
|
+
for (const key of keys) {
|
|
138
|
+
const value = overrides[key];
|
|
139
|
+
const dotIndex = key.indexOf(".");
|
|
140
|
+
if (DEV_MODE) {
|
|
141
|
+
const topLevelKey = dotIndex === -1 ? key : key.substring(0, dotIndex);
|
|
142
|
+
if (KNOWN_FIELD_PROPERTIES.has(topLevelKey) && !(topLevelKey in inputs)) console.warn(`[Dynamic Forms] Property override '${key}' does not match any existing input property. This may indicate a typo in the targetProperty configuration. Available properties: ${Object.keys(inputs).join(", ")}`);
|
|
143
|
+
}
|
|
144
|
+
if (dotIndex === -1) result[key] = value;
|
|
145
|
+
else {
|
|
146
|
+
const parentKey = key.substring(0, dotIndex);
|
|
147
|
+
const childKey = key.substring(dotIndex + 1);
|
|
148
|
+
if (childKey.includes(".")) throw new DynamicFormError(`Property override path '${key}' exceeds maximum depth of 2 levels. Only simple ('minDate') and single-nested ('props.appearance') paths are supported.`);
|
|
149
|
+
const parentValue = result[parentKey];
|
|
150
|
+
const clonedParent = parentValue && typeof parentValue === "object" ? { ...parentValue } : {};
|
|
151
|
+
clonedParent[childKey] = value;
|
|
152
|
+
result[parentKey] = clonedParent;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return result;
|
|
156
|
+
}
|
|
157
|
+
function buildPropertyOverrideKey(arrayKey, index, fieldKey, groupPath) {
|
|
158
|
+
const leafScope = groupPath ? `${groupPath}.${fieldKey}` : fieldKey;
|
|
159
|
+
if (arrayKey != null && index != null) return `${arrayKey}.${index}.${leafScope}`;
|
|
160
|
+
return leafScope;
|
|
161
|
+
}
|
|
162
|
+
function fieldHasPropertyDerivations(fieldDef) {
|
|
163
|
+
if (!fieldDef.key) return false;
|
|
164
|
+
const logic = fieldDef.logic;
|
|
165
|
+
if (!logic || logic.length === 0) return false;
|
|
166
|
+
for (const entry of logic) if (isDerivationLogicConfig(entry) && hasTargetProperty(entry)) return true;
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
function mergeForwardedPropsToMeta(inputs, propsToMeta) {
|
|
170
|
+
const props = inputs["props"];
|
|
171
|
+
if (!props || propsToMeta.length === 0) return inputs;
|
|
172
|
+
const forwardedValues = {};
|
|
173
|
+
for (const key of propsToMeta) {
|
|
174
|
+
const value = props[key];
|
|
175
|
+
if (value !== void 0 && value !== null) forwardedValues[key] = value;
|
|
176
|
+
}
|
|
177
|
+
if (Object.keys(forwardedValues).length === 0) return inputs;
|
|
178
|
+
const existingMeta = inputs["meta"];
|
|
179
|
+
const mergedMeta = {
|
|
180
|
+
...forwardedValues,
|
|
181
|
+
...existingMeta
|
|
182
|
+
};
|
|
183
|
+
return {
|
|
184
|
+
...inputs,
|
|
185
|
+
meta: mergedMeta
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
function applyIndexSuffix(inputs, index) {
|
|
189
|
+
const key = inputs["key"];
|
|
190
|
+
if (typeof key !== "string") return inputs;
|
|
191
|
+
return {
|
|
192
|
+
...inputs,
|
|
193
|
+
key: `${key}_${index}`
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
function applyGroupPrefix(inputs, groupPath) {
|
|
197
|
+
const key = inputs["key"];
|
|
198
|
+
if (typeof key !== "string" || groupPath.length === 0) return inputs;
|
|
199
|
+
return {
|
|
200
|
+
...inputs,
|
|
201
|
+
key: `${groupPath.replace(/\./g, "_")}_${key}`
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
function applyFormPrefix(inputs, prefix) {
|
|
205
|
+
const key = inputs["key"];
|
|
206
|
+
if (typeof key !== "string" || prefix.length === 0) return inputs;
|
|
207
|
+
return {
|
|
208
|
+
...inputs,
|
|
209
|
+
key: `${prefix}_${key}`
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
function mapFieldToInputs(fieldDef, fieldRegistry) {
|
|
213
|
+
const fieldType = fieldRegistry.get(fieldDef.type);
|
|
214
|
+
if (fieldType && !fieldType.loadComponent && !fieldType.mapper) return;
|
|
215
|
+
const arrayContext = inject(ARRAY_CONTEXT, { optional: true });
|
|
216
|
+
const groupContext = inject(GROUP_CONTEXT, { optional: true });
|
|
217
|
+
const formPrefixSignal = inject(FORM_ID_PREFIX, { optional: true });
|
|
218
|
+
const store = inject(PROPERTY_OVERRIDE_STORE);
|
|
219
|
+
const mapperResult = fieldType?.mapper ? fieldType.mapper(fieldDef) : baseFieldMapper(fieldDef);
|
|
220
|
+
const propsToMeta = fieldType?.propsToMeta;
|
|
221
|
+
const hasPropsForwarding = propsToMeta && propsToMeta.length > 0;
|
|
222
|
+
const indexSignal = arrayContext?.index;
|
|
223
|
+
const hasArrayContext = indexSignal !== void 0 && isSignal(indexSignal);
|
|
224
|
+
const hasGroupContext = groupContext != null;
|
|
225
|
+
const hasFormPrefix = formPrefixSignal != null;
|
|
226
|
+
const hasOverrides = fieldHasPropertyDerivations(fieldDef);
|
|
227
|
+
if (!hasPropsForwarding && !hasArrayContext && !hasGroupContext && !hasOverrides && !hasFormPrefix) return mapperResult;
|
|
228
|
+
return computed(() => {
|
|
229
|
+
let inputs = mapperResult();
|
|
230
|
+
if (hasPropsForwarding) inputs = mergeForwardedPropsToMeta(inputs, propsToMeta);
|
|
231
|
+
if (hasGroupContext) inputs = applyGroupPrefix(inputs, groupContext.groupPath());
|
|
232
|
+
if (hasArrayContext) {
|
|
233
|
+
const index = indexSignal();
|
|
234
|
+
inputs = applyIndexSuffix(inputs, index);
|
|
235
|
+
}
|
|
236
|
+
if (hasFormPrefix) inputs = applyFormPrefix(inputs, formPrefixSignal());
|
|
237
|
+
if (hasOverrides) {
|
|
238
|
+
const groupPath = hasGroupContext ? groupContext.groupPath() : void 0;
|
|
239
|
+
const key = hasArrayContext ? buildPropertyOverrideKey(arrayContext.arrayKey, indexSignal(), fieldDef.key, groupPath || void 0) : buildPropertyOverrideKey(void 0, void 0, fieldDef.key, groupPath || void 0);
|
|
240
|
+
const overrides = store.getOverrides(key)();
|
|
241
|
+
inputs = applyPropertyOverrides(inputs, overrides);
|
|
242
|
+
}
|
|
243
|
+
return inputs;
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
function createRenderReadySignal(inputs, definition) {
|
|
247
|
+
const explicitRenderReadyWhen = definition?.renderReadyWhen;
|
|
248
|
+
const requiredInputs = definition?.mapper && explicitRenderReadyWhen === void 0 ? ["field"] : explicitRenderReadyWhen ?? [];
|
|
249
|
+
if (requiredInputs.length === 0) return computed(() => true);
|
|
250
|
+
return computed(() => {
|
|
251
|
+
const currentInputs = inputs();
|
|
252
|
+
return requiredInputs.every((inputName) => currentInputs[inputName] !== void 0);
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
function createHiddenSignal(inputs) {
|
|
256
|
+
return computed(() => {
|
|
257
|
+
const currentInputs = inputs();
|
|
258
|
+
const fieldCandidate = currentInputs["field"];
|
|
259
|
+
if (typeof fieldCandidate === "function") {
|
|
260
|
+
const state = fieldCandidate();
|
|
261
|
+
if (state && typeof state.hidden === "function") return state.hidden() === true;
|
|
262
|
+
}
|
|
263
|
+
return currentInputs["hidden"] === true;
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
function resolveField(fieldDef, context) {
|
|
267
|
+
return from(context.loadTypeComponent(fieldDef.type)).pipe(map((component) => {
|
|
268
|
+
if (context.destroyRef.destroyed) return;
|
|
269
|
+
if (!component) return;
|
|
270
|
+
const inputs = runInInjectionContext(context.injector, () => mapFieldToInputs(fieldDef, context.registry));
|
|
271
|
+
const definition = context.registry.get(fieldDef.type);
|
|
272
|
+
if (!inputs) return;
|
|
273
|
+
return {
|
|
274
|
+
key: fieldDef.key,
|
|
275
|
+
fieldDef,
|
|
276
|
+
component,
|
|
277
|
+
injector: context.injector,
|
|
278
|
+
inputs,
|
|
279
|
+
renderReady: createRenderReadySignal(inputs, definition),
|
|
280
|
+
hidden: createHiddenSignal(inputs)
|
|
281
|
+
};
|
|
282
|
+
}), catchError((error) => {
|
|
283
|
+
if (!context.destroyRef.destroyed) context.onError?.(fieldDef, error);
|
|
284
|
+
return of(void 0);
|
|
285
|
+
}));
|
|
286
|
+
}
|
|
287
|
+
function resolveFieldSync(fieldDef, context) {
|
|
288
|
+
const component = context.getLoadedComponent(fieldDef.type);
|
|
289
|
+
if (!component) return;
|
|
290
|
+
const inputs = runInInjectionContext(context.injector, () => mapFieldToInputs(fieldDef, context.registry));
|
|
291
|
+
const definition = context.registry.get(fieldDef.type);
|
|
292
|
+
if (!inputs) return;
|
|
293
|
+
return {
|
|
294
|
+
key: fieldDef.key,
|
|
295
|
+
fieldDef,
|
|
296
|
+
component,
|
|
297
|
+
injector: context.injector,
|
|
298
|
+
inputs,
|
|
299
|
+
renderReady: createRenderReadySignal(inputs, definition),
|
|
300
|
+
hidden: createHiddenSignal(inputs)
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
function reconcileFields(prev, curr) {
|
|
304
|
+
const prevMap = new Map(prev.map((f) => [f.key, f]));
|
|
305
|
+
return curr.map((field) => {
|
|
306
|
+
const existing = prevMap.get(field.key);
|
|
307
|
+
if (existing && existing.component === field.component && existing.injector === field.injector) {
|
|
308
|
+
if (existing.fieldDef === field.fieldDef) return existing;
|
|
309
|
+
return {
|
|
310
|
+
...existing,
|
|
311
|
+
fieldDef: field.fieldDef,
|
|
312
|
+
inputs: field.inputs,
|
|
313
|
+
renderReady: field.renderReady,
|
|
314
|
+
hidden: field.hidden
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
return field;
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
function createFieldResolutionPipe(getContext) {
|
|
321
|
+
return pipe(switchMap((fields) => {
|
|
322
|
+
if (!fields || fields.length === 0) return of([]);
|
|
323
|
+
const context = getContext();
|
|
324
|
+
return forkJoin(fields.map((f) => resolveField(f, context)));
|
|
325
|
+
}), map((fields) => fields.filter((f) => f !== void 0)), scan(reconcileFields, []));
|
|
326
|
+
}
|
|
327
|
+
export { resolveField as a, PROPERTY_OVERRIDE_STORE as c, reconcileFields as i, createPropertyOverrideStore as l, createHiddenSignal as n, resolveFieldSync as o, createRenderReadySignal as r, mapFieldToInputs as s, createFieldResolutionPipe as t, injectFieldRegistry as u };
|
|
328
|
+
|
|
329
|
+
//# sourceMappingURL=ng-forge-dynamic-forms-resolve-field-ByGa5cpo.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ng-forge-dynamic-forms-resolve-field-ByGa5cpo.mjs","names":[],"sources":["../../../../packages/dynamic-forms/src/lib/utils/inject-field-registry/inject-field-registry.ts","../../../../packages/dynamic-forms/src/lib/core/property-derivation/property-override-store.ts","../../../../packages/dynamic-forms/src/lib/core/property-derivation/apply-property-overrides.ts","../../../../packages/dynamic-forms/src/lib/core/property-derivation/property-override-key.ts","../../../../packages/dynamic-forms/src/lib/utils/field-mapper/field-mapper.ts","../../../../packages/dynamic-forms/src/lib/utils/resolve-field/resolve-field.ts"],"sourcesContent":["import { inject, InjectionToken, Type } from '@angular/core';\nimport { DynamicFormError } from '@ng-forge/dynamic-forms/internal';\nimport { FIELD_REGISTRY, FieldTypeDefinition } from '@ng-forge/dynamic-forms/internal';\nimport { resolveDefaultExport } from '../wrapper-chain/wrapper-chain';\n\n/**\n * Cache for resolved field type components.\n *\n * @internal\n */\nexport const COMPONENT_CACHE = new InjectionToken<Map<string, Type<unknown>>>('COMPONENT_CACHE', {\n providedIn: 'root',\n factory: () => new Map(),\n});\n\n/**\n * In-flight component loads, scoped through DI so concurrent fields share one\n * dynamic import without introducing module-level mutable state.\n *\n * @internal\n */\nexport const COMPONENT_LOAD_CACHE = new InjectionToken<Map<string, Promise<Type<unknown> | undefined>>>('COMPONENT_LOAD_CACHE', {\n providedIn: 'root',\n factory: () => new Map(),\n});\n\n/**\n * Injection function for accessing the dynamic form field registry.\n *\n * @returns Object with methods for field registry interaction\n * @Component({...})\n * export class MyComponent {\n * private fieldRegistry = injectFieldRegistry();\n *\n * async loadCustomField() {\n * if (this.fieldRegistry.hasType('custom-input')) {\n * const component = await this.fieldRegistry.loadTypeComponent('custom-input');\n * // Use component...\n * }\n * }\n * }\n * ```\n * @Injectable()\n * export class FormBuilderService {\n * private fieldRegistry = injectFieldRegistry();\n *\n * getAvailableFieldTypes(): string[] {\n * return this.fieldRegistry.getTypes().map(type => type.name);\n * }\n * }\n * ```\n */\nexport function injectFieldRegistry() {\n const registry = inject(FIELD_REGISTRY);\n const componentCache = inject(COMPONENT_CACHE);\n const componentLoadCache = inject(COMPONENT_LOAD_CACHE);\n\n return {\n /**\n * Retrieves a field type definition by its registered name.\n *\n * @param name - The registered name of the field type\n * @returns The field type definition if found, undefined otherwise\n */\n getType(name: string): FieldTypeDefinition | undefined {\n return registry.get(name);\n },\n\n /**\n * Checks if a field type is registered in the registry.\n *\n * @param name - The name of the field type to check\n * @returns True if the field type exists, false otherwise\n */\n hasType(name: string): boolean {\n return registry.has(name);\n },\n\n /**\n * Loads a field type component with support for lazy loading.\n *\n * @param name - The name of the field type to load\n * @returns Promise resolving to the component constructor, or undefined for componentless fields\n * @throws {Error} When field type is not registered or loading fails\n */\n async loadTypeComponent(name: string): Promise<Type<unknown> | undefined> {\n const fieldType = registry.get(name);\n\n if (!fieldType) {\n throw new DynamicFormError(`Field type \"${name}\" is not registered`);\n }\n\n // Componentless field types (e.g., hidden) don't have loadComponent\n if (!fieldType.loadComponent) {\n return undefined;\n }\n\n // Check cache first for instant resolution\n const cached = componentCache.get(name);\n if (cached) {\n return cached;\n }\n\n const pending = componentLoadCache.get(name);\n if (pending) {\n return pending;\n }\n\n try {\n const load = fieldType\n .loadComponent()\n .then(resolveDefaultExport)\n .then((component) => {\n if (component) {\n componentCache.set(name, component);\n }\n\n return component;\n })\n .catch((error: unknown) => {\n throw new DynamicFormError(`Failed to load component for field type \"${name}\": ${error}`);\n })\n .finally(() => componentLoadCache.delete(name));\n\n componentLoadCache.set(name, load);\n return load;\n } catch (error) {\n throw new DynamicFormError(`Failed to load component for field type \"${name}\": ${error}`);\n }\n },\n\n /**\n * Returns a previously loaded component from cache, or undefined if not yet loaded.\n *\n * @param name - The name of the field type\n * @returns The cached component constructor, or undefined\n */\n getLoadedComponent(name: string): Type<unknown> | undefined {\n return componentCache.get(name);\n },\n\n /**\n * Gets all registered field type definitions.\n *\n * @returns Array of all field type definitions in the registry\n */\n getTypes(): FieldTypeDefinition[] {\n return Array.from(registry.values());\n },\n\n /**\n * Registers multiple field types at once.\n *\n * @param types - Array of field type definitions to register\n */\n registerTypes(types: FieldTypeDefinition[]): void {\n types.forEach((type) => {\n registry.set(type.name, type);\n });\n },\n\n /**\n * Provides direct access to the underlying registry Map.\n *\n * @returns The raw Map containing field type registrations\n */\n get raw() {\n return registry;\n },\n };\n}\n","import { InjectionToken, signal, Signal, WritableSignal } from '@angular/core';\nimport { isEqual } from '@ng-forge/dynamic-forms/internal';\n\n/** Per-field signal store for property overrides. */\nexport interface PropertyOverrideStore {\n /**\n * Gets the override signal for a field.\n *\n * @param fieldKey - The store key (e.g., 'endDate' or 'contacts.0.email')\n * @returns Signal containing the current overrides record\n */\n getOverrides(fieldKey: string): Signal<Record<string, unknown>>;\n\n /**\n * Sets a single property override for a field.\n *\n * @param fieldKey - The store key\n * @param targetProperty - The property name (e.g., 'minDate', 'options')\n * @param value - The override value, or undefined to remove\n */\n setOverride(fieldKey: string, targetProperty: string, value: unknown): void;\n\n /**\n * Registers a field as having property derivations.\n *\n * @param fieldKey - The store key to register\n */\n registerField(fieldKey: string): void;\n\n /**\n * Non-reactive check for whether a field has been registered.\n *\n * @param fieldKey - The store key (or prefix for array fields)\n * @returns true if the field has property derivation entries\n */\n hasField(fieldKey: string): boolean;\n\n /** Clears all overrides and registered fields. */\n clear(): void;\n}\n\nconst EMPTY_OVERRIDES: Record<string, unknown> = Object.freeze({});\n\n/**\n * Creates a new PropertyOverrideStore instance.\n *\n * @returns A fresh PropertyOverrideStore\n */\nexport function createPropertyOverrideStore(): PropertyOverrideStore {\n const store = new Map<string, WritableSignal<Record<string, unknown>>>();\n const registeredFields = new Set<string>();\n\n function getOrCreateSignal(fieldKey: string): WritableSignal<Record<string, unknown>> {\n let existing = store.get(fieldKey);\n if (!existing) {\n existing = signal(EMPTY_OVERRIDES);\n store.set(fieldKey, existing);\n }\n return existing;\n }\n\n return {\n getOverrides(fieldKey: string): Signal<Record<string, unknown>> {\n return getOrCreateSignal(fieldKey);\n },\n\n setOverride(fieldKey: string, targetProperty: string, value: unknown): void {\n const fieldSignal = getOrCreateSignal(fieldKey);\n const current = fieldSignal();\n\n if (value === undefined) {\n // Remove the property key\n if (!(targetProperty in current)) {\n return; // Already absent, no-op\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [targetProperty]: _, ...rest } = current;\n fieldSignal.set(Object.keys(rest).length === 0 ? EMPTY_OVERRIDES : rest);\n } else {\n // Set or update the property\n const currentValue = current[targetProperty];\n if (isEqual(currentValue, value)) {\n return; // Value unchanged, no-op\n }\n fieldSignal.set({ ...current, [targetProperty]: value });\n }\n },\n\n registerField(fieldKey: string): void {\n registeredFields.add(fieldKey);\n },\n\n hasField(fieldKey: string): boolean {\n return registeredFields.has(fieldKey);\n },\n\n clear(): void {\n store.clear();\n registeredFields.clear();\n },\n };\n}\n\n/** Injection token for the PropertyOverrideStore. */\nexport const PROPERTY_OVERRIDE_STORE = new InjectionToken<PropertyOverrideStore>('PROPERTY_OVERRIDE_STORE');\n","import { DEV_MODE } from '../../utils/dev-mode';\nimport { DynamicFormError } from '@ng-forge/dynamic-forms/internal';\nimport { BaseValueField } from '@ng-forge/dynamic-forms/internal';\nimport { FieldWithValidation } from '@ng-forge/dynamic-forms/internal';\n\n/** Properties defined by individual field components, not part of the shared base interfaces. */\ntype AdapterFieldKey = 'options' | 'hint' | 'tooltip' | 'prefix' | 'suffix' | 'step' | 'rows' | 'cols' | 'multiple' | 'appearance';\n\n/**\n * Known standard field properties where a missing key likely indicates a typo.\n * Override keys not in this set are assumed to be intentional dynamic properties\n * and will not trigger dev-mode warnings.\n */\nconst KNOWN_FIELD_PROPERTY_NAMES = [\n 'label',\n 'placeholder',\n 'disabled',\n 'readonly',\n 'required',\n 'className',\n 'tabIndex',\n 'validationMessages',\n 'options',\n 'props',\n 'hint',\n 'tooltip',\n 'prefix',\n 'suffix',\n 'min',\n 'max',\n 'minLength',\n 'maxLength',\n 'step',\n 'pattern',\n 'rows',\n 'cols',\n 'multiple',\n 'appearance',\n] as const satisfies ReadonlyArray<keyof BaseValueField<unknown, unknown> | keyof FieldWithValidation | AdapterFieldKey>;\n\nconst KNOWN_FIELD_PROPERTIES = new Set<string>(KNOWN_FIELD_PROPERTY_NAMES);\n\n/**\n * Applies property overrides to a field's input record.\n *\n * @param inputs - The current field inputs record\n * @param overrides - Record of property names to override values\n * @returns Updated inputs record with overrides applied\n */\nexport function applyPropertyOverrides(inputs: Record<string, unknown>, overrides: Record<string, unknown>): Record<string, unknown> {\n const keys = Object.keys(overrides);\n if (keys.length === 0) {\n return inputs;\n }\n\n const result = { ...inputs };\n\n for (const key of keys) {\n const value = overrides[key];\n const dotIndex = key.indexOf('.');\n\n // Dev-mode check: warn only when a known standard field property is missing from inputs,\n // which likely indicates a typo. Dynamic/custom keys are intentionally skipped to avoid\n // false positives for properties added by derivations that aren't in the initial config.\n if (DEV_MODE) {\n const topLevelKey = dotIndex === -1 ? key : key.substring(0, dotIndex);\n if (KNOWN_FIELD_PROPERTIES.has(topLevelKey) && !(topLevelKey in inputs)) {\n console.warn(\n `[Dynamic Forms] Property override '${key}' does not match any existing input property. ` +\n 'This may indicate a typo in the targetProperty configuration. ' +\n `Available properties: ${Object.keys(inputs).join(', ')}`,\n );\n }\n }\n\n if (dotIndex === -1) {\n // Simple property: direct assignment\n result[key] = value;\n } else {\n // Nested property — split at first dot only\n const parentKey = key.substring(0, dotIndex);\n const childKey = key.substring(dotIndex + 1);\n\n // Validate max 2 levels (1 dot)\n if (childKey.includes('.')) {\n throw new DynamicFormError(\n `Property override path '${key}' exceeds maximum depth of 2 levels. ` +\n `Only simple ('minDate') and single-nested ('props.appearance') paths are supported.`,\n );\n }\n\n // Shallow-clone the parent object and set the child property\n const parentValue = result[parentKey];\n const clonedParent = parentValue && typeof parentValue === 'object' ? { ...(parentValue as Record<string, unknown>) } : {};\n clonedParent[childKey] = value;\n result[parentKey] = clonedParent;\n }\n }\n\n return result;\n}\n","/** Sentinel value for the `$` placeholder index used in registration keys. */\nexport const PLACEHOLDER_INDEX = '$' as const;\n\n/**\n * Builds a property override store key for a field.\n *\n * @param arrayKey - The array field key (e.g., 'contacts'), or undefined for non-array fields\n * @param index - The array item index, `PLACEHOLDER_INDEX` for the wildcard format, or undefined for non-array fields\n * @param fieldKey - The leaf field key (e.g., 'email')\n * @param groupPath - Dot-joined group ancestors scoped to the current array item (or top-level), or undefined when not inside any group\n * @returns The store key (e.g., 'email', 'address.street', 'contacts.0.email', 'contacts.$.profile.email')\n */\nexport function buildPropertyOverrideKey(\n arrayKey: string | undefined,\n index: number | typeof PLACEHOLDER_INDEX | undefined,\n fieldKey: string,\n groupPath?: string,\n): string {\n const leafScope = groupPath ? `${groupPath}.${fieldKey}` : fieldKey;\n if (arrayKey != null && index != null) {\n return `${arrayKey}.${index}.${leafScope}`;\n }\n return leafScope;\n}\n","import { computed, inject, isSignal, Signal } from '@angular/core';\nimport { FieldDef } from '@ng-forge/dynamic-forms/internal';\nimport { FieldWithValidation } from '@ng-forge/dynamic-forms/internal';\nimport { FieldMeta } from '@ng-forge/dynamic-forms/internal';\nimport { FieldTypeDefinition } from '@ng-forge/dynamic-forms/internal';\nimport { ARRAY_CONTEXT, FORM_ID_PREFIX, GROUP_CONTEXT } from '@ng-forge/dynamic-forms/internal';\nimport { ArrayContext } from '@ng-forge/dynamic-forms/internal';\nimport { baseFieldMapper } from '@ng-forge/dynamic-forms/internal';\nimport { PROPERTY_OVERRIDE_STORE } from '../../core/property-derivation/property-override-store';\nimport { applyPropertyOverrides } from '../../core/property-derivation/apply-property-overrides';\nimport { buildPropertyOverrideKey } from '../../core/property-derivation/property-override-key';\nimport { hasTargetProperty, isDerivationLogicConfig } from '@ng-forge/dynamic-forms/internal';\n\n/**\n * Returns true if the field has any property-derivation logic entries\n * (type: 'derivation' with a non-empty targetProperty). Mirrors the inclusion\n * rule used by `collectPropertyDerivations`, so the mapper and orchestrator\n * agree on which fields participate in property overrides — without depending\n * on whether the orchestrator's registration effect has run yet (which it\n * hasn't on the resolveFieldSync path with a warm COMPONENT_CACHE).\n */\nfunction fieldHasPropertyDerivations(fieldDef: FieldDef<unknown>): boolean {\n // Match the collector's keyless guard (property-derivation-collector.ts):\n // keyless fields are never registered in the store, so the mapper must skip\n // them too — otherwise getOverrides() would be called with an undefined key.\n if (!fieldDef.key) return false;\n const logic = (fieldDef as FieldDef<unknown> & FieldWithValidation).logic;\n if (!logic || logic.length === 0) return false;\n for (const entry of logic) {\n if (isDerivationLogicConfig(entry) && hasTargetProperty(entry)) return true;\n }\n return false;\n}\n\n/**\n * Merges forwarded props into meta, with meta taking precedence.\n *\n * @param inputs The current inputs record\n * @param propsToMeta Array of prop keys to forward to meta\n * @returns Updated inputs record with merged meta\n */\nfunction mergeForwardedPropsToMeta(inputs: Record<string, unknown>, propsToMeta: string[]): Record<string, unknown> {\n const props = inputs['props'] as Record<string, unknown> | undefined;\n if (!props || propsToMeta.length === 0) {\n return inputs;\n }\n\n // Extract values to forward from props\n // Values are typed as FieldMeta-compatible since they're forwarded attributes (type, rows, cols, etc.)\n const forwardedValues: FieldMeta = {};\n for (const key of propsToMeta) {\n const value = props[key];\n if (value !== undefined && value !== null) {\n // Props being forwarded are known HTML attributes (string, number, boolean)\n forwardedValues[key] = value as string | number | boolean;\n }\n }\n\n // If nothing to forward, return inputs unchanged\n if (Object.keys(forwardedValues).length === 0) {\n return inputs;\n }\n\n // Merge: forwarded props first, then meta (meta wins)\n const existingMeta = inputs['meta'] as FieldMeta | undefined;\n const mergedMeta: FieldMeta = {\n ...forwardedValues,\n ...existingMeta,\n };\n\n return {\n ...inputs,\n meta: mergedMeta,\n };\n}\n\n/**\n * Applies index suffix to the key property for array items.\n * This ensures unique DOM IDs while keeping form schema keys clean.\n *\n * @param inputs The current inputs record\n * @param index The array item index\n * @returns Updated inputs record with suffixed key\n */\nfunction applyIndexSuffix(inputs: Record<string, unknown>, index: number): Record<string, unknown> {\n const key = inputs['key'];\n if (typeof key !== 'string') {\n return inputs;\n }\n\n return {\n ...inputs,\n key: `${key}_${index}`,\n };\n}\n\n/**\n * Prefixes the key with the underscored group ancestor path so that the same\n * leaf key inside different groups produces distinct DOM IDs (issue #401).\n * Form-schema keys remain clean — only the rendered `key` input is rewritten.\n */\nfunction applyGroupPrefix(inputs: Record<string, unknown>, groupPath: string): Record<string, unknown> {\n const key = inputs['key'];\n if (typeof key !== 'string' || groupPath.length === 0) {\n return inputs;\n }\n\n return {\n ...inputs,\n key: `${groupPath.replace(/\\./g, '_')}_${key}`,\n };\n}\n\n/**\n * Prepends the form-level id prefix as the outermost key segment so the same key\n * across two forms on one page yields distinct DOM IDs. Rewrites only the rendered\n * `key`; schema/override-store keys stay clean. No-op when prefix is empty.\n */\nfunction applyFormPrefix(inputs: Record<string, unknown>, prefix: string): Record<string, unknown> {\n const key = inputs['key'];\n if (typeof key !== 'string' || prefix.length === 0) {\n return inputs;\n }\n\n return {\n ...inputs,\n key: `${prefix}_${key}`,\n };\n}\n\n/**\n * Main field mapper function that uses the field registry to get the appropriate mapper\n * based on the field's type property.\n *\n * @param fieldDef The field definition to map\n * @param fieldRegistry The registry of field type definitions\n * @returns Signal containing Record of input names to values, or undefined for componentless fields\n */\nexport function mapFieldToInputs(\n fieldDef: FieldDef<unknown>,\n fieldRegistry: Map<string, FieldTypeDefinition>,\n): Signal<Record<string, unknown>> | undefined {\n // Get the field type definition from registry\n const fieldType = fieldRegistry.get(fieldDef.type);\n\n // Componentless field (no mapper and no loadComponent) - nothing to map\n if (fieldType && !fieldType.loadComponent && !fieldType.mapper) {\n return undefined;\n }\n\n // Check if we're inside an array item context - if so, we need to suffix keys\n // Optional because ARRAY_CONTEXT is only provided inside array item injectors\n const arrayContext = inject(ARRAY_CONTEXT, { optional: true });\n\n // Check if we're inside a group context - if so, prefix the key with the group path\n // so overlapping leaf keys across groups produce distinct DOM IDs (issue #401).\n // Optional because GROUP_CONTEXT is only provided by GroupFieldComponent.\n const groupContext = inject(GROUP_CONTEXT, { optional: true });\n\n // Form-level DOM-id prefix (scopes ids to one form instance). Optional: absent under mock injectors.\n const formPrefixSignal = inject(FORM_ID_PREFIX, { optional: true });\n\n // Inject the property override store for property derivation overrides\n // Always available — provided at the DynamicForm component level via provideDynamicFormDI\n const store = inject(PROPERTY_OVERRIDE_STORE);\n\n // Get the base mapper result\n const mapperResult: Signal<Record<string, unknown>> = fieldType?.mapper ? fieldType.mapper(fieldDef) : baseFieldMapper(fieldDef);\n\n const propsToMeta = fieldType?.propsToMeta;\n const hasPropsForwarding = propsToMeta && propsToMeta.length > 0;\n // Check that arrayContext exists and has a valid index signal (guards against mock injectors)\n const indexSignal = arrayContext?.index;\n const hasArrayContext = indexSignal !== undefined && isSignal(indexSignal);\n const hasGroupContext = groupContext != null;\n // Bypasses the fast path so fields stay subscribed to a prefix that can flip\n // when a sibling form mounts (gating on its current value would miss the flip).\n const hasFormPrefix = formPrefixSignal != null;\n\n // Fast-path check for property overrides: only fields whose definition declares\n // a property-derivation enter the computed() wrapper. We inspect the FieldDef\n // directly rather than asking the store, because the store's registration\n // effect may not have fired yet when the mapper runs in the resolveFieldSync\n // path (warm COMPONENT_CACHE). Both the mapper and the orchestrator's\n // collector apply the same inclusion rule, so the answers always agree.\n const hasOverrides = fieldHasPropertyDerivations(fieldDef);\n\n // Fast path: no transformations needed\n if (!hasPropsForwarding && !hasArrayContext && !hasGroupContext && !hasOverrides && !hasFormPrefix) {\n return mapperResult;\n }\n\n // Wrap in computed to apply transformations\n return computed(() => {\n let inputs = mapperResult();\n\n // Apply props forwarding if configured\n if (hasPropsForwarding) {\n inputs = mergeForwardedPropsToMeta(inputs, propsToMeta);\n }\n\n // Apply group prefix BEFORE array suffix so the resulting key reads as\n // `{groupPath}_{key}_{index}` (e.g. `address_street_0`) — matching the\n // form-value path order: group → leaf → array index.\n if (hasGroupContext) {\n // Non-null after the hasGroupContext guard.\n inputs = applyGroupPrefix(inputs, groupContext!.groupPath());\n }\n\n // Apply index suffix for array items\n if (hasArrayContext) {\n const index = indexSignal();\n inputs = applyIndexSuffix(inputs, index);\n }\n\n // Outermost key segment; reading the signal here re-renders ids if the prefix flips.\n if (hasFormPrefix) {\n inputs = applyFormPrefix(inputs, formPrefixSignal!());\n }\n\n // Apply property overrides from the store (AFTER all static transformations).\n //\n // INVARIANT: the store key MUST be built from `fieldDef.key` + the group/array\n // ancestry (via buildPropertyOverrideKey) — NEVER from the DOM-scoped\n // `inputs['key']` produced by applyGroupPrefix/applyIndexSuffix above. The\n // collector (property-derivation-collector.ts) registers using the same\n // shape; if these drift, overrides silently miss their target.\n if (hasOverrides) {\n // Build inside computed() so the index/group signals establish reactive deps.\n // GROUP_CONTEXT resets at array boundaries (see create-array-item-injector.ts),\n // so groupPath() represents ancestors inside the current array item (or\n // top-level groups when not in an array) — matching the collector.\n const groupPath = hasGroupContext ? groupContext!.groupPath() : undefined;\n const key = hasArrayContext\n ? buildPropertyOverrideKey(\n (arrayContext as ArrayContext).arrayKey,\n (indexSignal as Signal<number>)(),\n fieldDef.key,\n groupPath || undefined,\n )\n : buildPropertyOverrideKey(undefined, undefined, fieldDef.key, groupPath || undefined);\n const overrides = store.getOverrides(key)();\n inputs = applyPropertyOverrides(inputs, overrides);\n }\n\n return inputs;\n });\n}\n","import { computed, DestroyRef, Injector, runInInjectionContext, Signal, Type } from '@angular/core';\nimport type { FieldTree } from '@angular/forms/signals';\nimport { catchError, forkJoin, from, map, Observable, of, OperatorFunction, pipe, scan, switchMap } from 'rxjs';\nimport { FieldDef } from '@ng-forge/dynamic-forms/internal';\nimport { FieldTypeDefinition } from '@ng-forge/dynamic-forms/internal';\nimport { mapFieldToInputs } from '../field-mapper/field-mapper';\n\n/** Resolved field ready for rendering with ngComponentOutlet / DfFieldOutlet. */\nexport interface ResolvedField {\n key: string;\n /** The original field definition (used by DfFieldOutlet to resolve wrappers). */\n fieldDef: FieldDef<unknown>;\n component: Type<unknown>;\n injector: Injector;\n inputs: Signal<Record<string, unknown>>;\n renderReady: Signal<boolean>;\n /**\n * Whether the field is currently hidden. Sourced from the FieldTree's\n * `state.hidden()` for value-bearing fields (set by Angular Signal Forms in\n * response to `hidden(path, …)` calls), or from the mapper's explicit\n * `hidden` input for non-value fields (button, text, container, …). Consumers\n * must `@if (!field.hidden())` around `*dfFieldOutlet` so hidden fields are\n * removed from the DOM — Angular Signal Forms warns (NG01916) otherwise.\n */\n hidden: Signal<boolean>;\n}\n\nexport function createRenderReadySignal(\n inputs: Signal<Record<string, unknown>>,\n definition: FieldTypeDefinition | undefined,\n): Signal<boolean> {\n const explicitRenderReadyWhen = definition?.renderReadyWhen;\n const requiredInputs = definition?.mapper && explicitRenderReadyWhen === undefined ? ['field'] : (explicitRenderReadyWhen ?? []);\n\n if (requiredInputs.length === 0) {\n return computed(() => true);\n }\n\n return computed(() => {\n const currentInputs = inputs();\n return requiredInputs.every((inputName) => currentInputs[inputName] !== undefined);\n });\n}\n\n/**\n * Reads the current hidden state from mapper inputs. Uniform across all field\n * types — value-bearing leaves source from the `FieldTree`'s `state.hidden()`\n * (where Angular Signal Forms cascades `hidden(path, …)`), and non-field outputs\n * (button/text/containers) source from the mapper's explicit `inputs.hidden`.\n */\nexport function createHiddenSignal(inputs: Signal<Record<string, unknown>>): Signal<boolean> {\n return computed(() => {\n const currentInputs = inputs();\n const fieldCandidate = currentInputs['field'];\n // Value-bearing leaves expose `field` as a callable `FieldTree` whose invocation returns a\n // `FieldState` with a `hidden` accessor. `isSignal()` doesn't recognise the Proxy-wrapped\n // FieldTree (no SIGNAL symbol), so we duck-type the shape and call `state.hidden()` directly.\n if (typeof fieldCandidate === 'function') {\n const state = (fieldCandidate as FieldTree<unknown>)();\n if (state && typeof state.hidden === 'function') {\n return state.hidden() === true;\n }\n }\n // Non-value fields (button, text, containers) carry an explicit `hidden` input set by\n // `applyHiddenLogic` based on the mapper-side evaluation.\n return currentInputs['hidden'] === true;\n });\n}\n\n/** Context required to resolve a field. */\nexport interface ResolveFieldContext {\n /**\n * The field registry to load components from.\n * Returns undefined for componentless fields (e.g., hidden fields).\n */\n loadTypeComponent: (type: string) => Promise<Type<unknown> | undefined>;\n /** The raw field registry map for mappers */\n registry: Map<string, FieldTypeDefinition>;\n /** The injector to use for the resolved field */\n injector: Injector;\n /** DestroyRef to check if component is destroyed */\n destroyRef: DestroyRef;\n /** Optional error handler for logging */\n onError?: (fieldDef: FieldDef<unknown>, error: unknown) => void;\n}\n\n/**\n * Resolves a single field definition to a ResolvedField using RxJS.\n * Loads the component asynchronously and maps inputs in the injection context.\n *\n * @param fieldDef - The field definition to resolve\n * @param context - The context containing dependencies for resolution\n * @returns Observable that emits ResolvedField or undefined (for componentless fields or on error)\n */\nexport function resolveField(fieldDef: FieldDef<unknown>, context: ResolveFieldContext): Observable<ResolvedField | undefined> {\n return from(context.loadTypeComponent(fieldDef.type)).pipe(\n map((component) => {\n // Check if component is destroyed before proceeding\n if (context.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 // Run mapper in injection context\n const inputs = runInInjectionContext(context.injector, () => mapFieldToInputs(fieldDef, context.registry));\n const definition = context.registry.get(fieldDef.type);\n\n // Fields with components should always have inputs (componentless fields are handled above)\n if (!inputs) {\n return undefined;\n }\n\n return {\n key: fieldDef.key,\n fieldDef,\n component,\n injector: context.injector,\n inputs,\n renderReady: createRenderReadySignal(inputs, definition),\n hidden: createHiddenSignal(inputs),\n };\n }),\n catchError((error) => {\n // Only call onError if component is not destroyed to avoid accessing cleaned-up state\n if (!context.destroyRef.destroyed) {\n context.onError?.(fieldDef, error);\n }\n return of(undefined);\n }),\n );\n}\n\n/** Context for synchronous field resolution when components are already cached. */\nexport interface SyncResolveFieldContext {\n /** Returns a previously loaded component, or undefined if not cached */\n getLoadedComponent: (type: string) => Type<unknown> | undefined;\n /** The raw field registry map for mappers */\n registry: Map<string, FieldTypeDefinition>;\n /** The injector to use for the resolved field */\n injector: Injector;\n}\n\n/**\n * Synchronously resolves a field definition to a ResolvedField using cached components.\n *\n * @param fieldDef - The field definition to resolve\n * @param context - The context containing cached components and dependencies\n * @returns ResolvedField or undefined (for componentless fields)\n */\nexport function resolveFieldSync(fieldDef: FieldDef<unknown>, context: SyncResolveFieldContext): ResolvedField | undefined {\n const component = context.getLoadedComponent(fieldDef.type);\n\n if (!component) {\n return undefined;\n }\n\n const inputs = runInInjectionContext(context.injector, () => mapFieldToInputs(fieldDef, context.registry));\n const definition = context.registry.get(fieldDef.type);\n\n if (!inputs) {\n return undefined;\n }\n\n return {\n key: fieldDef.key,\n fieldDef,\n component,\n injector: context.injector,\n inputs,\n renderReady: createRenderReadySignal(inputs, definition),\n hidden: createHiddenSignal(inputs),\n };\n}\n\n/**\n * Reconciles previous and current resolved fields to preserve injector instances\n * for fields that haven't changed type, preventing unnecessary component recreation.\n *\n * @param prev - Previous resolved fields array\n * @param curr - Current resolved fields array\n * @returns Reconciled fields with preserved injectors where applicable\n */\nexport function reconcileFields(prev: ResolvedField[], curr: ResolvedField[]): ResolvedField[] {\n const prevMap = new Map(prev.map((f) => [f.key, f]));\n\n return curr.map((field) => {\n const existing = prevMap.get(field.key);\n\n if (existing && existing.component === field.component && existing.injector === field.injector) {\n if (existing.fieldDef === field.fieldDef) {\n // Truly unchanged - preserve object identity for signal stability\n return existing;\n }\n\n // Same component instance + injector, but the field definition changed.\n // Preserve component identity (so ngComponentOutlet keeps the same instance)\n // while swapping in the freshly-mapped inputs/renderReady/hidden signals\n // so prop updates (e.g. select options) reach the component.\n return {\n ...existing,\n fieldDef: field.fieldDef,\n inputs: field.inputs,\n renderReady: field.renderReady,\n hidden: field.hidden,\n };\n }\n\n // New field, type changed, or context changed (new injector) - use new field\n return field;\n });\n}\n\n/**\n * Creates an RxJS pipe for resolving field definitions to rendered components.\n * Used by container components (page, group) to resolve their child fields.\n */\nexport function createFieldResolutionPipe(getContext: () => ResolveFieldContext): OperatorFunction<FieldDef<unknown>[], ResolvedField[]> {\n return pipe(\n switchMap((fields) => {\n if (!fields || fields.length === 0) {\n return of([] as (ResolvedField | undefined)[]);\n }\n const context = getContext();\n return forkJoin(fields.map((f) => resolveField(f, context)));\n }),\n map((fields) => fields.filter((f): f is ResolvedField => f !== undefined)),\n scan(reconcileFields, [] as ResolvedField[]),\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import { ChangeDetectionStrategy, Component, ViewContainerRef, input, viewChild } from "@angular/core";
|
|
3
|
+
var RowWrapperComponent = class RowWrapperComponent {
|
|
4
|
+
fieldComponent = viewChild.required("fieldComponent", {
|
|
5
|
+
...ngDevMode ? { debugName: "fieldComponent" } : /* istanbul ignore next */ {},
|
|
6
|
+
read: ViewContainerRef
|
|
7
|
+
});
|
|
8
|
+
fieldInputs = input(...ngDevMode ? [void 0, { debugName: "fieldInputs" }] : /* istanbul ignore next */ []);
|
|
9
|
+
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
10
|
+
minVersion: "12.0.0",
|
|
11
|
+
version: "22.2.5",
|
|
12
|
+
ngImport: i0,
|
|
13
|
+
type: RowWrapperComponent,
|
|
14
|
+
deps: [],
|
|
15
|
+
target: i0.ɵɵFactoryTarget.Component
|
|
16
|
+
});
|
|
17
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({
|
|
18
|
+
minVersion: "17.2.0",
|
|
19
|
+
version: "22.2.5",
|
|
20
|
+
type: RowWrapperComponent,
|
|
21
|
+
isStandalone: true,
|
|
22
|
+
selector: "df-row-wrapper",
|
|
23
|
+
inputs: { fieldInputs: {
|
|
24
|
+
classPropertyName: "fieldInputs",
|
|
25
|
+
publicName: "fieldInputs",
|
|
26
|
+
isSignal: true,
|
|
27
|
+
isRequired: false,
|
|
28
|
+
transformFunction: null
|
|
29
|
+
} },
|
|
30
|
+
host: { classAttribute: "df-field df-row" },
|
|
31
|
+
viewQueries: [{
|
|
32
|
+
propertyName: "fieldComponent",
|
|
33
|
+
first: true,
|
|
34
|
+
predicate: ["fieldComponent"],
|
|
35
|
+
descendants: true,
|
|
36
|
+
read: ViewContainerRef,
|
|
37
|
+
isSignal: true
|
|
38
|
+
}],
|
|
39
|
+
ngImport: i0,
|
|
40
|
+
template: `<ng-container #fieldComponent></ng-container>`,
|
|
41
|
+
isInline: true,
|
|
42
|
+
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:flex;flex-wrap:wrap;gap:var(--df-grid-gap, .5rem);align-items:flex-start;width:100%}:host ::ng-deep>*:not([class*=df-col-]){flex:0 0 auto}:host ::ng-deep>.df-col-1{flex:0 0 calc(8.3333333333% - var(--df-grid-gap, .5rem) * .9166666667);max-width:calc(8.3333333333% - var(--df-grid-gap, .5rem) * .9166666667)}:host ::ng-deep>.df-col-2{flex:0 0 calc(16.6666666667% - var(--df-grid-gap, .5rem) * .8333333333);max-width:calc(16.6666666667% - var(--df-grid-gap, .5rem) * .8333333333)}:host ::ng-deep>.df-col-3{flex:0 0 calc(25% - var(--df-grid-gap, .5rem) * .75);max-width:calc(25% - var(--df-grid-gap, .5rem) * .75)}:host ::ng-deep>.df-col-4{flex:0 0 calc(33.3333333333% - var(--df-grid-gap, .5rem) * .6666666667);max-width:calc(33.3333333333% - var(--df-grid-gap, .5rem) * .6666666667)}:host ::ng-deep>.df-col-5{flex:0 0 calc(41.6666666667% - var(--df-grid-gap, .5rem) * .5833333333);max-width:calc(41.6666666667% - var(--df-grid-gap, .5rem) * .5833333333)}:host ::ng-deep>.df-col-6{flex:0 0 calc(50% - var(--df-grid-gap, .5rem) * .5);max-width:calc(50% - var(--df-grid-gap, .5rem) * .5)}:host ::ng-deep>.df-col-7{flex:0 0 calc(58.3333333333% - var(--df-grid-gap, .5rem) * .4166666667);max-width:calc(58.3333333333% - var(--df-grid-gap, .5rem) * .4166666667)}:host ::ng-deep>.df-col-8{flex:0 0 calc(66.6666666667% - var(--df-grid-gap, .5rem) * .3333333333);max-width:calc(66.6666666667% - var(--df-grid-gap, .5rem) * .3333333333)}:host ::ng-deep>.df-col-9{flex:0 0 calc(75% - var(--df-grid-gap, .5rem) * .25);max-width:calc(75% - var(--df-grid-gap, .5rem) * .25)}:host ::ng-deep>.df-col-10{flex:0 0 calc(83.3333333333% - var(--df-grid-gap, .5rem) * .1666666667);max-width:calc(83.3333333333% - var(--df-grid-gap, .5rem) * .1666666667)}:host ::ng-deep>.df-col-11{flex:0 0 calc(91.6666666667% - var(--df-grid-gap, .5rem) * .0833333333);max-width:calc(91.6666666667% - var(--df-grid-gap, .5rem) * .0833333333)}:host ::ng-deep>.df-col-12{flex:0 0 calc(100% - var(--df-grid-gap, .5rem) * 0);max-width:calc(100% - var(--df-grid-gap, .5rem) * 0)}:host-context(.df-gap-custom){--df-grid-gap: var(--df-row-custom-gap, 1rem)}@media(max-width:576px){:host-context(.df-row-mobile-stack) ::ng-deep>*{flex:0 0 100%!important;max-width:100%!important}}@media(min-width:577px)and (max-width:768px){:host-context(.df-row-tablet-2col) ::ng-deep>*{flex:0 0 calc(50% - var(--df-grid-gap, .5rem) / 2);max-width:calc(50% - var(--df-grid-gap, .5rem) / 2)}}@media(max-width:576px){:host ::ng-deep>*{flex:0 0 100%!important;max-width:100%!important}:host-context(.df-row-mobile-keep-cols){flex-direction:row}:host-context(.df-row-mobile-keep-cols) ::ng-deep>*:not([class*=df-col-]){flex:0 0 auto!important;max-width:none!important}}\n"],
|
|
43
|
+
changeDetection: i0.ChangeDetectionStrategy.OnPush
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
47
|
+
minVersion: "12.0.0",
|
|
48
|
+
version: "22.2.5",
|
|
49
|
+
ngImport: i0,
|
|
50
|
+
type: RowWrapperComponent,
|
|
51
|
+
decorators: [{
|
|
52
|
+
type: Component,
|
|
53
|
+
args: [{
|
|
54
|
+
selector: "df-row-wrapper",
|
|
55
|
+
template: `<ng-container #fieldComponent></ng-container>`,
|
|
56
|
+
host: { class: "df-field df-row" },
|
|
57
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
58
|
+
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:flex;flex-wrap:wrap;gap:var(--df-grid-gap, .5rem);align-items:flex-start;width:100%}:host ::ng-deep>*:not([class*=df-col-]){flex:0 0 auto}:host ::ng-deep>.df-col-1{flex:0 0 calc(8.3333333333% - var(--df-grid-gap, .5rem) * .9166666667);max-width:calc(8.3333333333% - var(--df-grid-gap, .5rem) * .9166666667)}:host ::ng-deep>.df-col-2{flex:0 0 calc(16.6666666667% - var(--df-grid-gap, .5rem) * .8333333333);max-width:calc(16.6666666667% - var(--df-grid-gap, .5rem) * .8333333333)}:host ::ng-deep>.df-col-3{flex:0 0 calc(25% - var(--df-grid-gap, .5rem) * .75);max-width:calc(25% - var(--df-grid-gap, .5rem) * .75)}:host ::ng-deep>.df-col-4{flex:0 0 calc(33.3333333333% - var(--df-grid-gap, .5rem) * .6666666667);max-width:calc(33.3333333333% - var(--df-grid-gap, .5rem) * .6666666667)}:host ::ng-deep>.df-col-5{flex:0 0 calc(41.6666666667% - var(--df-grid-gap, .5rem) * .5833333333);max-width:calc(41.6666666667% - var(--df-grid-gap, .5rem) * .5833333333)}:host ::ng-deep>.df-col-6{flex:0 0 calc(50% - var(--df-grid-gap, .5rem) * .5);max-width:calc(50% - var(--df-grid-gap, .5rem) * .5)}:host ::ng-deep>.df-col-7{flex:0 0 calc(58.3333333333% - var(--df-grid-gap, .5rem) * .4166666667);max-width:calc(58.3333333333% - var(--df-grid-gap, .5rem) * .4166666667)}:host ::ng-deep>.df-col-8{flex:0 0 calc(66.6666666667% - var(--df-grid-gap, .5rem) * .3333333333);max-width:calc(66.6666666667% - var(--df-grid-gap, .5rem) * .3333333333)}:host ::ng-deep>.df-col-9{flex:0 0 calc(75% - var(--df-grid-gap, .5rem) * .25);max-width:calc(75% - var(--df-grid-gap, .5rem) * .25)}:host ::ng-deep>.df-col-10{flex:0 0 calc(83.3333333333% - var(--df-grid-gap, .5rem) * .1666666667);max-width:calc(83.3333333333% - var(--df-grid-gap, .5rem) * .1666666667)}:host ::ng-deep>.df-col-11{flex:0 0 calc(91.6666666667% - var(--df-grid-gap, .5rem) * .0833333333);max-width:calc(91.6666666667% - var(--df-grid-gap, .5rem) * .0833333333)}:host ::ng-deep>.df-col-12{flex:0 0 calc(100% - var(--df-grid-gap, .5rem) * 0);max-width:calc(100% - var(--df-grid-gap, .5rem) * 0)}:host-context(.df-gap-custom){--df-grid-gap: var(--df-row-custom-gap, 1rem)}@media(max-width:576px){:host-context(.df-row-mobile-stack) ::ng-deep>*{flex:0 0 100%!important;max-width:100%!important}}@media(min-width:577px)and (max-width:768px){:host-context(.df-row-tablet-2col) ::ng-deep>*{flex:0 0 calc(50% - var(--df-grid-gap, .5rem) / 2);max-width:calc(50% - var(--df-grid-gap, .5rem) / 2)}}@media(max-width:576px){:host ::ng-deep>*{flex:0 0 100%!important;max-width:100%!important}:host-context(.df-row-mobile-keep-cols){flex-direction:row}:host-context(.df-row-mobile-keep-cols) ::ng-deep>*:not([class*=df-col-]){flex:0 0 auto!important;max-width:none!important}}\n"]
|
|
59
|
+
}]
|
|
60
|
+
}],
|
|
61
|
+
propDecorators: {
|
|
62
|
+
fieldComponent: [{
|
|
63
|
+
type: i0.ViewChild,
|
|
64
|
+
args: ["fieldComponent", {
|
|
65
|
+
read: ViewContainerRef,
|
|
66
|
+
isSignal: true
|
|
67
|
+
}]
|
|
68
|
+
}],
|
|
69
|
+
fieldInputs: [{
|
|
70
|
+
type: i0.Input,
|
|
71
|
+
args: [{
|
|
72
|
+
isSignal: true,
|
|
73
|
+
alias: "fieldInputs",
|
|
74
|
+
required: false
|
|
75
|
+
}]
|
|
76
|
+
}]
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
export { RowWrapperComponent, RowWrapperComponent as default };
|
|
80
|
+
|
|
81
|
+
//# sourceMappingURL=ng-forge-dynamic-forms-row-wrapper.component-CuFycQb-.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ng-forge-dynamic-forms-row-wrapper.component-CuFycQb-.mjs","names":[],"sources":["../../../../packages/dynamic-forms/src/lib/wrappers/row/row-wrapper.component.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input, ViewContainerRef, viewChild } from '@angular/core';\nimport { FieldWrapper } from '@ng-forge/dynamic-forms/internal';\nimport { WrapperFieldInputs } from '@ng-forge/dynamic-forms/internal';\n\n/** Built-in row wrapper component. */\n@Component({\n selector: 'df-row-wrapper',\n template: `<ng-container #fieldComponent></ng-container>`,\n styleUrl: './row-wrapper.component.scss',\n host: {\n class: 'df-field df-row',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport default class RowWrapperComponent implements FieldWrapper {\n readonly fieldComponent = viewChild.required('fieldComponent', { read: ViewContainerRef });\n\n /**\n * Mapper outputs for the wrapped field.\n * The row wrapper itself does not consume these — the input is accepted\n * for contract consistency so the outlet can set it on any wrapper.\n */\n readonly fieldInputs = input<WrapperFieldInputs>();\n}\n\nexport { RowWrapperComponent };\n"],"mappings":";;AAcA,IAAqB,sBAArB,MAAqB,oBAAmB;CAC7B,iBAAiB,UAAU,SAAS,kBAAgB;EAAA,GAAA,YAAA,EAAA,WAAA,iBAAA,+BAAA,CAAA;EAAI,MAAM;CAAgB,CAAA;CAO9E,cAAc,MAA2B,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAR/B,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAmB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAnB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAmB,cAAA;EAAA,UAAA;EAAA,QAAA,EAAA,aAAA;GAAA,mBAAA;GAAA,YAAA;GAAA,UAAA;GAAA,YAAA;GAAA,mBAAA;EAAA,EAAA;EAAA,MAAA,EAAA,gBAAA,kBAAA;EAAA,aAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,gBAAA;GAAA,aAAA;GAAA,MACiC;GAAgB,UAAA;EAAA,CAAA;EAAA,UAAA;EAAA,UAR7E;EAA+C,UAAA;EAAA,QAAA,CAAA,mzOAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAOtC,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAmB,YAAA,CAAA;EATvC,MAAA;EACW,MAAA,CAAA;GAAA,UAAA;GAAgB,UAChB;GAA+C,MAEnD,EACJ,OAAO,kBACR;GAAA,iBACgB,wBAAwB;GAAM,QAAA,CAAA,mzOAAA;EAAA,CAAA;CAGF,CAAA;CAAA,gBAAA;EAAA,gBAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,kBAAgB;IAAI,MAAM;IAAkB,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,aAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA"}
|