{#- Editeur du CV au gabarit (onglet CV d'une offre et Mon CV). Ce fichier ne contient que des macros : il s'importe sans contexte. Ids : `#formulaire-cv` (le formulaire, cible de l'enregistrement et des operations de structure), `#editeur-cv` (bandeau IA ou barre de decision, puis les champs : cible des propositions et des ecarts), `#apercu-cv` (voir `_cv_apercu.html`), `#etat-cv` (zone d'etat de la barre, cible de toutes les erreurs). Chaque champ porte `data-repere=""` (adresses du socle : `identite`, `accroche`, `sections[i]`, `sections[i].entrees[j]`, `...puces[k]`, `sections[i].lignes[j]`, `sections[i].texte`) et un `id` stable derive de l'adresse. Contrats de l'ilot : poignees `button[data-poignee][data-repere]` dans un `[data-parent]`, champs `adresse` et `vers` et bouton `[data-operation=deplacer]` ; portee de l'IA `textarea[data-portee-element]` et son bouton ✦ dans le meme
  • . -#} {% from "_composants.html" import attributs_brouillon, barre_enregistrement, zone_etat, vie_privee %} {#- `id` stable d'un champ, derive de son adresse : sections[0].titre -> c-sections-0-titre -#} {%- macro ident(adresse) -%} c-{{ adresse | replace("[", "-") | replace("]", "") | replace(".", "-") }} {%- endmacro %} {% macro icone_corbeille() -%} {%- endmacro %} {% macro icone_ia() -%} {%- endmacro %} {#- Poignee de deplacement : glisser-deposer, ou ↑ ↓ au clavier (ilot). `focus` : adresse de l'element qui vient d'etre deplace (la poignee reprend le focus). -#} {% macro poignee(adresse, libelle, focus="") -%} {%- endmacro %} {#- Bouton d'operation de structure : poste le formulaire entier, rend le formulaire. -#} {% macro bouton_op(contenu, operation, adresse, cibles, aria="", classe="bouton") -%} {%- endmacro %} {#- Les ecarts de la proposition de l'IA qui s'affichent a cette adresse : difference, Accepter, Refuser. `en_liste` : l'ecart est un
  • (dans une liste de puces). -#} {% macro ecarts_sous(ecarts, adresse, cibles, en_liste=False) -%} {% set noms = {"modifie": "Modification proposée", "ajoute": "Ajout proposé", "retire": "Retrait proposé"} %} {% for e in ecarts.get(adresse) or [] %} <{{ "li" if en_liste else "div" }} class="ecart" role="group" aria-label="{{ noms[e.sorte] }} par l'IA">

    {{ noms[e.sorte] }}

    {{ e.avant | diff_mots(e.apres) }}
    {% endfor %} {%- endmacro %} {#- CV dont le fichier est refuse (gabarit inconnu, YAML illisible, invalide) : alerte, rien a editer ; la page garde ses onglets. `diag` : `cv_formulaire.diagnostic` ; `lien_historique` : l'historique, pour restaurer une version. -#} {% macro cv_illisible(diag, lien_historique) -%}

    Voir l'historique pour restaurer une version

    {{ zone_etat("cv") }}
    {%- endmacro %} {#- Contenu de `#editeur-cv` : de quoi glisser-deposer (champs `adresse` et `vers`, bouton cache), le gabarit et l'empreinte du fichier lu (une reponse partielle ramene ainsi un formulaire complet), le haut (bandeau IA ou barre de decision), les champs caches de la proposition en cours et de l'origine, puis l'identite, l'accroche et les sections. `d` : `cv_formulaire.vue(...)` ; `ecarts` : adresse -> ecarts a y afficher. -#} {% macro contenu(d, empreinte, cibles, haut, ecarts, propose="", refuses="", origine="", focus="", avertissement="", identite_ouverte=False) -%} {% set champs_identite = (("nom", "Nom"), ("titre", "Titre"), ("email", "E-mail"), ("telephone", "Téléphone"), ("ville", "Ville"), ("site", "Site")) %} {% set types = {"experiences": "expériences", "paires": "liste de paires", "texte": "paragraphe"} %}

    Glisser, ou ↑ ↓ au clavier

    {{ haut }} {% if avertissement %}

    {{ avertissement }}

    {% endif %} {% if propose %} {% endif %} {% if origine %}{% endif %}
    Identité · {{ d.identite.nom }} · {{ d.identite.titre }}
    {% for cle, libelle in champs_identite %} {% set adr = "identite." ~ cle %}
    {{ ecarts_sous(ecarts, adr, cibles) }}
    {% endfor %}
    {{ ecarts_sous(ecarts, "accroche", cibles) }}
    {{ ecarts_sous(ecarts, "sections", cibles) }} {% for s in d.sections %} {% set i = loop.index0 %} {% set adr = "sections[" ~ i ~ "]" %} {% set base = "d.sections." ~ i %}
    {{ poignee(adr, "la section " ~ s.titre, focus) }} {{ bouton_op(icone_corbeille(), "supprimer", adr, cibles, "Supprimer la section " ~ s.titre, "icone") }}
    {{ ecarts_sous(ecarts, adr ~ ".titre", cibles) }} {% if s.type == "experiences" %}
    {{ ecarts_sous(ecarts, adr ~ ".entrees", cibles) }} {% for e in s.entrees %} {% set j = loop.index0 %} {% set adr_e = adr ~ ".entrees[" ~ j ~ "]" %} {% set base_e = base ~ ".entrees." ~ j %}
    {{ poignee(adr_e, "l'expérience " ~ e.role, focus) }}
    {{ ecarts_sous(ecarts, adr_e ~ ".role", cibles) }} {{ ecarts_sous(ecarts, adr_e ~ ".organisation", cibles) }} {{ ecarts_sous(ecarts, adr_e ~ ".dates", cibles) }} {{ ecarts_sous(ecarts, adr_e ~ ".sous_titre", cibles) }}
      {{ ecarts_sous(ecarts, adr_e ~ ".puces", cibles, True) }} {% for p in e.puces %} {% set k = loop.index0 %} {% set adr_p = adr_e ~ ".puces[" ~ k ~ "]" %}
    • {{ poignee(adr_p, "cette puce", focus) }} {{ bouton_op(icone_corbeille(), "supprimer", adr_p, cibles, "Supprimer cette puce", "icone") }}
    • {{ ecarts_sous(ecarts, adr_p, cibles, True) }} {% endfor %}
    {{ bouton_op("+ Ajouter une puce", "ajouter", adr_e ~ ".puces", cibles, "", "ajouter") }}
    {{ bouton_op("×", "supprimer", adr_e, cibles, "Supprimer l'expérience " ~ e.role, "bouton") }}
    {{ ecarts_sous(ecarts, adr_e, cibles) }} {% endfor %}
    {{ bouton_op("+ Ajouter une expérience", "ajouter", adr ~ ".entrees", cibles, "", "ajouter") }} {% elif s.type == "paires" %}
    {{ ecarts_sous(ecarts, adr ~ ".lignes", cibles) }} {% for l in s.lignes %} {% set j = loop.index0 %} {% set adr_l = adr ~ ".lignes[" ~ j ~ "]" %}
    {{ poignee(adr_l, "la ligne " ~ l.libelle, focus) }} {{ bouton_op("×", "supprimer", adr_l, cibles, "Supprimer la ligne " ~ l.libelle, "bouton") }}
    {{ ecarts_sous(ecarts, adr_l, cibles) }} {% endfor %}
    {{ bouton_op("+ Ajouter une ligne", "ajouter", adr ~ ".lignes", cibles, "", "ajouter") }} {% else %} {{ ecarts_sous(ecarts, adr ~ ".texte", cibles) }} {% endif %}
    {{ ecarts_sous(ecarts, adr, cibles) }} {% endfor %}
    {{ bouton_op("+ Ajouter une section", "ajouter", "sections", cibles, "", "ajouter") }}
    {%- endmacro %} {#- Le formulaire du CV en entier : l'editeur a gauche, l'apercu a droite, la barre d'enregistrement en bas. `contenu` et `apercu` : HTML deja rendus ; `erreur` : echec de la compilation du PDF ; `perime` : le PDF ne correspond plus au CV enregistre ; `boutons` : ceux de `barre_enregistrement`. Les erreurs ciblent `#etat-cv`. -#} {% macro formulaire(cibles, contenu, apercu, message="", modifie=False, erreur="", perime=False, boutons=None) -%}
    {% if erreur %} {% endif %} {% if perime %}

    PDF périmé : il ne correspond plus au CV enregistré ; enregistrez le CV pour le recompiler.

    {% endif %}
    {{ contenu }}
    {{ barre_enregistrement("cv", message, modifie, boutons) }}
    {%- endmacro %} {#- Le bouton qui lance la creation du CV par l'IA, avec le nombre de documents coches : « Créer mon CV » (parcours guide) ou « Recréer le CV à partir des documents cochés (N) ». Desactive sans document coche ou sans IA. `agent` : le bandeau de l'agent. -#} {% macro bouton_creer(nombre, agent, guide) -%} {% if guide %} {% else %} {% endif %} {%- endmacro %} {#- Les documents sources de Mon CV (`#documents`, remplace par chaque reponse des routes de documents) : depot de fichiers, texte a coller, liste des documents utiles avec leur case « Utiliser » et leur corbeille, consigne et creation du CV. `documents` : liste de {nom, affiche, meta, grise, note, coche} ; `guide` : parcours sans CV de base (etapes numerotees, « Créer mon CV », CV vierge) ; `refus` : fichiers refuses, nommes un a un ; `message` : texte d'etat. Les erreurs ciblent `#etat-documents`. -#} {% macro region_documents(documents, agent, consigne="", guide=False, refus=None, message="") -%} {% set nombre = documents | selectattr("coche") | list | length %}
    {% if guide %}

    Vos documents

    {% else %}

    Cochez les documents que l'IA doit lire pour recréer votre CV : elle vous le propose élément par élément, vous gardez la main.

    {% endif %}
    {% for r in refus or [] %}{% endfor %}{{ message }}
    + Coller un texte (profil LinkedIn, notes…)
    {% if documents %}
      {% for d in documents %}
    • {% if not d.grise %} {% endif %}
      {% if d.grise %}{{ d.affiche }}{% else %}{% endif %} {{ d.meta }} {% if d.note %}{{ d.note }}{% endif %}
    • {% endfor %}
    {% else %}

    Aucun document pour l'instant.

    {% endif %} {% if guide %}

    Une consigne ? (facultatif)

    {% endif %}
    {{ bouton_creer(nombre, agent, guide) }} {% if guide %} {% endif %} L'IA travaille…
    {{ vie_privee("creation" if guide else "documents") }} {% if not agent.disponible %}

    {{ agent.cause }}

    {% endif %}
    {%- endmacro %}