Mois vide : suppression des alertes rouges et du message vide en double

Un mois sans trajet est un cas normal, pas une erreur :

- Panneau totaux : plus d'alerte « Impossible de charger les totaux ». Un
  jour/mois sans trajet affiche simplement des totaux à 0,00 km. Signal erreur
  supprimé.
- Consultation : plus d'alerte « Impossible de charger les trajets du mois ».
  Signal erreur et variable resumeEnErreur supprimés ; un échec de résumé
  affiche une liste vide (les vraies indisponibilités serveur restent signalées
  par l'intercepteur global).
- Message vide unique : « Aucun trajet pour ce mois » n'est plus affiché en
  double (retiré de la liste, conservé côté consultation avec garde de
  chargement).

Builds dev et prod OK.
This commit is contained in:
2026-09-15 21:18:13 +02:00
parent 926ef32166
commit d9618d140b
5 changed files with 7 additions and 29 deletions
@@ -69,10 +69,6 @@
</button> </button>
</header> </header>
@if (erreur()) {
<p class="consultation__erreur" role="alert">{{ erreur() }}</p>
}
@if (chargement()) { @if (chargement()) {
<p class="consultation__chargement">Chargement des trajets…</p> <p class="consultation__chargement">Chargement des trajets…</p>
} }
@@ -105,8 +105,6 @@ export class ConsultationJourComponent implements OnInit, OnDestroy {
/** Chargement de la journée en cours. */ /** Chargement de la journée en cours. */
readonly chargement = signal(false); readonly chargement = signal(false);
/** Message d'erreur de chargement de la journée. */
readonly erreur = signal<string | null>(null);
private jourSub?: Subscription; private jourSub?: Subscription;
private vehiculesSub?: Subscription; private vehiculesSub?: Subscription;
@@ -337,19 +335,15 @@ export class ConsultationJourComponent implements OnInit, OnDestroy {
const mois = moisCourant.mois; const mois = moisCourant.mois;
this.chargement.set(true); this.chargement.set(true);
this.erreur.set(null);
// Chaque observable du forkJoin porte son propre `catchError` afin que le // Chaque observable du forkJoin porte son propre `catchError` afin que le
// forkJoin complète TOUJOURS (il n'émet qu'une fois tous les flux complétés). // forkJoin complète TOUJOURS (il n'émet qu'une fois tous les flux complétés).
// Ainsi un échec réseau sur le résumé ou la carte ne fige plus l'UI sur // Ainsi un échec réseau sur le résumé ou la carte ne fige plus l'UI sur
// « Chargement des trajets… ». On mémorise l'erreur du résumé pour l'afficher. // « Chargement des trajets… ». Un mois sans données (ou en échec) affiche
let resumeEnErreur = false; // simplement une liste vide et le message « Aucun trajet pour ce mois ».
this.jourSub = forkJoin({ this.jourSub = forkJoin({
resume: this.trajetService.getResumeMensuel(annee, mois, vehiculeId).pipe( resume: this.trajetService.getResumeMensuel(annee, mois, vehiculeId).pipe(
catchError(() => { catchError(() => of({ annee, mois, trajets: [], totalKm: 0 } as ResumeMensuel))
resumeEnErreur = true;
return of({ annee, mois, trajets: [], totalKm: 0 } as ResumeMensuel);
})
), ),
carte: this.trajetService carte: this.trajetService
.getTrajetsJournee(date) .getTrajetsJournee(date)
@@ -393,9 +387,6 @@ export class ConsultationJourComponent implements OnInit, OnDestroy {
? carte ? carte
: this.filtrerCarteParVehicule(carte) : this.filtrerCarteParVehicule(carte)
); );
this.erreur.set(resumeEnErreur
? 'Impossible de charger les trajets du mois.'
: null);
// Force la mise à jour immédiate de la liste, des totaux et de la carte // Force la mise à jour immédiate de la liste, des totaux et de la carte
// après une navigation Jour ± 1, sans attendre une autre interaction. // après une navigation Jour ± 1, sans attendre une autre interaction.
this.cdr.markForCheck(); this.cdr.markForCheck();
@@ -405,7 +396,6 @@ export class ConsultationJourComponent implements OnInit, OnDestroy {
// robuste : on affiche l'erreur et on rafraîchit la vue. // robuste : on affiche l'erreur et on rafraîchit la vue.
this.trajets.set([]); this.trajets.set([]);
this.trajetsCarte.set([]); this.trajetsCarte.set([]);
this.erreur.set('Impossible de charger les trajets du mois.');
this.cdr.markForCheck(); this.cdr.markForCheck();
} }
}); });
@@ -1,10 +1,6 @@
<section class="panneau-totaux" aria-label="Totaux kilométriques"> <section class="panneau-totaux" aria-label="Totaux kilométriques">
<h2 class="panneau-totaux__titre">Totaux</h2> <h2 class="panneau-totaux__titre">Totaux</h2>
@if (erreur()) {
<p class="panneau-totaux__erreur" role="alert">{{ erreur() }}</p>
}
@if (chargement() && !totaux()) { @if (chargement() && !totaux()) {
<p class="panneau-totaux__chargement">Chargement des totaux…</p> <p class="panneau-totaux__chargement">Chargement des totaux…</p>
} }
@@ -63,8 +63,6 @@ export class PanneauTotauxComponent implements OnChanges, OnDestroy {
/** Chargement en cours (totaux et/ou montant prévisionnel). */ /** Chargement en cours (totaux et/ou montant prévisionnel). */
readonly chargement = signal(false); readonly chargement = signal(false);
/** Message d'erreur affiché si le chargement échoue. */
readonly erreur = signal<string | null>(null);
private totauxSub?: Subscription; private totauxSub?: Subscription;
private montantSub?: Subscription; private montantSub?: Subscription;
@@ -98,7 +96,6 @@ export class PanneauTotauxComponent implements OnChanges, OnDestroy {
this.totaux.set(null); this.totaux.set(null);
this.montantPrevisionnel.set(null); this.montantPrevisionnel.set(null);
this.chargement.set(false); this.chargement.set(false);
this.erreur.set(null);
this.cdr.markForCheck(); this.cdr.markForCheck();
return; return;
} }
@@ -109,7 +106,6 @@ export class PanneauTotauxComponent implements OnChanges, OnDestroy {
const mois = this.moisDe(date); const mois = this.moisDe(date);
this.chargement.set(true); this.chargement.set(true);
this.erreur.set(null);
this.cdr.markForCheck(); this.cdr.markForCheck();
this.totauxSub = this.trajetService.getTotauxJour(date, vehiculeId).subscribe({ this.totauxSub = this.trajetService.getTotauxJour(date, vehiculeId).subscribe({
@@ -119,9 +115,11 @@ export class PanneauTotauxComponent implements OnChanges, OnDestroy {
this.cdr.markForCheck(); this.cdr.markForCheck();
}, },
error: () => { error: () => {
// Un mois / jour sans trajet est un cas normal : on affiche des totaux
// nuls plutôt qu'une alerte. Les vraies indisponibilités serveur sont
// signalées globalement par l'intercepteur (notification).
this.totaux.set(null); this.totaux.set(null);
this.chargement.set(false); this.chargement.set(false);
this.erreur.set('Impossible de charger les totaux.');
this.cdr.markForCheck(); this.cdr.markForCheck();
} }
}); });
@@ -1,6 +1,4 @@
@if (groupes().length === 0) { @if (groupes().length > 0) {
<p class="liste-vide" role="status">Aucun trajet pour ce mois.</p>
} @else {
<!-- Un groupe par journée : en-tête de date + liste de dépôt indépendante. <!-- Un groupe par journée : en-tête de date + liste de dépôt indépendante.
Les listes NE sont PAS connectées entre elles → drag limité à chaque jour. --> Les listes NE sont PAS connectées entre elles → drag limité à chaque jour. -->
@for (groupe of groupes(); track groupe.date) { @for (groupe of groupes(); track groupe.date) {