diff --git a/src/hooks.ts b/src/hooks.ts index 92ef502..60b169c 100644 --- a/src/hooks.ts +++ b/src/hooks.ts @@ -30,7 +30,7 @@ import { showSyncDiff } from "./modules/sync/diffWindow"; import { showSyncInfo } from "./modules/sync/infoWindow"; import { showSyncManager } from "./modules/sync/managerWindow"; import { showTemplateEditor } from "./modules/template/editorWindow"; -import { createNoteFromTemplate, createNoteFromMD } from "./modules/createNote"; +import { createNoteFromTemplate, createNoteFromMD, createNote } from "./modules/createNote"; import { createZToolkit } from "./utils/ztoolkit"; import { waitUtilAsync } from "./utils/wait"; import { initSyncList } from "./modules/sync/api"; @@ -256,6 +256,8 @@ const onShowTemplateEditor = showTemplateEditor; const onCreateNoteFromTemplate = createNoteFromTemplate; +const onCreateNote = createNote; + const onCreateNoteFromMD = createNoteFromMD; const onShowUserGuide = showUserGuide; @@ -285,6 +287,7 @@ export default { onShowTemplateEditor, onCreateNoteFromTemplate, onCreateNoteFromMD, + onCreateNote, restoreNoteTabs, onShowUserGuide, }; diff --git a/src/modules/createNote.ts b/src/modules/createNote.ts index 5fd77a7..a33f26a 100644 --- a/src/modules/createNote.ts +++ b/src/modules/createNote.ts @@ -1,7 +1,7 @@ import { getString } from "../utils/locale"; import { formatPath } from "../utils/str"; -export { createNoteFromTemplate, createNoteFromMD }; +export { createNoteFromTemplate, createNoteFromMD, createNote }; function getLibraryParentId() { return ZoteroPane.getSelectedItems().filter((item) => item.isRegularItem())[0] @@ -46,9 +46,8 @@ async function createNoteFromTemplate( } async function createNoteFromMD() { - const currentCollection = ZoteroPane.getSelectedCollection(); - if (!currentCollection) { - Zotero.getMainWindow().alert(getString("alert.notValidCollectionError")); + // Check if we can create a note + if (!(await createNote({ dryRun: true }))) { return; } @@ -67,7 +66,12 @@ async function createNoteFromMD() { } for (const filepath of filepaths) { - const noteItem = await addon.api.$import.fromMD(filepath, { + const noteItem = await createNote(); + if (!noteItem) { + continue; + } + await addon.api.$import.fromMD(filepath, { + noteId: noteItem.id, ignoreVersion: true, }); if (noteItem && syncNotes) { @@ -83,3 +87,44 @@ async function createNoteFromMD() { } } } + +async function createNote(): Promise; +async function createNote(options: { + dryRun: true; + noSave?: boolean; +}): Promise; +async function createNote(options: { + dryRun?: false; + noSave?: boolean; +}): Promise; +async function createNote( + options: { dryRun?: boolean; noSave?: boolean } = {}, +) { + let noteItem: Zotero.Item; + const ZoteroPane = Zotero.getActiveZoteroPane(); + + const cView = ZoteroPane.collectionsView; + if (!cView) { + Zotero.getMainWindow().alert(getString("alert.notValidCollectionError")); + return false; + } + const cRow = cView.selectedTreeRow; + if (["library", "group", "collection"].includes(cRow.type)) { + if (options.dryRun) { + return true; + } + noteItem = new Zotero.Item("note"); + noteItem.libraryID = ZoteroPane.getSelectedLibraryID(); + if (cRow.type === "collection") { + noteItem.addToCollection(cRow.ref.id); + } + } else { + Zotero.getMainWindow().alert(getString("alert.notValidCollectionError")); + return false; + } + + if (!options.noSave) { + await noteItem.saveTx(); + } + return noteItem; +} diff --git a/src/modules/import/markdown.ts b/src/modules/import/markdown.ts index 4ec7efd..1620a0a 100644 --- a/src/modules/import/markdown.ts +++ b/src/modules/import/markdown.ts @@ -41,11 +41,13 @@ export async function fromMD( }; if (!noteItem) { - noteItem = new Zotero.Item("note"); - noteItem.libraryID = ZoteroPane.getSelectedLibraryID(); - if (ZoteroPane.getCollectionTreeRow()?.isCollection()) { - noteItem.addToCollection(ZoteroPane.getCollectionTreeRow()?.ref.id); + const _noteItem = await addon.hooks.onCreateNote({ + noSave: true, + }); + if (!_noteItem) { + return; } + noteItem = _noteItem; await noteItem.saveTx({ notifierData: { autoSyncDelay: Zotero.Notes.AUTO_SYNC_DELAY, diff --git a/src/modules/template/picker.ts b/src/modules/template/picker.ts index 35299c5..06d1e08 100644 --- a/src/modules/template/picker.ts +++ b/src/modules/template/picker.ts @@ -80,17 +80,11 @@ async function createTemplateNoteCallback(name: string) { ZoteroPane.getSelectedItems(true); switch (addon.data.template.picker.data.noteType) { case "standalone": { - const currentCollection = ZoteroPane.getSelectedCollection(); - if (!currentCollection) { - Zotero.getMainWindow().alert( - getString("alert.notValidCollectionError"), - ); + const noteItem = await addon.hooks.onCreateNote(); + if (!noteItem) { return; } - const noteID = await ZoteroPane.newNote(); - const noteItem = Zotero.Items.get(noteID); - await noteItem.saveTx(); - addon.data.template.picker.data.noteId = noteID; + addon.data.template.picker.data.noteId = noteItem.id; break; } case "item": {