commit 60b2e16746f49d7265022d194e561633c17ec743
parent 90603c33b44678a889bf605bd51e63bb5497a57c
Author: Dan Stillman <dstillman@zotero.org>
Date: Tue, 21 Feb 2017 00:38:00 -0500
Fix "Item collection [n] not found" error after deleting collection
Diffstat:
2 files changed, 31 insertions(+), 2 deletions(-)
diff --git a/chrome/content/zotero/xpcom/data/collection.js b/chrome/content/zotero/xpcom/data/collection.js
@@ -569,6 +569,7 @@ Zotero.Collection.prototype._eraseData = Zotero.Promise.coroutine(function* (env
var items = [];
var del = [];
+ var itemsToUpdate = [];
for(var i=0, len=descendents.length; i<len; i++) {
// Descendent collections
if (descendents[i].type == 'collection') {
@@ -587,6 +588,9 @@ Zotero.Collection.prototype._eraseData = Zotero.Promise.coroutine(function* (env
if (env.options.deleteItems) {
del.push(descendents[i].id);
}
+ else {
+ itemsToUpdate.push(descendents[i].id);
+ }
}
}
if (del.length) {
@@ -629,8 +633,16 @@ Zotero.Collection.prototype._eraseData = Zotero.Promise.coroutine(function* (env
yield Zotero.DB.queryAsync ('DELETE FROM collections WHERE collectionID IN '
+ '(' + placeholders + ')', collections);
- // TODO: Update member items
env.deletedObjectIDs = collections;
+
+ // Update collection cache for descendant items
+ if (!env.options.deleteItems) {
+ let deletedCollections = new Set(env.deletedObjectIDs);
+ itemsToUpdate.forEach(itemID => {
+ let item = Zotero.Items.get(itemID);
+ item._collections = item._collections.filter(c => !deletedCollections.has(c));
+ });
+ }
});
Zotero.Collection.prototype._finalizeErase = Zotero.Promise.coroutine(function* (env) {
diff --git a/test/tests/collectionTest.js b/test/tests/collectionTest.js
@@ -35,7 +35,24 @@ describe("Zotero.Collection", function() {
assert.isTrue((yield Zotero.Items.getAsync(item1.id)).deleted);
assert.isTrue((yield Zotero.Items.getAsync(item2.id)).deleted);
- })
+ });
+
+ it("should clear collection from item cache", function* () {
+ var collection = yield createDataObject('collection');
+ var item = yield createDataObject('item', { collections: [collection.id] });
+ assert.lengthOf(item.getCollections(), 1);
+ yield collection.eraseTx();
+ assert.lengthOf(item.getCollections(), 0);
+ });
+
+ it("should clear subcollection from descendent item cache", function* () {
+ var collection = yield createDataObject('collection');
+ var subcollection = yield createDataObject('collection', { parentID: collection.id });
+ var item = yield createDataObject('item', { collections: [subcollection.id] });
+ assert.lengthOf(item.getCollections(), 1);
+ yield collection.eraseTx();
+ assert.lengthOf(item.getCollections(), 0);
+ });
})
describe("#version", function () {