47 lines
1.5 KiB
JavaScript
47 lines
1.5 KiB
JavaScript
import { Controller } from '@hotwired/stimulus';
|
|
/**
|
|
* Contrôleur Stimulus pour le dropdown de connexion
|
|
* Attache les événements de manière robuste et compatible avec Turbo
|
|
*/
|
|
export default class extends Controller {
|
|
static targets = ['wrapper', 'toggle', 'dropdown'];
|
|
connect() {
|
|
this.setupListeners();
|
|
// Ouvrir le dropdown s'il y a une erreur de connexion
|
|
const loginError = this.element.querySelector('.login-error');
|
|
if (loginError && this.dropdownTarget) {
|
|
this.open();
|
|
}
|
|
}
|
|
setupListeners() {
|
|
// Clic sur le bouton toggle
|
|
this.toggleTarget.addEventListener('click', (e) => {
|
|
e.stopPropagation();
|
|
this.toggle();
|
|
});
|
|
// Clic en dehors du dropdown
|
|
document.addEventListener('click', (e) => {
|
|
if (!this.wrapperTarget.contains(e.target)) {
|
|
this.close();
|
|
}
|
|
});
|
|
// Touche Echap
|
|
document.addEventListener('keydown', (e) => {
|
|
if (e.key === 'Escape') {
|
|
this.close();
|
|
}
|
|
});
|
|
}
|
|
toggle() {
|
|
const isOpen = this.dropdownTarget.classList.contains('open');
|
|
isOpen ? this.close() : this.open();
|
|
}
|
|
open() {
|
|
this.dropdownTarget.classList.add('open');
|
|
this.toggleTarget.setAttribute('aria-expanded', 'true');
|
|
}
|
|
close() {
|
|
this.dropdownTarget.classList.remove('open');
|
|
this.toggleTarget.setAttribute('aria-expanded', 'false');
|
|
}
|
|
}
|