@digix-ui/dialog
Version:
Stencil Component Starter
69 lines (61 loc) • 2.22 kB
JavaScript
class Dialogo {
constructor() {
this.dialogoAberto = false;
this.selecionarBody = document.getElementsByTagName('body');
this.ultimoFocoAntesDoDialogo;
this.idDoDialogoAberto;
this.todosElementosDoDialogo;
}
mostrarDialogo(idDoDialogo) {
this.ultimoFocoAntesDoDialogo = document.activeElement;
this.idDoDialogoAberto = idDoDialogo;
this.dialogoAberto = true;
const ultimoElementoDoDialogo = document.createElement('SPAN');
document.getElementById(this.idDoDialogoAberto).appendChild(ultimoElementoDoDialogo);
this.todosElementosDoDialogo = document.querySelectorAll(`#${this.idDoDialogoAberto} *`);
document.getElementById(this.idDoDialogoAberto).classList.add('dialogo_ativo');
this.todosElementosDoDialogo[1].setAttribute('tabindex', '0');
this.todosElementosDoDialogo[1].focus();
this.selecionarBody[0].style.overflowY = 'hidden';
this.focusApenasNoDialogo();
}
focusApenasNoDialogo() {
this.todosElementosDoDialogo[this.todosElementosDoDialogo.length - 1].setAttribute('tabindex', '0');
this.todosElementosDoDialogo[this.todosElementosDoDialogo.length - 1].addEventListener('focus', () => {
this.todosElementosDoDialogo[1].focus();
});
this.todosElementosDoDialogo[0].setAttribute('tabindex', '0');
document.onkeydown = (e) => {
e = e || window.event;
this.manterFocoNoDialogo(e);
if (e.keyCode === 27) {
this.fecharDialogo();
}
};
}
manterFocoNoDialogo(e) {
this.todosElementosDoDialogo[0].addEventListener('focus', () => {
if (e.shiftKey && e.keyCode === 9) {
this.todosElementosDoDialogo[1].focus();
}
});
}
fecharDialogo() {
if (this.dialogoAberto) {
document.getElementById(this.idDoDialogoAberto).classList.remove('dialogo_ativo');
this.todosElementosDoDialogo[this.todosElementosDoDialogo.length - 1].remove();
this.dialogoAberto = false;
this.selecionarBody[0].style.overflowY = 'auto';
}
}
bloquearEsc() {
document.onkeydown = (e) => {
e = e || window.event;
this.manterFocoNoDialogo(e);
if (e.keyCode === 27) {
return;
}
};
}
}
export default Dialogo;