@decaf-ts/for-angular 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +21 -0
- package/README.md +297 -0
- package/dist/for-angular/README.md +297 -0
- package/dist/for-angular/assets/i18n/en.json +21 -0
- package/dist/for-angular/components/decaf-crud-field/decaf-crud-field.component.d.ts +22 -0
- package/dist/for-angular/components/decaf-crud-form/constants.d.ts +5 -0
- package/dist/for-angular/components/decaf-crud-form/decaf-crud-form.component.d.ts +28 -0
- package/dist/for-angular/components/decaf-crud-form/types.d.ts +17 -0
- package/dist/for-angular/components/decaf-model-renderer/decaf-model-renderer.component.d.ts +20 -0
- package/dist/for-angular/directives/decaf-field.directive.d.ts +8 -0
- package/dist/for-angular/engine/DynamicModule.d.ts +2 -0
- package/dist/for-angular/engine/NgxCrudFormField.d.ts +115 -0
- package/dist/for-angular/engine/NgxFormService.d.ts +119 -0
- package/dist/for-angular/engine/NgxRenderingEngine.d.ts +17 -0
- package/dist/for-angular/engine/ValidatorFactory.d.ts +4 -0
- package/dist/for-angular/engine/constants.d.ts +10 -0
- package/dist/for-angular/engine/decorators.d.ts +1 -0
- package/dist/for-angular/engine/index.d.ts +5 -0
- package/dist/for-angular/engine/types.d.ts +32 -0
- package/dist/for-angular/esm2022/components/decaf-crud-field/decaf-crud-field.component.mjs +66 -0
- package/dist/for-angular/esm2022/components/decaf-crud-form/constants.mjs +14 -0
- package/dist/for-angular/esm2022/components/decaf-crud-form/decaf-crud-form.component.mjs +84 -0
- package/dist/for-angular/esm2022/components/decaf-crud-form/types.mjs +2 -0
- package/dist/for-angular/esm2022/components/decaf-model-renderer/decaf-model-renderer.component.mjs +46 -0
- package/dist/for-angular/esm2022/decaf-ts-for-angular.mjs +5 -0
- package/dist/for-angular/esm2022/directives/decaf-field.directive.mjs +23 -0
- package/dist/for-angular/esm2022/engine/DynamicModule.mjs +3 -0
- package/dist/for-angular/esm2022/engine/NgxCrudFormField.mjs +118 -0
- package/dist/for-angular/esm2022/engine/NgxFormService.mjs +232 -0
- package/dist/for-angular/esm2022/engine/NgxRenderingEngine.mjs +35 -0
- package/dist/for-angular/esm2022/engine/ValidatorFactory.mjs +48 -0
- package/dist/for-angular/esm2022/engine/constants.mjs +12 -0
- package/dist/for-angular/esm2022/engine/decorators.mjs +17 -0
- package/dist/for-angular/esm2022/engine/index.mjs +6 -0
- package/dist/for-angular/esm2022/engine/types.mjs +2 -0
- package/dist/for-angular/esm2022/interfaces.mjs +2 -0
- package/dist/for-angular/esm2022/public-apis.mjs +5 -0
- package/dist/for-angular/fesm2022/decaf-ts-for-angular.mjs +675 -0
- package/dist/for-angular/fesm2022/decaf-ts-for-angular.mjs.map +1 -0
- package/dist/for-angular/index.d.ts +5 -0
- package/dist/for-angular/interfaces.d.ts +8 -0
- package/dist/for-angular/public-apis.d.ts +4 -0
- package/package.json +81 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { Component, ElementRef, ViewChild, Input, Output, EventEmitter, } from '@angular/core';
|
|
2
|
+
import { FormGroup, ReactiveFormsModule } from '@angular/forms';
|
|
3
|
+
import { NgxFormService } from '../../engine/NgxFormService';
|
|
4
|
+
import { IonicModule } from '@ionic/angular';
|
|
5
|
+
import { DefaultFormReactiveOptions } from './constants';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@ionic/angular";
|
|
8
|
+
import * as i2 from "@angular/forms";
|
|
9
|
+
export class DecafCrudFormComponent {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.updateOn = 'change';
|
|
12
|
+
this.target = '_self';
|
|
13
|
+
this.method = 'event';
|
|
14
|
+
this.formGroup = new FormGroup({});
|
|
15
|
+
this.submitEvent = new EventEmitter();
|
|
16
|
+
}
|
|
17
|
+
ngAfterViewInit() {
|
|
18
|
+
NgxFormService.formAfterViewInit(this, this.formId);
|
|
19
|
+
}
|
|
20
|
+
ngOnInit() {
|
|
21
|
+
this.options = Object.assign({}, DefaultFormReactiveOptions, this.options || {});
|
|
22
|
+
if (!this.formId)
|
|
23
|
+
this.formId = Date.now().toString();
|
|
24
|
+
}
|
|
25
|
+
ngOnDestroy() {
|
|
26
|
+
NgxFormService.forOnDestroy(this, this.formId);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* @param {Event} event
|
|
30
|
+
*/
|
|
31
|
+
submit(event) {
|
|
32
|
+
event.preventDefault();
|
|
33
|
+
event.stopImmediatePropagation();
|
|
34
|
+
event.stopPropagation();
|
|
35
|
+
if (!this.formGroup.valid)
|
|
36
|
+
return NgxFormService.validateFields(this.formGroup);
|
|
37
|
+
console.log('onSubmit');
|
|
38
|
+
// fix para valores de campos radio e check
|
|
39
|
+
const data = NgxFormService.getFormData(this.formId);
|
|
40
|
+
const submitEvent = {
|
|
41
|
+
data: data,
|
|
42
|
+
};
|
|
43
|
+
if (this.action)
|
|
44
|
+
return this.component.nativeElement.dispatchEvent(new CustomEvent('submit', data));
|
|
45
|
+
this.submitEvent.emit(submitEvent);
|
|
46
|
+
// self.emitEvent({
|
|
47
|
+
// role: button?.role || FORM_BUTTON_ROLES.SUBMIT,
|
|
48
|
+
// data,
|
|
49
|
+
// reset: button?.reset,
|
|
50
|
+
// operation: self.operation,
|
|
51
|
+
// eventName: self.eventName,
|
|
52
|
+
// event,
|
|
53
|
+
// } as FormReactiveSubmitEvent);
|
|
54
|
+
}
|
|
55
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DecafCrudFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
56
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DecafCrudFormComponent, isStandalone: true, selector: "decaf-crud-form", inputs: { updateOn: "updateOn", target: "target", method: "method", options: "options", action: "action", operation: "operation", formGroup: "formGroup", formId: "formId" }, outputs: { submitEvent: "submitEvent" }, viewQueries: [{ propertyName: "component", first: true, predicate: ["reactiveForm"], descendants: true, read: ElementRef }], ngImport: i0, template: "<form #reactiveForm [id]=\"formId\" [formGroup]=\"formGroup\" (submit)=\"submit($event)\" [target]=\"target\">\n <ng-content #formContent></ng-content>\n <div class=\"buttons-container\">\n <ion-button\n type=\"submit\">\n<!-- [shape]=\"buttons?.submit?.shape || 'round'\"-->\n<!-- [color]=\"buttons?.submit?.color || 'primary'\"-->\n<!-- [size]=\"buttons?.submit?.size || 'default'\"-->\n<!-- [fill]=\"buttons?.submit?.fill || 'solid'\"-->\n<!-- [disabled]=\"buttons?.submit?.disabled || false\"-->\n<!-- expand=\"block\"-->\n<!-- [disabled]=\"disableSubmitButtonWhenInvalid ? !form.valid : false\"-->\n @if(options.buttons.submit.icon) {\n <ion-icon [slot]=\"options.buttons.submit.iconSlot\" [name]=\"options.buttons.submit.icon\"></ion-icon>\n }\n {{options.buttons.submit.text}}\n </ion-button>\n @if(options.buttons.clear) {\n <ion-button>\n<!-- type=\"clear\"-->\n<!-- (click)=\"clear($event)\"-->\n<!-- [shape]=\"buttons?.clear?.shape || 'round'\"-->\n<!-- [color]=\"buttons?.clear?.color || 'primary'\"-->\n<!-- [size]=\"buttons?.clear?.size || 'default'\"-->\n<!-- [fill]=\"buttons?.clear?.fill || 'clear'\"-->\n<!-- [disabled]=\"buttons?.clear?.disabled || false\"-->\n<!-- expand=\"block\"-->\n @if(options.buttons.clear?.icon) {\n <ion-icon [slot]=\"options.buttons.clear?.iconSlot\" [name]=\"options.buttons.clear?.icon\"></ion-icon>\n }\n {{options.buttons.clear?.text}}\n </ion-button>\n }\n </div>\n</form>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: IonicModule }, { kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }] }); }
|
|
57
|
+
}
|
|
58
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DecafCrudFormComponent, decorators: [{
|
|
59
|
+
type: Component,
|
|
60
|
+
args: [{ standalone: true, selector: 'decaf-crud-form', imports: [IonicModule, ReactiveFormsModule], template: "<form #reactiveForm [id]=\"formId\" [formGroup]=\"formGroup\" (submit)=\"submit($event)\" [target]=\"target\">\n <ng-content #formContent></ng-content>\n <div class=\"buttons-container\">\n <ion-button\n type=\"submit\">\n<!-- [shape]=\"buttons?.submit?.shape || 'round'\"-->\n<!-- [color]=\"buttons?.submit?.color || 'primary'\"-->\n<!-- [size]=\"buttons?.submit?.size || 'default'\"-->\n<!-- [fill]=\"buttons?.submit?.fill || 'solid'\"-->\n<!-- [disabled]=\"buttons?.submit?.disabled || false\"-->\n<!-- expand=\"block\"-->\n<!-- [disabled]=\"disableSubmitButtonWhenInvalid ? !form.valid : false\"-->\n @if(options.buttons.submit.icon) {\n <ion-icon [slot]=\"options.buttons.submit.iconSlot\" [name]=\"options.buttons.submit.icon\"></ion-icon>\n }\n {{options.buttons.submit.text}}\n </ion-button>\n @if(options.buttons.clear) {\n <ion-button>\n<!-- type=\"clear\"-->\n<!-- (click)=\"clear($event)\"-->\n<!-- [shape]=\"buttons?.clear?.shape || 'round'\"-->\n<!-- [color]=\"buttons?.clear?.color || 'primary'\"-->\n<!-- [size]=\"buttons?.clear?.size || 'default'\"-->\n<!-- [fill]=\"buttons?.clear?.fill || 'clear'\"-->\n<!-- [disabled]=\"buttons?.clear?.disabled || false\"-->\n<!-- expand=\"block\"-->\n @if(options.buttons.clear?.icon) {\n <ion-icon [slot]=\"options.buttons.clear?.iconSlot\" [name]=\"options.buttons.clear?.icon\"></ion-icon>\n }\n {{options.buttons.clear?.text}}\n </ion-button>\n }\n </div>\n</form>\n" }]
|
|
61
|
+
}], propDecorators: { updateOn: [{
|
|
62
|
+
type: Input
|
|
63
|
+
}], component: [{
|
|
64
|
+
type: ViewChild,
|
|
65
|
+
args: ['reactiveForm', { static: false, read: ElementRef }]
|
|
66
|
+
}], target: [{
|
|
67
|
+
type: Input
|
|
68
|
+
}], method: [{
|
|
69
|
+
type: Input
|
|
70
|
+
}], options: [{
|
|
71
|
+
type: Input
|
|
72
|
+
}], action: [{
|
|
73
|
+
type: Input
|
|
74
|
+
}], operation: [{
|
|
75
|
+
type: Input,
|
|
76
|
+
args: [{ required: true }]
|
|
77
|
+
}], formGroup: [{
|
|
78
|
+
type: Input
|
|
79
|
+
}], formId: [{
|
|
80
|
+
type: Input
|
|
81
|
+
}], submitEvent: [{
|
|
82
|
+
type: Output
|
|
83
|
+
}] } });
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjYWYtY3J1ZC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9kZWNhZi1jcnVkLWZvcm0vZGVjYWYtY3J1ZC1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9kZWNhZi1jcnVkLWZvcm0vZGVjYWYtY3J1ZC1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUVWLFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksR0FFYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUk3QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxhQUFhLENBQUM7Ozs7QUFVekQsTUFBTSxPQUFPLHNCQUFzQjtJQVJuQztRQVlFLGFBQVEsR0FBb0IsUUFBUSxDQUFDO1FBTXJDLFdBQU0sR0FBbUIsT0FBTyxDQUFDO1FBR2pDLFdBQU0sR0FBNkIsT0FBTyxDQUFDO1FBWTNDLGNBQVMsR0FBYyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQU16QyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUEyQixDQUFDO0tBcUQzRDtJQW5EQyxlQUFlO1FBQ2IsY0FBYyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQzFCLEVBQUUsRUFDRiwwQkFBMEIsRUFDMUIsSUFBSSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQ25CLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0lBRUQsV0FBVztRQUNULGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsS0FBa0I7UUFDdkIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2pDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV4QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLO1lBQ3ZCLE9BQU8sY0FBYyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUV4QiwyQ0FBMkM7UUFDM0MsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckQsTUFBTSxXQUFXLEdBQTRCO1lBQzNDLElBQUksRUFBRSxJQUFJO1NBQ1gsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLE1BQU07WUFDYixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FDL0MsSUFBSSxXQUFXLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUNoQyxDQUFDO1FBRUosSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkMsbUJBQW1CO1FBQ25CLG9EQUFvRDtRQUNwRCxVQUFVO1FBQ1YsMEJBQTBCO1FBQzFCLCtCQUErQjtRQUMvQiwrQkFBK0I7UUFDL0IsV0FBVztRQUNYLGlDQUFpQztJQUNuQyxDQUFDOytHQW5GVSxzQkFBc0I7bUdBQXRCLHNCQUFzQix3WEFNaUIsVUFBVSw2QkNsQzlELDRsREFtQ0EseUREVFksV0FBVyxtY0FBRSxtQkFBbUI7OzRGQUUvQixzQkFBc0I7a0JBUmxDLFNBQVM7aUNBQ0ksSUFBSSxZQUVOLGlCQUFpQixXQUdsQixDQUFDLFdBQVcsRUFBRSxtQkFBbUIsQ0FBQzs4QkFNM0MsUUFBUTtzQkFEUCxLQUFLO2dCQUlOLFNBQVM7c0JBRFIsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBSTlELE1BQU07c0JBREwsS0FBSztnQkFJTixNQUFNO3NCQURMLEtBQUs7Z0JBSU4sT0FBTztzQkFETixLQUFLO2dCQUlOLE1BQU07c0JBREwsS0FBSztnQkFJTixTQUFTO3NCQURSLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUl6QixTQUFTO3NCQURSLEtBQUs7Z0JBSU4sTUFBTTtzQkFETCxLQUFLO2dCQUlOLFdBQVc7c0JBRFYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgT25Jbml0LFxuICBWaWV3Q2hpbGQsXG4gIEFmdGVyVmlld0luaXQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25EZXN0cm95LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZvcm1FbGVtZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBOZ3hGb3JtU2VydmljZSB9IGZyb20gJy4uLy4uL2VuZ2luZS9OZ3hGb3JtU2VydmljZSc7XG5pbXBvcnQgeyBJb25pY01vZHVsZSB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IEZpZWxkVXBkYXRlTW9kZSwgSFRNTEZvcm1UYXJnZXQgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ3J1ZEZvcm1PcHRpb25zLCBGb3JtUmVhY3RpdmVTdWJtaXRFdmVudCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQ3J1ZE9wZXJhdGlvbnMgfSBmcm9tICdAZGVjYWYtdHMvZGItZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBEZWZhdWx0Rm9ybVJlYWN0aXZlT3B0aW9ucyB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnZGVjYWYtY3J1ZC1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RlY2FmLWNydWQtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RlY2FmLWNydWQtZm9ybS5jb21wb25lbnQuc2NzcyddLFxuICBpbXBvcnRzOiBbSW9uaWNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGVdLFxufSlcbmV4cG9ydCBjbGFzcyBEZWNhZkNydWRGb3JtQ29tcG9uZW50XG4gIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBGb3JtRWxlbWVudCwgT25EZXN0cm95XG57XG4gIEBJbnB1dCgpXG4gIHVwZGF0ZU9uOiBGaWVsZFVwZGF0ZU1vZGUgPSAnY2hhbmdlJztcblxuICBAVmlld0NoaWxkKCdyZWFjdGl2ZUZvcm0nLCB7IHN0YXRpYzogZmFsc2UsIHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgY29tcG9uZW50ITogRWxlbWVudFJlZjtcblxuICBASW5wdXQoKVxuICB0YXJnZXQ6IEhUTUxGb3JtVGFyZ2V0ID0gJ19zZWxmJztcblxuICBASW5wdXQoKVxuICBtZXRob2Q6ICdnZXQnIHwgJ3Bvc3QnIHwgJ2V2ZW50JyA9ICdldmVudCc7XG5cbiAgQElucHV0KClcbiAgb3B0aW9ucyE6IENydWRGb3JtT3B0aW9ucztcblxuICBASW5wdXQoKVxuICBhY3Rpb24/OiBzdHJpbmc7XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgb3BlcmF0aW9uITogQ3J1ZE9wZXJhdGlvbnM7XG5cbiAgQElucHV0KClcbiAgZm9ybUdyb3VwOiBGb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTtcblxuICBASW5wdXQoKVxuICBmb3JtSWQhOiBzdHJpbmc7XG5cbiAgQE91dHB1dCgpXG4gIHN1Ym1pdEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxGb3JtUmVhY3RpdmVTdWJtaXRFdmVudD4oKTtcblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgTmd4Rm9ybVNlcnZpY2UuZm9ybUFmdGVyVmlld0luaXQodGhpcywgdGhpcy5mb3JtSWQpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHt9LFxuICAgICAgRGVmYXVsdEZvcm1SZWFjdGl2ZU9wdGlvbnMsXG4gICAgICB0aGlzLm9wdGlvbnMgfHwge30sXG4gICAgKTtcbiAgICBpZiAoIXRoaXMuZm9ybUlkKSB0aGlzLmZvcm1JZCA9IERhdGUubm93KCkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIE5neEZvcm1TZXJ2aWNlLmZvck9uRGVzdHJveSh0aGlzLCB0aGlzLmZvcm1JZCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtICB7RXZlbnR9IGV2ZW50XG4gICAqL1xuICBzdWJtaXQoZXZlbnQ6IFN1Ym1pdEV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGlmICghdGhpcy5mb3JtR3JvdXAudmFsaWQpXG4gICAgICByZXR1cm4gTmd4Rm9ybVNlcnZpY2UudmFsaWRhdGVGaWVsZHModGhpcy5mb3JtR3JvdXApO1xuICAgIGNvbnNvbGUubG9nKCdvblN1Ym1pdCcpO1xuXG4gICAgLy8gZml4IHBhcmEgdmFsb3JlcyBkZSBjYW1wb3MgcmFkaW8gZSBjaGVja1xuICAgIGNvbnN0IGRhdGEgPSBOZ3hGb3JtU2VydmljZS5nZXRGb3JtRGF0YSh0aGlzLmZvcm1JZCk7XG5cbiAgICBjb25zdCBzdWJtaXRFdmVudDogRm9ybVJlYWN0aXZlU3VibWl0RXZlbnQgPSB7XG4gICAgICBkYXRhOiBkYXRhLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5hY3Rpb24pXG4gICAgICByZXR1cm4gdGhpcy5jb21wb25lbnQubmF0aXZlRWxlbWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3N1Ym1pdCcsIGRhdGEpLFxuICAgICAgKTtcblxuICAgIHRoaXMuc3VibWl0RXZlbnQuZW1pdChzdWJtaXRFdmVudCk7XG4gICAgLy8gc2VsZi5lbWl0RXZlbnQoe1xuICAgIC8vICAgcm9sZTogYnV0dG9uPy5yb2xlIHx8IEZPUk1fQlVUVE9OX1JPTEVTLlNVQk1JVCxcbiAgICAvLyAgIGRhdGEsXG4gICAgLy8gICByZXNldDogYnV0dG9uPy5yZXNldCxcbiAgICAvLyAgIG9wZXJhdGlvbjogc2VsZi5vcGVyYXRpb24sXG4gICAgLy8gICBldmVudE5hbWU6IHNlbGYuZXZlbnROYW1lLFxuICAgIC8vICAgZXZlbnQsXG4gICAgLy8gfSBhcyBGb3JtUmVhY3RpdmVTdWJtaXRFdmVudCk7XG4gIH1cbn1cbiIsIjxmb3JtICNyZWFjdGl2ZUZvcm0gW2lkXT1cImZvcm1JZFwiIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCIgKHN1Ym1pdCk9XCJzdWJtaXQoJGV2ZW50KVwiIFt0YXJnZXRdPVwidGFyZ2V0XCI+XG4gIDxuZy1jb250ZW50ICNmb3JtQ29udGVudD48L25nLWNvbnRlbnQ+XG4gIDxkaXYgY2xhc3M9XCJidXR0b25zLWNvbnRhaW5lclwiPlxuICAgIDxpb24tYnV0dG9uXG4gICAgICB0eXBlPVwic3VibWl0XCI+XG48IS0tICAgICAgW3NoYXBlXT1cImJ1dHRvbnM/LnN1Ym1pdD8uc2hhcGUgfHwgJ3JvdW5kJ1wiLS0+XG48IS0tICAgICAgW2NvbG9yXT1cImJ1dHRvbnM/LnN1Ym1pdD8uY29sb3IgfHwgJ3ByaW1hcnknXCItLT5cbjwhLS0gICAgICBbc2l6ZV09XCJidXR0b25zPy5zdWJtaXQ/LnNpemUgfHwgJ2RlZmF1bHQnXCItLT5cbjwhLS0gICAgICBbZmlsbF09XCJidXR0b25zPy5zdWJtaXQ/LmZpbGwgfHwgJ3NvbGlkJ1wiLS0+XG48IS0tICAgICAgW2Rpc2FibGVkXT1cImJ1dHRvbnM/LnN1Ym1pdD8uZGlzYWJsZWQgfHwgZmFsc2VcIi0tPlxuPCEtLSAgICAgIGV4cGFuZD1cImJsb2NrXCItLT5cbjwhLS0gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZVN1Ym1pdEJ1dHRvbldoZW5JbnZhbGlkID8gIWZvcm0udmFsaWQgOiBmYWxzZVwiLS0+XG4gICAgICBAaWYob3B0aW9ucy5idXR0b25zLnN1Ym1pdC5pY29uKSB7XG4gICAgICAgIDxpb24taWNvbiBbc2xvdF09XCJvcHRpb25zLmJ1dHRvbnMuc3VibWl0Lmljb25TbG90XCIgW25hbWVdPVwib3B0aW9ucy5idXR0b25zLnN1Ym1pdC5pY29uXCI+PC9pb24taWNvbj5cbiAgICAgIH1cbiAgICAgIHt7b3B0aW9ucy5idXR0b25zLnN1Ym1pdC50ZXh0fX1cbiAgICA8L2lvbi1idXR0b24+XG4gICAgQGlmKG9wdGlvbnMuYnV0dG9ucy5jbGVhcikge1xuICAgICAgPGlvbi1idXR0b24+XG48IS0tICAgICAgICB0eXBlPVwiY2xlYXJcIi0tPlxuPCEtLSAgICAgICAgICAgIChjbGljayk9XCJjbGVhcigkZXZlbnQpXCItLT5cbjwhLS0gICAgICAgICAgICBbc2hhcGVdPVwiYnV0dG9ucz8uY2xlYXI/LnNoYXBlIHx8ICdyb3VuZCdcIi0tPlxuPCEtLSAgICAgICAgICAgIFtjb2xvcl09XCJidXR0b25zPy5jbGVhcj8uY29sb3IgfHwgJ3ByaW1hcnknXCItLT5cbjwhLS0gICAgICAgICAgICBbc2l6ZV09XCJidXR0b25zPy5jbGVhcj8uc2l6ZSB8fCAnZGVmYXVsdCdcIi0tPlxuPCEtLSAgICAgICAgICAgIFtmaWxsXT1cImJ1dHRvbnM/LmNsZWFyPy5maWxsIHx8ICdjbGVhcidcIi0tPlxuPCEtLSAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidXR0b25zPy5jbGVhcj8uZGlzYWJsZWQgfHwgZmFsc2VcIi0tPlxuPCEtLSAgICAgICAgICAgIGV4cGFuZD1cImJsb2NrXCItLT5cbiAgICAgICAgQGlmKG9wdGlvbnMuYnV0dG9ucy5jbGVhcj8uaWNvbikge1xuICAgICAgICAgIDxpb24taWNvbiBbc2xvdF09XCJvcHRpb25zLmJ1dHRvbnMuY2xlYXI/Lmljb25TbG90XCIgW25hbWVdPVwib3B0aW9ucy5idXR0b25zLmNsZWFyPy5pY29uXCI+PC9pb24taWNvbj5cbiAgICAgICAgfVxuICAgICAgICB7e29wdGlvbnMuYnV0dG9ucy5jbGVhcj8udGV4dH19XG4gICAgICA8L2lvbi1idXR0b24+XG4gICAgfVxuICA8L2Rpdj5cbjwvZm9ybT5cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvZGVjYWYtY3J1ZC1mb3JtL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIEZvcm1SZWFjdGl2ZVN1Ym1pdEV2ZW50IHtcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3J1ZEZvcm1PcHRpb25zIHtcbiAgYnV0dG9uczoge1xuICAgIHN1Ym1pdDoge1xuICAgICAgaWNvbj86IHN0cmluZztcbiAgICAgIGljb25TbG90PzogJ3N0YXJ0JyB8ICdlbmQnO1xuICAgICAgdGV4dD86IHN0cmluZztcbiAgICB9O1xuICAgIGNsZWFyPzoge1xuICAgICAgaWNvbj86IHN0cmluZztcbiAgICAgIGljb25TbG90PzogJ3N0YXJ0JyB8ICdlbmQnO1xuICAgICAgdGV4dD86IHN0cmluZztcbiAgICB9O1xuICB9O1xufVxuIl19
|
package/dist/for-angular/esm2022/components/decaf-model-renderer/decaf-model-renderer.component.mjs
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Component, Input, ViewContainerRef, } from '@angular/core';
|
|
2
|
+
import { Model } from '@decaf-ts/decorator-validation';
|
|
3
|
+
import { IonSkeletonText } from '@ionic/angular/standalone';
|
|
4
|
+
import { NgComponentOutlet } from '@angular/common';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export class DecafModelRendererComponent {
|
|
7
|
+
//
|
|
8
|
+
// @ViewChild('componentElementContainer', {
|
|
9
|
+
// static: true,
|
|
10
|
+
// read: ViewContainerRef,
|
|
11
|
+
// })
|
|
12
|
+
// componentElementContainer!: ViewContainerRef;
|
|
13
|
+
constructor(vcr) {
|
|
14
|
+
this.vcr = vcr;
|
|
15
|
+
}
|
|
16
|
+
ngOnInit() {
|
|
17
|
+
this.model =
|
|
18
|
+
typeof this.model === 'string'
|
|
19
|
+
? Model.build({}, JSON.parse(this.model))
|
|
20
|
+
: this.model;
|
|
21
|
+
// this.output = RenderingEngine.render(this.model as unknown as Model);
|
|
22
|
+
// this.component = NgxRenderingEngine.components(this.output.tag);
|
|
23
|
+
// this.props = this.output.props;
|
|
24
|
+
// this.content = this.output.children?.map((child) => {
|
|
25
|
+
// return this.vcr.createEmbeddedView();
|
|
26
|
+
// });
|
|
27
|
+
}
|
|
28
|
+
ngOnChanges(changes) {
|
|
29
|
+
if (changes['model']) {
|
|
30
|
+
const { currentValue, previousValue, firstChange } = changes['model'];
|
|
31
|
+
}
|
|
32
|
+
if (changes['details']) {
|
|
33
|
+
const { currentValue, previousValue, firstChange } = changes['details'];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DecafModelRendererComponent, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
37
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DecafModelRendererComponent, isStandalone: true, selector: "decaf-model-renderer", inputs: { model: "model" }, usesOnChanges: true, ngImport: i0, template: "<!--<div #loadingElement>-->\n<!-- <ion-skeleton-text [animated]=\"true\" style=\"width: 100%;\"></ion-skeleton-text>-->\n<!--</div>-->\n@if (output?.children?.length){\n @for (item of output.children; track item.props.name){\n <ng-template>{{item.props.name}}</ng-template>\n }\n}\n<ng-container *ngComponentOutlet=\"component;\n inputs: props;\n content: content;\">\n</ng-container>\n", styles: [""], dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }] }); }
|
|
38
|
+
}
|
|
39
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DecafModelRendererComponent, decorators: [{
|
|
40
|
+
type: Component,
|
|
41
|
+
args: [{ standalone: true, imports: [IonSkeletonText, NgComponentOutlet], selector: 'decaf-model-renderer', template: "<!--<div #loadingElement>-->\n<!-- <ion-skeleton-text [animated]=\"true\" style=\"width: 100%;\"></ion-skeleton-text>-->\n<!--</div>-->\n@if (output?.children?.length){\n @for (item of output.children; track item.props.name){\n <ng-template>{{item.props.name}}</ng-template>\n }\n}\n<ng-container *ngComponentOutlet=\"component;\n inputs: props;\n content: content;\">\n</ng-container>\n" }]
|
|
42
|
+
}], ctorParameters: () => [{ type: i0.ViewContainerRef }], propDecorators: { model: [{
|
|
43
|
+
type: Input,
|
|
44
|
+
args: [{ required: true }]
|
|
45
|
+
}] } });
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjYWYtbW9kZWwtcmVuZGVyZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2RlY2FmLW1vZGVsLXJlbmRlcmVyL2RlY2FmLW1vZGVsLXJlbmRlcmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9kZWNhZi1tb2RlbC1yZW5kZXJlci9kZWNhZi1tb2RlbC1yZW5kZXJlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFJTCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUU1RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFVcEQsTUFBTSxPQUFPLDJCQUEyQjtJQWF0QyxFQUFFO0lBQ0YsNENBQTRDO0lBQzVDLGtCQUFrQjtJQUNsQiw0QkFBNEI7SUFDNUIsS0FBSztJQUNMLGdEQUFnRDtJQUVoRCxZQUFvQixHQUFxQjtRQUFyQixRQUFHLEdBQUgsR0FBRyxDQUFrQjtJQUFHLENBQUM7SUFFN0MsUUFBUTtRQUNOLElBQUksQ0FBQyxLQUFLO1lBQ1IsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVE7Z0JBQzVCLENBQUMsQ0FBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBTztnQkFDaEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDakIsd0VBQXdFO1FBQ3hFLG1FQUFtRTtRQUNuRSxrQ0FBa0M7UUFDbEMsd0RBQXdEO1FBQ3hELDBDQUEwQztRQUMxQyxNQUFNO0lBQ1IsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUN2QixNQUFNLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUUsQ0FBQztJQUNILENBQUM7K0dBMUNVLDJCQUEyQjttR0FBM0IsMkJBQTJCLGlJQ3RCeEMsNmNBWUEsMERESTZCLGlCQUFpQjs7NEZBTWpDLDJCQUEyQjtrQkFSdkMsU0FBUztpQ0FDSSxJQUFJLFdBQ1AsQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLENBQUMsWUFFbkMsc0JBQXNCO3FGQVFoQyxLQUFLO3NCQURKLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmllbGREZWZpbml0aW9uIH0gZnJvbSAnQGRlY2FmLXRzL3VpLWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb24nO1xuaW1wb3J0IHsgSW9uU2tlbGV0b25UZXh0IH0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBBbmd1bGFyRmllbGREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IE5nQ29tcG9uZW50T3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtJb25Ta2VsZXRvblRleHQsIE5nQ29tcG9uZW50T3V0bGV0XSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdkZWNhZi1tb2RlbC1yZW5kZXJlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kZWNhZi1tb2RlbC1yZW5kZXJlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9kZWNhZi1tb2RlbC1yZW5kZXJlci5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIERlY2FmTW9kZWxSZW5kZXJlckNvbXBvbmVudDxNIGV4dGVuZHMgTW9kZWw+XG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXNcbntcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgbW9kZWwhOiBNIHwgc3RyaW5nO1xuXG4gIGNvbXBvbmVudCE6IHVua25vd247XG5cbiAgcHJvcHMhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICBjb250ZW50ITogeyBpZDogc3RyaW5nIH1bXVtdO1xuXG4gIG91dHB1dCE6IEZpZWxkRGVmaW5pdGlvbjxBbmd1bGFyRmllbGREZWZpbml0aW9uPjtcbiAgLy9cbiAgLy8gQFZpZXdDaGlsZCgnY29tcG9uZW50RWxlbWVudENvbnRhaW5lcicsIHtcbiAgLy8gICBzdGF0aWM6IHRydWUsXG4gIC8vICAgcmVhZDogVmlld0NvbnRhaW5lclJlZixcbiAgLy8gfSlcbiAgLy8gY29tcG9uZW50RWxlbWVudENvbnRhaW5lciE6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSB2Y3I6IFZpZXdDb250YWluZXJSZWYpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5tb2RlbCA9XG4gICAgICB0eXBlb2YgdGhpcy5tb2RlbCA9PT0gJ3N0cmluZydcbiAgICAgICAgPyAoTW9kZWwuYnVpbGQoe30sIEpTT04ucGFyc2UodGhpcy5tb2RlbCkpIGFzIE0pXG4gICAgICAgIDogdGhpcy5tb2RlbDtcbiAgICAvLyB0aGlzLm91dHB1dCA9IFJlbmRlcmluZ0VuZ2luZS5yZW5kZXIodGhpcy5tb2RlbCBhcyB1bmtub3duIGFzIE1vZGVsKTtcbiAgICAvLyB0aGlzLmNvbXBvbmVudCA9IE5neFJlbmRlcmluZ0VuZ2luZS5jb21wb25lbnRzKHRoaXMub3V0cHV0LnRhZyk7XG4gICAgLy8gdGhpcy5wcm9wcyA9IHRoaXMub3V0cHV0LnByb3BzO1xuICAgIC8vIHRoaXMuY29udGVudCA9IHRoaXMub3V0cHV0LmNoaWxkcmVuPy5tYXAoKGNoaWxkKSA9PiB7XG4gICAgLy8gICByZXR1cm4gdGhpcy52Y3IuY3JlYXRlRW1iZWRkZWRWaWV3KCk7XG4gICAgLy8gfSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ21vZGVsJ10pIHtcbiAgICAgIGNvbnN0IHsgY3VycmVudFZhbHVlLCBwcmV2aW91c1ZhbHVlLCBmaXJzdENoYW5nZSB9ID0gY2hhbmdlc1snbW9kZWwnXTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2RldGFpbHMnXSkge1xuICAgICAgY29uc3QgeyBjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUsIGZpcnN0Q2hhbmdlIH0gPSBjaGFuZ2VzWydkZXRhaWxzJ107XG4gICAgfVxuICB9XG4gIC8vIC8vXG4gIC8vIG5nT25EZXN0cm95KCk6IHZvaWQge31cbn1cbiIsIjwhLS08ZGl2ICNsb2FkaW5nRWxlbWVudD4tLT5cbjwhLS0gIDxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwidHJ1ZVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+PC9pb24tc2tlbGV0b24tdGV4dD4tLT5cbjwhLS08L2Rpdj4tLT5cbkBpZiAob3V0cHV0Py5jaGlsZHJlbj8ubGVuZ3RoKXtcbiAgQGZvciAoaXRlbSBvZiBvdXRwdXQuY2hpbGRyZW47IHRyYWNrIGl0ZW0ucHJvcHMubmFtZSl7XG4gICAgPG5nLXRlbXBsYXRlPnt7aXRlbS5wcm9wcy5uYW1lfX08L25nLXRlbXBsYXRlPlxuICB9XG59XG48bmctY29udGFpbmVyICpuZ0NvbXBvbmVudE91dGxldD1cImNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IHByb3BzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQ7XCI+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-apis';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjYWYtdHMtZm9yLWFuZ3VsYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2RlY2FmLXRzLWZvci1hbmd1bGFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaXMnO1xuIl19
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Directive, HostBinding, Input } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class DecafFieldDirective {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.name = this.fieldName;
|
|
6
|
+
}
|
|
7
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DecafFieldDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
8
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: DecafFieldDirective, isStandalone: true, selector: "[appDecafField]", inputs: { fieldName: ["appDecafField", "fieldName"] }, host: { properties: { "#name": "this.name" } }, ngImport: i0 }); }
|
|
9
|
+
}
|
|
10
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DecafFieldDirective, decorators: [{
|
|
11
|
+
type: Directive,
|
|
12
|
+
args: [{
|
|
13
|
+
selector: '[appDecafField]',
|
|
14
|
+
standalone: true,
|
|
15
|
+
}]
|
|
16
|
+
}], ctorParameters: () => [], propDecorators: { fieldName: [{
|
|
17
|
+
type: Input,
|
|
18
|
+
args: [{ alias: 'appDecafField' }]
|
|
19
|
+
}], name: [{
|
|
20
|
+
type: HostBinding,
|
|
21
|
+
args: ['#name']
|
|
22
|
+
}] } });
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjYWYtZmllbGQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9kaXJlY3RpdmVzL2RlY2FmLWZpZWxkLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBTTlELE1BQU0sT0FBTyxtQkFBbUI7SUFLOUI7UUFDRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDN0IsQ0FBQzsrR0FQVSxtQkFBbUI7bUdBQW5CLG1CQUFtQjs7NEZBQW5CLG1CQUFtQjtrQkFKL0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsaUJBQWlCO29CQUMzQixVQUFVLEVBQUUsSUFBSTtpQkFDakI7d0RBRW9DLFNBQVM7c0JBQTNDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFO2dCQUVYLElBQUk7c0JBQXpCLFdBQVc7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgSG9zdEJpbmRpbmcsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1thcHBEZWNhZkZpZWxkXScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIERlY2FmRmllbGREaXJlY3RpdmUge1xuICBASW5wdXQoeyBhbGlhczogJ2FwcERlY2FmRmllbGQnIH0pIGZpZWxkTmFtZSE6IHN0cmluZztcblxuICBASG9zdEJpbmRpbmcoJyNuYW1lJykgbmFtZSE6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm5hbWUgPSB0aGlzLmZpZWxkTmFtZTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export class DynamicModule {
|
|
2
|
+
}
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRHluYW1pY01vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL0R5bmFtaWNNb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFnQixhQUFhO0NBQUciLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgYWJzdHJhY3QgY2xhc3MgRHluYW1pY01vZHVsZSB7fVxuIl19
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { InternalError, OperationKeys, } from '@decaf-ts/db-decorators';
|
|
2
|
+
import { NgxFormService } from './NgxFormService';
|
|
3
|
+
import { sf } from '@decaf-ts/decorator-validation';
|
|
4
|
+
/**
|
|
5
|
+
* @class NgxCrudFormField
|
|
6
|
+
* @implements {CrudFormField<AngularFieldDefinition>}
|
|
7
|
+
* @implements {ControlValueAccessor}
|
|
8
|
+
* @summary Abstract class representing a CRUD form field for Angular applications
|
|
9
|
+
* @description This class provides the base implementation for CRUD form fields in Angular,
|
|
10
|
+
* implementing both CrudFormField and ControlValueAccessor interfaces.
|
|
11
|
+
*/
|
|
12
|
+
export class NgxCrudFormField {
|
|
13
|
+
constructor() {
|
|
14
|
+
/**
|
|
15
|
+
* @summary String formatting function
|
|
16
|
+
* @description Provides access to the sf function for error message formatting
|
|
17
|
+
*/
|
|
18
|
+
this.sf = sf;
|
|
19
|
+
/**
|
|
20
|
+
* @summary Change callback function
|
|
21
|
+
* @description Function called when the field value changes
|
|
22
|
+
*/
|
|
23
|
+
this.onChange = () => { };
|
|
24
|
+
/**
|
|
25
|
+
* @summary Touch callback function
|
|
26
|
+
* @description Function called when the field is touched
|
|
27
|
+
*/
|
|
28
|
+
this.onTouch = () => { };
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* @summary Write value to the field
|
|
32
|
+
* @description Sets the value of the field
|
|
33
|
+
* @param {string} obj - The value to be set
|
|
34
|
+
*/
|
|
35
|
+
writeValue(obj) {
|
|
36
|
+
this.value = obj;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* @summary Register change callback
|
|
40
|
+
* @description Registers a function to be called when the field value changes
|
|
41
|
+
* @param {() => unknown} fn - The function to be called on change
|
|
42
|
+
*/
|
|
43
|
+
registerOnChange(fn) {
|
|
44
|
+
this.onChange = fn;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* @summary Register touch callback
|
|
48
|
+
* @description Registers a function to be called when the field is touched
|
|
49
|
+
* @param {() => unknown} fn - The function to be called on touch
|
|
50
|
+
*/
|
|
51
|
+
registerOnTouched(fn) {
|
|
52
|
+
this.onTouch = fn;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* @summary Set disabled state
|
|
56
|
+
* @description Sets the disabled state of the field
|
|
57
|
+
* @param {boolean} isDisabled - Whether the field should be disabled
|
|
58
|
+
*/
|
|
59
|
+
setDisabledState(isDisabled) {
|
|
60
|
+
this.props.disabled = isDisabled;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* @summary After view initialization logic
|
|
64
|
+
* @description Performs necessary setup after the view has been initialized
|
|
65
|
+
* @returns {HTMLElement} The parent element of the field
|
|
66
|
+
*/
|
|
67
|
+
afterViewInit() {
|
|
68
|
+
let parent;
|
|
69
|
+
switch (this.operation) {
|
|
70
|
+
case OperationKeys.CREATE:
|
|
71
|
+
case OperationKeys.UPDATE:
|
|
72
|
+
case OperationKeys.DELETE:
|
|
73
|
+
try {
|
|
74
|
+
parent = NgxFormService.getParentEl(this.component.nativeElement, 'form');
|
|
75
|
+
}
|
|
76
|
+
catch (e) {
|
|
77
|
+
throw new Error(`Unable to retrieve parent form element for the ${this.operation}: ${e instanceof Error ? e.message : e}`);
|
|
78
|
+
}
|
|
79
|
+
NgxFormService.register(parent.id, this.formGroup, this.props);
|
|
80
|
+
return parent;
|
|
81
|
+
default:
|
|
82
|
+
throw new Error(`Invalid operation: ${this.operation}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* @summary Cleanup on component destruction
|
|
87
|
+
* @description Unregisters the field when the component is destroyed
|
|
88
|
+
*/
|
|
89
|
+
onDestroy() {
|
|
90
|
+
if (this.parent)
|
|
91
|
+
NgxFormService.unregister(this.parent.id, this.component.nativeElement);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* @summary Initialize the field
|
|
95
|
+
* @description Sets up the form group and field name
|
|
96
|
+
* @param {FieldUpdateMode} updateOn - The update mode for the field
|
|
97
|
+
*/
|
|
98
|
+
onInit(updateOn) {
|
|
99
|
+
if (!this.props || !this.operation)
|
|
100
|
+
throw new InternalError(`props and operation are required`);
|
|
101
|
+
this.formGroup = NgxFormService.fromProps(this.props, updateOn);
|
|
102
|
+
this.name = this.props.name;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* @summary Get field errors
|
|
106
|
+
* @description Retrieves all errors associated with the field
|
|
107
|
+
* @returns {{key: string, message: string}[]} An array of error objects
|
|
108
|
+
*/
|
|
109
|
+
getErrors() {
|
|
110
|
+
return Object.entries(this.formGroup.controls).reduce((accum, [prop, control]) => {
|
|
111
|
+
Object.entries(control.errors).forEach(([k, c]) => {
|
|
112
|
+
accum.push({ key: k, message: k });
|
|
113
|
+
});
|
|
114
|
+
return accum;
|
|
115
|
+
}, []);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmd4Q3J1ZEZvcm1GaWVsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL05neENydWRGb3JtRmllbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUVMLGFBQWEsRUFDYixhQUFhLEdBQ2QsTUFBTSx5QkFBeUIsQ0FBQztBQUdqQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXBEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLE9BQWdCLGdCQUFnQjtJQUF0QztRQTZDRTs7O1dBR0c7UUFDSCxPQUFFLEdBQUcsRUFBRSxDQUFDO1FBRVI7OztXQUdHO1FBQ0gsYUFBUSxHQUFrQixHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFFbkM7OztXQUdHO1FBQ0gsWUFBTyxHQUFrQixHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7SUF5R3BDLENBQUM7SUF2R0M7Ozs7T0FJRztJQUNILFVBQVUsQ0FBQyxHQUFXO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsZ0JBQWdCLENBQUMsRUFBaUI7UUFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxpQkFBaUIsQ0FBQyxFQUFpQjtRQUNqQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGdCQUFnQixDQUFFLFVBQW1CO1FBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGFBQWE7UUFDWCxJQUFJLE1BQW1CLENBQUM7UUFDeEIsUUFBUSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdkIsS0FBSyxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQzFCLEtBQUssYUFBYSxDQUFDLE1BQU0sQ0FBQztZQUMxQixLQUFLLGFBQWEsQ0FBQyxNQUFNO2dCQUN2QixJQUFJLENBQUM7b0JBQ0gsTUFBTSxHQUFHLGNBQWMsQ0FBQyxXQUFXLENBQ2pDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUM1QixNQUFNLENBQ1AsQ0FBQztnQkFDSixDQUFDO2dCQUFDLE9BQU8sQ0FBVSxFQUFFLENBQUM7b0JBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0RBQWtELElBQUksQ0FBQyxTQUFTLEtBQUssQ0FBQyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQzFHLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQy9ELE9BQU8sTUFBTSxDQUFDO1lBQ2hCO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQzVELENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsU0FBUztRQUNQLElBQUksSUFBSSxDQUFDLE1BQU07WUFDYixjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsUUFBeUI7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztZQUNoQyxNQUFNLElBQUksYUFBYSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFNBQVM7UUFDUCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQ25ELENBQUMsS0FBeUMsRUFBRSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFO1lBQzdELE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQWlDLENBQUMsQ0FBQyxPQUFPLENBQy9ELENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDVCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyQyxDQUFDLENBQ0YsQ0FBQztZQUNGLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxFQUNELEVBQUUsQ0FDSCxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3J1ZEZvcm1GaWVsZCB9IGZyb20gJ0BkZWNhZi10cy91aS1kZWNvcmF0b3JzJztcbmltcG9ydCB7IEFuZ3VsYXJGaWVsZERlZmluaXRpb24sIEZpZWxkVXBkYXRlTW9kZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgQ3J1ZE9wZXJhdGlvbnMsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gJ0BkZWNhZi10cy9kYi1kZWNvcmF0b3JzJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ3hGb3JtU2VydmljZSB9IGZyb20gJy4vTmd4Rm9ybVNlcnZpY2UnO1xuaW1wb3J0IHsgc2YgfSBmcm9tICdAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb24nO1xuXG4vKipcbiAqIEBjbGFzcyBOZ3hDcnVkRm9ybUZpZWxkXG4gKiBAaW1wbGVtZW50cyB7Q3J1ZEZvcm1GaWVsZDxBbmd1bGFyRmllbGREZWZpbml0aW9uPn1cbiAqIEBpbXBsZW1lbnRzIHtDb250cm9sVmFsdWVBY2Nlc3Nvcn1cbiAqIEBzdW1tYXJ5IEFic3RyYWN0IGNsYXNzIHJlcHJlc2VudGluZyBhIENSVUQgZm9ybSBmaWVsZCBmb3IgQW5ndWxhciBhcHBsaWNhdGlvbnNcbiAqIEBkZXNjcmlwdGlvbiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uIGZvciBDUlVEIGZvcm0gZmllbGRzIGluIEFuZ3VsYXIsXG4gKiBpbXBsZW1lbnRpbmcgYm90aCBDcnVkRm9ybUZpZWxkIGFuZCBDb250cm9sVmFsdWVBY2Nlc3NvciBpbnRlcmZhY2VzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTmd4Q3J1ZEZvcm1GaWVsZFxuICBpbXBsZW1lbnRzIENydWRGb3JtRmllbGQ8QW5ndWxhckZpZWxkRGVmaW5pdGlvbj4sIENvbnRyb2xWYWx1ZUFjY2Vzc29yXG57XG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZWZlcmVuY2UgdG8gdGhlIGNvbXBvbmVudCdzIGVsZW1lbnRcbiAgICogQGRlc2NyaXB0aW9uIEVsZW1lbnRSZWYgcmVwcmVzZW50aW5nIHRoZSBjb21wb25lbnQncyBuYXRpdmUgZWxlbWVudFxuICAgKi9cbiAgY29tcG9uZW50ITogRWxlbWVudFJlZjtcblxuICAvKipcbiAgICogQHN1bW1hcnkgQ3VycmVudCBDUlVEIG9wZXJhdGlvblxuICAgKiBAZGVzY3JpcHRpb24gUmVwcmVzZW50cyB0aGUgY3VycmVudCBDUlVEIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWRcbiAgICovXG4gIG9wZXJhdGlvbiE6IENydWRPcGVyYXRpb25zO1xuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBGaWVsZCBwcm9wZXJ0aWVzXG4gICAqIEBkZXNjcmlwdGlvbiBBbmd1bGFyLXNwZWNpZmljIGZpZWxkIGRlZmluaXRpb24gcHJvcGVydGllc1xuICAgKi9cbiAgcHJvcHMhOiBBbmd1bGFyRmllbGREZWZpbml0aW9uO1xuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBGb3JtIGdyb3VwIGZvciB0aGUgZmllbGRcbiAgICogQGRlc2NyaXB0aW9uIEFuZ3VsYXIgRm9ybUdyb3VwIGluc3RhbmNlIGZvciB0aGUgZmllbGRcbiAgICovXG4gIGZvcm1Hcm91cCE6IEZvcm1Hcm91cDtcblxuICAvKipcbiAgICogQHN1bW1hcnkgRmllbGQgbmFtZVxuICAgKiBAZGVzY3JpcHRpb24gTmFtZSBvZiB0aGUgZm9ybSBmaWVsZFxuICAgKi9cbiAgbmFtZSE6IHN0cmluZztcblxuICAvKipcbiAgICogQHN1bW1hcnkgRmllbGQgdmFsdWVcbiAgICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgdmFsdWUgb2YgdGhlIGZvcm0gZmllbGRcbiAgICovXG4gIHZhbHVlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBQYXJlbnQgSFRNTCBlbGVtZW50XG4gICAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBIVE1MIGVsZW1lbnQgb2YgdGhlIGZpZWxkXG4gICAqL1xuICBwcm90ZWN0ZWQgcGFyZW50PzogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFN0cmluZyBmb3JtYXR0aW5nIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHNmIGZ1bmN0aW9uIGZvciBlcnJvciBtZXNzYWdlIGZvcm1hdHRpbmdcbiAgICovXG4gIHNmID0gc2Y7XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENoYW5nZSBjYWxsYmFjayBmdW5jdGlvblxuICAgKiBAZGVzY3JpcHRpb24gRnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGZpZWxkIHZhbHVlIGNoYW5nZXNcbiAgICovXG4gIG9uQ2hhbmdlOiAoKSA9PiB1bmtub3duID0gKCkgPT4ge307XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFRvdWNoIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgZmllbGQgaXMgdG91Y2hlZFxuICAgKi9cbiAgb25Ub3VjaDogKCkgPT4gdW5rbm93biA9ICgpID0+IHt9O1xuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBXcml0ZSB2YWx1ZSB0byB0aGUgZmllbGRcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqIC0gVGhlIHZhbHVlIHRvIGJlIHNldFxuICAgKi9cbiAgd3JpdGVWYWx1ZShvYmo6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSBvYmo7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVnaXN0ZXIgY2hhbmdlIGNhbGxiYWNrXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZmllbGQgdmFsdWUgY2hhbmdlc1xuICAgKiBAcGFyYW0geygpID0+IHVua25vd259IGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBjaGFuZ2VcbiAgICovXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICgpID0+IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVnaXN0ZXIgdG91Y2ggY2FsbGJhY2tcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBmaWVsZCBpcyB0b3VjaGVkXG4gICAqIEBwYXJhbSB7KCkgPT4gdW5rbm93bn0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIHRvdWNoXG4gICAqL1xuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaCA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFNldCBkaXNhYmxlZCBzdGF0ZVxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgZGlzYWJsZWQgc3RhdGUgb2YgdGhlIGZpZWxkXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNEaXNhYmxlZCAtIFdoZXRoZXIgdGhlIGZpZWxkIHNob3VsZCBiZSBkaXNhYmxlZFxuICAgKi9cbiAgc2V0RGlzYWJsZWRTdGF0ZT8oaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucHJvcHMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEFmdGVyIHZpZXcgaW5pdGlhbGl6YXRpb24gbG9naWNcbiAgICogQGRlc2NyaXB0aW9uIFBlcmZvcm1zIG5lY2Vzc2FyeSBzZXR1cCBhZnRlciB0aGUgdmlldyBoYXMgYmVlbiBpbml0aWFsaXplZFxuICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9IFRoZSBwYXJlbnQgZWxlbWVudCBvZiB0aGUgZmllbGRcbiAgICovXG4gIGFmdGVyVmlld0luaXQoKTogSFRNTEVsZW1lbnQge1xuICAgIGxldCBwYXJlbnQ6IEhUTUxFbGVtZW50O1xuICAgIHN3aXRjaCAodGhpcy5vcGVyYXRpb24pIHtcbiAgICAgIGNhc2UgT3BlcmF0aW9uS2V5cy5DUkVBVEU6XG4gICAgICBjYXNlIE9wZXJhdGlvbktleXMuVVBEQVRFOlxuICAgICAgY2FzZSBPcGVyYXRpb25LZXlzLkRFTEVURTpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJlbnQgPSBOZ3hGb3JtU2VydmljZS5nZXRQYXJlbnRFbChcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAnZm9ybScsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBVbmFibGUgdG8gcmV0cmlldmUgcGFyZW50IGZvcm0gZWxlbWVudCBmb3IgdGhlICR7dGhpcy5vcGVyYXRpb259OiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IGV9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIE5neEZvcm1TZXJ2aWNlLnJlZ2lzdGVyKHBhcmVudC5pZCwgdGhpcy5mb3JtR3JvdXAsIHRoaXMucHJvcHMpO1xuICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9wZXJhdGlvbjogJHt0aGlzLm9wZXJhdGlvbn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgQ2xlYW51cCBvbiBjb21wb25lbnQgZGVzdHJ1Y3Rpb25cbiAgICogQGRlc2NyaXB0aW9uIFVucmVnaXN0ZXJzIHRoZSBmaWVsZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkXG4gICAqL1xuICBvbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFyZW50KVxuICAgICAgTmd4Rm9ybVNlcnZpY2UudW5yZWdpc3Rlcih0aGlzLnBhcmVudC5pZCwgdGhpcy5jb21wb25lbnQubmF0aXZlRWxlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZSB0aGUgZmllbGRcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdXAgdGhlIGZvcm0gZ3JvdXAgYW5kIGZpZWxkIG5hbWVcbiAgICogQHBhcmFtIHtGaWVsZFVwZGF0ZU1vZGV9IHVwZGF0ZU9uIC0gVGhlIHVwZGF0ZSBtb2RlIGZvciB0aGUgZmllbGRcbiAgICovXG4gIG9uSW5pdCh1cGRhdGVPbjogRmllbGRVcGRhdGVNb2RlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnByb3BzIHx8ICF0aGlzLm9wZXJhdGlvbilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBwcm9wcyBhbmQgb3BlcmF0aW9uIGFyZSByZXF1aXJlZGApO1xuICAgIHRoaXMuZm9ybUdyb3VwID0gTmd4Rm9ybVNlcnZpY2UuZnJvbVByb3BzKHRoaXMucHJvcHMsIHVwZGF0ZU9uKTtcbiAgICB0aGlzLm5hbWUgPSB0aGlzLnByb3BzLm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgR2V0IGZpZWxkIGVycm9yc1xuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGFsbCBlcnJvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWVsZFxuICAgKiBAcmV0dXJucyB7e2tleTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmd9W119IEFuIGFycmF5IG9mIGVycm9yIG9iamVjdHNcbiAgICovXG4gIGdldEVycm9ycygpOiB7IGtleTogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmcgfVtdIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5mb3JtR3JvdXAuY29udHJvbHMpLnJlZHVjZShcbiAgICAgIChhY2N1bTogeyBrZXk6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nIH1bXSwgW3Byb3AsIGNvbnRyb2xdKSA9PiB7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGNvbnRyb2wuZXJyb3JzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5mb3JFYWNoKFxuICAgICAgICAgIChbaywgY10pID0+IHtcbiAgICAgICAgICAgIGFjY3VtLnB1c2goeyBrZXk6IGssIG1lc3NhZ2U6IGsgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSxcbiAgICAgIFtdLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { escapeHtml, HTML5CheckTypes, HTML5InputTypes, parseToNumber, } from '@decaf-ts/ui-decorators';
|
|
2
|
+
import { FormControl, FormGroup, Validators, } from '@angular/forms';
|
|
3
|
+
import { Validation } from '@decaf-ts/decorator-validation';
|
|
4
|
+
import { AngularEngineKeys } from './constants';
|
|
5
|
+
import { ValidatorFactory } from './ValidatorFactory';
|
|
6
|
+
/**
|
|
7
|
+
* @summary Service for managing Angular forms and form controls.
|
|
8
|
+
* @description
|
|
9
|
+
* The NgxFormService provides utility methods for handling form initialization,
|
|
10
|
+
* validation, data retrieval, and form control management in Angular applications.
|
|
11
|
+
* It offers a centralized way to manage form controls, perform validations, and
|
|
12
|
+
* handle form-related operations.
|
|
13
|
+
*/
|
|
14
|
+
export class NgxFormService {
|
|
15
|
+
/**
|
|
16
|
+
* @summary Storage for form controls.
|
|
17
|
+
* @description
|
|
18
|
+
* A static object that stores form controls indexed by form ID and field name.
|
|
19
|
+
* @type {Record<string, Record<string, { control: FormGroup; props: AngularFieldDefinition }>>}
|
|
20
|
+
*/
|
|
21
|
+
static { this.controls = {}; }
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
23
|
+
constructor() { }
|
|
24
|
+
/**
|
|
25
|
+
* Initializes the form after the view has been initialized.
|
|
26
|
+
* This method sets up the form controls and creates a FormGroup.
|
|
27
|
+
*
|
|
28
|
+
* @param el - The form element to initialize.
|
|
29
|
+
* @param formId - The unique identifier for the form.
|
|
30
|
+
* @param formUpdateMode - The update mode for the form. Defaults to 'blur'.
|
|
31
|
+
*/
|
|
32
|
+
/**
|
|
33
|
+
* @summary Initializes the form after view initialization.
|
|
34
|
+
* @description
|
|
35
|
+
* Sets up form controls and creates a FormGroup for the given form element.
|
|
36
|
+
*
|
|
37
|
+
* @param {FormElement} el - The form element to initialize.
|
|
38
|
+
* @param {string} formId - The unique identifier for the form.
|
|
39
|
+
* @param {FieldUpdateMode} [formUpdateMode='blur'] - The update mode for the form.
|
|
40
|
+
*/
|
|
41
|
+
static formAfterViewInit(el, formId, formUpdateMode = 'blur') {
|
|
42
|
+
const selector = `*[${AngularEngineKeys.NG_REFLECT}name]`;
|
|
43
|
+
const elements = Array.from(el.component.nativeElement.querySelectorAll(selector));
|
|
44
|
+
const controls = elements.map((f) => {
|
|
45
|
+
const fieldName = f
|
|
46
|
+
.attributes[`${AngularEngineKeys.NG_REFLECT}name`].value;
|
|
47
|
+
const control = NgxFormService.getFieldByName(formId, fieldName);
|
|
48
|
+
return control.control;
|
|
49
|
+
});
|
|
50
|
+
el.formGroup = new FormGroup(controls, {
|
|
51
|
+
updateOn: formUpdateMode,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* @summary Handles form component destruction.
|
|
56
|
+
* @description
|
|
57
|
+
* Unregisters the form from the service when the component is destroyed.
|
|
58
|
+
*
|
|
59
|
+
* @param {FormElement} el - The form element being destroyed.
|
|
60
|
+
* @param {string} formId - The unique identifier of the form to unregister.
|
|
61
|
+
*/
|
|
62
|
+
static forOnDestroy(el, formId) {
|
|
63
|
+
NgxFormService.unregister(formId, el.component.nativeElement);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* @summary Retrieves form data for a given form ID.
|
|
67
|
+
* @description
|
|
68
|
+
* Processes form controls and returns their values as an object.
|
|
69
|
+
*
|
|
70
|
+
* @param {string} formId - The unique identifier of the form to retrieve data from.
|
|
71
|
+
* @returns {Record<string, unknown>} An object containing the form data.
|
|
72
|
+
* @throws {Error} If the form with the given ID is not found.
|
|
73
|
+
*/
|
|
74
|
+
static getFormData(formId) {
|
|
75
|
+
if (!(formId in this.controls))
|
|
76
|
+
throw new Error(`form ${formId} not found`);
|
|
77
|
+
const form = this.controls[formId];
|
|
78
|
+
let control;
|
|
79
|
+
let val;
|
|
80
|
+
const data = {};
|
|
81
|
+
for (const key in form) {
|
|
82
|
+
control = form[key].control;
|
|
83
|
+
if (!HTML5CheckTypes.includes(form[key].props.type)) {
|
|
84
|
+
switch (form[key].props.type) {
|
|
85
|
+
case HTML5InputTypes.NUMBER:
|
|
86
|
+
val = parseToNumber(control.value);
|
|
87
|
+
break;
|
|
88
|
+
case HTML5InputTypes.DATE:
|
|
89
|
+
case HTML5InputTypes.DATETIME_LOCAL:
|
|
90
|
+
val = new Date(control.value[key]);
|
|
91
|
+
break;
|
|
92
|
+
default:
|
|
93
|
+
val = escapeHtml(control.value[key]);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
val = control.value;
|
|
98
|
+
}
|
|
99
|
+
data[key] = val;
|
|
100
|
+
}
|
|
101
|
+
return data;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* @summary Validates form fields.
|
|
105
|
+
* @description
|
|
106
|
+
* Validates either a specific field or all fields in the form group.
|
|
107
|
+
*
|
|
108
|
+
* @param {FormGroup} formGroup - The FormGroup to validate.
|
|
109
|
+
* @param {string} [fieldName] - Optional name of a specific field to validate.
|
|
110
|
+
* @returns {boolean} Indicates whether the validation passed (true) or failed (false).
|
|
111
|
+
*/
|
|
112
|
+
static validateFields(formGroup, fieldName) {
|
|
113
|
+
function isValid(formGroup, fieldName) {
|
|
114
|
+
const control = formGroup.get(fieldName);
|
|
115
|
+
if (control instanceof FormControl) {
|
|
116
|
+
control.markAsTouched();
|
|
117
|
+
control.markAsDirty();
|
|
118
|
+
return !control.invalid;
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
throw new Error('This should be impossible');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (fieldName)
|
|
125
|
+
return isValid(formGroup, fieldName);
|
|
126
|
+
let isValidForm = true;
|
|
127
|
+
for (const fg of formGroup.controls) {
|
|
128
|
+
for (const key in fg.controls) {
|
|
129
|
+
const validate = isValid(fg, key);
|
|
130
|
+
if (!validate)
|
|
131
|
+
isValidForm = false;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return isValidForm;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* @summary Creates a FormGroup from field properties.
|
|
138
|
+
* @description
|
|
139
|
+
* Generates a new FormGroup instance based on the provided field definition and update mode.
|
|
140
|
+
*
|
|
141
|
+
* @param {AngularFieldDefinition} props - The Angular field definition properties.
|
|
142
|
+
* @param {FieldUpdateMode} updateMode - The update mode for the form group.
|
|
143
|
+
* @returns {FormGroup} A new FormGroup instance.
|
|
144
|
+
*/
|
|
145
|
+
static fromProps(props, updateMode) {
|
|
146
|
+
const controls = {};
|
|
147
|
+
const validators = this.validatorsFromProps(props);
|
|
148
|
+
const composed = validators.length ? Validators.compose(validators) : null;
|
|
149
|
+
controls[props.name] = new FormControl({
|
|
150
|
+
value: props.value && props.type !== HTML5InputTypes.CHECKBOX
|
|
151
|
+
? props.value
|
|
152
|
+
: undefined,
|
|
153
|
+
disabled: props.disabled,
|
|
154
|
+
}, composed);
|
|
155
|
+
return new FormGroup(controls, { updateOn: updateMode });
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Retrieves a form by its ID from the stored controls.
|
|
159
|
+
*
|
|
160
|
+
* @param id - The unique identifier of the form to retrieve.
|
|
161
|
+
* @returns The form controls associated with the given ID.
|
|
162
|
+
* @throws Error if the form with the given ID is not found.
|
|
163
|
+
*/
|
|
164
|
+
static getFormById(id) {
|
|
165
|
+
if (!(id in NgxFormService.controls))
|
|
166
|
+
throw new Error(`Could not find formId ${id}`);
|
|
167
|
+
return NgxFormService.controls[id];
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Retrieves a specific field from a form by its name.
|
|
171
|
+
*
|
|
172
|
+
* @param formId - The unique identifier of the form.
|
|
173
|
+
* @param name - The name of the field to retrieve.
|
|
174
|
+
* @returns The field control and properties.
|
|
175
|
+
* @throws Error if the field is not found in the form.
|
|
176
|
+
*/
|
|
177
|
+
static getFieldByName(formId, name) {
|
|
178
|
+
const form = NgxFormService.getFormById(formId);
|
|
179
|
+
if (!(name in form))
|
|
180
|
+
throw new Error(`Could not find field ${name} in form`);
|
|
181
|
+
return form[name];
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Generates an array of validator functions from the provided field properties.
|
|
185
|
+
*
|
|
186
|
+
* @param props - The field properties containing validation rules.
|
|
187
|
+
* @returns An array of ValidatorFn instances.
|
|
188
|
+
*/
|
|
189
|
+
static validatorsFromProps(props) {
|
|
190
|
+
const supportedValidationKeys = Validation.keys();
|
|
191
|
+
return Object.keys(props)
|
|
192
|
+
.filter((k) => supportedValidationKeys.includes(k))
|
|
193
|
+
.map((k) => ValidatorFactory.spawn(k, props[k]));
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
*
|
|
197
|
+
* @param el
|
|
198
|
+
* @param tag
|
|
199
|
+
*
|
|
200
|
+
* @throws {Error} when no parent exists with the provided tag
|
|
201
|
+
*/
|
|
202
|
+
static getParentEl(el, tag) {
|
|
203
|
+
let parent;
|
|
204
|
+
while ((parent = el.parentElement) !== null) {
|
|
205
|
+
if (parent.tagName.toLowerCase() === tag.toLowerCase()) {
|
|
206
|
+
return parent;
|
|
207
|
+
}
|
|
208
|
+
el = parent;
|
|
209
|
+
}
|
|
210
|
+
throw new Error(`No parent with the tag ${tag} was found for provided element`);
|
|
211
|
+
}
|
|
212
|
+
static register(formId, control, props) {
|
|
213
|
+
this.controls[formId] = this.controls[formId] || {};
|
|
214
|
+
this.controls[formId][props.name] = {
|
|
215
|
+
control: control,
|
|
216
|
+
props: props,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Unregisters a form or a specific field from the service.
|
|
221
|
+
*
|
|
222
|
+
* @param formId - The unique identifier of the form.
|
|
223
|
+
* @param field - Optional. The specific field to unregister. If not provided, the entire form is unregistered.
|
|
224
|
+
*/
|
|
225
|
+
static unregister(formId, field) {
|
|
226
|
+
if (!field)
|
|
227
|
+
delete this.controls[formId];
|
|
228
|
+
else
|
|
229
|
+
delete this.controls[formId][field.name];
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmd4Rm9ybVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9OZ3hGb3JtU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxFQUVWLGVBQWUsRUFDZixlQUFlLEVBQ2YsYUFBYSxHQUNkLE1BQU0seUJBQXlCLENBQUM7QUFFakMsT0FBTyxFQUVMLFdBQVcsRUFDWCxTQUFTLEVBRVQsVUFBVSxHQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzVELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVoRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV0RDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFDekI7Ozs7O09BS0c7YUFDWSxhQUFRLEdBU25CLEVBQUUsQ0FBQztJQUVQLGdFQUFnRTtJQUNoRSxnQkFBdUIsQ0FBQztJQUV4Qjs7Ozs7OztPQU9HO0lBQ0g7Ozs7Ozs7O09BUUc7SUFDSCxNQUFNLENBQUMsaUJBQWlCLENBQ3RCLEVBQWUsRUFDZixNQUFjLEVBQ2QsaUJBQWtDLE1BQU07UUFFeEMsTUFBTSxRQUFRLEdBQUcsS0FBSyxpQkFBaUIsQ0FBQyxVQUFVLE9BQU8sQ0FBQztRQUMxRCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUN6QixFQUFFLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FDdEQsQ0FBQztRQUNGLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFVLEVBQUUsRUFBRTtZQUMzQyxNQUFNLFNBQVMsR0FBSSxDQUF1RDtpQkFDdkUsVUFBVSxDQUFDLEdBQUcsaUJBQWlCLENBQUMsVUFBVSxNQUFNLENBQUMs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SUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUN2RCxPQUFPLE1BQU0sQ0FBQztZQUNoQixDQUFDO1lBQ0QsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUNkLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUNiLDBCQUEwQixHQUFHLGlDQUFpQyxDQUMvRCxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFRLENBQ2IsTUFBYyxFQUNkLE9BQWtCLEVBQ2xCLEtBQStDO1FBRS9DLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUc7WUFDbEMsT0FBTyxFQUFFLE9BQU87WUFDaEIsS0FBSyxFQUFFLEtBQUs7U0FDYixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFjLEVBQUUsS0FBbUI7UUFDbkQsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7O1lBRXZDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBRSxLQUFxQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBlc2NhcGVIdG1sLFxuICBGaWVsZFByb3BlcnRpZXMsXG4gIEhUTUw1Q2hlY2tUeXBlcyxcbiAgSFRNTDVJbnB1dFR5cGVzLFxuICBwYXJzZVRvTnVtYmVyLFxufSBmcm9tICdAZGVjYWYtdHMvdWktZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBBbmd1bGFyRmllbGREZWZpbml0aW9uLCBGaWVsZFVwZGF0ZU1vZGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgRm9ybUNvbnRyb2wsXG4gIEZvcm1Hcm91cCxcbiAgVmFsaWRhdG9yRm4sXG4gIFZhbGlkYXRvcnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFZhbGlkYXRpb24gfSBmcm9tICdAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb24nO1xuaW1wb3J0IHsgQW5ndWxhckVuZ2luZUtleXMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBGb3JtRWxlbWVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgVmFsaWRhdG9yRmFjdG9yeSB9IGZyb20gJy4vVmFsaWRhdG9yRmFjdG9yeSc7XG5cbi8qKlxuICogQHN1bW1hcnkgU2VydmljZSBmb3IgbWFuYWdpbmcgQW5ndWxhciBmb3JtcyBhbmQgZm9ybSBjb250cm9scy5cbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIE5neEZvcm1TZXJ2aWNlIHByb3ZpZGVzIHV0aWxpdHkgbWV0aG9kcyBmb3IgaGFuZGxpbmcgZm9ybSBpbml0aWFsaXphdGlvbixcbiAqIHZhbGlkYXRpb24sIGRhdGEgcmV0cmlldmFsLCBhbmQgZm9ybSBjb250cm9sIG1hbmFnZW1lbnQgaW4gQW5ndWxhciBhcHBsaWNhdGlvbnMuXG4gKiBJdCBvZmZlcnMgYSBjZW50cmFsaXplZCB3YXkgdG8gbWFuYWdlIGZvcm0gY29udHJvbHMsIHBlcmZvcm0gdmFsaWRhdGlvbnMsIGFuZFxuICogaGFuZGxlIGZvcm0tcmVsYXRlZCBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgTmd4Rm9ybVNlcnZpY2Uge1xuICAvKipcbiAgICogQHN1bW1hcnkgU3RvcmFnZSBmb3IgZm9ybSBjb250cm9scy5cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgc3RhdGljIG9iamVjdCB0aGF0IHN0b3JlcyBmb3JtIGNvbnRyb2xzIGluZGV4ZWQgYnkgZm9ybSBJRCBhbmQgZmllbGQgbmFtZS5cbiAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHsgY29udHJvbDogRm9ybUdyb3VwOyBwcm9wczogQW5ndWxhckZpZWxkRGVmaW5pdGlvbiB9Pj59XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBjb250cm9sczogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBSZWNvcmQ8XG4gICAgICBzdHJpbmcsXG4gICAgICB7XG4gICAgICAgIGNvbnRyb2w6IEZvcm1Hcm91cDtcbiAgICAgICAgcHJvcHM6IEFuZ3VsYXJGaWVsZERlZmluaXRpb247XG4gICAgICB9XG4gICAgPlxuICA+ID0ge307XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGZvcm0gYWZ0ZXIgdGhlIHZpZXcgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXG4gICAqIFRoaXMgbWV0aG9kIHNldHMgdXAgdGhlIGZvcm0gY29udHJvbHMgYW5kIGNyZWF0ZXMgYSBGb3JtR3JvdXAuXG4gICAqXG4gICAqIEBwYXJhbSBlbCAtIFRoZSBmb3JtIGVsZW1lbnQgdG8gaW5pdGlhbGl6ZS5cbiAgICogQHBhcmFtIGZvcm1JZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGZvcm0uXG4gICAqIEBwYXJhbSBmb3JtVXBkYXRlTW9kZSAtIFRoZSB1cGRhdGUgbW9kZSBmb3IgdGhlIGZvcm0uIERlZmF1bHRzIHRvICdibHVyJy5cbiAgICovXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyB0aGUgZm9ybSBhZnRlciB2aWV3IGluaXRpYWxpemF0aW9uLlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyB1cCBmb3JtIGNvbnRyb2xzIGFuZCBjcmVhdGVzIGEgRm9ybUdyb3VwIGZvciB0aGUgZ2l2ZW4gZm9ybSBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge0Zvcm1FbGVtZW50fSBlbCAtIFRoZSBmb3JtIGVsZW1lbnQgdG8gaW5pdGlhbGl6ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZvcm1JZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGZvcm0uXG4gICAqIEBwYXJhbSB7RmllbGRVcGRhdGVNb2RlfSBbZm9ybVVwZGF0ZU1vZGU9J2JsdXInXSAtIFRoZSB1cGRhdGUgbW9kZSBmb3IgdGhlIGZvcm0uXG4gICAqL1xuICBzdGF0aWMgZm9ybUFmdGVyVmlld0luaXQoXG4gICAgZWw6IEZvcm1FbGVtZW50LFxuICAgIGZvcm1JZDogc3RyaW5nLFxuICAgIGZvcm1VcGRhdGVNb2RlOiBGaWVsZFVwZGF0ZU1vZGUgPSAnYmx1cicsXG4gICkge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gYCpbJHtBbmd1bGFyRW5naW5lS2V5cy5OR19SRUZMRUNUfW5hbWVdYDtcbiAgICBjb25zdCBlbGVtZW50cyA9IEFycmF5LmZyb20oXG4gICAgICBlbC5jb21wb25lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSxcbiAgICApO1xuICAgIGNvbnN0IGNvbnRyb2xzID0gZWxlbWVudHMubWFwKChmOiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSAoZiBhcyB7IGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHN0cmluZyB9PiB9KVxuICAgICAgICAuYXR0cmlidXRlc1tgJHtBbmd1bGFyRW5naW5lS2V5cy5OR19SRUZMRUNUfW5hbWVgXS52YWx1ZTtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBOZ3hGb3JtU2VydmljZS5nZXRGaWVsZEJ5TmFtZShmb3JtSWQsIGZpZWxkTmFtZSk7XG4gICAgICByZXR1cm4gY29udHJvbC5jb250cm9sO1xuICAgIH0pO1xuICAgIGVsLmZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoY29udHJvbHMsIHtcbiAgICAgIHVwZGF0ZU9uOiBmb3JtVXBkYXRlTW9kZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBIYW5kbGVzIGZvcm0gY29tcG9uZW50IGRlc3RydWN0aW9uLlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVW5yZWdpc3RlcnMgdGhlIGZvcm0gZnJvbSB0aGUgc2VydmljZSB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkLlxuICAgKlxuICAgKiBAcGFyYW0ge0Zvcm1FbGVtZW50fSBlbCAtIFRoZSBmb3JtIGVsZW1lbnQgYmVpbmcgZGVzdHJveWVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm9ybUlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBmb3JtIHRvIHVucmVnaXN0ZXIuXG4gICAqL1xuICBzdGF0aWMgZm9yT25EZXN0cm95KGVsOiBGb3JtRWxlbWVudCwgZm9ybUlkOiBzdHJpbmcpIHtcbiAgICBOZ3hGb3JtU2VydmljZS51bnJlZ2lzdGVyKGZvcm1JZCwgZWwuY29tcG9uZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBmb3JtIGRhdGEgZm9yIGEgZ2l2ZW4gZm9ybSBJRC5cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFByb2Nlc3NlcyBmb3JtIGNvbnRyb2xzIGFuZCByZXR1cm5zIHRoZWlyIHZhbHVlcyBhcyBhbiBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtSWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGZvcm0gdG8gcmV0cmlldmUgZGF0YSBmcm9tLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBmb3JtIGRhdGEuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZm9ybSB3aXRoIHRoZSBnaXZlbiBJRCBpcyBub3QgZm91bmQuXG4gICAqL1xuICBzdGF0aWMgZ2V0Rm9ybURhdGEoZm9ybUlkOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgaWYgKCEoZm9ybUlkIGluIHRoaXMuY29udHJvbHMpKSB0aHJvdyBuZXcgRXJyb3IoYGZvcm0gJHtmb3JtSWR9IG5vdCBmb3VuZGApO1xuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmNvbnRyb2xzW2Zvcm1JZF07XG4gICAgbGV0IGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbDtcbiAgICBsZXQgdmFsOiB1bmtub3duO1xuICAgIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZm9ybSkge1xuICAgICAgY29udHJvbCA9IGZvcm1ba2V5XS5jb250cm9sO1xuICAgICAgaWYgKCFIVE1MNUNoZWNrVHlwZXMuaW5jbHVkZXMoZm9ybVtrZXldLnByb3BzLnR5cGUpKSB7XG4gICAgICAgIHN3aXRjaCAoZm9ybVtrZXldLnByb3BzLnR5cGUpIHtcbiAgICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5OVU1CRVI6XG4gICAgICAgICAgICB2YWwgPSBwYXJzZVRvTnVtYmVyKGNvbnRyb2wudmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuREFURTpcbiAgICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5EQVRFVElNRV9MT0NBTDpcbiAgICAgICAgICAgIHZhbCA9IG5ldyBEYXRlKGNvbnRyb2wudmFsdWVba2V5XSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdmFsID0gZXNjYXBlSHRtbChjb250cm9sLnZhbHVlW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWwgPSBjb250cm9sLnZhbHVlO1xuICAgICAgfVxuICAgICAgZGF0YVtrZXldID0gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgZm9ybSBmaWVsZHMuXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBWYWxpZGF0ZXMgZWl0aGVyIGEgc3BlY2lmaWMgZmllbGQgb3IgYWxsIGZpZWxkcyBpbiB0aGUgZm9ybSBncm91cC5cbiAgICpcbiAgICogQHBhcmFtIHtGb3JtR3JvdXB9IGZvcm1Hcm91cCAtIFRoZSBGb3JtR3JvdXAgdG8gdmFsaWRhdGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZmllbGROYW1lXSAtIE9wdGlvbmFsIG5hbWUgb2YgYSBzcGVjaWZpYyBmaWVsZCB0byB2YWxpZGF0ZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IEluZGljYXRlcyB3aGV0aGVyIHRoZSB2YWxpZGF0aW9uIHBhc3NlZCAodHJ1ZSkgb3IgZmFpbGVkIChmYWxzZSkuXG4gICAqL1xuICBzdGF0aWMgdmFsaWRhdGVGaWVsZHMoZm9ybUdyb3VwOiBGb3JtR3JvdXAsIGZpZWxkTmFtZT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGZ1bmN0aW9uIGlzVmFsaWQoZm9ybUdyb3VwOiBGb3JtR3JvdXAsIGZpZWxkTmFtZTogc3RyaW5nKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmdldChmaWVsZE5hbWUpO1xuICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCkge1xuICAgICAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICByZXR1cm4gIWNvbnRyb2wuaW52YWxpZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBzaG91bGQgYmUgaW1wb3NzaWJsZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmaWVsZE5hbWUpIHJldHVybiBpc1ZhbGlkKGZvcm1Hcm91cCwgZmllbGROYW1lKTtcblxuICAgIGxldCBpc1ZhbGlkRm9ybSA9IHRydWU7XG4gICAgZm9yIChjb25zdCBmZyBvZiBmb3JtR3JvdXAuY29udHJvbHMgYXMgdW5rbm93biBhcyBGb3JtR3JvdXBbXSkge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gZmcuY29udHJvbHMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGUgPSBpc1ZhbGlkKGZnLCBrZXkpO1xuICAgICAgICBpZiAoIXZhbGlkYXRlKSBpc1ZhbGlkRm9ybSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpc1ZhbGlkRm9ybTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgRm9ybUdyb3VwIGZyb20gZmllbGQgcHJvcGVydGllcy5cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEdlbmVyYXRlcyBhIG5ldyBGb3JtR3JvdXAgaW5zdGFuY2UgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGZpZWxkIGRlZmluaXRpb24gYW5kIHVwZGF0ZSBtb2RlLlxuICAgKlxuICAgKiBAcGFyYW0ge0FuZ3VsYXJGaWVsZERlZmluaXRpb259IHByb3BzIC0gVGhlIEFuZ3VsYXIgZmllbGQgZGVmaW5pdGlvbiBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0ge0ZpZWxkVXBkYXRlTW9kZX0gdXBkYXRlTW9kZSAtIFRoZSB1cGRhdGUgbW9kZSBmb3IgdGhlIGZvcm0gZ3JvdXAuXG4gICAqIEByZXR1cm5zIHtGb3JtR3JvdXB9IEEgbmV3IEZvcm1Hcm91cCBpbnN0YW5jZS5cbiAgICovXG4gIHN0YXRpYyBmcm9tUHJvcHMoXG4gICAgcHJvcHM6IEFuZ3VsYXJGaWVsZERlZmluaXRpb24sXG4gICAgdXBkYXRlTW9kZTogRmllbGRVcGRhdGVNb2RlLFxuICApOiBGb3JtR3JvdXAge1xuICAgIGNvbnN0IGNvbnRyb2xzOiBSZWNvcmQ8c3RyaW5nLCBGb3JtQ29udHJvbD4gPSB7fTtcbiAgICBjb25zdCB2YWxpZGF0b3JzID0gdGhpcy52YWxpZGF0b3JzRnJvbVByb3BzKHByb3BzKTtcbiAgICBjb25zdCBjb21wb3NlZCA9IHZhbGlkYXRvcnMubGVuZ3RoID8gVmFsaWRhdG9ycy5jb21wb3NlKHZhbGlkYXRvcnMpIDogbnVsbDtcbiAgICBjb250cm9sc1twcm9wcy5uYW1lXSA9IG5ldyBGb3JtQ29udHJvbChcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6XG4gICAgICAgICAgcHJvcHMudmFsdWUgJiYgcHJvcHMudHlwZSAhPT0gSFRNTDVJbnB1dFR5cGVzLkNIRUNLQk9YXG4gICAgICAgICAgICA/IHByb3BzLnZhbHVlXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgZGlzYWJsZWQ6IHByb3BzLmRpc2FibGVkLFxuICAgICAgfSxcbiAgICAgIGNvbXBvc2VkLFxuICAgICk7XG5cbiAgICByZXR1cm4gbmV3IEZvcm1Hcm91cChjb250cm9scywgeyB1cGRhdGVPbjogdXBkYXRlTW9kZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSBmb3JtIGJ5IGl0cyBJRCBmcm9tIHRoZSBzdG9yZWQgY29udHJvbHMuXG4gICAqXG4gICAqIEBwYXJhbSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZm9ybSB0byByZXRyaWV2ZS5cbiAgICogQHJldHVybnMgVGhlIGZvcm0gY29udHJvbHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBJRC5cbiAgICogQHRocm93cyBFcnJvciBpZiB0aGUgZm9ybSB3aXRoIHRoZSBnaXZlbiBJRCBpcyBub3QgZm91bmQuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRGb3JtQnlJZChpZDogc3RyaW5nKSB7XG4gICAgaWYgKCEoaWQgaW4gTmd4Rm9ybVNlcnZpY2UuY29udHJvbHMpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBmb3JtSWQgJHtpZH1gKTtcbiAgICByZXR1cm4gTmd4Rm9ybVNlcnZpY2UuY29udHJvbHNbaWRdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIHNwZWNpZmljIGZpZWxkIGZyb20gYSBmb3JtIGJ5IGl0cyBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0gZm9ybUlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBmb3JtLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byByZXRyaWV2ZS5cbiAgICogQHJldHVybnMgVGhlIGZpZWxkIGNvbnRyb2wgYW5kIHByb3BlcnRpZXMuXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGZpZWxkIGlzIG5vdCBmb3VuZCBpbiB0aGUgZm9ybS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldEZpZWxkQnlOYW1lKGZvcm1JZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBmb3JtID0gTmd4Rm9ybVNlcnZpY2UuZ2V0Rm9ybUJ5SWQoZm9ybUlkKTtcbiAgICBpZiAoIShuYW1lIGluIGZvcm0pKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBmaWVsZCAke25hbWV9IGluIGZvcm1gKTtcbiAgICByZXR1cm4gZm9ybVtuYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYW4gYXJyYXkgb2YgdmFsaWRhdG9yIGZ1bmN0aW9ucyBmcm9tIHRoZSBwcm92aWRlZCBmaWVsZCBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgLSBUaGUgZmllbGQgcHJvcGVydGllcyBjb250YWluaW5nIHZhbGlkYXRpb24gcnVsZXMuXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIFZhbGlkYXRvckZuIGluc3RhbmNlcy5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHZhbGlkYXRvcnNGcm9tUHJvcHMoXG4gICAgcHJvcHM6IEZpZWxkUHJvcGVydGllcyAmIEFuZ3VsYXJGaWVsZERlZmluaXRpb24sXG4gICk6IFZhbGlkYXRvckZuW10ge1xuICAgIGNvbnN0IHN1cHBvcnRlZFZhbGlkYXRpb25LZXlzID0gVmFsaWRhdGlvbi5rZXlzKCk7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHByb3BzKVxuICAgICAgLmZpbHRlcigoazogc3RyaW5nKSA9PiBzdXBwb3J0ZWRWYWxpZGF0aW9uS2V5cy5pbmNsdWRlcyhrKSlcbiAgICAgIC5tYXAoKGs6IHN0cmluZykgPT4gVmFsaWRhdG9yRmFjdG9yeS5zcGF3bihrLCBwcm9wc1trXSkpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBlbFxuICAgKiBAcGFyYW0gdGFnXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSB3aGVuIG5vIHBhcmVudCBleGlzdHMgd2l0aCB0aGUgcHJvdmlkZWQgdGFnXG4gICAqL1xuICBzdGF0aWMgZ2V0UGFyZW50RWwoZWw6IEhUTUxFbGVtZW50LCB0YWc6IHN0cmluZykge1xuICAgIGxldCBwYXJlbnQ6IEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICB3aGlsZSAoKHBhcmVudCA9IGVsLnBhcmVudEVsZW1lbnQpICE9PSBudWxsKSB7XG4gICAgICBpZiAocGFyZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGFnLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICAgIH1cbiAgICAgIGVsID0gcGFyZW50O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTm8gcGFyZW50IHdpdGggdGhlIHRhZyAke3RhZ30gd2FzIGZvdW5kIGZvciBwcm92aWRlZCBlbGVtZW50YCxcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIHJlZ2lzdGVyKFxuICAgIGZvcm1JZDogc3RyaW5nLFxuICAgIGNvbnRyb2w6IEZvcm1Hcm91cCxcbiAgICBwcm9wczogRmllbGRQcm9wZXJ0aWVzICYgQW5ndWxhckZpZWxkRGVmaW5pdGlvbixcbiAgKSB7XG4gICAgdGhpcy5jb250cm9sc1tmb3JtSWRdID0gdGhpcy5jb250cm9sc1tmb3JtSWRdIHx8IHt9O1xuICAgIHRoaXMuY29udHJvbHNbZm9ybUlkXVtwcm9wcy5uYW1lXSA9IHtcbiAgICAgIGNvbnRyb2w6IGNvbnRyb2wsXG4gICAgICBwcm9wczogcHJvcHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGZvcm0gb3IgYSBzcGVjaWZpYyBmaWVsZCBmcm9tIHRoZSBzZXJ2aWNlLlxuICAgKlxuICAgKiBAcGFyYW0gZm9ybUlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBmb3JtLlxuICAgKiBAcGFyYW0gZmllbGQgLSBPcHRpb25hbC4gVGhlIHNwZWNpZmljIGZpZWxkIHRvIHVucmVnaXN0ZXIuIElmIG5vdCBwcm92aWRlZCwgdGhlIGVudGlyZSBmb3JtIGlzIHVucmVnaXN0ZXJlZC5cbiAgICovXG4gIHN0YXRpYyB1bnJlZ2lzdGVyKGZvcm1JZDogc3RyaW5nLCBmaWVsZD86IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKCFmaWVsZCkgZGVsZXRlIHRoaXMuY29udHJvbHNbZm9ybUlkXTtcbiAgICBlbHNlXG4gICAgICBkZWxldGUgdGhpcy5jb250cm9sc1tmb3JtSWRdWyhmaWVsZCBhcyB1bmtub3duIGFzIHsgbmFtZTogc3RyaW5nIH0pLm5hbWVdO1xuICB9XG59XG4iXX0=
|