|
@@ -11,10 +11,12 @@ import {Graph} from "@antv/g6";
|
|
|
const emit = defineEmits(['chartPage'])
|
|
|
const {proxy} = getCurrentInstance()
|
|
|
const props = defineProps({
|
|
|
- data: {}
|
|
|
+ data: {},
|
|
|
+ layout: {default: 'radial'}
|
|
|
})
|
|
|
const state: any = reactive({
|
|
|
resizeObserver: <any>null,
|
|
|
+ chart: null
|
|
|
})
|
|
|
const ref_main = ref()
|
|
|
const setNodes = (data) => {
|
|
@@ -38,27 +40,94 @@ const initChart = () => {
|
|
|
const data = JSON.parse(JSON.stringify(props.data))
|
|
|
setNodes(data)
|
|
|
setEdges(data)
|
|
|
- console.log(data)
|
|
|
+ if (state.chart) {
|
|
|
+ state.chart.destroy()
|
|
|
+ state.chart = null
|
|
|
+ }
|
|
|
const mainColor = getComputedStyle(document.documentElement).getPropertyValue('--cus-main-color')
|
|
|
+ const options = {
|
|
|
+ radial: {
|
|
|
+ layout: {
|
|
|
+ type: 'radial',
|
|
|
+ focusNode: '3',
|
|
|
+ linkDistance: 200,
|
|
|
+ preventOverlap: true,
|
|
|
+ unitRadius: 250,
|
|
|
+ maxPreventOverlapIteration: 100,
|
|
|
+ strictRadial: false
|
|
|
+ },
|
|
|
+ edge: {
|
|
|
+ style: {
|
|
|
+ endArrow: true,
|
|
|
+ endArrowType: 'triangle',
|
|
|
+ endArrowSize: 8,
|
|
|
+ stroke: mainColor,
|
|
|
+ labelAutoRotate: false,
|
|
|
+ labelFill: '#ffffff',
|
|
|
+ labelPadding: [4, 8, 2, 8],
|
|
|
+ labelBackground: true,
|
|
|
+ labelBackgroundFill: mainColor,
|
|
|
+ labelBackgroundRadius: 20,
|
|
|
+ labelFontSize: 12,
|
|
|
+ halo: true,
|
|
|
+ haloLineDash: 4,
|
|
|
+ haloLineWidth: 2,
|
|
|
+ },
|
|
|
+ state: {
|
|
|
+ selected: {
|
|
|
+ labelFontSize: 12,
|
|
|
+ labelFontWeight: 'normal'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ },
|
|
|
+ dagre: {
|
|
|
+ layout: {
|
|
|
+ type: 'dagre',
|
|
|
+ nodesep: 200,
|
|
|
+ ranksep: 200,
|
|
|
+ },
|
|
|
+ edge: {
|
|
|
+ type: 'polyline',
|
|
|
+ style: {
|
|
|
+ router: {
|
|
|
+ type: 'orth',
|
|
|
+ },
|
|
|
+ endArrow: true,
|
|
|
+ endArrowType: 'triangle',
|
|
|
+ endArrowSize: 8,
|
|
|
+ stroke: mainColor,
|
|
|
+ labelAutoRotate: false,
|
|
|
+ labelFill: '#ffffff',
|
|
|
+ labelPadding: [4, 8, 2, 8],
|
|
|
+ labelBackground: true,
|
|
|
+ labelBackgroundFill: mainColor,
|
|
|
+ labelBackgroundRadius: 20,
|
|
|
+ labelFontSize: 12,
|
|
|
+ halo: true,
|
|
|
+ haloLineDash: 4,
|
|
|
+ haloLineWidth: 2,
|
|
|
+ },
|
|
|
+ state: {
|
|
|
+ selected: {
|
|
|
+ labelFontSize: 12,
|
|
|
+ labelFontWeight: 'normal'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ }
|
|
|
+ }
|
|
|
const graph = new Graph({
|
|
|
container: 'container',
|
|
|
data,
|
|
|
autoResize: true,
|
|
|
- autoFit: data.nodes.length < 10 ? 'center' : 'view',
|
|
|
+ autoFit: 'view',
|
|
|
behaviors: ['drag-canvas', 'drag-element', 'zoom-canvas', {
|
|
|
type: 'click-select',
|
|
|
degree: 1,
|
|
|
enable: (event) => event.targetType === "node",
|
|
|
}],
|
|
|
- layout: {
|
|
|
- type: 'radial',
|
|
|
- focusNode: '3',
|
|
|
- linkDistance: 200,
|
|
|
- preventOverlap: true,
|
|
|
- unitRadius: 250,
|
|
|
- maxPreventOverlapIteration: 100,
|
|
|
- strictRadial: false
|
|
|
- },
|
|
|
+ ...options[props.layout],
|
|
|
node: {
|
|
|
style: {
|
|
|
// circle
|
|
@@ -95,35 +164,12 @@ const initChart = () => {
|
|
|
}
|
|
|
}
|
|
|
},
|
|
|
- edge: {
|
|
|
- style: {
|
|
|
- endArrow: true,
|
|
|
- endArrowType: 'triangle',
|
|
|
- endArrowSize: 8,
|
|
|
- stroke: mainColor,
|
|
|
- labelAutoRotate: false,
|
|
|
- labelFill: '#ffffff',
|
|
|
- labelPadding: [4, 8, 2, 8],
|
|
|
- labelBackground: true,
|
|
|
- labelBackgroundFill: mainColor,
|
|
|
- labelBackgroundRadius: 20,
|
|
|
- labelFontSize: 12,
|
|
|
- halo: true,
|
|
|
- haloLineDash: 4,
|
|
|
- haloLineWidth: 2,
|
|
|
- },
|
|
|
- state: {
|
|
|
- selected: {
|
|
|
- labelFontSize: 12,
|
|
|
- labelFontWeight: 'normal'
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
} as any);
|
|
|
graph.render();
|
|
|
graph.on('node:click', (e) => {
|
|
|
emit('chartPage', e.target.id)
|
|
|
})
|
|
|
+ state.chart = graph
|
|
|
state.resizeObserver = new ResizeObserver((entries) => {
|
|
|
for (const entry of entries) {
|
|
|
setTimeout(() => {
|
|
@@ -134,7 +180,7 @@ const initChart = () => {
|
|
|
state.resizeObserver.observe(ref_main.value);
|
|
|
}
|
|
|
}
|
|
|
-watch(() => props.data, () => {
|
|
|
+watch(() => [props.data, props.layout], () => {
|
|
|
initChart()
|
|
|
})
|
|
|
onMounted(() => {
|