import KFIcon from '@/components/KFIcon'; import { ExperimentStatus } from '@/enums'; import { useCheck } from '@/hooks'; import { experimentStatusInfo } from '@/pages/Experiment/status'; import themes from '@/styles/theme.less'; import { type ExperimentInstance } from '@/types'; import { elapsedTime, formatDate } from '@/utils/date'; import { to } from '@/utils/promise'; import { modalConfirm } from '@/utils/ui'; import { DoubleRightOutlined } from '@ant-design/icons'; import { App, Button, Checkbox, ConfigProvider, Typography } from 'antd'; import classNames from 'classnames'; import { useEffect, useMemo } from 'react'; import { ExperimentListType, experimentListConfig } from '../ExperimentList/config'; import styles from './index.less'; type ExperimentInstanceProps = { type: ExperimentListType; experimentInsList?: ExperimentInstance[]; experimentInsTotal: number; onClickInstance?: (instance: ExperimentInstance) => void; onRemove?: () => void; onTerminate?: (instance: ExperimentInstance) => void; onLoadMore?: () => void; }; function ExperimentInstanceComponent({ type, experimentInsList, experimentInsTotal, onClickInstance, onRemove, onTerminate, onLoadMore, }: ExperimentInstanceProps) { const { message } = App.useApp(); const allIntanceIds = useMemo(() => { return experimentInsList?.map((item) => item.id) || []; }, [experimentInsList]); const [ selectedIns, setSelectedIns, checked, indeterminate, checkAll, isSingleChecked, checkSingle, ] = useCheck(allIntanceIds); const config = experimentListConfig[type]; useEffect(() => { // 关闭时清空 if (allIntanceIds.length === 0) { setSelectedIns([]); } }, [allIntanceIds, setSelectedIns]); // 删除实验实例确认 const handleRemove = (instance: ExperimentInstance) => { modalConfirm({ title: '确定删除该条实例吗?', onOk: () => { deleteExperimentInstance(instance.id); }, }); }; // 删除实验实例 const deleteExperimentInstance = async (id: number) => { const request = config.deleteInsReq; const [res] = await to(request(id)); if (res) { message.success('删除成功'); onRemove?.(); } }; // 批量删除实验实例确认 const handleDeleteAll = () => { modalConfirm({ title: '确定批量删除选中的实例吗?', onOk: () => { batchDeleteExperimentInstances(); }, }); }; // 批量删除实验实例 const batchDeleteExperimentInstances = async () => { const request = config.batchDeleteInsReq; const [res] = await to(request(selectedIns)); if (res) { message.success('删除成功'); setSelectedIns([]); onRemove?.(); } }; // 终止实验实例 const terminateExperimentInstance = async (instance: ExperimentInstance) => { const request = config.stopInsReq; const [res] = await to(request(instance.id)); if (res) { message.success('终止成功'); onTerminate?.(instance); } }; if (!experimentInsList || experimentInsList.length === 0) { return
暂无实验实例
; } return (
序号
运行时长
开始时间
状态
操作 {selectedIns.length > 0 && ( )}
{experimentInsList.map((item, index) => (
checkSingle(item.id)} >
onClickInstance?.(item)} > {index + 1}
{elapsedTime(item.create_time, item.finish_time)}
{formatDate(item.create_time)}
{experimentStatusInfo[item.status as ExperimentStatus]?.label}
))} {experimentInsTotal > experimentInsList.length ? (
) : null}
); } export default ExperimentInstanceComponent;