Hoco Judging

This commit is contained in:
AnubisSQLi 2018-08-20 18:40:21 -04:00
parent 93bea3dc7f
commit 8bb9ee4c80
7 changed files with 1104 additions and 0 deletions

1
hoco.json Normal file
View File

@ -0,0 +1 @@
{"judges":[]}

29
js/hoco.js Normal file
View File

@ -0,0 +1,29 @@
var submitting = false
function validateEmail(email) {
var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@fcps\.edu/;
return re.test(email);
}
$('#submitButton').click((e) => {
var firstName = $('#fname').val()
var lastName = $('#lname').val()
var email = $('#email').val()
if (email !== '' && validateEmail(email) && firstName !== '' && lastName !== '' && !submitting) {
$('#loader').removeClass('invis')
submitting = true
$.post('/judgeSignup', { 'data': JSON.stringify({
firstName: firstName, lastName: lastName, email: email, spiritVid: $('#spiritVid').is(":checked"), pepRally1: $('#pepRally1').is(":checked"), pepRally2: $('#pepRally2').is(":checked"), spiritBanner: $('#spiritBanner').is(":checked"), cannedFood: $('#cannedFood').is(":checked"), pepRally3: $('#pepRally3').is(":checked"), pepRally4: $('#pepRally4').is(":checked"), tshirtJ: $('#tshirtJ').is(":checked"), pepRally5: $('#pepRally5').is(":checked"), pepRally6: $('#pepRally6').is(":checked"), mexJ: $('#mexJ').is(":checked"), floatJ: $('#floatJ').is(":checked") }) }, function(response) {
submitting = false
$('#loader').addClass('invis')
$('.formRow').addClass('invis')
$('#submitButton').addClass('invis')
$('#success').removeClass('invis')
})
} else {
$('#submitButton').addClass('error')
setTimeout(function() {
$('#submitButton').removeClass('error')
},1000)
}
})

View File

