Création de formulaires

Je vous propose un widget qui permet de créer des formulaires personnalisables à volonté.
Grist ne propose pas de créer des sélecteurs en cascade.
J’ai donc rajouté cela dans Form Builder Pro.
Vous pouvez tester librement ici : Form Builder Pro - Grist

Le dépôt Github : GitHub - isaytoo/grist-form-builder-widget · GitHub

Guide d’utilisation

Apprenez à créer et partager des formulaires professionnels avec Form Builder Pro.

:dart: Présentation

Form Builder Pro permet de créer des formulaires professionnels sur page A4 avec drag & drop, puis de les partager avec vos utilisateurs. Les données sont enregistrées directement dans vos tables Grist.

:memo: Créer un formulaire

  1. Sélectionnez la table source dans le menu déroulant
  2. Glissez les champs de la table ou les éléments sur la page A4
  3. Positionnez et redimensionnez les champs avec la souris
  4. Cliquez sur un champ pour configurer ses propriétés
  5. Cliquez sur :floppy_disk: Sauvegarder pour enregistrer

:link: Partager le formulaire

  1. Sauvegardez votre formulaire
  2. Cliquez sur :link: Partager
  3. Copiez l’URL affichée dans la modale
  4. Dans Grist, ajoutez un nouveau widget personnalisé
  5. Collez l’URL et accordez l’accès complet

:bulb: Astuce : Les utilisateurs ne verront que le mode saisie, sans accès à l’édition.

:busts_in_silhouette: Plusieurs formulaires

Chaque formulaire est lié à une table. L’URL de partage contient le paramètre table=NomTable.

Exemple : ...?mode=form&table=Clients

:link: Sélecteurs en cascade (options dynamiques)

Les champs Liste déroulante, Choix unique et Cases à cocher peuvent charger leurs options depuis une table Grist, et les filtrer en cascade selon la valeur d’un autre champ du formulaire (ex. choisir un département → ne voir que les villes de ce département).

:clipboard: Étape 1 — Préparer la table source dans Grist

Crée une table contenant tes options. Exemple Villes :

nom · code_dept
Lyon · 69
Bron · 69
Grenoble · 38
Paris 1er · 75

:art: Étape 2 — Configurer le champ « parent »

  1. Glisse une Liste déroulante sur le canvas
  2. Clique dessus pour ouvrir les propriétés à droite
  3. Donne-lui un libellé clair : ex. « Département »
  4. Section Source des options → clique :link: Depuis Grist
  5. Choisis la table source (ex. Departements), la colonne libellé (nom) et la colonne valeur (code)
  6. Pas de filtre nécessaire pour ce champ — il propose toutes les valeurs

:deciduous_tree: Étape 3 — Configurer le champ « enfant » (cascade)

  1. Glisse une autre Liste déroulante
  2. Libellé : « Ville », source :link: Depuis Grist
  3. Table source : Villes, colonne libellé : nom
  4. Section Filtres en cascade → clique + Ajouter un filtre
  5. Champ parent : Département · Opérateur : = · Colonne source : code_dept

:bulb: Quand l’utilisateur choisira un département, le select Ville rechargera automatiquement ses options en ne gardant que celles dont code_dept correspond.

:abacus: Les 4 opérateurs disponibles

= (égal à) — la colonne source vaut exactement la valeur du parent.
Ex. ville.code_dept = 69 si Département = 69

≥ (supérieur ou égal) — la colonne source est ≥ valeur du parent.
Ex. produit.prix_min ≥ budget saisi

≤ (inférieur ou égal) — la colonne source est ≤ valeur du parent.
Ex. tarif.plafond ≤ revenu déclaré

entre deux colonnes — la valeur du parent est entre deux colonnes (min/max) de la table source.
Ex. produit.age_min ≤ âge_saisi ≤ produit.age_max

:twisted_rightwards_arrows: Plusieurs filtres combinés (ET)

Tu peux ajouter plusieurs filtres sur un même champ. Toutes les conditions doivent être vraies pour qu’une option soit affichée.

Exemple : select « Produits » filtré par Catégorie = catégorie ET Âge entre age_min et age_max → ne propose que les produits de la bonne catégorie ET adaptés à l’âge.

:zap: Comportement à la saisie

  • Si le parent n’a pas encore de valeur, son filtre est ignoré (pas de blocage)
  • Quand le parent change, l’enfant recharge ses options automatiquement
  • Cascade transitive (A → B → C) gérée : changer A reconfigure B, qui reconfigure C
  • Si la valeur sélectionnée d’un enfant n’est plus valide, elle est réinitialisée

:dart: Exemple complet — Recommander des produits selon l’âge

Démontre l’opérateur entre deux colonnes avec un cas pratique : l’utilisateur saisit son âge et le formulaire propose uniquement les produits adaptés à sa tranche.

:bar_chart: Table Produits dans Grist

