const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]') const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl)) const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]') const popoverList = [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl)) const toastLiveExample = document.getElementById('liveToast') let delete_object={}; let position = 0; let success=0; let active =0; // if (toastTrigger) { // const toastBootstrap = bootstrap.Toast.getOrCreateInstance(toastLiveExample) // toastTrigger.addEventListener('click', () => { // toastBootstrap.show() // }) // } function handleHashChange() { if (window.location.hash === "#new_course") { let btn = document.querySelector("#new-course"); if (btn) btn.click(); } if (window.location.hash === "#new_module") { let btn = document.querySelector("#new-module"); if (btn) btn.click(); } if (window.location.hash === "#new_sem") { let btn = document.querySelector("#new-sem"); if (btn) btn.click(); } if (window.location.hash === "#new_unit") { let btn = document.querySelector("#new-unit"); if (btn) btn.click(); } if (window.location.hash === "#new_file") { let btn = document.querySelector("#new-file"); if (btn) btn.click(); } } window.addEventListener('hashchange', handleHashChange); document.addEventListener("DOMContentLoaded", handleHashChange); function fileAttachment({file_class='#file', field_class='.append-file'}={}){ let fileSelect = document.querySelector(file_class); let appendField = document.querySelector(field_class); let file = Array.from(fileSelect.files); let appendCard = document.createElement('div'); let cardHeader = document.createElement('div'); let ul = document.createElement('ul'); appendCard.setAttribute('class', 'card my-2'); cardHeader.setAttribute('class', 'card-header'); ul.setAttribute('class', 'list-group list-group-flush'); cardHeader.textContent ='Selected file' let combinedSize = 0; if(file.length > 0){ file.forEach(selectedFile => { let file_name= selectedFile.name; let file_size = selectedFile.size; let file_type = selectedFile.type; let extension = file_name.split('.').pop().toLowerCase(); combinedSize+=file_size; let li = document.createElement('li'); li.setAttribute('class', 'list-group-item'); let i =document.createElement('i'); let iconClass = "fa-file"; let fileIcons = { pdf: "fa-file-pdf", doc: "fa-file-word", docx: "fa-file-word", xls: "fa-file-excel", xlsx: "fa-file-excel", ppt: "fa-file-powerpoint", pptx: "fa-file-powerpoint", jpg: "fa-file-image", jpeg: "fa-file-image", png: "fa-file-image", gif: "fa-file-image", mp3: "fa-file-audio", wav: "fa-file-audio", mp4: "fa-file-video", avi: "fa-file-video", zip: "fa-file-archive", rar: "fa-file-archive", html: "fa-file-code", css: "fa-file-code", js: "fa-file-code", py: "fa-file-code" }; if (fileIcons[extension]) { iconClass = fileIcons[extension]; } i.setAttribute('class', `fa ${iconClass}`) file_name = `${createSimplename(file_name)}.${extension}` li.appendChild(i); li.innerHTML += ` • ${file_name} • ${formatFileSize(file_size)}`; ul.appendChild(li); }); }else{ let li = document.createElement('li'); li.setAttribute('class', 'list-group-item'); li.textContent = `No selected file` ul.appendChild(li); } appendCard.appendChild(cardHeader); let li = document.createElement('li'); li.setAttribute('class', 'list-group-item'); ul.appendChild(li); if(combinedSize>30*1024*1024){ let lie = document.createElement('li'); lie.textContent='Error -Total file size is bigger than 25MB'; lie.setAttribute('class', 'list-group-item text-danger'); fileSelect.value=''; ul.appendChild(lie); } li.textContent = `Total • ${formatFileSize(combinedSize)}`; appendCard.appendChild(ul); appendField.innerHTML=''; appendField.appendChild(appendCard); } function displayExistingFiles(existingFiles = []) { let appendField = document.querySelector('.append-file-exist'); let appendCard = document.createElement('div'); let cardHeader = document.createElement('div'); let ul = document.createElement('ul'); appendCard.setAttribute('class', 'card my-2'); cardHeader.setAttribute('class', 'card-header'); ul.setAttribute('class', 'list-group list-group-flush'); cardHeader.textContent = 'Uploaded Files'; appendCard.appendChild(cardHeader); if (existingFiles.length > 0) { existingFiles.forEach(file => { let li = document.createElement('li'); li.setAttribute('class', 'list-group-item'); let i = document.createElement('i'); let extension = file.name.split('.').pop().toLowerCase(); let iconClass = "fa-file"; let fileIcons = { pdf: "fa-file-pdf", doc: "fa-file-word", docx: "fa-file-word", xls: "fa-file-excel", xlsx: "fa-file-excel", ppt: "fa-file-powerpoint", pptx: "fa-file-powerpoint", jpg: "fa-file-image", jpeg: "fa-file-image", png: "fa-file-image", gif: "fa-file-image", mp3: "fa-file-audio", wav: "fa-file-audio", mp4: "fa-file-video", avi: "fa-file-video", zip: "fa-file-archive", rar: "fa-file-archive", html: "fa-file-code", css: "fa-file-code", js: "fa-file-code", py: "fa-file-code" }; if (fileIcons[extension]) { iconClass = fileIcons[extension]; } i.setAttribute('class', `fa ${iconClass}`); li.appendChild(i); li.innerHTML += ` • ${file.name}`; ul.appendChild(li); }); } else { let li = document.createElement('li'); li.setAttribute('class', 'list-group-item'); li.textContent = 'No uploaded files'; ul.appendChild(li); } appendCard.appendChild(ul); appendField.innerHTML = ''; // Clear previous content appendField.appendChild(appendCard); } function formatFileSize(bytes) { if (bytes < 1024) return bytes + " B"; else if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(2) + " KB"; else if (bytes < 1024 * 1024 * 1024) return (bytes / (1024 * 1024)).toFixed(2) + " MB"; else return (bytes / (1024 * 1024 * 1024)).toFixed(2) + " GB"; } function createSimplename(str){ let nameArr = str.split('.'); str=nameArr.slice(0, -1).join(''); let length = str.length; if(length>10){ str= str.slice(0, 10); return `${str}...` } return str } function writeDb(data, url, ui_manipulate){ if(active>0){ createBootstrapToast(['Please wait the previous request to be completed first before making another request', position, 'text-danger']); return; }else{ ui_manipulate.progress.style.width ='0%' } active += 1; let xhr = new XMLHttpRequest(); xhr.timeout = 90000; xhr.upload.onprogress=function(event){ if(event.lengthComputable){ let percentComplete = (event.loaded/event.total)*100; ui_manipulate.progress.style.width=`${percentComplete}%`; ui_manipulate.progress.textContent=`${percentComplete.toFixed(1)}% uploaded`; } } xhr.onprogress =function(event){ if(event.lengthComputable){ let percentComplete =(event.loaded/event.total)*100; ui_manipulate.progress.style.width=`${percentComplete}%`; ui_manipulate.progress.textContent=`${percentComplete.toFixed(1)}% processed`; } } xhr.open('POST', url, true); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.onload= function(){ active=0; if(xhr.status >=200 && xhr.status <=300){ // console.log(xhr.responseText); try { let responseData= JSON.parse(xhr.responseText); //createBootstrapToast([responseData.data.message, position, responseData.data.color]); createBootstrapToast([responseData.data.message, position, responseData.data.color]); if(responseData.status=='success'){ afterUploadAction(ui_manipulate.inputs); if(ui_manipulate.func){ fileAttachment({file_class:'#file-e',field_class:'.append-file-edit'}); } success+=1; }else{ ui_manipulate.inputs.forEach(ui=>{ if(ui){ ui.classList.add('border-danger'); } }) }; if(responseData.redirect){ let countdown = 10; let message = document.getElementById("redirectMessage"); message.innerText = `Redirecting in ${countdown} seconds...`; let interval = setInterval(() => { countdown--; message.innerText = `Redirecting in ${countdown} seconds...`; if (countdown === 0) { clearInterval(interval); if(responseData.redirect=='empty'){ window.location.href = window.location.href; }else{ window.location.href = responseData.redirect; } } }, 1000); } } catch (error) { console.log(error) } }else{ createBootstrapToast([`HTTP Error:-, ${xhr.status}`, position, 'text-danger']); } } xhr.ontimeout=function(){ active=0 createBootstrapToast([`Time out, check internet connection and ty again`, position, 'text-danger']); } xhr.onerror=function(){ active=0; createBootstrapToast([`Network error`, position, 'text-danger']); } xhr.send(JSON.stringify(data)); } function afterUploadAction(ui){ ui.forEach(elem=>{ if(elem){ elem.classList.remove('border-danger') elem.value=''; } }) } function createBootstrapToast(data){ const toastBootstrap = bootstrap.Toast.getOrCreateInstance(createToastBootstrap(data[0], data[1], data[2])) toastBootstrap.show() ; position+=15; if(position>50){ position=0; } } function organizeRetrievedData(){ } function handleReceivedHtmlData(){ } function renderPage(){ if(success>0){ window.location.hash=''; let targetUrl = window.location.href targetUrl= targetUrl.replace('#', '') window.location.href=targetUrl } success=0 } function addCourse({url, loc='str', type='course', action='add_course'}={}){ let courseInput = document.querySelector('#course-name'); let access = document.querySelector('#course-type'); let notes = document.querySelector('#course-note'); let progressBar = document.querySelector('.progress-bar'); let code; if(action=='edit_course'){ courseInput = document.querySelector('#edit-name'); access = document.querySelector('#edit-type'); notes = document.querySelector('#edit-note'); progressBar = document.querySelector('#progress-bar'); code = document.querySelector('#code'); loc= (document.querySelector('#edit-status'))?document.querySelector('#edit-status').value:loc; } let courseValue= courseInput.value.trim(); let accessValue= access.value.trim(); //let notesValue= notes.value.trim(); if(active>0){ createBootstrapToast(['Please wait for the previous request to be completed first', position, 'text-danger']); return; }else{ progressBar.style.width ='0%' } if(courseValue.length<1 || accessValue.length<1){ if(courseInput.value==''){ courseInput.classList.add('border-danger'); } if(access.value==''){ access.classList.add('border-danger'); } createBootstrapToast(['Error all field are required', position, 'text-danger']) return; } let data ={ action : action, data:{ name : courseInput.value.trim(), access : access.value.trim(), note: notes?notes.value.trim():null, loc: loc, type: type, code: code?code.value.trim():false, } } let html_dt = { inputs: [ courseInput, access, notes ], progress: progressBar } writeDb(data, url, html_dt) } function editCourse(array){ let name= document.querySelector('#edit-name') ; let type= document.querySelector('#edit-type'); let note= document.querySelector('#edit-note'); let code= document.querySelector('#code'); let stat= document.querySelector('#edit-status'); name.value = array.name; type.value = array.type; note.value = array.info; code.value = array.code; if(stat){ stat.value = array.status; } } function delete_data(arr){ document.querySelector('.name-label').textContent=arr.name; delete_object=arr; } function delete_data_file(arr){ document.querySelector('.name-label-file').textContent=arr.name; delete_object=arr; } function initiate_delete(data, act){ let happen; if(act){ happen = act }else{ happen ='delete_folder' } if(active>0){ createBootstrapToast(['Please wait for the previous request to be completed first', position, 'text-danger']); return; }else{ data.progress.style.width ='0%' } let code =delete_object.code; let attachment={ action : happen, data:{ code:code } } let html_dt = { inputs: [ data.url ], progress: data.progress } writeDb(attachment, data.url.value, html_dt) } function display_edit_file(arr){ let file_name= document.querySelector('#file-name-e'); let file_note= document.querySelector('#file-note-e'); let file_type= document.querySelector('#file-type-e'); let file_code= document.querySelector('#code-edit-d'); file_name.value=arr.name; file_note.value=arr.notes; file_type.value=arr.type; file_code.value=arr.code; displayExistingFiles([{name: arr.name, size: 0, type:'file', url: arr.base_url}]) } function add_documents(inputs){ let name= inputs.data.name; let note= inputs.data.notes; let access= inputs.data.access; let files= inputs.data.files; let nameValue= name.value.trim(); let notesValue= note.value.trim(); let accessValue = access.value.trim(); let filesValue = files.files; if(active>0){ createBootstrapToast(['Please wait the previous request to be completed first before making another request', position, 'text-danger']); return; }else{ inputs.alert.pBar.style.width ='0%' } if(nameValue==''){ name.classList.add('border-danger'); }else{ name.classList.remove('border-danger'); } if(notesValue==''){ note.classList.add('border-danger'); }else{ note.classList.remove('border-danger'); } if(accessValue==''){ access.classList.add('border-danger'); }else{ access.classList.remove('border-danger'); } if(filesValue.length==0){ inputs.alert.file_cont.classList.add('border-danger'); }else{ inputs.alert.file_cont.classList.remove('border-danger'); } if(nameValue==''||notesValue=='' ||accessValue=='' ||filesValue.length==0){ createBootstrapToast(['Error - Some fields have errors', position, 'text-danger']); return; } let act = 'add_document'; let locs= null; if(inputs.action=='edit_file'){ locs = inputs.data.code.value act=inputs.action; }else{ locs=inputs.data.loc.trim() } let file_list = []; let readFile = (file, index) => { let reader = new FileReader(); reader.onloadend = function () { let base64String = reader.result.split(',')[1]; // Remove base64 prefix file_list.push({ filename: file.name, filetype: file.type, filedata: base64String }); if (file_list.length === filesValue.length) { let json_data={ action: act, data:{ 'name' : nameValue, 'notes': notesValue, 'access': accessValue, 'files_a':inputs.action=='edit_file'?file_list[0]:file_list, 'type' :'document', 'loc' : locs } } let htm_data ={ 'inputs': [name, note, access, inputs.alert.file_cont, files], 'progress': inputs.alert.pBar, 'func': true, } writeDb(json_data, inputs.alert.url, htm_data); } }; reader.readAsDataURL(file); }; for (let i = 0; i < filesValue.length; i++) { readFile(filesValue[i], i); } } function createToastBootstrap(message, position, color){ let toastContainer = document.createElement('div'); let liveToast = document.createElement('div'); let toastHeader = document.createElement('div'); let tostBody = document.createElement('div'); let strong = document.createElement('strong'); let small = document.createElement('small'); let button = document.createElement('button'); toastContainer.setAttribute('class', 'toast-container position-fixed end-0 p-3'); toastContainer.style.bottom = `${position}%`; liveToast.setAttribute('class', `toast ${color}`); liveToast.id= `liveToast-${position}`; liveToast.role ='alert'; liveToast.ariaAtomic =true; liveToast.ariaLive='assertive'; toastHeader.setAttribute('class', 'toast-header'); tostBody.setAttribute('class', 'toast-body'); strong.classList.add('me-auto'); button.classList.add('btn-close'); button.setAttribute('type', 'button'); button.setAttribute("data-bs-dismiss", "toast"); button.ariaLabel='close'; strong.textContent= 'Archive says!'; small.textContent='now'; tostBody.textContent=message; toastHeader.appendChild(strong); toastHeader.appendChild(small); toastHeader.appendChild(button); liveToast.appendChild(toastHeader); liveToast.appendChild(tostBody); toastContainer.appendChild(liveToast) document.querySelector('body').appendChild(toastContainer); return liveToast; } function sendEmail(data) { let url = data['url']; let name= data['name']; let subject= data['subject']; let email= data['email']; let phone= data['phone']; let message= data['message']; if(name.value.trim()==''){ name.classList.add('border-danger'); }else{ name.classList.remove('border-danger'); } if(subject.value.trim()==''){ subject.classList.add('border-danger'); }else{ subject.classList.remove('border-danger'); } if(email.value.trim()==''){ email.classList.add('border-danger'); }else{ email.classList.remove('border-danger'); } if(phone.value.trim()==''){ phone.classList.add('border-danger'); }else{ phone.classList.remove('border-danger'); } if(message.value.trim()==''){ message.classList.add('border-danger'); }else{ message.classList.remove('border-danger'); } if(name.value.trim()==''|| subject.value.trim()==''|| email.value.trim()==''|| phone.value.trim()==''||message.value.trim()==''){ createBootstrapToast(['Error all field are required', position, 'text-danger']) return; } let data_up ={ action : 'send_email', data:{ name : name.value.trim().split(' ')[0], email : email.value.trim(), phone: phone.value.trim(), subject: subject.value.trim(), message: message.value.trim(), } } let html_dt = { inputs: [ name, phone, email, subject, message ], progress: data['prog'] } writeDb(data_up, url, html_dt) } function register_user(data){ let name= data['full_name']; let username= data['user_name']; let email = data['email']; let phone = data['phone']; let password= data['password']; let confirmPassword= data['c_password']; let url= data['url'].value; if(name.value.trim()==''){ name.classList.add('border-danger'); }else{ name.classList.remove('border-danger'); } if(username.value.trim()==''){ username.classList.add('border-danger'); }else{ username.classList.remove('border-danger'); } if(email.value.trim()==''){ email.classList.add('border-danger'); }else{ email.classList.remove('border-danger'); } if(phone.value.trim()==''){ phone.classList.add('border-danger'); }else{ phone.classList.remove('border-danger'); } if(password.value.trim()==''){ password.classList.add('border-danger'); }else{ password.classList.remove('border-danger'); } if(confirmPassword.value.trim()==''){ confirmPassword.classList.add('border-danger'); }else{ confirmPassword.classList.remove('border-danger'); } if(name.value.trim()=='' || username.value.trim()=='' || email.value.trim()=='' || phone.value.trim()=='' || password.value.trim()=='' || confirmPassword.value.trim()==''){ createBootstrapToast(["All field are required", position, 'text-danger']) return; } if(password.value.trim()!==confirmPassword.value.trim() || password.value.length<6){ createBootstrapToast(["Your passwords fields have errors", position, 'text-danger']) return; } let data_up ={ action : 'register', data:{ name : name.value.trim(), email : email.value.trim(), phone: phone.value.trim(), username: username.value.trim().replaceAll(' ', '_').toLowerCase(), password: password.value.trim(), confirmPassword: confirmPassword.value.trim(), } } let html_dt = { inputs: [ name, phone, email, username, password, confirmPassword ], progress: data['prog'] } writeDb(data_up, url, html_dt) } function login(data){ let name= data['name']; let password= data['password']; let url= data['url']; if(name.value.trim()==''){ name.classList.add('border-danger'); }else{ name.classList.remove('border-danger'); } if(password.value.trim()==''){ password.classList.add('border-danger'); }else{ password.classList.remove('border-danger'); } if(name.value.trim()==''|| password.value.trim()==''){ createBootstrapToast(["All field are required", position, 'text-danger']) return; } let data_up ={ action : 'login', data:{ name : name.value.trim(), password: password.value.trim(), } } let html_dt = { inputs: [ name, password ], progress: data['prog'] } writeDb(data_up, url, html_dt); } function forgotPassword(data){ let name= data['name']; let proG= data['proG']; let url= data['url'].value; if(name.value.trim()==''){ name.classList.add('border-danger'); }else{ name.classList.remove('border-danger'); } if(name.value.trim()==''){ createBootstrapToast(["All field are required", position, 'text-danger']) return; } let data_up ={ action : 'forgot_password', data:{ name : name.value.trim(), } } let html_dt = { inputs: [ name ], progress: proG } writeDb(data_up, url, html_dt); } let userEdata; function displaySelectedImage(file, imageCrop, imageModal, url, idpassed){ var myModal = new bootstrap.Modal(imageModal); let savePhoto = imageModal.querySelector('#save-photo'); let croper; let filevalue=file.files[0]; if(!filevalue){ return; } let filename=filevalue.name; if(filevalue){ myModal.show(); let fileReader = new FileReader(); fileReader.onload=(e)=>{ imageCrop.src= e.target.result; } fileReader.readAsDataURL(filevalue); } imageModal.addEventListener('shown.bs.modal', ()=>{ croper= new Cropper(imageCrop, { aspectRatio: 1, viewMode: 3, preview: '.preview-field' }) }) imageModal.addEventListener('hidden.bs.modal', ()=>{ croper.destroy(); croper = null; }); savePhoto.addEventListener('click', ()=>{ if (croper && croper.getCroppedCanvas()) { canvas = croper.getCroppedCanvas({ width: 200, height: 200, }); } else{ createBootstrapToast(["Please wait for cropper to load", position, 'text-danger']) return } canvas.toBlob((blob)=>{ // url = URL.createObjectURL(blob); var reader = new FileReader(); reader.readAsDataURL(blob); reader.onloadend = function() { var base64data = reader.result; let filedata= base64data.split(',')[1]; let data_up ={ action : 'edit_user_profile', data:{ file_data: { data: filedata, name: filename }, id: idpassed }, } let html_dt = { inputs: [file], progress: document.querySelector('#img-prog') } writeDb(data_up, url, html_dt); } }); }); } function updateProfilePhoto(){ } function userEditData(data){ userEdata= data; let icon= document.querySelector('.u-icon'); let image= document.querySelector('.u-image'); if(data.profile!==0){ icon.classList.remove('d-none'); image.classList.add('d-none'); }else{ image.classList.remove('d-none'); icon.classList.add('d-none'); } let nameField= document.querySelector('#full-name'); let userfield= document.querySelector('#user-name'); let emailField= document.querySelector('#user-email'); let phoneField= document.querySelector('#user-phone'); nameField.value= data.name userfield.value= data.username phoneField.value= data.phone emailField.value= data.email } function handleUpdateField(data){ let fieldData=data.field; let fieldDataOpt=data.fieldoptional; let field = data.title; let action = data.action; let url = data.url; let proG = data.proG; let id = userEdata.id; if(fieldData.value.trim()==""){ createBootstrapToast([`Empty ${field} `, position, 'text-danger']) return; } // console.log(userEdata[field]) if(fieldData.value.trim()==userEdata[field]){ createBootstrapToast([`This value is already saved try another one`, position, 'text-danger']) return; } let data_up ={ action : 'edit_user_data', data:{ name : fieldData.value.trim(), field : field, id: id }, } let html_dt = { inputs: [ fieldData ], progress: proG } if(field=='password'){ if(fieldDataOpt.value.trim()==""){ createBootstrapToast([`Empty confirm ${field} `, position, 'text-danger']) return; } data_up ={ action : 'edit_user_data', data:{ name : fieldData.value.trim(), name2 : fieldDataOpt.value.trim(), field : field, id: id }, } html_dt = { inputs: [ fieldData, fieldDataOpt ], progress: proG } } writeDb(data_up, url, html_dt); } function searchUserInterphase(data){ let searchTerm = data.term.trim(); let searchField= data.ui; searchField.innerHTML=''; let words = searchTerm.toLowerCase().split(" "); let smallAlert= document.createElement('h6'); smallAlert.classList.add('text-danger', 'text-center', 'my-2'); smallAlert.textContent="... No matching data!" if(searchTerm.length<1){ searchField.appendChild(smallAlert); console.log('nothing'); return } let filteredData = flatData words.forEach(word => { filteredData = filteredData.filter(item => Object.values(item).some(value => String(value).toLowerCase().includes(word) ) ); }); if(filteredData.length >0){ filteredData.forEach(ecahfound=>{ if(ecahfound.type){ searchField.appendChild(createListgroup(ecahfound, 'Folder', data.url)) }else if(ecahfound.notes){ let ext =ecahfound.original_name?ecahfound.original_name.split('.').pop():'' searchField.appendChild(createListgroup(ecahfound, 'Document', data.url, ext)) }else if(ecahfound.phone){ searchField.appendChild(createListgroup(ecahfound, 'User', data.url)) }else{ } }) }; if(filteredData.length==0 || searchField.innerHTML==""){ searchField.appendChild(smallAlert); } } function createListgroup(datas, title, url, ext){ let divMain = document.createElement('div'); divMain.setAttribute('class', 'list-group my-2'); let header= document.createElement('h6'); header.textContent=title; let link = document.createElement('a'); link.setAttribute('class', 'list-group-item list-group-item-action p-3'); let icon= document.createElement('i'); link.appendChild(icon) if(title=='Document'){ if(ext=='zip'){ link.href=`${url}/${datas.location}?zip=${url}/read/${datas.code}`; }else{ link.href=`${url}/read/${datas.code}`; } link.target=''; icon.setAttribute('class', 'fa fa-file mx-2'); }else if(title=='User'){ link.href=`${url}/${datas.username}`; icon.setAttribute('class', 'fa fa-user mx-2'); }else{ link.href=`${url}/${datas.code}`; icon.setAttribute('class', 'fa fa-folder mx-2'); } link.insertAdjacentText('beforeend', ` • ${datas.name}`) divMain.appendChild(header) divMain.appendChild(link) return divMain; } function allowfileDisplay({ url = "https://docs.google.com/gview?url=", allowed_trial = 5, loader="", iframe_error= "", trials=0, loaded= false, }) { $("iframe").remove(); $("body").append(` `) $(loader).show(); $("iframe").off('load').on('load', () => { loaded = true; $(iframe_error).hide(); $(loader).hide(); console.log('Iframe loaded!'); }) setTimeout(() => { if (!loaded) { console.log('Content loading failed!'); $(loader).hide(); $(iframe_error).show(); let trialId = setTimeout(() => { if (trials <= allowed_trial && !loaded) { console.log('Retrying to reload content...') allowfileDisplay({ url: url, allowed_trial: allowed_trial, trials : trials+=1, loader:loader, iframe_error:iframe_error }); } if (trials > allowed_trial) { loaded = true; let refresh = confirm('Retry failed.. Do you wish to reload the page?') if (refresh) window.location.href = " "; }; }, 500); } }, 15000); };