{"version":3,"file":"7522_9a7c26ce9f3f94506a45.bundle.js","mappings":"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","sources":["webpack://tumarket/./js/form/form.js","webpack://tumarket/./js/form/form.extensions.js"],"sourcesContent":["import { bootstrapAlert } from \"../global/alert\";\nimport { getPrecompiledTemplate, loadPrecompiledTemplates } from \"../global/templates\";\nimport { initTuPopover } from \"../global/popover\";\nimport { addEventDelegate, dataStorage, empty, hasClass, hide, htmlToDocumentFragment, setHtml, setProperty, show, toggleClass } from \"../global/dom\";\nimport { newUuid } from \"../global/uuid.js\";\n\nimport { toBool } from \"../global/util\";\nimport { loadFormExtension } from \"./form.extensions\";\nimport { loadLib } from \"../global/loadlib\";\nimport { refreshLazyModules } from \"../global/lazyHub\";\n\nlet tu_form = {\n /** @type {(options: TuFormOptions) => Promise} */\n create: function(options){\n let container = document.querySelector(options.container);\n if (hasClass(container, 'initialized')){\n return Promise.resolve(dataStorage.get(container, 'form'));\n }\n\n /** @type { TuForm } */\n let form = {\n options: {\n container: '',\n data: {},\n fields: {},\n userRoles: null,\n onChange: null,\n onSubmit: null,\n autosave: false,\n submitButtonText: 'Сохранить',\n disabled: false\n },\n container: null,\n extensions: [],\n loadExtensions: function(){\n /** @type {Promise} */\n let extensionsLoader = Promise.resolve([]);\n if (this.options.fields.extensions?.length) {\n let extensionLoadTasks = this.options.fields.extensions.map(e => loadFormExtension(e));\n\n extensionsLoader = Promise.all(extensionLoadTasks).then(extensions => {\n this.extensions = extensions;\n });\n }\n\n return extensionsLoader;\n },\n _init: function (options) {\n Object.assign(this.options, options);\n\n this.container = document.querySelector(this.options.container);\n this.options.fields.objectTypes = this.options.fields.objectTypes || [];\n\n this.options.fields.formId = `form-${newUuid()}`;\n\n for (let field of this.options.fields.fields) {\n field.isOnlyField = true;\n }\n\n let onChange = this.options.onChange;\n this.options.onChange = form => {\n for (let extension of form.extensions) {\n if (extension.onChange) extension.onChange(form);\n }\n if (onChange) onChange(form);\n };\n\n //делаем необязательным использование групп полей\n for (let type of this.options.fields.objectTypes) {\n if (type.fields.length && !Array.isArray(type.fields[0])) {\n type.fields = [type.fields];\n }\n }\n\n this.options.fields.showSubmitButton = !!this.options.onSubmit && !this.options.autosave && this.options.submitButtonText;\n this.options.fields.submitButtonText = this.options.submitButtonText;\n\n this._updateHiddenFields();\n \n return this.loadExtensions().then(() => {\n for (let extension of this.extensions) {\n if (extension.beforeLoad) extension.beforeLoad(this);\n }\n\n return this.render();\n }).then(() => {\n this._initEvents();\n this.setData();\n\n toggleClass(this.container, 'initialized', true);\n\n dataStorage.put(this.container, 'form', this);\n\n for (let element of this.container.querySelectorAll('input[data-tu-form-field], textarea[data-tu-form-field]')) {\n this._updateRemainingLength(element);\n }\n\n this.updateDisabledFields();\n\n if (this.options.fields.descriptionTarget) {\n setHtml(this.container.querySelector('.form-description'), document.querySelector(this.options.fields.descriptionTarget)?.innerHTML);\n }\n\n return this;\n })\n .catch(error => {\n bootstrapAlert('Ошибка загрузки элемента', { type: 'danger' })\n throw error;\n });\n },\n /**\n * поле options.disabled используется для глобального отключения всей формы\n */\n updateDisabledFields: function(){\n //поля с классом disabled игнорируем, т.к. они отключены всегда механизмом проверки ролей\n let fields = [...this.container.querySelectorAll('input, select, button, textarea')].filter(e => !e.matches('.disabled'));\n\n let disabled = this.options.disabled;\n setProperty(fields, 'disabled', disabled);\n let readmores = this.container.querySelectorAll('.tum-readmore-toggle');\n toggleClass(readmores, '.tum-readmore-toggle', !disabled);\n toggleClass(readmores, '.tum-grey', disabled);\n },\n disable: function(value){\n if (value === undefined) this.options.disabled = !this.options.disabled;\n else this.options.disabled = value;\n \n this.updateDisabledFields();\n },\n /**\n * \n * @param {HTMLInputElement | HTMLTextAreaElement} input \n * @returns \n */\n _updateRemainingLength: function(input){\n let lengthRemaining = input.nextElementSibling;\n if (!lengthRemaining) return;\n if (!lengthRemaining.matches('.lengthRemaining')) return\n\n let value = input.value;\n let length = value.length;\n let minlength = input.minLength;\n\n let diff = minlength - length;\n let isRequired = input.parentElement.matches('[data-required]');\n\n lengthRemaining.textContent = diff && !(!value && !isRequired) ? diff : '';\n },\n _initEvents: function () {\n let self = this;\n\n addEventDelegate(this.container, 'click', '.form-addObject', element => {\n let type = element.dataset.type;\n let list = element.parentElement.querySelector('.form-objects-list');\n let name = list.dataset.name;\n let single = list.classList.contains('single');\n this._addObject(`.form-objects-list[data-name=\"${name}\"]`, `.form-object-template[data-type=\"${type}\"]`);\n\n refreshLazyModules();\n\n if (single) hide(element);\n if (this.options.onChange) this.options.onChange(this);\n });\n\n addEventDelegate(this.container, 'click', '.form-removeObject', element => {\n let list = element.closest('.form-objects-list');\n let single = list.classList.contains('single');\n element.closest('.fieldset-block').remove();\n\n if (single) {\n show(list.parentElement.querySelector('.form-addObject'));\n }\n \n if (this.options.onChange) this.options.onChange(this);\n });\n\n addEventDelegate(this.container, 'input change', '[data-tu-form-field]', element => {\n if (this.options.onChange) this.options.onChange(this);\n let field = element.closest('.subfield, fieldset.field, .fieldset.field');\n\n if (element.matches('input[type=radio]')) {\n let fieldName = element.name;\n let name = element.closest('[data-name]')?.dataset.name;\n this.removeHighlight({ name: name || fieldName, field: name ? fieldName : null });\n } else {\n this._removeHighlight(field);\n }\n\n self._updateRemainingLength(element);\n });\n\n addEventDelegate(this.container, 'change', 'select', () => {\n if (this.options.onChange) this.options.onChange(this);\n });\n\n if (this.options.onSubmit) {\n addEventDelegate(this.container, 'click', '.form-submit', () => this.submit());\n }\n },\n submit: function(quiet){\n if (this.validate()) {\n this.options.onSubmit(this, quiet);\n } else {\n if (this.options.onInvalid) this.options.onInvalid(this);\n }\n },\n getData: function () {\n let result = {};\n\n for (let field of this.container.querySelectorAll('.tu-form > input[type=hidden]')) {\n result[field.name] = field.value || field.dataset.default || null;\n }\n\n for (let fieldset of this.getTopLevelFields()) {\n let name = fieldset.querySelector('[data-tu-form-field').name;\n let isRadio = !!fieldset.querySelector('[data-tu-form-field][type=\"radio\"]');\n if (isRadio) name = name.split('|')[0];\n\n result[name] = result[name] || this.getFieldValue(fieldset);\n }\n\n for (let objectList of this.container.querySelectorAll('.form-objects-list')){\n let name = objectList.dataset.name;\n result[name] = this._getObjects(name);\n }\n \n return result;\n },\n _getSiblingField: function(field, name) {\n let container = field.closest('.fieldset-block, .tu-form');\n if (container.matches('.tu-form')) {\n return container.querySelector(`:scope > [name=\"${name}\"], fieldset.field [name=\"${name}\"], .fieldset.field [name=\"${name}\"]`);\n }\n\n return container.querySelector(`.subfield [name=\"${name}\"]`);\n },\n _fillFormField: function(field, data){\n if (!data) data = this.options.data;\n\n for (let extension of this.extensions) {\n if (extension.onFieldFill) { \n let _continue = extension.onFieldFill(this, field, data);\n if (!_continue) return;\n }\n }\n\n if (field.matches('input[type=\"checkbox\"]')) {\n let fieldValue = toBool(data[field.name]) || false;\n field.checked = fieldValue;\n dataStorage.put(field, 'originalValue', fieldValue)\n return;\n }\n\n if (field.matches('input[type=\"radio\"]')) {\n let fieldValue = data[field.name] == field.value || false; \n field.checked = fieldValue;\n dataStorage.put(field, 'originalValue', fieldValue);\n return;\n }\n\n if (field.matches('input[type=\"datetime-local\"]')) {\n let fieldValue = data[field.name]?.replace(' ', 'T') || '';\n field.value = fieldValue;\n dataStorage.put(field, 'originalValue', fieldValue);\n return;\n }\n\n //берем .getAttribute('value') вместо .value, т.к. у type=\"color\" почему-то .value сам не заполняется\n if (data[field.name] === 0) data[field.name] = '0';\n let value = data[field.name] || field.value || field.getAttribute('value') || '';\n field.value = value;\n dataStorage.put(field, 'originalValue', value);\n },\n /**\n * \n * @param {HTMLElement} list \n */\n _fillObjectList: function(list) {\n empty(list);\n\n let type = list.dataset.type,\n name = list.dataset.name,\n single = list.classList.contains('single'),\n addByDefault = list.classList.contains('addByDefault');\n \n let container = `.form-objects-list[data-name=\"${name}\"]`,\n template = `.form-object-template[data-type=\"${type}\"]`;\n\n if (name in this.options.data && (this.options.data[name]?.length || single)) {\n if (single) {\n if (this.options.data[name])\n this._addObject(container, template, this.options.data[name]);\n }\n else {\n for (let item of this.options.data[name]) {\n this._addObject(container, template, item);\n }\n }\n } else if (addByDefault) {\n this._addObject(container, template);\n }\n },\n setData: function(data){\n this.options.data = data || this.options.data;\n\n let form = this.container.querySelector('.tu-form');\n\n for (let field of this.container.querySelectorAll('.tu-form > input[type=hidden]')) {\n field.value = this.options.data[field.name] || '';\n }\n\n for (let fieldset of this.getTopLevelFields()) {\n for (let field of fieldset.querySelectorAll('[data-tu-form-field]')) {\n this._fillFormField(field);\n }\n }\n\n for (let objectList of form.querySelectorAll('.form-objects-list')) {\n this._fillObjectList(objectList);\n }\n\n for (let extension of this.extensions) {\n if (extension.afterLoad) extension.afterLoad(this);\n }\n\n if (this.options.onChange) this.options.onChange(this);\n this.updateDisabledFields();\n },\n modifyData: function(data){\n let currentData = this.getData();\n let newData = Object.assign({}, currentData, data);\n \n this.setData(newData);\n },\n getAllFields: function() {\n return [...this.container.querySelectorAll('fieldset.field, .fieldset.field, .subfield')]\n .filter(e => !e.matches('[data-form-exclude]'))\n .filter(e => !e.classList.contains('disabled'));\n },\n getTopLevelFields: function() {\n return [...this.container.querySelectorAll('fieldset.field, .fieldset.field')]\n .filter(e => !e.matches('[data-form-exclude]'))\n .filter(e => !e.classList.contains('disabled'));\n },\n getFieldDefinition: function(field){\n let name = field.querySelector('[data-tu-form-field]').name.split('|')[0];\n\n if (field.matches('.subfield')) {\n let type = field.closest('.form-objects-list').dataset.type;\n return this.options.fields.objectTypes.find(e => e.type == type).fields.flatMap(e => e).find(e => e.name == name);\n }\n\n return this.options.fields.fields.find(e => e.name == name);\n },\n getRadioFieldDefinition: function(field) {\n let fullName = field.querySelector('[data-tu-form-field]').name;\n let name = fullName.split('|')[0];\n\n if (field.matches('.subfield')) {\n let type = field.closest('.form-objects-list').dataset.type;\n return this.options.fields.objectTypes.find(e => e.type == type).fields.flatMap(e => e).filter(e => e.name == name);\n }\n\n return this.options.fields.fields.filter(e => e.name == name);\n },\n getFieldPosition: function(field){\n let name = field.querySelector('[data-tu-form-field]').name;\n let isSubfield = field.matches('.subfield');\n let objectIndex = 0;\n\n let listName = '';\n /** @type {TuFormField} */\n let list = null;\n\n if (isSubfield) {\n let object = field.closest('.fieldset-block');\n let listElement = object.closest('.form-objects-list');\n listName = listElement.dataset.name;\n list = this.options.fields.fields.find(e => e.name == listName);\n objectIndex = [...listElement.children].indexOf(object);\n }\n\n return { listName, name, list, objectIndex: list.isSingle ? -1 : objectIndex };\n },\n getFieldByInput: function(input) {\n return input.closest('.subfield, fieldset.field, .fieldset.field');\n },\n getFieldValue: function(field){\n let result = null;\n \n for (let input of field.querySelectorAll('[data-tu-form-field]')) {\n if (input.matches('input[type=checkbox]')) {\n result = input.checked;\n continue;\n }\n\n if (input.matches('input[type=\"datetime-local\"]')) {\n result = input.value.replace('T', ' ') || input.dataset.default || null;\n continue;\n }\n\n if (input.matches('input[type=\"radio\"]')) {\n if (!input.checked) continue;\n\n result = input.value;\n continue;\n }\n\n if (input.matches('input[type=\"file\"]')) {\n continue;\n }\n\n result = input.dataset.value || input.value || input.dataset.default || null;\n }\n\n return result;\n },\n validate: function () {\n //обязательно сначала map, и только потом every, чтобы валидация прошла для всех полей, а не до первой ошибки\n let fieldsValid = this.getAllFields().map(e => this._validateField(e)).every(e => e);\n\n let extensions = this.extensions?.filter(e => e.validate) || [];\n let extensionsValid = extensions.every(e => e.validate(this));\n\n return fieldsValid && extensionsValid;\n },\n /**\n * \n * @param {HTMLElement} object \n * @returns \n */\n _getObject: function (object) {\n let result = {};\n\n for (let field of object.querySelectorAll('[data-tu-form-field]:not([data-form-exclude])')) {\n if (field.matches('input[type=checkbox]')) {\n result[field.name] = field.checked;\n continue;\n }\n\n if (field.matches('input[type=radio]')) {\n if (!field.checked) continue;\n\n result[field.name.split('|')[0]] = field.value;\n continue;\n }\n\n result[field.name] = field.dataset.value || field.value || field.dataset.default || null;\n }\n\n return result;\n },\n /**\n * \n * @param {HTMLElement} object \n * @param {Object} data \n */\n _fillObject: function (object, data) {\n for (let field of object.querySelectorAll('[data-tu-form-field]')) {\n this._fillFormField(field, data);\n }\n },\n _addObject: function (container, template, model) {\n let object = htmlToDocumentFragment(this.container.querySelector(template).innerHTML);\n if (model) this._fillObject(object, model);\n\n //к name radiobutton будем дописывать guid, чтобы браузер отличал группы кнопок в разных объектах\n let guid = newUuid();\n for (let element of object.querySelectorAll('input[type=radio]')) {\n let name = element.name;\n element.name = `${name}|${guid}`;\n }\n \n this._initHints(object);\n\n this.container.querySelector(container).append(object);\n },\n _getObjects: function(name){\n let list = this.container.querySelector(`.form-objects-list[data-name=\"${name}\"]`);\n let objects = [...list.querySelectorAll('.fieldset-block')].map(e => this._getObject(e));\n \n let isSingle = list.classList.contains('single');\n\n if (isSingle) {\n return objects.length ? objects[0] : null;\n }\n\n return objects;\n },\n _removeHighlight: function(field) {\n let elements = [field];\n \n elements = elements.concat([...field.querySelectorAll('[data-tu-form-field]')]);\n\n let name = field.querySelector('[data-tu-form-field]').name;\n elements = elements.concat([...this.container.querySelectorAll(`input[type=\"radio\"][name=\"${name}\"]`)]);\n\n toggleClass(elements, 'tum-box-attention', false);\n },\n /**\n * \n * @param {HTMLElement} field \n */\n _addHighlight: function(field) {\n if (field.classList.contains('field')) toggleClass(field, 'tum-box-attention', true);\n if (field.classList.contains('subfield')) toggleClass(field.querySelectorAll('[data-tu-form-field]'), 'tum-box-attention', true);\n\n //radio\n let name = field.querySelector('[data-tu-form-field]').name;\n toggleClass(form.container.querySelectorAll(`input[type=\"radio\"][name=\"${name}\"]`), 'tum-box-attention', true);\n },\n _getField: function(options){\n let index = options.index || 0;\n let name = options.name;\n let field = options.field;\n let isObject = !!this.container.querySelector(`.form-objects-list[data-name=\"${name}\"]`);\n\n if (isObject) {\n let object = this.container.querySelectorAll(`.form-objects-list[data-name=\"${name}\"] .fieldset-block`)[index];\n return [...object.querySelectorAll('.subfield')].find(e => e.querySelector(`[name=\"${field}\"]`));\n }\n\n return [...this.container.querySelectorAll('.field')].find(e => e.querySelector(`[name=\"${name}\"]`));\n },\n addHighlight: function(options) {\n this._addHighlight(this._getField(options));\n },\n removeHighlight: function(options) {\n this._removeHighlight(this._getField(options));\n },\n _validateField: function (field) {\n let input = field.querySelector('[data-tu-form-field]');\n \n this._removeHighlight(field);\n \n let value = input.value;\n let isRequired = field.matches('[data-required]');\n let hasPattern = input.matches('[data-pattern]');\n let isRadio = input.matches('[type=radio]');\n let name = input.name;\n let minLength = input.minLength || 0;\n \n let required_pass = !isRequired || !!value;\n let pattern = input.dataset.pattern;\n\n //фикс двойного экранирования слешей из-за handlebars\n try {\n pattern = JSON.parse(`\"${pattern.replace('\"', '\\\\\"')}\"`);\n } catch {}\n\n let pattern_pass = !hasPattern || !value || new RegExp(pattern).test(value);\n let minlength_pass = !minLength || !value || value.length >= minLength;\n let radio_pass = !isRequired || !isRadio || !!this.container.querySelector(`input[type=radio][name=\"${name}\"]:checked`);\n\n let extensions = this.extensions?.filter(e => e.validateField) || [];\n let extensions_pass = extensions.map(e => e.validateField(field, this)).every(e => e);\n \n let valid = required_pass && pattern_pass && minlength_pass && radio_pass && extensions_pass;\n if (!valid) this._addHighlight(field);\n \n return valid;\n },\n _initHints: function(container){\n initTuPopover(container);\n },\n render: function(){\n let templates = [\n 'form', \n 'form-field-info'\n ];\n\n return loadLib({ cssLink: \"/template/form-css\" }).then(() => {\n return loadPrecompiledTemplates(templates);\n }).then(() => {\n let template = getPrecompiledTemplate('form');\n setHtml(this.container, template(this.options.fields));\n this._initHints(this.container);\n });\n },\n _updateHiddenField: function(field){\n let fieldRoles_whitelist = (field.rolesWhitelist || field.role)?.split(',').map(e => e.trim());\n let fieldRoles_blacklist = field.rolesBlacklist?.split(',').map(e => e.trim());\n\n if (fieldRoles_whitelist?.length) {\n if (!fieldRoles_whitelist.some(e => this.options.userRoles.indexOf(e) > -1)) {\n if (field.roleCheckType == 'disable') field.disable = true;\n else field.hide = true;\n }\n\n return;\n }\n\n if (fieldRoles_blacklist && fieldRoles_blacklist.some(e => this.options.userRoles.indexOf(e) > -1)) {\n if (field.roleCheckType == 'disable') field.disable = true;\n else field.hide = true;\n }\n },\n //проверка прав со скрытием лишних полей\n _updateHiddenFields: function(){\n if (!this.options.userRoles?.length) return;\n\n for (let field of this.options.fields.fields.filter(e => e.rolesWhitelist || e.rolesBlacklist || e.role)){\n this._updateHiddenField(field);\n }\n\n for (let type of this.options.fields.objectTypes) {\n for (let section of type.fields) {\n for (let field of section.filter(e => e.rolesWhitelist || e.rolesBlacklist || e.role)) {\n this._updateHiddenField(field);\n }\n\n if (section.every(e => e.hide)) {\n section.hide = true;\n }\n }\n }\n },\n getSubmitButton: function() {\n return this.container.querySelector('.form-submit');\n }\n };\n\n return form._init(options);\n },\n addSelectOptions: function(p) {\n let fields = p.formFields;\n let objectType = fields.fields.find(e => e.name == p.name).objectType;\n let field = p.field ? \n fields.objectTypes.find(e => e.type == objectType)?.fields.flat().find(e => e.name == p.field) :\n fields.fields.find(e => e.name == p.name);\n\n if (p.addDefault) p.options = [{ name: 'Не выбрано', value: '' }].concat(p.options);\n field.options = p.options;\n\n return fields;\n }\n};\n\nexport { tu_form };","/**\n * не совсем понятно, как работает webpack, если путь в импорте динамический, поэтому пока здесь их все прописываем явно\n * @param {*} name \n * @returns {Promise}\n */\nfunction loadFormExtension(name) {\n switch (name) {\n case \"userRequests\":\n return import(\"./form.extension.userRequests\").then(({ userRequests }) => userRequests);\n case \"modalEdit\":\n return import(\"./form.extension.modalEdit\").then(({ modalEdit }) => modalEdit);\n case \"metadata\":\n return import(\"./form.extension.metadata\").then(({ metadata }) => metadata);\n case \"map\":\n return import(\"./form.extension.map\").then(({ formMap }) => formMap);\n case \"extraFields\":\n return import(\"./form.extension.extraFields\").then(({ extraFields }) => extraFields);\n case \"previews\":\n return import(\"./form.extension.previews\").then(({ formPreviews }) => formPreviews);\n case \"fileUpload\":\n return import(\"./form.extension.fileUpload\").then(({ formFileUpload }) => formFileUpload);\n case \"tuSelect\":\n return import(\"./form.extension.tuSelect\").then(({ formTuSelect }) => formTuSelect);\n case \"resetOnChange\":\n return import(\"./form.extension.resetOnChange\").then(({ resetOnChange }) => resetOnChange);\n case \"fieldSwitch\":\n return import(\"./form.extension.fieldSwitch\").then(({ fieldSwitch }) => fieldSwitch);\n case \"phoneFormatter\":\n return import(\"./form.extension.phoneFormatter\").then(({ phoneFormatter }) => phoneFormatter);\n case \"urlProcessing\":\n return import(\"./form.extension.urlProcessing\").then(({ urlProcessing }) => urlProcessing);\n case \"eagerValidation\":\n return import(\"./form.extension.eagerValidation\").then(({ eagerValidation }) => eagerValidation);\n case \"fieldSwitchPatternDependency\":\n return import(\"./form.extension.fieldSwitchPatternDependency\").then(({ fieldSwitchPatternDependency }) => fieldSwitchPatternDependency);\n case \"disableForm\":\n return import(\"./form.extension.disableForm\").then(({ disableForm }) => disableForm);\n case \"requestButton\":\n return import(\"./form.extension.requestButton\").then(({ requestButton }) => requestButton);\n case \"htmlBlock\":\n return import(\"./form.extension.htmlBlock\").then(({ htmlBlock }) => htmlBlock);\n case \"authCheck\":\n return import(\"./form.extension.authCheck\").then(({ authCheck }) => authCheck);\n case \"fieldControl\":\n return import(\"./form.extension.fieldControl\").then(({ fieldControl }) => fieldControl);\n case \"crud\":\n return import(\"./form.extension.crud\").then(({ crud }) => crud);\n case \"confirmChange\":\n return import(\"./form.extension.confirmChange\").then(({ confirmChange }) => confirmChange);\n default:\n console.log(`unknown form extension: ${name}`);\n return Promise.resolve({});\n }\n}\n\nexport { loadFormExtension };"],"names":["tu_form","create","options","container","document","querySelector","Promise","resolve","get","form","data","fields","userRoles","onChange","onSubmit","autosave","submitButtonText","disabled","extensions","loadExtensions","extensionsLoader","this","length","extensionLoadTasks","map","e","name","then","userRequests","modalEdit","metadata","formMap","extraFields","formPreviews","formFileUpload","formTuSelect","resetOnChange","fieldSwitch","phoneFormatter","urlProcessing","eagerValidation","fieldSwitchPatternDependency","disableForm","requestButton","htmlBlock","authCheck","fieldControl","crud","confirmChange","console","log","loadFormExtension","all","_init","Object","assign","objectTypes","formId","field","isOnlyField","extension","type","Array","isArray","showSubmitButton","_updateHiddenFields","beforeLoad","render","_initEvents","setData","put","element","querySelectorAll","_updateRemainingLength","updateDisabledFields","descriptionTarget","innerHTML","catch","error","filter","matches","readmores","disable","value","undefined","input","lengthRemaining","nextElementSibling","diff","minLength","isRequired","parentElement","textContent","self","dataset","list","single","classList","contains","_addObject","closest","remove","fieldName","removeHighlight","_removeHighlight","submit","quiet","validate","onInvalid","getData","result","default","fieldset","getTopLevelFields","split","getFieldValue","objectList","_getObjects","_getSiblingField","_fillFormField","onFieldFill","fieldValue","checked","replace","getAttribute","_fillObjectList","addByDefault","template","item","afterLoad","modifyData","currentData","newData","getAllFields","getFieldDefinition","find","flatMap","getRadioFieldDefinition","getFieldPosition","isSubfield","objectIndex","listName","object","listElement","children","indexOf","isSingle","getFieldByInput","fieldsValid","_validateField","every","extensionsValid","_getObject","_fillObject","model","guid","_initHints","append","objects","elements","concat","_addHighlight","_getField","index","addHighlight","hasPattern","isRadio","required_pass","pattern","JSON","parse","pattern_pass","RegExp","test","minlength_pass","radio_pass","extensions_pass","validateField","valid","templates","cssLink","_updateHiddenField","fieldRoles_whitelist","rolesWhitelist","role","trim","fieldRoles_blacklist","rolesBlacklist","some","roleCheckType","hide","section","getSubmitButton","addSelectOptions","p","formFields","objectType","flat","addDefault"],"sourceRoot":""}