From 06a247f8198e5c5dc9e577cd3ec64cffd33801b8 Mon Sep 17 00:00:00 2001 From: undefined Date: Wed, 24 Nov 2021 01:11:11 +0800 Subject: [PATCH] core: contest problem auto hide --- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/handler/contest.ts | 28 +++++++++++++++++-- packages/ui-default/package.json | 2 +- .../ui-default/pages/contest_edit.page.styl | 6 ++++ .../ui-default/templates/contest_edit.html | 16 +++++++++-- 5 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 packages/ui-default/pages/contest_edit.page.styl diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index b2c94002f..c9762bfa5 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "3.1.34", + "version": "3.1.35", "bin": "bin/hydrooj.js", "main": "src/loader", "module": "src/loader", diff --git a/packages/hydrooj/src/handler/contest.ts b/packages/hydrooj/src/handler/contest.ts index 665458f2e..b05f8e0e5 100644 --- a/packages/hydrooj/src/handler/contest.ts +++ b/packages/hydrooj/src/handler/contest.ts @@ -14,6 +14,7 @@ import message from '../model/message'; import problem from '../model/problem'; import record from '../model/record'; import * as system from '../model/system'; +import TaskModel from '../model/task'; import user from '../model/user'; import { Handler, param, Route, Types, @@ -46,6 +47,15 @@ registerResolver( 'Get a contest by ID', ); +TaskModel.Worker.addHandler('contest.problemHide', async (doc) => { + const tdoc = await contest.get(doc.domainId, doc.tid); + if (!tdoc) return; + for (const pid of tdoc.pids) { + // eslint-disable-next-line no-await-in-loop + await problem.edit(doc.domainId, pid, { hidden: false }); + } +}); + export class ContestListHandler extends Handler { @param('rule', Types.Range(contest.RULES), true) @param('page', Types.PositiveInt, true) @@ -224,10 +234,12 @@ export class ContestEditHandler extends Handler { @param('pids', Types.Content) @param('rated', Types.Boolean) @param('code', Types.String, true) + @param('autoHide', Types.String, true) async post( domainId: string, tid: ObjectID, beginAtDate: string, beginAtTime: string, duration: number, - title: string, content: string, rule: string, _pids: string, rated = false, _code = '', + title: string, content: string, rule: string, _pids: string, rated = false, _code = '', autoHide = false, ) { + if (autoHide) this.checkPerm(PERM.PERM_EDIT_PROBLEM); const pids = _pids.replace(/,/g, ',').split(',').map((i) => +i).filter((i) => i); const beginAtMoment = moment.tz(`${beginAtDate} ${beginAtTime}`, this.user.timeZone); if (!beginAtMoment.isValid()) throw new ValidationError('beginAtDate', 'beginAtTime'); @@ -246,7 +258,19 @@ export class ContestEditHandler extends Handler { } else { tid = await contest.add(domainId, title, content, this.user._id, rule, beginAt, endAt, pids, rated); } - await contest.edit(domainId, tid, { _code }); + const task = { + type: 'schedule', subType: 'contest.problemHide', domainId, tid, + }; + await TaskModel.deleteMany(task); + if (Date.now() <= endAt.getTime() && autoHide) { + // eslint-disable-next-line no-await-in-loop + for (const pid of pids) await problem.edit(domainId, pid, { hidden: true }); + await TaskModel.add({ + ...task, + executeAfter: endAt, + }); + } + await contest.edit(domainId, tid, { _code, autoHide }); this.response.body = { tid }; this.response.redirect = this.url('contest_detail', { tid }); } diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index f5f76cc87..90030fe45 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/ui-default", - "version": "4.26.20", + "version": "4.26.21", "author": "undefined ", "license": "AGPL-3.0", "main": "hydro.js", diff --git a/packages/ui-default/pages/contest_edit.page.styl b/packages/ui-default/pages/contest_edit.page.styl new file mode 100644 index 000000000..136cc0a60 --- /dev/null +++ b/packages/ui-default/pages/contest_edit.page.styl @@ -0,0 +1,6 @@ +.page--contest_edit +.page--contest_create + label + &.checkbox + margin-top: 24px + \ No newline at end of file diff --git a/packages/ui-default/templates/contest_edit.html b/packages/ui-default/templates/contest_edit.html index e6a7bd315..c8ff83339 100644 --- a/packages/ui-default/templates/contest_edit.html +++ b/packages/ui-default/templates/contest_edit.html @@ -67,13 +67,25 @@ row:false }) }} +
{{ form.form_text({ - columns:null, + columns:9, label:'Problems', name:'pids', value:pids, - placeholder:_("Seperated with ','") + placeholder:_("Seperated with ','"), + row:false }) }} + {{ form.form_checkbox({ + columns:3, + label:'Auto hide-and show', + name:'autoHide', + placeholder:'', + value:handler.user.hasPerm(perm.PERM_EDIT_PROBLEM) and (tdoc.autoHide|default(true)), + disabled:not handler.user.hasPerm(perm.PERM_EDIT_PROBLEM), + row:false + }) }} +
{{ form.form_textarea({ columns:null, label:'Content',