Composant Dialogue avec RiotJS

Cet article traite de la création d'un composant de dialogue (Dialog) avec Riot, en utilisant le CSS Material Design BeerCSS, et de la gestion des événements de clic. Avant de commencer, assurez-vous d'avoir une application de base RiotJS, ou consultez mes articles précédents de la série. Je suppose que vous avez une compréhension de base de Riot ; cependant, n'hésitez pas à consulter la documentation si nécessaire : https://riot.js.org/documentation/ Le dialogue informe les utilisateurs sur une tâche spécifique et peut contenir des informations critiques, nécessiter des décisions ou impliquer plusieurs tâches. Dans un dialogue modal, l'utilisateur est interrompu et interagit avec le dialogue avant de pouvoir continuer à interagir avec le reste de l'application, par exemple en choisissant une sonnerie de téléphone: Base du Composant de Dialogue L'objectif est de créer une application Riot avec un dialogue et d'exécuter une action si le modal est annulé ou confirmé. Tout d'abord, créez un nouveau fichier nommé c-dialog.riot dans le dossier des composants. Le préfixe c- signifie "composant", une convention de nommage utile et une bonne pratique. Écrivez le code HTML suivant dans ./components/c-dialog.riot (le HTML a été trouvé dans la documentation BeerCSS): { props?.title } { props?.message } clicked(ev, "cancel") } class="transparent link" if={ !props?.disableCancel }>{ props?.cancelText ?? "cancel" } clicked(ev, "confirm") } class="transparent link" if={ !props?.disableConfirm }>{ props?.confirmText ?? "confirm" } export default { clicked (e, name) { e.preventDefault(); e.stopPropagation(); this.root.dispatchEvent(new Event(name)); } } Source Code: https://github.com/steevepay/riot-beercss/blob/main/components/c-dialog.riot Expliquons le code : Les balises et définissent une balise racine personnalisée, portant le même nom que le fichier. Vous devez l'écrire ; sinon, cela pourrait créer des résultats inattendus. Utiliser la balise comme balise racine ou redéfinir des balises HTML natives est une mauvaise pratique, donc commencer par c- est un bon choix de nom. Le dialogue comporte trois sections principales : Un titre en en-tête rempli grâce à {props.title}. Un message dans le corps imprimé avec {props.message}. Une action (call to action) avec deux boutons : annuler et confirmer. Lorsqu'un bouton est cliqué, l'événement click est capturé dans la fonction clicked, puis un événement personnalisé est émis vers le HTML parent avec this.root.dispatchEvent(new Event(name)); : il émettra soit confirm soit cancel. Le modal s'affiche uniquement si props.active existe et est positif ; alors, la classe active est appliquée. Le composant Dialogue a différents styles, et il est imprimé conditionnellement si leurs props correspondants existent, par exemple pour rendre le dialogue plein écran : {props?.max ? 'max ' : null} si la propriété max existe, la classe max est appliquée. Enfin, chargez et instanciez le composant c-dialog.riot dans une page principale nommée index.riot: update({ active: !state.active, max: false })}>Dialog update({ active: !state.active, max: true })}>Max import cButton from "../components/c-button.riot" import cDialog from "../components/c-dialog.riot" export default { components: { cDialog, cButton }, state: { active: false, left: false, max: false }, cancel() { console.log("dialog cancel") this.update({ active: false }) }, confirm() { console.log("dialog confirm") this.update({ active: false }) } } Source Code: https://github.com/steevepay/riot-beercss/blob/main/examples/index.dialog.riot Détails du code : Les composants sont importés avec import cDialog from "./components/c-dialog.riot"; puis chargés dans l'objet Riot components:{}. Le composant dialog est instancié avec dans le HTML. L'état du dialogue est stocké dans l'objet Riot state:{} sous la propriété booléenne state.active. La propriété est passée en tant qu'attribut, comme : . Lorsque le bouton est cliqué, il définit la propriété active sur true et affiche le modal. Le titre et le message du dialogue sont passés en tant qu'attributs. Si le bouton annuler ou confirmer est cliqué, il émettra deux événements personnalisés : oncancel : il exécutera la fonction this.cancel(), et fermera le modal. onconfirm : il exécutera la fonction this.confirm(), et fermera le modal. Les deux appels à l'action peuvent être liés à une fonction personnali

May 5, 2025 - 13:18
 0
Composant Dialogue avec RiotJS

Cet article traite de la création d'un composant de dialogue (Dialog) avec Riot, en utilisant le CSS Material Design BeerCSS, et de la gestion des événements de clic.

Avant de commencer, assurez-vous d'avoir une application de base RiotJS, ou consultez mes articles précédents de la série.

Je suppose que vous avez une compréhension de base de Riot ; cependant, n'hésitez pas à consulter la documentation si nécessaire : https://riot.js.org/documentation/

