Merge pull request #21 from LQDJudge/ranking_csv_file
Add download ranking csv file
This commit is contained in:
commit
855d2b2738
2 changed files with 70 additions and 2 deletions
|
@ -4,7 +4,7 @@
|
|||
|
||||
{% block after_rank_head %}
|
||||
{% if has_rating %}
|
||||
<th>{{ _('Rating') }}</th>
|
||||
<th class="rating-column">{{ _('Rating') }}</th>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
|
|
|
@ -61,6 +61,73 @@
|
|||
});
|
||||
</script>
|
||||
{% endif %}
|
||||
{% if tab == 'ranking' %}
|
||||
<script type="text/javascript">
|
||||
$.fn.ignore = function(sel) {
|
||||
return this.clone().find(sel || '>*').remove().end();
|
||||
};
|
||||
|
||||
function download_ranking_as_csv() {
|
||||
function clean_text(text) {
|
||||
// Remove new line and leading/trailing spaces
|
||||
text = text.replace(/(\r\n|\n|\r)/gm, '').trim();
|
||||
// Escape double-quote with double-double-quote
|
||||
text = text.replace(/"/g, '""');
|
||||
|
||||
return '"' + text + '"';
|
||||
}
|
||||
|
||||
var csv = [];
|
||||
|
||||
$('table#users-table thead tr').each(function () {
|
||||
var header = [];
|
||||
$(this).find('th').each(function () {
|
||||
var $col = $(this);
|
||||
|
||||
if ($col.hasClass('rating-column')) {
|
||||
return;
|
||||
} else if ($col.hasClass('username')) {
|
||||
header.push(clean_text($col.text()));
|
||||
header.push("Name");
|
||||
} else if ($col.hasClass('problem-score-col')) {
|
||||
header.push($col.attr("title"));
|
||||
} else {
|
||||
header.push(clean_text($col.text()));
|
||||
}
|
||||
});
|
||||
csv.push(header.join(','));
|
||||
});
|
||||
|
||||
$('table#users-table tbody tr').each(function () {
|
||||
var row_data = [];
|
||||
|
||||
$(this).find('td').each(function () {
|
||||
var $col = $(this);
|
||||
if ($col.hasClass('rating-column')) {
|
||||
return;
|
||||
} else if ($col.hasClass('user-name')) {
|
||||
row_data.push(clean_text($col.ignore('.fullname').ignore('.organization').text()));
|
||||
row_data.push(clean_text($col.ignore('.user').ignore('.organization').text()));
|
||||
} else {
|
||||
row_data.push(clean_text($col.ignore('.solving-time').text()));
|
||||
}
|
||||
});
|
||||
csv.push(row_data.join(','));
|
||||
});
|
||||
|
||||
csv = csv.join('\n');
|
||||
var filename = '{{ contest.key }}_' + moment().format('MMMM Do YYYY, h:mm:ss a'); + '.csv';
|
||||
var link = document.createElement('a');
|
||||
link.style.display = 'none';
|
||||
link.setAttribute('target', '_blank');
|
||||
link.setAttribute('href', 'data:text/csv;charset=utf-8,\uFEFF' + encodeURIComponent(csv));
|
||||
link.setAttribute('download', filename);
|
||||
document.body.appendChild(link);
|
||||
link.click();
|
||||
document.body.removeChild(link);
|
||||
}
|
||||
</script>
|
||||
{% endif %}
|
||||
{% include "contest/media-js.html" %}
|
||||
{% endblock %}
|
||||
|
||||
|
@ -86,6 +153,7 @@
|
|||
<input id="show-virtual-checkbox" type="checkbox" style="vertical-align: bottom;">
|
||||
<label id="show-virtual-label" for="show-virtual-checkbox" style="vertical-align: bottom; margin-right: 1em;">{{ _('Show virtual participation') }}</label>
|
||||
<img src="{{static('loading.gif')}}" style="height: 1em; display:none;" id="loading-gif"></img>
|
||||
<a href="#" onclick="download_ranking_as_csv()" style="float: right;">{{ _('Download as CSV') }}</a>
|
||||
</div>
|
||||
{% include "contest/ranking-table.html" %}
|
||||
{% endblock %}
|
Loading…
Reference in a new issue