Un widget de champ est la plus petite unité d'ergonomie d'un ERP : la façon dont un nombre, un texte ou une relation se saisit à l'écran. C'est aussi le levier le moins coûteux — un attribut dans une vue, pas un développement.
Dix-sept modules communautaires ajoutent des widgets à Odoo 18. Ce sont des briques techniques : elles ne font rien seules, elles servent à paramétrer.
Résumé
Deux modules traitent les champs de relation : le masquage des entrées de création dans les listes de suggestion, et un écran pour gérer ces options champ par champ. C'est le garde-fou contre la création de doublons depuis un champ de relation — le premier contributeur à une base de contacts sale.
Six modules traitent la saisie : des boutons plus et moins à pas configurable sur un nombre, une taille d'affichage sur un champ texte, un motif de validation au sens HTML, un texte de lien personnalisé à la place de l'adresse brute, un champ affiché comme icône survolable, et une liste déroulante calculée côté serveur.
Cinq modules traitent la navigation et les pièces jointes : l'ouverture d'une ligne dans un nouvel onglet, un éditeur de domaine visuel permettant de sélectionner des enregistrements, un bouton de téléchargement sur les images, une galerie de pièces jointes avec vignette de couverture, et la duplication d'une ligne de sous-liste.
Quatre modules enfin sont destinés aux développeurs : deux widgets de graphique interactif (Bokeh et mpld3), et deux modules corrigeant le widget de description de ligne des documents commerciaux.
L'essentiel
- Masquer « Créer… » sur un champ de relation, contre les doublons.
- Des boutons plus et moins à pas configurable sur un nombre.
- Un motif de validation sur un champ texte, au sens HTML.
- Une liste déroulante calculée côté serveur, pas figée dans le champ.
- L'ouverture d'une ligne dans un nouvel onglet depuis une liste.
- Un éditeur de domaine visuel par sélection d'enregistrements.
- Une galerie de pièces jointes avec vignette de couverture.
- Des graphiques Bokeh ou mpld3 dans une vue formulaire.
Ce que ces modules ajoutent à l'instance
| Module | Widget ou option | Licence |
|---|---|---|
web_m2x_options | Options sur many2one et many2many_tags | AGPL-3 |
web_m2x_options_manager | Écran de gestion de ces options | AGPL-3 |
web_widget_numeric_step | numeric_step : boutons + / − à pas réglable | AGPL-3 |
web_widget_char_size | Option de taille sur un champ texte | AGPL-3 |
web_widget_pattern | Motif de validation (expression régulière) | AGPL-3 |
web_widget_url_advanced | Texte de lien personnalisé | LGPL-3 |
web_widget_popover | popover : texte masqué derrière une icône | AGPL-3 |
web_widget_dropdown_dynamic | dynamic_dropdown : options calculées côté serveur | LGPL-3 |
web_widget_open_tab | open_tab : ouvrir une ligne dans un nouvel onglet | AGPL-3 |
web_widget_domain_editor_dialog | Éditeur de domaine visuel | AGPL-3 |
web_widget_image_download | Bouton de téléchargement sur une image | LGPL-3 |
web_widget_o2m_attachment_image_gallery | Galerie de pièces jointes | AGPL-3 |
web_widget_one2many_tree_line_duplicate | Duplication d'une ligne de sous-liste | AGPL-3 |
web_widget_bokeh_chart | bokeh_chart et bokeh_chart_json | LGPL-3 |
web_widget_mpld3_chart | mpld3_chart et son modèle abstrait | LGPL-3 |
web_widget_product_label_section_and_note_full_label | Libellé produit complet sur les lignes | AGPL-3 |
web_widget_product_label_section_and_note_name_visibility | Bouton « œil » sur la description de ligne | AGPL-3 |
Un seul menu ajouté : Paramètres ▸ Technique ▸ Structure de la base de données ▸ Options des champs « Créer et modifier ».
Les champs de relation : le garde-fou contre les doublons
Une base de contacts sale a presque toujours la même origine : le champ « Client » d'une commande propose « Créer “Dupont SARL” », l'utilisateur clique, et un deuxième « Dupont SARL » existe — sans adresse, sans numéro de TVA, sans historique.
web_m2x_options permet de masquer les entrées « Créer… » et « Créer et modifier… » des champs many2one et many2many_tags, avec d'autres options d'affichage. La création reste possible depuis le menu dédié, par qui en a le droit.
web_m2x_options_manager ajoute l'écran qui manque : gérer ces options champ par champ depuis la fiche technique du modèle, sans écrire de surcharge de vue. Il dépend de base_view_inheritance_extension.
C'est le module à poser en premier sur une instance destinée à durer : le coût d'un référentiel propre se paie à l'entrée, jamais après.
Saisir plus vite, saisir juste
web_widget_numeric_steptransforme un champ décimal en contrôle à boutons plus et moins, avec un pas configurable. Destiné aux écrans tactiles et aux saisies répétitives : quantités au comptoir, comptages d'inventaire.web_widget_char_sizeajoute une option de taille d'affichage sur un champ texte — un code à cinq caractères n'a pas besoin d'un champ sur toute la largeur.web_widget_patternpermet de définir un motif de validation — expression régulière au sens de l'attribut HTMLpattern— soit dans la définition du champ, soit dans la vue. Un numéro de série, une référence client, un code interne cessent d'accepter n'importe quoi.web_widget_dropdown_dynamic(LGPL-3) fournit une liste déroulante dont les options sont calculées côté serveur, au lieu d'être figées dans la définition du champ. C'est ce qui permet une liste dépendant d'un paramétrage, sans redéploiement.web_widget_url_advanced(LGPL-3) affiche un texte de lien personnalisé au lieu de l'adresse brute — « Suivre le colis » plutôt qu'une URL de trois lignes.web_widget_popoveraffiche un champ texte sous forme d'icône révélant son contenu au survol : utile pour une note longue qui ne doit pas occuper l'écran.
Un motif de validation sur une référence coûte un attribut de vue et supprime une catégorie entière d'erreurs. C'est la différence entre contrôler à la saisie et nettoyer au rapport.
Naviguer, filtrer, joindre
web_widget_open_tabajoute sur une ligne de liste une icône ouvrir dans un nouvel onglet, en conservant le comportement normal du clic. Indispensable sur les listes de travail qu'on parcourt en comparant.web_widget_domain_editor_dialogrestaure un éditeur de domaine visuel : construire un filtre en sélectionnant des enregistrements et des filtres, au lieu d'écrire une expression. C'est ce qui rend les domaines accessibles à un utilisateur avancé non développeur.web_widget_image_download(LGPL-3) ajoute un bouton de téléchargement sur le widget image, partout où une image s'affiche — photo de contact, logo de société, visuel produit.web_widget_o2m_attachment_image_galleryaffiche un champ de pièces jointes comme une galerie, avec la première pièce en vignette de couverture. Utile sur les produits, les constats de chantier, les dossiers techniques.web_widget_one2many_tree_line_duplicateajoute une icône de duplication de ligne dans les sous-listes : une ligne de commande à vingt champs se recopie en un clic.
Quatre modules pour développeurs
web_widget_bokeh_chart et web_widget_mpld3_chart (tous deux LGPL-3) permettent d'insérer un graphique interactif dans une vue formulaire : le premier via la bibliothèque Python Bokeh, le second via mpld3, qui rend une figure matplotlib en D3.js. Les deux exigent la bibliothèque Python correspondante côté serveur.
Deux modules enfin corrigent le widget de description de ligne des documents commerciaux, fourni par le module comptable d'Odoo :
web_widget_product_label_section_and_note_full_labelaffiche le libellé produit complet sur les lignes de facture et de commande fournisseur.web_widget_product_label_section_and_note_name_visibilityajoute un bouton « œil » permettant de contrôler l'affichage du nom du produit dans la description de ligne.
Le second répond à un reproche quotidien en comptabilité : Odoo écrase la description d'une ligne de facture par le nom du produit, ou l'inverse, selon des règles que l'utilisateur ne voit pas. Un bouton rend le choix explicite.
Limites connues
- Ce sont des briques techniques : un widget installé ne change rien tant qu'il n'est pas posé sur un champ, dans une vue.
- Les widgets sont les premiers à casser à la montée de version : ils touchent au cœur de l'interface, qui évolue à chaque version majeure d'Odoo.
web_widget_bokeh_chartetweb_widget_mpld3_chartexigent des bibliothèques Python installées sur le serveur — impossible sur un hébergement fermé.web_m2x_options_managerdépend debase_view_inheritance_extension, un module technique d'héritage de vues.- Masquer « Créer… » déplace le problème si personne n'a le droit de créer : prévoir qui crée les référentiels, et par quel menu.
- Le motif de validation s'applique à la saisie dans l'interface : un import ou un script y échappe.
web_widget_char_sizea un README minimal : son résumé tient en une ligne.
Identité technique
Les dix-sept modules viennent du dépôt OCA web, branche 18.0. Sept sont en LGPL-3, dix en AGPL-3. Les dépendances : web pour tous, account pour les deux widgets de description de ligne, base_view_inheritance_extension pour le gestionnaire d'options.
Voir aussi rendre Odoo supportable au quotidien pour l'apparence et les garde-fous du même dépôt.
Questions fréquentes
Comment empêcher la création de doublons depuis un champ client ?
web_m2x_options permet de masquer « Créer… » et « Créer et modifier… » sur les champs de relation, et web_m2x_options_manager ajoute un écran pour le régler champ par champ. C'est l'origine la plus courante d'une base de contacts sale : un « Dupont SARL » créé depuis une commande, sans adresse ni numéro de TVA.
Peut-on valider le format d'une référence à la saisie ?
Oui : web_widget_pattern applique un motif — expression régulière au sens de l'attribut HTML pattern — défini dans le champ ou dans la vue. Attention, cela contrôle la saisie dans l'interface : un import ou un script y échappe.
Peut-on ouvrir une ligne de liste dans un nouvel onglet ?
Oui, avec web_widget_open_tab : une icône apparaît sur la ligne, le clic normal conservant son comportement habituel. C'est l'ajout qui change le plus les listes de travail qu'on parcourt en comparant plusieurs enregistrements.
Comment construire un domaine de filtre sans écrire d'expression ?
web_widget_domain_editor_dialog restaure un éditeur visuel : on construit le filtre en sélectionnant des enregistrements et des filtres. C'est ce qui rend les domaines accessibles à un utilisateur avancé qui n'est pas développeur.
Pourquoi la description d'une ligne de facture est-elle écrasée par le nom du produit ?
C'est le comportement du widget standard du module comptable. web_widget_product_label_section_and_note_name_visibility ajoute un bouton « œil » qui rend le choix explicite, et ..._full_label affiche le libellé produit complet. Deux modules pour un reproche quotidien en comptabilité.
Se faire accompagner
Les widgets sont le levier d'ergonomie le moins coûteux d'un ERP : un attribut de vue, pas un développement. Et c'est aussi le plus négligé — on préfère demander un module sur mesure que régler le champ existant.
Nous passons donc en revue les écrans réellement utilisés, champ par champ, avant d'écrire une ligne de code : masquage des créations, motifs de validation, pas de saisie, ouverture en onglet. Puis nous vérifions ces modules avant chaque montée de version, car ce sont les premiers à casser. Voir les prestations d'Atalios Consulting ou demander un rappel.
Pour aller plus loin
En résumé
La plus petite unité d'ergonomie d'un ERP : comment un nombre, un texte ou une relation se saisit. Masquer « Créer… » contre les doublons, valider par motif, calculer une liste côté serveur, ouvrir une ligne en nouvel onglet — un attribut de vue, pas un développement. Parlons de vos écrans.