feat: add sidebar
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Baoshuo Ren 2022-09-25 14:16:36 +08:00
parent e96eaba256
commit 83488ad7cf
Signed by: baoshuo
GPG Key ID: 00CB9680AB29F51A
8 changed files with 158 additions and 14 deletions

View File

@ -58,6 +58,8 @@
<?php echoUOJPageHeader(UOJLocale::get('groups')) ?>
<?php if (isset($REQUIRE_LIB['bootstrap5'])): ?>
<div class="row">
<div class="col-sm-12 col-md-9">
<div class="d-flex justify-content-between">
<?php endif ?>
<h1 class="h2">
@ -117,4 +119,16 @@ EOD;
);
?>
<?php if (isset($REQUIRE_LIB['bootstrap5'])): ?>
</div>
<aside class="col">
<?php
uojIncludeView('sidebar', array());
?>
</aside>
</div>
<?php endif ?>
<?php echoUOJPageFooter() ?>

View File

@ -71,8 +71,9 @@
<?php echoUOJPageHeader(UOJLocale::get('problems lists')) ?>
<?php if (isset($REQUIRE_LIB['bootstrap5'])): ?>
<div class="row">
<div class="col-sm-12 col-md-9">
<div class="d-flex justify-content-between">
<?php endif ?>
<h1 class="h2">
@ -147,4 +148,16 @@ EOD;
);
?>
<?php if (isset($REQUIRE_LIB['bootstrap5'])): ?>
</div>
<aside class="col">
<?php
uojIncludeView('sidebar', array());
?>
</aside>
</div>
<?php endif ?>
<?php echoUOJPageFooter() ?>

View File

