Dev-B-comment-faire-un-composant-shiny.Rmd
library(shinygouv)
Si vous êtes sur le développement d’un nouveau composant, il faut s’assurer de la version du dsfr utilisé actuellement :
desc::desc_get("VersionDsfr")
Vous devriez trouver un dossier dans “inst/” avec le bon numéro de version. Si ce n’est pas le cas, suivre la vignette Montee en version du dsfr : trouver les fichiers CSS et JS.
Si vous êtes sur une montée de version, les dossiers devraient déjà être prêts.
Pour expliquer le workflow de ce package, nous allons détailler
comment développer le futur actionButton()
.
Ici nous prenons l’exemple d’un composant développé pour la version 1.7.2 du dsfr.
Copier dans le dossier inst/v1.7.2/composant
le
template html du bouton pour dsfr
Se rendre sur https://www.systeme-de-design.gouv.fr/elements-d-interface/composants/bouton/
Enregistrer le code html par défaut du bouton dans un fichier
inst/v1.7.2/composant/bouton.html
<button class="fr-btn">Label bouton</button>
Modifier le code html pour mettre les paramètres nécessaires à son bon fonctionnement dans {shiny}
id
pour le futur inputId
Après retravail sur le composant actionButton()
, voici
son template html:
<button id={{inputId}} class="fr-btn action-button {{class}}">{{label}}</button>
actionButton()
Dans notre cas, nous traitons le actionButton()
et la
classe a ajouter est action-button
.
Comment savoir ?
Le plus simple est d’exécuter la fonction de l’input dans shiny dans la console :
shiny::actionButton("test", "test")
`<button id="test" type="button" class="btn btn-default action-button">test</button>`
On observe alors que dans “class” nous avons des classes liées à bootstrap
btn-*
et une classe à partaction-button
. C’est souvent cette classe qui permet de déclencher l’évènement coté server. Si cela n’est pas suffisant, il faudra chercher dans le code du package {shiny}. Le code se trouve ici et en ouvrant le fichier.ts
vous trouverez alors un endroit ou on recherche la classe qui active l’input :
find(scope: HTMLElement): JQuery<HTMLElement> {
return $(scope).find(".action-button");
}
Créer la fonction qui permettra d’utiliser ce nouveau bouton :
dev/flat_composants/
et le renommer
“flat_nom_du_composant_shiny.Rmd”. Dans cet exemple,
flat_actionButton.Rmd
.actionButton
)..html
dans la
fonction *_template
..html
.fusen::inflate()
.Voir exemple dev/flat_composants/flat_actionButton.Rmd
/!\ Attention: Ayez une attention particulière pour les tests unitaires qui sont la garantie du bon fonctionnement du package.
actionButton()
n’ont pas
besoin de mise à jour, c’est le cas pour beaucoup d’autres
composants.updateNumericInput_dsfr()
).updateRadioGroupButtons_dsfr()
).
ns()
dans le nom des inputId. Il est indispensable
de prendre en compte la fonction ns()
partout, sauf dans le
cas d’un appel à la fonction shiny
session$sendInputMessage()
car le ns() est géré en interne.
Le plus simple reste d’observer la fonction
updateRadioGroupButtons_dsfr()
.Lorsque l’implémentation de votre nouveau composant dsfr est terminée :
La colonne composant_shiny
restera vide si le composant
dsfr n’a pas d’équivalent dans {shiny}.
Cette table de correspondance permettra le bon déroulement de la
conversion d’une app shiny en une app shiny dsfr (en utilisant
convert_to_dsfr()
)
Vous pouvez également ajouter votre composant dans l’application de démonstration.