ngx-antd-json-schema-form
Version:
JSON form schema using ant-design and prismjs
195 lines • 18.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, Output, EventEmitter, ViewEncapsulation } from "@angular/core";
import { FormGroup, FormControl, Validators } from "@angular/forms";
// ['', [ Validators.pattern(/^[0-9 ]{1,15}$/)]]
export class NgxAntdJsonSchemaFormComponent {
constructor() {
this.schema = [];
this.registeredForm = new EventEmitter();
this.formChange = new EventEmitter();
this.formTouch = new EventEmitter();
this.submit = new EventEmitter();
this.formValid = new EventEmitter();
this.formSettings = this.getDefaultSettings();
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (changes["schema"]) {
this.schema = changes["schema"]["currentValue"];
this.registerForm();
}
if (changes["settings"]) {
this.settings = changes["settings"]["currentValue"];
this.formSettings = this.mergeFormSettings(this.formSettings, this.settings);
this.submitButtonConfig = this.getSubmitButtonConfig(this.formSettings.submitButton);
}
}
/**
* @return {?}
*/
registerForm() {
this.form = this.createGroup(this.schema);
this.registeredForm.emit(this.form);
this.handleEmitters();
this.onFormUpdate();
}
/**
* @param {?} event
* @return {?}
*/
handleSubmit(event) {
event.preventDefault();
event.stopPropagation();
this.submit.emit(this.form.getRawValue());
}
/**
* @return {?}
*/
onFormUpdate() {
this.form.valueChanges.subscribe((/**
* @param {?} val
* @return {?}
*/
(val) => {
this.schema.forEach((/**
* @param {?} item
* @return {?}
*/
(item) => {
if (val[item.key] !== undefined) {
item.value = val[item.key];
}
}));
this.handleEmitters();
}));
}
/**
* @param {?} schema
* @return {?}
*/
createGroup(schema) {
/** @type {?} */
const group = {};
if (schema) {
schema.forEach((/**
* @param {?} item
* @return {?}
*/
(item) => {
/** @type {?} */
const value = item.value !== undefined ? item.value : "";
/** @type {?} */
const formState = { value, disabled: item.disabled || false };
group[item.key] = item.required ? new FormControl(formState, Validators.required) : new FormControl(formState);
}));
}
return new FormGroup(group);
}
/**
* @return {?}
*/
handleEmitters() {
/** @type {?} */
const isFormValid = this.form.valid;
this.submitButtonConfig = this.getSubmitButtonConfig({ disabled: !isFormValid });
this.formValid.emit(isFormValid);
if (this.form.dirty) {
this.formChange.emit({ raw: this.form.getRawValue(), schema: this.schema });
this.formTouch.emit(this.form.dirty);
}
}
/**
* @return {?}
*/
getDefaultSettings() {
/** @type {?} */
const formCommonSettings = {
nzGutter: 8,
itemClass: "",
nzSpanLabel: 8,
labelClass: "",
nzSpanControl: 16,
fieldClass: ""
};
/** @type {?} */
const defaultSettings = (/** @type {?} */ (Object.assign({}, formCommonSettings, { submitButton: (/** @type {?} */ ({
show: true,
label: "Submit",
disabled: false
})) })));
return JSON.parse(JSON.stringify(defaultSettings));
}
/**
* @param {?=} newConfig
* @return {?}
*/
getSubmitButtonConfig(newConfig = {}) {
/** @type {?} */
const defaultConfig = Object.assign((/** @type {?} */ (Object.assign({ key: "submit", type: "button" }, this.formSettings.submitButton))), newConfig);
this.formSettings.submitButton = defaultConfig;
return JSON.parse(JSON.stringify(defaultConfig));
}
/**
* @param {?} dest
* @param {?} source
* @return {?}
*/
mergeFormSettings(dest, source) {
/** @type {?} */
const newSubmitButtonConfig = source.submitButton || {};
/** @type {?} */
const submitButtonConfig = Object.assign(dest.submitButton, newSubmitButtonConfig);
/** @type {?} */
const settings = Object.assign(dest, source);
settings.submitButton = submitButtonConfig;
return settings;
}
}
NgxAntdJsonSchemaFormComponent.decorators = [
{ type: Component, args: [{
selector: "ngx-antd-json-schema-form",
template: "<form *ngIf=\"form\" class=\"json-schema-form\" nz-form [formGroup]=\"form\" (submit)=\"handleSubmit($event)\">\n <ng-container *ngFor=\"let field of schema\" dynamicField [config]=\"field\" [settings]=\"formSettings\" [group]=\"form\">\n </ng-container>\n <json-schema-form-button\n *ngIf=\"formSettings.submitButton.show\"\n [group]=\"form\"\n [config]=\"submitButtonConfig\"\n [settings]=\"formSettings\"\n >\n </json-schema-form-button>\n</form>\n",
encapsulation: ViewEncapsulation.None,
styles: [".json-form-schema-field.ant-form-item{padding-bottom:0;margin-bottom:0}"]
}] }
];
/** @nocollapse */
NgxAntdJsonSchemaFormComponent.ctorParameters = () => [];
NgxAntdJsonSchemaFormComponent.propDecorators = {
schema: [{ type: Input }],
settings: [{ type: Input }],
registeredForm: [{ type: Output }],
formChange: [{ type: Output }],
formTouch: [{ type: Output }],
submit: [{ type: Output }],
formValid: [{ type: Output }]
};
if (false) {
/** @type {?} */
NgxAntdJsonSchemaFormComponent.prototype.schema;
/** @type {?} */
NgxAntdJsonSchemaFormComponent.prototype.settings;
/** @type {?} */
NgxAntdJsonSchemaFormComponent.prototype.registeredForm;
/** @type {?} */
NgxAntdJsonSchemaFormComponent.prototype.formChange;
/** @type {?} */
NgxAntdJsonSchemaFormComponent.prototype.formTouch;
/** @type {?} */
NgxAntdJsonSchemaFormComponent.prototype.submit;
/** @type {?} */
NgxAntdJsonSchemaFormComponent.prototype.formValid;
/** @type {?} */
NgxAntdJsonSchemaFormComponent.prototype.form;
/** @type {?} */
NgxAntdJsonSchemaFormComponent.prototype.submitButtonConfig;
/** @type {?} */
NgxAntdJsonSchemaFormComponent.prototype.formSettings;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWFudGQtanNvbi1zY2hlbWEtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYW50ZC1qc29uLXNjaGVtYS1mb3JtLyIsInNvdXJjZXMiOlsibGliL25neC1hbnRkLWpzb24tc2NoZW1hLWZvcm0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBNEIsTUFBTSxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwSCxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFVcEUsTUFBTSxPQUFPLDhCQUE4QjtJQWN6QztRQWJTLFdBQU0sR0FBZSxFQUFFLENBQUM7UUFHdkIsbUJBQWMsR0FBNEIsSUFBSSxZQUFZLEVBQWEsQ0FBQztRQUN4RSxlQUFVLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFDeEQsY0FBUyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3ZELFdBQU0sR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNwRCxjQUFTLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUM7UUFJekUsaUJBQVksR0FBaUIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFFeEMsQ0FBQzs7Ozs7SUFFaEIsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUNyQjtRQUNELElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFD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LEVBQUUscUJBQXFCLENBQUM7O2NBQzVFLFFBQVEsR0FBaUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO1FBQzFELFFBQVEsQ0FBQyxZQUFZLEdBQUcsa0JBQWtCLENBQUM7UUFDM0MsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQzs7O1lBMUhGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsMkJBQTJCO2dCQUNyQyxnZUFBeUQ7Z0JBRXpELGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJOzthQUN0Qzs7Ozs7cUJBRUUsS0FBSzt1QkFDTCxLQUFLOzZCQUVMLE1BQU07eUJBQ04sTUFBTTt3QkFDTixNQUFNO3FCQUNOLE1BQU07d0JBQ04sTUFBTTs7OztJQVBQLGdEQUFpQzs7SUFDakMsa0RBQWdDOztJQUVoQyx3REFBa0Y7O0lBQ2xGLG9EQUFrRTs7SUFDbEUsbURBQWlFOztJQUNqRSxnREFBOEQ7O0lBQzlELG1EQUF5RTs7SUFFekUsOENBQWdCOztJQUNoQiw0REFBNkI7O0lBQzdCLHNEQUF1RCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IEZvcm1JdGVtLCBGb3JtU2V0dGluZ3MsIEZvcm1TdWJtaXRCdXR0b24sIEZvcm1Db21tb25TZXR0aW5ncyB9IGZyb20gXCIuL21vZGVscy9pbmRleFwiO1xuXG4vLyBbJycsIFsgVmFsaWRhdG9ycy5wYXR0ZXJuKC9eWzAtOSBdezEsMTV9JC8pXV1cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJuZ3gtYW50ZC1qc29uLXNjaGVtYS1mb3JtXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vbmd4LWFudGQtanNvbi1zY2hlbWEtZm9ybS5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vbmd4LWFudGQtanNvbi1zY2hlbWEtZm9ybS5jb21wb25lbnQuc2Nzc1wiXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBOZ3hBbnRkSnNvblNjaGVtYUZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBzY2hlbWE6IEZvcm1JdGVtW10gPSBbXTtcbiAgQElucHV0KCkgc2V0dGluZ3M6IEZvcm1TZXR0aW5ncztcblxuICBAT3V0cHV0KCkgcmVnaXN0ZXJlZEZvcm06IEV2ZW50RW1pdHRlcjxGb3JtR3JvdXA+ID0gbmV3IEV2ZW50RW1pdHRlcjxGb3JtR3JvdXA+KCk7XG4gIEBPdXRwdXQoKSBmb3JtQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgZm9ybVRvdWNoOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgc3VibWl0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgZm9ybVZhbGlkOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgZm9ybTogRm9ybUdyb3VwO1xuICBzdWJtaXRCdXR0b25Db25maWc6IEZvcm1JdGVtO1xuICBmb3JtU2V0dGluZ3M6IEZvcm1TZXR0aW5ncyA9IHRoaXMuZ2V0RGVmYXVsdFNldHRpbmdzKCk7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1tcInNjaGVtYVwiXSkge1xuICAgICAgdGhpcy5zY2hlbWEgPSBjaGFuZ2VzW1wic2NoZW1hXCJdW1wiY3VycmVudFZhbHVlXCJdO1xuICAgICAgdGhpcy5yZWdpc3RlckZvcm0oKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbXCJzZXR0aW5nc1wiXSkge1xuICAgICAgdGhpcy5zZXR0aW5ncyA9IGNoYW5nZXNbXCJzZXR0aW5nc1wiXVtcImN1cnJlbnRWYWx1ZVwiXTtcbiAgICAgIHRoaXMuZm9ybVNldHRpbmdzID0gdGhpcy5tZXJnZUZvcm1TZXR0aW5ncyh0aGlzLmZvcm1TZXR0aW5ncywgdGhpcy5zZXR0aW5ncyk7XG4gICAgICB0aGlzLnN1Ym1pdEJ1dHRvbkNvbmZpZyA9IHRoaXMuZ2V0U3VibWl0QnV0dG9uQ29uZmlnKHRoaXMuZm9ybVNldHRpbmdzLnN1Ym1pdEJ1dHRvbik7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJGb3JtKCkge1xuICAgIHRoaXMuZm9ybSA9IHRoaXMuY3JlYXRlR3JvdXAodGhpcy5zY2hlbWEpO1xuICAgIHRoaXMucmVnaXN0ZXJlZEZvcm0uZW1pdCh0aGlzLmZvcm0pO1xuICAgIHRoaXMuaGFuZGxlRW1pdHRlcnMoKTtcbiAgICB0aGlzLm9uRm9ybVVwZGF0ZSgpO1xuICB9XG5cbiAgaGFuZGxlU3VibWl0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5zdWJtaXQuZW1pdCh0aGlzLmZvcm0uZ2V0UmF3VmFsdWUoKSk7XG4gIH1cblxuICBvbkZvcm1VcGRhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbCkgPT4ge1xuICAgICAgdGhpcy5zY2hlbWEuZm9yRWFjaCgoaXRlbTogRm9ybUl0ZW0pID0+IHtcbiAgICAgICAgaWYgKHZhbFtpdGVtLmtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGl0ZW0udmFsdWUgPSB2YWxbaXRlbS5rZXldO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuaGFuZGxlRW1pdHRlcnMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZUdyb3VwKHNjaGVtYSk6IEZvcm1Hcm91cCB7XG4gICAgY29uc3QgZ3JvdXA6IGFueSA9IHt9O1xuXG4gICAgaWYgKHNjaGVtYSkge1xuICAgICAgc2NoZW1hLmZvckVhY2goKGl0ZW06IEZvcm1JdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gaXRlbS52YWx1ZSAhPT0gdW5kZWZpbmVkID8gaXRlbS52YWx1ZSA6IFwiXCI7XG4gICAgICAgIGNvbnN0IGZvcm1TdGF0ZSA9IHsgdmFsdWUsIGRpc2FibGVkOiBpdGVtLmRpc2FibGVkIHx8IGZhbHNlIH07XG4gICAgICAgIGdyb3VwW2l0ZW0ua2V5XSA9IGl0ZW0ucmVxdWlyZWQgPyBuZXcgRm9ybUNvbnRyb2woZm9ybVN0YXRlLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSA6IG5ldyBGb3JtQ29udHJvbChmb3JtU3RhdGUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBGb3JtR3JvdXAoZ3JvdXApO1xuICB9XG5cbiAgaGFuZGxlRW1pdHRlcnMoKSB7XG4gICAgY29uc3QgaXNGb3JtVmFsaWQ6IGJvb2xlYW4gPSB0aGlzLmZvcm0udmFsaWQ7XG4gICAgdGhpcy5zdWJtaXRCdXR0b25Db25maWcgPSB0aGlzLmdldFN1Ym1pdEJ1dHRvbkNvbmZpZyh7IGRpc2FibGVkOiAhaXNGb3JtVmFsaWQgfSk7XG4gICAgdGhpcy5mb3JtVmFsaWQuZW1pdChpc0Zvcm1WYWxpZCk7XG4gICAgaWYgKHRoaXMuZm9ybS5kaXJ0eSkge1xuICAgICAgdGhpcy5mb3JtQ2hhbmdlLmVtaXQoeyByYXc6IHRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpLCBzY2hlbWE6IHRoaXMuc2NoZW1hIH0pO1xuICAgICAgdGhpcy5mb3JtVG91Y2guZW1pdCh0aGlzLmZvcm0uZGlydHkpO1xuICAgIH1cbiAgfVxuXG4gIGdldERlZmF1bHRTZXR0aW5ncygpOiBGb3JtU2V0dGluZ3Mge1xuICAgIGNvbnN0IGZvcm1Db21tb25TZXR0aW5nczogRm9ybUNvbW1vblNldHRpbmdzID0ge1xuICAgICAgbnpHdXR0ZXI6IDgsXG4gICAgICBpdGVtQ2xhc3M6IFwiXCIsXG4gICAgICBuelNwYW5MYWJlbDogOCxcbiAgICAgIGxhYmVsQ2xhc3M6IFwiXCIsXG4gICAgICBuelNwYW5Db250cm9sOiAxNixcbiAgICAgIGZpZWxkQ2xhc3M6IFwiXCJcbiAgICB9O1xuICAgIGNvbnN0IGRlZmF1bHRTZXR0aW5ncyA9IHtcbiAgICAgIC4uLmZvcm1Db21tb25TZXR0aW5ncyxcbiAgICAgIHN1Ym1pdEJ1dHRvbjoge1xuICAgICAgICBzaG93OiB0cnVlLFxuICAgICAgICBsYWJlbDogXCJTdWJtaXRcIixcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlXG4gICAgICB9IGFzIEZvcm1TdWJtaXRCdXR0b25cbiAgICB9IGFzIEZvcm1TZXR0aW5ncztcblxuICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRlZmF1bHRTZXR0aW5ncykpO1xuICB9XG5cbiAgZ2V0U3VibWl0QnV0dG9uQ29uZmlnKG5ld0NvbmZpZzogRm9ybVN1Ym1pdEJ1dHRvbiA9IHt9KTogRm9ybUl0ZW0ge1xuICAgIGNvbnN0IGRlZmF1bHRDb25maWcgPSBPYmplY3QuYXNzaWduKFxuICAgICAge1xuICAgICAgICBrZXk6IFwic3VibWl0XCIsXG4gICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgIC4uLnRoaXMuZm9ybVNldHRpbmdzLnN1Ym1pdEJ1dHRvblxuICAgICAgfSBhcyBGb3JtSXRlbSxcbiAgICAgIG5ld0NvbmZpZ1xuICAgICk7XG4gICAgdGhpcy5mb3JtU2V0dGluZ3Muc3VibWl0QnV0dG9uID0gZGVmYXVsdENvbmZpZztcbiAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkZWZhdWx0Q29uZmlnKSk7XG4gIH1cblxuICBtZXJnZUZvcm1TZXR0aW5ncyhkZXN0OiBGb3JtU2V0dGluZ3MsIHNvdXJjZTogRm9ybVNldHRpbmdzKSB7XG4gICAgY29uc3QgbmV3U3VibWl0QnV0dG9uQ29uZmlnID0gc291cmNlLnN1Ym1pdEJ1dHRvbiB8fCB7fTtcbiAgICBjb25zdCBzdWJtaXRCdXR0b25Db25maWcgPSBPYmplY3QuYXNzaWduKGRlc3Quc3VibWl0QnV0dG9uLCBuZXdTdWJtaXRCdXR0b25Db25maWcpO1xuICAgIGNvbnN0IHNldHRpbmdzOiBGb3JtU2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKGRlc3QsIHNvdXJjZSk7XG4gICAgc2V0dGluZ3Muc3VibWl0QnV0dG9uID0gc3VibWl0QnV0dG9uQ29uZmlnO1xuICAgIHJldHVybiBzZXR0aW5ncztcbiAgfVxufVxuIl19