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(){