import '@material/web/dialog/dialog.js'; import {Dialog as MDDialog} from '@material/web/dialog/lib/dialog'; import { Children, Vnode, VnodeDOM } from 'mithril'; import Stream from 'mithril/stream'; import { Attributes, Component } from '../Component'; export interface DialogAttributes extends Attributes, Partial> { open?: Stream; onOpen?: () => void; onClose?: () => void; } export default abstract class Dialog extends Component { declare element: MDDialog; open!: Stream; oninit(vnode: Vnode) { super.oninit(vnode); let {open} = vnode.attrs; if (open === undefined) { open = Stream(false); } this.open = open; } oncreate(vnode: VnodeDOM) { super.oncreate(vnode); this.element.addEventListener('closed', () => { vnode.attrs.onClose?.(); this.open(false); m.redraw(); }); this.element.addEventListener('opened', () => { vnode.attrs.onOpen?.(); }); } public view(vnode: Vnode): Children { return ( {this.contents(vnode) ?? vnode.children} ); } contents(vnode: Vnode): Children { return undefined; } public show(): void { this.element.show(); } public close(action?: string): void { this.element.close(action); } }