Fix Item::multiDiff()

This commit is contained in:
Dan Stillman 2016-03-11 03:30:28 -05:00
parent 277ddc39f8
commit ae6d560a66
2 changed files with 48 additions and 20 deletions

View file

@ -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);
}
}
}

View file

@ -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* () {