diff --git a/packages/hydrooj/src/handler/contest.ts b/packages/hydrooj/src/handler/contest.ts index 5d77ebf3b..b2ff40d61 100644 --- a/packages/hydrooj/src/handler/contest.ts +++ b/packages/hydrooj/src/handler/contest.ts @@ -73,32 +73,37 @@ ScheduleModel.Worker.addHandler('contest', async (doc) => { export class ContestListHandler extends Handler { @param('rule', Types.Range(contest.RULES), true) + @param('group', Types.Name, true) @param('page', Types.PositiveInt, true) - async get(domainId: string, rule = '', page = 1) { + async get(domainId: string, rule = '', group = '', page = 1) { if (rule && contest.RULES[rule].hidden) throw new BadRequestError(); + const groups = (await user.listGroup(domainId, this.user._id)).map((i) => i.name); + if (group && !groups.includes(group)) throw new NotAssignedError(group); const rules = Object.keys(contest.RULES).filter((i) => !contest.RULES[i].hidden); const q = { - ...this.user.hasPerm(PERM.PERM_VIEW_HIDDEN_CONTEST) + ...this.user.hasPerm(PERM.PERM_VIEW_HIDDEN_CONTEST) && !group ? {} : { $or: [ { maintainer: this.user._id }, { owner: this.user._id }, - { assign: { $in: this.user.group } }, + { assign: { $in: groups } }, { assign: { $size: 0 } }, ], }, ...rule ? { rule } : { rule: { $in: rules } }, + ...group ? { assign: { $in: [group] } } : {}, }; const cursor = contest.getMulti(domainId, q); - const qs = rule ? `rule=${rule}` : ''; + let qs = rule ? `rule=${rule}` : ''; + if (group) qs += qs ? `&group=${group}` : `group=${group}`; const [tdocs, tpcount] = await paginate(cursor, page, system.get('pagination.contest')); const tids = []; for (const tdoc of tdocs) tids.push(tdoc.docId); const tsdict = await contest.getListStatus(domainId, this.user._id, tids); this.response.template = 'contest_main.html'; this.response.body = { - page, tpcount, qs, rule, tdocs, tsdict, + page, tpcount, qs, rule, tdocs, tsdict, groups, group, }; } } diff --git a/packages/hydrooj/src/handler/homework.ts b/packages/hydrooj/src/handler/homework.ts index 6a3ac7c42..ca767dba9 100644 --- a/packages/hydrooj/src/handler/homework.ts +++ b/packages/hydrooj/src/handler/homework.ts @@ -21,20 +21,24 @@ const validatePenaltyRules = (input: string) => yaml.load(input); const convertPenaltyRules = validatePenaltyRules; class HomeworkMainHandler extends Handler { + @param('group', Types.Name, true) @param('page', Types.PositiveInt, true) - async get(domainId: string, page = 1) { + async get(domainId: string, group = '', page = 1) { + const groups = (await user.listGroup(domainId, this.user._id)).map((i) => i.name); + if (group && !groups.includes(group)) throw new NotAssignedError(group); const cursor = contest.getMulti(domainId, { rule: 'homework', - ...this.user.hasPerm(PERM.PERM_VIEW_HIDDEN_HOMEWORK) + ...this.user.hasPerm(PERM.PERM_VIEW_HIDDEN_HOMEWORK) && !group ? {} : { $or: [ { maintainer: this.user._id }, { owner: this.user._id }, - { assign: { $in: this.user.group } }, + { assign: { $in: groups } }, { assign: { $size: 0 } }, ], }, + ...group ? { assign: { $in: [group] } } : {}, }); const [tdocs, tpcount] = await paginate(cursor, page, system.get('pagination.contest')); const calendar = []; @@ -46,8 +50,9 @@ class HomeworkMainHandler extends Handler { } else cal.endAt = tdoc.penaltySince; calendar.push(cal); } + const qs = group ? `group=${group}` : ''; this.response.body = { - tdocs, calendar, tpcount, page, + tdocs, calendar, tpcount, page, qs, groups, group, }; this.response.template = 'homework_main.html'; } diff --git a/packages/ui-default/pages/homework_main.page.styl b/packages/ui-default/pages/homework_main.page.styl index fd6bd952e..8482c6c30 100644 --- a/packages/ui-default/pages/homework_main.page.styl +++ b/packages/ui-default/pages/homework_main.page.styl @@ -11,4 +11,7 @@ $highlight-button-color = #F6DF45 .homework__date margin-right: rem(10px) - white-space: nowrap \ No newline at end of file + white-space: nowrap + + .filter-form + display: inline-block \ No newline at end of file diff --git a/packages/ui-default/templates/contest_main.html b/packages/ui-default/templates/contest_main.html index c2d0597a0..331d14df9 100644 --- a/packages/ui-default/templates/contest_main.html +++ b/packages/ui-default/templates/contest_main.html @@ -60,10 +60,18 @@
{{ _('Show') }}: + {% if groups.length %} + + {% endif %} + {% if groups.length %} + + {{ _('Show') }}: + + +
+ {% endif %} {% if handler.user.hasPerm(perm.PERM_CREATE_HOMEWORK) %} {{ _('Create Homework') }} {% endif %} @@ -51,7 +65,7 @@ {%- endfor -%} - {{ paginator.render(page, tpcount) }} + {{ paginator.render(page, tpcount, add_qs=qs) }}
{% endif %}