-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge remote-tracking branch 'refs/remotes/origin/master' into bugs
- Loading branch information
Showing
6 changed files
with
363 additions
and
147 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,143 +1,143 @@ | ||
/* | ||
* Fuzzy | ||
* https://github.com/myork/fuzzy | ||
* | ||
* Copyright (c) 2012 Matt York | ||
* Licensed under the MIT license. | ||
*/ | ||
|
||
(function() { | ||
|
||
var root = this; | ||
|
||
var fuzzy = {}; | ||
|
||
// Use in node or in browser | ||
if (typeof exports !== 'undefined') { | ||
module.exports = fuzzy; | ||
} else { | ||
root.fuzzy = fuzzy; | ||
} | ||
|
||
// Return all elements of `array` that have a fuzzy | ||
// match against `pattern`. | ||
fuzzy.simpleFilter = function(pattern, array) { | ||
return array.filter(function(str) { | ||
return fuzzy.test(pattern, str); | ||
}); | ||
}; | ||
|
||
// Does `pattern` fuzzy match `str`? | ||
fuzzy.test = function(pattern, str) { | ||
return fuzzy.match(pattern, str) !== null; | ||
}; | ||
|
||
// If `pattern` matches `str`, wrap each matching character | ||
// in `opts.pre` and `opts.post`. If no match, return null | ||
fuzzy.match = function(pattern, str, opts) { | ||
opts = opts || {}; | ||
var patternIdx = 0 | ||
, result = [] | ||
, len = str.length | ||
, totalScore = 0 | ||
, currScore = 0 | ||
// prefix | ||
, pre = opts.pre || '' | ||
// suffix | ||
, post = opts.post || '' | ||
// String to compare against. This might be a lowercase version of the | ||
// raw string | ||
, compareString = opts.caseSensitive && str || str.toLowerCase() | ||
, ch; | ||
|
||
pattern = opts.caseSensitive && pattern || pattern.toLowerCase(); | ||
|
||
// For each character in the string, either add it to the result | ||
// or wrap in template if it's the next string in the pattern | ||
for(var idx = 0; idx < len; idx++) { | ||
ch = str[idx]; | ||
if(compareString[idx] === pattern[patternIdx]) { | ||
ch = pre + ch + post; | ||
patternIdx += 1; | ||
|
||
// consecutive characters should increase the score more than linearly | ||
currScore += 1 + currScore; | ||
} else { | ||
currScore = 0; | ||
} | ||
totalScore += currScore; | ||
result[result.length] = ch; | ||
} | ||
|
||
// return rendered string if we have a match for every char | ||
if(patternIdx === pattern.length) { | ||
// if the string is an exact match with pattern, totalScore should be maxed | ||
totalScore = (compareString === pattern) ? Infinity : totalScore; | ||
return {rendered: result.join(''), score: totalScore}; | ||
} | ||
|
||
return null; | ||
}; | ||
|
||
// The normal entry point. Filters `arr` for matches against `pattern`. | ||
// It returns an array with matching values of the type: | ||
// | ||
// [{ | ||
// string: '<b>lah' // The rendered string | ||
// , index: 2 // The index of the element in `arr` | ||
// , original: 'blah' // The original element in `arr` | ||
// }] | ||
// | ||
// `opts` is an optional argument bag. Details: | ||
// | ||
// opts = { | ||
// // string to put before a matching character | ||
// pre: '<b>' | ||
// | ||
// // string to put after matching character | ||
// , post: '</b>' | ||
// | ||
// // Optional function. Input is an entry in the given arr`, | ||
// // output should be the string to test `pattern` against. | ||
// // In this example, if `arr = [{crying: 'koala'}]` we would return | ||
// // 'koala'. | ||
// , extract: function(arg) { return arg.crying; } | ||
// } | ||
fuzzy.filter = function(pattern, arr, opts) { | ||
if(!arr || arr.length === 0) { | ||
return []; | ||
} | ||
if (typeof pattern !== 'string') { | ||
return arr; | ||
} | ||
opts = opts || {}; | ||
return arr | ||
.reduce(function(prev, element, idx, arr) { | ||
var str = element; | ||
if(opts.extract) { | ||
str = opts.extract(element); | ||
} | ||
var rendered = fuzzy.match(pattern, str, opts); | ||
if(rendered != null) { | ||
prev[prev.length] = { | ||
string: rendered.rendered | ||
, score: rendered.score | ||
, index: idx | ||
, original: element | ||
}; | ||
} | ||
return prev; | ||
}, []) | ||
|
||
// Sort by score. Browsers are inconsistent wrt stable/unstable | ||
// sorting, so force stable by using the index in the case of tie. | ||
// See http://ofb.net/~sethml/is-sort-stable.html | ||
.sort(function(a,b) { | ||
var compare = b.score - a.score; | ||
if(compare) return compare; | ||
return a.index - b.index; | ||
}); | ||
}; | ||
|
||
|
||
/* | ||
* Fuzzy | ||
* https://github.com/myork/fuzzy | ||
* | ||
* Copyright (c) 2012 Matt York | ||
* Licensed under the MIT license. | ||
*/ | ||
|
||
(function() { | ||
|
||
var root = this; | ||
|
||
var fuzzy = {}; | ||
|
||
// Use in node or in browser | ||
if (typeof exports !== 'undefined') { | ||
module.exports = fuzzy; | ||
} else { | ||
root.fuzzy = fuzzy; | ||
} | ||
|
||
// Return all elements of `array` that have a fuzzy | ||
// match against `pattern`. | ||
fuzzy.simpleFilter = function(pattern, array) { | ||
return array.filter(function(str) { | ||
return fuzzy.test(pattern, str); | ||
}); | ||
}; | ||
|
||
// Does `pattern` fuzzy match `str`? | ||
fuzzy.test = function(pattern, str) { | ||
return fuzzy.match(pattern, str) !== null; | ||
}; | ||
|
||
// If `pattern` matches `str`, wrap each matching character | ||
// in `opts.pre` and `opts.post`. If no match, return null | ||
fuzzy.match = function(pattern, str, opts) { | ||
opts = opts || {}; | ||
var patternIdx = 0 | ||
, result = [] | ||
, len = str.length | ||
, totalScore = 0 | ||
, currScore = 0 | ||
// prefix | ||
, pre = opts.pre || '' | ||
// suffix | ||
, post = opts.post || '' | ||
// String to compare against. This might be a lowercase version of the | ||
// raw string | ||
, compareString = opts.caseSensitive && str || str.toLowerCase() | ||
, ch; | ||
|
||
pattern = opts.caseSensitive && pattern || pattern.toLowerCase(); | ||
|
||
// For each character in the string, either add it to the result | ||
// or wrap in template if it's the next string in the pattern | ||
for(var idx = 0; idx < len; idx++) { | ||
ch = str[idx]; | ||
if(compareString[idx] === pattern[patternIdx]) { | ||
ch = pre + ch + post; | ||
patternIdx += 1; | ||
|
||
// consecutive characters should increase the score more than linearly | ||
currScore += 1 + currScore; | ||
} else { | ||
currScore = 0; | ||
} | ||
totalScore += currScore; | ||
result[result.length] = ch; | ||
} | ||
|
||
// return rendered string if we have a match for every char | ||
if(patternIdx === pattern.length) { | ||
// if the string is an exact match with pattern, totalScore should be maxed | ||
totalScore = (compareString === pattern) ? Infinity : totalScore; | ||
return {rendered: result.join(''), score: totalScore}; | ||
} | ||
|
||
return null; | ||
}; | ||
|
||
// The normal entry point. Filters `arr` for matches against `pattern`. | ||
// It returns an array with matching values of the type: | ||
// | ||
// [{ | ||
// string: '<b>lah' // The rendered string | ||
// , index: 2 // The index of the element in `arr` | ||
// , original: 'blah' // The original element in `arr` | ||
// }] | ||
// | ||
// `opts` is an optional argument bag. Details: | ||
// | ||
// opts = { | ||
// // string to put before a matching character | ||
// pre: '<b>' | ||
// | ||
// // string to put after matching character | ||
// , post: '</b>' | ||
// | ||
// // Optional function. Input is an entry in the given arr`, | ||
// // output should be the string to test `pattern` against. | ||
// // In this example, if `arr = [{crying: 'koala'}]` we would return | ||
// // 'koala'. | ||
// , extract: function(arg) { return arg.crying; } | ||
// } | ||
fuzzy.filter = function(pattern, arr, opts) { | ||
if(!arr || arr.length === 0) { | ||
return []; | ||
} | ||
if (typeof pattern !== 'string') { | ||
return arr; | ||
} | ||
opts = opts || {}; | ||
return arr | ||
.reduce(function(prev, element, idx, arr) { | ||
var str = element; | ||
if(opts.extract) { | ||
str = opts.extract(element); | ||
} | ||
var rendered = fuzzy.match(pattern, str, opts); | ||
if(rendered != null) { | ||
prev[prev.length] = { | ||
string: rendered.rendered | ||
, score: rendered.score | ||
, index: idx | ||
, original: element | ||
}; | ||
} | ||
return prev; | ||
}, []) | ||
|
||
// Sort by score. Browsers are inconsistent wrt stable/unstable | ||
// sorting, so force stable by using the index in the case of tie. | ||
// See http://ofb.net/~sethml/is-sort-stable.html | ||
.sort(function(a,b) { | ||
var compare = b.score - a.score; | ||
if(compare) return compare; | ||
return a.index - b.index; | ||
}); | ||
}; | ||
|
||
|
||
}()); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
<%@ page import="database.*,entities.Statistics"%> | ||
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" | ||
pageEncoding="ISO-8859-1"%> | ||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> | ||
<html> | ||
<head> | ||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> | ||
<title>Insert title here</title> | ||
</head> | ||
<body> | ||
<% | ||
Statistics[] genStatistics = StatisticsQueries.getStatistics(); | ||
String statString = Statistics.arrayToString(genStatistics); | ||
%> | ||
<script type=text/javascript | ||
src="https://www.gstatic.com/charts/loader.js"></script> | ||
<script> | ||
var statistics = makeStatistics(); | ||
displayData(); | ||
function displayData() { | ||
var html = ""; | ||
var totalDevices = 0; | ||
var availableDevices; | ||
var loanDevices; | ||
var lostDevices; | ||
if (statistics.status != "" && statistics.count != ""){ | ||
for (var i = 0; i<statistics.length; i++){ | ||
totalDevices = totalDevices + statistics[i].count; | ||
} | ||
availableDevices = statistics[1].count; | ||
loanDevices = statistics[5].count; | ||
lostDevices = statistics[4].count; | ||
html += '<div class = "info-container">Total Devices: '+ totalDevices + | ||
'<br>Loaned Devices: ' + loanDevices + | ||
'<br>Available Devices: ' + availableDevices + | ||
'<br>Lost Devices: ' + lostDevices + | ||
'</div>' | ||
// Load the Visualization API and the corechart package. | ||
google.charts.load('current', {'packages':['corechart']}); | ||
// Set a callback to run when the Google Visualization API is loaded. | ||
google.charts.setOnLoadCallback(drawPie); | ||
google.charts.setOnLoadCallback(drawCol); | ||
// Callback that creates and populates a data table, | ||
// instantiates the pie chart, passes in the data and | ||
// draws it. | ||
function drawPie() { | ||
// Create the data table. | ||
var data = new google.visualization.DataTable(); | ||
data.addColumn('string', 'Status'); | ||
data.addColumn('number', 'Count'); | ||
data.addRows([['Total Devices', totalDevices],['Available Devices', availableDevices], | ||
['Loaned Devices',loanDevices],['Lost Devices',lostDevices]]); | ||
// Set chart options | ||
var options = {'title':'Chart of Devices', | ||
'width':600, | ||
'height':400, | ||
'backgroundColor':'#E9EAEB'}; | ||
// Instantiate and draw our chart, passing in some options. | ||
var chart = new google.visualization.PieChart(document.getElementById('piechart')); | ||
chart.draw(data, options); | ||
} | ||
function drawCol() { | ||
var data = new google.visualization.DataTable(); | ||
data.addColumn('string', 'Status'); | ||
data.addColumn('number', 'Count'); | ||
for (var i = 0; i<statistics.length; i++){ | ||
data.addRow([statistics[i].status,statistics[i].count]); | ||
} | ||
var view = new google.visualization.DataView(data); | ||
view.setColumns([0, 1, | ||
{ calc: "stringify", | ||
sourceColumn: 1, | ||
type: "string", | ||
role: "annotation" } | ||
]); | ||
var options = {'title':'Devices in terms of Status', | ||
'width':600, | ||
'height':400, | ||
'bar': {groupWidth: "75%"}, | ||
'legend': { position: "none" }, | ||
'backgroundColor':'#E9EAEB'}; | ||
// Instantiate and draw our chart, passing in some options. | ||
var chart = new google.visualization.ColumnChart(document.getElementById('colchart')); | ||
chart.draw(view, options); | ||
} | ||
document.getElementById('stats').innerHTML = html; | ||
} | ||
} | ||
function makeStatistics(){ | ||
window.json = '<%=statString%>'; | ||
return JSON.parse(window.json); | ||
} | ||
</script> | ||
</body> | ||
</html> |
Oops, something went wrong.