ncbo/bioportal_web_ui

View on GitHub
public/browse/lib/lunr.js/example/app.js

Summary

Maintainability
A
2 hrs
Test Coverage
require([
  '/example/jquery.js',
  '/example/mustache.js',
  '../lunr.js',
  'text!templates/question_view.mustache',
  'text!templates/question_list.mustache',
  'text!example_data.json',
  'text!example_index.json'
], function (_, Mustache, lunr, questionView, questionList, data, indexDump) {

  var renderQuestionList = function (qs) {
    $("#question-list-container")
      .empty()
      .append(Mustache.to_html(questionList, {questions: qs}))
  }

  var renderQuestionView = function (question) {
    $("#question-view-container")
      .empty()
      .append(Mustache.to_html(questionView, question))
  }

  window.profile = function (term) {
    console.profile('search')
    idx.search(term)
    console.profileEnd('search')
  }

  window.search = function (term) {
    console.time('search')
    idx.search(term)
    console.timeEnd('search')
  }

  var indexDump = JSON.parse(indexDump)
  console.time('load')
  window.idx = lunr.Index.load(indexDump)
  console.timeEnd('load')

  var questions = JSON.parse(data).questions.map(function (raw) {
    return {
      id: raw.question_id,
      title: raw.title,
      body: raw.body,
      tags: raw.tags.join(' ')
    }
  })

  renderQuestionList(questions)
  renderQuestionView(questions[0])

  $('a.all').bind('click', function () {
    renderQuestionList(questions)
    $('input').val('')
  })

  var debounce = function (fn) {
    var timeout
    return function () {
      var args = Array.prototype.slice.call(arguments),
          ctx = this

      clearTimeout(timeout)
      timeout = setTimeout(function () {
        fn.apply(ctx, args)
      }, 100)
    }
  }

  $('input').bind('keyup', debounce(function () {
    if ($(this).val() < 2) return
    var query = $(this).val()
    var results = idx.search(query).map(function (result) {
      return questions.filter(function (q) { return q.id === parseInt(result.ref, 10) })[0]
    })

    renderQuestionList(results)
  }))

  $("#question-list-container").delegate('li', 'click', function () {
    var li = $(this)
    var id = li.data('question-id')

    renderQuestionView(questions.filter(function (question) {
      return (question.id == id)
    })[0])
  })

})