jazzy.search.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. $(function(){
  2. var searchIndex = lunr(function() {
  3. this.ref('url');
  4. this.field('name');
  5. });
  6. var $typeahead = $('[data-typeahead]');
  7. var $form = $typeahead.parents('form');
  8. var searchURL = $form.attr('action');
  9. function displayTemplate(result) {
  10. return result.name;
  11. }
  12. function suggestionTemplate(result) {
  13. var t = '<div class="list-group-item clearfix">';
  14. t += '<span class="doc-name">' + result.name + '</span>';
  15. if (result.parent_name) {
  16. t += '<span class="doc-parent-name label">' + result.parent_name + '</span>';
  17. }
  18. t += '</div>';
  19. return t;
  20. }
  21. $typeahead.one('focus', function() {
  22. $form.addClass('loading');
  23. $.getJSON(searchURL).then(function(searchData) {
  24. $.each(searchData, function (url, doc) {
  25. searchIndex.add({url: url, name: doc.name});
  26. });
  27. $typeahead.typeahead(
  28. {
  29. highlight: true,
  30. minLength: 3
  31. },
  32. {
  33. limit: 10,
  34. display: displayTemplate,
  35. templates: { suggestion: suggestionTemplate },
  36. source: function(query, sync) {
  37. var results = searchIndex.search(query).map(function(result) {
  38. var doc = searchData[result.ref];
  39. doc.url = result.ref;
  40. return doc;
  41. });
  42. sync(results);
  43. }
  44. }
  45. );
  46. $form.removeClass('loading');
  47. $typeahead.trigger('focus');
  48. });
  49. });
  50. var baseURL = searchURL.slice(0, -"search.json".length);
  51. $typeahead.on('typeahead:select', function(e, result) {
  52. window.location = baseURL + result.url;
  53. });
  54. });