import { HtmlNode, HtmlNodeModel, h } from '@logicflow/core';
class SqlNode extends HtmlNode {
/**
* 1.1.7版本后支持在view中重写锚点形状。
* 重写锚点新增
*/
getAnchorShape(anchorData) {
const { x, y, type } = anchorData;
return h('rect', {
x: x - 5,
y: y - 5,
width: 10,
height: 10,
className: `custom-anchor ${type === 'left' ? 'incomming-anchor' : 'outgoing-anchor'
}`,
});
}
setHtml(rootEl) {
rootEl.innerHTML = '';
const {
properties: { fields, tableName },
} = this.props.model;
rootEl.setAttribute('class', 'table-container');
const container = document.createElement('div');
container.className = `table-node table-color-${Math.ceil(
Math.random() * 4,
)}`;
const tableNameElement = document.createElement('div');
tableNameElement.innerText = tableName;
tableNameElement.className = 'table-name';
container.appendChild(tableNameElement);
const fragment = document.createDocumentFragment();
for (let i = 0; i < fields.length; i++) {
const item = fields[i];
const itemElement = document.createElement('div');
itemElement.className = 'table-feild';
const itemKey = document.createElement('span');
itemKey.innerText = item.key;
const itemType = document.createElement('span');
itemType.innerText = item.type;
itemType.className = 'feild-type';
itemElement.appendChild(itemKey);
itemElement.appendChild(itemType);
fragment.appendChild(itemElement);
}
container.appendChild(fragment);
rootEl.appendChild(container);
}
}
class SqlNodeModel extends HtmlNodeModel {
/**
* 给model自定义添加字段方法
*/
addField(item) {
this.properties.fields.unshift(item);
this.setAttributes();
// 为了保持节点顶部位置不变,在节点变化后,对节点进行一个位移,位移距离为添加高度的一半。
this.move(0, 24 / 2);
// 更新节点连接边的path
this.incoming.edges.forEach((egde) => {
// 调用自定义的更新方案
egde.updatePathByAnchor();
});
this.outgoing.edges.forEach((edge) => {
// 调用自定义的更新方案
edge.updatePathByAnchor();
});
}
getOutlineStyle() {
const style = super.getOutlineStyle();
style.stroke = 'none';
style.hover.stroke = 'none';
return style;
}
// 如果不用修改锚地形状,可以重写颜色相关样式
getAnchorStyle(anchorInfo) {
const style = super.getAnchorStyle();
if (anchorInfo.type === 'left') {
style.fill = 'red';
style.hover.fill = 'transparent';
style.hover.stroke = 'transpanrent';
style.className = 'lf-hide-default';
} else {
style.fill = 'green';
}
return style;
}
setAttributes() {
this.width = 200;
const {
properties: { fields },
} = this;
this.height = 60 + fields.length * 24;
const circleOnlyAsTarget = {
message: '只允许从右边的锚点连出',
validate: (sourceNode, targetNode, sourceAnchor) => {
return sourceAnchor.type === 'right';
},
};
this.sourceRules.push(circleOnlyAsTarget);
this.targetRules.push({
message: '只允许连接左边的锚点',
validate: (sourceNode, targetNode, sourceAnchor, targetAnchor) => {
return targetAnchor.type === 'left';
},
});
}
getDefaultAnchor() {
const {
id,
x,
y,
width,
height,
isHovered,
isSelected,
properties: { fields, isConnection },
} = this;
const anchors = [];
fields.forEach((feild, index) => {
// 如果是连出,就不显示左边的锚点
if (isConnection || !(isHovered || isSelected)) {
anchors.push({
x: x - width / 2 + 10,
y: y - height / 2 + 60 + index * 24,
id: `${id}_${feild.key}_left`,
edgeAddable: false,
type: 'left',
});
}
if (!isConnection) {
anchors.push({
x: x + width / 2 - 10,
y: y - height / 2 + 60 + index * 24,
id: `${id}_${feild.key}_right`,
type: 'right',
});
}
});
return anchors;
}
}
export default {
type: 'sql-node',
model: SqlNodeModel,
view: SqlNode,
};