Feature #72
closedDisplay vuln severity chip on the ticket list + detail (read severity field 13) — extends #24/#70
0%
conversation:scan-severity-display
Description
**Lié à :** #24/#70 · **Surface :** Client-Dashboard fullstack (`api/` + `src/`)
Afficher la **sévérité** des tickets de sécurité sur la liste + le détail du ticketing, sur le modèle exact du tag `bf-disagree` (#51). Le ticketing lit Redmine **directement** (pas l'aggregator) — donc pas de changement aggregator.
**Backend (`api/`)** :
- `domain/redmine/value_objects.py` : `RedmineField.SEVERITY = 13` (le champ custom `severity` existe sur le Redmine live, liste critical/high/medium/low).
- `domain/tasks/value_objects.py` : ajouter `severity: str | None` à `TaskSummary` (et `TaskDetail`).
- `application/task_board.py` `_to_summary`/`_to_detail` : `severity=fields.get(RedmineField.SEVERITY)` (déjà fetché avec les autres custom fields).
- `presentation/api/tasks.py` : ajouter `severity: str | None` à `TaskSummaryOut` (+ detail). Aucun nouvel appel upstream.
**Frontend (`src/`)** :
- Un atome `SeverityTag` (puce colorée : critical/high/medium/low) réutilisant les tokens de couleur de sévérité existants (cf. modules Security Ops / SOUPs ; pas de nouvelle couleur), rendu dans `TaskRow` (liste) et `TaskDetailPane` (détail) quand `task.severity` est défini — exactement comme `BfDisagreeTag`.
- i18n dans `en.ts` uniquement.
## Critères d'acceptation
- `TaskSummaryOut.severity` exposé depuis le champ custom 13 (multi-tenant, pas d'appel upstream).
- Puce de sévérité colorée affichée sur la liste ET le détail quand le ticket a une sévérité.
- FR/EN (`en.ts`) ; réutilise les tokens existants. Gate vert : backend (pytest/ruff/mypy) + frontend (vitest/tsc/eslint/build). TDD.
RA Updated by Redmine Admin about 2 months ago
- Status changed from Submitted to Spec
- spec_ref updated (diff)
RA Updated by Redmine Admin about 2 months ago
- Status changed from Spec to In development
RA Updated by Redmine Admin about 2 months ago
- Status changed from In development to QA
- branch set to feat/72-severity-chip
- pr_url set to https://github.com/omdev-tech/PipeLiner-Client/pull/35
Implémenté de bout en bout (Client-Dashboard fullstack `api/` + `src/`), sur le modèle exact du tag `bf-disagree` (#51).
**Backend (`api/`)** : `RedmineField.SEVERITY = 13` ; `severity: str | None` ajouté à `TaskSummary`/`TaskDetail` et mappé dans `_to_summary`/`_to_detail` depuis les champs custom déjà fetchés (aucun appel upstream supplémentaire) ; exposé sur `TaskSummaryOut`/`TaskDetailOut`.
**Frontend (`src/`)** : nouvel atome `SeverityTag` (puce colorée) réutilisant les tokens de sévérité existants via `riskToken` (pas de nouvelle couleur — critical = danger/rouge, high = ambre « Attention », medium/low = atténué, gotcha #6) ; rendu dans `TaskRow` (liste) et `TaskDetailPane` (détail) quand la sévérité est définie ; clés i18n dans `en.ts` uniquement (`fr.ts` ré-exporte `en.ts`).
**Gate vert** — backend : pytest (460 passed, ×2 même base) / ruff / mypy ; frontend : vitest (498 passed) / tsc / eslint / build. TDD sur la dérivation `severity` et le rendu de la puce.
PR (vers `dev`) : https://github.com/omdev-tech/PipeLiner-Client/pull/35
Branche : `feat/72-severity-chip`
Statut : In development → QA.
RA Updated by Redmine Admin about 2 months ago
- Status changed from QA to Shipped
Shipped en prod (master #67). Affichage de la sévérité sur le ticketing : task board lit le champ custom `severity` (13) → `TaskSummaryOut.severity` (pas d'appel aggregator, lecture Redmine directe) → atome `SeverityTag` (puce colorée critical/high/medium/low, tokens existants) sur la liste (`TaskRow`) et le détail (`TaskDetailPane`), comme `bf-disagree`. Gates verts (backend 460, frontend vitest 498). Le ticket smoke #74 (omdev-website, severity=high) affichera la puce HIGH côté client.