132 lines
3.8 KiB
TypeScript
132 lines
3.8 KiB
TypeScript
import { config } from "../../package.json";
|
|
import { getString } from "../utils/locale";
|
|
|
|
export async function registerPrefsScripts(_window: Window) {
|
|
// This function is called when the prefs window is opened
|
|
// See addon/chrome/content/preferences.xul onpaneload
|
|
if (!addon.data.prefs) {
|
|
addon.data.prefs = {
|
|
window: _window,
|
|
columns: [
|
|
{
|
|
dataKey: "title",
|
|
label: getString("prefs-table-title"),
|
|
fixedWidth: true,
|
|
width: 100,
|
|
},
|
|
{
|
|
dataKey: "detail",
|
|
label: getString("prefs-table-detail"),
|
|
},
|
|
],
|
|
rows: [
|
|
{
|
|
title: "Orange",
|
|
detail: "It's juicy",
|
|
},
|
|
{
|
|
title: "Banana",
|
|
detail: "It's sweet",
|
|
},
|
|
{
|
|
title: "Apple",
|
|
detail: "I mean the fruit APPLE",
|
|
},
|
|
],
|
|
};
|
|
} else {
|
|
addon.data.prefs.window = _window;
|
|
}
|
|
updatePrefsUI();
|
|
bindPrefEvents();
|
|
}
|
|
|
|
async function updatePrefsUI() {
|
|
// You can initialize some UI elements on prefs window
|
|
// with addon.data.prefs.window.document
|
|
// Or bind some events to the elements
|
|
const renderLock = ztoolkit.getGlobal("Zotero").Promise.defer();
|
|
if (addon.data.prefs?.window == undefined) return;
|
|
const tableHelper = new ztoolkit.VirtualizedTable(addon.data.prefs?.window)
|
|
.setContainerId(`${config.addonRef}-table-container`)
|
|
.setProp({
|
|
id: `${config.addonRef}-prefs-table`,
|
|
// Do not use setLocale, as it modifies the Zotero.Intl.strings
|
|
// Set locales directly to columns
|
|
columns: addon.data.prefs?.columns,
|
|
showHeader: true,
|
|
multiSelect: true,
|
|
staticColumns: true,
|
|
disableFontSizeScaling: true,
|
|
})
|
|
.setProp("getRowCount", () => addon.data.prefs?.rows.length || 0)
|
|
.setProp(
|
|
"getRowData",
|
|
(index) =>
|
|
addon.data.prefs?.rows[index] || {
|
|
title: "no data",
|
|
detail: "no data",
|
|
},
|
|
)
|
|
// Show a progress window when selection changes
|
|
.setProp("onSelectionChange", (selection) => {
|
|
new ztoolkit.ProgressWindow(config.addonName)
|
|
.createLine({
|
|
text: `Selected line: ${addon.data.prefs?.rows
|
|
.filter((v, i) => selection.isSelected(i))
|
|
.map((row) => row.title)
|
|
.join(",")}`,
|
|
progress: 100,
|
|
})
|
|
.show();
|
|
})
|
|
// When pressing delete, delete selected line and refresh table.
|
|
// Returning false to prevent default event.
|
|
.setProp("onKeyDown", (event: KeyboardEvent) => {
|
|
if (event.key == "Delete" || (Zotero.isMac && event.key == "Backspace")) {
|
|
addon.data.prefs!.rows =
|
|
addon.data.prefs?.rows.filter(
|
|
(v, i) => !tableHelper.treeInstance.selection.isSelected(i),
|
|
) || [];
|
|
tableHelper.render();
|
|
return false;
|
|
}
|
|
return true;
|
|
})
|
|
// For find-as-you-type
|
|
.setProp(
|
|
"getRowString",
|
|
(index) => addon.data.prefs?.rows[index].title || "",
|
|
)
|
|
// Render the table.
|
|
.render(-1, () => {
|
|
renderLock.resolve();
|
|
});
|
|
await renderLock.promise;
|
|
ztoolkit.log("Preference table rendered!");
|
|
}
|
|
|
|
function bindPrefEvents() {
|
|
addon.data
|
|
.prefs!.window.document.querySelector(
|
|
`#zotero-prefpane-${config.addonRef}-enable`,
|
|
)
|
|
?.addEventListener("command", (e) => {
|
|
ztoolkit.log(e);
|
|
addon.data.prefs!.window.alert(
|
|
`Successfully changed to ${(e.target as XUL.Checkbox).checked}!`,
|
|
);
|
|
});
|
|
|
|
addon.data
|
|
.prefs!.window.document.querySelector(
|
|
`#zotero-prefpane-${config.addonRef}-input`,
|
|
)
|
|
?.addEventListener("change", (e) => {
|
|
ztoolkit.log(e);
|
|
addon.data.prefs!.window.alert(
|
|
`Successfully changed to ${(e.target as HTMLInputElement).value}!`,
|
|
);
|
|
});
|
|
}
|