From 8a8e312ca41472e6e70eb265c92d80a477dd556c Mon Sep 17 00:00:00 2001 From: masnn Date: Tue, 13 Apr 2021 16:08:08 +0000 Subject: [PATCH] ui: allow deleting contest/homework via edit page --- packages/hydrooj/src/handler/contest.ts | 8 ++++++ packages/hydrooj/src/handler/homework.ts | 8 ++++++ .../ui-default/pages/contest_edit.page.js | 28 ++++++++++++++++++- .../ui-default/templates/contest_edit.html | 5 ++++ .../ui-default/templates/homework_edit.html | 5 ++++ 5 files changed, 53 insertions(+), 1 deletion(-) diff --git a/packages/hydrooj/src/handler/contest.ts b/packages/hydrooj/src/handler/contest.ts index 2660ec52d..209d373c0 100644 --- a/packages/hydrooj/src/handler/contest.ts +++ b/packages/hydrooj/src/handler/contest.ts @@ -96,6 +96,14 @@ class ContestDetailHandler extends ContestHandler { await contest.attend(domainId, tid, this.user._id); this.back(); } + + @param('tid', Types.ObjectID) + async postDelete(domainId: string, tid: ObjectID) { + const tdoc = await contest.get(domainId, tid); + if (tdoc.owner !== this.user._id) this.checkPerm(PERM.PERM_EDIT_CONTEST); + await contest.del(domainId, tid); + this.response.redirect = this.url('contest_main'); + } } class ContestBoardcastHandler extends ContestHandler { diff --git a/packages/hydrooj/src/handler/homework.ts b/packages/hydrooj/src/handler/homework.ts index 72c5fc688..70026eb4d 100644 --- a/packages/hydrooj/src/handler/homework.ts +++ b/packages/hydrooj/src/handler/homework.ts @@ -108,6 +108,14 @@ class HomeworkDetailHandler extends HomeworkHandler { await contest.attend(domainId, tdoc.docId, this.user._id, document.TYPE_HOMEWORK); this.back(); } + + @param('tid', Types.ObjectID) + async postDelete(domainId: string, tid: ObjectID) { + const tdoc = await contest.get(domainId, tid, document.TYPE_HOMEWORK); + if (tdoc.owner !== this.user._id) this.checkPerm(PERM.PERM_EDIT_HOMEWORK); + await contest.del(domainId, tid, document.TYPE_HOMEWORK); + this.response.redirect = this.url('homework_main'); + } } class HomeworkDetailProblemHandler extends HomeworkHandler { diff --git a/packages/ui-default/pages/contest_edit.page.js b/packages/ui-default/pages/contest_edit.page.js index a2ca69d19..6aeeb3e67 100644 --- a/packages/ui-default/pages/contest_edit.page.js +++ b/packages/ui-default/pages/contest_edit.page.js @@ -1,8 +1,34 @@ import { NamedPage } from 'vj/misc/Page'; +import { ConfirmDialog } from 'vj/components/dialog'; import ProblemSelectAutoComplete from 'vj/components/autocomplete/ProblemSelectAutoComplete'; +import tpl from 'vj/utils/tpl'; +import i18n from 'vj/utils/i18n'; +import request from 'vj/utils/request'; -const page = new NamedPage(['contest_edit', 'contest_create'], () => { +const page = new NamedPage(['contest_edit', 'contest_create', 'homework_create', 'homework_edit'], (pagename) => { ProblemSelectAutoComplete.getOrConstruct($('[name="pids"]'), { multi: true }); + if (pagename.endsWith('edit')) { + let confirmed = false; + $(document).on('click', '[name="operation"]', (ev) => { + ev.preventDefault(); + if (confirmed) { + return request.post('.', { operation: 'delete' }).then((res) => { + window.location.href = res.url; + }); + } + const message = `Confirm deleting this ${pagename.split('_')[0]}? Its status will be deleted as well.`; + return new ConfirmDialog({ + $body: tpl` +
+

${i18n(message)}

+
`, + }).open().then((action) => { + if (action !== 'yes') return; + confirmed = true; + ev.target.click(); + }); + }); + } }); export default page; diff --git a/packages/ui-default/templates/contest_edit.html b/packages/ui-default/templates/contest_edit.html index c884467ba..7ca52e245 100644 --- a/packages/ui-default/templates/contest_edit.html +++ b/packages/ui-default/templates/contest_edit.html @@ -79,6 +79,11 @@ + {% if tdoc.owner == handler.user._id or handler.user.hasPerm(perm.PERM_EDIT_CONTEST) %} + + {% endif %} {% else %} + {% if tdoc.owner == handler.user._id or handler.user.hasPerm(perm.PERM_EDIT_HOMEWORK) %} + + {% endif %} {% else %}