import { TestCaseConfig } from 'hydrooj'; import { Text } from '@mantine/core'; import { omit } from 'lodash'; import { useContextMenu } from 'mantine-contextmenu'; import React from 'react'; import { useDrag } from 'react-dnd'; import { useDispatch } from 'react-redux'; import { i18n } from 'vj/utils'; interface TestcaseNodeProps { c: TestCaseConfig; index: number; time?: string; memory?: string; onClick?: () => void; selected: boolean; subtaskId: number; subtaskIds: number[]; } export function TestcaseNode(props: TestcaseNodeProps) { const { c, selected, onClick, subtaskId, } = props; let display = `${c.input} / ${c.output}`; const minlength = Math.min(c.input.length, c.output.length); for (let i = minlength; i >= 0; i--) { const prefix = c.input.slice(0, i); if (c.input.startsWith(prefix) && c.output.startsWith(prefix)) { display = `${prefix}(${c.input.substring(i)}/${c.output.substring(i)})`; break; } } return (
{display}
); } interface TestcaseGroupProps extends Omit { cases: TestCaseConfig[]; onMouseDown?: (event: React.MouseEvent) => void; } export function TestcaseGroup(props: TestcaseGroupProps) { const { cases, subtaskId, subtaskIds, onClick, index, } = props; const dispatch = useDispatch(); const { showContextMenu } = useContextMenu(); const moveTargets = subtaskIds.filter((i) => i !== subtaskId); const [collected, drag] = useDrag(() => ({ type: 'cases', collect: (monitor) => ({ isDragging: monitor.isDragging(), }), canDrag: props.selected, item: { cases, subtaskId }, }), [JSON.stringify(cases), subtaskId]); return
({ key: `move-${id}`, icon: , title: `${i18n('Move to')} ${i18n('Subtask {0}', id)}`, onClick: () => dispatch({ type: 'problemconfig/moveTestcases', payload: { target: id, source: subtaskId, cases }, }), })) : [{ key: 'no-target', title: i18n('No target available'), onClick: () => { }, disabled: true }], )} style={{ opacity: collected.isDragging ? 0.5 : 1 }} > {cases.map((c, id) => ( ))}
; }