feat(0.33.0): filtrage professionnel sur Mes issues (/my)
CI / test (push) Successful in 2m26s

- Barre de filtres en carte : recherche texte (titre, projet,
  #numéro, étiquettes ; accents/casse ignorés, raccourci /),
  listes Projet et Étiquette avec compteurs, chips de
  colonnes colorées multi-sélection, 4 tris.
- Facettes calculées côté serveur ; filtrage instantané côté
  client (attributs data-*), compteur en direct, compteurs
  de section, état vide + réinitialisation.
- Filtres structurels persistés en localStorage.
- 281 tests verts (3 nouveaux, palier 22) ; vérifié en
  Chromium réel sur les vraies données (467 issues :
  recherche 'agent' -> 24 résultats instantanés).
This commit is contained in:
Spark
2026-10-26 10:20:37 -04:00
parent d419fe3086
commit 9fe35f6c8f
8 changed files with 368 additions and 7 deletions
+35 -1
View File
@@ -4245,14 +4245,48 @@ async def my_issues(request: Request):
logger.debug("search failed for /my (conn %s): %s", cid, exc)
total = len(results)
groups = _group_issue_results(results)
# Facettes de filtrage (0.33.0) : compteurs calculés une
# fois côté serveur ; le filtrage lui-même est instantané
# côté client, sur des attributs data-* des lignes.
names = _ws_names(request)
order = _ws_keys(request)
repo_facets = [
{"full_name": g["full_name"], "count": len(g["rows"])}
for g in groups
]
col_counts: dict[str, int] = {}
label_counts: dict[str, int] = {}
for g in groups:
for row in g["rows"]:
col_counts[row["column"]] = col_counts.get(row["column"], 0) + 1
for label in row["issue"].get("labels") or []:
name = label.get("name") or ""
if name:
label_counts[name] = label_counts.get(name, 0) + 1
column_facets = [
{"key": key, "count": col_counts[key]}
for key in order
if key in col_counts
] + [
{"key": key, "count": count}
for key, count in col_counts.items()
if key not in order
]
label_facets = [
{"name": name, "count": label_counts[name]}
for name in sorted(label_counts, key=str.lower)
]
return render(
request,
"my.html",
user=user,
groups=groups,
total=total,
column_labels=_ws_names(request),
column_labels=names,
column_colors=_ws_colors(request),
repo_facets=repo_facets,
column_facets=column_facets,
label_facets=label_facets,
)