From 9c436a331f6d76e30ba13aa6379f67e0f500966b Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Tue, 14 Aug 2007 21:24:24 +0000 Subject: [PATCH] Addresses #401, Add keyboard shortcuts - New creators can now be added via the keyboard with Shift-Enter - Fixed bug in data layer that caused modified creators to not be fully reloaded - Fixed error in Zotero.Items.add() example (ISBN field is capitalized) --- chrome/content/zotero/itemPane.js | 36 +++++++++++++++++++--- chrome/content/zotero/xpcom/data_access.js | 17 ++++++++-- 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/chrome/content/zotero/itemPane.js b/chrome/content/zotero/itemPane.js index 48508e756..599577905 100644 --- a/chrome/content/zotero/itemPane.js +++ b/chrome/content/zotero/itemPane.js @@ -37,6 +37,8 @@ var ZoteroItemPane = new function() var _itemBeingEdited; var _activeScrollbox; + var _addCreatorRow; + var _lastTabIndex; var _tabDirection; var _tabIndexMinCreators = 10; @@ -344,11 +346,16 @@ var ZoteroItemPane = new function() var creator = _itemBeingEdited.getCreator(i); addCreatorRow(creator['firstName'], creator['lastName'], creator['creatorTypeID'], creator['fieldMode']); } + + if (_addCreatorRow) { + addCreatorRow('', '', false, Zotero.Prefs.get('lastCreatorFieldMode'), true, true); + _addCreatorRow = false; + } } else { // Add default row - addCreatorRow('', '', false, Zotero.Prefs.get('lastCreatorFieldMode'), true, true); + addCreatorRow('', '', false, Zotero.Prefs.get('lastCreatorFieldMode'), true, false); } var focusMode = 'info'; @@ -1160,14 +1167,14 @@ var ZoteroItemPane = new function() switch (event.keyCode) { case event.DOM_VK_RETURN: + var fieldname = target.getAttribute('fieldname'); // Use shift-enter as the save action for the larger fields - if ((target.getAttribute('fieldname') == 'abstractNote' - || target.getAttribute('fieldname') == 'extra') + if ((fieldname == 'abstractNote' || fieldname == 'extra') && !event.shiftKey) { break; } - else if (target.getAttribute('fieldname')=='tag') + else if (fieldname == 'tag') { // If last tag row, create new one var row = target.parentNode.parentNode; @@ -1177,6 +1184,27 @@ var ZoteroItemPane = new function() var lastTag = true; } } + // Shift-enter adds new creator row + else if (fieldname.indexOf('creator-') == 0 && event.shiftKey) { + // Value hasn't changed + if (target.getAttribute('value') == target.value) { + Zotero.debug("Value hasn't changed"); + // If + button is disabled, just focus next creator row + if (Zotero.getAncestorByTagName(target, 'row').lastChild.lastChild.disabled) { + _focusNextField('info', _dynamicFields, _lastTabIndex, false); + } + else { + ZoteroItemPane.addCreatorRow('', '', false, Zotero.Prefs.get('lastCreatorFieldMode'), true, false); + } + } + // Value has changed + else { + _tabDirection = 1; + _addCreatorRow = true; + focused.blur(); + } + return false; + } focused.blur(); // Return focus to items pane diff --git a/chrome/content/zotero/xpcom/data_access.js b/chrome/content/zotero/xpcom/data_access.js index b0c7e99e0..0afc42a37 100644 --- a/chrome/content/zotero/xpcom/data_access.js +++ b/chrome/content/zotero/xpcom/data_access.js @@ -152,6 +152,12 @@ Zotero.Item.prototype.loadFromRow = function(row, reload) { this.setType(row['itemTypeID'], true); } + // This is a quick hack to reset the creators on reload -- + // there's probably a better place for this + this._creatorsLoaded = false; + this._changedCreators = new Zotero.Hash(); + this._creators = []; + for (var col in row){ // Only accept primary field data through loadFromRow() if (this.isPrimaryField(col)){ @@ -436,10 +442,15 @@ Zotero.Item.prototype.removeCreator = function(orderIndex){ } this._creators[orderIndex] = false; - // Go to length+1 so we clear the last one + // Shift creator orderIndexes down, going to length+1 so we clear the last one for (var i=orderIndex, max=this._creators.length+1; i