From a5a531421f2c46646c06be9547916f5336c946db Mon Sep 17 00:00:00 2001 From: xiangyu <3170102889@zju.edu.cn> Date: Sat, 30 Apr 2022 19:14:13 +0800 Subject: [PATCH] add: group note link support add: collection view open workspace --- addon/chrome/locale/en-US/overlay.dtd | 2 +- addon/chrome/locale/zh-CN/overlay.dtd | 2 + src/addon.ts | 2 +- src/events.ts | 5 ++- src/knowledge.ts | 37 +++++++++++++----- src/views.ts | 51 ++++++++++++++++++++----- src/zotero-protocol-handler.js | 55 +++++++++++++++++++-------- 7 files changed, 115 insertions(+), 39 deletions(-) diff --git a/addon/chrome/locale/en-US/overlay.dtd b/addon/chrome/locale/en-US/overlay.dtd index 9831159..f2d4bcf 100644 --- a/addon/chrome/locale/en-US/overlay.dtd +++ b/addon/chrome/locale/en-US/overlay.dtd @@ -1,4 +1,4 @@ - + diff --git a/addon/chrome/locale/zh-CN/overlay.dtd b/addon/chrome/locale/zh-CN/overlay.dtd index 1775113..6c8354b 100644 --- a/addon/chrome/locale/zh-CN/overlay.dtd +++ b/addon/chrome/locale/zh-CN/overlay.dtd @@ -1,3 +1,5 @@ + + diff --git a/src/addon.ts b/src/addon.ts index 6148bac..7313b52 100644 --- a/src/addon.ts +++ b/src/addon.ts @@ -13,7 +13,7 @@ class Knowledge4Zotero { this.events = new AddonEvents(this); this.views = new AddonViews(this); this.prefs = new AddonPrefs(this); - this.knowledge = new Knowledge + this.knowledge = new Knowledge(this); } } diff --git a/src/events.ts b/src/events.ts index 1f874a3..1446550 100644 --- a/src/events.ts +++ b/src/events.ts @@ -59,7 +59,6 @@ class AddonEvents extends AddonBase { public async onEditorEvent(message: EditorMessage) { Zotero.debug(`Knowledge4Zotero: onEditorEvent\n${message.type}`); - Zotero.debug(message.content); if (message.type === "addNoteInstance") { let mainKnowledgeID = parseInt( Zotero.Prefs.get("Knowledge4Zotero.mainKnowledgeID") @@ -156,7 +155,9 @@ class AddonEvents extends AddonBase { } } } else if (message.type === "onNoteLink") { - // TODO: Open note + if (!message.content.params.item) { + Zotero.debug(`Knowledge4Zotero: ${message.content.params.infoText}`); + } Zotero.debug( `Knowledge4Zotero: onNoteLink ${message.content.params.item.id}` ); diff --git a/src/knowledge.ts b/src/knowledge.ts index 69dceac..ad75a92 100644 --- a/src/knowledge.ts +++ b/src/knowledge.ts @@ -1,9 +1,12 @@ +import { AddonBase } from "./base"; + const TreeModel = require("./treemodel"); -class Knowledge { +class Knowledge extends AddonBase { currentLine: number; workspaceWindow: Window; - constructor() { + constructor(parent: Knowledge4Zotero) { + super(parent); this.currentLine = 0; } @@ -158,18 +161,34 @@ class Knowledge { this.addLineToNote(note, text, nodes[i].model.lineIndex); } - addLinkToNote(note: ZoteroItem, lineIndex: number, linkedNoteID: number) { - note = note || this.getWorkspaceNote(); - if (!note) { + addLinkToNote( + targetNote: ZoteroItem, + lineIndex: number, + linkedNoteID: number + ) { + targetNote = targetNote || this.getWorkspaceNote(); + if (!targetNote) { return; } + let linkedNote = Zotero.Items.get(linkedNoteID); + let libraryID = linkedNote.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 = linkedNote.key; this.addSubLineToNote( - note, - `${Zotero.Items.get( - linkedNoteID - ).getNoteTitle()}`, + targetNote, + `${linkedNote.getNoteTitle()}`, lineIndex ); + this._Addon.views.showProgressWindow( + "Knowledge", + "Link is added to workspace" + ); } moveHeaderLineInNote( diff --git a/src/views.ts b/src/views.ts index b018120..c9056db 100644 --- a/src/views.ts +++ b/src/views.ts @@ -15,6 +15,7 @@ class AddonViews extends AddonBase { addToKnowledge: ``, setMainKnowledge: ``, isMainKnowledge: ``, + openWorkspace: ``, }; } @@ -64,18 +65,48 @@ class AddonViews extends AddonBase { } addOpenWorkspaceButton() { - let lastButton = document.getElementById("zotero-tb-advanced-search"); - let button = document.createElement("toolbarbutton"); - button.setAttribute("id", "zotero-tb-knowledge-openwindow"); - button.setAttribute("tooltiptext", "Open Knowledge Workspace"); - button.addEventListener("click", (e) => { + // Left collection tree view button + const treeRow = document.createElement("html:div"); + treeRow.setAttribute("class", "row"); + treeRow.setAttribute( + "style", + "height: 22px; margin: 0 0 22px 0; padding: 0 6px 0 6px;" + ); + const span1 = document.createElement("span"); + span1.setAttribute("class", "cell label primary"); + const span2 = document.createElement("span"); + span2.setAttribute("class", "icon icon-twisty twisty"); + span2.innerHTML = this.editorIcon["openWorkspace"]; + const span3 = document.createElement("span"); + span3.setAttribute("class", "icon icon-bg cell-icon open"); + span3.setAttribute( + "style", + "background-image:url(chrome://Knowledge4Zotero/skin/favicon.png)" + ); + const span4 = document.createElement("span"); + span4.setAttribute("class", "cell-text"); + span4.setAttribute("style", "margin-left: 6px;"); + span4.innerHTML = "Knowledge"; + span1.append(span2, span3, span4); + treeRow.append(span1); + treeRow.addEventListener("click", (e) => { this._Addon.knowledge.openWorkspaceWindow(); }); - button.setAttribute( - "style", - "list-style-image: url('chrome://Knowledge4Zotero/skin/favicon@0.5x.png');" - ); - lastButton.after(button); + treeRow.addEventListener("mouseover", (e: XULEvent) => { + treeRow.setAttribute( + "style", + "height: 22px; margin: 0 0 22px 0; padding: 0 6px 0 6px; background-color: grey;" + ); + }); + treeRow.addEventListener("mouseleave", (e: XULEvent) => { + treeRow.setAttribute( + "style", + "height: 22px; margin: 0 0 22px 0; padding: 0 6px 0 6px;" + ); + }); + document + .getElementById("zotero-collections-tree-container") + .children[0].before(treeRow); } showProgressWindow( diff --git a/src/zotero-protocol-handler.js b/src/zotero-protocol-handler.js index 0cc6f31..9561e94 100644 --- a/src/zotero-protocol-handler.js +++ b/src/zotero-protocol-handler.js @@ -1280,24 +1280,47 @@ function ZoteroProtocolHandler() { noContent: true, doAction: async function (uri) { - let uriParams = uri.spec.substring("zotero://note/".length); - let noteID = parseInt(uriParams.split("?")[0]); - let extraParams = uriParams.split("?")[1]; - Zotero.debug(`${noteID} called with ${extraParams}`); - let item = Zotero.Items.get(noteID); - if (item && item.isNote()) { - Zotero.Knowledge4Zotero.events.onEditorEvent.bind( - Zotero.Knowledge4Zotero.events - )({ - type: "onNoteLink", - content: { - params: { - item: item, - extraParams: extraParams, - }, + let message = { + type: "onNoteLink", + content: { + params: { + item: false, + infoText: "", }, - }); + }, + }; + let [groupID, noteKey] = uri.spec + .substring("zotero://note/".length) + .split("/"); + + // User libraryID by defaultx + let libraryID = 1; + + if (groupID !== "u") { + // Not a user item + groupID = parseInt(groupID); + libraryID = Zotero.Groups.getLibraryIDFromGroupID(groupID); } + + if (!libraryID) { + message.content.params.infoText = + "Library does not exist or access denied."; + } else { + let item = await Zotero.Items.getByLibraryAndKeyAsync( + libraryID, + noteKey + ); + if (!item || !item.isNote()) { + message.content.params.infoText = + "Note does not exist or is not a note."; + } else { + message.content.params.item = item; + } + } + Zotero.debug(`Note link ${libraryID} : ${noteKey} called.`); + Zotero.Knowledge4Zotero.events.onEditorEvent.bind( + Zotero.Knowledge4Zotero.events + )(message); }, newChannel: function (uri) {