feat: multi-select for batch file/folder actions (#100)
- Add checkboxes to list view items (grid view already had them) - Add 'select all' checkbox in list view header - Add batch action bar with Delete, Move, and Download buttons - Batch delete: moves all selected items to trash in one operation - Batch move: reuses existing move dialog in batch mode - Batch download: downloads each selected item - Keyboard shortcuts: Ctrl+A (select all), Escape (deselect), Delete key - Shift+click for range selection in both grid and list views - Selection state synced between grid and list views - New multiSelect.js module manages selection state and batch operations
This commit is contained in:
@@ -202,6 +202,41 @@ const contextMenus = {
|
||||
|
||||
moveCancelBtn.addEventListener('click', this.closeMoveDialog);
|
||||
moveConfirmBtn.addEventListener('click', async () => {
|
||||
// Batch move mode (from multiSelect)
|
||||
if (window.app.moveDialogMode === 'batch' && window.multiSelect) {
|
||||
const targetId = window.app.selectedTargetFolderId;
|
||||
const items = window.app.batchMoveItems || [];
|
||||
let success = 0, errors = 0;
|
||||
|
||||
for (const item of items) {
|
||||
try {
|
||||
if (item.type === 'folder') {
|
||||
if (item.id === targetId) continue;
|
||||
const ok = await window.fileOps.moveFolder(item.id, targetId);
|
||||
if (ok) success++; else errors++;
|
||||
} else {
|
||||
const ok = await window.fileOps.moveFile(item.id, targetId);
|
||||
if (ok) success++; else errors++;
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Error moving item:', item, err);
|
||||
errors++;
|
||||
}
|
||||
}
|
||||
|
||||
this.closeMoveDialog();
|
||||
window.multiSelect.clear();
|
||||
window.loadFiles();
|
||||
|
||||
if (errors > 0) {
|
||||
window.ui.showNotification('Batch move', `${success} moved, ${errors} failed`);
|
||||
} else {
|
||||
window.ui.showNotification('Items moved',
|
||||
`${success} item${success !== 1 ? 's' : ''} moved successfully`);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (window.app.moveDialogMode === 'file' && window.app.contextMenuTargetFile) {
|
||||
const success = await window.fileOps.moveFile(
|
||||
window.app.contextMenuTargetFile.id,
|
||||
|
||||
Reference in New Issue
Block a user