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) {