@ -160,6 +160,8 @@ EOD;
<?php echoUOJPageHeader(UOJLocale::get('problems')) ?>
<?php if (isset($REQUIRE_LIB['bootstrap5'])): ?>
<div class="row">
<div class="col-sm-12 col-md-9">
<div class="d-flex justify-content-between">
<?php endif ?>
<h1 class="h2">
@ -180,6 +182,10 @@ EOD;
</div>
<?php endif ?>
<?php if (!isset($REQUIRE_LIB['bootstrap5'])): ?>
<div class="top-buffer-sm"></div>
<?php endif ?>
<div class="row">
<div class="col-sm-4">
<?= HTML::tablist($tabs_info, $cur_tab, 'nav-pills') ?>
@ -237,7 +243,7 @@ EOD;
<?php echo $pag->pagination(); ?>
</div>
</div>
<div class="top-buffer-sm"></div>
<script type="text/javascript">
$('#input-show_tags_mode').click(function() {
if (this.checked) {
@ -274,4 +280,17 @@ $('#input-show_submit_mode').click(function() {
</table>
</div>
<?= $pag->pagination() ?>
<?php if (isset($REQUIRE_LIB['bootstrap5'])): ?>
</div>
<aside class="col">
<?php
uojIncludeView('sidebar', array());
?>
</aside>
</div>
<?php endif ?>
<?php echoUOJPageFooter() ?>

View File

@ -29,5 +29,8 @@ return [
'contest registrants' => 'Registrants',
'problem self review' => 'Problem self review',
'contest self review' => 'Contest self review',
'contest self reviews' => 'Contest self reviews'
'contest self reviews' => 'Contest self reviews',
'will start in x days' => function($x) {
return "Will start in $x ".($x > 1 ? "days" : "day");
},
];

View File

@ -29,5 +29,8 @@ return [
'contest registrants' => '报名选手列表',
'problem self review' => '题目总结',
'contest self review' => '比赛总结',
'contest self reviews' => '赛后总结'
'contest self reviews' => '赛后总结',
'will start in x days' => function($x) {
return "将在 $x 天后开始";
},
];

View File

@ -81,7 +81,11 @@ class Paginator {
if ($this->n_pages == 1) {
return '';
}
if (isset($REQUIRE_LIB['bootstrap5'])) {
$html = '<ul class="pagination my-0 justify-content-center">';
} else {
$html = '<ul class="pagination top-buffer-no bot-buffer-sm justify-content-center">';
}
if ($this->cur_page > 1) {
$html .= '<li class="page-item">'
. '<a class="page-link" href="'.$this->getPageUri(1).'">';

82
web/app/views/sidebar.php Normal file
View File

@ -0,0 +1,82 @@
<?php if (!isset($group_announcements_hidden) && Auth::check()): ?>
<?php $groups = queryGroupsOfUser(Auth::id()); ?>
<?php if (count($groups)): ?>
<div class="card card-default mb-2" id="group-user-announcements">
<div class="card-header fw-bold bg-transparent">
小组公告
</div>
<ul class="list-group list-group-flush">
<?php foreach ($groups as $group): ?>
<?php
$group_detail = DB::selectFirst("select * from groups where id = {$group['id']}");
$group_announcement = $group_detail['announcement'];
?>
<li class="list-group-item">
<a class="fw-bold text-decoration-none" href="<?= HTML::url('/group/'.$group['id']) ?>">
<?= $group['title'] ?>
</a>
<?php if ($group_announcement): ?>
<div id="announcement-content-<?= $group['id'] ?>"></div>
<script>(function(){
$('#announcement-content-<?= $group['id'] ?>')
.html(DOMPurify.sanitize(decodeURIComponent("<?= urlencode($group_announcement) ?>"), <?= DOM_SANITIZE_CONFIG ?>));
})();</script>
<?php else: ?>
<div>(暂无公告)</div>
<?php endif ?>
</li>
<?php endforeach ?>
</ul>
</div>
<?php endif ?>
<?php endif ?>
<?php if (!isset($upcoming_contests_hidden)): ?>
<?php
$upcoming_contests = DB::selectAll("SELECT * FROM contests WHERE status = 'unfinished' ORDER BY start_time ASC, id ASC LIMIT 7");
?>
<div class="card card-default mb-2" id="group-user-announcements">
<div class="card-header fw-bold bg-transparent">
近期比赛
</div>
<?php $count = 0; ?>
<ul class="list-group list-group-flush">
<?php foreach ($upcoming_contests as $contest): ?>
<?php genMoreContestInfo($contest) ?>
<?php if ($contest['cur_progress'] == CONTEST_NOT_STARTED || $contest['cur_progress'] == CONTEST_IN_PROGRESS): ?>
<?php $count++; ?>
<li class="list-group-item text-center">
<a class="fw-bold text-decoration-none" href="<?= HTML::url('/contest/'.$contest['id']) ?>">
<?= $contest['name'] ?>
</a>
<div class="small">
<?php if ($contest['cur_progress'] == CONTEST_IN_PROGRESS): ?>
<?= UOJLocale::get('contests::in progress') ?>
<?php else: ?>
<?php
$rest_seconds = $contest['start_time']->getTimestamp() - UOJTime::$time_now->getTimestamp();
?>
<?php if ($rest_seconds > 86400): ?>
<?= UOJLocale::get('contests::will start in x days', floor($rest_seconds / 86400)) ?>
<?php else: ?>
<div id="contest-<?= $contest['id'] ?>-countdown"></div>
<script>$('#contest-<?= $contest['id'] ?>-countdown').countdown(<?= $rest_seconds ?>, function(){}, 'inherit', false);</script>
<?php endif ?>
<?php endif ?>
</div>
</li>
<?php endif ?>
<?php endforeach ?>
<?php if ($count == 0): ?>
<li class="list-group-item text-center">
<?= UOJLocale::get('none') ?>
</li>
<?php endif ?>
</ul>
<div class="card-footer bg-transparent text-center small">
<a class="text-decoration-none" href="<?= HTML::url('/contests?all=true') ?>">
<?= UOJLocale::get('view all') ?>
</a>
</div>
</div>
<?php endif ?>

View File

@ -322,7 +322,7 @@ $.fn.click_zan_block = function() {
}
// count down
function getCountdownStr(t) {
function getCountdownStr(t, font_size, color = true) {
var x = Math.floor(t);
var ss = toFilledStr(x % 60, '0', 2);
x = Math.floor(x / 60);
@ -330,17 +330,23 @@ function getCountdownStr(t) {
x = Math.floor(x / 60);
var hh = x.toString();
var res = '<span style="font-size:30px">';
res += '<span style="color:' + getColOfScore(Math.min(t / 10800 * 100, 100)) + '">' + hh + '</span>';
var res = '<span style="font-size:' + font_size + '">';
res += '<span '
if (color) res += ' style="color:' + getColOfScore(Math.min(t / 10800 * 100, 100)) + '" ';
res += ' >' + hh + '</span>';
res += ':';
res += '<span style="color:' + getColOfScore(mm / 60 * 100) + '">' + mm + '</span>';
res += '<span '
if (color) res += ' style="color:' + getColOfScore(mm / 60 * 100) + '" ';
res += ' >' + mm + '</span>';
res += ':';
res += '<span style="color:' + getColOfScore(ss / 60 * 100) + '">' + ss + '</span>';
res += '<span ';
if (color) res += ' style="color:' + getColOfScore(ss / 60 * 100) + '" ';
res +=' >' + ss + '</span>';
res += '</span>'
return res;
}
$.fn.countdown = function(rest, callback) {
$.fn.countdown = function(rest, callback, font_size = '30px', color = true) {
return this.each(function() {
var start = new Date().getTime();
var cur_rest = rest != undefined ? rest : parseInt($(this).data('rest'));
@ -348,12 +354,12 @@ $.fn.countdown = function(rest, callback) {
var countdown = function() {
var passed = Math.floor((new Date().getTime() - start) / 1000);
if (passed >= cur_rest) {
$(cur).html(getCountdownStr(0));
$(cur).html(getCountdownStr(0, font_size, color));
if (callback != undefined) {
callback();
}
} else {
$(cur).html(getCountdownStr(cur_rest - passed));
$(cur).html(getCountdownStr(cur_rest - passed, font_size, color));
setTimeout(countdown, 1000);
}
}