Skip to content

Commit 1c83e04

Browse files
Fix submenu registration by using ZoteroToolkit (#304)
Fixes #302
1 parent 7b23e68 commit 1c83e04

File tree

1 file changed

+35
-59
lines changed

1 file changed

+35
-59
lines changed

Diff for: src/cita/zoteroOverlay.tsx

+35-59
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { Root, createRoot } from "react-dom/client";
1717

1818
import { initLocale, getLocaleID } from "../utils/locale";
1919
import { getPrefGlobalName } from "../utils/prefs";
20+
import { MenuitemOptions } from "zotero-plugin-toolkit/dist/managers/menu";
2021

2122
const TRANSLATORS_PATH = `chrome://${config.addonRef}/content/translators`;
2223
const TRANSLATOR_LABELS = [
@@ -1084,47 +1085,24 @@ class ZoteroOverlay {
10841085
// /******************************************/
10851086
// // Create XUL for Zotero menu elements
10861087
zoteroPopup(menuName: MenuSelectionType, doc: Document) {
1087-
const ns =
1088-
"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
1089-
const zoteroMenu = doc.getElementById(`zotero-${menuName}menu`);
1090-
if (zoteroMenu === null) {
1091-
// Don't do anything if elements not loaded yet
1092-
return;
1093-
}
1094-
1095-
const wikiciteSeparator = doc.createElementNS(ns, "menuseparator");
1096-
const wikiciteSeparatorID = `wikicite-${menuName}submenu-separator`;
1097-
wikiciteSeparator.setAttribute("id", wikiciteSeparatorID);
1098-
zoteroMenu.appendChild(wikiciteSeparator);
1099-
WikiciteChrome.registerXUL(wikiciteSeparatorID, doc);
1100-
11011088
// Wikicite submenu
1102-
const wikiciteSubmenu = doc.createElementNS(ns, "menu");
1103-
const wikiciteSubmenuID = `wikicite-${menuName}submenu`;
1104-
wikiciteSubmenu.setAttribute("id", wikiciteSubmenuID);
1105-
wikiciteSubmenu.setAttribute(
1106-
"label",
1107-
Wikicite.getString(`wikicite.submenu.label`),
1108-
);
1109-
zoteroMenu.appendChild(wikiciteSubmenu);
1110-
WikiciteChrome.registerXUL(wikiciteSubmenuID, doc);
1111-
1112-
// Wikicite submenu popup
1113-
const wikiciteSubmenuPopup = doc.createElementNS(ns, "menupopup");
1114-
wikiciteSubmenuPopup.setAttribute(
1115-
"id",
1116-
`wikicite-${menuName}submenu-popup`,
1117-
);
1118-
wikiciteSubmenu.appendChild(wikiciteSubmenuPopup);
1089+
ztoolkit.Menu.register(menuName, {
1090+
tag: "menuseparator",
1091+
id: `wikicite-${menuName}submenu-separator`,
1092+
});
11191093

1120-
this.createMenuItems(
1094+
const menuItems = this.createMenuItems(
11211095
menuName,
1122-
wikiciteSubmenuPopup,
11231096
`wikicite-${menuName}submenu-`,
1124-
false,
1125-
doc,
11261097
);
11271098

1099+
ztoolkit.Menu.register(menuName, {
1100+
tag: "menu",
1101+
id: `wikicite-${menuName}submenu`,
1102+
label: Wikicite.getString(`wikicite.submenu.label`),
1103+
children: menuItems,
1104+
});
1105+
11281106
this.refreshZoteroPopup(menuName, doc);
11291107
}
11301108

@@ -1176,11 +1154,8 @@ class ZoteroOverlay {
11761154
// Create Zotero item menu items as children of menuPopup
11771155
createMenuItems(
11781156
menuName: MenuSelectionType,
1179-
menuPopup: Element,
11801157
IDPrefix: string,
1181-
elementsAreRoot: boolean,
1182-
doc: Document,
1183-
) {
1158+
): MenuitemOptions[] {
11841159
const menuFunctions: Map<
11851160
MenuFunction,
11861161
(menuName: MenuSelectionType) => void
@@ -1193,6 +1168,8 @@ class ZoteroOverlay {
11931168
["addAsCitations", () => this.addAsCitations(menuName)],
11941169
["localCitationNetwork", () => this.localCitationNetwork(menuName)],
11951170
]);
1171+
1172+
const options: MenuitemOptions[] = [];
11961173
for (const [functionName, func] of menuFunctions) {
11971174
if (
11981175
menuName === "collection" &&
@@ -1208,13 +1185,10 @@ class ZoteroOverlay {
12081185
functionName,
12091186
func,
12101187
IDPrefix,
1211-
doc,
12121188
);
1213-
menuPopup.appendChild(menuFunc);
1214-
if (elementsAreRoot) {
1215-
WikiciteChrome.registerXUL(menuFunc.id, doc);
1216-
}
1189+
options.push(menuFunc);
12171190
}
1191+
return options;
12181192
}
12191193

12201194
// Create Zotero item menu item
@@ -1223,25 +1197,27 @@ class ZoteroOverlay {
12231197
functionName: MenuFunction,
12241198
func: (menuName: MenuSelectionType) => void,
12251199
IDPrefix: string,
1226-
doc: Document,
12271200
) {
1228-
const ns =
1229-
"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
1230-
const menuFunc = doc.createElementNS(ns, "menuitem");
1231-
menuFunc.setAttribute("id", IDPrefix + functionName);
1232-
menuFunc.setAttribute(
1233-
"label",
1234-
Wikicite.getString(`wikicite.submenu.${functionName}`),
1235-
);
1236-
menuFunc.addEventListener(
1237-
"command",
1238-
(event) => {
1201+
let label: string;
1202+
Zotero.log(`Building menu for ${functionName}`);
1203+
if (functionName.includes("getFromIndexer.")) {
1204+
const indexerName = functionName.split(".")[1];
1205+
label = Wikicite.formatString(
1206+
"wikicite.submenu.get-from-indexer",
1207+
indexerName,
1208+
);
1209+
Zotero.log(label);
1210+
} else label = Wikicite.getString(`wikicite.submenu.${functionName}`);
1211+
const menuOptions: MenuitemOptions = {
1212+
tag: "menuitem",
1213+
id: IDPrefix + functionName,
1214+
label: label,
1215+
commandListener: (event) => {
12391216
event.stopPropagation();
12401217
func(menuName);
12411218
},
1242-
false,
1243-
);
1244-
return menuFunc;
1219+
};
1220+
return menuOptions;
12451221
}
12461222
}
12471223

0 commit comments

Comments
 (0)