Skip to content

feat(chart): support y-min/y-max pour l'échelle radiale du type radar#408

Merged
bmatge merged 1 commit into
mainfrom
feat/radar-y-min-max
Jul 18, 2026
Merged

feat(chart): support y-min/y-max pour l'échelle radiale du type radar#408
bmatge merged 1 commit into
mainfrom
feat/radar-y-min-max

Conversation

@bmatge

@bmatge bmatge commented Jul 18, 2026

Copy link
Copy Markdown
Owner

Contexte

Demande issue maturity-model#9 : y-min/y-max existent pour line/scatter (axe y Chart.js) mais sont ignorés par le type radar, qui utilise l'échelle radiale scales.r. Sans borne, celle-ci s'auto-ajuste au min/max des données : le minimum des données se retrouve au centre du radar, ce qui est trompeur (un score 2,1/4 semble nul). L'app maturity-model contournait via un hack JS fouillant l'instance Chart.js interne du web component.

Implémentation

Mécanisme en deux étages (type="radar" + y-min et/ou y-max) :

  1. Baseline déclarative — découverte lors de l'analyse : <radar-chart> upstream (@gouvfr/dsfr-chart) expose des props scale-min/scale-max mappées sur suggestedMin/suggestedMax de scales.r. dsfr-data-chart relaie y-min/y-max vers ces attributs dans _getTypeSpecificAttributes(). Avantage : survit aux recréations du chart par le watcher Vue $props (chaque createChart() repart avec les bornes).
  2. Affinage post-montage — les bornes suggested sont molles et l'upstream n'expose pas le pas des anneaux. Via resolveChartInstance() (mécanisme existant des overlays dsfr-data-chart : lignes de référence (verticale/horizontale) avec libellé #341/epic(core): dsfr-data-chart — cibles / objectifs futurs (targets) sur les courbes #377) et le même pipeline rAF-poll dans updated(), on pose les bornes dures scales.r.min/max et ticks.stepSize: 1 quand les deux bornes sont entières avec une amplitude de 1 à 10 (anneaux de grille entiers), puis chart.update('none'). Dégradation gracieuse : si l'instance est introuvable, la baseline déclarative reste appliquée.

La logique est pure et isolée dans packages/core/src/utils/chart-radial-scale.ts (computeRadialScaleBounds, applyRadialScaleBounds), sur le modèle de chart-reference-lines.ts.

Comportement strictement inchangé sans y-min/y-max et pour les autres types.

Fichiers

  • packages/core/src/utils/chart-radial-scale.ts (nouveau) — logique pure
  • packages/core/src/components/dsfr-data-chart.ts — relais scale-min/scale-max + pipeline rAF post-montage
  • specs/components/dsfr-data-chart.html — doc attributs + exemple radar borné
  • apps/builder-ia/src/skills.ts — tables d'attributs et guide des types mis à jour
  • .changeset/radar-y-min-max.md — changeset minor

Tests

  • tests/utils/chart-radial-scale.test.ts (nouveau) : bornes posées, stepSize (entiers/amplitude), valeurs non entières, borne unique, idempotence (pas d'update() inutile), instance pas prête
  • tests/dsfr-data-chart.test.ts : radar avec/sans bornes, borne unique, non-radar inchangé, planification/annulation du rAF-poll
  • Suite complète : 149 fichiers, 3615 tests, tous verts (npm run test:run)
  • npm run lint : 0 erreur (3 warnings préexistants sur main), npm run typecheck et npm run build OK

🤖 Generated with Claude Code

Sans borne, l'échelle radiale de Chart.js (scales.r) s'auto-ajuste au
min/max des données : le minimum se retrouve au centre du radar, ce qui
est trompeur (demande de maturity-model#9, jusqu'ici contourné par un
hack applicatif fouillant l'instance Chart.js interne).

- baseline déclarative : y-min/y-max relayés vers l'API upstream
  scale-min/scale-max de <radar-chart> (suggestedMin/Max) — survit aux
  recréations du chart par le watcher Vue $props
- affinage post-montage via resolveChartInstance (même rAF-poll que les
  overlays) : bornes dures scales.r.min/max + ticks.stepSize 1 quand les
  deux bornes sont entières avec une amplitude de 1 à 10 (anneaux entiers)
- logique pure et testée dans utils/chart-radial-scale.ts
- docs (specs dsfr-data-chart) + skill builder-ia mis à jour
- comportement inchangé sans y-min/y-max et pour les autres types

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@bmatge
bmatge merged commit b1e7891 into main Jul 18, 2026
9 checks passed
@bmatge
bmatge deleted the feat/radar-y-min-max branch July 18, 2026 19:56
@github-actions github-actions Bot mentioned this pull request Jul 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant