var content_div_id = "content_wrapper"; var historylist = []; var targetlist = []; var fileBlobURLList = {}; if (typeof currentPage === 'undefined') { var currentPage = ''; } function InitDataPageFuncOBJ() { if (typeof LoadDataPageFunc === 'undefined') { LoadDataPageFunc = {}; logDev('Initialize LoadDataPageFunc'); } } function newPageLoadDataPageFuncOBJ() { LoadDataPageFunc = {}; LoadDataPageFunc.PageTitle = ''; LoadDataPageFunc.MainDetailsURL = ''; LoadDataPageFunc.Details = {}; LoadDataPageFunc.Settings = {}; LoadDataPageFunc.currentPage = ''; LoadDataPageFunc.Disabled = null; defaultBackOnclick = null; LoadDataPageFunc.URL = {}; LoadDataPageFunc.URL.Details = null; } /* window.addEventListener('load', function() { window.history.pushState({}, ''); window.history.pushState({}, ''); window.history.pushState({}, ''); window.history.pushState({}, ''); }); window.addEventListener('popstate', function() { window.history.pushState({}, ''); window.history.pushState({}, ''); window.history.pushState({}, ''); window.history.pushState({}, ''); window.history.pushState({}, ''); }); */ function loadandexecute(targeturl, targetid = "main-body", targethtml = '') { CurrentPageisLoading = true; // console.log('loadandexecute started'); if (!targetid) { targetid = 'main-body'; } if (targethtml) { return new Promise((resolve, reject) => { try { targethtml = base64Decode(targethtml); $("#" + targetid).html(targethtml); CurrentPageisLoading = false; return resolve('loaded'); } catch (err) { CurrentPageisLoading = false; return reject(err); } }); } else { // console.log('no target html '+targethtml); } if (reqcacheload(targeturl)) { return new Promise((resolve, reject) => { $("#" + targetid).html(reqcacheload(targeturl)); // $('#' + targetid).fadeIn(); CurrentPageisLoading = false; return resolve('loaded'); }); } CurrentPageisLoading = false; return new Promise((resolve, reject) => { Preloaders.PrecachePage(targeturl, targetid, () => { CurrentPageisLoading = false; resolve('loaded'); }); }); } DropZoneFunc = { AcceptedFilesString: { images: 'image/*', docs: '.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx', documents: '.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx' }, AddPreviouslyUploadedFiles: function (dropzoneobject, filesarray) { /* const previousFiles = [ { name: "example.jpg", size: 12345, url: "/path/to/example.jpg", thumbnail: "/path/to/thumbnail/example.jpg" }, // Add more files as needed ];*/ filesarray.forEach(file => { const mockFile = { name: file.name, size: file.size, url: file.url }; dropzoneobject.emit("addedfile", mockFile); dropzoneobject.emit("thumbnail", mockFile, file.thumbnail); dropzoneobject.emit("complete", mockFile); dropzoneobject.emit("url", mockFile, file.url, file.name); // Optionally, if you have server-side file handling, you may need to set this to true // dropzoneobject.emit("success", mockFile, file.serverResponse); }); }, ReplaceDropzoneFiles: function (dropzoneid, newFilesArray) { const dropzoneobject = window.currentDropzone[dropzoneid]; if (!dropzoneobject) { console.warn(`Dropzone '${dropzoneid}' not found.`); return; } DropZoneFunc.ClearDropzoneUpload(dropzoneid, dropzoneobject); DropZoneFunc.AddPreviouslyUploadedFiles(dropzoneobject, newFilesArray); window.Target_Uploaded_Files = newFilesArray.map(f => f.hashkey || f.name); }, ResetDropzoneUpload: function (url, obj = null, reqtype = 'POST', successfunc = false) { function ReplaceDropZoneFilesfrom(filesarray) { DropZoneFunc.ClearDropzoneUpload(); DropZoneFunc.AddPreviouslyUploadedFilesDropZone(myDropzone, filesarray); Target_Uploaded_Files = filesarray.map(file => file.hashkey); } if (!reqtype) { reqtype = 'POST'; } if (!obj) { obj = null; } let DRrequest = RequestData(false); DRrequest.url(url).data(obj).type(reqtype).fromVarCache(false).success(function (response) { ReplaceDropZoneFilesfrom(response); if (typeof successfunc === 'function') { successfunc(response); } }).go(); }, ClearDropzoneUpload: function (dropzonetargetid = '', dropzoneobject = '') { //if (myDropzone){myDropzone.removeAllFiles(true);} if (!dropzonetargetid) { $('#' + dropzonetargetid + ' .dz-preview.dz-complete').remove(); console.log('#ClearUploadButton-' + dropzonetargetid); // $('#ClearUploadButton-' + dropzonetargetid).hide(); } else { $('.dz-preview.dz-complete').remove(); } if (!dropzoneobject) { myDropzone.emit("reset") } else { dropzoneobject.emit("reset"); } //$('.dz-default.dz-message').show() Target_Uploaded_Files = []; }, hasOngoingUploads: function (dropzoneobject) { return dropzoneobject.getUploadingFiles().length > 0; }, RemoveLastUploadedDropzone: function (dropzoneobject) { const uploadedFiles = dropzoneobject.getAcceptedFiles(); if (uploadedFiles.length > 0) { const lastFile = uploadedFiles[uploadedFiles.length - 1]; dropzoneobject.removeFile(lastFile); } }, InitializeDropZone: function (url, successcallback, dropzoneid = 'myAwesomeDropZone', acceptedFiles, filename, maxfilesize = 100, updatedropzonestatusFUNC = '', errorcallback = false) { const dropzoneconfig = { paramName: filename, maxFilesize: maxfilesize, url: url, acceptedFiles: acceptedFiles || null, init: function () { const dropzoneobject = this; let ongoingUploads = 0; function updateUploadStatus() { if (typeof updatedropzonestatusFUNC === 'function') { updatedropzonestatusFUNC(); } } this.on("addedfile", function (file) { ongoingUploads++; updateUploadStatus(); }); this.on("uploadprogress", function (file, progress) { // optional }); this.on("complete", function (file) { ongoingUploads--; updateUploadStatus(); }); this.on("url", function (file, url, name) { // Make filename clickable file.previewElement.classList.add("dz-success"); file.previewElement.querySelector("[data-dz-name]").innerHTML = `${name}`; // Use the real image as thumbnail if it’s an image // if (file.type.startsWith("image/")) { // file.previewElement.querySelector("img").src = response.url; // } // Preserve your existing success callback }); this.on("success", function (file, response) { if (response && response.url) { // Make filename clickable file.previewElement.classList.add("dz-success"); file.previewElement.querySelector("[data-dz-name]").innerHTML = `${response.name}`; // Use the real image as thumbnail if it’s an image // if (file.type.startsWith("image/")) { // file.previewElement.querySelector("img").src = response.url; // } } // Preserve your existing success callback if (typeof successcallback === 'function') { successcallback(response, file); } }); // 🔴 catch network/server errors (like HTTP 500) this.on("error", function (file, errorMessage, xhr) { ongoingUploads--; updateUploadStatus(); console.warn("Dropzone upload error:", errorMessage); // Make sure it visually shows as failed file.previewElement?.classList.add("dz-error"); const errorNode = file.previewElement?.querySelector("[data-dz-errormessage]"); if (errorNode) { const msg = (xhr && xhr.responseText) || errorMessage || "Upload failed"; errorNode.textContent = msg; } // Optionally auto-remove failed files setTimeout(() => { if (file && this.files.includes(file)) this.removeFile(file); }, 2000); // Run custom error callback if provided if (typeof errorcallback === "function") { errorcallback(file, errorMessage, xhr); } }); }, success: function (file, response) { if (response && response.success) { if (typeof successcallback === "function") successcallback(response, file); } else { // Even if backend returned 200, force an error state const msg = response?.error || "Upload failed"; file.previewElement?.classList.add("dz-error"); const errorNode = file.previewElement?.querySelector("[data-dz-errormessage]"); if (errorNode) errorNode.textContent = msg; this.emit("error", file, msg); } }, }; const myDropzone = new Dropzone(`#${dropzoneid}`, dropzoneconfig); return myDropzone; }, AddFiles: function (url = '/File/Upload', errorcallback = '', filename = 'file', maxfilesize = 100, acceptedFiles = 'image/*,.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx', dropzoneid = 'my-awesome-dropzone', dropzonemodal = 'Dropzone-Modal') { function successcallback(response, file) { // if (!response || isNumeric(response)) { // RemoveLastUploadedDropzone(); // return false; // } else { // Target_Uploaded_Files.push(response); // } if (response.success && response.hashkey) { Target_Uploaded_Files.push(response.hashkey); } else { RemoveLastUploadedDropzone(); return false; } } if (!myDropzone) { DropZoneFunc.InitializeDropZone(url, successcallback, dropzoneid = 'myAwesomeDropZone', acceptedFiles, filename, maxfilesize = 100); } if (view_transaction_reset_once) { DropZoneFunc.ResetDropzoneUpload(); view_transaction_reset_once = 0 } if (!filename) { filename = 'file'; } if (!dropzonemodal) { dropzonemodal = 'Dropzone-Modal'; } if (ElementExists(dropzonemodal)) { showmodal(dropzonemodal); } } }; function button(content, value = '', onclick = '', idtext = '', setclass = '', addtionaldata = '', img = '') { if (img) { img = imgiconuserdefault(img); } else { img = ''; } return ''; } function buttonGOTOPage(text, targetpage, targetdata = 0, idtext = '', addonclick = '', setclass = '', addtionaldata = '', img = '') { if (!text || !targetpage) { return false; } const onclick = `gotoPage('${targetpage}','${targetdata}'); ` + addonclick; return button(text, text, onclick, idtext, setclass + ' btn btn-default', addtionaldata, img); } function buttonwarning(content, value = '', onclick = '', block = '', idtext = '', addclass = '', addtionaldata = '', img = '') { if (block) { block = 'btn-block'; } else { block = ''; } return button(content, value, onclick, idtext, 'btn btn-warning ' + block + ' ' + addclass, addtionaldata, img); } function buttondanger(content, value = '', onclick = '', block = '', idtext = '', addclass = '', addtionaldata = '', img = '') { if (block) { block = 'btn-block'; } else { block = ''; } return button(content, value, onclick, idtext, 'btn btn-danger ' + block + ' ' + addclass, addtionaldata, img); } function buttonprimary(content, value = '', onclick = '', block = '', idtext = '', addclass = '', addtionaldata = '', img = '') { if (block) { block = 'btn-block'; } else { block = ''; } return button(content, value, onclick, idtext, 'btn btn-primary ' + block + ' ' + addclass, addtionaldata, img); } function textinput(idtext = '', setclass = '', required = '', placeholder = '', value = '') { if (required) { required = 'required'; } else { required = ''; } return ''; } function textformcontrol(idtext = '', addclass = '', required = '', placeholder = '', value = '') { return textinput(idtext, 'form-control ' + addclass, required, placeholder, value); } function HomeMenuButtons(buttonicon, buttonText, buttonGo, buttonVariabletoPass = '', iconwidth = '', iconheight = '', buttonstyle = '', buttononclick = '', divclass = '', divid = '', buttonid = '', textclass = '') { // buttonvariabletopass is just currenttarget if (!buttonstyle) { buttonstyle = 'bg-transparent border-0 btn-block' } if (!divclass) { divclass = 'col-6'; } if (!buttonVariabletoPass) { buttonVariabletoPass = 0; } if (!buttonGo && buttononclick) { buttontoclick = buttononclick; } else if (buttonGo) { buttontoclick = `ButtonGo('` + buttonGo + `', '` + buttonVariabletoPass + `')`; } else { buttontoclick = ''; } if (!iconwidth) { iconwidth = '20%'; } if (!iconheight) { iconheight = '40%'; } if (!textclass) { textclass = 'profile-username text-center'; } return `
`; } function createCard(cardtitle = '', cardid = '', cardtools = '', cardbodyid = '', cardbodytext = '', cardbodyclassadd = '', maincardstyle = '', titlecardhide = false, maincardaddclass = '') { if (titlecardhide) { titlecardhide = 'display:none;'; } else { titlecardhide = ';' } if (!cardbodyid && cardid) { cardbodyid = 'card-body-' + cardid; } return `