@dynamic-field-kit/angular 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/CHANGELOG.md +166 -0
  2. package/LICENSE +21 -0
  3. package/README.md +144 -5
  4. package/dist/components/DynamicFormDevTools.d.ts +16 -0
  5. package/dist/components/DynamicInput.d.ts +2 -1
  6. package/dist/components/FieldInput.d.ts +7 -1
  7. package/dist/components/MultiFieldInput.d.ts +13 -2
  8. package/dist/fesm2022/dynamic-field-kit-angular.mjs +578 -34
  9. package/dist/index.d.ts +1 -1
  10. package/dist/layout/index.d.ts +2 -2
  11. package/dist/lib/dynamic-field-kit.module.d.ts +4 -4
  12. package/dist/lib/dynamic-form.store.d.ts +23 -0
  13. package/dist/public-api.d.ts +10 -8
  14. package/package.json +40 -21
  15. package/dist/README.md +0 -235
  16. package/dist/esm2022/components/BaseInput.mjs +0 -59
  17. package/dist/esm2022/components/DynamicInput.mjs +0 -244
  18. package/dist/esm2022/components/FieldInput.mjs +0 -99
  19. package/dist/esm2022/components/MultiFieldInput.mjs +0 -338
  20. package/dist/esm2022/dynamic-field-kit-angular.mjs +0 -5
  21. package/dist/esm2022/fieldRegistryToken.mjs +0 -12
  22. package/dist/esm2022/layout/defaultLayouts.mjs +0 -114
  23. package/dist/esm2022/layout/index.mjs +0 -3
  24. package/dist/esm2022/layout/layoutRegistry.mjs +0 -14
  25. package/dist/esm2022/lib/dynamic-field-kit.module.mjs +0 -52
  26. package/dist/esm2022/public-api.mjs +0 -18
  27. package/dist/esm2022/types/layout.mjs +0 -2
  28. package/dist/fesm2022/dynamic-field-kit-angular.mjs.map +0 -1
  29. package/ng-package.json +0 -7
  30. package/src/components/BaseInput.ts +0 -57
  31. package/src/components/DynamicInput.ts +0 -280
  32. package/src/components/FieldInput.ts +0 -74
  33. package/src/components/MultiFieldInput.ts +0 -331
  34. package/src/fieldRegistryToken.ts +0 -15
  35. package/src/layout/defaultLayouts.ts +0 -70
  36. package/src/layout/index.ts +0 -2
  37. package/src/layout/layoutRegistry.ts +0 -25
  38. package/src/lib/dynamic-field-kit.module.ts +0 -29
  39. package/src/public-api.ts +0 -40
  40. package/src/types/layout.ts +0 -14
  41. package/test/DynamicInput.spec.ts +0 -230
  42. package/test/FieldInput.spec.ts +0 -146
  43. package/test/MultiFieldInput.spec.ts +0 -256
  44. package/test/helpers/renderers.ts +0 -89
  45. package/test/layout.spec.ts +0 -119
  46. package/test/publicApi.spec.ts +0 -64
  47. package/test/setup.ts +0 -12
  48. package/test/smoke.spec.ts +0 -27
  49. package/tsconfig.json +0 -13
  50. package/tsconfig.spec.json +0 -9
  51. 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