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/page/dashboard/explore/promqlInput.vue

274 lines
11 KiB
Vue
Raw Normal View History

<template>
<div class="promqlInput" :style="{height:(errorMsg || appendMsg)?'50px':'auto','margin-bottom':required?'0':'18px'}">
<div class="query-row">
<div class="query-input">
2020-07-02 22:25:06 +08:00
<!--explore页面的样式-->
<template v-if="styleType == 1">
<div class="metric-btn" v-if="plugins.indexOf('metric-selector') > -1">
<el-dropdown class="metric-selector">
<el-dropdown-menu style="display: none"></el-dropdown-menu>
2020-09-10 17:00:32 +08:00
<el-button class="metric-btn nz-btn nz-btn-size-normal nz-btn-style-light" @click="toggleDropdown">Metric &nbsp;<i class="nz-icon nz-icon-arrow-down"></i></el-button>
<el-cascader-panel v-show="dropDownVisible" v-model="cascaderValue" v-clickoutside="closeDropdown" slot="dropdown" ref="metricSelector" :props="{emitPath:false}" :options="metricOptions" @change="metricChange" ></el-cascader-panel>
</el-dropdown>
</div>
<div class="input-box" @click="dropDownVisible=false" v-if="plugins.indexOf('metric-input') > -1">
<!-- <el-autocomplete :placeholder="$t('dashboard.metricPreview.inputTip')" :fetch-suggestions="filterInput" clearable @clear="clearExpression" :trigger-on-focus="false" v-model="expressionList[index]" @blur="expressionChange" style="width: 100%;height:36px"></el-autocomplete>-->
2020-11-24 17:31:40 +08:00
<!--<editor :styleType="styleType" :metric-list="metricStore" :history-param="historyParam" v-model="expressionList[index]" ref="editor" @on-enter="expressionChange" @on-blur="expressionChange" ></editor>?-->
<el-input @keyup.enter.native="expressionChange" v-model="expressionList[index]" :id="inputId" @input="metricKeyDown"></el-input>
<div class="append-msg error" v-if="errorMsg"><span>{{errorMsg}}</span></div>
<div class="append-msg error" v-if="appendMsg"><span>{{appendMsg}}</span></div>
</div>
</template>
2020-07-02 22:25:06 +08:00
<!--right-box里的样式-->
<template v-if="styleType == 2">
<el-row v-if="plugins.indexOf('metric-input') > -1 || plugins.indexOf('metric-selector') > -1" style="width: 100%;">
<el-col :style="{'width':plugins.indexOf('metric-selector') > -1 ? '120px':'100%', 'padding': plugins.indexOf('metric-selector') > -1 ?'0 0 0 10px':'0 20px 0 0 ', 'text-align':'left', 'color': '#666','font-weight':plugins.indexOf('metric-selector') > -1 ?'400':'bold'}">
<el-dropdown class="metric-selector" v-if="plugins.indexOf('metric-selector') > -1">
2020-07-02 22:25:06 +08:00
<el-dropdown-menu style="display: none"></el-dropdown-menu>
2020-09-10 17:00:32 +08:00
<span :class="{'expr-title':projectRightBox}" style="cursor: pointer;" @click="toggleDropdown">Metric&nbsp;<i class="nz-icon nz-icon-arrow-down" style="font-size: 14px; -webkit-transform:scale(0.75);display:inline-block;"></i></span>
2020-11-24 17:31:40 +08:00
<el-cascader-panel v-if="dropDownVisible" v-clickoutside="closeDropdown" v-model="cascaderValue" style="text-align: left;" slot="dropdown" ref="metricSelector" :props="{emitPath:false}" :options="metricOptions" @change="metricChange"></el-cascader-panel>
2020-07-02 22:25:06 +08:00
</el-dropdown>
<label style="line-height: 30px;" v-else>{{$t("alert.config.expr")}}<sup v-if="required" style="color: #f56c6c">*</sup></label>
</el-col>
<el-col :style="{'width':plugins.indexOf('metric-selector') > -1 ? 'calc(100% - 120px)':'100%',height: '100%',}">
<div class="input-box" @click="dropDownVisible=false" v-if="plugins.indexOf('metric-input') > -1">
2020-11-24 17:31:40 +08:00
<!--<editor :styleType="styleType" :metric-list="metricStore" :historyParam="historyParam" v-model="expressionList[index]" ref="editor" @on-enter="expressionChange" @on-blur="expressionChange" ></editor>-->
<el-input v-model="expressionList[index]" @change="metricChange" @input="metricKeyDown"></el-input>
2020-07-02 22:25:06 +08:00
<div class="append-msg error" v-if="errorMsg"><span>{{errorMsg}}</span></div>
<div class="append-msg error" v-if="appendMsg"><span>{{appendMsg}}</span></div>
</div>
</el-col>
</el-row>
</template>
</div>
</div>
2020-10-15 15:34:00 +08:00
<div v-if="styleType == 1" style="margin-left: 10px">
2020-04-22 19:45:10 +08:00
<div class="query-options nz-btn-group nz-btn-group-size-normal nz-btn-group-light">
2020-09-10 17:00:32 +08:00
<div class="option nz-btn nz-btn-size-normal nz-btn-style-light" @click="addExpression" v-if="plugins.indexOf('add') > -1"><i class="nz-icon nz-icon-plus"></i></div>
<div class="option nz-btn nz-btn-size-normal nz-btn-style-light" @click="removeExpression" v-if="plugins.indexOf('remove') > -1"><i class="nz-icon nz-icon-minus"></i></div>
</div>
</div>
2020-08-24 15:02:23 +08:00
<div v-if="styleType == 2&&showRemove">
2020-09-10 17:00:32 +08:00
<div class="option" @click="addExpression" v-if="plugins.indexOf('add') > -1"><i class="nz-icon nz-icon-plus"></i></div>
<div class="option" style="margin-left: 5px; line-height: 32px;" @click="removeExpression" v-if="plugins.indexOf('remove') > -1"><i class="nz-icon nz-icon-minus"></i></div>
2020-07-02 22:25:06 +08:00
</div>
</div>
</template>
<script>
import editor from './editor'
export default {
name: "promqlInput",
components:{
'editor':editor
},
props:{
index:{type:Number},
expressionList:{},
plugins: {type: Array},
styleType: Number,
2020-08-24 15:02:23 +08:00
historyParam:{type:Object},
2020-09-07 14:33:34 +08:00
showRemove:{type:Boolean,default:true},
projectRightBox:{type:Boolean,default:false},
metricOptionsParent:{type:Array},
2021-02-04 11:21:00 +08:00
inputId:String,
required:{
type:Boolean,default:false
}
2020-11-24 17:31:40 +08:00
//metricOptions: {type: Array},
//metricStore: {type: Array}
},
data(){
return {
dropDownVisible:false,
//metricStore:[],
2020-11-24 17:31:40 +08:00
metricOptions: [],
cascaderValue:'',
errorMsg:null,
appendMsg:null,
editorValue:'',
firstAddEvent:true
}
},
/*created() {
this.queryMetrics();
},*/
methods:{
closeDropdown() {
this.dropDownVisible = false;
},
clearExpression:function(){
2020-04-22 19:45:10 +08:00
this.expressionChange();
this.cascaderValue='';
},
addExpression:function(){
this.$emit('addExpression',this.index);
},
removeExpression:function(){
this.$emit('removeExpression',this.index);
},
toggleDropdown() {
this.dropDownVisible = !this.dropDownVisible;
},
/*queryMetrics:function(){
this.metrics.forEach((item)=>{
let key='';
if(/^[a-zA-Z]+?_[a-zA-Z]*!/.test(item)){
key=item.split('_')[0];
}else if(/^_\w*!/.test(item)){
key=' ';
}else{
key=item;
}
if(metricMap.get(key)){
let values=metricMap.get(key);
values.push({label:item,value:item});
}else{
let values=[{label:item,value:item}];
metricMap.set(key,values);
}
this.metricStore.push({label:item,value:item,insertText:item})
})
},*/
filterInput:function(queryString, cb){
let metrics=Object.assign([],this.metricStore);
let result=queryString?metrics.filter((item)=>{
return item.value.toLowerCase().indexOf(queryString.toLowerCase()) != -1;
}):metrics;
cb(result)
},
metricChange:function(value){
this.expressionList[this.index]=value;
2020-11-24 17:31:40 +08:00
//this.$refs.editor.setContent(value)
this.dropDownVisible=false;
this.$emit('change',value)
},
metricKeyDown(val){
if(this.required){
this.metricChange(val);
}
},
expressionChange:function(){
this.$emit('change')
},
setError:function(errMsg){
2020-11-24 17:31:40 +08:00
//console.log(errMsg)
this.errorMsg=errMsg;
},
2020-11-24 17:31:40 +08:00
/*setMsg:function(){
this.appendMsg
2020-11-24 17:31:40 +08:00
}*/
},
watch:{
dropDownVisible:function(n,o){
2020-11-24 17:31:40 +08:00
if (this.styleType == 1) {
if (n) {
this.metricOptions = this.$parent.getMetricOptions();
2020-11-24 17:31:40 +08:00
} else {
this.metricOptions = [];
}
} else if (this.styleType == 2) {
if (n) {
//console.log(this.$parent.$parent)
if(this.metricOptionsParent){
this.metricOptions=this.metricOptionsParent
}else{
this.metricOptions = this.$parent.$parent.$parent.getMetricOptions();
}
2020-11-24 17:31:40 +08:00
} else {
this.metricOptions = [];
}
}
if(this.$refs.metricSelector){
this.$refs.metricSelector.dropDownVisible=n;
if(!this.expressionList[this.index]||this.expressionList[this.index] == ''){
this.cascaderValue="";
}
}
},
},
}
</script>
2020-07-02 22:25:06 +08:00
<style scoped lang="scss">
.promqlInput{
position: relative;
width: 100%;
display: flex;
margin-bottom: 18px;
}
.promqlInput .query-row{
width: 100%;
}
2020-07-02 22:25:06 +08:00
.input-box .append-msg{
font-size: 12px;
line-height: 1;
padding-top: 4px;
}
2020-07-02 22:25:06 +08:00
.input-box .error{
color: #F56C6C;
}
.query-row .query-input{
display: flex;
justify-content: flex-start;
}
.promqlInput .query-options{
2020-04-22 19:45:10 +08:00
/*display: flex;*/
/*justify-content: flex-start;*/
/*width: 84px;*/
}
.query-options .option{
2020-04-22 19:45:10 +08:00
/*border-right: 1px solid #dde4ed;*/
/*border-radius: 3px;*/
/*background-color: #dde4ed;*/
width: 34px;
height: 29px !important;
line-height: 30px;
text-align: center;
}
.query-options .option:focus,.query-options .option:hover{
background-color: #CCD7E4;
}
2020-07-02 22:25:06 +08:00
.query-input .metric-btn {
width: 100px;
margin-right: 10px;
}
2020-07-02 22:25:06 +08:00
.query-input .input-box{
width: 100%;
height: 100%;
}
.metric-btn{
height: 29px !important;
2020-04-22 19:45:10 +08:00
width: 105px;
margin-left: 1px;
}
.metric-btn:hover ,.metric-btn:focus {
background-color: #CCD7E4;
color:#606266;
}
.metric-selector .el-cascader-panel{
height: 300px;
position: absolute;
z-index: 2100;
background-color: #FFF;
}
2020-09-07 14:33:34 +08:00
.expr-title{
width: 120px;
padding-right: 20px;
text-align: right;
color: #666;
font-size: 14px;
letter-spacing: 0;
line-height: 22px;
}
</style>
<style>
.metric-selector-pop{
position:relative;
z-index: 2100;
}
2020-07-02 22:25:06 +08:00
.input-box .el-input__inner{
height: 30px;
2020-04-22 19:45:10 +08:00
}
</style>