Merge pull request #26 from MuiseDestiny:bootstrap

add: Prompt exapmles
This commit is contained in:
windingwind 2023-03-13 00:26:14 +08:00 committed by GitHub
commit bb4c31b54c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 203 additions and 3 deletions

View File

@ -64,7 +64,11 @@ async function onStartup() {
await UIExampleFactory.registerReaderTabPanel(); await UIExampleFactory.registerReaderTabPanel();
PromptExampleFactory.registerAlertPromptExample(); PromptExampleFactory.registerNormalCommandExample();
PromptExampleFactory.registerAnonymousCommandExample();
PromptExampleFactory.registerConditionalCommandExample();
await Zotero.Promise.delay(1000); await Zotero.Promise.delay(1000);

View File

@ -464,10 +464,10 @@ export class UIExampleFactory {
export class PromptExampleFactory { export class PromptExampleFactory {
@example @example
static registerAlertPromptExample() { static registerNormalCommandExample() {
ztoolkit.Prompt.register([ ztoolkit.Prompt.register([
{ {
name: "Template Test", name: "Normal Command Test",
label: "Plugin Template", label: "Plugin Template",
callback(prompt) { callback(prompt) {
ztoolkit.getGlobal("alert")("Command triggered!"); ztoolkit.getGlobal("alert")("Command triggered!");
@ -475,6 +475,202 @@ export class PromptExampleFactory {
}, },
]); ]);
} }
@example
static registerAnonymousCommandExample() {
ztoolkit.Prompt.register([{
id: "search",
callback: async (prompt) => {
// https://github.com/zotero/zotero/blob/7262465109c21919b56a7ab214f7c7a8e1e63909/chrome/content/zotero/integration/quickFormat.js#L589
function getItemDescription(item: Zotero.Item) {
var nodes = [];
var str = "";
var author, authorDate = "";
if (item.firstCreator) { author = authorDate = item.firstCreator; }
var date = item.getField("date", true, true) as string;
if (date && (date = date.substr(0, 4)) !== "0000") {
authorDate += " (" + parseInt(date) + ")";
}
authorDate = authorDate.trim();
if (authorDate) nodes.push(authorDate);
var publicationTitle = item.getField("publicationTitle", false, true);
if (publicationTitle) {
nodes.push(`<i>${publicationTitle}</i>`);
}
var volumeIssue = item.getField("volume");
var issue = item.getField("issue");
if (issue) volumeIssue += "(" + issue + ")";
if (volumeIssue) nodes.push(volumeIssue);
var publisherPlace = [], field;
if ((field = item.getField("publisher"))) publisherPlace.push(field);
if ((field = item.getField("place"))) publisherPlace.push(field);
if (publisherPlace.length) nodes.push(publisherPlace.join(": "));
var pages = item.getField("pages");
if (pages) nodes.push(pages);
if (!nodes.length) {
var url = item.getField("url");
if (url) nodes.push(url);
}
// compile everything together
for (var i = 0, n = nodes.length; i < n; i++) {
var node = nodes[i];
if (i != 0) str += ", ";
if (typeof node === "object") {
var label = document.createElement("label");
label.setAttribute("value", str);
label.setAttribute("crop", "end");
str = "";
} else {
str += node;
}
}
str.length && (str += ".")
return str
};
function filter(ids: number[]) {
ids = ids.filter(async (id) => {
const item = await Zotero.Items.getAsync(id)
return item.isRegularItem() && !item.isFeedItem
})
return ids
}
const text = prompt.inputNode.value;
prompt.showTip("Searching...")
const s = new Zotero.Search();
s.addCondition("quicksearch-titleCreatorYear", "contains", text);
s.addCondition("itemType", "isNot", "attachment");
let ids = await s.search();
// prompt.exit will remove current container element.
// @ts-ignore
prompt.exit();
const container = prompt.createCommandsContainer();
container.classList.add("suggestions");
ids = filter(ids)
console.log(ids.length)
if (ids.length == 0) {
const s = new Zotero.Search();
const operators = ['is', 'isNot', 'true', 'false', 'isInTheLast', 'isBefore', 'isAfter', 'contains', 'doesNotContain', 'beginsWith'];
let hasValidCondition = false
let joinMode: string = "all"
if (/\s*\|\|\s*/.test(text)) {
joinMode = "any"
}
text.split(/\s*(&&|\|\|)\s*/g).forEach((conditinString: string) => {
let conditions = conditinString.split(/\s+/g);
if (conditions.length == 3 && operators.indexOf(conditions[1]) != -1) {
hasValidCondition = true
s.addCondition("joinMode", joinMode);
s.addCondition(
conditions[0] as string,
conditions[1] as Zotero.Search.Operator,
conditions[2] as string
);
}
})
if (hasValidCondition) {
ids = await s.search();
}
}
ids = filter(ids)
console.log(ids.length)
if (ids.length > 0) {
ids.forEach((id: number) => {
const item = Zotero.Items.get(id)
const title = item.getField("title")
const ele = ztoolkit.UI.createElement(document, "div", {
namespace: "html",
classList: ["command"],
listeners: [
{
type: "mousemove",
listener: function () {
// @ts-ignore
prompt.selectItem(this)
}
},
{
type: "click",
listener: () => {
prompt.promptNode.style.display = "none"
Zotero_Tabs.select('zotero-pane');
ZoteroPane.selectItem(item.id);
}
}
],
styles: {
display: "flex",
flexDirection: "column",
justifyContent: "start",
},
children: [
{
tag: "span",
styles: {
fontWeight: "bold",
overflow: "hidden",
textOverflow: "ellipsis",
whiteSpace: "nowrap"
},
properties: {
innerText: title
}
},
{
tag: "span",
styles: {
overflow: "hidden",
textOverflow: "ellipsis",
whiteSpace: "nowrap"
},
properties: {
innerHTML: getItemDescription(item)
}
}
]
})
container.appendChild(ele)
})
} else {
// @ts-ignore
prompt.exit()
prompt.showTip("Not Found.")
}
}
}])
}
@example
static registerConditionalCommandExample() {
ztoolkit.Prompt.register([
{
name: "Conditional Command Test",
label: "Plugin Template",
// The when function is executed when Prompt UI is woken up by `Shift + P`, and this command does not display when false is returned.
when: () => {
const items = ZoteroPane.getSelectedItems();
return items.length > 0
},
callback(prompt) {
prompt.inputNode.placeholder = "Hello World!"
const items = ZoteroPane.getSelectedItems();
ztoolkit.getGlobal("alert")(
`You select ${items.length} items!\n\n${
items.map(
(item, index) => String(index+1) + ". " + item.getDisplayTitle()
).join("\n")}`
);
},
},
]);
}
} }
export class HelperExampleFactory { export class HelperExampleFactory {