@ -1,6 +1,8 @@
{
"dependencies": {
"async": "^2.6.1",
"express": "^4.16.3",
"gmail-send": "^1.2.14",
"hbs": "^4.0.1",
"path": "^0.12.7"
}

View File

@ -36,12 +36,78 @@ hbs.registerHelper('eq', function (v1, v2) {
return v1 == v2
})
function sendReminderEmailsForHoco(judges) {
judges.forEach((e) => {
var send = require('gmail-send')({
user: 'sga.tjhsst@gmail.com',
pass: '#dglazeit',
to: e.email,
subject: 'Homecoming Judging Reminder',
text: 'Hello ' + e.firstName + ' ' + e.lastName + ', \nYou registered to judge a variety of events for Homecoming 2018.\nPlease go to https://sga.tjhsst.edu/judging2018 to complete judging.\nYour password is ' + e.password,
})
send({}, function (err, res) {})
})
}
// CLIENT CONFIG
app.use('/js', express.static(path.join(__dirname, 'js')))
app.use('/css', express.static(path.join(__dirname, 'css')))
app.use('/resources', express.static(path.join(__dirname, 'resources')))
// PAGES
app.post('/remindJudges', function(req, res) {
sendReminderEmailsForHoco(JSON.parse(fs.readFileSync('hoco.json')).judges)
res.send('reminded???')
})
app.get('/remindJudges', function(req, res) {
res.render('remindActivator', {})
})
app.post('/judgeSignup', function (req, res) {
var data = JSON.parse(req.body.data)
var content = JSON.parse(fs.readFileSync('hoco.json'))
data.password = (Math.floor(Math.random() * 900000) + 100000)
content.judges.push(data)
fs.writeFileSync('hoco.json', JSON.stringify(content))
res.send({ status: 'Registered' })
})
app.post('/judging2018', function (req, res) {
var hoco = JSON.parse(fs.readFileSync('hoco.json'))
var data = JSON.parse(req.body.data)
console.log(data)
var good = false
hoco.judges.forEach((e, i) => {
console.log(e.password, data.password)
if(e.email === data.judge.email && e.password == data.password) {
hoco.judges[i].scores = data.scores
fs.writeFileSync('hoco.json', JSON.stringify(hoco))
good = true
}
})
if (good) {
res.send({ 'status': 'successful' })
} else {
res.send({ 'status': 'unsuccessful' })
}
})
app.get('/judging2018', function (req, res) {
var content = JSON.parse(fs.readFileSync('site.json'))
var hoco = JSON.parse(fs.readFileSync('hoco.json'))
hoco.judges.forEach((e, i) => {
hoco.judges[i].password = 0
})
hoco.string = JSON.stringify(hoco)
res.render('hoco', { site: content, hoco: hoco })
})
app.get('/hoco2018', function (req, res) {
var content = JSON.parse(fs.readFileSync('site.json'))
res.render('hoco', { site: content })
})
app.get('/edit', function (req, res) {
var content = JSON.parse(fs.readFileSync('site.json'))
res.render('edit', { officers: JSON.stringify(content.officers), committee: JSON.stringify(content.committee), council: JSON.stringify(content.council), news: JSON.stringify(content.news) })

451
views/hoco.hbs Normal file
View File

@ -0,0 +1,451 @@
<!doctype html>
<html lang='en'>
<head>
<meta charset='UTF-8'/>
<meta name='viewport' content='width=device-width, initial-scale=1.0'>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="description" content="Thomas Jefferson High School Student Government Website">
<meta name="keywords" content="TJHSST, TJ SGA, TJHSST SGA, TJ Student Council, TJ Student Government, Thomas Jefferson High School Student Government">
<meta name="MobileOptimized" content="width">
<meta name="HandheldFriendly" content="true">
<meta name="theme-color" content="#ffffff">
<meta NAME="geo.position" CONTENT="38.832037; -77.107725">
<meta NAME="geo.placename" CONTENT="TJHSST">
<meta NAME="geo.region" CONTENT="US">
<link rel='stylesheet' type='text/css' href='css/index.css'>
<link rel='stylesheet' type='text/css' href='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css'>
<link rel='icon' href='https://i.imgur.com/IRJiPeO.png'>
<title>{{#unless hoco}}Homecoming{{/unless}}{{#if hoco}}Judging{{/if}} — TJHSST SGA</title>
<style>
@keyframes shake {
10%, 90% {
-moz-transform: translateX(-1%);
-o-transform: translateX(-1%);
-ms-transform: translateX(-1%);
-webkit-transform: translateX(-1%);
transform: translateX(-1%); }
20%, 80% {
-moz-transform: translateX(2%);
-o-transform: translateX(2%);
-ms-transform: translateX(2%);
-webkit-transform: translateX(2%);
transform: translateX(2%); }
30%, 50%, 70% {
-moz-transform: translateX(-4%);
-o-transform: translateX(-4%);
-ms-transform: translateX(-4%);
-webkit-transform: translateX(-4%);
transform: translateX(-4%); }
40%, 60% {
-moz-transform: translateX(4%);
-o-transform: translateX(4%);
-ms-transform: translateX(4%);
-webkit-transform: translateX(4%);
transform: translateX(4%); }
}
.formRow {
flex-direction: column;
align-items: center;
}
.hInput {
outline: none;
text-decoration: none;
border: none;
font-size: 20px;
margin: 10px 0px;
padding: 10px 20px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
-webkit-background-clip: padding-box;
-moz-background-clip: padding;
background-clip: padding-box;
display: inline-block;
-webkit-box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);
-moz-box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);
box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);
-moz-transition: all 0.15s ease;
-o-transition: all 0.15s ease;
-webkit-transition: all 0.15s ease;
transition: all 0.15s ease;
min-width: 300px;
}
#submitButton {
outline: none;
cursor: pointer;
text-align: center;
text-decoration: none;
font-size: 20px;
padding: 10px 20px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
-webkit-background-clip: padding-box;
-moz-background-clip: padding;
background-clip: padding-box;
display: inline-block;
-webkit-box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);
-moz-box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);
box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);
-moz-transform: scale(1, 1);
-o-transform: scale(1, 1);
-ms-transform: scale(1, 1);
-webkit-transform: scale(1, 1);
transform: scale(1, 1);
-moz-transition: all 0.15s ease;
-o-transition: all 0.15s ease;
-webkit-transition: all 0.15s ease;
transition: all 0.15s ease;
background-color: #53CB8B;
color: #F7F7FA;
margin: 10px 0px;
}
#submitButton:hover {
-webkit-box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 8px 15px rgba(0, 0, 0, 0.07);
-moz-box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 8px 15px rgba(0, 0, 0, 0.07);
box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 8px 15px rgba(0, 0, 0, 0.07);
-moz-transform: scale(1.02, 1.02);
-o-transform: scale(1.02, 1.02);
-ms-transform: scale(1.02, 1.02);
-webkit-transform: scale(1.02, 1.02);
transform: scale(1.02, 1.02);
background-color: #67d198;
}
#submitButton:focus {
-webkit-box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 8px 15px rgba(0, 0, 0, 0.07);
-moz-box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 8px 15px rgba(0, 0, 0, 0.07);
box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 8px 15px rgba(0, 0, 0, 0.07);
-moz-transform: scale(1.02, 1.02);
-o-transform: scale(1.02, 1.02);
-ms-transform: scale(1.02, 1.02);
-webkit-transform: scale(1.02, 1.02);
transform: scale(1.02, 1.02);
}
.formTitle {
font-size: 24px;
}
input:hover {
-webkit-box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 8px 15px rgba(0, 0, 0, 0.07);
-moz-box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 8px 15px rgba(0, 0, 0, 0.07);
box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 8px 15px rgba(0, 0, 0, 0.07);
-moz-transform: scale(1.02, 1.02);
-o-transform: scale(1.02, 1.02);
-ms-transform: scale(1.02, 1.02);
-webkit-transform: scale(1.02, 1.02);
transform: scale(1.02, 1.02);
}
input:focus {
-webkit-box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 8px 15px rgba(0, 0, 0, 0.07);
-moz-box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 8px 15px rgba(0, 0, 0, 0.07);
box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 8px 15px rgba(0, 0, 0, 0.07);
-moz-transform: scale(1.02, 1.02);
-o-transform: scale(1.02, 1.02);
-ms-transform: scale(1.02, 1.02);
-webkit-transform: scale(1.02, 1.02);
transform: scale(1.02, 1.02);
}
.invis {
display: none;
opacity: 0;
}
.checkBox {
justify-content: space-between;
display: flex;
width: 250px;
margin: 10px 5px;
}
.error {
animation-name: shake;
-webkit-animation-name: shake;
animation-duration: 1s;
-webkit-animation-duration: 1s;
animation-timing-function: ease;
-webkit-animation-timing-function: ease;
visibility: visible !important;
background-color: #E9676F !important;
}
p {
display: flex;
align-items: center;
justify-content: space-between;
width: 330px;
}
.eventTitle {
font-size: 18px;
}
</style>
</head>
<body>
<div class='navigation valign'>
<div class='mobile-only valign mobile-nav'>
<a href='#' class='menu' id='expand'><i class='fa fa-bars'></i></a>
<a href='/' class='logo-link'><p class='title'>TJHSST SGA</p></a>
<a href='#' class='menu'><i class='fa fa-gap'></i></a>
</div>
<div class='container valign seperate desktop-only'>
<div class='valign'>
<a href='/'><img class='logo' src='resources/logo.png'/></a>
{{#if site.nav}}
<nav>
<ul>
{{#each site.nav}}
<li>
<a href='{{url}}'>{{title}}</a>
{{#if submenu}}
<div class='submenu'>
<ul>
{{#each submenu}}
<li><a href='{{url}}'>{{title}}</a></li>
{{/each}}
</ul>
</div>
{{/if}}
</li>
{{/each}}
</ul>
</nav>
{{/if}}
</div>
{{#if site.socials}}
<div class='valign'>
<div class='socials'>
{{#each site.socials}}
<a href='{{url}}'><i class='fa fa-{{title}}'></i></a>
{{/each}}
</div>
</div>
{{/if}}
</div>
</div>
{{#if site.nav}}
<div class='mobile-only mobile-navigation-links'>
<ul>
{{#each site.nav}}
<li {{#if submenu}}id='expand-{{submenu-id}}'{{/if}}>
<a href='{{url}}'>{{title}}</a>
</li>
{{#if submenu}}
<div class='mobile-submenu' id='{{submenu-id}}'>
<ul>
{{#each submenu}}
<li><a href='{{url}}'>{{title}}</a></li>
{{/each}}
</ul>
</div>
{{/if}}
{{/each}}
</ul>
</div>
{{/if}}
<section class='hero-image'>
<img src='resources/hero.png'></img>
<div class='overlay'>
<p class='title'>{{#unless hoco}}Homecoming{{/unless}}{{#if hoco}}JUDGING{{/if}}</p>
</div>
</section>
{{#unless hoco}}
<section class='content'>
<div class='container'>
<p class='thicc colored formTitle'>Judge Signup<p>
<p class='invis' id='success'>You have successfully registered!</p>
<div class='row formRow'>
<input class='hInput' id='fname' placeholder='First Name'/>
<input class='hInput' id='lname' placeholder='Last Name'/>
<input class='hInput' id='email' placeholder='Email (@fcps.edu Only)'/>
<div class='checkBox'>
<label for='spiritVid'>Spirit Video</label>
<input type="checkbox" id='spiritVid' name='judge'/>
</div>
<div class='checkBox'>
<label for='pepRally1'>Pep Rally #1</label>
<input type="checkbox" id='pepRally1' name='judge'/>
</div>
<div class='checkBox'>
<label for='pepRally2'>Pep Rally #2</label>
<input type="checkbox" id='pepRally2' name='judge'/>
</div>
<div class='checkBox'>
<label for='spiritBanner'>Spirit Banner</label>
<input type="checkbox" id='spiritBanner' name='judge'/>
</div>
<div class='checkBox'>
<label for='cannedFood'>Canned Food Banner</label>
<input type="checkbox" id='cannedFood' name='judge'/>
</div>
<div class='checkBox'>
<label for='pepRally3'>Pep Rally #3</label>
<input type="checkbox" id='pepRally3' name='judge'/>
</div>
<div class='checkBox'>
<label for='pepRally4'>Pep Rally #4</label>
<input type="checkbox" id='pepRally4' name='judge'/>
</div>
<div class='checkBox'>
<label for='tshirtJ'>T-Shirt Judging</label>
<input type="checkbox" id='tshirtJ' name='judge'/>
</div>
<div class='checkBox'>
<label for='pepRally5'>Pep Rally #5</label>
<input type="checkbox" id='pepRally5' name='judge'/>
</div>
<div class='checkBox'>
<label for='pepRally6'>Pep Rally #6</label>
<input type="checkbox" id='pepRally6' name='judge'/>
</div>
<div class='checkBox'>
<label for='mexJ'>MEX</label>
<input type="checkbox" id='mexJ' name='judge'/>
</div>
<div class='checkBox'>
<label for='floatJ'>Float</label>
<input type="checkbox" id='floatJ' name='judge'/>
</div>
<a id='submitButton'>Submit</a>
<p class='invis' id='loader'>Submitting....</p>
</div>
</div>
</section>
{{/unless}}
{{#if hoco}}
<section class='content'>
<div class='container'>
<p class='thicc colored formTitle'>Judging<p>
<p class='invis' id='success'>You have successfully judged the events!</p>
<p class='invis' id='dataStr'>{{hoco.string}}</p>
<div class='row formRow' id='hideAfterSuccess'>
<select id='judges' class='hInput'>
{{#each hoco.judges}}
<option value='{{email}}'>{{firstName}} {{lastName}}</option>
{{/each}}
</select>
<div id='rankings'></div>
<input class='hInput' placeholder='Password' type='password' id='passJ'/>
<a id='submitButton'>Submit</a>
<p class='invis' id='loader'>Submitting....</p>
</div>
</div>
</section>
{{/if}}
{{#if site.footer}}
<hr/>
<section class='content banner'>
<div class='container'>
<div class='row'>
<img class='banner-img' src='resources/footer-banner.png'/>
</div>
</div>
</section>
<hr/>
<section class='content'>
<div class='container'>
<div class='row'>
{{#each site.footer}}
<div class='col footer-segment'>
{{#if title}}
<b>{{title}}</b>
{{#each links}}
<a href='{{url}}'>{{title}}</a>
{{/each}}
{{else}}
<div class='socials'>
{{#each ../site.socials}}
<a href='{{url}}'><i class='fa fa-{{title}}'></i></a>
{{/each}}
</div>
{{#each paragraphs}}
<p>{{para}}</p>
{{/each}}
<img class='footer-logo' src='{{logo-image}}'/>
{{/if}}
</div>
{{/each}}
</div>
</div>
</section>
{{/if}}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/cleave.js/1.4.2/cleave.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/cleave.js/1.4.2/addons/cleave-phone.us.js'></script>
<script src="js/index.js"></script>
{{#unless hoco}}<script src="js/hoco.js"></script>{{/unless}}
{{#if hoco}}
<script>
var submitting = false
var validated = true
var eventScores = []
var hoco = JSON.parse($('#dataStr').text())
var events = ['cannedFood','floatJ','mexJ','pepRally1','pepRally2','pepRally3','pepRally4','pepRally5','pepRally6','spiritBanner','spiritVid','tshirtJ']
var eventsName = ['Canned Food','Float','MEX','Pep Rally #1','Pep Rally #2','Pep Rally #3','Pep Rally #4','Pep Rally #5','Pep Rally #6','Spirit Banner','Spirit Video','T-Shirt']
var jq = {}
function updateEvents(judge) {
jq = {}
hoco.judges.forEach((e) => {
if (e.email === judge) {
jq = e
}
});
events.forEach((e, i) => {
if(jq[e]) {
if (e.includes('pepRally')) {
$('#rankings').append('<div><p class="eventTitle colored">' + eventsName[i] + '</p><p>#1<select id="' + e + 'num1' + '"><option value="2019">2019</option><option value="2020">2020</option><option value="2021">2021</option><option value="2022">2022</option></select></p><p>#2<select id="' + e + 'num2' + '"><option value="2019">2019</option><option value="2020">2020</option><option value="2021">2021</option><option value="2022">2022</option></select></p></div>')
} else {
$('#rankings').append('<div><p class="eventTitle colored">' + eventsName[i] + '</p><p>#1<select id="' + e + 'num1' + '"><option value="2019">2019</option><option value="2020">2020</option><option value="2021">2021</option><option value="2022">2022</option></select></p><p>#2<select id="' + e + 'num2' + '"><option value="2019">2019</option><option value="2020">2020</option><option value="2021">2021</option><option value="2022">2022</option></select></p><p>#3<select id="' + e + 'num3' + '"><option value="2019">2019</option><option value="2020">2020</option><option value="2021">2021</option><option value="2022">2022</option></select></p><p>#4<select id="' + e + 'num4' + '"><option value="2019">2019</option><option value="2020">2020</option><option value="2021">2021</option><option value="2022">2022</option></select></p></div>')
}
}
})
};
var judgeName = $('#judges').val()
updateEvents(judgeName)
$('#judges').change(function() {
judgeName = $('#judges').val()
updateEvents(judgeName)
});
$('#submitButton').click(function(e) {
validated = true
events.forEach((e, i) => {
eventScores.push({})
eventScores[i].num1 = $('#' + e + 'num1').val()
eventScores[i].num2 = $('#' + e + 'num2').val()
eventScores[i].num3 = $('#' + e + 'num3').val()
eventScores[i].num4 = $('#' + e + 'num4').val()
if (eventScores[i].num1 === eventScores[i].num2 || eventScores[i].num2 === eventScores[i].num3 || eventScores[i].num3 === eventScores[i].num4 || eventScores[i].num1 === eventScores[i].num3 || eventScores[i].num2 === eventScores[i].num4 || eventScores[i].num1 === eventScores[i].num4) {
if (!(eventScores[i].num1 === undefined || (eventScores[i].num1 !== undefined && eventScores[i].num3 === undefined && eventScores[i].num1 !== eventScores[i].num2))) {
validated = false
}
}
})
if ($('#passJ').val() === '') {
validated = false
}
if (validated && !submitting) {
$('#loader').removeClass('invis')
submitting = true
$.post('/judging2018', { 'data': JSON.stringify({ 'judge': jq, 'password': $('#passJ').val(), 'scores': JSON.stringify(eventScores) }) }, function(resp) {
$('#loader').addClass('invis')
submitting = false
if (resp.status == 'successful') {
$('#success').removeClass('invis')
$('#hideAfterSuccess').addClass('invis')
} else {
$('#submitButton').addClass('error')
setTimeout(function() {
$('#submitButton').removeClass('error')
},1000)
}
})
} else {
$('#submitButton').addClass('error')
setTimeout(function() {
$('#submitButton').removeClass('error')
},1000)
}
console.log(eventScores)
});
</script>
{{/if}}
</body>
</html>

62
views/remindActivator.hbs Normal file
View File

@ -0,0 +1,62 @@
<style>
a {
outline: none;
cursor: pointer;
text-align: center;
text-decoration: none;
font-size: 20px;
padding: 10px 20px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
-webkit-background-clip: padding-box;
-moz-background-clip: padding;
background-clip: padding-box;
display: inline-block;
-webkit-box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);
-moz-box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);
box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07);
-moz-transform: scale(1, 1);
-o-transform: scale(1, 1);
-ms-transform: scale(1, 1);
-webkit-transform: scale(1, 1);
transform: scale(1, 1);
-moz-transition: all 0.15s ease;
-o-transition: all 0.15s ease;
-webkit-transition: all 0.15s ease;
transition: all 0.15s ease;
background-color: #53CB8B;
color: #F7F7FA;
margin: 10px 0px;
}
a:hover {
-webkit-box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 8px 15px rgba(0, 0, 0, 0.07);
-moz-box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 8px 15px rgba(0, 0, 0, 0.07);
box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 8px 15px rgba(0, 0, 0, 0.07);
-moz-transform: scale(1.02, 1.02);
-o-transform: scale(1.02, 1.02);
-ms-transform: scale(1.02, 1.02);
-webkit-transform: scale(1.02, 1.02);
transform: scale(1.02, 1.02);
background-color: #67d198;
}
a:focus {
-webkit-box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 8px 15px rgba(0, 0, 0, 0.07);
-moz-box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 8px 15px rgba(0, 0, 0, 0.07);
box-shadow: 0 15px 35px rgba(50, 50, 98, 0.1), 0 8px 15px rgba(0, 0, 0, 0.07);
-moz-transform: scale(1.02, 1.02);
-o-transform: scale(1.02, 1.02);
-ms-transform: scale(1.02, 1.02);
-webkit-transform: scale(1.02, 1.02);
transform: scale(1.02, 1.02);
}
</style>
<a id='remind'>Remind Judges</a>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$('#remind').click(function(e) {
$.post('/remindJudges', {}, function(resp) {
console.log(resp)
})
});
</script>

493
yarn.lock Normal file
View File

@ -0,0 +1,493 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
accepts@~1.3.5:
version "1.3.5"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2"
dependencies:
mime-types "~2.1.18"
negotiator "0.6.1"
align-text@^0.1.1, align-text@^0.1.3:
version "0.1.4"
resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
dependencies:
kind-of "^3.0.2"
longest "^1.0.1"
repeat-string "^1.5.2"
amdefine@>=0.0.4:
version "1.0.1"
resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
array-flatten@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
async@^1.4.0:
version "1.5.2"
resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
async@^2.6.1:
version "2.6.1"
resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610"
dependencies:
lodash "^4.17.10"
body-parser@1.18.2:
version "1.18.2"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454"
dependencies:
bytes "3.0.0"
content-type "~1.0.4"
debug "2.6.9"
depd "~1.1.1"
http-errors "~1.6.2"
iconv-lite "0.4.19"
on-finished "~2.3.0"
qs "6.5.1"
raw-body "2.3.2"
type-is "~1.6.15"
bytes@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
camelcase@^1.0.2:
version "1.2.1"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
center-align@^0.1.1:
version "0.1.3"
resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
dependencies:
align-text "^0.1.3"
lazy-cache "^1.0.3"
cliui@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
dependencies:
center-align "^0.1.1"
right-align "^0.1.1"
wordwrap "0.0.2"
content-disposition@0.5.2:
version "0.5.2"
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
content-type@~1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
cookie-signature@1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
cookie@0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
debug@2.6.9:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
dependencies:
ms "2.0.0"
decamelize@^1.0.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
depd@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
depd@~1.1.1, depd@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
destroy@~1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
encodeurl@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
escape-html@~1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
etag@~1.8.1:
version "1.8.1"
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
express@^4.16.3:
version "4.16.3"
resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53"
dependencies:
accepts "~1.3.5"
array-flatten "1.1.1"
body-parser "1.18.2"
content-disposition "0.5.2"
content-type "~1.0.4"
cookie "0.3.1"
cookie-signature "1.0.6"
debug "2.6.9"
depd "~1.1.2"
encodeurl "~1.0.2"
escape-html "~1.0.3"
etag "~1.8.1"
finalhandler "1.1.1"
fresh "0.5.2"
merge-descriptors "1.0.1"
methods "~1.1.2"
on-finished "~2.3.0"
parseurl "~1.3.2"
path-to-regexp "0.1.7"
proxy-addr "~2.0.3"
qs "6.5.1"
range-parser "~1.2.0"
safe-buffer "5.1.1"
send "0.16.2"
serve-static "1.13.2"
setprototypeof "1.1.0"
statuses "~1.4.0"
type-is "~1.6.16"
utils-merge "1.0.1"
vary "~1.1.2"
finalhandler@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105"
dependencies:
debug "2.6.9"
encodeurl "~1.0.2"
escape-html "~1.0.3"
on-finished "~2.3.0"
parseurl "~1.3.2"
statuses "~1.4.0"
unpipe "~1.0.0"
foreachasync@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/foreachasync/-/foreachasync-3.0.0.tgz#5502987dc8714be3392097f32e0071c9dee07cf6"
forwarded@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
fresh@0.5.2:
version "0.5.2"
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
gmail-send@^1.2.14:
version "1.2.14"
resolved "https://registry.yarnpkg.com/gmail-send/-/gmail-send-1.2.14.tgz#2fd20a0270197be46f8f2633ea34f9410dec01b1"
dependencies:
lodash "^4.17.5"
nodemailer "^4.6.4"
handlebars@4.0.5:
version "4.0.5"
resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.5.tgz#92c6ed6bb164110c50d4d8d0fbddc70806c6f8e7"
dependencies:
async "^1.4.0"
optimist "^0.6.1"
source-map "^0.4.4"
optionalDependencies:
uglify-js "^2.6"
hbs@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/hbs/-/hbs-4.0.1.tgz#4bfd98650dc8c9dac44b3ca9adf9c098e8bc33b6"
dependencies:
handlebars "4.0.5"
walk "2.3.9"
http-errors@1.6.2:
version "1.6.2"
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
dependencies:
depd "1.1.1"
inherits "2.0.3"
setprototypeof "1.0.3"
statuses ">= 1.3.1 < 2"
http-errors@~1.6.2:
version "1.6.3"
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
dependencies:
depd "~1.1.2"
inherits "2.0.3"
setprototypeof "1.1.0"
statuses ">= 1.4.0 < 2"
iconv-lite@0.4.19:
version "0.4.19"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
inherits@2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
ipaddr.js@1.8.0:
version "1.8.0"
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e"
is-buffer@^1.1.5:
version "1.1.6"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
kind-of@^3.0.2:
version "3.2.2"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
dependencies:
is-buffer "^1.1.5"
lazy-cache@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
lodash@^4.17.10, lodash@^4.17.5:
version "4.17.10"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
longest@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
media-typer@0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
merge-descriptors@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
methods@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
mime-db@~1.35.0:
version "1.35.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47"
mime-types@~2.1.18:
version "2.1.19"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0"
dependencies:
mime-db "~1.35.0"
mime@1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
minimist@~0.0.1:
version "0.0.10"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
negotiator@0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
nodemailer@^4.6.4:
version "4.6.8"
resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-4.6.8.tgz#f82fb407828bf2e76d92acc34b823d83e774f89c"
on-finished@~2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
dependencies:
ee-first "1.1.1"
optimist@^0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
dependencies:
minimist "~0.0.1"
wordwrap "~0.0.2"
parseurl@~1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
path-to-regexp@0.1.7:
version "0.1.7"
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
path@^0.12.7:
version "0.12.7"
resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f"
dependencies:
process "^0.11.1"
util "^0.10.3"
process@^0.11.1:
version "0.11.10"
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
proxy-addr@~2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93"
dependencies:
forwarded "~0.1.2"
ipaddr.js "1.8.0"
qs@6.5.1:
version "6.5.1"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
range-parser@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
raw-body@2.3.2:
version "2.3.2"
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89"
dependencies:
bytes "3.0.0"
http-errors "1.6.2"
iconv-lite "0.4.19"
unpipe "1.0.0"
repeat-string@^1.5.2:
version "1.6.1"
resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
right-align@^0.1.1:
version "0.1.3"
resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
dependencies:
align-text "^0.1.1"
safe-buffer@5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
send@0.16.2:
version "0.16.2"
resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1"
dependencies:
debug "2.6.9"
depd "~1.1.2"
destroy "~1.0.4"
encodeurl "~1.0.2"
escape-html "~1.0.3"
etag "~1.8.1"
fresh "0.5.2"
http-errors "~1.6.2"
mime "1.4.1"
ms "2.0.0"
on-finished "~2.3.0"
range-parser "~1.2.0"
statuses "~1.4.0"
serve-static@1.13.2:
version "1.13.2"
resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1"
dependencies:
encodeurl "~1.0.2"
escape-html "~1.0.3"
parseurl "~1.3.2"
send "0.16.2"
setprototypeof@1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
setprototypeof@1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
source-map@^0.4.4:
version "0.4.4"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
dependencies:
amdefine ">=0.0.4"
source-map@~0.5.1:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
"statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2":
version "1.5.0"
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
statuses@~1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
type-is@~1.6.15, type-is@~1.6.16:
version "1.6.16"
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
dependencies:
media-typer "0.3.0"
mime-types "~2.1.18"
uglify-js@^2.6:
version "2.8.29"
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
dependencies:
source-map "~0.5.1"
yargs "~3.10.0"
optionalDependencies:
uglify-to-browserify "~1.0.0"
uglify-to-browserify@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
unpipe@1.0.0, unpipe@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
util@^0.10.3:
version "0.10.4"
resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
dependencies:
inherits "2.0.3"
utils-merge@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
vary@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
walk@2.3.9:
version "2.3.9"
resolved "https://registry.yarnpkg.com/walk/-/walk-2.3.9.tgz#31b4db6678f2ae01c39ea9fb8725a9031e558a7b"
dependencies:
foreachasync "^3.0.0"
window-size@0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
wordwrap@0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
wordwrap@~0.0.2:
version "0.0.3"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
yargs@~3.10.0:
version "3.10.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
dependencies:
camelcase "^1.0.2"
cliui "^2.1.0"
decamelize "^1.0.0"
window-size "0.1.0"