UNPKG

@jsonforms/angular

Version:

Angular module of JSON Forms

141 lines (137 loc) 17.4 kB
/* The MIT License Copyright (c) 2017-2019 EclipseSource Munich https://github.com/eclipsesource/jsonforms Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import { Actions, computeLabel, removeId, } from '@jsonforms/core'; import { Component, Input } from '@angular/core'; import { FormControl, } from '@angular/forms'; import { JsonFormsBaseRenderer } from './base.renderer'; import { JsonFormsAngularService } from './jsonforms.service'; import merge from 'lodash/merge'; import * as i0 from "@angular/core"; import * as i1 from "./jsonforms.service"; export class JsonFormsAbstractControl extends JsonFormsBaseRenderer { jsonFormsService; id; disabled; visible; form; data; label; description; error; scopedSchema; rootSchema; enabled; hidden; propsPath; constructor(jsonFormsService) { super(); this.jsonFormsService = jsonFormsService; this.form = new FormControl({ value: '', disabled: true, }, { updateOn: 'change', validators: this.validator.bind(this), }); } getEventValue = (event) => event.value; onChange(ev) { this.jsonFormsService.updateCore(Actions.update(this.propsPath, () => this.getEventValue(ev))); this.triggerValidation(); } shouldShowUnfocusedDescription() { const config = this.jsonFormsService.getConfig(); const appliedUiSchemaOptions = merge({}, config, this.uischema.options); return !!appliedUiSchemaOptions.showUnfocusedDescription; } ngOnInit() { this.addSubscription(this.jsonFormsService.$state.subscribe({ next: (state) => { const props = this.mapToProps(state); const { data, enabled, errors, label, required, schema, rootSchema, visible, path, config, } = props; this.label = computeLabel(label, required, config ? config.hideRequiredAsterisk : false); this.data = data; this.error = errors; this.enabled = enabled; this.isEnabled() ? this.form.enable() : this.form.disable(); this.hidden = !visible; this.scopedSchema = schema; this.rootSchema = rootSchema; this.description = props.description ?? ''; this.id = props.id; this.form.setValue(data); this.propsPath = path; this.mapAdditionalProps(props); }, })); this.triggerValidation(); } validator = (_c) => { return this.error ? { error: this.error } : null; }; mapAdditionalProps(_props) { // do nothing by default } ngOnDestroy() { super.ngOnDestroy(); removeId(this.id); } isEnabled() { return this.enabled; } getOwnProps() { const props = { uischema: this.uischema, schema: this.schema, path: this.path, id: this.id, }; if (this.disabled !== undefined) { props.enabled = !this.disabled; } if (this.visible !== undefined) { props.visible = this.visible; } return props; } triggerValidation() { // these cause the correct update of the error underline, seems to be // related to ionic-team/ionic#11640 this.form.markAsTouched(); this.form.updateValueAndValidity(); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: JsonFormsAbstractControl, deps: [{ token: i1.JsonFormsAngularService }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: JsonFormsAbstractControl, selector: "ng-component", inputs: { id: "id", disabled: "disabled", visible: "visible" }, usesInheritance: true, ngImport: i0, template: '', isInline: true }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: JsonFormsAbstractControl, decorators: [{ type: Component, args: [{ template: '', standalone: false, }] }], ctorParameters: () => [{ type: i1.JsonFormsAngularService }], propDecorators: { id: [{ type: Input }], disabled: [{ type: Input }], visible: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtY29udHJvbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWJyYXJ5L2Fic3RyYWN0LWNvbnRyb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBdUJFO0FBQ0YsT0FBTyxFQUNMLE9BQU8sRUFDUCxZQUFZLEVBS1osUUFBUSxHQUVULE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ3BFLE9BQU8sRUFFTCxXQUFXLEdBR1osTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM5RCxPQUFPLEtBQUssTUFBTSxjQUFjLENBQUM7OztBQUtqQyxNQUFNLE9BQWdCLHdCQUdwQixTQUFRLHFCQUFxQztJQWtCdkI7SUFmYixFQUFFLENBQVM7SUFDWCxRQUFRLENBQVU7SUFDbEIsT0FBTyxDQUFVO0lBRTFCLElBQUksQ0FBYztJQUNsQixJQUFJLENBQU07SUFDVixLQUFLLENBQVM7SUFDZCxXQUFXLENBQVM7SUFDcEIsS0FBSyxDQUFnQjtJQUNyQixZQUFZLENBQWE7SUFDekIsVUFBVSxDQUFhO0lBQ3ZCLE9BQU8sQ0FBVTtJQUNqQixNQUFNLENBQVU7SUFDaEIsU0FBUyxDQUFTO0lBRWxCLFlBQXNCLGdCQUF5QztRQUM3RCxLQUFLLEVBQUUsQ0FBQztRQURZLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBeUI7UUFFN0QsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLFdBQVcsQ0FDekI7WUFDRSxLQUFLLEVBQUUsRUFBRTtZQUNULFFBQVEsRUFBRSxJQUFJO1NBQ2YsRUFDRDtZQUNFLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFVBQVUsRUFBRSxJQUFJ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b3VyY2VzQ29udGVudCI6WyIvKlxuICBUaGUgTUlUIExpY2Vuc2VcblxuICBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOSBFY2xpcHNlU291cmNlIE11bmljaFxuICBodHRwczovL2dpdGh1Yi5jb20vZWNsaXBzZXNvdXJjZS9qc29uZm9ybXNcblxuICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG4gIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG4gIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbiAgVEhFIFNPRlRXQVJFLlxuKi9cbmltcG9ydCB7XG4gIEFjdGlvbnMsXG4gIGNvbXB1dGVMYWJlbCxcbiAgQ29udHJvbEVsZW1lbnQsXG4gIEpzb25Gb3Jtc1N0YXRlLFxuICBKc29uU2NoZW1hLFxuICBPd25Qcm9wc09mQ29udHJvbCxcbiAgcmVtb3ZlSWQsXG4gIFN0YXRlUHJvcHNPZkNvbnRyb2wsXG59IGZyb20gJ0Bqc29uZm9ybXMvY29yZSc7XG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBGb3JtQ29udHJvbCxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yRm4sXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgSnNvbkZvcm1zQmFzZVJlbmRlcmVyIH0gZnJvbSAnLi9iYXNlLnJlbmRlcmVyJztcbmltcG9ydCB7IEpzb25Gb3Jtc0FuZ3VsYXJTZXJ2aWNlIH0gZnJvbSAnLi9qc29uZm9ybXMuc2VydmljZSc7XG5pbXBvcnQgbWVyZ2UgZnJvbSAnbG9kYXNoL21lcmdlJztcbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZTogJycsXG4gIHN0YW5kYWxvbmU6IGZhbHNlLFxufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBKc29uRm9ybXNBYnN0cmFjdENvbnRyb2w8XG4gICAgUHJvcHMgZXh0ZW5kcyBTdGF0ZVByb3BzT2ZDb250cm9sXG4gID5cbiAgZXh0ZW5kcyBKc29uRm9ybXNCYXNlUmVuZGVyZXI8Q29udHJvbEVsZW1lbnQ+XG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3lcbntcbiAgQElucHV0KCkgaWQ6IHN0cmluZztcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHZpc2libGU6IGJvb2xlYW47XG5cbiAgZm9ybTogRm9ybUNvbnRyb2w7XG4gIGRhdGE6IGFueTtcbiAgbGFiZWw6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgZXJyb3I6IHN0cmluZyB8IG51bGw7XG4gIHNjb3BlZFNjaGVtYTogSnNvblNjaGVtYTtcbiAgcm9vdFNjaGVtYTogSnNvblNjaGVtYTtcbiAgZW5hYmxlZDogYm9vbGVhbjtcbiAgaGlkZGVuOiBib29sZWFuO1xuICBwcm9wc1BhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQganNvbkZvcm1zU2VydmljZTogSnNvbkZvcm1zQW5ndWxhclNlcnZpY2UpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZm9ybSA9IG5ldyBGb3JtQ29udHJvbChcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHVwZGF0ZU9uOiAnY2hhbmdlJyxcbiAgICAgICAgdmFsaWRhdG9yczogdGhpcy52YWxpZGF0b3IuYmluZCh0aGlzKSxcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgZ2V0RXZlbnRWYWx1ZSA9IChldmVudDogYW55KSA9PiBldmVudC52YWx1ZTtcblxuICBvbkNoYW5nZShldjogYW55KSB7XG4gICAgdGhpcy5qc29uRm9ybXNTZXJ2aWNlLnVwZGF0ZUNvcmUoXG4gICAgICBBY3Rpb25zLnVwZGF0ZSh0aGlzLnByb3BzUGF0aCwgKCkgPT4gdGhpcy5nZXRFdmVudFZhbHVlKGV2KSlcbiAgICApO1xuICAgIHRoaXMudHJpZ2dlclZhbGlkYXRpb24oKTtcbiAgfVxuXG4gIHNob3VsZFNob3dVbmZvY3VzZWREZXNjcmlwdGlvbigpOiBib29sZWFuIHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmpzb25Gb3Jtc1NlcnZpY2UuZ2V0Q29uZmlnKCk7XG4gICAgY29uc3QgYXBwbGllZFVpU2NoZW1hT3B0aW9ucyA9IG1lcmdlKHt9LCBjb25maWcsIHRoaXMudWlzY2hlbWEub3B0aW9ucyk7XG4gICAgcmV0dXJuICEhYXBwbGllZFVpU2NoZW1hT3B0aW9ucy5zaG93VW5mb2N1c2VkRGVzY3JpcHRpb247XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmFkZFN1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMuanNvbkZvcm1zU2VydmljZS4kc3RhdGUuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHN0YXRlOiBKc29uRm9ybXNTdGF0ZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5tYXBUb1Byb3BzKHN0YXRlKTtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgZW5hYmxlZCxcbiAgICAgICAgICAgIGVycm9ycyxcbiAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgcmVxdWlyZWQsXG4gICAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgICByb290U2NoZW1hLFxuICAgICAgICAgICAgdmlzaWJsZSxcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgfSA9IHByb3BzO1xuICAgICAgICAgIHRoaXMubGFiZWwgPSBjb21wdXRlTGFiZWwoXG4gICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgIHJlcXVpcmVkLFxuICAgICAgICAgICAgY29uZmlnID8gY29uZmlnLmhpZGVSZXF1aXJlZEFzdGVyaXNrIDogZmFsc2VcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgICAgdGhpcy5lcnJvciA9IGVycm9ycztcbiAgICAgICAgICB0aGlzLmVuYWJsZWQgPSBlbmFibGVkO1xuICAgICAgICAgIHRoaXMuaXNFbmFibGVkKCkgPyB0aGlzLmZvcm0uZW5hYmxlKCkgOiB0aGlzLmZvcm0uZGlzYWJsZSgpO1xuICAgICAgICAgIHRoaXMuaGlkZGVuID0gIXZpc2libGU7XG4gICAgICAgICAgdGhpcy5zY29wZWRTY2hlbWEgPSBzY2hlbWE7XG4gICAgICAgICAgdGhpcy5yb290U2NoZW1hID0gcm9vdFNjaGVtYTtcbiAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gcHJvcHMuZGVzY3JpcHRpb24gPz8gJyc7XG4gICAgICAgICAgdGhpcy5pZCA9IHByb3BzLmlkO1xuICAgICAgICAgIHRoaXMuZm9ybS5zZXRWYWx1ZShkYXRhKTtcbiAgICAgICAgICB0aGlzLnByb3BzUGF0aCA9IHBhdGg7XG4gICAgICAgICAgdGhpcy5tYXBBZGRpdGlvbmFsUHJvcHMocHJvcHMpO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMudHJpZ2dlclZhbGlkYXRpb24oKTtcbiAgfVxuXG4gIHZhbGlkYXRvcjogVmFsaWRhdG9yRm4gPSAoX2M6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICByZXR1cm4gdGhpcy5lcnJvciA/IHsgZXJyb3I6IHRoaXMuZXJyb3IgfSA6IG51bGw7XG4gIH07XG5cbiAgbWFwQWRkaXRpb25hbFByb3BzKF9wcm9wczogUHJvcHMpIHtcbiAgICAvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHRcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgcmVtb3ZlSWQodGhpcy5pZCk7XG4gIH1cblxuICBpc0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZW5hYmxlZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRPd25Qcm9wcygpOiBPd25Qcm9wc09mQ29udHJvbCB7XG4gICAgY29uc3QgcHJvcHM6IE93blByb3BzT2ZDb250cm9sID0ge1xuICAgICAgdWlzY2hlbWE6IHRoaXMudWlzY2hlbWEsXG4gICAgICBzY2hlbWE6IHRoaXMuc2NoZW1hLFxuICAgICAgcGF0aDogdGhpcy5wYXRoLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgfTtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwcm9wcy5lbmFibGVkID0gIXRoaXMuZGlzYWJsZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLnZpc2libGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJvcHMudmlzaWJsZSA9IHRoaXMudmlzaWJsZTtcbiAgICB9XG4gICAgcmV0dXJuIHByb3BzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IG1hcFRvUHJvcHMoc3RhdGU6IEpzb25Gb3Jtc1N0YXRlKTogUHJvcHM7XG5cbiAgcHJvdGVjdGVkIHRyaWdnZXJWYWxpZGF0aW9uKCkge1xuICAgIC8vIHRoZXNlIGNhdXNlIHRoZSBjb3JyZWN0IHVwZGF0ZSBvZiB0aGUgZXJyb3IgdW5kZXJsaW5lLCBzZWVtcyB0byBiZVxuICAgIC8vIHJlbGF0ZWQgdG8gaW9uaWMtdGVhbS9pb25pYyMxMTY0MFxuICAgIHRoaXMuZm9ybS5tYXJrQXNUb3VjaGVkKCk7XG4gICAgdGhpcy5mb3JtLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgfVxufVxuIl19