fix: sidebar — x-data vide masquait appState() + header Notion-style + null-guards
FlowDeck CI / test (push) Failing after 4s
FlowDeck CI / docker (push) Has been skipped

- Sidebar avait x-data vide qui créait un scope isolé → vars (workspaceMenuOpen,
  toggleWorkspaceMenu, sidebarCollapsed) introuvables → rien ne fonctionnait
- Suppression x-data → héritage du scope appState() parent
- Header restylé Notion: .sidebar-workspace-header avec border-radius + hover bg
- Mouse hover (mouseenter/mouseleave) active wsHeaderHover → fond plus clair
- Null-guards: folderStack[-1] sécurisé, ctxMenu.node && ctxMenu.node.is_folder
This commit is contained in:
2026-07-12 12:53:46 -04:00
parent ab0eedd5fe
commit d7c0d428e8
3 changed files with 42 additions and 28 deletions
+23 -25
View File
@@ -58,33 +58,30 @@
<aside class="sidebar"
:class="{ collapsed: sidebarCollapsed, 'mobile-open': mobileSidebarOpen }"
id="sidebar"
x-data x-init="$nextTick(() => { if(typeof initTreeSortable==='function') initTreeSortable(); })">
<!-- Workspace header + mobile back -->
<div style="display:flex;align-items:center;gap:4px;">
<button class="sidebar-back-btn" @click="mobileSidebarOpen = false; sidebarCollapsed = true;" x-show="mobileSidebarOpen" title="Fermer le menu">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>
</button>
<div class="sidebar-workspace" @click="toggleWorkspaceMenu" style="flex:1;">
<div class="workspace-info">
<div class="workspace-avatar">{{ workspaceInitial }}</div>
<span class="workspace-name">{{ workspaceName }}</span>
</div>
<span class="workspace-chevron" :class="{ open: workspaceMenuOpen }">▾</span>
x-init="$nextTick(() => { if(typeof initTreeSortable==='function') initTreeSortable(); })">
<!-- Workspace header styled like Notion -->
<div class="sidebar-workspace-header" @click="toggleWorkspaceMenu" @mouseenter="wsHeaderHover=true" @mouseleave="wsHeaderHover=false"
:class="{ hover: wsHeaderHover || workspaceMenuOpen }">
<div class="workspace-info">
<div class="workspace-avatar">{{ workspaceInitial }}</div>
<span class="workspace-name">{{ workspaceName }}</span>
</div>
<!-- User menu dropdown -->
<div class="user-menu-dropdown" x-show="workspaceMenuOpen" @click.outside="workspaceMenuOpen=false" x-transition>
<div class="um-user-info">
<div class="um-avatar">{{ workspaceInitial }}</div>
<div>
<div class="um-name">{{ user.full_name or user.login }}</div>
<div class="um-plan">{{ user.email or '' }}</div>
</div>
<span class="workspace-chevron" :class="{ open: workspaceMenuOpen }">▾</span>
</div>
<!-- User menu dropdown -->
<div class="user-menu-dropdown" x-show="workspaceMenuOpen" @click.outside="workspaceMenuOpen=false" x-transition>
<div class="um-user-info">
<div class="um-avatar">{{ workspaceInitial }}</div>
<div>
<div class="um-name">{{ user.full_name or user.login }}</div>
<div class="um-plan">{{ user.email or '' }}</div>
</div>
<div class="um-sep"></div>
<a href="/settings" class="um-item" @click="workspaceMenuOpen=false">⚙️ Settings</a>
<a href="/workspaces" class="um-item" @click="workspaceMenuOpen=false">🔄 Switch workspace</a>
<div class="um-sep"></div>
<a href="/auth/logout" class="um-item um-danger" @click="workspaceMenuOpen=false">🚪 Log out</a>
</div>
<div class="um-sep"></div>
<a href="/settings" class="um-item" @click="workspaceMenuOpen=false">⚙️ Settings</a>
<a href="/workspaces" class="um-item" @click="workspaceMenuOpen=false">🔄 Switch workspace</a>
<div class="um-sep"></div>
<a href="/auth/logout" class="um-item um-danger" @click="workspaceMenuOpen=false">🚪 Log out</a>
</div>
</div>
@@ -523,6 +520,7 @@
sidebarCollapsed: false,
mobileSidebarOpen: false,
showInvite: true,
wsHeaderHover: false,
workspaceName: '{{ workspace_name }}',
workspaceInitial: '{{ workspace_initial }}',
currentPage: '{{ current_page }}',