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.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<string>} 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');
}
}
});
}

View File

@@ -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 };
}
}