ui: enhanced contest management page (#476)

This commit is contained in:
undefined authored and GitHub committed 2022-12-31 20:04:46 +08:00
1 parent d4cc5e9c5b
commit ee1cfd8fe5
14 files changed
+173 -109

No files matched your search

@@ -159,3 +159,7 @@ $highlight-button-color = #F6DF45
.col--problem
display: none
.page--contest_user
.col--uid
width: rem(100px)
@@ -65,7 +65,7 @@ const page = new NamedPage('contest_user', () => {
});
if (res.url && res.url !== window.location.href) window.location.href = res.url;
else {
Notification.success(i18n('User has been added.'));
Notification.success(i18n('User added.'));
pjax.request({ push: false });
}
} catch (error) {
@@ -82,7 +82,7 @@ const page = new NamedPage('contest_user', () => {
});
if (res.url && res.url !== window.location.href) window.location.href = res.url;
else {
Notification.success(i18n('User Rank has been edited.'));
Notification.success(i18n('Ranking status updated.'));
pjax.request({ push: false });
}
} catch (error) {
+1 -1
View File
@@ -92,7 +92,7 @@ function handleDrop(ev) {
handleClickUpload(files);
}
const page = new NamedPage(['home_files', 'contest_files', 'training_files'], () => {
const page = new NamedPage(['home_files', 'contest_manage', 'training_files'], () => {
$(document).on('click', '[name="upload_file"]', () => handleClickUpload());
$(document).on('click', '[name="remove_selected"]', () => handleClickRemoveSelected());
$(document).on('dragover', '.files', (ev) => handleDragOver(ev));
+1 -1
View File
@@ -1,4 +1,4 @@
.page--home_files,.page--contest_files,.page--training_files
.page--home_files,.page--contest_manage,.page--training_files
.col--checkbox
width: 60px
@@ -1,31 +0,0 @@
{% extends "layout/basic.html" %}
{% block content %}
<div class="row">
<div class="medium-9 columns">
<div class="section">
<div class="section__body">
<form method="post">
{{ form.form_textarea({
columns:null,
label:'Content',
name:'content',
value:''
}) }}
<div class="row"><div class="columns">
<input type="hidden" name="csrfToken" value="{{ handler.csrfToken }}">
<button type="submit" class="rounded primary button">
{{ _('Send') }}
</button>
<button type="button" class="rounded button" onclick="window.history.go(-1)">
{{ _('Cancel') }}
</button>
</div></div>
</form>
</div>
</div>
</div>
<div class="medium-3 columns">
{% include 'components/md_hint.html' %}
</div>
</div>
{% endblock %}
@@ -37,6 +37,14 @@
{% endif %}
</div>
</div>
{% if tdoc.files.length %}
<div class="section">
<div class="section__header">
<h1 class="section__title">{{ _('Files') }}</h1>
</div>
{% include "partials/files.html" %}
</div>
{% endif %}
</div>
<div class="medium-3 columns">
{% set owner_udoc = udict[tdoc.owner] %}
@@ -1,24 +0,0 @@
{% extends "layout/basic.html" %}
{% block content %}
{{ set(UiContext, 'tdoc', tdoc) }}
<div class="row">
<div class="medium-9 columns">
<div class="section">
<div class="section__header">
<h1 class="section__title">{{ _('Files') }}</h1>
<div class="section__tools">
<button class="primary rounded button" name="upload_file">{{ _('Upload File') }}</button>
</div>
</div>
{{ noscript_note.render() }}
{% include "partials/files.html" %}
<div class="section__body">
<button class="rounded button" name="remove_selected">{{ _('Remove Selected') }}</button>
</div>
</div>
</div>
<div class="medium-3 columns">
{% include "partials/contest_sidebar.html" %}
</div>
</div>
{% endblock %}
@@ -0,0 +1,72 @@
{% extends "layout/basic.html" %}
{% block content %}
<div class="row">
<div class="medium-5 columns">
<div class="section">
<div class="section__body no-padding">
<table class="data-table">
<colgroup>
<col class="col--problem">
</colgroup>
<thead>
<tr>
<th class="col--problem">{{ _('Problem') }}</th>
</tr>
</thead>
<tbody>
{%- for pid in tdoc.pids -%}
<tr>
<td class="col--problem col--problem-name">
<a href="{{ url('problem_detail', pid=pid) }}">
<b>{{ String.fromCharCode(65+loop.index0) }}</b>&nbsp;&nbsp;{{ pdict[pid].title }}
</a>
</td>
</tr>
{%- endfor -%}
</tbody>
</table>
</div>
</div>
</div>
<div class="medium-4 columns">
<div class="section">
<div class="section__header">
<h1 class="section__title">{{ _('Files') }}</h1>
<div class="section__tools">
<button class="primary rounded button" name="upload_file">{{ _('Upload File') }}</button>
</div>
</div>
{{ noscript_note.render() }}
{% include "partials/files.html" %}
<div class="section__body">
<button class="rounded button" name="remove_selected">{{ _('Remove Selected') }}</button>
</div>
</div>
{% if model.contest.isOngoing(tdoc) %}
<div class="section">
<div class="section__header">
<h1 class="section__title">{{ _('Broadcast Message') }}</h1>
</div>
<div class="section__body">
<form method="post">
{{ form.form_textarea({
columns:null,
label:'Content',
name:'content',
value:''
}) }}
<div class="row"><div class="columns">
<button type="submit" class="rounded primary button">
{{ _('Send') }}
</button>
</div></div>
</form>
</div>
</div>
{% endif %}
</div>
<div class="medium-3 columns">
{% include 'partials/contest_sidebar_management.html' %}
</div>
</div>
{% endblock %}
@@ -8,7 +8,7 @@
<div class="medium-9 columns">
<div class="section">
<div class="section__header">
<h1 class="section__title">{{ _('Problem') }}</h1>
<h1 class="section__title">{{ _('Problems') }}</h1>
</div>
<div class="section__body no-padding">
<table class="data-table">
@@ -58,7 +58,7 @@
</a>
{% endif %}
</li>
{% endif %}
{% endif %}{# not attend and not done #}
{% if model.contest.canShowScoreboard.call(handler, tdoc, False) %}
<li class="menu__item"><a class="menu__link" href="{{ url('contest_scoreboard', tid=tdoc.docId) }}">
<span class="icon icon-statistics"></span> {{ _('Scoreboard') }}
@@ -72,11 +72,8 @@
<li class="menu__item"><a class="menu__link" href="{{ url('contest_edit', tid=tdoc.docId) }}">
<span class="icon icon-edit"></span> {{ _('Edit Contest') }}
</a></li>
<li class="menu__item"><a class="menu__link" href="{{ url('contest_files', tid=tdoc.docId) }}">
<span class="icon icon-file"></span> {{ _('Files') }}
</a></li>
<li class="menu__item"><a class="menu__link" href="{{ url('contest_user', tid=tdoc.docId) }}">
<span class="icon icon-user"></span> {{ _('Attendee Manage') }}
<li class="menu__item"><a class="menu__link" href="{{ url('contest_manage', tid=tdoc.docId) }}">
<span class="icon icon-settings"></span> {{ _('Contest Management') }}
</a></li>
{% endif %}
{% if handler.user.own(tdoc) or handler.user.hasPriv(PRIV.PRIV_READ_RECORD_CODE) or handler.user.hasPerm(perm.PERM_READ_RECORD_CODE) %}
@@ -0,0 +1,50 @@
{% import "components/user.html" as user with context %}
{% import "components/contest.html" as contest with context %}
<div class="section side">
<a class="contest-sidebar__bg" href="{{ url('contest_detail', tid=tdoc.docId) }}">
<div class="section__body">
<h1>{{ tdoc.title }}</h1>
</div>
</a>
<div>
<ol class="menu">
<li class="menu__item"><a class="menu__link" href="{{ url('contest_detail', tid=tdoc.docId) }}">
<span class="icon icon-award"></span> {{ _('View Contest') }}
</a></li>
<li class="menu__item"><a class="menu__link" href="{{ url('contest_manage', tid=tdoc.docId) }}">
<span class="icon icon-settings"></span> {{ _('Contest Management') }}
</a></li>
<li class="menu__item"><a class="menu__link" href="{{ url('contest_edit', tid=tdoc.docId) }}">
<span class="icon icon-edit"></span> {{ _('Edit Contest') }}
</a></li>
<li class="menu__item"><a class="menu__link" href="{{ url('contest_user', tid=tdoc.docId) }}">
<span class="icon icon-user"></span> {{ _('Attendee Manage') }}
</a></li>
<li class="menu__item"><a class="menu__link" href="{{ url('contest_code', tid=tdoc.docId) }}" data-no-instant>
<span class="icon icon-download"></span> {{ _('Export All Code') }}
</a></li>
<li class="menu__item"><a class="menu__link" href="{{ url('record_main', query={tid:tdoc.docId}) }}">
<span class="icon icon-flag"></span> {{ _('All Submissions') }}
</a></li>
<li class="menu__seperator"></li>
</ol>
</div>
<div class="section__body typo">
<dl class="large horizontal">
<dt>{{ _('Status') }}</dt>
<dd>
{{ _(model.contest.statusText(tdoc, tsdoc)) }}
{% if tsdoc.attend %}
({{ _('Attended') }})
{% endif %}
</dd>
<dt>{{ _('Rule') }}</dt><dd>{{ model.contest.RULES[tdoc.rule].TEXT }}</dd>
<dt>{{ _('Problem') }}</dt><dd>{{ tdoc.pids.length }}</dd>
<dt>{{ _('Start at') }}</dt><dd>{{ contest.render_time(tsdoc.startAt or tdoc.beginAt) }}</dd>
<dt>{{ _('End at') }}</dt><dd>{{ contest.render_time(tsdoc.endAt or tdoc.endAt) }}</dd>
<dt>{{ _('Duration') }}</dt><dd>{{ contest.render_duration(tdoc) }} {{ _('hour(s)') }}</dd>
<dt>{{ _('Host') }}</dt><dd>{{ user.render_inline(owner_udoc, badge=false) }}</dd>
<dt>{{ _('Partic.') }}</dt><dd>{{ tdoc['attend']|default(0) }}</dd>
</dl>
</div>
</div>