You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

218 lines
6.5 KiB

<!-- @format -->
<template>
<div>
<page-title :title="editId ? '编辑磁盘' : '创建磁盘'" />
<a-page-header>
<template #extra>
<ns-button @click="navigateBack()">返回</ns-button>
<ns-button type="primary" @click="submit" :disabled="!mainRef?.validateResult">保存</ns-button>
</template>
</a-page-header>
<ns-form
style="margin-top: 30px; margin-left: 24px"
ref="mainRef"
formLayout="修改"
:schemas="formSchema"
:model="data"
v-bind="$attrs" />
</div>
</template>
<script lang="ts">
import { defineComponent, ref, watch, computed, inject } from 'vue';
import { authorizationService } from '/nerv-base/store/modules/authorization-service';
import { NsMessage } from '/nerv-lib/component/message';
import { http } from '/nerv-lib/util/http';
import { useRouter } from 'vue-router';
export default defineComponent({
name: 'AppAdd',
setup() {
const mainRef = ref();
const formLayout = 'ns-vertical-form';
const router = useRouter();
const data = ref({});
const event = inject('event');
const submitData = ref();
const navigateBack = (type?: string) => {
const msg = {
type: type || 'back'
}
event.value.source.postMessage(msg, event.value.origin);
};
const onEventData = inject('onEventData')
const eventData = computed(function () {
return onEventData();
})
const params = router.currentRoute.value.params;
if (params.id) {
http.get(`/api/iaas/iaas/objs/RA/Volume/${params.id}`).then((res) => {
initRes.value = res;
data.value.ID = res.ID;
data.value.description = res.description;
data.value.name = res.name;
data.value.projectName = res.projectName;
});
}
const initRes = ref({});
const errorItem = ref({});
function submit() {
mainRef.value
.triggerSubmit()
.then((data) => {
submitData.value = data
let objData = {
alias: data['name'],
projectID: data['projectID'],
projectName: data['projectName'],
}
// saveData(submitData.value)
event.value.source.postMessage({type:'getId', data: objData}, event.value.origin);
})
.catch(() => ({}));
}
function saveData(data){
initRes.value.alias = data.name;
initRes.value.RM_UUID = data.RM_UUID;
initRes.value.projectID = data.projectID;
initRes.value.projectName = data.projectName;
http.post('/api/nerv-mock-ra/objs/Resources/Create', initRes.value).then(
(res) => {
NsMessage.success('操作成功', 1, () => {
navigateBack('successBack')
});
},
(error) => {
if (error?.response?.data?.fieldErrors) {
errorItem.value = error?.response?.data?.fieldErrors;
mainRef.value.triggerSubmit(['name']);
}
// 删除RM_UUID
let objData = {
RM_UUID: data['RM_UUID'],
}
event.value.source.postMessage({type:'removeId', data: objData}, event.value.origin);
},
);
}
let formSchema = ref([
{
label: '项目',
field: 'projectID',
addModel: {
projectName: 'projectname',
},
ifShow: params.id ? false : true,
viewOnly: params.id ? true : false,
component: 'NsSelectApi',
componentProps: {
api: {
url: '/api/passport/passport/objs/Authorization/CheckAuthorization',
method: 'POST',
},
autoSelectFirst: params.id ? false : true,
showSearch: true,
filterOption: (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0;
},
filterData: (item) => {
return authorizationService().checkPermission(
'vdisk',
'Volume',
'add',
item.projectname,
);
},
resultField: 'projects',
labelField: 'projectname',
valueField: 'projectid',
immediate: true,
placeholder: '请选择项目',
},
rules: params.id
? []
: [
{
type: 'number',
required: true,
message: '项目必填',
trigger: 'blur',
},
],
},
{
field: 'name',
label: '磁盘名称',
component: 'NsInput',
componentProps: {
placeholder: '请输入',
},
rules: [
{
required: true,
message: '磁盘名称必填',
trigger: 'blur',
},
{
trigger: 'blur',
validator: async (rule, value) => {
if (Object.keys(errorItem.value).indexOf('name') !== -1) {
const errorInfo = errorItem.value['name'];
delete errorItem.value['name'];
return Promise.reject(errorInfo);
}
},
},
{
pattern: '^[a-zA-Z0-9][a-zA-Z0-9_-]{5,31}$',
message:
'只能包含字母,数字,短横线(-)和下划线(_),且必须由大写字母、小写字母或数字开头。长度在6-32字符之间。',
trigger: 'blur',
},
],
},
]);
return {
errorItem,
navigateBack,
editId: null,
data,
mainRef,
submit,
formSchema,
formLayout,
event,
submitData,
saveData,
eventData,
};
},
watch: {
eventData: function (eventData) {
const data = this.event?.data;
if (data.type === 'returnId' && data.data) {
this.submitData['RM_UUID'] = data.data['RM_UUID'];
this.saveData(this.submitData);
}
}
},
beforeCreate() {},
});
</script>
<style lang="less" scoped>
.ant-col {
flex: 0 0 120px !important;
}
.ant-page-header {
padding: 0 24px;
margin-bottom: 15px;
}
:deep(.ant-page-header-heading-extra) {
margin-right: auto !important;
margin-left: 0;
}
</style>