Consultation : carte pilotée par le survol, plus de navigation jour

Refonte de l'interaction carte/liste suite au retour d'usage :

- Suppression de la bande de navigation « Jour préc. / date / Jour suiv. »
  (boutons, code et styles associés retirés).
- La journée affichée sur la carte suit le SURVOL des trajets : survoler un
  trajet bascule la carte sur sa journée (Subject debouncé ~80 ms) et met le
  tracé en évidence ; en fin de survol, la carte reste sur la dernière journée
  survolée. Au chargement d'un mois, la carte se cale sur la dernière journée
  ayant des trajets.
- Bouton « Ouvrir toutes les journées » (avant « Ajouter un trajet » pour ne pas
  décaler ce dernier ; affiché seulement s'il reste des journées repliées).
- Surbrillance du groupe de la journée affichée sur la carte (en-tête bleu
  accentué), pilotée par le nouvel Input jourAffiche de la liste.
- Harmonisation : les mois « avec données » du sélecteur passent au même bleu
  que la journée mise en avant (le mois sélectionné reste en bleu plein).
- Date par défaut à la création : date de la carte, sinon date du jour (inchangé).

Specs : requirements.md (exigence 12, glossaire Sélecteur_Temporel) et design.md
(ConsultationJour, TrajetList, SelecteurTemporel) mis à jour.
This commit is contained in:
2026-09-20 22:35:34 +02:00
parent 173b123f03
commit 937609a83b
9 changed files with 136 additions and 158 deletions
@@ -103,6 +103,15 @@ export class TrajetListComponent {
}
private _trajets: Trajet[] = [];
/**
* Journée (`yyyy-MM-dd`) actuellement affichée sur la carte : son groupe est mis
* en surbrillance dans la liste pour la repérer visuellement. `null` si aucune.
*/
@Input() set jourAffiche(valeur: string | null) {
this._jourAffiche.set((valeur ?? '').slice(0, 10) || null);
}
private readonly _jourAffiche = signal<string | null>(null);
/** Émis lorsque l'utilisateur demande la modification d'un trajet. */
@Output() edit = new EventEmitter<Trajet>();
@@ -217,6 +226,11 @@ export class TrajetListComponent {
return this.joursOuverts().has(groupe.date);
}
/** Vrai si ce groupe correspond à la journée affichée sur la carte (surbrillance). */
estJourAffiche(groupe: GroupeJour): boolean {
return this._jourAffiche() === groupe.date;
}
/** Bascule le repliage d'une journée (déplie / replie). */
basculerJour(groupe: GroupeJour): void {
this.joursOuverts.update((ouverts) => {
@@ -247,6 +261,16 @@ export class TrajetListComponent {
});
}
/** Déplie TOUTES les journées du mois affiché (bouton « Ouvrir toutes les journées »). */
ouvrirToutesLesJournees(): void {
this.joursOuverts.set(new Set<string>(this.groupes().map((g) => g.date)));
}
/** Vrai si au moins une journée est repliée (pour n'afficher le bouton que si utile). */
aDesJourneesFermees(): boolean {
return this.groupes().some((g) => !this.joursOuverts().has(g.date));
}
// --- Helpers d'affichage ---
/** Vrai si le trajet est le dernier DE SA JOURNÉE (pas d'« insérer avant le suivant »). */