diff --git a/WebContent/html/webpages/adminDeviceSettings.jsp b/WebContent/html/webpages/adminDeviceSettings.jsp index 44b1bbf..b90a45b 100644 --- a/WebContent/html/webpages/adminDeviceSettings.jsp +++ b/WebContent/html/webpages/adminDeviceSettings.jsp @@ -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! @@ -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: '', - post: '', + pre: "", + post: '', 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; }