zotero-better-notes/src/extras/linkCreator.ts

97 lines
2.4 KiB
TypeScript

import { getPref, setPref } from "../utils/prefs";
import { InboundCreator } from "../elements/linkCreator/inboundCreator";
import { OutboundCreator } from "../elements/linkCreator/outboundCreator";
let tabbox: XULTabBoxElement;
let inboundCreator: InboundCreator;
let outboundCreator: OutboundCreator;
let io: {
currentNoteID: number;
currentLineIndex?: number;
openedNoteIDs?: number[];
deferred: _ZoteroTypes.DeferredPromise<void>;
targetNoteID?: number;
content?: string;
lineIndex?: number;
mode?: "inbound" | "outbound";
};
window.onload = async function () {
if (document.readyState === "complete") {
setTimeout(init, 0);
return;
}
document.addEventListener("DOMContentLoaded", init, { once: true });
};
window.onunload = function () {
io.deferred && io.deferred.resolve();
setPref(
"windows.linkCreator.size",
`${document.documentElement.getAttribute(
"width",
)},${document.documentElement.getAttribute("height")}`,
);
setPref("windows.linkCreator.tabIndex", tabbox.selectedIndex);
};
function init() {
// Set font size from pref
const sbc = document.getElementById("top-container");
Zotero.UIProperties.registerRoot(sbc);
setTimeout(() => {
const size = ((getPref("windows.linkCreator.size") as string) || "").split(
",",
);
window.resizeTo(Number(size[0] || "800"), Number(size[1] || "600"));
}, 0);
io = window.arguments[0];
if (!io.deferred) {
// @ts-ignore
io = io.wrappedJSObject;
}
tabbox = document.querySelector("#top-container")!;
if (io.mode) {
tabbox.selectedIndex = io.mode === "inbound" ? 0 : 1;
} else {
tabbox.selectedIndex =
(getPref("windows.linkCreator.tabIndex") as number) || 0;
}
tabbox.addEventListener("select", loadSelectedPanel);
inboundCreator = document.querySelector(
"bn-inbound-creator",
) as InboundCreator;
outboundCreator = document.querySelector(
"bn-outbound-creator",
) as OutboundCreator;
loadSelectedPanel();
document.addEventListener("dialogaccept", doAccept);
}
async function loadSelectedPanel() {
const content = getSelectedContent();
await content.load(io);
}
async function acceptSelectedPanel() {
await getSelectedContent().accept(io);
}
function getSelectedContent() {
return tabbox.selectedPanel.querySelector("[data-bn-type=content]") as any;
}
async function doAccept() {
await acceptSelectedPanel();
}