Version de développement
Cette documentation décrit la version « next » (develop), non encore publiée. Pour la version stable, basculez sur « v5 » dans l'en-tête.
Composants UI

Utiliser les composants d'interface

Remplacer un bouton Bootstrap écrit à la main par frappe.ui.button dans un script client ou une page du desk, avec état de chargement et info-bulle.

Utiliser les composants d'interface

Le desk dessine ses boutons avec frappe.ui.button. Un bouton écrit à la main (<button class="btn btn-primary">) n'a pas le style Espresso ni ses comportements. Cette page montre comment le remplacer. La liste complète des options est dans la référence des composants Espresso.

Remplacer un bouton

Avant :

<button class="btn btn-primary" onclick="soumettre()">Soumettre</button>

Après :

const $btn = frappe.ui.button({
    label: __("Submit"),
    variant: "solid",
    onclick: () => soumettre(),
});
frm.fields_dict.actions_html.$wrapper.empty().append($btn);

Exemple fictif : actions_html est un champ HTML du formulaire, et soumettre une fonction de votre script.

Correspondance des anciennes classes :

Ancienne classeOptions de frappe.ui.button
btn-primaryvariant: "solid"
btn-default, btn-secondaryvariant: "subtle" (défaut)
btn-dangervariant: "solid", theme: "red"
btn-xs, btn-smsize: "xs", size: "sm"

Les icônes sont des noms d'icônes Lucide ("check", "printer"), pas des classes i-mdi-* ni octicon.

Afficher l'état de chargement

Si onclick renvoie une promesse, le bouton affiche un indicateur et ignore les clics jusqu'à la fin de la promesse. Le libellé change pendant ce temps : « Save » devient « Saving... », « Delete » devient « Deleting... », « Submit » devient « Submitting... ». Passez loading_label pour un autre texte.

frappe.ui.button({
    label: __("Traiter les commandes"),
    loading_label: __("Traitement..."),
    variant: "solid",
    onclick: () => frappe.call({ method: "mon_app.api.traiter_commandes" }),
});

Exemple fictif : mon_app.api.traiter_commandes est une méthode de votre application.

Bouton avec seulement une icône

Un bouton sans libellé est carré. Donnez-lui tooltip : le texte sert aussi d'aria-label pour les lecteurs d'écran.

frappe.ui.button({
    icon: "printer",
    variant: "ghost",
    tooltip: __("Print"),
    onclick: () => frm.print_doc(),
});

Générer le HTML d'une liste de boutons

Dans une vue construite en chaînes HTML, utilisez frappe.ui.button.html(opts). Cette forme n'attache pas de gestionnaire : liez le clic avec une délégation d'événement.

const html = rows.map((row) =>
    frappe.ui.button.html({ label: __("Open"), size: "xs", attrs: { "data-name": row.name } })
).join("");
$container.html(html).on("click", ".es-button", (e) => frappe.set_route("Form", "ToDo", $(e.currentTarget).attr("data-name")));

Le libellé et les attributs sont échappés. Les attributs on* sont refusés.

Pour appliquer le style Espresso à un bouton qui existe déjà, utilisez frappe.ui.button.dress(element, opts).