Files
openclaw 0a5f6a8047 Initial commit: Lan-manager project code
- Go backend (server/)
- Frontend (web/, server/static/)
- Database and deployment files
- Scripts and docs

Co-Authored-By: 狸花猫/Claude-Qwen3.6-Plus 🐾
2026-04-20 00:52:58 +08:00

465 lines
15 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"use strict";
var _tslib = require("tslib");
var _g6Core = require("@antv/g6-core");
var _util = require("@antv/util");
// 三角形
(0, _g6Core.registerNode)('triangle', {
// 自定义节点时的配置
options: {
size: 40,
direction: 'up',
style: {
stroke: _g6Core.BaseGlobal.defaultNode.style.stroke,
fill: _g6Core.BaseGlobal.defaultNode.style.fill,
lineWidth: _g6Core.BaseGlobal.defaultNode.style.lineWidth
},
labelCfg: {
style: {
fill: _g6Core.BaseGlobal.nodeLabel.style.fill,
fontSize: _g6Core.BaseGlobal.nodeLabel.style.fontSize
},
offset: 15
},
// 节点上左右上下四个方向上的链接circle配置
linkPoints: {
top: false,
right: false,
bottom: false,
left: false,
// circle的大小
size: _g6Core.BaseGlobal.defaultNode.linkPoints.size,
lineWidth: _g6Core.BaseGlobal.defaultNode.linkPoints.lineWidth,
fill: _g6Core.BaseGlobal.defaultNode.linkPoints.fill,
stroke: _g6Core.BaseGlobal.defaultNode.linkPoints.stroke
},
// 节点中icon配置
icon: {
// 是否显示icon值为 false 则不渲染icon
show: false,
// icon的地址字符串类型
img: 'https://gw.alipayobjects.com/zos/bmw-prod/5d015065-8505-4e7a-baec-976f81e3c41d.svg',
width: 20,
height: 20,
offset: 6
},
stateStyles: (0, _tslib.__assign)({}, _g6Core.BaseGlobal.nodeStateStyles)
},
shapeType: 'triangle',
// 文本位置
labelPosition: 'bottom',
drawShape: function drawShape(cfg, group) {
var _a = this.mergeStyle || this.getOptions(cfg),
_b = _a.icon,
icon = _b === void 0 ? {} : _b,
defaultDirection = _a.direction;
var style = this.getShapeStyle(cfg);
var direction = cfg.direction || defaultDirection;
var keyShape = group.addShape('path', {
attrs: style,
className: "".concat(this.type, "-keyShape"),
name: "".concat(this.type, "-keyShape"),
draggable: true
});
group['shapeMap']["".concat(this.type, "-keyShape")] = keyShape;
var w = icon.width,
h = icon.height,
show = icon.show,
offset = icon.offset,
text = icon.text;
if (show) {
if (text) {
group['shapeMap']["".concat(this.type, "-icon")] = group.addShape('text', {
attrs: (0, _tslib.__assign)({
x: 0,
y: 0,
fontSize: 12,
fill: '#000',
stroke: '#000',
textBaseline: 'middle',
textAlign: 'center'
}, icon),
className: "".concat(this.type, "-icon"),
name: "".concat(this.type, "-icon"),
draggable: true
});
} else {
var iconW = -w / 2;
var iconH = -h / 2;
if (direction === 'up' || direction === 'down') {
iconH += offset;
}
if (direction === 'left' || direction === 'right') {
iconW += offset;
}
group['shapeMap']["".concat(this.type, "-icon")] = group.addShape('image', {
attrs: (0, _tslib.__assign)({
x: iconW,
y: iconH
}, icon),
className: "".concat(this.type, "-icon"),
name: "".concat(this.type, "-icon"),
draggable: true
});
}
}
this.drawLinkPoints(cfg, group);
return keyShape;
},
/**
* 绘制节点上的LinkPoints
* @param {Object} cfg data数据配置项
* @param {Group} group Group实例
*/
drawLinkPoints: function drawLinkPoints(cfg, group) {
var _a = this.mergeStyle || this.getOptions(cfg),
_b = _a.linkPoints,
linkPoints = _b === void 0 ? {} : _b,
defaultDirection = _a.direction;
var direction = cfg.direction || defaultDirection;
var top = linkPoints.top,
left = linkPoints.left,
right = linkPoints.right,
bottom = linkPoints.bottom,
markSize = linkPoints.size,
markR = linkPoints.r,
markStyle = (0, _tslib.__rest)(linkPoints, ["top", "left", "right", "bottom", "size", "r"]);
var size = this.getSize(cfg);
var len = size[0];
if (left) {
// up down left right 四个方向的坐标均不相同
var leftPos = null;
var diffY = len * Math.sin(1 / 3 * Math.PI);
var r = len * Math.sin(1 / 3 * Math.PI);
if (direction === 'up') {
leftPos = [-r, diffY];
} else if (direction === 'down') {
leftPos = [-r, -diffY];
} else if (direction === 'left') {
leftPos = [-r, r - diffY];
}
if (leftPos) {
// left circle
group['shapeMap']['link-point-left'] = group.addShape('circle', {
attrs: (0, _tslib.__assign)((0, _tslib.__assign)({}, markStyle), {
x: leftPos[0],
y: leftPos[1],
r: markSize / 2 || markR || 5
}),
className: 'link-point-left',
name: 'link-point-left'
});
}
}
if (right) {
// right circle
// up down left right 四个方向的坐标均不相同
var rightPos = null;
var diffY = len * Math.sin(1 / 3 * Math.PI);
var r = len * Math.sin(1 / 3 * Math.PI);
if (direction === 'up') {
rightPos = [r, diffY];
} else if (direction === 'down') {
rightPos = [r, -diffY];
} else if (direction === 'right') {
rightPos = [r, r - diffY];
}
if (rightPos) {
group['shapeMap']['link-point-right'] = group.addShape('circle', {
attrs: (0, _tslib.__assign)((0, _tslib.__assign)({}, markStyle), {
x: rightPos[0],
y: rightPos[1],
r: markSize / 2 || markR || 5
}),
className: 'link-point-right',
name: 'link-point-right'
});
}
}
if (top) {
// up down left right 四个方向的坐标均不相同
var topPos = null;
var diffY = len * Math.sin(1 / 3 * Math.PI);
var r = len * Math.sin(1 / 3 * Math.PI);
if (direction === 'up') {
topPos = [r - diffY, -diffY];
} else if (direction === 'left') {
topPos = [r, -diffY];
} else if (direction === 'right') {
topPos = [-r, -diffY];
}
if (topPos) {
// top circle
group['shapeMap']['link-point-top'] = group.addShape('circle', {
attrs: (0, _tslib.__assign)((0, _tslib.__assign)({}, markStyle), {
x: topPos[0],
y: topPos[1],
r: markSize / 2 || markR || 5
}),
className: 'link-point-top',
name: 'link-point-top'
});
}
}
if (bottom) {
// up down left right 四个方向的坐标均不相同
var bottomPos = null;
var diffY = len * Math.sin(1 / 3 * Math.PI);
var r = len * Math.sin(1 / 3 * Math.PI);
if (direction === 'down') {
bottomPos = [-r + diffY, diffY];
} else if (direction === 'left') {
bottomPos = [r, diffY];
} else if (direction === 'right') {
bottomPos = [-r, diffY];
}
if (bottomPos) {
// bottom circle
group['shapeMap']['link-point-bottom'] = group.addShape('circle', {
attrs: (0, _tslib.__assign)((0, _tslib.__assign)({}, markStyle), {
x: bottomPos[0],
y: bottomPos[1],
r: markSize / 2 || markR || 5
}),
className: 'link-point-bottom',
name: 'link-point-bottom'
});
}
}
},
getPath: function getPath(cfg) {
var defaultDirection = (this.mergeStyle || this.getOptions(cfg)).direction;
var direction = cfg.direction || defaultDirection;
var size = this.getSize(cfg);
var len = size[0];
var diffY = len * Math.sin(1 / 3 * Math.PI);
var r = len * Math.sin(1 / 3 * Math.PI);
var path = [['M', -r, diffY], ['L', 0, -diffY], ['L', r, diffY], ['Z'] // 封闭
];
if (direction === 'down') {
path = [['M', -r, -diffY], ['L', r, -diffY], ['L', 0, diffY], ['Z'] // 封闭
];
} else if (direction === 'left') {
path = [['M', -r, r - diffY], ['L', r, -r], ['L', r, r], ['Z'] // 封闭
];
} else if (direction === 'right') {
path = [['M', r, r - diffY], ['L', -r, r], ['L', -r, -r], ['Z'] // 封闭
];
}
return path;
},
/**
* 获取节点的样式,供基于该节点自定义时使用
* @param {Object} cfg 节点数据模型
* @return {Object} 节点的样式
*/
getShapeStyle: function getShapeStyle(cfg) {
var defaultStyle = (this.mergeStyle || this.getOptions(cfg)).style;
var strokeStyle = {
stroke: cfg.color
};
// 如果设置了color则覆盖默认的stroke属性
var style = (0, _util.mix)({}, defaultStyle, strokeStyle);
var path = this.getPath(cfg);
var styles = (0, _tslib.__assign)({
path: path
}, style);
return styles;
},
update: function update(cfg, item, updateType) {
var group = item.getContainer();
// 这里不传 cfg 参数是因为 cfg.style 需要最后覆盖样式
var defaultStyle = this.getOptions({}).style;
var path = this.getPath(cfg);
// 下面这些属性需要覆盖默认样式与目前样式,但若在 cfg 中有指定则应该被 cfg 的相应配置覆盖。
var strokeStyle = {
stroke: cfg.color,
path: path
};
// 与 getShapeStyle 不同在于update 时需要获取到当前的 style 进行融合。即新传入的配置项中没有涉及的属性,保留当前的配置。
var keyShape = item.get('keyShape');
var style = (0, _util.mix)({}, defaultStyle, keyShape.attr(), strokeStyle);
style = (0, _util.mix)(style, cfg.style);
this.updateShape(cfg, item, style, true, updateType);
this.updateLinkPoints(cfg, group);
},
/**
* 更新linkPoints
* @param {Object} cfg 节点数据配置项
* @param {Group} group Item所在的group
*/
updateLinkPoints: function updateLinkPoints(cfg, group) {
var _a = this.getOptions({}),
defaultLinkPoints = _a.linkPoints,
defaultDirection = _a.direction;
var direction = cfg.direction || defaultDirection;
var markLeft = group['shapeMap']['link-point-left'] || group.find(function (element) {
return element.get('className') === 'link-point-left';
});
var markRight = group['shapeMap']['link-point-right'] || group.find(function (element) {
return element.get('className') === 'link-point-right';
});
var markTop = group['shapeMap']['link-point-top'] || group.find(function (element) {
return element.get('className') === 'link-point-top';
});
var markBottom = group['shapeMap']['link-point-bottom'] || group.find(function (element) {
return element.get('className') === 'link-point-bottom';
});
var currentLinkPoints = defaultLinkPoints;
var existLinkPoint = markLeft || markRight || markTop || markBottom;
if (existLinkPoint) {
currentLinkPoints = existLinkPoint.attr();
}
var linkPoints = (0, _util.mix)({}, currentLinkPoints, cfg.linkPoints);
var markFill = linkPoints.fill,
markStroke = linkPoints.stroke,
borderWidth = linkPoints.lineWidth;
var markSize = linkPoints.size / 2;
if (!markSize) markSize = linkPoints.r;
var _b = cfg.linkPoints ? cfg.linkPoints : {
left: undefined,
right: undefined,
top: undefined,
bottom: undefined
},
left = _b.left,
right = _b.right,
top = _b.top,
bottom = _b.bottom;
var size = this.getSize(cfg);
var len = size[0];
var styles = {
r: markSize,
fill: markFill,
stroke: markStroke,
lineWidth: borderWidth
};
var leftPos = null;
var diffY = len * Math.sin(1 / 3 * Math.PI);
var r = len * Math.sin(1 / 3 * Math.PI);
if (direction === 'up') {
leftPos = [-r, diffY];
} else if (direction === 'down') {
leftPos = [-r, -diffY];
} else if (direction === 'left') {
leftPos = [-r, r - diffY];
}
if (leftPos) {
if (markLeft) {
if (!left && left !== undefined) {
markLeft.remove();
delete group['shapeMap']['link-point-left'];
} else {
markLeft.attr((0, _tslib.__assign)((0, _tslib.__assign)({}, styles), {
x: leftPos[0],
y: leftPos[1]
}));
}
} else if (left) {
group['shapeMap']['link-point-left'] = group.addShape('circle', {
attrs: (0, _tslib.__assign)((0, _tslib.__assign)({}, styles), {
x: leftPos[0],
y: leftPos[1]
}),
className: 'link-point-left',
name: 'link-point-left',
isAnchorPoint: true
});
}
}
var rightPos = null;
if (direction === 'up') {
rightPos = [r, diffY];
} else if (direction === 'down') {
rightPos = [r, -diffY];
} else if (direction === 'right') {
rightPos = [r, r - diffY];
}
if (rightPos) {
if (markRight) {
if (!right && right !== undefined) {
markRight.remove();
delete group['shapeMap']['link-point-right'];
} else {
markRight.attr((0, _tslib.__assign)((0, _tslib.__assign)({}, styles), {
x: rightPos[0],
y: rightPos[1]
}));
}
} else if (right) {
group['shapeMap']['link-point-right'] = group.addShape('circle', {
attrs: (0, _tslib.__assign)((0, _tslib.__assign)({}, styles), {
x: rightPos[0],
y: rightPos[1]
}),
className: 'link-point-right',
name: 'link-point-right',
isAnchorPoint: true
});
}
}
var topPos = null;
if (direction === 'up') {
topPos = [r - diffY, -diffY];
} else if (direction === 'left') {
topPos = [r, -diffY];
} else if (direction === 'right') {
topPos = [-r, -diffY];
}
if (topPos) {
if (markTop) {
if (!top && top !== undefined) {
markTop.remove();
delete group['shapeMap']['link-point-top'];
} else {
// top circle
markTop.attr((0, _tslib.__assign)((0, _tslib.__assign)({}, styles), {
x: topPos[0],
y: topPos[1]
}));
}
} else if (top) {
group['shapeMap']['link-point-top'] = group.addShape('circle', {
attrs: (0, _tslib.__assign)((0, _tslib.__assign)({}, styles), {
x: topPos[0],
y: topPos[1]
}),
className: 'link-point-top',
name: 'link-point-top',
isAnchorPoint: true
});
}
}
var bottomPos = null;
if (direction === 'down') {
bottomPos = [-r + diffY, diffY];
} else if (direction === 'left') {
bottomPos = [r, diffY];
} else if (direction === 'right') {
bottomPos = [-r, diffY];
}
if (bottomPos) {
if (markBottom) {
if (!bottom && bottom !== undefined) {
markBottom.remove();
delete group['shapeMap']['link-point-bottom'];
} else {
markBottom.attr((0, _tslib.__assign)((0, _tslib.__assign)({}, styles), {
x: bottomPos[0],
y: bottomPos[1]
}));
}
} else if (bottom) {
group['shapeMap']['link-point-bottom'] = group.addShape('circle', {
attrs: (0, _tslib.__assign)((0, _tslib.__assign)({}, styles), {
x: bottomPos[0],
y: bottomPos[1]
}),
className: 'link-point-bottom',
name: 'link-point-bottom',
isAnchorPoint: true
});
}
}
}
}, 'single-node');