import React from 'react'; import { useDispatch, useSelector } from 'react-redux'; import i18n from 'vj/utils/i18n'; import { isEqual } from 'lodash'; import { Tag, NumericInput } from '@blueprintjs/core'; import { parseTimeMS, parseMemoryMB } from '@hydrooj/utils/lib/common'; import type { SubtaskConfig } from 'hydrooj/src/interface'; import type { RootState } from './reducer/index'; import FileSelectAutoComplete from '../autocomplete/components/FileSelectAutoComplete'; const eq = (a: SubtaskConfig, b: SubtaskConfig) => isEqual(a, b); const eqArr = (a: any[], b: any[]) => isEqual(a, b); export function TestCaseEntry({ index, subindex }) { const testcase = useSelector((state: RootState) => state.config.subtasks[index].cases[subindex], eq); const Files = useSelector((state: RootState) => state.testdata, eqArr); const defaultTime = useSelector((state: RootState) => state.config.subtasks[index].time || state.config.time); const defaultMemory = useSelector((state: RootState) => state.config.subtasks[index].memory || state.config.memory); const dispatch = useDispatch(); const dispatcher = (casesKey: string, valueSuffix = '') => (ev: React.ChangeEvent | number) => { let value = typeof ev !== 'object' ? ev : ev.currentTarget.value; if (value === 0) value = ''; if (valueSuffix && value) value += valueSuffix; dispatch({ type: 'CONFIG_SUBTASK_UPDATE', id: index, key: 'cases-edit', casesId: subindex, casesKey, value, }); }; return ( ms} value={testcase.time ? parseTimeMS(testcase.time).toString() : ''} placeholder={parseTimeMS(defaultTime || '1000ms').toString()} onValueChange={dispatcher('time', 'ms')} buttonPosition="none" fill /> MB} value={testcase.memory ? parseMemoryMB(testcase.memory).toString() : ''} placeholder={parseMemoryMB(defaultMemory || '256m').toString()} onValueChange={dispatcher('memory', 'MB')} buttonPosition="none" fill /> {['input', 'output'].map((t) => ( ))} dispatch({ type: 'CONFIG_SUBTASK_UPDATE', id: index, key: 'cases-delete', value: subindex, })} > ); } export function CasesTable({ index }) { const len = useSelector((state: RootState) => state.config.subtasks[index].cases?.length); const dispatch = useDispatch(); return ( {[...Array(len).keys()].map((i) => )}
{i18n('Time')} {i18n('Memory')} {i18n('Input')} {i18n('Output')} dispatch({ type: 'CONFIG_SUBTASK_UPDATE', id: index, key: 'cases-add', value: { input: '', output: '' }, })} >
{i18n('Time')} {i18n('Memory')} {i18n('Input')} {i18n('Output')} dispatch({ type: 'CONFIG_SUBTASK_UPDATE', id: index, key: 'cases-add', value: { input: '', output: '' }, })} >
); }