diff --git a/addon/chrome/content/treeView.html b/addon/chrome/content/treeView.html
index 44eebc2..1466a21 100644
--- a/addon/chrome/content/treeView.html
+++ b/addon/chrome/content/treeView.html
@@ -105,6 +105,7 @@
) {
return;
}
+ window._e = e;
const fromTreeView = getTreeView();
const toTreeView = getTreeView();
@@ -121,6 +122,18 @@
return;
}
+ window.parent.postMessage(
+ {
+ type: "moveNode",
+ fromID: parseInt(fromNode.itemData.id),
+ toID: toNode
+ ? parseInt(toNode.itemData.id)
+ : toItems[toItems.length - 1].itemData.id,
+ moveType: e.dropInsideItem ? "child" : "before",
+ },
+ "*"
+ );
+
const fromTopVisibleNode = getTopVisibleNode(fromTreeView);
const toTopVisibleNode = getTopVisibleNode(toTreeView);
@@ -191,18 +204,6 @@
? toItems.length
: findIndex(toItems, toNode.itemData.id);
- window.parent.postMessage(
- {
- type: "moveNode",
- fromID: parseInt(fromNode.itemData.id),
- toID: toNode
- ? parseInt(toNode.itemData.id)
- : toItems[toItems.length - 1].itemData.id,
- type: toNode ? "before" : "after",
- },
- "*"
- );
-
toItems.splice(toIndex, 0, fromNode.itemData);
moveChildren(fromNode, fromItems, toItems);
diff --git a/src/events.ts b/src/events.ts
index a5773ac..68bb825 100644
--- a/src/events.ts
+++ b/src/events.ts
@@ -420,7 +420,7 @@ class AddonEvents extends AddonBase {
/*
message.content = {
params: {
- fromID, toID, type: "before" | "after"
+ fromID, toID, moveType: "before" | "child"
}
}
*/
@@ -437,11 +437,12 @@ class AddonEvents extends AddonBase {
);
Zotero.debug(fromNode.model);
Zotero.debug(toNode.model);
+ Zotero.debug(message.content.params.moveType);
this._Addon.knowledge.moveHeaderLineInNote(
undefined,
fromNode,
toNode,
- message.content.params.type
+ message.content.params.moveType
);
this._Addon.views.buildOutline();
} else if (message.type === "closePreview") {
diff --git a/src/knowledge.ts b/src/knowledge.ts
index 436f8a5..7f13653 100644
--- a/src/knowledge.ts
+++ b/src/knowledge.ts
@@ -415,51 +415,54 @@ class Knowledge extends AddonBase {
return undefined;
}
- let currentLineRange = this.getNodeLineRangeInNoteTree(note, currentNode);
- let targetLineRange = this.getNodeLineRangeInNoteTree(note, targetNode);
let targetIndex = 0;
let targetRank = 1;
let lines = this.getLinesInNote(note);
if (as === "child") {
- targetIndex = targetLineRange[1];
+ targetIndex = targetNode.model.endIndex;
targetRank = targetNode.model.rank === 6 ? 6 : targetNode.model.rank + 1;
} else if (as === "before") {
- targetIndex = targetLineRange[0];
- targetRank = targetNode.model.rank;
+ targetIndex = targetNode.model.lineIndex;
+ targetRank =
+ targetNode.model.rank === 7
+ ? targetNode.parent.model.rank === 6
+ ? 6
+ : targetNode.parent.model.rank + 1
+ : targetNode.model.rank;
} else if (as === "after") {
- targetIndex = targetLineRange[1];
- targetRank = targetNode.model.rank;
- }
-
- if (targetIndex > currentLineRange[1]) {
- targetIndex -= currentLineRange[1] - currentLineRange[0];
+ targetIndex = targetNode.model.endIndex;
+ targetRank =
+ targetNode.model.rank === 7
+ ? targetNode.parent.model.rank === 6
+ ? 6
+ : targetNode.parent.model.rank + 1
+ : targetNode.model.rank;
}
let rankChange = targetRank - currentNode.model.rank;
+ Zotero.debug(`move to ${targetIndex}`);
+
let movedLines = lines.splice(
- currentLineRange[0],
- currentLineRange[1] - currentLineRange[0]
+ currentNode.model.lineIndex,
+ currentNode.model.endIndex - currentNode.model.lineIndex
);
- let headerStartReg = new RegExp("");
- let headerStopReg = new RegExp("");
- for (let i = 0; i < movedLines.length; i++) {
- let headerStart = movedLines[i].search(headerStartReg);
- if (headerStart === -1) {
- continue;
- }
- let lineRank = parseInt(movedLines[i][headerStart + 2]) + rankChange;
- if (lineRank > 6) {
- lineRank = 6;
- } else if (lineRank < 1) {
- lineRank = 1;
- }
- movedLines[i] = movedLines[i]
- .replace(headerStartReg, ``)
- .replace(headerStopReg, ``);
+ 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));
+ rank += rankChange;
+ if (rank > 6) {
+ rank = 6;
+ }
+ if (rank < 1) {
+ rank = 1;
+ }
+ return `${e.slice(0, -2)}${rank}>`;
+ });
}
let newLines = lines
.slice(0, targetIndex)
@@ -585,27 +588,6 @@ class Knowledge extends AddonBase {
});
}
- getNodeLineRangeInNoteTree(
- note: ZoteroItem,
- node: TreeModel.Node