[Widget] PubliPostage+ Editeur complet dans Grist

Bonjour à tous,

Premier topic sur le forum et premier widget que je mets à disposition de la communauté. Je le propose en licence GNU GPL.

Il s’agit d’un éditeur de texte avec publipostage et puces intelligentes.

Il permet à n’importe qui de rédiger des contrats, factures, étiquettes sans passer par la moindre ligne de code et de pouvoir référencer une variable de n’importe quelle table du document et de la reformater pour l’afficher si nécessaire !

image

GitHub : https://github.com/grist-factory/Publipostage-Plus

Lien d’intégration : https://grist-factory.github.io/Publipostage-Plus/

Grist démo : https://grist.numerique.gouv.fr/o/docs/bPnkQWfyXrBW/PubliPostagePlus?utm_id=share-doc

Features principales :

Mise en page

  • Mise en forme complète : gras/italique/souligné/barré, couleurs, polices et tailles réelles en points, alignement, titres, liste à puces

  • Tableaux, colonnes,

  • Images et images flottantes.

  • En-têtes/pieds de page

  • Aperçu « format A4 » fidèle (What You See Is What You Get)

Variables Grist intelligentes

  • Autocomplétion #Table.Colonne sur toutes les tables avec références custom si nécessaire et formatage sur mesure des dates et nombres

  • Chips intelligents (date du jour, e-mail de l’utilisateur connecté)

Export PDF

  • Export en PDF vectorisé

  • Export en lot (ZIP) sur toutes les lignes d’une table en un clic

  • Nommenclature personnalisable avec les variables

Modèles

  • Gestion multi-modèles, sauvegardés directement dans le document Grist

  • Galerie de modèles prêts à l’emploi

Autres

  • Interface bilingue FR/EN

  • Choix de la touche à utiliser pour définir les variables (« # » par défaut)

Roadmap Widget

Note sur l’IA

Ce widget a été réalisé avec l’aide de Claude Code, avec le modèle Claude Sonnet 5 en mode Ultra Code. Le code a été relu par un humain (moi) mais manque de token pour etre aussi efficace que Claude.

La version Alpha sera aussi l’occasion de corriger ou refacto certains éléments si necessaire, le dépot est ouvert à la collobration (cf ci-après).

Securité

Afin de pouvoir sauvegarder les modèles, le code a besoin d’un accès en écriture dans une table qu’il doit créer ; il demande donc un accès complet au document, faute de mieux.

L’ensemble du code s’exécute au cœur de Grist (iframe comme tous les widgets custom), aucune donnée ne transite en dehors. Il s’agit uniquement d’un plugin « front-end ».

Un audit de sécurité a permis de corriger les principales failles, mais le plugin utilise plusieurs dépendances, elles sont fiables et régulièrement mise à jour mais servie via leur CDN. Plus d’informations sur la sécurité sont disponibles sur le dépôt.

Roadmap widget

De nombreuses features sont prévues et seront implémentées progressivement dans les prochaines semaines, n’hésitez pas à voter ici ou dans un canal Tchap pour m’aider à les prioriser.

Édition collaborative

  • Sauvegarde automatique (Beta)

  • Co-édition, commentaires et suivi des modifications (Beta)

Publipostage condtionelle

  • Boucles et conditions pour afficher plusieurs lignes d’une même colonne grâce à une même variable (Beta)

Edtion augmenté

  • Nouveaux blocs et puce (citations, légendes, bloc de code, bloc de signature) (Beta)

  • WaterMark (V1)

  • Génération de QR code (V1)

  • Fusion conditionnelle de plusieurs modèles (adapter les annexes mais première page identique par exemple) (Beta)

  • Rechercher Remplacer (Beta)

Import / Export

  • Export Docx (Beta)

  • Export en md

  • Import md (et fiabilité 100% sur les imports de Docs de La Suite) ( Beta)

  • Nouveau format (paysage, A3-A6) (V1)

  • Export pdf impression navigateur, impression full HD et pdf compressé (Beta)

  • Mode Email via mailto (Beta)

QOL

  • Dossier de gestion des modèles (V1)

  • Optimisation chargement (V1)

Sécurité

  • Version en lecture seule sur les tables grists (V1)

  • Version avec les dépendances en bundle pour éviter tout appel extérieur. (V1)

  • Demande audit Dinum (V1)

Participer à l’enrichissement de ce widget

Comment participer à l’évolution de ce widget ?

  • Tester et me faire des retours (bug, idée de feature)

  • Me faire remonter des cas d’usage concrets pour m’aider à priorisé et adapter l’UX.

  • Si vous souhaitez ajouter un template disponible dans la librairie de template :

    • Ce n’est pas possible directement pour des raisons de sécurité

    • Vous pouvez m’envoyer le code HTML généré directement en MP.

      • Si c’est un template avec une option préremplie avec les data, inclure également un export du code grist de la table créée dédié au remplissage du template)
    • Accepter la publication du template sous licence GNU et me donner le nom que vous souhaitez faire apparaitre dans les crédits.

  • Auditer le code. J’aimerais que la V1 de ce widget puisse être auditée par la DINUM pour être proposée nativement dans Grist. Au vu de la longueur du code, je suis preneur de toute aide à ce sujet.

