blob: e6ae4aa759ceee06a0b4be7657f89f85ee8d3628 [file] [log] [blame]
<!--
~ Licensed to 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. Apache Software Foundation (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.
-->
<script setup>
import { applyProperty } from '@/api';
import { reactive, ref } from 'vue';
import { getCurrentInstance } from '@vue/runtime-core';
import TagEditor from './TagEditor.vue';
import { ElMessage } from 'element-plus';
import { rules, strategyGroup, formConfig } from './data';
const $loadingCreate = getCurrentInstance().appContext.config.globalProperties.$loadingCreate;
const $loadingClose = getCurrentInstance().appContext.config.globalProperties.$loadingClose;
const showDialog = ref(false);
const title = ref('');
const tagEditorRef = ref();
const ruleForm = ref();
const formData = reactive({
strategy: strategyGroup[0].value,
group: '',
name: '',
modRevision: 0,
createRevision: 0,
id: '',
tags: [],
});
let promiseResolve;
const initData = () => {
formData.strategy = strategyGroup[0].value;
formData.group = '';
formData.name = '';
formData.modRevision = 0;
formData.createRevision = 0;
formData.id = '';
formData.tags = [];
};
const closeDialog = () => {
showDialog.value = false;
initData();
};
const openEditTag = (index) => {
tagEditorRef.value.openDialog(formData.tags[index]).then((res) => {
formData.tags[index].key = res.key;
formData.tags[index].value = res.value;
});
};
const deleteTag = (index) => {
formData.tags.splice(index, 1);
};
const openAddTag = () => {
tagEditorRef.value.openDialog().then((res) => {
formData.tags.push(res);
});
};
const confirmApply = async () => {
if (!ruleForm.value) return;
await ruleForm.value.validate((valid) => {
if (valid) {
$loadingCreate();
const param = {
strategy: formData.strategy,
property: {
id: formData.id,
metadata: {
createRevision: formData.createRevision,
group: formData.group,
modRevision: formData.modRevision,
name: formData.name,
},
tags: formData.tags.map((item) => {
return {
key: item.key,
value: JSON.parse(item.value),
};
}),
},
};
applyProperty(formData.group, formData.name, formData.id, param)
.then((res) => {
if (res.status === 200) {
ElMessage({
message: 'successed',
type: 'success',
duration: 5000,
});
showDialog.value = false;
promiseResolve();
}
})
.catch((err) => {
ElMessage({
message: 'Please refresh and try again. Error: ' + err,
type: 'error',
duration: 3000,
});
})
.finally(() => {
$loadingClose();
});
}
});
};
const openDialog = (edit, data) => {
showDialog.value = true;
if (edit === true) {
title.value = 'Edit Property';
} else {
title.value = 'Apply Property';
}
formData.group = data?.group || '';
formData.name = data?.name || '';
formData.modRevision = data?.modRevision || 0;
formData.createRevision = data?.createRevision || 0;
formData.id = data?.id || '';
formData.tags = JSON.parse(JSON.stringify(data?.tags || []));
return new Promise((resolve) => {
promiseResolve = resolve;
});
};
defineExpose({
openDialog,
});
</script>
<template>
<el-dialog v-model="showDialog" :title="title" width="50%">
<el-form ref="ruleForm" :rules="rules" :model="formData" label-position="left">
<el-form-item v-for="item in formConfig" :key="item.prop" :label="item.label" :prop="item.prop" label-width="200">
<el-select
v-if="item.type === 'select'"
v-model="formData[item.prop]"
placeholder="please select"
style="width: 100%"
>
<el-option
v-for="option in item.selectGroup"
:key="option.value"
:label="option.label"
:value="option.value"
></el-option>
</el-select>
<el-input
v-if="item.type === 'input'"
v-model="formData[item.prop]"
:disabled="item.disabled"
autocomplete="off"
></el-input>
<el-input-number v-if="item.type === 'number'" v-model="formData[item.prop]" :min="0"></el-input-number>
</el-form-item>
<el-form-item label="Tags" prop="tags" label-width="200">
<el-button size="small" type="primary" color="#6E38F7" @click="openAddTag">Add Tag</el-button>
<el-table style="margin-top: 10px" :data="formData.tags" border>
<el-table-column label="Key" prop="key"></el-table-column>
<el-table-column label="Value" prop="value"></el-table-column>
<el-table-column label="Operator" width="150">
<template #default="scope">
<el-button
link
type="primary"
@click.prevent="openEditTag(scope.$index)"
style="color: var(--color-main); font-weight: bold"
>Edit</el-button
>
<el-popconfirm @confirm="deleteTag(scope.$index)" title="Are you sure to delete this?">
<template #reference>
<el-button link type="danger" style="color: red; font-weight: bold">Delete</el-button>
</template>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer footer">
<el-button @click="closeDialog">Cancel</el-button>
<el-button type="primary" @click="confirmApply"> Confirm </el-button>
</span>
</template>
</el-dialog>
<TagEditor ref="tagEditorRef"></TagEditor>
</template>
<style lang="scss" scoped>
.footer {
width: 100%;
display: flex;
justify-content: center;
}
</style>