Spaces:
Sleeping
Sleeping
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); | |
} | |
} | |