UNPKG

@jsonforms/angular

Version:

Angular module of JSON Forms

122 lines (118 loc) 17.6 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 maxBy from 'lodash/maxBy'; import { ComponentFactoryResolver, Directive, Input, ViewContainerRef, } from '@angular/core'; import { createId, isControl, getConfig, mapStateToJsonFormsRendererProps, } from '@jsonforms/core'; import { UnknownRenderer } from './unknown.component'; import { JsonFormsBaseRenderer } from './base.renderer'; import { JsonFormsControl } from './control'; import { JsonFormsAngularService } from './jsonforms.service'; import isEqual from 'lodash/isEqual'; import get from 'lodash/get'; import * as i0 from "@angular/core"; import * as i1 from "./jsonforms.service"; const areEqual = (prevProps, nextProps) => { return (get(prevProps, 'renderers.length') === get(nextProps, 'renderers.length') && get(prevProps, 'cells.length') === get(nextProps, 'cells.length') && get(prevProps, 'uischemas.length') === get(nextProps, 'uischemas.length') && get(prevProps, 'schema') === get(nextProps, 'schema') && isEqual(get(prevProps, 'uischema'), get(nextProps, 'uischema')) && get(prevProps, 'path') === get(nextProps, 'path')); }; export class JsonFormsOutlet extends JsonFormsBaseRenderer { viewContainerRef; componentFactoryResolver; jsonformsService; previousProps; constructor(viewContainerRef, componentFactoryResolver, jsonformsService) { super(); this.viewContainerRef = viewContainerRef; this.componentFactoryResolver = componentFactoryResolver; this.jsonformsService = jsonformsService; } set renderProps(renderProps) { this.path = renderProps.path; this.schema = renderProps.schema; this.uischema = renderProps.uischema; this.update(this.jsonformsService.getState()); } ngOnInit() { this.addSubscription(this.jsonformsService.$state.subscribe({ next: (state) => this.update(state), })); } update(state) { const props = mapStateToJsonFormsRendererProps(state, { schema: this.schema, uischema: this.uischema, path: this.path, }); if (areEqual(this.previousProps, props)) { return; } else { this.previousProps = props; } const { renderers } = props; const schema = this.schema || props.schema; const uischema = this.uischema || props.uischema; const testerContext = { rootSchema: props.rootSchema, config: getConfig(state), }; const renderer = maxBy(renderers, (r) => r.tester(uischema, schema, testerContext)); let bestComponent = UnknownRenderer; if (renderer !== undefined && renderer.tester(uischema, schema, testerContext) !== -1) { bestComponent = renderer.renderer; } const componentFactory = this.componentFactoryResolver.resolveComponentFactory(bestComponent); this.viewContainerRef.clear(); const currentComponentRef = this.viewContainerRef.createComponent(componentFactory); if (currentComponentRef.instance instanceof JsonFormsBaseRenderer) { const instance = currentComponentRef.instance; instance.uischema = uischema; instance.schema = schema; instance.path = this.path; if (instance instanceof JsonFormsControl) { const controlInstance = instance; if (controlInstance.id === undefined) { const id = isControl(props.uischema) ? createId(props.uischema.scope) : undefined; instance.id = id; } } } } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: JsonFormsOutlet, deps: [{ token: i0.ViewContainerRef }, { token: i0.ComponentFactoryResolver }, { token: i1.JsonFormsAngularService }], target: i0.ɵɵFactoryTarget.Directive }); static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: JsonFormsOutlet, selector: "jsonforms-outlet", inputs: { renderProps: "renderProps" }, usesInheritance: true, ngImport: i0 }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: JsonFormsOutlet, decorators: [{ type: Directive, args: [{ selector: 'jsonforms-outlet', standalone: false, }] }], ctorParameters: () => [{ type: i0.ViewContainerRef }, { type: i0.ComponentFactoryResolver }, { type: i1.JsonFormsAngularService }], propDecorators: { renderProps: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbmZvcm1zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWJyYXJ5L2pzb25mb3Jtcy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBdUJFO0FBQ0YsT0FBTyxLQUFLLE1BQU0sY0FBYyxDQUFDO0FBQ2pDLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsU0FBUyxFQUNULEtBQUssRUFHTCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLFFBQVEsRUFDUixTQUFTLEVBQ1QsU0FBUyxFQUlULGdDQUFnQyxHQUlqQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDN0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFOUQsT0FBTyxPQUFPLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxHQUFHLE1BQU0sWUFBWSxDQUFDOzs7QUFFN0IsTUFBTSxRQUFRLEdBQUcsQ0FDZixTQUF3QyxFQUN4QyxTQUF3QyxFQUN4QyxFQUFFO0lBQ0YsT0FBTyxDQUNMLEdBQUcsQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLENBQUMsS0FBSyxHQUFHLENBQUMsU0FBUyxFQUFFLGtCQUFrQixDQUFDO1FBQ3pFLEdBQUcsQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLEtBQUssR0FBRyxDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUM7UUFDakUsR0FBRyxDQUFDLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLENBQUM7UUFDekUsR0FBRyxDQUFD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YykgMjAxNy0yMDE5IEVjbGlwc2VTb3VyY2UgTXVuaWNoXG4gIGh0dHBzOi8vZ2l0aHViLmNvbS9lY2xpcHNlc291cmNlL2pzb25mb3Jtc1xuXG4gIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cbiAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cbiAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICBUSEUgU09GVFdBUkUuXG4qL1xuaW1wb3J0IG1heEJ5IGZyb20gJ2xvZGFzaC9tYXhCeSc7XG5pbXBvcnQge1xuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gIERpcmVjdGl2ZSxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgVHlwZSxcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBjcmVhdGVJZCxcbiAgaXNDb250cm9sLFxuICBnZXRDb25maWcsXG4gIEpzb25Gb3Jtc1Byb3BzLFxuICBKc29uRm9ybXNTdGF0ZSxcbiAgSnNvblNjaGVtYSxcbiAgbWFwU3RhdGVUb0pzb25Gb3Jtc1JlbmRlcmVyUHJvcHMsXG4gIE93blByb3BzT2ZSZW5kZXJlcixcbiAgU3RhdGVQcm9wc09mSnNvbkZvcm1zUmVuZGVyZXIsXG4gIFVJU2NoZW1hRWxlbWVudCxcbn0gZnJvbSAnQGpzb25mb3Jtcy9jb3JlJztcbmltcG9ydCB7IFVua25vd25SZW5kZXJlciB9IGZyb20gJy4vdW5rbm93bi5jb21wb25lbnQnO1xuaW1wb3J0IHsgSnNvbkZvcm1zQmFzZVJlbmRlcmVyIH0gZnJvbSAnLi9iYXNlLnJlbmRlcmVyJztcbmltcG9ydCB7IEpzb25Gb3Jtc0NvbnRyb2wgfSBmcm9tICcuL2NvbnRyb2wnO1xuaW1wb3J0IHsgSnNvbkZvcm1zQW5ndWxhclNlcnZpY2UgfSBmcm9tICcuL2pzb25mb3Jtcy5zZXJ2aWNlJztcblxuaW1wb3J0IGlzRXF1YWwgZnJvbSAnbG9kYXNoL2lzRXF1YWwnO1xuaW1wb3J0IGdldCBmcm9tICdsb2Rhc2gvZ2V0JztcblxuY29uc3QgYXJlRXF1YWwgPSAoXG4gIHByZXZQcm9wczogU3RhdGVQcm9wc09mSnNvbkZvcm1zUmVuZGVyZXIsXG4gIG5leHRQcm9wczogU3RhdGVQcm9wc09mSnNvbkZvcm1zUmVuZGVyZXJcbikgPT4ge1xuICByZXR1cm4gKFxuICAgIGdldChwcmV2UHJvcHMsICdyZW5kZXJlcnMubGVuZ3RoJykgPT09IGdldChuZXh0UHJvcHMsICdyZW5kZXJlcnMubGVuZ3RoJykgJiZcbiAgICBnZXQocHJldlByb3BzLCAnY2VsbHMubGVuZ3RoJykgPT09IGdldChuZXh0UHJvcHMsICdjZWxscy5sZW5ndGgnKSAmJlxuICAgIGdldChwcmV2UHJvcHMsICd1aXNjaGVtYXMubGVuZ3RoJykgPT09IGdldChuZXh0UHJvcHMsICd1aXNjaGVtYXMubGVuZ3RoJykgJiZcbiAgICBnZXQocHJldlByb3BzLCAnc2NoZW1hJykgPT09IGdldChuZXh0UHJvcHMsICdzY2hlbWEnKSAmJlxuICAgIGlzRXF1YWwoZ2V0KHByZXZQcm9wcywgJ3Vpc2NoZW1hJyksIGdldChuZXh0UHJvcHMsICd1aXNjaGVtYScpKSAmJlxuICAgIGdldChwcmV2UHJvcHMsICdwYXRoJykgPT09IGdldChuZXh0UHJvcHMsICdwYXRoJylcbiAgKTtcbn07XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ2pzb25mb3Jtcy1vdXRsZXQnLFxuICBzdGFuZGFsb25lOiBmYWxzZSxcbn0pXG5leHBvcnQgY2xhc3MgSnNvbkZvcm1zT3V0bGV0XG4gIGV4dGVuZHMgSnNvbkZvcm1zQmFzZVJlbmRlcmVyPFVJU2NoZW1hRWxlbWVudD5cbiAgaW1wbGVtZW50cyBPbkluaXRcbntcbiAgcHJpdmF0ZSBwcmV2aW91c1Byb3BzOiBTdGF0ZVByb3BzT2ZKc29uRm9ybXNSZW5kZXJlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBwcml2YXRlIGpzb25mb3Jtc1NlcnZpY2U6IEpzb25Gb3Jtc0FuZ3VsYXJTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgcmVuZGVyUHJvcHMocmVuZGVyUHJvcHM6IE93blByb3BzT2ZSZW5kZXJlcikge1xuICAgIHRoaXMucGF0aCA9IHJlbmRlclByb3BzLnBhdGg7XG4gICAgdGhpcy5zY2hlbWEgPSByZW5kZXJQcm9wcy5zY2hlbWE7XG4gICAgdGhpcy51aXNjaGVtYSA9IHJlbmRlclByb3BzLnVpc2NoZW1hO1xuICAgIHRoaXMudXBkYXRlKHRoaXMuanNvbmZvcm1zU2VydmljZS5nZXRTdGF0ZSgpKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYWRkU3Vic2NyaXB0aW9uKFxuICAgICAgdGhpcy5qc29uZm9ybXNTZXJ2aWNlLiRzdGF0ZS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoc3RhdGU6IEpzb25Gb3Jtc1N0YXRlKSA9PiB0aGlzLnVwZGF0ZShzdGF0ZSksXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICB1cGRhdGUoc3RhdGU6IEpzb25Gb3Jtc1N0YXRlKSB7XG4gICAgY29uc3QgcHJvcHMgPSBtYXBTdGF0ZVRvSnNvbkZvcm1zUmVuZGVyZXJQcm9wcyhzdGF0ZSwge1xuICAgICAgc2NoZW1hOiB0aGlzLnNjaGVtYSxcbiAgICAgIHVpc2NoZW1hOiB0aGlzLnVpc2NoZW1hLFxuICAgICAgcGF0aDogdGhpcy5wYXRoLFxuICAgIH0pO1xuICAgIGlmIChhcmVFcXVhbCh0aGlzLnByZXZpb3VzUHJvcHMsIHByb3BzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByZXZpb3VzUHJvcHMgPSBwcm9wcztcbiAgICB9XG4gICAgY29uc3QgeyByZW5kZXJlcnMgfSA9IHByb3BzIGFzIEpzb25Gb3Jtc1Byb3BzO1xuICAgIGNvbnN0IHNjaGVtYTogSnNvblNjaGVtYSA9IHRoaXMuc2NoZW1hIHx8IHByb3BzLnNjaGVtYTtcbiAgICBjb25zdCB1aXNjaGVtYSA9IHRoaXMudWlzY2hlbWEgfHwgcHJvcHMudWlzY2hlbWE7XG4gICAgY29uc3QgdGVzdGVyQ29udGV4dCA9IHtcbiAgICAgIHJvb3RTY2hlbWE6IHByb3BzLnJvb3RTY2hlbWEsXG4gICAgICBjb25maWc6IGdldENvbmZpZyhzdGF0ZSksXG4gICAgfTtcblxuICAgIGNvbnN0IHJlbmRlcmVyID0gbWF4QnkocmVuZGVyZXJzLCAocikgPT5cbiAgICAgIHIudGVzdGVyKHVpc2NoZW1hLCBzY2hlbWEsIHRlc3RlckNvbnRleHQpXG4gICAgKTtcbiAgICBsZXQgYmVzdENvbXBvbmVudDogVHlwZTxhbnk+ID0gVW5rbm93blJlbmRlcmVyO1xuICAgIGlmIChcbiAgICAgIHJlbmRlcmVyICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHJlbmRlcmVyLnRlc3Rlcih1aXNjaGVtYSwgc2NoZW1hLCB0ZXN0ZXJDb250ZXh0KSAhPT0gLTFcbiAgICApIHtcbiAgICAgIGJlc3RDb21wb25lbnQgPSByZW5kZXJlci5yZW5kZXJlcjtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wb25lbnRGYWN0b3J5ID1cbiAgICAgIHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGJlc3RDb21wb25lbnQpO1xuICAgIHRoaXMudmlld0NvbnRhaW5lclJlZi5jbGVhcigpO1xuICAgIGNvbnN0IGN1cnJlbnRDb21wb25lbnRSZWYgPVxuICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5KTtcblxuICAgIGlmIChjdXJyZW50Q29tcG9uZW50UmVmLmluc3RhbmNlIGluc3RhbmNlb2YgSnNvbkZvcm1zQmFzZVJlbmRlcmVyKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9XG4gICAgICAgIGN1cnJlbnRDb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgSnNvbkZvcm1zQmFzZVJlbmRlcmVyPFVJU2NoZW1hRWxlbWVudD47XG4gICAgICBpbnN0YW5jZS51aXNjaGVtYSA9IHVpc2NoZW1hO1xuICAgICAgaW5zdGFuY2Uuc2NoZW1hID0gc2NoZW1hO1xuICAgICAgaW5zdGFuY2UucGF0aCA9IHRoaXMucGF0aDtcbiAgICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIEpzb25Gb3Jtc0NvbnRyb2wpIHtcbiAgICAgICAgY29uc3QgY29udHJvbEluc3RhbmNlID0gaW5zdGFuY2UgYXMgSnNvbkZvcm1zQ29udHJvbDtcbiAgICAgICAgaWYgKGNvbnRyb2xJbnN0YW5jZS5pZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3QgaWQgPSBpc0NvbnRyb2wocHJvcHMudWlzY2hlbWEpXG4gICAgICAgICAgICA/IGNyZWF0ZUlkKHByb3BzLnVpc2NoZW1hLnNjb3BlKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgKGluc3RhbmNlIGFzIEpzb25Gb3Jtc0NvbnRyb2wpLmlkID0gaWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==