feat: drag-and-drop interne, file viewer multi-type, sidebar persistante
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped

1. Drag & drop interne: déplacer fichiers/dossiers existants vers d'autres
   dossiers ou racine via l'API /api/local-workspace/items/{id}/move.
   Items rendus draggable dans le template x-for et renderChildren.

2. File viewer pour fichiers uploadés: détection content_format='file',
   visualiseur intégré avec rendu adapté au type MIME:
   - Images: affichage direct
   - PDF: iframe
   - Texte/Code (.py .js .md .html .ps1 etc.): <pre> avec fetch du contenu
   - Autres: lien de téléchargement
   Route GET /api/files/{ws_id}/{filename:path} pour servir les fichiers.

3. Sidebar persistante: expandedFolders sauvegardé dans localStorage,
   restauré au chargement, préservé avant navigation vers un dossier.

4. Suppression: nettoie aussi le fichier disque pour content_format='file'
This commit is contained in:
2026-07-11 09:04:26 -04:00
parent 4810ff18eb
commit 4be4c3432b
4 changed files with 221 additions and 7 deletions
+9 -1
View File
@@ -803,12 +803,20 @@
},
// ── Tree expand/collapse + folder navigation ──
expandedFolders: {},
expandedFolders: (function() {
try { return JSON.parse(localStorage.getItem('fd_expanded_folders') || '{}'); }
catch(e) { return {}; }
})(),
toggleTreeFolder(id) {
this.expandedFolders[id] = !(this.expandedFolders[id] || false);
this.expandedFolders = Object.assign({}, this.expandedFolders);
try { localStorage.setItem('fd_expanded_folders', JSON.stringify(this.expandedFolders)); }
catch(e) {}
},
navigateToFolder(id) {
// Save expansion state before navigating
try { localStorage.setItem('fd_expanded_folders', JSON.stringify(this.expandedFolders)); }
catch(e) {}
window.location = `/local-workspace?folder=${id}`;
},