dropdown_controller.js 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. // assets/controllers/dropdown_controller.js
  2. import { Controller } from '@hotwired/stimulus'
  3. export default class extends Controller {
  4. static targets = ['menu']
  5. toggle(event) {
  6. event.stopPropagation()
  7. const menu = this.menuTarget
  8. if (menu.classList.contains('is-active')) {
  9. // Fermeture avec délai pour laisser la transition jouer
  10. menu.classList.remove('is-active')
  11. setTimeout(() => {
  12. menu.style.display = 'none'
  13. }, 200) // correspond à la durée CSS
  14. } else {
  15. menu.style.display = 'block'
  16. // force reflow pour permettre l’animation
  17. void menu.offsetWidth
  18. menu.classList.add('is-active')
  19. }
  20. }
  21. closeOnOutsideClick = (event) => {
  22. if (!this.element.contains(event.target)) {
  23. const menu = this.menuTarget
  24. if (menu.classList.contains('is-active')) {
  25. menu.classList.remove('is-active')
  26. setTimeout(() => {
  27. menu.style.display = 'none'
  28. }, 200)
  29. }
  30. }
  31. }
  32. connect() {
  33. document.addEventListener('click', this.closeOnOutsideClick)
  34. }
  35. disconnect() {
  36. document.removeEventListener('click', this.closeOnOutsideClick)
  37. }
  38. }