Don't mark an empty field set to an empty string as changed

And some tests
This commit is contained in:
Dan Stillman 2015-05-05 04:45:48 -04:00
parent 0cefa03827
commit 93a6a4ffdb
2 changed files with 47 additions and 5 deletions

View File

@ -789,7 +789,7 @@ Zotero.Item.prototype.setField = function(field, value, loadIn) {
return true; return true;
} }
if (value === "") { if (value === "" || value === null || value === false) {
value = false; value = false;
} }
@ -850,9 +850,8 @@ Zotero.Item.prototype.setField = function(field, value, loadIn) {
} }
// If existing value, make sure it's actually changing // If existing value, make sure it's actually changing
if ((typeof this._itemData[fieldID] == 'undefined' && value === false) if ((this._itemData[fieldID] === null && value === false)
|| (typeof this._itemData[fieldID] != 'undefined' || (this._itemData[fieldID] !== null && this._itemData[fieldID] === value)) {
&& this._itemData[fieldID] === value)) {
return false; return false;
} }
@ -1264,7 +1263,7 @@ Zotero.Item.prototype._saveData = Zotero.Promise.coroutine(function* (env) {
let value = this.getField(fieldID, true); let value = this.getField(fieldID, true);
// If field changed and is empty, mark row for deletion // If field changed and is empty, mark row for deletion
if (!value) { if (value === '') {
del.push(fieldID); del.push(fieldID);
continue; continue;
} }

View File

@ -19,6 +19,49 @@ describe("Zotero.Item", function () {
}); });
describe("#setField", function () { describe("#setField", function () {
it("should mark a field as changed", function () {
var item = new Zotero.Item('book');
item.setField('title', 'Foo');
assert.ok(item._changed.itemData[Zotero.ItemFields.getID('title')]);
assert.ok(item.hasChanged());
})
it("should clear an existing field set to a falsy value", function () {
var field = 'title';
var fieldID = Zotero.ItemFields.getID(field);
var item = new Zotero.Item('book');
item.setField(field, 'Foo');
id = yield item.save();
item = yield Zotero.Items.getAsync(id);
item.setField(field, "");
assert.ok(item._changed.itemData[fieldID]);
assert.ok(item.hasChanged());
yield item.reload();
assert.isFalse(item.hasChanged());
item.setField(field, false);
assert.ok(item._changed.itemData[fieldID]);
assert.ok(item.hasChanged());
yield item.reload();
assert.isFalse(item.hasChanged());
item.setField(field, null);
assert.ok(item._changed.itemData[fieldID]);
assert.ok(item.hasChanged());
yield item.save();
assert.isFalse(item.getField(fieldID));
})
it("should not mark an empty field set to an empty string as changed", function () {
var item = new Zotero.Item('book');
item.setField('url', '');
assert.isUndefined(item._changed.itemData);
})
it("should save version as object version", function* () { it("should save version as object version", function* () {
var item = new Zotero.Item('book'); var item = new Zotero.Item('book');
item.setField("version", 1); item.setField("version", 1);