{"version":3,"file":"7522_92ad6d73878119c48b46.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\";\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 dataStorage.put(this.container, 'form', this);\n for (let element of this.container.querySelectorAll('input[data-tu-form-field], textarea[data-tu-form-field]')) {\n this._updateRemainingLength(element);\n }\n this.updateDisabledFields();\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 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","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","innerHTML","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":""}