Référence et autres modules liés

Si vous tombez sur ce poste et que vous cherchez d’autres alternatives, voici quelques éléments :

Avant de développer ce module, j’utilisais celui-ci https://forum.grist.libre.sh/t/generer-des-pdf-personnalises-publipostage-widget-markdown/1154 et celui là https://forum.grist.libre.sh/t/publipostage-custom-widget-pour-enregistrer-facilement-les-pdfs/2286 pour faire mes exports en masse.

Pendant 6 mois, c’était parfait pour moi. Mais lorsque j’ai voulu autonomiser mes collègues sur la prise en main de l’outil, la vue du code HTML en a effrayé bon nombre. (Il faudra leur dire un jour que ce n’est même pas de la programmation).

Une mention honorable à ce plugin https://forum.grist.libre.sh/t/widget-document-template-publipostage/2857/17 qui proposait déjà un éditeur WYSIWYG mais qui manquait, selon moi, d’efficacité pour la sélection des variables et dans l’UX.

7 « J'aime »

Bonjour,

Merci pour le partage.
Le Grist de démo n’est pas accessible.

Belle journée

Merci pour votre retour, en effet le grist de démo n’était pas disponible. C’est corrigé.

Bonjour,

Le wiget permet-il d’inclure des images ?
J’utilise actuellement des template markdown avec serveur interne pour controuner les CORS et autres pénibilités. Mais ce widget permettrait de plus facilement déléguer la création de template.
J’ai cependant besoin de rapatrier des images stockées dans la table de donnée Grist.

Cordialement

Bonjour,

Réponse rapide : Oui, ce widget permet de récupérer en tant que variable les images d’une colonne PJ. En mode édition, un placeholder s’affiche afin de définir leur position. Puis les images sont récupérées en mode lecture et à l’export.

Aujourd’hui 3 façons d’avoir des images dans le document

  • Import par lien : limité au CORS à l’export
  • Import par copier/coller : fonctionne sur toutes les images y compris export
  • Référence d’une colonne PJ stockant des images rendu en mode lecture et export.

Merci pour la réponse rapide.
Je vais tester en lieu et place du widget markdown + Template (plus facilement délégable par la suite), je ferai un retour ici.

Bonjour,
Avec ce nouveau widget, je viens de préparer un modèle de publipostage mais j’ai l’impression que le nombre de varibales que l’on peut intégrer est limité. En effet, dans ma table, j’ai un grand nombre de colonnes dont je dois référencer la valeur sur le publipostage. Toutes les colonnes ne sont pas visibles dans Variables quand je fais un #.
Y’a-t-il une limite où j’ai mal paramétré le widget ?
Cordialement

Bonjour,

Merci beaucoup pour vos retours, ils sont très précieux.

En effet j’avais capé lors de la pre-alpha, le widget va passer en bêta (plus d’infos dans le message juste après) normalement il n’y a plus de limite et j’ai fait des tests de charge conséquents.
N’hésitez pas à me dire si vous rencontrez encore des dificultes.

Bonjour à tous.te !

