\r\n\r\n if (!evt.isDefaultPrevented() && (result === true || $__default.default.isObject(result) && result.value)) // Support Swal.fire()\r\n return true;\r\n } else {\r\n this.enableForm();\r\n }\r\n\r\n return false;\r\n }; // Submit\r\n\r\n this.submit = async function (e) {\r\n var _e$originalEvent, _e$originalEvent$subm;\r\n\r\n let form = this.getForm(),\r\n formAction = e == null ? void 0 : (_e$originalEvent = e.originalEvent) == null ? void 0 : (_e$originalEvent$subm = _e$originalEvent.submitter) == null ? void 0 : _e$originalEvent$subm.formAction;\r\n\r\n if (formAction) {\r\n formAction = ew.parseUrl(formAction).pathname;\r\n form.setAttribute(\"action\", formAction);\r\n }\r\n\r\n if (await this.canSubmit(e)) {\r\n if (this.submitWithFetch) {\r\n let url = form.getAttribute(\"action\"),\r\n method = form.method.toUpperCase(),\r\n body = $__default.default(form).serialize();\r\n return ew.fetch(url, {\r\n method,\r\n body\r\n }).finally(() => this.enableForm()); // Return Promise\r\n } else {\r\n form.submit();\r\n }\r\n } else {\r\n this.enableForm();\r\n }\r\n }; // Get dynamic selection list by element name or id\r\n\r\n this.getList = function (name) {\r\n var _this$getElement, _this$getElement$data;\r\n\r\n if ($__default.default.isObject(name)) {\r\n // Object\r\n let obj = name;\r\n name = obj.name || obj.id;\r\n if (name.includes(\"query_builder_rule\")) name = obj.dataset.field;\r\n }\r\n\r\n name = name.replace(/^(sv_)?[xy](\\d*|\\$rowindex\\$)_|\\[\\]$/g, \"\"); // Remove element name prefix/suffix\r\n\r\n if (this.lists[name]) return this.lists[name];\r\n let field = (_this$getElement = this.getElement(name)) == null ? void 0 : (_this$getElement$data = _this$getElement.dataset.field) == null ? void 0 : _this$getElement$data.replace(/^x_|\\[\\]$/g, \"\"); // Remove element name prefix/suffix\r\n\r\n return field ? this.lists[field] : {};\r\n }; // Compile templates\r\n\r\n this.compileTemplates = function () {\r\n let lists = Object.values(this.lists);\r\n\r\n for (let list of lists) {\r\n if (list.template && $__default.default.isString(list.template)) list.template = $__default.default.templates(list.template);\r\n }\r\n }; // Get option template of dynamic selection list\r\n\r\n this.getOptionTemplate = function (list) {\r\n if (list.template && $__default.default.isString(list.template)) list.template = $__default.default.templates(list.template);\r\n return list.template;\r\n }; // Get the HTML form element\r\n\r\n this.getForm = function () {\r\n if (!this.htmlForm) {\r\n var _this$element, _this$element2;\r\n\r\n if (((_this$element = this.element) == null ? void 0 : _this$element.tagName) == \"FORM\") {\r\n // HTML form\r\n this.htmlForm = this.element;\r\n } else if (((_this$element2 = this.element) == null ? void 0 : _this$element2.tagName) == \"DIV\") {\r\n // HTML div => Grid page\r\n this.htmlForm = this.element.closest(\"form\");\r\n }\r\n }\r\n\r\n return this.htmlForm;\r\n }; // Get form element as single element\r\n\r\n this.getElement = function (name) {\r\n return name ? ew.getElement(name, this.$element) : this.$element[0];\r\n }; // Get form element(s) as single element or array of radio/checkbox\r\n\r\n this.getElements = function (name) {\r\n return ew.getElements(name, this.$element);\r\n }; // Fix ID\r\n\r\n this.fixId = function (id, multiple, rowindex) {\r\n let t = \"\",\r\n ar = id.split(\" \");\r\n\r\n if (ar.length > 1) {\r\n t = ar[0];\r\n rowindex = \"\";\r\n id = ar[1];\r\n }\r\n\r\n let prefix = $__default.default.isNumber(rowindex) ? \"x\" + rowindex + \"_\" : \"x_\"; // Add row index\r\n\r\n id = id.startsWith(\"x_\") ? id.replace(/^x_/, prefix) // Field element name\r\n : prefix + id; // Field var\r\n\r\n if (multiple && !id.endsWith(\"[]\")) // Add [] if select-multiple\r\n id += \"[]\";\r\n return t ? t + \" \" + id : id;\r\n };\r\n /**\r\n * Update a selection list\r\n * @param {string|HTMLElement} id - ID (Field param) or HTML element\r\n * @param {Object} list - List\r\n * @param {(null|undefined|number)} rowindex - Row index\r\n * @param {boolean} immediate - Send request immediately\r\n * @returns\r\n */\r\n\r\n this.updateList = function (id, list, rowindex, immediate) {\r\n var _list, _Object$entries$find;\r\n\r\n (_list = list) != null ? _list : list = $__default.default.isString(id) // Find the list if not provided\r\n ? (_Object$entries$find = Object.entries(this.lists).find(entry => entry[0] == id.replace(/^x_/, \"\"))) == null ? void 0 : _Object$entries$find[1] // String\r\n : this.getList(id); // HTMLElement\r\n\r\n if (list.template && $__default.default.isString(list.template)) // Compile template in case updateLists() called before init()\r\n list.template = $__default.default.templates(list.template);\r\n let form = this.element,\r\n parents = list.parentFields.slice().map(parent => this.fixId(parent, false, rowindex)),\r\n // Clone and fix index\r\n ajax = list.ajax && !list.lookupOptions.length; // Has link table and no lookup cache\r\n\r\n id = $__default.default.isString(id) ? this.fixId(id, list.multiple, rowindex) : id;\r\n return !ajax || immediate ? ew.updateOptions.call(this, id, parents, ajax, false) // Non-Ajax (lookup cache or user values) or update immediately\r\n : [id, parents.map(parent => ew.getOptionValues(parent, form)), ajax, false]; // Ajax (async) => to be batch updated\r\n };\r\n /**\r\n * Update selection lists\r\n * @param {(null|undefined|number)} rowindex - Row index\r\n * @param {bool} [immediate] - Send request immediately\r\n * @returns\r\n */\r\n\r\n this.updateLists = function (rowindex, immediate) {\r\n var _form$querySelector;\r\n\r\n if (rowindex === null) // rowindex == $rowindex$ == null\r\n return;\r\n if (this.pageId == \"grid\" && !$__default.default.isNumber(rowindex) && !$__default.default.isUndefined(rowindex)) return;\r\n let form = this.getForm(); // Set up $element and htmlForm\r\n\r\n if ((form == null ? void 0 : (_form$querySelector = form.querySelector(\"input#confirm\")) == null ? void 0 : _form$querySelector.value) == \"confirm\") // Confirm page\r\n return;\r\n let selector = Object.entries(this.lists).map(_ref => {\r\n let [id, list] = _ref;\r\n return \"[name='\" + this.fixId(id, list.multiple, rowindex) + \"']\";\r\n }).join();\r\n if (selector && this.element.querySelector(selector)) // List found\r\n Object.entries(this.lists).map(_ref2 => {\r\n let [id, list] = _ref2;\r\n return this.updateList(id, list, rowindex);\r\n }) // Update each list\r\n .filter(result => Array.isArray(result)) // Get ajax requests for batch update\r\n .forEach(request => this.batch.add(ew.updateOptions.bind(this, ...request))); // Batch update async requests\r\n // Update the Ajax lists\r\n\r\n if (this.batch.requests.length) {\r\n if (rowindex === undefined || immediate) {\r\n // Called by form or update immediately (add blank row)\r\n let deferreds = [],\r\n batchSize = ew.ajaxBatchSize > 0 ? ew.ajaxBatchSize : 1;\r\n\r\n while (this.batch.requests.length > batchSize) {\r\n let b = new Batch();\r\n b.requests = this.batch.requests.splice(0, batchSize);\r\n deferreds.push(b.send({\r\n url: ew.getApiUrl(ew.API_LOOKUP_ACTION)\r\n }));\r\n }\r\n\r\n if (this.batch.requests.length > 0) deferreds.push(this.batch.send({\r\n url: ew.getApiUrl(ew.API_LOOKUP_ACTION)\r\n }));\r\n $__default.default.when(...deferreds).then(() => $__default.default(document).trigger(\"updatedone\", [{\r\n source: self,\r\n target: form\r\n }])).fail(error => console.log(error)).always(() => this.batch.clear());\r\n }\r\n } else {\r\n $__default.default(document).trigger(\"updatedone\", [{\r\n source: self,\r\n target: form\r\n }]);\r\n }\r\n }; // Create AutoSuggest\r\n\r\n this.createAutoSuggest = function (settings) {\r\n var options = Object.assign({\r\n limit: ew.AUTO_SUGGEST_MAX_ENTRIES,\r\n form: this\r\n }, ew.autoSuggestSettings, settings); // Global settings + field specific settings\r\n\r\n self.autoSuggests[settings.id] = new ew.AutoSuggest(options);\r\n }; // Init editors\r\n\r\n this.initEditors = function () {\r\n var form = this.getForm();\r\n $__default.default(form.elements).filter(\"textarea.editor\").each(function (i, el) {\r\n var ed = $__default.default(el).data(\"editor\");\r\n if (ed && !ed.active && !ed.name.includes(\"$rowindex$\")) ed.create();\r\n });\r\n }; // Update textareas\r\n\r\n this.updateTextArea = function (name) {\r\n var form = this.getForm();\r\n $__default.default(form.elements).filter(\"textarea.editor\").each(function (i, el) {\r\n var ed = $__default.default(el).data(\"editor\");\r\n if (!ed || name && ed.name != name) return true; // Continue\r\n\r\n ed.save();\r\n if (name) return false; // Break\r\n });\r\n }; // Destroy editor(s)\r\n\r\n this.destroyEditor = function (name) {\r\n var form = this.getForm();\r\n $__default.default(form.elements).filter(\"textarea.editor\").each(function (i, el) {\r\n var ed = $__default.default(el).data(\"editor\");\r\n if (!ed || name && ed.name != name) return true; // Continue\r\n\r\n ed.destroy();\r\n if (name) return false; // Break\r\n });\r\n }; // Show error message\r\n\r\n this.onError = function (el, msg) {\r\n return ew.onError(this, el, msg);\r\n }; // Init file upload\r\n\r\n this.initUpload = function () {\r\n var form = this.getForm();\r\n $__default.default(form.elements).filter(\"input:file:not([name*='$rowindex$'])\").each(function (index) {\r\n $__default.default.later(ew.AJAX_DELAY * index, null, ew.upload, this); // Delay a little in case of large number of upload fields\r\n });\r\n }; // Set up filters\r\n\r\n this.setupFilters = function (e, filters) {\r\n let id = this.id,\r\n data = this.filterList ? this.filterList.data : null,\r\n $sf = $__default.default(\".ew-save-filter[data-form=\" + id + \"]\").toggleClass(\"disabled\", !data),\r\n $df = $__default.default(\".ew-delete-filter[data-form=\" + id + \"]\").toggleClass(\"disabled\", !filters.length).toggleClass(\"dropdown-toggle\", !!filters.length),\r\n $delete = $df.parent(\"li\").toggleClass(\"dropdown-submenu dropdown-hover\", !!filters.length).toggleClass(\"disabled\", !filters.length),\r\n $save = $sf.parent(\"li\").toggleClass(\"disabled\", !data);\r\n\r\n let saveFilters = function (id, filters) {\r\n if (ew.CLIENT_SEARCH_FILTER) {\r\n localStorage.setItem(ew.PROJECT_NAME + \"_\" + id + \"_filters\", JSON.stringify(filters));\r\n } else if (ew.SERVER_SEARCH_FILTER) {\r\n document.body.style.cursor = \"wait\";\r\n $__default.default.ajax(ew.currentPage(), {\r\n type: \"POST\",\r\n dataType: \"json\",\r\n data: {\r\n \"ajax\": \"savefilters\",\r\n \"filters\": JSON.stringify(filters)\r\n }\r\n }).done(function (result) {\r\n var _result$;\r\n\r\n if ((_result$ = result[0]) != null && _result$.success) self.filterList.filters = filters; // Save filters\r\n }).always(function () {\r\n document.body.style.cursor = \"default\";\r\n });\r\n }\r\n };\r\n\r\n $save.off(\"click.ew\").on(\"click.ew\", function (e) {\r\n // Save filter\r\n if ($save.hasClass(\"disabled\")) return false;\r\n ew.prompt({\r\n input: \"text\",\r\n html: ew.language.phrase(\"EnterFilterName\")\r\n }, name => {\r\n name = ew.sanitize(name);\r\n\r\n if (name) {\r\n filters.push([name, data]);\r\n saveFilters(id, filters);\r\n }\r\n }, true);\r\n }).prevAll().remove();\r\n $df.next(\"ul.dropdown-menu\").remove();\r\n\r\n if (filters.length) {\r\n let $submenu = $__default.default('');\r\n filters.forEach((filter, i, ar) => {\r\n $__default.default('' + filter[0] + '').on(\"click\", function (e) {\r\n // Delete\r\n let index = this.querySelector(\"a[data-index]\").dataset.index;\r\n ew.prompt(ew.language.phrase(\"DeleteFilterConfirm\").replace(\"%s\", filter[0]), result => {\r\n if (result) {\r\n ar.splice(index, 1);\r\n saveFilters(id, filters);\r\n }\r\n });\r\n }).appendTo($submenu);\r\n $__default.default('' + filter[0] + '').insertBefore($save).on(\"click\", function (e) {\r\n let body = {\r\n cmd: \"resetfilter\",\r\n filter: JSON.stringify(filter[1])\r\n };\r\n ew.refresh(ew.fetch(ew.setLayout(ew.currentPage(), false), {\r\n method: \"POST\",\r\n body\r\n }));\r\n });\r\n });\r\n $__default.default('').insertBefore($save);\r\n $delete.append($submenu);\r\n }\r\n }; // Add event handler\r\n\r\n this.on = function () {\r\n $self.on(...arguments);\r\n }; // Add event handler\r\n\r\n this.one = function () {\r\n $self.one(...arguments);\r\n }; // Remove event handler\r\n\r\n this.off = function () {\r\n $self.off(...arguments);\r\n }; // Trigger event\r\n\r\n this.trigger = function () {\r\n $self.trigger(...arguments);\r\n }; // Init form\r\n\r\n this.init = function () {\r\n if (this._initiated) return; // Check form\r\n\r\n var form = this.getForm();\r\n if (!form) return;\r\n var $form = $__default.default(form); // Compile templates\r\n\r\n this.compileTemplates(); // Search form\r\n\r\n if (/s(ea)?rch$/.test(this.id)) {\r\n // Search panel\r\n if (this.initSearchPanel && !ew.hasFormData(form)) $__default.default(\"#\" + this.id + \"_search_panel\").removeClass(\"show\"); // Hide search operator column\r\n\r\n if (!$__default.default(\".ew-table .ew-search-operator\").text().trim()) $__default.default(\".ew-table .ew-search-operator\").parent(\"td\").hide(); // Search operators\r\n\r\n $form.find(\"select[id^=z_]\").each(function () {\r\n var $this = $__default.default(this).trigger(\"change\");\r\n if ($this.val() != \"BETWEEN\") $form.find(\"#w_\" + this.id.substring(2)).trigger(\"change\");\r\n });\r\n } // Multi-page\r\n\r\n if (this.multiPage) this.multiPage.render(); // HTML editors\r\n\r\n loadjs.ready([\"editor\"], () => setTimeout(this.initEditors.bind(this), 0)); // Delay for custom template to apply first\r\n // Dynamic selection lists\r\n\r\n this.updateLists(); // Init file upload\r\n\r\n this.initUpload(); // Submit/Cancel\r\n\r\n if (this.$element.is(\"form\")) {\r\n // Not Grid page\r\n // Detail pages\r\n this.$element.find(\".ew-detail-pages .ew-nav a[data-bs-toggle=tab]\").on(\"shown.bs.tab\", function (e) {\r\n var $tab = $__default.default(e.target.getAttribute(\"href\")),\r\n $panel = $tab.find(\".table-responsive.ew-grid-middle-panel\"),\r\n $container = $tab.closest(\".container-fluid\");\r\n if ($panel.width() >= $container.width()) $panel.width($container.width() + \"px\");else $panel.width(\"auto\");\r\n });\r\n $form.off(\"submit.ew\").on(\"submit.ew\", function (e) {\r\n // Bind submit event\r\n let args = {\r\n form: form,\r\n result: self.submit(e)\r\n },\r\n evt = $__default.default.Event(\"aftersubmit\", {\r\n originalEvent: e\r\n });\r\n self.trigger(evt, [args]);\r\n return false; // Disable normal submission\r\n });\r\n $form.find(\"[data-field], .ew-priv\").on(\"change\", function () {\r\n if (ew.CONFIRM_CANCEL) self.modified = true;\r\n });\r\n $form.find(\"#btn-cancel[data-href]\").on(\"click\", function () {\r\n // Cancel\r\n self.updateTextArea();\r\n var href = this.dataset.href;\r\n\r\n if (self.modified && ew.hasFormData(form)) {\r\n ew.prompt(ew.language.phrase(\"ConfirmCancel\"), result => {\r\n if (result) {\r\n $form.find(\"#btn-action\").prop(\"disabled\", true); // Disable the save button\r\n\r\n window.location = href;\r\n }\r\n });\r\n } else {\r\n $form.find(\"#btn-action\").prop(\"disabled\", true); // Disable the save button\r\n\r\n window.location = href;\r\n }\r\n });\r\n }\r\n\r\n this._initiated = true; // Store form object as data\r\n\r\n this.$element.data(\"form\", this); // Enable form\r\n\r\n if (this.enableOnInit || Array.from(form.elements).find(el => el.matches(\"button.disabled.enable-on-init\"))) this.enableForm(); // Trigger listeners\r\n\r\n this.trigger(\"initiated\");\r\n }; // Add to the global forms object\r\n\r\n ew.forms.add(this);\r\n }\n\n /**\r\n * Class Field\r\n */\r\n let Field = /*#__PURE__*/function () {\r\n /**\r\n * Constructor\r\n * @param {string} fldvar Field variable name\r\n * @param {Function[]|Function} validators Validators\r\n * @param {bool} invalid Initial valid status (e.g. server side)\r\n */\r\n function Field(fldvar, validators, invalid) {\r\n _defineProperty(this, \"name\", \"\");\r\n\r\n _defineProperty(this, \"validators\", []);\r\n\r\n _defineProperty(this, \"_validate\", true);\r\n\r\n this.name = fldvar;\r\n\r\n if (Array.isArray(validators)) {\r\n for (let validator of validators) this.addValidator(validator);\r\n } else if (typeof validators === \"function\") {\r\n this.addValidator(validators);\r\n }\r\n\r\n this.invalid = invalid;\r\n }\r\n /**\r\n * Add validator\r\n * @param {Function} validator Validator function\r\n */\r\n\r\n var _proto = Field.prototype;\r\n\r\n _proto.addValidator = function addValidator(validator) {\r\n if (typeof validator === \"function\") this.validators.push(validator);\r\n }\r\n /**\r\n * Get error\r\n * @returns {Object}\r\n */\r\n ;\r\n\r\n /**\r\n * Add error\r\n * @param {Object} err Error\r\n */\r\n _proto.addError = function addError(err) {\r\n if (err) {\r\n var _this$_error;\r\n\r\n let error = (_this$_error = this._error) != null ? _this$_error : {};\r\n this._error = { ...error,\r\n ...err\r\n };\r\n this.invalid = true;\r\n }\r\n }\r\n /**\r\n * Clear all errors\r\n */\r\n ;\r\n\r\n _proto.clearErrors = function clearErrors() {\r\n this._error = null;\r\n this.invalid = false;\r\n }\r\n /**\r\n * Clear all validators\r\n */\r\n ;\r\n\r\n _proto.clearValidators = function clearValidators() {\r\n this.validators = [];\r\n }\r\n /**\r\n * Get error message\r\n * @returns {string} HTML\r\n */\r\n ;\r\n\r\n /**\r\n * Validate field value\r\n * @returns {boolean}\r\n */\r\n _proto.validate = function validate() {\r\n let result = true;\r\n this.clearErrors(); // Reset error\r\n\r\n if (this._element && this.shouldValidate) {\r\n if (Array.isArray(this.validators)) {\r\n for (let validator of this.validators) {\r\n let err = validator(this._element);\r\n\r\n if (err !== false) {\r\n this.addError(err);\r\n result = false;\r\n }\r\n }\r\n\r\n this.updateFeedback();\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n /**\r\n * Reset invalid property (on page load for Grid-Add/Edit)\r\n */\r\n ;\r\n\r\n _proto.resetInvalid = function resetInvalid() {\r\n var _this$_element, _this$_element$classL, _this$_element$closes, _this$_element$closes2;\r\n\r\n this.clearErrors();\r\n if ((_this$_element = this._element) != null && (_this$_element$classL = _this$_element.classList) != null && _this$_element$classL.contains(\"is-invalid\") && !this._error) this.addError({\r\n server: (_this$_element$closes = this._element.closest(ew.fieldContainerSelector)) == null ? void 0 : (_this$_element$closes2 = _this$_element$closes.querySelector(\".invalid-feedback\")) == null ? void 0 : _this$_element$closes2.innerHTML\r\n }); // Server side error\r\n }\r\n /**\r\n * Update the error message to feedback element\r\n */\r\n ;\r\n\r\n _proto.updateFeedback = function updateFeedback() {\r\n let err = this.errorMessage;\r\n\r\n if (this._element && err) {\r\n var _this$_element$closes3;\r\n\r\n let feedback = (_this$_element$closes3 = this._element.closest(ew.fieldContainerSelector)) == null ? void 0 : _this$_element$closes3.querySelector(\".invalid-feedback\");\r\n if (feedback) feedback.innerHTML = err;\r\n ew.setInvalid(this._element);\r\n }\r\n }\r\n /**\r\n * Set focus\r\n * @param {Object} options - Focus options\r\n */\r\n ;\r\n\r\n _proto.focus = function focus(options) {\r\n if (this._element) ew.setFocus(this._element, options);\r\n }\r\n /**\r\n * Check if the field can be focused\r\n */\r\n ;\r\n\r\n _proto.canFocus = function canFocus() {\r\n var _el$style, _el$classList;\r\n\r\n let el = this._element;\r\n return el && !(el.hidden && !el.tagName == \"SELECTION-LIST\" || el.readonly || el.disabled || el.type == \"hidden\" || ((_el$style = el.style) == null ? void 0 : _el$style.display) == \"none\" || (_el$classList = el.classList) != null && _el$classList.contains(\"d-none\"));\r\n }\r\n /**\r\n * Check if focused\r\n */\r\n ;\r\n\r\n _createClass(Field, [{\r\n key: \"error\",\r\n get: function () {\r\n return this._error;\r\n }\r\n }, {\r\n key: \"errorMessage\",\r\n get: function () {\r\n if (this._error) {\r\n return Array.from(Object.values(this._error)).join(\"
\");\r\n }\r\n\r\n return \"\";\r\n }\r\n /**\r\n * Check if the field should be validated\r\n */\r\n\r\n }, {\r\n key: \"shouldValidate\",\r\n get: function () {\r\n return !this._checkbox || this._checkbox.checked;\r\n }\r\n /**\r\n * Set form element\r\n */\r\n\r\n }, {\r\n key: \"element\",\r\n get:\r\n /**\r\n * Get form element\r\n * @returns {HTMLElement|HTMLElement[]}\r\n */\r\n function () {\r\n return this._element;\r\n }\r\n /**\r\n * Get field value from form element\r\n * @returns {string|Array}\r\n */\r\n ,\r\n set: function (el) {\r\n var _this$_element2, _this$_element2$id;\r\n\r\n this._element = el;\r\n this._checkbox = (_this$_element2 = this._element) != null && (_this$_element2$id = _this$_element2.id) != null && _this$_element2$id.match(/^[xy]_/) ? document.getElementById(this._element.id.replace(/^[xy]_/, \"u_\").replace(/\\[\\]$/, \"\")) : null; // Find the checkbox for the field in Update page\r\n }\r\n }, {\r\n key: \"value\",\r\n get: function () {\r\n return this._element ? ew.getValue(this._element) : \"\";\r\n }\r\n }, {\r\n key: \"focused\",\r\n get: function () {\r\n return this._element && this._element == document.activeElement;\r\n }\r\n }]);\r\n\r\n return Field;\r\n }();\n\n /**\r\n * Class Form\r\n */\r\n\r\n let Form = /*#__PURE__*/function (_FormBase) {\r\n _inheritsLoose(Form, _FormBase);\r\n\r\n /**\r\n * Constructor\r\n * @param {string} id Form ID\r\n * @param {string} pageId Page ID\r\n */\r\n function Form(id, pageId) {\r\n var _this;\r\n\r\n _this = _FormBase.call(this, id, pageId) || this;\r\n\r\n _defineProperty(_assertThisInitialized(_this), \"row\", {});\r\n\r\n _defineProperty(_assertThisInitialized(_this), \"fields\", {});\r\n\r\n _defineProperty(_assertThisInitialized(_this), \"validateRequired\", true);\r\n\r\n _defineProperty(_assertThisInitialized(_this), \"autoFocus\", true);\r\n\r\n _defineProperty(_assertThisInitialized(_this), \"autoFocusPreventScroll\", true);\r\n\r\n _this.on(\"initiated\", function () {\r\n let form = this.getForm();\r\n\r\n if (form.classList.contains(\"ew-wait\")) {\r\n this.one(\"enabled\", function () {\r\n this.setInvalid();\r\n this.tryFocus();\r\n });\r\n return;\r\n }\r\n\r\n this.setInvalid();\r\n this.tryFocus();\r\n });\r\n\r\n return _this;\r\n }\r\n /**\r\n * Add field\r\n * @param {string} fldvar Field variable name\r\n * @param {Function[]} validators Validators\r\n * @param {bool} invalid Invalid\r\n */\r\n\r\n var _proto = Form.prototype;\r\n\r\n _proto.addField = function addField(fldvar, validators, invalid) {\r\n if (!(fldvar in this.fields)) this.fields[fldvar] = new Field(fldvar, validators, invalid);\r\n }\r\n /**\r\n * Get field\r\n * @param {string} fldvar Field variable name\r\n * @returns Field\r\n */\r\n ;\r\n\r\n _proto.getField = function getField(fldvar) {\r\n return this.fields[fldvar];\r\n }\r\n /**\r\n * Add fields by field definitions\r\n * @param {Array} fields\r\n */\r\n ;\r\n\r\n _proto.addFields = function addFields(fields) {\r\n if (Array.isArray(fields)) {\r\n for (let field of fields) {\r\n if (Array.isArray(field)) {\r\n this.addField.apply(this, field);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Add error\r\n * @param {string} fldvar Field variable name\r\n * @param {Object} err Error\r\n */\r\n ;\r\n\r\n _proto.addError = function addError(fldvar, err) {\r\n if (err) {\r\n var _this$_error;\r\n\r\n this._error = (_this$_error = this._error) != null ? _this$_error : {};\r\n this._error[fldvar] = err;\r\n }\r\n }\r\n /**\r\n * Add custom error\r\n * @param {string} fldvar Field variable name\r\n * @param {string} msg Error message\r\n * @param {number} rowIndex - Row index\r\n */\r\n ;\r\n\r\n _proto.addCustomError = function addCustomError(fldvar, msg, rowIndex) {\r\n if (fldvar in this.fields) {\r\n let field = this.fields[fldvar],\r\n err = {\r\n custom: msg\r\n };\r\n field.addError(err);\r\n this.setFieldElement(fldvar, rowIndex);\r\n field.updateFeedback();\r\n this.addError(fldvar, err);\r\n }\r\n\r\n return false;\r\n }\r\n /**\r\n * Get error\r\n */\r\n ;\r\n\r\n /**\r\n * Set focus to a HTML element\r\n * @param {HTMLElement} el - HTML element to be focused\r\n */\r\n _proto.setFocus = function setFocus(el) {\r\n let delay = this.makeVisible(el) ? Form.focusDelay : 0;\r\n\r\n if (el && el != document.activeElement && el.focus) {\r\n let preventScroll = !el.closest(\".modal-body\") && Form.autoFocusPreventScroll && this.autoFocusPreventScroll;\r\n setTimeout(() => {\r\n el.focus({\r\n preventScroll\r\n });\r\n }, delay); // Focus after tab transition\r\n\r\n this._focused = true;\r\n }\r\n }\r\n /**\r\n * Set focus to the first field with error\r\n */\r\n ;\r\n\r\n _proto.focus = function focus() {\r\n if (!this.canFocus()) return;\r\n\r\n for (let [fldvar, field] of Object.entries(this.fields)) {\r\n var _this$_error2;\r\n\r\n if (field.invalid || (_this$_error2 = this._error) != null && _this$_error2[fldvar]) {\r\n this.getFocusable(field);\r\n\r\n if (field.canFocus()) {\r\n this.setFocus(field.element);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Get focuable field element\r\n * @param {Field} field - Field object\r\n */\r\n ;\r\n\r\n _proto.getFocusable = function getFocusable(field) {\r\n var _field$element;\r\n\r\n (_field$element = field.element) != null ? _field$element : field.element = this.getFieldElements(field.name);\r\n if (!field.canFocus()) field.element = this.getFieldElements(field.name, 0); // Inline-Add\r\n\r\n if (!field.canFocus()) field.element = this.getFieldElements(field.name, 1); // Inline-Edit or Grid-Add/Edit\r\n }\r\n /**\r\n * Try set focus to a field\r\n * @param {string|undefined|true} fieldName [undefined] - Field variable name. If undefined, find the first field. If true, always try to focus.\r\n */\r\n ;\r\n\r\n _proto.tryFocus = function tryFocus(fieldName) {\r\n if (!this.canFocus()) return;\r\n if (!fieldName && (!Form.autoFocus || !this.autoFocus || this._focused)) return;\r\n\r\n if (!fieldName && this.invalid) {\r\n // Has error\r\n this.focus();\r\n return;\r\n }\r\n\r\n if ([\"add\", \"edit\"].includes(this.pageId)) {\r\n // Process detail forms\r\n let form = this.getForm(),\r\n detailpage = Array.from(form.querySelectorAll(\"input[name=detailpage]\")).find(dp => {\r\n var _ew$forms$get;\r\n\r\n return (_ew$forms$get = ew.forms.get(dp.value)) == null ? void 0 : _ew$forms$get.invalid;\r\n });\r\n\r\n if (detailpage) {\r\n detailpage.focus();\r\n return;\r\n }\r\n }\r\n\r\n for (let [fldvar, field] of Object.entries(this.fields)) {\r\n if (typeof fieldName == \"string\" && fieldName !== fldvar) continue;\r\n field.element = null; // Reset field element first so that it will get the first element\r\n\r\n this.getFocusable(field);\r\n\r\n if (field.canFocus()) {\r\n this.setFocus(field.element);\r\n return;\r\n }\r\n }\r\n\r\n let input = this.element[ew.TABLE_BASIC_SEARCH]; // Quick Search input\r\n\r\n if (this.id.endsWith(\"srch\") && input && input != document.activeElement) {\r\n // Extended Search\r\n input.focus({\r\n preventScroll: Form.autoFocusPreventScroll && this.autoFocusPreventScroll\r\n }); // Focus the Quick Search input\r\n\r\n this._focused = true;\r\n }\r\n }\r\n /**\r\n * Check if the form can be focused\r\n */\r\n ;\r\n\r\n _proto.canFocus = function canFocus() {\r\n var _el$style, _el$classList;\r\n\r\n let el = this.element;\r\n return el && !(el.hidden || el.type == \"hidden\" || ((_el$style = el.style) == null ? void 0 : _el$style.display) == \"none\" || (_el$classList = el.classList) != null && _el$classList.contains(\"d-none\"));\r\n }\r\n /**\r\n * Make the form visible\r\n * @param {HTMLElement} el - Focused element\r\n */\r\n ;\r\n\r\n _proto.makeVisible = function makeVisible(el) {\r\n if (this.multiPage) {\r\n // Multi-page\r\n this.multiPage.gotoPageByElement(el);\r\n return true;\r\n } else if (this.$element.is(\"div\")) {\r\n // Multiple Master/Detail\r\n let $pane = this.$element.closest(\".tab-pane\");\r\n\r\n if ($pane[0] && !$pane.hasClass(\"active\")) {\r\n $pane.closest(\".ew-nav\").find(\"a[data-bs-toggle=tab][href='#\" + $pane.attr(\"id\") + \"']\").trigger(\"click\");\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n /**\r\n * Validate all fields of the specified row\r\n * @param {number} rowIndex - Row index\r\n */\r\n ;\r\n\r\n _proto.validateFields = function validateFields(rowIndex) {\r\n var _rowIndex;\r\n\r\n (_rowIndex = rowIndex) != null ? _rowIndex : rowIndex = this.getCurrentRowIndex();\r\n if (rowIndex < 2) // Regular pages (\"\"), Inline-Add (\"0\") or first row (\"1\")\r\n this.value = null; // Reset\r\n\r\n this.row = {};\r\n this._error = null; // Reset\r\n\r\n let result = true;\r\n\r\n for (let field of Object.values(this.fields)) {\r\n field.element = this.getFieldElements(field.name, rowIndex);\r\n this.row[field.name] = field.value; // Get field value\r\n\r\n if (field.element && !field.validate()) {\r\n // Invalid field value\r\n this.addError(field.name, field.error);\r\n result = false;\r\n }\r\n } // Save the field values of the row\r\n\r\n if (!this.value) {\r\n this.value = { ...this.row\r\n };\r\n } else {\r\n if (!Array.isArray(this.value)) this.value = [this.value];\r\n let index = parseInt(rowIndex, 10) || 0;\r\n index = index > 1 ? index - 1 : 0;\r\n this.value[index] = { ...this.row\r\n };\r\n }\r\n\r\n this.focus();\r\n return result;\r\n }\r\n /**\r\n * Key count (number|NaN)\r\n */\r\n ;\r\n\r\n /**\r\n * Validate\r\n * @param {Event} e - Event\r\n * @returns {bool}\r\n */\r\n _proto.validate = async function validate(e) {\r\n var _form$querySelector, _form$querySelector2, _ref, _e$currentTarget;\r\n\r\n if (!this.validateRequired) return true; // Ignore validation\r\n\r\n let form = this.getForm();\r\n if (((_form$querySelector = form.querySelector(\"#confirm\")) == null ? void 0 : _form$querySelector.value) == \"confirm\") return true;\r\n\r\n if (this.pageId == \"update\" && !ew.updateSelected(form)) {\r\n ew.alert(ew.language.phrase(\"NoFieldSelected\"));\r\n return false;\r\n }\r\n\r\n let addcnt = 0,\r\n inlineAdd = form.querySelector(\".ew-inline-insert\"),\r\n // Inline-Add\r\n action = ((_form$querySelector2 = form.querySelector(\"#action\")) == null ? void 0 : _form$querySelector2.value) || ((_ref = (_e$currentTarget = e == null ? void 0 : e.currentTarget) != null ? _e$currentTarget : inlineAdd) == null ? void 0 : _ref.dataset.action),\r\n keycnt = inlineAdd ? 0 : this.keyCount,\r\n gridinsert = action == \"gridinsert\" || [\"insert\", \"confirm\"].includes(action) && keycnt,\r\n // Grid-Add or Master/Detail-Add\r\n startcnt = inlineAdd ? 0 : 1,\r\n rowcnt = inlineAdd ? 0 : keycnt || 1;\r\n\r\n for (let i = startcnt; i <= rowcnt; i++) {\r\n var _await$this$customVal, _this$customValidate;\r\n\r\n let rowIndex = keycnt >= 0 ? String(i) : \"\";\r\n form.dataset.rowindex = rowIndex;\r\n\r\n if ([\"list\", \"grid\"].includes(this.pageId)) {\r\n if (gridinsert ? !this.emptyRow(rowIndex) : true) addcnt++;else continue;\r\n } // Validate fields\r\n\r\n if (!this.validateFields(rowIndex)) return false; // Call customValidate event\r\n\r\n if (!((_await$this$customVal = await ((_this$customValidate = this.customValidate) == null ? void 0 : _this$customValidate.call(this, form))) != null ? _await$this$customVal : true)) {\r\n this.focus();\r\n return false;\r\n }\r\n }\r\n\r\n delete form.dataset.rowindex; // Reset\r\n\r\n if (this.pageId == \"list\" && gridinsert && addcnt == 0) {\r\n // No row added\r\n ew.alert({\r\n html: ew.language.phrase(\"NoAddRecord\"),\r\n returnFocus: false\r\n }); // Do not return focus\r\n\r\n this.tryFocus(true);\r\n return false;\r\n } // Process detail forms\r\n\r\n if ([\"add\", \"edit\"].includes(this.pageId)) {\r\n let detailpages = form.querySelectorAll(\"input[name=detailpage]\");\r\n\r\n for (let dp of detailpages) {\r\n var _await$frm$validate;\r\n\r\n let frm = ew.forms.get(dp.value);\r\n if (!((_await$frm$validate = await (frm == null ? void 0 : frm.validate == null ? void 0 : frm.validate(e))) != null ? _await$frm$validate : true)) return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n /**\r\n * Get current row index (during validation)\r\n * @returns {string} Row index\r\n */\r\n ;\r\n\r\n _proto.getCurrentRowIndex = function getCurrentRowIndex() {\r\n var _this$getForm$dataset;\r\n\r\n return (_this$getForm$dataset = this.getForm().dataset.rowindex) != null ? _this$getForm$dataset : \"\";\r\n }\r\n /**\r\n * Get field values of the specified row\r\n * @param {number} rowIndex - Row index\r\n */\r\n ;\r\n\r\n _proto.getValue = function getValue(rowIndex) {\r\n var _rowIndex2;\r\n\r\n (_rowIndex2 = rowIndex) != null ? _rowIndex2 : rowIndex = this.getCurrentRowIndex();\r\n let value = {};\r\n\r\n for (let field of Object.values(this.fields)) {\r\n var _field$element2;\r\n\r\n (_field$element2 = field.element) != null ? _field$element2 : field.element = this.getFieldElements(field.name, rowIndex);\r\n value[field.name] = field.value; // Get field value\r\n }\r\n\r\n return value;\r\n }\r\n /**\r\n * Get a field value of the specified row\r\n * @param {string} fldvar - Field variable name\r\n * @param {number} rowIndex - Row index\r\n */\r\n ;\r\n\r\n _proto.getFieldValue = function getFieldValue(fldvar, rowIndex) {\r\n let field = this.getField(fldvar);\r\n\r\n if (field) {\r\n var _rowIndex3, _field$element3;\r\n\r\n (_rowIndex3 = rowIndex) != null ? _rowIndex3 : rowIndex = this.getCurrentRowIndex();\r\n (_field$element3 = field.element) != null ? _field$element3 : field.element = this.getFieldElements(field.name, rowIndex);\r\n return field.value;\r\n }\r\n\r\n return null;\r\n }\r\n /**\r\n * Get HTML elements for a field\r\n * @param {string} name - Field name\r\n * @param {number} rowIndex - Row index\r\n * @returns HTMLElement|HTMLElement[]|null\r\n */\r\n ;\r\n\r\n _proto.getFieldElements = function getFieldElements(name, rowIndex) {\r\n var _rowIndex4;\r\n\r\n (_rowIndex4 = rowIndex) != null ? _rowIndex4 : rowIndex = this.getCurrentRowIndex();\r\n return this.getElements(\"x\" + rowIndex + \"_\" + name) || // By name with prefix\r\n this.getElements(\"x\" + rowIndex + \"_\" + name + \"[]\") || // By name with prefix and []\r\n this.getElements(name); // By name directly (e.g. email form)\r\n }\r\n /**\r\n * Set the element property of the field object and return the field elements\r\n * @param {string} fldvar - Field variable name\r\n * @param {number} rowIndex - Row index\r\n * @returns HTMLElement|HTMLElement[]|null\r\n */\r\n ;\r\n\r\n _proto.setFieldElement = function setFieldElement(fldvar, rowIndex) {\r\n let field = this.getField(fldvar);\r\n if (field) field.element = this.getFieldElements(field.name, rowIndex);\r\n return field == null ? void 0 : field.element;\r\n }\r\n /**\r\n * Set invalid fields of the specified row\r\n * @param {number} rowIndex - Row index. If undefined, set for the whole form.\r\n */\r\n ;\r\n\r\n _proto.setInvalid = function setInvalid(rowIndex) {\r\n let form = this.getForm(); // Get HTML form\r\n\r\n if (typeof rowIndex === \"undefined\" && this.formKeyCountName) {\r\n let inlineAdd = form.querySelector(\".ew-inline-insert\"),\r\n // Inline-Add\r\n keycnt = inlineAdd ? 0 : this.keyCount,\r\n startcnt = inlineAdd ? 0 : 1,\r\n rowcnt = inlineAdd ? 0 : keycnt || 1;\r\n\r\n for (let i = startcnt; i <= rowcnt; i++) {\r\n let rowIndex = keycnt >= 0 ? String(i) : \"\";\r\n this.setInvalid(rowIndex);\r\n }\r\n } else {\r\n var _rowIndex5;\r\n\r\n (_rowIndex5 = rowIndex) != null ? _rowIndex5 : rowIndex = \"\";\r\n\r\n for (let field of Object.values(this.fields)) {\r\n field.element = this.getFieldElements(field.name, rowIndex); // Always get element in case Grid-Add/Edit\r\n\r\n if (rowIndex) field.resetInvalid(); // For Grid-Add/Edit\r\n\r\n if (field.invalid) {\r\n this.addError(field.name, field.error);\r\n if (!this._focused) this.focus(); // Focus at the current row\r\n } else {\r\n continue;\r\n }\r\n\r\n ew.setInvalid(field.element);\r\n } // Process detail forms\r\n\r\n if ([\"add\", \"edit\"].includes(this.pageId)) form.querySelectorAll(\"input[name=detailpage]\").forEach(dp => {\r\n var _ew$forms$get2;\r\n\r\n return (_ew$forms$get2 = ew.forms.get(dp.value)) == null ? void 0 : _ew$forms$get2.setInvalid();\r\n });\r\n }\r\n };\r\n\r\n _createClass(Form, [{\r\n key: \"error\",\r\n get: function () {\r\n return this._error;\r\n }\r\n /**\r\n * Check if invalid\r\n */\r\n\r\n }, {\r\n key: \"invalid\",\r\n get: function () {\r\n return this._error || Object.values(this.fields).some(field => field.invalid);\r\n }\r\n }, {\r\n key: \"keyCount\",\r\n get: function () {\r\n var _this$getForm$querySe;\r\n\r\n let keycnt = this.formKeyCountName ? (_this$getForm$querySe = this.getForm().querySelector(\"#\" + this.formKeyCountName)) == null ? void 0 : _this$getForm$querySe.value : undefined; // Get key_count\r\n\r\n return parseInt(keycnt, 10);\r\n }\r\n }]);\r\n\r\n return Form;\r\n }(FormBase);\r\n\r\n _defineProperty(Form, \"autoFocus\", true);\r\n\r\n _defineProperty(Form, \"autoFocusPreventScroll\", true);\r\n\r\n _defineProperty(Form, \"focusDelay\", 200);\n\n /**\r\n * Class FormBuilder\r\n */\r\n let FormBuilder = /*#__PURE__*/function () {\r\n function FormBuilder() {\r\n _defineProperty(this, \"lists\", {});\r\n\r\n _defineProperty(this, \"fields\", []);\r\n\r\n _defineProperty(this, \"validateRequired\", false);\r\n\r\n _defineProperty(this, \"multiPage\", false);\r\n\r\n _defineProperty(this, \"submitWithFetch\", false);\r\n\r\n _defineProperty(this, \"initSearchPanel\", false);\r\n\r\n _defineProperty(this, \"enableOnInit\", false);\r\n }\r\n\r\n var _proto = FormBuilder.prototype;\r\n\r\n // Set ID\r\n _proto.setId = function setId(value) {\r\n this.id = value;\r\n return this;\r\n } // Set page ID\r\n ;\r\n\r\n _proto.setPageId = function setPageId(value) {\r\n this.pageId = value;\r\n return this;\r\n } // Set lists\r\n ;\r\n\r\n _proto.setLists = function setLists(value) {\r\n if (value && typeof value == \"object\" && !Array.isArray(value)) this.lists = value;\r\n return this;\r\n } // Set lists for query builder (Dynamic Selection Lists and AutoFill not supported since there can be multiple inputs for the same field)\r\n ;\r\n\r\n _proto.setQueryBuilderLists = function setQueryBuilderLists(value) {\r\n if (value && typeof value == \"object\" && !Array.isArray(value)) {\r\n for (let [id, list] of Object.entries(value)) value[id] = { ...list,\r\n ...{\r\n autoFillTargetFields: [],\r\n childFields: [],\r\n filterFieldVars: [],\r\n filterFields: [],\r\n parentFields: []\r\n }\r\n };\r\n\r\n this.lists = value;\r\n }\r\n\r\n return this;\r\n } // Add list\r\n ;\r\n\r\n _proto.addList = function addList(name, value) {\r\n this.lists[name] = value;\r\n return this;\r\n } // Set fields\r\n ;\r\n\r\n _proto.setFields = function setFields(value) {\r\n if (Array.isArray(value)) this.fields = value;\r\n return this;\r\n } // Add field\r\n ;\r\n\r\n _proto.addField = function addField(fldvar, validators, invalid) {\r\n if (!this.fields.find(field => field[0] == fldvar)) this.fields.push([fldvar, validators, invalid]);\r\n return this;\r\n } // Add fields\r\n ;\r\n\r\n _proto.addFields = function addFields(value) {\r\n if (Array.isArray(value)) this.fields = [...this.fields, ...value];\r\n return this;\r\n } // Set validate\r\n ;\r\n\r\n _proto.setValidate = function setValidate(value) {\r\n this.validate = value;\r\n return this;\r\n } // Set custom validate\r\n ;\r\n\r\n _proto.setCustomValidate = function setCustomValidate(value) {\r\n this.customValidate = value;\r\n return this;\r\n } // Set validate required\r\n ;\r\n\r\n _proto.setValidateRequired = function setValidateRequired(value) {\r\n this.validateRequired = value;\r\n return this;\r\n } // Set submit\r\n ;\r\n\r\n _proto.setSubmit = function setSubmit(value) {\r\n this.submit = value;\r\n return this;\r\n } // Set form KeyCount name\r\n ;\r\n\r\n _proto.setFormKeyCountName = function setFormKeyCountName(value) {\r\n this.formKeyCountName = value;\r\n return this;\r\n } // Set empty row\r\n ;\r\n\r\n _proto.setEmptyRow = function setEmptyRow(value) {\r\n this.emptyRow = value;\r\n return this;\r\n } // Set multi page\r\n ;\r\n\r\n _proto.setMultiPage = function setMultiPage(value) {\r\n this.multiPage = value;\r\n return this;\r\n } // Set submit with Fetch API\r\n ;\r\n\r\n _proto.setSubmitWithFetch = function setSubmitWithFetch(value) {\r\n this.submitWithFetch = value;\r\n return this;\r\n } // Set filter list\r\n ;\r\n\r\n _proto.setFilterList = function setFilterList(value) {\r\n this.filterList = value;\r\n return this;\r\n } // Set initSearchPanel\r\n ;\r\n\r\n _proto.setInitSearchPanel = function setInitSearchPanel(value) {\r\n this.initSearchPanel = value;\r\n return this;\r\n } // Set enableOnInit\r\n ;\r\n\r\n _proto.setEnableOnInit = function setEnableOnInit(value) {\r\n this.enableOnInit = value;\r\n return this;\r\n } // Build\r\n ;\r\n\r\n _proto.build = function build() {\r\n let form = new ew.Form(this.id, this.pageId);\r\n if (Array.isArray(this.fields)) form.addFields(this.fields);\r\n if (typeof this.validate == 'function') form.validate = this.validate;\r\n if (typeof this.customValidate == 'function') form.customValidate = this.customValidate;\r\n if (typeof this.emptyRow == 'function') form.emptyRow = this.emptyRow;\r\n if (typeof this.submit == 'function') form.submit = this.submit;\r\n if (this.formKeyCountName) form.formKeyCountName = this.formKeyCountName;\r\n if (this.multiPage) form.multiPage = new ew.MultiPage(this.id);\r\n if (this.enableOnInit) form.enableOnInit = true;\r\n\r\n if (this.submitWithFetch) {\r\n form.submitWithFetch = true;\r\n form.on(\"aftersubmit\", (e, args) => ew.refresh(args == null ? void 0 : args.result, args == null ? void 0 : args.context));\r\n }\r\n\r\n if (this.filterList) form.filterList = this.filterList;\r\n if (this.lists) form.lists = this.lists;\r\n form.validateRequired = !!this.validateRequired;\r\n form.initSearchPanel = !!this.initSearchPanel;\r\n form.lists = this.lists;\r\n return form;\r\n };\r\n\r\n return FormBuilder;\r\n }();\n\n let AjaxLookup = /*#__PURE__*/function () {\r\n /**\r\n * Constructor\r\n * @param {Object} settings Settings\r\n * @param {string} settings.id - Input element ID\r\n * @param {string|Form} settings.form - Form of the input element\r\n * @param {Number} settings.limit - Options per page\r\n * @param {Object} settings.data - Data submitted by Ajax\r\n * @param {string} settings.action - Ajax action: \"autosuggest\" or \"modal\"\r\n */\r\n function AjaxLookup(settings) {\r\n var _this$list$parentFiel, _this$list$parentFiel2;\r\n\r\n _defineProperty(this, \"_isAutoSuggest\", null);\r\n\r\n this.elementId = settings.id; // Id\r\n\r\n this.form = settings.form; // Form\r\n\r\n if ($__default.default.isString(this.form)) // Form is string => Form id\r\n this.form = ew.forms.get(this.form);\r\n this.element = this.form.getElement(this.elementId); // Actual HTML element\r\n\r\n if (!this.element) // Element not found\r\n return;\r\n this.formElement = this.form.getElement(); // HTML form or DIV\r\n\r\n this.list = this.form.getList(this.element);\r\n let m = this.elementId.match(/^[xy](\\d*|\\$rowindex\\$)_/),\r\n rowindex = m ? m[1] : \"\";\r\n this.parentFields = (_this$list$parentFiel = (_this$list$parentFiel2 = this.list.parentFields) == null ? void 0 : _this$list$parentFiel2.slice() // Clone\r\n .map(pf => pf.split(\" \").length == 1 ? pf.replace(/^x_/, \"x\" + rowindex + \"_\") : pf)) != null ? _this$list$parentFiel : []; // Parent field in the same table, add row index\r\n\r\n this.limit = settings.limit;\r\n this.debounce = settings.debounce;\r\n this.data = settings.data;\r\n this.recordCount = 0;\r\n this.action = settings.action || \"autosuggest\";\r\n }\r\n /**\r\n * Is AutoSuggest\r\n */\r\n\r\n var _proto = AjaxLookup.prototype;\r\n\r\n /**\r\n * Format display value\r\n * @param {Array} opt Option\r\n */\r\n _proto.formatResult = function formatResult(opt) {\r\n this.form.compileTemplates();\r\n return this.list.template && !this.isAutoSuggest ? this.list.template.render(opt, ew.jsRenderHelpers) : ew.displayValue(opt, this.element) || opt[0];\r\n }\r\n /**\r\n * Generate request\r\n */\r\n ;\r\n\r\n _proto.generateRequest = function generateRequest() {\r\n var _data$ajax;\r\n\r\n var data = Object.assign({}, this.data, {\r\n name: this.element.name,\r\n page: this.list.page,\r\n field: this.list.field,\r\n language: ew.LANGUAGE_ID\r\n }, ew.getUserParams(\"#p_\" + this.elementId, this.formElement));\r\n (_data$ajax = data.ajax) != null ? _data$ajax : data.ajax = this.action;\r\n if (this.parentFields.length > 0) this.parentFields.forEach((pf, i) => data[\"v\" + (i + 1)] = ew.getOptionValue(pf, this.formElement));\r\n return data;\r\n }\r\n /**\r\n * Get URL\r\n */\r\n ;\r\n\r\n _proto.getUrl = function getUrl(query, start) {\r\n let params = new URLSearchParams({\r\n q: query || \"\",\r\n n: this.limit,\r\n rnd: ew.random(),\r\n start: $__default.default.isNumber(start) ? start : -1\r\n });\r\n return ew.getApiUrl(ew.API_LOOKUP_ACTION, params.toString());\r\n }\r\n /**\r\n * Prepare URL and data for sending request\r\n * @param {string} query Search term\r\n * @param {Number} start Start page\r\n */\r\n ;\r\n\r\n _proto.prepare = function prepare(query, start) {\r\n return {\r\n url: this.getUrl(query, start),\r\n type: \"POST\",\r\n dataType: \"json\",\r\n data: this.generateRequest()\r\n };\r\n }\r\n /**\r\n * Transform options (virtual)\r\n * @param {Object[]} data Data from server\r\n */\r\n ;\r\n\r\n _proto.transform = function transform(data) {\r\n let results = [];\r\n\r\n if ((data == null ? void 0 : data.result) == \"OK\") {\r\n this.recordCount = data.totalRecordCount;\r\n results = data.records;\r\n }\r\n\r\n return results;\r\n }\r\n /**\r\n * Convert options to Select2 data format\r\n * @param {Object[]} options Options\r\n * @returns {Object[]}\r\n */\r\n ;\r\n\r\n _proto.toSelect2Data = function toSelect2Data(options) {\r\n if (Array.isArray(options)) {\r\n if (options.every(item => item.hasOwnProperty(\"gf\"))) {\r\n // Has group by field\r\n let groups = [...new Set(options.map(item => item.gf))];\r\n return groups.map(group => {\r\n return {\r\n text: group,\r\n children: options.filter(item => item.gf == group).map(item => {\r\n return {\r\n id: item.lf,\r\n text: this.formatResult({\r\n lf: item.lf,\r\n df: item.df,\r\n df2: item.df2,\r\n df3: item.df3,\r\n df4: item.df4\r\n })\r\n };\r\n })\r\n };\r\n });\r\n } else {\r\n return options.map(item => {\r\n return {\r\n id: item.lf,\r\n text: this.formatResult({\r\n lf: item.lf,\r\n df: item.df,\r\n df2: item.df2,\r\n df3: item.df3,\r\n df4: item.df4\r\n })\r\n };\r\n });\r\n }\r\n }\r\n\r\n return options;\r\n };\r\n\r\n _createClass(AjaxLookup, [{\r\n key: \"isAutoSuggest\",\r\n get: function () {\r\n var _this$_isAutoSuggest;\r\n\r\n (_this$_isAutoSuggest = this._isAutoSuggest) != null ? _this$_isAutoSuggest : this._isAutoSuggest = ew.isAutoSuggest(this.element);\r\n return this._isAutoSuggest;\r\n }\r\n /**\r\n * Lookup options\r\n */\r\n\r\n }, {\r\n key: \"options\",\r\n get: function () {\r\n return this.list.lookupOptions;\r\n }\r\n }]);\r\n\r\n return AjaxLookup;\r\n }();\n\n let AutoSuggest = /*#__PURE__*/function (_AjaxLookup) {\r\n _inheritsLoose(AutoSuggest, _AjaxLookup);\r\n\r\n function AutoSuggest(settings) {\r\n var _this;\r\n\r\n _this = _AjaxLookup.call(this, settings) || this;\r\n if (!_this.element) // Element not found\r\n return _assertThisInitialized(_this);\r\n _this.input = _this.form.getElement(\"sv_\" + _this.elementId); // User input\r\n\r\n if (!_this.input || _this.elementId.includes(\"$rowindex$\")) return _assertThisInitialized(_this);\r\n\r\n let self = _assertThisInitialized(_this),\r\n $input = $__default.default(_this.input),\r\n $element = $__default.default(_this.element); // Properties\r\n\r\n _this.minWidth = settings.minWidth;\r\n _this.maxHeight = settings.maxHeight;\r\n _this.highlight = settings.highlight;\r\n _this.hint = settings.hint;\r\n _this.minLength = settings.minLength;\r\n _this.templates = Object.assign({}, settings.templates);\r\n _this.classNames = Object.assign({}, settings.classNames);\r\n _this.delay = settings.delay; // For loading more results\r\n\r\n _this.debounce = settings.debounce;\r\n _this.display = settings.display || \"text\";\r\n _this.forceSelection = settings.forceSelect;\r\n _this.lineHeight = settings.lineHeight;\r\n _this.paddingY = settings.paddingY;\r\n _this.lookupAllDisplayFields = settings.lookupAllDisplayFields;\r\n _this.$input = $input;\r\n _this.$element = $element; // Save instance\r\n\r\n $element.data(\"autosuggest\", _assertThisInitialized(_this)); // Save initial option\r\n\r\n if ($input.val() && $element.val()) _this.element.add($element.val(), $input.val(), true); // Add events\r\n\r\n $input.on(\"typeahead:select\", (e, d) => {\r\n self.setValue(d[self.display]);\r\n }).on(\"change\", () => {\r\n let ta = $input.data(\"tt-typeahead\");\r\n\r\n if (ta != null && ta.isOpen() && !ta.menu.empty()) {\r\n let $item = ta.menu.getActiveSelectable();\r\n\r\n if ($item) {\r\n // A suggestion is highlighted\r\n let i = $item.index(),\r\n val = self.element.options[i].text;\r\n $input.typeahead(\"val\", val);\r\n }\r\n }\r\n\r\n self.setValue();\r\n }).on(\"blur\", () => {\r\n // \"change\" fires before blur\r\n let ta = $input.data(\"tt-typeahead\");\r\n if (ta != null && ta.isOpen()) ta.menu.close();\r\n }).on(\"focus\", () => {\r\n $input.attr(\"placeholder\", $input.data(\"placeholder\")).removeClass(\"is-invalid\");\r\n $element.removeClass(\"is-invalid\");\r\n }); // Get suggestions\r\n\r\n let async = !_this.options.length,\r\n loadingMore = false,\r\n timer; // Option template (\"suggestion\" template)\r\n\r\n let tpl = self.list.template || self.templates.suggestion;\r\n if (tpl && $__default.default.isString(tpl)) tpl = $__default.default.templates(tpl);\r\n if (tpl) self.templates.suggestion = tpl.render.bind(tpl);\r\n if (async && !self.templates.footer) self.templates.footer = ''; // \"footer\" template\r\n\r\n let source = (query, syncResults, asyncResults) => {\r\n if (async) {\r\n if (timer) timer.cancel();\r\n timer = $__default.default.later(_this.debounce, null, () => {\r\n _this.recordCount = 0; // Reset\r\n\r\n $__default.default.ajax(_this.prepare(query)).done(data => asyncResults(_this.transform(data)));\r\n });\r\n } else {\r\n let records = _this.getSyncResults(query);\r\n\r\n syncResults(_this.transform({\r\n result: \"OK\",\r\n totalRecordCount: records.length,\r\n records\r\n }));\r\n }\r\n }; // Create Typeahead\r\n\r\n $__default.default(function () {\r\n // Typeahead options and dataset\r\n let options = {\r\n highlight: self.highlight,\r\n minLength: self.minLength,\r\n hint: self.hint,\r\n classNames: self.classNames\r\n };\r\n let dataset = {\r\n name: self.form.id + \"-\" + self.elementId,\r\n source,\r\n async,\r\n templates: self.templates,\r\n display: self.display,\r\n limit: async ? self.limit : Infinity\r\n };\r\n let args = [options, dataset]; // Trigger \"typeahead\" event\r\n\r\n $element.trigger(\"typeahead\", [args]); // Create Typeahead\r\n\r\n self.typeahead = $input.typeahead.apply($input, args).off(\"blur.tt\").data(\"tt-typeahead\");\r\n\r\n let menu = self.typeahead.menu,\r\n $menu = menu.$node,\r\n $dataset = $menu.find(\".tt-dataset\"),\r\n suggestionHeight = () => $menu.find(\".tt-suggestion\").outerHeight(false);\r\n\r\n if (self.minWidth) $menu.css(\"min-width\", self.minWidth);\r\n $input.on(\"typeahead:rendered\", (e, suggestions) => {\r\n let rendered = suggestions.length,\r\n count = self.count;\r\n\r\n if (count >= self.limit) {\r\n let h = suggestionHeight();\r\n if (h) $dataset.css(\"max-height\", h * self.limit);\r\n }\r\n\r\n if (rendered > 0) $dataset.scrollTop(suggestionHeight() * (count - rendered)); // Scroll to the first suggestion\r\n\r\n if (async) $menu.find(\".tt-footer\").toggle(self.recordCount > count);\r\n });\r\n\r\n if (async) {\r\n let loadingMoreTimer;\r\n $dataset.on(\"scroll\", () => {\r\n var _loadingMoreTimer;\r\n\r\n (_loadingMoreTimer = loadingMoreTimer) == null ? void 0 : _loadingMoreTimer.cancel();\r\n loadingMoreTimer = $__default.default.later(self.delay, null, () => {\r\n let $footer = $menu.find(\".tt-footer\");\r\n\r\n if (!$footer.is(\":hidden\") && !loadingMore) {\r\n let currentOffset = $dataset.offset().top + $dataset.outerHeight(false),\r\n loadingMoreOffset = $footer.offset().top + $footer.outerHeight(false);\r\n\r\n if (currentOffset + 20 > loadingMoreOffset) {\r\n // $footer shows more than 20px\r\n loadingMore = true;\r\n self.getMore().always(() => loadingMore = false);\r\n } else {\r\n var _loadingMoreTimer2;\r\n\r\n (_loadingMoreTimer2 = loadingMoreTimer) == null ? void 0 : _loadingMoreTimer2.cancel();\r\n }\r\n }\r\n });\r\n });\r\n }\r\n });\r\n return _this;\r\n } // Set the selected item to the actual field\r\n\r\n var _proto = AutoSuggest.prototype;\r\n\r\n _proto.setValue = function setValue(v) {\r\n v || (v = this.$input.val());\r\n let index = this.element.options.findIndex(option => option.text == v);\r\n\r\n if (index < 0) {\r\n // Not found in results\r\n if (this.forceSelection && v) {\r\n // Force selection and query not empty => error\r\n this.$input.typeahead(\"val\", \"\").addClass(\"is-invalid\");\r\n this.$element.next(\".invalid-feedback\").html(ew.language.phrase(\"ValueNotExist\"));\r\n this.$element.addClass(\"is-invalid\").val(\"\").trigger(\"change\");\r\n return;\r\n }\r\n } else {\r\n // Found in results\r\n this.element.options[index].selected = true;\r\n if (!/s(ea)?rch$/.test(this.formElement.id) || this.forceSelection) // Force selection or not search form\r\n v = this.element.options[index].value; // Replace the display value by Link Field value\r\n }\r\n\r\n if (v !== this.$element.attr(\"value\")) this.$element.attr(\"value\", v).trigger(\"change\"); // Set value to the actual field\r\n } // Transform suggestion\r\n ;\r\n\r\n _proto.transform = function transform(data) {\r\n let results = _AjaxLookup.prototype.transform.call(this, data).map(item => Object.assign({}, item, {\r\n text: _AjaxLookup.prototype.formatResult.call(this, item)\r\n }));\r\n\r\n this.element.options = results.map(item => new ew.SelectionListOption(item.text, item.lf || item[0]));\r\n return results;\r\n } // Get current suggestion count\r\n ;\r\n\r\n // Get suggestions from lookup cache\r\n _proto.getSyncResults = function getSyncResults(query) {\r\n if (this.options.length) {\r\n let results = this.options.filter(item => {\r\n if (this.lookupAllDisplayFields) {\r\n let v = [item.df, item.df2, item.df3, item.df4].map(df => String(df).toLowerCase()).join(\" \");\r\n return query.toLowerCase().split(\" \").filter(q => q !== \"\").every(q => v.includes(q));\r\n } else {\r\n return String(item.df).toLowerCase().startsWith(query);\r\n }\r\n });\r\n this.recordCount = results.length;\r\n return results;\r\n }\r\n\r\n return [];\r\n } // Get more suggestions by Ajax\r\n ;\r\n\r\n _proto.getMore = function getMore() {\r\n let menu = this.typeahead.menu,\r\n start = this.count,\r\n settings = this.prepare(menu.query, start);\r\n return $__default.default.ajax(settings).done(data => menu.datasets[0]._append(menu.query, this.transform(data)));\r\n };\r\n\r\n _createClass(AutoSuggest, [{\r\n key: \"count\",\r\n get: function () {\r\n return this.typeahead.menu.$node.find(\".tt-suggestion.tt-selectable\").length || 0;\r\n }\r\n }]);\r\n\r\n return AutoSuggest;\r\n }(AjaxLookup);\n\n /**\r\n * Class Forms\r\n */\r\n\r\n let Forms = /*#__PURE__*/function () {\r\n function Forms() {\r\n _defineProperty(this, \"_forms\", {});\r\n }\r\n\r\n var _proto = Forms.prototype;\r\n\r\n /**\r\n * Get form by element or id\r\n * @param {HTMLElement|string} el Element or id\r\n */\r\n _proto.get = function get(el) {\r\n var _ew$getForm;\r\n\r\n if (!el) return null;\r\n let id = $__default.default.isString(el) ? el : (_ew$getForm = ew.getForm(el)) == null ? void 0 : _ew$getForm.id;\r\n return this._forms[id];\r\n }\r\n /**\r\n * Add form\r\n * @param {Form} f Form\r\n */\r\n ;\r\n\r\n _proto.add = function add(f) {\r\n if (this._forms[f.id] && this._forms[f.id] !== f) delete this._forms[f.id];\r\n this._forms[f.id] = f;\r\n }\r\n /**\r\n * Get all ids\r\n * @returns {string[]}\r\n */\r\n ;\r\n\r\n _proto.ids = function ids() {\r\n return Object.keys(this._forms);\r\n };\r\n\r\n return Forms;\r\n }();\n\n let lang = ew.language.phrase(\"select2\");\r\n var Select2Language = {\r\n errorLoading: function () {\r\n return lang.errorLoading;\r\n },\r\n inputTooLong: function (args) {\r\n var overChars = args.input.length - args.maximum;\r\n return lang.inputTooLong.replace(\"%s\", overChars);\r\n },\r\n inputTooShort: function (args) {\r\n var remainingChars = args.minimum - args.input.length;\r\n return lang.inputTooShort.replace(\"%s\", remainingChars);\r\n },\r\n loadingMore: function () {\r\n return '' + lang.loadingMore + '
';\r\n },\r\n maximumSelected: function (args) {\r\n return lang.maximumSelected.replace(\"%s\", args.maximum);\r\n },\r\n noResults: function () {\r\n return lang.noResults;\r\n },\r\n searching: function () {\r\n return '' + lang.searching + '
';\r\n },\r\n removeAllItems: function () {\r\n return lang.removeAllItems;\r\n },\r\n removeItem: function () {\r\n return lang.removeItem;\r\n },\r\n search: function () {\r\n return lang.search;\r\n }\r\n };\n\n let _defined$3 = $__default.default.fn.select2.amd.require._defined,\r\n Utils$3 = _defined$3['select2/utils'];\r\n /**\r\n * Select2 decorator for Results\r\n */\r\n\r\n let Select2ResultsDecorator = /*#__PURE__*/function () {\r\n function Select2ResultsDecorator() {}\r\n\r\n var _proto = Select2ResultsDecorator.prototype;\r\n\r\n _proto.render = function render(decorated) {\r\n var $results = $__default.default(''); //***\r\n\r\n if (this.options.get('multiple')) {\r\n $results.attr('aria-multiselectable', 'true');\r\n }\r\n\r\n this.$results = $results;\r\n return $results;\r\n };\r\n\r\n _proto.displayMessage = function displayMessage(decorated, params) {\r\n var escapeMarkup = this.options.get('escapeMarkup');\r\n this.clear();\r\n this.hideLoading();\r\n var $message = $__default.default(''); //***\r\n\r\n if (params.message.includes(\"<\") && params.message.includes(\">\")) {\r\n // HTML //***\r\n $message.append(params.message);\r\n } else {\r\n var message = this.options.get('translations').get(params.message);\r\n $message.append(escapeMarkup(message(params.args)));\r\n }\r\n\r\n $message[0].className += ' select2-results__message';\r\n this.$results.append($message);\r\n };\r\n\r\n _proto.append = function append(decorated, data) {\r\n this.hideLoading();\r\n\r\n if (data.results == null || data.results.length === 0) {\r\n if (this.$results.children().length === 0) {\r\n if (this.$element.data(\"updating\") && data.pagination.more) {\r\n this.trigger('results:message', {\r\n message: '' + ew.language.phrase('Loading') + '
' + ew.language.phrase('Loading')\r\n });\r\n this.$element.one(\"updated\", () => this.$element.select2(\"close\").select2(\"open\"));\r\n } else {\r\n this.trigger('results:message', {\r\n message: 'noResults'\r\n });\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n data.results = this.sort(data.results); //***\r\n\r\n var cols = this.options.get('columns'),\r\n len = data.results.length,\r\n $row = this.$results.find(\".\" + this.options.get('rowClass')).last();\r\n\r\n for (var d = 0; d < data.results.length; d++) {\r\n var item = data.results[d];\r\n var $option = this.option(item);\r\n\r\n if (!$row.length || $row.children().length == cols) {\r\n // Add new row\r\n $row = $__default.default('');\r\n this.$results.append($row);\r\n }\r\n\r\n $row.append($option);\r\n\r\n if (d == len - 1) {\r\n // Last\r\n var cnt = cols - $row.children().length;\r\n\r\n for (var i = 0; i < cnt; i++) $row.append('');\r\n }\r\n }\r\n };\r\n\r\n _proto.option = function option(decorated, data) {\r\n // var option = document.createElement('li');\r\n var option = document.createElement('div'); //***\r\n\r\n option.classList.add('select2-results__option');\r\n option.classList.add('select2-results__option--selectable');\r\n this.options.get('cellClass').split(\" \").forEach(c => option.classList.add(c)); //***\r\n\r\n var attrs = {\r\n 'role': 'option',\r\n 'aria-selected': 'false'\r\n };\r\n var matches = window.Element.prototype.matches || window.Element.prototype.msMatchesSelector || window.Element.prototype.webkitMatchesSelector;\r\n\r\n if (data.element != null && matches.call(data.element, ':disabled') || data.element == null && data.disabled) {\r\n attrs['aria-disabled'] = 'true';\r\n option.classList.remove('select2-results__option--selectable');\r\n option.classList.add('select2-results__option--disabled');\r\n }\r\n\r\n if (data.id == null) {\r\n option.classList.remove('select2-results__option--selectable');\r\n }\r\n\r\n if (data._resultId != null) {\r\n option.id = data._resultId;\r\n }\r\n\r\n if (data.title) {\r\n option.title = data.title;\r\n } // if (data.children) { //***\r\n // attrs.role = 'group';\r\n // attrs['aria-label'] = data.text;\r\n // option.classList.remove('select2-results__option--selectable');\r\n // option.classList.add('select2-results__option--group');\r\n // }\r\n\r\n for (var attr in attrs) {\r\n var val = attrs[attr];\r\n option.setAttribute(attr, val);\r\n } // if (data.children) { //***\r\n // var $option = $(option);\r\n // var label = document.createElement('strong');\r\n // label.className = 'select2-results__group';\r\n // this.template(data, label);\r\n // var $children = [];\r\n // for (var c = 0; c < data.children.length; c++) {\r\n // var child = data.children[c];\r\n // var $child = this.option(child);\r\n // $children.push($child);\r\n // }\r\n // var $childrenContainer = $('', {\r\n // 'class': 'select2-results__options select2-results__options--nested',\r\n // 'role': 'none'\r\n // });\r\n // $childrenContainer.append($children);\r\n // $option.append(label);\r\n // $option.append($childrenContainer);\r\n // } else {\r\n\r\n this.template(data, option); // }\r\n\r\n Utils$3.StoreData(option, 'data', data);\r\n return option;\r\n };\r\n\r\n return Select2ResultsDecorator;\r\n }();\n\n let _defined$2 = $__default.default.fn.select2.amd.require._defined,\r\n Utils$2 = _defined$2['select2/utils'];\r\n /**\r\n * Results for modal lookup\r\n */\r\n\r\n let ModalResults = /*#__PURE__*/function () {\r\n function ModalResults() {}\r\n\r\n var _proto = ModalResults.prototype;\r\n\r\n _proto.bind = function bind(decorated, container, $container) {\r\n var _container$listeners$;\r\n\r\n var self = this;\r\n decorated.call(this, container, $container); // Remove handlers\r\n\r\n (_container$listeners$ = container.listeners['results:select']) == null ? void 0 : _container$listeners$.pop();\r\n this.$results.off('mouseup');\r\n container.on('results:select', function (evt) {\r\n var $highlighted = self.getHighlightedResults();\r\n\r\n if ($highlighted.length === 0) {\r\n return;\r\n }\r\n\r\n var data = Utils$2.GetData($highlighted[0], 'data');\r\n\r\n if ($highlighted.hasClass('select2-results__option--selected')) {\r\n self.trigger('unselect', {\r\n originalEvent: evt,\r\n data: data\r\n });\r\n } else {\r\n self.trigger('select', {\r\n originalEvent: evt,\r\n data: data\r\n });\r\n }\r\n });\r\n this.$results.on('mousedown', '.select2-results__option--selectable', function (evt) {\r\n this._mousedown = true;\r\n });\r\n this.$results.on('mouseup', '.select2-results__option--selectable', function (evt) {\r\n if (!this._mousedown) return;\r\n var $this = $__default.default(this);\r\n var data = Utils$2.GetData(this, 'data');\r\n\r\n if ($this.hasClass('select2-results__option--selected')) {\r\n self.trigger('unselect', {\r\n originalEvent: evt,\r\n data: data\r\n });\r\n return;\r\n }\r\n\r\n self.trigger('select', {\r\n originalEvent: evt,\r\n data: data\r\n });\r\n });\r\n };\r\n\r\n return ModalResults;\r\n }();\n\n /**\r\n * Search box for modal lookup\r\n */\r\n let ModalSearch = /*#__PURE__*/function () {\r\n function ModalSearch() {}\r\n\r\n var _proto = ModalSearch.prototype;\r\n\r\n _proto.bind = function bind(decorated, container, $container) {\r\n var _container$listeners$;\r\n\r\n var self = this;\r\n decorated.call(this, container, $container);\r\n (_container$listeners$ = container.listeners['close']) == null ? void 0 : _container$listeners$.pop(); // Remove handler from Search\r\n\r\n container.on('close', function () {\r\n self.$search.attr('tabindex', -1).removeAttr('aria-controls').removeAttr('aria-activedescendant');\r\n });\r\n };\r\n\r\n return ModalSearch;\r\n }();\n\n /**\r\n * Dropdown search decorator\r\n */\r\n let KEYS = $.fn.select2.amd.require._defined['select2/keys'];\r\n KEYS.PRINT_SCREEN = 44;\r\n\r\n let DropdownSearchDecorator = /*#__PURE__*/function () {\r\n function DropdownSearchDecorator() {}\r\n\r\n var _proto = DropdownSearchDecorator.prototype;\r\n\r\n _proto.handleSearch = function handleSearch(decorated, evt) {\r\n var key = evt.which; // Ignore events from modifier keys\r\n\r\n if ([KEYS.TAB, KEYS.SHIFT, KEYS.CTRL, KEYS.ALT, KEYS.PRINT_SCREEN].includes(key)) {\r\n return;\r\n }\r\n\r\n if (!this._keyUpPrevented) {\r\n var input = this.$search.val();\r\n this.trigger('query', {\r\n term: input\r\n });\r\n }\r\n\r\n this._keyUpPrevented = false;\r\n };\r\n\r\n return DropdownSearchDecorator;\r\n }();\n\n let AttachBody$2 = $__default.default.fn.select2.amd.require._defined['select2/dropdown/attachBody'];\r\n /**\r\n * Select2 AttachBody with popper\r\n */\r\n\r\n let Select2AttachBody = /*#__PURE__*/function (_AttachBody) {\r\n _inheritsLoose(Select2AttachBody, _AttachBody);\r\n\r\n // Constructor\r\n function Select2AttachBody(decorated, $element, options) {\r\n return _AttachBody.call(this, decorated, $element, options) || this;\r\n } // Override _attachPositioningHandler\r\n\r\n var _proto = Select2AttachBody.prototype;\r\n\r\n _proto._attachPositioningHandler = function _attachPositioningHandler(decorated, container) {\r\n var self = this;\r\n var events = ['scroll.select2.' + container.id, 'resize.select2.' + container.id, 'orientationchange.select2.' + container.id];\r\n\r\n var handler = () => {\r\n self._positionDropdown();\r\n\r\n self._resizeDropdown();\r\n };\r\n\r\n $__default.default(window).on(events.join(' '), handler);\r\n container.$element.closest('.modal').on('scroll.select2.' + container.id, handler);\r\n };\r\n\r\n // Override _detachPositioningHandler\r\n _proto._detachPositioningHandler = function _detachPositioningHandler(decorated, container) {\r\n var events = ['scroll.select2.' + container.id, 'resize.select2.' + container.id, 'orientationchange.select2.' + container.id];\r\n $__default.default(window).off(events.join(' '));\r\n container.$element.closest('.modal').off('scroll.select2.' + container.id);\r\n };\r\n\r\n // Override _showDropdown\r\n _proto._showDropdown = function _showDropdown(decorated) {\r\n var _this$_popper;\r\n\r\n this.$dropdownContainer.appendTo(this.$dropdownParent);\r\n (_this$_popper = this._popper) != null ? _this$_popper : this._popper = Popper.createPopper(this.$container[0], this.$dropdownContainer[0], {\r\n placement: ew.IS_RTL ? 'bottom-end' : 'bottom-start',\r\n modifiers: [{\r\n name: 'flip',\r\n enabled: true\r\n }, {\r\n name: 'preventOverflow',\r\n enabled: true\r\n }]\r\n });\r\n\r\n this._positionDropdown();\r\n\r\n this._resizeDropdown();\r\n };\r\n\r\n // Override _positionDropdown()\r\n _proto._positionDropdown = function _positionDropdown() {\r\n var _this$_popper2;\r\n\r\n (_this$_popper2 = this._popper) == null ? void 0 : _this$_popper2.update();\r\n } // Override destroy()\r\n ;\r\n\r\n _proto.destroy = function destroy(decorated) {\r\n var _this$_popper3;\r\n\r\n _AttachBody.prototype.destroy.call(this, decorated);\r\n\r\n (_this$_popper3 = this._popper) == null ? void 0 : _this$_popper3.destroy();\r\n this._popper = null;\r\n };\r\n\r\n return Select2AttachBody;\r\n }(AttachBody$2);\n\n /**\r\n * Select2 AttachBody decorator for modal lookup\r\n */\r\n\r\n let ModalAttachBody = /*#__PURE__*/function () {\r\n function ModalAttachBody(decorated, $element, options) {\r\n _defineProperty(this, \"$modal\", null);\r\n\r\n options.set('dropdownParent', $__default.default(document.body));\r\n decorated.call(this, $element, options);\r\n }\r\n\r\n var _proto = ModalAttachBody.prototype;\r\n\r\n _proto.bind = function bind(decorated, container, $container) {\r\n let self = this;\r\n decorated.call(this, container, $container);\r\n container.on('open', function () {\r\n self._showDropdown(); // Must bind after the results handlers to ensure correct sizing\r\n\r\n self._bindContainerResultHandlers(container);\r\n });\r\n this.$dropdownContainer.on('mousedown', function (evt) {\r\n evt.stopPropagation();\r\n });\r\n };\r\n\r\n _proto.position = function position(decorated, $dropdown, $container) {\r\n // Clone all of the container classes\r\n $dropdown.attr('class', $container.attr('class'));\r\n $dropdown.removeClass('select2');\r\n this.$container = $container;\r\n };\r\n\r\n _proto.render = function render(decorated) {\r\n let $container = $__default.default('');\r\n let $dropdown = decorated.call(this);\r\n $container.append($dropdown);\r\n this.$dropdownContainer = $container;\r\n return $container;\r\n };\r\n\r\n _proto._bindContainerResultHandlers = function _bindContainerResultHandlers(decorated, container) {\r\n // These should only be bound once\r\n if (this._containerResultsHandlersBound) {\r\n return;\r\n }\r\n\r\n let self = this;\r\n container.$modal = this.$modal;\r\n container.on('results:all', function () {\r\n var _self$$search$;\r\n\r\n self._updateDropdown();\r\n\r\n (_self$$search$ = self.$search[0]) == null ? void 0 : _self$$search$.focus();\r\n });\r\n container.on('results:append', function () {\r\n self._updateDropdown();\r\n });\r\n container.on('results:message', function () {\r\n self._updateDropdown();\r\n });\r\n container.on('select', function (e) {\r\n var _e$originalEvent;\r\n\r\n let target = (_e$originalEvent = e.originalEvent) == null ? void 0 : _e$originalEvent.currentTarget;\r\n target == null ? void 0 : target.classList.add('select2-results__option--selected');\r\n\r\n self._updateDropdown();\r\n });\r\n container.on('unselect', function (e) {\r\n var _e$originalEvent2;\r\n\r\n let target = (_e$originalEvent2 = e.originalEvent) == null ? void 0 : _e$originalEvent2.currentTarget;\r\n target == null ? void 0 : target.classList.remove('select2-results__option--selected');\r\n\r\n self._updateDropdown();\r\n });\r\n this._containerResultsHandlersBound = true;\r\n };\r\n\r\n _proto._updateDropdown = function _updateDropdown() {\r\n if (!this.$modal.find(this.$dropdownContainer)[0]) this.$modal.find('.modal-body').children().detach().end().append(this.$dropdownContainer);\r\n };\r\n\r\n _proto._showDropdown = function _showDropdown(decorated) {\r\n var _this$$modal;\r\n\r\n let self = this,\r\n oldValue = this.$element.val();\r\n this.$dropdownContainer.appendTo(this.options.get('dropdownParent'));\r\n (_this$$modal = this.$modal) != null ? _this$$modal : this.$modal = $__default.default('#ew-modal-lookup-dialog');\r\n\r\n this._updateDropdown();\r\n\r\n this.$modal.find('.modal-title').empty().append(ew.language.phrase('LookupTitle').replace('%s', this.$element.data('caption')));\r\n this.$modal.find('.modal-footer button[data-value]').off().on('click', function () {\r\n if (!$__default.default(this).data('value')) // Cancel\r\n self.$element.val(oldValue).trigger('change');\r\n });\r\n this.$modal.modal('show').on('hidden.bs.modal', function (event) {\r\n self.$container.removeClass('select2-container--open');\r\n }).draggable(this.options.get('draggableOptions'));\r\n };\r\n\r\n return ModalAttachBody;\r\n }();\n\n let AttachBody$1 = $__default.default.fn.select2.amd.require._defined['select2/dropdown/attachBody'];\r\n /**\r\n * Select2 AttachBody for table header filter\r\n */\r\n\r\n let FilterAttachBody = /*#__PURE__*/function (_AttachBody) {\r\n _inheritsLoose(FilterAttachBody, _AttachBody);\r\n\r\n // Constructor\r\n function FilterAttachBody(decorated, $element, options) {\r\n return _AttachBody.call(this, decorated, $element, options) || this;\r\n } // Override bind()\r\n\r\n var _proto = FilterAttachBody.prototype;\r\n\r\n _proto.bind = function bind(decorated, container, $container) {\r\n var self = this;\r\n decorated.call(this, container, $container);\r\n container.on('open', function () {\r\n self._showDropdown(); // Must bind after the results handlers to ensure correct sizing\r\n\r\n self._bindContainerResultHandlers(container);\r\n });\r\n container.on('close', function () {\r\n self._hideDropdown();\r\n });\r\n this.$dropdownContainer.on('mousedown', function (evt) {\r\n evt.stopPropagation();\r\n });\r\n } // Override _positionDropdown()\r\n ;\r\n\r\n _proto._positionDropdown = function _positionDropdown() {\r\n var _this$_popper;\r\n\r\n (_this$_popper = this._popper) == null ? void 0 : _this$_popper.update();\r\n } // Override _resizeDropdown()\r\n ;\r\n\r\n _proto._resizeDropdown = function _resizeDropdown() {\r\n var css = {\r\n width: this.$container.outerWidth(false) + 'px'\r\n };\r\n\r\n if (this.options.get('dropdownAutoWidth')) {\r\n css.minWidth = css.width;\r\n css.position = 'relative';\r\n css.width = 'auto';\r\n }\r\n\r\n this.$dropdown.css(css);\r\n } // Override _showDropdown()\r\n ;\r\n\r\n _proto._showDropdown = function _showDropdown(decorated) {\r\n var _dropdownButton$close, _this$_popper2;\r\n\r\n this.$dropdownContainer.appendTo(this.$dropdownParent); // Footer\r\n\r\n let self = this,\r\n oldValue = this.$element.val(),\r\n $footer = $__default.default('#ew-filter-dropdown-footer').contents().clone();\r\n $footer.find('.ew-filter-btn[data-value]').off('click.ew').on('click.ew', function (e) {\r\n let value = $__default.default(this).data('value');\r\n\r\n if (value) {\r\n // OK\r\n $__default.default(self.$element[0].form).triggerHandler('submit');\r\n } else {\r\n // Cancel\r\n self.$element.val(oldValue).trigger('change');\r\n }\r\n\r\n self.$element.select2('close');\r\n });\r\n $footer.find('.ew-filter-clear').off('click.ew').on('click.ew', e => self.$element.data('select2').selection._handleClear(e));\r\n let $filterDropdown = this.$dropdownContainer.find('.ew-filter-dropdown');\r\n if (!$filterDropdown.find('.ew-filter-btn')[0]) $filterDropdown.append($footer); // Popper\r\n\r\n var dropdownButton = document.querySelector('.ew-filter-dropdown-btn[data-table=' + this.$element.data('table') + '][data-field=' + this.$element.data('field') + ']'),\r\n reference = (_dropdownButton$close = dropdownButton.closest(\".ew-table-header-cell\")) != null ? _dropdownButton$close : dropdownButton.closest(\".ew-table-header-btn\");\r\n (_this$_popper2 = this._popper) != null ? _this$_popper2 : this._popper = Popper.createPopper(reference, this.$dropdownContainer[0], {\r\n placement: ew.IS_RTL ? 'bottom-end' : 'bottom-start',\r\n modifiers: [{\r\n name: 'flip',\r\n enabled: true\r\n }, {\r\n name: 'preventOverflow',\r\n enabled: true\r\n }]\r\n });\r\n\r\n this._positionDropdown();\r\n\r\n this._resizeDropdown();\r\n } // Override position()\r\n ;\r\n\r\n _proto.position = function position(decorated, $dropdown, $container) {\r\n // Clone all of the container classes\r\n $dropdown.attr('class', $container.attr('class'));\r\n $dropdown[0].classList.remove('select2');\r\n $dropdown[0].classList.add('select2-container--open');\r\n this.$container = $container;\r\n };\r\n\r\n // Override destroy()\r\n _proto.destroy = function destroy(decorated) {\r\n var _this$_popper3;\r\n\r\n _AttachBody.prototype.destroy.call(this, decorated);\r\n\r\n (_this$_popper3 = this._popper) == null ? void 0 : _this$_popper3.destroy();\r\n this._popper = null;\r\n };\r\n\r\n return FilterAttachBody;\r\n }(AttachBody$1);\n\n let AttachBody = $__default.default.fn.select2.amd.require._defined['select2/dropdown/attachBody'];\r\n /**\r\n * Select2 AttachBody for dropdown\r\n */\r\n\r\n let DropdownAttachBody = /*#__PURE__*/function (_AttachBody) {\r\n _inheritsLoose(DropdownAttachBody, _AttachBody);\r\n\r\n // Constructor\r\n function DropdownAttachBody(decorated, $element, options) {\r\n return _AttachBody.call(this, decorated, $element, options) || this;\r\n } // Override bind()\r\n\r\n var _proto = DropdownAttachBody.prototype;\r\n\r\n _proto.bind = function bind(decorated, container, $container) {\r\n var self = this;\r\n decorated.call(this, container, $container);\r\n container.on('open', function () {\r\n self._showDropdown(); // Must bind after the results handlers to ensure correct sizing\r\n\r\n self._bindContainerResultHandlers(container);\r\n });\r\n container.on('close', function () {\r\n self._hideDropdown();\r\n });\r\n this.$dropdownContainer.on('mousedown', function (evt) {\r\n evt.stopPropagation();\r\n });\r\n } // Override _showDropdown()\r\n ;\r\n\r\n _proto._showDropdown = function _showDropdown(decorated) {\r\n var _this$_popper;\r\n\r\n this.$dropdownContainer.appendTo(this.$dropdownParent);\r\n (_this$_popper = this._popper) != null ? _this$_popper : this._popper = Popper.createPopper(this.$element.parent().find('.select2-container')[0], this.$dropdownContainer[0], {\r\n placement: ew.IS_RTL ? 'bottom-end' : 'bottom-start',\r\n modifiers: [{\r\n name: 'flip',\r\n enabled: true\r\n }, {\r\n name: 'preventOverflow',\r\n enabled: true\r\n }]\r\n });\r\n\r\n this._positionDropdown();\r\n\r\n this._resizeDropdown();\r\n } // Override _positionDropdown()\r\n ;\r\n\r\n _proto._positionDropdown = function _positionDropdown() {\r\n var _this$_popper2;\r\n\r\n (_this$_popper2 = this._popper) == null ? void 0 : _this$_popper2.update();\r\n } // Override position()\r\n ;\r\n\r\n _proto.position = function position(decorated, $dropdown, $container) {\r\n // Clone all of the container classes\r\n $dropdown.attr('class', $container.attr('class'));\r\n $dropdown[0].classList.remove('select2');\r\n $dropdown[0].classList.add('select2-container--open');\r\n this.$container = $container;\r\n };\r\n\r\n // Override destroy()\r\n _proto.destroy = function destroy(decorated) {\r\n var _this$_popper3;\r\n\r\n _AttachBody.prototype.destroy.call(this, decorated);\r\n\r\n (_this$_popper3 = this._popper) == null ? void 0 : _this$_popper3.destroy();\r\n this._popper = null;\r\n };\r\n\r\n return DropdownAttachBody;\r\n }(AttachBody);\n\n let _defined$1 = $__default.default.fn.select2.amd.require._defined,\r\n AllowClear$1 = _defined$1['select2/selection/allowClear'],\r\n Utils$1 = _defined$1['select2/utils'];\r\n /**\r\n * Select2 AttachBody for table header filter\r\n */\r\n\r\n let FilterAllowClear = /*#__PURE__*/function (_AllowClear) {\r\n _inheritsLoose(FilterAllowClear, _AllowClear);\r\n\r\n function FilterAllowClear() {\r\n return _AllowClear.apply(this, arguments) || this;\r\n }\r\n\r\n var _proto = FilterAllowClear.prototype;\r\n\r\n // Override _handleClear\r\n _proto._handleClear = function _handleClear(_, evt) {\r\n // Ignore the event if it is disabled\r\n if (this.isDisabled()) {\r\n return;\r\n }\r\n\r\n var $clear = this.$selection.find('.select2-selection__clear'); // Ignore the event if nothing has been selected\r\n\r\n if ($clear.length === 0) {\r\n return;\r\n }\r\n\r\n evt.stopPropagation();\r\n var data = Utils$1.GetData($clear[0], 'data');\r\n var previousVal = this.$element.val();\r\n this.$element.val(this.placeholder.id);\r\n var unselectData = {\r\n data: data\r\n };\r\n this.trigger('clear', unselectData);\r\n\r\n if (unselectData.prevented) {\r\n this.$element.val(previousVal);\r\n return;\r\n }\r\n\r\n for (var d = 0; d < data.length; d++) {\r\n unselectData = {\r\n data: data[d]\r\n }; // Trigger the `unselect` event, so people can prevent it from being\r\n // cleared.\r\n\r\n this.trigger('unselect', unselectData); // If the event was prevented, don't clear it out.\r\n\r\n if (unselectData.prevented) {\r\n this.$element.val(previousVal);\r\n return;\r\n }\r\n }\r\n\r\n this.$element.trigger('input').trigger('change');\r\n };\r\n\r\n return FilterAllowClear;\r\n }(AllowClear$1);\n\n /**\r\n * Select2 decorator for MultipleSelection\r\n */\r\n let Select2MultipleSelectionDecorator = /*#__PURE__*/function () {\r\n function Select2MultipleSelectionDecorator() {}\r\n\r\n var _proto = Select2MultipleSelectionDecorator.prototype;\r\n\r\n _proto.bind = function bind(decorated, container, $container) {\r\n decorated.call(this, container, $container);\r\n this.$selection.on('click', '.select2-selection__choice__remove', function (evt) {\r\n evt.stopPropagation();\r\n });\r\n };\r\n\r\n return Select2MultipleSelectionDecorator;\r\n }();\n\n /**\r\n * Select2 decorator for SelectAdapter\r\n */\r\n let Select2DataAdapterDecorator = /*#__PURE__*/function () {\r\n function Select2DataAdapterDecorator() {}\r\n\r\n var _proto = Select2DataAdapterDecorator.prototype;\r\n\r\n _proto.option = function option(decorated, data) {\r\n var _data$element;\r\n\r\n var text = data.text,\r\n html = (_data$element = data.element) == null ? void 0 : _data$element.innerHTML,\r\n $option = decorated.call(this, data); // Check HTML\r\n\r\n if (text.startsWith('<') && text.endsWith('>')) $option.html(text);else if (html && html != text) $option.html(html);\r\n return $option;\r\n };\r\n\r\n return Select2DataAdapterDecorator;\r\n }();\n\n let _defined = $.fn.select2.amd.require._defined,\r\n ResultsList = _defined['select2/results'],\r\n SingleSelection = _defined['select2/selection/single'],\r\n MultipleSelection = _defined['select2/selection/multiple'],\r\n Placeholder = _defined['select2/selection/placeholder'],\r\n AllowClear = _defined['select2/selection/allowClear'],\r\n SelectionSearch = _defined['select2/selection/search'],\r\n EventRelay = _defined['select2/selection/eventRelay'],\r\n Utils = _defined['select2/utils'],\r\n Translation = _defined['select2/translation'],\r\n SelectData = _defined['select2/data/select'],\r\n ArrayData = _defined['select2/data/array'],\r\n AjaxData = _defined['select2/data/ajax'],\r\n Tags = _defined['select2/data/tags'],\r\n Tokenizer = _defined['select2/data/tokenizer'],\r\n MinimumInputLength = _defined['select2/data/minimumInputLength'],\r\n MaximumInputLength = _defined['select2/data/maximumInputLength'],\r\n MaximumSelectionLength = _defined['select2/data/maximumSelectionLength'],\r\n Dropdown = _defined['select2/dropdown'],\r\n DropdownSearch = _defined['select2/dropdown/search'],\r\n HidePlaceholder = _defined['select2/dropdown/hidePlaceholder'],\r\n InfiniteScroll = _defined['select2/dropdown/infiniteScroll'],\r\n // AttachBody = _defined['select2/dropdown/attachBody'],\r\n MinimumResultsForSearch = _defined['select2/dropdown/minimumResultsForSearch'],\r\n SelectOnClose = _defined['select2/dropdown/selectOnClose'],\r\n CloseOnSelect = _defined['select2/dropdown/closeOnSelect'],\r\n DropdownCSS = _defined['select2/dropdown/dropdownCss'],\r\n TagsSearchHighlight = _defined['select2/dropdown/tagsSearchHighlight'],\r\n Defaults = _defined['select2/defaults']; // Override select2 Defaults\r\n\r\n Defaults.apply = function (options) {\r\n options = $.extend(true, {}, this.defaults, options);\r\n\r\n if (options.dataAdapter == null) {\r\n if (options.ajax != null) {\r\n options.dataAdapter = AjaxData;\r\n } else if (options.data != null) {\r\n options.dataAdapter = ArrayData;\r\n } else {\r\n options.dataAdapter = SelectData;\r\n }\r\n\r\n options.dataAdapter = Utils.Decorate( // Override\r\n options.dataAdapter, Select2DataAdapterDecorator);\r\n\r\n if (options.minimumInputLength > 0) {\r\n options.dataAdapter = Utils.Decorate(options.dataAdapter, MinimumInputLength);\r\n }\r\n\r\n if (options.maximumInputLength > 0) {\r\n options.dataAdapter = Utils.Decorate(options.dataAdapter, MaximumInputLength);\r\n }\r\n\r\n if (options.maximumSelectionLength > 0) {\r\n options.dataAdapter = Utils.Decorate(options.dataAdapter, MaximumSelectionLength);\r\n }\r\n\r\n if (options.tags) {\r\n options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags);\r\n }\r\n\r\n if (options.tokenSeparators != null || options.tokenizer != null) {\r\n options.dataAdapter = Utils.Decorate(options.dataAdapter, Tokenizer);\r\n }\r\n }\r\n\r\n if (options.resultsAdapter == null) {\r\n options.resultsAdapter = ResultsList; // Override\r\n\r\n if (options.columns > 0 && options.customOption) {\r\n options.resultsAdapter = Utils.Decorate(options.resultsAdapter, Select2ResultsDecorator);\r\n\r\n if (options.iconClass && options.multiple && options.templateResult == ew.selectOptions.templateResult) {\r\n options._templateResult = options.templateResult;\r\n\r\n options.templateResult = result => result.loading ? result.text : '';\r\n }\r\n } else if (options.modal || options.filter) {\r\n options.resultsAdapter = Utils.Decorate(options.resultsAdapter, ModalResults);\r\n }\r\n\r\n if (options.ajax != null) {\r\n options.resultsAdapter = Utils.Decorate(options.resultsAdapter, InfiniteScroll);\r\n }\r\n\r\n if (options.placeholder != null) {\r\n options.resultsAdapter = Utils.Decorate(options.resultsAdapter, HidePlaceholder);\r\n }\r\n\r\n if (options.selectOnClose) {\r\n options.resultsAdapter = Utils.Decorate(options.resultsAdapter, SelectOnClose);\r\n }\r\n\r\n if (options.tags) {\r\n options.resultsAdapter = Utils.Decorate(options.resultsAdapter, TagsSearchHighlight);\r\n }\r\n }\r\n\r\n if (options.dropdownAdapter == null) {\r\n if (options.modal || options.filter) {\r\n options.dropdownAdapter = Utils.Decorate(Dropdown, DropdownSearch);\r\n options.dropdownAdapter = Utils.Decorate(options.dropdownAdapter, DropdownSearchDecorator);\r\n options.dropdownAdapter = Utils.Decorate(options.dropdownAdapter, ModalSearch);\r\n } else {\r\n options.dropdownAdapter = Dropdown;\r\n\r\n if (!options.multiple) {\r\n options.dropdownAdapter = Utils.Decorate(options.dropdownAdapter, DropdownSearch);\r\n options.dropdownAdapter = Utils.Decorate(options.dropdownAdapter, DropdownSearchDecorator);\r\n }\r\n }\r\n\r\n if (options.minimumResultsForSearch !== 0) {\r\n options.dropdownAdapter = Utils.Decorate(options.dropdownAdapter, MinimumResultsForSearch);\r\n }\r\n\r\n if (options.closeOnSelect) {\r\n options.dropdownAdapter = Utils.Decorate(options.dropdownAdapter, CloseOnSelect);\r\n }\r\n\r\n if (options.dropdownCssClass != null) {\r\n options.dropdownAdapter = Utils.Decorate(options.dropdownAdapter, DropdownCSS);\r\n }\r\n\r\n options.dropdownAdapter = Utils.Decorate(options.dropdownAdapter, options.modal ? ModalAttachBody : options.filter ? FilterAttachBody : options.dropdown ? DropdownAttachBody : Select2AttachBody // Override\r\n );\r\n }\r\n\r\n if (options.selectionAdapter == null) {\r\n if (options.multiple) {\r\n options.selectionAdapter = MultipleSelection;\r\n options.selectionAdapter = Utils.Decorate( // Override\r\n options.selectionAdapter, Select2MultipleSelectionDecorator);\r\n } else {\r\n options.selectionAdapter = SingleSelection;\r\n } // Add the placeholder mixin if a placeholder was specified\r\n\r\n if (options.placeholder != null) {\r\n options.selectionAdapter = Utils.Decorate(options.selectionAdapter, Placeholder);\r\n }\r\n\r\n if (options.allowClear) {\r\n options.selectionAdapter = Utils.Decorate(options.selectionAdapter, options.filter ? FilterAllowClear : AllowClear);\r\n }\r\n\r\n if (options.multiple) {\r\n options.selectionAdapter = Utils.Decorate(options.selectionAdapter, SelectionSearch);\r\n }\r\n\r\n options.selectionAdapter = Utils.Decorate(options.selectionAdapter, EventRelay);\r\n }\r\n\r\n options.translations = new Translation(Select2Language);\r\n options.dir = ew.IS_RTL ? \"rtl\" : \"ltr\";\r\n return options;\r\n };\n\n let currentUrl = new URL(window.location);\r\n let forms = new Forms();\r\n let $document$1 = $__default.default(document),\r\n $body = $__default.default(\"body\");\r\n let fieldContainerSelector = \".row, [id^=el_], [class^=el_]\"; // Set focus\r\n\r\n Pace.on(\"done\", () => {\r\n var _forms$get;\r\n\r\n let form = document.querySelector(\".modal.show form.ew-form\") || document.querySelector(\"form.ew-form\");\r\n (_forms$get = forms.get(form == null ? void 0 : form.id)) == null ? void 0 : _forms$get.tryFocus();\r\n }); // Create select2\r\n\r\n function createSelect(options) {\r\n if (options.selectId.includes(\"$rowindex$\")) return;\r\n\r\n if ($__default.default.isObject(options.data)) {\r\n let lookup = new ew.AjaxLookup(options.data);\r\n options.data = lookup.toSelect2Data(lookup.options);\r\n }\r\n\r\n if ($__default.default.isObject(options.ajax)) {\r\n let limit = options.ajax.limit,\r\n lookup = new ew.AjaxLookup({ ...options.ajax,\r\n ...{\r\n action: \"modal\"\r\n }\r\n });\r\n options.ajax = {\r\n url: params => {\r\n let start = params.page ? (params.page - 1) * limit : -1;\r\n return lookup.getUrl(params.term, start);\r\n },\r\n type: \"POST\",\r\n dataType: \"json\",\r\n data: lookup.generateRequest.bind(lookup),\r\n delay: options.debounce,\r\n processResults: function (data) {\r\n var _data$records$length, _data$records;\r\n\r\n let self = this;\r\n return {\r\n results: lookup.toSelect2Data(lookup.transform(data)),\r\n pagination: {\r\n more: self.container.$results.find(\".select2-results__option:not(.select2-results__option--load-more)\").length + ((_data$records$length = (_data$records = data.records) == null ? void 0 : _data$records.length) != null ? _data$records$length : 0) < lookup.recordCount\r\n }\r\n };\r\n },\r\n transport: (params, success, failure) => $__default.default.ajax(params).then(data => {\r\n let error = getError(data);\r\n !error || _alert(error);\r\n success(data);\r\n }).fail(failure)\r\n };\r\n }\r\n\r\n let args = {\r\n name: options.name,\r\n options\r\n };\r\n $document$1.trigger(\"select2\", [args]);\r\n let $select = $__default.default(\"select[data-select2-id='\" + options.selectId + \"']\").select2(args.options);\r\n $select.on(\"select2:open\", function () {\r\n var _$$data$$dropdown$fin;\r\n\r\n (_$$data$$dropdown$fin = $__default.default(this).data(\"select2\").$dropdown.find(\".select2-search__field\")[0]) == null ? void 0 : _$$data$$dropdown$fin.focus();\r\n });\r\n\r\n if ($__default.default.isObject(options.ajax)) {\r\n $select.on(\"select2:opening\", function () {\r\n $__default.default(this).data(\"select2\").$results.find(\".select2-results__option:not(.loading-results)\").remove();\r\n });\r\n }\r\n\r\n if (options.minimumResultsForSearch === Infinity) {\r\n $select.on(\"select2:opening select2:closing\", function () {\r\n $__default.default(this).data(\"select2\").$dropdown.find(\".select2-search--dropdown\").addClass(\"select2-search--hide\");\r\n });\r\n }\r\n } // Create modal lookup\r\n\r\n function createModalLookup(options) {\r\n if (options.selectId.includes(\"$rowindex$\")) return;\r\n\r\n if ($__default.default.isObject(options.data)) {\r\n let lookup = new ew.AjaxLookup(options.data);\r\n options.data = lookup.options.map(item => {\r\n return {\r\n id: item.lf,\r\n text: lookup.formatResult({\r\n lf: item.lf,\r\n df: item.df,\r\n df2: item.df2,\r\n df3: item.df3,\r\n df4: item.df4\r\n })\r\n };\r\n });\r\n }\r\n\r\n if ($__default.default.isObject(options.ajax)) {\r\n let limit = options.ajax.limit,\r\n lookup = new ew.AjaxLookup({ ...options.ajax,\r\n ...{\r\n action: \"modal\"\r\n }\r\n });\r\n options.ajax = {\r\n url: params => {\r\n let start = params.page ? (params.page - 1) * limit : -1;\r\n return lookup.getUrl(params.term, start);\r\n },\r\n type: \"POST\",\r\n dataType: \"json\",\r\n data: lookup.generateRequest.bind(lookup),\r\n delay: options.debounce,\r\n processResults: function (data) {\r\n var _data$records$length2, _data$records2;\r\n\r\n let self = this;\r\n return {\r\n results: lookup.transform(data).map(item => {\r\n return {\r\n id: item.lf,\r\n text: lookup.formatResult({\r\n lf: item.lf,\r\n df: item.df,\r\n df2: item.df2,\r\n df3: item.df3,\r\n df4: item.df4\r\n })\r\n };\r\n }),\r\n pagination: {\r\n more: self.container.$results.find(\".select2-results__option:not(.select2-results__option--load-more)\").length + ((_data$records$length2 = (_data$records2 = data.records) == null ? void 0 : _data$records2.length) != null ? _data$records$length2 : 0) < lookup.recordCount\r\n }\r\n };\r\n },\r\n transport: (params, success, failure) => $__default.default.ajax(params).then(data => {\r\n let error = getError(data);\r\n !error || _alert(error);\r\n success(data);\r\n }).fail(failure)\r\n };\r\n }\r\n\r\n let $select = $__default.default(\"select[data-select2-id='\" + options.selectId + \"']\").select2(options);\r\n $select.on(\"select2:open\", function () {\r\n var _$$data$$dropdown$fin2;\r\n\r\n (_$$data$$dropdown$fin2 = $__default.default(this).data(\"select2\").$dropdown.find(\".select2-search__field\").addClass(\"form-control\")[0]) == null ? void 0 : _$$data$$dropdown$fin2.focus();\r\n });\r\n\r\n if ($__default.default.isObject(options.ajax)) {\r\n $select.on(\"select2:opening\", function () {\r\n $__default.default(this).data(\"select2\").$results.find(\".select2-results__option:not(.loading-results)\").remove();\r\n });\r\n }\r\n } // Create table header filter\r\n\r\n function createFilter(options) {\r\n if (options.selectId.includes(\"$rowindex$\")) return;\r\n\r\n if ($__default.default.isObject(options.data)) {\r\n let lookup = new ew.AjaxLookup(options.data);\r\n options.data = lookup.options.map(item => {\r\n return {\r\n id: item.lf,\r\n text: lookup.formatResult({\r\n lf: item.lf,\r\n df: item.df,\r\n df2: item.df2,\r\n df3: item.df3,\r\n df4: item.df4\r\n })\r\n };\r\n });\r\n }\r\n\r\n if ($__default.default.isObject(options.ajax)) {\r\n let limit = options.ajax.limit,\r\n lookup = new ew.AjaxLookup({ ...options.ajax,\r\n ...{\r\n action: \"modal\"\r\n }\r\n });\r\n options.ajax = {\r\n url: params => {\r\n let start = params.page ? (params.page - 1) * limit : -1;\r\n return lookup.getUrl(params.term, start);\r\n },\r\n type: \"POST\",\r\n dataType: \"json\",\r\n data: lookup.generateRequest.bind(lookup),\r\n delay: options.debounce,\r\n processResults: function (data) {\r\n var _data$records$length3, _data$records3;\r\n\r\n let self = this;\r\n return {\r\n results: lookup.transform(data).map(item => {\r\n return {\r\n id: item.lf,\r\n text: lookup.formatResult({\r\n lf: item.lf,\r\n df: item.df,\r\n df2: item.df2,\r\n df3: item.df3,\r\n df4: item.df4\r\n })\r\n };\r\n }),\r\n pagination: {\r\n more: self.container.$results.find(\".select2-results__option:not(.select2-results__option--load-more)\").length + ((_data$records$length3 = (_data$records3 = data.records) == null ? void 0 : _data$records3.length) != null ? _data$records$length3 : 0) < lookup.recordCount\r\n }\r\n };\r\n },\r\n transport: (params, success, failure) => $__default.default.ajax(params).then(data => {\r\n let error = getError(data);\r\n !error || _alert(error);\r\n success(data);\r\n }).fail(failure)\r\n };\r\n }\r\n\r\n let $select = $__default.default(\"select[data-select2-id='\" + options.selectId + \"']\").select2(options);\r\n $select.on(\"select2:open\", function () {\r\n var _$$data$$dropdown$fin3;\r\n\r\n (_$$data$$dropdown$fin3 = $__default.default(this).data(\"select2\").$dropdown.find(\".select2-search__field\").addClass(\"form-control\")[0]) == null ? void 0 : _$$data$$dropdown$fin3.focus({\r\n preventScroll: options.preventScroll\r\n }); // Do not scroll on focus by default\r\n });\r\n\r\n if ($__default.default.isObject(options.ajax)) {\r\n $select.on(\"select2:opening\", function () {\r\n $__default.default(this).data(\"select2\").$results.find(\".select2-results__option:not(.loading-results)\").remove();\r\n });\r\n }\r\n } // Init icon tooltip\r\n\r\n function initIcons(e) {\r\n var _e$target;\r\n\r\n let el = (_e$target = e == null ? void 0 : e.target) != null ? _e$target : document,\r\n tooltipOptions = { ...ew.tooltipOptions,\r\n container: \"body\",\r\n trigger: ew.IS_MOBILE ? \"manual\" : \"hover\"\r\n };\r\n $__default.default(el).find(\".ew-icon\").closest(\".btn, .ew-home, .ew-row-link:not(.dropdown-item)\").each(function () {\r\n let $this = $__default.default(this);\r\n\r\n if ($this.hasClass(\"dropdown-toggle\")) {\r\n let $p = $this.closest(\".btn-group\");\r\n\r\n if ($p.children(\".btn\").length == 1) {\r\n $p.tooltip({ ...tooltipOptions,\r\n title: this.dataset.title || this.title\r\n }).on(\"mouseleave\", e => {\r\n var _bootstrap$Tooltip$ge;\r\n\r\n return (_bootstrap$Tooltip$ge = bootstrap.Tooltip.getInstance(e.currentTarget)) == null ? void 0 : _bootstrap$Tooltip$ge.hide();\r\n });\r\n $this.next(\".dropdown-menu\").on(\"mouseover\", e => e.stopPropagation());\r\n }\r\n } else {\r\n $this.tooltip(tooltipOptions);\r\n }\r\n });\r\n } // Init password options\r\n\r\n function initPasswordOptions(e) {\r\n var _e$target2;\r\n\r\n var el = (_e$target2 = e == null ? void 0 : e.target) != null ? _e$target2 : document;\r\n\r\n if ($__default.default.fn.pStrength && typeof ew.MIN_PASSWORD_STRENGTH != \"undefined\") {\r\n $__default.default(el).find(\".ew-password-strength\").each(function () {\r\n var $this = $__default.default(this);\r\n if (!$this.data(\"pStrength\")) $this.pStrength({\r\n \"changeBackground\": false,\r\n \"backgrounds\": [],\r\n \"passwordValidFrom\": ew.MIN_PASSWORD_STRENGTH,\r\n \"onPasswordStrengthChanged\": function (strength, percentage) {\r\n var $pst = $__default.default(\"[id='\" + this.attr(\"data-password-strength\") + \"']\"),\r\n // Do not use #\r\n $pb = $pst.find(\".progress-bar\");\r\n\r\n if (this.val() && !ew.isMaskedPassword(this)) {\r\n var pct = percentage + \"%\",\r\n min = ew.MIN_PASSWORD_STRENGTH,\r\n valid = percentage >= min;\r\n\r\n if (percentage < min * 0.25) {\r\n $pb.addClass(\"bg-danger\").removeClass(\"bg-warning bg-info bg-success\");\r\n } else if (percentage < min * 0.5) {\r\n $pb.addClass(\"bg-warning\").removeClass(\"bg-danger bg-info bg-success\");\r\n } else if (percentage < min * 0.75) {\r\n $pb.addClass(\"bg-primary\").removeClass(\"bg-danger bg-warning bg-success\");\r\n } else {\r\n $pb.addClass(\"bg-success\").removeClass(\"bg-danger bg-warning bg-info\");\r\n }\r\n\r\n $pb.css(\"width\", pct);\r\n if (percentage > min * 0.5) pct = ew.language.phrase(\"PasswordStrength\").replace(\"%p\", pct);\r\n $pb.html(pct);\r\n $pst.removeClass(\"d-none\");\r\n this.data(\"validated\", valid);\r\n if (valid) setValid(this[0]);\r\n } else {\r\n $pst.addClass(\"d-none\");\r\n this.data(\"validated\", null);\r\n }\r\n\r\n $pst.width(this.outerWidth());\r\n }\r\n });\r\n });\r\n }\r\n\r\n if ($__default.default.fn.pGenerator) {\r\n $__default.default(el).find(\".ew-password-generator\").each(function () {\r\n var $this = $__default.default(this);\r\n if (!$this.data(\"pGenerator\")) $this.pGenerator({\r\n \"passwordLength\": ew.GENERATE_PASSWORD_LENGTH,\r\n \"uppercase\": ew.GENERATE_PASSWORD_UPPERCASE,\r\n \"lowercase\": ew.GENERATE_PASSWORD_LOWERCASE,\r\n \"numbers\": ew.GENERATE_PASSWORD_NUMBER,\r\n \"specialChars\": ew.GENERATE_PASSWORD_SPECIALCHARS,\r\n \"onPasswordGenerated\": function (pwd) {\r\n $__default.default(\"#\" + this.attr(\"data-password-confirm\")).val(pwd);\r\n $__default.default(\"#\" + this.attr(\"data-password-field\")).val(pwd).trigger(\"change\").trigger(\"focus\").triggerHandler(\"click\"); // Trigger click to remove \"is-invalid\" class (Do not use $this.data)\r\n }\r\n });\r\n });\r\n }\r\n }\r\n /**\r\n * Get API action URL\r\n * @param {string|string[]} action - Route as string or array, e.g. \"foo\", [\"foo\", \"1\"]\r\n * @param {string|string[]|Object|URLSearchParams|FormData} query - Search params, e.g. \"foo=1&bar=2\", [[\"foo\", \"1\"], [\"bar\", \"2\"]], {\"foo\": \"1\", \"bar\": \"2\"}\r\n */\r\n\r\n function getApiUrl(action, query) {\r\n var url = ew.PATH_BASE + ew.API_URL,\r\n params = query instanceof URLSearchParams ? query : new URLSearchParams(query),\r\n qs = params.toString();\r\n\r\n if ($__default.default.isString(action)) {\r\n // Route as string\r\n url += action ? action : \"\";\r\n } else if (Array.isArray(action)) {\r\n // Route as array\r\n var route = action.map(function (v) {\r\n return encodeURIComponent(v);\r\n }).join(\"/\");\r\n url += route ? route : \"\";\r\n }\r\n\r\n return url + (qs ? \"?\" + qs : \"\");\r\n }\r\n /**\r\n * Parse URL\r\n * Note: .search is read only, always use .searchParams to change parameters\r\n * @param {string} url - URL\r\n * @returns {Object}\r\n */\r\n\r\n function parseUrl(url) {\r\n var _pathname, _hash;\r\n\r\n let pathname, search, hash;\r\n [pathname, hash] = url.split(\"#\");\r\n [pathname, search] = pathname.split(\"?\");\r\n if (!search && pathname.includes(\"=\")) [pathname, search] = [\"\", pathname];\r\n let obj = {\r\n url: url,\r\n pathname: (_pathname = pathname) != null ? _pathname : \"\",\r\n hash: (_hash = hash) != null ? _hash : \"\",\r\n searchParams: new URLSearchParams(search)\r\n };\r\n Object.defineProperty(obj, \"search\", {\r\n // Read only\r\n value: search,\r\n writable: false,\r\n enumerable: true\r\n });\r\n return obj;\r\n }\r\n /**\r\n * Create URLSearchParams\r\n * @param {*} params - search parameters\r\n * @returns {URLSearchParams}\r\n */\r\n\r\n function createSearchParams(params) {\r\n try {\r\n return new URLSearchParams(params);\r\n } catch (e) {\r\n console.log(e);\r\n return new URLSearchParams();\r\n }\r\n }\r\n /**\r\n * Get URL search parameters\r\n * @param {string} url - URL\r\n * @returns {URLSearchParams}\r\n */\r\n\r\n function getSearchParams(url) {\r\n return parseUrl(url).searchParams;\r\n }\r\n /**\r\n * Get a search parameter from URL\r\n * @param {string} url - URL\r\n * @param {string} name - Name\r\n * @returns {string} Value\r\n */\r\n\r\n function getSearchParam(url, name) {\r\n return getSearchParams(url).get(name);\r\n }\r\n /**\r\n * Set URL search parameters\r\n * @param {string} url - URL\r\n * @param {*} args - search parameters to be merged\r\n * @returns {string} URL\r\n */\r\n\r\n function setSearchParams(url) {\r\n let obj = parseUrl(url);\r\n\r\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\r\n args[_key - 1] = arguments[_key];\r\n }\r\n\r\n obj.searchParams = mergeSearchParams(obj.searchParams, ...args);\r\n return buildUrl(obj);\r\n }\r\n /**\r\n * Merge URL search parameters\r\n * @param {*} args - search parameters to be merged\r\n * @returns {URLSearchParams}\r\n */\r\n\r\n function mergeSearchParams() {\r\n let searchParams = new URLSearchParams();\r\n\r\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\r\n args[_key2] = arguments[_key2];\r\n }\r\n\r\n for (const params of args) {\r\n if ($__default.default.isObject(params) || $__default.default.isString(params) && params) {\r\n // Note: Array is also object\r\n let newParams = params instanceof URLSearchParams ? params : createSearchParams(params);\r\n newParams.forEach((value, key) => searchParams.has(key) ? key.endsWith(\"[]\") ? searchParams.append(key, value) : searchParams.set(key, value) : searchParams.set(key, value));\r\n }\r\n }\r\n\r\n return searchParams;\r\n }\r\n /**\r\n * Set URL search parameter\r\n * @param {string} url - URL\r\n * @param {string} name - Name\r\n * @param {string} value - Value\r\n * @returns {string} URL\r\n */\r\n\r\n function setSearchParam(url, name, value) {\r\n return setSearchParams(url, {\r\n [name]: value\r\n });\r\n }\r\n /**\r\n * Delete search parameters from URL\r\n * @param {string} url - URL\r\n * @param {string[]} names - Names\r\n * @returns {string} URL\r\n */\r\n\r\n function deleteSearchParam(url) {\r\n let obj = parseUrl(url);\r\n\r\n for (var _len3 = arguments.length, names = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\r\n names[_key3 - 1] = arguments[_key3];\r\n }\r\n\r\n names.forEach(name => obj.searchParams.delete(name));\r\n return buildUrl(obj);\r\n }\r\n /**\r\n * Build URL\r\n * @param {Object} obj Object { pathname, searchParams, hash }\r\n * @returns {string} URL\r\n */\r\n\r\n function buildUrl(obj) {\r\n let search = obj.searchParams.toString();\r\n return obj.pathname + (obj.pathname && search ? \"?\" : \"\") + search + (obj.hash ? \"#\" + obj.hash : \"\");\r\n }\r\n /**\r\n * Set layout parameter to URL\r\n * Disable layout by adding \"layout=false\"\r\n * @param {string} url - URL\r\n * @param {string} value - Layout\r\n * @returns {string} URL\r\n */\r\n\r\n function setLayout(url, value) {\r\n return url && url != \"#\" ? setSearchParams(url, {\r\n [ew.PAGE_LAYOUT]: String(value)\r\n }) : url;\r\n } // Sanitize URL\r\n\r\n function sanitizeUrl(url) {\r\n let obj = parseUrl(url),\r\n searchParams = obj.searchParams;\r\n searchParams.forEach((value, key) => {\r\n value = decodeURIComponent(value);\r\n if ([\"<>\", \"<=\", \">=\", \">\", \"<\"].includes(value)) searchParams.set(key, value);else searchParams.set(key, ew.sanitize(value));\r\n });\r\n return buildUrl(obj);\r\n } // Set session timer\r\n\r\n function setSessionTimer() {\r\n var timeoutTime,\r\n timer,\r\n keepAliveTimer,\r\n counter,\r\n useKeepAlive = ew.SESSION_KEEP_ALIVE_INTERVAL > 0 || ew.IS_LOGGEDIN && ew.IS_AUTOLOGIN; // Keep alive\r\n\r\n var keepAlive = () => {\r\n $__default.default.get(getApiUrl(ew.API_SESSION_ACTION), {\r\n \"rnd\": random()\r\n }, token => {\r\n if (token && $__default.default.isObject(token)) {\r\n // PHP\r\n ew.TOKEN_NAME = token[ew.TOKEN_NAME_KEY];\r\n ew.ANTIFORGERY_TOKEN = token[ew.ANTIFORGERY_TOKEN_KEY];\r\n if (token[\"JWT\"]) ew.API_JWT_TOKEN = token[\"JWT\"];\r\n }\r\n });\r\n }; // Reset timer\r\n\r\n var resetTimer = () => {\r\n counter = ew.SESSION_TIMEOUT_COUNTDOWN;\r\n timeoutTime = ew.SESSION_TIMEOUT - ew.SESSION_TIMEOUT_COUNTDOWN;\r\n\r\n if (timeoutTime < 0) {\r\n // Timeout now\r\n timeoutTime = 0;\r\n counter = ew.SESSION_TIMEOUT;\r\n }\r\n\r\n if (timer) timer.cancel(); // Clear timer\r\n }; // Timeout\r\n\r\n var timeout = () => {\r\n if (keepAliveTimer) keepAliveTimer.cancel(); // Stop keep alive\r\n\r\n if (counter > 0) {\r\n let timerInterval;\r\n let message = '' + ew.language.phrase(\"SessionWillExpire\") + '
';\r\n\r\n if (message.includes(\"%m\") && message.includes(\"%s\")) {\r\n message = message.replace(\"%m\", '' + Math.floor(counter / 60) + '');\r\n message = message.replace(\"%s\", '' + counter % 60 + '');\r\n } else if (message.includes(\"%s\")) {\r\n message = message.replace(\"%s\", '' + counter + '');\r\n }\r\n\r\n Swal.fire({ ...ew.sweetAlertSettings,\r\n html: message,\r\n showConfirmButton: true,\r\n confirmButtonText: ew.language.phrase(\"OKBtn\"),\r\n timer: counter * 1000,\r\n timerProgressBar: true,\r\n allowOutsideClick: false,\r\n allowEscapeKey: false,\r\n willOpen: () => {\r\n timerInterval = setInterval(() => {\r\n let content = Swal.getHtmlContainer(),\r\n min = content.querySelector(\".ew-session-counter-minute\"),\r\n sec = content.querySelector(\".ew-session-counter-second\"),\r\n timeleft = Math.round(Swal.getTimerLeft() / 1000);\r\n\r\n if (min && sec) {\r\n min.textContent = Math.floor(timeleft / 60);\r\n sec.textContent = timeleft % 60;\r\n } else if (sec) {\r\n sec.textContent = timeleft;\r\n }\r\n }, 1000);\r\n },\r\n willClose: () => {\r\n clearInterval(timerInterval);\r\n }\r\n }).then(result => {\r\n if (result.value) {\r\n // OK button pressed\r\n keepAlive();\r\n if (!useKeepAlive && ew.SESSION_TIMEOUT > 0) setTimer();\r\n } else if (result.dismiss === Swal.DismissReason.timer) {\r\n // Timeout\r\n resetTimer();\r\n window.location = sanitizeUrl(ew.TIMEOUT_URL + \"?expired=1\");\r\n }\r\n });\r\n }\r\n }; // Set timer\r\n\r\n var setTimer = () => {\r\n resetTimer(); // Reset timer first\r\n\r\n timer = $__default.default.later(timeoutTime * 1000, null, timeout);\r\n };\r\n\r\n if (useKeepAlive) {\r\n // Keep alive\r\n var keepAliveInterval = ew.SESSION_KEEP_ALIVE_INTERVAL > 0 ? ew.SESSION_KEEP_ALIVE_INTERVAL : ew.SESSION_TIMEOUT - ew.SESSION_TIMEOUT_COUNTDOWN;\r\n if (keepAliveInterval <= 0) keepAliveInterval = 60;\r\n keepAliveTimer = $__default.default.later(keepAliveInterval * 1000, null, keepAlive, null, true); // Periodic\r\n } else {\r\n if (ew.SESSION_TIMEOUT > 0) // Set session timeout\r\n setTimer();\r\n }\r\n } // Init export links\r\n\r\n function initExportLinks(e) {\r\n var _e$target3;\r\n\r\n let $el = $__default.default((_e$target3 = e == null ? void 0 : e.target) != null ? _e$target3 : document);\r\n $el.find(\"a.ew-export-link[href]:not(.ew-email):not(.ew-print):not(.ew-xml)\").on(\"click\", function (e) {\r\n let href = this.href;\r\n if (href && href != \"#\") fileDownload(href, getchartParams());\r\n e.preventDefault();\r\n });\r\n $el.find(\"a.ew-export-link[href].ew-print, a.ew-export-link[href].ew-xml\").each(function () {\r\n let url = new URL(this.href);\r\n url.searchParams.set(ew.TOKEN_NAME_KEY, ew.TOKEN_NAME);\r\n url.searchParams.set(ew.ANTIFORGERY_TOKEN_KEY, ew.ANTIFORGERY_TOKEN);\r\n this.href = url.pathname + url.search; // Add token name and antiforgery token // PHP\r\n });\r\n } // Init multi-select checkboxes\r\n\r\n function initMultiSelectCheckboxes(e) {\r\n var _e$target4;\r\n\r\n var el = (_e$target4 = e == null ? void 0 : e.target) != null ? _e$target4 : document,\r\n $el = $__default.default(el),\r\n $cbs = $el.find(\"input[type=checkbox].ew-multi-select\");\r\n\r\n var _update = function (id) {\r\n var $els = $cbs.filter(\"[name^='\" + id + \"_']\"),\r\n cnt = $els.length,\r\n len = $els.filter(\":checked\").length;\r\n $__default.default(\"input[type=checkbox]#\" + id).prop(\"checked\", len == cnt).prop(\"indeterminate\", len != cnt && len != 0);\r\n };\r\n\r\n $cbs.on(\"click\", e => _update(e.target.name.split(\"_\")[0]));\r\n $el.find(\"input[type=checkbox].ew-priv:not(.ew-multi-select)\").each((i, el) => _update(el.id)); // Init\r\n } // Get error from response\r\n\r\n function getError(result) {\r\n var _result$error, _result$error2;\r\n\r\n return result && (((_result$error = result.error) == null ? void 0 : _result$error.description) || ((_result$error2 = result.error) == null ? void 0 : _result$error2.message) || $__default.default.isString(result.error) && result.error || result.failureMessage || // Check this first\r\n result.success === false && result.message || null);\r\n } // Download file\r\n\r\n function fileDownload(href, data) {\r\n let isHtml = href.includes(\"export=html\") || href.includes(getApiUrl([ew.API_EXPORT_ACTION, \"html\"])),\r\n swal = window.parent.Swal; // Use window.parent.Swal in case in iframe\r\n\r\n data = mergeSearchParams(data, [[ew.TOKEN_NAME_KEY, ew.TOKEN_NAME], [ew.ANTIFORGERY_TOKEN_KEY, ew.ANTIFORGERY_TOKEN]]);\r\n return swal.fire({ ...ew.sweetAlertSettings,\r\n showConfirmButton: false,\r\n html: \"\" + ew.language.phrase(\"Exporting\") + \"
\",\r\n allowOutsideClick: false,\r\n allowEscapeKey: false,\r\n willOpen: () => {\r\n swal.showLoading();\r\n\r\n _fetch(href, {\r\n method: data ? \"POST\" : \"GET\",\r\n body: data || null\r\n }).then(async response => {\r\n let ct = response.headers.get(\"Content-Type\");\r\n\r\n if (ct != null && ct.includes(\"json\")) {\r\n var _getError;\r\n\r\n let result = await response.json(),\r\n error = (_getError = getError(result)) != null ? _getError : ew.language.phrase(\"FailedToExport\");\r\n\r\n if (error) {\r\n swal.hideLoading();\r\n swal.update({\r\n html: \"\" + error + \"
\",\r\n showConfirmButton: true\r\n });\r\n $document$1.trigger(\"export\", [{\r\n type: \"fail\",\r\n url: href\r\n }]);\r\n }\r\n } else {\r\n let data = isHtml ? await response.text() : await response.blob(),\r\n url = URL.createObjectURL(isHtml ? new Blob([data], {\r\n type: \"text/html\"\r\n }) : data),\r\n a = document.createElement(\"a\"),\r\n cd = response.headers.get(\"Content-Disposition\"),\r\n m = cd == null ? void 0 : cd.match(/\\bfilename=((['\"])(.+)\\2|([^;]+))/i);\r\n a.style.display = \"none\";\r\n a.href = url;\r\n if (m) a.download = m[3] || m[4];\r\n document.body.appendChild(a);\r\n a.click();\r\n $document$1.trigger(\"export\", [{\r\n type: \"done\",\r\n url: href,\r\n objectUrl: url\r\n }]);\r\n URL.revokeObjectURL(url);\r\n swal.close();\r\n }\r\n }).catch(error => {\r\n swal.hideLoading();\r\n swal.update({\r\n html: \"\" + error + \"
\",\r\n showConfirmButton: true\r\n });\r\n $document$1.trigger(\"export\", [{\r\n type: \"fail\",\r\n url: href\r\n }]);\r\n }).finally(() => {\r\n $document$1.trigger(\"export\", [{\r\n type: \"always\",\r\n url: href\r\n }]);\r\n });\r\n }\r\n });\r\n } // Lazy load images\r\n\r\n function lazyLoad(e) {\r\n var _e$target5;\r\n\r\n if (!ew.LAZY_LOAD) return;\r\n var el = (_e$target5 = e == null ? void 0 : e.target) != null ? _e$target5 : document;\r\n el.querySelectorAll(\"img.ew-lazy\").forEach((img, i) => {\r\n if (ew.LAZY_LOAD_DELAY > 0) setTimeout(() => img.src = img.dataset.src, i * ew.LAZY_LOAD_DELAY);else img.src = img.dataset.src;\r\n });\r\n $document$1.trigger(\"lazyload\"); // All images loaded\r\n } // Update select2 dropdown position\r\n\r\n function updateDropdownPosition() {\r\n var select = $__default.default(\".select2-container--open\").prev(\".ew-select\").data(\"select2\");\r\n\r\n if (select) {\r\n select.dropdown._positionDropdown();\r\n\r\n select.dropdown._resizeDropdown();\r\n }\r\n } // Colorboxes\r\n\r\n function initLightboxes(e) {\r\n var _e$target6;\r\n\r\n if (!ew.USE_COLORBOX) return;\r\n var el = (_e$target6 = e == null ? void 0 : e.target) != null ? _e$target6 : document;\r\n var settings = Object.assign({}, ew.lightboxSettings, {\r\n title: ew.language.phrase(\"LightboxTitle\"),\r\n current: ew.language.phrase(\"LightboxCurrent\"),\r\n previous: ew.language.phrase(\"LightboxPrevious\"),\r\n next: ew.language.phrase(\"LightboxNext\"),\r\n close: ew.language.phrase(\"LightboxClose\"),\r\n xhrError: ew.language.phrase(\"LightboxXhrError\"),\r\n imgError: ew.language.phrase(\"LightboxImgError\")\r\n });\r\n $__default.default(el).find(\".ew-lightbox\").each(function () {\r\n var $this = $__default.default(this);\r\n $this.colorbox(Object.assign({\r\n rel: $this.data(\"rel\")\r\n }, settings));\r\n });\r\n } // PDFObjects\r\n\r\n function initPdfObjects(e) {\r\n var _e$target7;\r\n\r\n if (!ew.EMBED_PDF) return;\r\n let el = (_e$target7 = e == null ? void 0 : e.target) != null ? _e$target7 : document,\r\n options = Object.assign({}, ew.PDFObjectOptions);\r\n $__default.default(el).find(\".ew-pdfobject\").not(\":has(.pdfobject)\").each(function () {\r\n // Not already embedded\r\n let $this = $__default.default(this),\r\n url = $this.data(\"url\"),\r\n html = $this.html();\r\n if (url) PDFObject.embed(url, this, Object.assign(options, {\r\n fallbackLink: html\r\n }));\r\n });\r\n } // Tooltips and popovers\r\n\r\n function initTooltips(e) {\r\n var _e$target8;\r\n\r\n let el = (_e$target8 = e == null ? void 0 : e.target) != null ? _e$target8 : document,\r\n $el = $__default.default(el);\r\n $el.find(\"input[data-bs-toggle=tooltip], textarea[data-bs-toggle=tooltip], select[data-bs-toggle=tooltip]\").each(function () {\r\n let $this = $__default.default(this);\r\n $this.tooltip({ ...ew.tooltipOptions,\r\n html: true,\r\n ...$this.data()\r\n });\r\n });\r\n $el.find(\"a.ew-tooltip-link\").each(tooltip); // Set up tooltip links as popovers\r\n\r\n $el.find(\".ew-tooltip\").tooltip(ew.tooltipOptions);\r\n $el.find(\".ew-popover\").popover(ew.popoverOptions);\r\n } // Parse JSON\r\n\r\n function parseJson(data) {\r\n if ($__default.default.isString(data)) {\r\n try {\r\n return JSON.parse(data);\r\n } catch (e) {\r\n return undefined;\r\n }\r\n }\r\n\r\n return data;\r\n } // Change search operator\r\n\r\n function searchOperatorChange(el) {\r\n let $el = $__default.default(el),\r\n $p = $el.closest(\"[id^=r_], [id^=xs_]\"),\r\n parm = el.id.substring(2),\r\n $fld = $p.find(\".ew-search-field\"),\r\n $fld2 = $p.find(\".ew-search-field2\"),\r\n $y = $fld2.find(\"[name='y_\" + parm + \"'], [name='y_\" + parm + \"[]']\"),\r\n hasY = $y.length,\r\n $cond = $p.find(\".ew-search-cond\"),\r\n hasCond = $cond.length,\r\n // Has condition and operator 2\r\n $and = $p.find(\".ew-search-and\"),\r\n $opr = $p.find(\".ew-search-operator\"),\r\n opr = $opr.find(\"[name='z_\" + parm + \"']\").val(),\r\n $opr2 = $p.find(\".ew-search-operator2\"),\r\n opr2 = $opr2.find(\"[name='w_\" + parm + \"']\").val(),\r\n isBetween = opr.includes(\"BETWEEN\"),\r\n // Can only be operator 1\r\n isEmptyOpr = [\"IS NULL\", \"IS NOT NULL\", \"IS EMPTY\", \"IS NOT EMPTY\"].includes(opr),\r\n isEmptyOpr2 = [\"IS NULL\", \"IS NOT NULL\", \"IS EMPTY\", \"IS NOT EMPTY\"].includes(opr2),\r\n hideOpr2 = !hasY || isBetween,\r\n hideX = isEmptyOpr,\r\n hideY = !isBetween && (!hasCond || isEmptyOpr2);\r\n $cond.toggleClass(\"d-none\", hideOpr2).find(\":input\").prop(\"disabled\", hideOpr2);\r\n $and.toggleClass(\"d-none\", !isBetween);\r\n $opr2.toggleClass(\"d-none\", hideOpr2).find(\":input\").prop(\"disabled\", hideOpr2);\r\n $fld.toggleClass(\"d-none\", hideX).find(\":input\").prop(\"disabled\", hideX);\r\n $fld2.toggleClass(\"d-none\", hideY).find(\":input\").prop(\"disabled\", hideY);\r\n } // Init forms\r\n\r\n function initForms(e) {\r\n var _e$target9;\r\n\r\n let el = (_e$target9 = e == null ? void 0 : e.target) != null ? _e$target9 : document,\r\n ids = ew.forms.ids();\r\n\r\n for (let id of ids) {\r\n if (el.matches != null && el.matches(\"#\" + id) || el.querySelector(\"#\" + id)) forms.get(id).init();\r\n }\r\n } // Is function\r\n\r\n function isFunction$1(x) {\r\n return typeof x === \"function\";\r\n }\r\n /**\r\n * Alert (OK button only)\r\n *\r\n * @param {string|Object} msg - Message or config\r\n * @param {callback} [cb] - Callback function\r\n * @param {string} [type] - CSS class (see https://getbootstrap.com/docs/5.2/utilities/colors/)\r\n * @returns {Promise}\r\n */\r\n\r\n function _alert(msg, cb, type) {\r\n let config = $__default.default.isObject(msg) ? msg : {};\r\n msg = $__default.default.isString(msg) ? msg : \"\";\r\n type = $__default.default.isString(cb) ? cb : type;\r\n config = $__default.default.extend(true, {}, ew.sweetAlertSettings, {\r\n html: msg,\r\n confirmButtonText: ew.language.phrase(\"OKBtn\"),\r\n customClass: {\r\n htmlContainer: \"ew-swal2-html-container text-\" + (type || \"danger\")\r\n }\r\n }, config);\r\n let args = {\r\n config,\r\n type,\r\n show: true\r\n };\r\n $document$1.trigger(\"alert\", [args]);\r\n if (args.show) return Swal.fire(args.config).then(result => isFunction$1(cb) ? cb(result.isConfirmed) : result);\r\n }\r\n /**\r\n * Prompt/Confirm/Alert\r\n *\r\n * @param {string|Object} cfg - Message or config object\r\n * @param {callback} [cb] - Callback function\r\n * @returns {Promise}\r\n */\r\n\r\n function _prompt(cfg, cb) {\r\n var _config, _config$inputValidato;\r\n\r\n let config = $__default.default.isObject(cfg) ? cfg : {};\r\n config = $__default.default.extend(true, {}, ew.sweetAlertSettings, {\r\n html: $__default.default.isString(cfg) ? cfg : \"\",\r\n showCancelButton: true,\r\n confirmButtonText: ew.language.phrase(\"OKBtn\"),\r\n cancelButtonText: ew.language.phrase(\"CancelBtn\")\r\n }, config); // Confirm/Alert\r\n\r\n if (config.input) // Prompt\r\n (_config$inputValidato = (_config = config).inputValidator) != null ? _config$inputValidato : _config.inputValidator = value => {\r\n if (!value) return ew.language.phrase(\"EnterValue\");\r\n };\r\n return Swal.fire(config).then(result => isFunction$1(cb) ? cb(result.value) : result);\r\n }\r\n\r\n function toast(options) {\r\n options = Object.assign({}, ew.toastOptions, options);\r\n $document$1.Toasts(\"create\", options);\r\n var position = options.position,\r\n $container = $__default.default(\"#toastsContainer\" + position[0].toUpperCase() + position.substring(1));\r\n return $container.children().first();\r\n }\r\n /**\r\n * Show toast\r\n *\r\n * @param {string} message - Message\r\n * @param {string} type - CSS class: \"primary|secondary|success|info|warning|danger|light|dark\"\r\n * @param {string} title - Title\r\n */\r\n\r\n function showToast(message, type, title) {\r\n if (!message) return;\r\n type || (type = \"danger\");\r\n title || (title = ew.language.phrase(type));\r\n let args = {\r\n message,\r\n type,\r\n title,\r\n show: true\r\n };\r\n $document$1.trigger(\"toast\", [args]);\r\n if (!args.show) return;\r\n ({\r\n message,\r\n type,\r\n title\r\n } = args);\r\n return toast({\r\n class: \"ew-toast bg-\" + type,\r\n title,\r\n body: message,\r\n autohide: type == \"success\" ? ew.autoHideSuccessMessage : false,\r\n // Autohide for success message\r\n delay: type == \"success\" ? ew.autoHideSuccessMessageDelay : 500\r\n });\r\n } // Get form.ew-form or div.ew-form HTML element\r\n\r\n function getForm(el) {\r\n if (el instanceof Form) return el.$element[0];\r\n var $el = $__default.default(el),\r\n $f = $el.closest(\".ew-form\");\r\n if (!$f[0]) // Element not inside form\r\n $f = $el.closest(\".ew-grid, .ew-multi-column-grid\").find(\".ew-form\");\r\n return $f[0];\r\n } // Check form data\r\n\r\n function hasFormData(form) {\r\n var selector = \"[name^=x_],[name^=y_],[name^=z_],[name^=w_],[name=\" + ew.TABLE_BASIC_SEARCH + \"]\",\r\n els = $__default.default(form).find(selector).filter(\":enabled\").get();\r\n\r\n for (var i = 0, len = els.length; i < len; i++) {\r\n var el = els[i];\r\n\r\n if (/^(z|w)_/.test(el.name)) {\r\n if (/^IS/.test($__default.default(el).val())) return true;\r\n } else if (el.type == \"checkbox\" || el.type == \"radio\") {\r\n if (el.checked) return true;\r\n } else if (el.type == \"select-one\" || el.type == \"select-multiple\") {\r\n if (!!$__default.default(el).val()) return true;\r\n } else if ([\"text\", \"textarea\", \"password\", \"search\", \"color\", \"date\", \"datetime-local\", \"datetime\", \"email\", \"hidden\", \"month\", \"number\", \"range\", \"tel\", \"time\", \"url\", \"week\"].includes(el.type)) {\r\n if (el.value) return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n /**\r\n * Set search type\r\n *\r\n * @param {HTMLElement} el - HTML element\r\n * @returns false\r\n */\r\n\r\n function setSearchType(el) {\r\n var val = el.dataset.searchType,\r\n phraseId = \"Auto\";\r\n if (val == \"=\") phraseId = \"Exact\";else if (val == \"AND\") phraseId = \"All\";else if (val == \"OR\") phraseId = \"Any\";\r\n el.closest(\".ew-basic-search\").querySelector(\"input.ew-basic-search-type\").value = val || \"\";\r\n el.closest(\".dropdown-menu\").querySelectorAll(\".dropdown-item\").forEach(item => item.classList.remove(\"active\"));\r\n el.closest(\".dropdown-item\").classList.add(\"active\");\r\n var searchType = el.closest(\".input-group\").querySelector(\"#searchtype\"),\r\n text = ew.language.phrase(\"QuickSearch\" + phraseId + \"Short\");\r\n searchType.innerHTML = text;\r\n searchType.classList.toggle(\"me-2\", !!text);\r\n return false;\r\n }\r\n /**\r\n * Update a dynamic selection list\r\n *\r\n * @this {Form|HTMLElement} Form or parent element\r\n * @param {(HTMLElement|HTMLElement[]|string|string[])} obj - Target HTML element(s) or the ID of the element(s)\r\n * @param {(string[]|array[])} parentId - Parent field element names or data\r\n * @param {(boolean|null)} async - async(true) or sync(false) or non-Ajax(null)\r\n * @param {boolean} change - Trigger onchange event\r\n * @returns {Promise}\r\n */\r\n\r\n function updateOptions(obj, parentId, async, change) {\r\n var _obj, _batch$send;\r\n\r\n var f = this.$element ? this.$element[0] : this.form || ((_obj = obj) == null ? void 0 : _obj.form); // Get form/div element from this/obj\r\n\r\n if (!f) return;\r\n var frm = this.htmlForm ? this : forms.get(f.id); // Get Form object\r\n\r\n if (!frm) return;\r\n if (this.form && $__default.default.isUndefined(obj)) // Target unspecified => update child fields\r\n obj = forms.get(this).getList(this).childFields.slice(); // Clone\r\n else if ($__default.default.isString(obj)) obj = getElements(obj, f);\r\n if (!obj || Array.isArray(obj) && obj.length == 0) return;\r\n var self = this,\r\n batch = new Batch();\r\n\r\n if (Array.isArray(obj) && $__default.default.isString(obj[0])) {\r\n // Array of id\r\n var els = [];\r\n\r\n for (var i = 0, len = obj.length; i < len; i++) {\r\n var ar = obj[i].split(\" \");\r\n\r\n if (ar.length == 1 && self.form) {\r\n // Parent/Child fields in the same table\r\n var m = getId(self, false).match(/^([xy]\\d*_)/);\r\n if (m) obj[i] = obj[i].replace(/^([xy]\\d*_)/, m[1]);\r\n }\r\n\r\n var el = getElements(obj[i], f),\r\n names = [];\r\n if (isTextbox(el) || isFilter(el)) // Search text box or filter\r\n continue;\r\n els.push(el);\r\n\r\n if (ar.length == 2 && Array.isArray(el)) {\r\n // Check if id is \"tblVar fldVar\" and multiple inputs\r\n var $el = $__default.default(el);\r\n $el.each(function () {\r\n if (!names.includes(this.name)) {\r\n names.push(this.name);\r\n var $elf = $el.filter(\"[name='\" + this.name + \"']\"),\r\n typ = $elf.attr(\"type\"),\r\n elf = [\"radio\", \"checkbox\"].includes(typ) ? $elf.get() : $elf[0];\r\n batch.add(_updateOptions.bind(self, elf, parentId, async, change));\r\n }\r\n });\r\n } else {\r\n batch.add(_updateOptions.bind(self, el, parentId, async, change));\r\n }\r\n }\r\n\r\n obj = els;\r\n var list = forms.get(self).getList(self);\r\n if (Array.isArray(list == null ? void 0 : list.autoFillTargetFields) && list.autoFillTargetFields[0]) // AutoFill\r\n batch.add(autoFill.bind(null, self));\r\n } else {\r\n if (isTextbox(obj) || isFilter(obj)) // Search text box or filter\r\n return;\r\n batch.add(_updateOptions.bind(self, obj, parentId, async, change));\r\n }\r\n\r\n return (_batch$send = batch.send({\r\n url: ew.getApiUrl(ew.API_LOOKUP_ACTION)\r\n })) == null ? void 0 : _batch$send.then(function () {\r\n $document$1.trigger(\"updatedone\", [{\r\n source: self,\r\n target: obj\r\n }]); // Document \"updatedone\" event fired after all the target elements are updated\r\n });\r\n }\r\n /**\r\n * Update a dynamic selection list\r\n *\r\n * @param {(HTMLElement|HTMLElement[]} obj - Target HTML element(s) or the ID of the element(s)\r\n * @param {(string[]|array[])} parentId - Parent field element names or data\r\n * @param {(boolean|null)} async - async(true) or sync(false) or non-Ajax(null)\r\n * @param {boolean} change - Trigger onchange event\r\n * @returns {Promise}\r\n */\r\n\r\n function _updateOptions(obj, parentId, async, change) {\r\n if (change === void 0) {\r\n change = true;\r\n }\r\n\r\n var id = getId(obj, false);\r\n if (!id) return;\r\n var fo = getForm(obj); // Get form/div element from obj\r\n\r\n if (!fo || !fo.id) return;\r\n var frmo = forms.get(fo.id);\r\n if (!frmo) return;\r\n var self = this,\r\n args = Array.from(arguments),\r\n ar = getOptionValues(obj),\r\n m = id.match(/^([xy])(\\d*)_/),\r\n prefix = m ? m[1] : \"\",\r\n rowindex = m ? m[2] : \"\",\r\n arp = [],\r\n list = frmo.getList(obj),\r\n $obj = $__default.default(obj).data(\"updating\", true);\r\n if ($obj.data(\"hidden\")) // Skip data-hidden field, e.g. detail key\r\n return;\r\n\r\n if ($__default.default.isUndefined(parentId)) {\r\n // Parent IDs not specified, use default\r\n parentId = list.parentFields.slice(); // Clone\r\n\r\n if (rowindex != \"\") {\r\n for (var i = 0, len = parentId.length; i < len; i++) {\r\n var arr = parentId[i].split(\" \");\r\n if (arr.length == 1) // Parent field in the same table, add row index\r\n parentId[i] = parentId[i].replace(/^x_/, \"x\" + rowindex + \"_\");\r\n }\r\n }\r\n }\r\n\r\n if (Array.isArray(parentId) && parentId.length > 0) {\r\n if (Array.isArray(parentId[0])) {\r\n // Array of array => data\r\n arp = parentId;\r\n } else if ($__default.default.isString(parentId[0])) {\r\n // Array of string => Parent IDs\r\n for (var i = 0, len = parentId.length; i < len; i++) arp.push(getOptionValues(parentId[i], fo));\r\n }\r\n }\r\n\r\n if (!isAutoSuggest(obj)) // Do not clear Auto-Suggest\r\n clearOptions(obj);\r\n\r\n var addOpt = function (results) {\r\n var name = getId(obj);\r\n results.forEach(function (result) {\r\n let args = {\r\n \"data\": result,\r\n \"parents\": arp,\r\n \"valid\": true,\r\n \"name\": name,\r\n \"form\": fo\r\n };\r\n $document$1.trigger(\"addoption\", [args]);\r\n if (args.valid) newOption(obj, result, fo);\r\n });\r\n obj.render == null ? void 0 : obj.render(); // Selection list\r\n\r\n selectOption(obj, ar, change);\r\n\r\n if (change) {\r\n if (!obj.options && obj.length) $obj.first().triggerHandler(\"click\"); // else\r\n // $obj.first().trigger(\"change\");\r\n }\r\n };\r\n\r\n if ($__default.default.isUndefined(async)) // Async not specified, use default\r\n async = list.ajax;\r\n\r\n var _updateSibling = function () {\r\n // Update the y_* element\r\n if (/(srch|search|summary|crosstab)$/.test(fo.id) && prefix == \"x\" && !rowindex) {\r\n // Search form\r\n args[0] = id.replace(/^x_/, \"y_\");\r\n updateOptions.apply(self, args); // args[0] is string, use updateOptions()\r\n }\r\n };\r\n\r\n if (!$__default.default.isBoolean(async) || Array.isArray(list.lookupOptions) && list.lookupOptions.length > 0) {\r\n // Non-Ajax or Options loaded\r\n var ds = list.lookupOptions;\r\n addOpt(ds);\r\n\r\n _updateSibling();\r\n\r\n $obj.first().trigger(\"updated\", [{\r\n target: obj\r\n }]); // Object \"updated\" event fired after the object is updated\r\n\r\n return ds;\r\n } else {\r\n // Ajax\r\n var name = getId(obj),\r\n data = Object.assign({\r\n page: list.page,\r\n field: list.field,\r\n ajax: \"updateoption\",\r\n language: ew.LANGUAGE_ID,\r\n name: name // Name of the target element\r\n\r\n }, getUserParams(\"#p_\" + id, fo)); // Add user parameters\r\n\r\n if (isAutoSuggest(obj) && self.htmlForm) // Auto-Suggest (init form or auto-fill)\r\n data[\"v0\"] = ar[0] || random(); // Filter by the current value\r\n else if (obj.options && !obj.list && !isNativeSelectOne(obj) || // Not or native