feat(ux): refonte barre latérale /compte et fix CLI tokens

- Déconnexion déplacée dans la sidebar (lien discret) et retirée du dropdown navbar
- Email utilisateur connecté = lien simple vers /compte/admin (sans dropdown)
- Hover orange pâle sur les nav-links des sidebars
- fix(cli): load_dotenv() dans tokens_cli pour charger .env hors contexte app

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DRGb8NAMwaTZxUszSbaj4N
This commit is contained in:
Colin Maudry
2026-06-25 02:11:28 +02:00
parent 82999ef056
commit b93aca9005
4 changed files with 38 additions and 32 deletions
+3
View File
@@ -2,10 +2,13 @@ import argparse
import os
import sys
from dotenv import load_dotenv
from src.api import tokens_db
def main(argv=None, env=None) -> int:
load_dotenv()
env = env if env is not None else os.environ
parser = argparse.ArgumentParser(prog="python -m src.api.tokens_cli")
sub = parser.add_subparsers(dest="cmd", required=True)
+1 -31
View File
@@ -262,37 +262,7 @@ def _auth_nav(_):
if current_user.is_authenticated:
email = current_user.email
display = email if len(email) <= 30 else email[:27] + "..."
return dbc.DropdownMenu(
label=display,
nav=True,
in_navbar=True,
children=[
dbc.DropdownMenuItem("Mon compte", href="/compte/admin"),
dbc.DropdownMenuItem(
html.Form(
method="POST",
action="/auth/logout",
style={"display": "inline"},
children=[
dcc.Input(
type="hidden",
id={"type": "csrf-input", "index": "navbar-logout"},
name="csrf_token",
),
html.Button(
"D\u00e9connexion",
type="submit",
className="btn btn-link p-0",
style={
"textDecoration": "none",
"color": "inherit",
},
),
],
)
),
],
)
return dbc.NavItem(dbc.NavLink(display, href="/compte/admin"))
return dbc.NavItem(dbc.NavLink("Connexion", href="/connexion"))
+6
View File
@@ -195,6 +195,12 @@ p.version > a {
text-wrap: wrap;
}
/* Account form */
input[type="email"] {
max-width: 400px;
}
/* --- Dashboard inputs --- */
.Select--multi .Select-value {
+28 -1
View File
@@ -70,12 +70,39 @@ def account_guard(path: str, require_subscription: bool):
return dcc.Location(href=href, id="compte-guard-redirect") if href else None
def _logout_item():
return dbc.NavItem(
html.Form(
method="POST",
action="/auth/logout",
children=[
dcc.Input(
type="hidden",
id={"type": "csrf-input", "index": "sidebar-logout"},
name="csrf_token",
),
html.Button(
"Déconnexion",
type="submit",
className="nav-link",
style={
"background": "none",
"border": "none",
"width": "100%",
"textAlign": "left",
},
),
],
)
)
def _nav(active: str):
links = [
dbc.NavLink(s["label"], href=s["href"], active=(s["key"] == active))
for s in visible_sections(current_user_has_subscription())
]
return dbc.Nav(links, vertical=True, class_name="account-nav")
return dbc.Nav(links + [_logout_item()], vertical=True, class_name="account-nav")
def account_shell(active: str, contenu):