You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

386 lines
9.4 KiB
Vue

<template>
<div
v-if="dialogFormVisible"
class="inner-container"
>
<el-scrollbar class="data-set-scrollbar">
<!-- <el-page-header
class="bs-el-page-header"
@back="goBack"
/> -->
<el-page-header class="bs-el-page-header">
<template slot="content">
<div class="page-header">
<div class="page-header-left">
标签详情
</div>
<div class="page-header-right">
<el-button
class="back bs-el-button-default"
@click="goBack"
>
返回
</el-button>
</div>
</div>
</template>
</el-page-header>
<el-divider
class="bs-el-divider"
content-position="left"
>
属性信息
</el-divider>
<el-row
style="width: 100%;"
:gutter="5"
>
<el-col
:span="8"
class="attrInfo"
>
<el-tooltip
v-if="dataForm.labelName.length > 20"
:content="dataForm.labelName"
class="item"
effect="dark"
placement="bottom-start"
>
<span class="text-style">标签名称 {{ ellipsis(dataForm.labelName, 20) }}</span>
</el-tooltip>
<span
v-else
class="text-style"
>
标签名称 {{ ellipsis(dataForm.labelName, 20) }}
</span>
</el-col>
<el-col
:span="8"
class="attrInfo"
>
<el-tooltip
v-if="dataForm.labelType.length > 20"
:content="dataForm.labelType"
class="item"
effect="dark"
placement="bottom-start"
>
<span class="text-style">标签类型 {{ ellipsis(dataForm.labelType, 20) }}</span>
</el-tooltip>
<span
v-else
class="text-style"
>
标签类型 {{ ellipsis(dataForm.labelType, 20) }}
</span>
</el-col>
<el-col
:span="8"
class="attrInfo"
>
<el-tooltip
v-if="dataForm.labelDesc.length > 20"
:content="dataForm.labelDesc"
class="item"
effect="dark"
placement="bottom-start"
>
<span class="text-style">标签说明 {{ ellipsis(dataForm.labelDesc, 20) }}</span>
</el-tooltip>
<span
v-else
class="text-style"
>
标签说明 {{ ellipsis(dataForm.labelDesc, 20) }}
</span>
</el-col>
<el-col
:span="8"
class="attrInfo"
>
<el-tooltip
v-if="dataForm.createBy && dataForm.createBy.length > 20"
:content="dataForm.createBy"
class="item"
effect="dark"
placement="bottom-start"
>
<span class="text-style">创建人 {{ ellipsis(dataForm.createBy, 20) }}</span>
</el-tooltip>
<span
v-else
class="text-style"
>
创建人 {{ ellipsis(dataForm.createBy, 20) }}
</span>
</el-col>
<el-col
:span="16"
class="attrInfo"
>
<el-tooltip
v-if="dataForm.createDate.length > 20"
:content="dataForm.createDate"
class="item"
effect="dark"
placement="bottom-start"
>
<span class="text-style">创建时间 {{ ellipsis(dataForm.createDate, 20) }}</span>
</el-tooltip>
<span
v-else
class="text-style"
>
创建时间 {{ ellipsis(dataForm.createDate, 20) }}
</span>
</el-col>
<el-col
:span="8"
class="attrInfo"
>
<el-tooltip
v-if="dataForm.updateBy && dataForm.updateBy.length > 20"
:content="dataForm.updateBy"
class="item"
effect="dark"
placement="bottom-start"
>
<span class="text-style">
修改人 {{ ellipsis(dataForm.updateBy, 20) }}
</span>
</el-tooltip>
<span
v-else
class="text-style"
>
修改人 {{ ellipsis(dataForm.updateBy, 20) }}
</span>
</el-col>
<el-col
:span="8"
class="attrInfo"
>
<el-tooltip
v-if="dataForm.updateDate.length > 20"
:content="dataForm.updateDate"
class="item"
effect="dark"
placement="bottom-start"
>
<span class="text-style">修改时间 {{ ellipsis(dataForm.updateDate, 20) }}</span>
</el-tooltip>
<span
v-else
class="text-style"
>
修改时间 {{ ellipsis(dataForm.updateDate, 20) }}
</span>
</el-col>
</el-row>
<el-divider
class="bs-el-divider"
content-position="left"
>
关联数据集信息
</el-divider>
<div id="container" />
</el-scrollbar>
</div>
</template>
<script>
import G6 from '@antv/g6'
import { getLabelDetail } from 'packages/js/utils/LabelConfigService'
export default {
name: 'LabelConfigDetails',
data () {
return {
dialogFormVisible: false,
dataForm: {
createBy: '',
createDate: '',
updateBy: '',
updateDate: '',
labelDesc: '',
labelName: '',
labelType: ''
},
jsonData: {},
chartHeight: 0,
chartWidth: 0
}
},
methods: {
ellipsis (value, len) {
if (!value) return ''
if (value.length > len) {
return value.slice(0, len) + '...'
}
return value
},
init (row) {
this.dialogFormVisible = true
getLabelDetail(row.id).then((r) => {
this.jsonData = r.jsonData
if (r.jsonData.nodes.length > 1) {
this.chartHeight = r.jsonData.nodes.length * 100
} else {
this.chartHeight = 200
}
this.dataForm = r
this.chartWidth = r.labelName.length * 20
this.$nextTick(() => {
this.initG6(r.jsonData)
})
})
},
goBack () {
this.dialogFormVisible = false
this.$nextTick(() => {
this.$parent.labelVisible = true
this.$parent.getDataList()
})
},
nodeEach (nodes) {
nodes.forEach(node => {
if (!node.style) {
node.style = {}
}
switch (node.class) {
case 'c1': {
node.shape = 'circle'
node.size = 40
break
}
case 'c3': {
node.shape = 'rect'
// node.size = [80, 50];
node.style = {
stroke: '#FFFFFF',
fill: '#DFE1E3'
}
break
}
case 'c0': {
node.shape = 'ellipse'
node.size = [80, 40]
break
}
case 'c2': {
node.shape = 'diamond'
node.size = [60, 60]
break
}
}
})
},
// 初始化G6
initG6 (json) {
const data = json
const width = document.getElementById('container').scrollWidth
this.nodeEach(data.nodes)
const tooltip = new G6.Tooltip({
offsetX: 10,
offsetY: 0,
fixToNode: [1, 0],
itemTypes: ['node', 'edge'],
getContent: (e) => {
const outDiv = document.createElement('div')
outDiv.style.width = 'fit-content'
outDiv.innerHTML = `<div style='width: 200px;'>${e.item.getModel()._label}</div>`
return outDiv
},
shouldBegin: (e) => {
let res = true
if (e.item.getModel()._label && e.item.getModel()._label.length > 12) {
res = true
} else {
res = false
}
return res
}
})
const graph = new G6.Graph({
container: 'container',
// width: '800',
height: this.chartHeight,
plugins: [tooltip],
// modes: {
// default: ['drag-canvas', 'zoom-canvas', 'click-select']
// },
defaultNode: {
type: 'rect',
size: [150, 50],
style: {
fill: '#9ACAFF',
stroke: '#FFFFFF'
}
},
// 连线类型及样式
defaultEdge: {
type: 'line',
style: {
offset: 25,
endArrow: true,
lineWidth: 2,
stroke: '#333'
}
}
})
data.nodes.forEach(node => {
node._label = node.label
if (node.label.length > 12) {
node.label = node.label.substr(0, 9) + '...'
}
})
graph.data(data)
graph.render()
}
}
}
</script>
<style scoped>
@import '../../assets/style/bsTheme.scss';
.data-set-scrollbar {
height: 100%;
width: 100%;
overflow-y: auto;
overflow-x: none;
}
.inner-container{
overflow-x: hidden;
}
.el-col {
height: 35px;
}
.attrInfo {
padding-left: 20px !important;
}
.text-style{
color: var(--bs-el-title);
}
.page-header {
display: flex;
position: relative;
.page-header-right {
position: absolute;
right: 16px;
}
}
</style>