/*
You may notice some oddness with this element. Namely that the `.buttons` div appears before the
`paper-dialog-scrollable` element in `dashboard.pug`, but in the below `
`;
}
static get is() {
return "ncg-dialog";
}
static get properties() {
return {
bundle: {
type: String,
reflectToAttribute: true,
},
panel: {
type: String,
reflectToAttribute: true,
},
width: {
type: Number,
reflectToAttribute: true,
},
};
}
override ready(): void {
super.ready();
this.addEventListener("neon-animation-finish", this._onNeonAnimationFinish);
this.addEventListener("iron-overlay-opened", this._onIronOverlayOpened);
this.addEventListener("iron-overlay-closed", this._onIronOverlayClosed);
afterNextRender(this, async () => {
const iframe = this.querySelector("iframe")!;
// If Sentry is enabled, use it to report errors in panels to Sentry.io.
if (window.ncgConfig.sentry.enabled) {
const Sentry = await import("@sentry/browser");
iframe.contentWindow!.addEventListener("error", (event: any) => {
Sentry.captureException(event.error);
});
iframe.contentWindow!.addEventListener(
"unhandledrejection",
(err: any) => {
Sentry.captureException(err.reason);
},
);
}
if (iframe.contentWindow!.document.readyState === "complete") {
this._attachIframeResize(iframe);
} else {
iframe.addEventListener("load", () => {
this._attachIframeResize(iframe);
});
}
});
}
override connectedCallback(): void {
super.connectedCallback();
const iframe = this.querySelector("iframe")!;
iframe.addEventListener("iframe-resized", () => {
this.refit();
});
}
_attachIframeResize(iframe: HTMLIFrameElement) {
initialize(
{
onIframeResize(context) {
context.iframe.dispatchEvent(new CustomEvent("iframe-resized"));
},
},
iframe,
);
}
_renderOpened() {
if (this.withBackdrop) {
this.backdropElement.open();
}
this.playAnimation("entry");
}
_renderClosed() {
if (this.withBackdrop) {
this.backdropElement.close();
}
this.playAnimation("exit");
}
_onNeonAnimationFinish() {
if (this.opened) {
this._finishRenderOpened();
} else {
this._finishRenderClosed();
}
}
_onIronOverlayOpened() {
const iframeDocument = this.querySelector("iframe")!.contentDocument!;
iframeDocument.dispatchEvent(new CustomEvent("dialog-opened"));
}
_onIronOverlayClosed(e: any) {
const iframeDocument = this.querySelector("iframe")!.contentDocument!;
if (e.detail.confirmed && !e.detail.canceled) {
iframeDocument.dispatchEvent(new CustomEvent("dialog-confirmed"));
} else {
iframeDocument.dispatchEvent(new CustomEvent("dialog-dismissed"));
}
}
}
customElements.define("ncg-dialog", NcgDialog as any);