From a52c488e23585fd30f720c0e9a789d2cfb3fadf7 Mon Sep 17 00:00:00 2001 From: panda Date: Thu, 21 Jul 2022 20:59:36 +0800 Subject: [PATCH] core&ui: add problems gql to fix autocomplete (#389) --- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/handler/problem.ts | 5 +++++ packages/hydrooj/src/model/contest.ts | 3 ++- .../components/ProblemSelectAutoComplete.tsx | 10 ++++++++-- packages/ui-default/package.json | 2 +- 5 files changed, 17 insertions(+), 5 deletions(-) diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index d725dada3..2c27450c1 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "3.14.16", + "version": "3.14.17", "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 e1c1891f9..fdd9f9d44 100644 --- a/packages/hydrooj/src/handler/problem.ts +++ b/packages/hydrooj/src/handler/problem.ts @@ -80,6 +80,11 @@ registerResolver( return pdoc; }, ); +registerResolver('Query', 'problems(ids: [Int])', '[Problem]', async (arg, ctx) => { + const res = await problem.getList(ctx.args.domainId, arg.ids, ctx.user.hasPerm(PERM.PERM_VIEW_PROBLEM_HIDDEN) || ctx.user._id, + ctx.user.group, undefined, undefined, true); + return Object.keys(res).map((id) => res[+id]); +}, 'Get a list of problem by ids'); registerResolver( 'Problem', 'manage', 'ProblemManage', (arg, ctx) => { diff --git a/packages/hydrooj/src/model/contest.ts b/packages/hydrooj/src/model/contest.ts index 63744828b..2d70a9509 100644 --- a/packages/hydrooj/src/model/contest.ts +++ b/packages/hydrooj/src/model/contest.ts @@ -488,7 +488,8 @@ export async function get(domainId: string, tid: ObjectID): Promise> { } export async function getRelated(domainId: string, pid: number) { - return await document.getMulti(domainId, document.TYPE_CONTEST, { pids: pid }).toArray(); + const rules = Object.keys(RULES).filter((i) => !RULES[i].hidden); + return await document.getMulti(domainId, document.TYPE_CONTEST, { pids: pid, rule: { $in: rules } }).toArray(); } export async function getStatus(domainId: string, tid: ObjectID, uid: number) { diff --git a/packages/ui-default/components/autocomplete/components/ProblemSelectAutoComplete.tsx b/packages/ui-default/components/autocomplete/components/ProblemSelectAutoComplete.tsx index cd499b22d..c54a9f121 100644 --- a/packages/ui-default/components/autocomplete/components/ProblemSelectAutoComplete.tsx +++ b/packages/ui-default/components/autocomplete/components/ProblemSelectAutoComplete.tsx @@ -1,5 +1,6 @@ import React, { forwardRef } from 'react'; import PropTypes from 'prop-types'; +import api, { gql } from 'vj/utils/api'; import request from 'vj/utils/request'; import type { ProblemDoc } from 'hydrooj/src/interface'; import AutoComplete, { AutoCompleteHandle, AutoCompleteProps } from './AutoComplete'; @@ -9,8 +10,13 @@ const ProblemSelectAutoComplete = forwardRef, Aut ref={ref as any} cacheKey={`problem-${UiContext.domainId}`} queryItems={(query) => request.get(`/d/${UiContext.domainId}/problem/list`, { prefix: query })} - // FIXME fetch items - fetchItems={(ids) => ids.map((id) => ({ docId: id, pid: id, title: id }) as any)} + fetchItems={(ids) => api(gql` + problems(ids: ${ids.map((i) => +i)}) { + docId + pid + title + } + `, ['data', 'problems'])} itemText={(pdoc) => `${`${pdoc.docId} ${pdoc.title}`}`} itemKey={(pdoc) => `${pdoc.docId || pdoc}`} renderItem={(pdoc) => ( diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index 4c6b34a89..fd900f2ed 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/ui-default", - "version": "4.38.16", + "version": "4.38.17", "author": "undefined ", "license": "AGPL-3.0", "main": "hydro.js",