Files
gpustack-ui/src/pages/benchmark/details.tsx
T
2026-02-06 14:27:05 +08:00

176 lines
5.1 KiB
TypeScript

import DeleteModal from '@/components/delete-modal';
import BaseSelect from '@/components/seal-form/base/select';
import { useIntl, useNavigate, useSearchParams } from '@umijs/max';
import { useMemoizedFn } from 'ahooks';
import React, { useEffect, useRef } from 'react';
import { PageContainerInner } from '../_components/page-box';
import PageBreadcrumb from '../_components/page-breadcrumb';
import { deleteBenchmark } from './apis';
import DetailContent from './components/detail-content';
import FadeIn from './components/fade-in';
import RowActions from './components/row-actions';
import ViewLogsModal from './components/view-logs-modal';
import DetailContext from './config/detail-context';
import { BenchmarkListItem } from './config/types';
import useViewLogs from './hooks/use-view-logs';
import { useExportBenchmark } from './services/use-export-benchmark';
import useQueryBenchmarkList from './services/use-query-benchmarks';
import useQueryDetail from './services/use-query-detail';
import useQueryProfiles from './services/use-query-profiles';
import useStopBenchmark from './services/use-stop-benchmark';
const Details: React.FC = () => {
const modalRef = useRef<any>(null);
const navigate = useNavigate();
const intl = useIntl();
const {
dataList: benchmarkList,
fetchData: fetchBenchmarkList,
cancelRequest: cancelBenchmarkRequest
} = useQueryBenchmarkList();
const {
profilesOptions,
fetchProfilesData,
cancelRequest: cancelProfilesRequest
} = useQueryProfiles();
const { loading, detailData, cancelRequest, fetchData } = useQueryDetail();
const { openViewLogsModal, closeViewLogsModal, openViewLogsModalStatus } =
useViewLogs();
const { handleStopBenchmark } = useStopBenchmark();
const { exportData } = useExportBenchmark();
const [searchParams] = useSearchParams();
const name = searchParams.get('name');
const id = searchParams.get('id');
const handleOnChange = (value: number, option: any) => {
navigate(
`/models/benchmark/detail?id=${option.value}&name=${option.label}`,
{ state: 'benchmark-details', replace: true }
);
};
const breadcrumbItems = [
{
title: <a>{intl.formatMessage({ id: 'benchmark.title' })}</a>,
onClick: () => navigate(-1)
},
{
title: (
<BaseSelect
size="small"
variant="borderless"
options={benchmarkList}
value={name}
style={{ minWidth: 100 }}
popupMatchSelectWidth={false}
onChange={handleOnChange}
></BaseSelect>
)
}
];
const handleDelete = (row: BenchmarkListItem) => {
modalRef.current?.show({
content: 'benchmark.title',
operation: 'common.delete.single.confirm',
name: row.name,
async onOk() {
await deleteBenchmark(row.id);
fetchBenchmarkList({ page: -1 }).then((items) => {
if (items.length === 0) {
navigate(-1);
} else {
handleOnChange(items[0].id, {
value: items[0].id,
label: items[0].name
});
}
});
}
});
};
const handleSelect = useMemoizedFn((val: any, row: BenchmarkListItem) => {
if (val === 'delete') {
handleDelete({ ...row, name: row.name });
} else if (val === 'viewlog') {
openViewLogsModal(row);
} else if (val === 'stop') {
handleStopBenchmark(row.id);
} else if (val === 'export') {
exportData([row.id], row.name);
}
});
useEffect(() => {
document.title = `${intl.formatMessage({ id: 'benchmark.title' })} - ${name}`;
}, [name, intl]);
useEffect(() => {
fetchBenchmarkList({ page: -1 });
fetchProfilesData();
return () => {
cancelBenchmarkRequest();
cancelProfilesRequest();
};
}, []);
useEffect(() => {
if (id) {
fetchData(id);
} else {
cancelRequest();
}
}, [id]);
return (
<PageContainerInner
header={{
title: <PageBreadcrumb items={breadcrumbItems} />
}}
>
<DetailContext.Provider
value={{
detailData: detailData || {},
clusterList: [],
loading: loading,
id: Number(id),
profilesOptions: profilesOptions
}}
>
<DetailContent
tabBarExtraContent={{
right: (
<FadeIn>
<div
style={{
opacity: loading ? 0 : 1,
position: 'relative',
bottom: -2,
right: -1
}}
>
<RowActions
page="detail"
record={detailData as any}
handleSelect={handleSelect}
></RowActions>
</div>
</FadeIn>
)
}}
></DetailContent>
</DetailContext.Provider>
<ViewLogsModal
open={openViewLogsModalStatus.open}
url={openViewLogsModalStatus.url}
tail={openViewLogsModalStatus.tail}
onCancel={closeViewLogsModal}
></ViewLogsModal>
<DeleteModal ref={modalRef}></DeleteModal>
</PageContainerInner>
);
};
export default Details;