www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | README | LICENSE

commit 7572eebcd1538dfa5ea33a42b8b7874d2081d4e3
parent 39e92bacb3a889ad0aecf816360c64c4f62a6f4c
Author: Dan Stillman <dstillman@zotero.org>
Date:   Wed,  7 Aug 2013 15:20:59 -0400

Offer autocomplete of same creator for different creator types

If a creator exists on an item but is a different creator type than the
one being entered, show creator in autocomplete list.

Diffstat:
Mchrome/content/zotero/bindings/itembox.xml | 52+++++++++++++++++++++++++++++++++++++++++++++++-----
Mcomponents/zotero-autocomplete.js | 14+++++++++-----
2 files changed, 56 insertions(+), 10 deletions(-)

diff --git a/chrome/content/zotero/bindings/itembox.xml b/chrome/content/zotero/bindings/itembox.xml @@ -1422,13 +1422,25 @@ || fieldName == 'creator') { t.setAttribute('type', 'autocomplete'); t.setAttribute('autocompletesearch', 'zotero'); - let params = { + + var params = { fieldName: fieldName, libraryID: this.item.libraryID }; if (field == 'creator') { params.fieldMode = parseInt(elem.getAttribute('fieldMode')); - params.itemID = itemID ? itemID : ''; + + // Include itemID and creatorTypeID so the autocomplete can + // avoid showing results for creators already set on the item + var row = Zotero.getAncestorByTagName(elem, 'row'); + var creatorTypeID = parseInt( + row.getElementsByClassName('creator-type-label')[0] + .getAttribute('typeid') + ); + if (itemID) { + params.itemID = itemID; + params.creatorTypeID = creatorTypeID; + } }; t.setAttribute( 'autocompletesearchparam', JSON.stringify(params) @@ -2163,6 +2175,25 @@ </body> </method> + + <method name="_updateAutoCompleteParams"> + <parameter name="row"/> + <parameter name="changedParams"/> + <body> + <![CDATA[ + var textboxes = row.getElementsByTagName('textbox'); + if (textboxes.length) { + var t = textboxes[0]; + var params = JSON.parse(t.getAttribute('autocompletesearchparam')); + for (var param in changedParams) { + params[param] = changedParams[param]; + } + t.setAttribute('autocompletesearchparam', JSON.stringify(params)); + } + ]]> + </body> + </method> + <!-- /* function modifyCreatorByID(index, creatorID, creatorTypeID) { @@ -2365,15 +2396,17 @@ oncommand="var typeBox = document.popupNode.localName == 'hbox' ? document.popupNode : document.popupNode.parentNode; var index = parseInt(typeBox.getAttribute('fieldname').split('-')[1]); + var itemBox = document.getBindingParent(this); + if (event.explicitOriginalTarget.className == 'zotero-creator-move') { var up = event.explicitOriginalTarget.id == 'zotero-creator-move-up'; - document.getBindingParent(this).moveCreator(index, up); + itemBox.moveCreator(index, up); return; } var typeID = event.explicitOriginalTarget.getAttribute('typeid'); var row = typeBox.parentNode; - var fields = document.getBindingParent(this).getCreatorFields(row); + var fields = itemBox.getCreatorFields(row); fields.creatorTypeID = typeID; typeBox.getElementsByTagName('label')[0].setAttribute( 'value', @@ -2382,7 +2415,16 @@ ) + ':' ); typeBox.setAttribute('typeid', typeID); - document.getBindingParent(this).modifyCreator(index, fields);"/> + + // If a creator textbox is already open, we need to + // change its autocomplete parameters so that it + // completes on a creator with a different creator type + var changedParams = { + creatorTypeID: typeID + }; + itemBox._updateAutoCompleteParams(row, changedParams); + + itemBox.modifyCreator(index, fields);"/> <menupopup id="zotero-field-transform-menu"> <menu label="&zotero.item.textTransform;"> <menupopup> diff --git a/components/zotero-autocomplete.js b/components/zotero-autocomplete.js @@ -140,23 +140,26 @@ ZoteroAutoComplete.prototype.startSearch = function(searchString, searchParams, } var fromSQL = " FROM creators NATURAL JOIN creatorData " - + "WHERE " + subField + " LIKE ?1 " + "AND fieldMode=?2"; + + "WHERE " + subField + " LIKE ? " + "AND fieldMode=?"; var sqlParams = [ searchString + '%', searchParams.fieldMode ? searchParams.fieldMode : 0 ]; if (searchParams.itemID) { fromSQL += " AND creatorID NOT IN (SELECT creatorID FROM " - + "itemCreators WHERE itemID=?3)"; + + "itemCreators WHERE itemID=?"; sqlParams.push(searchParams.itemID); + if (searchParams.creatorTypeID) { + fromSQL += " AND creatorTypeID=?"; + sqlParams.push(searchParams.creatorTypeID); + } + fromSQL += ")"; } if (typeof searchParams.libraryID != 'undefined') { if (searchParams.libraryID) { - fromSQL += " AND libraryID=?4"; + fromSQL += " AND libraryID=?"; sqlParams.push(searchParams.libraryID); } - // The db query code doesn't properly replace numbered - // parameters with "IS NULL" else { fromSQL += " AND libraryID IS NULL"; } @@ -170,6 +173,7 @@ ZoteroAutoComplete.prototype.startSearch = function(searchString, searchParams, sql = "SELECT * FROM (" + sql + " UNION SELECT DISTINCT " + subField + " AS val, creatorID || '-1' AS comment" + fromSQL + ") GROUP BY val"; + sqlParams = sqlParams.concat(sqlParams); } sql += " ORDER BY val";