Don't mark parentKey as changed when set to false for an unsaved item

And return undefined for search objects
This commit is contained in:
Dan Stillman 2015-05-05 14:08:28 -04:00
parent b0f52a0f07
commit beb17436f8
3 changed files with 78 additions and 18 deletions

View file

@ -26,8 +26,10 @@
/**
* @property {String} (readOnly) objectType
* @property {String} (readOnly) libraryKey
* @property {String|null} parentKey Null if no parent
* @property {Integer|false|undefined} parentID False if no parent. Undefined if not applicable (e.g. search objects)
* @property {String|false|undefined} parentKey - False if no parent, or undefined if not
* applicable (e.g. search objects)
* @property {Integer|false|undefined} parentID - False if no parent, or undefined if not
* applicable (e.g. search objects)
*/
Zotero.DataObject = function () {
@ -73,7 +75,7 @@ Zotero.defineProperty(Zotero.DataObject.prototype, 'libraryKey', {
get: function() this._libraryID + "/" + this._key
});
Zotero.defineProperty(Zotero.DataObject.prototype, 'parentKey', {
get: function() this._parentKey,
get: function () this._getParentKey(),
set: function(v) this._setParentKey(v)
});
Zotero.defineProperty(Zotero.DataObject.prototype, 'parentID', {
@ -148,6 +150,9 @@ Zotero.DataObject.prototype._getParentID = function () {
return this._parentID;
}
if (!this._parentKey) {
if (this._objectType == 'search') {
return undefined;
}
return false;
}
return this._parentID = this.ObjectsClass.getIDFromLibraryAndKey(this._libraryID, this._parentKey);
@ -168,6 +173,14 @@ Zotero.DataObject.prototype._setParentID = function (id) {
);
}
Zotero.DataObject.prototype._getParentKey = function () {
if (this._objectType == 'search') {
return undefined;
}
return this._parentKey ? this._parentKey : false
}
/**
* Set the key of the parent object
*
@ -181,7 +194,7 @@ Zotero.DataObject.prototype._setParentKey = function(key) {
key = Zotero.DataObjectUtilities.checkKey(key) || false;
if (this._parentKey == key) {
if (key === this._parentKey || (!this._parentKey && !key)) {
return false;
}
this._markFieldChange('parentKey', this._parentKey);

View file

@ -24,7 +24,7 @@ describe("Zotero.Collection", function() {
});
})
describe("#parent", function () {
describe("#parentKey", function () {
it("should set parent collection for new collections", function* () {
var parentCol = new Zotero.Collection
parentCol.name = "Parent";
@ -66,6 +66,25 @@ describe("Zotero.Collection", function() {
assert.equal(col.parentKey, newParentKey);
});
it("should not mark collection as unchanged if set to existing value", function* () {
// Create initial parent collection
var parentCol = new Zotero.Collection
parentCol.name = "Parent";
var parentID = yield parentCol.save();
var {libraryID, key: parentKey} = Zotero.Collections.getLibraryAndKeyFromID(parentID);
// Create subcollection
var col = new Zotero.Collection
col.name = "Child";
col.parentKey = parentKey;
var id = yield col.save();
col = yield Zotero.Collections.getAsync(id);
// Set to existing parent
col.parentKey = parentKey;
assert.isFalse(col.hasChanged());
});
it("should not resave a collection with no parent if set to false", function* () {
var col = new Zotero.Collection
col.name = "Test";

View file

@ -80,19 +80,47 @@ describe("Zotero.Item", function () {
})
describe("#parentID", function () {
it("should create a child note", function () {
return Zotero.DB.executeTransaction(function* () {
var item = new Zotero.Item('book');
var parentItemID = yield item.save();
item = new Zotero.Item('note');
item.parentID = parentItemID;
var childItemID = yield item.save();
item = yield Zotero.Items.getAsync(childItemID);
assert.ok(item.parentID);
assert.equal(item.parentID, parentItemID);
}.bind(this));
it("should create a child note", function* () {
var item = new Zotero.Item('book');
var parentItemID = yield item.save();
item = new Zotero.Item('note');
item.parentID = parentItemID;
var childItemID = yield item.save();
item = yield Zotero.Items.getAsync(childItemID);
assert.ok(item.parentID);
assert.equal(item.parentID, parentItemID);
});
});
describe("#parentKey", function () {
it("should be false for an unsaved attachment", function () {
var item = new Zotero.Item('attachment');
assert.isFalse(item.parentKey);
});
it("should be false on an unsaved non-attachment item", function () {
var item = new Zotero.Item('book');
assert.isFalse(item.parentKey);
});
it("should not be marked as changed setting to false on an unsaved item", function () {
var item = new Zotero.Item('attachment');
item.attachmentLinkMode = 'linked_url';
item.parentKey = false;
assert.isUndefined(item._changed.parentKey);
});
it("should not mark item as changed if false and no existing parent", function* () {
var item = new Zotero.Item('attachment');
item.attachmentLinkMode = 'linked_url';
item.url = "https://www.zotero.org/";
var id = yield item.save();
item = yield Zotero.Items.getAsync(id);
item.parentKey = false;
assert.isFalse(item.hasChanged());
});
});