From 971c57feddcb5aa60a24cdbe77f07feee618d39d Mon Sep 17 00:00:00 2001 From: abaevbog Date: Tue, 6 May 2025 23:00:22 -0700 Subject: [PATCH] Disable itemTree row drop between child rows (#5258) Fixes: #5257 --- chrome/content/zotero/itemTree.jsx | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/chrome/content/zotero/itemTree.jsx b/chrome/content/zotero/itemTree.jsx index f47cfe4d49..e9f369bbf5 100644 --- a/chrome/content/zotero/itemTree.jsx +++ b/chrome/content/zotero/itemTree.jsx @@ -2345,6 +2345,7 @@ var ItemTree = class ItemTree extends LibraryTree { // In library, allow children to be dragged out of parent else if (collectionTreeRow.isLibrary(true) || collectionTreeRow.isCollection()) { + let targetRow = row != -1 ? this.getRow(row) : null; for (let item of items) { // Don't allow drag if any top-level items if (item.isTopLevelItem()) { @@ -2365,24 +2366,17 @@ var ItemTree = class ItemTree extends LibraryTree { return false; } - // Don't allow children to be dragged within their own parents - var parentItemID = item.parentItemID; - var parentIndex = this._rowMap[parentItemID]; - if (row != -1 && this.getLevel(row) > 0) { - if (this.getRow(this.getParentIndex(row)).ref.id == parentItemID) { - return false; - } - } - // Including immediately after the parent - if (orient == 1) { - if (row == parentIndex) { - return false; - } - } - // And immediately before the next parent + // Can always drop into empty space + if (!targetRow) continue; + // Can only drop before or after a top-level item + if (!targetRow.ref.isTopLevelItem()) return false; + // Cannot drop between an opened container and the first child row + if (orient == 1 && targetRow.isOpen) return false; + // Cannot drop after the last child of a parent container if (orient == -1) { - var nextParentIndex = null; - for (var i = parentIndex + 1; i < this.rowCount; i++) { + let parentIndex = this._rowMap[item.parentItemID]; + let nextParentIndex = null; + for (let i = parentIndex + 1; i < this.rowCount; i++) { if (this.getLevel(i) == 0) { nextParentIndex = i; break;