diff --git a/addon/chrome/content/bubbleMap.html b/addon/chrome/content/bubbleMap.html index ac80ce5..359773e 100644 --- a/addon/chrome/content/bubbleMap.html +++ b/addon/chrome/content/bubbleMap.html @@ -72,7 +72,7 @@ // For details, see https://gojs.net/latest/intro/buildingObjects.html const $ = go.GraphObject.make; // for conciseness in defining templates - myDiagram = $( + const Diagram = $( go.Diagram, "myDiagramDiv", // must name or refer to the DIV HTML element { @@ -88,7 +88,7 @@ ); // dragging a node invalidates the Diagram.layout, causing a layout during the drag - myDiagram.toolManager.draggingTool.doMouseMove = function () { + Diagram.toolManager.draggingTool.doMouseMove = function () { go.DraggingTool.prototype.doMouseMove.call(this); if (this.isActive) { this.diagram.layout.invalidateLayout(); @@ -96,7 +96,7 @@ }; // define each Node's appearance - myDiagram.nodeTemplate = $( + Diagram.nodeTemplate = $( go.Node, "Vertical", // the whole node panel // define the node's outer shape, which will surround the TextBlock @@ -126,7 +126,7 @@ // the rest of this app is the same as samples/conceptMap.html // selected nodes show a button for adding children - myDiagram.nodeTemplate.selectionAdornmentTemplate = $( + Diagram.nodeTemplate.selectionAdornmentTemplate = $( go.Adornment, "Spot", $( @@ -153,7 +153,7 @@ ); // replace the default Link template in the linkTemplateMap - myDiagram.linkTemplate = $( + Diagram.linkTemplate = $( go.Link, // the whole link panel $( go.Shape, // the link shape diff --git a/addon/chrome/content/mindMap.html b/addon/chrome/content/mindMap.html index 5769f4c..ce0c834 100644 --- a/addon/chrome/content/mindMap.html +++ b/addon/chrome/content/mindMap.html @@ -26,7 +26,7 @@ // For details, see https://gojs.net/latest/intro/buildingObjects.html const $ = go.GraphObject.make; - myDiagram = $(go.Diagram, "myDiagramDiv", { + const Diagram = $(go.Diagram, "myDiagramDiv", { "commandHandler.copiesTree": true, "commandHandler.copiesParentKey": true, "commandHandler.deletesTree": true, @@ -39,7 +39,7 @@ }); // a node consists of some text with a line shape underneath - myDiagram.nodeTemplate = $( + Diagram.nodeTemplate = $( go.Node, "Vertical", { selectionObjectName: "TEXT" }, @@ -86,7 +86,7 @@ ); // selected nodes show a button for adding children - myDiagram.nodeTemplate.selectionAdornmentTemplate = $( + Diagram.nodeTemplate.selectionAdornmentTemplate = $( go.Adornment, "Spot", $( @@ -113,7 +113,7 @@ ); // a link is just a Bezier-curved line of the same color as the node to which it is connected - myDiagram.linkTemplate = $( + Diagram.linkTemplate = $( go.Link, { curve: go.Link.Bezier, @@ -131,9 +131,9 @@ ) ); - myDiagram.addDiagramListener("SelectionMoved", (e) => { - var rootX = myDiagram.findNodeForKey(0).location.x; - myDiagram.selection.each((node) => { + Diagram.addDiagramListener("SelectionMoved", (e) => { + var rootX = Diagram.findNodeForKey(0).location.x; + Diagram.selection.each((node) => { if (node.data.parent !== 0) return; // Only consider nodes connected to the root var nodeX = node.location.x; if (rootX < nodeX && node.data.dir !== "right") { diff --git a/src/note/noteUtils.ts b/src/note/noteUtils.ts index dec9c4f..613f934 100644 --- a/src/note/noteUtils.ts +++ b/src/note/noteUtils.ts @@ -363,14 +363,14 @@ class NoteUtils extends AddonBase { ); } - moveHeaderLineInNote( + async moveHeaderLineInNote( note: Zotero.Item, currentNode: TreeModel.Node, targetNode: TreeModel.Node, as: "child" | "before" | "after" ) { if (!note || targetNode.getPath().indexOf(currentNode) >= 0) { - return undefined; + return; } let targetIndex = 0; @@ -382,7 +382,7 @@ class NoteUtils extends AddonBase { targetIndex = targetNode.model.endIndex; targetRank = targetNode.model.rank === 6 ? 6 : targetNode.model.rank + 1; } else if (as === "before") { - targetIndex = targetNode.model.lineIndex; + targetIndex = targetNode.model.lineIndex - 1; targetRank = targetNode.model.rank === 7 ? targetNode.parent.model.rank === 6 @@ -401,17 +401,15 @@ class NoteUtils extends AddonBase { let rankChange = targetRank - currentNode.model.rank; - Zotero.debug(`move to ${targetIndex}`); - let movedLines = lines.splice( currentNode.model.lineIndex, - currentNode.model.endIndex - currentNode.model.lineIndex + currentNode.model.endIndex - currentNode.model.lineIndex + 1 ); - let headerReg = /<\/?h[1-6]>/g; + let headerReg = /<\/?h[1-6]/g; for (const i in movedLines) { movedLines[i] = movedLines[i].replace(headerReg, (e) => { - let rank = parseInt(e.slice(-2, -1)); + let rank = parseInt(e.slice(-1)); rank += rankChange; if (rank > 6) { rank = 6; @@ -419,13 +417,25 @@ class NoteUtils extends AddonBase { if (rank < 1) { rank = 1; } - return `${e.slice(0, -2)}${rank}>`; + return `${e.slice(0, -1)}${rank}`; }); } + + // If the moved lines is before the insert index + // the slice index -= lines length. + if (currentNode.model.endIndex <= targetIndex) { + targetIndex -= movedLines.length; + } + Zotero.debug(`move to ${targetIndex}`); + let newLines = lines - .slice(0, targetIndex) - .concat(movedLines, lines.slice(targetIndex)); - this.setLinesToNote(note, newLines); + .slice(0, targetIndex + 1) + .concat(movedLines, lines.slice(targetIndex + 1)); + console.log("new lines", newLines); + console.log("moved", movedLines); + console.log("insert after", lines[targetIndex]); + console.log("next line", lines[targetIndex + 1]); + await this.setLinesToNote(note, newLines); } getNoteTree(note: Zotero.Item): TreeModel.Node { @@ -502,6 +512,27 @@ class NoteUtils extends AddonBase { } } + async moveNode(fromID: number, toID: number, moveType: "before" | "child") { + const workspaceNote = this._Addon.WorkspaceWindow.getWorkspaceNote(); + let tree = this.getNoteTree(workspaceNote); + let fromNode = this.getNoteTreeNodeById(workspaceNote, fromID, tree); + let toNode = this._Addon.NoteUtils.getNoteTreeNodeById( + workspaceNote, + toID, + tree + ); + Zotero.debug(fromNode.model); + Zotero.debug(toNode.model); + Zotero.debug(moveType); + console.log(toNode.model, fromNode.model, moveType); + this.moveHeaderLineInNote( + this._Addon.WorkspaceWindow.getWorkspaceNote(), + fromNode, + toNode, + moveType + ); + } + async scrollWithRefresh(lineIndex: number) { await Zotero.Promise.delay(500); let editorInstance = diff --git a/src/workspace/workspaceWindow.ts b/src/workspace/workspaceWindow.ts index bd0982a..95a28ae 100644 --- a/src/workspace/workspaceWindow.ts +++ b/src/workspace/workspaceWindow.ts @@ -179,10 +179,10 @@ class WorkspaceWindow extends AddonBase { }) ); } else if (e.data.type === "moveNode") { - this._Addon.ZoteroEvents.onEditorEvent( - new EditorMessage("moveNode", { - params: e.data, - }) + await this._Addon.NoteUtils.moveNode( + e.data.fromID, + e.data.toID, + e.data.moveType ); } } diff --git a/src/zotero/events.ts b/src/zotero/events.ts index f3611f9..80e62aa 100644 --- a/src/zotero/events.ts +++ b/src/zotero/events.ts @@ -674,35 +674,6 @@ class ZoteroEvents extends AddonBase { // Scroll to line message.content.params.lineIndex ); - } else if (message.type === "moveNode") { - /* - message.content = { - params: { - fromID, toID, moveType: "before" | "child" - } - } - */ - const workspaceNote = this._Addon.WorkspaceWindow.getWorkspaceNote(); - let tree = this._Addon.NoteUtils.getNoteTree(workspaceNote); - let fromNode = this._Addon.NoteUtils.getNoteTreeNodeById( - workspaceNote, - message.content.params.fromID, - tree - ); - let toNode = this._Addon.NoteUtils.getNoteTreeNodeById( - workspaceNote, - message.content.params.toID, - tree - ); - Zotero.debug(fromNode.model); - Zotero.debug(toNode.model); - Zotero.debug(message.content.params.moveType); - this._Addon.NoteUtils.moveHeaderLineInNote( - mainNote, - fromNode, - toNode, - message.content.params.moveType - ); } else if (message.type === "closePreview") { /* message.content = {