140 lines
4.6 KiB
JavaScript
140 lines
4.6 KiB
JavaScript
|
|
'use client';
|
|||
|
|
|
|||
|
|
import React from 'react';
|
|||
|
|
import { Box, Tabs, Tab } from '@mui/material';
|
|||
|
|
import { useTranslation } from 'react-i18next';
|
|||
|
|
import Link from 'next/link';
|
|||
|
|
import DescriptionOutlinedIcon from '@mui/icons-material/DescriptionOutlined';
|
|||
|
|
import TokenOutlinedIcon from '@mui/icons-material/TokenOutlined';
|
|||
|
|
import QuestionAnswerOutlinedIcon from '@mui/icons-material/QuestionAnswerOutlined';
|
|||
|
|
import DatasetOutlinedIcon from '@mui/icons-material/DatasetOutlined';
|
|||
|
|
import AssessmentOutlinedIcon from '@mui/icons-material/AssessmentOutlined';
|
|||
|
|
import MoreVertIcon from '@mui/icons-material/MoreVert';
|
|||
|
|
import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown';
|
|||
|
|
import * as styles from './styles';
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* NavigationTabs 组件
|
|||
|
|
* 桌面端导航 Tabs,包含数据源、数据蒸馏、问题管理、数据集管理、更多等 Tab
|
|||
|
|
*/
|
|||
|
|
export default function NavigationTabs({
|
|||
|
|
theme,
|
|||
|
|
pathname,
|
|||
|
|
currentProject,
|
|||
|
|
handleMenuOpen,
|
|||
|
|
handleMenuClose,
|
|||
|
|
onNavigateStart
|
|||
|
|
}) {
|
|||
|
|
const { t } = useTranslation();
|
|||
|
|
|
|||
|
|
// 计算当前 Tab 值
|
|||
|
|
const getCurrentTabValue = () => {
|
|||
|
|
if (pathname.includes('/settings') || pathname.includes('/playground') || pathname.includes('/datasets-sq')) {
|
|||
|
|
return 'more';
|
|||
|
|
}
|
|||
|
|
if (pathname.includes('/eval-datasets') || pathname.includes('/eval-tasks')) {
|
|||
|
|
return 'eval';
|
|||
|
|
}
|
|||
|
|
if (pathname.includes('/datasets') || pathname.includes('/multi-turn') || pathname.includes('/image-datasets')) {
|
|||
|
|
return 'datasets';
|
|||
|
|
}
|
|||
|
|
if (pathname.includes('/text-split') || pathname.includes('/images')) {
|
|||
|
|
return 'source';
|
|||
|
|
}
|
|||
|
|
return pathname;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
return (
|
|||
|
|
<Box sx={styles.navContainerStyles}>
|
|||
|
|
<Tabs
|
|||
|
|
value={getCurrentTabValue()}
|
|||
|
|
textColor="inherit"
|
|||
|
|
indicatorColor="secondary"
|
|||
|
|
variant="scrollable"
|
|||
|
|
scrollButtons="auto"
|
|||
|
|
allowScrollButtonsMobile
|
|||
|
|
sx={styles.getTabsStyles(theme)}
|
|||
|
|
>
|
|||
|
|
<Tab
|
|||
|
|
icon={<DescriptionOutlinedIcon fontSize="small" />}
|
|||
|
|
iconPosition="start"
|
|||
|
|
label={
|
|||
|
|
<Box sx={{ display: 'flex', alignItems: 'center', gap: 0.25 }}>
|
|||
|
|
{t('common.dataSource')}
|
|||
|
|
<ArrowDropDownIcon fontSize="small" sx={{ ml: 0.25 }} />
|
|||
|
|
</Box>
|
|||
|
|
}
|
|||
|
|
value="source"
|
|||
|
|
onMouseEnter={e => handleMenuOpen(e, 'source')}
|
|||
|
|
sx={styles.tabIconWrapperStyles}
|
|||
|
|
/>
|
|||
|
|
<Tab
|
|||
|
|
icon={<TokenOutlinedIcon fontSize="small" />}
|
|||
|
|
iconPosition="start"
|
|||
|
|
label={t('distill.title')}
|
|||
|
|
value={`/projects/${currentProject}/distill`}
|
|||
|
|
component={Link}
|
|||
|
|
href={`/projects/${currentProject}/distill`}
|
|||
|
|
onClick={() => {
|
|||
|
|
onNavigateStart?.();
|
|||
|
|
handleMenuClose();
|
|||
|
|
}}
|
|||
|
|
sx={styles.tabIconWrapperStyles}
|
|||
|
|
/>
|
|||
|
|
<Tab
|
|||
|
|
icon={<QuestionAnswerOutlinedIcon fontSize="small" />}
|
|||
|
|
iconPosition="start"
|
|||
|
|
label={t('questions.title')}
|
|||
|
|
value={`/projects/${currentProject}/questions`}
|
|||
|
|
component={Link}
|
|||
|
|
href={`/projects/${currentProject}/questions`}
|
|||
|
|
onClick={() => {
|
|||
|
|
onNavigateStart?.();
|
|||
|
|
handleMenuClose();
|
|||
|
|
}}
|
|||
|
|
sx={styles.tabIconWrapperStyles}
|
|||
|
|
/>
|
|||
|
|
<Tab
|
|||
|
|
icon={<DatasetOutlinedIcon fontSize="small" />}
|
|||
|
|
iconPosition="start"
|
|||
|
|
label={
|
|||
|
|
<Box sx={{ display: 'flex', alignItems: 'center', gap: 0.25 }}>
|
|||
|
|
{t('datasets.management')}
|
|||
|
|
<ArrowDropDownIcon fontSize="small" sx={{ ml: 0.25 }} />
|
|||
|
|
</Box>
|
|||
|
|
}
|
|||
|
|
value="datasets"
|
|||
|
|
onMouseEnter={e => handleMenuOpen(e, 'dataset')}
|
|||
|
|
sx={styles.tabIconWrapperStyles}
|
|||
|
|
/>
|
|||
|
|
<Tab
|
|||
|
|
icon={<AssessmentOutlinedIcon fontSize="small" />}
|
|||
|
|
iconPosition="start"
|
|||
|
|
label={
|
|||
|
|
<Box sx={{ display: 'flex', alignItems: 'center', gap: 0.25 }}>
|
|||
|
|
{t('eval.title')}
|
|||
|
|
<ArrowDropDownIcon fontSize="small" sx={{ ml: 0.25 }} />
|
|||
|
|
</Box>
|
|||
|
|
}
|
|||
|
|
value="eval"
|
|||
|
|
onMouseEnter={e => handleMenuOpen(e, 'eval')}
|
|||
|
|
sx={styles.tabIconWrapperStyles}
|
|||
|
|
/>
|
|||
|
|
<Tab
|
|||
|
|
icon={<MoreVertIcon fontSize="small" />}
|
|||
|
|
iconPosition="start"
|
|||
|
|
label={
|
|||
|
|
<Box sx={{ display: 'flex', alignItems: 'center', gap: 0.25 }}>
|
|||
|
|
{t('common.more')}
|
|||
|
|
<ArrowDropDownIcon fontSize="small" sx={{ ml: 0.25 }} />
|
|||
|
|
</Box>
|
|||
|
|
}
|
|||
|
|
onMouseEnter={e => handleMenuOpen(e, 'more')}
|
|||
|
|
value="more"
|
|||
|
|
sx={styles.tabIconWrapperStyles}
|
|||
|
|
/>
|
|||
|
|
</Tabs>
|
|||
|
|
</Box>
|
|||
|
|
);
|
|||
|
|
}
|