commit 9285b0cfb146fff6a7d1d1ca79a76892daf52559
parent e57658c5e239df566620dcdab0659ab56c97f3e5
Author: Will S <terribleangel@gmail.com>
Date: Tue, 6 Dec 2011 16:59:11 -0500
Allow delimited entry of multiple authors or tags
Diffstat:
3 files changed, 110 insertions(+), 6 deletions(-)
diff --git a/chrome/content/zotero/bindings/itembox.xml b/chrome/content/zotero/bindings/itembox.xml
@@ -1421,6 +1421,7 @@
if (creatorField=='lastName') {
t.setAttribute('fieldMode', elem.getAttribute('fieldMode'));
+ t.setAttribute('newlines','pasteintact');
}
if (Zotero.ItemFields.isMultiline(fieldName) || Zotero.ItemFields.isLong(fieldName)) {
@@ -1695,9 +1696,79 @@
var otherFields = this.getCreatorFields(row);
otherFields[creatorField] = value;
+ var lastName = otherFields.lastName;
- this.modifyCreator(creatorIndex, otherFields);
-
+ //Handle \n\r delimited entries
+ if (lastName.search('\r') > -1 || lastName.search('\n') > -1) {
+ lastName = lastName.replace('\r\n','\n');
+ lastName = lastName.replace('\r','\n');
+ var rawNameArray = lastName.split('\n');
+
+ //Save tab direction and add creator flags since they are reset in the
+ //process of adding multiple authors
+ var tabDirectionBuffer = this._tabDirection;
+ var addCreatorRowBuffer = this._addCreatorRow;
+ var tabIndexBuffer = this._lastTabIndex;
+ this._tabDirection = false;
+ this._addCreatorRow = false;
+
+ //Filter out bad names
+ var nameArray = new Array();
+ var counter = 0;
+ var tempName = '';
+ for each(tempName in rawNameArray) {
+ if (tempName.length > 0) {
+ //Put further error checking of tempName here
+ nameArray[counter] = tempName;
+ counter++;
+ }
+ }
+
+ //If not adding names at the end of the creator list, make new creator
+ //entries and then shift down existing creators.
+ var initNumCreators = this.item.numCreators();
+ var creatorsToShift = initNumCreators - creatorIndex;
+ if (creatorsToShift > 0) {
+ //Add extra creators
+ for (var i=0;i<nameArray.length;i++) {
+ this.modifyCreator(i+initNumCreators,otherFields);
+ }
+
+ //Shift existing creators
+ for (var i=initNumCreators-1; i>=creatorIndex; i--) {
+ var shiftedCreator = this.item.getCreator(i);
+ this.item.setCreator(nameArray.length+i,shiftedCreator.ref,shiftedCreator.creatorTypeID);
+ }
+ }
+
+ //Add the creators in lastNameArray one at a time
+ var tempFields=otherFields;
+ for each(tempName in nameArray) {
+ // Check for comma to determine creator name format
+ tempFields.fieldMode = (tempName.indexOf('\t') == -1) ? 1 : 0;
+ if (tempFields.fieldMode == 0) {
+ tempFields.lastName=tempName.split('\t')[0];
+ tempFields.firstName=tempName.split('\t')[1];
+ }
+ else {
+ tempFields.lastName=tempName;
+ }
+ this.modifyCreator(creatorIndex,tempFields);
+ creatorIndex++;
+ }
+ this._tabDirection = tabDirectionBuffer;
+ this._addCreatorRow = (creatorsToShift==0) ? addCreatorRowBuffer : false;
+ if (this._tabDirection == 1) {
+ this._lastTabIndex = parseInt(tabIndexBuffer,10) + 2*(nameArray.length-1);
+ if (tempFields.fieldMode == 0) {
+ this._lastTabIndex++;
+ }
+ }
+ }
+ else {
+ this.modifyCreator(creatorIndex, otherFields);
+ }
+
var val = this.item.getCreator(creatorIndex);
val = val ? val.ref[creatorField] : null;
diff --git a/chrome/content/zotero/bindings/tagsbox.xml b/chrome/content/zotero/bindings/tagsbox.xml
@@ -293,6 +293,7 @@
t.setAttribute('fieldname', fieldName);
t.setAttribute('ztabindex', tabindex);
t.setAttribute('flex', '1');
+ t.setAttribute('newlines','pasteintact');
// Add auto-complete
t.setAttribute('type', 'autocomplete');
@@ -481,8 +482,19 @@
var focusMode = 'tags';
var focusBox = tagsbox;
+ //Move at least one field even if no entry was added because of
+ //the way bookkeeping is done above
+ var fieldsToMove = 1;
+ //Check if id is an array and, if so, how many new entries
+ //were added at once
+ if (Object.prototype.toString.call(id) === '[object Array]') {
+ fieldsToMove = id.length;
+ }
+
if (this._tabDirection) {
- this._focusNextField(focusBox, this._lastTabIndex, this._tabDirection == -1);
+ for (var i = 0; i < fieldsToMove; i++) {
+ this._focusNextField(focusBox, this._lastTabIndex, this._tabDirection == -1);
+ }
}
]]>
</body>
diff --git a/chrome/content/zotero/xpcom/data/item.js b/chrome/content/zotero/xpcom/data/item.js
@@ -1593,7 +1593,7 @@ Zotero.Item.prototype.save = function() {
'libraryID',
'key'
];
- for each(field in updateFields) {
+ for each(var field in updateFields) {
if (this._changedPrimaryData && this._changedPrimaryData[field]) {
sql += field + '=?, ';
sqlValues.push(this.getField(field));
@@ -3478,6 +3478,16 @@ Zotero.Item.prototype.addTag = function(name, type) {
if (!this.id) {
throw ('Cannot add tag to unsaved item in Item.addTag()');
}
+
+ //Check for newlines or carriage returns used as delimiters
+ //in a series of tags added at once. Add each tag
+ //separately.
+ if (name.search('\r') > -1 || name.search('\n') > -1) {
+ name = name.replace('\r\n','\n');
+ name = name.replace('\r','\n');
+ var nameArray = name.split('\n');
+ return this.addTags(nameArray,type);
+ }
name = Zotero.Utilities.trim(name);
@@ -3541,10 +3551,21 @@ Zotero.Item.prototype.addTag = function(name, type) {
Zotero.Item.prototype.addTags = function (tags, type) {
Zotero.DB.beginTransaction();
try {
- for each(var tag in tags) {
- this.addTag(tag, type);
+ var tagIDarray = [];
+ var counter = 0;
+ var tempID = false;
+ for (var i = 0; i < tags.length; i++) {
+ tempID = this.addTag(tags[i], type);
+ if (tempID) {
+ tagIDarray[counter] = tempID;
+ counter++;
+ }
}
+
+ tagIDarray = (tagIDarray.length>0) ? tagIDarray : false;
+
Zotero.DB.commitTransaction();
+ return tagIDarray;
}
catch (e) {
Zotero.DB.rollbackTransaction();