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

373 lines
13 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>
</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>
<!--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>
<!--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>
<button v-if="showPanel.type && showPanel.type == 'model'" id="chart-box-Sync" v-has="'panel_chart_edit'" class="footer__btn">
<span>{{$t('overall.SyncSave')}}</span>
</button>
<button v-else-if="from!=='chartTemp'" id="chart-box-preview" class="footer__btn">
<span>{{$t('overall.preview')}}</span>
</button>
<button id="chart-box-save" v-has="'panel_chart_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>
</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'
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,
otherChartConfig
},
data () {
return {
fromRoute,
editChart: {
name: '',
remark: ''
},
panel: {
id: '',
name: ''
},
filterPanel: '',
groupArr: [],
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
}
2021-12-06 15:25:09 +08:00
delete params.panel
if (params.type === 'table') {
2021-12-15 17:55:56 +08:00
console.log(params.param.tags)
delete params.param.tags
}
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') })
2021-12-06 15:25:09 +08:00
this.$emit('on-create-success')
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') })
2021-12-06 15:25:09 +08:00
this.$emit('on-create-success')
this.esc(true)
2021-12-02 15:36:01 +08:00
} else {
this.$message.error(response.msg)
}
})
}
}).catch(res => {
console.log(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',
elements: [{ expression: '', legend: '', type: 'expert', id: '', name: 'A' }],
param: {
stack: 0,
nullType: 'null',
legend: { placement: 'bottom', values: [] },
enable: {
thresholds: true,
legend: true,
valueMapping: true
},
thresholds: [{ value: undefined, color: '#eeeeeeff' }]
}
}
}
if (this.editChart.datasource == 'logs') {
this.editChart = {
...this.editChart,
span: 4,
height: 4,
unit: 2,
type: 'log',
enable: {
thresholds: true,
legend: true,
valueMapping: true
},
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',
enable: {
thresholds: true,
legend: true,
valueMapping: true
},
datasource: [{
name: 'A',
type: 'asset',
systemGroup: '',
systemSelect: '',
group: '',
select: '',
limit: 100,
sort: 'desc'
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: true,
legend: true,
valueMapping: true
},
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
}
2021-11-30 16:39:21 +08:00
}
},
created () {
},
mounted () {
this.getGroupList()
},
watch: {
showPanel: {
immediate: true,
deep: true,
handler () {
if (this.showPanel.id || this.from === 'chartTemp') {
this.panelId = this.showPanel.id
this.panelName = this.showPanel.name
this.editChart.panelName = this.showPanel.name
}
}
},
chart: {
deep: true,
immediate: true,
handler (n) {
this.editChart = JSON.parse(JSON.stringify(n))
if (this.editChart.groupId === -1) {
this.editChart.groupId = ''
}
}
},
'editChart.type': {
handler (n) {
if (n === 'group') {
this.editChart.groupId = ''
}
}
2021-11-30 16:39:21 +08:00
}
}
}
</script>