Rendre lisibles le statut et la date imposée
All checks were successful
Build / build (push) Successful in 1m2s

Statut : quatre boutons peints de leur texture, si bien que le panneau
sert enfin de légende. « En cours » se raye et « terminé » redevient vif
— la trame les distingue, la teinte n'a plus à le faire.

Date imposée : un cadre tireté cerne la forme entière. Les taquets
tombaient sous les poignées de redimensionnement et disparaissaient sur
une barre courte. Son libellé passe dans le modèle, ce qui la fait
apparaître dans la vue par mois, qui la taisait.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-10 19:17:15 +02:00
parent 4a513f9a59
commit 815e144d9a
10 changed files with 574 additions and 98 deletions

View File

@@ -13,7 +13,6 @@
import {
LIBELLES_ETAT,
LIBELLES_STATUT,
MOIS_COURTS,
MOIS_LONGS,
ajouterJours,
@@ -28,6 +27,7 @@ import {
formaterDateLongue,
formaterHorizon,
formulerDerive,
libelleStatut,
lundiDeLaSemaine,
phasesDecalables,
projetADater,
@@ -308,7 +308,7 @@ function construireLibelles(projets, tagsActifs, curseur) {
const ligne = document.createElement('div');
ligne.className = `libelle-phase${sousCurseur ? ' libelle-phase--curseur' : ''}`;
ligne.textContent = phase.name;
ligne.title = `${phase.name}${LIBELLES_STATUT[phase.status]}${mentionImposee(phase)}`;
ligne.title = `${phase.name}${libelleStatut(phase)}`;
ligne.dataset.projet = projet.id;
ligne.dataset.phase = phase.id;
elements.push(ligne);
@@ -507,16 +507,14 @@ function construirePhase(projet, phase, echelle, curseur) {
elements.push(fantome);
}
// Une date imposée se lit sur la barre, et pas seulement dans le panneau : un
// planning se parcourt des yeux, et savoir ce qui suivra un décalage doit se
// voir avant de faire le geste, pas après.
const impose = phase.fixed ? ' barre--imposee' : '';
if (phase.milestone) {
const losange = document.createElement('div');
losange.className =
`jalon jalon--${phase.status}${phase.fixed ? ' jalon--impose' : ''}` +
(selectionnee ? ' jalon--selectionne' : '');
losange.classList.add('jalon', `jalon--${phase.status}`);
// Une date imposée se lit sur le losange, et pas seulement dans le panneau :
// un planning se parcourt des yeux, et savoir ce qui suivra un décalage doit
// se voir avant de faire le geste, pas après.
if (phase.fixed) losange.classList.add('jalon--imposee');
if (selectionnee) losange.classList.add('jalon--selectionne');
losange.style.left = `${echelle.x(phase.start)}px`;
losange.dataset.projet = projet.id;
losange.dataset.phase = phase.id;
@@ -526,7 +524,7 @@ function construirePhase(projet, phase, echelle, curseur) {
// infobulle les taisait, alors que celle d'une barre les montrait.
losange.title =
`${phase.name}${formaterDateLongue(phase.start)}` +
`\n${LIBELLES_STATUT[phase.status]}${mentionImposee(phase)}` +
`\n${libelleStatut(phase)}` +
(phase.notes ? `\n\n${aplatirMarkdown(phase.notes)}` : '');
elements.push(losange);
@@ -545,8 +543,11 @@ function construirePhase(projet, phase, echelle, curseur) {
}
const barre = document.createElement('div');
barre.className =
`barre barre--${phase.status}${impose}` + (selectionnee ? ' barre--selectionnee' : '');
barre.classList.add('barre', `barre--${phase.status}`);
// Voir le losange plus haut : c'est la même marque, un cadre tireté qui cerne
// la forme — laquelle, le CSS s'en arrange.
if (phase.fixed) barre.classList.add('barre--imposee');
if (selectionnee) barre.classList.add('barre--selectionnee');
barre.style.left = `${echelle.x(phase.start)}px`;
barre.style.width = `${echelle.largeurDe(phase.start, phase.end)}px`;
barre.dataset.projet = projet.id;
@@ -554,7 +555,7 @@ function construirePhase(projet, phase, echelle, curseur) {
barre.dataset.role = 'barre';
barre.title =
`${phase.name}\n${formaterDateLongue(phase.start)}${formaterDateLongue(phase.end)}` +
`\n${LIBELLES_STATUT[phase.status]}${mentionImposee(phase)}` +
`\n${libelleStatut(phase)}` +
// Aplati : l'infobulle native ne connaît que le texte, et y déverser la
// source markdown rendrait la note moins lisible qu'avant qu'on ne
// l'enrichisse. `aplatirMarkdown` retire les marques et remplace celles qui
@@ -625,17 +626,6 @@ function construireBarreCumulative(projet, echelle) {
return conteneur;
}
/**
* Ce qui suit le statut dans l'infobulle d'une phase à date imposée.
*
* Accolé au statut, et non sur sa propre ligne : les deux se lisent ensemble —
* « en cours, date imposée » — et occupent le même registre, celui de ce que la
* phase est aujourd'hui.
*/
function mentionImposee(phase) {
return phase.fixed ? ' — date imposée, non emportée par un décalage du projet' : '';
}
/**
* Ce que dit l'infobulle du résumé sur le geste qu'il offre.
*