41 lines
906 B
TypeScript
41 lines
906 B
TypeScript
import { Modal } from './modal';
|
|
|
|
export class ModalManager {
|
|
public modals: Record<string, Modal> = {};
|
|
public closers = document.querySelectorAll(
|
|
'[data-modal-closer]',
|
|
) as NodeListOf<HTMLElement>;
|
|
|
|
constructor() {
|
|
this.closers.forEach((item) => {
|
|
item.setAttribute('aria-label', 'Close modal');
|
|
item.addEventListener('click', (evt) => {
|
|
evt.preventDefault();
|
|
this.close();
|
|
});
|
|
});
|
|
|
|
window.addEventListener('keyup', (evt: KeyboardEvent) => {
|
|
if (evt.key === 'Escape') {
|
|
this.close();
|
|
}
|
|
});
|
|
}
|
|
|
|
public register<T extends Modal>(item: T): T {
|
|
this.modals[item.name] = item;
|
|
item.initialize();
|
|
item.reset();
|
|
return item;
|
|
}
|
|
|
|
public close(name?: string): void {
|
|
if (name) {
|
|
this.modals[name].reset();
|
|
return;
|
|
}
|
|
|
|
Object.values(this.modals).forEach((item) => item.reset());
|
|
}
|
|
}
|