diff --git a/react-ui/src/pages/Experiment/index.jsx b/react-ui/src/pages/Experiment/index.jsx
index aa6349d8..69648b49 100644
--- a/react-ui/src/pages/Experiment/index.jsx
+++ b/react-ui/src/pages/Experiment/index.jsx
@@ -198,7 +198,7 @@ function Experiment() {
};
const routeToEdit = (e, record) => {
e.stopPropagation();
- navgite({ pathname: `/pipeline/template/${record.workflow_id}/${record.workflow_name}` });
+ navgite({ pathname: `/pipeline/template/${record.workflow_id}` });
};
// 创建或者编辑实验接口请求
const handleAddExperiment = async (values) => {
diff --git a/react-ui/src/pages/Experiment/training/index.jsx b/react-ui/src/pages/Experiment/training/index.jsx
index 6cbabfe0..991e9855 100644
--- a/react-ui/src/pages/Experiment/training/index.jsx
+++ b/react-ui/src/pages/Experiment/training/index.jsx
@@ -23,24 +23,12 @@ function ExperimentText() {
const [paramsModalOpen, openParamsModal, closeParamsModal] = useVisible(false);
const graphRef = useRef();
- // const onDragEnd = (val) => {
- // console.log(val, 'eee');
- // const _x = val.x;
- // const _y = val.y;
- // const point = graph.getPointByClient(_x, _y);
- // let model = {};
- // // 元模型
- // model = {
- // ...val,
- // x: point.x,
- // y: point.y,
- // id: val.component_name + '-' + s8(),
- // isCluster: false,
- // };
- // graph.addItem('node', model, true);
- // };
const getGraphData = (data) => {
if (graph) {
+ // 修改历史数据有蓝色边框的问题
+ data.nodes.forEach((item) => {
+ item.style.stroke = '#fff';
+ });
graph.data(data);
graph.render();
} else {
@@ -92,9 +80,11 @@ function ExperimentText() {
getAnchorPoints(cfg) {
return (
cfg.anchorPoints || [
- // 上下各3,左右各1
+ // 四个,上下左右
[0.5, 0],
[0.5, 1],
+ [0, 0.5],
+ [1, 0.5],
]
);
},
@@ -120,6 +110,7 @@ function ExperimentText() {
textAlign: 'left',
textBaseline: 'middle',
fill: '#000',
+ cursor: 'pointer',
},
name: 'text-shape',
draggable: true,
@@ -166,8 +157,12 @@ function ExperimentText() {
width: graphRef.current.clientWidth || 500,
height: graphRef.current.clientHeight || 760,
animate: false,
- groupByTypes: false,
- enabledStack: true,
+ groupByTypes: true,
+ enabledStack: false,
+ fitView: true,
+ minZoom: 0.5,
+ maxZoom: 5,
+ fitViewPadding: 300,
modes: {
default: [
// config the shouldBegin for drag-node to avoid node moving while dragging on the anchor-point circles
@@ -181,15 +176,6 @@ function ExperimentText() {
// config the shouldBegin and shouldEnd to make sure the create-edge is began and ended at anchor-point circles
'drag-canvas',
'zoom-canvas',
- // 'brush-select',
- 'drag-combo',
- ],
- altSelect: [
- {
- type: 'brush-select',
- trigger: 'drag',
- },
- 'drag-node',
],
},
@@ -217,7 +203,7 @@ function ExperimentText() {
},
defaultEdge: {
// type: 'quadratic',
- type: 'cubic-vertical',
+ // type: 'cubic-vertical',
style: {
endArrow: {
@@ -232,15 +218,8 @@ function ExperimentText() {
stroke: '#a2a6b5',
radius: 1,
},
- nodeStateStyle: {
- hover: {
- opacity: 1,
- stroke: '#8fe8ff',
- },
- },
labelCfg: {
autoRotate: true,
- // refY: 10,
style: {
fontSize: 10,
fill: '#FFF',
@@ -257,11 +236,6 @@ function ExperimentText() {
cursor: 'pointer',
},
},
- // linkCenter: true,
- fitView: true,
- minZoom: 0.5,
- maxZoom: 5,
- fitViewPadding: 300,
});
graph.on('node:click', (e) => {
if (e.target.get('name') !== 'anchor-point' && e.item) {
diff --git a/react-ui/src/pages/Model/components/ModelEvolution/index.tsx b/react-ui/src/pages/Model/components/ModelEvolution/index.tsx
index bd8286cf..6a6e74e8 100644
--- a/react-ui/src/pages/Model/components/ModelEvolution/index.tsx
+++ b/react-ui/src/pages/Model/components/ModelEvolution/index.tsx
@@ -12,7 +12,14 @@ import GraphLegend from '../GraphLegend';
import NodeTooltips from '../NodeTooltips';
import styles from './index.less';
import type { ModelDepsData, ProjectDependency, TrainDataset } from './utils';
-import { NodeType, getGraphData, nodeHeight, nodeWidth, normalizeTreeData } from './utils';
+import {
+ NodeType,
+ getGraphData,
+ nodeFontSize,
+ nodeHeight,
+ nodeWidth,
+ normalizeTreeData,
+} from './utils';
type modeModelEvolutionProps = {
resourceId: number;
@@ -73,7 +80,7 @@ function ModelEvolution({
width: graphRef.current!.clientWidth,
height: graphRef.current!.clientHeight,
fitView: true,
- fitViewPadding: [50, 100, 50, 100],
+ fitViewPadding: [100, 100, 100, 100],
minZoom: 0.5,
maxZoom: 5,
defaultNode: {
@@ -95,7 +102,7 @@ function ModelEvolution({
position: 'center',
style: {
fill: '#ffffff',
- fontSize: 8,
+ fontSize: nodeFontSize,
textAlign: 'center',
cursor: 'pointer',
},
@@ -107,7 +114,7 @@ function ModelEvolution({
autoRotate: true,
},
style: {
- stroke: '#a2c1ff',
+ stroke: '#DEE0E5',
lineWidth: 1,
},
},
@@ -163,28 +170,32 @@ function ModelEvolution({
graph.on('node:click', (e: G6GraphEvent) => {
const nodeItem = e.item;
- const model = nodeItem.getModel();
+ const model = nodeItem.getModel() as ModelDepsData | ProjectDependency | TrainDataset;
const { model_type } = model;
const { origin } = location;
let url: string = '';
switch (model_type) {
case NodeType.children:
case NodeType.parent: {
- const { current_model_id, version } = model as ModelDepsData;
+ const { current_model_id, version } = model;
url = `${origin}/dataset/model/${current_model_id}?tab=${ResourceInfoTabKeys.Evolution}&version=${version}`;
break;
}
case NodeType.project: {
- const { url: projectUrl } = model as ProjectDependency;
+ const { url: projectUrl } = model;
url = projectUrl;
break;
}
case NodeType.trainDataset:
case NodeType.testDataset: {
- const { dataset_id, dataset_version } = model as TrainDataset;
+ const { dataset_id, dataset_version } = model;
url = `${origin}/dataset/dataset/${dataset_id}?tab=${ResourceInfoTabKeys.Version}&version=${dataset_version}`;
break;
}
+ case NodeType.current: {
+ // TODO: 隐藏数据集和项目
+ break;
+ }
default:
break;
}
diff --git a/react-ui/src/pages/Model/components/ModelEvolution/utils.tsx b/react-ui/src/pages/Model/components/ModelEvolution/utils.tsx
index 78fdb87a..3c3f4225 100644
--- a/react-ui/src/pages/Model/components/ModelEvolution/utils.tsx
+++ b/react-ui/src/pages/Model/components/ModelEvolution/utils.tsx
@@ -6,8 +6,10 @@ import Hierarchy from '@antv/hierarchy';
export const nodeWidth = 110;
export const nodeHeight = 50;
export const vGap = nodeHeight + 20;
-export const hGap = nodeHeight + 20;
+export const hGap = nodeWidth;
export const ellipseWidth = nodeWidth;
+export const labelPadding = 30;
+export const nodeFontSize = 8;
// 数据集节点
const datasetNodes: NodeConfig[] = [];
@@ -38,14 +40,14 @@ export interface TrainDataset extends NodeConfig {
dataset_id: number;
dataset_name: string;
dataset_version: string;
- model_type: NodeType;
+ model_type: NodeType.testDataset | NodeType.trainDataset;
}
export interface ProjectDependency extends NodeConfig {
url: string;
name: string;
branch: string;
- model_type: NodeType;
+ model_type: NodeType.project;
}
export type ModalDetail = {
@@ -63,7 +65,7 @@ export interface ModelDepsAPIData {
current_model_id: number;
version: string;
exp_ins_id: number;
- model_type: NodeType;
+ model_type: NodeType.children | NodeType.current | NodeType.parent;
current_model_name: string;
project_dependency: ProjectDependency;
test_dataset: TrainDataset[];
@@ -94,9 +96,13 @@ export function normalizeChildren(data: ModelDepsData[]) {
// 获取 label
export function getLabel(node: ModelDepsData | ModelDepsAPIData) {
return (
- fittingString(`${node.model_version_dependcy_vo.name ?? ''}`, nodeWidth - 12, 8) +
+ fittingString(
+ `${node.model_version_dependcy_vo.name ?? ''}`,
+ nodeWidth - labelPadding,
+ nodeFontSize,
+ ) +
'\n' +
- fittingString(`${node.version}`, nodeWidth - 12, 8)
+ fittingString(`${node.version}`, nodeWidth - labelPadding, nodeFontSize)
);
}
@@ -231,12 +237,12 @@ const addDatasetDependency = (
node.type = 'ellipse';
node.size = [ellipseWidth, nodeHeight];
node.label =
- fittingString(node.dataset_name, ellipseWidth - 12, 8) +
+ fittingString(node.dataset_name, ellipseWidth - labelPadding, nodeFontSize) +
'\n' +
- fittingString(node.dataset_version, ellipseWidth - 12, 8);
+ fittingString(node.dataset_version, ellipseWidth - labelPadding, nodeFontSize);
const half = len / 2 - 0.5;
- node.x = currentNode.x! - (half - index) * (ellipseWidth + hGap / 2);
+ node.x = currentNode.x! - (half - index) * (ellipseWidth + 20);
node.y = currentNode.y! - nodeHeight - vGap;
nodes.push(node);
datasetNodes.push(node);
@@ -263,7 +269,7 @@ const addProjectDependency = (
node.id = `$P_${node.url}_${node.branch}`;
node.model_type = NodeType.project;
node.type = 'rect';
- node.label = fittingString(node.name, nodeWidth - 12, 8);
+ node.label = fittingString(node.name, nodeWidth - labelPadding, nodeFontSize);
node.style = getStyle(NodeType.project);
node.style.radius = nodeHeight / 2;
node.x = currentNode.x;
@@ -311,15 +317,13 @@ function adjustDatasetPosition(node: NodeConfig) {
};
const overlapRect = isChildrenOverlapDataset(datasetNodes, nodeRect);
if (overlapRect) {
- console.log(node);
-
const adjustRect = {
x: overlapRect.x - nodeWidth - hGap / 2,
y: overlapRect.y,
width: overlapRect.width,
height: overlapRect.height,
};
- const lastNode = datasetNodes[datasetNodes.length - 1] as NodeConfig;
+ const lastNode = datasetNodes[datasetNodes.length - 1];
const distance = lastNode.x! - adjustRect.x;
datasetNodes.forEach((item) => {
item.x = item.x! - distance;
diff --git a/react-ui/src/pages/Model/components/NodeTooltips/index.tsx b/react-ui/src/pages/Model/components/NodeTooltips/index.tsx
index dc926114..a4b3f13b 100644
--- a/react-ui/src/pages/Model/components/NodeTooltips/index.tsx
+++ b/react-ui/src/pages/Model/components/NodeTooltips/index.tsx
@@ -118,14 +118,18 @@ function ProjectInfo({ data }: { data: ProjectDependency }) {
function NodeTooltips({ data, x, y, onMouseEnter, onMouseLeave }: NodeTooltipsProps) {
if (!data) return null;
- let Component;
+ let Component = null;
const { model_type } = data;
if (model_type === NodeType.testDataset || model_type === NodeType.trainDataset) {
- Component =