Le dialogue informe les utilisateurs sur une tâche spécifique et peut contenir des informations critiques, nécessiter des décisions ou impliquer plusieurs tâches. Dans un dialogue modal, l'utilisateur est interrompu et interagit avec le dialogue avant de pouvoir continuer à interagir avec le reste de l'application, par exemple en choisissant une sonnerie de téléphone:

Modal example to select a phone ringtone

Base du Composant de Dialogue

L'objectif est de créer une application Riot avec un dialogue et d'exécuter une action si le modal est annulé ou confirmé.

Display a modal when a button is clicked and close the modal when the confirm or cancel button is clicked

Tout d'abord, créez un nouveau fichier nommé c-dialog.riot dans le dossier des composants. Le préfixe c- signifie "composant", une convention de nommage utile et une bonne pratique.

Écrivez le code HTML suivant dans ./components/c-dialog.riot (le HTML a été trouvé dans la documentation BeerCSS):


     class="
                {props?.active ? 'active ' : null}
                {props?.blur ? 'overlay blur ' : null}
                {props?.left ? 'left ' : null}
                {props?.right ? 'right ' : null}
                {props?.top ? 'top ' : null}
                {props?.bottom ? 'bottom ' : null}
                {props?.max ? 'max ' : null}
            "
        >
         if={ props?.title }>{ props?.title }
        
{ props?.message } name="body">
class="right-align no-space"> onclick={ (ev) => clicked(ev, "cancel") } class="transparent link" if={ !props?.disableCancel }>{ props?.cancelText ?? "cancel" } onclick={ (ev) => clicked(ev, "confirm") } class="transparent link" if={ !props?.disableConfirm }>{ props?.confirmText ?? "confirm" } name="button">

Source Code: https://github.com/steevepay/riot-beercss/blob/main/components/c-dialog.riot

Expliquons le code :

  1. Les balises et définissent une balise racine personnalisée, portant le même nom que le fichier. Vous devez l'écrire ; sinon, cela pourrait créer des résultats inattendus. Utiliser la balise comme balise racine ou redéfinir des balises HTML natives est une mauvaise pratique, donc commencer par c- est un bon choix de nom.
  2. Le dialogue comporte trois sections principales :
    • Un titre en en-tête rempli grâce à {props.title}.
    • Un message dans le corps imprimé avec {props.message}.
    • Une action (call to action) avec deux boutons : annuler et confirmer.
  3. Lorsqu'un bouton est cliqué, l'événement click est capturé dans la fonction clicked, puis un événement personnalisé est émis vers le HTML parent avec this.root.dispatchEvent(new Event(name)); : il émettra soit confirm soit cancel.
  4. Le modal s'affiche uniquement si props.active existe et est positif ; alors, la classe active est appliquée.
  5. Le composant Dialogue a différents styles, et il est imprimé conditionnellement si leurs props correspondants existent, par exemple pour rendre le dialogue plein écran : {props?.max ? 'max ' : null} si la propriété max existe, la classe max est appliquée.

Enfin, chargez et instanciez le composant c-dialog.riot dans une page principale nommée index.riot:


     style="width:800px;padding:20px;">
         onclick={ (ev) => update({ active: !state.active, max: false })}>Dialog 
         onclick={ (ev) => update({ active: !state.active, max: true })}>Max

         
            title="Dialog" 
            message="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
            active={ state.active }
            oncancel={ cancel } 
            onconfirm={ confirm }
            max={ state.max }
        />
    

Source Code: https://github.com/steevepay/riot-beercss/blob/main/examples/index.dialog.riot

Détails du code :

  1. Les composants sont importés avec import cDialog from "./components/c-dialog.riot"; puis chargés dans l'objet Riot components:{}.
  2. Le composant dialog est instancié avec dans le HTML.
  3. L'état du dialogue est stocké dans l'objet Riot state:{} sous la propriété booléenne state.active. La propriété est passée en tant qu'attribut, comme : . Lorsque le bouton est cliqué, il définit la propriété active sur true et affiche le modal.
  4. Le titre et le message du dialogue sont passés en tant qu'attributs.
  5. Si le bouton annuler ou confirmer est cliqué, il émettra deux événements personnalisés :
    • oncancel : il exécutera la fonction this.cancel(), et fermera le modal.
    • onconfirm : il exécutera la fonction this.confirm(), et fermera le modal.
  6. Les deux appels à l'action peuvent être liés à une fonction personnalisée : faire un appel API, ajouter un élément HTML, envoyer un email, confirmer une suppression et plus encore !

Tests du Composant de Dialogue

Il existe deux méthodes pour tester le composant de dialogue, et elles sont couvertes dans deux articles différents :

Conclusion

Voilà