123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- // assets/controllers/dropdown_controller.js
- import { Controller } from '@hotwired/stimulus'
- export default class extends Controller {
- static targets = ['menu']
- toggle(event) {
- event.stopPropagation()
- const menu = this.menuTarget
- if (menu.classList.contains('is-active')) {
- // Fermeture avec délai pour laisser la transition jouer
- menu.classList.remove('is-active')
- setTimeout(() => {
- menu.style.display = 'none'
- }, 200) // correspond à la durée CSS
- } else {
- menu.style.display = 'block'
- // force reflow pour permettre l’animation
- void menu.offsetWidth
- menu.classList.add('is-active')
- }
- }
- closeOnOutsideClick = (event) => {
- if (!this.element.contains(event.target)) {
- const menu = this.menuTarget
- if (menu.classList.contains('is-active')) {
- menu.classList.remove('is-active')
- setTimeout(() => {
- menu.style.display = 'none'
- }, 200)
- }
- }
- }
- connect() {
- document.addEventListener('click', this.closeOnOutsideClick)
- }
- disconnect() {
- document.removeEventListener('click', this.closeOnOutsideClick)
- }
- }
|