Rend les plages horaires configurables par utilisateur plutôt que globalement

Chaque compte a désormais son propre data/users/<user>/plages.json, réglable
depuis une nouvelle carte "Plages horaires" sur /settings (avec validation
HH:MM et ordre matin < aprem). Le calcul, les stats de conformité et les
avertissements de saisie lisent la config de l'utilisateur courant au lieu
du plages global. La valeur globale de data/config.json reste lue comme
valeur de repli tant qu'un utilisateur n'a rien personnalisé.
This commit is contained in:
Antoine
2026-07-17 23:15:06 +02:00
parent dd8848a115
commit d87bf6a212
6 changed files with 115 additions and 33 deletions

View File

@ -7,6 +7,40 @@
</div>
</div>
<div class="settings-card">
<span class="hist-label">Plages horaires</span>
<p class="settings-p">
Bornes de présence obligatoire matin/après-midi et heure de reprise par défaut de
l'après-midi, utilisées pour les avertissements de saisie et les préconisations de
fin de demi-journée. Propres à ton compte — ne change rien pour les autres.
</p>
{% if plages_saved %}
<div class="settings-saved">Enregistré.</div>
{% endif %}
{% if plages_error %}
<div class="settings-error">Horaires invalides (format HH:MM, matin_debut &lt; matin_fin &lt; aprem_debut &lt; aprem_fin).</div>
{% endif %}
<form method="post" action="/settings/plages" class="settings-form">
<label class="login-label" for="matin_debut">Présence matin</label>
<div class="settings-range">
<input id="matin_debut" class="login-input settings-range-input" type="time" name="matin_debut" value="{{ plages.matin_debut }}">
<span class="settings-range-sep"></span>
<input id="matin_fin" class="login-input settings-range-input" type="time" name="matin_fin" value="{{ plages.matin_fin }}">
</div>
<label class="login-label" for="aprem_debut">Présence après-midi</label>
<div class="settings-range">
<input id="aprem_debut" class="login-input settings-range-input" type="time" name="aprem_debut" value="{{ plages.aprem_debut }}">
<span class="settings-range-sep"></span>
<input id="aprem_fin" class="login-input settings-range-input" type="time" name="aprem_fin" value="{{ plages.aprem_fin }}">
</div>
<label class="login-label" for="pause_dejeuner_fin">Reprise par défaut de l'après-midi</label>
<input id="pause_dejeuner_fin" class="login-input settings-range-input" type="time" name="pause_dejeuner_fin" value="{{ plages.pause_dejeuner_fin }}">
<button class="login-btn" type="submit">Enregistrer</button>
</form>
</div>
<div class="settings-card">
<span class="hist-label">Notifications (ntfy)</span>
<p class="settings-p">
@ -102,6 +136,14 @@
padding: .5rem .8rem;
font-family: var(--mono);
}
.settings-error {
background: var(--neg-bg);
border-left: 3px solid var(--neg);
color: var(--neg);
font-size: 12px;
padding: .5rem .8rem;
font-family: var(--mono);
}
.settings-urlrow { display: flex; align-items: center; gap: .75rem; flex-wrap: wrap; }
.settings-urllabel {
font-family: var(--mono);