From db35f55c9692b08d0f4ea726d5b483b066670765 Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Thu, 17 Feb 2022 01:42:11 -0500 Subject: [PATCH] Limit autocomplete in Advanced Search to specific creator types For `author`, `bookAuthor`, and `editor` conditions added in #2253 --- chrome/content/zotero/bindings/zoterosearch.xml | 10 +++++++--- components/zotero-autocomplete.js | 15 +++++++++++++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/chrome/content/zotero/bindings/zoterosearch.xml b/chrome/content/zotero/bindings/zoterosearch.xml index 439523b4c0..3e23e64287 100644 --- a/chrome/content/zotero/bindings/zoterosearch.xml +++ b/chrome/content/zotero/bindings/zoterosearch.xml @@ -989,7 +989,6 @@ break; default: - var textbox = document.getAnonymousNodes(this)[0]; textbox.setAttribute('type', 'autocomplete'); textbox.setAttribute('autocompletesearch', 'zotero'); @@ -999,8 +998,13 @@ var autocompleteParams = { fieldName: condition }; - if (condition == 'creator') { - autocompleteParams.fieldMode = 2; + switch (condition) { + case 'creator': + case 'author': + case 'bookAuthor': + case 'editor': + autocompleteParams.fieldMode = 2; + break; } textbox.setAttribute( 'autocompletesearchparam', diff --git a/components/zotero-autocomplete.js b/components/zotero-autocomplete.js index f0ee9b9e69..1fea263415 100644 --- a/components/zotero-autocomplete.js +++ b/components/zotero-autocomplete.js @@ -87,6 +87,9 @@ ZoteroAutoComplete.prototype.startSearch = Zotero.Promise.coroutine(function* (s break; case 'creator': + case 'author': + case 'bookAuthor': + case 'editor': // Valid fieldMode values: // 0 == search two-field creators // 1 == search single-field creators @@ -95,15 +98,23 @@ ZoteroAutoComplete.prototype.startSearch = Zotero.Promise.coroutine(function* (s var sql = "SELECT DISTINCT CASE fieldMode WHEN 1 THEN lastName " + "WHEN 0 THEN firstName || ' ' || lastName END AS val, NULL AS id " + "FROM creators "; + if (fieldName != 'creator' || searchParams.libraryID) { + sql += "JOIN itemCreators USING (creatorID) "; + } if (searchParams.libraryID) { - sql += "JOIN itemCreators USING (creatorID) JOIN items USING (itemID) "; + sql += "JOIN items USING (itemID) "; } sql += "WHERE CASE fieldMode " + "WHEN 1 THEN lastName LIKE ?1 " + "WHEN 0 THEN (firstName || ' ' || lastName LIKE ?1) OR (lastName LIKE ?1) END "; var sqlParams = [searchString + '%']; + // Limit results to specific creator type + if (fieldName != 'creator') { + sql += "AND creatorTypeID=? "; + sqlParams.push(Zotero.CreatorTypes.getID(fieldName)); + } if (searchParams.libraryID) { - sql += ` AND libraryID=?${sqlParams.length + 1}`; + sql += ` AND libraryID=? `; sqlParams.push(searchParams.libraryID); } sql += "ORDER BY val";