Publipostage+ passe en mode bêta et avec ça une avalanche de nouvelles fonctionnalités. Il devient un véritable outil métier pour gérer l’affichage d’éléments sur mesure, générer vos courriers, contrats et conventions, stocks mais également vos travaux d’impression avec un modèle d’assemblage et des formats personnalisés.

Comme d’habitude preneur de vos retours !
Un doc de démo complet ainsi que des vidéos tutoriel de prise en main arrivent bientôt.

Quelques screens des nouvelles features

image

Nouveaux types de modèles

  • E-mail : objet, À, Cc, Cci et corps avec les variables, bouton « Créer l’email » (lien `mailto:’ donc limité, pas de mise en forme et peu de caractères, 2000 tous compris)

  • Grille (tableur) : lignes et colonnes comme dans un tableur type GSheet/Exel.

  • Macro-modèle : Combiner plusieurs modèles conditionnellement, par exemple pour avoir une page de garde et des annexes sur mesure.

Édition

  • Blocs de contenu : citation, bloc de code, encadré (Note, Attention, Important), bloc de signature, légende d’image et de tableau, QR code, liens (Ctrl+K)

  • Mise en page : formats A3 à A6, portrait ou paysage, formats libres, marges par modèle, filigrane

  • Tableaux : fusion et scission de cases, retrait, citation et listes sur toutes les cases sélectionnées, coupure propre entre deux lignes au saut de page

  • Images : déplacement aux flèches du clavier, image répétée sur toutes les pages

  • Outils de rédaction : Rechercher / Remplacer, pinceau de mise en forme, abréviations qui se développent à la frappe, 54 raccourcis clavier personnalisables, bouton Variable dans la barre, zoom de la page

Publipostage

  • Bloc conditionnels: sur une variable, bloc de texte conditionnel, case cochée etc.

  • Boucles sur les lignes liées : ligne de tableau, élément de liste, paragraphe, avec filtre, tri et séparateurs

  • Variables d’une table liée : « Autres attributs », référence de référence sans règle préalable, liste « # » sans plafond et avec recherche

  • Formats sur mesure : zéro masqué, Oui/Non en texte ou en vraie case, listes de choix (toutes les valeurs, première, dernière, n-ième), « Un document par valeur »

Édition collaborative

  • Enregistrement : automatique avec détection de conflit, menu « Enregistrer » / « Enregistrer sous… »

  • Commentaires : fil de discussion sur le texte sélectionné, réponses, résolution, aussi depuis la Lecture

  • Suivi des modifications (Alpha) : accepter ou refuser une par une ou toutes d’un coup

Import / Export

  • Word (.docx, bêta) : une ligne ou toutes les lignes (ZIP)

  • PDF : un seul PDF pour toutes les lignes, assemblage avant impression (feuilles A4 ou A3, traits de coupe)

  • Excel : export des grilles (ZIP ou classeur unique), import d’un classeur .xlsx

QOL

  • Rangement et noms des modèles : dossiers, sous-dossiers, épingles

  • Thème clair, sombre ou celui du système

  • Lisibilité : contrastes d’au moins 4,5:1, police du système

  • Affichage modèle par défaut : afficher un modèle de manière conditionnelle via une valeur sur une ligne ou par défaut sur une vue donnée.

  • Lecture épurée : mode lecture simplifié pour utiliser le widget comme un affichage directement dans grist (avec droits différenciés)

  • mode lecture qui permet de lire sans la mise en forme du suivi des modifications pour relire un document collaboratif plus facilement.

  • Zoom

  • Onboarding : message et screen pour détailler l’installation du widget (accès complet, Select By)

Sécurité

  • Droits par personne : lecture seule, export, commentaires, réglés par des colonnes Oui/Non de Grist

  • Page verrouillée : politique de sécurité du contenu (CSP), plus aucune police ni feuille de style venant d’un autre site

  • Images d’un autre site : chargées seulement après un clic « Afficher », « Intégrer l’image » ou « Garder le lien » à l’insertion, fenêtre de confirmation avant un export

  • Consentement : le widget demande avant de créer ses tables dans le document

  • Nombreuses corrections pour renforcer la sécurité du widget.

Audit Gw Audit

Comme vous le voyez, les scores ne sont pas bons. Deux raisons: j’ai fait le choix pour l’instant de ne pas inclure les librairies externes dans le dépôt car elles sont de confiance et d’un autre côté l’audit est calibré sur des widgets plus petits, là on est sur un outil très gros donc forcément plusieurs tests qui ne passent pas.J’ai également audité le dépôt de prod pas celui de dev donc certains éléments type test unitaire n’y figurent pas.
Une prochaine version sera dédiée à quelques corrections de sécurité supplémentaire.

Bonjour,

Avec cette mise à jour, j’ai accès à toutes mes variables maintenant.
Merci pour ce travail. C’est un widget très utile.

Bonjour,

Alors premièrement félicitation, c’est un très bon outil.

Ca me simplifie grandement la vie par rapport aux templates Markdown…. C’est du très bon travail bien fini.

Les boucles sont parfaites (tableaux, listes, colonnes) bravo !

J’ai connu des générateurs d’état qui n’en faisait pas tant mais c’est une autre histoire….

Voici 2-3 points où j’aimerai avoir des précisions

  • Peut-on exporter/imprimer uniquement la ligne en cours (autre que Docx) ?
  • Peut-on configurer le formulaire pour qu’il s’ouvre immédiatement en vue preview (consultation) ou faut-il configurer les tables du widget dans grist ?

Pas testé les fonctions liées aux images, j’ai besoin d’avoir une vue directe en preview (trop d’utilisateur qui vont l’utiliser en fonction basique d’impression)

Merci pour votre partage !

Bonjour,

Merci pour votre retour !

”Peut-on exporter/imprimer uniquement la ligne en cours (autre que Docx) ?”
→ oui c’est là que je me rends compte que l’UI n’était pas assez claire, un clic simple sur le bouton exporter exporte la ligne sélectionnée en pdf.

”Peut-on configurer le formulaire pour qu’il s’ouvre immédiatement en vue preview (consultation) ou faut-il configurer les tables du widget dans grist ?”
→ Oui également, c’est dans les réglages, onglet '"accès” et ça reprend un fonctionnement analogue aux permissions avancées cf screen ci-dessous

Il faut juste penser à cliquer sur ‘enregistrer’ en haut dans le menu grist (le bouton d’enregistrement d’un filtre Grist).

Bonjour,

Superbe réalisation, bravo !

Je pense aux évolutions suivantes :

  • Centrage verticalement dans une cellule d’un tableau d’un document
  • Modifier la couleur de bordure (y.c possibilité de rendre transparent) la bordure d’un tableau d’un document
  • Dans les entêtes et pied de page, possibilité d’insérer des tableaux : cela ne fonctionne pas actuellement ?

Merci encore

Bonjour,

Ok pour l’export de la ligne en pdf (effectivement le menu déroulant du bouton exporté est un poil trompeur)
Je n’avais pas compris le fonctionnement de la table de gestion des droits.
Il faut créer une table qui regroupe les utilisateurs grist,
la colonne email est l’indentifiant
Ok pour moi.

J’espère que les forward_auth de grist resteront sur les prochaines releases…

Merci pour votre travail.

Hello !

Merci pour ces retours,

Tableaux
Dans la prochaine version, les tableaux des documents seront complètement hérités du mode grille (et également importables depuis un modèle de grille dynamiquement comme sur Gdoc/Sheet). Du coup, l’ensemble des features de bordure, centrage seront disponibles dans la toolbar lorsque le curseur sera dans un tableau.

Tableau dans les pieds de page
En effet, pour l’instant, les en-têtes et pieds de page sont très contraints car ils ont été une plaie pour garantir les mêmes marges et sauts de pages entre l’éditeur, le mode lecture et les exports. Je vais progressivement réouvrir les vannes sur les features dedans dans la prochaine mise à jour.

UI/UX

Sur la prochaine version, les boutons d’exports seront normalement plus clairs, cf ci dessous

Permissions

En effet, j’ai utilisé la même logique que les permissions avancées de Grist (d’ailleurs si vous les avez mises en place sur votre document, vous pourrez utiliser la même table, sinon il faudra en créer une)

1 « J'aime »