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

504 lines
18 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">
<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("dashboard.panel.createChartTitle")}}</div>
<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"></i></span>
</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("dashboard.panel.chartForm.name")' prop="name">
2021-11-30 16:39:21 +08:00
<el-input maxlength="64" show-word-limit size="small" v-model="editChart.name" id="chart-box-title"></el-input>
</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'"
:label="$t('dashboard.panel.title')"
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')">
<el-input maxlength="256" show-word-limit v-model="editChart.remark" :autosize="{ minRows: 1, maxRows: 6}" type="textarea"/>
</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">
2021-12-24 16:06:17 +08:00
<el-input maxlength="256" show-word-limit v-model="editChart.param.link" :autosize="{ minRows: 1, maxRows: 6}" type="textarea"/>
</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">
<el-tab-pane label="Metrics" name="metrics">
<chart-config 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="Logs" name="logs">
<chart-config 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="System" name="system">
<system-chart-config 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="Misc" name="misc">
<other-chart-config 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
: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
}
},
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: 'Asset', id: 1 },
{ name: '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: {
clickOutside () {
this.esc(false)
},
/* 关闭弹框 */
esc (refresh) {
this.prevent_opt.save = false
this.$emit('close', refresh)
},
// 保存endpoint
save () {
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 (!params.x && !params.y && this.from === 'chartTemp') { // chartTemp 新增 在第一位
params.x = 0
params.y = 0
}
if (!params.x && !params.y && params.groupId) { // group 内的坐标需要单独计算
params.x = 0
params.y = 999
}
if (!params.x && !params.y) {
params.x = this.chartLastPosition.x + params.span > 12 ? 0 : this.chartLastPosition.x
params.y = this.chartLastPosition.y + 12
}
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') })
this.$emit('on-create-success', { id: this.panelId, name: this.panelName })
this.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') })
this.$emit('on-create-success', { id: this.panelId, name: this.panelName })
this.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()
2021-12-21 18:05:36 +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' }],
param: {
stack: 0,
nullType: 'null',
legend: { placement: 'bottom', values: [] },
enable: {
thresholds: false,
legend: true,
valueMapping: false
},
thresholds: [{ value: undefined, color: '#eeeeeeff' }]
}
}
}
if (this.editChart.datasource == 'logs') {
this.editChart = {
...this.editChart,
span: 4,
height: 4,
unit: 2,
type: 'log',
enable: {
thresholds: false,
legend: true,
valueMapping: false
},
elements: [{ expression: '', legend: '', type: 'expert', id: '', name: 'A' }],
param: {
limit: 100
}
}
}
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
},
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
}
],
valueMapping: []
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',
enable: {
thresholds: false,
legend: true,
valueMapping: false
},
2021-12-02 14:56:14 +08:00
param: {
url: ''
}
}
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) {
const start = new Date().setHours(new Date().getHours() - 1)
const end = new Date()
this.timeRange = [bus.computeTimezoneTime(start), bus.computeTimezoneTime(end)]
2021-12-23 17:02:21 +08:00
this.prevChart = lodash.cloneDeep(this.editChart)
this.prevChart.loaded = true
this.prevChart.param.showHeader = true
}
this.$nextTick(() => {
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 = []
}
this.editChart = obj
2021-11-30 16:39:21 +08:00
if (this.editChart.groupId === -1) {
this.editChart.groupId = ''
}
2021-12-24 16:06:17 +08:00
if (this.editChart.param) {
if (!this.editChart.param.min) {
this.editChart.param.min = 0
}
if (!this.editChart.param.max) {
this.editChart.param.max = 100
}
if (!this.editChart.param.link) {
this.$set(this.editChart.param, 'link', '')
}
if (!this.editChart.param.enable) {
this.editChart.param.enable = {
thresholds: false,
legend: false,
valueMapping: false
}
}
// this.editChart.varType = 1
if (this.editChart.param.enable.legend && !this.editChart.param.legend) {
this.editChart.param.legend = { placement: 'bottom', values: [], show: true }
}
2021-12-29 14:29:37 +08:00
if (this.editChart.param.datasource && !this.editChart.param.datasource[0].legend) {
this.editChart.param.datasource[0].legend = ''
}
if (this.editChart.param.valueMapping) {
this.editChart.param.valueMapping.forEach(item => {
if (!item.show) {
item.show = false
}
})
}
2021-12-24 15:32:16 +08:00
}
2021-11-30 16:39:21 +08:00
}
},
'editChart.type': {
handler (n) {
if (n === 'group') {
this.editChart.groupId = ''
}
}
2021-11-30 16:39:21 +08:00
}
}
}
</script>