diff --git a/src/events.ts b/src/events.ts index f93d132..2dccb54 100644 --- a/src/events.ts +++ b/src/events.ts @@ -254,7 +254,7 @@ class AddonEvents extends AddonBase { message.content.editorInstance._knowledgeUIInitialized = false; - const noteItem = Zotero.Items.get( + const noteItem: ZoteroItem = Zotero.Items.get( message.content.editorInstance._item.id ); if (!noteItem.isNote()) { @@ -269,7 +269,7 @@ class AddonEvents extends AddonBase { message.content.editorInstance, "knowledge-start", isMainKnowledge ? "isMainKnowledge" : "notMainKnowledge", - isMainKnowledge ? "Edit the main Note in Workspace" : "Open Workspace", + isMainKnowledge ? "Edit the Main Note in Workspace" : "Open Workspace", "openWorkspace", "start" ); @@ -277,7 +277,7 @@ class AddonEvents extends AddonBase { message.content.editorInstance, "knowledge-addlink", "addToKnowledge", - "Add link of current note to the main note", + "Add Link of Current Note to Main Note", "addToKnowledge", "middle" ); @@ -309,6 +309,35 @@ class AddonEvents extends AddonBase { popup.remove(); }); }); + let topItem = noteItem.parentItem; + while (topItem && !topItem.isRegularItem()) { + topItem = topItem.parentItem; + } + if (topItem) { + const addCitationButton: Element = + await this._Addon.views.addEditorButton( + message.content.editorInstance, + "knowledge-addcitation", + "addCitation", + "Insert Note's Parent Citation", + "addCitation", + "middle" + ); + addCitationButton.addEventListener("click", async (e) => { + let format = Zotero.QuickCopy.getFormatFromURL( + Zotero.QuickCopy.lastActiveURL + ); + format = Zotero.QuickCopy.unserializeSetting(format); + const cite = Zotero.QuickCopy.getContentFromItems( + [topItem], + format, + null, + 0 + ); + this._Addon.knowledge.addLineToNote(noteItem, cite.html, 65535); + }); + } + await this._Addon.views.addEditorButton( message.content.editorInstance, "knowledge-end", @@ -594,7 +623,7 @@ class AddonEvents extends AddonBase { if (text.trim()) { if (this._Addon.knowledge.currentNodeID < 0) { // Add a new H1 - this._Addon.knowledge.addSubLineToNote( + this._Addon.knowledge.addLineToNote( undefined, `

${text}

`, -1 @@ -605,7 +634,7 @@ class AddonEvents extends AddonBase { undefined, this._Addon.knowledge.currentNodeID ); - this._Addon.knowledge.addSubLineToNote( + this._Addon.knowledge.addLineToNote( undefined, `${text}`, node.model.endIndex @@ -809,8 +838,14 @@ class AddonEvents extends AddonBase { if (link) { const note = (await this._Addon.knowledge.getNoteFromLink(link)).item; if (note && note.id) { - Zotero.debug(note); - ZoteroPane.openNoteWindow(note.id); + await this.onEditorEvent( + new EditorMessage("onNoteLink", { + params: { + item: note, + infoText: "OK", + }, + }) + ); return; } } @@ -830,18 +865,10 @@ class AddonEvents extends AddonBase { note.addTag(tag.tag, tag.type); } await note.saveTx(); - let libraryID = note.libraryID; - let library = Zotero.Libraries.get(libraryID); - let groupID: string; - if (library.libraryType === "user") { - groupID = "u"; - } else if (library.libraryType === "group") { - groupID = `${library.id}`; - } - let noteKey = note.key; + annotationItem.annotationComment = `${ annotationItem.annotationComment ? annotationItem.annotationComment : "" - }\nnote link: "zotero://note/${groupID}/${noteKey}/"`; + }\nnote link: "${this._Addon.knowledge.getNoteLink(note)}"`; await annotationItem.saveTx(); ZoteroPane.openNoteWindow(note.id); let t = 0; diff --git a/src/knowledge.ts b/src/knowledge.ts index 3b4f255..d8b7d53 100644 --- a/src/knowledge.ts +++ b/src/knowledge.ts @@ -261,7 +261,7 @@ class Knowledge extends AddonBase { ); } - private addLineToNote( + private async addLineToNote( note: ZoteroItem, text: string, lineIndex: number, @@ -272,6 +272,14 @@ class Knowledge extends AddonBase { return; } let noteLines = this.getLinesInNote(note); + if (lineIndex < 0) { + lineIndex = + this.getWorkspaceNote().id === note.id && this.currentLine >= 0 + ? this.currentLine + : noteLines.length; + } else if (lineIndex >= noteLines.length) { + lineIndex = noteLines.length; + } Zotero.debug( `insert to ${lineIndex}, it used to be ${noteLines[lineIndex]}` ); @@ -287,6 +295,7 @@ class Knowledge extends AddonBase { } noteLines.splice(lineIndex, 0, text); this.setLinesToNote(note, noteLines); + await this.scrollWithRefresh(lineIndex); } async addLinesToNote( @@ -300,7 +309,12 @@ class Knowledge extends AddonBase { } let noteLines = this.getLinesInNote(note); if (lineIndex < 0) { - lineIndex = 0; + lineIndex = + this.getWorkspaceNote().id === note.id && this.currentLine >= 0 + ? this.currentLine + : noteLines.length; + } else if (lineIndex >= noteLines.length) { + lineIndex = noteLines.length; } this.setLinesToNote( note, @@ -309,41 +323,6 @@ class Knowledge extends AddonBase { await this.scrollWithRefresh(lineIndex); } - async addSubLineToNote( - note: ZoteroItem, - text: string, - lineIndex: number = -1, - newLine: boolean = false - ) { - if (lineIndex < 0) { - lineIndex = - this.currentLine >= 0 - ? this.currentLine - : this.getLinesInNote(note).length; - } - // let parentNode = this.getLineParentInNote(note, lineIndex); - // if (!parentNode) { - // this.addLineToNote(note, text, lineIndex); - // return; - // } - // let nodes = this.getNoteTreeAsList(note); - // let i = 0; - // for (let node of nodes) { - // if (node.model.lineIndex === parentNode.model.lineIndex) { - // break; - // } - // i++; - // } - // // Get next header line index - // i++; - // if (i >= nodes.length) { - // i = nodes.length - 1; - // } - // Add to next line - this.addLineToNote(note, text, lineIndex, newLine); - await this.scrollWithRefresh(lineIndex); - } - addLinkToNote( targetNote: ZoteroItem, lineIndex: number, @@ -360,7 +339,7 @@ class Knowledge extends AddonBase { } const link = this.getNoteLink(linkedNote); const linkText = linkedNote.getNoteTitle().trim(); - this.addSubLineToNote( + this.addLineToNote( targetNote, `${ linkText ? linkText : `${link}` diff --git a/src/views.ts b/src/views.ts index 6e61883..730fac2 100644 --- a/src/views.ts +++ b/src/views.ts @@ -14,14 +14,15 @@ class AddonViews extends AddonBase { default: "chrome://Knowledge4Zotero/skin/favicon.png", }; this.editorIcon = { - addToKnowledge: ``, - notMainKnowledge: ``, - isMainKnowledge: ``, - openAttachment: ``, + addToKnowledge: ``, + addCitation: ``, + notMainKnowledge: ``, + isMainKnowledge: ``, + openAttachment: ``, addAnnotationNote: ``, - export: ``, - close: ``, - openWorkspaceCollectionView: ``, + export: ``, + close: ``, + openWorkspaceCollectionView: ``, }; this.currentOutline = OutlineType.treeView; this._initIframe = Zotero.Promise.defer();