zotero-better-notes/src/elements/base.ts

66 lines
1.6 KiB
TypeScript

import { config } from "../../package.json";
export class PluginCEBase extends XULElementBase {
_addon!: typeof addon;
useShadowRoot = false;
connectedCallback(): void {
this._addon = Zotero[config.addonInstance];
Zotero.UIProperties.registerRoot(this);
if (!this.useShadowRoot) {
super.connectedCallback();
return;
}
this.attachShadow({ mode: "open" });
// Following the connectedCallback from XULElementBase
let content: Node = this.content;
if (content) {
content = document.importNode(content, true);
this.shadowRoot?.append(content);
}
MozXULElement.insertFTLIfNeeded("branding/brand.ftl");
MozXULElement.insertFTLIfNeeded("zotero.ftl");
if (document.l10n && this.shadowRoot) {
document.l10n.connectRoot(this.shadowRoot);
}
// @ts-ignore
window.addEventListener("unload", this._handleWindowUnload);
// @ts-ignore
this.initialized = true;
this.init();
}
_wrapID(key: string) {
if (key.startsWith(config.addonRef)) {
return key;
}
return `${config.addonRef}-${key}`;
}
_unwrapID(id: string) {
if (id.startsWith(config.addonRef)) {
return id.slice(config.addonRef.length + 1);
}
return id;
}
_queryID(key: string) {
const selector = `#${this._wrapID(key)}`;
return (this.querySelector(selector) ||
this.shadowRoot?.querySelector(selector)) as
| XUL.Element
| HTMLElement
| null;
}
_parseContentID(dom: DocumentFragment) {
dom.querySelectorAll("*[id]").forEach((elem) => {
elem.id = this._wrapID(elem.id);
});
return dom;
}
}