add: export template

This commit is contained in:
windingwind 2023-05-05 14:24:09 +08:00
parent cbbfff999a
commit 94d7f40ea5
6 changed files with 49 additions and 7 deletions

View File

@ -3,7 +3,8 @@ pref.title=BNotes
menuItem.setMainNote=As Workspace Note
menuItem.exportNote=Export Note
menuEdit.templatePicker=Insert Template to Workspace Note
menuEdit.insertTemplate=Insert Template to Workspace Note
menuEdit.exportTemplate=Export Template...
menuEdit.templateEditor=Template Editor
menuTools.syncManager=Sync Manager

View File

@ -3,7 +3,8 @@ pref.title=BNotes
menuItem.setMainNote=设为工作区主笔记
menuItem.exportNote=导出笔记
menuEdit.templatePicker=插入模板到工作区笔记
menuEdit.insertTemplate=插入模板到工作区笔记
menuEdit.exportTemplate=导出模板...
menuEdit.templateEditor=模板编辑器
menuTools.syncManager=同步管理器

View File

@ -75,7 +75,7 @@ class Addon {
templates: { name: string }[];
};
templatePicker: {
mode: "insert" | "create";
mode: "insert" | "create" | "export";
data: Record<string, any>;
};
prompt?: Prompt;

View File

@ -15,7 +15,10 @@ enum OPTIONS {
"exportNote",
}
export async function showExportNoteOptions(noteIds: number[]) {
export async function showExportNoteOptions(
noteIds: number[],
overwriteOptions: Record<string, any> = {}
) {
const items = Zotero.Items.get(noteIds);
const noteItems: Zotero.Item[] = [];
items.forEach((item) => {
@ -109,7 +112,10 @@ export async function showExportNoteOptions(noteIds: number[]) {
await data.unloadLock?.promise;
if (data._lastButtonId === "confirm") {
addon.api.$export.exportNotes(noteItems, data as Record<string, boolean>);
await addon.api.$export.exportNotes(
noteItems,
Object.assign(data as Record<string, boolean>, overwriteOptions)
);
dataKeys.forEach((key) => {
setPref(`export.${key}`, Boolean(data[key]));
});

View File

@ -39,7 +39,7 @@ export function registerMenus() {
"menuEdit",
{
tag: "menuitem",
label: getString("menuEdit.templatePicker"),
label: getString("menuEdit.insertTemplate"),
icon: `chrome://${config.addonRef}/content/icons/favicon.png`,
commandListener: (ev) => {
addon.hooks.onShowTemplatePicker();
@ -48,6 +48,19 @@ export function registerMenus() {
"before",
menuEditAnchor
);
ztoolkit.Menu.register(
"menuEdit",
{
tag: "menuitem",
label: getString("menuEdit.exportTemplate"),
icon: `chrome://${config.addonRef}/content/icons/favicon.png`,
commandListener: (ev) => {
addon.hooks.onShowTemplatePicker("export");
},
},
"before",
menuEditAnchor
);
ztoolkit.Menu.register(
"menuEdit",
{
@ -79,6 +92,7 @@ export function registerMenus() {
},
});
// create note menu in library
const newNoteMenu = document
.querySelector("#zotero-tb-note-add")
?.querySelector("menupopup") as XUL.MenuPopup;
@ -102,6 +116,7 @@ export function registerMenus() {
addon.hooks.onCreateNoteFromTemplate("item", "library"),
});
// create note menu in reader side panel
ztoolkit.Menu.register(
document.querySelector(
"#context-pane-add-child-note-button-popup"

View File

@ -13,6 +13,7 @@ function showTemplatePicker(
mode: "create",
data?: { noteType?: "standalone" | "item"; parentItemId?: number }
): void;
function showTemplatePicker(mode: "export", data?: {}): void;
function showTemplatePicker(): void;
function showTemplatePicker(
mode: typeof addon.data.templatePicker.mode = "insert",
@ -61,12 +62,16 @@ function getTemplatePromptHandler(name: string) {
case "create":
await createTemplateNoteCallback(name);
break;
case "export":
await exportTemplateCallback(name);
break;
case "insert":
default:
await insertTemplateCallback(name);
break;
}
addon.data.templatePicker.mode = "insert";
addon.data.templatePicker.data = {};
};
}
@ -87,7 +92,6 @@ async function insertTemplateCallback(name: string) {
html,
addon.data.templatePicker.data.lineIndex
);
addon.data.templatePicker.data = {};
}
async function createTemplateNoteCallback(name: string) {
@ -118,3 +122,18 @@ async function createTemplateNoteCallback(name: string) {
}
await insertTemplateCallback(name);
}
async function exportTemplateCallback(name: string) {
// Create temp note
const noteItem = new Zotero.Item("note");
noteItem.libraryID = Zotero.Libraries.userLibraryID;
await noteItem.saveTx();
addon.data.templatePicker.data.noteId = noteItem.id;
await insertTemplateCallback(name);
// Export note
await addon.hooks.onShowExportNoteOptions([noteItem.id], {
setAutoSync: false,
});
// Delete temp note
await Zotero.Items.erase(noteItem.id);
}