nom · categorie · age_min · age_max · prix
Hochet musical · Bébé · 0 · 2 · 15
Tricycle · Enfant · 3 · 7 · 80
Trottinette · Enfant · 6 · 12 · 90
Skateboard · Ado · 10 · 16 · 120
Tablette · Tous · 10 · 99 · 300
Vélo VTT adulte · Adulte · 16 · 75 · 600
Carte senior SNCF · Senior · 60 · 120 · 75

:hammer_and_wrench: Champ 1 — Âge (saisie utilisateur)

  • Glisse un élément Nombre sur le canvas
  • Libellé : « Quel est votre âge ? »
  • Pas de source Grist nécessaire (l’utilisateur tape)

:hammer_and_wrench: Champ 2 — Produits recommandés (cascade)

  1. Glisse une Liste déroulante, libellé : « Produits recommandés »
  2. Source des options → :link: Depuis Grist
  3. Table source : Produits
  4. Colonne libellé : nom
  5. Colonne valeur : nom (ou laisse vide)
  6. Section Filtres en cascade+ Ajouter un filtre
  7. Champ parent : Quel est votre âge ?
  8. Opérateur : entre deux colonnes
  9. Colonne minimum : age_min
  10. Colonne maximum : age_max

:arrow_forward: Résultat à la saisie

• Saisir 5 → propose : Tricycle, Trottinette
• Saisir 12 → propose : Trottinette, Skateboard, Tablette
• Saisir 30 → propose : Tablette, Vélo VTT adulte
• Saisir 65 → propose : Tablette, Vélo VTT adulte, Carte senior SNCF

:bulb: Pour aller plus loin : ajoute un second filtre sur ce même champ avec un autre champ parent Catégorie (sélecteur statique avec Bébé/Enfant/Ado/Adulte/Senior) et opérateur = sur la colonne categorie. Tu obtiens un filtrage croisé âge ET catégorie.

:warning: Permission requise : le widget doit avoir « Accès complet au document » pour lister les tables et lire les données. Configure-le dans le panneau du widget Grist (à droite de l’écran).

:inbox_tray: Données prêtes à l’emploi : les CSV d’exemple (Departements, Villes, Produits) sont disponibles dans le dossier /exemples/ du dépôt GitHub du widget.

:gear: Fonctionnalités

:page_facing_up:Multi-pages A4

:twisted_rightwards_arrows:Champs conditionnels

:link:Sélecteurs en cascade

:abacus:Champs calculés

:mag:Lookup / Autocomplétion

:writing_hand:Signature

:white_check_mark:Validation avancée

:file_folder:Templates

:scroll:Historique des versions

:page_facing_up:Export PDF

:iphone:QR Code

Exemple de sélections en cascade :













Bon test !

Bonjour Saïd et merci pour la mise à disposition de tous ces outils ! J’aurais une remarque générale sur ceux-ci qui concerne l’utilisation du mode sombre dans Grist : lorsqu’on passe en mode sombre, certains textes s’affichent en blanc sur fond blanc et ne sont donc pas lisibles dans les menus. Vous serait-il possible de corriger ce comportement ?

Bonjour @AnthonyR ,

Le widget Form Builder Pro que je présente sur ce sujet n’a pas de mode sombre, du moins pas pour l’instant.
Vous parlez de quels widgets du coup car j’en ai réalisé pas mal :sweat_smile:?

Pour être plus précis, je ne parle pas d’un mode sombre intégré au widget mais du comportement de ce widget lorsque le mode sombre est activé dans les options de Grist. C’est à ce moment-là que certains champs s’affichent en blanc sur blanc. Souhaitez-vous que je vous envoie des captures d’écran ? J’ai repéré le problème sur ce widget de formulaire mais également sur d’autres il me semble (il faudrait que je les passe à nouveau en revue pour vous les mentionner, j’essaierai de prendre un peu de temps pour le faire mais je pense que vous devriez également pouvoir vous rendre compte des problèmes si vous activez le mode sombre dans l’instance de Grist que vous utilisez).

1 « J'aime »

oui, c’est tout à fait normal.
Quand tu définis tes propres couleurs CSS dans le widget (comme background: #0f0f10), tu écrases les variables CSS de Grist, donc le thème clair/sombre de Grist n’a plus aucun effet sur ton widget.

Pour que le thème Grist fonctionne, il faut utiliser les variables CSS natives de Grist au lieu de couleurs fixes. Grist injecte automatiquement ces variables dans le widget selon le thème choisi par l’utilisateur.

Grist ne documente pas de variables CSS officielles pour les widgets custom.
La meilleure approche est d’utiliser prefers-color-scheme , une media query CSS native du navigateur qui détecte automatiquement si l’utilisateur est en mode clair ou sombre au niveau système, ce qui coïncide généralement avec le choix Grist.

Je viens de tester sur un widget simple et ça fonctionne avec ce que je viens d’expliquer ci-dessus :


Les modifications sur les autres widgets prochainement…