diff --git a/.gitignore b/.gitignore index 21a12484..5510490a 100644 --- a/.gitignore +++ b/.gitignore @@ -58,3 +58,5 @@ mvnw # web **/node_modules + +*storybook.log diff --git a/react-ui/.gitignore b/react-ui/.gitignore index 889039c2..7d3ed414 100644 --- a/react-ui/.gitignore +++ b/react-ui/.gitignore @@ -48,3 +48,5 @@ pnpm-lock.yaml /src/pages/CodeConfig/components/AddCodeConfigModal/index.tsx /src/pages/CodeConfig/components/CodeConfigItem/index.tsx /src/pages/Dataset/components/ResourceItem/index.tsx + +*storybook.log diff --git a/react-ui/.nvmrc b/react-ui/.nvmrc new file mode 100644 index 00000000..8ddbc0c6 --- /dev/null +++ b/react-ui/.nvmrc @@ -0,0 +1 @@ +v18.16.0 diff --git a/react-ui/src/components/BasicInfo/BasicInfoItem.tsx b/react-ui/src/components/BasicInfo/BasicInfoItem.tsx index 776a7f94..871b8fb5 100644 --- a/react-ui/src/components/BasicInfo/BasicInfoItem.tsx +++ b/react-ui/src/components/BasicInfo/BasicInfoItem.tsx @@ -4,17 +4,23 @@ * @Description: 用于 BasicInfo 和 BasicTableInfo 组件的子组件 */ +import { Typography } from 'antd'; import React from 'react'; import BasicInfoItemValue from './BasicInfoItemValue'; import { type BasicInfoData, type BasicInfoLink } from './types'; type BasicInfoItemProps = { + /** 基础信息 */ data: BasicInfoData; + /** 标题宽度 */ labelWidth: number; + /** 自定义类名前缀 */ classPrefix: string; + /** 标题是否显示省略号 */ + labelEllipsis?: boolean; }; -function BasicInfoItem({ data, labelWidth, classPrefix }: BasicInfoItemProps) { +function BasicInfoItem({ data, labelWidth, classPrefix, labelEllipsis }: BasicInfoItemProps) { const { label, value, format, ellipsis } = data; const formatValue = format ? format(value) : value; const myClassName = `${classPrefix}__item`; @@ -54,7 +60,9 @@ function BasicInfoItem({ data, labelWidth, classPrefix }: BasicInfoItemProps) { return (
- {label} + + {label} +
{valueComponent}
diff --git a/react-ui/src/components/BasicInfo/BasicInfoItemValue.tsx b/react-ui/src/components/BasicInfo/BasicInfoItemValue.tsx index eca6c80c..7f36a13f 100644 --- a/react-ui/src/components/BasicInfo/BasicInfoItemValue.tsx +++ b/react-ui/src/components/BasicInfo/BasicInfoItemValue.tsx @@ -4,23 +4,24 @@ * @Description: 用于 BasicInfoItem 的组件 */ -import { Link } from '@umijs/max'; +import { isEmpty } from '@/utils'; import { Typography } from 'antd'; -import React from 'react'; +import { Link } from 'react-router-dom'; type BasicInfoItemValueProps = { + /** 值是否显示省略号 */ ellipsis?: boolean; + /** 自定义类名前缀 */ classPrefix: string; - value: string | React.ReactNode; + /** 值 */ + value?: string; + /** 内部链接 */ link?: string; + /** 外部链接 */ url?: string; }; function BasicInfoItemValue({ value, link, url, ellipsis, classPrefix }: BasicInfoItemValueProps) { - if (React.isValidElement(value)) { - return value; - } - const myClassName = `${classPrefix}__item__value`; let component = undefined; if (url && value) { @@ -36,12 +37,12 @@ function BasicInfoItemValue({ value, link, url, ellipsis, classPrefix }: BasicIn ); } else { - component = {value ?? '--'}; + component = {!isEmpty(value) ? value : '--'}; } return (
- + {component}
diff --git a/react-ui/src/components/BasicInfo/index.less b/react-ui/src/components/BasicInfo/index.less index e4570868..661938fb 100644 --- a/react-ui/src/components/BasicInfo/index.less +++ b/react-ui/src/components/BasicInfo/index.less @@ -20,6 +20,10 @@ text-align: justify; text-align-last: justify; + .ant-typography { + width: 100% !important; + } + &::after { position: absolute; content: ':'; @@ -31,10 +35,12 @@ flex: 1; flex-direction: column; gap: 5px 0; + min-width: 0; } &__value { flex: 1; + min-width: 0; margin-left: 16px; font-size: @font-size-content; line-height: 1.6; diff --git a/react-ui/src/components/BasicInfo/index.tsx b/react-ui/src/components/BasicInfo/index.tsx index 5f60b79a..78dc2cfc 100644 --- a/react-ui/src/components/BasicInfo/index.tsx +++ b/react-ui/src/components/BasicInfo/index.tsx @@ -5,14 +5,29 @@ import './index.less'; import type { BasicInfoData, BasicInfoLink } from './types'; export type { BasicInfoData, BasicInfoLink }; -type BasicInfoProps = { +export type BasicInfoProps = { + /** 基础信息 */ datas: BasicInfoData[]; + /** 标题宽度 */ + labelWidth: number; + /** 标题是否显示省略号 */ + labelEllipsis?: boolean; + /** 自定义类名 */ className?: string; + /** 自定义样式 */ style?: React.CSSProperties; - labelWidth: number; }; -export default function BasicInfo({ datas, className, style, labelWidth }: BasicInfoProps) { +/** + * 基础信息展示组件,用于展示基础信息,一行两列,支持格式化数据 + */ +export default function BasicInfo({ + datas, + className, + labelEllipsis, + style, + labelWidth, +}: BasicInfoProps) { return (
{datas.map((item) => ( @@ -21,6 +36,7 @@ export default function BasicInfo({ datas, className, style, labelWidth }: Basic data={item} labelWidth={labelWidth} classPrefix="kf-basic-info" + labelEllipsis={labelEllipsis} /> ))}
diff --git a/react-ui/src/components/BasicTableInfo/index.tsx b/react-ui/src/components/BasicTableInfo/index.tsx index f24f3dc9..fab761e2 100644 --- a/react-ui/src/components/BasicTableInfo/index.tsx +++ b/react-ui/src/components/BasicTableInfo/index.tsx @@ -1,22 +1,20 @@ import classNames from 'classnames'; +import { BasicInfoProps } from '../BasicInfo'; import BasicInfoItem from '../BasicInfo/BasicInfoItem'; import { type BasicInfoData, type BasicInfoLink } from '../BasicInfo/types'; import './index.less'; export type { BasicInfoData, BasicInfoLink }; -type BasicTableInfoProps = { - datas: BasicInfoData[]; - className?: string; - style?: React.CSSProperties; - labelWidth: number; -}; - +/** + * 表格基础信息展示组件,用于展示基础信息,一行四列,支持格式化数据 + */ export default function BasicTableInfo({ datas, className, style, labelWidth, -}: BasicTableInfoProps) { + labelEllipsis, +}: BasicInfoProps) { const remainder = datas.length % 4; const array = []; if (remainder > 0) { @@ -36,6 +34,7 @@ export default function BasicTableInfo({ key={`${item.label}-${index}`} data={item} labelWidth={labelWidth} + labelEllipsis={labelEllipsis} classPrefix="kf-basic-table-info" /> ))} diff --git a/react-ui/src/pages/AutoML/components/AutoMLBasic/index.tsx b/react-ui/src/pages/AutoML/components/AutoMLBasic/index.tsx index bb30e064..6a4ceaa7 100644 --- a/react-ui/src/pages/AutoML/components/AutoMLBasic/index.tsx +++ b/react-ui/src/pages/AutoML/components/AutoMLBasic/index.tsx @@ -46,28 +46,23 @@ function AutoMLBasic({ info, className, runStatus, isInstance = false }: AutoMLB { label: '实验名称', value: info.ml_name, - ellipsis: true, }, { label: '实验描述', value: info.ml_description, - ellipsis: true, }, { label: '创建人', value: info.create_by, - ellipsis: true, }, { label: '创建时间', value: info.create_time, - ellipsis: true, format: formatDate, }, { label: '更新时间', value: info.update_time, - ellipsis: true, format: formatDate, }, ]; @@ -81,18 +76,15 @@ function AutoMLBasic({ info, className, runStatus, isInstance = false }: AutoMLB { label: '任务类型', value: info.task_type, - ellipsis: true, format: formatEnum(autoMLTaskTypeOptions), }, { label: '特征预处理算法', value: info.include_feature_preprocessor, - ellipsis: true, }, { label: '排除的特征预处理算法', value: info.exclude_feature_preprocessor, - ellipsis: true, }, { label: info.task_type === AutoMLTaskType.Regression ? '回归算法' : '分类算法', @@ -100,7 +92,6 @@ function AutoMLBasic({ info, className, runStatus, isInstance = false }: AutoMLB info.task_type === AutoMLTaskType.Regression ? info.include_regressor : info.include_classifier, - ellipsis: true, }, { label: info.task_type === AutoMLTaskType.Regression ? '排除的回归算法' : '排除的分类算法', @@ -108,91 +99,73 @@ function AutoMLBasic({ info, className, runStatus, isInstance = false }: AutoMLB info.task_type === AutoMLTaskType.Regression ? info.exclude_regressor : info.exclude_classifier, - ellipsis: true, }, { label: '集成方式', value: info.ensemble_class, - ellipsis: true, format: formatEnum(autoMLEnsembleClassOptions), }, { label: '集成模型数量', value: info.ensemble_size, - ellipsis: true, }, { label: '集成最佳模型数量', value: info.ensemble_nbest, - ellipsis: true, }, { label: '最大数量', value: info.max_models_on_disc, - ellipsis: true, }, { label: '内存限制(MB)', value: info.memory_limit, - ellipsis: true, }, { label: '单次时间限制(秒)', value: info.per_run_time_limit, - ellipsis: true, }, { label: '搜索时间限制(秒)', value: info.time_left_for_this_task, - ellipsis: true, }, { label: '重采样策略', value: info.resampling_strategy, - ellipsis: true, }, { label: '交叉验证折数', value: info.folds, - ellipsis: true, }, { label: '是否打乱', value: info.shuffle, - ellipsis: true, format: formatBoolean, }, { label: '训练集比率', value: info.train_size, - ellipsis: true, }, { label: '测试集比率', value: info.test_size, - ellipsis: true, }, { label: '计算指标', value: info.scoring_functions, - ellipsis: true, }, { label: '随机种子', value: info.seed, - ellipsis: true, }, - { label: '数据集', value: info.dataset, - ellipsis: true, format: formatDataset, }, { label: '预测目标列', value: info.target_columns, - ellipsis: true, }, ]; }, [info]); @@ -205,18 +178,15 @@ function AutoMLBasic({ info, className, runStatus, isInstance = false }: AutoMLB { label: '指标名称', value: info.metric_name, - ellipsis: true, }, { label: '优化方向', value: info.greater_is_better, - ellipsis: true, format: formatOptimizeMode, }, { label: '指标权重', value: info.metrics, - ellipsis: true, format: formatMetricsWeight, }, ]; @@ -231,12 +201,10 @@ function AutoMLBasic({ info, className, runStatus, isInstance = false }: AutoMLB { label: '启动时间', value: formatDate(runStatus.startedAt), - ellipsis: true, }, { label: '执行时长', value: elapsedTime(runStatus.startedAt, runStatus.finishedAt), - ellipsis: true, }, { label: '状态', @@ -259,7 +227,6 @@ function AutoMLBasic({ info, className, runStatus, isInstance = false }: AutoMLB ), - ellipsis: true, }, ]; }, [runStatus]); diff --git a/react-ui/src/pages/Dataset/components/ResourceIntro/index.tsx b/react-ui/src/pages/Dataset/components/ResourceIntro/index.tsx index 807270a8..10d7d9d2 100644 --- a/react-ui/src/pages/Dataset/components/ResourceIntro/index.tsx +++ b/react-ui/src/pages/Dataset/components/ResourceIntro/index.tsx @@ -19,50 +19,41 @@ const getDatasetDatas = (data: DatasetData): BasicInfoData[] => [ { label: '数据集名称', value: data.name, - ellipsis: true, }, { label: '版本', value: data.version, - ellipsis: true, }, { label: '创建人', value: data.create_by, - ellipsis: true, }, { label: '更新时间', value: data.update_time, - ellipsis: true, }, { label: '数据来源', value: data.dataset_source, format: formatSource, - ellipsis: true, }, { label: '训练任务', value: data.train_task, format: formatTrainTask, - ellipsis: true, }, { label: '处理代码', value: data.processing_code, format: formatCodeConfig, - ellipsis: true, }, { label: '数据集分类', value: data.data_type, - ellipsis: true, }, { label: '研究方向', value: data.data_tag, - ellipsis: true, }, ]; diff --git a/react-ui/src/pages/HyperParameter/components/HyperParameterBasic/index.tsx b/react-ui/src/pages/HyperParameter/components/HyperParameterBasic/index.tsx index 62f33d6d..dc767ee8 100644 --- a/react-ui/src/pages/HyperParameter/components/HyperParameterBasic/index.tsx +++ b/react-ui/src/pages/HyperParameter/components/HyperParameterBasic/index.tsx @@ -61,28 +61,23 @@ function HyperParameterBasic({ { label: '实验名称', value: info.name, - ellipsis: true, }, { label: '实验描述', value: info.description, - ellipsis: true, }, { label: '创建人', value: info.create_by, - ellipsis: true, }, { label: '创建时间', value: info.create_time, - ellipsis: true, format: formatDate, }, { label: '更新时间', value: info.update_time, - ellipsis: true, format: formatDate, }, ]; @@ -96,75 +91,62 @@ function HyperParameterBasic({ { label: '代码', value: info.code, - ellipsis: true, format: formatCodeConfig, }, { label: '主函数代码文件', value: info.main_py, - ellipsis: true, }, { label: '镜像', value: info.image, format: formatMirror, - ellipsis: true, }, { label: '数据集', value: info.dataset, - ellipsis: true, format: formatDataset, }, { label: '模型', value: info.model, - ellipsis: true, format: formatModel, }, { label: '总实验次数', value: info.num_samples, - ellipsis: true, }, { label: '搜索算法', value: info.search_alg, format: formatEnum(searchAlgorithms), - ellipsis: true, }, { label: '调度算法', value: info.scheduler, format: formatEnum(schedulerAlgorithms), - ellipsis: true, }, { label: '单次试验最大时间', value: info.max_t, - ellipsis: true, }, { label: '最小试验数', value: info.min_samples_required, - ellipsis: true, }, { label: '优化方向', value: info.mode, - ellipsis: true, format: formatOptimizeMode, }, { label: '指标', value: info.metric, - ellipsis: true, }, { label: '资源规格', value: info.resource, format: formatResource, - ellipsis: true, }, ]; }, [info]); diff --git a/react-ui/src/pages/ModelDeployment/components/VersionBasicInfo/index.tsx b/react-ui/src/pages/ModelDeployment/components/VersionBasicInfo/index.tsx index 28da0127..7b0ec868 100644 --- a/react-ui/src/pages/ModelDeployment/components/VersionBasicInfo/index.tsx +++ b/react-ui/src/pages/ModelDeployment/components/VersionBasicInfo/index.tsx @@ -51,80 +51,65 @@ function VersionBasicInfo({ info }: BasicInfoProps) { { label: '服务名称', value: info?.service_name, - ellipsis: true, }, { label: '版本名称', value: info?.version, - ellipsis: true, }, { label: '代码配置', value: info?.code_config, format: formatCodeConfig, - ellipsis: true, }, { label: '镜像', value: info?.image, - ellipsis: true, }, { label: '状态', value: info?.run_state, format: formatStatus, - ellipsis: true, }, { label: '模型', value: info?.model, format: formatModel, - ellipsis: true, }, { label: '资源规格', value: info?.resource, format: formatResource, - ellipsis: true, }, { label: '挂载路径', value: info?.mount_path, - ellipsis: true, }, { label: 'API URL', value: info?.url, - ellipsis: true, }, - { label: '副本数量', value: info?.replicas, - ellipsis: true, }, { label: '创建时间', value: info?.create_time, format: formatDate, - ellipsis: true, }, { label: '更新时间', value: info?.update_time, format: formatDate, - ellipsis: true, }, { label: '环境变量', value: info?.env_variables, format: formatEnvText, - ellipsis: true, }, { label: '描述', value: info?.description, - ellipsis: true, }, ];