diff --git a/CHANGELOG.md b/CHANGELOG.md index dda1228..b5a1c47 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 0.45.0 — 2026-10-29 — Mobile : tiroir, pied et menu compte + +- **Tiroir mobile** : l'état « replié » mémorisé sur desktop ne rétrécit plus le tiroir (cause : `body.sidebar-collapsed .sidebar { width: 68px; }` gagnait par spécificité sur le 264 px mobile, libellés tronqués par overflow-x). Le tiroir fait 264 px, replié ou non ; le fond ne défile plus derrière lui ; le bouton de repli dans le tiroir le ferme ; un clic sur un lien de navigation le ferme aussi. +- **Pied de sidebar visible en mobile** : version, fraîcheur des données, thème et Sortir sont désormais accessibles dans le tiroir (avant : pied masqué, aucun moyen de sortir depuis un téléphone). +- **Menu compte draco** : Profil et Déconnexion fonctionnent enfin (ils étaient relayés par draco-barre.js mais jamais pris en charge par le onAction Kanbante — le menu se fermait sans rien faire). En mobile, c'était le seul accès au profil et à la déconnexion. +- **Menus draco** : largeur plafonnée à 100vw - 20 px pour ne jamais déborder d'un petit écran. + ## 0.44.0 — 2026-10-29 — Ergonomie : tuile Projets et pied de sidebar - **Tuile Projets** : en-tête groupé (gauche : organisation + santé, droite : date + étoile + menu) au lieu de 5 éléments éparpillés ; avancement global labellisé (« Avancement — X/Y terminées ») au lieu d'une barre anonyme ; jalon séparé par un filet, avec étiquette « Prochain jalon » et échéance distincte ; pied en 2 rangées — (1) compte d'issues + bouton Board, (2) répartition par colonne labellisée (« En cours 8 », « Terminé 59 », au lieu de chiffres nus 8 / 59) + prévision ; activité de la semaine en texte secondaire (« Cette semaine : … »). diff --git a/app/config.py b/app/config.py index 40c9676..c4cf430 100644 --- a/app/config.py +++ b/app/config.py @@ -177,7 +177,7 @@ from urllib.parse import urlparse BASE_DIR = Path(__file__).resolve().parent.parent -APP_VERSION = "0.44.0" +APP_VERSION = "0.45.0" def _env_bool(name: str, default: bool) -> bool: diff --git a/app/templates/_draco_bar.html b/app/templates/_draco_bar.html index da164c7..ac768ba 100644 --- a/app/templates/_draco_bar.html +++ b/app/templates/_draco_bar.html @@ -103,6 +103,13 @@ }; if (act === "domaine") { try { localStorage.setItem("draco_domain", el.dataset.dom); } catch (e) { } return; } if (act === "rail") { var b = document.getElementById("side-collapse"); if (b) b.click(); return; } + /* Menu compte (image 2) : ces deux actions étaient relayées + par draco-barre.js mais jamais prises en charge ici — + le menu se fermait sans rien faire. En mobile, c'est le + seul accès au profil et à la déconnexion (le pied de + sidebar était masqué). */ + if (act === "profil") { location.href = "/profile"; return; } + if (act === "deconnexion") { location.href = "/logout"; return; } if (act === "palette") { location.href = "/recherche"; return; } if (act === "alertes") { if (window.DRACO_ALERTES) { window.DRACO_ALERTES.open(); } else { location.href = "/activity"; } return; } /* Correctif fusion #70 : action "menu" supprimée avec le bouton trois points (console agent dans le menu de la marque). */ diff --git a/static/css/style.css b/static/css/style.css index cd361cc..c5de548 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -1462,12 +1462,30 @@ body.sidebar-collapsed .side-foot-user { justify-content: center; } body.with-sidebar, body.with-sidebar.sidebar-collapsed { padding-left: 0; } .sidebar { width: 264px; transform: translateX(-105%); box-shadow: none; } body.sidebar-open .sidebar { transform: none; box-shadow: 18px 0 44px rgba(0,0,0,.5); } + /* Tiroir mobile : l'état « replié » mémorisé sur desktop ne doit + JAMAIS rétrécir le tiroir. Avant, `body.sidebar-collapsed + .sidebar { width: 68px; }` (spécificité supérieure à `.sidebar`) + gagnait en mobile : libellés tronqués par overflow-x hidden, + exactement la capture image 1. Le tiroir fait 264 px, replié + ou non, et le fond ne défile plus derrière lui. */ + body.sidebar-collapsed .sidebar, + body.sidebar-open.sidebar-collapsed .sidebar { width: 264px; } + body.sidebar-open { overflow: hidden; } body.sidebar-collapsed .side-label { display: initial; } body.sidebar-collapsed .side-link { justify-content: flex-start; padding-left: 10px; padding-right: 10px; } + body.sidebar-collapsed .side-logo { justify-content: flex-start; padding-left: 8px; padding-right: 8px; } body.sidebar-collapsed .side-head { flex-direction: row; padding: 4px 6px 12px; } body.sidebar-collapsed .side-search { margin-left: auto; } - .side-foot { display: none; } + /* Pied visible dans le tiroir (avant : display:none en mobile — + aucun moyen de voir la version, la fraîcheur, le thème ni de + sortir depuis un téléphone). */ + .side-foot { display: flex; } + body.sidebar-collapsed .side-foot { align-items: stretch; } + body.sidebar-collapsed .side-foot-meta { display: flex; } + body.sidebar-collapsed .side-foot-user { justify-content: flex-start; } .topbar-search { display: inline-flex; } + /* Menus draco (vendangés) : jamais plus larges que l'écran. */ + header.draco-bar .draco-compte-menu, header.draco-bar .draco-apps-menu { max-width: calc(100vw - 20px); } } /* ── Dashboard vague 2 (0.17.0, #17 #18 #20) + page Projet (#25) ── */ diff --git a/static/js/nav.js b/static/js/nav.js index a92f6f0..09e55e3 100644 --- a/static/js/nav.js +++ b/static/js/nav.js @@ -63,8 +63,18 @@ }); } + /* En mobile, le bouton de repli dans le tiroir FERME le tiroir : + replier un tiroir de 264 px n'a pas de sens, et avant ce + correctif il basculait l'état desktop (tiroir 68 px). */ + var sideLinks = document.querySelectorAll('.side-link'); + sideLinks.forEach(function (link) { + link.addEventListener('click', function () { + if (window.innerWidth <= 900) closeDrawer(); + }); + }); if (collapseBtn) { collapseBtn.addEventListener('click', function () { + if (window.innerWidth <= 900) { closeDrawer(); return; } var collapsed = document.body.classList.toggle('sidebar-collapsed'); try { localStorage.setItem('kanbante-sidebar', collapsed ? 'collapsed' : 'open'); diff --git a/tests/test_mobile.py b/tests/test_mobile.py new file mode 100644 index 0000000..7be186f --- /dev/null +++ b/tests/test_mobile.py @@ -0,0 +1,35 @@ +"""Mobile : tiroir, pied et menu compte. + +Bugs signalés sur captures (29 octobre 2026) : +- tiroir rétréci à 68 px en mobile quand l'état « replié » desktop + était mémorisé (spécificité de `body.sidebar-collapsed .sidebar`) ; +- pied de sidebar masqué en mobile (`display: none`) ; +- Profil / Déconnexion du menu compte draco sans effet (onAction + ne les prenait pas en charge). +""" + + +def test_tiroir_mobile_largeur_fixe(): + css = open("static/css/style.css", encoding="utf-8").read() + assert "body.sidebar-collapsed .sidebar,\n body.sidebar-open.sidebar-collapsed .sidebar { width: 264px; }" in css + assert "body.sidebar-open { overflow: hidden; }" in css + + +def test_pied_visible_en_mobile(): + css = open("static/css/style.css", encoding="utf-8").read() + assert ".side-foot { display: none; }" not in css + assert "body.sidebar-collapsed .side-foot-meta { display: flex; }" in css + + +def test_menu_compte_draco_fonctionnel(): + tpl = open("app/templates/_draco_bar.html", encoding="utf-8").read() + assert 'act === "profil"' in tpl + assert 'location.href = "/profile"' in tpl + assert 'act === "deconnexion"' in tpl + assert 'location.href = "/logout"' in tpl + + +def test_tiroir_ferme_en_mobile(): + js = open("static/js/nav.js", encoding="utf-8").read() + assert "window.innerWidth <= 900" in js + assert "querySelectorAll('.side-link')" in js