diff --git a/routes/__pycache__/main.cpython-313.pyc b/routes/__pycache__/main.cpython-313.pyc index cd40288..761ab54 100644 Binary files a/routes/__pycache__/main.cpython-313.pyc and b/routes/__pycache__/main.cpython-313.pyc differ diff --git a/static/js/rooms/modalManager.js b/static/js/rooms/modalManager.js index 0d62df8..9c5c061 100644 --- a/static/js/rooms/modalManager.js +++ b/static/js/rooms/modalManager.js @@ -27,10 +27,18 @@ export class ModalManager { this.newFolderModal = new bootstrap.Modal(document.getElementById('newFolderModal')); this.renameModal = new bootstrap.Modal(document.getElementById('renameModal')); this.detailsModal = new bootstrap.Modal(document.getElementById('detailsModal')); - this.overwriteModal = new bootstrap.Modal(document.getElementById('overwriteConfirmModal'), { - backdrop: 'static', - keyboard: false - }); + + // Initialize overwrite modal with static backdrop and keyboard disabled + const overwriteModalEl = document.getElementById('overwriteConfirmModal'); + if (!overwriteModalEl) { + console.error('[ModalManager] Overwrite modal element not found'); + } else { + this.overwriteModal = new bootstrap.Modal(overwriteModalEl, { + backdrop: 'static', + keyboard: false + }); + } + this.moveModal = new bootstrap.Modal(document.getElementById('moveModal')); this.initializeModals(); @@ -225,30 +233,109 @@ export class ModalManager { /** * Shows the overwrite confirmation modal. - * @param {string} filename - The name of the file that would be overwritten + * @param {string} fileName - The name of the file that would be overwritten * @returns {Promise} A promise that resolves with the user's choice ('skip', 'skip_all', 'overwrite', or 'overwrite_all') */ - showOverwriteModal(filename) { + showOverwriteModal(fileName) { + console.log('[ModalManager] Showing overwrite modal for:', fileName); + return new Promise((resolve) => { - const fileNameEl = document.getElementById('overwriteFileName'); - if (fileNameEl) fileNameEl.textContent = filename; + // Get the modal element + const modalEl = document.getElementById('overwriteConfirmModal'); + if (!modalEl) { + console.error('[ModalManager] Overwrite modal element not found'); + resolve('skip'); + return; + } + console.log('[ModalManager] Modal element found:', modalEl); + + // Initialize the modal if it hasn't been initialized + if (!this.overwriteModal) { + console.log('[ModalManager] Initializing new modal instance'); + this.overwriteModal = new bootstrap.Modal(modalEl, { + backdrop: 'static', + keyboard: false + }); + } + + // Set the file name in the modal + const fileNameElement = document.getElementById('overwriteFileName'); + if (fileNameElement) { + fileNameElement.textContent = fileName; + } + + // Set up the modal buttons const skipBtn = document.getElementById('skipOverwriteBtn'); const skipAllBtn = document.getElementById('skipAllOverwriteBtn'); const overwriteBtn = document.getElementById('confirmOverwriteBtn'); const overwriteAllBtn = document.getElementById('confirmAllOverwriteBtn'); + if (!skipBtn || !skipAllBtn || !overwriteBtn || !overwriteAllBtn) { + console.error('[ModalManager] Modal buttons not found'); + resolve('skip'); + return; + } + + // Remove any existing event listeners + const newSkipBtn = skipBtn.cloneNode(true); + const newSkipAllBtn = skipAllBtn.cloneNode(true); + const newOverwriteBtn = overwriteBtn.cloneNode(true); + const newOverwriteAllBtn = overwriteAllBtn.cloneNode(true); + + skipBtn.parentNode.replaceChild(newSkipBtn, skipBtn); + skipAllBtn.parentNode.replaceChild(newSkipAllBtn, skipAllBtn); + overwriteBtn.parentNode.replaceChild(newOverwriteBtn, overwriteBtn); + overwriteAllBtn.parentNode.replaceChild(newOverwriteAllBtn, overwriteAllBtn); + + // Add new event listeners const handleResult = (result) => { + console.log('[ModalManager] User chose:', result); this.overwriteModal.hide(); resolve(result); }; - skipBtn.onclick = () => handleResult('skip'); - skipAllBtn.onclick = () => handleResult('skip_all'); - overwriteBtn.onclick = () => handleResult('overwrite'); - overwriteAllBtn.onclick = () => handleResult('overwrite_all'); + newSkipBtn.addEventListener('click', () => handleResult('skip')); + newSkipAllBtn.addEventListener('click', () => handleResult('skip_all')); + newOverwriteBtn.addEventListener('click', () => handleResult('overwrite')); + newOverwriteAllBtn.addEventListener('click', () => handleResult('overwrite_all')); - this.overwriteModal.show(); + // Add event listeners for modal events + modalEl.addEventListener('shown.bs.modal', () => { + console.log('[ModalManager] Modal shown event fired'); + }); + + modalEl.addEventListener('show.bs.modal', () => { + console.log('[ModalManager] Modal show event fired'); + }); + + // Hide the modal first if it's already shown + if (this.overwriteModal._element.classList.contains('show')) { + console.log('[ModalManager] Modal is already shown, hiding first'); + this.overwriteModal.hide(); + + // Add a small delay before showing the modal again + setTimeout(() => { + console.log('[ModalManager] Attempting to show modal after delay'); + try { + this.overwriteModal.show(); + console.log('[ModalManager] Overwrite modal shown successfully'); + } catch (error) { + console.error('[ModalManager] Error showing overwrite modal:', error); + resolve('skip'); + } + }, 100); + } else { + // Show the modal if it's not already shown + console.log('[ModalManager] Modal is not shown, showing directly'); + try { + this.overwriteModal.show(); + console.log('[ModalManager] Overwrite modal shown successfully'); + } catch (error) { + console.error('[ModalManager] Error showing overwrite modal:', error); + resolve('skip'); + } + } }); } diff --git a/static/js/rooms/uploadManager.js b/static/js/rooms/uploadManager.js index b9de46f..c2afbf1 100644 --- a/static/js/rooms/uploadManager.js +++ b/static/js/rooms/uploadManager.js @@ -188,17 +188,22 @@ export class UploadManager { try { updateProgress(); - let uploadFormData = formData; - if (this.overwriteAll) { - uploadFormData = new FormData(this.uploadForm); - if (this.roomManager.currentPath) { - uploadFormData.append('path', this.roomManager.currentPath); - } - uploadFormData.set('file', file); - uploadFormData.append('overwrite', 'true'); + // If skipAll is true, skip this file + if (this.skipAll) { + console.log('[UploadManager] Skipping file due to skipAll:', file.name); + currentFileIndex++; + updateProgress(); + await processNextFile(); + return; } - const response = await this.uploadFile(uploadFormData); + // If overwriteAll is true, add overwrite flag + if (this.overwriteAll) { + console.log('[UploadManager] Overwriting file due to overwriteAll:', file.name); + formData.append('overwrite', 'true'); + } + + const response = await this.uploadFile(formData); if (response.success) { completedFiles++; @@ -211,11 +216,28 @@ export class UploadManager { updateProgress(); await processNextFile(); } else if (response.error === 'File exists') { - const result = await this.handleFileExists(file, uploadFormData); - if (result.continue) { + // If we have skipAll or overwriteAll set, handle it here + if (this.skipAll) { + console.log('[UploadManager] Skipping existing file due to skipAll:', file.name); currentFileIndex++; updateProgress(); await processNextFile(); + } else if (this.overwriteAll) { + console.log('[UploadManager] Overwriting existing file due to overwriteAll:', file.name); + formData.append('overwrite', 'true'); + await this.uploadFile(formData); + completedFiles++; + currentFileIndex++; + updateProgress(); + await processNextFile(); + } else { + const result = await this.handleFileExists(file, formData); + if (result.continue) { + completedFiles++; + currentFileIndex++; + updateProgress(); + await processNextFile(); + } } } } catch (error) { @@ -245,6 +267,15 @@ export class UploadManager { }); const result = await response.json(); + + // Handle 409 Conflict response + if (response.status === 409) { + return { + success: false, + error: 'File exists' + }; + } + return { success: response.ok, error: result.error @@ -294,7 +325,7 @@ export class UploadManager { if (this.overwriteAll) { formData.append('overwrite', 'true'); const response = await this.uploadFile(formData); - return { continue: response.success }; + return { continue: true }; } if (this.skipAll) { @@ -303,20 +334,30 @@ export class UploadManager { const result = await this.roomManager.modalManager.showOverwriteModal(file.name); + // Add a delay before processing the result + await new Promise(resolve => setTimeout(resolve, 500)); + if (result === 'overwrite' || result === 'overwrite_all') { if (result === 'overwrite_all') { this.overwriteAll = true; + this.skipAll = false; + formData.append('overwrite', 'true'); + await this.uploadFile(formData); + return { continue: true }; + } else { + formData.append('overwrite', 'true'); + await this.uploadFile(formData); + return { continue: true }; } - formData.append('overwrite', 'true'); - const response = await this.uploadFile(formData); - return { continue: response.success }; } else if (result === 'skip' || result === 'skip_all') { if (result === 'skip_all') { this.skipAll = true; + this.overwriteAll = false; } return { continue: true }; } - return { continue: false }; + // If user closes the modal without making a choice, skip the file + return { continue: true }; } } \ No newline at end of file