diff --git a/packages/hydrooj/src/handler/contest.ts b/packages/hydrooj/src/handler/contest.ts
index d56f0329a..6d633b95b 100644
--- a/packages/hydrooj/src/handler/contest.ts
+++ b/packages/hydrooj/src/handler/contest.ts
@@ -282,12 +282,14 @@ export class ContestScoreboardHandler extends ContestDetailBaseHandler {
config.lockAt = this.tdoc.lockAt;
}
const [, rows, udict, pdict] = await contest.getScoreboard.call(this, domainId, tid, config);
+ const groups = this.user.hasPerm(PERM.PERM_EDIT_DOMAIN)
+ ? await user.listGroup(domainId) : [];
// eslint-disable-next-line @typescript-eslint/naming-convention
const page_name = this.tdoc.rule === 'homework'
? 'homework_scoreboard'
: 'contest_scoreboard';
this.response.body = {
- tdoc: this.tdoc, rows, udict, pdict, page_name,
+ tdoc: this.tdoc, rows, udict, pdict, page_name, groups,
};
this.response.pjax = 'partials/scoreboard.html';
this.response.template = 'contest_scoreboard.html';
diff --git a/packages/ui-default/pages/contest_scoreboard.page.ts b/packages/ui-default/pages/contest_scoreboard.page.ts
index ebdc4a6e4..161658feb 100644
--- a/packages/ui-default/pages/contest_scoreboard.page.ts
+++ b/packages/ui-default/pages/contest_scoreboard.page.ts
@@ -30,9 +30,14 @@ const page = new NamedPage('contest_scoreboard', () => {
} else if (val === 'star') {
$('.data-table tbody tr').hide();
read().forEach((uid) => $(`.star.user--${uid}`).closest('tr').show());
- } else {
+ } else if (val === 'rank') {
$('.data-table tbody tr').show();
$('.rank--unrank').closest('tr').hide();
+ } else {
+ $('.data-table tbody tr').hide();
+ const uids = val.toString().split(',').map((i) => +i.trim()).filter((i) => i);
+ if (!uids?.length) return;
+ uids.forEach((uid) => $(`.user--${uid}`).closest('tr').show());
}
});
@@ -40,7 +45,7 @@ const page = new NamedPage('contest_scoreboard', () => {
const endAt = new Date(UiContext.tdoc.endAt).getTime();
function updateScoreboard() {
const now = Date.now();
- if (beginAt <= now && now <= endAt) pjax.request(UiContext.scoreboardUrl || '', { push: false });
+ if (beginAt <= now && now <= endAt) pjax.request({ url: UiContext.scoreboardUrl || '', push: false });
}
setInterval(updateScoreboard, 180000);
diff --git a/packages/ui-default/templates/contest_scoreboard.html b/packages/ui-default/templates/contest_scoreboard.html
index 0cc046569..0c0a560ee 100644
--- a/packages/ui-default/templates/contest_scoreboard.html
+++ b/packages/ui-default/templates/contest_scoreboard.html
@@ -25,6 +25,9 @@
+ {% for group in groups %}
+
+ {% endfor %}