2022-06-01 05:28:56 +00:00
|
|
|
<script src="//cdn.jsdelivr.net/npm/featherlight@1.7.14/release/featherlight.min.js" type="text/javascript" charset="utf-8"></script>
|
2020-01-21 06:35:58 +00:00
|
|
|
<script type="text/javascript">
|
2023-01-27 23:11:10 +00:00
|
|
|
function isFaster(time1, time2) {
|
|
|
|
let arr1 = time1.split(':');
|
|
|
|
let arr2 = time2.split(':');
|
|
|
|
|
|
|
|
for (let i in arr1) {
|
|
|
|
let val1 = parseInt(arr1[i]);
|
|
|
|
let val2 = parseInt(arr2[i]);
|
|
|
|
if (val1 < val2) return true;
|
|
|
|
if (val1 > val2) return false;
|
2022-06-01 05:28:56 +00:00
|
|
|
}
|
2023-01-27 23:11:10 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
function scoretimeComparison(sub1, sub2) {
|
|
|
|
if (!sub2) return true;
|
|
|
|
return sub1['score'] > sub2['score'] || (sub1['score'] === sub2['score'] && isFaster(sub1['time'], sub2['time']));
|
|
|
|
}
|
|
|
|
|
|
|
|
function highlightFirstSolve() {
|
|
|
|
// bucket to store submissions by problems
|
|
|
|
let bestSubmissions = {};
|
|
|
|
|
|
|
|
// get information
|
|
|
|
$('td a').each(function() {
|
|
|
|
var td = $(this)[0];
|
|
|
|
var link = $(this).attr('data-featherlight');
|
|
|
|
if (link && link.includes('submissions')) {
|
|
|
|
let scoreAndTime = (td.innerText.split('\n'))
|
|
|
|
let linkElements = link.split('/')
|
2022-06-01 05:28:56 +00:00
|
|
|
|
|
|
|
// get information
|
2023-01-27 23:11:10 +00:00
|
|
|
let problem = linkElements[linkElements.length - 2];
|
|
|
|
let score = parseFloat(scoreAndTime[0].replace(',', '.'));
|
|
|
|
let time = scoreAndTime[1];
|
|
|
|
|
|
|
|
if (time) {
|
|
|
|
let curSubmission = {
|
|
|
|
'td': $(this).parent(),
|
|
|
|
'score': score,
|
|
|
|
'time': time
|
|
|
|
}
|
|
|
|
|
|
|
|
// update best submissions
|
|
|
|
let curBest = bestSubmissions[problem]
|
|
|
|
|
|
|
|
if (scoretimeComparison(curSubmission, curBest) && score) {
|
|
|
|
bestSubmissions[problem] = curSubmission;
|
|
|
|
}
|
2022-06-01 05:28:56 +00:00
|
|
|
}
|
2023-01-27 23:11:10 +00:00
|
|
|
}
|
|
|
|
})
|
|
|
|
for (let problem in bestSubmissions) {
|
|
|
|
bestSubmissions[problem]['td'].addClass('first-solve')
|
2022-06-01 05:28:56 +00:00
|
|
|
}
|
2023-01-27 23:11:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function renew_filter(need_update=true) {
|
|
|
|
var checkboxes = [
|
|
|
|
'#show-schools-checkbox',
|
|
|
|
'#show-fullnames-checkbox',
|
|
|
|
'#show-total-score-checkbox',
|
|
|
|
];
|
|
|
|
|
|
|
|
var checkboxes2 = [
|
|
|
|
'#show-friends-checkbox',
|
|
|
|
'#show-virtual-checkbox'
|
|
|
|
]
|
|
|
|
|
|
|
|
for (var i of checkboxes) {
|
|
|
|
var $box = $(i);
|
|
|
|
if ($box.is(':checked')) {
|
|
|
|
$box.prop('checked', false);
|
|
|
|
$box.click();
|
|
|
|
$box.prop('checked', true);
|
|
|
|
}
|
2022-06-01 05:28:56 +00:00
|
|
|
}
|
|
|
|
|
2023-01-27 23:11:10 +00:00
|
|
|
var to_update = false;
|
|
|
|
for (var i of checkboxes2) {
|
|
|
|
var $box = $(i);
|
|
|
|
if ($box.is(':checked')) {
|
|
|
|
to_update = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (to_update && need_update) {
|
|
|
|
update_ranking();
|
2022-06-01 05:28:56 +00:00
|
|
|
}
|
2023-01-27 23:11:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function get_initial_rank() {
|
|
|
|
var ranks = $('.rank-td').map(function() {return this.innerHTML}).get();
|
|
|
|
var usernames = $('.user-name .rating a').map(function() {return this.text}).get();
|
|
|
|
window.user_rank = new Map();
|
|
|
|
for (var i = 0; i < ranks.length; i++) {
|
|
|
|
window.user_rank[usernames[i]] = ranks[i];
|
|
|
|
}
|
|
|
|
}
|
2022-06-01 05:28:56 +00:00
|
|
|
|
2023-01-27 23:11:10 +00:00
|
|
|
function add_initial_friend_rank() {
|
|
|
|
var usernames = $('.user-name .rating a').map(function() {return this.text}).get();
|
2022-06-01 05:28:56 +00:00
|
|
|
|
2023-01-27 23:11:10 +00:00
|
|
|
var is_virtual = [];
|
|
|
|
$('.user-name').each(function() {
|
|
|
|
if($(this).children('sub').length) {
|
|
|
|
is_virtual.push(1);
|
|
|
|
}
|
|
|
|
else is_virtual.push(0);
|
|
|
|
});
|
2022-06-01 05:28:56 +00:00
|
|
|
|
2023-01-27 23:11:10 +00:00
|
|
|
$('.rank-td').each(function(i) {
|
|
|
|
if (!is_virtual[i]) this.innerHTML += ' (' + window.user_rank[usernames[i]] + ')';
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function update_ranking() {
|
|
|
|
var friend = $('#show-friends-checkbox').is(':checked');
|
|
|
|
var virtual = $('#show-virtual-checkbox').is(':checked');
|
|
|
|
$('#loading-gif').show();
|
|
|
|
var url = `{{url('contest_ranking_ajax', contest.key)}}?friend=${friend}&virtual=${virtual}`;
|
|
|
|
{% if page_type == 'final_ranking' %}
|
|
|
|
url += "&final=true";
|
|
|
|
{% endif %}
|
|
|
|
$.get({
|
|
|
|
url: url,
|
|
|
|
success: function(HTML) {
|
|
|
|
$('#users-table').html(HTML);
|
|
|
|
highlightFirstSolve();
|
|
|
|
renew_filter(false);
|
|
|
|
$('#loading-gif').hide();
|
|
|
|
if (!virtual && !friend) {
|
|
|
|
get_initial_rank();
|
|
|
|
}
|
|
|
|
if (friend) {
|
|
|
|
add_initial_friend_rank();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
fail: function() {
|
|
|
|
console.log('Fail to update ranking');
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2022-06-01 05:28:56 +00:00
|
|
|
|
2023-01-27 23:11:10 +00:00
|
|
|
$(function () {
|
|
|
|
$('.leaving-forever').click(function () {
|
|
|
|
return confirm('{{ _('Are you sure you want to leave?') }}\n' +
|
|
|
|
'{{ _('You cannot come back to a virtual participation. You will have to start a new one.') }}');
|
|
|
|
});
|
2022-06-01 05:28:56 +00:00
|
|
|
|
2023-01-27 23:11:10 +00:00
|
|
|
$('.first-join').click(function () {
|
2024-04-25 03:33:57 +00:00
|
|
|
let q = '{{ _('Are you sure you want to join?') }}\n' +
|
|
|
|
'{{ _('Joining a contest starts your timer, after which it becomes unstoppable.') }}';
|
|
|
|
{% if current_contest %}
|
|
|
|
q += " {{ _('By joining in this contest, you will automatically leave contest') }} \"{{ current_contest.name }}\". ";
|
|
|
|
{% endif %}
|
|
|
|
return confirm(q);
|
2023-01-27 23:11:10 +00:00
|
|
|
});
|
2022-06-01 05:28:56 +00:00
|
|
|
|
2023-01-27 23:11:10 +00:00
|
|
|
var url = '{{ url('contest_participation', contest.key, '__username__') }}';
|
|
|
|
var placeholder = $('#search-contest').replaceWith($('<select>').attr({
|
|
|
|
id: 'search-contest'
|
|
|
|
})).attr('placeholder');
|
|
|
|
|
|
|
|
$('#search-contest').select2({
|
|
|
|
placeholder: placeholder,
|
|
|
|
ajax: {
|
2024-02-05 21:15:32 +00:00
|
|
|
url: '{{ url('contest_user_search_select2_ajax', contest.key) }}',
|
|
|
|
cache: true,
|
|
|
|
delay: 250,
|
2023-01-27 23:11:10 +00:00
|
|
|
},
|
|
|
|
minimumInputLength: 1,
|
|
|
|
escapeMarkup: function (markup) {
|
|
|
|
return markup;
|
|
|
|
},
|
|
|
|
templateResult: function (data, container) {
|
|
|
|
return ('<img class="user-search-image" src="' + data.gravatar_url + '" width="24" height="24">' +
|
|
|
|
'<span class="' + data.display_rank + ' user-search-name">' + data.text + '</span>');
|
|
|
|
}
|
|
|
|
}).on('change', function () {
|
|
|
|
window.location.href = url.replace('__username__', $(this).val());
|
|
|
|
});
|
|
|
|
|
|
|
|
$('#show-schools-checkbox').click(function () {
|
|
|
|
$('.school').toggle();
|
|
|
|
});
|
|
|
|
$('#show-fullnames-checkbox').click(function () {
|
|
|
|
$('.fullname').toggle();
|
2020-01-21 06:35:58 +00:00
|
|
|
});
|
2022-06-01 05:28:56 +00:00
|
|
|
|
2023-01-27 23:11:10 +00:00
|
|
|
{% if request.user.is_authenticated %}
|
|
|
|
$('#show-friends-checkbox').click(function() {
|
|
|
|
update_ranking();
|
|
|
|
})
|
|
|
|
{% endif %}
|
|
|
|
$('#show-virtual-checkbox').click(function() {
|
|
|
|
update_ranking();
|
|
|
|
})
|
|
|
|
$('#show-total-score-checkbox').click(function() {
|
|
|
|
$('.problem-score-col').toggle();
|
|
|
|
})
|
|
|
|
|
|
|
|
highlightFirstSolve();
|
|
|
|
renew_filter();
|
|
|
|
get_initial_rank();
|
|
|
|
|
|
|
|
{% if participation_tab %}
|
|
|
|
$('#show-virtual-checkbox').hide();
|
|
|
|
$('#show-virtual-label').hide();
|
|
|
|
{% else %}
|
|
|
|
{% if request.in_contest %}
|
|
|
|
clearInterval(window.rankingInterval);
|
|
|
|
window.rankingInterval = setInterval(update_ranking, 60 * 1000);
|
|
|
|
{% endif %}
|
|
|
|
{% endif %}
|
|
|
|
});
|
|
|
|
|
2020-01-21 06:35:58 +00:00
|
|
|
</script>
|