1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- import { h, on, t } from '@dom111/element';
- import joinPath, { leadingAndTrailingSlash } from '../lib/joinPath';
- import Modal from './Modal';
- import Tree from './Tree/Tree';
- import WebDAV from './Tree/WebDAV';
- type TreeViewModalEvents = {
- cancelled: [];
- selected: [string];
- };
- export class TreeViewModal extends Modal<TreeViewModalEvents> {
- #tree: Tree;
- constructor(title: string) {
- super();
- this.#tree = new Tree(new WebDAV());
- this.append(
- h('header', h('h2', t(title))),
- this.#tree,
- h(
- 'footer',
- h('button[type="submit"]', t('Choose')),
- h('button', t('Cancel'))
- )
- );
- this.addClass('tree-view-modal');
- this.bindLocalEvents();
- }
- private bindLocalEvents(): void {
- on(this.query('button[type="submit"]'), 'click', () => {
- const value = this.#tree.value();
- if (value === null) {
- this.emitCustom('selected', null);
- return;
- }
- this.emitCustom('selected', leadingAndTrailingSlash(joinPath(...value)));
- });
- on(this.query('button:not([type="submit"])'), 'click', () => {
- this.emitCustom('cancelled');
- });
- }
- async value(): Promise<string | null> {
- return new Promise<string>((resolve) => {
- this.on('cancelled', () => resolve(null));
- this.on('selected', ({ detail: [path] }) => resolve(path));
- });
- }
- }
- export default TreeViewModal;
|