diff --git a/chrome/content/zotero/xpcom/data/item.js b/chrome/content/zotero/xpcom/data/item.js index 360b6bd66..cee972116 100644 --- a/chrome/content/zotero/xpcom/data/item.js +++ b/chrome/content/zotero/xpcom/data/item.js @@ -3623,27 +3623,23 @@ Zotero.Item.prototype.multiDiff = function (otherItems, ignoreFields) { var hasDiffs = false; for (let i = 0; i < otherItems.length; i++) { - let otherItem = otherItems[i]; - let diff = []; - let otherData = otherItem.toJSON(); - let numDiffs = this.ObjectsClass.diff(thisData, otherData, diff); + let otherData = otherItems[i].toJSON(); + let changeset = Zotero.DataObjectUtilities.diff(thisData, otherData, ignoreFields); - if (numDiffs) { - for (let field in diff[1]) { - if (ignoreFields && ignoreFields.indexOf(field) != -1) { - continue; - } - - var value = diff[1][field]; - - if (!alternatives[field]) { - hasDiffs = true; - alternatives[field] = [value]; - } - else if (alternatives[field].indexOf(value) == -1) { - hasDiffs = true; - alternatives[field].push(value); - } + for (let i = 0; i < changeset.length; i++) { + let change = changeset[i]; + + if (change.op == 'delete') { + continue; + } + + if (!alternatives[change.field]) { + hasDiffs = true; + alternatives[change.field] = [change.value]; + } + else if (alternatives[change.field].indexOf(change.value) == -1) { + hasDiffs = true; + alternatives[change.field].push(change.value); } } } diff --git a/test/tests/itemTest.js b/test/tests/itemTest.js index de3482905..1a05fcbd5 100644 --- a/test/tests/itemTest.js +++ b/test/tests/itemTest.js @@ -853,6 +853,38 @@ describe("Zotero.Item", function () { }) }) + + describe("#multiDiff", function () { + it("should return set of alternatives for differing fields in other items", function* () { + var type = 'item'; + + var dates = ['2016-03-08 17:44:45']; + var accessDates = ['2016-03-08T18:44:45Z']; + var urls = ['http://www.example.com', 'http://example.net']; + + var obj1 = createUnsavedDataObject(type); + obj1.setField('date', '2016-03-07 12:34:56'); // different in 1 and 3, not in 2 + obj1.setField('url', 'http://example.com'); // different in all three + obj1.setField('title', 'Test'); // only in 1 + + var obj2 = createUnsavedDataObject(type); + obj2.setField('url', urls[0]); + obj2.setField('accessDate', accessDates[0]); // only in 2 + + var obj3 = createUnsavedDataObject(type); + obj3.setField('date', dates[0]); + obj3.setField('url', urls[1]); + + var alternatives = obj1.multiDiff([obj2, obj3]); + + assert.sameMembers(Object.keys(alternatives), ['url', 'date', 'accessDate']); + assert.sameMembers(alternatives.url, urls); + assert.sameMembers(alternatives.date, dates); + assert.sameMembers(alternatives.accessDate, accessDates); + }); + }); + + describe("#clone()", function () { // TODO: Expand to other data it("should copy creators", function* () {