303 lines
7.8 KiB
JavaScript
303 lines
7.8 KiB
JavaScript
/**
|
|
* @author: clay
|
|
* @data: 2021/5/15 0:16
|
|
* @email: clay@hchyun.com
|
|
* @description: draw anchor 绘制锚点
|
|
*/
|
|
import utils from '../../utils/index'
|
|
|
|
const itemHeight = 30;
|
|
export default {
|
|
name: 'dice-er-box',
|
|
options: {
|
|
/**
|
|
* 响应节点的状态变化。
|
|
* 在需要使用动画来响应状态变化时需要被复写
|
|
* @param {String} name 状态名称
|
|
* @param {Object} value 状态值
|
|
* @param {item} item 节点
|
|
*/
|
|
setState(name, value, item) {
|
|
// 设置节点状态
|
|
utils.node.setState(name, value, item);
|
|
// 设置锚点状态
|
|
utils.anchor.setState(name, value, item);
|
|
},
|
|
draw(cfg, group) {
|
|
const width = 250;
|
|
const height = 316;
|
|
const itemCount = 10;
|
|
const boxStyle = {
|
|
stroke: "#096DD9",
|
|
radius: 4,
|
|
};
|
|
|
|
const {
|
|
columns = [],
|
|
startIndex = 0,
|
|
selectedIndex,
|
|
collapsed,
|
|
icon,
|
|
} = cfg;
|
|
const list = columns;
|
|
const afterList = list.slice(
|
|
Math.floor(startIndex),
|
|
Math.floor(startIndex + itemCount - 1)
|
|
);
|
|
const offsetY = (0.5 - (startIndex % 1)) * itemHeight + 30;
|
|
|
|
//设置表名的容器
|
|
group.addShape("rect", {
|
|
attrs: {
|
|
fill: boxStyle.stroke,
|
|
height: 30,
|
|
width,
|
|
radius: [boxStyle.radius, boxStyle.radius, 0, 0],
|
|
},
|
|
draggable: true,
|
|
});
|
|
|
|
//设置左侧字体的边距
|
|
let fontLeft = 12;
|
|
|
|
// 设置图标
|
|
if (icon && icon.show !== false) {
|
|
group.addShape("image", {
|
|
attrs: {
|
|
x: 8,
|
|
y: 8,
|
|
height: 16,
|
|
width: 16,
|
|
...icon,
|
|
},
|
|
});
|
|
fontLeft += 18;
|
|
}
|
|
|
|
//设置表名
|
|
group.addShape("text", {
|
|
attrs: {
|
|
y: 22,
|
|
x: fontLeft,
|
|
fill: "#fff",
|
|
text: cfg.label,
|
|
fontSize: 12,
|
|
fontWeight: 500,
|
|
},
|
|
});
|
|
|
|
//设置收缩部分的容器
|
|
group.addShape("rect", {
|
|
attrs: {
|
|
x: 0,
|
|
y: collapsed ? 30 : 300,
|
|
height: 15,
|
|
width,
|
|
fill: "#eee",
|
|
radius: [0, 0, boxStyle.radius, boxStyle.radius],
|
|
cursor: "pointer",
|
|
},
|
|
name: collapsed ? "expand" : "collapse",
|
|
});
|
|
|
|
//设置收缩显示字符
|
|
group.addShape("text", {
|
|
attrs: {
|
|
x: width / 2 - 6,
|
|
y: (collapsed ? 30 : 300) + 12,
|
|
text: collapsed ? "+" : "-",
|
|
width,
|
|
fill: "#000",
|
|
radius: [0, 0, boxStyle.radius, boxStyle.radius],
|
|
cursor: "pointer",
|
|
},
|
|
name: collapsed ? "expand" : "collapse",
|
|
});
|
|
|
|
//设置外边框
|
|
const keyshape = group.addShape("rect", {
|
|
attrs: {
|
|
name: 'border',
|
|
x: 0,
|
|
y: 0,
|
|
width,
|
|
height: collapsed ? 45 : height,
|
|
...boxStyle,
|
|
},
|
|
//是否被允许拖拽
|
|
draggable: true
|
|
});
|
|
|
|
//如果收缩状态,则返回当前图形
|
|
if (collapsed) {
|
|
return keyshape;
|
|
}
|
|
//添加空白组
|
|
const listContainer = group.addGroup({});
|
|
//todo 设置裁剪对象,字体加粗?
|
|
listContainer.setClip({
|
|
type: "rect",
|
|
attrs: {
|
|
x: -8,
|
|
y: 30,
|
|
width: width + 16,
|
|
height: 300 - 30,
|
|
},
|
|
});
|
|
listContainer.addShape({
|
|
type: "rect",
|
|
attrs: {
|
|
x: 1,
|
|
y: 30,
|
|
width: width - 2,
|
|
height: 300 - 30,
|
|
fill: "#fff",
|
|
},
|
|
draggable: true,
|
|
});
|
|
|
|
//如果list中的column字段超过10个
|
|
if (list.length > itemCount) {
|
|
const barStyle = {
|
|
width: 4,
|
|
padding: 0,
|
|
boxStyle: {
|
|
stroke: "#00000022",
|
|
},
|
|
innerStyle: {
|
|
fill: "#00000022",
|
|
},
|
|
};
|
|
|
|
listContainer.addShape("rect", {
|
|
attrs: {
|
|
y: 30,
|
|
x: width - barStyle.padding - barStyle.width,
|
|
width: barStyle.width,
|
|
height: height - 30,
|
|
...barStyle.boxStyle,
|
|
},
|
|
});
|
|
|
|
//设置矩形高度
|
|
const indexHeight =
|
|
afterList.length > itemCount ?
|
|
(afterList.length / list.length) * height :
|
|
10;
|
|
|
|
listContainer.addShape("rect", {
|
|
attrs: {
|
|
y: 30 +
|
|
barStyle.padding +
|
|
(startIndex / (list.length-8)) * (height - 30),
|
|
x: width - barStyle.padding - barStyle.width,
|
|
width: barStyle.width,
|
|
height: Math.min(height, indexHeight),
|
|
...barStyle.innerStyle,
|
|
},
|
|
});
|
|
}
|
|
//渲染显示区域
|
|
if (afterList) {
|
|
afterList.forEach((e, i) => {
|
|
//设置选中的列
|
|
const isSelected = Math.floor(startIndex) + i === Number(selectedIndex);
|
|
let {
|
|
columnName = "", columnType,columnComment
|
|
} = e;
|
|
if (columnComment){
|
|
columnName+= " : " + columnComment
|
|
}
|
|
if (columnType) {
|
|
columnName += " - " + columnType;
|
|
}
|
|
const label = columnName.length > 26 ? columnName.slice(0, 24) + "..." : columnName;
|
|
|
|
listContainer.addShape("rect", {
|
|
attrs: {
|
|
x: 1,
|
|
y: i * itemHeight - itemHeight / 2 + offsetY,
|
|
width: width - 4,
|
|
height: itemHeight,
|
|
radius: 2,
|
|
fill:isSelected ? "#ddd" : "#fff",
|
|
lineWidth: 1,
|
|
cursor: "pointer",
|
|
},
|
|
name: `item-${Math.floor(startIndex) + i}-content`,
|
|
draggable: true,
|
|
});
|
|
|
|
listContainer.addShape("text", {
|
|
attrs: {
|
|
x: 12,
|
|
y: i * itemHeight + offsetY + 6,
|
|
text: label,
|
|
fontSize: 12,
|
|
fill: "#000",
|
|
fontFamily: "Avenir,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol",
|
|
full: e,
|
|
fontWeight: isSelected ? 500 : 100,
|
|
cursor: "pointer",
|
|
},
|
|
name: `item-${Math.floor(startIndex) + i}`,
|
|
});
|
|
|
|
//未来设置字段之间有锚点
|
|
// if (!cfg.hideDot) {
|
|
// utils.anchor.erDrawLeft(group, label, 0, i * itemHeight + offsetY)
|
|
// utils.anchor.erDrawLeft(group,label,width,i * itemHeight + offsetY)
|
|
// listContainer.addShape("marker", {
|
|
// attrs: {
|
|
// x: 0,
|
|
// y: i * itemHeight + offsetY,
|
|
// r: 3,
|
|
// stroke: boxStyle.stroke,
|
|
// fill: "white",
|
|
// radius: 2,
|
|
// lineWidth: 1,
|
|
// cursor: "crosshair",
|
|
// },
|
|
//
|
|
// name: 'marker-shape'
|
|
// });
|
|
// listContainer.addShape("marker", {
|
|
// attrs: {
|
|
// x: width,
|
|
// y: i * itemHeight + offsetY,
|
|
// r: 3,
|
|
// stroke: boxStyle.stroke,
|
|
// fill: "white",
|
|
// radius: 2,
|
|
// lineWidth: 1,
|
|
// cursor: "crosshair",
|
|
//
|
|
//
|
|
// },
|
|
// name: 'marker-shape'
|
|
// });
|
|
// }
|
|
});
|
|
}
|
|
return keyshape;
|
|
},
|
|
// getAnchorPoints() {
|
|
// return [
|
|
// [0, 0],
|
|
// [1, 0],
|
|
// ];
|
|
// },
|
|
// 绘制后附加锚点
|
|
afterDraw(cfg, group) {
|
|
// 绘制锚点
|
|
utils.anchor.drawMark(cfg, group)
|
|
},
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|