diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index e6c3c8440..4a85a3d49 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "4.0.15", + "version": "4.0.16", "bin": "bin/hydrooj.js", "main": "src/plugin-api", "module": "src/plugin-api", diff --git a/packages/hydrooj/src/handler/contest.ts b/packages/hydrooj/src/handler/contest.ts index 7515c8477..afa02f681 100644 --- a/packages/hydrooj/src/handler/contest.ts +++ b/packages/hydrooj/src/handler/contest.ts @@ -106,6 +106,36 @@ export class ContestDetailBaseHandler extends Handler { this.tsdoc.endAt = moment(this.tsdoc.startAt).add(this.tdoc.duration, 'hours').toDate(); } } + + @param('tid', Types.ObjectID, true) + async after(domainId: string, tid: ObjectID) { + if (!tid || this.request.json || !this.response.template || !contest.isOngoing(this.tdoc, this.tsdoc)) return; + const pdoc = 'pdoc' in this ? (this as any).pdoc : {}; + this.response.body.overrideNav = [ + { name: 'homepage', args: { prefix: 'homepage' }, checker: () => true }, + { + name: 'contest_detail', + displayName: this.tdoc.title, + args: { tid, prefix: 'contest_detail' }, + checker: () => true, + }, + { + name: 'contest_scoreboard', + args: { tid, prefix: 'contest_scoreboard' }, + checker: () => contest.canShowScoreboard.call(this, this.tdoc, true), + }, + { + name: 'record_main', + args: { tid, prefix: 'record_main', query: contest.canShowRecord.call(this, this.tdoc, true) ? {} : { uidOrName: this.user._id } }, + checker: () => contest.canShowSelfRecord.call(this, this.tdoc, true), + }, + { + displayName: `${String.fromCharCode(65 + this.tdoc.pids.indexOf(pdoc.docId))}. ${pdoc.title}`, + args: { query: { tid }, pid: pdoc.docId, prefix: 'contest_detail_problem' }, + checker: () => 'pdoc' in this, + }, + ]; + } } export class ContestDetailHandler extends ContestDetailBaseHandler { diff --git a/packages/hydrooj/src/service/layers/renderer.ts b/packages/hydrooj/src/service/layers/renderer.ts index d6a6eac54..658a5624f 100644 --- a/packages/hydrooj/src/service/layers/renderer.ts +++ b/packages/hydrooj/src/service/layers/renderer.ts @@ -35,17 +35,20 @@ export default (router, logger) => async (ctx: KoaContext, next) => { response.body = await ctx.renderHTML(name, args); response.type = 'text/html'; }; - ctx.getUrl = (name: string, kwargs: any = {}) => { + ctx.getUrl = (name: string, ...kwargsList: Record[]) => { + if (name === '#') return '#'; let res = '#'; const args: any = {}; const query: any = {}; - for (const key in kwargs) { - if (kwargs[key] instanceof ObjectID) args[key] = kwargs[key].toHexString(); - else args[key] = kwargs[key].toString().replace(/\//g, '%2F'); - } - for (const key in kwargs.query || {}) { - if (query[key] instanceof ObjectID) query[key] = kwargs.query[key].toHexString(); - else query[key] = kwargs.query[key].toString(); + for (const kwargs of kwargsList) { + for (const key in kwargs) { + if (kwargs[key] instanceof ObjectID) args[key] = kwargs[key].toHexString(); + else args[key] = kwargs[key].toString().replace(/\//g, '%2F'); + } + for (const key in kwargs.query || {}) { + if (query[key] instanceof ObjectID) query[key] = kwargs.query[key].toHexString(); + else query[key] = kwargs.query[key].toString(); + } } try { const { anchor } = args; diff --git a/packages/hydrooj/src/service/server.ts b/packages/hydrooj/src/service/server.ts index c2f348e6f..46705a3df 100644 --- a/packages/hydrooj/src/service/server.ts +++ b/packages/hydrooj/src/service/server.ts @@ -252,7 +252,7 @@ async function handle(ctx: KoaContext, HandlerClass, checker) { ...operation ? [ `handler/before-operation/${name}`, 'handler/before-operation', `post${operation}`, 'log/__operationDone', - ] : [], + ] : [], 'after', `handler/after/${name}`, 'handler/after', 'cleanup', `handler/finish/${name}`, 'handler/finish', ]; diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index a54c2530a..bd13ed628 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/ui-default", - "version": "4.41.13", + "version": "4.41.14", "author": "undefined ", "license": "AGPL-3.0", "main": "index.ts", diff --git a/packages/ui-default/templates/partials/nav.html b/packages/ui-default/templates/partials/nav.html index 7fe9437a6..884a71773 100644 --- a/packages/ui-default/templates/partials/nav.html +++ b/packages/ui-default/templates/partials/nav.html @@ -1,7 +1,7 @@ -{%- macro nav_item(target_name, target_args, target_prefix) -%} +{%- macro nav_item(item) -%} {%- endmacro -%} @@ -10,8 +10,8 @@