diff --git a/webapp/templates/jury/analysis/contest_overview.html.twig b/webapp/templates/jury/analysis/contest_overview.html.twig index fea958e521..91980740cd 100644 --- a/webapp/templates/jury/analysis/contest_overview.html.twig +++ b/webapp/templates/jury/analysis/contest_overview.html.twig @@ -363,30 +363,40 @@ var submission_stats = [ { key: "{{result}}", color: "{{colors[result]}}", - values: [ - {% set current_minute = 0 %} - {% set minute_count = 0 %} - {% for minute in range(0, ((current_contest.endtime - current_contest.starttime) / 60)|round ) %} - {% set minute_count = 0 %} - {% for submission in submissions | filter(submission => submission.result) %} - {# Calculate which minute the submission belongs to #} - {% if submission.result == result %} - {% set submission_minute = ((submission.submittime - current_contest.starttime) / 60)|round %} - {% if submission_minute == minute %} - {% set minute_count = minute_count + 1 %} - {% endif %} - {% endif %} - {% endfor %} - {# The number of submissions in this minute #} - [{{ minute }}, {{ minute_count }}], - {% if minute_count > max_submissions_per_minute %} - {% set max_submissions_per_minute = minute_count %} - {% endif %} - {% endfor %} - ] + values: [] }, {% endfor %} ]; + +var submissions = [ + {% for submission in submissions %} + { + result: "{{ submission.result }}", + submittime: {{ submission.submittime }}, + starttime: {{ current_contest.starttime }} + }{{ loop.last ? '' : ',' }} + {% endfor %} +]; + +var contest_duration_minutes = {{ ((current_contest.endtime - current_contest.starttime) / 60)|round }}; + +submission_stats.forEach(stat => { + stat.values = Array.from({ length: contest_duration_minutes }, (_, i) => [i, 0]); +}); + +const statMap = submission_stats.reduce((map, stat) => { + map[stat.key] = stat; + return map; +}, {}); + +submissions.forEach(submission => { + let submission_minute = Math.round((submission.submittime - submission.starttime) / 60); + let stat = statMap[submission.result]; + if (stat && submission_minute >= 0 && submission_minute < contest_duration_minutes) { + stat.values[submission_minute][1]++; + } +}); + nv.addGraph(function() { var chart = nv.models.stackedAreaChart() // .margin({left: 100}) //Adjust chart margins to give the x-axis some breathing room.