From a67470d616c8cb69852726724f309ce00fbd8ad3 Mon Sep 17 00:00:00 2001 From: Kobe Date: Tue, 27 May 2025 11:43:10 +0200 Subject: [PATCH] Fix permanent delete --- __pycache__/app.cpython-313.pyc | Bin 4081 -> 5179 bytes routes/__pycache__/room_files.cpython-313.pyc | Bin 36760 -> 36917 bytes routes/__pycache__/trash.cpython-313.pyc | Bin 5792 -> 7171 bytes routes/room_files.py | 16 +- routes/trash.py | 19 +- static/js/trash.js | 15 ++ templates/rooms/room.html | 252 ++++++++++-------- .../13/20250526_145757_Kobe_Amerijckx.docx | Bin 15545 -> 0 bytes uploads/15/20250526_150145_logo-light.png | Bin 2874 -> 0 bytes uploads/15/20250526_150153_logo-light.png | Bin 2874 -> 0 bytes .../15/20250526_150153_logo-placeholder.png | Bin 3809 -> 0 bytes 11 files changed, 176 insertions(+), 126 deletions(-) delete mode 100644 uploads/13/20250526_145757_Kobe_Amerijckx.docx delete mode 100644 uploads/15/20250526_150145_logo-light.png delete mode 100644 uploads/15/20250526_150153_logo-light.png delete mode 100644 uploads/15/20250526_150153_logo-placeholder.png diff --git a/__pycache__/app.cpython-313.pyc b/__pycache__/app.cpython-313.pyc index ffb20a632aabae914d6002a6d6c5939933faa500..45ae237ad821083ad13f887a5b145fe790693bea 100644 GIT binary patch delta 1122 zcma)4%}*0S6rXL`?RK}@E+3^(AZ$qaC`cs=1~oxYkdFfd3UX+quI&~!*|s>dRcT_X ziHYb1$Q<`YrgjR$wLZ+`RUz2E!I+gE7*(BVFk zBmt0T>r?O2vG~?~)n+@kV@aypjM*0KILCJRYWf%&0YKR62Yn?7QXKxs_KCIaWIqQ2 zAn4mxw~5HMMRvp43yZa&&QV5?f8aqb!3zJ1+HxnXv6LGvoL@ri4$65bBQd zvFZaL!s8};V^0eR+fOtpV6h@n)<+bwgp>Ol zbhge=jek9J;J>rIf2EQwy$(;^O8Evkas%;+SDfiu7L#4P|?V|9O)fC09y=5?4?r7Sj+)WDH{^6ciyH2pA|6B$x<8g~4I+MCdds0-1=#(f>Ay&4^ zQ(D%q;5&RxuB4~rx=NzZ1~HGpF$XHWFNFcZf$grbZDQr|eR*m}p4yeCSJ|(k zeBi2Fn|Lv??Yp?=>dm{VzR5LtZy;ZFK406IuW8PE>+`k#g5;kAJ4EZNC01o3To)*C%koFcm T#R<=VV~}Ayg<%_h;~D)0r}!5= delta 199 zcmdn3@ll@dGcPX}0}yO0H_4Fa+{kCm#JFj*7gIU&WM(!~ZV`2$R49WAgQnVKX-ekjD(fpLelLPViBh+#tv?`MfIY=89%9 zCdS*7`&-2r{A6EQPCf;OXbXrP3=Bb5lMki{PhM>-Jo#lCukc+425tsSc}Dxm3mRl6 z_uFw93I}r*SH}pI^BGt`HZy7!YX$}#HM>r@|=-*RYc>4sQC2o ziQx-4E{kg15s{kiJIQx}<`og0FI)_q-2GggT-P}yFLFrEP`bt;`;kqNfnV;6%H*al z6@LNA&kT$p=kN$l@L%Ax+A$Km$}W{{F!#qvNO9?^5+ z@X%&DX08S#PiS*_O0k|WmG%^6Jt@lSDYf}omog)x@no(ZDMs7Psy)%n5}J%^pP3n$ R1VDrr<3|=CzbF!D5CBOvzSRH# delta 628 zcmdnGfN92jCf?7yyj%=G;MHoH;kuF6uz7N}1t(Jw%j5(frO6F~9FxzhvTm+u7Gq-E zGP%E1j3tyUNMUj!hcFkvRRjY=VkHBE++=+n`N{pEB4W{+Ad^5Kl);n{%3_Q|)nyV={xw<2ev3>H14kZ>*pwB0DHgg#P z>0%}z-Z;6p^Its!4`07|r}>1m%iJ;_m{@ro81Kl)&3B*aKHq1i&l;Hx>6bO_4lo^O zKgfPU=)Cwz@yjxS6FBb(i%vJ6Xg=L;qTK?`>%ux0g>~+Th)wsLl~67IV5K&UE`4bD9gYv_eFt$mA&1o(d#;k=tUOMD=gxZ6}m+nL}WiRFoJ9r z5WOH_wZm|S@&z%w>jL%{1?+!+U)FdClpyd z)HXMFD>KS~JhqadC=#f!C>%)K;;_lhPbtkwwJWmOe5faySwfvr?K3k2lK_bDV*JPg I5#hUuW>Lb z_Cqsob{(_Rf_Y!!lXkdj%>N5|l z=^>5cQLvwVmHLMVChgXCPps?yx2Z_E`ZP9yv6CtuBt8Wofg4MF4uD&IM)y*e@zI5- zvj_wGb==<3$Afg2l}Nc$Ob2D{CIZfb^hN8L1Be~C14ml0GAY+ssl8<{NL8FV zeTQY>1zn8AdC&+_xcr7AMkU6}21ZSxY)Q!1Wsl0_mIV)wx$=+nMf;4l?oh6>h zp;B+AizvotL?vrdlI+CQ{P957h?QH)&nOGy3h_g4;>-k|^4FC55$s$J@CIzwVY30- zb=bb+&|td;uN$ymhyA;7a3!(N)o+B?!v-hloUr}E!)}ceG%jv%!#X#-%OzJ{J+cE| z_1fI(+}hIW(q`hTuKROe_U=|)U5P*Oh4y?cA282phb!=;%D=X-y0AI8Th+854Bw00 zjollbzB_!s?x$L9WK6p?X$(#2LsQ$`M%TbET?1PF9V0)h=V!I~r9S~!prZ6ac{v0i zbd$d0+V=-GuB>0#=v(jG5)6Nb{+7u<~WHDE5 z0g*)`SfXYF9YJyjUjWpLm+}ocd-KK2yVFu1no_?B?A0|;7Y}WK_7S*F9WXd9ss9C- CL^q!R delta 192 zcmZp+SfI=InU|M~0SLM`8)X#mZR9&4#LWWaG6V5v6~@UAh0aZ87vp6Vn!J!jc(R?K z6;F{bP^w52M2Jo97Sv+V0x~BHNJ!~36^VmHO@Kr(6Od3)D6#@lx42Vt3rZ^EONtVU zGl~L$BFP{Xd6ReZ=`(#{o4iF*X>vEe^5j&hM3!4j`Nfk@OBpZ*O#UM!#TYeNT>6Rx YC!^YDW(Fn!5aGc1kp;*vvH= r.json()) .then(files => { + if (!files || !files.length) { + // No files to delete, just close the modal + const modal = bootstrap.Modal.getInstance(document.getElementById('emptyTrashModal')); + modal.hide(); + return Promise.resolve([]); + } + // Get unique room IDs const roomIds = [...new Set(files.map(file => file.room_id))]; @@ -61,12 +68,20 @@ window.emptyTrash = function() { // Close the modal const modal = bootstrap.Modal.getInstance(document.getElementById('emptyTrashModal')); modal.hide(); + // Refresh the view to ensure everything is up to date + fetchFiles(); } else { console.error('Failed to empty trash in some rooms'); + // Show error message to user + const grid = document.getElementById('fileGrid'); + grid.innerHTML = '
Failed to empty trash. Please try again.
'; } }) .catch(error => { console.error('Error emptying trash:', error); + // Show error message to user + const grid = document.getElementById('fileGrid'); + grid.innerHTML = '
Error emptying trash. Please try again.
'; }); }; diff --git a/templates/rooms/room.html b/templates/rooms/room.html index 9de7de1..6eee98f 100644 --- a/templates/rooms/room.html +++ b/templates/rooms/room.html @@ -1360,7 +1360,9 @@ document.addEventListener('DOMContentLoaded', function() { moveModal = new bootstrap.Modal(document.getElementById('moveModal')); // Add click handler for move confirmation button - document.getElementById('confirmMoveBtn').addEventListener('click', moveFileConfirmed); + if (canMove === true || canMove === 'true') { + document.getElementById('confirmMoveBtn').addEventListener('click', moveFileConfirmed); + } // Add click handler for new folder button if (canUpload === true || canUpload === 'true') { @@ -1715,126 +1717,140 @@ document.addEventListener('DOMContentLoaded', function() { // Start processing files await processNextFile(); } - - // Robust modal show logic - function showOverwriteModal(filename) { - console.log('[Modal] showOverwriteModal called for', filename); - - // If there's an existing modal promise, resolve it with skip - if (modalResolve) { - modalResolve('skip'); - modalResolve = null; - } - - // Create a new promise for this modal interaction - modalPromise = new Promise((resolve) => { - modalResolve = resolve; - - // Update modal content - document.getElementById('overwriteFileName').textContent = filename; - - // Get modal elements - const modalEl = document.getElementById('overwriteConfirmModal'); - - // Ensure modal is properly initialized with static backdrop - if (!overwriteModal) { - overwriteModal = new bootstrap.Modal(modalEl, { - backdrop: 'static', - keyboard: false - }); - } - - // Get fresh button references - const confirmOverwriteBtn = document.getElementById('confirmOverwriteBtn'); - const skipOverwriteBtn = document.getElementById('skipOverwriteBtn'); - const confirmAllOverwriteBtn = document.getElementById('confirmAllOverwriteBtn'); - const skipAllOverwriteBtn = document.getElementById('skipAllOverwriteBtn'); - - // Remove any existing event listeners by cloning and replacing - const newConfirmOverwriteBtn = confirmOverwriteBtn.cloneNode(true); - const newSkipOverwriteBtn = skipOverwriteBtn.cloneNode(true); - const newConfirmAllOverwriteBtn = confirmAllOverwriteBtn.cloneNode(true); - const newSkipAllOverwriteBtn = skipAllOverwriteBtn.cloneNode(true); - - confirmOverwriteBtn.parentNode.replaceChild(newConfirmOverwriteBtn, confirmOverwriteBtn); - skipOverwriteBtn.parentNode.replaceChild(newSkipOverwriteBtn, skipOverwriteBtn); - confirmAllOverwriteBtn.parentNode.replaceChild(newConfirmAllOverwriteBtn, confirmAllOverwriteBtn); - skipAllOverwriteBtn.parentNode.replaceChild(newSkipAllOverwriteBtn, skipAllOverwriteBtn); - - let modalClosed = false; - - // Function to handle modal resolution - const resolveModal = (choice) => { - if (!modalClosed) { - modalClosed = true; - if (modalResolve) { - modalResolve(choice); - modalResolve = null; - } - overwriteModal.hide(); - } - }; - - // Add click handlers directly to the buttons - newConfirmOverwriteBtn.onclick = () => { - console.log('[Modal] Overwrite clicked'); - resolveModal('overwrite'); - }; - - newSkipOverwriteBtn.onclick = () => { - console.log('[Modal] Skip clicked'); - resolveModal('skip'); - }; - - newConfirmAllOverwriteBtn.onclick = () => { - console.log('[Modal] Overwrite All clicked'); - overwriteAll = true; - resolveModal('overwrite_all'); - }; - - newSkipAllOverwriteBtn.onclick = () => { - console.log('[Modal] Skip All clicked'); - skipAll = true; - resolveModal('skip_all'); - }; - - // Prevent modal from being closed by clicking outside or pressing escape - modalEl.addEventListener('click', (e) => { - if (e.target === modalEl) { - e.preventDefault(); - e.stopPropagation(); - } - }); - - // Add modal close handler - const handleModalClose = (e) => { - if (!modalClosed && modalResolve) { - console.log('[Modal] Modal closed without explicit choice'); - e.preventDefault(); - e.stopPropagation(); - // Re-show the modal if it was closed without a choice - overwriteModal.show(); - } - }; - - // Remove any existing close handler and add new one - modalEl.removeEventListener('hidden.bs.modal', handleModalClose); - modalEl.addEventListener('hidden.bs.modal', handleModalClose); - - // Show the modal - overwriteModal.show(); - - // Ensure modal is visible and focused - modalEl.style.display = 'block'; - modalEl.classList.add('show'); - modalEl.focus(); - }); - - return modalPromise; - } } }); +// Add event listener for delete confirmation button +if (canDelete === true || canDelete === 'true') { + document.getElementById('confirmDeleteBtn').addEventListener('click', deleteFileConfirmed); +} + +// Add event listener for rename confirmation button +if (canRename === true || canRename === 'true') { + document.getElementById('confirmRenameBtn').addEventListener('click', function() { + if (!renameTarget) return; + let newName = document.getElementById('renameInput').value.trim(); + if (renameIsFile) { + if (!newName) { + document.getElementById('renameError').textContent = 'New name is required.'; + return; + } + newName = newName + renameOrigExt; + } + const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content'); + if (!newName) { + document.getElementById('renameError').textContent = 'New name is required.'; + return; + } + fetch(`/api/rooms/${roomId}/rename`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-CSRFToken': csrfToken + }, + body: JSON.stringify({ + old_name: renameTarget, + new_name: newName, + path: currentPath + }) + }) + .then(r => r.json()) + .then(res => { + if (res.success) { + fetchFiles(); + var modalEl = document.getElementById('renameModal'); + var modal = bootstrap.Modal.getInstance(modalEl); + modal.hide(); + } else { + document.getElementById('renameError').textContent = res.error || 'Rename failed.'; + } + }) + .catch(() => { + document.getElementById('renameError').textContent = 'Rename failed.'; + }); + }); +} + +// Add event listener for download selected +if (canDownload === true || canDownload === 'true') { + document.getElementById('downloadSelectedBtn').addEventListener('click', function() { + const selectedCheckboxes = document.querySelectorAll('.select-item-checkbox:checked'); + if (selectedCheckboxes.length === 0) return; + + const selectedItems = Array.from(selectedCheckboxes).map(cb => { + const idx = parseInt(cb.dataset.idx); + return window.currentFiles[idx]; + }); + + // Submit the request to download the zip + const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content'); + fetch(`/api/rooms/${roomId}/download-zip`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-CSRFToken': csrfToken + }, + body: JSON.stringify({ items: selectedItems }) + }) + .then(response => { + if (!response.ok) { + throw new Error('Download failed'); + } + return response.blob(); + }) + .then(blob => { + // Create a download link and trigger it + const url = window.URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = 'download.zip'; + document.body.appendChild(a); + a.click(); + window.URL.revokeObjectURL(url); + a.remove(); + }) + .catch(error => { + console.error('Error downloading files:', error); + document.getElementById('fileError').textContent = 'Failed to download files.'; + }); + }); +} + +// Add event listener for batch delete +if (canDelete === true || canDelete === 'true') { + document.getElementById('deleteSelectedBtn').addEventListener('click', function() { + const selectedCheckboxes = document.querySelectorAll('.select-item-checkbox:checked'); + if (selectedCheckboxes.length === 0) return; + + batchDeleteItems = Array.from(selectedCheckboxes).map(cb => { + const idx = parseInt(cb.dataset.idx); + return window.currentFiles[idx]; + }); + + // Get the modal element + const modalEl = document.getElementById('deleteConfirmModal'); + if (!modalEl) { + console.error('Delete modal element not found'); + return; + } + + // Initialize the modal if it hasn't been initialized + if (!deleteModal) { + deleteModal = new bootstrap.Modal(modalEl); + } + + // Update modal content + const fileNameEl = document.getElementById('deleteFileName'); + const labelEl = document.getElementById('deleteConfirmLabel'); + + if (fileNameEl) fileNameEl.textContent = `${selectedCheckboxes.length} item${selectedCheckboxes.length > 1 ? 's' : ''}`; + if (labelEl) labelEl.textContent = 'Move to Trash'; + + // Show the modal + deleteModal.show(); + }); +} + function navigateToParent() { if (!currentPath) return; const parts = currentPath.split('/'); diff --git a/uploads/13/20250526_145757_Kobe_Amerijckx.docx b/uploads/13/20250526_145757_Kobe_Amerijckx.docx deleted file mode 100644 index ed98e520880958d099ac656918dd359303f38af9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15545 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