www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | README | LICENSE

commit 6f1833f9360a43346df5f2d883d617bfa9ec66c8
parent 4248e59eeb9babdada278d9d8e2e551c12fa7aba
Author: Dan Stillman <dstillman@zotero.org>
Date:   Fri, 13 Apr 2018 23:36:09 -0400

Remove items from trash and My Publications when removed via sync

Zotero.Item::fromJSON() wasn't properly accounting for missing 'deleted'
or 'inPublications' properties.

Diffstat:
Mchrome/content/zotero/xpcom/data/item.js | 16+++++++---------
Mtest/tests/itemTest.js | 48+++++++++++++++++++++++++++++++++++++++++++++---
2 files changed, 52 insertions(+), 12 deletions(-)

diff --git a/chrome/content/zotero/xpcom/data/item.js b/chrome/content/zotero/xpcom/data/item.js @@ -4224,15 +4224,6 @@ Zotero.Item.prototype.fromJSON = function (json) { this[field] = val; break; - case 'parentItem': - this.parentKey = val; - break; - - case 'deleted': - case 'inPublications': - this[field] = !!val; - break; - case 'creators': this.setCreators(json.creators); break; @@ -4320,6 +4311,13 @@ Zotero.Item.prototype.fromJSON = function (json) { let note = json.note; this.setNote(note !== undefined ? note : ""); } + + // Update boolean fields that might not be present in JSON + ['deleted', 'inPublications'].forEach(field => { + if (json[field] || this[field]) { + this[field] = !!json[field]; + } + }); } diff --git a/test/tests/itemTest.js b/test/tests/itemTest.js @@ -1616,20 +1616,62 @@ describe("Zotero.Item", function () { assert.strictEqual(item.getField('accessDate'), ''); }); - it("should remove child item from collection if 'collections' property not provided", function* () { + it("should remove item from collection if 'collections' property not provided", function* () { var collection = yield createDataObject('collection'); // Create standalone attachment in collection var attachment = yield importFileAttachment('test.png', { collections: [collection.id] }); var item = yield createDataObject('item', { collections: [collection.id] }); + assert.isTrue(collection.hasItem(attachment.id)); var json = attachment.toJSON(); json.path = 'storage:test2.png'; // Add to parent, which implicitly removes from collection json.parentItem = item.key; delete json.collections; - Zotero.debug(json); attachment.fromJSON(json); - yield attachment.save(); + yield attachment.saveTx(); + assert.isFalse(collection.hasItem(attachment.id)); + }); + + it("should remove child item from parent if 'parentKey' property not provided", async function () { + var item = await createDataObject('item'); + var note = await createDataObject('item', { itemType: 'note', parentKey: [item.key] }); + + var json = note.toJSON(); + delete json.parentItem; + + note.fromJSON(json); + await note.saveTx(); + + assert.lengthOf(item.getNotes(), 0); + }); + + it("should remove item from trash if 'deleted' property not provided", async function () { + var item = await createDataObject('item', { deleted: true }); + + assert.isTrue(item.deleted); + + var json = item.toJSON(); + delete json.deleted; + + item.fromJSON(json); + await item.saveTx(); + + assert.isFalse(item.deleted); + }); + + it("should remove item from My Publications if 'inPublications' property not provided", async function () { + var item = await createDataObject('item', { inPublications: true }); + + assert.isTrue(item.inPublications); + + var json = item.toJSON(); + delete json.inPublications; + + item.fromJSON(json); + await item.saveTx(); + + assert.isFalse(item.inPublications); }); it("should ignore unknown fields", function* () {