This commit is contained in:
Ray.Hao
2025-05-20 23:17:36 +08:00

View File

@@ -7,7 +7,6 @@
v-bind="{ destroyOnClose: true, ...modalConfig.drawer }" v-bind="{ destroyOnClose: true, ...modalConfig.drawer }"
@close="handleClose" @close="handleClose"
> >
<!-- 表单 -->
<el-form ref="formRef" v-bind="modalConfig.form" :model="formData" :rules="formRules"> <el-form ref="formRef" v-bind="modalConfig.form" :model="formData" :rules="formRules">
<el-row :gutter="20"> <el-row :gutter="20">
<template v-for="item in formItems" :key="item.prop"> <template v-for="item in formItems" :key="item.prop">
@@ -57,7 +56,7 @@
</template> </template>
</el-row> </el-row>
</el-form> </el-form>
<!-- 弹窗底部操作按钮 -->
<template #footer> <template #footer>
<el-button v-if="!formDisable" type="primary" @click="handleSubmit"> </el-button> <el-button v-if="!formDisable" type="primary" @click="handleSubmit"> </el-button>
<el-button @click="handleClose">{{ !formDisable ? " " : "关闭" }}</el-button> <el-button @click="handleClose">{{ !formDisable ? " " : "关闭" }}</el-button>
@@ -68,60 +67,60 @@
<template v-else> <template v-else>
<el-dialog <el-dialog
v-model="modalVisible" v-model="modalVisible"
v-bind="{ destroyOnClose: true, ...modalConfig.dialog }" v-bind="{ destroyOnClose: true, alignCenter: true, ...modalConfig.dialog }"
@close="handleClose" @close="handleClose"
> >
<!-- 表单 -->
<el-form ref="formRef" v-bind="modalConfig.form" :model="formData" :rules="formRules"> <el-form ref="formRef" v-bind="modalConfig.form" :model="formData" :rules="formRules">
<el-row :gutter="20"> <el-scrollbar max-height="70vh" :view-style="{ overflowX: 'hidden' }">
<template v-for="item in formItems" :key="item.prop"> <el-row :gutter="20">
<el-col v-show="!item.hidden" v-bind="item.col"> <template v-for="item in formItems" :key="item.prop">
<el-form-item :label="item.label" :prop="item.prop"> <el-col v-show="!item.hidden" v-bind="item.col">
<!-- Label --> <el-form-item :label="item.label" :prop="item.prop">
<template #label> <template #label>
<span> <span>
{{ item?.label || "" }} {{ item?.label || "" }}
<el-tooltip v-if="item?.tips" v-bind="getTooltipProps(item.tips)"> <el-tooltip v-if="item?.tips" v-bind="getTooltipProps(item.tips)">
<QuestionFilled class="w-4 h-4 mx-1" /> <QuestionFilled class="w-4 h-4 mx-1" />
</el-tooltip> </el-tooltip>
<span v-if="modalConfig.colon" class="ml-0.5">:</span> <span v-if="modalConfig.colon" class="ml-0.5">:</span>
</span> </span>
</template>
<!-- components -->
<template v-if="item.type === 'custom'">
<slot
:name="item.slotName ?? item.prop"
:prop="item.prop"
:form-data="formData"
:attrs="item.attrs"
></slot>
</template>
<component
:is="componentMap.get(item.type)"
v-else
v-model.trim="formData[item.prop]"
v-bind="{ style: { width: '100%' }, ...item.attrs }"
>
<template v-if="['select', 'radio', 'checkbox'].includes(item.type)">
<component
:is="childrenMap.get(item.type)"
v-for="opt in item.options"
:label="opt.label"
:value="opt.value"
></component>
</template> </template>
<template v-if="item?.slotName && $slots[item.slotName]" #[item.slotName]> <template v-if="item.type === 'custom'">
<slot :name="item.slotName" /> <slot
:name="item.slotName ?? item.prop"
:prop="item.prop"
:form-data="formData"
:attrs="item.attrs"
></slot>
</template> </template>
</component> <component
</el-form-item> :is="componentMap.get(item.type)"
</el-col> v-else
</template> v-model.trim="formData[item.prop]"
</el-row> v-bind="{ style: { width: '100%' }, ...item.attrs }"
>
<template v-if="['select', 'radio', 'checkbox'].includes(item.type)">
<component
:is="childrenMap.get(item.type)"
v-for="opt in item.options"
:label="opt.label"
:value="opt.value"
></component>
</template>
<template v-if="item?.slotName && $slots[item.slotName]" #[item.slotName]>
<slot :name="item.slotName" />
</template>
</component>
</el-form-item>
</el-col>
</template>
</el-row>
<slot name="bottom" :form-data="formData"></slot>
</el-scrollbar>
</el-form> </el-form>
<!-- 弹窗底部操作按钮 -->
<template #footer> <template #footer>
<el-button v-if="!formDisable" type="primary" @click="handleSubmit"> </el-button> <el-button v-if="!formDisable" type="primary" @click="handleSubmit"> </el-button>
<el-button @click="handleClose">{{ !formDisable ? " " : "关闭" }}</el-button> <el-button @click="handleClose">{{ !formDisable ? " " : "关闭" }}</el-button>
@@ -144,7 +143,7 @@ const props = defineProps<{ modalConfig: IModalConfig }>();
// 自定义事件 // 自定义事件
const emit = defineEmits<{ submitClick: []; customSubmit: [queryParams: IObject] }>(); const emit = defineEmits<{ submitClick: []; customSubmit: [queryParams: IObject] }>();
// 组件映射表 // 组件映射表
/* eslint-disable */
const componentMap = new Map<IComponentType, any>([ const componentMap = new Map<IComponentType, any>([
// @ts-ignore // @ts-ignore
["input", markRaw(ElInput)], // @ts-ignore ["input", markRaw(ElInput)], // @ts-ignore
@@ -170,7 +169,6 @@ const childrenMap = new Map<IComponentType, any>([
["radio", markRaw(ElRadio)], // @ts-ignore" ["radio", markRaw(ElRadio)], // @ts-ignore"
["checkbox", markRaw(ElCheckbox)], ["checkbox", markRaw(ElCheckbox)],
]); ]);
/* eslint-enable */
const pk = props.modalConfig.pk ?? "id"; // 主键名,用于表单数据处理 const pk = props.modalConfig.pk ?? "id"; // 主键名,用于表单数据处理
const modalVisible = ref(false); // 弹窗显示状态 const modalVisible = ref(false); // 弹窗显示状态