From 32ba7a551a80e0ac982a6c4d4e563ada1221adca Mon Sep 17 00:00:00 2001 From: Bogdan Abaev Date: Fri, 13 Sep 2024 10:25:34 -0700 Subject: [PATCH] apply quickSearch filter to trashed collections Fixes: #4686 --- chrome/content/zotero/itemTree.jsx | 2 +- .../content/zotero/xpcom/collectionTreeRow.js | 11 +++++++- test/tests/itemTreeTest.js | 25 ++++++++++++++++--- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/chrome/content/zotero/itemTree.jsx b/chrome/content/zotero/itemTree.jsx index c2526a0f69..afabef5669 100644 --- a/chrome/content/zotero/itemTree.jsx +++ b/chrome/content/zotero/itemTree.jsx @@ -229,7 +229,7 @@ var ItemTree = class ItemTree extends LibraryTree { // So that they are displayed among deleted items newSearchItems = newSearchItems .concat(await this.collectionTreeRow.getTrashedCollections()) - .concat(await Zotero.Searches.getDeleted(this.collectionTreeRow.ref.libraryID)); + .concat(await this.collectionTreeRow.getTrashedSearches()); } // TEMP: Hide annotations newSearchItems = newSearchItems.filter(item => !item.isAnnotation()); diff --git a/chrome/content/zotero/xpcom/collectionTreeRow.js b/chrome/content/zotero/xpcom/collectionTreeRow.js index 6d76d0003e..e5432628a2 100644 --- a/chrome/content/zotero/xpcom/collectionTreeRow.js +++ b/chrome/content/zotero/xpcom/collectionTreeRow.js @@ -271,6 +271,7 @@ Zotero.CollectionTreeRow.prototype.getChildren = function () { // Returns the list of deleted collections in the trash. // Subcollections of deleted collections are filtered out. +// Accounts for case-insensitive quickSearch. Zotero.CollectionTreeRow.prototype.getTrashedCollections = async function () { if (!this.isTrash()) { return []; @@ -281,7 +282,15 @@ Zotero.CollectionTreeRow.prototype.getTrashedCollections = async function () { for (let d of deleted) { deletedParents.add(d.key); } - return deleted.filter(d => !d.parentKey || !deletedParents.has(d.parentKey)); + return deleted.filter(d => d.getDisplayTitle().toLowerCase().includes(this.searchText.toLowerCase()) + && (!d.parentKey || !deletedParents.has(d.parentKey))); +}; + +// Returns the list of deleted searches in the trash. +// Accounts for case-insensitive quickSearch. +Zotero.CollectionTreeRow.prototype.getTrashedSearches = async function () { + let deleted = await Zotero.Searches.getDeleted(this.ref.libraryID); + return deleted.filter(d => d.getDisplayTitle().toLowerCase().includes(this.searchText.toLowerCase())); }; diff --git a/test/tests/itemTreeTest.js b/test/tests/itemTreeTest.js index ed7882d85f..4a148e357e 100644 --- a/test/tests/itemTreeTest.js +++ b/test/tests/itemTreeTest.js @@ -826,10 +826,11 @@ describe("Zotero.ItemTree", function() { }) for (let objectType of ['collection', 'search']) { - it(`should remove ${objectType} from trash on delete`, async function (){ + // eslint-disable-next-line no-loop-func + it(`should remove ${objectType} from trash on delete`, async function () { var o1 = await createDataObject(objectType, { deleted: true }); - var o2 = await createDataObject(objectType, { deleted: true }); - var o3 = await createDataObject(objectType, { deleted: true }); + var o2 = await createDataObject(objectType, { deleted: true }); + var o3 = await createDataObject(objectType, { deleted: true }); // Go to trash await selectTrash(win); @@ -842,7 +843,23 @@ describe("Zotero.ItemTree", function() { assert.isFalse(zp.itemsView.getRowIndexByID(o1.treeViewID)); assert.isFalse(zp.itemsView.getRowIndexByID(o2.treeViewID)); assert.isFalse(zp.itemsView.getRowIndexByID(o3.treeViewID)); - }) + }); + + // eslint-disable-next-line no-loop-func + it(`should apply quicksearch filter to deleted ${objectType} in trash`, async function () { + var matched = await createDataObject(objectType, { deleted: true }); + var excluded = await createDataObject(objectType, { deleted: true }); + + await selectTrash(win); + + let quickSearch = win.document.getElementById('zotero-tb-search-textbox'); + quickSearch.value = matched.getDisplayTitle(); + quickSearch.doCommand(); + + await itemsView._refreshPromise; + assert.isNumber(itemsView.getRowIndexByID(matched.treeViewID)); + assert.isFalse(itemsView.getRowIndexByID(excluded.treeViewID)); + }); } });