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;
}