resolve: #2 treeview drap/drop
This commit is contained in:
parent
326101ed36
commit
b6d8acc2de
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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") {
|
||||
|
|
|
|||
|
|
@ -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("<h[1-6]>");
|
||||
let headerStopReg = new RegExp("</h[1-6]>");
|
||||
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, `<h${lineRank}>`)
|
||||
.replace(headerStopReg, `</h${lineRank}>`);
|
||||
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<object>
|
||||
): number[] {
|
||||
note = note || this.getWorkspaceNote();
|
||||
if (!note) {
|
||||
return;
|
||||
}
|
||||
let nodes = this.getNoteTreeAsList(note);
|
||||
let endIndex = node.model.endIndex;
|
||||
for (let i = 0; i < nodes.length; i++) {
|
||||
if (
|
||||
nodes[i].model.lineIndex >= node.model.lineIndex &&
|
||||
nodes[i].model.rank > node.model.rank
|
||||
) {
|
||||
endIndex = nodes[i].model.endIndex;
|
||||
}
|
||||
}
|
||||
return [node.model.lineIndex, endIndex];
|
||||
}
|
||||
|
||||
async exportNoteToFile(
|
||||
note: ZoteroItem,
|
||||
convertNoteLinks: boolean = true,
|
||||
|
|
|
|||
Loading…
Reference in New Issue