fix upload multi

This commit is contained in:
2025-05-30 23:31:14 +02:00
parent 0d5fd83e01
commit f13f5a1e08
3 changed files with 157 additions and 29 deletions

View File

@@ -27,10 +27,18 @@ export class ModalManager {
this.newFolderModal = new bootstrap.Modal(document.getElementById('newFolderModal')); this.newFolderModal = new bootstrap.Modal(document.getElementById('newFolderModal'));
this.renameModal = new bootstrap.Modal(document.getElementById('renameModal')); this.renameModal = new bootstrap.Modal(document.getElementById('renameModal'));
this.detailsModal = new bootstrap.Modal(document.getElementById('detailsModal')); this.detailsModal = new bootstrap.Modal(document.getElementById('detailsModal'));
this.overwriteModal = new bootstrap.Modal(document.getElementById('overwriteConfirmModal'), {
backdrop: 'static', // Initialize overwrite modal with static backdrop and keyboard disabled
keyboard: false 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.moveModal = new bootstrap.Modal(document.getElementById('moveModal'));
this.initializeModals(); this.initializeModals();
@@ -225,30 +233,109 @@ export class ModalManager {
/** /**
* Shows the overwrite confirmation modal. * 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<string>} A promise that resolves with the user's choice ('skip', 'skip_all', 'overwrite', or 'overwrite_all') * @returns {Promise<string>} A promise that resolves with the user's choice ('skip', 'skip_all', 'overwrite', or 'overwrite_all')
*/ */
showOverwriteModal(filename) { showOverwriteModal(fileName) {
return new Promise((resolve) => { console.log('[ModalManager] Showing overwrite modal for:', fileName);
const fileNameEl = document.getElementById('overwriteFileName');
if (fileNameEl) fileNameEl.textContent = filename;
return new Promise((resolve) => {
// 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 skipBtn = document.getElementById('skipOverwriteBtn');
const skipAllBtn = document.getElementById('skipAllOverwriteBtn'); const skipAllBtn = document.getElementById('skipAllOverwriteBtn');
const overwriteBtn = document.getElementById('confirmOverwriteBtn'); const overwriteBtn = document.getElementById('confirmOverwriteBtn');
const overwriteAllBtn = document.getElementById('confirmAllOverwriteBtn'); 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) => { const handleResult = (result) => {
console.log('[ModalManager] User chose:', result);
this.overwriteModal.hide(); this.overwriteModal.hide();
resolve(result); resolve(result);
}; };
skipBtn.onclick = () => handleResult('skip'); newSkipBtn.addEventListener('click', () => handleResult('skip'));
skipAllBtn.onclick = () => handleResult('skip_all'); newSkipAllBtn.addEventListener('click', () => handleResult('skip_all'));
overwriteBtn.onclick = () => handleResult('overwrite'); newOverwriteBtn.addEventListener('click', () => handleResult('overwrite'));
overwriteAllBtn.onclick = () => handleResult('overwrite_all'); 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');
}
}
}); });
} }

View File

@@ -188,17 +188,22 @@ export class UploadManager {
try { try {
updateProgress(); updateProgress();
let uploadFormData = formData; // If skipAll is true, skip this file
if (this.overwriteAll) { if (this.skipAll) {
uploadFormData = new FormData(this.uploadForm); console.log('[UploadManager] Skipping file due to skipAll:', file.name);
if (this.roomManager.currentPath) { currentFileIndex++;
uploadFormData.append('path', this.roomManager.currentPath); updateProgress();
} await processNextFile();
uploadFormData.set('file', file); return;
uploadFormData.append('overwrite', 'true');
} }
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) { if (response.success) {
completedFiles++; completedFiles++;
@@ -211,11 +216,28 @@ export class UploadManager {
updateProgress(); updateProgress();
await processNextFile(); await processNextFile();
} else if (response.error === 'File exists') { } else if (response.error === 'File exists') {
const result = await this.handleFileExists(file, uploadFormData); // If we have skipAll or overwriteAll set, handle it here
if (result.continue) { if (this.skipAll) {
console.log('[UploadManager] Skipping existing file due to skipAll:', file.name);
currentFileIndex++; currentFileIndex++;
updateProgress(); updateProgress();
await processNextFile(); 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) { } catch (error) {
@@ -245,6 +267,15 @@ export class UploadManager {
}); });
const result = await response.json(); const result = await response.json();
// Handle 409 Conflict response
if (response.status === 409) {
return {
success: false,
error: 'File exists'
};
}
return { return {
success: response.ok, success: response.ok,
error: result.error error: result.error
@@ -294,7 +325,7 @@ export class UploadManager {
if (this.overwriteAll) { if (this.overwriteAll) {
formData.append('overwrite', 'true'); formData.append('overwrite', 'true');
const response = await this.uploadFile(formData); const response = await this.uploadFile(formData);
return { continue: response.success }; return { continue: true };
} }
if (this.skipAll) { if (this.skipAll) {
@@ -303,20 +334,30 @@ export class UploadManager {
const result = await this.roomManager.modalManager.showOverwriteModal(file.name); 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' || result === 'overwrite_all') {
if (result === 'overwrite_all') { if (result === 'overwrite_all') {
this.overwriteAll = true; 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') { } else if (result === 'skip' || result === 'skip_all') {
if (result === 'skip_all') { if (result === 'skip_all') {
this.skipAll = true; this.skipAll = true;
this.overwriteAll = false;
} }
return { continue: true }; return { continue: true };
} }
return { continue: false }; // If user closes the modal without making a choice, skip the file
return { continue: true };
} }
} }