Évolution du thème existant "étiquette d'inventaire" plutôt que remplacement : couche de tokens sémantiques + échelles espacement/ typographie, mode sombre via prefers-color-scheme, hiérarchie de boutons (primaire/secondaire/danger), icônes SVG et état actif dans la nav, fil d'Ariane et compteur de résultats sur /materiels, badges de stock bas réutilisés depuis /scan, formulaire de planification regroupé en carte sur /destinataires, et correctif de contraste en mode sombre (inputs natifs + boutons qui restaient rendus en clair). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EEC2W1xtjmpHkEYgua7gWC
81 lines
3.2 KiB
HTML
81 lines
3.2 KiB
HTML
{% extends "base.html" %}
|
|
{% block titre %}Alertes - Gestion de stock IT{% endblock %}
|
|
{% block contenu %}
|
|
<h1>Destinataires des alertes de stock bas</h1>
|
|
|
|
<form method="get" action="/destinataires" class="barre-recherche">
|
|
<input type="search" name="q" value="{{ q }}" placeholder="Rechercher un email…">
|
|
{% if q %}<a href="/destinataires" class="lien-effacer">Effacer</a>{% endif %}
|
|
</form>
|
|
|
|
<ul class="liste-resultats">
|
|
{% for destinataire in destinataires %}
|
|
<li>
|
|
<span>{{ destinataire.email }}</span>
|
|
<form method="post" action="/destinataires/{{ destinataire.id }}/supprimer" class="formulaire-inline">
|
|
<button type="submit" class="bouton-danger">Supprimer</button>
|
|
</form>
|
|
</li>
|
|
{% else %}
|
|
<li class="liste-vide">
|
|
{% if q %}Aucun destinataire ne correspond à « {{ q }} ».{% else %}Aucun destinataire configuré : aucune alerte ne sera envoyée.{% endif %}
|
|
</li>
|
|
{% endfor %}
|
|
</ul>
|
|
|
|
<form method="post" action="/destinataires" class="formulaire-inline">
|
|
<input type="email" name="email" placeholder="email@clinique.local" required>
|
|
<button type="submit" class="bouton-primaire">Ajouter</button>
|
|
</form>
|
|
|
|
<h2>Résumé périodique du stock</h2>
|
|
|
|
{#
|
|
Les deux formulaires ci-dessous modifient le même réglage
|
|
(expression_cron) : l'un via des raccourcis courants, l'autre en saisie
|
|
libre. Les regrouper dans une même carte les fait lire comme un seul
|
|
réglage à deux modes de saisie plutôt que deux actions indépendantes.
|
|
#}
|
|
<div class="carte-reglage">
|
|
<p class="texte-secondaire">
|
|
Un email récapitulatif (stock bas en premier, puis le reste du stock) est
|
|
envoyé automatiquement selon l'horaire ci-dessous, aux destinataires listés
|
|
plus haut.
|
|
{% if prochaine_execution %}
|
|
Prochain envoi : {{ prochaine_execution.strftime("%d/%m/%Y à %H:%M") }}.
|
|
{% endif %}
|
|
</p>
|
|
|
|
{% if erreur_cron %}
|
|
<p class="message-erreur">{{ erreur_cron }}</p>
|
|
{% endif %}
|
|
|
|
{% set exemples_valeurs = exemples_cron | map(attribute=0) | list %}
|
|
<form method="post" action="/destinataires/planification" class="formulaire-inline formulaire-planification">
|
|
<select name="expression_cron">
|
|
{% for expression, description in exemples_cron %}
|
|
<option value="{{ expression }}" {{ "selected" if expression == expression_cron else "" }}>
|
|
{{ description }} ({{ expression }})
|
|
</option>
|
|
{% endfor %}
|
|
{% if expression_cron not in exemples_valeurs %}
|
|
<option value="{{ expression_cron }}" selected>Personnalisé ({{ expression_cron }})</option>
|
|
{% endif %}
|
|
</select>
|
|
<button type="submit">Appliquer</button>
|
|
</form>
|
|
|
|
<form method="post" action="/destinataires/planification" class="formulaire-inline">
|
|
<input type="text" name="expression_cron" value="{{ expression_cron }}" class="champ-cron" placeholder="0 9 * * mon">
|
|
<button type="submit">Enregistrer une expression personnalisée</button>
|
|
</form>
|
|
|
|
<p class="texte-secondaire">
|
|
Format cron : minute (0-59) heure (0-23) jour (1-31) mois (1-12) jour de la
|
|
semaine. Utilisez les noms de jours (mon, tue, wed, thu, fri, sat, sun),
|
|
pas de chiffres — leur numérotation ne suit pas le cron Unix habituel et
|
|
prête à confusion.
|
|
</p>
|
|
</div>
|
|
{% endblock %}
|