|
@@ -2,17 +2,18 @@ import { Node } from "@antv/x6";
|
|
|
import CustomInput from "../CustomInput";
|
|
|
import { LaneItem, StageItem } from "@/types";
|
|
|
import { useEffect, useRef, useState } from "react";
|
|
|
+import { Input, InputNumber, Popover } from "antd";
|
|
|
|
|
|
-export default function Pool({
|
|
|
+export default function Pool({
|
|
|
node,
|
|
|
fillContent,
|
|
|
strokeWidth,
|
|
|
strokeColor,
|
|
|
- }: {
|
|
|
- node: Node,
|
|
|
- fillContent: string,
|
|
|
- strokeWidth: number,
|
|
|
- strokeColor: string,
|
|
|
+}: {
|
|
|
+ node: Node;
|
|
|
+ fillContent: string;
|
|
|
+ strokeWidth: number;
|
|
|
+ strokeColor: string;
|
|
|
}) {
|
|
|
const {
|
|
|
poolName,
|
|
@@ -39,50 +40,52 @@ export default function Pool({
|
|
|
});
|
|
|
};
|
|
|
|
|
|
- const handleSetControl = (type: "stage" | "lane", index: number) => {
|
|
|
+ const handleSetControl = (type: "stage" | "lane", index: number) => {};
|
|
|
|
|
|
- };
|
|
|
-
|
|
|
- const dragStart = useRef<{x: number, y: number}>();
|
|
|
- const dragRef = useRef<{
|
|
|
- originPosition: {x: number, y: number},
|
|
|
- target: string,
|
|
|
- type: 'x' | 'y',
|
|
|
- el: HTMLDivElement
|
|
|
+ const dragStart = useRef<{ x: number; y: number }>();
|
|
|
+ const dragRef = useRef<{
|
|
|
+ originPosition: { x: number; y: number };
|
|
|
+ target: string;
|
|
|
+ type: "x" | "y";
|
|
|
+ el: HTMLDivElement;
|
|
|
}>();
|
|
|
|
|
|
// TODO 拖拽边框
|
|
|
// 1.拖拽开始,记录开始位置
|
|
|
// 记录拖对象、方向、位置
|
|
|
- const handleDragStart = (e: React.MouseEvent<HTMLDivElement, MouseEvent>, target: string, type: 'x' | 'y') => {
|
|
|
- console.log('mouse down', e)
|
|
|
+ const handleDragStart = (
|
|
|
+ e: React.MouseEvent<HTMLDivElement, MouseEvent>,
|
|
|
+ target: string,
|
|
|
+ type: "x" | "y"
|
|
|
+ ) => {
|
|
|
+ console.log("mouse down", e);
|
|
|
dragRef.current = {
|
|
|
- originPosition: {x: e.clientX, y: e.clientY},
|
|
|
+ originPosition: { x: e.clientX, y: e.clientY },
|
|
|
el: e.currentTarget,
|
|
|
target,
|
|
|
type,
|
|
|
};
|
|
|
- }
|
|
|
+ };
|
|
|
|
|
|
// 2.拖拽中
|
|
|
// 更新拖拽对象位置
|
|
|
const handleDragMove = (e: MouseEvent) => {
|
|
|
- if(dragRef.current) {
|
|
|
- const { originPosition, type, el} = dragRef.current;
|
|
|
- const {clientX, clientY} = e;
|
|
|
+ if (dragRef.current) {
|
|
|
+ const { originPosition, type, el } = dragRef.current;
|
|
|
+ const { clientX, clientY } = e;
|
|
|
const diffX = clientX - originPosition.x;
|
|
|
const diffY = clientY - originPosition.y;
|
|
|
}
|
|
|
- }
|
|
|
+ };
|
|
|
|
|
|
// 3.拖拽结束
|
|
|
// 更新设置对象
|
|
|
const handleDragEnd = () => {
|
|
|
- console.log('mouse up', dragStart.current)
|
|
|
+ console.log("mouse up", dragStart.current);
|
|
|
dragRef.current = undefined;
|
|
|
document.removeEventListener("mouseup", handleDragEnd);
|
|
|
document.removeEventListener("mousemove", handleDragMove);
|
|
|
- }
|
|
|
+ };
|
|
|
|
|
|
useEffect(() => {
|
|
|
document.addEventListener("mouseup", handleDragEnd);
|
|
@@ -94,6 +97,28 @@ export default function Pool({
|
|
|
};
|
|
|
}, []);
|
|
|
|
|
|
+ // 设置阶段宽度
|
|
|
+ const handleChangeStageWidth = (val: number) => {
|
|
|
+ node.setData({
|
|
|
+ stageWidth: val,
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ // 设置泳道宽度
|
|
|
+ const handleChangeLaneWidth = (index: number, val: number | null) => {
|
|
|
+ node.setData({
|
|
|
+ lane: lane.map((item: LaneItem, i: number) => {
|
|
|
+ if (index === i) {
|
|
|
+ return {
|
|
|
+ ...item,
|
|
|
+ width: val,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ return item;
|
|
|
+ }),
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
return direction === "vertical" ? (
|
|
|
// 垂直泳池
|
|
|
<>
|
|
@@ -129,54 +154,85 @@ export default function Pool({
|
|
|
<div className="stage h-full w-full absolute left-0 top-0">
|
|
|
{stage.map((stageItem: StageItem, index: number) => {
|
|
|
return (
|
|
|
- <div
|
|
|
- key={index}
|
|
|
- style={{
|
|
|
- width: "100%",
|
|
|
- height: stageItem.height - strokeWidth,
|
|
|
- borderBottom:
|
|
|
- index < stage.length - 1
|
|
|
- ? `solid ${strokeWidth}px ${strokeColor}`
|
|
|
- : "node",
|
|
|
- }}
|
|
|
- >
|
|
|
+ <>
|
|
|
<div
|
|
|
- className="relative stage-item cursor-move"
|
|
|
+ key={index}
|
|
|
style={{
|
|
|
- width: stageWidth,
|
|
|
- background: fillContent,
|
|
|
- height: stageItem.height - 2 * strokeWidth,
|
|
|
- borderRight: `solid ${strokeWidth}px ${strokeColor}`,
|
|
|
+ width: "100%",
|
|
|
+ height: stageItem.height - strokeWidth,
|
|
|
+ borderBottom:
|
|
|
+ index < stage.length - 1
|
|
|
+ ? `solid ${strokeWidth}px ${strokeColor}`
|
|
|
+ : "node",
|
|
|
}}
|
|
|
- onMouseEnter={handleStartMove}
|
|
|
- onMouseLeave={handleEndMove}
|
|
|
- onClick={() => handleSetControl("stage", index)}
|
|
|
>
|
|
|
- <CustomInput
|
|
|
- value={stageItem.name}
|
|
|
- styles={text}
|
|
|
- node={node}
|
|
|
- txtStyle={{
|
|
|
- transform: `rotate(-90deg) translateX(-${stageItem.height}px)`,
|
|
|
- transformOrigin: "0 0",
|
|
|
- height: stageWidth,
|
|
|
- width: stageItem.height,
|
|
|
- }}
|
|
|
- onChange={(val) => {
|
|
|
- node.setData({
|
|
|
- stage: stage.map((item: StageItem, i: number) => {
|
|
|
- if (index === i) {
|
|
|
- return {
|
|
|
- ...item,
|
|
|
- name: val,
|
|
|
- };
|
|
|
- }
|
|
|
- }),
|
|
|
- });
|
|
|
- }}
|
|
|
- />
|
|
|
+ <Popover
|
|
|
+ placement="right"
|
|
|
+ content={
|
|
|
+ <div className="flex items-center gap-8px">
|
|
|
+ <span>宽度:</span>
|
|
|
+ <InputNumber
|
|
|
+ min={10}
|
|
|
+ max={300}
|
|
|
+ value={stageWidth}
|
|
|
+ onChange={(val) => handleChangeStageWidth(val)}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ }
|
|
|
+ >
|
|
|
+ <div
|
|
|
+ className="relative stage-item cursor-move"
|
|
|
+ style={{
|
|
|
+ width: stageWidth,
|
|
|
+ background: fillContent,
|
|
|
+ height: stageItem.height - 2 * strokeWidth,
|
|
|
+ borderRight: `solid ${strokeWidth}px ${strokeColor}`,
|
|
|
+ }}
|
|
|
+ onMouseEnter={handleStartMove}
|
|
|
+ onMouseLeave={handleEndMove}
|
|
|
+ onClick={() => handleSetControl("stage", index)}
|
|
|
+ >
|
|
|
+ <CustomInput
|
|
|
+ value={stageItem.name}
|
|
|
+ styles={text}
|
|
|
+ node={node}
|
|
|
+ txtStyle={{
|
|
|
+ transform: `rotate(-90deg) translateX(-${stageItem.height}px)`,
|
|
|
+ transformOrigin: "0 0",
|
|
|
+ height: stageWidth,
|
|
|
+ width: stageItem.height,
|
|
|
+ }}
|
|
|
+ onChange={(val) => {
|
|
|
+ node.setData({
|
|
|
+ stage: stage.map((item: StageItem, i: number) => {
|
|
|
+ if (index === i) {
|
|
|
+ return {
|
|
|
+ ...item,
|
|
|
+ name: val,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }),
|
|
|
+ });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ {/* {
|
|
|
+ <div
|
|
|
+ className="contor absolte"
|
|
|
+ style={{
|
|
|
+ width: "100%",
|
|
|
+ left: 0,
|
|
|
+ top: 0,
|
|
|
+ height: stageItem.height - strokeWidth,
|
|
|
+ border: "solid 1px #3dafe4",
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <div className="right-point w-8px h-8px border-solid bg-#fff border-color-#3dafe4 border-width-1px absolute right--4px top-50%"></div>
|
|
|
+ </div>
|
|
|
+ } */}
|
|
|
+ </div>
|
|
|
+ </Popover>
|
|
|
</div>
|
|
|
- </div>
|
|
|
+ </>
|
|
|
);
|
|
|
})}
|
|
|
</div>
|
|
@@ -199,36 +255,49 @@ export default function Pool({
|
|
|
: `solid ${strokeWidth}px ${strokeColor}`,
|
|
|
}}
|
|
|
>
|
|
|
- <div
|
|
|
- className="flex-1 w-full relative cursor-move"
|
|
|
- style={{
|
|
|
- height: laneHeadHeight,
|
|
|
- background: fillContent,
|
|
|
- borderBottom: `solid ${strokeWidth}px ${strokeColor}`,
|
|
|
- }}
|
|
|
- onMouseEnter={handleStartMove}
|
|
|
- onMouseLeave={handleEndMove}
|
|
|
- onClick={() => handleSetControl("lane", index)}
|
|
|
+ <Popover
|
|
|
+ content={
|
|
|
+ <div className="flex items-center gap-8px">
|
|
|
+ <span>宽度:</span>
|
|
|
+ <InputNumber
|
|
|
+ min={20}
|
|
|
+ value={item.width}
|
|
|
+ onChange={(val) => handleChangeLaneWidth(index, val)}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ }
|
|
|
>
|
|
|
- <CustomInput
|
|
|
- value={item.name}
|
|
|
- styles={text}
|
|
|
- node={node}
|
|
|
- onChange={(val) => {
|
|
|
- node.setData({
|
|
|
- lane: lane.map((item: LaneItem, i: number) => {
|
|
|
- if (index === i) {
|
|
|
- return {
|
|
|
- ...item,
|
|
|
- name: val,
|
|
|
- };
|
|
|
- }
|
|
|
- return item;
|
|
|
- }),
|
|
|
- });
|
|
|
+ <div
|
|
|
+ className="flex-1 w-full relative cursor-move"
|
|
|
+ style={{
|
|
|
+ height: laneHeadHeight,
|
|
|
+ background: fillContent,
|
|
|
+ borderBottom: `solid ${strokeWidth}px ${strokeColor}`,
|
|
|
}}
|
|
|
- />
|
|
|
- </div>
|
|
|
+ onMouseEnter={handleStartMove}
|
|
|
+ onMouseLeave={handleEndMove}
|
|
|
+ onClick={() => handleSetControl("lane", index)}
|
|
|
+ >
|
|
|
+ <CustomInput
|
|
|
+ value={item.name}
|
|
|
+ styles={text}
|
|
|
+ node={node}
|
|
|
+ onChange={(val) => {
|
|
|
+ node.setData({
|
|
|
+ lane: lane.map((item: LaneItem, i: number) => {
|
|
|
+ if (index === i) {
|
|
|
+ return {
|
|
|
+ ...item,
|
|
|
+ name: val,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ return item;
|
|
|
+ }),
|
|
|
+ });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </Popover>
|
|
|
</div>
|
|
|
))}
|
|
|
</div>
|
|
@@ -280,35 +349,49 @@ export default function Pool({
|
|
|
: "node",
|
|
|
}}
|
|
|
>
|
|
|
- <div
|
|
|
- className="relative stage-item cursor-move"
|
|
|
- style={{
|
|
|
- width: stageItem.height - 2 * strokeWidth,
|
|
|
- background: fillContent,
|
|
|
- height: stageWidth,
|
|
|
- borderBottom: `solid ${strokeWidth}px ${strokeColor}`,
|
|
|
- }}
|
|
|
- onMouseEnter={handleStartMove}
|
|
|
- onMouseLeave={handleEndMove}
|
|
|
+ <Popover
|
|
|
+ content={
|
|
|
+ <div className="flex items-center gap-8px">
|
|
|
+ <span>高度:</span>
|
|
|
+ <InputNumber
|
|
|
+ min={10}
|
|
|
+ max={300}
|
|
|
+ value={stageWidth}
|
|
|
+ onChange={(val) => handleChangeStageWidth(val)}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ }
|
|
|
>
|
|
|
- <CustomInput
|
|
|
- value={stageItem.name}
|
|
|
- styles={text}
|
|
|
- node={node}
|
|
|
- onChange={(val) => {
|
|
|
- node.setData({
|
|
|
- stage: stage.map((item: StageItem, i: number) => {
|
|
|
- if (index === i) {
|
|
|
- return {
|
|
|
- ...item,
|
|
|
- name: val,
|
|
|
- };
|
|
|
- }
|
|
|
- }),
|
|
|
- });
|
|
|
+ <div
|
|
|
+ className="relative stage-item cursor-move"
|
|
|
+ style={{
|
|
|
+ width: stageItem.height - 2 * strokeWidth,
|
|
|
+ background: fillContent,
|
|
|
+ height: stageWidth,
|
|
|
+ borderBottom: `solid ${strokeWidth}px ${strokeColor}`,
|
|
|
}}
|
|
|
- />
|
|
|
- </div>
|
|
|
+ onMouseEnter={handleStartMove}
|
|
|
+ onMouseLeave={handleEndMove}
|
|
|
+ >
|
|
|
+ <CustomInput
|
|
|
+ value={stageItem.name}
|
|
|
+ styles={text}
|
|
|
+ node={node}
|
|
|
+ onChange={(val) => {
|
|
|
+ node.setData({
|
|
|
+ stage: stage.map((item: StageItem, i: number) => {
|
|
|
+ if (index === i) {
|
|
|
+ return {
|
|
|
+ ...item,
|
|
|
+ name: val,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }),
|
|
|
+ });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </Popover>
|
|
|
</div>
|
|
|
);
|
|
|
})}
|
|
@@ -337,42 +420,56 @@ export default function Pool({
|
|
|
: `solid ${strokeWidth}px ${strokeColor}`,
|
|
|
}}
|
|
|
>
|
|
|
- <div
|
|
|
- className="flex-1 w-full relative cursor-move"
|
|
|
- style={{
|
|
|
- width: laneHeadHeight,
|
|
|
- height: "100%",
|
|
|
- background: fillContent,
|
|
|
- borderRight: `solid ${strokeWidth}px ${strokeColor}`,
|
|
|
- }}
|
|
|
- onMouseEnter={handleStartMove}
|
|
|
- onMouseLeave={handleEndMove}
|
|
|
+ <Popover
|
|
|
+ placement="right"
|
|
|
+ content={
|
|
|
+ <div className="flex items-center gap-8px">
|
|
|
+ <span>高度:</span>
|
|
|
+ <InputNumber
|
|
|
+ min={20}
|
|
|
+ value={item.width}
|
|
|
+ onChange={(val) => handleChangeLaneWidth(index, val)}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ }
|
|
|
>
|
|
|
- <CustomInput
|
|
|
- value={item.name}
|
|
|
- styles={text}
|
|
|
- node={node}
|
|
|
- txtStyle={{
|
|
|
- transform: `rotate(-90deg) translateX(-${item.width}px)`,
|
|
|
- transformOrigin: "0 0",
|
|
|
- width: item.width - strokeWidth,
|
|
|
- height: laneHeadHeight,
|
|
|
- }}
|
|
|
- onChange={(val) => {
|
|
|
- node.setData({
|
|
|
- lane: lane.map((item: LaneItem, i: number) => {
|
|
|
- if (index === i) {
|
|
|
- return {
|
|
|
- ...item,
|
|
|
- name: val,
|
|
|
- };
|
|
|
- }
|
|
|
- return item;
|
|
|
- }),
|
|
|
- });
|
|
|
+ <div
|
|
|
+ className="flex-1 w-full relative cursor-move"
|
|
|
+ style={{
|
|
|
+ width: laneHeadHeight,
|
|
|
+ height: "100%",
|
|
|
+ background: fillContent,
|
|
|
+ borderRight: `solid ${strokeWidth}px ${strokeColor}`,
|
|
|
}}
|
|
|
- />
|
|
|
- </div>
|
|
|
+ onMouseEnter={handleStartMove}
|
|
|
+ onMouseLeave={handleEndMove}
|
|
|
+ >
|
|
|
+ <CustomInput
|
|
|
+ value={item.name}
|
|
|
+ styles={text}
|
|
|
+ node={node}
|
|
|
+ txtStyle={{
|
|
|
+ transform: `rotate(-90deg) translateX(-${item.width}px)`,
|
|
|
+ transformOrigin: "0 0",
|
|
|
+ width: item.width - strokeWidth,
|
|
|
+ height: laneHeadHeight,
|
|
|
+ }}
|
|
|
+ onChange={(val) => {
|
|
|
+ node.setData({
|
|
|
+ lane: lane.map((item: LaneItem, i: number) => {
|
|
|
+ if (index === i) {
|
|
|
+ return {
|
|
|
+ ...item,
|
|
|
+ name: val,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ return item;
|
|
|
+ }),
|
|
|
+ });
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </Popover>
|
|
|
</div>
|
|
|
))}
|
|
|
</div>
|