feat(0.37.0): tri dashboard « En attente de revue » + sens des tris numériques corrigé
CI / test (push) Successful in 2m27s
CI / test (push) Successful in 2m27s
- Nouveau critère 🔍 En attente de revue ↓ (compteur de la
colonne review exposé en data-review sur les cartes) ;
s'applique à toutes les grilles, Épinglés en tête,
préférence mémorisée comme les autres tris.
- Correctif attrapé au contrôle navigateur réel : le tri
« Issues ouvertes ↓ » historique triait croissant — le
comparateur inversait les clés numériques. Modes open et
review en ka - kb : plus grand compteur en premier.
Vérifié sur données réelles (Épinglés : 196, 95, 32, 5, 4).
- 299 tests verts (3 nouveaux, palier 25).
This commit is contained in:
@@ -1,5 +1,39 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 0.37.0 — 2026-10-26
|
||||||
|
|
||||||
|
### Ajouté — tri « En attente de revue » sur le dashboard
|
||||||
|
|
||||||
|
Demande de Bruno : pouvoir ordonner les projets — section
|
||||||
|
**Épinglés** en tête — par ce qui attend sa validation.
|
||||||
|
|
||||||
|
- Nouveau critère dans le sélecteur de tri du dashboard,
|
||||||
|
en première place après « Par défaut » : **🔍 En attente
|
||||||
|
de revue ↓** — les projets s'ordonnent par le nombre de
|
||||||
|
cartes dans la colonne de validation (clé `review` de
|
||||||
|
l'espace), décroissant.
|
||||||
|
- Le compteur était déjà calculé pour les chips de
|
||||||
|
progression des cartes : il est maintenant exposé en
|
||||||
|
`data-review` sur chaque carte projet et consommé par le
|
||||||
|
moteur de tri partagé — le critère s'applique à **toutes
|
||||||
|
les grilles** (Épinglés, Actifs, Inactifs, Archivés),
|
||||||
|
avec ou sans regroupement par propriétaire, et la
|
||||||
|
préférence est mémorisée comme les autres tris.
|
||||||
|
- Les critères existants (activité Gitea, activité kanban,
|
||||||
|
issues ouvertes, nom) sont inchangés.
|
||||||
|
|
||||||
|
### Corrigé — sens des tris numériques du dashboard
|
||||||
|
|
||||||
|
Le contrôle en navigateur réel a révélé que le tri
|
||||||
|
« Issues ouvertes ↓ » triait en réalité **croissant**
|
||||||
|
depuis son introduction : le comparateur partagé inversait
|
||||||
|
les clés numériques. Les modes numériques (`open` et le
|
||||||
|
nouveau `review`) trient maintenant en soustraction de
|
||||||
|
clés — le plus grand compteur en premier, comme l'annonce
|
||||||
|
le « ↓ ». Vérifié sur les données réelles : Épinglés
|
||||||
|
ordonnés 196, 95, 32, 5, 4 en attente de revue.
|
||||||
|
|
||||||
|
|
||||||
## 0.36.0 — 2026-10-26
|
## 0.36.0 — 2026-10-26
|
||||||
|
|
||||||
### Ajouté — outil MCP `move_issue` (suivi de la vague H3 du service d'agents)
|
### Ajouté — outil MCP `move_issue` (suivi de la vague H3 du service d'agents)
|
||||||
|
|||||||
+1
-1
@@ -177,7 +177,7 @@ from urllib.parse import urlparse
|
|||||||
|
|
||||||
BASE_DIR = Path(__file__).resolve().parent.parent
|
BASE_DIR = Path(__file__).resolve().parent.parent
|
||||||
|
|
||||||
APP_VERSION = "0.36.0"
|
APP_VERSION = "0.37.0"
|
||||||
|
|
||||||
|
|
||||||
def _env_bool(name: str, default: bool) -> bool:
|
def _env_bool(name: str, default: bool) -> bool:
|
||||||
|
|||||||
@@ -64,6 +64,7 @@
|
|||||||
<label class="dash-tool">Tri
|
<label class="dash-tool">Tri
|
||||||
<select id="dash-sort">
|
<select id="dash-sort">
|
||||||
<option value="default">Par défaut</option>
|
<option value="default">Par défaut</option>
|
||||||
|
<option value="review">🔍 En attente de revue ↓</option>
|
||||||
<option value="updated">Activité Gitea récente</option>
|
<option value="updated">Activité Gitea récente</option>
|
||||||
<option value="activity">Activité kanban récente</option>
|
<option value="activity">Activité kanban récente</option>
|
||||||
<option value="open">Issues ouvertes ↓</option>
|
<option value="open">Issues ouvertes ↓</option>
|
||||||
@@ -85,6 +86,7 @@
|
|||||||
data-full="{{ full }}" data-home="{{ repo.home_tab or '' }}"
|
data-full="{{ full }}" data-home="{{ repo.home_tab or '' }}"
|
||||||
data-name="{{ repo.name|lower }}" data-owner="{{ repo.owner.login }}"
|
data-name="{{ repo.name|lower }}" data-owner="{{ repo.owner.login }}"
|
||||||
data-updated="{{ repo.updated_at }}" data-open="{{ repo.open_issues_count or 0 }}"
|
data-updated="{{ repo.updated_at }}" data-open="{{ repo.open_issues_count or 0 }}"
|
||||||
|
data-review="{{ stats.get(full, {}).get('review', 0) if stats else 0 }}"
|
||||||
data-activity="{{ repo.activity.last_at if repo.activity else '' }}"
|
data-activity="{{ repo.activity.last_at if repo.activity else '' }}"
|
||||||
data-search="{{ (repo.name ~ ' ' ~ repo.full_name ~ ' ' ~ (repo.description or ''))|lower }}"
|
data-search="{{ (repo.name ~ ' ' ~ repo.full_name ~ ' ' ~ (repo.description or ''))|lower }}"
|
||||||
x-show="search === '' || $el.dataset.search.includes(search.toLowerCase())">
|
x-show="search === '' || $el.dataset.search.includes(search.toLowerCase())">
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "kanbante"
|
name = "kanbante"
|
||||||
version = "0.36.0"
|
version = "0.37.0"
|
||||||
description = "Kanban project manager integrated with Gitea"
|
description = "Kanban project manager integrated with Gitea"
|
||||||
requires-python = ">=3.11"
|
requires-python = ">=3.11"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
|||||||
@@ -32,6 +32,7 @@
|
|||||||
function cardKey(card, mode) {
|
function cardKey(card, mode) {
|
||||||
if (mode === 'name') return (card.getAttribute('data-name') || '').toLowerCase();
|
if (mode === 'name') return (card.getAttribute('data-name') || '').toLowerCase();
|
||||||
if (mode === 'open') return -(parseInt(card.getAttribute('data-open') || '0', 10));
|
if (mode === 'open') return -(parseInt(card.getAttribute('data-open') || '0', 10));
|
||||||
|
if (mode === 'review') return -(parseInt(card.getAttribute('data-review') || '0', 10));
|
||||||
if (mode === 'updated') return card.getAttribute('data-updated') || '';
|
if (mode === 'updated') return card.getAttribute('data-updated') || '';
|
||||||
if (mode === 'activity') return card.getAttribute('data-activity') || '';
|
if (mode === 'activity') return card.getAttribute('data-activity') || '';
|
||||||
return null; // 'default' : ordre serveur, on ne touche à rien
|
return null; // 'default' : ordre serveur, on ne touche à rien
|
||||||
@@ -52,6 +53,13 @@
|
|||||||
if (isNaN(tb)) return -1;
|
if (isNaN(tb)) return -1;
|
||||||
return tb - ta;
|
return tb - ta;
|
||||||
}
|
}
|
||||||
|
// Modes numériques (open, review) : les clés sont
|
||||||
|
// des compteurs niés (-n) — ka - kb donne donc le
|
||||||
|
// plus grand compteur en premier, comme l'annonce
|
||||||
|
// le « ↓ » des options. (Avant 0.37.0, la
|
||||||
|
// comparaison générique ci-dessous inversait ces
|
||||||
|
// deux tris : ils ressortaient croissants.)
|
||||||
|
if (mode === 'open' || mode === 'review') return ka - kb;
|
||||||
if (ka < kb) return mode === 'name' ? -1 : 1;
|
if (ka < kb) return mode === 'name' ? -1 : 1;
|
||||||
if (ka > kb) return mode === 'name' ? 1 : -1;
|
if (ka > kb) return mode === 'name' ? 1 : -1;
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
"""Palier 25 (0.37.0): tri « En attente de revue » du dashboard —
|
||||||
|
les projets (section Épinglés incluse) s'ordonnent par le nombre
|
||||||
|
de cartes dans la colonne de validation."""
|
||||||
|
|
||||||
|
from app import models
|
||||||
|
|
||||||
|
|
||||||
|
def test_dashboard_sort_offers_review_mode(client):
|
||||||
|
r = client.get("/")
|
||||||
|
assert r.status_code == 200
|
||||||
|
assert '<option value="review">🔍 En attente de revue ↓</option>' in r.text
|
||||||
|
|
||||||
|
|
||||||
|
def test_dashboard_cards_carry_review_count(client):
|
||||||
|
# Aucune carte en révision au départ.
|
||||||
|
r = client.get("/")
|
||||||
|
assert 'data-review="0"' in r.text
|
||||||
|
# Une carte passe en Révision : le compteur de SA carte monte.
|
||||||
|
models.move_issue("Projets/demo", 5, "review")
|
||||||
|
models.move_issue("Projets/demo", 1, "review")
|
||||||
|
r = client.get("/")
|
||||||
|
assert 'data-review="2"' in r.text
|
||||||
|
|
||||||
|
|
||||||
|
def test_dashboard_js_knows_review_mode(client):
|
||||||
|
# Le moteur de tri partagé est servi tel quel : le mode
|
||||||
|
# 'review' doit y figurer (tri décroissant sur data-review).
|
||||||
|
r = client.get("/static/js/dashboard.js")
|
||||||
|
assert r.status_code == 200
|
||||||
|
assert "mode === 'review'" in r.text
|
||||||
|
assert "data-review" in r.text
|
||||||
|
# Le sens : les modes numeriques trient en ka - kb (cles
|
||||||
|
# niees = plus grand compteur d\'abord). Sans cette
|
||||||
|
# branche, le comparateur generique inversait le tri :
|
||||||
|
# bug attrape en navigateur reel sur le tri historique.
|
||||||
|
assert "return ka - kb" in r.text
|
||||||
Reference in New Issue
Block a user