{% extends "three-column-content.html" %} {% block three_col_js %} <script type="text/javascript"> {% if dynamic_update and last_msg %} {% if request.in_contest_mode %} window.current_contest = '{{request.participation.contest.key}}'; {% else %} window.current_contest = null; {% endif %} {% if dynamic_user_id %} window.dynamic_user_id = {{dynamic_user_id}}; {% else %} window.dynamic_user_id = null; {% endif %} {% if dynamic_problem_id %} window.dynamic_problem_id = {{dynamic_problem_id}}; {% else %} window.dynamic_problem_id = null; {% endif %} {% if show_problem %} window.show_problem = 1; {% else %} window.show_problem = 0; {% endif %} {% endif %} {% if results_json %} window.results_json = {{ results_json }}; {% endif %} </script> {% compress js %} <script type="text/javascript" src="{{ static('event.js') }}"></script> {% if request.user.is_authenticated and perms.judge.rejudge_submission %} <script type="text/javascript"> window.rejudge_submission = function (id, e) { if ((typeof e !== 'undefined' && e.ctrlKey) || confirm('Are you sure you want to rejudge?')) { $.ajax({ url: '{{ url('submission_rejudge') }}', type: "POST", data: { id: id } }); } }; </script> {% endif %} <script src="{{ static('libs/chart.js/Chart.js') }}"></script> <script type="text/javascript"> $(function () { var info_float = $('.info-float'); var container = $('#content-right'); if (window.bad_browser) { container.css('float', 'right'); } else if (!featureTest('position', 'sticky')) { fix_div(info_float, 55); $(window).resize(function () { info_float.width(container.width()); }); info_float.width(container.width()); } function escapeRegExp(string) { return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string } function idAndTextMatcher(params, data) { if ($.trim(params.term) === '') return data; var regex = new RegExp(escapeRegExp(params.term), 'i'); return data.text.search(regex) >= 0 || data.id.search(regex) >= 0 ? data : null; } $('#status').select2({ multiple: 1, placeholder: '{{ _('Filter by status...') }}', matcher: idAndTextMatcher, }).css({'visibility': 'visible'}); $('#language').select2({ multiple: 1, placeholder: '{{ _('Filter by language...') }}', matcher: idAndTextMatcher, }).css({'visibility': 'visible'}); }); // Draw the statistics graph. {% if results_json %} var chart = null; function stats_graph(raw_data) { var colors = {{ results_colors_json }}; var ctx = $('#status-graph').find('canvas')[0].getContext('2d'); var font = $('body').css('font-family'); if (chart !== null) { chart.destroy(); } chart = new Chart(ctx, { type: 'pie', data: { datasets: [{ data: raw_data.categories.map(function(entry) { return entry.count; }), backgroundColor: raw_data.categories.map(function(entry) { return colors[entry.code]; }), }], labels: raw_data.categories.map(function(entry) { return entry.name; }), }, options: { animation: false, scaleFontFamily: font, tooltips: { titleFontFamily: font, bodyFontFamily: font, }, legend: { display: false, }, }, }); $('#total-submission-count').text(raw_data.total); } $(function () { stats_graph(window.results_json); }); {% endif %} function load_dynamic_update(last_msg) { var _collect = function (e) { return e.value; }; var language_filter = $.map($('select#language option[selected]'), _collect); var status_filter = $.map($('select#status option[selected]'), _collect); var table = $('#submissions-table'); var statistics = $("#statistics-table"); var doing_ajax = false; var first = parseInt(table.find('>div:first-child').attr('id')); var update_submission = function (message, force) { if (language_filter.length && 'language' in message && language_filter.indexOf(message.language) == -1) return; if (status_filter.length && 'status' in message && status_filter.indexOf(message.status) == -1) return; var id = message.id; var row = table.find('div#' + id); if (row.length < 1) { if (id < first) return; first = id; row = $('<div>', {id: id, 'class': 'submission-row'}).hide().prependTo(table); if (table.find('>div').length >= {{ paginator.per_page }}) table.find('>div:last-child').hide('slow', function () { $(this).remove(); }); } if (force || !doing_ajax) { if (!force) doing_ajax = true; $.ajax({ url: '{{ url('submission_single_query') }}', data: {id: id, show_problem: show_problem} }).done(function (data) { var was_shown = row.is(':visible'); row.html(data); register_time(row.find('.time-with-rel')); if (!was_shown) { row.slideDown('slow'); } if (!force) setTimeout(function () { doing_ajax = false; }, 1000); }).fail(function () { console.log('Failed to update submission: ' + id); if (!force) doing_ajax = false; }); } }; var stats_outdated = false; var last_stat_update = Date.now(); var stats_update_interval = {{ stats_update_interval|default(0) * 1000 }}; function update_stats() { if (Date.now() - last_stat_update < stats_update_interval) return; $.ajax({ url: '?results' }).done(function (data) { last_stat_update = Date.now(); stats_graph(data); }).fail(function () { console.log('Failed to update statistics table!' + id); }).always(function () { stats_outdated = false; }); } $(window).on('dmoj:window-visible', function () { if (stats_outdated) update_stats(); }); var $body = $(document.body); var receiver = new EventReceiver( "{{ EVENT_DAEMON_LOCATION }}", "{{ EVENT_DAEMON_POLL_LOCATION }}", ['submissions'], last_msg, function (message) { if (current_contest && message.contest != current_contest) return; if (dynamic_user_id && message.user != dynamic_user_id || dynamic_problem_id && message.problem != dynamic_problem_id) return; if (message.type == 'update-submission') { if (message.state == 'test-case' && $body.hasClass('window-hidden')) return; update_submission(message); } else if (message.type == 'done-submission') { update_submission(message, true); if (!statistics.length) return; if ($('body').hasClass('window-hidden')) return stats_outdated = true; update_stats(); } } ); receiver.onwsclose = function (event) { if (event.code == 1001) { console.log('Navigated away'); return; } console.log('You probably should refresh?'); // $('.ws-closed').show().find('a').click(function () { // window.location.reload(); // }); }; return receiver; } </script> {% endcompress %} {% if dynamic_update and last_msg %} <script type="text/javascript"> $(function () { load_dynamic_update({{last_msg}}); }); </script> {% endif %} {% endblock %} {% block title_ruler %}{% endblock %} {% block title_row %}{% endblock %} {% block three_col_media %} {% if perms.judge.change_submission and perms.judge.rejudge_submission %} <style> td.sub-prop, col.sub-prop { width: 22% } col.sub-info, td.sub-info { width: 78% } #status, #language { visibility: hidden; } </style> {% endif %} <style> .total { text-align: center; margin-bottom: 0.5em; } #status-graph { padding: 1em 0em; } #status-graph canvas { display: block; margin: 0 auto; } </style> {% endblock %} {% block middle_title %} <div class="page-title"> <div class="tabs" style="border: none;"> <h2>{{content_title}}</h2> </div> </div> {% endblock %} {% block middle_content %} <div class="submission"> <div class="ws-closed"> <a href="javascript:void(0)">{{ _('You were disconnected. Refresh to show latest updates.') }}</a> </div> <div id="submissions-table"> {% set profile_id = request.profile.id if request.user.is_authenticated else 0 %} {% for submission in submissions %} <div class="submission-row" id="{{ submission.id }}"> {% with problem_name=show_problem and submission.problem.i18n_name %} {% include "submission/row.html" %} {% endwith %} </div> {% endfor %} </div> {% if page_obj.num_pages > 1 %} <div style="margin-top:10px;">{% include "list-pages.html" %}</div> {% endif %} </div> {% endblock %} {% block right_sidebar %} {% if results_json %} <div class="right-sidebar"> <div class="submission"> <div class="sidebox"> <h3>{{ _('Filter submissions') }} <i class="fa fa-search"></i></h3> <div class="sidebox-content"> <form id="filter-form" name="form" action="" method="get"> <div class="filter-form-group"> <label for="status"><i>{{ _('Status') }}</i></label> <select id="status" name="status" multiple> {% for id, name in all_statuses %} <option {% if id in selected_statuses %}selected{% endif %} value="{{ id }}">{{ name }}</option> {% endfor %} </select> </div> <div class="filter-form-group"> <label for="language"><i>{{ _('Language') }}</i></label> <select id="language" name="language" multiple> {% for code, name in all_languages %} <option {% if code in selected_languages %}selected{% endif %} value="{{ code }}">{{ name }}</option> {% endfor %} </select> </div> <div class="form-submit-group"> <a id="go" onclick="form.submit()" class="button small">{{ _('Go') }}</a> </div> </form> </div> </div> <div class="sidebox"> <div id="statistics-table"> <h3>{{ _('Statistics') }} <i class="fa fa-pie-chart"></i></h3> <div class="sidebox-content"> <div id="status-graph"> <canvas width="230" height="170"></canvas> </div> <div class="total"> {{ _('Total:') }} <span id="total-submission-count"></span> </div> </div> </div> </div> </div> </div> {% endif %} {% endblock %} {% block left_sidebar %} <div class="left-sidebar"> {{ make_tab_item('all_submissions_list', 'fa fa-list', all_submissions_link, _('All')) }} {% if my_submissions_link or tab == 'my_submissions_tab' %} {{ make_tab_item('my_submissions_tab', 'fa fa-user', my_submissions_link, _('Mine')) }} {% endif %} {% if best_submissions_link %} {{ make_tab_item('best_submissions_list', 'fa fa-bar-chart', best_submissions_link, _('Best')) }} {% endif %} {% if page_type == 'user_submissions_tab' %} {{ make_tab_item('user_submissions_tab', 'fa fa-user', None, _("%(user)s", user=tab_username)) }} {% endif %} {% if perms.judge.change_submission %} {{ make_tab_item('admin', 'fa fa-edit', url('admin:judge_submission_changelist'), _('Admin')) }} {% endif %} </div> {% endblock %}