From 71404137eccff9b37d838e11ec6d5ce9a7faffd1 Mon Sep 17 00:00:00 2001 From: xiangyu <3170102889@zju.edu.cn> Date: Mon, 2 May 2022 01:57:30 +0800 Subject: [PATCH] add: outline drag&drop --- src/events.ts | 55 ++++++++++++++++++++++++++++++++++++++++++++++++ src/knowledge.ts | 12 ++++++----- src/views.ts | 9 ++++---- 3 files changed, 67 insertions(+), 9 deletions(-) diff --git a/src/events.ts b/src/events.ts index 6508af6..54db8ae 100644 --- a/src/events.ts +++ b/src/events.ts @@ -1,8 +1,22 @@ import { AddonBase, EditorMessage } from "./base"; class AddonEvents extends AddonBase { + notifierCallback: object; constructor(parent: Knowledge4Zotero) { super(parent); + this.notifierCallback = { + notify: async ( + event: string, + type: string, + ids: Array, + extraData: object + ) => { + if (event == "modify") { + Zotero.debug("Knowledge4Zotero: main knowledge midified."); + this._Addon.views.buildOutline(); + } + }, + }; } public async onInit() { @@ -10,6 +24,19 @@ class AddonEvents extends AddonBase { await Zotero.uiReadyPromise; this._Addon.views.addOpenWorkspaceButton(); this.addEditorInstanceListener(); + // Register the callback in Zotero as an item observer + let notifierID = Zotero.Notifier.registerObserver(this.notifierCallback, [ + "item", + ]); + + // Unregister callback when the window closes (important to avoid a memory leak) + window.addEventListener( + "unload", + function (e) { + Zotero.Notifier.unregisterObserver(notifierID); + }, + false + ); this.resetState(); } @@ -211,6 +238,34 @@ class AddonEvents extends AddonBase { } } } + } else if (message.type === "moveOutlineTitle") { + /* + message.content = { + params: { + fromID, toID, type: "before" | "after" + } + } + */ + let tree = this._Addon.knowledge.getNoteTree(); + let fromNode = this._Addon.knowledge.getNoteTreeNodeById( + undefined, + message.content.params.fromID, + tree + ); + let toNode = this._Addon.knowledge.getNoteTreeNodeById( + undefined, + message.content.params.toID, + tree + ); + Zotero.debug(fromNode.model); + Zotero.debug(toNode.model); + this._Addon.knowledge.moveHeaderLineInNote( + undefined, + fromNode, + toNode, + message.content.params.type + ); + this._Addon.views.buildOutline(); } else if (message.type === "closePreview") { /* message.content = { diff --git a/src/knowledge.ts b/src/knowledge.ts index db25a0a..74d71bb 100644 --- a/src/knowledge.ts +++ b/src/knowledge.ts @@ -4,6 +4,7 @@ const TreeModel = require("./treemodel"); class Knowledge extends AddonBase { currentLine: number; + currentVersion: number; workspaceWindow: Window; constructor(parent: Knowledge4Zotero) { super(parent); @@ -35,7 +36,7 @@ class Knowledge extends AddonBase { this.workspaceWindow = win; await this.waitWorkspaceReady(); this.setWorkspaceNote("main"); - this._Addon.views.buildOutline(this.getWorkspaceNote()); + this._Addon.views.buildOutline(); } } @@ -117,7 +118,7 @@ class Knowledge extends AddonBase { let containerIndex = noteText.search(/data-schema-version="8">/g); if (containerIndex != -1) { noteText = noteText.substring( - containerIndex + '
'.length, + containerIndex + 'data-schema-version="8">'.length, noteText.length - "
".length ); } @@ -296,7 +297,7 @@ class Knowledge extends AddonBase { this.setLinesToNote(note, newLines); } - getNoteTree(note: ZoteroItem): TreeModel.Node { + getNoteTree(note: ZoteroItem = undefined): TreeModel.Node { // See http://jnuno.com/tree-model-js note = note || this.getWorkspaceNote(); if (!note) { @@ -444,6 +445,8 @@ class Knowledge extends AddonBase { if (convertNoteLinks) { let item: ZoteroItem = new Zotero.Item("note"); + item.setNote(note.getNote()); + item.saveTx(); let noteLines = this.getLinesInNote(note); let newLines = []; for (let i in noteLines) { @@ -472,8 +475,7 @@ class Knowledge extends AddonBase { linkIndex = noteLines[i].search(/zotero:\/\/note\//g); } } - item.setNote(`
${newLines.join("\n")}
`); - item.saveTx(); + this.setLinesToNote(item, newLines); exporter.items = [item]; await exporter.save(); await Zotero.Items.erase(item.id); diff --git a/src/views.ts b/src/views.ts index fba0910..3503b58 100644 --- a/src/views.ts +++ b/src/views.ts @@ -296,14 +296,15 @@ class AddonViews extends AddonBase { toNode === null || isDropInsideItem ? toItems.length : this.findIndex(toItems, toNode.itemData.id); - Zotero.debug(fromNode.itemData); - Zotero.debug(toItems[toIndex]); this._Addon.events.onEditorEvent( new EditorMessage("moveOutlineTitle", { params: { - fromID: fromNode.itemData.id, - toID: toNode ? toNode.itemData.id : -1, + fromID: parseInt(fromNode.itemData.id), + toID: toNode + ? parseInt(toNode.itemData.id) + : toItems[toItems.length - 1].itemData.id, + type: toNode ? "before" : "after", }, }) );