UX consultation, trajets aller/retour et rafraîchissement des totaux

- Totaux : rafraîchissement immédiat du panneau (jour/mois/année + montant
  prévisionnel) après création/modification/suppression/réordonnancement d'un
  trajet, sans changer de jour (ViewChild + méthode publique rafraichir()).
- Trajets Aller/Retour : case à cocher au formulaire ; la distance comptée est
  doublée (distance simple stockée + booléen AllerRetour, distance effective
  utilisée dans tous les agrégats : totaux, résumés, barème, régularisation, PDF).
  Migration TrajetAllerRetour. Badge « A/R » dans une colonne dédiée en début de
  ligne pour garder date/adresses alignées.
- Mise en page de la page Trajets : vue à hauteur fixe où seule la liste défile ;
  colonne gauche figée (sélecteur de date + navigation, totaux, carte) et bande
  fixe (véhicule + bouton d'ajout) au-dessus de la liste. Layout applicatif global
  en pleine hauteur (app.component).
- run-dev.sh : chargement de la clé JWT depuis .env (ou secret de dev aléatoire) et
  Auth__FrontendBaseUrl sur le frontend dev ; rappel du lien de reset journalisé.

Build backend (solution) et frontend (production) OK.
This commit is contained in:
2026-09-15 12:33:10 +02:00
parent dd36bbc425
commit 09c24d5f59
24 changed files with 759 additions and 109 deletions
@@ -214,6 +214,14 @@
}
</div>
<!-- Aller/Retour : double la distance comptée, sans créer de trajet retour. -->
<div class="champ champ--aller-retour">
<label class="case-aller-retour">
<input type="checkbox" formControlName="allerRetour" />
<span>Aller/Retour (compte le double de la distance)</span>
</label>
</div>
<!-- Actions -->
<div class="actions">
<button type="submit" class="btn-primaire" [disabled]="soumissionEnCours()">
@@ -212,3 +212,21 @@
background: #f3f5f8;
}
}
/* Case Aller/Retour : compacte, sur une seule ligne pour gagner en hauteur. */
.champ--aller-retour {
margin: 0.25rem 0 0.5rem;
}
.case-aller-retour {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 0.9rem;
cursor: pointer;
}
.case-aller-retour input {
width: 1rem;
height: 1rem;
margin: 0;
}
@@ -371,7 +371,8 @@ export class TrajetFormComponent implements OnInit, OnDestroy {
'',
[Validators.required, Validators.minLength(1), Validators.maxLength(ADRESSE_MAX)]
],
commentaire: ['', [Validators.maxLength(COMMENTAIRE_MAX)]]
commentaire: ['', [Validators.maxLength(COMMENTAIRE_MAX)]],
allerRetour: [false]
});
}
@@ -382,7 +383,8 @@ export class TrajetFormComponent implements OnInit, OnDestroy {
date: this.versIsoInput(this.trajet.date),
adresseDepart: this.trajet.adresseDepart,
adresseArrivee: this.trajet.adresseArrivee,
commentaire: this.trajet.commentaire ?? ''
commentaire: this.trajet.commentaire ?? '',
allerRetour: this.trajet.allerRetour ?? false
});
// En édition, on repart sans coordonnées locales : elles ne seront recalculées
// côté backend que si l'adresse est modifiée (Exigence 5.2/5.3). Les adresses du
@@ -549,7 +551,8 @@ export class TrajetFormComponent implements OnInit, OnDestroy {
arriveeLatitude: coordArrivee?.latitude ?? null,
arriveeLongitude: coordArrivee?.longitude ?? null,
commentaire: this.normaliserCommentaire(),
vehiculeId: this.vehiculeId
vehiculeId: this.vehiculeId,
allerRetour: !!this.form.get('allerRetour')?.value
};
}
@@ -565,7 +568,8 @@ export class TrajetFormComponent implements OnInit, OnDestroy {
arriveeLatitude: coordArrivee?.latitude ?? null,
arriveeLongitude: coordArrivee?.longitude ?? null,
commentaire: this.normaliserCommentaire(),
vehiculeId: this.vehiculeId
vehiculeId: this.vehiculeId,
allerRetour: !!this.form.get('allerRetour')?.value
};
}
@@ -618,7 +622,8 @@ export class TrajetFormComponent implements OnInit, OnDestroy {
date: '',
adresseDepart: '',
adresseArrivee: '',
commentaire: ''
commentaire: '',
allerRetour: false
});
this.coordDepart.set(null);
this.coordArrivee.set(null);