From 008c30c8e00c9bd0f28067af5af1e470b31b8e80 Mon Sep 17 00:00:00 2001 From: panda Date: Thu, 4 Aug 2022 08:59:55 +0800 Subject: [PATCH] core&ui: show homework relate on problem_detail (#396) --- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/handler/problem.ts | 1 + packages/hydrooj/src/model/contest.ts | 4 ++-- packages/ui-default/components/media/media.page.js | 1 + packages/ui-default/handler.ts | 10 ++++++++++ packages/ui-default/package.json | 2 +- packages/ui-default/templates/partials/homework.html | 3 +++ .../templates/partials/problem_sidebar_normal.html | 8 +++++++- 8 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 packages/ui-default/templates/partials/homework.html diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index e6373e27..98d4a07c 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "3.15.3", + "version": "3.15.4", "bin": "bin/hydrooj.js", "main": "src/loader", "module": "src/loader", diff --git a/packages/hydrooj/src/handler/problem.ts b/packages/hydrooj/src/handler/problem.ts index fdd9f9d4..cfcaf70e 100644 --- a/packages/hydrooj/src/handler/problem.ts +++ b/packages/hydrooj/src/handler/problem.ts @@ -408,6 +408,7 @@ export class ProblemDetailHandler extends ContestDetailBaseHandler { this.response.body.rdoc = await record.get(this.args.domainId, this.psdoc.rid); } this.response.body.ctdocs = await contest.getRelated(this.args.domainId, this.pdoc.docId); + this.response.body.htdocs = await contest.getRelated(this.args.domainId, this.pdoc.docId, 'homework'); } } diff --git a/packages/hydrooj/src/model/contest.ts b/packages/hydrooj/src/model/contest.ts index 2d70a950..b1cfec1b 100644 --- a/packages/hydrooj/src/model/contest.ts +++ b/packages/hydrooj/src/model/contest.ts @@ -487,9 +487,9 @@ export async function get(domainId: string, tid: ObjectID): Promise> { return tdoc; } -export async function getRelated(domainId: string, pid: number) { +export async function getRelated(domainId: string, pid: number, rule?: string) { const rules = Object.keys(RULES).filter((i) => !RULES[i].hidden); - return await document.getMulti(domainId, document.TYPE_CONTEST, { pids: pid, rule: { $in: rules } }).toArray(); + return await document.getMulti(domainId, document.TYPE_CONTEST, { pids: pid, rule: rule || { $in: rules } }).toArray(); } export async function getStatus(domainId: string, tid: ObjectID, uid: number) { diff --git a/packages/ui-default/components/media/media.page.js b/packages/ui-default/components/media/media.page.js index 05dc609d..552f70dc 100644 --- a/packages/ui-default/components/media/media.page.js +++ b/packages/ui-default/components/media/media.page.js @@ -32,6 +32,7 @@ export default new AutoloadPage('media', async () => { if (category === 'user' && Number.isInteger(+data) && !extra) resolve(ele, { type: 'user', id: +data }); if (category === 'p' && !extra) resolve(ele, { type: 'problem', id: data, domainId }); if (category === 'contest' && !extra) resolve(ele, { type: 'contest', id: data, domainId }); + if (category === 'homework' && !extra) resolve(ele, { type: 'homework', id: data, domainId }); }); }); if (!items.length) return; diff --git a/packages/ui-default/handler.ts b/packages/ui-default/handler.ts index 563e820a..fb4a728a 100644 --- a/packages/ui-default/handler.ts +++ b/packages/ui-default/handler.ts @@ -184,6 +184,15 @@ class RichMediaHandler extends Handler { return ''; } + async renderHomework(domainId, payload) { + const cur = payload.domainId ? await user.getById(payload.domainId, this.user._id) : this.user; + const tdoc = cur.hasPerm(PERM.PERM_VIEW | PERM.PERM_VIEW_HOMEWORK) + ? await contest.get(payload.domainId || domainId, new ObjectID(payload.id)) + : null; + if (tdoc) return await this.renderHTML('partials/homework.html', { tdoc }); + return ''; + } + async post({ domainId, items }) { const res = []; for (const item of items) { @@ -191,6 +200,7 @@ class RichMediaHandler extends Handler { if (item.type === 'user') res.push(this.renderUser(domainId, item).catch(() => '')); else if (item.type === 'problem') res.push(this.renderProblem(domainId, item).catch(() => '')); else if (item.type === 'contest') res.push(this.renderContest(domainId, item).catch(() => '')); + else if (item.type === 'homework') res.push(this.renderHomework(domainId, item).catch(() => '')); else res.push(''); } this.response.body = await Promise.all(res); diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index 5204ce20..38101b8d 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/ui-default", - "version": "4.38.33", + "version": "4.38.34", "author": "undefined ", "license": "AGPL-3.0", "main": "hydro.js", diff --git a/packages/ui-default/templates/partials/homework.html b/packages/ui-default/templates/partials/homework.html new file mode 100644 index 00000000..8dde242c --- /dev/null +++ b/packages/ui-default/templates/partials/homework.html @@ -0,0 +1,3 @@ + + {{ tdoc.title }} + \ No newline at end of file diff --git a/packages/ui-default/templates/partials/problem_sidebar_normal.html b/packages/ui-default/templates/partials/problem_sidebar_normal.html index 24d11545..d1ecbd79 100644 --- a/packages/ui-default/templates/partials/problem_sidebar_normal.html +++ b/packages/ui-default/templates/partials/problem_sidebar_normal.html @@ -121,7 +121,7 @@
{% endif %} -{% if page_name == 'problem_detail' and (tdocs.length or ctdocs.length) %} +{% if page_name == 'problem_detail' and (tdocs.length or ctdocs.length or htdocs.length) %}

{{ _('Related') }}

@@ -139,6 +139,12 @@

{{ tdoc.title }}

{%- endfor -%} {% endif %} + {% if htdocs.length %} +

{{ _('In following homework') }}:

+ {%- for tdoc in htdocs -%} +

{{ tdoc.title }}

+ {%- endfor -%} + {% endif %}
{% endif %}