71 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
$(function(){
 | 
						|
  var $typeahead = $('[data-typeahead]');
 | 
						|
  var $form = $typeahead.parents('form');
 | 
						|
  var searchURL = $form.attr('action');
 | 
						|
 | 
						|
  function displayTemplate(result) {
 | 
						|
    return result.name;
 | 
						|
  }
 | 
						|
 | 
						|
  function suggestionTemplate(result) {
 | 
						|
    var t = '<div class="list-group-item clearfix">';
 | 
						|
    t += '<span class="doc-name">' + result.name + '</span>';
 | 
						|
    if (result.parent_name) {
 | 
						|
     t += '<span class="doc-parent-name label">' + result.parent_name + '</span>';
 | 
						|
    }
 | 
						|
    t += '</div>';
 | 
						|
    return t;
 | 
						|
  }
 | 
						|
 | 
						|
  $typeahead.one('focus', function() {
 | 
						|
    $form.addClass('loading');
 | 
						|
 | 
						|
    $.getJSON(searchURL).then(function(searchData) {
 | 
						|
      const searchIndex = lunr(function() {
 | 
						|
        this.ref('url');
 | 
						|
        this.field('name');
 | 
						|
        this.field('abstract');
 | 
						|
        for (const [url, doc] of Object.entries(searchData)) {
 | 
						|
          this.add({url: url, name: doc.name, abstract: doc.abstract});
 | 
						|
        }
 | 
						|
      });
 | 
						|
 | 
						|
      $typeahead.typeahead(
 | 
						|
        {
 | 
						|
          highlight: true,
 | 
						|
          minLength: 3,
 | 
						|
          autoselect: true
 | 
						|
        },
 | 
						|
        {
 | 
						|
          limit: 10,
 | 
						|
          display: displayTemplate,
 | 
						|
          templates: { suggestion: suggestionTemplate },
 | 
						|
          source: function(query, sync) {
 | 
						|
            const lcSearch = query.toLowerCase();
 | 
						|
            const results = searchIndex.query(function(q) {
 | 
						|
                q.term(lcSearch, { boost: 100 });
 | 
						|
                q.term(lcSearch, {
 | 
						|
                  boost: 10,
 | 
						|
                  wildcard: lunr.Query.wildcard.TRAILING
 | 
						|
                });
 | 
						|
            }).map(function(result) {
 | 
						|
              var doc = searchData[result.ref];
 | 
						|
              doc.url = result.ref;
 | 
						|
              return doc;
 | 
						|
            });
 | 
						|
            sync(results);
 | 
						|
          }
 | 
						|
        }
 | 
						|
      );
 | 
						|
      $form.removeClass('loading');
 | 
						|
      $typeahead.trigger('focus');
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
  var baseURL = searchURL.slice(0, -"search.json".length);
 | 
						|
 | 
						|
  $typeahead.on('typeahead:select', function(e, result) {
 | 
						|
    window.location = baseURL + result.url;
 | 
						|
  });
 | 
						|
});
 |