import cytoscape from 'cytoscape'; import dagre from 'cytoscape-dagre'; import tippy from 'tippy.js'; import 'tippy.js/dist/tippy.css'; cytoscape.use( dagre ); /** * draw processmap for trace * @param {array} nodes array of an object, it contains * data:{ * backgroundColor: string * bordercolor: string * height: number * id: number * label: string * shape: string * width: number * } * @param {array} edges it's similar to nodes * @param {string} graphId */ export default function cytoscapeMapTrace(nodes, edges, graphId) { // create Cytoscape let cy = cytoscape({ container: graphId, elements: { nodes: nodes, // 節點的資料 edges: edges, // 關係線的資料 }, layout: { name: 'dagre', rankDir: 'LR' // 直向 TB | 橫向 LR, 'cytoscape-dagre' 套件裡的變數 }, style: [ // node 節點的樣式 { selector: 'node', style: { 'label': function(node) { // 節點要顯示的文字 let text = ''; // node.data('label') 為原先陣列 node.data.label text = node.data('label').length > 18 ? `${node.data('label').substr(0,15)}...` : `${node.data('label')}`; return text }, 'text-opacity': 0.7, 'background-color': 'data(backgroundColor)', 'border-color': 'data(bordercolor)', 'border-width': '1', 'shape': 'data(shape)', 'text-wrap': 'wrap', 'text-max-width': 75, 'text-halign': 'center', 'text-valign': 'center', 'height': 'data(height)', 'width': 'data(width)', 'color': '#001933', 'font-size': 14, } }, // edge 關係線的樣式 { selector: 'edge', style: { 'curve-style': 'taxi', // unbundled-bezier | taxi 'target-arrow-shape': 'triangle', // 指向目標的箭頭形狀: 三角形 'color': 'gray', //#0066cc 'width': 'data(lineWidth)', 'line-style': 'data(style)', } }, // 點擊 node 後改變的樣式 { selector: 'node:selected', style:{ 'border-color': 'red', 'border-width': '3', } }, ], }); // creat tippy.js let tip; cy.on('mouseover', 'node', function(event) { var node = event.target let ref = node.popperRef() let dummyDomEle = document.createElement('div'); let content = document.createElement('div'); content.innerHTML = node.data("label") tip = new tippy(dummyDomEle, { // tippy props: getReferenceClientRect: ref.getBoundingClientRect, trigger: 'manual', content:content }); tip.show(); // if(node.data("label").length > 18) tip.show(); }) cy.on('mouseout', 'node', function(event) { tip.hide(); }); }