- Throw an error if an invalid creator type for the item type is passed to Zotero.Item.setCreator()

- Cache some Zotero.CreatorTypes calls
This commit is contained in:
Dan Stillman 2011-08-02 05:59:38 +00:00
parent 1c560eb94c
commit e9f5643ecd
2 changed files with 36 additions and 4 deletions

View File

@ -164,21 +164,48 @@ Zotero.CreatorTypes = new function() {
var _primaryIDCache = {};
var _hasCreatorTypeCache = {};
var _creatorTypesByItemType = {};
var _isValidForItemType = {};
function getTypesForItemType(itemTypeID) {
if (_creatorTypesByItemType[itemTypeID]) {
return _creatorTypesByItemType[itemTypeID];
}
var sql = "SELECT creatorTypeID AS id, creatorType AS name "
+ "FROM itemTypeCreatorTypes NATURAL JOIN creatorTypes "
// DEBUG: sort needs to be on localized strings in itemPane.js
// (though still put primary field at top)
+ "WHERE itemTypeID=? ORDER BY primaryField=1 DESC, name";
return Zotero.DB.query(sql, itemTypeID);
var types = Zotero.DB.query(sql, itemTypeID);
if (!types) {
types = [];
}
_creatorTypesByItemType[itemTypeID] = types;
return _creatorTypesByItemType[itemTypeID];
}
function isValidForItemType(creatorTypeID, itemTypeID) {
var sql = "SELECT COUNT(*) FROM itemTypeCreatorTypes "
+ "WHERE itemTypeID=? AND creatorTypeID=?";
return !!Zotero.DB.valueQuery(sql, [itemTypeID, creatorTypeID]);
if (_isValidForItemType[itemTypeID] && typeof _isValidForItemType[itemTypeID][creatorTypeID] != 'undefined') {
return _isValidForItemType[itemTypeID][creatorTypeID];
}
var valid = false;
var types = this.getTypesForItemType(creatorTypeID, itemTypeID);
for each(var type in types) {
if (type.id == creatorTypeID) {
valid = true;
break;
}
}
if (!_isValidForItemType[itemTypeID]) {
_isValidForItemType[itemTypeID] = {};
}
_isValidForItemType[itemTypeID][creatorTypeID] = valid;
return valid;
}

View File

@ -1011,6 +1011,11 @@ Zotero.Item.prototype.setCreator = function(orderIndex, creator, creatorTypeIDOr
return false;
}
if (!Zotero.CreatorTypes.isValidForItemType(creatorTypeID, this.itemTypeID)) {
throw ("Invalid creator type for item type in Zotero.Item.setCreator() "
+ "(" + creatorTypeID + ", " + this.itemTypeID + ")");
}
this._creators[orderIndex] = {
ref: creator,
creatorTypeID: creatorTypeID