Dokos permet aux développeurs de filtrer dynamiquement les résultats affichés dans les champs de type Lien (sélection d'un document existant) et Autocomplétion (suggestion de valeurs). Cette personnalisation s'effectue via la méthode set_query, qui définit une fonction de filtrage appelée chaque fois que l'utilisateur ouvre la liste déroulante.
Exemple — Maison Verte SARL Sur le bon de commande de Maison Verte SARL, le champ "Personne de contact" doit être filtré en fonction du client sélectionné. Grâce à une requête personnalisée, seules les personnes de contact liées au client apparaissent dans la liste déroulante.
La méthode frm.set_query(fieldname, callback) associe une fonction de filtrage à un champ. Cette fonction reçoit des informations sur le document en cours et renvoie un objet de filtres ou une requête serveur personnalisée.
La fonction de filtrage reçoit désormais quatre arguments :
| Argument | Description |
|---|---|
doc | L'objet document en cours d'édition (valeurs des champs) |
cdt | Le type de document enfant (utile dans les tables enfants) |
cdn | Le nom du document enfant (utile dans les tables enfants) |
frm | L'objet formulaire (Form) courant |
Nouveauté : Le quatrième argument
frmest désormais transmis systématiquement à toutes les fonctions de requête, y compris dans les grilles (tables enfants) et l'autocomplétion. Auparavant, il fallait recourir à la variable globalecur_frmpour accéder au formulaire depuis la fonction.
frappe.ui.form.on("Sales Order", {
setup(frm) {
frm.set_query("contact_person", (doc, cdt, cdn, frm) => {
return {
filters: { link_name: doc.customer }
};
});
}
});
Dans cet exemple, la liste déroulante du champ contact_person n'affiche que les personnes de contact dont link_name correspond au client du bon de commande.
Le passage de l'objet frm permet d'effectuer des actions sur l'interface directement depuis la fonction de requête, par exemple faire défiler le formulaire vers un champ manquant.
Exemple — Bureau Moderne Sur le bon de commande, si l'utilisateur tente de sélectionner une personne de contact sans avoir choisi de client, Dokos le ramène automatiquement au champ "Client" en le mettant en évidence.
frm.set_query("contact_person", (doc, cdt, cdn, frm) => {
if (!doc.customer) {
frm.scroll_to_field("customer");
}
return { filters: { link_name: doc.customer } };
});
Dans une table enfant, la fonction de requête s'applique au champ de la ligne concernée. Les arguments cdt et cdn identifient la ligne en cours d'édition, tandis que frm donne accès au formulaire parent.
frappe.ui.form.on("Sales Order Item", {
item_code(frm, cdt, cdn) {
frm.set_query("warehouse", (doc, cdt, cdn, frm) => {
return {
filters: {
company: frm.doc.company,
is_group: 0
}
};
});
}
});
Bon à savoir : Le sélecteur d'ajout multiple dans une grille (bouton "Ajouter plusieurs lignes") transmet désormais le formulaire parent de la même manière qu'un champ de lien standard. Les fonctions de requête écrites pour les grilles n'ont plus besoin d'utiliser
cur_frm.
Les champs de type Autocomplétion bénéficient du même mécanisme. La fonction de requête reçoit les quatre arguments identiques.
frm.set_query("mode_of_payment", (doc, cdt, cdn, frm) => {
return {
query: "erpnext.accounts.doctype.sales_invoice.sales_invoice.get_mode_of_payment",
filters: { company: frm.doc.company }
};
});
Les fonctions de requête existantes qui n'utilisent que trois arguments continuent de fonctionner sans modification : le quatrième argument est simplement ignoré. Aucune migration n'est nécessaire.
frm à cur_frm : la variable cur_frm reste disponible, mais l'argument frm est plus fiable, notamment dans les contextes de fenêtres modales ou de grilles imbriquées.