280 lines
12 KiB
HTML
280 lines
12 KiB
HTML
<head>
|
|
<meta charset="utf-8">
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>Hack @ WPI</title>
|
|
<link rel="icon" href="../static/favicon.png" type="image/png">
|
|
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
|
|
<link rel="stylesheet" href="https://opensource.keycdn.com/fontawesome/4.7.0/font-awesome.min.css" integrity="sha384-dNpIIXE8U05kAbPhy3G1cz+yZmTzA6CY8Vg/u2L9xRnHjJiAK76m2BIEaSEV+/aU" crossorigin="anonymous">
|
|
<!--[if lt IE 9]> <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script><![endif]--><script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
|
|
|
|
<script src="http://www.kryogenix.org/code/browser/sorttable/sorttable.js"></script>
|
|
<script src="https://cdn.pubnub.com/sdk/javascript/pubnub.4.4.3.js"></script>
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/sweetalert/1.1.3/sweetalert.min.js"></script>
|
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/sweetalert/1.1.3/sweetalert.min.css">
|
|
<script src="//cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js"></script>
|
|
<script src="{{url_for('static', filename='js/admin.js')}}"></script>
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.min.js"></script>
|
|
</head>
|
|
|
|
|
|
<style>
|
|
.table-striped > tbody > tr:nth-of-type(odd) {
|
|
background-color: rgba(255, 255, 255, 0.15);
|
|
}
|
|
|
|
.table-hover > tbody > tr:hover {
|
|
background-color: rgba(255, 255, 255, 0.25);
|
|
}
|
|
|
|
table.sortable th:not(.sorttable_sorted):not(.sorttable_sorted_reverse):not(.sorttable_nosort):after {
|
|
content: " \25B4\25BE"
|
|
}
|
|
|
|
canvas {
|
|
max-width: 500px;
|
|
max-height: 500px;
|
|
}
|
|
</style>
|
|
|
|
<div class="contact-section" style="height: auto; background-repeat: repeat; background-size: contain;">
|
|
<div class="container-fluid" style="margin-left: 3%; margin-right: 3%;">
|
|
<div class="row" style="margin-top: 10%;">
|
|
<h5>JSON object of users from MLH (Including dropped applications):</h5>
|
|
<p><a href="{{ mlh_url }}"><b>Do NOT share this URL.</b></a></p>
|
|
<h5>Get registered hackers only:</h5>
|
|
<p><a href="{{url_for('admin.hackers')}}">JSON</a> <a
|
|
href="{{url_for('admin.hackers_csv')}}">CSV</a></p>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col-md-4">
|
|
<h2 style="">Gender:</h2>
|
|
<canvas id="genderCanvas" width="400" height="400"></canvas>
|
|
<script>
|
|
let genderCtx = document.getElementById('genderCanvas')
|
|
let genderChart = new Chart(genderCtx, {
|
|
type: 'doughnut',
|
|
data: {
|
|
labels: ['Female', 'Male', 'Non-Binary/Other'],
|
|
datasets: [
|
|
{
|
|
data: [{{ female_count }}, {{ male_count }}, {{ nb_count }}]
|
|
}
|
|
]
|
|
},
|
|
options: {
|
|
title: {
|
|
display: false
|
|
},
|
|
legend: {
|
|
display: false
|
|
},
|
|
labels: {
|
|
display: false
|
|
}
|
|
}
|
|
})
|
|
</script>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<h2 style="">Schools:</h2>
|
|
<canvas id="schoolCanvas" width="400" height="400"></canvas>
|
|
<script>
|
|
let schoolNames = []
|
|
let schoolNums = []
|
|
|
|
{% for school in schools %}
|
|
schoolNames.push('{{ school }}')
|
|
schoolNums.push({{ schools[school] }})
|
|
{% endfor %}
|
|
|
|
let schoolCtx = document.getElementById('schoolCanvas')
|
|
let schoolChart = new Chart(schoolCtx, {
|
|
type: 'doughnut',
|
|
data: {
|
|
labels: schoolNames,
|
|
datasets: [
|
|
{
|
|
data: schoolNums
|
|
}
|
|
]
|
|
},
|
|
options: {
|
|
title: {
|
|
display: false
|
|
},
|
|
legend: {
|
|
display: false
|
|
},
|
|
labels: {
|
|
display: false
|
|
}
|
|
}
|
|
})
|
|
</script>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<h2 style="">Majors:</h2>
|
|
<canvas id="majorCanvas" width="400" height="400"></canvas>
|
|
<script>
|
|
let majorNames = []
|
|
let majorNums = []
|
|
|
|
{% for major in majors %}
|
|
majorNames.push('{{ major }}')
|
|
majorNums.push({{ majors[major] }})
|
|
{% endfor %}
|
|
|
|
let majorCtx = document.getElementById('majorCanvas')
|
|
let majorChart = new Chart(majorCtx, {
|
|
type: 'doughnut',
|
|
data: {
|
|
labels: majorNames,
|
|
datasets: [
|
|
{
|
|
data: majorNums
|
|
}
|
|
]
|
|
},
|
|
options: {
|
|
title: {
|
|
display: false
|
|
},
|
|
legend: {
|
|
display: false
|
|
},
|
|
labels: {
|
|
display: false
|
|
}
|
|
}
|
|
})
|
|
</script>
|
|
</div>
|
|
</div>
|
|
<div class="row" style="">
|
|
<h2 style="">Counts:</h2>
|
|
<table id="counts" class="table table-striped table-hover table-condensed sortable">
|
|
<thead>
|
|
<tr>
|
|
<th>Total</th>
|
|
<th>Attendees</th>
|
|
<th>Waitlist</th>
|
|
<th>Checked In</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>{{ total_count }}</td>
|
|
<td>{{ (total_count - waitlist_count) }}</td>
|
|
<td>{{ waitlist_count }}</td>
|
|
<td>{{ check_in_count }}</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<h2 style="margin-top: 2%;">Shirts:</h2>
|
|
<table id="shirts" class="table table-striped table-hover table-condensed sortable">
|
|
<thead>
|
|
<tr>
|
|
<th>XXS</th>
|
|
<th>XS</th>
|
|
<th>S</th>
|
|
<th>M</th>
|
|
<th>L</th>
|
|
<th>XL</th>
|
|
<th>XXL</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>{{ shirt_count['XXS'] }}</td>
|
|
<td>{{ shirt_count['XS'] }}</td>
|
|
<td>{{ shirt_count['S'] }}</td>
|
|
<td>{{ shirt_count['M'] }}</td>
|
|
<td>{{ shirt_count['L'] }}</td>
|
|
<td>{{ shirt_count['XL'] }}</td>
|
|
<td>{{ shirt_count['XXL'] }}</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<h2 style="margin-top: 2%;">Hackers:</h2>
|
|
<table id="hackers" class="table table-striped table-hover table-condensed sortable">
|
|
<thead>
|
|
<tr>
|
|
<th>Options</th>
|
|
<th>Checked In?</th>
|
|
<th>Waitlisted?</th>
|
|
<th>Admin</th>
|
|
<th>MLH ID</th>
|
|
<th>Time Registered</th>
|
|
<th>Email</th>
|
|
<th>Name</th>
|
|
<th>Phone</th>
|
|
<th>Shirt</th>
|
|
<th>Special</th>
|
|
<th>School</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for hacker in hackers %}
|
|
<tr id="{{ hacker.id }}-row">
|
|
<td>
|
|
<div class="btn-group">
|
|
<a href="#" class="btn btn-primary dropdown-toggle" data-toggle="dropdown"><span
|
|
class="caret"></span></a>
|
|
<ul class="dropdown-menu">
|
|
{% if not hacker.checked_in %}
|
|
<li><a class="check_in" id="{{ hacker.id }}-check_in" href="#">Check In</a>
|
|
</li>
|
|
{% endif %}
|
|
{% if hacker.waitlisted and not hacker.checked_in %}
|
|
<li><a class="promote_from_waitlist"
|
|
id="{{ hacker['id'] }}-promote_from_waitlist"
|
|
href="#">Promote From Waitlist</a></li>
|
|
{% endif %}
|
|
<li class="divider"></li>
|
|
{% if not hacker.checked_in %}
|
|
<li><a class="drop" id="{{ hacker['id'] }}-drop" href="#">Drop Application</a>
|
|
</li>
|
|
{% endif %}
|
|
{% if hacker.is_admin %}
|
|
<li><a class="demote_admin" id="{{ hacker['id'] }}-demote_admin" href="#">Demote
|
|
Admin</a>
|
|
</li>
|
|
{% else %}
|
|
<li><a class="promote_admin" id="{{ hacker['id'] }}-promote_admin" href="#">Promote
|
|
Admin</a>
|
|
</li>
|
|
{% endif %}
|
|
</ul>
|
|
</div>
|
|
</td>
|
|
<td id="{{ hacker['id'] }}-checked_in">{{ hacker['checked_in'] }}</td>
|
|
<td id="{{ hacker['id'] }}-waitlisted">{{ hacker['waitlisted'] }}</td>
|
|
<td>{{ hacker.is_admin }}</td>
|
|
<td>{{ hacker['id'] }}</td>
|
|
<td>{{ hacker['last_login'] }}</td>
|
|
<td>{{ hacker['email'] }}</td>
|
|
<td>{{ hacker['first_name'] + ' ' + hacker['last_name'] }}</td>
|
|
<td>{{ hacker['phone'] }}</td>
|
|
<td>{{ hacker['shirt_size'] }}</td>
|
|
<td>{{ hacker['accomodations'] }}</td>
|
|
<td>{{ hacker['school'] }}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
$(document).ready(() => {
|
|
setTimeout('let myTh = document.getElementsByTagName("th")[14]; sorttable.innerSortFunction.apply(myTh, []); sorttable.innerSortFunction.apply(myTh, []);', 50)
|
|
})
|
|
</script>
|
|
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
|
|
<script src="../static/js/jquery.easing.min.js"></script>
|
|
</body>
|
|
</html>
|