gtsoft-snail-job-admin/src/views/group/modules/group-operate-drawer.vue

254 lines
7.8 KiB
Vue
Raw Normal View History

2024-04-17 23:48:25 +08:00
<script setup lang="ts">
import { computed, reactive, ref, watch } from 'vue';
2024-04-17 23:48:25 +08:00
import { useFormRules, useNaiveForm } from '@/hooks/common/form';
import { $t } from '@/locales';
2024-04-20 16:34:30 +08:00
import { translateOptions, translateOptions2 } from '@/utils/common';
import { groupConfigIdModeOptions, groupConfigStatusOptions, groupConfigYesOrNoOptions } from '@/constants/business';
2024-04-23 23:33:00 +08:00
import { fetchAddGroupConfig, fetchEditGroupConfig, fetchGetPartitionTableList } from '@/service/api/group';
2024-04-17 23:48:25 +08:00
defineOptions({
name: 'GroupOperateDrawer'
2024-04-17 23:48:25 +08:00
});
interface Props {
/** the type of operation */
operateType: NaiveUI.TableOperateType;
/** the edit row data */
rowData?: Api.GroupConfig.GroupConfig | null;
}
const props = defineProps<Props>();
interface Emits {
(e: 'submitted'): void;
}
const emit = defineEmits<Emits>();
const visible = defineModel<boolean>('visible', {
default: false
});
const { formRef, validate, restoreValidation } = useNaiveForm();
const { defaultRequiredRule } = useFormRules();
const title = computed(() => {
const titles: Record<NaiveUI.TableOperateType, string> = {
add: $t('page.groupConfig.addGroupConfig'),
edit: $t('page.groupConfig.editGroupConfig')
};
return titles[props.operateType];
});
2024-04-20 16:34:30 +08:00
const partitionList = ref<string[]>([]);
type Model = Pick<
Api.GroupConfig.GroupConfig,
'id' | 'groupName' | 'token' | 'groupStatus' | 'description' | 'idGeneratorMode' | 'initScene' | 'groupPartition'
>;
2024-04-17 23:48:25 +08:00
const model: Model = reactive(createDefaultModel());
function createDefaultModel(): Model {
return {
2024-04-20 16:34:30 +08:00
groupName: '',
token: generateToken(32),
groupStatus: 1,
description: '',
idGeneratorMode: 1,
initScene: 1,
groupPartition: 0
2024-04-17 23:48:25 +08:00
};
}
2024-04-20 16:34:30 +08:00
type RuleKey = Extract<
keyof Model,
'groupName' | 'token' | 'groupStatus' | 'idGeneratorMode' | 'initScene' | 'groupPartition'
>;
2024-04-17 23:48:25 +08:00
const rules: Record<RuleKey, App.Global.FormRule> = {
2024-04-20 16:34:30 +08:00
groupName: defaultRequiredRule,
token: defaultRequiredRule,
groupStatus: defaultRequiredRule,
idGeneratorMode: defaultRequiredRule,
initScene: defaultRequiredRule,
groupPartition: defaultRequiredRule
2024-04-17 23:48:25 +08:00
};
function handleUpdateModelWhenEdit() {
if (props.operateType === 'add') {
Object.assign(model, createDefaultModel());
return;
}
if (props.operateType === 'edit' && props.rowData) {
Object.assign(model, props.rowData);
}
}
function closeDrawer() {
visible.value = false;
}
async function handleSubmit() {
await validate();
// request
2024-04-20 16:34:30 +08:00
if (props.operateType === 'add') {
const { groupName, token, groupStatus, description, idGeneratorMode, initScene, groupPartition } = model;
const { error } = await fetchAddGroupConfig({
groupName,
token,
groupStatus,
description,
idGeneratorMode,
initScene,
groupPartition
});
if (error) return;
window.$message?.success($t('common.addSuccess'));
} else {
2024-04-23 23:33:00 +08:00
const { groupName, token, groupStatus, description, idGeneratorMode, initScene, groupPartition } = model;
2024-04-20 16:34:30 +08:00
const { error } = await fetchEditGroupConfig({
groupName,
token,
groupStatus,
description,
idGeneratorMode,
initScene,
groupPartition
});
if (error) return;
window.$message?.success($t('common.updateSuccess'));
}
2024-04-17 23:48:25 +08:00
closeDrawer();
emit('submitted');
}
2024-04-20 16:34:30 +08:00
/** 设置 token */
function setToken() {
model.token = generateToken(32);
}
/** 生成 token */
function generateToken(length: number) {
const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
let token = 'SJ_';
for (let i = 0; i < length; i += 1) {
const randomNumber = Math.floor(Math.random() * chars.length);
token += chars.substring(randomNumber, randomNumber + 1);
}
return token;
}
const getAllPartitions = async () => {
const { data } = await fetchGetPartitionTableList();
partitionList.value = data!.map(p => String(p));
};
2024-04-17 23:48:25 +08:00
watch(visible, () => {
if (visible.value) {
getAllPartitions(); // 因为drawer会keepaliveonMounted不能报账每次打开drawer会调用刷新
2024-04-17 23:48:25 +08:00
handleUpdateModelWhenEdit();
restoreValidation();
}
});
</script>
<template>
2024-04-18 14:49:49 +08:00
<OperateDrawer v-model="visible" :title="title" @submitted="handleSubmit">
2024-04-18 09:47:26 +08:00
<NForm ref="formRef" :model="model" :rules="rules">
2024-04-26 19:38:03 +08:00
<NCollapse :default-expanded-names="['1', '2']">
<NCollapseItem :title="$t('page.groupConfig.commonConfig')" name="1">
2024-04-26 19:38:03 +08:00
<NFormItem :label="$t('page.groupConfig.groupName')" path="groupName">
<NInput
v-model:value="model.groupName"
:maxlength="64"
show-count
:placeholder="$t('page.groupConfig.form.groupName')"
:disabled="props.operateType === 'edit'"
2024-04-20 16:34:30 +08:00
/>
2024-04-26 19:38:03 +08:00
</NFormItem>
<NFormItem :label="$t('page.groupConfig.groupStatus')" path="groupStatus">
<NRadioGroup v-model:value="model.groupStatus" name="groupStatus">
<NSpace>
<NRadio
v-for="item in groupConfigStatusOptions"
:key="item.value"
:value="item.value"
:label="$t(item.label)"
/>
</NSpace>
</NRadioGroup>
</NFormItem>
<NFormItem :label="$t('page.groupConfig.token')" path="token">
<NInputGroup>
<NInput
v-model:value="model.token"
:maxlength="64"
:placeholder="$t('page.groupConfig.form.token')"
:disabled="props.operateType === 'edit'"
/>
<NTooltip trigger="hover">
<template #trigger>
<NButton type="default" ghost :disabled="props.operateType === 'edit'" @click="setToken">
<icon-ic-round-refresh class="text-icon" />
</NButton>
</template>
{{ $t('page.groupConfig.generateToken') }}
</NTooltip>
</NInputGroup>
</NFormItem>
<NFormItem :label="$t('page.groupConfig.description')" path="description">
<NInput
v-model:value="model.description"
type="textarea"
:maxlength="256"
show-count
:placeholder="$t('page.groupConfig.form.description')"
clearable
round
2024-04-20 16:34:30 +08:00
/>
2024-04-26 19:38:03 +08:00
</NFormItem>
</NCollapseItem>
<NCollapseItem :title="$t('page.groupConfig.retryConfig')" name="2">
2024-04-26 19:38:03 +08:00
<NFormItem :label="$t('page.groupConfig.idGeneratorMode')" path="idGeneratorMode">
<NSelect
v-model:value="model.idGeneratorMode"
:placeholder="$t('page.groupConfig.form.idGeneratorMode')"
:options="translateOptions(groupConfigIdModeOptions)"
/>
</NFormItem>
<NFormItem :label="$t('page.groupConfig.initScene')" path="initScene">
<NRadioGroup v-model:value="model.initScene" name="initScene">
<NSpace>
<NRadio
v-for="item in groupConfigYesOrNoOptions"
:key="item.value"
:value="item.value"
:label="$t(item.label)"
/>
</NSpace>
</NRadioGroup>
</NFormItem>
<NFormItem :label="$t('page.groupConfig.groupPartition')" path="groupPartition">
<NSelect
v-model:value="model.groupPartition"
:placeholder="$t('page.groupConfig.form.groupPartition')"
:options="translateOptions2(partitionList)"
/>
</NFormItem>
</NCollapseItem>
</NCollapse>
2024-04-18 09:47:26 +08:00
</NForm>
2024-04-18 14:49:49 +08:00
<template #footer>
<NSpace :size="16">
<NButton @click="closeDrawer">{{ $t('common.cancel') }}</NButton>
<NButton type="primary" @click="handleSubmit">{{ $t('common.save') }}</NButton>
</NSpace>
</template>
2024-04-18 09:47:26 +08:00
</OperateDrawer>
2024-04-17 23:48:25 +08:00
</template>
<style scoped></style>