ruoyi-plus-soybean/docs/template/modules/operate-drawer.vue.vm

226 lines
7.3 KiB
Plaintext
Raw Normal View History

2024-09-08 21:47:56 +08:00
<script setup lang="ts">
import { computed, reactive, watch } from 'vue';
2025-05-09 23:26:09 +08:00
import { fetchCreate${BusinessName}, fetchUpdate${BusinessName} } from '@/service/api/${moduleName}/${business__name}';
2024-09-08 21:47:56 +08:00
import { useFormRules, useNaiveForm } from '@/hooks/common/form';
2024-09-09 15:40:38 +08:00
#if($dictList && $dictList.size() > 0)import { useDict } from '@/hooks/business/dict';#end
2025-05-09 23:26:09 +08:00
import { $t } from '@/locales';
2024-09-08 21:47:56 +08:00
defineOptions({
name: '${BusinessName}OperateDrawer'
});
interface Props {
/** the type of operation */
operateType: NaiveUI.TableOperateType;
/** the edit row data */
rowData?: Api.$ModuleName.${BusinessName} | null;
}
const props = defineProps<Props>();
interface Emits {
(e: 'submitted'): void;
}
const emit = defineEmits<Emits>();
const visible = defineModel<boolean>('visible', {
default: false
});
#if($dictList && $dictList.size() > 0)
#foreach($dict in $dictList)
const { options: ${dict.name}Options } = useDict('${dict.type}'#if($dict.immediate), false#end);
2024-09-08 21:47:56 +08:00
#end#end
const { formRef, validate, restoreValidation } = useNaiveForm();
const { createRequiredRule } = useFormRules();
const title = computed(() => {
const titles: Record<NaiveUI.TableOperateType, string> = {
add: '新增${functionName}',
edit: '编辑${functionName}'
};
return titles[props.operateType];
});
type Model = Api.$ModuleName.${BusinessName}OperateParams;
const model: Model = reactive(createDefaultModel());
function createDefaultModel(): Model {
return {
#foreach($column in $columns)
#if($column.insert)
${column.javaField}:#if($column.javaType == 'String' || ($!column.dictType && $column.dictType != '')) ''#else undefined#end#if($foreach.hasNext),#end
2024-09-08 21:47:56 +08:00
#end
#end
};
}
type RuleKey = Extract<
keyof Model,
#foreach($column in $columns)
#if($column.required)
| '$column.javaField'#if($foreach.hasNext)#end
#end#end>;
const rules: Record<RuleKey, App.Global.FormRule> = {
#foreach($column in $columns)
#if($column.required)
$column.javaField: createRequiredRule('${column.columnComment}不能为空')#if($foreach.hasNext),#end
#end
#end
};
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();
2025-06-14 13:40:15 +08:00
#set($operateColumns = [])
#foreach($column in $columns)#if($column.insert || $column.edit)#set($dummy = $operateColumns.add($column))#end#end
const { #foreach($column in $operateColumns)$column.javaField#if($foreach.hasNext), #end#end } = model;
2024-09-08 21:47:56 +08:00
// request
if (props.operateType === 'add') {
2025-06-14 13:40:15 +08:00
#set($addFields = [])
#foreach($column in $columns)#if($column.insert)#set($dummy = $addFields.add($column.javaField))#end#end
const { error } = await fetchCreate${BusinessName}({ #foreach($field in $addFields)$field#if($foreach.hasNext), #end#end });
2024-09-08 21:47:56 +08:00
if (error) return;
}
if (props.operateType === 'edit') {
2025-06-14 13:40:15 +08:00
#set($editFields = [])
#foreach($column in $columns)#if($column.edit)#set($dummy = $editFields.add($column.javaField))#end#end
const { error } = await fetchUpdate${BusinessName}({ #foreach($field in $editFields)$field#if($foreach.hasNext), #end#end });
2024-09-08 21:47:56 +08:00
if (error) return;
}
window.$message?.success($t('common.updateSuccess'));
closeDrawer();
emit('submitted');
}
watch(visible, () => {
if (visible.value) {
handleUpdateModelWhenEdit();
restoreValidation();
}
});
</script>
<template>
<NDrawer v-model:show="visible" :title="title" display-directive="show" :width="800" class="max-w-90%">
<NDrawerContent :title="title" :native-scrollbar="false" closable>
<NForm ref="formRef" :model="model" :rules="rules">
#foreach($column in $columns)
#set($field=$column.javaField)
#if(($column.insert || $column.edit) && !$column.pk)
#set($parentheseIndex=$column.columnComment.indexOf(""))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
#set($dictType=$!StrUtil.toCamelCase($column.dictType))
2024-09-08 21:47:56 +08:00
<NFormItem label="$column.columnComment" path="$column.javaField">
#if($column.htmlType == "textarea" || $column.htmlType == "editor")
<NInput
v-model:value="model.$column.javaField"
:rows="3"
type="textarea"
2024-09-09 11:10:39 +08:00
placeholder="请输入$column.columnComment"
2024-09-08 21:47:56 +08:00
/>
#elseif($column.htmlType == "select" && "" != $dictType)
<NSelect
v-model:value="model.$column.javaField"
placeholder="请选择$column.columnComment"
:options="${dictType}Options"
2024-09-08 21:47:56 +08:00
clearable
/>
#elseif($column.htmlType == "select" && $dictType)
<NSelect
v-model:value="model.$column.javaField"
placeholder="请选择$column.columnComment"
:options="[]"
clearable
/>
#elseif($column.htmlType == "radio" && "" != $dictType)
<NRadioGroup v-model:value="model.$column.javaField">
<NSpace>
<NRadio
v-for="option in ${dictType}Options"
2024-09-08 21:47:56 +08:00
:key="option.value"
:value="option.value"
:label="option.label"
/>
</NSpace>
</NRadioGroup>
#elseif($column.htmlType == "radio" && $dictType)
<NRadioGroup v-model:value="model.$column.javaField">
<NSpace>
<NRadio value="0" label="请选择字典生成" />
</NSpace>
</NRadioGroup>
2025-06-14 13:40:15 +08:00
#elseif($column.htmlType == "checkbox" && "" != $dictType)
<NCheckboxGroup v-model:value="model.$column.javaField">
<NSpace>
<NCheckbox
v-for="option in ${dictType}Options"
2025-06-14 13:40:15 +08:00
:key="option.value"
:value="option.value"
:label="option.label"
/>
</NSpace>
</NCheckboxGroup>
#elseif($column.htmlType == "checkbox" && $dictType)
<NCheckboxGroup v-model:value="model.$column.javaField">
<NSpace>
<NCheckbox value="0" label="请选择字典生成" />
</NSpace>
</NCheckboxGroup>
#elseif($column.htmlType == 'datetime')
2024-09-08 21:47:56 +08:00
<NDatePicker
v-model:formatted-value="model.$column.javaField"
2025-06-14 13:40:15 +08:00
type="datetime"
2024-09-08 21:47:56 +08:00
value-format="yyyy-MM-dd HH:mm:ss"
clearable
/>
2025-06-14 13:40:15 +08:00
#elseif($column.htmlType == "imageUpload")
<OssUpload v-model:value="model.$column.javaField" upload-type="image" />
#elseif($column.htmlType == "fileUpload")
<OssUpload v-model:value="model.$column.javaField" upload-type="file" />
#elseif($column.htmlType == "editor")
<TinymceEditor v-model:value="model.$column.javaField" />
2025-05-09 23:26:09 +08:00
#else <NInput v-model:value="model.$column.javaField" placeholder="请输入$column.columnComment" />
2024-09-08 21:47:56 +08:00
#end
</NFormItem>
#end
#end
</NForm>
<template #footer>
<NSpace :size="16">
<NButton @click="closeDrawer">{{ $t('common.cancel') }}</NButton>
<NButton type="primary" @click="handleSubmit">{{ $t('common.confirm') }}</NButton>
</NSpace>
</template>
</NDrawerContent>
</NDrawer>
</template>
<style scoped></style>