{#- Bandeau IA collant (Lettre, CV adapté, Mon CV, mode libre) et barre de décision. À importer : {% from "_bandeau_ia.html" import pilule, bandeau, barre_decision %} Types : `Agent` = {disponible: bool, cause: str} (le bandeau `agent` déjà passé aux pages) ; `Decision` = {url, vals, inclure, cible, echange} (un POST htmx ; `inclure` : sélecteur `hx-include`, vide sinon). Le bandeau est posé dans le `
` de la page : le bouton d'envoi poste donc tout le formulaire (brouillon compris), plus ses champs `consigne`, `portee`, `adresse`, `debut`, `fin`, `texte`. La réponse remplace `#editeur-` (`innerHTML`) : la barre de décision prend la place du bandeau, la différence celle du champ. Comportement (ouverture, Ctrl K, suggestions, portée) : `statique/ilot.js`, d'après les attributs `data-bandeau-ia`, `data-suggestion`, `data-portee`, `data-portee-element` et `data-libelle-*`. -#} {% from "_composants.html" import vie_privee as mention_vie_privee %} {% macro icone() -%} {%- endmacro %} {#- Le bouton « · Ctrl K » qui déplie le bandeau. Agent indisponible : grisé, et la cause est affichée. -#} {% macro pilule(zone, libelle, agent) -%} {%- endmacro %} {#- Le bandeau : la pilule, et la partie dépliée (consigne, bouton d'envoi, ×, suggestions, portée, mention de vie privée). `proposer` : URL du POST de proposition ; `portee` : {libelle, valeur} (« Portée : toute la lettre », `lettre`) ; `suggestions` : textes des boutons à bascule ; `libelles` : chaque entrée devient `data-libelle-` lu par l'îlot. Clés : `pilule`, `consigne` (exemple de consigne), `bouton_tout`, `portee_tout`, et selon la page `bouton_selection` / `portee_selection` (lettre, mode libre ; `{n}` : nombre de mots) ou `bouton_puce`, `portee_puce` (`{debut}` : 38 premiers caractères), `bouton_accroche`, `portee_accroche`, `consigne_puce`, `consigne_accroche`, `lien_tout` (CV). `vie_privee` : sorte de la mention ; `ouvert` : partie dépliée dès l'affichage. -#} {% macro bandeau(zone, proposer, agent, portee, suggestions, libelles, vie_privee="ia", ouvert=False) -%}
{{ pilule(zone, libelles.pilule, agent) }}
{{ icone() }}
{% for suggestion in suggestions %} {% endfor %} {{ portee.libelle }}{% if libelles.get("lien_tout") %} {% endif %}
{{ mention_vie_privee(vie_privee) }} L'IA travaille…
{% if not agent.disponible %}

{{ agent.cause }}

{% endif %}
{%- endmacro %} {#- Un bouton de décision (Accepter, Refuser, Tout accepter...) : POST htmx d'une `Decision`. -#} {% macro _decision(d, libelle, principal=False) -%} {%- endmacro %} {#- Barre de décision (`role="status"`), à la place du bandeau pendant qu'une proposition attend. `nombre_ecarts` None (lettre, mode libre) : « Proposition de l'IA · », légende « ajouté · retiré », boutons Refuser / Accepter. `nombre_ecarts` entier (CV, spec § 5.4) : « Proposition de l'IA · N modifications, affichées sous les champs concernés ; acceptez-les une à une ou toutes ensemble. », boutons Tout refuser / Tout accepter (`refuser` et `accepter` portent alors `action=tout-refuser` / `tout-accepter`). -#} {% macro barre_decision(zone, accepter, refuser, resume="", nombre_ecarts=None) -%}
Proposition de l'IA {% if nombre_ecarts is none %} {% if resume %} · {{ resume }}{% endif %}
ajouté · retiré
{% elif nombre_ecarts == 1 %} · 1 modification, affichée sous le champ concerné ; acceptez-la ou refusez-la. {% else %} · {{ nombre_ecarts }} modifications, affichées sous les champs concernés ; acceptez-les une à une ou toutes ensemble. {% endif %}
{{ _decision(refuser, "Refuser" if nombre_ecarts is none else "Tout refuser") }} {{ _decision(accepter, "Accepter" if nombre_ecarts is none else "Tout accepter", principal=True) }}
{%- endmacro %}