UNPKG

angular6-json-schema-form

Version:
680 lines 106 kB
import * as tslib_1 from "tslib"; import cloneDeep from 'lodash-es/cloneDeep'; import Ajv from 'ajv'; import jsonDraft6 from 'ajv/lib/refs/json-schema-draft-06.json'; import { buildFormGroup, buildFormGroupTemplate, formatFormData, getControl } from './shared/form-group.functions'; import { buildLayout, getLayoutNode } from './shared/layout.functions'; import { buildSchemaFromData, buildSchemaFromLayout, removeRecursiveReferences } from './shared/json-schema.functions'; import { enValidationMessages } from './locale/en-validation-messages'; import { frValidationMessages } from './locale/fr-validation-messages'; import { zhValidationMessages } from './locale/zh-validation-messages'; import { fixTitle, forEach, hasOwn, toTitleCase } from './shared/utility.functions'; import { hasValue, isArray, isDefined, isEmpty, isObject } from './shared/validator.functions'; import { Injectable } from '@angular/core'; import { JsonPointer } from './shared/jsonpointer.functions'; import { Subject } from 'rxjs'; var JsonSchemaFormService = /** @class */ (function () { function JsonSchemaFormService() { this.JsonFormCompatibility = false; this.ReactJsonSchemaFormCompatibility = false; this.AngularSchemaFormCompatibility = false; this.tpldata = {}; this.ajvOptions = { allErrors: true, jsonPointers: true, unknownFormats: 'ignore' }; this.ajv = new Ajv(this.ajvOptions); // AJV: Another JSON Schema Validator this.validateFormData = null; // Compiled AJV function to validate active form's schema this.formValues = {}; // Internal form data (may not have correct types) this.data = {}; // Output form data (formValues, formatted with correct data types) this.schema = {}; // Internal JSON Schema this.layout = []; // Internal form layout this.formGroupTemplate = {}; // Template used to create formGroup this.formGroup = null; // Angular formGroup, which powers the reactive form this.framework = null; // Active framework component this.validData = null; // Valid form data (or null) (=== isValid ? data : null) this.isValid = null; // Is current form data valid? this.ajvErrors = null; // Ajv errors for current data this.validationErrors = null; // Any validation errors for current data this.dataErrors = new Map(); // this.formValueSubscription = null; // Subscription to formGroup.valueChanges observable (for un- and re-subscribing) this.dataChanges = new Subject(); // Form data observable this.isValidChanges = new Subject(); // isValid observable this.validationErrorChanges = new Subject(); // validationErrors observable this.arrayMap = new Map(); // Maps arrays in data object and number of tuple values this.dataMap = new Map(); // Maps paths in form data to schema and formGroup paths this.dataRecursiveRefMap = new Map(); // Maps recursive reference points in form data this.schemaRecursiveRefMap = new Map(); // Maps recursive reference points in schema this.schemaRefLibrary = {}; // Library of schemas for resolving schema $refs this.layoutRefLibrary = { '': null }; // Library of layout nodes for adding to form this.templateRefLibrary = {}; // Library of formGroup templates for adding to form this.hasRootReference = false; // Does the form include a recursive reference to itself? this.language = 'en-US'; // Does the form include a recursive reference to itself? // Default global form options this.defaultFormOptions = { autocomplete: true, addSubmit: 'auto', // for addSubmit: true = always, false = never, // 'auto' = only if layout is undefined (form is built from schema alone) debug: false, disableInvalidSubmit: true, formDisabled: false, formReadonly: false, fieldsRequired: false, framework: 'no-framework', loadExternalAssets: false, pristine: { errors: true, success: true }, supressPropertyTitles: false, setSchemaDefaults: 'auto', // true = always set (unless overridden by layout default or formValues) // false = never set // 'auto' = set in addable components, and everywhere if formValues not set setLayoutDefaults: 'auto', // true = always set (unless overridden by formValues) // false = never set // 'auto' = set in addable components, and everywhere if formValues not set validateOnRender: 'auto', // true = validate all fields immediately // false = only validate fields after they are touched by user // 'auto' = validate fields with values immediately, empty fields after they are touched widgets: {}, defautWidgetOptions: { listItems: 1, addable: true, orderable: true, removable: true, enableErrorState: true, // disableErrorState: false, // Don't apply 'has-error' class when field fails validation? enableSuccessState: true, // disableSuccessState: false, // Don't apply 'has-success' class when field validates? feedback: false, feedbackOnRender: false, notitle: false, disabled: false, readonly: false, returnEmptyFields: true, validationMessages: {} // set by setLanguage() }, }; this.setLanguage(this.language); this.ajv.addMetaSchema(jsonDraft6); } JsonSchemaFormService.prototype.setLanguage = function (language) { if (language === void 0) { language = 'en-US'; } this.language = language; var languageValidationMessages = { fr: frValidationMessages, en: enValidationMessages, zh: zhValidationMessages }; var languageCode = language.slice(0, 2); var validationMessages = languageValidationMessages[languageCode]; this.defaultFormOptions.defautWidgetOptions.validationMessages = cloneDeep(validationMessages); }; JsonSchemaFormService.prototype.getData = function () { return this.data; }; JsonSchemaFormService.prototype.getSchema = function () { return this.schema; }; JsonSchemaFormService.prototype.getLayout = function () { return this.layout; }; JsonSchemaFormService.prototype.resetAllValues = function () { this.JsonFormCompatibility = false; this.ReactJsonSchemaFormCompatibility = false; this.AngularSchemaFormCompatibility = false; this.tpldata = {}; this.validateFormData = null; this.formValues = {}; this.schema = {}; this.layout = []; this.formGroupTemplate = {}; this.formGroup = null; this.framework = null; this.data = {}; this.validData = null; this.isValid = null; this.validationErrors = null; this.arrayMap = new Map(); this.dataMap = new Map(); this.dataRecursiveRefMap = new Map(); this.schemaRecursiveRefMap = new Map(); this.layoutRefLibrary = {}; this.schemaRefLibrary = {}; this.templateRefLibrary = {}; this.formOptions = cloneDeep(this.defaultFormOptions); }; /** * 'buildRemoteError' function * * Example errors: * { * last_name: [ { * message: 'Last name must by start with capital letter.', * code: 'capital_letter' * } ], * email: [ { * message: 'Email must be from example.com domain.', * code: 'special_domain' * }, { * message: 'Email must contain an @ symbol.', * code: 'at_symbol' * } ] * } * //{ErrorMessages} errors */ JsonSchemaFormService.prototype.buildRemoteError = function (errors) { var _this = this; forEach(errors, function (value, key) { var e_1, _a; if (key in _this.formGroup.controls) { try { for (var value_1 = tslib_1.__values(value), value_1_1 = value_1.next(); !value_1_1.done; value_1_1 = value_1.next()) { var error = value_1_1.value; var err = {}; err[error['code']] = error['message']; _this.formGroup.get(key).setErrors(err, { emitEvent: true }); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (value_1_1 && !value_1_1.done && (_a = value_1.return)) _a.call(value_1); } finally { if (e_1) throw e_1.error; } } } }); }; JsonSchemaFormService.prototype.validateData = function (newValue, updateSubscriptions) { if (updateSubscriptions === void 0) { updateSubscriptions = true; } // Format raw form data to correct data types this.data = formatFormData(newValue, this.dataMap, this.dataRecursiveRefMap, this.arrayMap, this.formOptions.returnEmptyFields); this.isValid = this.validateFormData(this.data); this.validData = this.isValid ? this.data : null; var compileErrors = function (errors) { var compiledErrors = {}; (errors || []).forEach(function (error) { if (!compiledErrors[error.dataPath]) { compiledErrors[error.dataPath] = []; } compiledErrors[error.dataPath].push(error.message); }); return compiledErrors; }; this.ajvErrors = this.validateFormData.errors; this.validationErrors = compileErrors(this.validateFormData.errors); if (updateSubscriptions) { this.dataChanges.next(this.data); this.isValidChanges.next(this.isValid); this.validationErrorChanges.next(this.ajvErrors); } }; JsonSchemaFormService.prototype.buildFormGroupTemplate = function (formValues, setValues) { if (formValues === void 0) { formValues = null; } if (setValues === void 0) { setValues = true; } this.formGroupTemplate = buildFormGroupTemplate(this, formValues, setValues); }; JsonSchemaFormService.prototype.buildFormGroup = function () { var _this = this; this.formGroup = buildFormGroup(this.formGroupTemplate); if (this.formGroup) { this.compileAjvSchema(); this.validateData(this.formGroup.value); // Set up observables to emit data and validation info when form data changes if (this.formValueSubscription) { this.formValueSubscription.unsubscribe(); } this.formValueSubscription = this.formGroup.valueChanges .subscribe(function (formValue) { return _this.validateData(formValue); }); } }; JsonSchemaFormService.prototype.buildLayout = function (widgetLibrary) { this.layout = buildLayout(this, widgetLibrary); }; JsonSchemaFormService.prototype.setOptions = function (newOptions) { if (isObject(newOptions)) { var addOptions = cloneDeep(newOptions); // Backward compatibility for 'defaultOptions' (renamed 'defautWidgetOptions') if (isObject(addOptions.defaultOptions)) { Object.assign(this.formOptions.defautWidgetOptions, addOptions.defaultOptions); delete addOptions.defaultOptions; } if (isObject(addOptions.defautWidgetOptions)) { Object.assign(this.formOptions.defautWidgetOptions, addOptions.defautWidgetOptions); delete addOptions.defautWidgetOptions; } Object.assign(this.formOptions, addOptions); // convert disableErrorState / disableSuccessState to enable... var globalDefaults_1 = this.formOptions.defautWidgetOptions; ['ErrorState', 'SuccessState'] .filter(function (suffix) { return hasOwn(globalDefaults_1, 'disable' + suffix); }) .forEach(function (suffix) { globalDefaults_1['enable' + suffix] = !globalDefaults_1['disable' + suffix]; delete globalDefaults_1['disable' + suffix]; }); } }; JsonSchemaFormService.prototype.compileAjvSchema = function () { if (!this.validateFormData) { // if 'ui:order' exists in properties, move it to root before compiling with ajv if (Array.isArray(this.schema.properties['ui:order'])) { this.schema['ui:order'] = this.schema.properties['ui:order']; delete this.schema.properties['ui:order']; } this.ajv.removeSchema(this.schema); this.validateFormData = this.ajv.compile(this.schema); } }; JsonSchemaFormService.prototype.buildSchemaFromData = function (data, requireAllFields) { if (requireAllFields === void 0) { requireAllFields = false; } if (data) { return buildSchemaFromData(data, requireAllFields); } this.schema = buildSchemaFromData(this.formValues, requireAllFields); }; JsonSchemaFormService.prototype.buildSchemaFromLayout = function (layout) { if (layout) { return buildSchemaFromLayout(layout); } this.schema = buildSchemaFromLayout(this.layout); }; JsonSchemaFormService.prototype.setTpldata = function (newTpldata) { if (newTpldata === void 0) { newTpldata = {}; } this.tpldata = newTpldata; }; JsonSchemaFormService.prototype.parseText = function (text, value, values, key) { var _this = this; if (text === void 0) { text = ''; } if (value === void 0) { value = {}; } if (values === void 0) { values = {}; } if (key === void 0) { key = null; } if (!text || !/{{.+?}}/.test(text)) { return text; } return text.replace(/{{(.+?)}}/g, function () { var a = []; for (var _i = 0; _i < arguments.length; _i++) { a[_i] = arguments[_i]; } return _this.parseExpression(a[1], value, values, key, _this.tpldata); }); }; JsonSchemaFormService.prototype.parseExpression = function (expression, value, values, key, tpldata) { var _this = this; if (expression === void 0) { expression = ''; } if (value === void 0) { value = {}; } if (values === void 0) { values = {}; } if (key === void 0) { key = null; } if (tpldata === void 0) { tpldata = null; } if (typeof expression !== 'string') { return ''; } var index = typeof key === 'number' ? (key + 1) + '' : (key || ''); expression = expression.trim(); if ((expression[0] === '\'' || expression[0] === '"') && expression[0] === expression[expression.length - 1] && expression.slice(1, expression.length - 1).indexOf(expression[0]) === -1) { return expression.slice(1, expression.length - 1); } if (expression === 'idx' || expression === '$index') { return index; } if (expression === 'value' && !hasOwn(values, 'value')) { return value; } if (['"', '\'', ' ', '||', '&&', '+'].every(function (delim) { return expression.indexOf(delim) === -1; })) { var pointer = JsonPointer.parseObjectPath(expression); return pointer[0] === 'value' && JsonPointer.has(value, pointer.slice(1)) ? JsonPointer.get(value, pointer.slice(1)) : pointer[0] === 'values' && JsonPointer.has(values, pointer.slice(1)) ? JsonPointer.get(values, pointer.slice(1)) : pointer[0] === 'tpldata' && JsonPointer.has(tpldata, pointer.slice(1)) ? JsonPointer.get(tpldata, pointer.slice(1)) : JsonPointer.has(values, pointer) ? JsonPointer.get(values, pointer) : ''; } if (expression.indexOf('[idx]') > -1) { expression = expression.replace(/\[idx\]/g, index); } if (expression.indexOf('[$index]') > -1) { expression = expression.replace(/\[$index\]/g, index); } // TODO: Improve expression evaluation by parsing quoted strings first // let expressionArray = expression.match(/([^"']+|"[^"]+"|'[^']+')/g); if (expression.indexOf('||') > -1) { return expression.split('||').reduce(function (all, term) { return all || _this.parseExpression(term, value, values, key, tpldata); }, ''); } if (expression.indexOf('&&') > -1) { return expression.split('&&').reduce(function (all, term) { return all && _this.parseExpression(term, value, values, key, tpldata); }, ' ').trim(); } if (expression.indexOf('+') > -1) { return expression.split('+') .map(function (term) { return _this.parseExpression(term, value, values, key, tpldata); }) .join(''); } return ''; }; JsonSchemaFormService.prototype.setArrayItemTitle = function (parentCtx, childNode, index) { if (parentCtx === void 0) { parentCtx = {}; } if (childNode === void 0) { childNode = null; } if (index === void 0) { index = null; } var parentNode = parentCtx.layoutNode; var parentValues = this.getFormControlValue(parentCtx); var isArrayItem = (parentNode.type || '').slice(-5) === 'array' && isArray(parentValues); var text = JsonPointer.getFirst(isArrayItem && childNode.type !== '$ref' ? [ [childNode, '/options/legend'], [childNode, '/options/title'], [parentNode, '/options/title'], [parentNode, '/options/legend'], ] : [ [childNode, '/options/title'], [childNode, '/options/legend'], [parentNode, '/options/title'], [parentNode, '/options/legend'] ]); if (!text) { return text; } var childValue = isArray(parentValues) && index < parentValues.length ? parentValues[index] : parentValues; return this.parseText(text, childValue, parentValues, index); }; JsonSchemaFormService.prototype.setItemTitle = function (ctx) { return !ctx.options.title && /^(\d+|-)$/.test(ctx.layoutNode.name) ? null : this.parseText(ctx.options.title || toTitleCase(ctx.layoutNode.name), this.getFormControlValue(this), (this.getFormControlGroup(this) || {}).value, ctx.dataIndex[ctx.dataIndex.length - 1]); }; JsonSchemaFormService.prototype.evaluateCondition = function (layoutNode, dataIndex) { var arrayIndex = dataIndex && dataIndex[dataIndex.length - 1]; var result = true; if (hasValue((layoutNode.options || {}).condition)) { if (typeof layoutNode.options.condition === 'string') { var pointer = layoutNode.options.condition; if (hasValue(arrayIndex)) { pointer = pointer.replace('[arrayIndex]', "[" + arrayIndex + "]"); } pointer = JsonPointer.parseObjectPath(pointer); result = !!JsonPointer.get(this.data, pointer); if (!result && pointer[0] === 'model') { result = !!JsonPointer.get({ model: this.data }, pointer); } } else if (typeof layoutNode.options.condition === 'function') { result = layoutNode.options.condition(this.data); } else if (typeof layoutNode.options.condition.functionBody === 'string') { try { var dynFn = new Function('model', 'arrayIndices', layoutNode.options.condition.functionBody); result = dynFn(this.data, dataIndex); } catch (e) { result = true; console.error('condition functionBody errored out on evaluation: ' + layoutNode.options.condition.functionBody); } } } return result; }; JsonSchemaFormService.prototype.initializeControl = function (ctx, bind) { var _this = this; if (bind === void 0) { bind = true; } if (!isObject(ctx)) { return false; } if (isEmpty(ctx.options)) { ctx.options = !isEmpty((ctx.layoutNode || {}).options) ? ctx.layoutNode.options : cloneDeep(this.formOptions); } ctx.formControl = this.getFormControl(ctx); ctx.boundControl = bind && !!ctx.formControl; if (ctx.formControl) { ctx.controlName = this.getFormControlName(ctx); ctx.controlValue = ctx.formControl.value; ctx.controlDisabled = ctx.formControl.disabled; ctx.options.errorMessage = ctx.formControl.status === 'VALID' ? null : this.formatErrors(ctx.formControl.errors, ctx.options.validationMessages); ctx.options.showErrors = this.formOptions.validateOnRender === true || (this.formOptions.validateOnRender === 'auto' && hasValue(ctx.controlValue)); ctx.formControl.statusChanges.subscribe(function (status) { return ctx.options.errorMessage = status === 'VALID' ? null : _this.formatErrors(ctx.formControl.errors, ctx.options.validationMessages); }); ctx.formControl.valueChanges.subscribe(function (value) { if (!!value) { ctx.controlValue = value; } }); } else { ctx.controlName = ctx.layoutNode.name; ctx.controlValue = ctx.layoutNode.value || null; var dataPointer = this.getDataPointer(ctx); if (bind && dataPointer) { console.error("warning: control \"" + dataPointer + "\" is not bound to the Angular FormGroup."); } } return ctx.boundControl; }; JsonSchemaFormService.prototype.formatErrors = function (errors, validationMessages) { if (validationMessages === void 0) { validationMessages = {}; } if (isEmpty(errors)) { return null; } if (!isObject(validationMessages)) { validationMessages = {}; } var addSpaces = function (string) { return string[0].toUpperCase() + (string.slice(1) || '') .replace(/([a-z])([A-Z])/g, '$1 $2').replace(/_/g, ' '); }; var formatError = function (error) { return typeof error === 'object' ? Object.keys(error).map(function (key) { return error[key] === true ? addSpaces(key) : error[key] === false ? 'Not ' + addSpaces(key) : addSpaces(key) + ': ' + formatError(error[key]); }).join(', ') : addSpaces(error.toString()); }; var messages = []; return Object.keys(errors) // Hide 'required' error, unless it is the only one .filter(function (errorKey) { return errorKey !== 'required' || Object.keys(errors).length === 1; }) .map(function (errorKey) { // If validationMessages is a string, return it return typeof validationMessages === 'string' ? validationMessages : // If custom error message is a function, return function result typeof validationMessages[errorKey] === 'function' ? validationMessages[errorKey](errors[errorKey]) : // If custom error message is a string, replace placeholders and return typeof validationMessages[errorKey] === 'string' ? // Does error message have any {{property}} placeholders? !/{{.+?}}/.test(validationMessages[errorKey]) ? validationMessages[errorKey] : // Replace {{property}} placeholders with values Object.keys(errors[errorKey]) .reduce(function (errorMessage, errorProperty) { return errorMessage.replace(new RegExp('{{' + errorProperty + '}}', 'g'), errors[errorKey][errorProperty]); }, validationMessages[errorKey]) : // If no custom error message, return formatted error data instead addSpaces(errorKey) + ' Error: ' + formatError(errors[errorKey]); }).join('<br>'); }; JsonSchemaFormService.prototype.updateValue = function (ctx, value) { var e_2, _a; // Set value of current control ctx.controlValue = value; if (ctx.boundControl) { ctx.formControl.setValue(value); ctx.formControl.markAsDirty(); } ctx.layoutNode.value = value; // Set values of any related controls in copyValueTo array if (isArray(ctx.options.copyValueTo)) { try { for (var _b = tslib_1.__values(ctx.options.copyValueTo), _c = _b.next(); !_c.done; _c = _b.next()) { var item = _c.value; var targetControl = getControl(this.formGroup, item); if (isObject(targetControl) && typeof targetControl.setValue === 'function') { targetControl.setValue(value); targetControl.markAsDirty(); } } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_2) throw e_2.error; } } } }; JsonSchemaFormService.prototype.updateArrayCheckboxList = function (ctx, checkboxList) { var e_3, _a; var formArray = this.getFormControl(ctx); // Remove all existing items while (formArray.value.length) { formArray.removeAt(0); } // Re-add an item for each checked box var refPointer = removeRecursiveReferences(ctx.layoutNode.dataPointer + '/-', this.dataRecursiveRefMap, this.arrayMap); try { for (var checkboxList_1 = tslib_1.__values(checkboxList), checkboxList_1_1 = checkboxList_1.next(); !checkboxList_1_1.done; checkboxList_1_1 = checkboxList_1.next()) { var checkboxItem = checkboxList_1_1.value; if (checkboxItem.checked) { var newFormControl = buildFormGroup(this.templateRefLibrary[refPointer]); newFormControl.setValue(checkboxItem.value); formArray.push(newFormControl); } } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (checkboxList_1_1 && !checkboxList_1_1.done && (_a = checkboxList_1.return)) _a.call(checkboxList_1); } finally { if (e_3) throw e_3.error; } } formArray.markAsDirty(); }; JsonSchemaFormService.prototype.getFormControl = function (ctx) { if (!ctx.layoutNode || !isDefined(ctx.layoutNode.dataPointer) || ctx.layoutNode.type === '$ref') { return null; } return getControl(this.formGroup, this.getDataPointer(ctx)); }; JsonSchemaFormService.prototype.getFormControlValue = function (ctx) { if (!ctx.layoutNode || !isDefined(ctx.layoutNode.dataPointer) || ctx.layoutNode.type === '$ref') { return null; } var control = getControl(this.formGroup, this.getDataPointer(ctx)); return control ? control.value : null; }; JsonSchemaFormService.prototype.getFormControlGroup = function (ctx) { if (!ctx.layoutNode || !isDefined(ctx.layoutNode.dataPointer)) { return null; } return getControl(this.formGroup, this.getDataPointer(ctx), true); }; JsonSchemaFormService.prototype.getFormControlName = function (ctx) { if (!ctx.layoutNode || !isDefined(ctx.layoutNode.dataPointer) || !hasValue(ctx.dataIndex)) { return null; } return JsonPointer.toKey(this.getDataPointer(ctx)); }; JsonSchemaFormService.prototype.getLayoutArray = function (ctx) { return JsonPointer.get(this.layout, this.getLayoutPointer(ctx), 0, -1); }; JsonSchemaFormService.prototype.getParentNode = function (ctx) { return JsonPointer.get(this.layout, this.getLayoutPointer(ctx), 0, -2); }; JsonSchemaFormService.prototype.getDataPointer = function (ctx) { if (!ctx.layoutNode || !isDefined(ctx.layoutNode.dataPointer) || !hasValue(ctx.dataIndex)) { return null; } return JsonPointer.toIndexedPointer(ctx.layoutNode.dataPointer, ctx.dataIndex, this.arrayMap); }; JsonSchemaFormService.prototype.getLayoutPointer = function (ctx) { if (!hasValue(ctx.layoutIndex)) { return null; } return '/' + ctx.layoutIndex.join('/items/'); }; JsonSchemaFormService.prototype.isControlBound = function (ctx) { if (!ctx.layoutNode || !isDefined(ctx.layoutNode.dataPointer) || !hasValue(ctx.dataIndex)) { return false; } var controlGroup = this.getFormControlGroup(ctx); var name = this.getFormControlName(ctx); return controlGroup ? hasOwn(controlGroup.controls, name) : false; }; JsonSchemaFormService.prototype.addItem = function (ctx, name) { if (!ctx.layoutNode || !isDefined(ctx.layoutNode.$ref) || !hasValue(ctx.dataIndex) || !hasValue(ctx.layoutIndex)) { return false; } // Create a new Angular form control from a template in templateRefLibrary var newFormGroup = buildFormGroup(this.templateRefLibrary[ctx.layoutNode.$ref]); // Add the new form control to the parent formArray or formGroup if (ctx.layoutNode.arrayItem) { // Add new array item to formArray this.getFormControlGroup(ctx).push(newFormGroup); } else { // Add new $ref item to formGroup this.getFormControlGroup(ctx) .addControl(name || this.getFormControlName(ctx), newFormGroup); } // Copy a new layoutNode from layoutRefLibrary var newLayoutNode = getLayoutNode(ctx.layoutNode, this); newLayoutNode.arrayItem = ctx.layoutNode.arrayItem; if (ctx.layoutNode.arrayItemType) { newLayoutNode.arrayItemType = ctx.layoutNode.arrayItemType; } else { delete newLayoutNode.arrayItemType; } if (name) { newLayoutNode.name = name; newLayoutNode.dataPointer += '/' + JsonPointer.escape(name); newLayoutNode.options.title = fixTitle(name); } // Add the new layoutNode to the form layout JsonPointer.insert(this.layout, this.getLayoutPointer(ctx), newLayoutNode); return true; }; JsonSchemaFormService.prototype.moveArrayItem = function (ctx, oldIndex, newIndex) { if (!ctx.layoutNode || !isDefined(ctx.layoutNode.dataPointer) || !hasValue(ctx.dataIndex) || !hasValue(ctx.layoutIndex) || !isDefined(oldIndex) || !isDefined(newIndex) || oldIndex === newIndex) { return false; } // Move item in the formArray var formArray = this.getFormControlGroup(ctx); var arrayItem = formArray.at(oldIndex); formArray.removeAt(oldIndex); formArray.insert(newIndex, arrayItem); formArray.updateValueAndValidity(); // Move layout item var layoutArray = this.getLayoutArray(ctx); layoutArray.splice(newIndex, 0, layoutArray.splice(oldIndex, 1)[0]); return true; }; JsonSchemaFormService.prototype.removeItem = function (ctx) { if (!ctx.layoutNode || !isDefined(ctx.layoutNode.dataPointer) || !hasValue(ctx.dataIndex) || !hasValue(ctx.layoutIndex)) { return false; } // Remove the Angular form control from the parent formArray or formGroup if (ctx.layoutNode.arrayItem) { // Remove array item from formArray this.getFormControlGroup(ctx) .removeAt(ctx.dataIndex[ctx.dataIndex.length - 1]); } else { // Remove $ref item from formGroup this.getFormControlGroup(ctx) .removeControl(this.getFormControlName(ctx)); } // Remove layoutNode from layout JsonPointer.remove(this.layout, this.getLayoutPointer(ctx)); return true; }; JsonSchemaFormService = tslib_1.__decorate([ Injectable(), tslib_1.__metadata("design:paramtypes", []) ], JsonSchemaFormService); return JsonSchemaFormService; }()); export { JsonSchemaFormService }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi1zY2hlbWEtZm9ybS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhcjYtanNvbi1zY2hlbWEtZm9ybS8iLCJzb3VyY2VzIjpbImxpYi9qc29uLXNjaGVtYS1mb3JtLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sU0FBUyxNQUFNLHFCQUFxQixDQUFDO0FBQzVDLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQztBQUN0QixPQUFPLFVBQVUsTUFBTSx3Q0FBd0MsQ0FBQztBQUVoRSxPQUFPLEVBQ0wsY0FBYyxFQUNkLHNCQUFzQixFQUN0QixjQUFjLEVBQ2QsVUFBVSxFQUNULE1BQU0sK0JBQStCLENBQUM7QUFDekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2SCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN2RSxPQUFPLEVBQ0wsUUFBUSxFQUNSLE9BQU8sRUFDUCxNQUFNLEVBQ04sV0FBVyxFQUNWLE1BQU0sNEJBQTRCLENBQUM7QUFDdEMsT0FBTyxFQUNMLFFBQVEsRUFDUixPQUFPLEVBQ1AsU0FBUyxFQUNULE9BQU8sRUFDUCxRQUFRLEVBQ1AsTUFBTSw4QkFBOEIsQ0FBQztBQUN4QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBYS9CO0lBdUZFO1FBdEZBLDBCQUFx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