fix: chargement tree sidebar 100% client-side (pas de asyncio.run)
Avant: _sidebar_data() utilisait asyncio.run() → RuntimeWarning + 302 redirects Après: gitea_workspace.html appelle loadSidebarTree() → fetch API → injecte dans #sidebar-workspace-items - base.html: ajout id='sidebar-workspace-items' sur le <ul> workspace - dashboard.py: _sidebar_data() ne fait plus de fetch serveur, juste passe owner/repo
This commit is contained in:
@@ -72,37 +72,14 @@ def _sidebar_data(request: Request, repos: list[dict]) -> dict:
|
|||||||
gitea_workspace = False
|
gitea_workspace = False
|
||||||
|
|
||||||
if ws_cookie and ws_cookie.startswith("gitea:"):
|
if ws_cookie and ws_cookie.startswith("gitea:"):
|
||||||
# Gitea workspace: fetch repo tree for sidebar
|
# Gitea workspace: set owner/repo for client-side tree loading
|
||||||
parts = ws_cookie.split(":", 2)
|
parts = ws_cookie.split(":", 2)
|
||||||
if len(parts) >= 3:
|
if len(parts) >= 3:
|
||||||
gitea_owner = parts[1]
|
gitea_owner = parts[1]
|
||||||
gitea_repo = parts[2]
|
gitea_repo = parts[2]
|
||||||
active_ws_name = f"{gitea_owner}/{gitea_repo}"
|
active_ws_name = f"{gitea_owner}/{gitea_repo}"
|
||||||
gitea_workspace = True
|
gitea_workspace = True
|
||||||
# Fetch root tree from Gitea API (use admin token as fallback)
|
workspace_pages = [] # loaded client-side
|
||||||
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:
|
elif ws_cookie:
|
||||||
workspace_pages = _load_workspace_pages(ws_cookie)
|
workspace_pages = _load_workspace_pages(ws_cookie)
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -167,7 +167,7 @@
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
<div class="sidebar-section-items" x-show="sectionsOpen.workspace" x-transition>
|
<div class="sidebar-section-items" x-show="sectionsOpen.workspace" x-transition>
|
||||||
<ul class="sidebar-items" data-section="workspace">
|
<ul class="sidebar-items" data-section="workspace" id="sidebar-workspace-items">
|
||||||
{% if workspace_pages %}
|
{% if workspace_pages %}
|
||||||
{{ render_workspace_tree(workspace_pages) }}
|
{{ render_workspace_tree(workspace_pages) }}
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|||||||
@@ -113,10 +113,36 @@ function giteaWorkspace() {
|
|||||||
init() {
|
init() {
|
||||||
// Set cookie for sidebar
|
// Set cookie for sidebar
|
||||||
document.cookie = 'flowdeck_workspace=gitea:' + this.owner + ':' + this.repo + ';path=/;SameSite=Lax';
|
document.cookie = 'flowdeck_workspace=gitea:' + this.owner + ':' + this.repo + ';path=/;SameSite=Lax';
|
||||||
|
// Load root tree into sidebar
|
||||||
|
this.loadSidebarTree();
|
||||||
// Listen for sidebar clicks on Gitea items
|
// Listen for sidebar clicks on Gitea items
|
||||||
this.setupSidebarClicks();
|
this.setupSidebarClicks();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
async loadSidebarTree() {
|
||||||
|
try {
|
||||||
|
var r = await fetch('/api/gitea/projects/' + this.owner + '/' + this.repo + '/tree');
|
||||||
|
if (!r.ok) return;
|
||||||
|
var d = await r.json();
|
||||||
|
var items = d.tree || [];
|
||||||
|
var container = document.getElementById('sidebar-workspace-items');
|
||||||
|
if (!container) return;
|
||||||
|
container.innerHTML = '';
|
||||||
|
var self = this;
|
||||||
|
items.forEach(function(item) {
|
||||||
|
var icon = item.type === 'folder' ? '📁' : '📄';
|
||||||
|
var li = document.createElement('li');
|
||||||
|
li.className = 'sidebar-item';
|
||||||
|
li.setAttribute('data-gitea-path', item.path);
|
||||||
|
li.setAttribute('data-gitea-type', item.type === 'folder' ? 'folder' : 'file');
|
||||||
|
li.setAttribute('data-gitea-sha', item.sha || '');
|
||||||
|
li.style.cssText = 'padding-left:12px;cursor:pointer;';
|
||||||
|
li.innerHTML = '<span class=\"page-icon\">' + icon + '</span><span class=\"page-name\">' + item.name + '</span>';
|
||||||
|
container.appendChild(li);
|
||||||
|
});
|
||||||
|
} catch(e) { console.error('Sidebar tree load failed:', e); }
|
||||||
|
},
|
||||||
|
|
||||||
setupSidebarClicks() {
|
setupSidebarClicks() {
|
||||||
var self = this;
|
var self = this;
|
||||||
document.addEventListener('click', function(e) {
|
document.addEventListener('click', function(e) {
|
||||||
|
|||||||
Reference in New Issue
Block a user