| import { createElement as $el, getClosestOrSelf, setAttributes } from "./utils_dom.js"; |
| export class RgthreeDialog extends EventTarget { |
| constructor(options) { |
| super(); |
| this.options = options; |
| let container = $el("div.rgthree-dialog-container"); |
| this.element = $el("dialog", { |
| classes: ["rgthree-dialog", options.class || ""], |
| child: container, |
| parent: document.body, |
| events: { |
| click: (event) => { |
| if (!this.element.open || |
| event.target === container || |
| getClosestOrSelf(event.target, `.rgthree-dialog-container`) === container) { |
| return; |
| } |
| return this.close(); |
| }, |
| }, |
| }); |
| this.element.addEventListener("close", (event) => { |
| this.onDialogElementClose(); |
| }); |
| this.titleElement = $el("div.rgthree-dialog-container-title", { |
| parent: container, |
| children: !options.title |
| ? null |
| : options.title instanceof Element || Array.isArray(options.title) |
| ? options.title |
| : typeof options.title === "string" |
| ? !options.title.includes("<h2") |
| ? $el("h2", { html: options.title }) |
| : options.title |
| : options.title, |
| }); |
| this.contentElement = $el("div.rgthree-dialog-container-content", { |
| parent: container, |
| child: options.content, |
| }); |
| const footerEl = $el("footer.rgthree-dialog-container-footer", { parent: container }); |
| for (const button of options.buttons || []) { |
| $el("button", { |
| text: button.label, |
| className: button.className, |
| disabled: !!button.disabled, |
| parent: footerEl, |
| events: { |
| click: (e) => { |
| var _a; |
| (_a = button.callback) === null || _a === void 0 ? void 0 : _a.call(button, e); |
| }, |
| }, |
| }); |
| } |
| if (options.closeButtonLabel !== false) { |
| $el("button", { |
| text: options.closeButtonLabel || "Close", |
| className: "rgthree-button", |
| parent: footerEl, |
| events: { |
| click: (e) => { |
| this.close(e); |
| }, |
| }, |
| }); |
| } |
| } |
| setTitle(content) { |
| const title = typeof content !== "string" || content.includes("<h2") |
| ? content |
| : $el("h2", { html: content }); |
| setAttributes(this.titleElement, { children: title }); |
| } |
| setContent(content) { |
| setAttributes(this.contentElement, { children: content }); |
| } |
| show() { |
| document.body.classList.add("rgthree-dialog-open"); |
| this.element.showModal(); |
| this.dispatchEvent(new CustomEvent("show")); |
| return this; |
| } |
| async close(e) { |
| if (this.options.onBeforeClose && !(await this.options.onBeforeClose())) { |
| return; |
| } |
| this.element.close(); |
| } |
| onDialogElementClose() { |
| document.body.classList.remove("rgthree-dialog-open"); |
| this.element.remove(); |
| this.dispatchEvent(new CustomEvent("close", this.getCloseEventDetail())); |
| } |
| getCloseEventDetail() { |
| return { detail: null }; |
| } |
| } |
| export class RgthreeHelpDialog extends RgthreeDialog { |
| constructor(node, content, opts = {}) { |
| const title = (node.type || node.title || "").replace(/\s*\(rgthree\).*/, " <small>by rgthree</small>"); |
| const options = Object.assign({}, opts, { |
| class: "-iconed -help", |
| title, |
| content, |
| }); |
| super(options); |
| } |
| } |
|
|