javascript unpoly alpine.js

/Personnaliser le composant up-confirm de unpoly

13 juin 2024

L'attribut up-confirm est utilisé pour afficher une boîte de dialogue de confirmation avant d'exécuter une action spécifique, telle qu'une soumission de formulaire ou un lien.

Utilisation de up-confirm

L'attribut up-confirm peut être ajouté à n'importe quel élément HTML, tel qu'un bouton ou un lien. Lorsque cet élément est cliqué, une boîte de dialogue de confirmation s'affiche avec le message spécifié dans l'attribut. Si l'utilisateur confirme l'action, celle-ci est exécutée ; sinon, l'action est annulée.

<a href="/delete-item" up-confirm="Are you sure you want to delete this item?">Delete</a>

Custom up-confirm

Cette fonctionnalité utilise le prompt natif du navigateur. Pour le personnaliser, il est nécessaire d'intercepter cet appel et de recréer son composant. Dans notre exemple, nous utilisons DaisyUI et Alpine.js, vous pouvez tout à fait adapter le code pour vous en passer.

Nous allons utiliser la fonction up.compiler d'Unpoly, qui permet de compiler ou de préparer les éléments correspondant à un sélecteur CSS lorsqu'ils sont ajoutés au DOM.

up.compiler('[up-confirm]', function (el) {
    up.on(el, 'click', (event, element) => {
      event.preventDefault()
      up.confirm(element)
    })
  })

Nous ajoutons un événement click sur tous les éléments contenant notre attribut up-confirm

Il nous reste maintenant à réaliser notre propre modal de confirmation en surchargeant up.confirm

up.confirm = function (element) {
  const href = element.getAttribute('href')
  const message = element.getAttribute('up-confirm')
  const layer = element.getAttribute('up-layer') ?? 'current'
  const target = element.getAttribute('up-target') ?? 'main'
  const method = element.getAttribute('up-method') ?? 'GET'
  const colorButton = element.dataset.colorButton ?? 'btn-primary'

  const dialog = up.element.createFromHTML(`
    <div class="modal modal-open z-[2000]" x-data="{}" @keyup.escape.window="$el.remove()">
      <div class="modal-box">
          <h3 class="font-bold text-lg">${message}</h3>

          <div class="modal-action">
              <button @click="$root.remove()" class="btn btn-ghost">
                  cancel
              </button>

              <button class="btn ${colorButton}" @click="up.navigate({ layer: '${layer}', target: '${target}', url: '${href}', method: '${method}' }); $root.remove()">
                  ok
              </button>
          </div>
      </div>
    </div>`)

  document.querySelector('body').append(dialog)
}

Ici, nous commençons par récupérer :

href url à exécuter après la confirmation
up-confirm contient le message à afficher
up-layer (optionnel) https://unpoly.com/up.layer
up-target (optionnel) https://unpoly.com/targeting-fragments
up-method (optionnel) https://unpoly.com/a-up-follow#up-method
colorButton (optionnel) class CSS pour la couleur du bouton ok

La méthode up.element.createFromHTML nous permet de transformer notre chaîne de caractères en élément du DOM.

Alpine.js est utilisé pour faciliter la gestion de fermeture avec @keyup@click ainsi que les variables $root et $el pour supprimer notre HTML avec le bouton "cancel" ou un clic en dehors de notre modal , si vous n'utilisez pas Alpine sur votre projet, il est préférable de le remplacer par du simple code javascript.

Le bouton "ok" va utiliser la méthode up.navigate pour lancer l'action souhaitée.

Exemple : https://github.com/batosai/adonis-starter-kit/blob/main/src/core/resources/js/app.js

Partage

©2024 Jeremy Chaufourier.