{"version":3,"names":["ew$1","$$1","luxon","DateTime$1","DateTime","Validators","__proto__","between","el","x","z","id","startsWith","document","getElementById","replace","endsWith","ew","hasValue","val","toUpperCase","language","phrase","captcha","creditCard","value","getValue","checkCreditCard","custom","fn","_len","arguments","length","args","Array","_key","datetime","format","checkDate","email","checkEmail","emails","cnt","err","checkEmails","fileRequired","fieldName","elFn","float","checkNumber","guid","checkGuid","integer","checkInteger","max","maxValue","parseNumber","HTMLElement","maxDate","maxDateTime","dataset","formatPattern","maxFormat","parseDate","Date","fromJSDate","zone","formatDateTime","DATE_FORMAT","TIME_FORMAT","min","minValue","minDate","minDateTime","minFormat","mismatchPassword","elPwd","password","raw","ENCRYPTED_PASSWORD","match","RegExp","escapeRegExChars","INVALID_PASSWORD_CHARACTERS","passwordStrength","$el","isMaskedPassword","hasClass","data","phone","checkPhone","range","checkRange","recaptcha","_grecaptcha","grecaptcha","getResponse","regex","pattern","checkByRegEx","required","_$el$data","$p","closest","substring","css","ssn","checkSsn","time","checkTime","url","checkUrl","userLevelId","parseInt","userLevelName","elId","name","trim","level","sameText","includes","toLowerCase","username","INVALID_USERNAME_CHARACTERS","zip","checkZip","_typeof","o","Symbol","iterator","constructor","prototype","toPropertyKey","t","i","r","e","toPrimitive","call","TypeError","String","Number","_defineProperties","enumerable","configurable","writable","Object","defineProperty","key","_createClass","_setPrototypeOf","setPrototypeOf","bind","_inheritsLoose","create","_defineProperty","batchSettings","type","contentType","processData","dataType","toJSON","JSON","stringify","parse","batchSetup","options","extend","Batch","batch","func","this","undefined","parent","ajaxSetup","_batch","requests","add","_func$name","clear","send","instance","success","parentSuccess","status","xhr","map","request","settings","childSuccess","statusText","_deliver","ajax","_addRequest","push","_responses$error","_responses$error2","responses","error","description","alert","each","response","_request$settings$com","_request$settings$suc","complete","$ajax","FormBase","pageId","self","$self","_initiated","element","$element","htmlForm","initSearchPanel","modified","emptyRow","multiPage","autoSuggests","lists","formKeyCountName","submitWithFetch","enableOnInit","filterList","disableForm","body","style","cursor","form","getForm","elements","filter","prop","addClass","trigger","enableForm","$elements","removeClass","not","appendHidden","$form","$dp","attr","find","ar","serializeArray","forEach","appendTo","canSubmit","async","_await$this$validate","_this$validate","updateTextArea","validate","$dps","dp","j","test","$els","tagName","result","evt","Event","originalEvent","isDefaultPrevented","isObject","submit","_e$originalEvent","formAction","submitter","parseUrl","pathname","setAttribute","getAttribute","method","serialize","fetch","finally","getList","_this$getElement","obj","field","getElement","compileTemplates","values","list","template","isString","templates","getOptionTemplate","_this$element","_this$element2","getElements","fixId","multiple","rowindex","split","prefix","isNumber","updateList","immediate","_Object$entries$find","entries","entry","parents","parentFields","slice","lookupOptions","updateOptions","getOptionValues","updateLists","_form$querySelector","isUndefined","querySelector","selector","_ref","join","_ref2","isArray","deferreds","batchSize","ajaxBatchSize","b","splice","getApiUrl","API_LOOKUP_ACTION","when","then","source","target","fail","console","log","always","createAutoSuggest","assign","limit","AUTO_SUGGEST_MAX_ENTRIES","autoSuggestSettings","AutoSuggest","initEditors","ed","active","save","destroyEditor","destroy","onError","msg","initUpload","index","later","AJAX_DELAY","upload","setupFilters","filters","$sf","toggleClass","$df","$delete","$save","saveFilters","CLIENT_SEARCH_FILTER","localStorage","setItem","PROJECT_NAME","SERVER_SEARCH_FILTER","currentPage","done","_result$","off","on","prompt","input","html","sanitize","prevAll","remove","next","$submenu","insertBefore","currentPageID","action","append","TOKEN_NAME_KEY","TOKEN_NAME","ANTIFORGERY_TOKEN_KEY","ANTIFORGERY_TOKEN","cmd","refresh","setLayout","one","init","hasFormData","text","hide","render","loadjs","ready","setTimeout","is","$tab","$panel","$container","width","CONFIRM_CANCEL","href","window","location","from","matches","forms","beforeSend","before","Field","fldvar","validators","invalid","validator","addValidator","_proto","addError","_this$_error","_error","clearErrors","clearValidators","_element","shouldValidate","updateFeedback","resetInvalid","_this$_element","_this$_element$closes","classList","contains","server","fieldContainerSelector","innerHTML","errorMessage","_this$_element$closes2","feedback","setInvalid","focus","setFocus","canFocus","_el$style","_el$classList","hidden","readonly","disabled","display","get","_checkbox","checked","set","_this$_element2","activeElement","Form","_FormBase","_this","tryFocus","addField","fields","getField","addFields","apply","addCustomError","rowIndex","setFieldElement","delay","makeVisible","focusDelay","preventScroll","autoFocusPreventScroll","_focused","_this$_error2","getFocusable","getFieldElements","autoFocus","detailpage","querySelectorAll","_ew$forms$get","TABLE_BASIC_SEARCH","gotoPageByElement","$pane","validateFields","getCurrentRowIndex","row","_form$querySelector2","_e$currentTarget","validateRequired","updateSelected","addcnt","inlineAdd","currentTarget","keycnt","keyCount","gridinsert","rowcnt","_await$this$customVal","_this$customValidate","customValidate","returnFocus","detailpages","_await$frm$validate","frm","_this$getForm$dataset","getFieldValue","_ew$forms$get2","some","_this$getForm$querySe","FormBuilder","setId","setPageId","setLists","setQueryBuilderLists","autoFillTargetFields","childFields","filterFieldVars","filterFields","addList","setFields","setValidate","setCustomValidate","setValidateRequired","setSubmit","setFormKeyCountName","setEmptyRow","setMultiPage","setSubmitWithFetch","setFilterList","setInitSearchPanel","setEnableOnInit","build","MultiPage","context","AjaxLookup","_this$list$parentFiel","_this$list$parentFiel2","elementId","formElement","m","pf","debounce","recordCount","formatResult","opt","isAutoSuggest","jsRenderHelpers","displayValue","generateRequest","page","LANGUAGE_ID","getUserParams","getOptionValue","getUrl","query","start","params","URLSearchParams","q","n","rnd","random","toString","prepare","transform","results","totalRecordCount","records","toSelect2Data","every","item","hasOwnProperty","Set","gf","group","children","lf","df","df2","df3","df4","_isAutoSuggest","_assertThisInitialized","ReferenceError","_AjaxLookup","$input","minWidth","maxHeight","highlight","hint","minLength","classNames","forceSelection","forceSelect","lineHeight","paddingY","lookupAllDisplayFields","d","setValue","ta","isOpen","menu","empty","$item","getActiveSelectable","typeahead","close","timer","loadingMore","tpl","suggestion","footer","syncResults","asyncResults","cancel","getSyncResults","Infinity","$menu","$node","$dataset","suggestionHeight","outerHeight","suggestions","rendered","count","h","scrollTop","toggle","loadingMoreTimer","_loadingMoreTimer","$footer","_loadingMoreTimer2","offset","top","getMore","v","findIndex","option","selected","SelectionListOption","datasets","_append","Forms","_ew$getForm","_forms","f","ids","keys","lang","Select2Language","errorLoading","inputTooLong","overChars","maximum","inputTooShort","remainingChars","minimum","maximumSelected","noResults","searching","removeAllItems","removeItem","search","Utils$3","select2","amd","require","_defined","Select2ResultsDecorator","decorated","$results","displayMessage","escapeMarkup","hideLoading","$message","message","className","sort","cols","len","$row","last","$option","pagination","more","createElement","c","attrs","role","Element","msMatchesSelector","webkitMatchesSelector","_resultId","title","StoreData","Utils$2","ModalResults","container","_container$listeners$","listeners","pop","$highlighted","getHighlightedResults","GetData","_mousedown","$this","ModalSearch","$search","removeAttr","KEYS","$","PRINT_SCREEN","DropdownSearchDecorator","handleSearch","which","TAB","SHIFT","CTRL","ALT","_keyUpPrevented","term","Select2AttachBody","_AttachBody","_attachPositioningHandler","events","handler","_positionDropdown","_resizeDropdown","_detachPositioningHandler","_showDropdown","$dropdownContainer","$dropdownParent","_popper","Popper","createPopper","placement","IS_RTL","modifiers","enabled","_this$_popper2","update","_this$_popper3","ModalAttachBody","_bindContainerResultHandlers","stopPropagation","position","$dropdown","_containerResultsHandlersBound","$modal","_self$$search$","_updateDropdown","_e$originalEvent2","detach","end","oldValue","modal","event","draggable","FilterAttachBody","_hideDropdown","_this$_popper","outerWidth","_dropdownButton$close","contents","clone","triggerHandler","selection","_handleClear","$filterDropdown","dropdownButton","reference","DropdownAttachBody","_defined$1","AllowClear$1","Utils$1","FilterAllowClear","_AllowClear","_","isDisabled","$clear","$selection","previousVal","placeholder","unselectData","prevented","Select2MultipleSelectionDecorator","Select2DataAdapterDecorator","_data$element","ResultsList","SingleSelection","MultipleSelection","Placeholder","AllowClear","SelectionSearch","EventRelay","Utils","Translation","SelectData","ArrayData","AjaxData","Tags","Tokenizer","MinimumInputLength","MaximumInputLength","MaximumSelectionLength","Dropdown","DropdownSearch","HidePlaceholder","InfiniteScroll","MinimumResultsForSearch","SelectOnClose","CloseOnSelect","DropdownCSS","TagsSearchHighlight","Defaults","defaults","dataAdapter","Decorate","minimumInputLength","maximumInputLength","maximumSelectionLength","tags","tokenSeparators","tokenizer","resultsAdapter","columns","customOption","iconClass","templateResult","selectOptions","_templateResult","loading","selectOnClose","dropdownAdapter","minimumResultsForSearch","closeOnSelect","dropdownCssClass","dropdown","selectionAdapter","allowClear","translations","dir","currentUrl","URL","$document$1","$body","initIcons","_e$target","tooltipOptions","IS_MOBILE","tooltip","_bootstrap$Tooltip$ge","bootstrap","Tooltip","getInstance","initPasswordOptions","_e$target2","pStrength","MIN_PASSWORD_STRENGTH","changeBackground","backgrounds","passwordValidFrom","onPasswordStrengthChanged","strength","percentage","$pst","$pb","pct","valid","setValid","pGenerator","passwordLength","GENERATE_PASSWORD_LENGTH","uppercase","GENERATE_PASSWORD_UPPERCASE","lowercase","GENERATE_PASSWORD_LOWERCASE","numbers","GENERATE_PASSWORD_NUMBER","specialChars","GENERATE_PASSWORD_SPECIALCHARS","onPasswordGenerated","pwd","PATH_BASE","API_URL","qs","route","encodeURIComponent","_pathname","_hash","hash","searchParams","createSearchParams","getSearchParams","setSearchParams","mergeSearchParams","buildUrl","_len2","_key2","has","setSearchParam","deleteSearchParam","_len3","names","_key3","delete","PAGE_LAYOUT","sanitizeUrl","decodeURIComponent","initExportLinks","_e$target3","fileDownload","getchartParams","preventDefault","initMultiSelectCheckboxes","_e$target4","$cbs","_update","getError","_result$error","_result$error2","failureMessage","isHtml","API_EXPORT_ACTION","swal","Swal","fire","sweetAlertSettings","showConfirmButton","allowOutsideClick","allowEscapeKey","willOpen","showLoading","_fetch","ct","headers","_getError","json","blob","createObjectURL","Blob","a","cd","download","appendChild","click","objectUrl","revokeObjectURL","catch","lazyLoad","_e$target5","LAZY_LOAD","img","LAZY_LOAD_DELAY","src","initLightboxes","_e$target6","USE_COLORBOX","lightboxSettings","current","previous","xhrError","imgError","colorbox","rel","initPdfObjects","_e$target7","EMBED_PDF","PDFObjectOptions","PDFObject","embed","fallbackLink","initTooltips","_e$target8","popover","popoverOptions","tippy","content","tippyOptions","parseJson","searchOperatorChange","parm","$fld","$fld2","hasY","$cond","hasCond","$and","opr","$opr2","opr2","isBetween","isEmptyOpr","isEmptyOpr2","hideOpr2","hideX","hideY","initForms","_e$target9","isFunction$2","_alert","cb","config","confirmButtonText","customClass","htmlContainer","show","isConfirmed","_prompt","cfg","_config","showCancelButton","cancelButtonText","inputValidator","toast","toastOptions","Toasts","first","showToast","class","autohide","autoHideSuccessMessage","autoHideSuccessMessageDelay","$f","parentId","change","_obj","_batch$send","els","getId","isTextbox","isFilter","$elf","typ","elf","_updateOptions","autoFill","fo","frmo","arp","$obj","clearOptions","addOpt","newOption","selectOption","_updateSibling","isBoolean","ds","isNativeSelectOne","isModalLookup","MULTIPLE_OPTION_SEPARATOR","jqXHR","textStatus","errorThrown","root","exportCustom","divId","exportType","tblVar","_div$children$","div","customexport","exportEmail","convertToBool","charts","exportCharts","chart","chartEngine","streamType","stream","toBase64Image","fileName","_export","export","exportSelected","emailForm","keySelected","postParams","_document$querySelect","$iframe","isHiddenTextArea","_el$dataset","modalLookup","_el$dataset2","isSelect2","isBooleanCheckbox","isHidden","reset","once","MOBILE_DETECT","version","scrollIntoView","selectAll","clearSelected","tbl","rowIndexes","rows","clearDelete","$tr","siblings","addBack","clickDelete","setupTable","force","HTMLTableElement","$tbl","$rows","isset","tBodies","$target","cells","parentsUntil","RESPONSIVE_TABLE_CLASS","cell","rowSpan","clientHeight","offsetHeight","attach","$r","setupGrid","grid","$grid","$cells","htmlDecode","$root","selectors","getFieldSelector","table","s1","s2","flatMap","tag","sel","eq","getAncestorBy","node","parentNode","_node","nodeType","o1","o2","headerCase","str","charAt","samePath","p1","p2","ar1","ar2","LIST_ACTION","VIEW_ACTION","EDIT_ACTION","isValue","getOptionTexts","lo","hasAttribute","removeAll","valueSeparator","sep","reduce","addOption","_obj$querySelector","optGroup","g","label","_obj$dataset","_forms$get$getList","_obj$options$","selectedIndex","opts","autoselect","_init$headers","Headers","API_JWT_TOKEN","API_JWT_AUTHORIZATION_HEADER","FormData","executeScript","replaceAll","matchAll","createRange","createContextualFragment","s","addScript","stripScript","scr","HTMLScriptElement","removeScript","getContent","keepScripts","_m$","$content","getOptions","modalDialogHide","$dlg","removeData","showing","reload","dest_array","destEl","v0","pid","p","post","$tt","trig","Popover","wd","_getTipElement","initSearchFilters","_e$target11","btn","IS_LOGGEDIN","IS_SYS_ADMIN","CURRENT_USER_NAME","_frm$filterList$filte","_frm$filterList","formId","getItem","_ref3","_ref4","copyToClipboard","_source","_source2","innerText","left","select","execCommand","removeChild","object_value","showMessage","arg","_arg$target","doc","$div","$alert","$heading","w","$toast","Math","floor","Pace","_forms$get","jqxhr","isApi","allowed","hostname","setRequestHeader","lastPageSubmit","Interval","dt","fromSQL","fromSeconds","toFormat","locale","numberingSystem","getNumberingSystem","parseDateTime","fromFormat","redirect","_ew$vars","newUrl","vars","login","protocol","host","isMediumScreen","matchMedia","screenMediaQuery","promise","dashboard","$overlay","overlayTemplate","Response","validation","CardRefresh","warningMessage","successMessage","$html","unshift","history","pushState","$old","$new","$tmpl","$searchType","TABLE_BASIC_SEARCH_TYPE","replaceWith","initPage","_bootstrap$Tooltip$ge7","_fixLayoutHeightTimer","functions","Select2Defaults","Select2Utils","addEventHandlers","fldVar","addGridRow","_bootstrap$Tooltip$ge2","$tpl","$lastrow","suffix","$keycnt","FORM_KEY_COUNT_NAME","FORM_ROW_ACTION_NAME","attributes","$btn","dispose","after","scrollHeight","addOptionDialogShow","_args$evt2","lnk","addOptionDialog","_submitSuccess","_results","objName","API_OBJECT_NAME","re","linkField","dfs","displayFields","ffs","pfs","lfv","ff","txt","obj2","_results2","_results3","_fail","_submit","API_ADD_ACTION","nodeName","callback","_convert","API_LIST_ACTION","API_VIEW_ACTION","API_DELETE_ACTION","responseJSON","applyTemplate","tmplId","classId","isModal","_parent$querySelector","subtmpl","rowspan","childNodes","cloneNode","views","textContent","hasTag","jsRenderAttributes","scripts","tmpl","creditcard_string","tempdigit","doubledigit","checkdigit","isValid","email_cnt","arEmails","DECIMAL_SEPARATOR","min_value","max_value","clearError","jquery","confirmDelete","modalDialogShow","createFilter","selectId","lookup","processResults","_data$records$length3","_data$records3","transport","failure","$select","_$$data$$dropdown$fin3","createModalLookup","_data$records$length2","_data$records2","_$$data$$dropdown$fin2","createSelect","_data$records$length","_data$records","_$$data$$dropdown$fin","deleteGridRow","infix","_bootstrap$Tooltip$ge3","rowidx","_delete","$keyact","disable2FA","preConfirm","API_2FA_ACTION","API_2FA_RESET","_result$error8","_result$error9","emailDialogShow","emailDialog","_e$target$querySelect","_$$closest$find$data","MAX_EMAIL_RECIPIENT","hdr","enable2FA","TWO_FACTOR_AUTHENTICATION_TYPE","API_2FA_SHOW","_result$error4","imageUrl","showLoaderOnConfirm","isLoading","getConfirmButton","disableInput","getImage","onload","enableInput","getInput","API_2FA_VERIFY","Error","showValidationMessage","_result$error3","_result$error7","inputValue","account","API_2FA_SEND_OTP","_result$error5","_result$error6","fixLayoutHeight","layout","formatCurrency","CURRENCY_FORMAT","formats","getLocaleFromPlatform","NUMBERING_SYSTEM","numeralSystem","delimiters","thousands","GROUPING_SEPARATOR","decimal","currency","CURRENCY_SYMBOL","formatNumber","NUMBER_FORMAT","formatPercent","PERCENT_FORMAT","formatTimeSpan","allDay","to","equals","startOf","minus","interval","days","isInteger","Intl","NumberFormat","resolvedOptions","getQueryBuilderFilterInput","rule","_document$getElementB","_span$innerHTML$repla","span","queryBuilderErrorClass","$0","$1","$2","getQueryBuilderFilterValidation","$value","errors","operator","nb_inputs","$invalid","getQueryBuilderValueSetter","getSearchParam","htmlEncode","importDialogShow","_args$evt6","_bootstrap$Tooltip$ge5","importDialog","sse","$dropzone","$bd","$data","$progress","classname","$msg","hideMessage","showProgress","pc","updateProgress","tcnt","totalCount","scnt","successCount","fcnt","failCount","filename","file","addRow","_index","_success","initialized","Tabulator","autoColumns","autoColumnsDefinitions","definitions","column","headerSort","resizable","visible","headerSortTristate","formatter","textOverflow","getRow","getData","importTabulatorOptions","importComplete","_sse","fileResults","files","fileResult","rollbacked","IMPORT_MAX_FAILURES","saveImport","importFail","_sse2","_table2","clearData","API_ACTION_NAME","API_IMPORT_ACTION","API_FILE_TOKEN_NAME","EventSource","addEventListener","importUploadOptions","acceptFileTypes","IMPORT_FILE_ALLOWED_EXTENSIONS","fileupload","API_UPLOAD_ACTION","autoUpload","singleFileUploads","dropZone","messages","maxFileSize","maxNumberOfFiles","minFileSize","SESSION_ID","_data$result","importfiles","filetoken","_table","importFiles","processfail","progressall","loaded","total","uploadProgress","_this$querySelector","_table3","_table4","removeAttribute","_e$target12","$tables","initPanels","renderJsTemplates","_localStorage$getItem","inputs","$rpt","mh","toggleGroup","USE_JAVASCRIPT_MESSAGE","inlineAction","_args$evt","$detached","ewAction","$record","curindex","_always","_deleted","_disableInlineButtons","_enableInlineButtons","_getTable","_updateRowIndexes","inline","rowtype","Promise","resolve","prepend","$main","ROWTYPE_VIEW","ROWTYPE_ADD","returnUrl","_$grid$data","isFunction","isMobile","_args$evt3","_bootstrap$Tooltip$ge4","_args$evt4","_args$evt5","_$dlg$data","_$dlg$data2","modalDialog","size","_caption","$lnk","caption","_hide","handleResult","_lnk$closest","_lnk$closest2","_tabPane$parentNode","btnId","tabPane","navItem","_current","view","_createButtons","_button","_return","_resp$headers$get","resp","isJson","hasErrors","lnkData","$dlglnk","stopImmediatePropagation","Modal","_focustrap","__handleFocusin","_handleFocusin","_e$target10","Accept","parseTime","removeSpaces","sameString","selectAllKeys","selectKey","chk","sendOTP","_result$error11","_result$error12","setActiveUser","setLanguage","setSearchType","searchType","phraseId","setSessionTimer","timeoutTime","keepAliveTimer","counter","keepAlive","API_SESSION_ACTION","token","setTimer","resetTimer","_timer","SESSION_TIMEOUT_COUNTDOWN","SESSION_TIMEOUT","doTimeout","TIMEOUT_URL","timeout","_keepAliveTimer","timerInterval","timerProgressBar","setInterval","getHtmlContainer","sec","timeleft","round","getTimerLeft","willClose","clearInterval","dismiss","DismissReason","_ew$vars$login","SESSION_KEEP_ALIVE_INTERVAL","IS_AUTOLOGIN","keepAliveInterval","MIN_SESSION_KEEP_ALIVE_INTERVAL","showBackupCodes","showDenyButton","showLoaderOnDeny","denyButtonText","denyButton","disableButtons","API_2FA_BACKUP_CODES","codes","enableButtons","preDeny","getDenyButton","API_2FA_NEW_BACKUP_CODES","showDrillDown","ctrlKey","spinnerTemplate","draggableOptions","boundary","cache","$tip","responseText","_result$error13","_result$error14","setContent","sortUrl","sortType","shiftKey","ctrl","submitAction","_window$msg","isPostBack","isMultiple","isDismissed","toggleChat","API_CHAT_ACTION","_result$error10","idx","toggleLayout","_bootstrap$Tooltip$ge6","togglePassword","$i","toggleSearchOperator","updateChart","$debug","updateDropdownPosition","prev","nid","$ft","$fn","$fa","$label","_confirmDelete","confirm","uploadUrl","API_JQUERY_UPLOAD_ACTION","_downloadTemplate","_uploadTemplate","formData","session","deepAssign","multipart","loadImageFileTypes","loadVideoFileTypes","loadAudioFileTypes","filesContainer","uploadTemplateId","downloadTemplateId","uploadTemplate","downloadTemplate","previewMaxWidth","UPLOAD_THUMBNAIL_WIDTH","previewMaxHeight","UPLOAD_THUMBNAIL_HEIGHT","uploadOptions","MULTIPLE_UPLOAD_SEPARATOR","fid","indexOf","_data$files","l","_data$files2","_data$result2","_data$files3","valueChanged","fobj","fld","bool","oldEl","fnEl","fullCalendar$1","fullCalendar","calendar","updateTable","eventFields","addUrl","viewUrl","editUrl","deleteUrl","copyUrl","fullCalendarOptions","eventPopoverOptions","processJson","convertValue","_calendar$getEventByI","getEventById","addEvent","curEvent","groupId","setStart","setEnd","setAllDay","setExtendedProp","setProp","processEvent","info","relatedEvents","apiAction","API_EDIT_ACTION","processRequest","revert","reject","toPlainObject","collapseExtendedProps","toISOString","apiUrl","getFldParm","currentTable","urlAddId","addEventDialogShow","startStr","endStr","startFld","endFld","viewEventDialogShow","customButtons","headerToolbar","bsDropdown","getOrCreatePopover","Default","getOrCreateInstance","seq","shift","_Array$from$find$repl","_Array$from$find","popoverClass","_templateFactory","generateGetBoundingClientRect","y","rect","getBoundingClientRect","jsEvent","offsetX","offsetY","height","right","bottom","virtualElement","useContextMenu","bsToggle","clearMenus","_menu","eventId","editEventDialogShow","deleteEvent","drop","draggedEl","eventReceive","eventDragStart","_bootstrap$Popover$ge","eventDrop","eventResize","eventClick","button","extendedProps","_bootstrap$Popover$ge2","open","usePopover","_getOrCreatePopover","showViewPageOnEventClick","eventMouseEnter","_bsDropdown","_getOrCreatePopover2","_isShown","popoverViews","eventMouseLeave","_bsDropdown2","_bootstrap$Popover$ge3","FullCalendar","Calendar","isPushNotificationSupported","navigator","urlBase64ToUint8Array","base64String","base64","repeat","rawData","atob","outputArray","Uint8Array","charCodeAt","sendSubscriptionToServer","subscription","getKey","contentEncoding","PushManager","supportedContentEncodings","endpoint","btoa","fromCharCode","createSubscription","API_PUSH_NOTIFICATION_ACTION","API_PUSH_NOTIFICATION_SUBSCRIBE","serviceWorkerReg","serviceWorker","pushManager","subscribe","userVisibleOnly","applicationServerKey","PUSH_SERVER_PUBLIC_KEY","getSubscription","setSubscription","inst","subscribeNotification","Notification","permission","_await$getSubscriptio","requestPermission","_document$getElementB2","checkSubscription","unsubscribeNotification","res","unsubscribe","API_PUSH_NOTIFICATION_DELETE","register","SERVICE_WORKER","scope","webpush","pushNotificationDialogShow","pushDialog","successes","acc","cur","failures","inited","latlng","useSingleMap","showAllMarkers","useMarkerClusterer","ext","maps","singleMapHeight","singleMapWidth","showMapOnTop","createMap","createBounds","createMarkerClusterer","marker","createMarker","fitBounds","promises","address","geocodingDelay","geocode","latitude","longitude","coordinate","parseFloat","isNaN","createLatLng","all","MobileDetect","userAgent","mobile","formid","formID","pageIndex","maxPageIndex","minPageIndex","pageIndexes","$pages","$collapses","isTab","isCollapse","hideDisabledButton","hideInactivePages","lockTabs","hideTabs","showPagerTop","showPagerBottom","pagerTemplate","_show","_properties","pageShow","gotoPage","$page","gotoPageByIndex","gotoPageByElementId","togglePage","$tabs","google","setCenter","$bodies","$document","_$$offset","debugMode","DEBUG","animate","panel","Collapse","actions","_this$form","pageSize","zIndex","blueimp","processQueue","fileTypes","cropperOptions","cropperCanvasOptions","widget","processActions","cropImage","dfd","Deferred","that","cropperDialog","Cropper","getCroppedCanvas","toBlob","File","resolveWith","rejectWith","isFinite","isDate","periodic","clearTimeout","rec","_this$data$substring","_this$data","_this$data2","_this$data$substring2","_this$data3","_this$data4","toNumber","toDate","_ew$vars$tables","tables","clientFormatPattern","toJsDate","toJSDate","mutationList","mutation","MutationObserver","observe","_parent","attributeFilter","attributeOldValue","subtree","$chatWrapper","$chatCheck","$chatBtn","$chatClose","$chatComment","$chatCard","$chatHeader","$chatCollapse","$chatBody","$chatIframe","_Pace","running","iframe","queue","dequeue","contentDocument","isNil$1","isFunction$1","isNaNNumber$1","isFiniteNumber$1","multiplyByPowerOfTen$1","number","powerOfTenExponent","NaN","numAsString","indexOfE","log10$1","numberThatIsPowerOfTen","LOG10E","toObject$1","arr","entriesResolver","object","escapeRegexString$1","string","memoize$1","cacheKey","powerOf10LookupObject","currentValue","additionalZeros","isPowerOfTen$1","toBase","valueUnit","unitScale","base","scale","toBaseMultiplier","convertUnit","originUnit","targetUnit","valueAsBase","resolvedScale","conversionFactorFromBase","unitScaleDefinition","unit","convert","toBest","exclude","cutOffNumber","best","scaleUnit","absoluteResult","abs","scaleDefinition","stringRepeat$1","createUnitScaleFromLocaleAbbreviations$1","scaleItem","scaleItemIndex","formattedStringToNumber$1","inputString","_a","stringOriginal","stringWithLatinDigits","numericStringWithExtraInfo","numeralSystemMap","numericStringLength","numeralSystemToLatinSystemMap","digit","digitIndex","output","numericStringIndex","char","replaceNumeralSystemWithLatinNumbers","zeroFormat","nullFormat","decimalDelimiterFromLocale","stringWithDotDecimalDelimiter","abbreviationScalingFactor","abbreviations","abbreviationsSortedByLengthDesc","abbreviation","scapedAbbreviationForRegex","regexp","getScalingFactorFromAbbreviations","negativeFactor","numberAsString","locale$1","code","ordinal","merge","newObject","argsLength","isObject$1","isString$1","truncateNumber$1","ceil","getPatternParts","patternMask","isInEscapedPart","currentEscapedWord","parts","escaped","patternIncludes","patternRemoveEscapedText","patternReplace","searchValue","replaceValue","stringIncludes$1","signRule$1","patternWithoutEscapedText","negativeParentheses","forceSign","outputPatternMask","abbreviationRule$1","compactUnit","compact","abbreviationRegExpResult","compactAuto","splitStringInTwoParts$1","separator","indexOfSearchChar","countChars","stringChar","decimalPlacesRule$1","patternPrecisionPart","minimumFractionDigits","maximumFractionDigits","trimmedPatternPrecisionPart","patternPrecisionPartWithoutClosingBracket","precisionSplitted","fractionDigits","optionalDecimalPlacesRule$1","optionalFractionDigits","parsePattern$1","inputPattern","resolvedInputPattern","patternMaskAfterSignRule","signRules","patternMaskAfterAbbreviationRule","abbreviationRules","patternMaskAfterOptionalDecimalPlacesRule","optionalDecimalPlacesRules","outputPatternMaskWithoutEscapedText","decimalPlacesRules","minimumIntegerDigits","patternMaskIntegerPart","minimumIntegerDigitsRule","grouping","patternMaskAfterHandlingNumberPosition","numberPositionRule","patternMaskWithEnsuredSignPosition","addSignPositionIfItDoesNotExists","removeSignIfExists$1","valueAsString","rescaleRoundedValue$1","currentAbbreviationScale","patternRules","newScaledValue","newScaledValueUnit","scaleValueWithAbbreviation$1","forcedAbbreviationUnit","abbreviationsFromLocale","targetPowerOfTenExponent","k","scaleDefinitionFromLocale","closestPowerOfTenWithAvailableAbbreviation","distanceFromTarget","resolveForcedAbbreviationUnit","scaledValue","localizedUnit","roundNumber$1","precision","roundingFunction","resolvedPrecision","roundedScaledValue","numberToNonExponentialString$1","significand","exponent","exponentAsNumber","integerPartOfSignificand","fractionalPartOfSignificand","numberOfZerosToAdd","formatPositiveExponentResult","significandAsString","negativeExponentAbsoluteValue","outputIntegerPartOfSignificand","outputFractionalPartOfSignificand","firstCharInIntegerPart","formatNegativeExponentResult","numberToFixed$1","finiteNumber","fractionalPartOfValueAsString","targetFractionDigitsAmount","roundedValue","integerPart","fractionalPart","addTrailingZerosInFractionalPart","roundValueAndAddTrailingZeros$1","rounding","resolvedRoundingFunction","replaceDigitsWithNumeralSystem$1","numericString","addOrRemoveLeadingZerosToValue$1","valueIntegerPartWithoutSign","addSignInfoToFullFormattedNumber$1","fullFormattedValueWithoutSign","isValueNegative","isValueZero","splitNumberIntegerAndDecimalParts$1","decimalPart","addThousandsSeparatorToValueIntegerPart$1","valueIntegerPartWithLeadingZerosAndWithoutSign","digitGroupingStyle","thousandsSeparator","restDigitGrouping","groupingSubIteration","applyAbbreviationLocalizedUnitToPatternMask$1","abbreviationLocalizedUnit","hasAbbreviationInPatternMask","numberToFormattedNumber$1","resolvedValue","localizedAbbreviationUnit","scaledValueLocalizedUnit","rescaledValue","rescaledValueLocalizedUnit","scaleAndRoundValue","signedZero","valueAsStringWithoutSign","valueIntegerPartWithLeadingZeros","valueIntegerPartWithThousandsSeparator","numeralSystemFromLocale","integerPartWithNumeralSystem","decimalPartWithNumeralSystem","fullNumberWithNumeralSystem","patternMaskWithNumber","cleanPatternMask","bpsFormatter$1","regexps","unformat","patternWithEscapedBPS","timeFormatter$1","absoluteValue","sign","hours","minutes","seconds","isNegative","timeArray","reverse","decimalSuffixes","binarySuffixes","unformatRegex","concat","bytesDecimalScale","unitIndex","pow","bytesBinaryScale","currencySymbolsMap","EUR","USD","XCD","AUD","INR","BRL","CAD","XAF","CNY","NZD","XPF","GBP","HKD","ILS","JPY","KRW","XOF","MXN","TWD","VND","BUILT_IN_FORMATTERS$1","hasNotScalePercentageSymbolInPattern","scalePercentage","patternWithEscapedPercentage","currencyFromOptions","localizedCurrencySymbol","patternWithEscapedCurrencySymbol","_b","localizedOrdinal","patternWithEscapedOrdinal","scaledValueUnit","patternWithEscapedBytes","exponential","toExponential","patternWithoutExponential","roundHalfAwayFromZero$1","resolveFormatOptions$1","formatOptions","_c","roundingOption","resolveRoundingOption","resolvedLocale","optionsLocale","defaultLocale","resolveOptionsLocale","resolvedFormatters","optionsFormatters","formatters","defaultPattern","nanFormat","nonBreakingSpace","parse$1$1","inputStringWithNormalSpaces","unformatFunctionFromFormatters","matcher","getUnformatFunctionIfMatch","parse$1","round$1","format$1$1","resolvedPattern","resolvedValueAsNumber","formatFunctionFromFormatters","getFormatFunctionIfMatch","_errorFormat","arg2","arg3","withOptions","baseOptions","optionsFromArguments","unique$1","rtlCharsRanges","rtlDirCheck","appendLeftToRightMarkIfIsRTL","isRTL","languagesWith4DigitsGroupingStyle","getAbbreviations","languageTag","digits","intlFormatOptions","notation","useGrouping","compactDisplay","digitOfZero","digitOfOne","digitOfTwo","abbreviationResultForOne","toLocaleString","abbreviationResultForTwo","abbreviationOne","abbreviationTwo","resultIndex","_err","getLocaleFromPlatform$1$1","resolvedLanguageTag","localizedNumber","lookupObject","repeatedChar","digitsAsArray","getNumeralSystemDigits","resolvedDigits","localizedNumberWithoutDigits","groupingDelimiter","fractionDelimiter","getGroupingAndFractionDelimiters","groupingStyle","subIterationIndex","digitOrGroupingDelimiter","getGroupingStyle","shortAbbreviations","_abbreviationsLong","numerable","jQuery"],"sources":["dist/js/ew.js"],"sourcesContent":["/*!\n * JavaScript for PHPMaker v24.16.0\n * Copyright (c) e.World Technology Limited. All rights reserved.\n */\n(function (ew$1, $$1, luxon) {\n 'use strict';\n\n function MultiPage(formid) {\r\n var self = this;\r\n this.$form = null;\r\n this.formID = formid;\r\n this.pageIndex = 1;\r\n this.maxPageIndex = 0;\r\n this.minPageIndex = 0;\r\n this.pageIndexes = [];\r\n this.$pages = null;\r\n this.$collapses = null;\r\n this.isTab = false; // Is tabs\r\n this.isCollapse = false; // Is collapses (accordion)\r\n this.lastPageSubmit = false; // Enable submit button for the last page only\r\n this.hideDisabledButton = false; // Hide disabled submit button\r\n this.hideInactivePages = false; // Hide inactive pages\r\n this.lockTabs = false; // Set inactive tabs as disabled\r\n this.hideTabs = false; // Hide all tabs\r\n this.showPagerTop = false; // Show pager at top\r\n this.showPagerBottom = false; // Show pager at bottom\r\n this.pagerTemplate = ' {Prev}{Next} '; // Pager template\r\n\r\n // \"show\" handler (for disabled tabs)\r\n var _show = function (e) {\r\n e.preventDefault();\r\n };\r\n\r\n // Set properties\r\n var _properties = [\"lastPageSubmit\", \"hideDisabledButton\", \"hideInactivePages\", \"lockTabs\", \"hideTabs\", \"showPagerTop\", \"showPagerBottom\", \"pagerTemplate\"];\r\n this.set = function () {\r\n if (arguments.length == 1 && $$1.isObject(arguments[0])) {\r\n var obj = arguments[0];\r\n for (var i in obj) {\r\n var p = i[0].toLowerCase() + i.substring(1); // Camel case\r\n if (_properties.includes(p)) this[p] = obj[i];\r\n }\r\n }\r\n };\r\n\r\n // DOM loaded\r\n this.init = function () {\r\n var tpl = this.pagerTemplate.replace(/\\{prev\\}/i, ew.language.phrase(\"Prev\")).replace(/\\{next\\}/i, ew.language.phrase(\"Next\"));\r\n if (this.isTab) {\r\n if (this.showPagerTop) this.$pages.closest(\".ew-nav\").before(tpl);\r\n if (this.showPagerBottom) this.$pages.closest(\".ew-nav\").after(tpl);\r\n this.$form.find(\".ew-prev\").click(function (e) {\r\n self.$pages.off(\"show.bs.tab\", _show).filter(\".active\").parent().prev(\":has([data-bs-toggle=tab]:not(.ew-hidden):not(.ew-disabled))\").find(\"[data-bs-toggle=tab]\").toggleClass(\"disabled d-none\", false).click();\r\n return false;\r\n });\r\n this.$form.find(\".ew-next\").click(function (e) {\r\n self.$pages.off(\"show.bs.tab\", _show).filter(\".active\").parent().next(\":has([data-bs-toggle=tab]:not(.ew-hidden):not(.ew-disabled))\").find(\"[data-bs-toggle=tab]\").toggleClass(\"disabled d-none\", false).click();\r\n return false;\r\n });\r\n if (this.hideTabs) this.$form.find(\".ew-multi-page > .ew-nav > .nav\").hide();\r\n } else if (this.isCollapse) {\r\n if (this.showPagerTop) this.$collapses.closest(\".ew-accordion\").before(tpl);\r\n if (this.showPagerBottom) this.$collapses.closest(\".ew-accordion\").after(tpl);\r\n this.$form.find(\".ew-prev\").click(function (e) {\r\n self.$pages.closest(\".accordion-item\").filter(\":has(.collapse.show)\").prev(\":has([data-bs-toggle=collapse]:not(.ew-hidden):not(.ew-disabled))\").toggleClass(\"disabled d-none\", false).find(\"[data-bs-toggle=collapse]\").click();\r\n return false;\r\n });\r\n this.$form.find(\".ew-next\").click(function (e) {\r\n self.$pages.closest(\".accordion-item\").filter(\":has(.collapse.show)\").next(\":has([data-bs-toggle=collapse]:not(.ew-hidden):not(.ew-disabled))\").toggleClass(\"disabled d-none\", false).find(\"[data-bs-toggle=collapse]\").click();\r\n return false;\r\n });\r\n }\r\n this.pageShow();\r\n };\r\n\r\n // Page show\r\n this.pageShow = function () {\r\n if (this.isTab) {\r\n if (this.lockTabs) this.$pages.on(\"show.bs.tab\", _show);\r\n this.$pages.each(function () {\r\n var $this = $$1(this);\r\n if (self.hideInactivePages) $this.toggleClass(\"d-none\", !$this.hasClass(\"active\"));\r\n if (self.lockTabs) $this.toggleClass(\"disabled\", !$this.hasClass(\"active\"));\r\n });\r\n } else if (this.isCollapse) {\r\n this.$pages.closest(\".accordion-item\").each(function () {\r\n var $this = $$1(this);\r\n if (self.hideInactivePages) $this.toggleClass(\"d-none\", !$this.find(\".collapse.show\")[0]);\r\n });\r\n }\r\n var disabled = this.lastPageSubmit && this.pageIndex != this.maxPageIndex;\r\n var $btn = this.$form.closest(\".content, .modal-content\").find(\"#btn-action, button.ew-submit\").prop(\"disabled\", disabled).toggle(!this.hideDisabledButton || !disabled);\r\n $$1(\".ew-captcha\").toggle($btn.is(\":visible:not(:disabled)\")); // Re-captcha uses class \"disabled\", not \"disabled\" property.\r\n disabled = this.pageIndex <= this.minPageIndex;\r\n this.$form.find(\".ew-prev\").toggleClass(\"disabled\", disabled);\r\n disabled = this.pageIndex >= this.maxPageIndex;\r\n this.$form.find(\".ew-next\").toggleClass(\"disabled\", disabled);\r\n };\r\n\r\n // Go to page by index\r\n this.gotoPage = function (i) {\r\n if (i <= 0 || i < this.minPageIndex || i > this.maxPageIndex) return;\r\n if (this.pageIndex != i) {\r\n var $page = this.$pages.eq(i - 1);\r\n if (this.isTab) {\r\n if ($page.is(\":not(.d-none):not(.disabled)\")) $page.click();else $page.parent().next(\":has([data-bs-toggle=tab]):not(.d-none):not(.disabled)\").find(\"[data-bs-toggle=tab]\").toggleClass(\"disabled\", false).click();\r\n } else if (this.isCollapse) {\r\n var $p = $page.closest(\".accordion-item\");\r\n if ($p.is(\":not(.d-none)\")) $page.click();else $p.next(\":has([data-bs-toggle=collapse]):not(.d-none)\").find(\"[data-bs-toggle=collapse]\").click();\r\n }\r\n this.pageIndex = i;\r\n }\r\n };\r\n this.gotoPageByIndex = this.gotoPage;\r\n\r\n // Go to page by element\r\n this.gotoPageByElement = function (el) {\r\n this.gotoPage(parseInt($$1(el).data(\"page\"), 10) || -1);\r\n };\r\n\r\n // Go to page by element's id or name or data-field attribute\r\n this.gotoPageByElementId = function (id) {\r\n var $el = this.$form.find(\"[data-page]\").filter(\"[id='\" + id + \"'],[name='\" + id + \"'],[data-field='\" + id + \"']\");\r\n this.gotoPageByElement($el);\r\n };\r\n\r\n // Toggle page\r\n this.togglePage = function (i, show) {\r\n if (this.isTab) {\r\n this.$pages.eq(i - 1).toggleClass(\"d-none\", !show);\r\n } else if (this.isCollapse) {\r\n this.$pages.eq(i - 1).closest(\".accordion-item\").toggle(\"d-none\", !show);\r\n }\r\n };\r\n\r\n // Render\r\n this.render = function () {\r\n this.$form = $$1(\"#\" + formid);\r\n this.pageIndexes = this.$form.find(\"[data-page]\").map(function () {\r\n var index = parseInt(this.dataset.page, 10);\r\n return index > 0 ? index : null;\r\n }).get();\r\n this.pageIndexes.sort(function (a, b) {\r\n return a - b;\r\n });\r\n this.minPageIndex = this.pageIndexes[0];\r\n this.maxPageIndex = this.pageIndexes[this.pageIndexes.length - 1];\r\n var $tabs = this.$form.find(\"[data-bs-toggle=tab]\");\r\n if ($tabs[0]) {\r\n this.$pages = $tabs;\r\n this.isTab = true;\r\n $tabs.on(\"shown.bs.tab\", function (e) {\r\n self.pageIndex = $tabs.index(e.target) + 1;\r\n self.pageShow();\r\n $$1($$1(this).attr(\"href\")).find(\".ew-map\").each(function () {\r\n var m = ew.maps[this.id];\r\n if (m != null && m[\"map\"]) {\r\n google.maps.event.trigger(m[\"map\"], \"resize\");\r\n m[\"map\"].setCenter(m[\"latlng\"]);\r\n }\r\n });\r\n });\r\n this.pageIndex = $tabs.index($tabs.parent(\".active\")) + 1;\r\n } else {\r\n this.$collapses = this.$form.find(\"[data-bs-toggle=collapse]\");\r\n if (this.$collapses[0]) {\r\n this.$pages = this.$collapses;\r\n this.isCollapse = true;\r\n var $bodies = this.$collapses;\r\n $bodies.on(\"shown.bs.collapse\", function (e) {\r\n self.pageIndex = $bodies.index(e.target) + 1;\r\n self.pageShow();\r\n $$1(this).find(\".ew-map\").each(function () {\r\n var m = ew.maps[this.id];\r\n if (m != null && m[\"map\"]) {\r\n google.maps.event.trigger(m[\"map\"], \"resize\");\r\n m[\"map\"].setCenter(m[\"latlng\"]);\r\n }\r\n });\r\n });\r\n this.pageIndex = $bodies.index($bodies.hasClass(\"show\")) + 1;\r\n }\r\n }\r\n $$1(function () {\r\n self.init();\r\n });\r\n };\r\n }\n\n let DateTime$1 = luxon.DateTime;\r\n\r\n /**\r\n * User level ID validator\r\n */\r\n function userLevelId(el) {\r\n if (el && !ew.checkInteger(el.value)) return {\r\n userLevelId: ew.language.phrase(\"UserLevelIDInteger\")\r\n };\r\n let level = parseInt(el.value, 10);\r\n if (level < 1) return {\r\n userLevelId: ew.language.phrase(\"UserLevelIDIncorrect\")\r\n };\r\n return false;\r\n }\r\n\r\n /**\r\n * User level name validator\r\n * @param {string} id User ID Field input element ID\r\n */\r\n function userLevelName(id) {\r\n return function (el) {\r\n let elId = document.getElementById(\"x_\" + id);\r\n if (elId && el) {\r\n let name = el.value.trim(),\r\n level = parseInt(elId.value.trim(), 10);\r\n if (level === 0 && !ew.sameText(name, \"Default\")) {\r\n return {\r\n userLevelName: ew.language.phrase(\"UserLevelDefaultName\")\r\n };\r\n } else if (level === -1 && !ew.sameText(name, \"Administrator\")) {\r\n return {\r\n userLevelName: ew.language.phrase(\"UserLevelAdministratorName\")\r\n };\r\n } else if (level === -2 && !ew.sameText(name, \"Anonymous\")) {\r\n return {\r\n userLevelName: ew.language.phrase(\"UserLevelAnonymousName\")\r\n };\r\n } else if (level > 0 && [\"anonymous\", \"administrator\", \"default\"].includes(name.toLowerCase())) {\r\n return {\r\n userLevelName: ew.language.phrase(\"UserLevelNameIncorrect\")\r\n };\r\n }\r\n }\r\n return false;\r\n };\r\n }\r\n\r\n /**\r\n * Required validator\r\n */\r\n function required(fieldName) {\r\n return function (el) {\r\n var _$el$data;\r\n let $el = $$1(el),\r\n $p = $el.closest(\"#r_\" + ((_$el$data = $el.data(\"field\")) == null ? void 0 : _$el$data.substring(2))); // Find the row\r\n if (!$p[0]) $p = $el.closest(\"[id^=el]\"); // Find the span\r\n if ($p.css(\"display\") == \"none\") {\r\n // Hidden by .visible()\r\n return false;\r\n }\r\n if (el && !ew.hasValue(el)) {\r\n return {\r\n required: ew.language.phrase(\"EnterRequiredField\").replace(\"%s\", fieldName)\r\n };\r\n }\r\n return false;\r\n };\r\n }\r\n\r\n /**\r\n * File required validator\r\n */\r\n function fileRequired(fieldName) {\r\n return function (el) {\r\n let elFn = document.getElementById(\"fn_\" + el.id);\r\n if (elFn && !ew.hasValue(elFn)) {\r\n return {\r\n fileRequired: ew.language.phrase(\"EnterRequiredField\").replace(\"%s\", fieldName)\r\n };\r\n }\r\n return false;\r\n };\r\n }\r\n\r\n /**\r\n * Mismatch password validator\r\n */\r\n function mismatchPassword(el) {\r\n let id;\r\n if (el.id.startsWith(\"c_\"))\r\n // Confirm Password field in Register page\r\n id = el.id.replace(/^c_/, \"x_\");else if (el.id == \"cpwd\")\r\n // Change Password page\r\n id = \"npwd\";\r\n let elPwd = document.getElementById(id);\r\n if (el.value !== elPwd.value) {\r\n return {\r\n mismatchPassword: ew.language.phrase(\"MismatchPassword\")\r\n };\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Between validator\r\n */\r\n function between(el) {\r\n let x, z;\r\n if (el.id.startsWith(\"y_\")) {\r\n x = document.getElementById(el.id.replace(/^y_/, \"x_\"));\r\n z = document.getElementById(el.id.replace(/^y_/, \"z_\"));\r\n } else if (el.id.endsWith(\"_value_1\")) {\r\n // QueryBuilder\r\n x = document.getElementById(el.id.replace(/_value_1$/, \"_value_0\"));\r\n z = document.getElementById(el.id.replace(/_value_1$/, \"_operator\"));\r\n }\r\n if (ew.hasValue(x) && $$1(z).val().toUpperCase() == \"BETWEEN\" && !ew.hasValue(el)) {\r\n return {\r\n between: ew.language.phrase(\"EnterValue2\")\r\n };\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Password strength validator\r\n */\r\n function passwordStrength(el) {\r\n let $el = $$1(el);\r\n if (!ew.isMaskedPassword(el) && $el.hasClass(\"ew-password-strength\") && !$el.data(\"validated\")) {\r\n return {\r\n passwordStrength: ew.language.phrase(\"PasswordTooSimple\")\r\n };\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * User name validator\r\n */\r\n function username(raw) {\r\n return function (el) {\r\n if (!raw && el.value.match(new RegExp('[' + ew.escapeRegExChars(ew.INVALID_USERNAME_CHARACTERS) + ']'))) return {\r\n username: ew.language.phrase(\"InvalidUsernameChars\")\r\n };\r\n return false;\r\n };\r\n }\r\n\r\n /**\r\n * Password validator\r\n */\r\n function password(raw) {\r\n return function (el) {\r\n if (!raw && !ew.ENCRYPTED_PASSWORD && el.value.match(new RegExp('[' + ew.escapeRegExChars(ew.INVALID_PASSWORD_CHARACTERS) + ']'))) return {\r\n password: ew.language.phrase(\"InvalidPasswordChars\")\r\n };\r\n return false;\r\n };\r\n }\r\n\r\n /**\r\n * Email validator\r\n */\r\n function email(el) {\r\n let value = ew.getValue(el);\r\n if (!ew.checkEmail(value)) {\r\n return {\r\n email: ew.language.phrase(\"IncorrectEmail\")\r\n };\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Emails validator\r\n */\r\n function emails(cnt, err) {\r\n return function (el) {\r\n let value = ew.getValue(el);\r\n if (!ew.checkEmails(value, cnt)) {\r\n return {\r\n emails: err\r\n };\r\n }\r\n return false;\r\n };\r\n }\r\n\r\n /**\r\n * DateTime validator\r\n * @param {string} format DateTime format\r\n */\r\n function datetime(format) {\r\n return function (el) {\r\n let value = ew.getValue(el);\r\n if (!ew.checkDate(value, format)) {\r\n return {\r\n datetime: ew.language.phrase(\"IncorrectDate\").replace(/%s/g, format)\r\n };\r\n }\r\n return false;\r\n };\r\n }\r\n\r\n /**\r\n * Time validator\r\n * @param {string} format Time format\r\n */\r\n function time(format) {\r\n return function (el) {\r\n let value = ew.getValue(el);\r\n if (!ew.checkTime(value, format)) {\r\n return {\r\n time: ew.language.phrase(\"IncorrectTime\").replace(/%s/g, format)\r\n };\r\n }\r\n return false;\r\n };\r\n }\r\n\r\n /**\r\n * Float validator\r\n */\r\n function float(el) {\r\n let value = ew.getValue(el);\r\n if (!ew.checkNumber(value)) {\r\n return {\r\n float: ew.language.phrase(\"IncorrectFloat\")\r\n };\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Range validator\r\n * @param {number} min Min value\r\n * @param {number} max Max value\r\n */\r\n function range(min, max) {\r\n return function (el) {\r\n let value = ew.getValue(el);\r\n if (!ew.checkRange(value, min, max)) {\r\n return {\r\n range: ew.language.phrase(\"IncorrectRange\").replace(\"%1\", min).replace(\"%2\", max)\r\n };\r\n }\r\n return false;\r\n };\r\n }\r\n\r\n /**\r\n * Integer validator\r\n */\r\n function integer(el) {\r\n let value = ew.getValue(el);\r\n if (!ew.checkInteger(value)) {\r\n return {\r\n integer: ew.language.phrase(\"IncorrectInteger\")\r\n };\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * US phone validator\r\n */\r\n function phone(el) {\r\n let value = ew.getValue(el);\r\n if (!ew.checkPhone(value)) {\r\n return {\r\n phone: ew.language.phrase(\"IncorrectPhone\")\r\n };\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * US ZIP validator\r\n */\r\n function zip(el) {\r\n let value = ew.getValue(el);\r\n if (!ew.checkZip(value)) {\r\n return {\r\n zip: ew.language.phrase(\"IncorrectZip\")\r\n };\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Credit card validator\r\n */\r\n function creditCard(el) {\r\n let value = ew.getValue(el);\r\n if (!ew.checkCreditCard(value)) {\r\n return {\r\n creditCard: ew.language.phrase(\"IncorrectCreditCard\")\r\n };\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * US SSN validator\r\n */\r\n function ssn(el) {\r\n let value = ew.getValue(el);\r\n if (!ew.checkSsn(value)) {\r\n return {\r\n ssn: ew.language.phrase(\"IncorrectSSN\")\r\n };\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * GUID validator\r\n */\r\n function guid(el) {\r\n let value = ew.getValue(el);\r\n if (!ew.checkGuid(value)) {\r\n return {\r\n guid: ew.language.phrase(\"IncorrectGUID\")\r\n };\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Regular expression validator\r\n * @param {string} pattern Regular expression pattern\r\n */\r\n function regex(pattern) {\r\n return function (el) {\r\n let value = ew.getValue(el);\r\n if (!ew.checkByRegEx(value, pattern)) {\r\n return {\r\n regex: ew.language.phrase(\"IncorrectRegExp\")\r\n };\r\n }\r\n return false;\r\n };\r\n }\r\n\r\n /**\r\n * URL validator\r\n */\r\n function url(el) {\r\n let value = ew.getValue(el);\r\n if (!ew.checkUrl(value)) {\r\n return {\r\n url: ew.language.phrase(\"IncorrectUrl\")\r\n };\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Custom validator\r\n * @param {Function} fn Function(value, ...args)\r\n * @param {...any} args Additional arguments for the function\r\n */\r\n function custom(fn) {\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 return function (el) {\r\n if (typeof fn == \"function\") {\r\n let value = ew.getValue(el);\r\n if (!fn(value, ...args)) return {\r\n custom: ew.language.phrase(\"IncorrectField\")\r\n };\r\n }\r\n return false;\r\n };\r\n }\r\n\r\n /**\r\n * Captcha validator\r\n */\r\n function captcha(el) {\r\n if (el && !ew.hasValue(el)) {\r\n return {\r\n captcha: ew.language.phrase(\"EnterValidateCode\")\r\n };\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * reCaptcha validator\r\n */\r\n function recaptcha(el) {\r\n var _grecaptcha;\r\n if (el && !ew.hasValue(el) && ((_grecaptcha = grecaptcha) == null ? void 0 : _grecaptcha.getResponse(el.dataset.id)) === \"\") {\r\n return {\r\n recaptcha: ew.language.phrase(\"ClickReCaptcha\")\r\n };\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Min date/time validator\r\n * @param {Function|HTMLElement|DateTime|Date} min Min date\r\n */\r\n function minDate(min) {\r\n return function (el) {\r\n let value = ew.getValue(el),\r\n format = el.dataset.formatPattern,\r\n minDateTime;\r\n min = typeof min == \"function\" ? min() : min;\r\n if (min instanceof HTMLElement) {\r\n let minValue = min.value,\r\n minFormat = min.dataset.formatPattern;\r\n if (min.value && min.dataset.formatPattern) minDateTime = ew.parseDate(minValue, minFormat);\r\n } else if (min instanceof Date) {\r\n minDateTime = DateTime$1.fromJSDate(min, {\r\n zone: \"utc\"\r\n });\r\n } else if (min instanceof DateTime$1) {\r\n minDateTime = min;\r\n }\r\n if (value && format && minDateTime) {\r\n let dateTime = ew.parseDate(value, format);\r\n if (dateTime < minDateTime) return {\r\n minDate: ew.language.phrase(\"IncorrectMinDate\").replace(\"%s\", ew.formatDateTime(minDateTime, ew.DATE_FORMAT + \" \" + ew.TIME_FORMAT))\r\n };\r\n }\r\n return false;\r\n };\r\n }\r\n\r\n /**\r\n * Max date/time validator\r\n * @param {Function|HTMLElement|DateTime|Date} max Max date\r\n */\r\n function maxDate(max) {\r\n return function (el) {\r\n let value = ew.getValue(el),\r\n format = el.dataset.formatPattern,\r\n maxDateTime;\r\n max = typeof max == \"function\" ? max() : max;\r\n if (max instanceof HTMLElement) {\r\n let maxValue = max.value,\r\n maxFormat = max.dataset.formatPattern;\r\n if (max.value && max.dataset.formatPattern) maxDateTime = ew.parseDate(maxValue, maxFormat);\r\n } else if (max instanceof Date) {\r\n maxDateTime = DateTime$1.fromJSDate(max, {\r\n zone: \"utc\"\r\n });\r\n } else if (max instanceof DateTime$1) {\r\n maxDateTime = max;\r\n }\r\n if (value && format && maxDateTime) {\r\n let dateTime = ew.parseDate(value, format);\r\n if (dateTime > maxDateTime) return {\r\n maxDate: ew.language.phrase(\"IncorrectMaxDate\").replace(\"%s\", ew.formatDateTime(maxDateTime, ew.DATE_FORMAT + \" \" + ew.TIME_FORMAT))\r\n };\r\n }\r\n return false;\r\n };\r\n }\r\n\r\n /**\r\n * Min validator\r\n * @param {Function|HTMLElement|String|Number} min Min value\r\n */\r\n function min(min) {\r\n return function (el) {\r\n let value = ew.parseNumber(ew.getValue(el)),\r\n minValue;\r\n min = typeof min == \"function\" ? min() : min;\r\n if (min instanceof HTMLElement) {\r\n minValue = ew.parseNumber(ew.getValue(min));\r\n } else if (typeof min == \"string\") {\r\n minValue = ew.parseNumber(min);\r\n } else if (typeof min == \"number\") {\r\n minValue = min;\r\n }\r\n if (typeof value == \"number\" && typeof minValue == \"number\") {\r\n if (value < minValue) return {\r\n min: ew.language.phrase(\"IncorrectMin\").replace(\"%s\", minValue)\r\n };\r\n }\r\n return false;\r\n };\r\n }\r\n\r\n /**\r\n * Max validator\r\n * @param {Function|HTMLElement|String|Number} max Max value\r\n */\r\n function max(max) {\r\n return function (el) {\r\n let value = ew.parseNumber(ew.getValue(el)),\r\n maxValue;\r\n max = typeof max == \"function\" ? max() : max;\r\n if (max instanceof HTMLElement) {\r\n maxValue = ew.parseNumber(ew.getValue(max));\r\n } else if (typeof max == \"string\") {\r\n maxValue = ew.parseNumber(max);\r\n } else if (typeof max == \"number\") {\r\n maxValue = max;\r\n }\r\n if (typeof value == \"number\" && typeof maxValue == \"number\") {\r\n if (value > maxValue) return {\r\n max: ew.language.phrase(\"IncorrectMax\").replace(\"%s\", maxValue)\r\n };\r\n }\r\n return false;\r\n };\r\n }\n\n var Validators = {\n __proto__: null,\n between,\n captcha,\n creditCard,\n custom,\n datetime,\n email,\n emails,\n fileRequired,\n float,\n guid,\n integer,\n max,\n maxDate,\n min,\n minDate,\n mismatchPassword,\n password,\n passwordStrength,\n phone,\n range,\n recaptcha,\n regex,\n required,\n ssn,\n time,\n url,\n userLevelId,\n userLevelName,\n username,\n zip\n };\n\n function _typeof(o) {\r\n \"@babel/helpers - typeof\";\r\n\r\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\r\n return typeof o;\r\n } : function (o) {\r\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\r\n }, _typeof(o);\r\n }\n\n function toPrimitive(t, r) {\r\n if (\"object\" != _typeof(t) || !t) return t;\r\n var e = t[Symbol.toPrimitive];\r\n if (void 0 !== e) {\r\n var i = e.call(t, r || \"default\");\r\n if (\"object\" != _typeof(i)) return i;\r\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\r\n }\r\n return (\"string\" === r ? String : Number)(t);\r\n }\n\n function toPropertyKey(t) {\r\n var i = toPrimitive(t, \"string\");\r\n return \"symbol\" == _typeof(i) ? i : i + \"\";\r\n }\n\n function _defineProperties(e, r) {\r\n for (var t = 0; t < r.length; t++) {\r\n var o = r[t];\r\n o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, toPropertyKey(o.key), o);\r\n }\r\n }\r\n function _createClass(e, r, t) {\r\n return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", {\r\n writable: !1\r\n }), e;\r\n }\n\n function _setPrototypeOf(t, e) {\r\n return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {\r\n return t.__proto__ = e, t;\r\n }, _setPrototypeOf(t, e);\r\n }\n\n function _inheritsLoose(t, o) {\r\n t.prototype = Object.create(o.prototype), t.prototype.constructor = t, _setPrototypeOf(t, o);\r\n }\n\n function _defineProperty(e, r, t) {\r\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\r\n value: t,\r\n enumerable: !0,\r\n configurable: !0,\r\n writable: !0\r\n }) : e[r] = t, e;\r\n }\n\n /*\r\n * Based on: jquery.batch v0.1.0\r\n * Copyright 2013, Matt Morgan (@mlmorg)\r\n * MIT license\r\n */\r\n\r\n // Global batch settings\r\n $$1.batchSettings = {\r\n type: 'POST',\r\n contentType: 'application/json',\r\n processData: false,\r\n dataType: 'json',\r\n toJSON: JSON.stringify,\r\n parse: data => data\r\n };\r\n\r\n // Setup method\r\n $$1.batchSetup = function (options) {\r\n return $$1.extend($$1.batchSettings, options);\r\n };\r\n\r\n // $.batch class\r\n // -------------\r\n\r\n var Batch = $$1.batch = function (func, options) {\r\n // Always instantiate a Batch class even if called without \"new\"\r\n if (!(this instanceof Batch)) {\r\n return new Batch(func, options);\r\n }\r\n\r\n // Shift arguments if func is an object\r\n if (typeof func === 'object') {\r\n options = func;\r\n func = undefined;\r\n }\r\n\r\n // Default options\r\n this.options = $$1.extend({}, $$1.batchSettings, options);\r\n\r\n // Find a parent batch object, if we're nested\r\n this.parent = $$1.ajaxSetup()._batch;\r\n\r\n // Requests storage\r\n this.requests = [];\r\n\r\n // Add any requests\r\n if (func) {\r\n this.add(func);\r\n }\r\n return this;\r\n };\r\n\r\n // Our methods\r\n $$1.extend(Batch.prototype, {\r\n // Method for adding requests to the batch\r\n add: function (func) {\r\n var _func$name;\r\n // Set global _batch variable in jQuery.ajaxSettings\r\n $$1.ajaxSetup({\r\n _batch: this.parent || this\r\n });\r\n\r\n // Call the user's function\r\n if ((_func$name = func.name) != null && _func$name.startsWith('bound ')) {\r\n // Bound function\r\n func();\r\n } else {\r\n func.call($$1.ajaxSetup()._batch);\r\n }\r\n\r\n // Remove the global _batch variable when we're not nested\r\n if (!this.parent) {\r\n $$1.ajaxSetup({\r\n _batch: null\r\n });\r\n }\r\n return this;\r\n },\r\n // Clear requests storage\r\n clear: function () {\r\n this.requests = [];\r\n },\r\n // Method for running the batch request\r\n send: function (options) {\r\n options = options || {};\r\n var instance = this;\r\n\r\n // When we're handling a child batch object, wrap any success functions\r\n // and add them to the parent batch success\r\n if (this.parent && options.success) {\r\n var parentSuccess = this.parent.options.success;\r\n this.parent.options.success = function (data, status, xhr) {\r\n options.success(data, status, xhr);\r\n if (parentSuccess) {\r\n parentSuccess(data, status, xhr);\r\n }\r\n };\r\n }\r\n\r\n // When we're handling the top-most batch, send the request\r\n else if (this.requests.length) {\r\n // Map an array of requests\r\n var requests = $$1.map(this.requests, function (request) {\r\n return request.settings.data;\r\n });\r\n\r\n // Override the success callback\r\n var success = options.success;\r\n var childSuccess = this.options.success;\r\n options.success = function (data, statusText, xhr) {\r\n // Call our _deliver method to handle each individual batch request response\r\n instance._deliver.call(instance, data, statusText);\r\n\r\n // Child batch success functions\r\n if (childSuccess) {\r\n childSuccess(data, statusText, xhr);\r\n }\r\n\r\n // User's success function\r\n if (success) {\r\n success(data, statusText, xhr);\r\n }\r\n };\r\n\r\n // Build the Ajax request options\r\n options = $$1.extend({}, this.options, options);\r\n\r\n // Create hash of requests to pass as the data in the Ajax request\r\n if (!options.data) {\r\n options.data = $$1.batchSettings.toJSON(requests);\r\n }\r\n\r\n // Call the request\r\n return $$1.ajax(options);\r\n }\r\n },\r\n // Private method to add a request to the batch requests array\r\n _addRequest: function (xhr, settings) {\r\n this.requests.push({\r\n xhr: xhr,\r\n settings: settings\r\n });\r\n },\r\n // Delivers each batch request response to its intended xhr success/complete function\r\n _deliver: function (data, statusText) {\r\n var _responses$error;\r\n var instance = this;\r\n\r\n // Pass the response off to the user to parse out the responses\r\n var responses = $$1.batchSettings.parse(data);\r\n if (responses != null && (_responses$error = responses.error) != null && _responses$error.description) {\r\n var _responses$error2;\r\n ew$1.alert(responses == null || (_responses$error2 = responses.error) == null ? void 0 : _responses$error2.description);\r\n return;\r\n }\r\n\r\n // Loop through the responses\r\n $$1.each(responses, function (i, response) {\r\n var _request$settings$com;\r\n // Only work with batch requests that we have stored\r\n if (!instance.requests[i]) {\r\n return;\r\n }\r\n\r\n // Grab the stored request data\r\n var request = instance.requests[i];\r\n\r\n // Build statusText a la jQuery based on status code\r\n request.xhr.statusText = statusText;\r\n\r\n // Call the user/success function, if it exists. Pass the response body, status text and xhr.\r\n if (statusText === 'success') {\r\n var _request$settings$suc;\r\n (_request$settings$suc = request.settings.success) == null || _request$settings$suc.call(request.xhr, response, statusText);\r\n }\r\n\r\n // Call complete\r\n (_request$settings$com = request.settings.complete) == null || _request$settings$com.call(request.xhr, statusText);\r\n });\r\n }\r\n });\r\n\r\n // $.ajax override\r\n // ---------------\r\n\r\n // Override jQuery.ajax to cancel any outgoing requests called within\r\n // a $.batch() function and add them to the batch requests array for\r\n // that batch instance\r\n var $ajax = $$1.ajax;\r\n $$1.ajax = function (url, options) {\r\n // Shift arguments when options are passed as first argument\r\n if (typeof url === 'object') {\r\n options = url;\r\n url = undefined;\r\n }\r\n\r\n // Set options object\r\n options = options || {};\r\n\r\n // Override the jQuery beforeSend method\r\n var beforeSend = options.beforeSend;\r\n options.beforeSend = function (xhr, settings) {\r\n // Call the user's beforeSend function, if passed\r\n if (beforeSend) {\r\n var before = beforeSend(xhr, settings);\r\n\r\n // Cancel request if user's beforeSend function returns false\r\n if (before === false) {\r\n return before;\r\n }\r\n }\r\n\r\n // We're only worried about requests made within a $.batch function\r\n // (aka they have a _batch object)\r\n if (settings._batch) {\r\n // Add request to batch\r\n settings._batch._addRequest(xhr, settings);\r\n\r\n // Cancel this request\r\n return false;\r\n }\r\n };\r\n\r\n // Run original $.ajax method for all other requests\r\n return $ajax.call(this, url, options);\r\n };\n\n // Form class\r\n function FormBase(id, pageId) {\r\n let self = this,\r\n $self = $$1(self);\r\n this._initiated = false;\r\n this.id = id; // Same ID as the form\r\n this.element = document.getElementById(id); // HTML form or div\r\n this.$element = $$1(this.element); // jQuery object of the form or div\r\n this.pageId = pageId;\r\n this.htmlForm = null; // HTML form element\r\n this.initSearchPanel = false; // Expanded by default\r\n this.modified = false;\r\n this.emptyRow = null; // Check empty row\r\n this.multiPage = null; // Multi-page\r\n this.autoSuggests = {}; // AutoSuggests\r\n this.lists = {}; // Dynamic selection lists\r\n this.batch = new Batch(); // For batch lookup\r\n this.formKeyCountName = \"\"; // For list/grid pages\r\n this.submitWithFetch = false; // Submit form with Fetch API and returns Promise\r\n this.enableOnInit = false; // Disable form during init\r\n this.filterList = null;\r\n\r\n // Disable form\r\n this.disableForm = function () {\r\n document.body.style.cursor = \"wait\";\r\n let form = this.getForm();\r\n $$1(form.elements).filter(\":submit:not(.dropdown-toggle), .ew-submit\").prop(\"disabled\", true).addClass(\"disabled\");\r\n this.trigger(\"disabled\");\r\n };\r\n\r\n // Enable form\r\n this.enableForm = function () {\r\n let form = this.getForm(),\r\n $elements = $$1(form.elements);\r\n $elements.filter(\".ew-disabled-element\").removeClass(\"ew-disabled-element\").prop(\"disabled\", false);\r\n $elements.filter(\".ew-enabled-element\").removeClass(\"ew-enabled-element\").prop(\"disabled\", true);\r\n $elements.filter(\":submit:not(.dropdown-toggle), .ew-submit\").not(\".ew-disabled\") // Exclude submit buttons with .ew-disabled (disabled purposely)\r\n .prop(\"disabled\", false).removeClass(\"disabled\");\r\n this.trigger(\"enabled\");\r\n document.body.style.cursor = \"default\";\r\n };\r\n\r\n // Append hidden element with form name\r\n this.appendHidden = function (el) {\r\n var form = this.getForm(),\r\n $form = $$1(form),\r\n $dp = $$1(el).closest(\".ew-form\"),\r\n name = $dp.attr(\"id\") + \"$\" + el.name;\r\n if ($form.find(\"input:hidden[name='\" + name + \"']\")[0])\r\n // Already appended\r\n return;\r\n var ar = $dp.find('[name=\"' + el.name + '\"]').serializeArray();\r\n if (ar.length) {\r\n ar.forEach(function (o, i) {\r\n $$1('').val(o.value).appendTo($form);\r\n });\r\n } else {\r\n $$1('').val(\"\").appendTo($form);\r\n }\r\n };\r\n\r\n // Can submit\r\n this.canSubmit = async function (e) {\r\n var _await$this$validate, _this$validate;\r\n var form = this.getForm(),\r\n $form = $$1(form);\r\n this.disableForm();\r\n this.updateTextArea();\r\n if (((_await$this$validate = await ((_this$validate = this.validate) == null ? void 0 : _this$validate.call(this, e))) != null ? _await$this$validate : true) && !$form.find(\".is-invalid\")[0]) {\r\n $form.find(\"input[name^=sv_], input[name^=p_], [name*=_query_builder_rule_], .ew-template input, .ew-custom-option\") // Do not submit these values\r\n .prop(\"disabled\", true).addClass(\"ew-disabled-element\");\r\n $form.find(\"[data-readonly=1][disabled]\").prop(\"disabled\", false).addClass(\"ew-enabled-element\"); // Submit readonly values\r\n var $dps = $form.find(\"input[name=detailpage]\").map(function (i, el) {\r\n return $form.find(\"#\" + el.value)[0];\r\n });\r\n if ($dps.length > 1) {\r\n // Multiple Master/Detail, check element names\r\n $dps.each(function (i, dp) {\r\n $$1(dp).find(\":input, selection-list\").each(function (j, el) {\r\n if (/^(fn_)?(x|o)\\d*_/.test(el.name)) {\r\n var $els = $dps.not(dp).find(el.tagName + \"[name='\" + el.name + \"']\");\r\n if ($els.length) {\r\n // Elements with same name found\r\n self.appendHidden(el); // Append element with form name\r\n $els.each(function () {\r\n self.appendHidden(this); // Append elements with same name and form name\r\n });\r\n }\r\n }\r\n });\r\n });\r\n }\r\n let args = {\r\n form: form,\r\n result: true\r\n },\r\n evt = $$1.Event(\"beforesubmit\", {\r\n originalEvent: e\r\n });\r\n $form.trigger(evt, [args]);\r\n let result = await args.result; // Support Promise\r\n if (!evt.isDefaultPrevented() && (result === true || $$1.isObject(result) && result.value))\r\n // Support Swal.fire()\r\n return true;\r\n } else {\r\n this.enableForm();\r\n }\r\n return false;\r\n };\r\n\r\n // Submit\r\n this.submit = async function (e) {\r\n var _e$originalEvent;\r\n let form = this.getForm(),\r\n formAction = e == null || (_e$originalEvent = e.originalEvent) == null || (_e$originalEvent = _e$originalEvent.submitter) == null ? void 0 : _e$originalEvent.formAction;\r\n if (formAction) {\r\n formAction = ew.parseUrl(formAction).pathname;\r\n form.setAttribute(\"action\", formAction);\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 = $$1(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 };\r\n\r\n // Get dynamic selection list by element name or id\r\n this.getList = function (name) {\r\n var _this$getElement;\r\n if ($$1.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 name = name.replace(/^(sv_)?[xy](\\d*|\\$rowindex\\$)_|\\[\\]$/g, \"\"); // Remove element name prefix/suffix\r\n if (this.lists[name]) return this.lists[name];\r\n let field = (_this$getElement = this.getElement(name)) == null || (_this$getElement = _this$getElement.dataset.field) == null ? void 0 : _this$getElement.replace(/^x_|\\[\\]$/g, \"\"); // Remove element name prefix/suffix\r\n return field ? this.lists[field] : {};\r\n };\r\n\r\n // Compile templates\r\n this.compileTemplates = function () {\r\n let lists = Object.values(this.lists);\r\n for (let list of lists) {\r\n if (list.template && $$1.isString(list.template)) list.template = $$1.templates(list.template);\r\n }\r\n };\r\n\r\n // Get option template of dynamic selection list\r\n this.getOptionTemplate = function (list) {\r\n if (list.template && $$1.isString(list.template)) list.template = $$1.templates(list.template);\r\n return list.template;\r\n };\r\n\r\n // Get the HTML form element\r\n this.getForm = function () {\r\n if (!this.htmlForm) {\r\n var _this$element, _this$element2;\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 return this.htmlForm;\r\n };\r\n\r\n // Get form element as single element\r\n this.getElement = function (name) {\r\n return name ? ew.getElement(name, this.$element) : this.$element[0];\r\n };\r\n\r\n // Get form element(s) as single element or array of radio/checkbox\r\n this.getElements = function (name) {\r\n return ew.getElements(name, this.$element);\r\n };\r\n\r\n // Fix ID\r\n this.fixId = function (id, multiple, rowindex) {\r\n let t = \"\",\r\n ar = id.split(\" \");\r\n if (ar.length > 1) {\r\n t = ar[0];\r\n rowindex = \"\";\r\n id = ar[1];\r\n }\r\n let prefix = $$1.isNumber(rowindex) ? \"x\" + rowindex + \"_\" : \"x_\"; // Add row index\r\n id = id.startsWith(\"x_\") ? id.replace(/^x_/, prefix) // Field element name\r\n : prefix + id; // Field var\r\n if (multiple && !id.endsWith(\"[]\"))\r\n // Add [] if select-multiple\r\n id += \"[]\";\r\n return t ? t + \" \" + id : id;\r\n };\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 this.updateList = function (id, list, rowindex, immediate) {\r\n var _list, _Object$entries$find;\r\n (_list = list) != null ? _list : list = $$1.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 if (list.template && $$1.isString(list.template))\r\n // Compile template in case updateLists() called before init()\r\n list.template = $$1.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 id = $$1.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 /**\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 this.updateLists = function (rowindex, immediate) {\r\n var _form$querySelector;\r\n if (rowindex === null)\r\n // rowindex == $rowindex$ == null\r\n return;\r\n if (this.pageId == \"grid\" && !$$1.isNumber(rowindex) && !$$1.isUndefined(rowindex)) return;\r\n let form = this.getForm(); // Set up $element and htmlForm\r\n if ((form == null || (_form$querySelector = form.querySelector(\"input#confirm\")) == null ? void 0 : _form$querySelector.value) == \"confirm\")\r\n // 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))\r\n // 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 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 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 if (this.batch.requests.length > 0) deferreds.push(this.batch.send({\r\n url: ew.getApiUrl(ew.API_LOOKUP_ACTION)\r\n }));\r\n $$1.when(...deferreds).then(() => $$1(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 $$1(document).trigger(\"updatedone\", [{\r\n source: self,\r\n target: form\r\n }]);\r\n }\r\n };\r\n\r\n // Create AutoSuggest\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 self.autoSuggests[settings.id] = new ew.AutoSuggest(options);\r\n };\r\n\r\n // Init editors\r\n this.initEditors = function () {\r\n var form = this.getForm();\r\n $$1(form.elements).filter(\"textarea.editor\").each(function (i, el) {\r\n var ed = $$1(el).data(\"editor\");\r\n if (ed && !ed.active && !ed.name.includes(\"$rowindex$\")) ed.create();\r\n });\r\n };\r\n\r\n // Update textareas\r\n this.updateTextArea = function (name) {\r\n var form = this.getForm();\r\n $$1(form.elements).filter(\"textarea.editor\").each(function (i, el) {\r\n var ed = $$1(el).data(\"editor\");\r\n if (!ed || name && ed.name != name) return true; // Continue\r\n ed.save();\r\n if (name) return false; // Break\r\n });\r\n };\r\n\r\n // Destroy editor(s)\r\n this.destroyEditor = function (name) {\r\n var form = this.getForm();\r\n $$1(form.elements).filter(\"textarea.editor\").each(function (i, el) {\r\n var ed = $$1(el).data(\"editor\");\r\n if (!ed || name && ed.name != name) return true; // Continue\r\n ed.destroy();\r\n if (name) return false; // Break\r\n });\r\n };\r\n\r\n // Show error message\r\n this.onError = function (el, msg) {\r\n return ew.onError(this, el, msg);\r\n };\r\n\r\n // Init file upload\r\n this.initUpload = function () {\r\n var form = this.getForm();\r\n $$1(form.elements).filter(\"input:file:not([name*='$rowindex$'])\").each(function (index) {\r\n $$1.later(ew.AJAX_DELAY * index, null, ew.upload, this); // Delay a little in case of large number of upload fields\r\n });\r\n };\r\n\r\n // Set up filters\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 = $$1(\".ew-save-filter[data-form=\" + id + \"]\").toggleClass(\"disabled\", !data),\r\n $df = $$1(\".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 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 $$1.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 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 $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 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 if (filters.length) {\r\n let $submenu = $$1('');\r\n filters.forEach((filter, i, ar) => {\r\n $$1('' + 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 $$1('' + filter[0] + '').insertBefore($save).on(\"click\", function (e) {\r\n if (currentPageID == \"calendar\") {\r\n // Post back\r\n $$1(\"\").attr({\r\n method: \"post\",\r\n action: ew.currentPage()\r\n }).append($$1(\"\").attr({\r\n name: \"cmd\",\r\n value: \"resetfilter\"\r\n }), $$1(\"\").attr({\r\n name: ew.TOKEN_NAME_KEY,\r\n value: ew.TOKEN_NAME\r\n }),\r\n // PHP\r\n $$1(\"\").attr({\r\n name: ew.ANTIFORGERY_TOKEN_KEY,\r\n value: ew.ANTIFORGERY_TOKEN\r\n }),\r\n // PHP\r\n $$1(\"\").attr({\r\n name: \"filter\",\r\n value: JSON.stringify(filter[1])\r\n })).appendTo(\"body\").trigger(\"submit\");\r\n } else {\r\n // Refresh\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 });\r\n $$1('').insertBefore($save);\r\n $delete.append($submenu);\r\n }\r\n };\r\n\r\n // Add event handler\r\n this.on = function () {\r\n $self.on(...arguments);\r\n };\r\n\r\n // Add event handler\r\n this.one = function () {\r\n $self.one(...arguments);\r\n };\r\n\r\n // Remove event handler\r\n this.off = function () {\r\n $self.off(...arguments);\r\n };\r\n\r\n // Trigger event\r\n this.trigger = function () {\r\n $self.trigger(...arguments);\r\n };\r\n\r\n // Init form\r\n this.init = function () {\r\n if (this._initiated) return;\r\n\r\n // Check form\r\n var form = this.getForm();\r\n if (!form) return;\r\n var $form = $$1(form);\r\n\r\n // Compile templates\r\n this.compileTemplates();\r\n\r\n // Search form\r\n if (/s(ea)?rch$/.test(this.id)) {\r\n // Search panel\r\n if (this.initSearchPanel && !ew.hasFormData(form)) $$1(\"#\" + this.id + \"_search_panel\").removeClass(\"show\");\r\n\r\n // Hide search operator column\r\n if (!$$1(\".ew-table .ew-search-operator\").text().trim()) $$1(\".ew-table .ew-search-operator\").parent(\"td\").hide();\r\n\r\n // Search operators\r\n $form.find(\"select[id^=z_]\").each(function () {\r\n var $this = $$1(this).trigger(\"change\");\r\n if ($this.val() != \"BETWEEN\") $form.find(\"#w_\" + this.id.substring(2)).trigger(\"change\");\r\n });\r\n }\r\n\r\n // Multi-page\r\n if (this.multiPage) this.multiPage.render();\r\n\r\n // HTML editors\r\n loadjs.ready([\"editor\"], () => setTimeout(this.initEditors.bind(this), 0)); // Delay for custom template to apply first\r\n\r\n // Dynamic selection lists\r\n this.updateLists();\r\n\r\n // Init file upload\r\n this.initUpload();\r\n\r\n // Submit/Cancel\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 = $$1(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 = $$1.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 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 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 window.location = href;\r\n }\r\n });\r\n }\r\n this._initiated = true;\r\n\r\n // Store form object as data\r\n this.$element.data(\"form\", this);\r\n\r\n // Enable form\r\n if (this.enableOnInit || Array.from(form.elements).find(el => el.matches(\"button.disabled.enable-on-init\"))) this.enableForm();\r\n\r\n // Trigger listeners\r\n this.trigger(\"initiated\");\r\n };\r\n\r\n // Add to the global forms object\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 _defineProperty(this, \"validators\", []);\r\n _defineProperty(this, \"_validate\", true);\r\n this.name = fldvar;\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 this.invalid = invalid;\r\n }\r\n\r\n /**\r\n * Add validator\r\n * @param {Function} validator Validator function\r\n */\r\n var _proto = Field.prototype;\r\n _proto.addValidator = function addValidator(validator) {\r\n if (typeof validator === \"function\") this.validators.push(validator);\r\n }\r\n\r\n /**\r\n * Get error\r\n * @returns {Object}\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 let error = (_this$_error = this._error) != null ? _this$_error : {};\r\n this._error = {\r\n ...error,\r\n ...err\r\n };\r\n this.invalid = true;\r\n }\r\n }\r\n\r\n /**\r\n * Clear all errors\r\n */;\r\n _proto.clearErrors = function clearErrors() {\r\n this._error = null;\r\n this.invalid = false;\r\n }\r\n\r\n /**\r\n * Clear all validators\r\n */;\r\n _proto.clearValidators = function clearValidators() {\r\n this.validators = [];\r\n }\r\n\r\n /**\r\n * Get error message\r\n * @returns {string} HTML\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 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 if (err !== false) {\r\n this.addError(err);\r\n result = false;\r\n }\r\n }\r\n this.updateFeedback();\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Reset invalid property (on page load for Grid-Add/Edit)\r\n */;\r\n _proto.resetInvalid = function resetInvalid() {\r\n var _this$_element, _this$_element$closes;\r\n this.clearErrors();\r\n if ((_this$_element = this._element) != null && (_this$_element = _this$_element.classList) != null && _this$_element.contains(\"is-invalid\") && !this._error) this.addError({\r\n server: (_this$_element$closes = this._element.closest(ew.fieldContainerSelector)) == null || (_this$_element$closes = _this$_element$closes.querySelector(\".invalid-feedback\")) == null ? void 0 : _this$_element$closes.innerHTML\r\n }); // Server side error\r\n }\r\n\r\n /**\r\n * Update the error message to feedback element\r\n */;\r\n _proto.updateFeedback = function updateFeedback() {\r\n let err = this.errorMessage;\r\n if (this._element && err) {\r\n var _this$_element$closes2;\r\n let feedback = (_this$_element$closes2 = this._element.closest(ew.fieldContainerSelector)) == null ? void 0 : _this$_element$closes2.querySelector(\".invalid-feedback\");\r\n if (feedback) feedback.innerHTML = err;\r\n ew.setInvalid(this._element);\r\n }\r\n }\r\n\r\n /**\r\n * Set focus\r\n * @param {Object} options - Focus options\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 /**\r\n * Check if the field can be focused\r\n */;\r\n _proto.canFocus = function canFocus() {\r\n var _el$style, _el$classList;\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 /**\r\n * Check if focused\r\n */;\r\n return _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 return \"\";\r\n }\r\n\r\n /**\r\n * Check if the field should be validated\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 /**\r\n * Set form element\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 /**\r\n * Get field value from form element\r\n * @returns {string|Array}\r\n */,\r\n set: function (el) {\r\n var _this$_element2;\r\n this._element = el;\r\n this._checkbox = (_this$_element2 = this._element) != null && (_this$_element2 = _this$_element2.id) != null && _this$_element2.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 }();\n\n /**\r\n * Class Form\r\n */\r\n let Form = /*#__PURE__*/function (_FormBase) {\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 _this = _FormBase.call(this, id, pageId) || this;\r\n _defineProperty(_this, \"row\", {});\r\n _defineProperty(_this, \"fields\", {});\r\n _defineProperty(_this, \"validateRequired\", true);\r\n _defineProperty(_this, \"autoFocus\", true);\r\n _defineProperty(_this, \"autoFocusPreventScroll\", true);\r\n _this.on(\"initiated\", function () {\r\n let form = this.getForm();\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 this.setInvalid();\r\n this.tryFocus();\r\n });\r\n return _this;\r\n }\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 _inheritsLoose(Form, _FormBase);\r\n var _proto = Form.prototype;\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 /**\r\n * Get field\r\n * @param {string} fldvar Field variable name\r\n * @returns Field\r\n */;\r\n _proto.getField = function getField(fldvar) {\r\n return this.fields[fldvar];\r\n }\r\n\r\n /**\r\n * Add fields by field definitions\r\n * @param {Array} fields\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 /**\r\n * Add error\r\n * @param {string} fldvar Field variable name\r\n * @param {Object} err Error\r\n */;\r\n _proto.addError = function addError(fldvar, err) {\r\n if (err) {\r\n var _this$_error;\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 /**\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 _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 return false;\r\n }\r\n\r\n /**\r\n * Get error\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 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 this._focused = true;\r\n this.trigger(\"focused\");\r\n }\r\n }\r\n\r\n /**\r\n * Set focus to the first field with error\r\n */;\r\n _proto.focus = function focus() {\r\n if (!this.canFocus()) return;\r\n for (let [fldvar, field] of Object.entries(this.fields)) {\r\n var _this$_error2;\r\n if (field.invalid || (_this$_error2 = this._error) != null && _this$_error2[fldvar]) {\r\n this.getFocusable(field);\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 /**\r\n * Get focuable field element\r\n * @param {Field} field - Field object\r\n */;\r\n _proto.getFocusable = function getFocusable(field) {\r\n var _field$element;\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 if (!field.canFocus()) field.element = this.getFieldElements(field.name, 1); // Inline-Edit or Grid-Add/Edit\r\n }\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 _proto.tryFocus = function tryFocus(fieldName) {\r\n if (!this.canFocus()) return;\r\n if (!fieldName && (!Form.autoFocus || !this.autoFocus || this._focused)) return;\r\n if (!fieldName && this.invalid) {\r\n // Has error\r\n this.focus();\r\n return;\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 return (_ew$forms$get = ew.forms.get(dp.value)) == null ? void 0 : _ew$forms$get.invalid;\r\n });\r\n if (detailpage) {\r\n detailpage.focus();\r\n return;\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 this.getFocusable(field);\r\n if (field.canFocus()) {\r\n this.setFocus(field.element);\r\n return;\r\n }\r\n }\r\n let input = this.element[ew.TABLE_BASIC_SEARCH]; // Quick Search input\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 this._focused = true;\r\n this.trigger(\"focused\");\r\n }\r\n }\r\n\r\n /**\r\n * Check if the form can be focused\r\n */;\r\n _proto.canFocus = function canFocus() {\r\n var _el$style, _el$classList;\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 /**\r\n * Make the form visible\r\n * @param {HTMLElement} el - Focused element\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 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 return false;\r\n }\r\n\r\n /**\r\n * Validate all fields of the specified row\r\n * @param {number} rowIndex - Row index\r\n */;\r\n _proto.validateFields = function validateFields(rowIndex) {\r\n var _rowIndex;\r\n (_rowIndex = rowIndex) != null ? _rowIndex : rowIndex = this.getCurrentRowIndex();\r\n if (rowIndex < 2)\r\n // Regular pages (\"\"), Inline-Add (\"0\") or first row (\"1\")\r\n this.value = null; // Reset\r\n this.row = {};\r\n this._error = null; // Reset\r\n let result = true;\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 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 }\r\n // Save the field values of the row\r\n if (!this.value) {\r\n this.value = {\r\n ...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] = {\r\n ...this.row\r\n };\r\n }\r\n this.focus();\r\n return result;\r\n }\r\n\r\n /**\r\n * Key count (number|NaN)\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 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 if (this.pageId == \"update\" && !ew.updateSelected(form)) {\r\n ew.alert(ew.language.phrase(\"NoFieldSelected\"));\r\n return false;\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 for (let i = startcnt; i <= rowcnt; i++) {\r\n var _await$this$customVal, _this$customValidate;\r\n let rowIndex = keycnt >= 0 ? String(i) : \"\";\r\n form.dataset.rowindex = rowIndex;\r\n if ([\"list\", \"grid\"].includes(this.pageId)) {\r\n if (gridinsert ? !this.emptyRow(rowIndex) : true) addcnt++;else continue;\r\n }\r\n\r\n // Validate fields\r\n if (!this.validateFields(rowIndex)) return false;\r\n\r\n // Call customValidate event\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 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 this.tryFocus(true);\r\n return false;\r\n }\r\n\r\n // Process detail forms\r\n if ([\"add\", \"edit\"].includes(this.pageId)) {\r\n let detailpages = form.querySelectorAll(\"input[name=detailpage]\");\r\n for (let dp of detailpages) {\r\n var _await$frm$validate;\r\n let frm = ew.forms.get(dp.value);\r\n if (!((_await$frm$validate = await (frm == null || frm.validate == null ? void 0 : frm.validate(e))) != null ? _await$frm$validate : true)) return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Get current row index (during validation)\r\n * @returns {string} Row index\r\n */;\r\n _proto.getCurrentRowIndex = function getCurrentRowIndex() {\r\n var _this$getForm$dataset;\r\n return (_this$getForm$dataset = this.getForm().dataset.rowindex) != null ? _this$getForm$dataset : \"\";\r\n }\r\n\r\n /**\r\n * Get field values of the specified row\r\n * @param {number} rowIndex - Row index\r\n */;\r\n _proto.getValue = function getValue(rowIndex) {\r\n var _rowIndex2;\r\n (_rowIndex2 = rowIndex) != null ? _rowIndex2 : rowIndex = this.getCurrentRowIndex();\r\n let value = {};\r\n for (let field of Object.values(this.fields)) {\r\n var _field$element2;\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 return value;\r\n }\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 _proto.getFieldValue = function getFieldValue(fldvar, rowIndex) {\r\n let field = this.getField(fldvar);\r\n if (field) {\r\n var _rowIndex3, _field$element3;\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 return null;\r\n }\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 _proto.getFieldElements = function getFieldElements(name, rowIndex) {\r\n var _rowIndex4;\r\n (_rowIndex4 = rowIndex) != null ? _rowIndex4 : rowIndex = this.getCurrentRowIndex();\r\n return this.getElements(\"x\" + rowIndex + \"_\" + name) ||\r\n // By name with prefix\r\n this.getElements(\"x\" + rowIndex + \"_\" + name + \"[]\") ||\r\n // By name with prefix and []\r\n this.getElements(name); // By name directly (e.g. email form)\r\n }\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 _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 /**\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 _proto.setInvalid = function setInvalid(rowIndex) {\r\n let form = this.getForm(); // Get HTML form\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 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 (_rowIndex5 = rowIndex) != null ? _rowIndex5 : rowIndex = \"\";\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 if (rowIndex) field.resetInvalid(); // For Grid-Add/Edit\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 ew.setInvalid(field.element);\r\n }\r\n // Process detail forms\r\n if ([\"add\", \"edit\"].includes(this.pageId)) form.querySelectorAll(\"input[name=detailpage]\").forEach(dp => {\r\n var _ew$forms$get2;\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 return _createClass(Form, [{\r\n key: \"error\",\r\n get: function () {\r\n return this._error;\r\n }\r\n\r\n /**\r\n * Check if invalid\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 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 return parseInt(keycnt, 10);\r\n }\r\n }]);\r\n }(FormBase);\r\n _defineProperty(Form, \"autoFocus\", true);\r\n _defineProperty(Form, \"autoFocusPreventScroll\", true);\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 _defineProperty(this, \"fields\", []);\r\n _defineProperty(this, \"validateRequired\", false);\r\n _defineProperty(this, \"multiPage\", false);\r\n _defineProperty(this, \"submitWithFetch\", false);\r\n _defineProperty(this, \"initSearchPanel\", false);\r\n _defineProperty(this, \"enableOnInit\", false);\r\n }\r\n var _proto = FormBuilder.prototype;\r\n // Set ID\r\n _proto.setId = function setId(value) {\r\n this.id = value;\r\n return this;\r\n }\r\n\r\n // Set page ID\r\n ;\r\n _proto.setPageId = function setPageId(value) {\r\n this.pageId = value;\r\n return this;\r\n }\r\n\r\n // Set lists\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 }\r\n\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 _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] = {\r\n ...list,\r\n ...{\r\n autoFillTargetFields: [],\r\n childFields: [],\r\n filterFieldVars: [],\r\n filterFields: [],\r\n parentFields: []\r\n }\r\n };\r\n this.lists = value;\r\n }\r\n return this;\r\n }\r\n\r\n // Add list\r\n ;\r\n _proto.addList = function addList(name, value) {\r\n this.lists[name] = value;\r\n return this;\r\n }\r\n\r\n // Set fields\r\n ;\r\n _proto.setFields = function setFields(value) {\r\n if (Array.isArray(value)) this.fields = value;\r\n return this;\r\n }\r\n\r\n // Add field\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 }\r\n\r\n // Add fields\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 }\r\n\r\n // Set validate\r\n ;\r\n _proto.setValidate = function setValidate(value) {\r\n this.validate = value;\r\n return this;\r\n }\r\n\r\n // Set custom validate\r\n ;\r\n _proto.setCustomValidate = function setCustomValidate(value) {\r\n this.customValidate = value;\r\n return this;\r\n }\r\n\r\n // Set validate required\r\n ;\r\n _proto.setValidateRequired = function setValidateRequired(value) {\r\n this.validateRequired = value;\r\n return this;\r\n }\r\n\r\n // Set submit\r\n ;\r\n _proto.setSubmit = function setSubmit(value) {\r\n this.submit = value;\r\n return this;\r\n }\r\n\r\n // Set form KeyCount name\r\n ;\r\n _proto.setFormKeyCountName = function setFormKeyCountName(value) {\r\n this.formKeyCountName = value;\r\n return this;\r\n }\r\n\r\n // Set empty row\r\n ;\r\n _proto.setEmptyRow = function setEmptyRow(value) {\r\n this.emptyRow = value;\r\n return this;\r\n }\r\n\r\n // Set multi page\r\n ;\r\n _proto.setMultiPage = function setMultiPage(value) {\r\n this.multiPage = value;\r\n return this;\r\n }\r\n\r\n // Set submit with Fetch API\r\n ;\r\n _proto.setSubmitWithFetch = function setSubmitWithFetch(value) {\r\n this.submitWithFetch = value;\r\n return this;\r\n }\r\n\r\n // Set filter list\r\n ;\r\n _proto.setFilterList = function setFilterList(value) {\r\n this.filterList = value;\r\n return this;\r\n }\r\n\r\n // Set initSearchPanel\r\n ;\r\n _proto.setInitSearchPanel = function setInitSearchPanel(value) {\r\n this.initSearchPanel = value;\r\n return this;\r\n }\r\n\r\n // Set enableOnInit\r\n ;\r\n _proto.setEnableOnInit = function setEnableOnInit(value) {\r\n this.enableOnInit = value;\r\n return this;\r\n }\r\n\r\n // Build\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 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 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 return FormBuilder;\r\n }();\n\n // AjaxLookup class\r\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 _defineProperty(this, \"_isAutoSuggest\", null);\r\n this.elementId = settings.id; // Id\r\n this.form = settings.form; // Form\r\n if ($$1.isString(this.form))\r\n // 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 if (!this.element)\r\n // Element not found\r\n return;\r\n this.formElement = this.form.getElement(); // HTML form or DIV\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 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 /**\r\n * Is AutoSuggest\r\n */\r\n var _proto = AjaxLookup.prototype;\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 /**\r\n * Generate request\r\n */;\r\n _proto.generateRequest = function generateRequest() {\r\n var _data$ajax;\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 /**\r\n * Get URL\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: $$1.isNumber(start) ? start : -1\r\n });\r\n return ew.getApiUrl(ew.API_LOOKUP_ACTION, params.toString());\r\n }\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 _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 /**\r\n * Transform options (virtual)\r\n * @param {Object[]} data Data from server\r\n */;\r\n _proto.transform = function transform(data) {\r\n let results = [];\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 return results;\r\n }\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 _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 return options;\r\n };\r\n return _createClass(AjaxLookup, [{\r\n key: \"isAutoSuggest\",\r\n get: function () {\r\n var _this$_isAutoSuggest;\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 /**\r\n * Lookup options\r\n */\r\n }, {\r\n key: \"options\",\r\n get: function () {\r\n return this.list.lookupOptions;\r\n }\r\n }]);\r\n }();\n\n function _assertThisInitialized(e) {\r\n if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\r\n return e;\r\n }\n\n // AutoSuggest class\r\n let AutoSuggest = /*#__PURE__*/function (_AjaxLookup) {\r\n function AutoSuggest(settings) {\r\n var _this;\r\n _this = _AjaxLookup.call(this, settings) || this;\r\n if (!_this.element)\r\n // Element not found\r\n return _assertThisInitialized(_this);\r\n _this.input = _this.form.getElement(\"sv_\" + _this.elementId); // User input\r\n if (!_this.input || _this.elementId.includes(\"$rowindex$\")) return _assertThisInitialized(_this);\r\n let self = _this,\r\n $input = $$1(_this.input),\r\n $element = $$1(_this.element);\r\n\r\n // Properties\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 _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;\r\n\r\n // Save instance\r\n $element.data(\"autosuggest\", _this);\r\n\r\n // Save initial option\r\n if ($input.val() && $element.val()) _this.element.add($element.val(), $input.val(), true);\r\n\r\n // Add events\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 if (ta != null && ta.isOpen() && !ta.menu.empty()) {\r\n let $item = ta.menu.getActiveSelectable();\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 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 });\r\n\r\n // Get suggestions\r\n let async = !_this.options.length,\r\n loadingMore = false,\r\n timer;\r\n\r\n // Option template (\"suggestion\" template)\r\n let tpl = self.list.template || self.templates.suggestion;\r\n if (tpl && $$1.isString(tpl)) tpl = $$1.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 = $$1.later(_this.debounce, null, () => {\r\n _this.recordCount = 0; // Reset\r\n $$1.ajax(_this.prepare(query)).done(data => asyncResults(_this.transform(data)));\r\n });\r\n } else {\r\n let records = _this.getSyncResults(query);\r\n syncResults(_this.transform({\r\n result: \"OK\",\r\n totalRecordCount: records.length,\r\n records\r\n }));\r\n }\r\n };\r\n\r\n // Create Typeahead\r\n $$1(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];\r\n // Trigger \"typeahead\" event\r\n $element.trigger(\"typeahead\", [args]);\r\n // Create Typeahead\r\n self.typeahead = $input.typeahead.apply($input, args).off(\"blur.tt\").data(\"tt-typeahead\");\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 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 if (count >= self.limit) {\r\n let h = suggestionHeight();\r\n if (h) $dataset.css(\"max-height\", h * self.limit);\r\n }\r\n if (rendered > 0) $dataset.scrollTop(suggestionHeight() * (count - rendered)); // Scroll to the first suggestion\r\n if (async) $menu.find(\".tt-footer\").toggle(self.recordCount > count);\r\n });\r\n if (async) {\r\n let loadingMoreTimer;\r\n $dataset.on(\"scroll\", () => {\r\n var _loadingMoreTimer;\r\n (_loadingMoreTimer = loadingMoreTimer) == null || _loadingMoreTimer.cancel();\r\n loadingMoreTimer = $$1.later(self.delay, null, () => {\r\n let $footer = $menu.find(\".tt-footer\");\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 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 (_loadingMoreTimer2 = loadingMoreTimer) == null || _loadingMoreTimer2.cancel();\r\n }\r\n }\r\n });\r\n });\r\n }\r\n });\r\n return _this;\r\n }\r\n\r\n // Set the selected item to the actual field\r\n _inheritsLoose(AutoSuggest, _AjaxLookup);\r\n var _proto = AutoSuggest.prototype;\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 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)\r\n // 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 if (v !== this.$element.attr(\"value\")) this.$element.attr(\"value\", v).trigger(\"change\"); // Set value to the actual field\r\n }\r\n\r\n // Transform suggestion\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 this.element.options = results.map(item => new ew.SelectionListOption(item.text, item.lf || item[0]));\r\n return results;\r\n }\r\n\r\n // Get current suggestion count\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 return [];\r\n }\r\n\r\n // Get more suggestions by Ajax\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 $$1.ajax(settings).done(data => menu.datasets[0]._append(menu.query, this.transform(data)));\r\n };\r\n return _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 }(AjaxLookup);\n\n /**\r\n * Class Forms\r\n */\r\n let Forms = /*#__PURE__*/function () {\r\n function Forms() {\r\n _defineProperty(this, \"_forms\", {});\r\n }\r\n var _proto = Forms.prototype;\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 if (!el) return null;\r\n let id = $$1.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 /**\r\n * Add form\r\n * @param {Form} f Form\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 /**\r\n * Get all ids\r\n * @returns {string[]}\r\n */;\r\n _proto.ids = function ids() {\r\n return Object.keys(this._forms);\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 = $$1.fn.select2.amd.require._defined,\r\n Utils$3 = _defined$3['select2/utils'];\r\n\r\n /**\r\n * Select2 decorator for Results\r\n */\r\n let Select2ResultsDecorator = /*#__PURE__*/function () {\r\n function Select2ResultsDecorator() {}\r\n var _proto = Select2ResultsDecorator.prototype;\r\n _proto.render = function render(decorated) {\r\n var $results = $$1(''); //***\r\n\r\n if (this.options.get('multiple')) {\r\n $results.attr('aria-multiselectable', 'true');\r\n }\r\n this.$results = $results;\r\n return $results;\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 = $$1(''); //***\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 $message[0].className += ' select2-results__message';\r\n this.$results.append($message);\r\n };\r\n _proto.append = function append(decorated, data) {\r\n this.hideLoading();\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 return;\r\n }\r\n data.results = this.sort(data.results);\r\n\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 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 if (!$row.length || $row.children().length == cols) {\r\n // Add new row\r\n $row = $$1('');\r\n this.$results.append($row);\r\n }\r\n $row.append($option);\r\n if (d == len - 1) {\r\n // Last\r\n var cnt = cols - $row.children().length;\r\n for (var i = 0; i < cnt; i++) $row.append('');\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 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 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 if (data.id == null) {\r\n option.classList.remove('select2-results__option--selectable');\r\n }\r\n if (data._resultId != null) {\r\n option.id = data._resultId;\r\n }\r\n if (data.title) {\r\n option.title = data.title;\r\n }\r\n\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 }\r\n\r\n // if (data.children) { //***\r\n // var $option = $(option);\r\n\r\n // var label = document.createElement('strong');\r\n // label.className = 'select2-results__group';\r\n\r\n // this.template(data, label);\r\n\r\n // var $children = [];\r\n\r\n // for (var c = 0; c < data.children.length; c++) {\r\n // var child = data.children[c];\r\n\r\n // var $child = this.option(child);\r\n\r\n // $children.push($child);\r\n // }\r\n\r\n // var $childrenContainer = $('', {\r\n // 'class': 'select2-results__options select2-results__options--nested',\r\n // 'role': 'none'\r\n // });\r\n\r\n // $childrenContainer.append($children);\r\n\r\n // $option.append(label);\r\n // $option.append($childrenContainer);\r\n // } else {\r\n this.template(data, option);\r\n // }\r\n\r\n Utils$3.StoreData(option, 'data', data);\r\n return option;\r\n };\r\n return Select2ResultsDecorator;\r\n }();\n\n let _defined$2 = $$1.fn.select2.amd.require._defined,\r\n Utils$2 = _defined$2['select2/utils'];\r\n\r\n /**\r\n * Results for modal lookup\r\n */\r\n let ModalResults = /*#__PURE__*/function () {\r\n function ModalResults() {}\r\n var _proto = ModalResults.prototype;\r\n _proto.bind = function bind(decorated, container, $container) {\r\n var _container$listeners$;\r\n var self = this;\r\n decorated.call(this, container, $container);\r\n\r\n // Remove handlers\r\n (_container$listeners$ = container.listeners['results:select']) == null || _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 if ($highlighted.length === 0) {\r\n return;\r\n }\r\n var data = Utils$2.GetData($highlighted[0], 'data');\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 = $$1(this);\r\n var data = Utils$2.GetData(this, 'data');\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 self.trigger('select', {\r\n originalEvent: evt,\r\n data: data\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 var _proto = ModalSearch.prototype;\r\n _proto.bind = function bind(decorated, container, $container) {\r\n var _container$listeners$;\r\n var self = this;\r\n decorated.call(this, container, $container);\r\n (_container$listeners$ = container.listeners['close']) == null || _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 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 let DropdownSearchDecorator = /*#__PURE__*/function () {\r\n function DropdownSearchDecorator() {}\r\n var _proto = DropdownSearchDecorator.prototype;\r\n _proto.handleSearch = function handleSearch(decorated, evt) {\r\n var key = evt.which;\r\n\r\n // Ignore events from modifier keys\r\n if ([KEYS.TAB, KEYS.SHIFT, KEYS.CTRL, KEYS.ALT, KEYS.PRINT_SCREEN].includes(key)) {\r\n return;\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 this._keyUpPrevented = false;\r\n };\r\n return DropdownSearchDecorator;\r\n }();\n\n let AttachBody$2 = $$1.fn.select2.amd.require._defined['select2/dropdown/attachBody'];\r\n\r\n /**\r\n * Select2 AttachBody with popper\r\n */\r\n let Select2AttachBody = /*#__PURE__*/function (_AttachBody) {\r\n // Constructor\r\n function Select2AttachBody(decorated, $element, options) {\r\n return _AttachBody.call(this, decorated, $element, options) || this;\r\n }\r\n\r\n // Override _attachPositioningHandler\r\n _inheritsLoose(Select2AttachBody, _AttachBody);\r\n var _proto = Select2AttachBody.prototype;\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 var handler = () => {\r\n self._positionDropdown();\r\n self._resizeDropdown();\r\n };\r\n $$1(window).on(events.join(' '), handler);\r\n container.$element.closest('.modal').on('scroll.select2.' + container.id, handler);\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 $$1(window).off(events.join(' '));\r\n container.$element.closest('.modal').off('scroll.select2.' + container.id);\r\n };\r\n // Override _showDropdown\r\n _proto._showDropdown = function _showDropdown(decorated) {\r\n var _this$_popper;\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 this._positionDropdown();\r\n this._resizeDropdown();\r\n };\r\n // Override _positionDropdown()\r\n _proto._positionDropdown = function _positionDropdown() {\r\n var _this$_popper2;\r\n (_this$_popper2 = this._popper) == null || _this$_popper2.update();\r\n }\r\n\r\n // Override destroy()\r\n ;\r\n _proto.destroy = function destroy(decorated) {\r\n var _this$_popper3;\r\n _AttachBody.prototype.destroy.call(this, decorated);\r\n (_this$_popper3 = this._popper) == null || _this$_popper3.destroy();\r\n this._popper = null;\r\n };\r\n return Select2AttachBody;\r\n }(AttachBody$2);\n\n /**\r\n * Select2 AttachBody decorator for modal lookup\r\n */\r\n let ModalAttachBody = /*#__PURE__*/function () {\r\n function ModalAttachBody(decorated, $element, options) {\r\n _defineProperty(this, \"$modal\", null);\r\n options.set('dropdownParent', $$1(document.body));\r\n decorated.call(this, $element, options);\r\n }\r\n var _proto = ModalAttachBody.prototype;\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();\r\n\r\n // Must bind after the results handlers to ensure correct sizing\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 _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 _proto.render = function render(decorated) {\r\n let $container = $$1('');\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 _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 let self = this;\r\n container.$modal = this.$modal;\r\n container.on('results:all', function () {\r\n var _self$$search$;\r\n self._updateDropdown();\r\n (_self$$search$ = self.$search[0]) == null || _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 let target = (_e$originalEvent = e.originalEvent) == null ? void 0 : _e$originalEvent.currentTarget;\r\n target == null || target.classList.add('select2-results__option--selected');\r\n self._updateDropdown();\r\n });\r\n container.on('unselect', function (e) {\r\n var _e$originalEvent2;\r\n let target = (_e$originalEvent2 = e.originalEvent) == null ? void 0 : _e$originalEvent2.currentTarget;\r\n target == null || target.classList.remove('select2-results__option--selected');\r\n self._updateDropdown();\r\n });\r\n this._containerResultsHandlersBound = true;\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 _proto._showDropdown = function _showDropdown(decorated) {\r\n var _this$$modal;\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 = $$1('#ew-modal-lookup-dialog');\r\n this._updateDropdown();\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 (!$$1(this).data('value'))\r\n // 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 return ModalAttachBody;\r\n }();\n\n let AttachBody$1 = $$1.fn.select2.amd.require._defined['select2/dropdown/attachBody'];\r\n\r\n /**\r\n * Select2 AttachBody for table header filter\r\n */\r\n let FilterAttachBody = /*#__PURE__*/function (_AttachBody) {\r\n // Constructor\r\n function FilterAttachBody(decorated, $element, options) {\r\n return _AttachBody.call(this, decorated, $element, options) || this;\r\n }\r\n\r\n // Override bind()\r\n _inheritsLoose(FilterAttachBody, _AttachBody);\r\n var _proto = FilterAttachBody.prototype;\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();\r\n\r\n // Must bind after the results handlers to ensure correct sizing\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 }\r\n\r\n // Override _positionDropdown()\r\n ;\r\n _proto._positionDropdown = function _positionDropdown() {\r\n var _this$_popper;\r\n (_this$_popper = this._popper) == null || _this$_popper.update();\r\n }\r\n\r\n // Override _resizeDropdown()\r\n ;\r\n _proto._resizeDropdown = function _resizeDropdown() {\r\n var css = {\r\n width: this.$container.outerWidth(false) + 'px'\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 this.$dropdown.css(css);\r\n }\r\n\r\n // Override _showDropdown()\r\n ;\r\n _proto._showDropdown = function _showDropdown(decorated) {\r\n var _dropdownButton$close, _this$_popper2;\r\n this.$dropdownContainer.appendTo(this.$dropdownParent);\r\n\r\n // Footer\r\n let self = this,\r\n oldValue = this.$element.val(),\r\n $footer = $$1('#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 = $$1(this).data('value');\r\n if (value) {\r\n // OK\r\n $$1(self.$element[0].form).triggerHandler('submit');\r\n } else {\r\n // Cancel\r\n self.$element.val(oldValue).trigger('change');\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);\r\n\r\n // Popper\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 this._positionDropdown();\r\n this._resizeDropdown();\r\n }\r\n\r\n // Override position()\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 // Override destroy()\r\n _proto.destroy = function destroy(decorated) {\r\n var _this$_popper3;\r\n _AttachBody.prototype.destroy.call(this, decorated);\r\n (_this$_popper3 = this._popper) == null || _this$_popper3.destroy();\r\n this._popper = null;\r\n };\r\n return FilterAttachBody;\r\n }(AttachBody$1);\n\n let AttachBody = $$1.fn.select2.amd.require._defined['select2/dropdown/attachBody'];\r\n\r\n /**\r\n * Select2 AttachBody for dropdown\r\n */\r\n let DropdownAttachBody = /*#__PURE__*/function (_AttachBody) {\r\n // Constructor\r\n function DropdownAttachBody(decorated, $element, options) {\r\n return _AttachBody.call(this, decorated, $element, options) || this;\r\n }\r\n\r\n // Override bind()\r\n _inheritsLoose(DropdownAttachBody, _AttachBody);\r\n var _proto = DropdownAttachBody.prototype;\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();\r\n\r\n // Must bind after the results handlers to ensure correct sizing\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 }\r\n\r\n // Override _showDropdown()\r\n ;\r\n _proto._showDropdown = function _showDropdown(decorated) {\r\n var _this$_popper;\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 this._positionDropdown();\r\n this._resizeDropdown();\r\n }\r\n\r\n // Override _positionDropdown()\r\n ;\r\n _proto._positionDropdown = function _positionDropdown() {\r\n var _this$_popper2;\r\n (_this$_popper2 = this._popper) == null || _this$_popper2.update();\r\n }\r\n\r\n // Override position()\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 // Override destroy()\r\n _proto.destroy = function destroy(decorated) {\r\n var _this$_popper3;\r\n _AttachBody.prototype.destroy.call(this, decorated);\r\n (_this$_popper3 = this._popper) == null || _this$_popper3.destroy();\r\n this._popper = null;\r\n };\r\n return DropdownAttachBody;\r\n }(AttachBody);\n\n let _defined$1 = $$1.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 /**\r\n * Select2 AttachBody for table header filter\r\n */\r\n let FilterAllowClear = /*#__PURE__*/function (_AllowClear) {\r\n function FilterAllowClear() {\r\n return _AllowClear.apply(this, arguments) || this;\r\n }\r\n _inheritsLoose(FilterAllowClear, _AllowClear);\r\n var _proto = FilterAllowClear.prototype;\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 var $clear = this.$selection.find('.select2-selection__clear');\r\n\r\n // Ignore the event if nothing has been selected\r\n if ($clear.length === 0) {\r\n return;\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 if (unselectData.prevented) {\r\n this.$element.val(previousVal);\r\n return;\r\n }\r\n for (var d = 0; d < data.length; d++) {\r\n unselectData = {\r\n data: data[d]\r\n };\r\n\r\n // Trigger the `unselect` event, so people can prevent it from being\r\n // cleared.\r\n this.trigger('unselect', unselectData);\r\n\r\n // If the event was prevented, don't clear it out.\r\n if (unselectData.prevented) {\r\n this.$element.val(previousVal);\r\n return;\r\n }\r\n }\r\n this.$element.trigger('input').trigger('change');\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 var _proto = Select2MultipleSelectionDecorator.prototype;\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 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 var _proto = Select2DataAdapterDecorator.prototype;\r\n _proto.option = function option(decorated, data) {\r\n var _data$element;\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);\r\n\r\n // Check HTML\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 return Select2DataAdapterDecorator;\r\n }();\n\n // Defined classes from select2\r\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'];\r\n\r\n // Override select2 Defaults\r\n Defaults.apply = function (options) {\r\n options = $.extend(true, {}, this.defaults, options);\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 options.dataAdapter = Utils.Decorate(\r\n // Override\r\n options.dataAdapter, Select2DataAdapterDecorator);\r\n if (options.minimumInputLength > 0) {\r\n options.dataAdapter = Utils.Decorate(options.dataAdapter, MinimumInputLength);\r\n }\r\n if (options.maximumInputLength > 0) {\r\n options.dataAdapter = Utils.Decorate(options.dataAdapter, MaximumInputLength);\r\n }\r\n if (options.maximumSelectionLength > 0) {\r\n options.dataAdapter = Utils.Decorate(options.dataAdapter, MaximumSelectionLength);\r\n }\r\n if (options.tags) {\r\n options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags);\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 if (options.resultsAdapter == null) {\r\n options.resultsAdapter = ResultsList;\r\n\r\n // Override\r\n if (options.columns > 0 && options.customOption) {\r\n options.resultsAdapter = Utils.Decorate(options.resultsAdapter, Select2ResultsDecorator);\r\n if (options.iconClass && options.multiple && options.templateResult == ew.selectOptions.templateResult) {\r\n options._templateResult = options.templateResult;\r\n options.templateResult = result => result.loading ? result.text : '' + options._templateResult(result) + '';\r\n }\r\n } else if (options.modal || options.filter) {\r\n options.resultsAdapter = Utils.Decorate(options.resultsAdapter, ModalResults);\r\n }\r\n if (options.ajax != null) {\r\n options.resultsAdapter = Utils.Decorate(options.resultsAdapter, InfiniteScroll);\r\n }\r\n if (options.placeholder != null) {\r\n options.resultsAdapter = Utils.Decorate(options.resultsAdapter, HidePlaceholder);\r\n }\r\n if (options.selectOnClose) {\r\n options.resultsAdapter = Utils.Decorate(options.resultsAdapter, SelectOnClose);\r\n }\r\n if (options.tags) {\r\n options.resultsAdapter = Utils.Decorate(options.resultsAdapter, TagsSearchHighlight);\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 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 if (options.minimumResultsForSearch !== 0) {\r\n options.dropdownAdapter = Utils.Decorate(options.dropdownAdapter, MinimumResultsForSearch);\r\n }\r\n if (options.closeOnSelect) {\r\n options.dropdownAdapter = Utils.Decorate(options.dropdownAdapter, CloseOnSelect);\r\n }\r\n if (options.dropdownCssClass != null) {\r\n options.dropdownAdapter = Utils.Decorate(options.dropdownAdapter, DropdownCSS);\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 if (options.selectionAdapter == null) {\r\n if (options.multiple) {\r\n options.selectionAdapter = MultipleSelection;\r\n options.selectionAdapter = Utils.Decorate(\r\n // Override\r\n options.selectionAdapter, Select2MultipleSelectionDecorator);\r\n } else {\r\n options.selectionAdapter = SingleSelection;\r\n }\r\n\r\n // Add the placeholder mixin if a placeholder was specified\r\n if (options.placeholder != null) {\r\n options.selectionAdapter = Utils.Decorate(options.selectionAdapter, Placeholder);\r\n }\r\n if (options.allowClear) {\r\n options.selectionAdapter = Utils.Decorate(options.selectionAdapter, options.filter ? FilterAllowClear : AllowClear);\r\n }\r\n if (options.multiple) {\r\n options.selectionAdapter = Utils.Decorate(options.selectionAdapter, SelectionSearch);\r\n }\r\n options.selectionAdapter = Utils.Decorate(options.selectionAdapter, EventRelay);\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 = $$1(document),\r\n $body = $$1(\"body\");\r\n let fieldContainerSelector = \".row, [id^=el_], [class^=el_]\";\r\n\r\n // Set focus\r\n Pace.on(\"done\", () => {\r\n var _forms$get;\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 || _forms$get.tryFocus();\r\n });\r\n\r\n // Create select2\r\n function createSelect(options) {\r\n if (options.selectId.includes(\"$rowindex$\")) return;\r\n if ($$1.isObject(options.data)) {\r\n let lookup = new ew.AjaxLookup(options.data);\r\n options.data = lookup.toSelect2Data(lookup.options);\r\n }\r\n if ($$1.isObject(options.ajax)) {\r\n let limit = options.ajax.limit,\r\n lookup = new ew.AjaxLookup({\r\n ...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 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) => $$1.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 let args = {\r\n name: options.name,\r\n options\r\n };\r\n $document$1.trigger(\"select2\", [args]);\r\n let $select = $$1(\"select[data-select2-id='\" + options.selectId + \"']\").select2(args.options);\r\n $select.on(\"select2:open\", function () {\r\n var _$$data$$dropdown$fin;\r\n (_$$data$$dropdown$fin = $$1(this).data(\"select2\").$dropdown.find(\".select2-search__field\")[0]) == null || _$$data$$dropdown$fin.focus();\r\n });\r\n if ($$1.isObject(options.ajax)) {\r\n $select.on(\"select2:opening\", function () {\r\n $$1(this).data(\"select2\").$results.find(\".select2-results__option:not(.loading-results)\").remove();\r\n });\r\n }\r\n if (options.minimumResultsForSearch === Infinity) {\r\n $select.on(\"select2:opening select2:closing\", function () {\r\n $$1(this).data(\"select2\").$dropdown.find(\".select2-search--dropdown\").addClass(\"select2-search--hide\");\r\n });\r\n }\r\n }\r\n\r\n // Create modal lookup\r\n function createModalLookup(options) {\r\n if (options.selectId.includes(\"$rowindex$\")) return;\r\n if ($$1.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 if ($$1.isObject(options.ajax)) {\r\n let limit = options.ajax.limit,\r\n lookup = new ew.AjaxLookup({\r\n ...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 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) => $$1.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 let $select = $$1(\"select[data-select2-id='\" + options.selectId + \"']\").select2(options);\r\n $select.on(\"select2:open\", function () {\r\n var _$$data$$dropdown$fin2;\r\n (_$$data$$dropdown$fin2 = $$1(this).data(\"select2\").$dropdown.find(\".select2-search__field\").addClass(\"form-control\")[0]) == null || _$$data$$dropdown$fin2.focus();\r\n });\r\n if ($$1.isObject(options.ajax)) {\r\n $select.on(\"select2:opening\", function () {\r\n $$1(this).data(\"select2\").$results.find(\".select2-results__option:not(.loading-results)\").remove();\r\n });\r\n }\r\n }\r\n\r\n // Create table header filter\r\n function createFilter(options) {\r\n if (options.selectId.includes(\"$rowindex$\")) return;\r\n if ($$1.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 if ($$1.isObject(options.ajax)) {\r\n let limit = options.ajax.limit,\r\n lookup = new ew.AjaxLookup({\r\n ...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 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) => $$1.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 let $select = $$1(\"select[data-select2-id='\" + options.selectId + \"']\").select2(options);\r\n $select.on(\"select2:open\", function () {\r\n var _$$data$$dropdown$fin3;\r\n (_$$data$$dropdown$fin3 = $$1(this).data(\"select2\").$dropdown.find(\".select2-search__field\").addClass(\"form-control\")[0]) == null || _$$data$$dropdown$fin3.focus({\r\n preventScroll: options.preventScroll\r\n }); // Do not scroll on focus by default\r\n });\r\n if ($$1.isObject(options.ajax)) {\r\n $select.on(\"select2:opening\", function () {\r\n $$1(this).data(\"select2\").$results.find(\".select2-results__option:not(.loading-results)\").remove();\r\n });\r\n }\r\n }\r\n\r\n // Init icon tooltip\r\n function initIcons(e) {\r\n var _e$target;\r\n let el = (_e$target = e == null ? void 0 : e.target) != null ? _e$target : document,\r\n tooltipOptions = {\r\n ...ew.tooltipOptions,\r\n container: \"body\",\r\n trigger: ew.IS_MOBILE ? \"manual\" : \"hover\"\r\n };\r\n $$1(el).find(\".ew-icon\").closest(\".btn, .ew-home, .ew-row-link:not(.dropdown-item)\").each(function () {\r\n let $this = $$1(this);\r\n if ($this.hasClass(\"dropdown-toggle\")) {\r\n let $p = $this.closest(\".btn-group\");\r\n if ($p.children(\".btn\").length == 1) {\r\n $p.tooltip({\r\n ...tooltipOptions,\r\n title: this.dataset.title || this.title\r\n }).on(\"mouseleave\", e => {\r\n var _bootstrap$Tooltip$ge;\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 }\r\n\r\n // Init password options\r\n function initPasswordOptions(e) {\r\n var _e$target2;\r\n var el = (_e$target2 = e == null ? void 0 : e.target) != null ? _e$target2 : document;\r\n if ($$1.fn.pStrength && typeof ew.MIN_PASSWORD_STRENGTH != \"undefined\") {\r\n $$1(el).find(\".ew-password-strength\").each(function () {\r\n var $this = $$1(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 = $$1(\"[id='\" + this.attr(\"data-password-strength\") + \"']\"),\r\n // Do not use #\r\n $pb = $pst.find(\".progress-bar\");\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 if (percentage < min * 0.25) {\r\n $pb.addClass(\"text-bg-danger\").removeClass(\"text-bg-warning text-bg-info text-bg-success\");\r\n } else if (percentage < min * 0.5) {\r\n $pb.addClass(\"text-bg-warning\").removeClass(\"text-bg-danger text-bg-info text-bg-success\");\r\n } else if (percentage < min * 0.75) {\r\n $pb.addClass(\"text-bg-primary\").removeClass(\"text-bg-danger text-bg-warning text-bg-success\");\r\n } else {\r\n $pb.addClass(\"text-bg-success\").removeClass(\"text-bg-danger text-bg-warning text-bg-info\");\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 $pst.width(this.outerWidth());\r\n }\r\n });\r\n });\r\n }\r\n if ($$1.fn.pGenerator) {\r\n $$1(el).find(\".ew-password-generator\").each(function () {\r\n var $this = $$1(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 $$1(\"#\" + this.attr(\"data-password-confirm\")).val(pwd);\r\n $$1(\"#\" + 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 /**\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 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 if ($$1.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 return url + (qs ? \"?\" + qs : \"\");\r\n }\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 function parseUrl(url) {\r\n var _pathname, _hash;\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 /**\r\n * Create URLSearchParams\r\n * @param {*} params - search parameters\r\n * @returns {URLSearchParams}\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 /**\r\n * Get URL search parameters\r\n * @param {string} url - URL\r\n * @returns {URLSearchParams}\r\n */\r\n function getSearchParams(url) {\r\n return parseUrl(url).searchParams;\r\n }\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 function getSearchParam(url, name) {\r\n return getSearchParams(url).get(name);\r\n }\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 function setSearchParams(url) {\r\n let obj = parseUrl(url);\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 obj.searchParams = mergeSearchParams(obj.searchParams, ...args);\r\n return buildUrl(obj);\r\n }\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 function mergeSearchParams() {\r\n let searchParams = new URLSearchParams();\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 for (const params of args) {\r\n if ($$1.isObject(params) || $$1.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 return searchParams;\r\n }\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 function setSearchParam(url, name, value) {\r\n return setSearchParams(url, {\r\n [name]: value\r\n });\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 function deleteSearchParam(url) {\r\n let obj = parseUrl(url);\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 names.forEach(name => obj.searchParams.delete(name));\r\n return buildUrl(obj);\r\n }\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 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 /**\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 function setLayout(url, value) {\r\n return url && url != \"#\" ? setSearchParams(url, {\r\n [ew.PAGE_LAYOUT]: String(value)\r\n }) : url;\r\n }\r\n\r\n // Sanitize URL\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 }\r\n\r\n // Set session timer\r\n function setSessionTimer() {\r\n let timeoutTime, timer, keepAliveTimer, counter;\r\n // Keep alive\r\n let keepAlive = () => {\r\n $$1.get(getApiUrl(ew.API_SESSION_ACTION), {\r\n \"rnd\": random()\r\n }).then(token => {\r\n if (token && $$1.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 setTimer();\r\n }\r\n });\r\n };\r\n // Reset timer\r\n let resetTimer = () => {\r\n var _timer;\r\n counter = ew.SESSION_TIMEOUT_COUNTDOWN;\r\n timeoutTime = ew.SESSION_TIMEOUT - ew.SESSION_TIMEOUT_COUNTDOWN;\r\n if (timeoutTime < 0) {\r\n // Timeout now\r\n timeoutTime = 0;\r\n counter = 0;\r\n }\r\n (_timer = timer) == null || _timer.cancel(); // Clear timer\r\n };\r\n // Redirect to TIMEOUT_URL\r\n let doTimeout = () => {\r\n resetTimer();\r\n window.location = sanitizeUrl(ew.TIMEOUT_URL + \"?expired=1\");\r\n };\r\n // Timeout\r\n let timeout = () => {\r\n var _keepAliveTimer;\r\n (_keepAliveTimer = keepAliveTimer) == null || _keepAliveTimer.cancel(); // Stop keep alive\r\n if (counter > 0) {\r\n let timerInterval,\r\n message = '' + ew.language.phrase(\"SessionWillExpire\") + '';\r\n if (message.includes(\"%m\") && message.includes(\"%s\")) {\r\n message = message.replace(\"%m\", '' + Math.floor(counter / 60) + '').replace(\"%s\", '' + counter % 60 + '');\r\n } else if (message.includes(\"%s\")) {\r\n message = message.replace(\"%s\", '' + counter + '');\r\n }\r\n Swal.fire({\r\n ...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 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 } else if (result.dismiss === Swal.DismissReason.timer) {\r\n // Timeout\r\n doTimeout();\r\n }\r\n });\r\n } else {\r\n doTimeout();\r\n }\r\n };\r\n // Set timer\r\n let setTimer = () => {\r\n var _ew$vars$login;\r\n if (ew.SESSION_TIMEOUT > 0 && window.location.pathname != ((_ew$vars$login = ew.vars.login) == null || (_ew$vars$login = _ew$vars$login.login) == null ? void 0 : _ew$vars$login.url)) {\r\n // Set session timeout except for login page\r\n resetTimer(); // Reset timer first\r\n timer = $$1.later(timeoutTime * 1000, null, timeout);\r\n }\r\n };\r\n if (ew.SESSION_KEEP_ALIVE_INTERVAL > 0 || ew.IS_LOGGEDIN && ew.IS_AUTOLOGIN) {\r\n // Keep alive\r\n let keepAliveInterval = Math.max(ew.SESSION_KEEP_ALIVE_INTERVAL || ew.SESSION_TIMEOUT - ew.SESSION_TIMEOUT_COUNTDOWN, ew.MIN_SESSION_KEEP_ALIVE_INTERVAL);\r\n keepAliveTimer = $$1.later(keepAliveInterval * 1000, null, keepAlive, null, true); // Periodic\r\n } else {\r\n setTimer();\r\n }\r\n }\r\n\r\n // Init export links\r\n function initExportLinks(e) {\r\n var _e$target3;\r\n let $el = $$1((_e$target3 = e == null ? void 0 : e.target) != null ? _e$target3 : document);\r\n if (e != null && e.target && !$el.find(\"a.ew-export-link[href]\")[0])\r\n // Export links not found\r\n $el = $el.closest(\".content\"); // For refresh\r\n $el.find(\"a.ew-export-link[href]:not(.ew-email):not(.ew-print):not(.ew-xml)\").off(\"click\").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 }\r\n\r\n // Init multi-select checkboxes\r\n function initMultiSelectCheckboxes(e) {\r\n var _e$target4;\r\n var el = (_e$target4 = e == null ? void 0 : e.target) != null ? _e$target4 : document,\r\n $el = $$1(el),\r\n $cbs = $el.find(\"input[type=checkbox].ew-multi-select\");\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 $$1(\"input[type=checkbox]#\" + id).prop(\"checked\", len == cnt).prop(\"indeterminate\", len != cnt && len != 0);\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 }\r\n\r\n // Get error from response\r\n function getError(result) {\r\n var _result$error, _result$error2;\r\n return result && (((_result$error = result.error) == null ? void 0 : _result$error.description) || ((_result$error2 = result.error) == null ? void 0 : _result$error2.message) || $$1.isString(result.error) && result.error || result.failureMessage ||\r\n // Check this first\r\n result.success === false && result.message || null);\r\n }\r\n\r\n // Download file\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 data = mergeSearchParams(data, [[ew.TOKEN_NAME_KEY, ew.TOKEN_NAME], [ew.ANTIFORGERY_TOKEN_KEY, ew.ANTIFORGERY_TOKEN]]);\r\n return swal.fire({\r\n ...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 _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 if (ct != null && ct.includes(\"json\")) {\r\n var _getError;\r\n let result = await response.json(),\r\n error = (_getError = getError(result)) != null ? _getError : ew.language.phrase(\"FailedToExport\");\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 }\r\n\r\n // Lazy load images\r\n function lazyLoad(e) {\r\n var _e$target5;\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 }\r\n\r\n // Update select2 dropdown position\r\n function updateDropdownPosition() {\r\n var select = $$1(\".select2-container--open\").prev(\".ew-select\").data(\"select2\");\r\n if (select) {\r\n select.dropdown._positionDropdown();\r\n select.dropdown._resizeDropdown();\r\n }\r\n }\r\n\r\n // Colorboxes\r\n function initLightboxes(e) {\r\n var _e$target6;\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 $$1(el).find(\".ew-lightbox\").each(function () {\r\n var $this = $$1(this);\r\n $this.colorbox(Object.assign({\r\n rel: $this.data(\"rel\")\r\n }, settings));\r\n });\r\n }\r\n\r\n // PDFObjects\r\n function initPdfObjects(e) {\r\n var _e$target7;\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 $$1(el).find(\".ew-pdfobject\").not(\":has(.pdfobject)\").each(function () {\r\n // Not already embedded\r\n let $this = $$1(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 }\r\n\r\n // Tooltips and popovers\r\n function initTooltips(e) {\r\n var _e$target8;\r\n let el = (_e$target8 = e == null ? void 0 : e.target) != null ? _e$target8 : document,\r\n $el = $$1(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 = $$1(this);\r\n $this.tooltip({\r\n ...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 $el.find(\".ew-tooltip\").tooltip(ew.tooltipOptions);\r\n $el.find(\".ew-popover\").popover(ew.popoverOptions);\r\n $el.find(\".ew-tippy[data-title]\").each(function () {\r\n tippy(this, {\r\n content: this.dataset.title,\r\n ...ew.tippyOptions\r\n });\r\n });\r\n }\r\n\r\n // Parse JSON\r\n function parseJson(data) {\r\n if ($$1.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 return data;\r\n }\r\n\r\n // Change search operator\r\n function searchOperatorChange(el) {\r\n let $el = $$1(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 }\r\n\r\n // Init forms\r\n function initForms(e) {\r\n var _e$target9;\r\n let el = (_e$target9 = e == null ? void 0 : e.target) != null ? _e$target9 : document,\r\n ids = ew.forms.ids();\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 }\r\n\r\n // Is function\r\n function isFunction$2(x) {\r\n return typeof x === \"function\";\r\n }\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.3/utilities/colors/)\r\n * @returns {Promise}\r\n */\r\n function _alert(msg, cb, type) {\r\n let config = $$1.isObject(msg) ? msg : {};\r\n msg = $$1.isString(msg) ? msg : \"\";\r\n type = $$1.isString(cb) ? cb : type;\r\n config = $$1.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$2(cb) ? cb(result.isConfirmed) : result);\r\n }\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 function _prompt(cfg, cb) {\r\n var _config, _config$inputValidato;\r\n let config = $$1.isObject(cfg) ? cfg : {};\r\n config = $$1.extend(true, {}, ew.sweetAlertSettings, {\r\n html: $$1.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 if (config.input)\r\n // 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$2(cb) ? cb(result.value) : result);\r\n }\r\n\r\n // Toast\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 = $$1(\"#toastsContainer\" + position[0].toUpperCase() + position.substring(1));\r\n return $container.children().first();\r\n }\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 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 text-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 }\r\n\r\n // Get form.ew-form or div.ew-form HTML element\r\n function getForm(el) {\r\n if (el instanceof Form) return el.$element[0];\r\n var $el = $$1(el),\r\n $f = $el.closest(\".ew-form\");\r\n if (!$f[0])\r\n // Element not inside form\r\n $f = $el.closest(\".ew-grid, .ew-multi-column-grid, .modal\").find(\".ew-form\");\r\n return $f[0];\r\n }\r\n\r\n // Check form data\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 = $$1(form).find(selector).filter(\":enabled\").get();\r\n for (var i = 0, len = els.length; i < len; i++) {\r\n var el = els[i];\r\n if (/^(z|w)_/.test(el.name)) {\r\n if (/^IS/.test($$1(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 (!!$$1(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 return false;\r\n }\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 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 /**\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 function updateOptions(obj, parentId, async, change) {\r\n var _obj, _batch$send;\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 if (!f) return;\r\n var frm = this.htmlForm ? this : forms.get(f.id); // Get Form object\r\n if (!frm) return;\r\n if (this.form && $$1.isUndefined(obj))\r\n // Target unspecified => update child fields\r\n obj = forms.get(this).getList(this).childFields.slice(); // Clone\r\n else if ($$1.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 if (Array.isArray(obj) && $$1.isString(obj[0])) {\r\n // Array of id\r\n var els = [];\r\n for (var i = 0, len = obj.length; i < len; i++) {\r\n var ar = obj[i].split(\" \");\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 var el = getElements(obj[i], f),\r\n names = [];\r\n if (isTextbox(el) || isFilter(el))\r\n // Search text box or filter\r\n continue;\r\n els.push(el);\r\n if (ar.length == 2 && Array.isArray(el)) {\r\n // Check if id is \"tblVar fldVar\" and multiple inputs\r\n var $el = $$1(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 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])\r\n // AutoFill\r\n batch.add(autoFill.bind(null, self));\r\n } else {\r\n if (isTextbox(obj) || isFilter(obj))\r\n // Search text box or filter\r\n return;\r\n batch.add(_updateOptions.bind(self, obj, parentId, async, change));\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 /**\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 function _updateOptions(obj, parentId, async, change) {\r\n if (change === void 0) {\r\n change = true;\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 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 = $$1(obj).data(\"updating\", true);\r\n if ($obj.data(\"hidden\"))\r\n // Skip data-hidden field, e.g. detail key\r\n return;\r\n if ($$1.isUndefined(parentId)) {\r\n // Parent IDs not specified, use default\r\n parentId = list.parentFields.slice(); // Clone\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)\r\n // 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 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 ($$1.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 if (!isAutoSuggest(obj))\r\n // Do not clear Auto-Suggest\r\n clearOptions(obj);\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 || obj.render(); // Selection list\r\n selectOption(obj, ar, change);\r\n if (change) {\r\n if (!obj.options && obj.length) $obj.first().triggerHandler(\"click\");\r\n // else\r\n // $obj.first().trigger(\"change\");\r\n }\r\n };\r\n if ($$1.isUndefined(async))\r\n // Async not specified, use default\r\n async = list.ajax;\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 if (!$$1.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 _updateSibling();\r\n $obj.first().trigger(\"updated\", [{\r\n target: obj\r\n }]); // Object \"updated\" event fired after the object is updated\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 }, getUserParams(\"#p_\" + id, fo)); // Add user parameters\r\n if (isAutoSuggest(obj) && self.htmlForm)\r\n // 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) ||\r\n // Not or native \r\n isModalLookup(obj))\r\n // Lookup\r\n data[\"v0\"] = ar[0] ? obj.multiple ? ar.join(ew.MULTIPLE_OPTION_SEPARATOR) : ar[0] : random(); // Filter by the current value\r\n for (var i = 0, cnt = arp.length; i < cnt; i++)\r\n // Filter by parent fields\r\n data[\"v\" + (i + 1)] = arp[i].join(ew.MULTIPLE_OPTION_SEPARATOR);\r\n obj.showLoading == null || obj.showLoading(); // selection-list\r\n return $$1.ajax(getApiUrl(ew.API_LOOKUP_ACTION), {\r\n method: \"POST\",\r\n dataType: \"json\",\r\n data: data,\r\n async: async,\r\n processData: false,\r\n success: result => {\r\n let error = getError(result);\r\n if (error) {\r\n _alert(error);\r\n return;\r\n }\r\n let ds = result.records || [];\r\n addOpt(ds);\r\n _updateSibling();\r\n $obj.first().trigger(\"updated\", [Object.assign({}, result, {\r\n target: obj\r\n })]); // Object \"updated\" event fired after the object is updated\r\n return ds;\r\n },\r\n error: (jqXHR, textStatus, errorThrown) => _alert(errorThrown),\r\n complete: () => $obj.data(\"updating\", false)\r\n });\r\n }\r\n }\r\n\r\n // Get user parameters from id\r\n function getUserParams(id, root) {\r\n var id = id.replace(/\\[\\]$/, \"\"),\r\n o = {};\r\n var root = !$$1.isString(root) ? root : /^#/.test(root) ? root : \"#\" + root;\r\n var $els = root ? $$1(root).find(id) : $$1(id);\r\n var val = $els.val();\r\n if (val) {\r\n var params = new URLSearchParams(val);\r\n params.forEach(function (value, key) {\r\n o[key] = value;\r\n });\r\n }\r\n return o;\r\n }\r\n\r\n // Get query builder filter input HTML\r\n function getQueryBuilderFilterInput() {\r\n return function (rule, name) {\r\n var _document$getElementB, _span$innerHTML$repla;\r\n let tblVar = this.status.id.replace(/_query_builder$/, \"\"),\r\n // \"this\" is QueryBuilder\r\n fldVar = rule.filter.id,\r\n tmplId = \"tpx_\" + tblVar + \"_\" + fldVar,\r\n span = (_document$getElementB = document.getElementById(tmplId)) == null || (_document$getElementB = _document$getElementB.content) == null ? void 0 : _document$getElementB.cloneNode(true).querySelector(\".ew-search-field\"),\r\n html = (_span$innerHTML$repla = span == null ? void 0 : span.innerHTML.replace(/\\binvalid-feedback\\b/, ew.queryBuilderErrorClass).replace(new RegExp(\"(data-field=\\\")?(\\\\b|_)x_\" + fldVar + \"(\\\\[\\\\]|\\\\b)\", \"g\"), ($0, $1, $2) => $1 ? $0 : $2 + name)) != null ? _span$innerHTML$repla : \"\"; // Keep \"data-field\" attribute\r\n return \"\" + html + \"\";\r\n };\r\n }\r\n\r\n // Get query builder value setter\r\n function getQueryBuilderValueSetter() {\r\n return function (rule, value) {\r\n let input = rule.$el.find(\".rule-value-container\").find(\"select, selection-list, input[name^=sv_], input[data-field]\")[0],\r\n values = Array.isArray(value) ? value : $$1.isValue(value) ? [value] : [];\r\n if (input != null && input.matches(\"select, selection-list\")) {\r\n // Selection list\r\n let form = forms.get(input);\r\n values.forEach(val => newOption(input, {\r\n lf: val\r\n }, form, true));\r\n form.updateList(input, undefined, undefined, true); // Update immediately\r\n } else {\r\n ew.selectOption(input, values);\r\n }\r\n return null;\r\n };\r\n }\r\n\r\n // Get query builder filter validation object\r\n function getQueryBuilderFilterValidation(validators) {\r\n return {\r\n callback: function (value, rule) {\r\n // value not used\r\n let $value = rule.$el.find(\".rule-value-container\"),\r\n errors = 0;\r\n for (let i = 0; i < rule.operator.nb_inputs; i++) {\r\n $value.find(\"[name='\" + rule.id + '_value_' + i + \"']\").each(function () {\r\n let $this = $$1(this),\r\n $invalid = $this.next(\".\" + ew.queryBuilderErrorClass).empty();\r\n validators == null || validators.forEach == null || validators.forEach(validator => {\r\n let err = validator(this);\r\n if ($$1.isObject(err)) {\r\n errors++;\r\n $invalid.append(\"\" + Object.values(err)[0] + \"\");\r\n }\r\n });\r\n if ($invalid.html()) $this.addClass(\"is-invalid\").one(\"click\", () => $this.removeClass(\"is-invalid\"));\r\n });\r\n }\r\n return errors ? \"\" : true; // Return error as empty string (errors already set in $invalid)\r\n }\r\n };\r\n }\r\n\r\n // Apply client side template to a DIV\r\n function applyTemplate(divId, tmplId, classId, exportType, tblVar, data, isModal) {\r\n let args = {\r\n data: data || {},\r\n id: divId,\r\n template: tmplId,\r\n class: classId,\r\n export: exportType,\r\n enabled: true\r\n };\r\n $document$1.trigger(\"rendertemplate\", [args]);\r\n if (args.enabled) {\r\n var _parent$querySelector;\r\n let parent = isModal ? document.querySelector(\"#ew-modal-dialog.show\") : document.body,\r\n // Parent (Modal dialog or document)\r\n template = parent == null || (_parent$querySelector = parent.querySelector(\"#\" + tmplId)) == null ? void 0 : _parent$querySelector.content;\r\n if (!template) return;\r\n template.querySelectorAll(\".ew-slot\").forEach(el => {\r\n let id = el.name || el.id,\r\n subtmpl = parent.querySelector(\"#\" + id); // Find in parent in case Custom Template in modal dialog\r\n if (subtmpl != null && subtmpl.content) {\r\n if (el.dataset.rowspan > 1) Array.prototype.slice.call(subtmpl.content.childNodes).forEach(node => node.rowSpan = el.dataset.rowspan);\r\n el.replaceWith(subtmpl.content.cloneNode(true));\r\n } else {\r\n el.remove();\r\n }\r\n });\r\n if ($$1.views) {\r\n let textContent = template.textContent,\r\n hasTag = textContent.includes(\"{{\") && textContent.includes(\"}}\");\r\n if (!hasTag) {\r\n let selector = ew.jsRenderAttributes.map(attr => \"[\" + attr + \"*='{{'][\" + attr + \"*='}}']\").join(\",\");\r\n hasTag = template.querySelector(selector);\r\n }\r\n if (hasTag) {\r\n // Includes JsRender template\r\n let scripts = Array.prototype.slice.call(template.querySelectorAll(\"script\")); // Extract scripts\r\n scripts.forEach(item => item.remove());\r\n let div = document.createElement(\"div\");\r\n div.appendChild(template);\r\n let html = div.innerHTML.replace(/{{([^}]+)}}/g, m => htmlDecode(m)),\r\n // HTML-decode comparison operators\r\n tmpl = $$1.templates(html);\r\n parent.querySelector(\"#\" + divId).innerHTML = tmpl.render(args.data, ew.jsRenderHelpers);\r\n scripts.forEach(item => document.body.appendChild(item)); // Add scripts\r\n } else {\r\n parent.querySelector(\"#\" + divId).appendChild(template);\r\n }\r\n } else {\r\n parent.querySelector(\"#\" + divId).appendChild(template);\r\n }\r\n }\r\n if (exportType && exportType != \"print\")\r\n // Export custom template with charts\r\n exportCustom(divId, exportType, tblVar); // Note: Use classId as fileName\r\n }\r\n\r\n // Export custom\r\n function exportCustom(divId, exportType, tblVar) {\r\n var _div$children$;\r\n let div = document.getElementById(divId);\r\n if ((_div$children$ = div.children[0]) != null && _div$children$.matches(\"div[id^=ct_]\"))\r\n // Custom template, remove first div tag\r\n div = div.children[0];\r\n let data = {\r\n customexport: exportType,\r\n data: div.innerHTML,\r\n [ew.TOKEN_NAME_KEY]: ew.TOKEN_NAME,\r\n [ew.ANTIFORGERY_TOKEN_KEY]: ew.ANTIFORGERY_TOKEN,\r\n ...getchartParams()\r\n };\r\n if (exportType == \"email\") exportEmail(tblVar, mergeSearchParams(currentUrl.searchParams, data)); // Merge data with email form data in current URL parameters\r\n else fileDownload(getApiUrl([ew.API_EXPORT_ACTION, exportType, tblVar]), data);\r\n }\r\n\r\n // Toggle group\r\n function toggleGroup(el) {\r\n let $el = $$1(el),\r\n $tr = $el.closest(\"tr\");\r\n if (!$tr.data(\"group\")) {\r\n // Toggle all\r\n $tr.closest(\"table\").find(\"tbody\").find(\".ew-rpt-grp-field-1 > .ew-group-toggle\").each(function () {\r\n toggleGroup(this);\r\n $el.toggleClass(\"ew-rpt-grp-hide\");\r\n });\r\n } else {\r\n let selector = \"tr\",\r\n level;\r\n for (let i = 1; i <= 6; i++) {\r\n let idx = i == 1 ? \"\" : \"-\" + i,\r\n data = $tr.data(\"group\" + idx);\r\n if ($$1.isValue(data)) {\r\n level = i;\r\n if (data != \"\") selector += \"[data-group\" + idx + \"='\" + String(data).replace(/'/g, \"\\\\'\") + \"']\";\r\n }\r\n }\r\n if ($el.hasClass(\"ew-rpt-grp-hide\")) {\r\n // Show\r\n $$1(selector).slice(1).removeClass(\"ew-rpt-grp-hide-\" + level);\r\n $el.removeClass(\"ew-rpt-grp-hide\");\r\n } else {\r\n // Hide\r\n $$1(selector).slice(1).addClass(\"ew-rpt-grp-hide-\" + level);\r\n $el.addClass(\"ew-rpt-grp-hide\");\r\n }\r\n }\r\n }\r\n\r\n // Check if boolean value is true\r\n function convertToBool(value) {\r\n return value && [\"1\", \"y\", \"t\", \"true\"].includes(String(value).toLowerCase());\r\n }\r\n\r\n // Check if element value changed\r\n function valueChanged(fobj, infix, fld, bool) {\r\n let el = getElement(\"x\" + infix + \"_\" + fld, fobj),\r\n oldEl = getElement(\"o\" + infix + \"_\" + fld, fobj),\r\n // Hidden element\r\n fnEl = getElement(\"fn_x\" + infix + \"_\" + fld, fobj); // Hidden element\r\n if ((el == null ? void 0 : el.type) == \"hidden\" && !oldEl)\r\n // For example, detail key\r\n return false;\r\n if (!oldEl && (!el || Array.isArray(el) && el.length == 0)) return false;\r\n if (oldEl && el) {\r\n if (bool) {\r\n if (convertToBool(getOptionValue(oldEl)) === convertToBool(getOptionValue(el))) return false;\r\n } else {\r\n let oldValue = getOptionValue(oldEl),\r\n newValue = fnEl ? getOptionValue(fnEl) : getOptionValue(el);\r\n if (oldValue == newValue) return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n // Set language\r\n function setLanguage(el) {\r\n let val = el.value || el.dataset.language;\r\n if (!val) return false;\r\n let currentUrl = new URL(window.location);\r\n currentUrl.searchParams.set(\"language\", val);\r\n window.location = sanitizeUrl(currentUrl.toString());\r\n return false;\r\n }\r\n\r\n // Set active user\r\n function setActiveUser(el) {\r\n let val = el.checked ? \"1\" : \"0\";\r\n let currentUrl = new URL(window.location);\r\n currentUrl.searchParams.set(\"activeuser\", val);\r\n window.location = sanitizeUrl(currentUrl.toString());\r\n return false;\r\n }\r\n\r\n /**\r\n * Submit action\r\n *\r\n * @param {MouseEvent} e - Mouse event\r\n * @param {Object} args - Arguments\r\n * @param {HTMLElement} args.f - HTML form (default is the form of the source element) (for backward compatibility only)\r\n * @param {string} args.url - URL to which the request is sent (default is current page) (for backward compatibility only)\r\n * @param {Object} args.key - Key as object (for single record only)\r\n * @param {string|Object} args.msg - Message or Swal config\r\n * @param {string} args.action - Custom action name\r\n * @param {string} args.select - \"single\"|\"s\" (single record) or \"multiple\"|\"m\" (multiple records, default)\r\n * @param {string} args.method - \"ajax\"|\"a\" (Ajax by HTTP POST) or \"post\"|\"p\" (HTTP POST by HTML form, default)\r\n * @param {Object} args.data - Object of user data that is sent to the server\r\n * @param {string|callback|Object} success - Function to be called if the request succeeds, or settings for jQuery.ajax() (for Ajax only)\r\n * @returns\r\n */\r\n function submitAction(e, args) {\r\n var _window$msg;\r\n let el = e.currentTarget,\r\n f = args.f || el.form || el.closest(\"form\"),\r\n $f = $$1(f),\r\n key = args.key,\r\n action = args.action,\r\n url = args.url || currentPage(),\r\n msg = args.msg,\r\n data = args.data,\r\n success = args.success,\r\n isPostBack = !args.method || sameText(args.method[0], \"p\"),\r\n isMultiple = !args.select && !args.key || args.select && sameText(args.select[0], \"m\");\r\n if ((isMultiple || isPostBack) && !f) {\r\n _alert(ew.language.phrase(\"NoHtmlForm\"));\r\n return false;\r\n }\r\n if (isMultiple && !keySelected(f)) {\r\n _alert(ew.language.phrase(\"NoRecordSelected\"));\r\n return false;\r\n }\r\n let _success = function (result) {\r\n if ($$1.isString(result)) {\r\n showMessage(result);\r\n } else if ($$1.isObject(result)) {\r\n // JSON\r\n let error = getError(result);\r\n if (error) _alert(error);else if ($$1.isString(result.successMessage)) _alert(result.successMessage, \"success\");\r\n if (result.disabled) el.disabled = true;\r\n }\r\n };\r\n let _append = function (name, value) {\r\n let $input = $f.find(\"input[type=hidden][name='\" + name + \"']\");\r\n if ($input[0])\r\n // Hidden tag exists\r\n $input.val(value); // Set value\r\n else\r\n // Hidden tag does not exist, add one\r\n $$1(\"\").attr({\r\n type: \"hidden\",\r\n name,\r\n value\r\n }).appendTo($f);\r\n };\r\n let _submit = function (value) {\r\n if (isPostBack && f) {\r\n // Post back by form\r\n if (action) {\r\n // Action\r\n _append(\"action\", action); // Set action\r\n }\r\n if (!$$1.isUndefined(value)) _append(\"actionvalue\", value); // Set action value\r\n if ($$1.isObject(data)) {\r\n // User data\r\n for (const [name, value] of Object.entries(data)) _append(name, value);\r\n }\r\n if (!isMultiple && $$1.isObject(key)) {\r\n // Key\r\n for (const [name, value] of Object.entries(key)) _append(name, value);\r\n }\r\n if (parseUrl(url).pathname != currentUrl.pathname)\r\n // Do not use refresh if post to another page\r\n $f.off(\"submit.ew\");\r\n $f.prop({\r\n action: url,\r\n method: \"post\"\r\n }).trigger(\"submit\");\r\n } else {\r\n // Ajax\r\n data = new URLSearchParams(data); // User data\r\n if (action) {\r\n // Action\r\n data.set(\"action\", action);\r\n data.set(\"ajax\", action);\r\n $f.find(\"#action\").remove(); // Remove action in form\r\n }\r\n if (!$$1.isUndefined(value)) data.set(\"actionvalue\", value); // User input value\r\n data = mergeSearchParams(data, $f.serialize()); // Form data including key_m[]\r\n if (!isMultiple && $$1.isObject(key))\r\n // Key\r\n data = mergeSearchParams(data, key);\r\n if (success && $$1.isString(success)) success = window[success];\r\n let settings = $$1.isObject(success) ? success : {};\r\n settings.data = data.toString();\r\n settings.method || (settings.method = \"POST\");\r\n settings.success || (settings.success = isFunction$2(success) ? success : _success);\r\n $$1.ajax(url, settings);\r\n }\r\n };\r\n msg = $$1.isString(msg) ? (_window$msg = window[msg]) != null ? _window$msg : msg : msg; // Get config object if available\r\n msg ? _prompt(msg).then(result => result.isDismissed || _submit(result.value)) : _submit();\r\n return false;\r\n }\r\n\r\n /**\r\n * Get charts parameters as object\r\n *\r\n * @returns string\r\n */\r\n function getchartParams() {\r\n let charts = Array.from(Object.entries(window.exportCharts)).map(_ref => {\r\n let [id, chart] = _ref;\r\n return {\r\n chartEngine: \"Chart.js\",\r\n streamType: \"base64\",\r\n stream: chart.toBase64Image(),\r\n fileName: id + \".png\"\r\n };\r\n });\r\n return charts.length ? {\r\n charts: JSON.stringify(charts)\r\n } : null;\r\n }\r\n\r\n /**\r\n * Export with charts, selected records and/or Custom Template (non-API)\r\n *\r\n * @param {MouseEvent|HTMLFormElement} args.evt - Event or HTML form\r\n * @param {string} args.url - Form action\r\n * @param {string} args.export - Export type\r\n * @param {boolean} args.custom - Use Custom Template\r\n * @param {boolean} args.exportSelected - Selected records only\r\n * @param {HTMLFormElement} args.emailForm - email form object\r\n * @returns false\r\n */\r\n async function _export(args) {\r\n let {\r\n evt,\r\n url,\r\n export: type,\r\n custom,\r\n exportSelected,\r\n emailForm\r\n } = args,\r\n f = evt.currentTarget.form;\r\n exportSelected && (exportSelected = f && !!f.querySelector(\"input[type=checkbox][name='key_m[]']\"));\r\n if (exportSelected && !keySelected(f)) {\r\n _alert(ew.language.phrase(\"NoRecordSelected\"));\r\n return false;\r\n }\r\n let $f = f ? $$1(f) : $$1('').appendTo($body),\r\n target = $f.attr(\"target\"),\r\n action = $f.attr(\"action\"),\r\n postParams = [[ew.TOKEN_NAME_KEY, ew.TOKEN_NAME], [ew.ANTIFORGERY_TOKEN_KEY, ew.ANTIFORGERY_TOKEN]];\r\n\r\n // Export data\r\n try {\r\n if (custom) {\r\n var _document$querySelect;\r\n // Use Custom Template (chart data to be retrieved later in iframe)\r\n document.body.style.cursor = \"wait\";\r\n let name = \"ew-export-frame\";\r\n url = setSearchParams(url, {\r\n export: type,\r\n custom: 1\r\n }, $$1(emailForm).serialize()); // Make sure parameters include \"export=type&custom=1\"\r\n (_document$querySelect = document.querySelector(\"iframe[name='\" + name + \"']\")) == null || _document$querySelect.remove();\r\n let $iframe = $$1(\"\").attr(\"name\", name).addClass(\"d-none\").appendTo($body);\r\n $f.attr({\r\n action: url,\r\n target: name\r\n }); // Pass all data including email form data from URL to the iframe by URL parameters\r\n postParams.forEach(_ref2 => {\r\n let [name, value] = _ref2;\r\n return $f.find(\"input[name=\\\"\" + name + \"\\\"]\").val(value)[0] || $$1(\"\").attr({\r\n type: \"hidden\",\r\n name,\r\n value\r\n }).appendTo($f);\r\n });\r\n $iframe.one(\"load\", () => document.body.style.cursor = \"default\").one(\"load\", () => $f.attr({\r\n action,\r\n target\r\n })); // Reset\r\n $f.trigger(\"submit\");\r\n } else {\r\n // No Custom Template\r\n url = setSearchParam(url, \"export\", type); // Make sure URL parameters include \"export=type\"\r\n if (type == \"print\") $f.attr(\"action\", url).trigger(\"submit\"); // Submit the form directly\r\n else fileDownload(url, mergeSearchParams($f.serialize(), getchartParams()));\r\n }\r\n } finally {\r\n f || $f.remove();\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Remove spaces\r\n * @param {string} value - Value\r\n * @returns {string}\r\n */\r\n function removeSpaces(value) {\r\n return /^(<(p|br)\\/?>( )?(<\\/p>)?)?$/i.test(value.replace(/\\s/g, \"\")) ? \"\" : value;\r\n }\r\n\r\n /**\r\n * Check if hidden text area (HTML editor)\r\n * @param {HTMLElement|jQuery} el - HTML element or jQuery object\r\n * @returns {boolean}\r\n */\r\n function isHiddenTextArea(el) {\r\n var $el = $$1(el);\r\n return $el.is(\":hidden\") && $el.data(\"editor\");\r\n }\r\n\r\n /**\r\n * Check if modal lookup\r\n * @param {HTMLElement} el - HTML element\r\n * @returns {boolean}\r\n */\r\n function isModalLookup(el) {\r\n var _el$dataset;\r\n return el == null || (_el$dataset = el.dataset) == null ? void 0 : _el$dataset.modalLookup;\r\n }\r\n\r\n /**\r\n * Check if filter\r\n * @param {HTMLElement} el - HTML element\r\n * @returns {boolean}\r\n */\r\n function isFilter(el) {\r\n var _el$dataset2;\r\n return el == null || (_el$dataset2 = el.dataset) == null ? void 0 : _el$dataset2.filter;\r\n }\r\n\r\n /**\r\n * Check if hidden textbox (Auto-Suggest)\r\n * @param {HTMLElement|jQuery} el - HTML element or jQuery object\r\n * @returns {boolean}\r\n */\r\n function isAutoSuggest(el) {\r\n var $el = $$1(el);\r\n return $el.is(\":hidden\") && $el.data(\"autosuggest\");\r\n }\r\n\r\n /**\r\n * Check if Select2\r\n * @param {HTMLElement} el - HTML element\r\n * @returns {boolean}\r\n */\r\n function isSelect2(el) {\r\n return el == null || el.matches == null ? void 0 : el.matches(\"select.select2-hidden-accessible\");\r\n }\r\n\r\n /**\r\n * Check if native selection list (select-one)\r\n * @param {HTMLElement} el - HTML element\r\n * @returns {boolean}\r\n */\r\n function isNativeSelectOne(el) {\r\n return (el == null || el.matches == null ? void 0 : el.matches(\"select:not(.select2-hidden-accessible)\")) && el.type == \"select-one\";\r\n }\r\n\r\n /**\r\n * Check if textbox\r\n * @param {HTMLElement} el - HTML element\r\n * @returns {boolean}\r\n */\r\n function isTextbox(el) {\r\n return (el == null || el.matches == null ? void 0 : el.matches(\"input:not([type=checkbox]):not([type=radio])\")) && !isAutoSuggest(el);\r\n }\r\n\r\n /**\r\n * Check if boolean checkbox\r\n * @param {HTMLElement} el - HTML element\r\n * @returns {boolean}\r\n */\r\n function isBooleanCheckbox(el) {\r\n return el == null || el.matches == null ? void 0 : el.matches(\"input[type=checkbox][data-boolean]\");\r\n }\r\n\r\n /**\r\n * Clear error message\r\n * @param {HTMLElement|HTMLElement[]|jQuery} el - HTML element(s) or jQuery\r\n */\r\n function clearError(el) {\r\n if (el.jquery) {\r\n // el is jQuery object\r\n let typ = el.attr(\"type\");\r\n el = typ == \"checkbox\" || typ == \"radio\" ? el.get() : el[0];\r\n }\r\n $$1(el).closest(fieldContainerSelector).find(\".invalid-feedback\").html(\"\");\r\n }\r\n\r\n /**\r\n * Show error message\r\n * @param {Form} frm Form object\r\n * @param {HTMLElement|HTMLElement[]|jQuery} el - HTML element(s) or jQuery\r\n * @param {string} msg - Error message\r\n * @param {boolean} focus - Set focus\r\n */\r\n function onError(frm, el, msg, focus) {\r\n if (el.jquery) {\r\n // el is jQuery object\r\n let typ = el.attr(\"type\");\r\n el = typ == \"checkbox\" || typ == \"radio\" ? el.get() : el[0];\r\n } else if (el instanceof Field) {\r\n // el is Field object\r\n el = el.element;\r\n }\r\n $$1(el).closest(fieldContainerSelector).find(\".invalid-feedback\").append(\"\" + msg + \"\");\r\n if (focus) setFocus(el);\r\n frm == null || frm.makeVisible(el);\r\n return false;\r\n }\r\n\r\n /**\r\n * Set focus\r\n * @param {HTMLElement|HTMLElement[]} obj - HTML element(s)\r\n * @param {Object} options - Focus options\r\n */\r\n function setFocus(obj, options) {\r\n if (!obj) return;\r\n var $obj = $$1(obj);\r\n if (isHidden($obj)) return;\r\n if (isHiddenTextArea(obj)) {\r\n // HTML editor\r\n return $obj.data(\"editor\").focus();\r\n } else if (!obj.options && obj.length) {\r\n // Radio/Checkbox list\r\n obj = $obj[0];\r\n } else if (isAutoSuggest(obj)) {\r\n // Auto-Suggest\r\n obj = obj.input;\r\n }\r\n obj.focus(options);\r\n }\r\n\r\n /**\r\n * Set invalid\r\n * @param {HTMLElement|HTMLElement[]} obj - HTML element(s)\r\n */\r\n function setInvalid(obj) {\r\n if (!obj) return;\r\n let $obj = $$1(obj);\r\n if (isHidden($obj)) return;\r\n if (!obj.options && obj.length)\r\n // Radio/Checkbox list\r\n obj = $obj[0];\r\n let $p = $obj.closest(fieldContainerSelector),\r\n reset = () => $p.find(\".is-invalid\").removeClass(\"is-invalid\");\r\n if (isAutoSuggest(obj)) {\r\n $p.find(\".ew-auto-suggest\").removeClass(\"is-valid\").addClass(\"is-invalid\").one(\"click keydown paste\", reset);\r\n } else if (isHiddenTextArea(obj)) {\r\n $obj.removeClass(\"is-valid\").addClass(\"is-invalid\");\r\n $obj.data(\"editor\").instance.once(\"change\", reset);\r\n } else if (isModalLookup(obj)) {\r\n $obj.removeClass(\"is-valid\").addClass(\"is-invalid\").one(\"select2:open\", reset);\r\n } else {\r\n if ([\"checkbox\", \"radio\"].includes(obj.type)) {\r\n $obj.removeClass(\"is-valid\").addClass(\"is-invalid\").one(\"click keydown\", reset);\r\n } else {\r\n let events = ew.MOBILE_DETECT.version(\"Safari\") && !ew.MOBILE_DETECT.version(\"Chrome\") ? \"change keydown paste\" : \"click keydown paste\"; // Use \"change\" event for Safari\r\n $obj.parent().one(events, reset);\r\n $obj.add($obj.closest(\".input-group\")).removeClass(\"is-valid\").addClass(\"is-invalid\");\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Set valid\r\n * @param {HTMLElement|HTMLElement[]} obj - HTML element(s)\r\n */\r\n function setValid(obj) {\r\n if (!obj) return;\r\n let $obj = $$1(obj);\r\n if (isHidden($obj)) return;\r\n if (!obj.options && obj.length)\r\n // Radio/Checkbox list\r\n obj = $obj[0];\r\n let $p = $obj.closest(fieldContainerSelector),\r\n reset = () => $p.find(\".is-valid\").removeClass(\"is-valid\");\r\n if (isAutoSuggest(obj)) {\r\n $p.find(\".ew-auto-suggest\").removeClass(\"is-invalid\").addClass(\"is-valid\").one(\"click keydown paste\", reset);\r\n } else if (isHiddenTextArea(obj)) {\r\n $obj.removeClass(\"is-invalid\").addClass(\"is-valid\");\r\n $obj.data(\"editor\").instance.once(\"change\", reset);\r\n } else if (isModalLookup(obj)) {\r\n $obj.removeClass(\"is-invalid\").addClass(\"is-valid\").one(\"select2:open\", reset);\r\n } else {\r\n if ([\"checkbox\", \"radio\"].includes(obj.type)) {\r\n $obj.removeClass(\"is-invalid\").addClass(\"is-valid\").one(\"click keydown\", reset);\r\n } else {\r\n let events = ew.MOBILE_DETECT.version(\"Safari\") && !ew.MOBILE_DETECT.version(\"Chrome\") ? \"change keydown paste\" : \"click keydown paste\"; // Use \"change\" event for Safari\r\n $obj.parent().one(events, reset);\r\n $obj.add($obj.closest(\".input-group\")).removeClass(\"is-invalid\").addClass(\"is-valid\");\r\n }\r\n }\r\n }\r\n\r\n // Check if object has value\r\n function hasValue(obj) {\r\n return getOptionValue(obj) != \"\";\r\n }\r\n\r\n // Check if object value is a masked password\r\n function isMaskedPassword(obj) {\r\n var val = $$1(obj).val();\r\n return val == null ? void 0 : val.match(/^\\*+$/);\r\n }\r\n\r\n // Sort by field\r\n function sort(e, dataset) {\r\n let {\r\n sortUrl: url,\r\n sortType: type,\r\n context,\r\n ajax\r\n } = dataset;\r\n if (e.shiftKey && !e.ctrlKey) url = setSearchParams(url, {\r\n cmd: \"resetsort\"\r\n });else if (type == 2 && e.ctrlKey) url = setSearchParams(url, {\r\n ctrl: \"1\"\r\n });\r\n if (convertToBool(ajax)) refresh(fetch(setLayout(url, false)), context);else window.location = sanitizeUrl(url);\r\n return false;\r\n }\r\n\r\n // Open table header filter by field\r\n function filter(e) {\r\n let data = e.currentTarget.dataset;\r\n $$1(\"select[data-select2-id='f\" + data.table + \"srch_\" + data.field + \"']\").select2(\"open\");\r\n }\r\n\r\n /**\r\n * Scroll an element into view\r\n */\r\n function scrollIntoView(el) {\r\n el == null || el.scrollIntoView();\r\n }\r\n\r\n /**\r\n * Inline actions\r\n *\r\n * @param {Object} args - Arguments\r\n * @param {MouseEvent} args.evt - Event\r\n * @param {HTMLFormElement} args.f - Form of List page\r\n * @param {string} args.url - URL\r\n * @param {string} args.ewAction - Inline/Grid action (inline/grid)\r\n * @param {string} args.action - Inline/Grid action type (insert/cancel/update/add/edit/copy/delete)\r\n * @returns false\r\n */\r\n async function inlineAction(args) {\r\n var _args$evt;\r\n let $el = $$1((_args$evt = args.evt) == null ? void 0 : _args$evt.currentTarget),\r\n $grid = $el.closest(\".ew-grid, .ew-multi-column-grid\");\r\n $el.tooltip(\"hide\");\r\n if (!$grid[0] && $el.is(\".dropdown-item\")) {\r\n let $btn = $$1(\"#\" + $el.closest(\".dropdown-menu\").attr(\"aria-labelledby\"));\r\n if ($btn[0]) {\r\n $el = $btn;\r\n $grid = $el.closest(\".ew-grid, .ew-multi-column-grid\");\r\n }\r\n }\r\n if (!$el[0]) return;\r\n let {\r\n url,\r\n ewAction,\r\n action\r\n } = args,\r\n $f = $grid.find(\"form\"),\r\n f = $f[0],\r\n $record = $el.closest(\"tr[data-rowindex], div[data-rowindex]\"),\r\n key = $record.data(\"key\"),\r\n curindex = $record.data(\"rowindex\"),\r\n $detached;\r\n if (action != \"add\" && (!$grid[0] || !f))\r\n // Allow add with no records => no grid\r\n return;\r\n\r\n // Fail\r\n let _fail = function (o) {\r\n !o.status || showToast(\"Server Error \" + o.status + \": \" + o.statusText);\r\n };\r\n\r\n // Always\r\n let _always = function () {\r\n document.body.style.cursor = \"default\";\r\n };\r\n\r\n // Success handler for delete\r\n let _deleted = async function (response) {\r\n if (!(response instanceof Response))\r\n // Inline actions only\r\n return;\r\n let ct = response.headers.get(\"Content-Type\");\r\n if (ct != null && ct.includes(\"json\")) {\r\n let result = await response.json();\r\n if (result != null && result.success) {\r\n $record.remove();\r\n showToast(ew.language.phrase(\"DeleteSuccess\"), \"success\");\r\n } else {\r\n showToast(getError(result) || ew.language.phrase(\"DeleteFailed\"));\r\n }\r\n } else {\r\n _alert(await response.text());\r\n }\r\n };\r\n\r\n // Disable inline buttons\r\n let _disableInlineButtons = () => $$1(\".ew-list-options, .ew-list-option-body\").find(\"[data-ew-action='inline'][data-action='add'],[data-ew-action='inline'][data-action='copy'],[data-ew-action='inline'][data-action='edit']\").addClass(\"disabled\");\r\n\r\n // Enable inline buttons\r\n let _enableInlineButtons = () => $$1(\".ew-list-options, .ew-list-option-body\").find(\"[data-ew-action='inline'][data-action='add'],[data-ew-action='inline'][data-action='copy'],[data-ew-action='inline'][data-action='edit']\").removeClass(\"disabled\");\r\n\r\n // Get table\r\n let _getTable = () => $grid.find(\".ew-grid-middle-panel .ew-table\")[0];\r\n\r\n // Update row index\r\n let _updateRowIndexes = tbl => {\r\n let j = 0;\r\n Array.from(tbl.rows).forEach(row => row.dataset.rowindex = row.dataset.rowindex === \"0\" ? \"0\" : String(j++)); // Update row index if not Inline-Add/Copy row\r\n };\r\n\r\n // Success handler for inline actions\r\n let _success = async function (response) {\r\n if (!(response instanceof Response))\r\n // Inline actions only\r\n return;\r\n let text = await response.clone().text(),\r\n $data = $$1(\"\" + text + \"\"),\r\n $row = $data.find(\"tr[data-rowindex=0], div[data-rowindex=0]\" + (key ? \", tr[data-key='\" + key + \"'], div[data-key='\" + key + \"']\" : \"\")).filter(\"[data-rowtype=2], [data-rowtype=3]\"),\r\n // Find Inline-Add first\r\n inline = $row.data(\"inline\"),\r\n rowtype = $row.data(\"rowtype\"),\r\n rowindex = inline && rowtype == 2 /* Inline-Add */ ? 0 : inline && rowtype == 3 /* Inline-Edit */ ? 1 : $row.data(\"rowindex\"),\r\n $els = $row.add($data.find(\"script[data-rowindex=\" + rowindex + \"]\")); // Add script for the row\r\n if ([\"add\", \"copy\", \"edit\"].includes(action) && !$els[0])\r\n // Edit row not found => Error\r\n return showToast(text);\r\n if ([\"add\", \"copy\"].includes(action)) {\r\n // Inline-Add/Copy\r\n if (document.querySelector(\"main.ew-no-record\") && $data.find(\"main:not(.ew-no-record)\")[0]) {\r\n // No existing record, new Inline-Add/Copy row found\r\n await refresh(Promise.resolve(response));\r\n } else {\r\n if ($row.is(\"TR\")) {\r\n // Table\r\n let tbl = _getTable();\r\n if (tbl.matches(\".ew-infinite-scroll-table\")) $$1(tbl.tBodies).last().append($els);else $$1(tbl.tBodies).last().prepend($els);\r\n _updateRowIndexes(tbl); // Update row index\r\n setupTable(tbl, true);\r\n } else {\r\n $grid.find(\".ew-multi-column-row\").append($els);\r\n }\r\n _disableInlineButtons();\r\n }\r\n ew.initPage($$1.Event({\r\n type: \"load.ew\",\r\n target: $grid[0]\r\n }));\r\n forms.get(f.id).tryFocus();\r\n scrollIntoView($grid.find(\"[data-rowtype=2]\")[0]);\r\n } else if (action == \"edit\") {\r\n // Inline-Edit\r\n $detached = $record.replaceWith($els); // Replace current row\r\n $grid.data(\"detached\", $detached); // Save the detached row\r\n if ($row.is(\"TR\"))\r\n // Table\r\n setupTable(_getTable(), true);\r\n _disableInlineButtons();\r\n ew.initPage($$1.Event({\r\n type: \"load.ew\",\r\n target: $grid[0]\r\n }));\r\n forms.get(f.id).tryFocus();\r\n scrollIntoView($grid.find(\"[data-rowtype=3]\")[0]);\r\n }\r\n };\r\n\r\n // Submit success handler for inline actions\r\n let _submitSuccess = async function (response) {\r\n if (!(response instanceof Response)) return;\r\n let ct = response.headers.get(\"Content-Type\");\r\n if (ct != null && ct.includes(\"json\")) {\r\n let result = await response.json(),\r\n error = getError(result);\r\n if (error) {\r\n showToast(error);\r\n return;\r\n }\r\n }\r\n if (response.headers.get(\"Infinite-Scroll\")) {\r\n // Infinite scroll\r\n let text = await response.text(),\r\n $data = $$1(\"\" + text + \"\"),\r\n $main = $data.find(\".main\"),\r\n $row;\r\n if ([\"insert\", \"update\"].includes(action)) {\r\n $row = $data.find(\"tr[data-rowindex][data-rowtype=\" + ew.ROWTYPE_VIEW + \"], div[data-rowindex][data-rowtype=\" + ew.ROWTYPE_VIEW + \"]\"); // Row(s) with ROWTYPE_VIEW\r\n if (!$row[0]) return; // Affected row(s) not found\r\n if (action == \"insert\")\r\n // Inline-Add/Copy\r\n $grid.find(\"tr[data-rowtype=\" + ew.ROWTYPE_ADD + \"], div[data-rowtype=\" + ew.ROWTYPE_ADD + \"]\").replaceWith($row[0]); // Replace add row\r\n else if (action == \"update\")\r\n // Inline-Edit/Update\r\n $row.get().forEach(row => $grid.find(\"tr[data-key='\" + row.dataset.key + \"'], div[data-key='\" + row.dataset.key + \"']\").replaceWith(row)); // Replace row(s) edited/updated\r\n } else if ([\"add\", \"edit\", \"multiedit\"].includes(action)) {\r\n // Grid-Add/Grid-Edit/Multi-Edit\r\n $row = $data.find(\"tr[data-rowindex][data-rowtype=\" + ew.ROWTYPE_VIEW + \"], div[data-rowindex][data-rowtype=\" + ew.ROWTYPE_VIEW + \"]\"); // Row(s) with ROWTYPE_VIEW\r\n if ([\"edit\", \"multiedit\"].includes(action))\r\n // Grid-Edit/Multi-Edit\r\n $row.get().forEach(row => $grid.find(\"tr[data-key='\" + row.dataset.key + \"'], div[data-rowtype='\" + row.dataset.key + \"']\").replaceWith(row));else if (action == \"add\")\r\n // Grid-Add\r\n $grid.find(\".ew-grid-middle-panel .ew-table > tbody:last\").append($row); // Append to bottom\r\n }\r\n let tbl = _getTable();\r\n _updateRowIndexes(tbl); // Update row index\r\n setupTable(tbl, true);\r\n showMessage({\r\n target: $data\r\n }); // Show message, if any\r\n ew.initPage($$1.Event({\r\n type: \"load.ew\",\r\n target: $main[0]\r\n }));\r\n } else {\r\n // Use Ajax actions\r\n await refresh(Promise.resolve(response));\r\n }\r\n let returnUrl = response.headers.get(\"Return-Url\"); // Check if return URL exists\r\n if (returnUrl && [\"inline\", \"modal\"].includes(args.ewAction) && !samePath(parseUrl(returnUrl).pathname, currentUrl.pathname)) $grid.find(\"[data-ew-action=modal][data-url='\" + returnUrl + \"'], [data-ew-action=inline][data-url='\" + returnUrl + \"']\").trigger(\"click\");\r\n };\r\n if (ewAction == \"inline\") {\r\n if (action == \"cancel\") {\r\n if (curindex == \"0\") {\r\n // Cancel Inline-Add/Copy\r\n $record.remove();\r\n } else {\r\n var _$grid$data;\r\n // Cancel Inline-Edit\r\n (_$grid$data = $grid.data(\"detached\")) == null || _$grid$data.replaceAll($record);\r\n }\r\n _enableInlineButtons();\r\n } else if (f && [\"insert\", \"update\"].includes(action)) {\r\n // Post form\r\n let frm = forms.get(f.id);\r\n if (await frm.canSubmit(args.evt)) {\r\n // Validate\r\n document.body.style.cursor = \"wait\";\r\n let body = setSearchParams($f.serialize(), {\r\n action\r\n }),\r\n // Set up action\r\n p = _fetch(setSearchParams(url, {\r\n rnd: random()\r\n }), {\r\n method: \"POST\",\r\n body\r\n }).catch(_fail).finally(() => {\r\n frm.enableForm();\r\n _always();\r\n });\r\n if (frm.submitWithFetch) {\r\n let args = {\r\n form: f,\r\n result: p\r\n },\r\n evt = $$1.Event(\"aftersubmit\", {\r\n originalEvent: args.evt\r\n });\r\n frm.trigger(evt, [args]);\r\n } else {\r\n p.then(_submitSuccess).finally(_enableInlineButtons);\r\n }\r\n }\r\n } else if (action == \"delete\") {\r\n // Inline-Delete\r\n if (!key) {\r\n // No key from the clicked row => Multi-Delete\r\n $record = $grid.find(\"input[type=checkbox][name='key_m[]']:checked\").closest(\"tr[data-rowindex], div[data-rowindex]\"); // Update $record\r\n if (!$record[0]) {\r\n _alert(ew.language.phrase(\"NoRecordSelected\"));\r\n return false;\r\n }\r\n }\r\n _prompt(ew.language.phrase(\"DeleteConfirm\"), result => {\r\n if (result) {\r\n document.body.style.cursor = \"wait\";\r\n let method = key ? \"GET\" : \"POST\",\r\n body = deleteSearchParam($f.serialize(), \"action\"),\r\n frm = forms.get(f.id),\r\n p = _fetch(setSearchParams(url, {\r\n action: \"delete\",\r\n rnd: random()\r\n }), {\r\n method,\r\n body\r\n }).catch(_fail).finally(() => {\r\n frm.enableForm();\r\n _always();\r\n });\r\n if (frm.submitWithFetch) {\r\n let args = {\r\n form: f,\r\n result: p\r\n },\r\n evt = $$1.Event(\"aftersubmit\", {\r\n originalEvent: args.evt\r\n });\r\n frm.trigger(evt, [args]);\r\n } else {\r\n p.then(_deleted);\r\n }\r\n }\r\n });\r\n } else {\r\n document.body.style.cursor = \"wait\";\r\n _fetch(setSearchParams(url, {\r\n rnd: random()\r\n })).then(_success).catch(_fail).finally(_always);\r\n }\r\n } else if (ewAction == \"grid\" || ewAction == \"modal\") {\r\n // Grid-Add/Edit, Modal-Add/Copy/Edit/Update\r\n if ((ewAction == \"grid\" && action == \"edit\" || ewAction == \"modal\" && [\"multiedit\", \"update\"].includes(action)) && !keySelected(f)) {\r\n // Grid-Edit and Multi-Edit/Update\r\n _alert(ew.language.phrase(\"NoRecordSelected\"));\r\n return false;\r\n }\r\n ew.modalDialogShow({\r\n ...args,\r\n callback: _submitSuccess\r\n });\r\n }\r\n return false;\r\n }\r\n\r\n // Confirm inline-delete\r\n function confirmDelete(el) {\r\n clickDelete(el);\r\n _prompt(ew.language.phrase(\"DeleteConfirm\"), result => {\r\n if (result) {\r\n if (el.dataset.json && el.href)\r\n // Handle JSON response\r\n ew.modalDialogShow({\r\n url: setSearchParams(el.href, {\r\n action: \"delete\"\r\n }),\r\n lnk: el,\r\n json: true,\r\n callback: true\r\n });else if (el.href) window.location = sanitizeUrl(setSearchParams(el.href, {\r\n action: \"delete\"\r\n }));else clearDelete(el);\r\n }\r\n });\r\n return false;\r\n }\r\n\r\n // Check if any key selected // PHP\r\n function keySelected(f) {\r\n return !!(f != null && f.querySelector(\"input[type=checkbox][name='key_m[]']:checked\"));\r\n }\r\n\r\n // Select all keys\r\n function selectAllKeys(cb) {\r\n selectAll(cb);\r\n let tbl = cb == null ? void 0 : cb.closest(\".ew-table\");\r\n if (!tbl) return;\r\n $$1(tbl.tBodies).each(function () {\r\n $$1(this.rows).each(function () {\r\n let $r = $$1(this);\r\n if ($r.is(\":not(.ew-template):not(.ew-table-preview-row)\")) $r.toggleClass(\"table-active ew-table-selected-row\", cb.checked).triggerHandler(\"change\");\r\n });\r\n });\r\n }\r\n\r\n // Select all related checkboxes in the form\r\n function selectAll(cb) {\r\n if (!(cb != null && cb.form)) return;\r\n $$1(cb.form.elements).filter(\"input[type=checkbox][name^=\" + cb.name + \"_], [type=checkbox][name=\" + cb.name + \"]\").not(cb).not(\":disabled\").prop(\"checked\", cb.checked);\r\n }\r\n\r\n // Update selected checkbox\r\n function updateSelected(f) {\r\n return !!(f != null && f.querySelector(\"input[type=checkbox][name^=u_]:checked,input[type=hidden][name^=u_][value='1']\"));\r\n }\r\n\r\n // Clear selected rows color\r\n function clearSelected(tbl) {\r\n let rowIndexes = $$1(tbl).find(\"input[type=checkbox][name='key_m[]']:checked\").closest(\"[data-rowindex]\").map((i, r) => r.dataset.rowindex).get();\r\n $$1(tbl == null ? void 0 : tbl.rows).filter((i, r) => r.classList.contains(\"table-active\") && !rowIndexes.includes(r.dataset.rowindex)).removeClass(\"table-active ew-table-selected-row\").triggerHandler(\"change\");\r\n }\r\n\r\n // Clear all row delete status\r\n function clearDelete(el) {\r\n let tbl = el == null ? void 0 : el.closest(\".ew-table\");\r\n if (!tbl) return;\r\n let $tr = $$1(el).closest(\".ew-table > tbody > tr\");\r\n $tr.siblings(\"[data-rowindex='\" + $tr.data(\"rowindex\") + \"']\").addBack().removeClass(\"table-active\").triggerHandler(\"change\");\r\n }\r\n\r\n // Click single delete link\r\n function clickDelete(el) {\r\n let tbl = el == null ? void 0 : el.closest(\".ew-table\");\r\n if (!tbl) return;\r\n clearSelected(tbl);\r\n let $tr = $$1(el).closest(\".ew-table > tbody > tr\");\r\n $tr.siblings(\"[data-rowindex='\" + $tr.data(\"rowindex\") + \"']\").addBack().addClass(\"table-active\").triggerHandler(\"change\");\r\n }\r\n\r\n // Select a row\r\n function selectKey(e) {\r\n let chk = e.target,\r\n tbl = chk == null ? void 0 : chk.closest(\".ew-table\");\r\n if (!tbl) return;\r\n clearSelected(tbl);\r\n let $tr = $$1(chk).closest(\".ew-table > tbody > tr\");\r\n $tr.siblings(\"[data-rowindex='\" + $tr.data(\"rowindex\") + \"']\").addBack().each(function () {\r\n $$1(this).toggleClass(\"table-active ew-table-selected-row\", chk.checked).triggerHandler(\"change\");\r\n });\r\n e.stopPropagation();\r\n }\r\n\r\n /**\r\n * Setup table\r\n *\r\n * @param {number} [index=undefined] Index\r\n * @param {HTMLTableElement} tbl HTML table element\r\n * @param {boolean} [force=undefined] Force setup\r\n * @returns\r\n */\r\n function setupTable() {\r\n let tbl, force;\r\n if ($$1.isNumber(arguments[0])) {\r\n tbl = arguments[1];\r\n } else if (arguments[0] instanceof HTMLTableElement) {\r\n tbl = arguments[0];\r\n force = arguments[1];\r\n }\r\n let $tbl = $$1(tbl),\r\n $rows = $$1(tbl.rows);\r\n if (!tbl || !tbl.rows || !force && tbl.dataset.isset || tbl.tBodies.length == 0) return;\r\n // Set selected row color\r\n let click = function (e) {\r\n let $this = $$1(this),\r\n tbl = this.closest(\".ew-table\"),\r\n $target = $$1(e.target);\r\n if (!tbl || $target.hasClass(\"btn\") || $target.hasClass(\"ew-preview-btn\") || $target.is(\":input\")) return;\r\n clearSelected(tbl); // Clear all other selected rows\r\n $this.siblings(\"[data-rowindex='\" + $this.data(\"rowindex\") + \"']\").addBack().toggleClass(\"table-active\").triggerHandler(\"change\");\r\n };\r\n let n = $rows.filter(\"[data-rowindex=1]\").length || $rows.filter(\"[data-rowindex=0]\").length || 1,\r\n // Alternate color every n rows\r\n rows = $rows.filter(\":not(.ew-template)\").each(function () {\r\n $$1(this.cells).removeClass(\"ew-table-last-row\").last().addClass(\"ew-table-last-col\"); // Cell of last column\r\n }).get();\r\n if (rows.length >= n) {\r\n let div = $tbl.parentsUntil(\".ew-grid\", \".\" + ew.RESPONSIVE_TABLE_CLASS)[0];\r\n rows[rows.length - 1].classList.add(\"border-bottom-0\"); // Last row\r\n rows.splice(n * -1).forEach((row, i) => Array.from(row.cells).filter(cell => cell.rowSpan == i + 1) // Cell of last row\r\n .forEach(cell => {\r\n cell.classList.add(\"ew-table-last-row\");\r\n cell.classList.toggle(\"ew-table-border-bottom\", (div == null ? void 0 : div.clientHeight) > tbl.offsetHeight);\r\n }));\r\n }\r\n let form = tbl.closest(\"form\"),\r\n attach = form && $$1(form.elements).filter(\"input#action:not([value^=grid])\").length > 0;\r\n $$1(tbl.tBodies[tbl.tBodies.length - 1].rows) // Use last TBODY (avoid Opera bug)\r\n .filter(\":not(.ew-template):not(.ew-table-preview-row)\").each(function () {\r\n let $r = $$1(this);\r\n if (attach && !$r.data(\"isset\")) $r.on(\"click\", click).data(\"isset\", true);\r\n });\r\n setupGrid(tbl.closest(\".ew-grid\"), force);\r\n tbl.dataset.isset = \"true\";\r\n }\r\n\r\n // Setup grid\r\n function setupGrid(grid, force) {\r\n let $grid = $$1(grid);\r\n if (!grid || !force && grid.dataset.isset) return;\r\n let rowcnt = $grid.find(\"table.ew-table > tbody\").first().children(\"tr:not(.ew-table-preview-row, .ew-template)\").length;\r\n if (rowcnt == 0 && !grid.querySelector(\".ew-grid-upper-panel, .ew-grid-lower-panel\")) $grid.hide();\r\n if ($grid.find(\".ew-grid-middle-panel:visible\").hasClass(ew.RESPONSIVE_TABLE_CLASS) && $grid.width() > $$1(\".content\").width()) {\r\n $grid.addClass(\"d-flex\");\r\n $grid.closest(\".ew-detail-pages\").addClass(\"d-block\");\r\n $grid.closest(\".ew-form\").addClass(\"w-100\");\r\n }\r\n if ($grid.find(\".ew-grid-middle-panel:visible\") && (!grid.querySelector(\".ew-grid-upper-panel\") || $grid.find(\".ew-grid-upper-panel:hidden\")[0])) {\r\n let $panel = $grid.find(\".ew-grid-middle-panel:not(.overflow-y-auto):visible\").addClass(\"rounded-top\"),\r\n $cells = $panel.children(\".ew-table:not(.table-head-fixed):visible\").first().children(\"thead:visible\").first().children(\"tr:visible\").first().children(\"th:visible\");\r\n $cells.first().addClass(\"rounded-top-left\");\r\n $cells.last().addClass(\"rounded-top-right\");\r\n }\r\n if ($grid.find(\".ew-grid-middle-panel:visible\") && (!grid.querySelector(\".ew-grid-lower-panel\") || $grid.find(\".ew-grid-lower-panel:hidden\")[0])) {\r\n let $panel = $grid.find(\".ew-grid-middle-panel:not(.overflow-y-auto):visible\").addClass(\"rounded-bottom\"),\r\n $cells = $panel.children(\".ew-table:not(.table-head-fixed):visible\").last().children(\"tbody:visible\").last().children(\"tr:visible\").last().children(\"td:visible\");\r\n $cells.first().addClass(\"rounded-bottom-left\");\r\n $cells.last().addClass(\"rounded-bottom-right\");\r\n }\r\n grid.dataset.isset = \"true\";\r\n }\r\n\r\n // Add a row to grid\r\n function addGridRow(el) {\r\n var _bootstrap$Tooltip$ge2;\r\n let grid = el == null ? void 0 : el.closest(\".ew-grid\"),\r\n $grid = $$1(grid),\r\n $tbl = $grid.find(\"table.ew-table\").last(),\r\n $p = $tbl.parent(\"div\"),\r\n $tpl = $tbl.find(\"tr.ew-template\");\r\n if (!el || !grid || !$tbl[0] || !$tpl[0]) return false;\r\n let $lastrow = $$1($tbl[0].rows).last();\r\n $tbl.find(\"td.ew-table-last-row\").removeClass(\"ew-table-last-row\");\r\n let $row = $tpl.clone(true, true).removeClass(\"ew-template\"),\r\n form = grid.querySelector(\"div.ew-form[id^=f][id$=grid]\") || grid.querySelector(\"form.ew-form[id^=f][id$=list]\") || grid.querySelector(\"form.ew-form[id^=f][id$=grid]\"),\r\n $form = $$1(form),\r\n suffix = $form.is(\"div\") ? \"_\" + form.id : \"\",\r\n $keycnt = $form.find(\"#\" + ew.FORM_KEY_COUNT_NAME + suffix),\r\n keycnt = parseInt($keycnt.val(), 10) + 1,\r\n name = ew.FORM_ROW_ACTION_NAME.replace(/^k_/, \"k\" + keycnt + \"_\") + suffix,\r\n // name=\"k_action\"\r\n $els = $tpl.find(\"script:contains('$rowindex$')\").add(\"tr.ew-template + script[data-rowindex='$rowindex$']\"); // Get scripts with rowindex\r\n $row.attr({\r\n \"id\": \"r\" + keycnt + $row.attr(\"id\").substring(2),\r\n \"data-rowindex\": keycnt\r\n });\r\n $row.children(\"td\").each(function () {\r\n $$1(this).find(\"*\").each(function () {\r\n $$1.each(this.attributes, function (i, attr) {\r\n attr.value = attr.value.replace(/\\$rowindex\\$/g, keycnt); // Replace row index\r\n });\r\n });\r\n });\r\n let $btn = $row.find(\".ew-icon\").closest(\"a, button\");\r\n (_bootstrap$Tooltip$ge2 = bootstrap.Tooltip.getInstance($btn[0])) == null || _bootstrap$Tooltip$ge2.dispose();\r\n $btn.tooltip({\r\n ...ew.tooltipOptions,\r\n container: \"body\",\r\n trigger: \"hover\"\r\n });\r\n $keycnt.val(keycnt).after($$1(\"\").attr({\r\n type: \"hidden\",\r\n id: name,\r\n name: name,\r\n value: \"insert\"\r\n }));\r\n $lastrow.after($row);\r\n $els.get().forEach(el => addScript(el.text.replace(/\\$rowindex\\$/g, keycnt)));\r\n let frm = $form.data(\"form\");\r\n frm == null || frm.initEditors();\r\n frm == null || frm.initUpload();\r\n setupTable($tbl[0], true);\r\n $p.scrollTop($p[0].scrollHeight);\r\n $tbl.trigger(\"rowadded\", [keycnt]);\r\n return false;\r\n }\r\n\r\n // Delete a row from grid\r\n function deleteGridRow(el, infix) {\r\n var _bootstrap$Tooltip$ge3;\r\n (_bootstrap$Tooltip$ge3 = bootstrap.Tooltip.getInstance(el)) == null || _bootstrap$Tooltip$ge3.dispose();\r\n let grid = el.closest(\".ew-grid, .ew-multi-column-grid\"),\r\n row = el.closest(\"tr, div[data-rowindex]\"),\r\n tbl = row == null ? void 0 : row.closest(\".ew-table\"),\r\n rowidx = parseInt(row == null ? void 0 : row.dataset.rowindex, 10),\r\n form = (grid == null ? void 0 : grid.querySelector(\"div.ew-form[id^=f][id$=grid]\")) || (grid == null ? void 0 : grid.querySelector(\"form.ew-form[id^=f][id$=list], form.ew-form[id^=f][id$=grid]\")),\r\n $form = $$1(form),\r\n frm = $form.data(\"form\");\r\n if (!el || !grid || !row || !form || !frm)\r\n // tbl can be null if multi-column\r\n return false;\r\n let suffix = $form.is(\"div\") ? \"_\" + form.id : \"\",\r\n keycnt = \"#\" + ew.FORM_KEY_COUNT_NAME + suffix;\r\n let _delete = function () {\r\n row.remove();\r\n if (grid.classList.contains(\".ew-grid\")) setupTable(tbl, true);\r\n if (rowidx > 0) {\r\n let $keyact = $form.find(\"#k\" + rowidx + \"_action\" + suffix);\r\n if ($keyact[0]) {\r\n $keyact.val($keyact.val() == \"insert\" ? \"insertdelete\" : \"delete\");\r\n } else {\r\n $form.find(keycnt).after($$1(\"\").attr({\r\n type: \"hidden\",\r\n id: \"k\" + rowidx + \"_action\" + suffix,\r\n name: \"k\" + rowidx + \"_action\" + suffix,\r\n value: \"delete\"\r\n }));\r\n }\r\n }\r\n $$1(tbl).trigger(\"rowdeleted\", [rowidx]);\r\n };\r\n if (isFunction$2(frm.emptyRow) && frm.emptyRow(infix)) {\r\n // Empty row\r\n _delete();\r\n } else {\r\n // Confirm\r\n _prompt(ew.language.phrase(\"DeleteConfirm\"), result => {\r\n if (result) _delete();\r\n });\r\n }\r\n return false;\r\n }\r\n\r\n // HTML encode text\r\n function htmlEncode(text) {\r\n return String(text).replace(/&/g, '&').replace(/\\\"/g, '"').replace(//g, '>');\r\n }\r\n\r\n // HTML decode text\r\n function htmlDecode(text) {\r\n return String(text).replace(/&/g, '&').replace(/"/g, '\"').replace(/</g, '<').replace(/>/g, '>');\r\n }\r\n\r\n // Get form element(s) as single element or array of radio/checkbox\r\n function getElements(el, root) {\r\n root = !$$1.isString(root) ? root : /^#/.test(root) ? root : \"#\" + root;\r\n let $root = root ? $$1(root) : $document$1,\r\n selectors = [],\r\n getFieldSelector = field => \"[data-field='\" + field + \"']:not(.ew-custom-option):not([name^=y_]):not([data-old])\";\r\n if (el instanceof HTMLElement && el.dataset.table && el.dataset.field) {\r\n // HTML element (e.g. radio/checkbox)\r\n if (isBooleanCheckbox(el)) return el;\r\n selectors = [\"[data-table='\" + el.dataset.table + \"']\" + getFieldSelector(el.dataset.field)];\r\n } else if ($$1.isString(el)) {\r\n let [s1, s2] = el.split(\" \"); // Check if \" \"\r\n selectors = s2 ? [\"[data-table='\" + s1 + \"']\" + getFieldSelector(getId(s2))] // \" \", remove []\r\n : [\"[name='\" + el + \"']:not(.ew-custom-option):not([data-old])\", getFieldSelector(getId(el))]; // \"\" only\r\n }\r\n let selector = [\"input\", \"select\", \"textarea\", \"button\", \"selection-list\"].flatMap(tag => selectors.map(sel => tag + sel)).join(),\r\n $els = $root.find(selector);\r\n if ($root.is(\"form.ew-form\") && $root.find(\"div.ew-form\")[0])\r\n // Master/Detail form\r\n $els = $els.not(\"div.ew-form *\"); // Remove elements of detail tables\r\n if ($els.length == 1 && ($els.is(\":not([type=checkbox]):not([type=radio])\") || isBooleanCheckbox($els[0])) || $els.length == 2 && $els.eq(0).is(\"selection-list\") && $els.eq(1).is(\"input[type=hidden]\"))\r\n // Polyfill for the ElementInternals\r\n return $els[0];\r\n return $els[0] ? $els.get() : null;\r\n }\r\n\r\n // Get first element by id/name (not necessarily form element)\r\n function getElement(name, root) {\r\n root = !$$1.isString(root) ? root : /^#/.test(root) ? root : \"#\" + root;\r\n let selector = \"#\" + name.replace(/([\\$\\[\\]])/g, \"\\\\$1\") + \",[name='\" + name + \"']\";\r\n return root ? $$1(root).find(selector)[0] : $$1(selector).first()[0];\r\n }\r\n\r\n // Get ancestor by function\r\n function getAncestorBy(node, fn) {\r\n while (node = node.parentNode) {\r\n var _node;\r\n if (((_node = node) == null ? void 0 : _node.nodeType) == 1 && (!fn || fn(node))) return node;\r\n }\r\n return null;\r\n }\r\n\r\n // Check if an element is hidden\r\n function isHidden(el) {\r\n var $el = $$1(el);\r\n return $el.css(\"display\") == \"none\" && !$el.is(\"selection-list\") && !$el.closest(\".dropdown-menu\")[0] && !isModalLookup(el) && !isAutoSuggest(el) && !isHiddenTextArea(el) || getAncestorBy(el, node => node.style.display == \"none\" && !node.classList.contains(\"tab-pane\") && !node.classList.contains(\"collapse\")) != null;\r\n }\r\n\r\n // Check if same text\r\n function sameText(o1, o2) {\r\n return String(o1).toLowerCase() == String(o2).toLowerCase();\r\n }\r\n\r\n // Check if same string\r\n function sameString(o1, o2) {\r\n return String(o1) == String(o2);\r\n }\r\n\r\n // Convert to header case\r\n function headerCase(str) {\r\n return !str ? \"\" : String(str).replace(/^[^A-Za-z0-9]*|[^A-Za-z0-9]*$/g, \"\").replace(/([a-z])([A-Z])/g, (m, a, b) => a + \"_\" + b.toLowerCase()).replace(/[^A-Za-z0-9]+|_+/g, \"-\").toLowerCase().replace(/(-?)(\\w+)(-?)/g, (m, a, b, c) => a + b.charAt(0).toUpperCase() + b.slice(1) + c);\r\n }\r\n\r\n // Check if same path\r\n function samePath(p1, p2) {\r\n p1 = p1 instanceof URL ? p1.pathname : parseUrl(p1).pathname;\r\n p2 = p2 instanceof URL ? p2.pathname : parseUrl(p2).pathname;\r\n if (p1 != p2 && p1.startsWith(ew.PATH_BASE) && p2.startsWith(ew.PATH_BASE)) {\r\n p1 = p1.substring(ew.PATH_BASE.length);\r\n p2 = p2.substring(ew.PATH_BASE.length);\r\n let ar1 = p1.split(\"/\"),\r\n ar2 = p2.split(\"/\");\r\n if (ar1[0] == ar2[0] && ar1[0].match(/(list|view|edit)$/i) ||\r\n // *list == *list\r\n ar1[0] == ar2[0] && ar1[1] == ar2[1] && [ew.LIST_ACTION, ew.VIEW_ACTION, ew.EDIT_ACTION].includes(ar1[1]))\r\n // xxx/list == xxx/list\r\n return true;\r\n }\r\n return p1 == p2;\r\n }\r\n\r\n // Get element value as array for select-multiple field or else as string\r\n function getValue(el, form) {\r\n let obj = el;\r\n if ($$1.isString(el)) obj = el.split(\" \").length == 2 // Parent field in master table\r\n ? getElements(el) : getElements(el, form);else if ([\"checkbox\", \"radio\"].includes(el.type))\r\n // Single radio/checkbox\r\n obj = getElements(el); // Find radio buttons and checkboxes with the same name\r\n if (!obj) return undefined;\r\n if (obj.options) {\r\n // Selection list\r\n return obj.list ? obj.type == \"select-multiple\" ? obj.values : obj.value : $$1(obj).val();\r\n } else if (Array.isArray(obj)) {\r\n // Radio/Checkbox list or element not found\r\n return obj.length ? $$1(obj).filter(\":checked\").map((i, el) => el.value).get() : undefined;\r\n } else if (isBooleanCheckbox(obj)) {\r\n // Single checkbox\r\n return obj.checked ? obj.value : undefined;\r\n } else if (ew.isHiddenTextArea(obj)) {\r\n $$1(obj).data(\"editor\").save();\r\n return obj.value;\r\n } else {\r\n // text/hidden\r\n return obj.value;\r\n }\r\n }\r\n\r\n // Get existing selected values as an array\r\n function getOptionValues(el, form) {\r\n let obj = el;\r\n if ($$1.isString(el)) obj = el.split(\" \").length == 2 // Parent field in master table\r\n ? getElements(el) : getElements(el, form);else if ([\"checkbox\", \"radio\"].includes(el.type))\r\n // Single radio/checkbox\r\n obj = getElements(el); // Find radio buttons and checkboxes with the same name\r\n if (!obj) return [];\r\n if (obj.options) {\r\n // Selection list\r\n if (obj.list) {\r\n return obj.values;\r\n } else if (isSelect2(obj)) {\r\n let val = $$1(obj).val();\r\n return Array.isArray(val) ? val : $$1.isValue(val) ? [val] : [];\r\n } else {\r\n return Array.from(obj.options).filter(option => option.selected && option.value !== \"\").map(option => option.value);\r\n }\r\n } else if (Array.isArray(obj) || isBooleanCheckbox(obj)) {\r\n // Radio/Checkbox list, or single checkbox, or element not found ([])\r\n return $$1(obj).filter(\":checked\").map(function () {\r\n return this.value;\r\n }).get();\r\n } else if (ew.isHiddenTextArea(obj)) {\r\n $$1(obj).data(\"editor\").save();\r\n return [obj.value];\r\n } else {\r\n // text/hidden\r\n return [obj.value];\r\n }\r\n }\r\n\r\n // Get existing selected values as string\r\n function getOptionValue(el, form) {\r\n return getOptionValues(el, form).join(ew.MULTIPLE_OPTION_SEPARATOR);\r\n }\r\n\r\n // Get existing text of selected values as an array\r\n function getOptionTexts(el, form) {\r\n let obj = el;\r\n if ($$1.isString(el)) obj = el.split(\" \").length == 2 // Parent field in master table\r\n ? getElements(el) : getElements(el, form);else if ([\"checkbox\", \"radio\"].includes(el.type))\r\n // Single radio/checkbox\r\n obj = getElements(el); // Find radio buttons and checkboxes with the same name\r\n if (!obj) return [];\r\n if (isAutoSuggest(obj)) {\r\n // AutoSuggest (before obj.options)\r\n return [obj.input.value];\r\n } else if (obj.options) {\r\n // Selection list\r\n return isSelect2(obj) ? $$1(obj).find(\":selected\").map((i, el) => el.innerHTML).get() : Array.from(obj.options).filter(option => option.selected && option.value !== \"\").map(option => option.text);\r\n } else if (Array.isArray(obj) || isBooleanCheckbox(obj)) {\r\n // Radio/Checkbox list, or single checkbox, or element not found ([])\r\n return $$1(obj).filter(\":checked\").map(function () {\r\n return $$1(this).parent().text();\r\n }).get();\r\n } else if (ew.isHiddenTextArea(obj)) {\r\n $$1(obj).data(\"editor\").save();\r\n return [obj.value];\r\n } else {\r\n return [obj.value];\r\n }\r\n }\r\n\r\n // Clear existing options\r\n function clearOptions(obj) {\r\n if (obj.options) {\r\n // Selection list\r\n var lo = obj.type == \"select-multiple\" ||\r\n // multiple\r\n obj.hasAttribute(\"data-dropdown\") ||\r\n // dropdown\r\n obj.length > 0 && obj.options[0].value != \"\" // non-empty first element\r\n ? 0 : 1;\r\n if (obj.list) {\r\n obj.removeAll();\r\n obj.render();\r\n } else {\r\n for (var i = obj.length - 1; i >= lo; i--) obj.remove(i);\r\n }\r\n if (isAutoSuggest(obj)) {\r\n obj.input.value = \"\";\r\n obj.value = \"\";\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get the name or id of an element\r\n *\r\n * @param {HTMLElement} el - HTML element\r\n * @param {boolean} [remove=true] - Remove square brackets\r\n * @returns\r\n */\r\n function getId(el, remove) {\r\n var id = $$1.isString(el) ? el : $$1(el).attr(\"name\") || $$1(el).attr(\"id\"); // Use name first (id may have suffix)\r\n return remove !== false ? id.replace(/\\[\\]$/, \"\") : id;\r\n }\r\n\r\n // Get display value separator\r\n function valueSeparator(index, obj) {\r\n var sep = $$1(obj).data(\"value-separator\");\r\n return Array.isArray(sep) ? sep[index - 1] : sep || \", \";\r\n }\r\n\r\n /**\r\n * Get display value\r\n *\r\n * @param {Object} opt - Option being displayed\r\n * @param {HTMLElment} obj - HTML element\r\n * @returns {string} Display value\r\n */\r\n function displayValue(opt, obj) {\r\n return [opt.df, opt.df2, opt.df3, opt.df4].reduce((text, value, i) => {\r\n let sep = i > 0 ? valueSeparator(i, obj) : \"\";\r\n return !$$1.isUndefined(sep) && $$1.isValue(value) && value != \"\" ? text + sep + value : text;\r\n }, \"\");\r\n }\r\n\r\n /**\r\n * Create new option\r\n *\r\n * @param {(HTMLElement|array)} obj - Selection list\r\n * @param {Object} data - Object for the new option\r\n * @param {form} f - form object of obj\r\n * @param {bool} selected - New option is selected\r\n * @returns\r\n */\r\n function newOption(obj, data, f, selected) {\r\n let frm = forms.get(f.id),\r\n id = getId(obj),\r\n list = frm.getList(obj),\r\n group = data.gf,\r\n value = data.lf,\r\n template = frm.getOptionTemplate(list),\r\n text = template != null && template.render && !isAutoSuggest(obj) ? template.render(data, ew.jsRenderHelpers) : displayValue(data, obj) || value;\r\n if (obj.options) {\r\n // Selection list\r\n let option;\r\n if (obj.list) {\r\n option = new ew.SelectionListOption(text, value, !!selected);\r\n } else {\r\n option = document.createElement(\"option\");\r\n option.value = value;\r\n option.innerHTML = text;\r\n option.selected = !!selected;\r\n }\r\n let args = {\r\n \"name\": id,\r\n \"form\": f.$element,\r\n data,\r\n group,\r\n option\r\n };\r\n $document$1.trigger(\"newoption\", [args]); // Fire \"newoption\" event for selection list\r\n if (obj.list) {\r\n obj.addOption(args.option);\r\n } else {\r\n if (args.group && !isSelect2(obj)) {\r\n var _obj$querySelector;\r\n let optGroup = Array.from((_obj$querySelector = obj.querySelector(\":scope > optgroup\")) != null ? _obj$querySelector : []).find(g => g.label == args.group);\r\n if (!optGroup) {\r\n optGroup = document.createElement(\"optgroup\");\r\n optGroup.label = args.group;\r\n obj.add(optGroup);\r\n }\r\n optGroup.appendChild(args.option);\r\n } else {\r\n obj.add(args.option);\r\n }\r\n }\r\n return args.option.text;\r\n }\r\n return text;\r\n }\r\n\r\n // Select combobox option\r\n function selectOption(obj, values, change) {\r\n var _obj$dataset, _forms$get$getList;\r\n if (change === void 0) {\r\n change = true;\r\n }\r\n if (!obj || !values) return;\r\n let $obj = $$1(obj);\r\n values = Array.isArray(values) ? values : [values];\r\n if (obj.options) {\r\n // Selection list\r\n if (obj.list) {\r\n obj.value = values;\r\n } else {\r\n var _obj$options$;\r\n $obj.val(values);\r\n if (change && isSelect2(obj)) $obj.triggerHandler(\"change\");\r\n if (obj.type == \"select-one\" && obj.selectedIndex == -1 && !((_obj$options$ = obj.options[0]) != null && _obj$options$.value)) obj.selectedIndex = 0; // Make sure an option is selected\r\n }\r\n if (isAutoSuggest(obj) && values.length == 1) {\r\n let opts = obj.options || [];\r\n for (let opt of opts) {\r\n if (opt.value == values[0]) {\r\n obj.value = opt.value;\r\n obj.input.value = opt.text;\r\n break;\r\n }\r\n }\r\n }\r\n } else if (isBooleanCheckbox(obj)) {\r\n obj.checked = convertToBool(values.join(ew.MULTIPLE_OPTION_SEPARATOR));\r\n } else if (obj.type && obj.type != \"file\") {\r\n $obj.val(values.join(ew.MULTIPLE_OPTION_SEPARATOR));\r\n if (isHiddenTextArea($obj)) $obj.data(\"editor\").set();\r\n }\r\n // Auto-select if only one option\r\n if (((_obj$dataset = obj.dataset) == null ? void 0 : _obj$dataset.autoselect) === \"false\")\r\n // data-autoselect=\"false\"\r\n return;\r\n let form = getForm(obj),\r\n autoSelect = form && !(form.id.endsWith(\"search\") || form.id.endsWith(\"srch\") || ((_forms$get$getList = forms.get(form.id).getList(obj)) == null || (_forms$get$getList = _forms$get$getList.parentFields) == null ? void 0 : _forms$get$getList.length) === 0); // Not search forms and has parent fields\r\n if (autoSelect && obj.options) {\r\n // Selection List\r\n if (!obj.list && obj.type == \"select-one\" && obj.options.length == 2 && !obj.options[1].selected) {\r\n obj.options[1].selected = true;\r\n !change || $obj.trigger(\"change\");\r\n } else if (obj.options.length == 1 && !obj.options[0].selected) {\r\n obj.options[0].selected = true;\r\n !change || $obj.trigger(\"change\");\r\n }\r\n if (isAutoSuggest(obj)) {\r\n let opts = obj.options || [];\r\n if (opts.length == 1) {\r\n obj.value = opts[0].value;\r\n obj.input.value = opts[0].text;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Fetch API\r\n function _fetch(url, init) {\r\n var _init, _init$headers;\r\n (_init = init) != null ? _init : init = {};\r\n init.headers = new Headers(init.headers || {});\r\n let isApi = url.startsWith(getApiUrl()); // Is API request\r\n if (isApi && ew.API_JWT_TOKEN) init.headers.set(ew.API_JWT_AUTHORIZATION_HEADER, \"Bearer \" + ew.API_JWT_TOKEN);\r\n if ((_init$headers = init.headers) != null && (_init$headers = _init$headers.get(\"Content-Type\")) != null && _init$headers.includes(\"application/json\")) {\r\n // Add token in headers if posting JSON data // PHP\r\n init.headers.set(headerCase(ew.TOKEN_NAME_KEY), ew.TOKEN_NAME); // Send token name in header // PHP\r\n init.headers.set(headerCase(ew.ANTIFORGERY_TOKEN_KEY), ew.ANTIFORGERY_TOKEN); // Send antiforgery token in header // PHP\r\n }\r\n if (!init.method || sameText(init.method, \"GET\")) {\r\n // GET\r\n url = setSearchParams(url, init.body);\r\n delete init.body;\r\n } else {\r\n // POST\r\n if (init.body instanceof FormData) {\r\n init.body.set(ew.TOKEN_NAME_KEY, ew.TOKEN_NAME);\r\n init.body.set(ew.ANTIFORGERY_TOKEN_KEY, ew.ANTIFORGERY_TOKEN);\r\n } else {\r\n init.body = mergeSearchParams(init.body, {\r\n [ew.TOKEN_NAME_KEY]: ew.TOKEN_NAME,\r\n [ew.ANTIFORGERY_TOKEN_KEY]: ew.ANTIFORGERY_TOKEN\r\n }); // Add token name and antiforgery token // PHP\r\n }\r\n }\r\n let args = {\r\n url,\r\n init\r\n };\r\n $document$1.trigger(\"fetch\", [args]);\r\n return fetch(args.url, args.init);\r\n }\r\n\r\n // Ajax send\r\n $document$1.on(\"ajaxSend\", function (event, jqxhr, settings) {\r\n let url = settings.url,\r\n isApi = url.startsWith(getApiUrl()),\r\n // Is API request\r\n allowed = isApi || url.startsWith(ew.PATH_BASE) || url.startsWith(currentPage());\r\n if (!allowed && url.match(/^http/i)) {\r\n let objUrl = new URL(url);\r\n allowed = objUrl.hostname == currentUrl.hostname; // Same host name\r\n }\r\n if (allowed) {\r\n if (isApi && ew.API_JWT_TOKEN) jqxhr.setRequestHeader(ew.API_JWT_AUTHORIZATION_HEADER, \"Bearer \" + ew.API_JWT_TOKEN); // Note: settings.headers won't work\r\n if ($$1.isString(settings.contentType) && settings.contentType.includes(\"application/json\")) {\r\n // Add token and antiforgery token in headers if posting JSON data // PHP\r\n jqxhr.setRequestHeader(headerCase(ew.TOKEN_NAME_KEY), ew.TOKEN_NAME);\r\n jqxhr.setRequestHeader(headerCase(ew.ANTIFORGERY_TOKEN_KEY), ew.ANTIFORGERY_TOKEN);\r\n } else if (sameText(settings.type, \"POST\")) {\r\n // POST\r\n if (settings.data instanceof FormData) {\r\n settings.data.set(ew.TOKEN_NAME_KEY, ew.TOKEN_NAME);\r\n settings.data.set(ew.ANTIFORGERY_TOKEN_KEY, ew.ANTIFORGERY_TOKEN);\r\n } else {\r\n let params = mergeSearchParams(new URLSearchParams(settings.data), {\r\n [ew.TOKEN_NAME_KEY]: ew.TOKEN_NAME,\r\n [ew.ANTIFORGERY_TOKEN_KEY]: ew.ANTIFORGERY_TOKEN\r\n }); // Add token name and antiforgery token // PHP\r\n settings.data = params.toString();\r\n }\r\n }\r\n }\r\n });\r\n\r\n // Ajax start\r\n $document$1.on(\"ajaxStart\", function () {\r\n $document$1.data(\"_ajax\", true);\r\n $$1(\"form.ew-form\").addClass(\"ew-wait\").each(function () {\r\n let frm = forms.get(this.id);\r\n if (frm) {\r\n if (!frm.multiPage || !frm.multiPage.lastPageSubmit) frm.disableForm();\r\n }\r\n });\r\n });\r\n\r\n // Ajax stop/error\r\n $document$1.on(\"ajaxStop ajaxError\", function () {\r\n $$1(\"form.ew-form.ew-wait\").removeClass(\"ew-wait\").each(function () {\r\n let frm = forms.get(this.id);\r\n if (frm) {\r\n if (!frm.multiPage || !frm.multiPage.lastPageSubmit) frm.enableForm();\r\n }\r\n });\r\n $document$1.data(\"_ajax\", false);\r\n });\r\n\r\n // Execute JavaScript in HTML loaded by Ajax\r\n function executeScript(html, id, modal) {\r\n let pattern = modal ? /<(head)[^>]*>[\\s\\S]*?<\\/\\1\\s*>/ig : /<(head|template)[^>]*>[\\s\\S]*?<\\/\\1\\s*>/ig,\r\n // If modal, scripts in template tags not executed by browser, execute manually\r\n matches = html.replaceAll(pattern, \"\").matchAll(/
' + ew.language.phrase(\"SessionWillExpire\") + '
\" + ew.language.phrase(\"Exporting\") + \"
\" + msg + \"