- tablesort.js : parseFloat lisait l'année des dates ISO (2026) et mettait toutes les lignes à égalité — comparaison numérique seulement pour les valeurs entièrement numériques. - dashboard.js : pinned-grid rejoint les grilles triées et regroupées (son exclusion rendait les deux outils invisibles là où l'œil se pose) ; dates comparées via Date.parse. - data-first-dir=desc sur Dernière activité / Écart / Zombies.
64 lines
3.1 KiB
HTML
64 lines
3.1 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="fr" data-theme="dark">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<meta name="csrf-token" content="{{ csrf_token }}">
|
|
<title>Santé du flux — Kanbante</title>
|
|
<link rel="stylesheet" href="/static/css/style.css">
|
|
</head>
|
|
<body>
|
|
{% include "_header.html" %}
|
|
|
|
<main class="focus-main">
|
|
<section class="briefing-card">
|
|
<h1>🩺 Santé du flux</h1>
|
|
<p>Tous les projets actifs, <strong>triés par sévérité</strong> — le rouge d'abord. Quelle colonne accumule (temps médian par colonne, d'après le journal) et quelles cartes sont devenues des <strong>zombies</strong>. Cliquez un projet pour le détail et les actions rapides.</p>
|
|
</section>
|
|
|
|
{% if projects %}
|
|
<table class="proj-table pilot-table">
|
|
<thead>
|
|
<tr>
|
|
<th data-sort="severity">Santé</th>
|
|
<th data-sort="project">Projet</th>
|
|
<th data-sort="open">Ouvertes</th>
|
|
<th data-sort="zombies" data-first-dir="desc">🧟 Zombies</th>
|
|
<th data-sort="slowest">🐌 Goulot</th>
|
|
<th></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for project in projects %}
|
|
<tr data-severity="{{ {'red': 0, 'orange': 1, 'green': 2}.get(project.dot.level, 3) }}"
|
|
data-project="{{ project.full_name|lower }}" data-open="{{ project.open_count }}"
|
|
data-zombies="{{ project.zombies|length }}"
|
|
data-slowest="{{ project.slowest.median_days if project.slowest else '' }}">
|
|
<td><span class="health-dot {{ project.dot.level }}" title="{{ project.dot.title }}"></span></td>
|
|
<td><a href="/health/{{ project.full_name }}"><strong>{{ project.full_name }}</strong></a></td>
|
|
<td>{{ project.open_count }}</td>
|
|
<td>{{ project.zombies|length }}{% if project.zombies %} <span class="ms-meta">(≥ {{ project.zombie_days }} j)</span>{% endif %}</td>
|
|
<td>
|
|
{% if project.slowest %}
|
|
{{ project.column_labels[project.slowest.column] }} — médiane {{ project.slowest.median_days }} j
|
|
{% else %}<span class="ms-meta">pas assez de données</span>{% endif %}
|
|
</td>
|
|
<td><a href="/health/{{ project.full_name }}">détail →</a></td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% else %}
|
|
<section class="briefing-card"><p>Aucun projet actif.</p></section>
|
|
{% endif %}
|
|
</main>
|
|
<footer>
|
|
<span>Kanbante v{{ version }} · l'hygiène du flux, mesurée sur le journal — pas au feeling</span>
|
|
</footer>
|
|
{% include "_palette.html" %}
|
|
<script src="/static/js/palette.js" defer></script>
|
|
<script src="/static/js/live.js" defer></script>
|
|
<script src="/static/js/tablesort.js" defer></script>
|
|
</body>
|
|
</html>
|