diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 2b45875b..96bd5427 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -26,7 +26,25 @@ function copyToClipboard(link) { } function autosuggest(){ - var bestResults = new Bloodhound({ + var topicResults = new Bloodhound({ + datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), + queryTokenizer: Bloodhound.tokenizers.whitespace, + remote: { + url: '/search.json?q=%QUERY', + wildcard: '%QUERY' + } + }); + + var itemResults = new Bloodhound({ + datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), + queryTokenizer: Bloodhound.tokenizers.whitespace, + remote: { + url: '/search.json?q=%QUERY', + wildcard: '%QUERY' + } + }); + + var personResults = new Bloodhound({ datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), queryTokenizer: Bloodhound.tokenizers.whitespace, remote: { @@ -52,42 +70,93 @@ function autosuggest(){ } } + function filter(suggestions, entityType){ + const result = suggestions && suggestions.filter((item) => item[0] === entityType) + return result + } + $('#topsearch').typeahead({ highlight: true, minLength: 3, autoselect: true - }, { + }, + { name: 'best-items', display: function (data) { return data[1].name }, - limit: 15, - source: bestResults, + limit: 5, + async: true, + source: function(query, sync, async) { + return topicResults.search(query, + function(suggestions) { + return sync(filter(suggestions, 'Topic')); + }, + function(suggestions) { + return async(filter(suggestions, 'Topic')); + }); + }, templates: { - empty: [ - '
', - 'No such things', - '
' - ].join('\n'), + header: '

Topic

', suggestion: function(option) { - let [entityType, data] = option; - switch(entityType) { - case 'Topic': - return '
' + data.name + '
'; - case 'Item': - var itemType = data.item_type_id; - if(data.creators) { - itemType += ' by ' + data.creators; - } - return '
' + data.name + '
' + itemType + '
'; - case 'Person': - return '
' + data.name + '
' + 'Person' + '
'; - default: - console.error('unhandled entity: ' + data.type); - } + let [entityType, data] = option; + return '
' + data.name + '
'; } } - }); + }, + { + name: 'best-items', + display: function (data) { + return data[1].name + }, + limit: 5, + async: true, + source: function(query, sync, async) { + return itemResults.search(query, + function(suggestions) { + return sync(filter(suggestions, 'Item')); + }, + function(suggestions) { + return async(filter(suggestions, 'Item')); + }); + }, + templates: { + header: '

Item

', + suggestion: function(option) { + let [entityType, data] = option; + var itemType = data.item_type_id; + if(data.creators) { + itemType += ' by ' + data.creators; + } + return '
' + data.name + '
' + itemType + '
'; + } + } + }, + { + name: 'best-items', + display: function (data) { + return data[1].name + }, + limit: 5, + async: true, + source: function(query, sync, async) { + return personResults.search(query, + function(suggestions) { + return sync(filter(suggestions, 'Person')); + }, + function(suggestions) { + return async(filter(suggestions, 'Person')); + }); + }, + templates: { + header: '

Person

', + suggestion: function(option) { + let [entityType, data] = option; + return '
' + data.name + '
' + 'Person' + '
'; + } + } + } + ); } document.addEventListener('DOMContentLoaded', function(){