Astreintes : interventions dans un menu dépliant fermé, cadre élargi

Les heures d'intervention (début, fin, description) passent en trois
colonnes alignées, cachées par défaut derrière un bouton « N
interventions » ; l'heure de retour et le total restent visibles.
L'état déplié survit aux rafraîchissements HTMX. Le conteneur passe
de 1100 à 1400 px pour que les lignes ne dépassent plus du cadre.

💘 Generated with Crush

Assisted-by: Crush:glm-5.2
This commit is contained in:
Jacquin Antoine
2026-09-08 22:40:06 +02:00
parent c208a17eec
commit 83f5512cb6
5 changed files with 147 additions and 64 deletions

View File

@ -452,22 +452,23 @@ def _btns_html(date, jour):
def _as_event_html(date, ev):
"""Une ligne d'intervention d'astreinte : début → fin, description, suppression."""
"""Une ligne d'intervention d'astreinte : début, fin, description (3 colonnes
de la grille), suppression."""
return (
f'<div class="as-event">'
f'<input class="time-input" type="time" name="astreinte_debut" data-date="{_e(date)}" value="{_e(ev.get("debut") or "")}">'
f'<span class="time-sep">→</span>'
f'<input class="time-input" type="time" name="astreinte_fin" data-date="{_e(date)}" value="{_e(ev.get("fin") or "")}">'
f'<div class="as-desc-cell">'
f'<input type="text" class="as-desc" name="astreinte_desc" data-date="{_e(date)}" maxlength="200" placeholder="description" value="{_e(ev.get("desc") or "")}">'
f'<button type="button" class="as-del" title="Supprimer" onclick="this.closest(\'.as-event\').remove()">×</button>'
f'</div>'
f'</div></div>'
)
def _as_block_html(date, jour):
"""Bloc astreinte d'une ligne : événements d'intervention (début/fin, nombre
libre, description), qui déclenchent les 11h de repos et décalent l'heure de
retour, plus le décompte du jour (compteur séparé, hors heures de semaine).
"""Bloc astreinte d'une ligne : les heures d'intervention (début, fin,
description) sont regroupées dans un menu dépliant fermé par défaut ; seuls
le bouton, l'heure de retour (11h de repos) et le décompte restent visibles.
Rendu sur les jours qualifiés (astreinte ou lendemain) ; div vide ailleurs."""
if not jour.get("astreinte_qualifiee"):
return f'<div id="as-block-{_e(date)}" hx-swap-oob="true"></div>'
@ -481,12 +482,22 @@ def _as_block_html(date, jour):
if jour.get("astreinte_min"):
total = (f'<span class="as-total" title="Compteur séparé, hors heures de semaine">'
f'astreinte : {_e(jour["astreinte_h"])}</span>')
nb = len(events)
label = f'{nb} intervention' + ('s' if nb != 1 else '')
return (
f'<div id="as-block-{_e(date)}" class="as-block" data-label="Astreinte" hx-swap-oob="true">'
f'<div class="as-events" id="as-events-{_e(date)}">{rows}</div>'
f'<div id="as-block-{_e(date)}" class="as-block" data-date="{_e(date)}" data-label="Astreinte" hx-swap-oob="true">'
f'<div class="as-head">'
f'<button type="button" class="as-toggle" data-date="{_e(date)}" aria-expanded="false" onclick="asToggle(this)">'
f'<span class="as-caret">▸</span> {label}</button>'
f'{hint}{total}'
f'</div>'
f'<div class="as-body">'
f'<div class="as-grid" id="as-events-{_e(date)}">'
f'<span class="as-th">Début</span><span class="as-th">Fin</span><span class="as-th">Description</span>'
f'{rows}'
f'</div>'
f'<button type="button" class="as-add" onclick="asAddEvent(\'{_e(date)}\')">+ intervention</button>'
f'{hint}'
f'{total}'
f'</div>'
f'</div>'
)