From c59f38659e5b7b14e82a72c09a4ed5f200037fd4 Mon Sep 17 00:00:00 2001 From: bruno Date: Sat, 11 Jul 2026 09:28:31 -0400 Subject: [PATCH] =?UTF-8?q?fix:=20drag-drop=20cible=20dossier,=20ic=C3=B4n?= =?UTF-8?q?es=20seules,=20filtre=20recherche,=20preview=20hover?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Drag & drop: ajout data-folder-id sur les items x-for et renderChildren. onDrop lit cet attribut au lieu de parser onclick (cassé pour x-for). Corrige le bug où les fichiers droppés allaient toujours à la racine. 2. Boutons création: remplacés par .btn-icon (icône seule, 34px, tooltip natif). Style Notion épuré. 3. Barre de recherche: champ 🔍 qui filtre displayTree en temps réel. Matching récursif (un dossier match si lui ou un enfant match). 4. Preview hover: popup positionné au curseur montrant les 500 premiers caractères du fichier. Fonctionne sur x-for et renderChildren. --- app/routers/dashboard.py | 1 + app/templates/local_workspace.html | 116 +++++++++++++++++++++++++---- 2 files changed, 101 insertions(+), 16 deletions(-) diff --git a/app/routers/dashboard.py b/app/routers/dashboard.py index 696f86e..90a2f2b 100644 --- a/app/routers/dashboard.py +++ b/app/routers/dashboard.py @@ -523,6 +523,7 @@ async def local_workspace_page(request: Request, folder: int = None): "user": user, "workspace_name": sidebar.get("active_ws_name", "My Workspace"), "current_folder_id": current_folder_id or 0, + "workspace_id": ws_id or 0, "breadcrumb": breadcrumb, } template = env.get_template("local_workspace.html") diff --git a/app/templates/local_workspace.html b/app/templates/local_workspace.html index 15994ef..029df58 100644 --- a/app/templates/local_workspace.html +++ b/app/templates/local_workspace.html @@ -68,6 +68,9 @@ .btn-danger{background:rgba(255,80,80,.1);color:var(--danger);} .btn-danger:hover{background:rgba(255,80,80,.2);} +.btn-icon{width:34px;height:34px;display:inline-flex;align-items:center;justify-content:center;background:var(--bg-tertiary);border:1px solid var(--border);border-radius:8px;cursor:pointer;font-size:16px;color:var(--text-secondary);transition:all 150ms;} +.btn-icon:hover{background:var(--bg-hover);color:var(--text);border-color:var(--border-strong);} + .modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,.6);display:flex;align-items:center;justify-content:center;z-index:999;backdrop-filter:blur(4px);} .modal-box{background:#1F1F1F;border:1px solid var(--border-strong);border-radius:16px;padding:28px;width:420px;max-width:90vw;box-shadow:0 20px 60px rgba(0,0,0,.5);} .modal-box h3{font-size:16px;margin-bottom:6px;display:flex;align-items:center;gap:8px;} @@ -94,6 +97,20 @@ .upload-progress{position:fixed;bottom:24px;right:24px;background:var(--bg);border:1px solid var(--border-strong);border-radius:12px;padding:16px 20px;z-index:200;box-shadow:0 8px 30px rgba(0,0,0,.4);min-width:200px;} .upload-progress .up-bar{height:4px;background:var(--bg-tertiary);border-radius:2px;margin-top:8px;overflow:hidden;} .upload-progress .up-bar-fill{height:100%;background:var(--accent);border-radius:2px;transition:width 200ms;} + +/* Search bar */ +.search-bar{display:flex;align-items:center;gap:8px;margin-bottom:12px;padding:8px 12px;background:var(--bg-tertiary);border:1px solid var(--border);border-radius:8px;} +.search-bar:focus-within{border-color:var(--accent);} +.search-icon{font-size:14px;color:var(--text-tertiary);flex-shrink:0;} +.search-input{flex:1;background:none;border:none;color:var(--text);font-size:13px;outline:none;} +.search-input::placeholder{color:var(--text-tertiary);} +.search-clear{background:none;border:none;color:var(--text-tertiary);cursor:pointer;font-size:16px;padding:2px 4px;border-radius:3px;} +.search-clear:hover{color:var(--text);background:var(--bg-hover);} + +/* File preview tooltip */ +.file-preview{position:fixed;z-index:300;background:var(--bg);border:1px solid var(--border-strong);border-radius:10px;box-shadow:0 8px 30px rgba(0,0,0,.5);max-width:400px;min-width:200px;pointer-events:auto;} +.file-preview-header{padding:8px 12px;font-size:12px;font-weight:600;color:var(--text-secondary);border-bottom:1px solid var(--border);} +.file-preview-body{padding:10px 12px;margin:0;font-size:12px;line-height:1.5;color:var(--text);max-height:200px;overflow:auto;font-family:'Fira Code','Cascadia Code',monospace;white-space:pre-wrap;word-wrap:break-word;}
- - + +
-