Skip to content

feat(normalize): compute — tableau mixte rendu vide, colonnes vides averties (suite de #1258, #1237) - #1262

Merged
bmatge merged 5 commits into
mainfrom
feat/1237-compute-element-de-tableau
Oct 4, 2026
Merged

bmatge merged 5 commits into
mainfrom
feat/1237-compute-element-de-tableau

Conversation

@bmatge

@bmatge bmatge commented Oct 4, 2026

Copy link
Copy Markdown
Owner

Suite de #1258 (mergée pendant que ces arbitrages étaient appliqués) : les deux points tranchés par le propriétaire sur array_min / array_max et sur les colonnes calculées vides. Même branche, un commit de fond.

Refs #1237

Ce qui change

1. Un tableau mixte rend une valeur vide. Sur 950 ; 1050 ; vers 1970 — des éléments numériques et non numériques — array_min et array_max rendent null au lieu de basculer en ordre de texte, qui répondait « 1050 ». Tout numérique : comparaison en nombre ; tout textuel (dates ISO) : en texte. Inchangé.

2. Deux avertissements console, une fois par composant et par cause, relayés par le journal du volet Diagnostic (qui capte déjà console.warn) :

  • tableau mixte : nomme la fonction, le champ, un exemple, et donne la recette ;
  • colonne entièrement vide parce que le champ ne porte aucun tableau sur tout le lot (cellule collée sans split, valeur seule) : nomme le champ et le split à poser.

Silence quand la colonne est réellement vide, et quand une partie des lignes porte un tableau. Un attribut compute ou split modifié remet le compte à zéro.

La question préalable : « ça se corrige avec un dsfr-data-normalize ? »

Oui, dans les deux cas — établi sur le vrai composant (tests) et au navigateur (page minimale, bundle construit).

Donnée Essai Résultat
cellule collée un normalize : replace="vers 1970:1970" + split ne nettoie pas : replace compare la cellule entière
cellule collée un normalize : split + compute="datation = replace(datation, 'vers ', '')" ne marche pas : compute passe après split, et replace() rend un texte (950,1050,1970), plus un tableau
cellule collée deux normalize chaînés : compute="datation = replace(join(datation, ';'), 'vers ', '')", puis split="datation:;" compute="premiere = array_min(datation)" 950
vrai tableau la même recette (join recolle, split redécoupe) 950
vrai tableau un normalize : replace-fields="datation:vers 1970:1970" (élément par élément, valeur exacte) 950

La recette en deux normalize répare aussi une année seule stockée en nombre (1930 → '1930').

Limites de la recette, à connaître : replace() est littéral, donc chaque préfixe à retirer (« vers », « avant »…) demande un replace imbriqué ; replace-fields demande d'énumérer chaque valeur fautive.

Vérification

  • Oracles TS et Python : mixte → null ; nouvelle étape replace-text (la recette énoncée sans la grammaire).
  • Contrôles : compute-plus-petit-et-plus-grand-element-d-un-tableau couvre les deux côtés (mixte → vide et avertissement ; nettoyé → 950, sans un mot) ; compute-element-de-tableau-element-at exige le silence quand une partie des lignes porte un tableau ; nouveau compute-element-sans-split-avertit (colonne vide recalculée par les trois voix, avertissement exigé).
  • Preuves de mutation (vues rouges, puis retirées — table de tools/oracle/README.md) : mixte comparé en texte → « 1050 » là où l'oracle dit « — » ; avertissement du mixte retiré ; avertissement sans tableau retiré ; avertissement dit même quand une partie des lignes porte un tableau. Les six mutations de feat(normalize): compute — élément d'un tableau (element_at, array_min, array_max) (AM-103, #1237) #1258 ont été rejouées, toujours rouges.
  • Navigateur : les cinq essais du tableau ci-dessus, plus la colonne réellement vide (aucun message) ; trois avertissements en tout, un par composant concerné.
  • npm run verif : 303 passés, 1 en attente. test:run (9387), typecheck:tests, lint, check:accents, check:specs-tables, check:studio-couverture : verts.

Conséquence à connaître

Un tableau qui mêle des codes en chiffres et des codes à lettre (['75056', '2A004']) est mixte : array_min y rend vide, avec l'avertissement. C'est l'application directe de la règle ; avant, il était comparé en texte.

Autre

🤖 Generated with Claude Code

https://claude.ai/code/session_01FrLwzPx5CG4VsPHEdo5ZVs

bmatge and others added 5 commits October 4, 2026 22:56
…dans compute (#1237)

Arbitrages du propriétaire sur la PR #1258.

`array_min` / `array_max` rendent `null` sur un tableau MIXTE — des éléments
numériques et non numériques (`950 ; 1050 ; vers 1970`) — au lieu de
basculer en ordre de texte, qui répondait « 1050 ». La donnée se nettoie par
attributs, vu sur le vrai composant : deux normalize chaînés,
`compute="d = replace(join(d, ';'), 'vers ', '')"` puis `split="d:;"`, pour
une cellule collée comme pour un vrai tableau ; `replace-fields` élément par
élément sur un vrai tableau. Dans un seul normalize, `replace` compare la
cellule entière et le `replace()` de compute passe après `split`.

Deux avertissements console, une fois par composant et par cause, relayés
par le journal du volet Diagnostic : le tableau mixte (champ + recette), et
la colonne entièrement vide parce que le champ ne porte aucun tableau
(champ + `split` à poser). Silence quand la colonne est réellement vide ou
qu'une partie des lignes porte un tableau.

Oracles TS et Python alignés (mixte → null, étape `replace-text`), contrôle
`compute-element-sans-split-avertit` ajouté, les deux autres étendus
(mixte → vide ; nettoyé → 950 ; silences). Dix mutations vues rouges.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FrLwzPx5CG4VsPHEdo5ZVs
…97 observations, 514 à trois voix (#1237)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FrLwzPx5CG4VsPHEdo5ZVs
@bmatge
bmatge merged commit b809d28 into main Oct 4, 2026
16 checks passed
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