From 0273bfe198908a5a8c431a0400cfbc3ee6772d58 Mon Sep 17 00:00:00 2001 From: undefined Date: Thu, 27 May 2021 23:16:18 +0800 Subject: [PATCH] =?UTF-8?q?ui:=20=E6=94=AF=E6=8C=81=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E5=AF=BC=E5=87=BA=E6=96=87=E4=BB=B6=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/fps-importer/handler.ts | 4 ++-- packages/fps-importer/package.json | 2 +- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/interface.ts | 12 ++++++++++- packages/hydrooj/src/lib/testdataConfig.ts | 18 ++++------------ packages/hydrooj/src/model/problem.ts | 2 +- packages/hydrooj/src/model/record.ts | 4 ++-- packages/import-qduoj/handler.ts | 4 ++-- packages/import-qduoj/package.json | 2 +- .../components/zipDownloader/index.js | 21 ++++++++++++++++--- packages/ui-default/package.json | 2 +- .../ui-default/pages/problem_detail.page.jsx | 2 +- .../ui-default/pages/problem_main.page.js | 7 +++++-- 13 files changed, 50 insertions(+), 32 deletions(-) diff --git a/packages/fps-importer/handler.ts b/packages/fps-importer/handler.ts index 26c0ced42..c1c590b09 100644 --- a/packages/fps-importer/handler.ts +++ b/packages/fps-importer/handler.ts @@ -11,7 +11,7 @@ import solution from 'hydrooj/dist/model/solution'; import problem from 'hydrooj/dist/model/problem'; import { PERM } from 'hydrooj/dist/model/builtin'; import { FileTooLargeError, ValidationError } from 'hydrooj/dist/error'; -import type { ProblemConfig } from 'hydrooj'; +import type { ProblemConfigFile } from 'hydrooj'; class FpsProblemImportHandler extends Handler { async get() { @@ -29,7 +29,7 @@ class FpsProblemImportHandler extends Handler { : [], hint: p.hint, }, 'html', this.translate.bind(this)); - const config: ProblemConfig = { + const config: ProblemConfigFile = { time: p.time_limit[0]._ + p.time_limit[0].$.unit, memory: p.memory_limit[0]._ + p.memory_limit[0].$.unit, }; diff --git a/packages/fps-importer/package.json b/packages/fps-importer/package.json index 4d544b456..a57514233 100644 --- a/packages/fps-importer/package.json +++ b/packages/fps-importer/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/fps-importer", - "version": "1.1.13", + "version": "1.2.0", "description": "Import FPS problems", "main": "package.json", "repository": "https://github.com/hydro-dev/Hydro.git", diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index e937cbe35..bc0462b86 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.27.6", + "version": "2.27.7", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/interface.ts b/packages/hydrooj/src/interface.ts index 5463a7913..c7ee2d403 100644 --- a/packages/hydrooj/src/interface.ts +++ b/packages/hydrooj/src/interface.ts @@ -142,7 +142,7 @@ export interface SubtaskConfig { cases?: TestCaseConfig[], } -export interface ProblemConfig { +export interface ProblemConfigFile { type?: ProblemType; score?: number; time?: string; @@ -159,6 +159,16 @@ export interface ProblemConfig { langs?: string[]; } +export interface ProblemConfig { + count: number; + memoryMax: number; + memoryMin: number; + timeMax: number; + timeMin: number; + langs?: string[]; + type: string; +} + export interface PlainContentNode { type: 'Plain', subType: 'html' | 'markdown', diff --git a/packages/hydrooj/src/lib/testdataConfig.ts b/packages/hydrooj/src/lib/testdataConfig.ts index 7fd4abd1d..969d231ca 100644 --- a/packages/hydrooj/src/lib/testdataConfig.ts +++ b/packages/hydrooj/src/lib/testdataConfig.ts @@ -1,24 +1,14 @@ import readYamlCases from '@hydrooj/utils/lib/cases'; import { load } from 'js-yaml'; -import type { ProblemConfig } from '../interface'; +import type { ProblemConfig, ProblemConfigFile } from '../interface'; -interface ParseResult { - count: number; - memoryMax: number; - memoryMin: number; - timeMax: number; - timeMin: number; - langs?: string[]; - type: string; -} - -export async function parseConfig(config: string | ProblemConfig = {}) { - let cfg: ProblemConfig = {}; +export async function parseConfig(config: string | ProblemConfigFile = {}) { + let cfg: ProblemConfigFile = {}; if (typeof config === 'string') { // TODO should validate here? cfg = await readYamlCases(load(config) as Record); } else if (typeof config === 'object') cfg = await readYamlCases(config); - const result: ParseResult = { + const result: ProblemConfig = { count: 0, memoryMin: Number.MAX_SAFE_INTEGER, memoryMax: 0, diff --git a/packages/hydrooj/src/model/problem.ts b/packages/hydrooj/src/model/problem.ts index 563bc9fa3..53233df99 100644 --- a/packages/hydrooj/src/model/problem.ts +++ b/packages/hydrooj/src/model/problem.ts @@ -204,7 +204,7 @@ export class ProblemModel { for (const pdoc of pdocs) { try { // eslint-disable-next-line no-await-in-loop - pdoc.config = await parseConfig(pdoc.config); + pdoc.config = await parseConfig(pdoc.config as string); } catch (e) { pdoc.config = `Cannot parse: ${e.message}`; } diff --git a/packages/hydrooj/src/model/record.ts b/packages/hydrooj/src/model/record.ts index 2410ef2c3..6a7a7023c 100644 --- a/packages/hydrooj/src/model/record.ts +++ b/packages/hydrooj/src/model/record.ts @@ -8,7 +8,7 @@ import moment from 'moment'; import { STATUS } from './builtin'; import task from './task'; import problem from './problem'; -import { RecordDoc, ContestInfo, ProblemConfig } from '../interface'; +import { RecordDoc, ContestInfo, ProblemConfigFile } from '../interface'; import { ArgMethod, buildProjection, Time } from '../utils'; import { MaybeArray } from '../typeutils'; import * as bus from '../service/bus'; @@ -51,7 +51,7 @@ class RecordModel { }; } - static async judge(domainId: string, rid: ObjectID, priority = 0, config: ProblemConfig = {}) { + static async judge(domainId: string, rid: ObjectID, priority = 0, config: ProblemConfigFile = {}) { const rdoc = await RecordModel.get(domainId, rid); let data = []; if (rdoc.pid) { diff --git a/packages/import-qduoj/handler.ts b/packages/import-qduoj/handler.ts index 284ad323a..bce5038b0 100644 --- a/packages/import-qduoj/handler.ts +++ b/packages/import-qduoj/handler.ts @@ -10,7 +10,7 @@ import { ProblemAdd } from 'hydrooj/dist/lib/ui'; import problem from 'hydrooj/dist/model/problem'; import { PERM } from 'hydrooj/dist/model/builtin'; import { buildContent } from 'hydrooj/dist/lib/content'; -import type { ContentNode, ProblemConfig } from 'hydrooj'; +import type { ContentNode, ProblemConfigFile } from 'hydrooj'; fs.ensureDirSync('/tmp/hydro/import-qduoj'); @@ -78,7 +78,7 @@ class ImportQduojHandler extends Handler { const n = await problem.get(domainId, pdoc.display_id); if (n) pdoc.display_id = null; const pid = await problem.add(domainId, pdoc.display_id, pdoc.title, buildContent(content, 'html'), this.user._id, pdoc.tags); - const config: ProblemConfig = { + const config: ProblemConfigFile = { time: `${pdoc.time_limit}ms`, memory: `${pdoc.memory_limit}m`, subtasks: [], diff --git a/packages/import-qduoj/package.json b/packages/import-qduoj/package.json index d9ef40450..4d05f9cfb 100644 --- a/packages/import-qduoj/package.json +++ b/packages/import-qduoj/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/import-qduoj", - "version": "1.1.9", + "version": "1.2.0", "description": "Import QDUOJ problem export", "main": "package.json", "repository": "https://github.com/hydro-dev/Hydro.git", diff --git a/packages/ui-default/components/zipDownloader/index.js b/packages/ui-default/components/zipDownloader/index.js index 4d93774e7..72dcc9c1e 100644 --- a/packages/ui-default/components/zipDownloader/index.js +++ b/packages/ui-default/components/zipDownloader/index.js @@ -5,6 +5,7 @@ import pipeStream from 'vj/utils/pipeStream'; import i18n from 'vj/utils/i18n'; import request from 'vj/utils/request'; import Notification from 'vj/components/notification'; +import { pick } from 'lodash'; let isBeforeUnloadTriggeredByLibrary = !window.isSecureContext; function onBeforeUnload(e) { @@ -62,11 +63,25 @@ export default async function download(name, targets) { window.removeEventListener('beforeunload', onBeforeUnload); } -export async function downloadProblemSet(pids) { +export async function downloadProblemSet(pids, name = 'Export') { + Notification.info('Downloading...'); const targets = []; for (const pid of pids) { const { pdoc } = await request.get(`/d/${UiContext.domainId}/p/${pid}`); - targets.push({ filename: `${pid}/problem.yaml`, content: dump(pdoc) }); + targets.push({ + filename: `${pid}/problem.yaml`, + content: dump({ + content: pdoc.content, + owner: pdoc.owner, + title: pdoc.title, + tag: pdoc.tag, + nSubmit: pdoc.nSubmit, + nAccept: pdoc.nAccept, + data: pdoc.data.map((i) => pick(i, ['name', 'lastModified', 'etag', 'size', '_id'])), + additional_file: pdoc.additional_file.map((i) => pick(i, ['name', 'lastModified', 'etag', 'size', '_id'])), + difficulty: pdoc.difficulty, + }), + }); let { links } = await request.post( `/d/${UiContext.domainId}/p/${pid}/files`, { operation: 'get_links', files: pdoc.data.map((i) => i.name), type: 'testdata' } @@ -81,5 +96,5 @@ export async function downloadProblemSet(pids) { targets.push({ filename: `${pid}/additional_file/${filename}`, url: links[filename] }); } } - await download('Export.zip', targets); + await download(`${name}.zip`, targets); } diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index 4c8eaa6be..14b4ffd9d 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/ui-default", - "version": "4.10.7", + "version": "4.10.8", "author": "undefined ", "license": "AGPL-3.0", "main": "hydro.js", diff --git a/packages/ui-default/pages/problem_detail.page.jsx b/packages/ui-default/pages/problem_detail.page.jsx index c400fe0d8..ab97ceaac 100644 --- a/packages/ui-default/pages/problem_detail.page.jsx +++ b/packages/ui-default/pages/problem_detail.page.jsx @@ -104,7 +104,7 @@ const page = new NamedPage(['problem_detail', 'contest_detail_problem', 'homewor const extender = new ProblemPageExtender(); async function handleClickDownloadProblem() { - await downloadProblemSet([UiContext.problemNumId]); + await downloadProblemSet([UiContext.problemNumId], UiContext.pdoc.title); } async function scratchpadFadeIn() { diff --git a/packages/ui-default/pages/problem_main.page.js b/packages/ui-default/pages/problem_main.page.js index b236f6377..8f5300cf1 100644 --- a/packages/ui-default/pages/problem_main.page.js +++ b/packages/ui-default/pages/problem_main.page.js @@ -202,9 +202,12 @@ async function handleOperation(operation) { } } -async function handleDownload() { +async function handleDownload(ev) { + let name = 'Export'; + // eslint-disable-next-line no-alert + if (ev.shiftKey) name = prompt('Filename:', name); const pids = ensureAndGetSelectedPids(); - await downloadProblemSet(pids); + await downloadProblemSet(pids, name); } const page = new NamedPage(['problem_main', 'problem_category'], () => {