From fc4eb5308fb242152348d9d98bcc9301cae066fe Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Fri, 19 May 2017 08:30:00 -0400 Subject: [PATCH] Remove related-item relations when deleting item --- chrome/content/zotero/xpcom/data/item.js | 12 ++++++++++-- test/tests/itemTest.js | 20 ++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/chrome/content/zotero/xpcom/data/item.js b/chrome/content/zotero/xpcom/data/item.js index 4f0515242..92fbab47f 100644 --- a/chrome/content/zotero/xpcom/data/item.js +++ b/chrome/content/zotero/xpcom/data/item.js @@ -1167,6 +1167,8 @@ for (let name of ['deleted', 'inPublications']) { /** + * Relate this item to another. A separate save is required. + * * @param {Zotero.Item} * @return {Boolean} */ @@ -4038,8 +4040,14 @@ Zotero.Item.prototype._eraseData = Zotero.Promise.coroutine(function* (env) { } } - // Flag related items for notification - // TEMP: Do something with relations + // Remove related-item relations pointing to this item + var relatedItems = Zotero.Relations.getByPredicateAndObject( + 'item', Zotero.Relations.relatedItemPredicate, Zotero.URI.getItemURI(this) + ); + for (let relatedItem of relatedItems) { + relatedItem.removeRelatedItem(this); + relatedItem.save(); + } // Clear fulltext cache if (this.isAttachment()) { diff --git a/test/tests/itemTest.js b/test/tests/itemTest.js index 3c0462012..a90a9ac0b 100644 --- a/test/tests/itemTest.js +++ b/test/tests/itemTest.js @@ -1069,6 +1069,26 @@ describe("Zotero.Item", function () { }) + describe("#_eraseData()", function () { + it("should remove relations pointing to this item", function* () { + var item1 = yield createDataObject('item'); + var item2 = yield createDataObject('item'); + item1.addRelatedItem(item2); + yield item1.saveTx(); + item2.addRelatedItem(item1); + yield item2.saveTx(); + + yield item1.eraseTx(); + + assert.lengthOf(item2.relatedItems, 0); + yield assert.eventually.equal( + Zotero.DB.valueQueryAsync("SELECT COUNT(*) FROM itemRelations WHERE itemID=?", item2.id), + 0 + ); + }); + }); + + describe("#multiDiff", function () { it("should return set of alternatives for differing fields in other items", function* () { var type = 'item';