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

org_solution_table: Předělána tabulka řešení jedné úlohy

 * Odkazy na PDF jsou tlačítka s barvou pozadí stejnou jako na Tabulce
   řešení.
 * Odkazy na PDF mají jako text jméno toho, kdo řešení nahrál, místo
   data a času nahrání.
 * Zobrazujeme první řádek poznámky, celá poznámka je v popover –
   přehlednější než původní browser title.
parent 5e030d32
No related branches found
No related tags found
No related merge requests found
......@@ -2,27 +2,27 @@
{% set edit_create = rights.can_create_solutions() %}
{% set edit_both = edit_points and edit_create %}
<p><i>
<p>
{% if edit_form %}
{% if edit_points %}
Změňte body ve sloupečku "Přidělené body". Prázdná hodnota znamená "nebodováno".
Změňte body ve sloupečku "Body". Prázdná hodnota znamená "nebodováno".
{% endif %}
{% if edit_create %}
Zaškrtnutím políček u řešení, která dosud neexistují, tato řešení založíte.
To se hodí, pokud se nechystáte do systému nahrávat soubory řešení, ale jen chcete řešení vytvořit, aby jim
bylo možné vyplnit body. Pokud nějaké řešení založíte omylem, lze toto prázdné řešení smazat v jeho detailu.
{% endif %}
</i></p>
<p><i>
</p>
<p>
Změny uložíte tlačítkem na spodku tabulky.
{% else %}
Historii všech odevzdání, oprav a bodů pro každé řešení naleznete v jeho detailu.
{% if rights.can_upload_feedback() or rights.can_edit_points() %}Tamtéž můžete odevzdávat nové verze a změnit, které řešení/oprava je
finální (ve výchozím stavu poslední nahrané).{% elif rights.can_upload_solutions() %}Tamtéž můžete odevzdat nové řešení.{% endif %}
{% endif %}
</i></p>
</p>
<div class="table-responsive">
<div class="table-responsive" style="clear: right">
<table class="table table-bordered table-hover table-condensed">
<thead>
<tr>
......@@ -33,8 +33,9 @@ finální (ve výchozím stavu poslední nahrané).{% elif rights.can_upload_sol
{% endif %}
<th>Finální řešení
<th>Finální oprava
<th>Poznámky
<th>Přidělené body
<th>Poznámka pro účastníka
<th>Interní poznámka
<th style="min-width: 10rem">Body
{% if not for_user and edit_points and not edit_form %}
<a class="btn btn-xs btn-default" title="Editovat body" href="{{ ctx.url_for('org_contest_task_edit') }}"><span class="glyphicon glyphicon-pencil"></span></a>
{% endif %}
......@@ -67,41 +68,48 @@ finální (ve výchozím stavu poslední nahrané).{% elif rights.can_upload_sol
<td>{% if sol.final_submit_obj %}
{% set p = sol.final_submit_obj %}
{% set late = p.check_deadline(round, contest) %}
{% if late %}<span class='text-danger icon' title="{{ late }}"></span>{% endif %}
<a href='{{ paper_link(u, p) }}'>
{{- p.uploaded_at|timeformat }}
{% if p.is_broken() %}
(nekorektní PDF)
{% elif p.pages != None %}
({{ p.pages|inflected('strana', 'strany', 'stran') }})
{% endif %}
</a>
{% if p.uploaded_by_obj != u %}
<a href="{{ url_for('org_user', id=p.uploaded_by) }}" title="nahrál {{ p.uploaded_by_obj.full_name() }}" class="icon">🛈</a>
{% endif %}
{% set key = (obj.task_id if for_user else obj.user_id, "solution") %}
<a class="btn btn-xs btn-{% if late %}danger{% elif p.is_broken() %}warning{% else %}success{% endif %}"
title="Řešení nahráno {{ late|none_value('') }} {{ p.uploaded_at|timeformat }} – {% if p.is_broken() %}nekorektní PDF{% elif p.pages != None %}{{ p.pages|inflected('strana', 'strany', 'stran') }}{% endif %}{% if key in paper_counts and paper_counts[key] > 1 %} – {{ paper_counts[key]|inflected('verze', 'verze', 'verzí') }}{% endif %}"
href="{{ paper_link(u, p) }}">
{% if key in paper_counts and paper_counts[key] > 1 %}
<span title="Celkem {{ paper_counts[key]|inflected('verze', 'verze', 'verzí') }}" class="icon">🗐</span>
<span class="glyphicon glyphicon-duplicate"></span>
{% else %}
<span class="glyphicon glyphicon-file"></span>
{% endif %}
{{ p.uploaded_by_obj.full_name() }}
</a>
{% endif %}
{% else %}–{% endif %}
<td>{% if sol.final_feedback_obj %}
{% set p = sol.final_feedback_obj %}
<a title="nahrál {{ p.uploaded_by_obj.full_name() }}" href='{{ paper_link(u, p) }}'>
{{ (p.uploaded_at if p else None)|timeformat }}
{% if p.is_broken() %}
(nekorektní PDF)
{% elif p.pages != None %}
({{ p.pages|inflected('strana', 'strany', 'stran') }})
{% endif %}
</a>
{% set key = (obj.task_id if for_user else obj.user_id, "feedback") %}
<a class="btn btn-xs btn-info"
title="Oprava nahrána {{ p.uploaded_at|timeformat }} – {% if p.is_broken() %}nekorektní PDF{% elif p.pages != None %}{{ p.pages|inflected('strana', 'strany', 'stran') }}{% endif %}{% if key in paper_counts and paper_counts[key] > 1 %} – {{ paper_counts[key]|inflected('verze', 'verze', 'verzí') }}{% endif %}"
href="{{ paper_link(u, p) }}">
{% if key in paper_counts and paper_counts[key] > 1 %}
<span title="Celkem {{ paper_counts[key]|inflected('verze', 'verze', 'verzí') }}" class="icon">🗐</span>
<span class="glyphicon glyphicon-duplicate"></span>
{% else %}
<span class="glyphicon glyphicon-file"></span>
{% endif %}
{{ p.uploaded_by_obj.full_name() }}
</a>
{% endif %}
<td class="comment">
{% if sol.note %}
{% set lines = sol.note.strip().partition('\n') %}
{% if lines[2] != '' %}
<button class="btn btn-xs btn-default pull-right" data-container="body" data-toggle="popover" data-placement="left" data-trigger="hover focus" data-content="{{ sol.note }}"><span class="glyphicon glyphicon-option-horizontal"></span></button>
{% endif %}
<span title="{{ lines[0] }}">{{ lines[0] }}</span>
{% endif %}
<td class="comment">
{% if sol.org_note %}
{% set lines = sol.org_note.strip().partition('\n') %}
{% if lines[2] != '' %}
<button class="btn btn-xs btn-default pull-right" data-container="body" data-toggle="popover" data-placement="left" data-trigger="hover focus" data-content="{{ sol.org_note }}"><span class="glyphicon glyphicon-option-horizontal"></span></button>
{% endif %}
<span title="{{ lines[0] }}">{{ lines[0] }}</span>
{% endif %}
{% else %}–{% endif %}
<td style="text-align: center;">
{% if sol.note %}<span class="glyphicon glyphicon-comment" title="Poznámka pro řešitele: {{ sol.note }}"></span>{% endif %}
{% if sol.org_note %} <span class="glyphicon glyphicon-comment" title="Interní poznámka: {{ sol.org_note }}"></span>{% endif %}
<td>
{% if edit_points and edit_form %}
<input
......@@ -117,7 +125,7 @@ finální (ve výchozím stavu poslední nahrané).{% elif rights.can_upload_sol
{{ sol.points|decimal|none_value(Markup('<span class="unknown">?</span>')) }}
{% endif %}
{% elif edit_create and edit_form %}
<td colspan="{{ 3 if edit_points else 4 }}" class="text-center">
<td colspan="{{ 4 if edit_points else 5 }}" class="text-center">
<input
type="checkbox" name="create_sol_{{u.user_id}}" id="create_sol_{{u.user_id}}"
onchange="document.getElementById('points_{{u.user_id}}').disabled = !this.checked"
......@@ -138,17 +146,20 @@ finální (ve výchozím stavu poslední nahrané).{% elif rights.can_upload_sol
{% set tabindex.value = tabindex.value + 1%}
{% endif %}
{% else %}
<td colspan="4" class="text-center">
<td colspan="5" class="text-center">
{% endif %}
<td><div class="btn-group">
<a class="btn btn-xs btn-primary" href="{{ ctx.url_for('org_submit_list', user_id=u.user_id, task_id=task.task_id, site_id=ctx.site_id) }}">Detail</a>
<a class="btn btn-xs btn-primary" href="{{ ctx.url_for('org_submit_list', user_id=u.user_id, task_id=task.task_id, site_id=ctx.site_id) }}">
<span class="glyphicon glyphicon-search"></span>
Detail
</a>
</div>
</tr>
{% endfor %}
{% if edit_form %}
<tfoot>
<tr><td><td><td>
<td colspan="3" class="text-center">
<td colspan="4" class="text-center">
<a class="btn btn-sm btn-default" href="#" onclick="checkAllAbove(event)">
<span class="glyphicon glyphicon-arrow-up"></span>
Zaškrtnout vše
......@@ -161,12 +172,6 @@ finální (ve výchozím stavu poslední nahrané).{% elif rights.can_upload_sol
</table>
</div>
{% if not edit_form %}
<p><i>Legenda: <span class='text-danger icon'></span> odevzdané po termínu,
<span class="icon">🛈</span> nahráno někým jiným, než řešitelem, <span class="icon">🗐</span> existuje více verzí. Symboly po najetí myší zobrazí bližší informace.
</i></p>
{% endif %}
<script type="text/javascript">
window.addEventListener("load", function() {
for (const ch of document.querySelectorAll("input[type=checkbox")) {
......@@ -175,6 +180,8 @@ finální (ve výchozím stavu poslední nahrané).{% elif rights.can_upload_sol
for (const i of document.querySelectorAll("input[type=number]")) {
i.oninput();
}
$('[data-toggle="popover"]').popover();
});
checkAllAbove = function() {
......
......@@ -149,6 +149,19 @@ td ul {
list-style-type: none;
}
td.comment {
font-size: 0.9em;
max-width: 15rem;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.popover {
max-width: 360px;
white-space: pre-line;
}
table tr.state-disqualified, table tr.state-disqualified a:not(.btn) {
color: darkred;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment