AIoT前端公共UI

BranchNode.vue 3.3KB

    <template> <div class="branch-node"> <!-- <h5 class="node-title">分支节点</h5> --> <ul class="branch-list"> <li v-for="(item, index) in caseList" :key="index" class="branch-item"> <common-icon name="flow-if" class="icon" size="16"></common-icon> <span>case: {{ item.name }}</span> </li> <li class="branch-item"> <common-icon name="flow-if" class="icon" size="16"></common-icon> <span>default</span> </li> </ul> </div> </template> <script> export default { name: 'BranchNode', inject: ['getNode'], data() { return { node: this.getNode(), nodeInfo: this.getNode().getData(), caseList: [], baseHeight: 36 }; }, computed: {}, watch: {}, created() { this.setDataFromNode(); }, mounted() { this.node.on('change:data', this.setDataFromNode); }, methods: { // 新增节点port addNewPorts(node, ports) { ports.forEach((port, index) => { if (!node.getPort(port.id)) { node.insertPort(index, port); } }); this.deletePort(); }, // 删除非branchlist的节点 deletePort() { // 右侧面板节点数据 // 实际port数量 const ports = this.node.getPorts(); ports.forEach((port) => { if ( port.type === 'case' && !this.caseList.some((item) => item.uuid === port.id) ) { this.node.removePort(port.id); } }); }, // 循环判断当前节点port与实际传过来的port数组,判断是否有删除,如果有删除的,调用删除函数删除port // 获取非空节点数 getPortsList(data) { if (data?.length) { return data.filter((item) => item.id !== ''); } return []; }, // 设置port点 setDataFromNode() { // TODO 分发节点增加point后再去删除时,删除不生效 const data = this.node.getData(); this.caseList = this.getPortsList(data?.attrsData?.function?.branchList) || []; const ports = []; this.caseList.forEach((item) => { ports.push({ group: 'output', id: item.uuid, attrs: { circle: { r: 5, magnet: true, stroke: '#B1B1B1', strokeWidth: 1, fill: '#B1B1B1', connectionCount: 1, refX: -15, refY: -1 } }, type: 'case' }); }); this.addNewPorts(this.node, ports); this.node.resize( this.node.getSize().width, this.baseHeight + ports.length * 36 ); } } }; </script> <style scoped lang="scss"> .branch-node { border: 2px solid #ccc; padding: 0 10px; border-radius: 8px; width: 200px; box-sizing: border-box; .node-title { font-size: 14px; font-weight: 500; line-height: 32px; border-bottom: 1px solid #eee; } .branch-list { display: flex; flex-direction: column; justify-content: flex-start; .branch-item { line-height: 36px; height: 36px; display: flex; align-items: center; border-bottom: 1px solid #ccc; .icon { margin-right: 5px; } &:last-child { border: none; } } } } </style>