Skip to content
Snippets Groups Projects
Commit 5dab3beb authored by Jan Prachař's avatar Jan Prachař
Browse files

UX changes for contest pages

parent e016c33b
No related branches found
No related tags found
No related merge requests found
......@@ -6,7 +6,7 @@
{% set can_upload = rights.can_upload_feedback() %}
{% set can_edit_points = rights.can_edit_points() %}
{% set can_create_solutions = rights.can_upload_feedback() or rights.can_upload_solutions() %}
{% set offer_view_statement = rights.offer_view_statement() %}
{% set offer_view_statement, offer_view_statement_reason = rights.offer_view_statement() %}
{% set can_view_contestants = rights.have_right(Right.view_contestants) %}
{% set can_view_submits = rights.can_view_submits() %}
......@@ -21,8 +21,73 @@
{% if site %}
<h3>Soutěžní místo: {{ site.name }}</h3>
{% endif %}
<table class="table table-bordered table-auto">
<tr><td>Stav<td><span>{{ state.friendly_name() }}</span>
{% if not site %}
<div class="row">
<div class="col-sm-7">
<div class="panel panel-default">
<table class="table table-bordered">
<tr>
<td>Zadání úloh
<td>
{% if offer_view_statement %}
<a class="btn btn-default" href='{{ ctx.url_for('org_task_statement', ct_id=None) }}'>
<img class="media-object" src="{{ url_for('static', filename='img/pdficon.svg') }}" alt="PDF" style="width: 24px; display: inline-block">
Stáhnout
</a>
{% else %}
{{ offer_view_statement_reason }}
{% endif %}
<tr><td>Moje role<td>{% if g.user.is_admin %}správce{% elif roles %}{{ roles|join(", ") }}{% else %}–{% endif %}
{% if group_contests|length > 1 %}
<tr><td>Soutěže ve skupině kol<td>
{% for c in group_contests %}
{% if c != contest %}<a href="{{ url_for('org_contest', ct_id=c.contest_id, site_id=(site.place_id if site else None)) }}">{% endif %}
{{ c.round.name }} {{ c.round.category }}
{% if c != contest %}</a>{% endif %}<br>
{% endfor %}
{% endif %}
</table>
{% if can_manage or g.user.is_admin %}
<div class="panel-footer">
{% if can_manage %}
<a class="btn btn-xs btn-default" href='{{ ctx.url_for('org_contest_edit') }}'><span class="glyphicon glyphicon-cog"></span> Nastavení</a>
{% endif %}
{% if g.user.is_admin %}
<a class="btn btn-xs btn-info" href="{{ log_url('contest', ctx.ct_id) }}">Historie</a>
{% endif %}
</div>
{% endif %}
</div>
</div>
<div class="col-sm-5">
<div
{% if state == RoundState.preparing %}
class="panel panel-warning"
{% elif state == RoundState.running %}
class="panel panel-success"
{% elif state == RoundState.grading %}
class="panel panel-info"
{% else %}
class="panel panel-default"
{% endif %}>
<div class="panel-heading">
<h3 class="panel-title">
{% if state == RoundState.preparing %}
<span class="glyphicon glyphicon-star"></span>
{% elif state == RoundState.running %}
<span class="glyphicon glyphicon-play"></span>
{% elif state == RoundState.grading %}
<span class="glyphicon glyphicon-pencil"></span>
{% else %}
<span class="glyphicon glyphicon-stop"></span>
{% endif %}
Stav soutěže
</h3>
</div>
<div class="panel-body">
<p style="display: inline-block; padding-right: 1rem">
{{ round.name }} <b>{{ state.friendly_name()|replace("opravuje se", "se opravuje")|replace("připravuje se", "se připravuje") }}</b>
{% if round.state != RoundState.delegate %}
(určeno nastavením kola)
{% elif can_manage and not site %}
......@@ -39,60 +104,68 @@
<input type="hidden" name="state" value="{{ RoundState.closed.name }}">
</form>
{% endif %}
{% else %}
{% endif %}
<tr><td>Stav pro účastníky<td><span>{{ ct_state.friendly_name() }}</span>
<tr><td>Moje role<td>{% if g.user.is_admin %}správce{% elif roles %}{{ roles|join(", ") }}{% else %}–{% endif %}
{% if group_contests|length > 1 %}
<tr><td>Soutěže ve skupině kol<td>
{% for c in group_contests %}
{% if c != contest %}<a href="{{ url_for('org_contest', ct_id=c.contest_id, site_id=(site.place_id if site else None)) }}">{% endif %}
{{ c.round.name }} {{ c.round.category }}
{% if c != contest %}</a>{% endif %}<br>
{% endfor %}
{% endif %}
<tr><td>Zadání<td>
{% if round.tasks_file %}
{% if offer_view_statement %}
<a href='{{ ctx.url_for('org_task_statement', ct_id=None) }}'>stáhnout</a>
{% else %}
není dostupné
{% if state != ct_state %}
<p>Účastníci vidí stav: {{ ct_state.friendly_name() }}
{% endif %}
{% else %}
</div>
</div>
</div>
</div>
{% endif %}
</table>
{% if can_view_contestants or can_upload or can_manage %}{# Ostatní práva implikují některé z těchto #}
<div>
{% if can_view_contestants %}
<a class="btn btn-primary" href='{{ ctx.url_for('org_generic_list') }}'>Seznam účastníků</a>
<div class="row">
{% if can_view_contestants or can_manage %}
<div class="col-md-7">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">
<span class="glyphicon glyphicon-user"></span>
Účastníci
{% if places_counts %}
(celkem {{ places_counts|sum(attribute=1) }})
{% endif %}
{% if can_view_submits and state != RoundState.preparing %}
<a class="btn btn-success" href='{{ ctx.url_for('org_contest_solutions') }}'>Odevzdaná řešení a opravy</a>
</h3>
</div>
<div class="panel-body">
{% if can_view_contestants %}
<a class="btn btn-primary" href='{{ ctx.url_for('org_generic_list') }}'><span class="glyphicon glyphicon-check"></span> Seznam</a>
{% endif %}
{% if not site and can_manage %}
<a class="btn btn-default" href="{{ ctx.url_for('org_contest_add_user') }}">Přidat účastníka</a>
<a class="btn btn-default" href="{{ ctx.url_for('org_contest_add_user') }}"><span class="glyphicon glyphicon-plus-sign"></span> Přidat</a>
{% if state != RoundState.closed and round.seq > 1 %}
<a class="btn btn-default" href='{{ ctx.url_for('org_contest_advance') }}'><span class="glyphicon glyphicon-circle-arrow-up"></span> Postup z minulého kola</a>
{% endif %}
{% if not site and ((can_view_contestants and state == RoundState.grading) or state == RoundState.closed) %}
<a class="btn btn-warning" href='{{ ctx.url_for('org_score') }}'>Výsledky</a>
<a class="btn btn-default" href='{{ ctx.url_for('org_generic_import') }}'><span class="glyphicon glyphicon-import"></span> Importovat CSV</a>
{% endif %}
{% if can_manage and not site %}
{% if state != RoundState.closed and round.seq > 1 %}
<a class="btn btn-primary" href='{{ ctx.url_for('org_contest_advance') }}'>Postup z minulého kola</a>
</div>
</div>
</div>
{% endif %}
<a class="btn btn-default" href='{{ ctx.url_for('org_generic_import') }}'>Importovat data</a>
<a class="btn btn-default" href='{{ ctx.url_for('org_contest_edit') }}'>Nastavení</a>
{% if state != RoundState.preparing and (can_view_contestants or can_view_submits) %}
<div class="col-md-5">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">
<span class="glyphicon glyphicon-duplicate"></span>
Odevzdaná řešení a opravy
</h3>
</div>
<div class="panel-body">
{% if can_view_submits and state != RoundState.preparing %}
<a class="btn btn-success" href='{{ ctx.url_for('org_contest_solutions') }}'><span class="glyphicon glyphicon-th-list"></span> Tabulka řešení</a>
{% endif %}
{% if not site and g.user.is_admin %}
<a class="btn btn-info" href="{{ log_url('contest', ctx.ct_id) }}">Historie</a>
{% if not site and ((can_view_contestants and state == RoundState.grading) or state == RoundState.closed) %}
<a class="btn btn-warning" href='{{ ctx.url_for('org_score') }}'><span class="glyphicon glyphicon-bullhorn"></span> Výsledky</a>
{% endif %}
</div>
</div>
</div>
{% endif %}
</div>
{% if not site %}
{% if not site and places_counts|length > 1 %}
<h3>Soutěžní místa</h3>
{% if places_counts %}
<table class="table table-bordered table-auto">
<thead>
<tr><th>Místo<th>Počet účastníků<th>Akce
......@@ -117,19 +190,11 @@
</tr>
</tfoot>
</table>
{% else %}
<p><i>Žádní účastníci a žádná soutěžní místa.</i></p>
{% endif %}
{% endif %}
{% if can_manage and not site %}
<div>
<a class="btn btn-default" href='{{ ctx.url_for('org_contest_add_user') }}'>Přidat účastníka</a>
</div>
{% endif %}
<h3>Úlohy</h3>
{% if tasks %}
<table class="table table-bordered">
<table class="table table-bordered table-responsive">
<thead>
<tr>
<th>Kód
......@@ -153,9 +218,6 @@
{% if not site and can_edit_points %}
<a class="btn btn-xs btn-default" href="{{ ctx.url_for('org_contest_task_points', task_id=task.task_id) }}">Zadat body</a>
{% endif %}
{% if can_create_solutions %}
<a class="btn btn-xs btn-default" href="{{ ctx.url_for('org_contest_task_create', task_id=task.task_id) }}">Založit řešení</a>
{% endif %}
<td>
{% if can_view_submits %}
<a class="btn btn-xs btn-primary" href="{{ ctx.url_for('org_generic_batch_download', task_id=task.task_id) }}">Stáhnout ZIP</a>
......
......
......@@ -26,8 +26,7 @@ To se hodí, pokud se nechystáte do systému nahrávat soubory řešení, ale j
bylo možné vyplnit body. Pokud nějaké řešení založíte omylem, lze toto prázdné řešení smazat v jeho detailu.
{% else %}
Všechna odevzdání od účastníka k úloze můžete vidět po kliknutí na ikonku <span class="icon">🔍</span>.
Odkazem v záhlaví se lze dostat na detailní výpis odevzdání všech uživatelů pro
konkrétní úlohu. Symbol <span class="icon">🗐</span> značí, že existuje více verzí dostupných v detailu.
Odkazem v záhlaví se lze dostat na podrobný výpis odevzdání všech účastníků k dané úloze. Symbol <span class="icon">🗐</span> značí, že existuje více verzí dostupných v detailu.
{% endif %}
</i></p>
......@@ -54,7 +53,7 @@ konkrétní úlohu. Symbol <span class="icon">🗐</span> značí, že existuje
<th rowspan=2>Body celkem
</tr>
<tr>
{% for task in tasks %}<th title="Řešení">Ř<th title="Oprava">Opr<th title="Body">B<th title="Detail"><span class="icon">🔍</span>{% endfor %}
{% for task in tasks %}<th title="Řešení">Ř<th title="Oprava">O<th title="Body">B<th title="Detail"><span class="icon">🔍</span>{% endfor %}
</tr>
</thead>
{% for pion in pions %}
......@@ -116,9 +115,9 @@ konkrétní úlohu. Symbol <span class="icon">🗐</span> značí, že existuje
<tr><td><td>
{% for task in tasks %}
<td colspan=4>
<a class='btn btn-xs btn-primary' href="{{ ctx.url_for('org_generic_batch_download', task_id=task.task_id) }}">Stáhnout</a>
<a class='btn btn-xs btn-primary' href="{{ ctx.url_for('org_generic_batch_download', task_id=task.task_id) }}"><span class="glyphicon glyphicon-cloud-download"></span> Stáhnout</a>
{% if rights.can_upload_feedback() %}
<a class='btn btn-xs btn-primary' href="{{ ctx.url_for('org_generic_batch_upload', task_id=task.task_id) }}">Nahrát</a>
<a class='btn btn-xs btn-primary' href="{{ ctx.url_for('org_generic_batch_upload', task_id=task.task_id) }}">Nahrát opravy</a>
{% endif %}
{% endfor %}
<td>
......
......
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% set contest=ctx.contest %}
{% set allow_edit_points=rights.can_edit_points() %}
{% set allow_upload_solutions=rights.can_upload_solutions() %}
{% set allow_upload_feedback=rights.can_upload_feedback() %}
......@@ -10,12 +11,20 @@
{% endblock %}
{% block pretitle %}
<div class="btn-group pull-right">
<a class="btn btn-success" href="{{ ctx.url_for('org_contest_solutions', task_id=None) }}">Tabulka řešení</a>
{% if ctx.contest.state in [RoundState.grading, RoundState.closed] %}
<a class="btn btn-warning" href="{{ ctx.url_for('org_score', task_id=None) }}">Výsledky {{ ctx.round.get_level().name_genitive() }}</a>
<div class="panel panel-default pull-right">
<div class="panel-heading">
<h3 class="panel-title">
Soutěž {{ contest.place.name_locative() }}
</h3>
</div>
<div class="panel-body">
<a class="btn btn-primary" href="{{ ctx.url_for('org_generic_list') }}"><span class="glyphicon glyphicon-check"></span> Účastníci</a>
<a class="btn btn-success" href="{{ ctx.url_for('org_contest_solutions') }}"><span class="glyphicon glyphicon-th-list"></span> Tabulka řešení</a>
{% if contest.state in [RoundState.grading, RoundState.closed] %}
<a class="btn btn-warning" href="{{ ctx.url_for('org_score') }}"><span class="glyphicon glyphicon-bullhorn"></span> Výsledky</a>
{% endif %}
</div>
</div>
{% endblock %}
{% block body %}
{% include "parts/org_submit_warning.html" %}
......@@ -36,15 +45,15 @@
</form>
{% else %}
<div>
<a class='btn btn-primary' href="{{ ctx.url_for('org_generic_batch_download') }}">Stáhnout řešení</a>
<a class='btn btn-primary' href="{{ ctx.url_for('org_generic_batch_download') }}"><span class="glyphicon glyphicon-cloud-download"></span> Stáhnout řešení</a>
{% if allow_upload_feedback %}
<a class='btn btn-primary' href="{{ ctx.url_for('org_generic_batch_upload') }}">Nahrát opravená řešení</a>
<a class='btn btn-primary' href="{{ ctx.url_for('org_generic_batch_upload') }}"><span class="glyphicon glyphicon-cloud-upload"></span> Nahrát ZIP opravených řešení</a>
{% endif %}
{% if allow_create_solutions %}
<a class="btn btn-primary" href="{{ ctx.url_for('org_contest_task_create') }}">Založit řešení</a>
{% endif %}
{% if not ctx.site and allow_edit_points %}
<a class="btn btn-primary" href="{{ ctx.url_for('org_contest_task_points') }}">Zadat body</a>
<a class="btn btn-primary" href="{{ ctx.url_for('org_contest_task_points') }}"><span class="glyphicon glyphicon-pencil"></span> Zadat body</a>
{% endif %}
</div>
{% endif %}
......
......
......@@ -12,26 +12,41 @@
{% block pretitle %}
<div class="btn-group pull-right">
<a class="btn btn-default" href="{{ user|user_url }}">Detail uživatele</a>
<a class="btn btn-primary" href="{{ ctx.url_for('org_generic_list') }}">Účastníci</a>
<a class="btn btn-success" href="{{ ctx.url_for('org_contest_solutions') }}">Tabulka řešení</a>
{% if contest.state in [RoundState.grading, RoundState.closed] %}
<a class="btn btn-warning" href="{{ ctx.url_for('org_score') }}">Výsledky</a>
{% endif %}
<a class="btn btn-default" href="{{ user|user_url }}"><span class="glyphicon glyphicon-user"></span> Detail uživatele</a>
</div>
{% endblock %}
{% block body %}
<div class="panel panel-default pull-right">
<div class="panel-heading">
<h3 class="panel-title">
Soutěž {{ contest.place.name_locative() }}
</h3>
</div>
<div class="panel-body">
<a class="btn btn-primary" href="{{ ctx.url_for('org_generic_list') }}"><span class="glyphicon glyphicon-check"></span> Účastníci</a>
<a class="btn btn-success" href="{{ ctx.url_for('org_contest_solutions') }}"><span class="glyphicon glyphicon-th-list"></span> Tabulka řešení</a>
{% if contest.state in [RoundState.grading, RoundState.closed] %}
<a class="btn btn-warning" href="{{ ctx.url_for('org_score') }}"><span class="glyphicon glyphicon-bullhorn"></span> Výsledky</a>
{% endif %}
</div>
</div>
<table class="table table-bordered table-auto">
<tr><td>Škola:<td><a href='{{ url_for('org_place', id=pant.school) }}'>{{ pant.school_place.name }}</a>
<tr><td>Třída:<td>{{ pant.grade }}
{% if user.note %}
<tr><td>Poznámka:<td style="white-space: pre-line;">{{ user.note }}
<tbody>
<tr>
<th>Stav účasti
{% if contest.place != ctx.pion.place %}
<th>Soutěžní místo
{% endif %}
<th>Škola
<th>Třída
<tr>
<td>{{ ctx.pion.state.friendly_name() }}
{% if contest.place != ctx.pion.place %}
<tr><td>Soutěžní místo:<td><a href='{{ ctx.url_for('org_contest', site_id=ctx.pion.place_id) }}'>{{ ctx.pion.place.name }}</a>
<td><a href='{{ ctx.url_for('org_contest', site_id=ctx.pion.place_id) }}'>{{ ctx.pion.place.name }}</a>
{% endif %}
<tr><td>Stav účasti:<td>{{ ctx.pion.state.friendly_name() }}
<td><a href='{{ url_for('org_place', id=pant.school) }}'>{{ pant.school_place.name }}</a>
<td>{{ pant.grade }}
</table>
......
......
......@@ -10,9 +10,20 @@
{% endblock %}
{% block pretitle %}
<div class="btn-group pull-right">
<a class="btn btn-default" href="{{ ctx.url_for('org_contest_user') }}">{{ ctx.round.name }} {{ ctx.round.category }}: {{ ctx.user.full_name() }}</a>
<a class="btn btn-success" href="{{ ctx.url_for('org_contest_solutions', task_id=None) }}">Tabulka řešení</a>
<div class="hidden-md hidden-sm hidden-xs" style="width: 100%; position: relative">
<div class="panel panel-default" style="position: absolute; right: 0">
<div class="panel-heading">
<h3 class="panel-title">
<span class="glyphicon glyphicon-menu-left"></span>
Zpět na všechna řešení
</h3>
</div>
<div class="panel-body">
<a class="btn btn-default" href="{{ ctx.url_for('org_contest_user') }}"><span class="glyphicon glyphicon-user"></span> {{ ctx.user.full_name() }}</a>
<a class="btn btn-default" href="{{ ctx.url_for('org_contest_task', user_id=None) }}"><span class="glyphicon glyphicon-duplicate"></span> Úloha {{ ctx.task.code }}</a>
<a class="btn btn-success" href="{{ ctx.url_for('org_contest_solutions', task_id=None) }}"><span class="glyphicon glyphicon-th-list"></span> Tabulka řešení</a>
</div>
</div>
</div>
{% endblock %}
......
......
......@@ -56,7 +56,7 @@
<td>{{ participant.birth_year }}
<td>
<a class="btn btn-xs btn-primary" href="{{ url_for('org_user_participant_edit', user_id=user.user_id, year=participant.year) }}">Editovat</a>
<form method="POST" onsubmit="return confirm('Opravdu nenávratně smazat?')" action='{{ url_for('org_user_participant_delete', user_id=user.user_id, year=participant.year) }}'>
<form class="btn-group" method="POST" onsubmit="return confirm('Opravdu nenávratně smazat?')" action='{{ url_for('org_user_participant_delete', user_id=user.user_id, year=participant.year) }}'>
<input class="btn btn-xs btn-danger" type=submit value='Smazat'>
</form>
</tr>
......@@ -71,27 +71,24 @@
<table class="table table-bordered">
<thead>
<tr>
<th>Ročník<th>Kategorie<th>Kolo<th>Místo<th>Stav účasti<th>Odkazy
<th>Ročník<th>Kolo<th>Místo<th>Stav účasti<th>Odkazy
</tr>
</thead>
{% for (pion, contest, round) in participations %}
<tr>
<td>{{ round.year }}
<td>{{ round.category }}
<td>{{ round.seq }}{{ round.part_code() }}
<td>{{ round.name }} {{round.category }}
<td><a href="{{ url_for('org_place', id=contest.place_id) }}">{{ contest.place.name }}</a>
{% if pion.place_id != contest.place_id %}
<br>(soutěžní místo <a href="{{ url_for('org_place', id=pion.place_id) }}">{{ pion.place.name }}</a>)
{% endif %}
<td>{{ pion.state.friendly_name() }}
<td><div class="btn-group">
<td>
<a class="btn btn-xs btn-primary" href="{{ url_for('org_contest_user', ct_id=contest.contest_id, user_id=user.user_id) }}">Odevzdané úlohy</a>
<a class="btn btn-xs btn-default" href="{{ url_for('org_contest', ct_id=contest.contest_id) }}">Stránka soutěže</a>
<a class="btn btn-xs btn-default" href="{{ url_for('org_round', round_id=round.round_id) }}">Stránka kola</a>
{% if g.user.is_admin %}
<a class="btn btn-xs btn-info" href="{{ log_url('participant', user.user_id) }}">Historie</a>
{% endif %}
</div>
</tr>
{% endfor %}
</table>
......
......
......@@ -251,6 +251,9 @@ select.no-scroll::-webkit-scrollbar {
-moz-osx-font-smoothing: grayscale;
}
.pdf-icon {
border: 1px solid transparent;
}
.pdf-icon:hover, .pdf-icon:focus {
text-decoration: none;
border: 1px solid #337ab7;
......
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment