From 5abbcd5351d9f1fe89c1b745b08a22d21ecd012f Mon Sep 17 00:00:00 2001 From: jlukic Date: Mon, 20 Apr 2015 15:30:44 -0400 Subject: [PATCH] Adds fuzzy search to dropdown --- src/definitions/modules/dropdown.js | 32 ++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/src/definitions/modules/dropdown.js b/src/definitions/modules/dropdown.js index ba3d6cce6..11754f4a3 100644 --- a/src/definitions/modules/dropdown.js +++ b/src/definitions/modules/dropdown.js @@ -485,7 +485,6 @@ $.fn.dropdown = function(parameters) { $results = $(), escapedTerm = module.escape.regExp(searchTerm), exactRegExp = new RegExp('^' + escapedTerm, 'igm'), - fullTextRegExp = new RegExp(escapedTerm, 'ig'), allItemsFiltered ; module.verbose('Searching for matching values'); @@ -503,7 +502,7 @@ $.fn.dropdown = function(parameters) { $results = $results.add($choice); return true; } - else if(settings.fullTextSearch && text.match(fullTextRegExp)) { + else if(settings.fullTextSearch && module.fuzzySearch(searchTerm, text)) { $results = $results.add($choice); return true; } @@ -515,7 +514,7 @@ $.fn.dropdown = function(parameters) { $results = $results.add($choice); return true; } - else if(settings.fullTextSearch && value.match(fullTextRegExp)) { + else if(settings.fullTextSearch && module.fuzzySearch(searchTerm, value)) { $results = $results.add($choice); return true; } @@ -543,6 +542,33 @@ $.fn.dropdown = function(parameters) { } }, + fuzzySearch: function(query, term) { + var + termLength = term.length, + queryLength = query.length + ; + query = query.toLowerCase(); + term = term.toLowerCase(); + if(queryLength > termLength) { + return false; + } + if(queryLength === termLength) { + return (query === term); + } + search: for (var characterIndex = 0, nextCharacterIndex = 0; characterIndex < queryLength; characterIndex++) { + var + queryCharacter = query.charCodeAt(characterIndex) + ; + while(nextCharacterIndex < termLength) { + if(term.charCodeAt(nextCharacterIndex++) === queryCharacter) { + continue search; + } + } + return false; + } + return true; + }, + filterActive: function() { if(settings.hideSelections) { $item.filter('.' + className.active)