| | |
| | | getPublishedGuidelineList, |
| | | } from '#/api/research/guideline'; |
| | | |
| | | import { useFormSchema } from '../data'; |
| | | import { toSubmitMembers, useFormSchema } from '../data'; |
| | | import MemberTable from './member-table.vue'; |
| | | |
| | | defineOptions({ name: 'ResearchApplicationForm' }); |
| | | |
| | |
| | | const formType = ref<FormType>('create'); |
| | | /** 供「所属课题指南」下拉与类别带出使用 */ |
| | | const guidelines = ref<ResearchGuidelineApi.Guideline[]>([]); |
| | | /** 成员表格回显数据源:只在打开弹窗时赋值,增删改只通过 emit 单向流到表单值 */ |
| | | const initialMembers = ref<ResearchApplicationApi.ApplicationMember[]>([]); |
| | | const memberTableRef = ref<InstanceType<typeof MemberTable>>(); |
| | | |
| | | const getTitle = computed(() => { |
| | | if (formType.value === 'create') { |
| | |
| | | jobTitle: values.jobTitle, |
| | | contactPhone: values.contactPhone, |
| | | contactEmail: values.contactEmail, |
| | | teamMembers: values.teamMembers, |
| | | members: toSubmitMembers(values.members), |
| | | budgetAmount: values.budgetAmount, |
| | | planContent: values.planContent, |
| | | remark: values.remark, |
| | |
| | | async onConfirm() { |
| | | const { valid } = await formApi.validate(); |
| | | if (!valid) { |
| | | return; |
| | | } |
| | | try { |
| | | memberTableRef.value?.validate(); |
| | | } catch (error) { |
| | | message.error((error as Error).message || '课题组成员校验失败'); |
| | | return; |
| | | } |
| | | modalApi.lock(); |
| | |
| | | schema: useFormSchema(formType.value, formApi, guidelines.value), |
| | | }); |
| | | formApi.setDisabled(formType.value === 'detail'); |
| | | // 成员子表回显:保留原 id 供表格行 key 使用,提交时再剥离 |
| | | initialMembers.value = application.members ?? []; |
| | | // 已有附件转成上传组件可识别的文件对象,提交时按 valueKey=id 提取为 blobId |
| | | const blobIds = (application.attachmentList ?? []).map((item) => ({ |
| | | uid: String(item.id), |
| | |
| | | status: 'done', |
| | | id: item.id, |
| | | })); |
| | | await formApi.setValues({ ...application, blobIds }, false); |
| | | await formApi.setValues( |
| | | { |
| | | ...application, |
| | | members: toSubmitMembers(application.members), |
| | | blobIds, |
| | | }, |
| | | false, |
| | | ); |
| | | } else { |
| | | guidelines.value = await getPublishedGuidelineList(); |
| | | formApi.setState({ |
| | | schema: useFormSchema(formType.value, formApi, guidelines.value), |
| | | }); |
| | | formApi.setDisabled(false); |
| | | initialMembers.value = []; |
| | | await formApi.resetForm(); |
| | | } |
| | | } finally { |
| | |
| | | :close-on-click-modal="false" |
| | | :show-confirm-button="formType !== 'detail'" |
| | | > |
| | | <Form class="mx-3" /> |
| | | <Form class="mx-3"> |
| | | <template #members> |
| | | <MemberTable |
| | | ref="memberTableRef" |
| | | :members="initialMembers" |
| | | :disabled="formType === 'detail'" |
| | | class="w-full" |
| | | @update:members="(members) => formApi.setValues({ members }, false)" |
| | | /> |
| | | </template> |
| | | </Form> |
| | | </Modal> |
| | | </template> |