@dynamic-field-kit/angular 1.4.0 → 1.5.1
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/CHANGELOG.md +190 -0
- package/LICENSE +21 -0
- package/README.md +144 -5
- package/dist/components/DynamicFormDevTools.d.ts +16 -0
- package/dist/components/DynamicInput.d.ts +2 -1
- package/dist/components/FieldInput.d.ts +7 -1
- package/dist/components/MultiFieldInput.d.ts +13 -2
- package/dist/fesm2022/dynamic-field-kit-angular.mjs +578 -34
- package/dist/index.d.ts +1 -1
- package/dist/layout/index.d.ts +2 -2
- package/dist/lib/dynamic-field-kit.module.d.ts +4 -4
- package/dist/lib/dynamic-form.store.d.ts +23 -0
- package/dist/public-api.d.ts +10 -8
- package/package.json +58 -24
- package/dist/README.md +0 -235
- package/dist/esm2022/components/BaseInput.mjs +0 -59
- package/dist/esm2022/components/DynamicInput.mjs +0 -244
- package/dist/esm2022/components/FieldInput.mjs +0 -99
- package/dist/esm2022/components/MultiFieldInput.mjs +0 -338
- package/dist/esm2022/dynamic-field-kit-angular.mjs +0 -5
- package/dist/esm2022/fieldRegistryToken.mjs +0 -12
- package/dist/esm2022/layout/defaultLayouts.mjs +0 -114
- package/dist/esm2022/layout/index.mjs +0 -3
- package/dist/esm2022/layout/layoutRegistry.mjs +0 -14
- package/dist/esm2022/lib/dynamic-field-kit.module.mjs +0 -52
- package/dist/esm2022/public-api.mjs +0 -18
- package/dist/esm2022/types/layout.mjs +0 -2
- package/dist/fesm2022/dynamic-field-kit-angular.mjs.map +0 -1
- package/ng-package.json +0 -7
- package/src/components/BaseInput.ts +0 -57
- package/src/components/DynamicInput.ts +0 -280
- package/src/components/FieldInput.ts +0 -74
- package/src/components/MultiFieldInput.ts +0 -331
- package/src/fieldRegistryToken.ts +0 -15
- package/src/layout/defaultLayouts.ts +0 -70
- package/src/layout/index.ts +0 -2
- package/src/layout/layoutRegistry.ts +0 -25
- package/src/lib/dynamic-field-kit.module.ts +0 -29
- package/src/public-api.ts +0 -40
- package/src/types/layout.ts +0 -14
- package/test/DynamicInput.spec.ts +0 -230
- package/test/FieldInput.spec.ts +0 -146
- package/test/MultiFieldInput.spec.ts +0 -256
- package/test/helpers/renderers.ts +0 -89
- package/test/layout.spec.ts +0 -119
- package/test/publicApi.spec.ts +0 -64
- package/test/setup.ts +0 -12
- package/test/smoke.spec.ts +0 -27
- package/tsconfig.json +0 -13
- package/tsconfig.spec.json +0 -9
- package/vitest.config.ts +0 -30
|
@@ -1,244 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { ChangeDetectionStrategy, Component, EventEmitter, inject, Input, Output, ViewChild, ViewContainerRef, } from '@angular/core';
|
|
3
|
-
import { FIELD_REGISTRY } from '../fieldRegistryToken';
|
|
4
|
-
import { BaseInputComponent } from './BaseInput';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
// Only the framework-agnostic FieldRendererProps keys. Domain-specific props
|
|
7
|
-
// reach the renderer through `extraProps` (FieldDescription.props) instead.
|
|
8
|
-
const KNOWN_PROPS = [
|
|
9
|
-
'value',
|
|
10
|
-
'label',
|
|
11
|
-
'placeholder',
|
|
12
|
-
'required',
|
|
13
|
-
'disabled',
|
|
14
|
-
'readOnly',
|
|
15
|
-
'error',
|
|
16
|
-
'options',
|
|
17
|
-
'className',
|
|
18
|
-
'description',
|
|
19
|
-
];
|
|
20
|
-
export class DynamicInput extends BaseInputComponent {
|
|
21
|
-
type;
|
|
22
|
-
// Extra, framework-agnostic props forwarded verbatim to the renderer.
|
|
23
|
-
extraProps;
|
|
24
|
-
valueChange = new EventEmitter();
|
|
25
|
-
onChange = new EventEmitter();
|
|
26
|
-
registry = inject(FIELD_REGISTRY);
|
|
27
|
-
host;
|
|
28
|
-
compRef;
|
|
29
|
-
inputInstance;
|
|
30
|
-
subscriptions = [];
|
|
31
|
-
// Tracks which KNOWN_PROPS were actually supplied to DynamicInput (via
|
|
32
|
-
// SimpleChanges), independent of TS class-field emit. See applyProps.
|
|
33
|
-
supplied = new Set();
|
|
34
|
-
ngOnChanges(changes) {
|
|
35
|
-
super.ngOnChanges(changes);
|
|
36
|
-
for (const prop of KNOWN_PROPS) {
|
|
37
|
-
if (changes[prop]) {
|
|
38
|
-
this.supplied.add(prop);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
if (this.inputInstance) {
|
|
42
|
-
this.syncPropsToInstance(changes);
|
|
43
|
-
}
|
|
44
|
-
if (changes['type'] && !changes['type'].firstChange && this.host) {
|
|
45
|
-
this.render();
|
|
46
|
-
}
|
|
47
|
-
else if (!this.inputInstance && this.host) {
|
|
48
|
-
this.render();
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
ngAfterViewInit() {
|
|
52
|
-
this.render();
|
|
53
|
-
}
|
|
54
|
-
ngOnDestroy() {
|
|
55
|
-
this.cleanup();
|
|
56
|
-
}
|
|
57
|
-
syncPropsToInstance(changes) {
|
|
58
|
-
if (!this.inputInstance) {
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
for (const prop of KNOWN_PROPS) {
|
|
62
|
-
if (changes[prop] && this.inputInstance) {
|
|
63
|
-
this.inputInstance[prop] = this[prop];
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
if (changes['extraProps']) {
|
|
67
|
-
this.applyExtraProps(this.inputInstance);
|
|
68
|
-
}
|
|
69
|
-
this.compRef?.changeDetectorRef?.detectChanges();
|
|
70
|
-
}
|
|
71
|
-
cleanup() {
|
|
72
|
-
this.cleanupSubscriptions();
|
|
73
|
-
this.cleanupRenderedComponent();
|
|
74
|
-
}
|
|
75
|
-
cleanupSubscriptions() {
|
|
76
|
-
this.subscriptions.forEach((s) => s.unsubscribe());
|
|
77
|
-
this.subscriptions = [];
|
|
78
|
-
}
|
|
79
|
-
cleanupRenderedComponent() {
|
|
80
|
-
this.compRef?.destroy();
|
|
81
|
-
this.compRef = undefined;
|
|
82
|
-
this.inputInstance = undefined;
|
|
83
|
-
}
|
|
84
|
-
render() {
|
|
85
|
-
const Renderer = this.registry.get(this.type);
|
|
86
|
-
this.cleanup();
|
|
87
|
-
this.host.clear();
|
|
88
|
-
if (!Renderer) {
|
|
89
|
-
this.renderError(`Unknown field type: ${this.type}`);
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
if (this.isComponentType(Renderer)) {
|
|
93
|
-
this.renderComponent(Renderer);
|
|
94
|
-
}
|
|
95
|
-
else if (typeof Renderer === 'function') {
|
|
96
|
-
this.renderFallback(Renderer);
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
this.renderError(`Invalid renderer for type: ${this.type}`);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
// Angular component classes carry a static ɵcmp. Checked instead of
|
|
103
|
-
// reflectComponentType() because the peer range starts at Angular 13 and
|
|
104
|
-
// reflectComponentType is v14+. Plain function renderers have no ɵcmp and
|
|
105
|
-
// fall through to renderFallback. Uses hasOwnProperty (not `in`) so a
|
|
106
|
-
// class that merely extends a component without its own @Component
|
|
107
|
-
// decorator - and would otherwise inherit the parent's static ɵcmp via the
|
|
108
|
-
// prototype chain - is not mistaken for a component in its own right.
|
|
109
|
-
isComponentType(renderer) {
|
|
110
|
-
return (typeof renderer === 'function' &&
|
|
111
|
-
Object.prototype.hasOwnProperty.call(renderer, 'ɵcmp'));
|
|
112
|
-
}
|
|
113
|
-
renderComponent(compType) {
|
|
114
|
-
try {
|
|
115
|
-
const compRef = this.host.createComponent(compType);
|
|
116
|
-
const instance = compRef.instance;
|
|
117
|
-
if (!instance) {
|
|
118
|
-
this.renderError(`Failed to create instance for ${this.type}`);
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
this.applyProps(instance);
|
|
122
|
-
this.bindOutputs(instance);
|
|
123
|
-
this.compRef = compRef;
|
|
124
|
-
this.inputInstance = instance;
|
|
125
|
-
compRef.changeDetectorRef.detectChanges();
|
|
126
|
-
}
|
|
127
|
-
catch {
|
|
128
|
-
this.renderError(`Failed to render field: ${this.type}`);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
renderFallback(renderer) {
|
|
132
|
-
try {
|
|
133
|
-
const props = this.getFallbackProps();
|
|
134
|
-
const result = renderer(props);
|
|
135
|
-
if (typeof result === 'string') {
|
|
136
|
-
const el = document.createElement('div');
|
|
137
|
-
el.innerHTML = result;
|
|
138
|
-
this.host.element.nativeElement.appendChild(el);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
catch {
|
|
142
|
-
this.renderError(`Failed to render field: ${this.type}`);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
getFallbackProps() {
|
|
146
|
-
return {
|
|
147
|
-
...this.extraProps,
|
|
148
|
-
value: this.value,
|
|
149
|
-
onValueChange: (v) => this.emitValue(v),
|
|
150
|
-
label: this.label ?? '',
|
|
151
|
-
placeholder: this.placeholder ?? '',
|
|
152
|
-
required: this.required ?? false,
|
|
153
|
-
disabled: this.disabled ?? false,
|
|
154
|
-
readOnly: this.readOnly ?? false,
|
|
155
|
-
error: this.error,
|
|
156
|
-
options: this.options ?? [],
|
|
157
|
-
className: this.className ?? '',
|
|
158
|
-
description: this.description ?? '',
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
// Gates on `this.supplied` (populated from SimpleChanges in ngOnChanges),
|
|
162
|
-
// not on `prop in instanceObj` or `prop in this`. Both `in` checks test a
|
|
163
|
-
// TypeScript class-field emit artifact rather than intent: whether a
|
|
164
|
-
// property slot exists at runtime depends on the compile target
|
|
165
|
-
// (useDefineForClassFields is false below ES2022, true at ES2022+), so the
|
|
166
|
-
// same source can behave oppositely between this package's test build and
|
|
167
|
-
// its shipped ES2022 bundle, where every declared field is always an own
|
|
168
|
-
// property. `this.supplied` instead reflects only whether Angular ever
|
|
169
|
-
// fired a SimpleChange for that input, i.e. whether the prop was *bound*
|
|
170
|
-
// at all - it skips only props DynamicInput was never given a binding
|
|
171
|
-
// for. It is NOT a general "renderer defaults survive" guarantee: Angular
|
|
172
|
-
// fires a firstChange SimpleChange for every bound input even when the
|
|
173
|
-
// bound value is undefined, and FieldInput's template binds all
|
|
174
|
-
// KNOWN_PROPS unconditionally, so on the real
|
|
175
|
-
// MultiFieldInput -> FieldInput -> DynamicInput path every prop counts as
|
|
176
|
-
// supplied and renderer-side defaults (e.g. `@Input() label = 'None'`)
|
|
177
|
-
// are still overwritten with undefined. This only helps when DynamicInput
|
|
178
|
-
// is mounted directly with some inputs left unbound.
|
|
179
|
-
applyProps(instance) {
|
|
180
|
-
const instanceObj = instance;
|
|
181
|
-
for (const prop of KNOWN_PROPS) {
|
|
182
|
-
if (this.supplied.has(prop)) {
|
|
183
|
-
instanceObj[prop] = this[prop];
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
this.applyExtraProps(instance);
|
|
187
|
-
}
|
|
188
|
-
applyExtraProps(instance) {
|
|
189
|
-
if (!instance || !this.extraProps) {
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
const instanceObj = instance;
|
|
193
|
-
for (const [key, value] of Object.entries(this.extraProps)) {
|
|
194
|
-
instanceObj[key] = value;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
bindOutputs(instance) {
|
|
198
|
-
const outputNames = [
|
|
199
|
-
'valueChange',
|
|
200
|
-
'onValueChange',
|
|
201
|
-
];
|
|
202
|
-
for (const outputName of outputNames) {
|
|
203
|
-
const output = instance[outputName];
|
|
204
|
-
if (output && typeof output === 'object' && 'subscribe' in output) {
|
|
205
|
-
const sub = output.subscribe((value) => this.emitValue(value));
|
|
206
|
-
this.subscriptions.push(sub);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
emitValue(value) {
|
|
211
|
-
this.valueChange.emit(value);
|
|
212
|
-
this.onChange.emit(value);
|
|
213
|
-
}
|
|
214
|
-
renderError(message) {
|
|
215
|
-
const el = document.createElement('div');
|
|
216
|
-
el.textContent = message;
|
|
217
|
-
el.style.color = 'red';
|
|
218
|
-
this.host.element.nativeElement.appendChild(el);
|
|
219
|
-
}
|
|
220
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: DynamicInput, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
221
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: DynamicInput, isStandalone: true, selector: "dfk-dynamic-input", inputs: { type: "type", extraProps: "extraProps" }, outputs: { valueChange: "valueChange", onChange: "onChange" }, viewQueries: [{ propertyName: "host", first: true, predicate: ["host"], descendants: true, read: ViewContainerRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: `<div #host style="display: contents;"></div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
222
|
-
}
|
|
223
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: DynamicInput, decorators: [{
|
|
224
|
-
type: Component,
|
|
225
|
-
args: [{
|
|
226
|
-
selector: 'dfk-dynamic-input',
|
|
227
|
-
standalone: true,
|
|
228
|
-
imports: [CommonModule],
|
|
229
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
230
|
-
template: `<div #host style="display: contents;"></div>`,
|
|
231
|
-
}]
|
|
232
|
-
}], propDecorators: { type: [{
|
|
233
|
-
type: Input
|
|
234
|
-
}], extraProps: [{
|
|
235
|
-
type: Input
|
|
236
|
-
}], valueChange: [{
|
|
237
|
-
type: Output
|
|
238
|
-
}], onChange: [{
|
|
239
|
-
type: Output
|
|
240
|
-
}], host: [{
|
|
241
|
-
type: ViewChild,
|
|
242
|
-
args: ['host', { read: ViewContainerRef, static: false }]
|
|
243
|
-
}] } });
|
|
244
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRHluYW1pY0lucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvRHluYW1pY0lucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBR04sU0FBUyxFQUNULGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDOztBQUVqRCw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLE1BQU0sV0FBVyxHQUFHO0lBQ2xCLE9BQU87SUFDUCxPQUFPO0lBQ1AsYUFBYTtJQUNiLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLE9BQU87SUFDUCxTQUFTO0lBQ1QsV0FBVztJQUNYLGFBQWE7Q0FDTCxDQUFDO0FBU1gsTUFBTSxPQUFPLFlBQ1gsU0FBUSxrQkFBa0I7SUFHakIsSUFBSSxDQUFnQjtJQUM3QixzRUFBc0U7SUFDN0QsVUFBVSxDQUFjO0lBQ2QsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7SUFDbkQsUUFBUSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7SUFFekMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUcxQyxJQUFJLENBQW9CO0lBQ2hCLE9BQU8sQ0FBeUI7SUFDaEMsYUFBYSxDQUFXO0lBQ3hCLGFBQWEsR0FBbUIsRUFBRSxDQUFDO0lBQzNDLHVFQUF1RTtJQUN2RSxzRUFBc0U7SUFDOUQsUUFBUSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFFckMsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLEtBQUssQ0FB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QVosWUFBWSx5UUFZSSxnQkFBZ0IseUVBZGpDLDhDQUE4QywyREFGOUMsWUFBWTs7NEZBSVgsWUFBWTtrQkFQeEIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsbUJBQW1CO29CQUM3QixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUN2QixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsUUFBUSxFQUFFLDhDQUE4QztpQkFDekQ7OEJBS1UsSUFBSTtzQkFBWixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ2EsV0FBVztzQkFBN0IsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUtQLElBQUk7c0JBREgsU0FBUzt1QkFBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb21wb25lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVHlwZSxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZpZWxkVHlwZUtleSwgUHJvcGVydGllcyB9IGZyb20gJ0BkeW5hbWljLWZpZWxkLWtpdC9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRklFTERfUkVHSVNUUlkgfSBmcm9tICcuLi9maWVsZFJlZ2lzdHJ5VG9rZW4nO1xuaW1wb3J0IHsgQmFzZUlucHV0Q29tcG9uZW50IH0gZnJvbSAnLi9CYXNlSW5wdXQnO1xuXG4vLyBPbmx5IHRoZSBmcmFtZXdvcmstYWdub3N0aWMgRmllbGRSZW5kZXJlclByb3BzIGtleXMuIERvbWFpbi1zcGVjaWZpYyBwcm9wc1xuLy8gcmVhY2ggdGhlIHJlbmRlcmVyIHRocm91Z2ggYGV4dHJhUHJvcHNgIChGaWVsZERlc2NyaXB0aW9uLnByb3BzKSBpbnN0ZWFkLlxuY29uc3QgS05PV05fUFJPUFMgPSBbXG4gICd2YWx1ZScsXG4gICdsYWJlbCcsXG4gICdwbGFjZWhvbGRlcicsXG4gICdyZXF1aXJlZCcsXG4gICdkaXNhYmxlZCcsXG4gICdyZWFkT25seScsXG4gICdlcnJvcicsXG4gICdvcHRpb25zJyxcbiAgJ2NsYXNzTmFtZScsXG4gICdkZXNjcmlwdGlvbicsXG5dIGFzIGNvbnN0O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkZmstZHluYW1pYy1pbnB1dCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGA8ZGl2ICNob3N0IHN0eWxlPVwiZGlzcGxheTogY29udGVudHM7XCI+PC9kaXY+YCxcbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY0lucHV0XG4gIGV4dGVuZHMgQmFzZUlucHV0Q29tcG9uZW50XG4gIGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3lcbntcbiAgQElucHV0KCkgdHlwZSE6IEZpZWxkVHlwZUtleTtcbiAgLy8gRXh0cmEsIGZyYW1ld29yay1hZ25vc3RpYyBwcm9wcyBmb3J3YXJkZWQgdmVyYmF0aW0gdG8gdGhlIHJlbmRlcmVyLlxuICBASW5wdXQoKSBleHRyYVByb3BzPzogUHJvcGVydGllcztcbiAgQE91dHB1dCgpIG92ZXJyaWRlIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx1bmtub3duPigpO1xuICBAT3V0cHV0KCkgb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHVua25vd24+KCk7XG5cbiAgcHJpdmF0ZSByZWdpc3RyeSA9IGluamVjdChGSUVMRF9SRUdJU1RSWSk7XG5cbiAgQFZpZXdDaGlsZCgnaG9zdCcsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICBob3N0ITogVmlld0NvbnRhaW5lclJlZjtcbiAgcHJpdmF0ZSBjb21wUmVmPzogQ29tcG9uZW50UmVmPHVua25vd24+O1xuICBwcml2YXRlIGlucHV0SW5zdGFuY2U/OiB1bmtub3duO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIC8vIFRyYWNrcyB3aGljaCBLTk9XTl9QUk9QUyB3ZXJlIGFjdHVhbGx5IHN1cHBsaWVkIHRvIER5bmFtaWNJbnB1dCAodmlhXG4gIC8vIFNpbXBsZUNoYW5nZXMpLCBpbmRlcGVuZGVudCBvZiBUUyBjbGFzcy1maWVsZCBlbWl0LiBTZWUgYXBwbHlQcm9wcy5cbiAgcHJpdmF0ZSBzdXBwbGllZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBLTk9XTl9QUk9QUykge1xuICAgICAgaWYgKGNoYW5nZXNbcHJvcF0pIHtcbiAgICAgICAgdGhpcy5zdXBwbGllZC5hZGQocHJvcCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaW5wdXRJbnN0YW5jZSkge1xuICAgICAgdGhpcy5zeW5jUHJvcHNUb0luc3RhbmNlKGNoYW5nZXMpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzWyd0eXBlJ10gJiYgIWNoYW5nZXNbJ3R5cGUnXS5maXJzdENoYW5nZSAmJiB0aGlzLmhvc3QpIHtcbiAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5pbnB1dEluc3RhbmNlICYmIHRoaXMuaG9zdCkge1xuICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYW51cCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jUHJvcHNUb0luc3RhbmNlKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaW5wdXRJbnN0YW5jZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBLTk9XTl9QUk9QUykge1xuICAgICAgaWYgKGNoYW5nZXNbcHJvcF0gJiYgdGhpcy5pbnB1dEluc3RhbmNlKSB7XG4gICAgICAgICh0aGlzLmlucHV0SW5zdGFuY2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3Byb3BdID0gKFxuICAgICAgICAgIHRoaXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgKVtwcm9wXTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2V4dHJhUHJvcHMnXSkge1xuICAgICAgdGhpcy5hcHBseUV4dHJhUHJvcHModGhpcy5pbnB1dEluc3RhbmNlKTtcbiAgICB9XG4gICAgdGhpcy5jb21wUmVmPy5jaGFuZ2VEZXRlY3RvclJlZj8uZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbnVwKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYW51cFN1YnNjcmlwdGlvbnMoKTtcbiAgICB0aGlzLmNsZWFudXBSZW5kZXJlZENvbXBvbmVudCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbnVwU3Vic2NyaXB0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgocykgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYW51cFJlbmRlcmVkQ29tcG9uZW50KCk6IHZvaWQge1xuICAgIHRoaXMuY29tcFJlZj8uZGVzdHJveSgpO1xuICAgIHRoaXMuY29tcFJlZiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmlucHV0SW5zdGFuY2UgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlcigpOiB2b2lkIHtcbiAgICBjb25zdCBSZW5kZXJlciA9IHRoaXMucmVnaXN0cnkuZ2V0KHRoaXMudHlwZSk7XG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgdGhpcy5ob3N0LmNsZWFyKCk7XG5cbiAgICBpZiAoIVJlbmRlcmVyKSB7XG4gICAgICB0aGlzLnJlbmRlckVycm9yKGBVbmtub3duIGZpZWxkIHR5cGU6ICR7dGhpcy50eXBlfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQ29tcG9uZW50VHlwZShSZW5kZXJlcikpIHtcbiAgICAgIHRoaXMucmVuZGVyQ29tcG9uZW50KFJlbmRlcmVyIGFzIHVua25vd24gYXMgVHlwZTx1bmtub3duPik7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgUmVuZGVyZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMucmVuZGVyRmFsbGJhY2soUmVuZGVyZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbmRlckVycm9yKGBJbnZhbGlkIHJlbmRlcmVyIGZvciB0eXBlOiAke3RoaXMudHlwZX1gKTtcbiAgICB9XG4gIH1cblxuICAvLyBBbmd1bGFyIGNvbXBvbmVudCBjbGFzc2VzIGNhcnJ5IGEgc3RhdGljIMm1Y21wLiBDaGVja2VkIGluc3RlYWQgb2ZcbiAgLy8gcmVmbGVjdENvbXBvbmVudFR5cGUoKSBiZWNhdXNlIHRoZSBwZWVyIHJhbmdlIHN0YXJ0cyBhdCBBbmd1bGFyIDEzIGFuZFxuICAvLyByZWZsZWN0Q29tcG9uZW50VHlwZSBpcyB2MTQrLiBQbGFpbiBmdW5jdGlvbiByZW5kZXJlcnMgaGF2ZSBubyDJtWNtcCBhbmRcbiAgLy8gZmFsbCB0aHJvdWdoIHRvIHJlbmRlckZhbGxiYWNrLiBVc2VzIGhhc093blByb3BlcnR5IChub3QgYGluYCkgc28gYVxuICAvLyBjbGFzcyB0aGF0IG1lcmVseSBleHRlbmRzIGEgY29tcG9uZW50IHdpdGhvdXQgaXRzIG93biBAQ29tcG9uZW50XG4gIC8vIGRlY29yYXRvciAtIGFuZCB3b3VsZCBvdGhlcndpc2UgaW5oZXJpdCB0aGUgcGFyZW50J3Mgc3RhdGljIMm1Y21wIHZpYSB0aGVcbiAgLy8gcHJvdG90eXBlIGNoYWluIC0gaXMgbm90IG1pc3Rha2VuIGZvciBhIGNvbXBvbmVudCBpbiBpdHMgb3duIHJpZ2h0LlxuICBwcml2YXRlIGlzQ29tcG9uZW50VHlwZShyZW5kZXJlcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgcmVuZGVyZXIgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyZW5kZXJlciwgJ8m1Y21wJylcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJDb21wb25lbnQoY29tcFR5cGU6IFR5cGU8dW5rbm93bj4pOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29tcFJlZiA9IHRoaXMuaG9zdC5jcmVhdGVDb21wb25lbnQoY29tcFR5cGUpO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBjb21wUmVmLmluc3RhbmNlO1xuXG4gICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgIHRoaXMucmVuZGVyRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgaW5zdGFuY2UgZm9yICR7dGhpcy50eXBlfWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXBwbHlQcm9wcyhpbnN0YW5jZSk7XG4gICAgICB0aGlzLmJpbmRPdXRwdXRzKGluc3RhbmNlKTtcblxuICAgICAgdGhpcy5jb21wUmVmID0gY29tcFJlZjtcbiAgICAgIHRoaXMuaW5wdXRJbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgY29tcFJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLnJlbmRlckVycm9yKGBGYWlsZWQgdG8gcmVuZGVyIGZpZWxkOiAke3RoaXMudHlwZX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckZhbGxiYWNrKHJlbmRlcmVyOiB1bmtub3duKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5nZXRGYWxsYmFja1Byb3BzKCk7XG4gICAgICBjb25zdCByZXN1bHQgPSAocmVuZGVyZXIgYXMgKHByb3BzOiB1bmtub3duKSA9PiBzdHJpbmcpKHByb3BzKTtcblxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGVsLmlubmVySFRNTCA9IHJlc3VsdDtcbiAgICAgICAgdGhpcy5ob3N0LmVsZW1lbnQubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChlbCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLnJlbmRlckVycm9yKGBGYWlsZWQgdG8gcmVuZGVyIGZpZWxkOiAke3RoaXMudHlwZX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEZhbGxiYWNrUHJvcHMoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmV4dHJhUHJvcHMsXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcbiAgICAgIG9uVmFsdWVDaGFuZ2U6ICh2OiB1bmtub3duKSA9PiB0aGlzLmVtaXRWYWx1ZSh2KSxcbiAgICAgIGxhYmVsOiB0aGlzLmxhYmVsID8/ICcnLFxuICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucGxhY2Vob2xkZXIgPz8gJycsXG4gICAgICByZXF1aXJlZDogdGhpcy5yZXF1aXJlZCA/PyBmYWxzZSxcbiAgICAgIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkID8/IGZhbHNlLFxuICAgICAgcmVhZE9ubHk6IHRoaXMucmVhZE9ubHkgPz8gZmFsc2UsXG4gICAgICBlcnJvcjogdGhpcy5lcnJvcixcbiAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyA/PyBbXSxcbiAgICAgIGNsYXNzTmFtZTogdGhpcy5jbGFzc05hbWUgPz8gJycsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbiA/PyAnJyxcbiAgICB9O1xuICB9XG5cbiAgLy8gR2F0ZXMgb24gYHRoaXMuc3VwcGxpZWRgIChwb3B1bGF0ZWQgZnJvbSBTaW1wbGVDaGFuZ2VzIGluIG5nT25DaGFuZ2VzKSxcbiAgLy8gbm90IG9uIGBwcm9wIGluIGluc3RhbmNlT2JqYCBvciBgcHJvcCBpbiB0aGlzYC4gQm90aCBgaW5gIGNoZWNrcyB0ZXN0IGFcbiAgLy8gVHlwZVNjcmlwdCBjbGFzcy1maWVsZCBlbWl0IGFydGlmYWN0IHJhdGhlciB0aGFuIGludGVudDogd2hldGhlciBhXG4gIC8vIHByb3BlcnR5IHNsb3QgZXhpc3RzIGF0IHJ1bnRpbWUgZGVwZW5kcyBvbiB0aGUgY29tcGlsZSB0YXJnZXRcbiAgLy8gKHVzZURlZmluZUZvckNsYXNzRmllbGRzIGlzIGZhbHNlIGJlbG93IEVTMjAyMiwgdHJ1ZSBhdCBFUzIwMjIrKSwgc28gdGhlXG4gIC8vIHNhbWUgc291cmNlIGNhbiBiZWhhdmUgb3Bwb3NpdGVseSBiZXR3ZWVuIHRoaXMgcGFja2FnZSdzIHRlc3QgYnVpbGQgYW5kXG4gIC8vIGl0cyBzaGlwcGVkIEVTMjAyMiBidW5kbGUsIHdoZXJlIGV2ZXJ5IGRlY2xhcmVkIGZpZWxkIGlzIGFsd2F5cyBhbiBvd25cbiAgLy8gcHJvcGVydHkuIGB0aGlzLnN1cHBsaWVkYCBpbnN0ZWFkIHJlZmxlY3RzIG9ubHkgd2hldGhlciBBbmd1bGFyIGV2ZXJcbiAgLy8gZmlyZWQgYSBTaW1wbGVDaGFuZ2UgZm9yIHRoYXQgaW5wdXQsIGkuZS4gd2hldGhlciB0aGUgcHJvcCB3YXMgKmJvdW5kKlxuICAvLyBhdCBhbGwgLSBpdCBza2lwcyBvbmx5IHByb3BzIER5bmFtaWNJbnB1dCB3YXMgbmV2ZXIgZ2l2ZW4gYSBiaW5kaW5nXG4gIC8vIGZvci4gSXQgaXMgTk9UIGEgZ2VuZXJhbCBcInJlbmRlcmVyIGRlZmF1bHRzIHN1cnZpdmVcIiBndWFyYW50ZWU6IEFuZ3VsYXJcbiAgLy8gZmlyZXMgYSBmaXJzdENoYW5nZSBTaW1wbGVDaGFuZ2UgZm9yIGV2ZXJ5IGJvdW5kIGlucHV0IGV2ZW4gd2hlbiB0aGVcbiAgLy8gYm91bmQgdmFsdWUgaXMgdW5kZWZpbmVkLCBhbmQgRmllbGRJbnB1dCdzIHRlbXBsYXRlIGJpbmRzIGFsbFxuICAvLyBLTk9XTl9QUk9QUyB1bmNvbmRpdGlvbmFsbHksIHNvIG9uIHRoZSByZWFsXG4gIC8vIE11bHRpRmllbGRJbnB1dCAtPiBGaWVsZElucHV0IC0+IER5bmFtaWNJbnB1dCBwYXRoIGV2ZXJ5IHByb3AgY291bnRzIGFzXG4gIC8vIHN1cHBsaWVkIGFuZCByZW5kZXJlci1zaWRlIGRlZmF1bHRzIChlLmcuIGBASW5wdXQoKSBsYWJlbCA9ICdOb25lJ2ApXG4gIC8vIGFyZSBzdGlsbCBvdmVyd3JpdHRlbiB3aXRoIHVuZGVmaW5lZC4gVGhpcyBvbmx5IGhlbHBzIHdoZW4gRHluYW1pY0lucHV0XG4gIC8vIGlzIG1vdW50ZWQgZGlyZWN0bHkgd2l0aCBzb21lIGlucHV0cyBsZWZ0IHVuYm91bmQuXG4gIHByaXZhdGUgYXBwbHlQcm9wcyhpbnN0YW5jZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGluc3RhbmNlT2JqID0gaW5zdGFuY2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZm9yIChjb25zdCBwcm9wIG9mIEtOT1dOX1BST1BTKSB7XG4gICAgICBpZiAodGhpcy5zdXBwbGllZC5oYXMocHJvcCkpIHtcbiAgICAgICAgaW5zdGFuY2VPYmpbcHJvcF0gPSAodGhpcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbcHJvcF07XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYXBwbHlFeHRyYVByb3BzKGluc3RhbmNlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlFeHRyYVByb3BzKGluc3RhbmNlOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKCFpbnN0YW5jZSB8fCAhdGhpcy5leHRyYVByb3BzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluc3RhbmNlT2JqID0gaW5zdGFuY2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5leHRyYVByb3BzKSkge1xuICAgICAgaW5zdGFuY2VPYmpba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYmluZE91dHB1dHMoaW5zdGFuY2U6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBvdXRwdXROYW1lczogQXJyYXk8J3ZhbHVlQ2hhbmdlJyB8ICdvblZhbHVlQ2hhbmdlJz4gPSBbXG4gICAgICAndmFsdWVDaGFuZ2UnLFxuICAgICAgJ29uVmFsdWVDaGFuZ2UnLFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IG91dHB1dE5hbWUgb2Ygb3V0cHV0TmFtZXMpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IChpbnN0YW5jZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbb3V0cHV0TmFtZV07XG4gICAgICBpZiAob3V0cHV0ICYmIHR5cGVvZiBvdXRwdXQgPT09ICdvYmplY3QnICYmICdzdWJzY3JpYmUnIGluIG91dHB1dCkge1xuICAgICAgICBjb25zdCBzdWIgPSAoXG4gICAgICAgICAgb3V0cHV0IGFzIHsgc3Vic2NyaWJlOiAoY2I6ICh2OiB1bmtub3duKSA9PiB2b2lkKSA9PiBTdWJzY3JpcHRpb24gfVxuICAgICAgICApLnN1YnNjcmliZSgodmFsdWU6IHVua25vd24pID0+IHRoaXMuZW1pdFZhbHVlKHZhbHVlKSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHN1Yik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0VmFsdWUodmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgIHRoaXMub25DaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckVycm9yKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZWwudGV4dENvbnRlbnQgPSBtZXNzYWdlO1xuICAgIGVsLnN0eWxlLmNvbG9yID0gJ3JlZCc7XG4gICAgdGhpcy5ob3N0LmVsZW1lbnQubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChlbCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { NgIf } from '@angular/common';
|
|
2
|
-
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from '@angular/core';
|
|
3
|
-
import { DynamicInput } from './DynamicInput';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
export class FieldInput {
|
|
6
|
-
cdr;
|
|
7
|
-
fieldDescription;
|
|
8
|
-
value;
|
|
9
|
-
options;
|
|
10
|
-
disabled;
|
|
11
|
-
readOnly;
|
|
12
|
-
error;
|
|
13
|
-
onValueChangeField = new EventEmitter();
|
|
14
|
-
shouldRender = false;
|
|
15
|
-
get resolvedOptions() {
|
|
16
|
-
if (this.options) {
|
|
17
|
-
return this.options;
|
|
18
|
-
}
|
|
19
|
-
if (!this.fieldDescription?.options) {
|
|
20
|
-
return undefined;
|
|
21
|
-
}
|
|
22
|
-
if (typeof this.fieldDescription.options === 'function') {
|
|
23
|
-
return undefined;
|
|
24
|
-
}
|
|
25
|
-
return this.fieldDescription.options;
|
|
26
|
-
}
|
|
27
|
-
constructor(cdr) {
|
|
28
|
-
this.cdr = cdr;
|
|
29
|
-
}
|
|
30
|
-
ngOnChanges(_changes) {
|
|
31
|
-
this.shouldRender = !!this.fieldDescription;
|
|
32
|
-
this.cdr.markForCheck();
|
|
33
|
-
}
|
|
34
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: FieldInput, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
35
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: FieldInput, isStandalone: true, selector: "dfk-field-input", inputs: { fieldDescription: "fieldDescription", value: "value", options: "options", disabled: "disabled", readOnly: "readOnly", error: "error" }, outputs: { onValueChangeField: "onValueChangeField" }, usesOnChanges: true, ngImport: i0, template: `
|
|
36
|
-
<dfk-dynamic-input
|
|
37
|
-
*ngIf="shouldRender"
|
|
38
|
-
[type]="fieldDescription!.type"
|
|
39
|
-
[value]="value"
|
|
40
|
-
[label]="fieldDescription!.label"
|
|
41
|
-
[placeholder]="fieldDescription!.placeholder"
|
|
42
|
-
[required]="fieldDescription!.required"
|
|
43
|
-
[description]="$any(fieldDescription!.description)"
|
|
44
|
-
[options]="resolvedOptions"
|
|
45
|
-
[className]="fieldDescription!.className"
|
|
46
|
-
(valueChange)="
|
|
47
|
-
onValueChangeField.emit({ value: $event, key: fieldDescription!.name })
|
|
48
|
-
"
|
|
49
|
-
[disabled]="disabled"
|
|
50
|
-
[readOnly]="readOnly"
|
|
51
|
-
[error]="$any(error)"
|
|
52
|
-
[extraProps]="fieldDescription!.props"
|
|
53
|
-
></dfk-dynamic-input>
|
|
54
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: DynamicInput, selector: "dfk-dynamic-input", inputs: ["type", "extraProps"], outputs: ["valueChange", "onChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
55
|
-
}
|
|
56
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: FieldInput, decorators: [{
|
|
57
|
-
type: Component,
|
|
58
|
-
args: [{
|
|
59
|
-
selector: 'dfk-field-input',
|
|
60
|
-
standalone: true,
|
|
61
|
-
imports: [NgIf, DynamicInput],
|
|
62
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
63
|
-
template: `
|
|
64
|
-
<dfk-dynamic-input
|
|
65
|
-
*ngIf="shouldRender"
|
|
66
|
-
[type]="fieldDescription!.type"
|
|
67
|
-
[value]="value"
|
|
68
|
-
[label]="fieldDescription!.label"
|
|
69
|
-
[placeholder]="fieldDescription!.placeholder"
|
|
70
|
-
[required]="fieldDescription!.required"
|
|
71
|
-
[description]="$any(fieldDescription!.description)"
|
|
72
|
-
[options]="resolvedOptions"
|
|
73
|
-
[className]="fieldDescription!.className"
|
|
74
|
-
(valueChange)="
|
|
75
|
-
onValueChangeField.emit({ value: $event, key: fieldDescription!.name })
|
|
76
|
-
"
|
|
77
|
-
[disabled]="disabled"
|
|
78
|
-
[readOnly]="readOnly"
|
|
79
|
-
[error]="$any(error)"
|
|
80
|
-
[extraProps]="fieldDescription!.props"
|
|
81
|
-
></dfk-dynamic-input>
|
|
82
|
-
`,
|
|
83
|
-
}]
|
|
84
|
-
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { fieldDescription: [{
|
|
85
|
-
type: Input
|
|
86
|
-
}], value: [{
|
|
87
|
-
type: Input
|
|
88
|
-
}], options: [{
|
|
89
|
-
type: Input
|
|
90
|
-
}], disabled: [{
|
|
91
|
-
type: Input
|
|
92
|
-
}], readOnly: [{
|
|
93
|
-
type: Input
|
|
94
|
-
}], error: [{
|
|
95
|
-
type: Input
|
|
96
|
-
}], onValueChangeField: [{
|
|
97
|
-
type: Output
|
|
98
|
-
}] } });
|
|
99
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmllbGRJbnB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL0ZpZWxkSW5wdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUE0QjlDLE1BQU0sT0FBTyxVQUFVO0lBMkJEO0lBMUJYLGdCQUFnQixDQUFvQjtJQUNwQyxLQUFLLENBQVc7SUFDaEIsT0FBTyxDQUE2QjtJQUNwQyxRQUFRLENBQVc7SUFDbkIsUUFBUSxDQUFXO0lBQ25CLEtBQUssQ0FBcUI7SUFDekIsa0JBQWtCLEdBQUcsSUFBSSxZQUFZLEVBRzNDLENBQUM7SUFFTCxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBRXJCLElBQUksZUFBZTtRQUNqQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDdEIsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDcEMsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELElBQUksT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3hELE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUM7SUFDdkMsQ0FBQztJQUVELFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO0lBQUcsQ0FBQztJQUU5QyxXQUFXLENBQUMsUUFBdUI7UUFDakMsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQzVDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQzt3R0FoQ1UsVUFBVTs0RkFBVixVQUFVLHlTQXJCWDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CVCw0REFyQlMsSUFBSSw2RkFBRSxZQUFZOzs0RkF1QmpCLFVBQVU7a0JBMUJ0QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxpQkFBaUI7b0JBQzNCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDO29CQUM3QixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJUO2lCQUNGO3NGQUVVLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0ksa0JBQWtCO3NCQUEzQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmllbGREZXNjcmlwdGlvbiB9IGZyb20gJ0BkeW5hbWljLWZpZWxkLWtpdC9jb3JlJztcbmltcG9ydCB7IER5bmFtaWNJbnB1dCB9IGZyb20gJy4vRHluYW1pY0lucHV0JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGZrLWZpZWxkLWlucHV0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW05nSWYsIER5bmFtaWNJbnB1dF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkZmstZHluYW1pYy1pbnB1dFxuICAgICAgKm5nSWY9XCJzaG91bGRSZW5kZXJcIlxuICAgICAgW3R5cGVdPVwiZmllbGREZXNjcmlwdGlvbiEudHlwZVwiXG4gICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgW2xhYmVsXT1cImZpZWxkRGVzY3JpcHRpb24hLmxhYmVsXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZERlc2NyaXB0aW9uIS5wbGFjZWhvbGRlclwiXG4gICAgICBbcmVxdWlyZWRdPVwiZmllbGREZXNjcmlwdGlvbiEucmVxdWlyZWRcIlxuICAgICAgW2Rlc2NyaXB0aW9uXT1cIiRhbnkoZmllbGREZXNjcmlwdGlvbiEuZGVzY3JpcHRpb24pXCJcbiAgICAgIFtvcHRpb25zXT1cInJlc29sdmVkT3B0aW9uc1wiXG4gICAgICBbY2xhc3NOYW1lXT1cImZpZWxkRGVzY3JpcHRpb24hLmNsYXNzTmFtZVwiXG4gICAgICAodmFsdWVDaGFuZ2UpPVwiXG4gICAgICAgIG9uVmFsdWVDaGFuZ2VGaWVsZC5lbWl0KHsgdmFsdWU6ICRldmVudCwga2V5OiBmaWVsZERlc2NyaXB0aW9uIS5uYW1lIH0pXG4gICAgICBcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFtyZWFkT25seV09XCJyZWFkT25seVwiXG4gICAgICBbZXJyb3JdPVwiJGFueShlcnJvcilcIlxuICAgICAgW2V4dHJhUHJvcHNdPVwiZmllbGREZXNjcmlwdGlvbiEucHJvcHNcIlxuICAgID48L2Rmay1keW5hbWljLWlucHV0PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBGaWVsZElucHV0IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgZmllbGREZXNjcmlwdGlvbj86IEZpZWxkRGVzY3JpcHRpb247XG4gIEBJbnB1dCgpIHZhbHVlPzogdW5rbm93bjtcbiAgQElucHV0KCkgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG4gIEBJbnB1dCgpIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgQElucHV0KCkgcmVhZE9ubHk/OiBib29sZWFuO1xuICBASW5wdXQoKSBlcnJvcj86IHN0cmluZyB8IHN0cmluZ1tdO1xuICBAT3V0cHV0KCkgb25WYWx1ZUNoYW5nZUZpZWxkID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgdmFsdWU6IHVua25vd247XG4gICAga2V5OiBzdHJpbmc7XG4gIH0+KCk7XG5cbiAgc2hvdWxkUmVuZGVyID0gZmFsc2U7XG5cbiAgZ2V0IHJlc29sdmVkT3B0aW9ucygpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5vcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZmllbGREZXNjcmlwdGlvbj8ub3B0aW9ucykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0aGlzLmZpZWxkRGVzY3JpcHRpb24ub3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmllbGREZXNjcmlwdGlvbi5vcHRpb25zO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG5nT25DaGFuZ2VzKF9jaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgdGhpcy5zaG91bGRSZW5kZXIgPSAhIXRoaXMuZmllbGREZXNjcmlwdGlvbjtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIl19
|