Refonte de l'interface : sauvegarde automatique, menu d'état unique et panneau aujourd'hui

- Chaque heure validée enregistre le jour (plus de bouton ✓), avec un témoin
  « enregistré » et conservation du focus entre les champs
- Les boutons MA/AM/J/F/AS deviennent un bouton d'état unique à pastilles
  ouvrant un menu déroulant (congés, férié, astreinte)
- Panneau Aujourd'hui : sortie cible en grand et progression travaillé/dû
  de la semaine, rafraîchis à chaque saisie
- Polish général : coins arrondis, ombres douces, hiérarchie des soldes,
  états de focus visibles

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
This commit is contained in:
Jacquin Antoine
2026-09-09 20:34:27 +02:00
parent 791b48b320
commit e9983a28c7
8 changed files with 565 additions and 98 deletions

View File

@ -1,4 +1,37 @@
<div id="soldes-section" hx-swap-oob="true">
{% if result.today %}
{% set jt = result.today.jour %}
<div class="today-panel">
<div class="today-main">
<div class="today-eyebrow">Aujourd'hui · {{ result.today.nom }} {{ jt.date[8:] }}/{{ jt.date[5:7] }}</div>
{% if 'jour' in jt.conge %}
<div class="today-cible today-neutral">En congé aujourd'hui</div>
{% elif jt.cible_aprem %}
<div class="today-cible">{{ jt.cible_aprem }}</div>
<div class="today-sub">sortie cible pour tenir le rythme · entrée {{ jt.cible_aprem_entree }}</div>
{% elif jt.cible_matin %}
<div class="today-cible">{{ jt.cible_matin }}</div>
<div class="today-sub">sortie cible du matin · entrée {{ jt.cible_matin_entree }}</div>
{% elif jt.du_min == 0 %}
<div class="today-cible today-neutral">Aucune heure due aujourd'hui</div>
{% else %}
<div class="today-cible today-neutral">Saisissez vos heures du jour</div>
{% endif %}
</div>
{% if result.today.pct is not none %}
<div class="today-prog">
<div class="today-prog-head">
<span>Semaine · <b>{{ result.today.trav_total }}</b> / {{ result.today.du_total }}</span>
<span>Solde <b class="{% if result.solde_min > 0 %}stat-pos{% elif result.solde_min < 0 %}stat-neg{% endif %}">{% if result.solde_min > 0 %}+{% endif %}{{ result.solde }}</b></span>
</div>
<div class="today-bar">
<div class="today-bar-fill{% if result.solde_min < 0 %} short{% elif result.reste_min == 0 %} full-pos{% endif %}" style="width: {{ result.today.pct }}%"></div>
</div>
</div>
{% endif %}
</div>
{% endif %}
<div class="soldes-wrap">
<div class="soldes">
<div class="solde-item">
<div class="solde-eyebrow">Travaillé</div>
@ -43,6 +76,7 @@
complétez ou corrigez les saisies, ou rattrapez sur une autre semaine.
</div>
{% endif %}
</div>
{% if result.astreinte and result.astreinte.actif %}
<div class="as-decompte">
<div class="as-decompte-title">Astreinte — compteur séparé, hors heures de semaine</div>