@jsonforms/angular
Version:
Angular module of JSON Forms
122 lines (118 loc) • 17.6 kB
JavaScript
/*
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==