Skip to content

Commit

Permalink
Search works across multiple fields, hooray!
Browse files Browse the repository at this point in the history
  • Loading branch information
arc12012 committed Apr 6, 2017
1 parent 8e8baf3 commit 523a88e
Showing 1 changed file with 89 additions and 18 deletions.
107 changes: 89 additions & 18 deletions WebContent/html/webpages/adminDeviceSettings.jsp
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,9 @@ var availabilities = new Array;
var searchbar = document.getElementsByName('searchBar');
searchbar[0].onkeyup = refresh;
function refresh() {
populateDevices(fuzzyFilter(devices));
populateDevices(fuzzyFilter(makeDeviceArray()));
//adds event listeners to all table records
$("tr.entry").click(modifyModal);
}
//Populate locations into table!
Expand Down Expand Up @@ -296,31 +298,100 @@ function populateDevices(deviceArray){
function fuzzyFilter(deviceArray)
{
var searchText = document.getElementsByName('searchBar')[0].value;
////// First pass: filter by device name
var options = {
pre: '<b>',
post: '</b>',
pre: "<span style='color: darkmagenta; font-size: 115%'><b>",
post: '</b></span>',
extract: function(arg) {return arg.name;}
}
var fuzzyResults = fuzzy.filter(searchText, deviceArray, options);
var nameFilterResults = fuzzy.filter(searchText, deviceArray, options);
// replace releveant field with bolded string
for (var i = nameFilterResults.length - 1; i >= 0; i--) {
nameFilterResults[i].original.name=nameFilterResults[i].string;
}
////// Second pass: filter by MAC address
options.extract = function(arg) {return arg.mac;};
var macFilterResults = fuzzy.filter(searchText, deviceArray, options);
// replace releveant field with bolded string
for (var i = macFilterResults.length - 1; i >= 0; i--) {
macFilterResults[i].original.mac=macFilterResults[i].string;
}
////// Third pass: filter by Manufacture
options.extract = function(arg) {return arg.manufacturer;};
var manufacturerFilterResults = fuzzy.filter(searchText, deviceArray, options);
// replace releveant field with bolded string
for (var i = manufacturerFilterResults.length - 1; i >= 0; i--) {
manufacturerFilterResults[i].original.manufacturer=manufacturerFilterResults[i].string;
}
////// Fourth pass: filter by Hardware
options.extract = function(arg) {return arg.hardware;};
var hardwareFilterResults = fuzzy.filter(searchText, deviceArray, options);
// replace releveant field with bolded string
for (var i = hardwareFilterResults.length - 1; i >= 0; i--) {
hardwareFilterResults[i].original.hardware=hardwareFilterResults[i].string;
}
////// Fifth pass: filter by Model
options.extract = function(arg) {return arg.model;};
var modelFilterResults = fuzzy.filter(searchText, deviceArray, options);
// replace releveant field with bolded string
for (var i = modelFilterResults.length - 1; i >= 0; i--) {
modelFilterResults[i].original.model=modelFilterResults[i].string;
}
var filteredResults = union([nameFilterResults,macFilterResults,manufacturerFilterResults,hardwareFilterResults,modelFilterResults]);
// this returns a filtered array of objects with attributes 'index', 'original', 'score', and 'string'
// I am interested in the 'original' attribute, which is the relevant object exactly as it was submitted,
// and the 'string' attribute, which is the attribute that was compared against with matching characters conveniantly bolded
var results = new Array(fuzzyResults.length);
for (var i = 0; i < fuzzyResults.length; i++) {
results[i] = {
id:fuzzyResults[i].original.id,
name:fuzzyResults[i].string, //this is the one being replaced
description:fuzzyResults[i].original.description,
status:fuzzyResults[i].original.status,
mac:fuzzyResults[i].original.mac,
manufacturer:fuzzyResults[i].original.manufacturer,
hardware:fuzzyResults[i].original.hardware,
model:fuzzyResults[i].original.model,
serial:fuzzyResults[i].original.serial,
nfc:fuzzyResults[i].original.nfc,
var finalResults = new Array(filteredResults.length);
for (var i = 0; i < filteredResults.length; i++) {
finalResults[i] = {
id:filteredResults[i].original.id,
name:filteredResults[i].original.name,
description:filteredResults[i].original.description,
status:filteredResults[i].original.status,
mac:filteredResults[i].original.mac,
manufacturer:filteredResults[i].original.manufacturer,
hardware:filteredResults[i].original.hardware,
model:filteredResults[i].original.model,
serial:filteredResults[i].original.serial,
nfc:filteredResults[i].original.nfc,
};
}
return finalResults;
}
// returns the union of an arary of arrays, without duplicates
// in linear time!
// yay recursion :)
// Both arrays must contain objects with index attributes and must be sorted. (arrays returned by fuzzy.js are both of these things)
function union(arrays) {
if(arrays.length == 2)
return(unionBaseCase(arrays[0],arrays[1]))
if(arrays.length == 1)
return(arrays[0])
else{
var pivot = Math.floor(arrays.length/2);
var arrayA=arrays.slice(0,pivot);
var arrayB=arrays.slice(pivot);
return union([union(arrayA),union(arrayB)]);
}
}
function unionBaseCase(array1,array2) {
var results = new Array();
while(array1.length>0 && array2.length>0) {
if(array1[0].index == array2[0].index){
array1.splice(0,1);
}
else
results.push((array1[0].index > array2[0].index ? array2.splice(0,1)[0] : array1.splice(0,1)[0]))
}
results = results.concat(array1);
results = results.concat(array2);
return results;
}
Expand Down

0 comments on commit 523a88e

Please sign in to comment.