Tags sur les projets, en version 3 du format

Un projet porte désormais une liste d'étiquettes libres, destinées à filtrer la
frise. Il n'y a pas de référentiel à tenir : les tags disponibles sont ceux que
portent les projets.

normaliserTags() nettoie la liste à l'enregistrement — espaces réduits, vides
écartés, doublons fusionnés à la casse près, tri alphabétique pour qu'une
ressaisie dans un autre ordre ne produise aucun diff. Les accents, eux, comptent :
« éditeur » et « editeur » restent deux tags distincts, contrairement aux
identifiants qui doivent tenir dans une URL.

Un tag trop long est tronqué plutôt que refusé : sa longueur est cosmétique, et
bloquer le chargement d'un planning entier pour un libellé bavard serait
disproportionné. La validation ne vérifie donc que le type — un tag mal typé
serait un tag qu'on croit poser et qui ne filtre rien.

teinteTag() dérive une teinte HSL du nom par hachage : la couleur d'un tag n'est
ni stockée ni saisie, et reste la même partout où il apparaît.

Le format passe en version 3. Un fichier en version 2 se charge sans rien
demander, ses projets recevant une liste vide, et il est réécrit en version 3 à
la première sauvegarde. Le bump empêche une version antérieure de l'outil
d'effacer silencieusement les tags en réécrivant le fichier.

Dix tests couvrent la normalisation, la comparaison, la teinte et le filtre.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-01 05:51:50 +02:00
parent 222831234a
commit 3be367488c
4 changed files with 233 additions and 6 deletions

View File

@@ -1,10 +1,11 @@
{
"version": 2,
"version": 3,
"projects": [
{
"id": "site-web",
"name": "Refonte du site web",
"color": "#3b82f6",
"tags": ["client", "web"],
"collapsed": false,
"hidden": false,
"baselineDate": "2026-06-12",
@@ -65,6 +66,7 @@
"id": "migration-infra",
"name": "Migration infrastructure",
"color": "#10b981",
"tags": ["infra", "interne"],
"collapsed": false,
"hidden": false,
"phases": [
@@ -119,6 +121,7 @@
"id": "formation-equipe",
"name": "Formation de l'équipe",
"color": "#f59e0b",
"tags": ["interne", "RH"],
"collapsed": true,
"hidden": false,
"phases": [