diff --git a/chrome/content/zotero/xpcom/data/items.js b/chrome/content/zotero/xpcom/data/items.js index 9344de6ef9..6be2665fb9 100644 --- a/chrome/content/zotero/xpcom/data/items.js +++ b/chrome/content/zotero/xpcom/data/items.js @@ -1747,22 +1747,29 @@ Zotero.Items = function() { /** - * Returns an array of items with children of selected parents removed + * Return an array of items with descendants of selected top-level items removed * + * Non-top-level items that aren't descendents of selected items are kept. + * + * @param {Zotero.Item[]} * @return {Zotero.Item[]} */ - this.keepParents = function (items) { - var parentItems = new Set( - items - .filter(item => item.isTopLevelItem()) - .map(item => item.id) + this.keepTopLevel = function (items) { + var topLevelItems = new Set( + items.filter(item => item.isTopLevelItem()) ); - return items.filter(item => { - var parentItemID = item.parentItemID; + return items.filter((item) => { + var topLevelItem = !item.isTopLevelItem() && item.topLevelItem; // Not a child item or not a child of one of the passed items - return !parentItemID || !parentItems.has(parentItemID); + return !topLevelItem || !topLevelItems.has(topLevelItem); }); - } + }; + + + this.keepParents = function (items) { + Zotero.debug("Zotero.Items.keepParents() is deprecated -- use Zotero.Items.keepTopLevel() instead"); + return this.keepTopLevel(items); + }; /* diff --git a/test/tests/itemsTest.js b/test/tests/itemsTest.js index 0b3ad4c251..4d3bd758a2 100644 --- a/test/tests/itemsTest.js +++ b/test/tests/itemsTest.js @@ -1234,6 +1234,17 @@ describe("Zotero.Items", function () { [item1, item4, item6].map(item => item.id) ); }); + + it("shouldn't return parent item more than once when two child items are selected", async function () { + var item1 = await createDataObject('item'); + var item2 = await createDataObject('item', { itemType: 'note', parentItemID: item1.id }); + var item3 = await createDataObject('item', { itemType: 'note', parentItemID: item1.id }); + var items = Zotero.Items.keepParents([item2, item3]); + assert.sameMembers( + items.map(item => item.id), + [item2.id, item3.id] + ) + }); }); describe("#_loadChildItems()", function () {