From 7c6e97fdfc768d0bea430ae437710ae6012ac16d Mon Sep 17 00:00:00 2001 From: undefined Date: Thu, 13 May 2021 00:45:23 +0800 Subject: [PATCH] =?UTF-8?q?core:=20=E4=BF=AE=E5=A4=8DACM=E8=B5=9B=E5=88=B6?= =?UTF-8?q?=E8=AE=A1=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/hydrooj/locales/zh.yaml | 1 + packages/hydrooj/package.json | 2 +- packages/hydrooj/src/handler/contest.ts | 9 ++++++--- packages/hydrooj/src/handler/record.ts | 3 +++ packages/hydrooj/src/model/contest.ts | 17 +++++++++-------- .../autocomplete/UserSelectAutoComplete.js | 2 +- .../ui-default/components/autocomplete/index.js | 6 ++---- packages/ui-default/package.json | 2 +- .../ui-default/pages/problem_submit.page.js | 2 +- 9 files changed, 25 insertions(+), 19 deletions(-) diff --git a/packages/hydrooj/locales/zh.yaml b/packages/hydrooj/locales/zh.yaml index cd6ccff2d..8b60dd97f 100644 --- a/packages/hydrooj/locales/zh.yaml +++ b/packages/hydrooj/locales/zh.yaml @@ -150,6 +150,7 @@ Contest scoreboard is not visible.: 当前比赛成绩表隐藏,暂不可显 Contest Scoreboard: 比赛成绩表 contest_create: 创建比赛 contest_detail_problem_submit: 递交比赛题目 +contest_detail_problem: 题目详情 contest_detail: 比赛详情 contest_edit: 编辑比赛 contest_main: 比赛 diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 536024cbc..18cf11655 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.25.13", + "version": "2.25.14", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/handler/contest.ts b/packages/hydrooj/src/handler/contest.ts index f74635c23..b2a03f081 100644 --- a/packages/hydrooj/src/handler/contest.ts +++ b/packages/hydrooj/src/handler/contest.ts @@ -307,10 +307,13 @@ export class ContestProblemFileDownloadHandler extends ContestProblemHandler { } class ContestDetailProblemSubmitHandler extends ContestProblemHandler { + async prepare() { + if (!contest.isOngoing(this.tdoc)) throw new ContestNotLiveError(this.tdoc.docId); + } + @param('tid', Types.ObjectID) @param('pid', Types.UnsignedInt) - async prepare(domainId: string, tid: ObjectID, pid: number) { - if (!contest.isOngoing(this.tdoc)) throw new ContestNotLiveError(this.tdoc.docId); + async get(domainId: string, tid: ObjectID, pid: number) { let rdocs = []; if (contest.canShowRecord.call(this, this.tdoc)) { rdocs = await record.getUserInProblemMulti( @@ -318,7 +321,6 @@ class ContestDetailProblemSubmitHandler extends ContestProblemHandler { this.pdoc.docId, true, ).sort({ _id: -1 }).limit(10).toArray(); } - this.response.template = 'problem_submit.html'; const path = [ ['Hydro', 'homepage'], ['contest_main', 'contest_main'], @@ -335,6 +337,7 @@ class ContestDetailProblemSubmitHandler extends ContestProblemHandler { rdocs, page_name: 'contest_detail_problem_submit', }; + this.response.template = 'problem_submit.html'; } @param('tid', Types.ObjectID) diff --git a/packages/hydrooj/src/handler/record.ts b/packages/hydrooj/src/handler/record.ts index 5170042a3..81e9626cc 100644 --- a/packages/hydrooj/src/handler/record.ts +++ b/packages/hydrooj/src/handler/record.ts @@ -117,6 +117,9 @@ class RecordDetailHandler extends Handler { rdoc, pdoc, }; + if (rdoc.contest) { + this.response.body.tdoc = await contest.get(domainId, rdoc.contest.tid, rdoc.contest.type); + } } @param('rid', Types.ObjectID) diff --git a/packages/hydrooj/src/model/contest.ts b/packages/hydrooj/src/model/contest.ts index b0e4aef79..994fbffeb 100644 --- a/packages/hydrooj/src/model/contest.ts +++ b/packages/hydrooj/src/model/contest.ts @@ -39,9 +39,9 @@ const acm: ContestRule = { for (const key in effective) { const j = effective[key]; const real = j.rid.generationTime - Math.floor(tdoc.beginAt.getTime() / 1000); - const penalty = 20 * 60 * naccept[j.pid]; + const penalty = 20 * 60 * (naccept[j.pid] || 0); detail.push({ - ...j, naccept: naccept[j.pid], time: real + penalty, real, penalty, + ...j, naccept: naccept[j.pid] || 0, time: real + penalty, real, penalty, }); } for (const d of detail) { @@ -53,7 +53,7 @@ const acm: ContestRule = { return { accept, time, detail }; }, async scoreboard(isExport, _, tdoc, pdict, cursor, page) { - const [rankedTsdocs, nPages] = await ranked(cursor, (a, b) => a.score === b.score, page); + const [rankedTsdocs, nPages] = await ranked(cursor, (a, b) => a.score === b.score && a.time === b.time, page); const uids = rankedTsdocs.map(([, tsdoc]) => tsdoc.uid); const udict = await user.getList(tdoc.domainId, uids); const columns: ScoreboardRow = [ @@ -109,20 +109,21 @@ const acm: ContestRule = { ); } for (const pid of tdoc.pids) { + const doc = tsddict[pid] || {}; let rid; let colAccepted; let colTime; let colTimeStr; - if (tsddict[pid]?.accept) { - rid = tsddict[pid].rid; + if (doc.accept) { + rid = doc.rid; colAccepted = _('Accepted'); - colTime = tsddict[pid].time; - colTimeStr = misc.formatSeconds(colTime); + colTime = doc.time; + colTimeStr = misc.formatSeconds(colTime) + (doc.naccept ? ` (-${doc.naccept})` : ''); } else { rid = null; colAccepted = '-'; colTime = '-'; - colTimeStr = '-'; + colTimeStr = doc.naccept ? `(-${doc.naccept})` : '-'; } if (isExport) { row.push({ type: 'string', value: colAccepted }); diff --git a/packages/ui-default/components/autocomplete/UserSelectAutoComplete.js b/packages/ui-default/components/autocomplete/UserSelectAutoComplete.js index 33d6f0fd6..958e89305 100644 --- a/packages/ui-default/components/autocomplete/UserSelectAutoComplete.js +++ b/packages/ui-default/components/autocomplete/UserSelectAutoComplete.js @@ -2,7 +2,7 @@ import _ from 'lodash'; import tpl from 'vj/utils/tpl'; import request from 'vj/utils/request'; import DOMAttachedObject from 'vj/components/DOMAttachedObject'; -import AutoComplete from '.'; +import AutoComplete from './index'; function getText(user) { return user.uname; diff --git a/packages/ui-default/components/autocomplete/index.js b/packages/ui-default/components/autocomplete/index.js index a9695aaf4..d676d108d 100644 --- a/packages/ui-default/components/autocomplete/index.js +++ b/packages/ui-default/components/autocomplete/index.js @@ -166,7 +166,7 @@ export default class AutoComplete extends DOMAttachedObject { content = content.split(','); content = content[content.length - 1].trim(); } - if (this.isFocus && content >= this.options.minChar) { + if (this.isFocus && content.length >= this.options.minChar) { if (!this.isOpen) { this.open(); this.renderList(); @@ -175,9 +175,7 @@ export default class AutoComplete extends DOMAttachedObject { } detach() { - if (this.detached) { - return; - } + if (this.detached) return; super.detach(); this.$dom.off(`focus.${this.eventNS}`); this.$dom.off(`blur.${this.eventNS}`); diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index 76465fea4..4efa3272b 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/ui-default", - "version": "4.8.11", + "version": "4.8.12", "author": "undefined ", "license": "AGPL-3.0", "main": "hydro.js", diff --git a/packages/ui-default/pages/problem_submit.page.js b/packages/ui-default/pages/problem_submit.page.js index d62db621d..84bea15a0 100644 --- a/packages/ui-default/pages/problem_submit.page.js +++ b/packages/ui-default/pages/problem_submit.page.js @@ -7,7 +7,7 @@ function setOptions($el, options) { }); } -const page = new NamedPage('problem_submit', async () => { +const page = new NamedPage(['problem_submit', 'contest_detail_problem_submit'], async () => { $(document).on('click', '[name="problem-sidebar__show-category"]', (ev) => { $(ev.currentTarget).hide(); $('[name="problem-sidebar__categories"]').show();