add: preferencepane virtualized-table example
This commit is contained in:
parent
b8c644acc5
commit
81c43ccef5
@ -19,6 +19,9 @@
|
|||||||
preference="extensions.zotero.__addonRef__.input"
|
preference="extensions.zotero.__addonRef__.input"
|
||||||
></html:input>
|
></html:input>
|
||||||
</hbox>
|
</hbox>
|
||||||
|
<hbox class="virtualized-table-container" flex="1" height="300px">
|
||||||
|
<html:div id="__addonRef__-table-container" />
|
||||||
|
</hbox>
|
||||||
</groupbox>
|
</groupbox>
|
||||||
</vbox>
|
</vbox>
|
||||||
<vbox>
|
<vbox>
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/windingwind/zotero-addon-template#readme",
|
"homepage": "https://github.com/windingwind/zotero-addon-template#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"zotero-plugin-toolkit": "^1.0.0"
|
"zotero-plugin-toolkit": "^1.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "^18.11.17",
|
"@types/node": "^18.11.17",
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import ZoteroToolkit from "zotero-plugin-toolkit/dist/index";
|
import ZoteroToolkit from "zotero-plugin-toolkit/dist/index";
|
||||||
|
import { ColumnOptions } from "zotero-plugin-toolkit/dist/helpers/virtualizedTable";
|
||||||
import hooks from "./hooks";
|
import hooks from "./hooks";
|
||||||
|
|
||||||
class Addon {
|
class Addon {
|
||||||
@ -12,10 +13,14 @@ class Addon {
|
|||||||
};
|
};
|
||||||
prefs?: {
|
prefs?: {
|
||||||
window: Window;
|
window: Window;
|
||||||
|
columns: Array<ColumnOptions>;
|
||||||
|
rows: Array<{ [dataKey: string]: string }>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
// Lifecycle hooks
|
// Lifecycle hooks
|
||||||
public hooks: typeof hooks;
|
public hooks: typeof hooks;
|
||||||
|
// APIs
|
||||||
|
public api: {};
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
this.data = {
|
this.data = {
|
||||||
@ -24,6 +29,7 @@ class Addon {
|
|||||||
ztoolkit: new ZoteroToolkit(),
|
ztoolkit: new ZoteroToolkit(),
|
||||||
};
|
};
|
||||||
this.hooks = hooks;
|
this.hooks = hooks;
|
||||||
|
this.api = {};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,17 +3,97 @@ import { config } from "../../package.json";
|
|||||||
export function registerPrefsScripts(_window: Window) {
|
export function registerPrefsScripts(_window: Window) {
|
||||||
// This function is called when the prefs window is opened
|
// This function is called when the prefs window is opened
|
||||||
// See addon/chrome/content/preferences.xul onpaneload
|
// See addon/chrome/content/preferences.xul onpaneload
|
||||||
addon.data.prefs = {
|
if (!addon.data.prefs) {
|
||||||
window: _window,
|
addon.data.prefs = {
|
||||||
};
|
window: _window,
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
dataKey: "title",
|
||||||
|
label: "Title",
|
||||||
|
fixedWidth: true,
|
||||||
|
width: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataKey: "detail",
|
||||||
|
label: "Detail",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
rows: [
|
||||||
|
{
|
||||||
|
title: "Orange",
|
||||||
|
detail: "It's juicy",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Banana",
|
||||||
|
detail: "It's sweet",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Apple",
|
||||||
|
detail: "I mean the fruit APPLE",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
}
|
||||||
updatePrefsUI();
|
updatePrefsUI();
|
||||||
bindPrefEvents();
|
bindPrefEvents();
|
||||||
}
|
}
|
||||||
|
|
||||||
function updatePrefsUI() {
|
async function updatePrefsUI() {
|
||||||
// You can initialize some UI elements on prefs window
|
// You can initialize some UI elements on prefs window
|
||||||
// with addon.data.prefs.window.document
|
// with addon.data.prefs.window.document
|
||||||
// Or bind some events to the elements
|
// Or bind some events to the elements
|
||||||
|
const renderLock = ztoolkit.getGlobal("Zotero").Promise.defer();
|
||||||
|
const tableHelper = new ztoolkit.VirtualizedTabel(addon.data.prefs?.window!)
|
||||||
|
.setContainerId(`${config.addonRef}-table-container`)
|
||||||
|
.setProp({
|
||||||
|
id: `${config.addonRef}-prefs-table`,
|
||||||
|
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",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.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();
|
||||||
|
})
|
||||||
|
.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(-1, () => {
|
||||||
|
renderLock.resolve();
|
||||||
|
});
|
||||||
|
await renderLock.promise;
|
||||||
|
ztoolkit.log("Preference table rendered!", tableHelper);
|
||||||
}
|
}
|
||||||
|
|
||||||
function bindPrefEvents() {
|
function bindPrefEvents() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user