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.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.
 
 
 
 
 
 

107 lines
2.9 KiB

<script lang="ts" setup>
import { baseSendSchemas, keyPrefix } from './template.data'
import { BasicModal, useModalInner } from '@/components/Modal'
import type { FormSchema } from '@/components/Form'
import { BasicForm, useForm } from '@/components/Form'
import { sendMail } from '@/api/system/mail/template'
import type { MailTemplate } from '@/api/system/mail/template'
import { useMessage } from '@/hooks/web/useMessage'
defineOptions({ name: 'SendMailModal' })
const [register, { setFieldsValue, getFieldsValue, validateFields, resetFields, clearValidate, appendSchemaByField, removeSchemaByField }]
= useForm({
labelWidth: 120,
schemas: baseSendSchemas,
baseColProps: {
span: 24,
},
showActionButtonGroup: false,
})
// 存储动态生成的字段信息 后续需要进行移除
let dyFields: string[] = []
const [innerRegister, { changeLoading, changeOkLoading, closeModal }] = useModalInner(async (data: MailTemplate) => {
// 打开时进行清空
await resetForm()
const dyschemas: FormSchema[] = []
data.params.forEach((item) => {
// 这里加上前缀 防止和content/mail字段重名
const field = keyPrefix + item
const dySchema: FormSchema = {
field,
label: `参数{${item}} `,
component: 'Input',
componentProps: {
placeholder: `输入{${item}}`,
},
required: true,
}
dyschemas.push(dySchema)
dyFields.push(field)
})
setFieldsValue(data)
// 添加动态参数到末尾
appendSchemaByField(dyschemas, undefined)
})
function modalLoading(status: boolean) {
changeOkLoading(status)
changeLoading(status)
}
/**
* 移除动态生成的表单元素
*/
async function removeDySchemas() {
await removeSchemaByField(dyFields)
dyFields = []
}
const { createMessage } = useMessage()
async function submit() {
try {
modalLoading(true)
await validateFields()
const fields = getFieldsValue()
const data = {
mail: fields.mail,
templateCode: fields.code,
templateParams: {},
}
Object.keys(fields).forEach((key) => {
// 这几个是固定的字段 不用处理
const fixedKeys = ['mail', 'code', 'content']
if (fixedKeys.includes(key))
return
// 去掉前缀后的key
const realKey = key.split(keyPrefix)[1]
data.templateParams[realKey] = fields[key]
})
await sendMail(data)
createMessage.success(`发送邮件到[${fields.mail}]成功`)
closeModal()
}
catch (e) {
}
finally {
modalLoading(false)
}
}
async function resetForm() {
// 这里需要清空动态表单
await removeDySchemas()
// 清除上一次的表单校验和参数
await resetFields()
await clearValidate()
}
</script>
<template>
<BasicModal v-bind="$attrs" title="发送邮件" width="600px" @register="innerRegister" @ok="submit" @cancel="resetForm">
<BasicForm @register="register" />
</BasicModal>
</template>