| /** |
| * @license |
| * Copyright 2021 The Go Authors. All rights reserved. |
| * Use of this source code is governed by a BSD-style |
| * license that can be found in the LICENSE file. |
| */ |
| |
| interface Window { |
| dialogPolyfill?: { |
| registerDialog: (el: HTMLDialogElement) => void; |
| }; |
| } |
| |
| declare const window: Window; |
| |
| /** |
| * ModalController registers a dialog element with the polyfill if |
| * necessary for the current browser, add adds event listeners to |
| * close and open modals. |
| */ |
| export class ModalController { |
| constructor(private el: HTMLDialogElement) { |
| if (window.dialogPolyfill) { |
| window.dialogPolyfill.registerDialog(el); |
| } |
| this.init(); |
| } |
| |
| init() { |
| const button = document.querySelector<HTMLButtonElement>(`[aria-controls="${this.el.id}"]`); |
| if (button) { |
| button.addEventListener('click', () => { |
| if (this.el.showModal) { |
| this.el.showModal(); |
| } else { |
| this.el.setAttribute('opened', 'true'); |
| } |
| this.el.querySelector('input')?.focus(); |
| }); |
| } |
| for (const btn of this.el.querySelectorAll<HTMLButtonElement>('[data-modal-close]')) { |
| btn.addEventListener('click', () => { |
| if (this.el.close) { |
| this.el.close(); |
| } else { |
| this.el.removeAttribute('opened'); |
| } |
| }); |
| } |
| } |
| } |