From fa595142a258ead29ac606f88f46c4eadec6e8e8 Mon Sep 17 00:00:00 2001 From: undefined Date: Fri, 18 Oct 2024 05:46:35 +0800 Subject: [PATCH] core&ui: problem_star builder --- packages/hydrooj/src/handler/home.ts | 4 +-- packages/hydrooj/src/handler/problem.ts | 18 +++++-------- .../ui-default/components/star/star.page.ts | 25 ++++++++++++++++++- .../partials/homepage/starred_problems.html | 13 +++------- .../templates/partials/problem_list.html | 12 +-------- .../templates/partials/training_detail.html | 14 ++--------- .../ui-default/templates/problem_detail.html | 5 ++-- 7 files changed, 39 insertions(+), 52 deletions(-) diff --git a/packages/hydrooj/src/handler/home.ts b/packages/hydrooj/src/handler/home.ts index d2eefa4e1..0a45bfdad 100644 --- a/packages/hydrooj/src/handler/home.ts +++ b/packages/hydrooj/src/handler/home.ts @@ -121,14 +121,12 @@ export class HomeHandler extends Handler { if (!this.user.hasPerm(PERM.PERM_VIEW_PROBLEM)) return [[], {}]; const psdocs = await ProblemModel.getMultiStatus(domainId, { uid: this.user._id, star: true }) .sort('_id', 1).limit(limit).toArray(); - const psdict = {}; - for (const psdoc of psdocs) psdict[psdoc.docId] = psdoc; const pdict = await ProblemModel.getList( domainId, psdocs.map((pdoc) => pdoc.docId), this.user.hasPerm(PERM.PERM_VIEW_PROBLEM_HIDDEN) || this.user._id, false, ); const pdocs = Object.keys(pdict).filter((i) => +i).map((i) => pdict[i]); - return [pdocs, psdict]; + return [pdocs]; } async getRecentProblems(domainId: string, limit = 10) { diff --git a/packages/hydrooj/src/handler/problem.ts b/packages/hydrooj/src/handler/problem.ts index 93d905922..513bba3f7 100644 --- a/packages/hydrooj/src/handler/problem.ts +++ b/packages/hydrooj/src/handler/problem.ts @@ -187,18 +187,6 @@ export class ProblemMainHandler extends Handler { } } - @param('pid', Types.UnsignedInt) - async postStar(domainId: string, pid: number) { - await problem.setStar(domainId, pid, this.user._id, true); - this.back({ star: true }); - } - - @param('pid', Types.UnsignedInt) - async postUnstar(domainId: string, pid: number) { - await problem.setStar(domainId, pid, this.user._id, false); - this.back({ star: false }); - } - @param('pids', Types.NumericArray) @param('target', Types.String) async postCopy(domainId: string, pids: number[], target: string) { @@ -439,6 +427,12 @@ export class ProblemDetailHandler extends ContestDetailBaseHandler { await problem.del(this.pdoc.domainId, this.pdoc.docId); this.response.redirect = this.url('problem_main'); } + + @param('star', Types.Boolean) + async postStar(domainId: string, star: boolean) { + await problem.setStar(domainId, this.pdoc.docId, this.user._id, star); + this.back({ star }); + } } export class ProblemSubmitHandler extends ProblemDetailHandler { diff --git a/packages/ui-default/components/star/star.page.ts b/packages/ui-default/components/star/star.page.ts index e8f534bb7..e823ca0bf 100644 --- a/packages/ui-default/components/star/star.page.ts +++ b/packages/ui-default/components/star/star.page.ts @@ -1,6 +1,6 @@ import $ from 'jquery'; import { AutoloadPage } from 'vj/misc/Page'; -import { request } from 'vj/utils'; +import { request, tpl } from 'vj/utils'; function setStarButtonState($starButton: JQuery, star: boolean) { if (star) { @@ -11,6 +11,29 @@ function setStarButtonState($starButton: JQuery, star: boolean) { } const starPage = new AutoloadPage('starPage', () => { + function render(container) { + const eles = $(container).find('[data-star]'); + for (const el of eles) { + if ($(el).find('.star-form')) continue; + const pid = $(el).closest('[data-pid]').data('pid'); + const star = $(el).data('star') === 'true' ? 1 : 0; + if (!pid) continue; + $(tpl`
+ + + +
`); + } + } + + render(document); + $(document).on('vjContentNew', (ev) => { + render(ev.target); + }); + $(document).on('click', '.star', (ev) => { const $button = $(ev.currentTarget); const currentState = $button.hasClass('activated'); diff --git a/packages/ui-default/templates/partials/homepage/starred_problems.html b/packages/ui-default/templates/partials/homepage/starred_problems.html index 9636c0a50..831456554 100644 --- a/packages/ui-default/templates/partials/homepage/starred_problems.html +++ b/packages/ui-default/templates/partials/homepage/starred_problems.html @@ -1,5 +1,4 @@ {% set pdocs = payload[0] %} -{% set psdict = payload[1] %} {% if pdocs.length %}
@@ -7,15 +6,9 @@
{%- for pdoc in pdocs -%} -
- - - -
- {{ problem.render_problem_title(pdoc, show_tags=false, show_invisible_flag=false) }}
+

+ {{ problem.render_problem_title(pdoc, show_tags=false, show_invisible_flag=false) }} +

{%- endfor -%}
diff --git a/packages/ui-default/templates/partials/problem_list.html b/packages/ui-default/templates/partials/problem_list.html index 254889fdf..0e9f8a017 100644 --- a/packages/ui-default/templates/partials/problem_list.html +++ b/packages/ui-default/templates/partials/problem_list.html @@ -54,17 +54,7 @@ {% endif %} {% endif %} - - {% if handler.user.hasPriv(PRIV.PRIV_USER_PROFILE) %} -
- - - -
- {% endif %} + {{ problem.render_problem_title(pdoc) }} {{ pdoc.nAccept }} / {{ pdoc.nSubmit }} diff --git a/packages/ui-default/templates/partials/training_detail.html b/packages/ui-default/templates/partials/training_detail.html index a0e9c2797..7c954caa1 100644 --- a/packages/ui-default/templates/partials/training_detail.html +++ b/packages/ui-default/templates/partials/training_detail.html @@ -103,7 +103,7 @@ {% set pdoc=pdict[pid] %} {% set psdoc=psdict[pid] %} {% set self_psdoc=selfPsdict[pid] %} - + {% if handler.user.hasPriv(PRIV.PRIV_USER_PROFILE) %} {% if psdoc['rid'] %} {{ record.render_status_td(psdoc, rid_key='rid', short=should_compare) }} @@ -118,17 +118,7 @@ {% endif %} {% endif %} {% endif %} - - {% if handler.user.hasPriv(PRIV.PRIV_USER_PROFILE) %} -
- - - -
- {% endif %} + {{ problem.render_problem_title( pdoc, invalid=not tsdoc['enroll'] or nsdict[node['_id']]['isInvalid'], diff --git a/packages/ui-default/templates/problem_detail.html b/packages/ui-default/templates/problem_detail.html index fb107a43f..9d87852aa 100644 --- a/packages/ui-default/templates/problem_detail.html +++ b/packages/ui-default/templates/problem_detail.html @@ -36,9 +36,8 @@ {% endif %} {% if handler.user.hasPriv(PRIV.PRIV_USER_PROFILE) and not tdoc %} -
- - + +