# All files search.js

0% Statements 0/87
0% Branches 0/49
0% Functions 0/11
0% Lines 0/77

Press n or j to go to the next uncovered block, b, p or k for the previous block.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137

     module.exports = function (list) {
      var item, text, columns, searchString, customSearch

      var prepare = {
        resetList: function () {
          list.i = 1
          list.templater.clear(list.list)
          customSearch = undefined
        },
        setOptions: function (args) {
          if (args.length == 2 && args[1] instanceof Array) {
            columns = args[1]
          } else if (args.length == 2 && typeof args[1] == 'function') {
            columns = undefined
            customSearch = args[1]
          } else if (args.length == 3) {
            columns = args[1]
            customSearch = args[2]
          } else {
            columns = undefined
          }
        },
        setColumns: function () {
          if (list.items.length === 0) return
          if (columns === undefined) {
            columns = list.searchColumns === undefined ? prepare.toArray(list.items[0].values()) : list.searchColumns
          }
        },
        setSearchString: function (s) {
          s = list.utils.toString(s).toLowerCase()
          s = s.replace(/[-[\]{}()*+?.,\\^$|#]/g, '\\$&') // Escape regular expression characters
          searchString = s
        },
        toArray: function (values) {
          var tmpColumn = []
          for (var name in values) {
            tmpColumn.push(name)
          }
          return tmpColumn
        },
      }
      var search = {
        list: function () {
          // Extract quoted phrases "word1 word2" from original searchString
          // searchString is converted to lowercase by List.js
          var words = [],
            phrase,
            ss = searchString
          while ((phrase = ss.match(/"([^"]+)"/)) !== null) {
            words.push(phrase[1])
            ss = ss.substring(0, phrase.index) + ss.substring(phrase.index + phrase[0].length)
          }
          // Get remaining space-separated words (if any)
          ss = ss.trim()
          if (ss.length) words = words.concat(ss.split(/\s+/))
          for (var k = 0, kl = list.items.length; k < kl; k++) {
            var item = list.items[k]
            item.found = false
            if (!words.length) continue
            for (var i = 0, il = words.length; i < il; i++) {
              var word_found = false
              for (var j = 0, jl = columns.length; j < jl; j++) {
                var values = item.values(),
                  column = columns[j]
                if (values.hasOwnProperty(column) && values[column] !== undefined && values[column] !== null) {
                  var text = typeof values[column] !== 'string' ? values[column].toString() : values[column]
                  if (text.toLowerCase().indexOf(words[i]) !== -1) {
                    // word found, so no need to check it against any other columns
                    word_found = true
                    break
                  }
                }
              }
              // this word not found? no need to check any other words, the item cannot match
              if (!word_found) break
            }
            item.found = word_found
          }
        },
        // Removed search.item() and search.values()
        reset: function () {
          list.reset.search()
          list.searched = false
        },
      }

      var searchMethod = function (str) {
        list.trigger('searchStart')

        prepare.resetList()
        prepare.setSearchString(str)
        prepare.setOptions(arguments) // str, cols|searchFunction, searchFunction
        prepare.setColumns()

        if (searchString === '') {
          search.reset()
        } else {
          list.searched = true
          if (customSearch) {
            customSearch(searchString, columns)
          } else {
            search.list()
          }
        }

        list.update()
        list.trigger('searchComplete')
        return list.visibleItems
      }

      list.handlers.searchStart = list.handlers.searchStart || []
      list.handlers.searchComplete = list.handlers.searchComplete || []

      list.utils.events.bind(
        list.utils.getByClass(list.listContainer, list.searchClass),
        'keyup',
        list.utils.events.debounce(function (e) {
          var target = e.target || e.srcElement, // IE have srcElement
            alreadyCleared = target.value === '' && !list.searched
          if (!alreadyCleared) {
            // If oninput already have resetted the list, do nothing
            searchMethod(target.value)
          }
        }, list.searchDelay)
      )

      // Used to detect click on HTML5 clear button
      list.utils.events.bind(list.utils.getByClass(list.listContainer, list.searchClass), 'input', function (e) {
        var target = e.target || e.srcElement
        if (target.value === '') {
          searchMethod('')
        }
      })

      return searchMethod
    }