Documentation10 min de lecture

Les widgets de champ OCA : saisir plus vite et se tromper moins

Le module OCA `web_m2x_options` (dépôt `web`, version 18.0.1.0.3, licence AGPL-3) permet de **masquer les entrées « Créer… » et « Créer et modifier… »** des champs de relation, et `web_m2x_options_manager` ajoute un écran de gestion de ces options, champ par champ, depuis la fiche technique du modèle. Quinze autres widgets traitent la saisie des nombres, la validation par motif, les listes calculées et les graphiques.

Mains sur un clavier devant un écran de saisie

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

ModuleWidget ou optionLicence
web_m2x_optionsOptions sur many2one et many2many_tagsAGPL-3
web_m2x_options_managerÉcran de gestion de ces optionsAGPL-3
web_widget_numeric_stepnumeric_step : boutons + / − à pas réglableAGPL-3
web_widget_char_sizeOption de taille sur un champ texteAGPL-3
web_widget_patternMotif de validation (expression régulière)AGPL-3
web_widget_url_advancedTexte de lien personnaliséLGPL-3
web_widget_popoverpopover : texte masqué derrière une icôneAGPL-3
web_widget_dropdown_dynamicdynamic_dropdown : options calculées côté serveurLGPL-3
web_widget_open_tabopen_tab : ouvrir une ligne dans un nouvel ongletAGPL-3
web_widget_domain_editor_dialogÉditeur de domaine visuelAGPL-3
web_widget_image_downloadBouton de téléchargement sur une imageLGPL-3
web_widget_o2m_attachment_image_galleryGalerie de pièces jointesAGPL-3
web_widget_one2many_tree_line_duplicateDuplication d'une ligne de sous-listeAGPL-3
web_widget_bokeh_chartbokeh_chart et bokeh_chart_jsonLGPL-3
web_widget_mpld3_chartmpld3_chart et son modèle abstraitLGPL-3
web_widget_product_label_section_and_note_full_labelLibellé produit complet sur les lignesAGPL-3
web_widget_product_label_section_and_note_name_visibilityBouton « œil » sur la description de ligneAGPL-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_step transforme 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_size ajoute 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_pattern permet de définir un motif de validation — expression régulière au sens de l'attribut HTML pattern — 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_popover affiche 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.

  • web_widget_open_tab ajoute 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_dialog restaure 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_gallery affiche 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_duplicate ajoute 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_label affiche le libellé produit complet sur les lignes de facture et de commande fournisseur.
  • web_widget_product_label_section_and_note_name_visibility ajoute 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_chart et web_widget_mpld3_chart exigent des bibliothèques Python installées sur le serveur — impossible sur un hébergement fermé.
  • web_m2x_options_manager dépend de base_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_size a 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.

Documentation OCAOdoo CommunityErgonomie

Partager

Fiches connexes

Équipe au travail sur des ordinateurs portables autour d'une table
Le module OCA `account_invoice_en16931` (dépôt `fr-einvoicing`, version 18.0.1.0.0, licence AGPL-3) est le socle qui fabrique le fichier de facture électronique conforme à la norme européenne **EN 16931** : Factur-X (PDF/A-3 avec XML CII embarqué), XML UBL, XML CII ou PDF accompagné d'un UBL — et il ajoute des **contrôles bloquants à la validation** d'une facture client. Les quatre modules qui s'y greffent pour la France, et ce que le socle ne fait pas.
Lire la suite
Documentation OCA, Facturation électronique
Réunion d'approbation autour d'un document de travail
Relevé sur une instance Odoo 18 Community, le module OCA `base_tier_validation` (dépôt `server-ux`, version 18.0.3.5.1, licence AGPL-3) ajoute 1 modèle, 101 champs et 3 menus, mais ne s'active sur aucun document métier par lui-même : il lui faut un module d'implémentation. C'est le point qui surprend le plus — voici ce qu'il fait réellement, et comment le mettre en service.
Lire la suite
Documentation OCA, Odoo