blob: d107b1e232e2930d56c778852cb8819f9aa8e433 [file] [log] [blame]
<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-->
<template>
<v-container grid-list-xl fluid >
<v-layout row wrap>
<v-flex xs12 >
<search id="serviceSearch" v-model="filter" :submit="submit" :label="$t('searchDubboConfig')" :hint="$t('configNameHint')"></search>
</v-flex>
</v-layout>
<v-flex lg12>
<v-card>
<v-toolbar flat color="transparent" class="elevation-0">
<v-toolbar-title><span class="headline">{{$t('searchResult')}}</span></v-toolbar-title>
<v-spacer></v-spacer>
<v-btn outline color="primary" @click.stop="openDialog" class="mb-2">{{$t('create')}}</v-btn>
</v-toolbar>
<v-card-text class="pa-0" >
<v-data-table
:headers="headers"
:items="dubboConfig"
hide-actions
class="elevation-0"
>
<template slot="items" slot-scope="props">
<td class="text-xs-left">
<v-tooltip bottom >
<span slot="activator">
{{props.item.key}}
</span>
<span>{{props.item.path}}</span>
</v-tooltip>
</td>
<td class="text-xs-left">
<v-chip
:color="getColor(props.item.scope)"
text-color="white">
{{props.item.scope}}
</v-chip>
</td>
<td class="text-xs-center px-0">
<v-tooltip bottom v-for="op in operations" :key="op.id">
<v-icon small class="mr-2" slot="activator" @click="itemOperation(op.icon, props.item)">
{{op.icon}}
</v-icon>
<span>{{$t(op.tooltip)}}</span>
</v-tooltip>
</td>
</template>
</v-data-table>
</v-card-text>
</v-card>
</v-flex>
<v-dialog v-model="dialog" width="800px" persistent >
<v-card>
<v-card-title class="justify-center">
<span class="headline">{{$t('createNewDubboConfig')}}</span>
</v-card-title>
<v-card-text >
<v-text-field
:label="$t('appName')"
:hint="$t('configNameHint')"
v-model="key"
></v-text-field>
<v-subheader class="pa-0 mt-3">{{$t('configContent')}}</v-subheader>
<ace-editor lang="properties" v-model="rule" :readonly="readonly"></ace-editor>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn flat @click.native="closeDialog">{{$t('close')}}</v-btn>
<v-btn depressed color="primary" @click.native="saveItem">{{$t('save')}}</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
<v-dialog v-model="warn.display" persistent max-width="500px">
<v-card>
<v-card-title class="headline">{{$t(this.warn.title) + this.warnStatus.id}}</v-card-title>
<v-card-text >{{this.warn.text}}</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn flat @click.native="closeWarn">{{$t('cancel')}}</v-btn>
<v-btn depressed color="primary" @click.native="deleteItem(warnStatus)">{{$t('confirm')}}</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-container>
</template>
<script>
import AceEditor from '@/components/public/AceEditor'
import Search from '@/components/public/Search'
export default {
name: 'Management',
components: {
AceEditor,
Search
},
data: () => ({
configCenter: '',
rule: '',
updateId: '',
key: '',
filter: '',
readonly: false,
dialog: false,
operations: [
{id: 0, icon: 'visibility', tooltip: 'view'},
{id: 1, icon: 'edit', tooltip: 'edit'},
{id: 3, icon: 'delete', tooltip: 'delete'}
],
warn: {
display: false,
title: '',
text: '',
status: {}
},
warnStatus: {},
dubboConfig: [],
headers: []
}),
methods: {
setHeaders () {
this.headers = [
{
text: this.$t('name'),
value: 'name',
align: 'left'
},
{
text: this.$t('scope'),
value: 'scope',
sortable: false
},
{
text: this.$t('operation'),
value: 'operation',
sortable: false,
width: '115px'
}
]
},
itemOperation (icon, item) {
switch (icon) {
case 'visibility':
this.dialog = true
this.rule = item.config
this.key = item.key
this.readonly = true
this.updateId = 'close'
break
case 'edit':
this.dialog = true
this.rule = item.config
this.key = item.key
this.updateId = item.key
this.readonly = false
break
case 'delete':
this.openWarn('warnDeleteConfig')
this.warnStatus.id = item.key
}
},
deleteItem: function (warnStatus) {
this.$axios.delete('/manage/config/' + warnStatus.id)
.then(response => {
if (response.status === 200) {
this.warn.display = false
this.search(this.filter)
this.$notify.success('Delete success')
}
})
},
closeDialog: function () {
this.rule = ''
this.key = ''
this.dialog = false
this.readonly = false
},
openDialog: function () {
this.dialog = true
},
openWarn: function (title, text) {
this.warn.title = title
this.warn.text = text
this.warn.display = true
},
closeWarn: function () {
this.warn.title = ''
this.warn.text = ''
this.warn.display = false
},
saveItem: function () {
let configDTO = {}
if (!this.key) {
this.$notify.error('Config key is needed')
return
}
configDTO.key = this.key
configDTO.config = this.rule
let vm = this
if (this.updateId) {
if (this.updateId === 'close') {
this.closeDialog()
} else {
this.$axios.put('/manage/config/' + this.updateId, configDTO)
.then(response => {
if (response.status === 200) {
vm.search(vm.key)
vm.filter = vm.key
this.closeDialog()
this.$notify.success('Update success')
}
})
}
} else {
this.$axios.post('/manage/config/', configDTO)
.then(response => {
if (response.status === 201) {
vm.search(vm.key)
vm.filter = vm.key
vm.closeDialog()
vm.$notify.success('Create success')
}
})
}
},
getColor (scope) {
if (scope === 'global') {
return 'red'
}
if (scope === 'application') {
return 'green'
}
if (scope === 'service') {
return 'blue'
}
},
submit () {
if (!this.filter) {
this.$notify.error('application is needed')
return
}
this.filter = this.filter.trim()
this.search()
},
search () {
this.$axios.get('/manage/config/' + this.filter)
.then(response => {
if (response.status === 200) {
this.dubboConfig = response.data
this.$router.push({path: 'management', query: {key: this.filter}})
}
})
}
},
mounted () {
this.setHeaders()
let query = this.$route.query
let filter = null
Object.keys(query).forEach(function (key) {
if (key === 'key') {
filter = query[key]
}
})
if (filter !== null) {
this.filter = filter
} else {
this.filter = 'global'
}
this.search()
}
}
</script>
<style scoped>
</style>