@dynamic-field-kit/angular 1.0.2 → 1.2.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/README.md +120 -61
- package/components/BaseInput.d.ts +22 -0
- package/components/DynamicInput.d.ts +28 -0
- package/components/FieldInput.d.ts +14 -0
- package/components/MultiFieldInput.d.ts +23 -0
- package/esm2020/components/BaseInput.mjs +46 -0
- package/esm2020/components/DynamicInput.mjs +146 -0
- package/esm2020/components/FieldInput.mjs +66 -0
- package/esm2020/components/MultiFieldInput.mjs +79 -0
- package/esm2020/dynamic-field-kit-angular.mjs +5 -0
- package/esm2020/layout/defaultLayouts.mjs +43 -0
- package/esm2020/layout/index.mjs +2 -0
- package/esm2020/lib/dynamic-field-kit.module.mjs +20 -0
- package/esm2020/public-api.mjs +14 -0
- package/esm2020/types/layout.mjs +2 -0
- package/fesm2015/dynamic-field-kit-angular.mjs +393 -0
- package/fesm2015/dynamic-field-kit-angular.mjs.map +1 -0
- package/fesm2020/dynamic-field-kit-angular.mjs +390 -0
- package/fesm2020/dynamic-field-kit-angular.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/layout/defaultLayouts.d.ts +13 -0
- package/layout/index.d.ts +1 -0
- package/lib/dynamic-field-kit.module.d.ts +11 -0
- package/package.json +47 -42
- package/public-api.d.ts +9 -0
- package/types/layout.d.ts +1 -0
- package/dist/README.md +0 -65
- package/dist/fesm2022/dynamic-field-kit-angular.mjs +0 -266
- package/dist/fesm2022/dynamic-field-kit-angular.mjs.map +0 -1
- package/dist/types/dynamic-field-kit-angular.d.ts +0 -70
package/README.md
CHANGED
|
@@ -1,65 +1,124 @@
|
|
|
1
|
-
# @dynamic-field-kit/angular
|
|
2
|
-
|
|
3
|
-
Lightweight Angular adapters for `@dynamic-field-kit/core`.
|
|
4
|
-
|
|
5
|
-
This package
|
|
6
|
-
|
|
7
|
-
Quick overview
|
|
8
|
-
- Exports
|
|
9
|
-
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
1
|
+
# @dynamic-field-kit/angular
|
|
2
|
+
|
|
3
|
+
Lightweight Angular adapters for `@dynamic-field-kit/core`.
|
|
4
|
+
|
|
5
|
+
This package exposes Angular components and a convenience NgModule that integrate with the shared `fieldRegistry` from `@dynamic-field-kit/core`.
|
|
6
|
+
|
|
7
|
+
Quick overview
|
|
8
|
+
- Exports `DynamicInput`, `FieldInput`, `MultiFieldInput`, layout components, and `DynamicFieldKitModule`.
|
|
9
|
+
- Uses the shared `fieldRegistry` from `@dynamic-field-kit/core` to resolve Angular field renderers at runtime.
|
|
10
|
+
- Can be consumed as a packaged library, or linked locally from `packages/angular/dist` during development.
|
|
11
|
+
- `MultiFieldInput` currently supports `column`, `row`, and `grid` layout values.
|
|
12
|
+
|
|
13
|
+
Usage (consumer Angular app)
|
|
14
|
+
|
|
15
|
+
1. Install the packages:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install @dynamic-field-kit/core @dynamic-field-kit/angular
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
2. Import `DynamicFieldKitModule` in your Angular module:
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
import { DynamicFieldKitModule } from '@dynamic-field-kit/angular'
|
|
24
25
|
|
|
25
26
|
@NgModule({
|
|
26
27
|
imports: [BrowserModule, DynamicFieldKitModule],
|
|
27
28
|
})
|
|
28
|
-
export class AppModule {}
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
3. Register Angular
|
|
32
|
-
|
|
33
|
-
```ts
|
|
34
|
-
// src/main.ts
|
|
35
|
-
import '
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
29
|
+
export class AppModule {}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
3. Register your Angular field components in the shared registry before bootstrap:
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
// src/main.ts
|
|
36
|
+
import 'zone.js'
|
|
37
|
+
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'
|
|
38
|
+
import { fieldRegistry } from '@dynamic-field-kit/angular'
|
|
39
|
+
import { AppModule } from './app/app.module'
|
|
40
|
+
import { TextFieldComponent } from './app/components/text-field.component'
|
|
41
|
+
import { NumberFieldComponent } from './app/components/number-field.component'
|
|
42
|
+
|
|
43
|
+
fieldRegistry.register('text', TextFieldComponent as any)
|
|
44
|
+
fieldRegistry.register('number', NumberFieldComponent as any)
|
|
45
|
+
|
|
46
|
+
platformBrowserDynamic()
|
|
47
|
+
.bootstrapModule(AppModule)
|
|
48
|
+
.catch((err) => console.error(err))
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
4. Render fields in a template:
|
|
52
|
+
|
|
53
|
+
```html
|
|
54
|
+
<dfk-multi-field-input
|
|
55
|
+
[fieldDescriptions]="fields"
|
|
56
|
+
[properties]="data"
|
|
57
|
+
(onChange)="onChange($event)"
|
|
58
|
+
></dfk-multi-field-input>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
5. Example component state:
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
import { Component } from '@angular/core'
|
|
65
|
+
import { FieldDescription } from '@dynamic-field-kit/core'
|
|
66
|
+
|
|
67
|
+
@Component({
|
|
68
|
+
selector: 'app-root',
|
|
69
|
+
templateUrl: './app.component.html',
|
|
70
|
+
})
|
|
71
|
+
export class AppComponent {
|
|
72
|
+
fields: FieldDescription[] = [
|
|
73
|
+
{ name: 'name', type: 'text', label: 'Name' },
|
|
74
|
+
{ name: 'age', type: 'number', label: 'Age' },
|
|
75
|
+
]
|
|
76
|
+
|
|
77
|
+
data: any = {}
|
|
78
|
+
|
|
79
|
+
onChange(data: any) {
|
|
80
|
+
this.data = data
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Local development
|
|
86
|
+
- During local development, point your Angular app at the built package output instead of importing from `src/`:
|
|
87
|
+
|
|
88
|
+
```json
|
|
89
|
+
{
|
|
90
|
+
"dependencies": {
|
|
91
|
+
"@dynamic-field-kit/core": "file:../../packages/core",
|
|
92
|
+
"@dynamic-field-kit/angular": "file:../../packages/angular/dist"
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
- When using a local `file:` dependency on Windows or via symlinked installs, set `preserveSymlinks: true` in the Angular builder options to avoid runtime issues with linked packages.
|
|
98
|
+
|
|
99
|
+
Build & publish
|
|
100
|
+
- Build locally with `ng-packagr`:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
cd packages/angular
|
|
104
|
+
npm run build
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
- Publish to npm:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
cd packages/angular
|
|
111
|
+
npm run build
|
|
112
|
+
npm run publish:dist
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Notes & caveats
|
|
116
|
+
- Register Angular component classes in `fieldRegistry`. Do not register React or Vue renderers when using the Angular adapter.
|
|
117
|
+
- `DynamicFieldKitModule` is the recommended integration path for consumer apps.
|
|
118
|
+
- Standalone exports are still available for advanced composition, but most apps should start with the module.
|
|
119
|
+
- Text fields default to an empty string when no value is present, so empty controls render as blank instead of `undefined`.
|
|
120
|
+
- Supported `layout` values are `column`, `row`, and `grid`.
|
|
121
|
+
|
|
122
|
+
Examples & docs
|
|
123
|
+
- See `example/angular-instructions.md` for detailed wiring steps.
|
|
124
|
+
- Try the local scaffold at `example/angular-app/` for a hands-on demo.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { EventEmitter, ChangeDetectorRef } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare abstract class BaseInputComponent {
|
|
4
|
+
protected cdr: ChangeDetectorRef;
|
|
5
|
+
value?: any;
|
|
6
|
+
label?: string;
|
|
7
|
+
placeholder?: string;
|
|
8
|
+
required?: boolean;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
options?: any[];
|
|
11
|
+
className?: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
errorMessage?: string;
|
|
14
|
+
acceptFile?: string;
|
|
15
|
+
maxLength?: number;
|
|
16
|
+
minNumber?: number;
|
|
17
|
+
maxNumber?: number;
|
|
18
|
+
valueChange: EventEmitter<any>;
|
|
19
|
+
constructor(cdr: ChangeDetectorRef);
|
|
20
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<BaseInputComponent, never>;
|
|
21
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<BaseInputComponent, "ng-component", never, { "value": "value"; "label": "label"; "placeholder": "placeholder"; "required": "required"; "disabled": "disabled"; "options": "options"; "className": "className"; "description": "description"; "errorMessage": "errorMessage"; "acceptFile": "acceptFile"; "maxLength": "maxLength"; "minNumber": "minNumber"; "maxNumber": "maxNumber"; }, { "valueChange": "valueChange"; }, never, never, false, never>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { EventEmitter, ViewContainerRef, OnChanges, AfterViewInit, SimpleChanges } from "@angular/core";
|
|
2
|
+
import { FieldTypeKey } from "@dynamic-field-kit/core";
|
|
3
|
+
import { BaseInputComponent } from "./BaseInput";
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export declare class DynamicInput extends BaseInputComponent implements OnChanges, AfterViewInit {
|
|
6
|
+
type: FieldTypeKey;
|
|
7
|
+
value?: any;
|
|
8
|
+
label?: string;
|
|
9
|
+
placeholder?: string;
|
|
10
|
+
required?: boolean;
|
|
11
|
+
options?: any[];
|
|
12
|
+
className?: string;
|
|
13
|
+
description?: any;
|
|
14
|
+
valueChange: EventEmitter<any>;
|
|
15
|
+
onChange: EventEmitter<any>;
|
|
16
|
+
host: ViewContainerRef;
|
|
17
|
+
private compRef?;
|
|
18
|
+
private inputInstance?;
|
|
19
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
20
|
+
ngAfterViewInit(): void;
|
|
21
|
+
private render;
|
|
22
|
+
private applyKnownProps;
|
|
23
|
+
private bindOutput;
|
|
24
|
+
private emitValue;
|
|
25
|
+
private cleanupRenderedComponent;
|
|
26
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<DynamicInput, never>;
|
|
27
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<DynamicInput, "dfk-dynamic-input", never, { "type": "type"; "value": "value"; "label": "label"; "placeholder": "placeholder"; "required": "required"; "options": "options"; "className": "className"; "description": "description"; }, { "valueChange": "valueChange"; "onChange": "onChange"; }, never, never, true, never>;
|
|
28
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { EventEmitter } from "@angular/core";
|
|
2
|
+
import { FieldDescription, Properties } from "@dynamic-field-kit/core";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class FieldInput {
|
|
5
|
+
fieldDescription?: FieldDescription;
|
|
6
|
+
renderInfos?: Properties;
|
|
7
|
+
onValueChangeField: EventEmitter<{
|
|
8
|
+
value: any;
|
|
9
|
+
key: string;
|
|
10
|
+
}>;
|
|
11
|
+
getFieldValue(): any;
|
|
12
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<FieldInput, never>;
|
|
13
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FieldInput, "dfk-field-input", never, { "fieldDescription": "fieldDescription"; "renderInfos": "renderInfos"; }, { "onValueChangeField": "onValueChangeField"; }, never, never, true, never>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { EventEmitter, OnChanges, OnInit, SimpleChanges } from "@angular/core";
|
|
2
|
+
import { FieldDescription, Properties } from "@dynamic-field-kit/core";
|
|
3
|
+
import { LayoutConfig } from "../types/layout";
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export declare class MultiFieldInput implements OnInit, OnChanges {
|
|
6
|
+
fieldDescriptions: FieldDescription[];
|
|
7
|
+
properties?: Properties;
|
|
8
|
+
onChange: EventEmitter<Properties>;
|
|
9
|
+
layout: LayoutConfig;
|
|
10
|
+
data: Properties;
|
|
11
|
+
visibleFields: FieldDescription[];
|
|
12
|
+
trackByFn(index: number, field: FieldDescription): string | number;
|
|
13
|
+
ngOnInit(): void;
|
|
14
|
+
ngOnChanges(_changes: SimpleChanges): void;
|
|
15
|
+
private init;
|
|
16
|
+
private updateVisibleFields;
|
|
17
|
+
onFieldChange(event: {
|
|
18
|
+
value: any;
|
|
19
|
+
key: string;
|
|
20
|
+
}): void;
|
|
21
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<MultiFieldInput, never>;
|
|
22
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<MultiFieldInput, "dfk-multi-field-input", never, { "fieldDescriptions": "fieldDescriptions"; "properties": "properties"; "layout": "layout"; }, { "onChange": "onChange"; }, never, never, true, never>;
|
|
23
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class BaseInputComponent {
|
|
4
|
+
constructor(cdr) {
|
|
5
|
+
this.cdr = cdr;
|
|
6
|
+
// Add more from mplis as needed
|
|
7
|
+
this.valueChange = new EventEmitter();
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
BaseInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: BaseInputComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
11
|
+
BaseInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: BaseInputComponent, selector: "ng-component", inputs: { value: "value", label: "label", placeholder: "placeholder", required: "required", disabled: "disabled", options: "options", className: "className", description: "description", errorMessage: "errorMessage", acceptFile: "acceptFile", maxLength: "maxLength", minNumber: "minNumber", maxNumber: "maxNumber" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: '', isInline: true });
|
|
12
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: BaseInputComponent, decorators: [{
|
|
13
|
+
type: Component,
|
|
14
|
+
args: [{
|
|
15
|
+
template: ''
|
|
16
|
+
}]
|
|
17
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { value: [{
|
|
18
|
+
type: Input
|
|
19
|
+
}], label: [{
|
|
20
|
+
type: Input
|
|
21
|
+
}], placeholder: [{
|
|
22
|
+
type: Input
|
|
23
|
+
}], required: [{
|
|
24
|
+
type: Input
|
|
25
|
+
}], disabled: [{
|
|
26
|
+
type: Input
|
|
27
|
+
}], options: [{
|
|
28
|
+
type: Input
|
|
29
|
+
}], className: [{
|
|
30
|
+
type: Input
|
|
31
|
+
}], description: [{
|
|
32
|
+
type: Input
|
|
33
|
+
}], errorMessage: [{
|
|
34
|
+
type: Input
|
|
35
|
+
}], acceptFile: [{
|
|
36
|
+
type: Input
|
|
37
|
+
}], maxLength: [{
|
|
38
|
+
type: Input
|
|
39
|
+
}], minNumber: [{
|
|
40
|
+
type: Input
|
|
41
|
+
}], maxNumber: [{
|
|
42
|
+
type: Input
|
|
43
|
+
}], valueChange: [{
|
|
44
|
+
type: Output
|
|
45
|
+
}] } });
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZUlucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvQmFzZUlucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQXFCLE1BQU0sZUFBZSxDQUFDOztBQU0xRixNQUFNLE9BQWdCLGtCQUFrQjtJQWtCdEMsWUFBc0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFKNUMsZ0NBQWdDO1FBRXRCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUVELENBQUM7O2dIQWxCNUIsa0JBQWtCO29HQUFsQixrQkFBa0IseVpBRjVCLEVBQUU7NEZBRVEsa0JBQWtCO2tCQUh2QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxFQUFFO2lCQUNiO3dHQUVVLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0ksV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGaWVsZFJlbmRlcmVyUHJvcHMgfSBmcm9tICdAZHluYW1pYy1maWVsZC1raXQvY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICB0ZW1wbGF0ZTogJydcclxufSlcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VJbnB1dENvbXBvbmVudCB7XHJcbiAgQElucHV0KCkgdmFsdWU/OiBhbnk7XHJcbiAgQElucHV0KCkgbGFiZWw/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcmVxdWlyZWQ/OiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkPzogYm9vbGVhbjtcclxuICBASW5wdXQoKSBvcHRpb25zPzogYW55W107XHJcbiAgQElucHV0KCkgY2xhc3NOYW1lPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGVycm9yTWVzc2FnZT86IHN0cmluZztcclxuICBASW5wdXQoKSBhY2NlcHRGaWxlPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIG1heExlbmd0aD86IG51bWJlcjtcclxuICBASW5wdXQoKSBtaW5OdW1iZXI/OiBudW1iZXI7XHJcbiAgQElucHV0KCkgbWF4TnVtYmVyPzogbnVtYmVyO1xyXG4gIC8vIEFkZCBtb3JlIGZyb20gbXBsaXMgYXMgbmVlZGVkXHJcblxyXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cclxufVxyXG5cclxuIl19
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { CommonModule } from "@angular/common";
|
|
2
|
+
import { Component, Input, Output, EventEmitter, ViewChild, ViewContainerRef, SimpleChange } from "@angular/core";
|
|
3
|
+
import { fieldRegistry } from "@dynamic-field-kit/core";
|
|
4
|
+
import { BaseInputComponent } from "./BaseInput";
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export class DynamicInput extends BaseInputComponent {
|
|
7
|
+
constructor() {
|
|
8
|
+
super(...arguments);
|
|
9
|
+
this.valueChange = new EventEmitter();
|
|
10
|
+
this.onChange = new EventEmitter(); // backward compat
|
|
11
|
+
}
|
|
12
|
+
ngOnChanges(changes) {
|
|
13
|
+
if (changes["type"] && !changes["type"].firstChange && this.host) {
|
|
14
|
+
this.render();
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (this.inputInstance) {
|
|
18
|
+
this.applyKnownProps(this.inputInstance);
|
|
19
|
+
const childChanges = {};
|
|
20
|
+
for (const prop in changes) {
|
|
21
|
+
childChanges[prop] = new SimpleChange(changes[prop].previousValue, changes[prop].currentValue, changes[prop].firstChange);
|
|
22
|
+
}
|
|
23
|
+
this.inputInstance.ngOnChanges?.(childChanges);
|
|
24
|
+
this.compRef?.changeDetectorRef.detectChanges();
|
|
25
|
+
}
|
|
26
|
+
else if (this.host) {
|
|
27
|
+
this.render();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
ngAfterViewInit() {
|
|
31
|
+
this.render();
|
|
32
|
+
}
|
|
33
|
+
render() {
|
|
34
|
+
const Renderer = fieldRegistry.get(this.type);
|
|
35
|
+
this.cleanupRenderedComponent();
|
|
36
|
+
this.host.clear();
|
|
37
|
+
if (!Renderer) {
|
|
38
|
+
const el = document.createElement("div");
|
|
39
|
+
el.textContent = `Unknown field type: ${this.type}`;
|
|
40
|
+
this.host.element.nativeElement.appendChild(el);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
const compType = Renderer;
|
|
45
|
+
const compRef = this.host.createComponent(compType);
|
|
46
|
+
const instance = compRef.instance;
|
|
47
|
+
if (!instance)
|
|
48
|
+
throw new Error(`Failed to create instance for ${this.type}`);
|
|
49
|
+
this.applyKnownProps(instance);
|
|
50
|
+
this.bindOutput(instance, "valueChange");
|
|
51
|
+
this.bindOutput(instance, "onValueChange");
|
|
52
|
+
instance.changeDetectorRef?.detectChanges();
|
|
53
|
+
this.compRef = compRef;
|
|
54
|
+
this.inputInstance = instance;
|
|
55
|
+
compRef.changeDetectorRef.detectChanges();
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
// Fallback to function renderer
|
|
59
|
+
try {
|
|
60
|
+
const props = {
|
|
61
|
+
value: this.value,
|
|
62
|
+
onValueChange: (v) => this.emitValue(v),
|
|
63
|
+
label: this.label,
|
|
64
|
+
placeholder: this.placeholder,
|
|
65
|
+
required: this.required,
|
|
66
|
+
options: this.options,
|
|
67
|
+
className: this.className,
|
|
68
|
+
description: this.description,
|
|
69
|
+
disabled: this.disabled,
|
|
70
|
+
errorMessage: this.errorMessage,
|
|
71
|
+
};
|
|
72
|
+
const out = Renderer(props);
|
|
73
|
+
if (typeof out === 'string') {
|
|
74
|
+
const el = document.createElement('div');
|
|
75
|
+
el.innerHTML = out;
|
|
76
|
+
this.host.element.nativeElement.appendChild(el);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch (e) {
|
|
80
|
+
const el = document.createElement('div');
|
|
81
|
+
el.textContent = `Failed to render field: ${this.type}`;
|
|
82
|
+
this.host.element.nativeElement.appendChild(el);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
applyKnownProps(instance) {
|
|
87
|
+
const knownProps = ["value", "label", "placeholder", "required", "disabled", "options", "className", "description", "errorMessage"];
|
|
88
|
+
for (const prop of knownProps) {
|
|
89
|
+
if (prop in this && prop in instance) {
|
|
90
|
+
instance[prop] = this[prop];
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
bindOutput(instance, outputName) {
|
|
95
|
+
const output = instance?.[outputName];
|
|
96
|
+
if (!output || typeof output.subscribe !== "function")
|
|
97
|
+
return;
|
|
98
|
+
output.subscribe((value) => {
|
|
99
|
+
this.emitValue(value);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
emitValue(value) {
|
|
103
|
+
this.valueChange.emit(value);
|
|
104
|
+
this.onChange.emit(value);
|
|
105
|
+
}
|
|
106
|
+
cleanupRenderedComponent() {
|
|
107
|
+
this.compRef?.destroy();
|
|
108
|
+
this.compRef = undefined;
|
|
109
|
+
this.inputInstance = undefined;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
DynamicInput.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DynamicInput, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
113
|
+
DynamicInput.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DynamicInput, isStandalone: true, selector: "dfk-dynamic-input", inputs: { type: "type", value: "value", label: "label", placeholder: "placeholder", required: "required", options: "options", className: "className", description: "description" }, 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 }] });
|
|
114
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DynamicInput, decorators: [{
|
|
115
|
+
type: Component,
|
|
116
|
+
args: [{
|
|
117
|
+
selector: "dfk-dynamic-input",
|
|
118
|
+
standalone: true,
|
|
119
|
+
imports: [CommonModule],
|
|
120
|
+
template: `<div #host style="display: contents;"></div>`,
|
|
121
|
+
}]
|
|
122
|
+
}], propDecorators: { type: [{
|
|
123
|
+
type: Input
|
|
124
|
+
}], value: [{
|
|
125
|
+
type: Input
|
|
126
|
+
}], label: [{
|
|
127
|
+
type: Input
|
|
128
|
+
}], placeholder: [{
|
|
129
|
+
type: Input
|
|
130
|
+
}], required: [{
|
|
131
|
+
type: Input
|
|
132
|
+
}], options: [{
|
|
133
|
+
type: Input
|
|
134
|
+
}], className: [{
|
|
135
|
+
type: Input
|
|
136
|
+
}], description: [{
|
|
137
|
+
type: Input
|
|
138
|
+
}], valueChange: [{
|
|
139
|
+
type: Output
|
|
140
|
+
}], onChange: [{
|
|
141
|
+
type: Output
|
|
142
|
+
}], host: [{
|
|
143
|
+
type: ViewChild,
|
|
144
|
+
args: ["host", { read: ViewContainerRef, static: false }]
|
|
145
|
+
}] } });
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRHluYW1pY0lucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvRHluYW1pY0lucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUM5QyxPQUFPLEVBQUUsU0FBUyxFQUFnQixLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQWlELFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUM5SyxPQUFPLEVBQUUsYUFBYSxFQUFnQixNQUFNLHlCQUF5QixDQUFBO0FBQ3JFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQTs7QUFRaEQsTUFBTSxPQUFPLFlBQWEsU0FBUSxrQkFBa0I7SUFOcEQ7O1FBZXFCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQTtRQUM5QyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQSxDQUFDLGtCQUFrQjtLQXNIaEU7SUFoSEMsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2hFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQTtZQUNiLE9BQU07U0FDUDtRQUVELElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTtZQUV4QyxNQUFNLFlBQVksR0FBa0IsRUFBRSxDQUFBO1lBQ3RDLEtBQUssTUFBTSxJQUFJLElBQUksT0FBTyxFQUFFO2dCQUMxQixZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxZQUFZLENBQ25DLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhLEVBQzNCLE9BQU8s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O1FBQ3ZCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVPLFNBQVMsQ0FBQyxLQUFVO1FBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzVCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzNCLENBQUM7SUFFTyx3QkFBd0I7UUFDOUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQTtRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQTtRQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQTtJQUNoQyxDQUFDOzswR0EvSFUsWUFBWTs4RkFBWixZQUFZLHlZQVlJLGdCQUFnQix5RUFkakMsOENBQThDLDJEQUQ5QyxZQUFZOzRGQUdYLFlBQVk7a0JBTnhCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG1CQUFtQjtvQkFDN0IsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDdkIsUUFBUSxFQUFFLDhDQUE4QztpQkFDekQ7OEJBRVUsSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ2EsV0FBVztzQkFBN0IsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUV1RCxJQUFJO3NCQUFqRSxTQUFTO3VCQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiXG5pbXBvcnQgeyBDb21wb25lbnQsIENvbXBvbmVudFJlZiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgU2ltcGxlQ2hhbmdlcywgVHlwZSwgU2ltcGxlQ2hhbmdlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIlxuaW1wb3J0IHsgZmllbGRSZWdpc3RyeSwgRmllbGRUeXBlS2V5IH0gZnJvbSBcIkBkeW5hbWljLWZpZWxkLWtpdC9jb3JlXCJcbmltcG9ydCB7IEJhc2VJbnB1dENvbXBvbmVudCB9IGZyb20gXCIuL0Jhc2VJbnB1dFwiXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJkZmstZHluYW1pYy1pbnB1dFwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGU6IGA8ZGl2ICNob3N0IHN0eWxlPVwiZGlzcGxheTogY29udGVudHM7XCI+PC9kaXY+YCxcbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY0lucHV0IGV4dGVuZHMgQmFzZUlucHV0Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcbiAgQElucHV0KCkgdHlwZSE6IEZpZWxkVHlwZUtleVxuICBASW5wdXQoKSB2YWx1ZT86IGFueVxuICBASW5wdXQoKSBsYWJlbD86IHN0cmluZ1xyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyPzogc3RyaW5nXHJcbiAgQElucHV0KCkgcmVxdWlyZWQ/OiBib29sZWFuXHJcbiAgQElucHV0KCkgb3B0aW9ucz86IGFueVtdXG4gIEBJbnB1dCgpIGNsYXNzTmFtZT86IHN0cmluZ1xuICBASW5wdXQoKSBkZXNjcmlwdGlvbj86IGFueVxuICBAT3V0cHV0KCkgb3ZlcnJpZGUgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKVxuICBAT3V0cHV0KCkgb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKSAvLyBiYWNrd2FyZCBjb21wYXRcblxuICBAVmlld0NoaWxkKFwiaG9zdFwiLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogZmFsc2UgfSkgaG9zdCE6IFZpZXdDb250YWluZXJSZWZcbiAgcHJpdmF0ZSBjb21wUmVmPzogQ29tcG9uZW50UmVmPGFueT5cbiAgcHJpdmF0ZSBpbnB1dEluc3RhbmNlPzogYW55XG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXNbXCJ0eXBlXCJdICYmICFjaGFuZ2VzW1widHlwZVwiXS5maXJzdENoYW5nZSAmJiB0aGlzLmhvc3QpIHtcbiAgICAgIHRoaXMucmVuZGVyKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLmlucHV0SW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuYXBwbHlLbm93blByb3BzKHRoaXMuaW5wdXRJbnN0YW5jZSlcblxuICAgICAgY29uc3QgY2hpbGRDaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzID0ge31cbiAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBjaGFuZ2VzKSB7XG4gICAgICAgIGNoaWxkQ2hhbmdlc1twcm9wXSA9IG5ldyBTaW1wbGVDaGFuZ2UoXG4gICAgICAgICAgY2hhbmdlc1twcm9wXS5wcmV2aW91c1ZhbHVlLFxuICAgICAgICAgIGNoYW5nZXNbcHJvcF0uY3VycmVudFZhbHVlLFxuICAgICAgICAgIGNoYW5nZXNbcHJvcF0uZmlyc3RDaGFuZ2VcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICB0aGlzLmlucHV0SW5zdGFuY2UubmdPbkNoYW5nZXM/LihjaGlsZENoYW5nZXMpXG4gICAgICB0aGlzLmNvbXBSZWY/LmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKVxuICAgIH0gZWxzZSBpZiAodGhpcy5ob3N0KSB7XG4gICAgICB0aGlzLnJlbmRlcigpXG4gICAgfVxuICB9XG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXIoKSB7XG4gICAgY29uc3QgUmVuZGVyZXIgPSBmaWVsZFJlZ2lzdHJ5LmdldCh0aGlzLnR5cGUgYXMgRmllbGRUeXBlS2V5KVxuICAgIHRoaXMuY2xlYW51cFJlbmRlcmVkQ29tcG9uZW50KClcbiAgICB0aGlzLmhvc3QuY2xlYXIoKVxuICAgIGlmICghUmVuZGVyZXIpIHtcbiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuICAgICAgZWwudGV4dENvbnRlbnQgPSBgVW5rbm93biBmaWVsZCB0eXBlOiAke3RoaXMudHlwZX1gXG4gICAgICB0aGlzLmhvc3QuZWxlbWVudC5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKGVsKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbXBUeXBlID0gUmVuZGVyZXIgYXMgdW5rbm93biBhcyBUeXBlPGFueT5cbiAgICAgIGNvbnN0IGNvbXBSZWYgPSB0aGlzLmhvc3QuY3JlYXRlQ29tcG9uZW50KGNvbXBUeXBlKVxuICAgICAgY29uc3QgaW5zdGFuY2UgPSBjb21wUmVmLmluc3RhbmNlXG4gICAgICBpZiAoIWluc3RhbmNlKSB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgaW5zdGFuY2UgZm9yICR7dGhpcy50eXBlfWApXG5cbiAgICAgIHRoaXMuYXBwbHlLbm93blByb3BzKGluc3RhbmNlKVxuXG4gICAgICB0aGlzLmJpbmRPdXRwdXQoaW5zdGFuY2UsIFwidmFsdWVDaGFuZ2VcIilcbiAgICAgIHRoaXMuYmluZE91dHB1dChpbnN0YW5jZSwgXCJvblZhbHVlQ2hhbmdlXCIpXG5cbiAgICAgIGluc3RhbmNlLmNoYW5nZURldGVjdG9yUmVmPy5kZXRlY3RDaGFuZ2VzKClcbiAgICAgIHRoaXMuY29tcFJlZiA9IGNvbXBSZWZcbiAgICAgIHRoaXMuaW5wdXRJbnN0YW5jZSA9IGluc3RhbmNlXG4gICAgICBjb21wUmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gRmFsbGJhY2sgdG8gZnVuY3Rpb24gcmVuZGVyZXJcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByb3BzOiBhbnkgPSB7XG4gICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUsXG4gICAgICAgICAgb25WYWx1ZUNoYW5nZTogKHY6IGFueSkgPT4gdGhpcy5lbWl0VmFsdWUodiksXG4gICAgICAgICAgbGFiZWw6IHRoaXMubGFiZWwsXG4gICAgICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucGxhY2Vob2xkZXIsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRoaXMucmVxdWlyZWQsXG4gICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxyXG4gICAgICAgICAgY2xhc3NOYW1lOiB0aGlzLmNsYXNzTmFtZSxcclxuICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IHRoaXMuZGlzYWJsZWQsXHJcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6IHRoaXMuZXJyb3JNZXNzYWdlLFxyXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3V0ID0gKFJlbmRlcmVyIGFzIEZ1bmN0aW9uKShwcm9wcylcbiAgICAgICAgaWYgKHR5cGVvZiBvdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgICAgICAgIGVsLmlubmVySFRNTCA9IG91dFxuICAgICAgICAgIHRoaXMuaG9zdC5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZWwpXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgICAgICBlbC50ZXh0Q29udGVudCA9IGBGYWlsZWQgdG8gcmVuZGVyIGZpZWxkOiAke3RoaXMudHlwZX1gXG4gICAgICAgIHRoaXMuaG9zdC5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZWwpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUtub3duUHJvcHMoaW5zdGFuY2U6IGFueSkge1xuICAgIGNvbnN0IGtub3duUHJvcHMgPSBbXCJ2YWx1ZVwiLCBcImxhYmVsXCIsIFwicGxhY2Vob2xkZXJcIiwgXCJyZXF1aXJlZFwiLCBcImRpc2FibGVkXCIsIFwib3B0aW9uc1wiLCBcImNsYXNzTmFtZVwiLCBcImRlc2NyaXB0aW9uXCIsIFwiZXJyb3JNZXNzYWdlXCJdXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIGtub3duUHJvcHMpIHtcbiAgICAgIGlmIChwcm9wIGluIHRoaXMgJiYgcHJvcCBpbiBpbnN0YW5jZSkge1xuICAgICAgICBpbnN0YW5jZVtwcm9wXSA9ICh0aGlzIGFzIGFueSlbcHJvcF1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJpbmRPdXRwdXQoaW5zdGFuY2U6IGFueSwgb3V0cHV0TmFtZTogXCJ2YWx1ZUNoYW5nZVwiIHwgXCJvblZhbHVlQ2hhbmdlXCIpIHtcbiAgICBjb25zdCBvdXRwdXQgPSBpbnN0YW5jZT8uW291dHB1dE5hbWVdXG4gICAgaWYgKCFvdXRwdXQgfHwgdHlwZW9mIG91dHB1dC5zdWJzY3JpYmUgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuO1xuXG4gICAgKG91dHB1dCBhcyBFdmVudEVtaXR0ZXI8YW55Pikuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgdGhpcy5lbWl0VmFsdWUodmFsdWUpXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpXG4gICAgdGhpcy5vbkNoYW5nZS5lbWl0KHZhbHVlKVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbnVwUmVuZGVyZWRDb21wb25lbnQoKSB7XG4gICAgdGhpcy5jb21wUmVmPy5kZXN0cm95KClcbiAgICB0aGlzLmNvbXBSZWYgPSB1bmRlZmluZWRcbiAgICB0aGlzLmlucHV0SW5zdGFuY2UgPSB1bmRlZmluZWRcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { NgIf } from "@angular/common";
|
|
2
|
+
import { Component, Input, Output, EventEmitter } from "@angular/core";
|
|
3
|
+
import { DynamicInput } from './DynamicInput';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class FieldInput {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.onValueChangeField = new EventEmitter();
|
|
8
|
+
}
|
|
9
|
+
getFieldValue() {
|
|
10
|
+
if (!this.fieldDescription || !this.renderInfos)
|
|
11
|
+
return undefined;
|
|
12
|
+
const value = this.renderInfos[this.fieldDescription.name];
|
|
13
|
+
if (value === undefined && this.fieldDescription.type === "text") {
|
|
14
|
+
return "";
|
|
15
|
+
}
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
FieldInput.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FieldInput, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
20
|
+
FieldInput.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: FieldInput, isStandalone: true, selector: "dfk-field-input", inputs: { fieldDescription: "fieldDescription", renderInfos: "renderInfos" }, outputs: { onValueChangeField: "onValueChangeField" }, ngImport: i0, template: `
|
|
21
|
+
<dfk-dynamic-input
|
|
22
|
+
*ngIf="fieldDescription && renderInfos"
|
|
23
|
+
[type]="fieldDescription!.type"
|
|
24
|
+
[value]="getFieldValue()"
|
|
25
|
+
[label]="fieldDescription!.label"
|
|
26
|
+
[placeholder]="fieldDescription!.placeholder"
|
|
27
|
+
[required]="fieldDescription!.required"
|
|
28
|
+
[description]="fieldDescription!.description"
|
|
29
|
+
[options]="fieldDescription!.options"
|
|
30
|
+
[className]="fieldDescription!.className"
|
|
31
|
+
(valueChange)="onValueChangeField.emit({ value: $event, key: fieldDescription!.name })"
|
|
32
|
+
[disabled]="false"
|
|
33
|
+
[errorMessage]="''"
|
|
34
|
+
></dfk-dynamic-input>
|
|
35
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: DynamicInput, selector: "dfk-dynamic-input", inputs: ["type", "value", "label", "placeholder", "required", "options", "className", "description"], outputs: ["valueChange", "onChange"] }] });
|
|
36
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FieldInput, decorators: [{
|
|
37
|
+
type: Component,
|
|
38
|
+
args: [{
|
|
39
|
+
selector: "dfk-field-input",
|
|
40
|
+
standalone: true,
|
|
41
|
+
imports: [NgIf, DynamicInput],
|
|
42
|
+
template: `
|
|
43
|
+
<dfk-dynamic-input
|
|
44
|
+
*ngIf="fieldDescription && renderInfos"
|
|
45
|
+
[type]="fieldDescription!.type"
|
|
46
|
+
[value]="getFieldValue()"
|
|
47
|
+
[label]="fieldDescription!.label"
|
|
48
|
+
[placeholder]="fieldDescription!.placeholder"
|
|
49
|
+
[required]="fieldDescription!.required"
|
|
50
|
+
[description]="fieldDescription!.description"
|
|
51
|
+
[options]="fieldDescription!.options"
|
|
52
|
+
[className]="fieldDescription!.className"
|
|
53
|
+
(valueChange)="onValueChangeField.emit({ value: $event, key: fieldDescription!.name })"
|
|
54
|
+
[disabled]="false"
|
|
55
|
+
[errorMessage]="''"
|
|
56
|
+
></dfk-dynamic-input>
|
|
57
|
+
`,
|
|
58
|
+
}]
|
|
59
|
+
}], propDecorators: { fieldDescription: [{
|
|
60
|
+
type: Input
|
|
61
|
+
}], renderInfos: [{
|
|
62
|
+
type: Input
|
|
63
|
+
}], onValueChangeField: [{
|
|
64
|
+
type: Output
|
|
65
|
+
}] } });
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmllbGRJbnB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL0ZpZWxkSW5wdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQ3RDLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDdEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFBOztBQXdCN0MsTUFBTSxPQUFPLFVBQVU7SUFyQnZCO1FBd0JZLHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUE2QixDQUFBO0tBWTdFO0lBVkMsYUFBYTtRQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVztZQUFFLE9BQU8sU0FBUyxDQUFBO1FBRWpFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzFELElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRTtZQUNoRSxPQUFPLEVBQUUsQ0FBQTtTQUNWO1FBRUQsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDOzt3R0FkVSxVQUFVOzRGQUFWLFVBQVUsZ05BakJYOzs7Ozs7Ozs7Ozs7Ozs7R0FlVCw0REFoQlMsSUFBSSw2RkFBRSxZQUFZOzRGQWtCakIsVUFBVTtrQkFyQnRCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGlCQUFpQjtvQkFDM0IsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUM7b0JBQzdCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7O0dBZVQ7aUJBQ0Y7OEJBRVUsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0ksa0JBQWtCO3NCQUEzQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdJZiB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIlxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiXG5pbXBvcnQgeyBEeW5hbWljSW5wdXQgfSBmcm9tICcuL0R5bmFtaWNJbnB1dCdcbmltcG9ydCB7IEZpZWxkRGVzY3JpcHRpb24sIFByb3BlcnRpZXMgfSBmcm9tIFwiQGR5bmFtaWMtZmllbGQta2l0L2NvcmVcIlxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiZGZrLWZpZWxkLWlucHV0XCIsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtOZ0lmLCBEeW5hbWljSW5wdXRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkZmstZHluYW1pYy1pbnB1dFxuICAgICAgKm5nSWY9XCJmaWVsZERlc2NyaXB0aW9uICYmIHJlbmRlckluZm9zXCJcbiAgICAgIFt0eXBlXT1cImZpZWxkRGVzY3JpcHRpb24hLnR5cGVcIlxuICAgICAgW3ZhbHVlXT1cImdldEZpZWxkVmFsdWUoKVwiXG4gICAgICBbbGFiZWxdPVwiZmllbGREZXNjcmlwdGlvbiEubGFiZWxcIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkRGVzY3JpcHRpb24hLnBsYWNlaG9sZGVyXCJcbiAgICAgIFtyZXF1aXJlZF09XCJmaWVsZERlc2NyaXB0aW9uIS5yZXF1aXJlZFwiXG4gICAgICBbZGVzY3JpcHRpb25dPVwiZmllbGREZXNjcmlwdGlvbiEuZGVzY3JpcHRpb25cIlxyXG4gICAgICBbb3B0aW9uc109XCJmaWVsZERlc2NyaXB0aW9uIS5vcHRpb25zXCJcclxuICAgICAgW2NsYXNzTmFtZV09XCJmaWVsZERlc2NyaXB0aW9uIS5jbGFzc05hbWVcIlxyXG4gICAgICAodmFsdWVDaGFuZ2UpPVwib25WYWx1ZUNoYW5nZUZpZWxkLmVtaXQoeyB2YWx1ZTogJGV2ZW50LCBrZXk6IGZpZWxkRGVzY3JpcHRpb24hLm5hbWUgfSlcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiZmFsc2VcIlxyXG4gICAgICBbZXJyb3JNZXNzYWdlXT1cIicnXCJcclxuICAgID48L2Rmay1keW5hbWljLWlucHV0PlxyXG4gIGAsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGaWVsZElucHV0IHtcbiAgQElucHV0KCkgZmllbGREZXNjcmlwdGlvbj86IEZpZWxkRGVzY3JpcHRpb25cbiAgQElucHV0KCkgcmVuZGVySW5mb3M/OiBQcm9wZXJ0aWVzXG4gIEBPdXRwdXQoKSBvblZhbHVlQ2hhbmdlRmllbGQgPSBuZXcgRXZlbnRFbWl0dGVyPHt2YWx1ZTogYW55LCBrZXk6IHN0cmluZ30+KClcblxuICBnZXRGaWVsZFZhbHVlKCkge1xuICAgIGlmICghdGhpcy5maWVsZERlc2NyaXB0aW9uIHx8ICF0aGlzLnJlbmRlckluZm9zKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmVuZGVySW5mb3NbdGhpcy5maWVsZERlc2NyaXB0aW9uLm5hbWVdXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgdGhpcy5maWVsZERlc2NyaXB0aW9uLnR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICByZXR1cm4gXCJcIlxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG59XG4iXX0=
|