diff --git a/addon/chrome/locale/en-US/addon.properties b/addon/chrome/locale/en-US/addon.properties index 849b53a..f3d7481 100644 --- a/addon/chrome/locale/en-US/addon.properties +++ b/addon/chrome/locale/en-US/addon.properties @@ -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 diff --git a/addon/chrome/locale/zh-CN/addon.properties b/addon/chrome/locale/zh-CN/addon.properties index dbd8d32..997a1b5 100644 --- a/addon/chrome/locale/zh-CN/addon.properties +++ b/addon/chrome/locale/zh-CN/addon.properties @@ -3,7 +3,8 @@ pref.title=BNotes menuItem.setMainNote=设为工作区主笔记 menuItem.exportNote=导出笔记 -menuEdit.templatePicker=插入模板到工作区笔记 +menuEdit.insertTemplate=插入模板到工作区笔记 +menuEdit.exportTemplate=导出模板... menuEdit.templateEditor=模板编辑器 menuTools.syncManager=同步管理器 diff --git a/src/addon.ts b/src/addon.ts index 7b78999..5777393 100644 --- a/src/addon.ts +++ b/src/addon.ts @@ -75,7 +75,7 @@ class Addon { templates: { name: string }[]; }; templatePicker: { - mode: "insert" | "create"; + mode: "insert" | "create" | "export"; data: Record; }; prompt?: Prompt; diff --git a/src/modules/export/exportWindow.ts b/src/modules/export/exportWindow.ts index 33f7567..95cfd9f 100644 --- a/src/modules/export/exportWindow.ts +++ b/src/modules/export/exportWindow.ts @@ -15,7 +15,10 @@ enum OPTIONS { "exportNote", } -export async function showExportNoteOptions(noteIds: number[]) { +export async function showExportNoteOptions( + noteIds: number[], + overwriteOptions: Record = {} +) { 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); + await addon.api.$export.exportNotes( + noteItems, + Object.assign(data as Record, overwriteOptions) + ); dataKeys.forEach((key) => { setPref(`export.${key}`, Boolean(data[key])); }); diff --git a/src/modules/menu.ts b/src/modules/menu.ts index d087dd1..ade5b23 100644 --- a/src/modules/menu.ts +++ b/src/modules/menu.ts @@ -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" diff --git a/src/modules/template/picker.ts b/src/modules/template/picker.ts index 893b027..aa9ce9f 100644 --- a/src/modules/template/picker.ts +++ b/src/modules/template/picker.ts @@ -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); +}