Contrôle complet + corrections de bugs + améliorations UI

Vérification de bout en bout via la vraie config nginx (21 checks
Playwright, tous passants) : parcours admin complet, saisie cadre,
double validation, verrouillages, exports, erreurs de connexion.

Bugs corrigés découverts par ce contrôle :
- La création d'utilisateur via l'interface était cassée depuis le
  début : l'id "user-role" existait en double (badge de l'en-tête +
  select de la modale), getElementById renvoyait le span du header et
  le rôle n'était jamais envoyé (400 systématique). Le badge devient
  user-role-badge.
- Les toasts de notification intercep­taient les clics sur les boutons
  situés dessous pendant 4 s (pointer-events: none ajouté).

Améliorations UI :
- « Absent » renommé « Non-présent » partout (légende, popover,
  exports PDF et Excel — code NP au lieu de A).
- Récapitulatif mensuel : tuiles de compteurs par statut au-dessus du
  calendrier, mises à jour à chaque saisie.
- Bouton « Remplir les jours ouvrés en Présent » : renseigne en un clic
  toutes les demi-journées vides du lundi au vendredi (nouvel endpoint
  PUT /api/attendance/bulk, transactionnel, mêmes contrôles de
  verrouillage), sans toucher aux saisies existantes.
- Jour actuel mis en évidence dans le calendrier.
- Favicon.
This commit is contained in:
Claude committed 2026-07-06 15:04:03 +00:00
1 parent 441a1758a5
commit 7ea223a442
7 files changed
+146 -11

No files matched your search

+31 -1
View File
@@ -250,7 +250,35 @@ h2 { font-size: 17px; margin: 0 0 4px; }
.half-day.st-conge { background: var(--color-conge-bg); color: var(--color-conge); border-style: solid; border-color: transparent; }
.half-day.st-rtt { background: var(--color-rtt-bg); color: var(--color-rtt); border-style: solid; border-color: transparent; }
.calendar-actions { margin-top: 22px; display: flex; justify-content: flex-end; }
.calendar-actions { margin-top: 22px; display: flex; justify-content: flex-end; gap: 10px; flex-wrap: wrap; }
/* Highlight of the current day */
.day-cell.today { border-color: var(--color-primary); box-shadow: inset 0 0 0 1px var(--color-primary); }
.day-cell.today .day-number { color: var(--color-primary); }
/* ---------- Monthly summary tiles ---------- */
.month-summary {
display: flex;
gap: 10px;
flex-wrap: wrap;
margin-bottom: 16px;
}
.month-summary:empty { display: none; }
.summary-tile {
display: flex;
align-items: baseline;
gap: 7px;
background: var(--color-surface);
border: 1px solid var(--color-border);
border-radius: 8px;
padding: 8px 14px;
}
.summary-count { font-size: 18px; font-weight: 700; }
.summary-label { font-size: 12px; color: var(--color-muted); font-weight: 600; }
.summary-present .summary-count { color: var(--color-present); }
.summary-absent .summary-count { color: var(--color-absent); }
.summary-conge .summary-count { color: var(--color-conge); }
.summary-rtt .summary-count { color: var(--color-rtt); }
/* ---------- Tables ---------- */
.data-table { width: 100%; border-collapse: collapse; font-size: 14px; }
@@ -318,6 +346,8 @@ h2 { font-size: 17px; margin: 0 0 4px; }
.toast-container {
position: fixed; top: 18px; right: 18px; z-index: 200;
display: flex; flex-direction: column; gap: 10px;
/* Notifications must never block clicks on the UI underneath them. */
pointer-events: none;
}
.toast {
background: var(--color-text); color: #fff; padding: 12px 18px; border-radius: 8px;