commit ae6d560a66a4d8e8280b369b272446f0499cc014
parent 277ddc39f892dd4e8a6a7c5130d4fbfb54347f67
Author: Dan Stillman <dstillman@zotero.org>
Date: Fri, 11 Mar 2016 03:30:28 -0500
Fix Item::multiDiff()
Diffstat:
2 files changed, 49 insertions(+), 21 deletions(-)
diff --git 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);
-
- 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);
- }
+ let otherData = otherItems[i].toJSON();
+ let changeset = Zotero.DataObjectUtilities.diff(thisData, otherData, ignoreFields);
+
+ 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
@@ -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* () {