This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
nezha-nezha-fronted/nezha-fronted/src/components/common/rightBox/chart/chartRightBox.vue

626 lines
22 KiB
Vue
Raw Normal View History

2021-11-30 16:39:21 +08:00
<template>
<div v-clickoutside="{obj: editChart, func:clickOutside}" :class="boxClass" class="right-box right-box-chart">
2021-11-30 16:39:21 +08:00
<transition v-if="from !== 'chartTemp'" name="right-box">
<!-- <panel-box v-if="!showPanel.type" ref="panelBox2" :panel="panel" @reload="panelReload"></panel-box>-->
2021-11-30 16:39:21 +08:00
</transition>
<div class="right-box__header">
<div class="header__title" v-if="from !== 'chartTemp'">{{editChart.id ? $t("dashboard.panel.editChartTitle") : $t("overall.createChart")}}</div>
2021-11-30 16:39:21 +08:00
<div class="header__title" v-if="from === 'chartTemp'">{{editChart.id ? $t("dashboard.panel.editChartTempTitle") : $t("dashboard.panel.createChartTempTitle")}}</div>
<div class="header__operation">
<span v-cancel="{obj: editChart, func: clickOutside}"><i class="nz-icon nz-icon-close" :title="$t('overall.close')"></i></span>
2021-11-30 16:39:21 +08:00
</div>
</div>
<!-- begin--表单-->
<div class="right-box-form-box right-box__container chart-right-box">
2021-11-30 16:39:21 +08:00
<el-form ref="chartForm" :model="editChart" :rules="rules" label-position= "top" label-width="120px">
<el-form-item :label='$t("overall.name")' prop="name">
2022-05-17 18:54:19 +08:00
<div style="display:flex;align-items:center">
<el-input style="flex:1;margin-right:10px" maxlength="64" show-word-limit size="small" v-model="editChart.name" id="chart-box-title"></el-input>
<!-- 显示头部 -->
<div class="choose-header-btn" v-if="editChart.param&&editChart.param.showHeader!==0" @click="switchHeader(0)" :title="$t('overall.visible')">
2022-05-17 18:54:19 +08:00
<i class="nz-icon nz-icon-mimakejian"></i>
</div>
<!-- 隐藏头部 -->
<div class="choose-header-btn" v-else @click="switchHeader(1)" :title="$t('overall.invisible')">
2022-05-17 18:54:19 +08:00
<i class="nz-icon nz-icon-mimabukejian"></i>
</div>
</div>
2021-11-30 16:39:21 +08:00
</el-form-item>
<div class="form-items--half-width-group">
<!--panel-->
<el-form-item
class="form-item--half-width"
v-if="showPanel.type !== fromRoute.project && showPanel.type !== fromRoute.asset && showPanel.type !== fromRoute.endpoint && showPanel.type !== fromRoute.model && from!=='chartTemp'"
2022-07-12 17:10:45 +08:00
:label="$t('overall.dashboard')"
2021-11-30 16:39:21 +08:00
prop="panelName"
>
<select-panel ref="selectPanel" :disabled="showPanel.type === 'dashboard'" :filter-panel="filterPanel" :chart-box="true" :panel-lock="true" :panelData="panelData" :placement="'bottom-start'" @selectPanel="selectPanel">
<template v-slot:header>
<div class="panel-select-header">
<el-input id="chart-box-panelname" v-model="filterPanel" :placeholder="$t('overall.search')" clearable size="small" style="width: 596px"></el-input>
</div>
</template>
<template v-slot:trigger>
<el-input placeholder="" readonly="readonly" size="small" v-model="editChart.panelName" :disabled="showPanel.type==='dashboard'"></el-input>
</template>
</select-panel>
</el-form-item>
<!-- varType -->
<el-form-item :label="$t('dashboard.panel.chartForm.varType')" class="form-item--half-width" v-if="from === 'chartTemp'">
<el-select id="chart-box-varType" v-model="editChart.varType" :disabled="!!editChart.id" class="right-box__select" popper-class="right-box-select-top prevent-clickoutside" clearable placeholder="" size="small" value-key="chartType">
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in varTypeArr">
<span class="panel-dropdown-label-txt" >{{item.name}}</span>
</el-option>
</el-select>
</el-form-item>
2021-11-30 16:39:21 +08:00
<!--group-->
<el-form-item :label="$t('dashboard.panel.chartForm.group')" class="form-item--half-width" prop="group">
<el-select id="chart-box-group" v-model="editChart.groupId" :disabled="editChart.type==='group'" clearable placeholder="" popper-class="right-box-select-top prevent-clickoutside" size="small" value-key="chartType">
<el-option v-for="item in groupArr" :key="item.id" :label="item.name" :value="item.id">
<span class="panel-dropdown-label-txt" >{{item.name}}</span>
</el-option>
</el-select>
</el-form-item>
</div>
<!--remark-->
<el-form-item :label="$t('overall.remark')">
2022-06-10 14:55:46 +08:00
<el-input maxlength="256" show-word-limit v-model="editChart.remark" size="small" :rows="2" type="textarea"/>
2021-11-30 16:39:21 +08:00
</el-form-item>
2021-12-24 16:06:17 +08:00
<!--remark-->
2021-12-24 16:36:21 +08:00
<el-form-item :label="$t('overall.link')" v-if="editChart.param">
2022-06-10 14:55:46 +08:00
<el-input maxlength="256" show-word-limit v-model="editChart.param.link" size="small" :rows="2" type="textarea"/>
2021-12-24 16:06:17 +08:00
</el-form-item>
2021-11-30 16:39:21 +08:00
<!--title-->
<div class="form__sub-title">
<span>{{$t('dashboard.panel.chartForm.dataConfig')}}</span>
</div>
2021-12-03 17:59:27 +08:00
<el-tabs v-model="editChart.datasource" @tab-click="datasourceChange" type="card">
2022-07-12 14:06:14 +08:00
<el-tab-pane :label="$t('overall.metrics')" name="metrics">
<chart-config :variables="variables" ref="childrenFrommetrics" :type="'metrics'" v-if="editChart.datasource == 'metrics'" :params.sync="editChart" @change="editChartChange"/>
2021-11-30 16:39:21 +08:00
</el-tab-pane>
<el-tab-pane :label="$t('overall.logs')" name="logs">
<chart-config :variables="variables" ref="childrenFromlogs" :type="'log'" v-if="editChart.datasource == 'logs'" :params.sync="editChart" @change="editChartChange"/>
2021-11-30 16:39:21 +08:00
</el-tab-pane>
<el-tab-pane :label="$t('overall.system')" name="system">
<system-chart-config :variables="variables" ref="childrenFromsystem" v-if="editChart.datasource == 'system'" :params.sync="editChart" @change="editChartChange"/>
2021-11-30 16:39:21 +08:00
</el-tab-pane>
<el-tab-pane :label="$t('overall.misc')" name="misc">
<other-chart-config :variables="variables" ref="childrenFrommisc" v-if="editChart.datasource == 'misc'" :params.sync="editChart" @change="editChartChange"/>
2021-11-30 16:39:21 +08:00
</el-tab-pane>
</el-tabs>
</el-form>
</div>
<!--底部按钮-->
<div class="right-box__footer">
<button id="chart-box-esc" v-cancel="{obj:editChart,func:esc}" class="footer__btn footer__btn--light">
<span>{{$t('overall.cancel')}}</span>
</button>
2022-01-11 11:00:03 +08:00
<button v-if="showPanel.type && showPanel.type == 'model'" id="chart-box-Sync" v-has="'main_edit'" class="footer__btn">
2021-11-30 16:39:21 +08:00
<span>{{$t('overall.SyncSave')}}</span>
</button>
2021-12-23 17:02:21 +08:00
<button v-else-if="from!=='chartTemp'" id="chart-box-preview" class="footer__btn" @click="preview(true)">
2021-11-30 16:39:21 +08:00
<span>{{$t('overall.preview')}}</span>
</button>
2022-01-11 11:00:03 +08:00
<button id="chart-box-save" v-has="'main_add'" :class="{'nz-btn-disabled':prevent_opt.save}" :disabled="prevent_opt.save" class="footer__btn" @click="save">
2021-11-30 16:39:21 +08:00
<span>{{$t('overall.save')}}</span>
</button>
</div>
<!-- 预览 -->
2021-12-23 17:02:21 +08:00
<el-dialog
v-if="previewShow"
:visible.sync="previewShow"
:show-close="false"
class="nz-dialog chart-fullscreen"
destroy-on-close
fullscreen
:modal-append-to-body="false"
>
<panel-chart
v-if="prevChart"
style="height: 100%;width: 100%"
2021-12-23 17:02:21 +08:00
:ref="'chart-fullscreen-previewShow'"
:chart-info="prevChart"
:from="from"
:filter="{}"
:is-fullscreen="true"
:time-range="timeRange"
@showFullscreen="preview"
></panel-chart>
</el-dialog>
2021-11-30 16:39:21 +08:00
</div>
</template>
<script>
import { fromRoute } from '@/components/common/js/constants'
import editRigthBox from '@/components/common/mixin/editRigthBox'
import { resetZIndex } from '@/components/common/js/common'
import selectPanel from '@/components/common/popBox/selectPanel'
import chartConfig from '@/components/common/rightBox/chart/chartConfig'
2021-11-30 16:39:21 +08:00
import otherChartConfig from '@/components/common/rightBox/chart/otherChartConfig'
import systemChartConfig from '@/components/common/rightBox/chart/systemChartConfig'
2021-12-23 17:02:21 +08:00
import panelChart from '@/components/chart/panelChart'
import lodash from 'lodash'
import bus from '@/libs/bus'
2021-12-23 17:02:21 +08:00
2021-11-30 16:39:21 +08:00
const rz = {
methods: {
rz (e) {
resetZIndex(e)
}
}
}
export default {
name: 'chartRightBox',
props: {
boxClass: String,
panelData: Array,
showPanel: Object,
chart: Object,
from: { type: String },
fromEndpoint: {
type: Boolean,
default: false
},
variables: {
type: Array,
default: () => {
return []
}
2021-11-30 16:39:21 +08:00
}
},
mixins: [rz, editRigthBox],
components: {
selectPanel,
chartConfig,
2021-11-30 16:39:21 +08:00
systemChartConfig,
2021-12-23 17:02:21 +08:00
otherChartConfig,
panelChart
2021-11-30 16:39:21 +08:00
},
computed: {
chartLastPosition () {
return this.$store.getters.getChartLastPosition
}
},
2021-11-30 16:39:21 +08:00
data () {
return {
fromRoute,
2021-12-23 17:02:21 +08:00
previewShow: false,
2021-11-30 16:39:21 +08:00
editChart: {
name: '',
2021-12-24 16:06:17 +08:00
remark: '',
link: ''
2021-11-30 16:39:21 +08:00
},
panel: {
id: '',
name: ''
},
2021-12-23 17:02:21 +08:00
timeRange: [],
prevChart: '',
2021-11-30 16:39:21 +08:00
filterPanel: '',
groupArr: [],
varTypeArr: [
{ name: this.$t('asset.asset'), id: 1 },
{ name: this.$t('asset.endpoint'), id: 2 }
],
2021-11-30 16:39:21 +08:00
panelName: '',
rules: {
name: [{ required: true, message: this.$t('validate.required'), trigger: 'change' }],
panelName: [{ required: true, message: this.$t('validate.required'), trigger: 'change' }]
2021-11-30 16:39:21 +08:00
}
}
},
methods: {
2022-05-17 18:54:19 +08:00
switchHeader (value) {
// 1为显示 0为隐藏
this.$set(this.editChart.param, 'showHeader', value)
2022-05-17 18:54:19 +08:00
},
2021-11-30 16:39:21 +08:00
clickOutside () {
this.esc(false)
},
/* 关闭弹框 */
esc (refresh) {
this.prevent_opt.save = false
this.$emit('close', refresh)
},
// 保存endpoint
save () {
const self = this
let resetFlag = false // 页面是否需要重排
const arr = [this.$refs.chartForm.validate()]
arr.push(this.$refs['childrenFrom' + this.editChart.datasource].$refs.chartForm.validate())
Promise.all(arr).then(res => {
2021-12-03 17:59:27 +08:00
this.editChart.panelId = this.panelId
const params = JSON.parse(JSON.stringify(this.editChart))
2021-12-13 20:30:33 +08:00
if (params.type === 'group') {
params.height = 1
}
if (!params.groupId) {
2021-12-06 15:25:09 +08:00
params.groupId = 0
}
2022-03-07 18:06:41 +08:00
if (params.type !== 'gauge') {
2021-12-24 15:32:16 +08:00
delete params.param.min
delete params.param.max
}
if (!params.x && !params.y && this.from === 'endpointQuery') { // endpointQuery 新增 放在最后
2021-12-17 16:39:22 +08:00
params.x = 0
params.y = 999
}
if (this.from === 'explore') { // explore 新增 放在最后
params.x = 0
params.y = 999
}
if (!params.x && !params.y && this.from === 'chartTemp') { // chartTemp 新增 在第一位
params.x = 0
params.y = 0
}
if (isNaN(params.y) && isNaN(params.y) && params.groupId) { // group 内的坐标需要单独计算
params.x = 0
params.y = 999
}
if (isNaN(params.y) && isNaN(params.y)) {
params.x = this.chartLastPosition.x + params.span > 12 ? 0 : this.chartLastPosition.x
params.y = this.chartLastPosition.y + 12
}
if (params.x + params.span > 12) {
params.x = 0
params.y += 1
resetFlag = true
}
2021-12-06 15:25:09 +08:00
delete params.panel
if (params.type === 'table') {
delete params.param.tags
}
if (params.datasource === 'system' && params.param.datasource[0].filter) {
params.param.datasource[0].filter = params.param.datasource[0].filter.filter(item => item.value)
}
if (params.id) { // 修改
this.$put('visual/panel/chart', params).then(response => {
2021-12-02 15:36:01 +08:00
if (response.code === 200) {
this.$message({ duration: 1000, type: 'success', message: this.$t('tip.saveSuccess') })
if (resetFlag) {
bus.$emit('creat-chart-success', {
...params,
cb: function () {
self.$emit('on-create-success', { id: this.panelId, name: this.panelName })
self.esc(true)
}
})
} else {
self.$emit('on-create-success', { id: this.panelId, name: this.panelName })
self.esc(true)
}
2021-12-02 15:36:01 +08:00
} else {
this.$message.error(response.msg)
}
})
} else { // 新增
this.$post('visual/panel/chart', params).then(response => {
2021-12-02 15:36:01 +08:00
if (response.code === 200) {
this.$message({ duration: 1000, type: 'success', message: this.$t('tip.saveSuccess') })
if (resetFlag) {
bus.$emit('creat-chart-success', {
...params,
cb: function () {
self.$emit('on-create-success', { id: this.panelId, name: this.panelName })
self.esc(true)
}
})
} else {
self.$emit('on-create-success', { id: this.panelId, name: this.panelName })
self.esc(true)
}
2021-12-02 15:36:01 +08:00
} else {
this.$message.error(response.msg)
}
})
}
}).catch(res => {
this.$refs['childrenFrom' + this.editChart.datasource].showError()
2022-07-15 17:05:03 +08:00
// console.info(res)
2021-11-30 16:39:21 +08:00
})
},
selectPanel (panel) {
this.panelName = panel.name
this.editChart.panelName = panel.name
2021-11-30 16:39:21 +08:00
this.panelId = panel.id
this.editChart.groupId = ''
this.$get('visual/panel/chart?panelId=' + this.panelId + '&pageSize=-1').then(response => {
if (response.code === 200) {
this.groupArr = []
response.data.list.forEach((item, index) => {
if (item.type === 'group') {
this.groupArr.push({ id: item.id, name: item.name })
}
})
}
})
},
panelReload (panelName) { // 刷新panel下拉框
if (panelName) {
this.panelName = panelName
}
this.$emit('reloadOnlyPanel')
},
getGroupList () {
this.$get('visual/panel/chart?panelId=' + this.panelId + '&pageSize=-1').then(response => {
if (response.code === 200) {
this.groupArr = []
response.data.list.forEach((item, index) => {
if (item.type === 'group') {
this.groupArr.push({ id: item.id, name: item.name })
}
})
}
})
},
datasourceChange () {
if (this.editChart.datasource == 'metrics') {
this.editChart = {
...this.editChart,
span: 4,
height: 4,
unit: 2,
type: 'line',
2021-12-24 15:32:16 +08:00
min: 0,
max: 100,
elements: [{ expression: '', legend: '', type: 'expert', id: '', name: 'A', state: 1 }],
param: {
stack: 0,
nullType: 'null',
legend: { placement: 'bottom', values: [] },
enable: {
thresholds: false,
legend: true,
valueMapping: false,
visibility: false
},
2022-05-17 18:54:19 +08:00
thresholds: [{ value: undefined, color: '#eeeeeeff' }],
showHeader: this.editChart.param.showHeader,
visibility: {
varName: '',
operator: 'equal',
varValue: '',
result: 'show'
}
}
}
}
if (this.editChart.datasource == 'logs') {
this.editChart = {
...this.editChart,
span: 4,
height: 4,
unit: 2,
type: 'log',
elements: [{ expression: '', legend: '', type: 'expert', id: '', name: 'A', state: 1 }],
param: {
enable: {
thresholds: false,
legend: true,
valueMapping: false,
visibility: false
},
2022-05-17 18:54:19 +08:00
limit: 100,
showHeader: this.editChart.param.showHeader,
visibility: {
varName: '',
operator: 'equal',
varValue: '',
result: 'show'
}
}
}
}
if (this.editChart.datasource == 'system') {
2021-12-02 18:33:28 +08:00
this.editChart = {
...this.editChart,
span: 4,
height: 4,
unit: 2,
type: 'stat',
2021-12-02 18:33:28 +08:00
param: {
2021-12-15 17:55:56 +08:00
refer: 0,
2021-12-03 10:08:34 +08:00
nullType: 'null',
statistics: 'last',
text: 'value',
2021-12-24 15:32:16 +08:00
min: 0,
max: 100,
enable: {
thresholds: false,
legend: true,
valueMapping: false,
visibility: false
},
datasource: [{
name: 'System',
type: 'asset',
systemGroup: '',
systemSelect: '',
group: '',
select: '',
limit: 100,
2021-12-29 14:29:37 +08:00
sort: 'desc',
legend: ''
2021-12-03 10:08:34 +08:00
}
],
2022-05-17 18:54:19 +08:00
valueMapping: [],
showHeader: this.editChart.param.showHeader,
visibility: {
varName: '',
operator: 'equal',
varValue: '',
result: 'show'
}
2021-12-02 18:33:28 +08:00
}
}
delete this.editChart.elements
}
if (this.editChart.datasource == 'misc') {
2021-12-02 14:56:14 +08:00
this.editChart = {
...this.editChart,
span: 4,
height: 4,
type: 'url',
param: {
enable: {
thresholds: false,
legend: true,
valueMapping: false,
visibility: false
},
2022-05-17 18:54:19 +08:00
url: '',
showHeader: this.editChart.param.showHeader,
visibility: {
varName: '',
operator: 'equal',
varValue: '',
result: 'show'
}
2021-12-02 14:56:14 +08:00
}
}
2021-12-02 18:33:28 +08:00
delete this.editChart.elements
2021-12-02 14:56:14 +08:00
}
},
editChartChange (newEditChart) {
this.editChart = {
...JSON.parse(JSON.stringify(newEditChart)),
name: this.editChart.name,
remark: this.editChart.remark,
groupId: this.editChart.groupId,
panelName: this.editChart.panelName,
varType: this.editChart.varType
}
2021-12-23 17:02:21 +08:00
},
preview (show) {
if (show) {
this.prevChart = ''
setTimeout(() => {
const start = new Date().setHours(new Date().getHours() - 1)
const end = new Date()
this.timeRange = [bus.computeTimezoneTime(start), bus.computeTimezoneTime(end)]
this.prevChart = {
...lodash.cloneDeep(this.editChart),
loaded: true
}
this.prevChart.param.showHeader = true
}, 200)
2021-12-23 17:02:21 +08:00
}
this.previewShow = show
2021-11-30 16:39:21 +08:00
}
},
created () {
},
mounted () {
this.getGroupList()
},
watch: {
showPanel: {
immediate: true,
deep: true,
handler () {
if (this.showPanel && (this.showPanel.id || this.from === 'chartTemp')) {
2021-11-30 16:39:21 +08:00
this.panelId = this.showPanel.id
this.panelName = this.showPanel.name
this.editChart.panelName = this.showPanel.name
}
}
},
chart: {
deep: true,
immediate: true,
handler (n) {
const obj = JSON.parse(JSON.stringify(n))
if (obj.param && !obj.param.valueMapping) {
obj.param.valueMapping = []
}
if (obj.param && !obj.param.thresholds) {
obj.param.thresholds = []
}
if (obj.groupId === -1) {
obj.groupId = ''
2021-11-30 16:39:21 +08:00
}
if (obj.param) {
if (!obj.param.min) {
obj.param.min = 0
2021-12-24 16:06:17 +08:00
}
if (!obj.param.max) {
obj.param.max = 100
2021-12-24 16:06:17 +08:00
}
2022-04-02 17:41:24 +08:00
if (!obj.param.text && obj.param.display) {
obj.param.text = obj.param.display
}
if (!obj.param.link) {
this.$set(obj.param, 'link', '')
2021-12-24 16:06:17 +08:00
}
if (!obj.param.enable) {
obj.param.enable = {
thresholds: false,
legend: false,
valueMapping: false,
visibility: false
}
}
if (!obj.param.visibility) {
obj.param.visibility = {
varName: '',
operator: '',
varValue: '',
result: ''
}
}
// this.editChart.varType = 1
if (obj.param.enable.legend && !obj.param.legend) {
obj.param.legend = { placement: 'bottom', values: [], show: true }
}
if (obj.param.datasource && !obj.param.datasource[0].legend) {
obj.param.datasource[0].legend = ''
2021-12-29 14:29:37 +08:00
}
if (obj.param.valueMapping) {
obj.param.valueMapping.forEach(item => {
if (!item.show) {
item.show = false
}
2022-04-02 17:41:24 +08:00
if (item.text && !item.display) {
item.display = item.text
} else if (!item.display) {
item.display = '{{A.$value}}'
2022-04-02 17:41:24 +08:00
}
if (item.columns && !item.column) {
item.column = item.columns
}
})
}
2021-12-24 15:32:16 +08:00
}
this.editChart = obj
2021-11-30 16:39:21 +08:00
}
},
'editChart.type': {
handler (n) {
if (n === 'group') {
this.editChart.groupId = ''
} else {
this.editChart.param.enable.visibility = false
this.editChart.param.visibility.varName = ''
this.editChart.param.visibility.operator = ''
this.editChart.param.visibility.varValue = ''
this.editChart.param.visibility.result = ''
}
}
},
editChart: {
deep: true,
handler () {
}
2021-11-30 16:39:21 +08:00
}
}
}
</script>