blob: 170877412a32584885cb5adb61055a0cc5819b8b [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 lg12>
<breadcrumb title="serviceMock" :items="breads"></breadcrumb>
</v-flex>
<v-flex lg12>
<v-card flat color="transparent">
<v-card-text>
<v-form>
<v-layout row wrap>
<v-combobox
id="mockRule"
:loading="searchLoading"
:search-input.sync="input"
v-model="filter"
flat
append-icon=""
hide-no-data
:hint="$t('testModule.searchServiceHint')"
:label="$t('placeholders.searchService')"
@update:searchInput="updateFilter"
@keyup.enter="submitSearch"
></v-combobox>
<v-btn @click="submitSearch" color="primary" large>{{ $t('search') }}</v-btn>
</v-layout>
</v-form>
</v-card-text>
</v-card>
</v-flex>
<v-flex xs12>
<v-card>
<v-toolbar flat color="transparent" class="elevation-0">
<v-toolbar-title><span class="headline">{{$t('ruleList')}}</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="mockRules"
:pagination.sync="pagination"
:total-items="totalItems"
:loading="loadingRules"
class="elevation-1">
<template slot="items" slot-scope="props">
<td>{{ props.item.serviceName }}</td>
<td>
<v-chip label>{{ props.item.methodName }}</v-chip>
</td>
<td>{{ props.item.rule }}
</td>
<td>
<v-switch v-model="props.item.enable" inset @change="enableOrDisableMockRule(props.item)"></v-switch>
</td>
<td>
<v-btn class="tiny" color="primary" @click="editMockRule(props.item)"> {{$t('edit')}} </v-btn>
<v-btn class="tiny" color="error" @click="openDeleteDialog(props.item)"> {{$t('delete')}} </v-btn>
</td>
</template>
</v-data-table>
</v-card-text>
</v-card>
</v-flex>
</v-layout>
<v-dialog v-model="dialog" width="800px" persistent>
<v-card>
<v-card-title class="justify-center">
<span class="headline">{{dialogType === 1 ? $t('createMockRule') : $t('editMockRule')}}</span>
</v-card-title>
<v-card-text >
<v-text-field
:label="$t('serviceName')"
:hint="$t('dataIdClassHint')"
v-model="mockRule.serviceName"
></v-text-field>
<v-text-field
:label="$t('methodName')"
:hint="$t('methodNameHint')"
v-model="mockRule.methodName"
></v-text-field>
<v-subheader class="pa-0 mt-3">{{$t('ruleContent')}}</v-subheader>
<ace-editor v-model="mockRule.rule"></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="saveOrUpdateMockRule">{{$t('save')}}</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
<v-dialog v-model="warnDialog" persistent max-width="500px">
<v-card>
<v-card-title class="headline">{{$t('deleteRuleTitle')}}</v-card-title>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="darken-1" flat @click.native="closeDeleteDialog">{{$t('cancel')}}</v-btn>
<v-btn color="primary darken-1" depressed @click.native="deleteMockRule">{{$t('confirm')}}</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-container>
</template>
<script>
import JsonEditor from '@/components/public/JsonEditor'
import Search from '@/components/public/Search'
import Breadcrumb from '@/components/public/Breadcrumb'
import yaml from 'js-yaml'
import AceEditor from '@/components/public/AceEditor'
export default {
name: 'ServiceMock',
components: {
JsonEditor,
Search,
Breadcrumb,
yaml,
AceEditor
},
data() {
return {
headers: [],
mockRules: [],
breads: [
{
text: 'mockRule',
href: '/mock'
}
],
pagination: {
page: 1,
rowsPerPage: 10 // -1 for All
},
loadingRules: false,
searchLoading: false,
filter: null,
totalItems: 0,
dialog: false,
mockRule: {
serviceName: '',
methodName: '',
rule: '',
enable: true
},
dialogType: 1,
warnDialog: false,
deleteRule: null
}
},
methods: {
setHeaders() {
this.headers = [
{
text: this.$t('serviceName'),
value: 'serviceName',
sortable: false
},
{
text: this.$t('methodName'),
value: 'methodName',
sortable: false
},
{
text: this.$t('mockData'),
value: 'rule',
sortable: false
},
{
text: this.$t('enabled'),
value: 'enable',
sortable: false
},
{
text: this.$t('operation'),
value: 'operation',
sortable: false
}
]
},
listMockRules(filter) {
const page = this.pagination.page - 1;
const size = this.pagination.rowsPerPage === -1 ? this.totalItems : this.pagination.rowsPerPage;
this.loadingRules = true;
this.$axios.get('/mock/rule/list', {
params: {
page,
size,
filter
}
}).then(res => {
this.mockRules = res.data.content;
this.totalItems = res.data.totalElements
}).catch(e => {
this.showSnackbar('error', e.response.data.message)
}).finally(() => this.loadingRules = false)
},
submitSearch() {
this.listMockRules(this.filter)
},
openDialog() {
this.dialog = true
},
closeDialog() {
this.dialog = false;
this.dialogType = 1;
this.mockRule = {
serviceName: '',
methodName: '',
rule: '',
enable: true
}
},
saveOrUpdateMockRule() {
this.$axios.post("/mock/rule", this.mockRule).then(res => {
this.$notify(this.$t('saveRuleSuccess'), 'success');
this.closeDialog();
this.listMockRules()
}).catch(e => this.showSnackbar('error', e.response.data.message))
},
deleteMockRule() {
const id = this.deleteRule.id
this.$axios.delete('/mock/rule', {
data: {id}}
).then(res => {
this.$notify(this.$t('deleteRuleSuccess'), 'success');
this.closeDeleteDialog()
this.listMockRules(this.filter)
})
.catch(e => this.$notify(e.response.data.message, 'error'))
},
editMockRule(mockRule) {
this.mockRule = mockRule;
this.openDialog();
this.dialogType = 2
},
enableOrDisableMockRule(mockRule) {
this.$axios.post('/mock/rule', mockRule)
.then(res => this.$notify(mockRule.enable ? this.$t('enableRuleSuccess') : this.$t('disableRuleSuccess'), 'success'))
.catch(e => this.$notify(e.data.response.message, 'error'))
},
updateFilter() {
this.filter = document.querySelector('#mockRule').value.trim();
},
closeDeleteDialog() {
this.warnDialog = false
this.deleteRule = null
},
openDeleteDialog(rule) {
this.warnDialog = true
this.deleteRule = rule
}
},
mounted() {
this.setHeaders();
this.listMockRules(this.filter);
},
computed: {
area () {
return this.$i18n.locale
}
},
watch: {
input (val) {
this.querySelections(val)
},
area () {
this.setHeaders()
},
pagination: {
handler (newVal, oldVal) {
if (newVal.page === oldVal.page && newVal.rowsPerPage === oldVal.rowsPerPage) {
return
}
const filter = this.filter;
this.listMockRules(filter)
},
deep: true
}
}
}
</script>
<style scoped>
.tiny {
min-width: 30px;
height: 20px;
font-size: 8px;
}
.tiny-icon {
font-size: 18px;
}
</style>