blob: 701a781c031b16b21ef657536f0b333d97a55833 [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>
<div class="tenantManagement">
<Spin
v-if="loading"
size="large"
fix/>
<Row class="search-bar">
<Col span="4" class="search-item">
<span :style="{minWidth: '40px', textOverflow: 'ellipsis', whiteSpace: 'nowrap', overflow: 'hidden', marginRight: '5px', fontSize: '14px', lineHeight: '32px'}" :title="$t('message.linkis.ipListManagement.userName')">{{$t('message.linkis.ipListManagement.userName')}}</span>
<Input
v-model="queryData.user"
class="input"
clearable
:placeholder="$t('message.linkis.ipListManagement.inputUser')"
@on-enter="search"
></Input>
</Col>
<Col span="4" class="search-item">
<span :style="{minWidth: '40px', textOverflow: 'ellipsis', whiteSpace: 'nowrap', overflow: 'hidden', marginRight: '5px', fontSize: '14px', lineHeight: '32px'}" :title="$t('message.linkis.ipListManagement.appName')">{{$t('message.linkis.ipListManagement.appName')}}</span>
<Input
v-model="queryData.creator"
class="input"
clearable
:placeholder="$t('message.linkis.ipListManagement.inputApp')"
@on-enter="search"
></Input>
</Col>
<Col span="4" class="search-item">
<span :style="{minWidth: '60px', textOverflow: 'ellipsis', whiteSpace: 'nowrap', overflow: 'hidden', marginRight: '5px', fontSize: '14px', lineHeight: '32px'}" :title="$t('message.linkis.formItems.engineType')">{{$t('message.linkis.formItems.engineType')}}</span>
<Select v-model="queryData.engineType" filterable clearable style="width: calc(100% - 85px);">
<Option v-for="item in engineTypeOptions" :value="item.value" :key="item.value" :label="item.label"/>
</Select>
</Col>
<Col span="4" class="search-item">
<span :style="{minWidth: '40px', textOverflow: 'ellipsis', whiteSpace: 'nowrap', overflow: 'hidden', marginRight: '5px', fontSize: '14px', lineHeight: '32px'}" :title="$t('message.linkis.userConfig.configVKey')" >{{$t('message.linkis.userConfig.configVKey')}}</span>
<Input
v-model="queryData.key"
class="input"
clearable
:placeholder="$t('message.linkis.userConfig.configValuePro')"
@on-enter="search"
></Input>
</Col>
<Col span="8">
<Button type="primary" class="button" :style="{width: '70px', marginRight: '5px', marginLeft: '5px', padding: '5px'}" @click="search">{{
$t('message.linkis.ipListManagement.search')
}}</Button>
<Button type="warning" class="button" :style="{width: '70px', marginRight: '5px', marginLeft: '5px', padding: '5px'}" @click="clearSearch">{{
$t('message.linkis.ipListManagement.clear')
}}</Button>
<Button type="success" class="button" :style="{width: '70px', marginRight: '5px', marginLeft: '5px', padding: '5px'}" @click="createTenant">{{
$t('message.linkis.ipListManagement.create')
}}</Button>
</Col>
</Row>
<Table
border
size="small"
align="center"
:columns="tableColumns"
:data="datalist"
:loading="tableLoading"
class="table-content data-source-table">
</Table>
<Page
:page-size="page.pageSize"
:current="page.pageNow"
:total="page.totalPage"
show-total
@on-change="changePage"
size="small"
show-elevator
:prev-text="$t('message.linkis.previousPage')" :next-text="$t('message.linkis.nextPage')"
style="position: absoulute; bottom: 10px; overflow: hidden; text-align: center;"
></Page>
<Modal
v-model="showCreateModal"
class="modal"
@on-cancel="cancel">
<div class="form">
<Form ref="createTenantForm" :model="modalData" label-position="left" :label-width="100" :rules="modalDataRule">
<FormItem :label="$t('message.linkis.ipListManagement.userName')" prop="user">
<Input class="input" v-model="modalData.user" :disabled="isEdit" clearable style="width: 319px" :placeholder="$t('message.linkis.ipListManagement.inputUser')"></Input>
</FormItem>
<FormItem :label="$t('message.linkis.ipListManagement.appName')" prop="creator">
<Input class="input" v-model="modalData.creator" :disabled="isEdit" clearable style="width: 319px" :placeholder="$t('message.linkis.ipListManagement.inputApp')"></Input>
</FormItem>
<FormItem :label="$t('message.linkis.formItems.engineType')" prop="engineType">
<Select v-model="modalData.engineType" clearable :disabled="isEdit" filterable @on-change="changeEngineType" style="width: 319px;">
<Option v-for="item in allEngineTypeOptions" :value="item.value" :key="item.value" :label="item.label"/>
</Select>
</FormItem>
<FormItem :label="$t('message.linkis.EnginePluginManagement.engineConnVersion')" prop="version">
<Select v-model="modalData.version" :disabled="noVersionSelectConfig || isEdit" filterable clearable @on-open-change="fetchVersionOption" @on-change="changFormVal" style="width: 319px;">
<Option v-for="item in versionOption" :value="item.value" :key="item.value" >{{item.label}}</Option>
</Select>
</FormItem>
<FormItem :label="$t('message.linkis.userConfig.configVKey')" prop="configKey">
<Select v-model="modalData.configKey" :disabled="noSelectConfig || isEdit" filterable clearable @on-open-change="fetchConfigOption" @on-select="onSelect" style="width: 319px;">
<Option v-for="item in configOption" :key="item.value" :value="item.value" >{{item.label}}</Option>
</Select>
</FormItem>
<FormItem :label="$t('message.linkis.userConfig.configValue')" :rules="{required: !!defaultValue , message: $t('message.linkis.ipListManagement.notEmpty'), trigger: 'blur'}" prop="configValue">
<Input class="input" v-model="modalData.configValue" clearable style="width: 319px" :placeholder="$t('message.linkis.userConfig.configValuePro')"></Input>
</FormItem>
</Form>
</div>
<div slot="footer">
<Button @click="cancel">{{$t('message.linkis.ipListManagement.Cancel')}}</Button>
<Button type="primary" :disabled="btnDisabled" @click="addUserConfig" :loading="isRequesting">{{$t('message.common.ok')}}</Button>
</div>
</Modal>
</div>
</template>
<script>
import storage from "@/common/helper/storage";
import api from '@/common/service/api'
export default {
name: 'userConfig',
data() {
return {
loading: false,
queryData: {
user: '',
creator: '',
engineType: '',
key: ''
},
confirmQuery: {
user: '',
creator: '',
engineType: '',
key: ''
},
tableColumns: [
{
title: this.$t('message.linkis.ipListManagement.userName'),
key: 'user',
width: 150,
tooltip: true,
align: 'center',
},
{
title: this.$t('message.linkis.ipListManagement.appName'),
key: 'creator',
width: 140,
tooltip: true,
align: 'center',
},
{
title: this.$t('message.linkis.formItems.engineType'),
key: 'engineType',
width: 110,
tooltip: true,
align: 'center',
},
{
title: this.$t('message.linkis.EnginePluginManagement.engineConnVersion'),
key: 'version',
width: 130,
tooltip: true,
align: 'center',
},
{
title: this.$t('message.linkis.userConfig.configVKey'),
key: 'key',
width: 260,
tooltip: true,
align: 'center',
},
{
title: this.$t('message.linkis.userConfig.keyName'),
key: 'name',
width: 260,
tooltip: true,
align: 'center',
},
{
title: this.$t('message.linkis.userConfig.defaultValue'),
key: 'defaultValue',
width: 240,
tooltip: true,
align: 'center',
},
{
title: this.$t('message.linkis.userConfig.configValue'),
key: 'configValue',
width: 240,
tooltip: true,
align: 'center',
},
{
title: this.$t('message.linkis.ipListManagement.action'),
key: 'action',
width: 100,
align: 'center',
render: (h, params) => {
return h('div', [
h('Button', {
props: {
type: 'primary',
size: 'small'
},
style: {
marginRight: '5px'
},
on: {
click: () => {
this.edit(params.row)
}
}
}, this.$t('message.linkis.ipListManagement.edit'))
]);
}
}
],
datalist: [],
tableLoading: false,
showCreateModal: false,
modalData: {
user: '',
creator: '',
engineType: '',
version: '',
configKey: '',
configValue: ''
},
modalDataRule: {
user: [
{required: true, message: this.$t('message.linkis.ipListManagement.notEmpty'), trigger: 'blur'},
{pattern: /^[0-9a-zA-Z_\*]+$/, message: this.$t('message.linkis.ipListManagement.contentError'), type: 'string'}
],
creator: [
{required: true, message: this.$t('message.linkis.ipListManagement.notEmpty'), trigger: 'blur'},
{pattern: /^[0-9a-zA-Z_*]+$/, message: this.$t('message.linkis.ipListManagement.contentError'), type: 'string'}
],
engineType: [
{required: true, message: this.$t('message.linkis.ipListManagement.notEmpty'), trigger: 'blur'}
],
version: [
{required: true, message: this.$t('message.linkis.ipListManagement.notEmpty'), trigger: 'blur'}
],
configKey: [
{required: true, message: this.$t('message.linkis.tenantTagManagement.notEmpty'), trigger: 'blur'}
]
},
btnDisabled: false,
mode: 'create',
page: {
pageSize: 10,
pageNow: 1,
totalPage: 0,
},
userName: '',
isRequesting: false,
engineTypeOptions: [],
allEngineTypeOptions: [],
configOption: [],
versionOption: [],
defaultValue: '',
}
},
computed: {
isEdit () {
return this.mode === 'edit'
},
noVersionSelectConfig () {
return !(this.modalData.engineType) || this.isEdit;
},
noSelectConfig () {
const valid = !(this.modalData.user && this.modalData.creator && this.modalData.engineType && this.modalData.version)
!valid && this.changFormVal();
return valid;
}
},
methods: {
async getTableData() {
try {
this.tableLoading = true;
let params = {};
const keys = Object.keys(this.confirmQuery);
for (let i = 0; i< keys.length; i++) {
if(this.confirmQuery[keys[i]]) {
params[[keys[i]]] = this.confirmQuery[keys[i]];
}
}
params.pageNow = this.page.pageNow;
params.pageSize = this.page.pageSize;
const res = await api.fetch("/configuration/userKeyValue", params, "get")
this.datalist = res.configValueList.map((item) => {
const labelValue = item.labelValue;
const baseArr = labelValue.split(',');
const userArr = baseArr[0].split('-');
const engineArr = baseArr[1].split('-');
item.user = userArr[0];
item.creator = userArr[1];
item.engineType = engineArr[0];
item.version = engineArr[1];
return item;
});
this.page.totalPage = res.totalPage;
this.tableLoading = false;
} catch(err) {
this.tableLoading = false;
}
},
async getEngineOptionsData() {
try {
api.fetch("/configuration/engineType", {}, "get")
.then((res) => {
res.engineType = res.engineType.map((item) => {
return {label: item, value: item};
});
this.engineTypeOptions = [...res.engineType];
this.allEngineTypeOptions = [...res.engineType];
this.allEngineTypeOptions.unshift({label: this.$t('message.linkis.all'),value: '*'});
})
} catch(err) {
return;
}
},
async init() {
this.loading = true;
await this.getTableData();
this.loading = false;
},
async clearSearch() {
this.queryData = {
user: '',
creator: ''
};
this.confirmQuery = {
user: '',
creator: ''
}
this.page.pageNow = 1;
await this.getTableData()
},
async createTenant () {
this.showCreateModal = true;
this.mode = 'create';
},
cancel() {
this.showCreateModal = false;
this.modalData = {
user: '',
creator: '',
engineType: '',
version: '',
configKey: '',
configValue: ''
}
this.configOption = [];
this.versionOption = [];
},
addUserConfig() {
if(this.isRequesting) return;
const target = '/configuration/keyvalue'
this.$refs.createTenantForm.validate(async (valid) => {
if(valid) {
this.clearSearch();
try {
if(this.mode !== 'edit') {
this.page.pageNow = 1;
}
this.isRequesting = true
await api.fetch(target, this.modalData, "post")
await this.getTableData();
this.cancel();
this.$Message.success(this.$t('message.linkis.udf.success'));
this.isRequesting = false
} catch(err) {
this.isRequesting = false
}
} else {
this.$Message.error(this.$t('message.linkis.error.validate'));
}
})
},
edit(data) {
const {
user, creator, engineType, version, key, configValue, defaultValue
} = data;
this.configOption.push({value: key, label: key});
this.defaultValue = defaultValue
this.modalData = {
user, creator, engineType, version, configKey: key, configValue,
};
this.versionOption = [{label: version, value: version}];
this.showCreateModal = true;
this.mode = 'edit';
},
ipListValidator(rule, val, cb) {
if (!val) {
cb(new Error(this.$t('message.linkis.ipListManagement.notEmpty')));
}
if(val === '*') {
cb();
}
const ipArr = val.split(',');
ipArr.forEach(ip => {
if(!/^((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])$/.test(ip)) {
cb(new Error(this.$t('message.linkis.ipListManagement.ipContentError')));
}
})
cb();
},
async changePage(val) {
this.page.pageNow = val;
await this.getTableData();
},
async search() {
const { user, creator, engineType, key } = this.queryData;
this.confirmQuery = { user, creator, engineType, key };
this.page.pageNow = 1;
await this.getTableData()
},
changeEngineType(val) {
if (val === '*') {
this.modalData.version = "*";
this.versionOption = [{label: this.$t('message.linkis.all'),value: '*'}];
} else {
this.modalData.version = "";
this.versionOption = [];
}
this.modalData.configKey = '';
},
fetchVersionOption(val) {
if (!val || this.isEdit) return;
api.fetch(`/engineplugin/getTypeVersionList/${this.modalData.engineType}`, {}, 'get').then((res) => {
let keyArr = [];
res.queryList.forEach((item) => {
if (!keyArr.includes(item)) {
keyArr.push({label: item, value: item});
}
});
if (this.modalData.version === "*") {
keyArr.unshift({label: this.$t('message.linkis.all'),value: '*'});
}
this.versionOption = keyArr;
})
},
changFormVal() {
if (this.isEdit) return;
this.modalData.configKey = '';
},
fetchConfigOption(val) {
if (!val || this.isEdit) return;
const {user, creator, engineType, version} = this.modalData;
api.fetch('/configuration/getItemList', {user, creator, engineType, version, pageSize: 10000}, 'get').then((res) => {
let keyArr = [];
res.itemList.forEach((item) => {
if (!keyArr.includes(item.key)) {
keyArr.push({label: item.key, value: item.key, defaultValue: item.defaultValue});
}
});
this.configOption = keyArr;
})
},
onSelect(val) {
this.defaultValue = this.configOption.find((item) => {
return item.value === val
})?.defaultValue
}
},
created() {
this.userName = storage.get('userName') || storage.get('baseInfo', 'local').username || '';
this.init();
this.getEngineOptionsData();
}
};
</script>
<style lang="scss" src="./index.scss" scoped></style>
<style lang="scss" scoped>
.modal {
.input-area {
padding: 20px 50px;
.item {
display: flex;
margin-bottom: 10px;
.input {
width: calc(100% - 66px);
}
}
}
}
.search-bar .ivu-input-wrapper {
width: calc(100% - 75px);
}
</style>
<style lang="scss">
.ivu-tooltip-popper {
.ivu-tooltip-content {
.ivu-tooltip-inner-with-width {
word-wrap: break-word;
}
}
}
</style>