blob: 88c320d506f319e34e467e32aa73b2240893faf5 [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="new-storage-container">
<p>{{ $t('storagePage.alias') }}:{{ alias }}</p>
<el-form ref="formRef" :model="form" :rules="rules" class="source-form" label-position="top">
<el-form-item :label="$t('storagePage.groupName')" prop="groupName" class="form-input-item require-style">
<el-input :disabled="router.currentRoute.value.params.groupname" v-model="form.groupName" :placeholder="$t('storagePage.groupNamePlaceholder')">
<template #prepend>root.</template>
</el-input>
</el-form-item>
<el-form-item :label="$t('storagePage.groupDescription')" prop="description" class="form-input-item">
<el-input v-model="form.description"></el-input>
</el-form-item>
<el-form-item :label="$t('storagePage.ttl')" class="form-input-item" prop="ttl">
<el-input v-model="form.ttl" min="0" max="9007199254740992" class="ttl-input"></el-input>
<el-select v-model="form.ttiUnit" class="ttl-input unit" clearable placeholder=" ">
<el-option :label="$t('storagePage.millsSecondLabel')" value="millisecond"> </el-option>
<el-option :label="$t('storagePage.secondLabel')" value="second"> </el-option>
<el-option :label="$t('storagePage.minuteLabel')" value="minute"> </el-option>
<el-option :label="$t('storagePage.hourLabel')" value="hour"> </el-option>
<el-option :label="$t('storagePage.dayLabel')" value="day"> </el-option>
<el-option :label="$t('storagePage.weekLabel')" value="week"> </el-option>
<el-option :label="$t('storagePage.monthLabel')" value="month"> </el-option>
<el-option :label="$t('storagePage.yearLabel')" value="year"> </el-option>
</el-select>
<i class="tips">{{ $t('storagePage.tips') }}</i>
</el-form-item>
</el-form>
<div class="submit-btns">
<el-button @click="cancel()">{{ $t('common.cancel') }}</el-button>
<el-button type="primary" @click="submit()">{{ $t('common.submit') }}</el-button>
</div>
</div>
</template>
<script>
// @ is an alias to /src
import { onMounted, ref, reactive, onActivated } from 'vue';
import { ElForm, ElFormItem, ElInput, ElSelect, ElOption, ElButton, ElMessage } from 'element-plus';
import { useI18n } from 'vue-i18n';
import { useRouter, useRoute } from 'vue-router';
import axios from '@/util/axios.js';
export default {
name: 'NewStorages',
props: ['func', 'data'],
setup(props) {
const { t } = useI18n();
const router = useRouter();
const route = useRoute();
let formRef = ref(null);
let alias = ref(null);
const rules = reactive({
groupName: [
{
required: true,
message: () => {
return t(`storagePage.groupNamePlaceholder`);
},
trigger: 'blur',
},
{
pattern: /^(["'a-zA-Z0-9_\u4e00-\u9fa5]*)$/,
message: () => {
return t(`sourcePage.newUserErrorTip`);
},
trigger: 'blur',
},
{
min: 0,
max: 255,
message: () => {
return t(`storagePage.groupNameLengthTips`);
},
trigger: 'blur',
},
],
description: [
{
required: false,
min: 0,
max: 100,
message: () => {
return t(`storagePage.descriptionLengthTips`);
},
trigger: 'blur',
},
],
ttl: [
{
required: false,
pattern: /^[1-9]\d*$/,
message: () => {
return t(`sourcePage.ttlErrorTips`);
},
trigger: 'blur',
},
],
});
let form = reactive({
groupName: '',
description: '',
ttl: '',
ttiUnit: '',
});
/**
* cancel new storage
*/
const cancel = () => {
props.func.removeTab(props.data.id);
// props.func.addTab(router.currentRoute.value.params.serverid + 'connection');
};
/**
* get storage detail
* serverid: connect id
* groupname:storage name
*/
const getGroupDetail = () => {
axios.get(`/servers/${router.currentRoute.value.params.serverid}/storageGroups/${router.currentRoute.value.params.groupname}`, {}).then((res) => {
if (res && res.code == 0) {
form.groupName = res.data.groupName.split('').splice(5).join('');
form.ttl = res.data.ttl;
form.ttiUnit = res.data.ttiUnit;
form.description = res.data.description;
alias.value = res.data.alias;
}
});
};
/**
* new/edit storage
*/
const submit = () => {
formRef.value.validate((valid) => {
if (valid) {
if (form.ttl && form.ttl > 9007199254740992) {
ElMessage.error(t('sourcePage.maxErrorTips'));
return false;
}
if ((form.ttl && !form.ttiUnit) || (!form.ttl && form.ttiUnit)) {
ElMessage.error(t('storagePage.ttlErrTips'));
return false;
}
const reqObj = {
groupName: 'root.' + form.groupName,
description: form.description,
ttl: form.ttl == '' || form.ttl == null ? null : +form.ttl,
ttlUnit: form.ttiUnit || null,
};
axios.post(`/servers/${router.currentRoute.value.params.serverid}/storageGroups`, { ...reqObj }).then((res) => {
if (res && res.code == 0) {
ElMessage.success(t('sourcePage.newGroupSuccessLabel'));
props.func.removeTab(props.data.id);
props.func.updateTreeByIds([props.data.id]);
props.func.expandByIds([props.data.id]);
props.func.addTab(router.currentRoute.value.params.serverid + 'connectionroot.' + form.groupName + 'storageGroup');
}
});
}
});
};
/**
* get souce alisa
*/
const getServerName = () => {
axios.get(`/servers/${router.currentRoute.value.params.serverid}`, {}).then((res) => {
if (res && res.code == 0) {
alias.value = res.data.alias;
}
});
};
onMounted(() => {
if (router.currentRoute.value.params.groupname) {
getGroupDetail();
} else {
getServerName();
}
});
onActivated(() => {
if (route.params.forceupdate) {
form.groupName = null;
form.ttl = null;
form.ttiUnit = null;
form.description = null;
}
});
return {
// t,
formRef,
rules,
form,
submit,
cancel,
alias,
router,
};
},
components: {
ElForm,
ElFormItem,
ElInput,
ElSelect,
ElOption,
ElButton,
},
};
</script>
<style scoped lang="scss">
.new-storage-container {
text-align: left;
padding: 20px;
.el-form {
margin-top: 20px;
.form-input-item {
width: 450px;
}
.require-style {
// margin-left: -11px;
}
.ttl-input {
display: inline-block;
width: 310px;
}
.unit {
width: 130px;
margin-left: 10px;
}
.tips {
color: rgba(34, 34, 34, 0.4);
font-size: 12px;
position: absolute;
top: 46px;
left: 0;
}
}
.submit-btns {
text-align: center;
margin-top: 35px;
.el-button {
width: 110px;
// padding-left: 0 !important;
}
}
}
</style>