From e78ca4b77557bf0cf5c2b0dd21a8db893e02ca24 Mon Sep 17 00:00:00 2001 From: bruno Date: Mon, 13 Jul 2026 16:42:11 -0400 Subject: [PATCH] feat: sidebar arborescence Gitea + tab user repos avec vrai username MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Tab user repos: fetch username via /auth/user → affiche 'bruno' au lieu de 'Personal' 2. Sidebar: ws_cookie='gitea:owner:repo' → _sidebar_data() fetch le tree depuis Gitea API 3. base.html: data-gitea-path/type/sha sur les items workspace pour les projets Gitea 4. gitea_workspace.html: refonte sans tree panel → navigation via sidebar - Clic fichier → ouvre dans le contenu (lecture + edit + commit) - Clic dossier → lazy-load les enfants dans le sidebar 5. openGitea(): set cookie flowdeck_workspace avant navigation --- app/routers/dashboard.py | 37 +++- app/templates/base.html | 5 +- app/templates/gitea_workspace.html | 330 +++++++++++------------------ app/templates/workspaces.html | 15 +- 4 files changed, 172 insertions(+), 215 deletions(-) diff --git a/app/routers/dashboard.py b/app/routers/dashboard.py index 6abd441..514d604 100644 --- a/app/routers/dashboard.py +++ b/app/routers/dashboard.py @@ -69,7 +69,41 @@ def _sidebar_data(request: Request, repos: list[dict]) -> dict: ws_cookie = request.cookies.get("flowdeck_workspace", "") active_ws_name = "Workspace" workspace_pages = [] - if ws_cookie: + gitea_workspace = False + + if ws_cookie and ws_cookie.startswith("gitea:"): + # Gitea workspace: fetch repo tree for sidebar + parts = ws_cookie.split(":", 2) + if len(parts) >= 3: + gitea_owner = parts[1] + gitea_repo = parts[2] + active_ws_name = f"{gitea_owner}/{gitea_repo}" + gitea_workspace = True + # Fetch root tree from Gitea API (use admin token as fallback) + try: + from app.services.gitea_client import get_user_gitea_client, GiteaClient + gitea = get_user_gitea_client(request) or GiteaClient() + import asyncio + tree_items = asyncio.run(gitea.get_repo_contents(gitea_owner, gitea_repo)) + for item in tree_items: + is_folder = item.get("type") == "dir" + workspace_pages.append({ + "id": item.get("path", ""), + "name": item.get("name", ""), + "icon": "📁" if is_folder else "📄", + "url": f"javascript:void(0)", + "active": False, + "indent": 0, + "depth": 0, + "has_children": is_folder, + "children": [], + "_gitea_path": item.get("path", ""), + "_gitea_type": "folder" if is_folder else "file", + "_gitea_sha": item.get("sha", ""), + }) + except Exception: + pass + elif ws_cookie: workspace_pages = _load_workspace_pages(ws_cookie) try: with get_conn() as conn: @@ -83,6 +117,7 @@ def _sidebar_data(request: Request, repos: list[dict]) -> dict: "workspace_name": ws, "workspace_initial": initial, "active_ws_name": active_ws_name, "workspace_pages": workspace_pages, + "gitea_workspace": gitea_workspace, "current_page": "Dashboard", "last_edited": "now", "recent_pages": recent_pages, "private_pages": [], diff --git a/app/templates/base.html b/app/templates/base.html index a26c61a..4a45e43 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -28,7 +28,10 @@ @contextmenu.prevent="showContextMenu($event, '{{ page.id }}', '{{ page.name }}')" data-page-id="{{ page.id }}" data-page-depth="{{ depth }}" - data-has-children="{{ 'true' if page.has_children else 'false' }}"> + data-has-children="{{ 'true' if page.has_children else 'false' }}" + {% if page._gitea_path %}data-gitea-path="{{ page._gitea_path }}"{% endif %} + {% if page._gitea_type %}data-gitea-type="{{ page._gitea_type }}"{% endif %} + {% if page._gitea_sha %}data-gitea-sha="{{ page._gitea_sha }}"{% endif %}> {# Toggle chevron — only visible for items with children #} {% if page.has_children %} + @@ -20,16 +20,7 @@ {% block content %} -
- -
-
📁 GITEA REPO
+
+ + - -
Loading…
- - -