| 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, | 
| }; |