2021-03-25 19:16:32 +08:00
|
|
|
<template>
|
2021-05-06 23:40:34 +08:00
|
|
|
<div v-loading="requestStatus==='waiting'" class="rect-shape">
|
2021-05-05 23:48:05 +08:00
|
|
|
<div v-if="requestStatus==='error'" style=";width: 100%;height: 100%;background-color: #ece7e7; text-align: center">
|
|
|
|
<div style="font-size: 12px; color: #9ea6b2;">
|
2021-05-17 19:11:07 +08:00
|
|
|
{{ $t('panel.error_data') }}<br>
|
2021-05-05 23:48:05 +08:00
|
|
|
{{ message }}
|
|
|
|
</div>
|
|
|
|
</div>
|
2021-05-18 16:38:24 +08:00
|
|
|
<chart-component v-if="requestStatus==='success'&&chart.type && !chart.type.includes('table') && !chart.type.includes('text')" :ref="element.propValue.id" class="chart-class" :chart="chart" />
|
|
|
|
<table-normal v-if="requestStatus==='success'&&chart.type && chart.type.includes('table')" :ref="element.propValue.id" :chart="chart" class="table-class" />
|
|
|
|
<label-normal v-if="requestStatus==='success'&&chart.type && chart.type.includes('text')" :ref="element.propValue.id" :chart="chart" class="table-class" />
|
2021-03-25 19:16:32 +08:00
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
2021-05-06 23:40:34 +08:00
|
|
|
import { viewData } from '@/api/panel/panel'
|
2021-03-25 19:16:32 +08:00
|
|
|
import ChartComponent from '@/views/chart/components/ChartComponent.vue'
|
2021-05-05 23:48:05 +08:00
|
|
|
import TableNormal from '@/views/chart/components/table/TableNormal'
|
2021-05-18 16:38:24 +08:00
|
|
|
import LabelNormal from '../../../views/chart/components/normal/LabelNormal'
|
2021-05-26 16:15:54 +08:00
|
|
|
import { uuid } from 'vue-uuid'
|
2021-05-05 23:48:05 +08:00
|
|
|
|
2021-05-05 22:14:23 +08:00
|
|
|
import { mapState } from 'vuex'
|
|
|
|
|
|
|
|
import {
|
|
|
|
DEFAULT_COLOR_CASE,
|
|
|
|
DEFAULT_SIZE,
|
|
|
|
DEFAULT_TITLE_STYLE,
|
|
|
|
DEFAULT_LEGEND_STYLE,
|
|
|
|
DEFAULT_LABEL,
|
|
|
|
DEFAULT_TOOLTIP,
|
|
|
|
DEFAULT_XAXIS_STYLE,
|
|
|
|
DEFAULT_YAXIS_STYLE,
|
|
|
|
DEFAULT_BACKGROUND_COLOR
|
|
|
|
} from '@/views/chart/chart/chart'
|
2021-04-01 11:38:30 +08:00
|
|
|
|
2021-03-25 19:16:32 +08:00
|
|
|
export default {
|
|
|
|
name: 'UserView',
|
2021-05-18 16:38:24 +08:00
|
|
|
components: { ChartComponent, TableNormal, LabelNormal },
|
2021-03-25 19:16:32 +08:00
|
|
|
props: {
|
|
|
|
element: {
|
|
|
|
type: Object
|
2021-04-19 18:20:15 +08:00
|
|
|
},
|
|
|
|
filter: {
|
|
|
|
type: Object,
|
|
|
|
required: false,
|
|
|
|
default: function() {
|
|
|
|
return {
|
|
|
|
filter: []
|
|
|
|
}
|
|
|
|
}
|
2021-05-26 16:15:54 +08:00
|
|
|
},
|
|
|
|
outStyle: {
|
|
|
|
type: Object,
|
|
|
|
required: false,
|
|
|
|
default: function() {
|
|
|
|
return {}
|
|
|
|
}
|
2021-04-19 18:20:15 +08:00
|
|
|
}
|
|
|
|
},
|
|
|
|
watch: {
|
2021-05-20 16:56:44 +08:00
|
|
|
'$store.getters.conditions': function(newVal, oldVal) {
|
|
|
|
this.filter.filter = newVal
|
|
|
|
this.getData(this.element.propValue.viewId)
|
|
|
|
},
|
2021-04-19 18:20:15 +08:00
|
|
|
filter(val) {
|
|
|
|
this.getData(this.element.propValue.viewId)
|
2021-05-05 22:14:23 +08:00
|
|
|
},
|
|
|
|
// deep监听panel 如果改变 提交到 store
|
|
|
|
canvasStyleData: {
|
|
|
|
handler(newVal, oldVla) {
|
2021-05-28 11:21:54 +08:00
|
|
|
// this.chart.stylePriority == panel 优先使用仪表板样式
|
2021-05-06 23:40:34 +08:00
|
|
|
this.mergeStyle()
|
2021-05-05 22:14:23 +08:00
|
|
|
},
|
|
|
|
deep: true
|
2021-05-26 16:15:54 +08:00
|
|
|
},
|
|
|
|
// 监听外部的样式变化
|
|
|
|
outStyle: {
|
|
|
|
handler(newVal, oldVla) {
|
2021-05-28 00:04:39 +08:00
|
|
|
if (this.$refs[this.element.propValue.id]) {
|
|
|
|
this.$refs[this.element.propValue.id].chartResize()
|
|
|
|
}
|
2021-05-26 16:15:54 +08:00
|
|
|
},
|
|
|
|
deep: true
|
2021-03-25 19:16:32 +08:00
|
|
|
}
|
|
|
|
},
|
2021-05-26 16:15:54 +08:00
|
|
|
created() {
|
|
|
|
this.refId = uuid.v1
|
|
|
|
},
|
2021-05-05 22:14:23 +08:00
|
|
|
computed: mapState([
|
|
|
|
'canvasStyleData'
|
|
|
|
]),
|
2021-03-25 19:16:32 +08:00
|
|
|
data() {
|
|
|
|
return {
|
2021-05-26 16:15:54 +08:00
|
|
|
refId: null,
|
2021-05-05 22:14:23 +08:00
|
|
|
chart: {
|
2021-05-06 23:40:34 +08:00
|
|
|
stylePriority: 'panel',
|
|
|
|
xaxis: '[]',
|
|
|
|
yaxis: '[]',
|
2021-05-05 22:14:23 +08:00
|
|
|
show: true,
|
|
|
|
type: 'panel',
|
|
|
|
title: '',
|
2021-05-06 23:40:34 +08:00
|
|
|
customAttr: JSON.stringify({
|
2021-05-05 22:14:23 +08:00
|
|
|
color: DEFAULT_COLOR_CASE,
|
|
|
|
size: DEFAULT_SIZE,
|
|
|
|
label: DEFAULT_LABEL,
|
|
|
|
tooltip: DEFAULT_TOOLTIP
|
2021-05-06 23:40:34 +08:00
|
|
|
}),
|
|
|
|
customStyle: JSON.stringify({
|
2021-05-05 22:14:23 +08:00
|
|
|
text: DEFAULT_TITLE_STYLE,
|
|
|
|
legend: DEFAULT_LEGEND_STYLE,
|
|
|
|
xAxis: DEFAULT_XAXIS_STYLE,
|
|
|
|
yAxis: DEFAULT_YAXIS_STYLE,
|
|
|
|
background: DEFAULT_BACKGROUND_COLOR
|
2021-05-06 23:40:34 +08:00
|
|
|
}),
|
|
|
|
customFilter: '[]'
|
2021-05-05 23:48:05 +08:00
|
|
|
},
|
|
|
|
requestStatus: 'waiting',
|
|
|
|
message: null
|
2021-03-25 19:16:32 +08:00
|
|
|
}
|
|
|
|
},
|
|
|
|
created() {
|
2021-05-20 16:56:44 +08:00
|
|
|
this.filter.filter = this.$store.getters.conditions
|
2021-04-01 11:38:30 +08:00
|
|
|
this.getData(this.element.propValue.viewId)
|
2021-03-25 19:16:32 +08:00
|
|
|
},
|
|
|
|
mounted() {
|
|
|
|
|
|
|
|
},
|
|
|
|
methods: {
|
2021-05-06 23:40:34 +08:00
|
|
|
mergeStyle() {
|
2021-05-28 11:21:54 +08:00
|
|
|
// this.chart.stylePriority == panel 优先使用仪表板样式
|
2021-05-06 23:40:34 +08:00
|
|
|
if ((this.requestStatus === 'success' || this.requestStatus === 'merging') && this.chart.stylePriority === 'panel' && this.canvasStyleData.chart) {
|
|
|
|
const customAttrChart = JSON.parse(this.chart.customAttr)
|
|
|
|
const customStyleChart = JSON.parse(this.chart.customStyle)
|
|
|
|
|
|
|
|
const customAttrPanel = JSON.parse(this.canvasStyleData.chart.customAttr)
|
|
|
|
const customStylePanel = JSON.parse(this.canvasStyleData.chart.customStyle)
|
|
|
|
|
|
|
|
// 组件样式-标题设置
|
2021-05-07 19:20:47 +08:00
|
|
|
customStyleChart.text = customStylePanel.text
|
2021-05-06 23:40:34 +08:00
|
|
|
// 组件样式-背景设置
|
2021-05-07 19:20:47 +08:00
|
|
|
customStyleChart.background = customStylePanel.background
|
2021-05-06 23:40:34 +08:00
|
|
|
// 图形属性-颜色设置
|
2021-05-07 19:20:47 +08:00
|
|
|
customAttrChart.color = customAttrPanel.color
|
2021-05-06 23:40:34 +08:00
|
|
|
|
|
|
|
this.chart = {
|
|
|
|
...this.chart,
|
|
|
|
customAttr: JSON.stringify(customAttrChart),
|
2021-05-07 19:20:47 +08:00
|
|
|
customStyle: JSON.stringify(customStyleChart)
|
2021-05-06 23:40:34 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
2021-03-25 19:16:32 +08:00
|
|
|
getData(id) {
|
|
|
|
if (id) {
|
2021-05-05 23:48:05 +08:00
|
|
|
this.requestStatus = 'waiting'
|
|
|
|
this.message = null
|
2021-05-06 23:40:34 +08:00
|
|
|
viewData(id, this.filter).then(response => {
|
2021-03-25 19:16:32 +08:00
|
|
|
// 将视图传入echart组件
|
2021-05-05 23:48:05 +08:00
|
|
|
if (response.success) {
|
|
|
|
this.chart = response.data
|
2021-05-06 23:40:34 +08:00
|
|
|
this.requestStatus = 'merging'
|
|
|
|
this.mergeStyle()
|
2021-05-05 23:48:05 +08:00
|
|
|
this.requestStatus = 'success'
|
|
|
|
} else {
|
|
|
|
this.requestStatus = 'error'
|
|
|
|
this.message = response.massage
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
}).catch(err => {
|
|
|
|
this.requestStatus = 'error'
|
|
|
|
this.message = err
|
|
|
|
return true
|
2021-03-25 19:16:32 +08:00
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
|
.rect-shape {
|
|
|
|
width: 100%;
|
|
|
|
height: 100%;
|
2021-05-19 16:29:19 +08:00
|
|
|
overflow: hidden;
|
2021-03-25 19:16:32 +08:00
|
|
|
}
|
2021-03-26 12:26:48 +08:00
|
|
|
.chart-class{
|
|
|
|
height: 100%;
|
|
|
|
}
|
2021-05-05 23:48:05 +08:00
|
|
|
.table-class{
|
|
|
|
height: 100%;
|
|
|
|
}
|
2021-03-25 19:16:32 +08:00
|
|
|
</style>
|