| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <!-- |
| | | ä¸å¡æ¨¡åãæ°å¢ãæ¶å¯¼å
¥å®¡æ¹æ¨¡æ¿ï¼åºå® moduleKeyï¼ä»
å±ç¤ºè¯¥ç±»å䏿¨¡æ¿ï¼ |
| | | |
| | | ç¨æ³ï¼ |
| | | <ApprovalTemplateBindDialog |
| | | v-model:visible="visible" |
| | | module-key="regular" |
| | | @confirm="onTemplateBound" |
| | | /> |
| | | --> |
| | | <template> |
| | | <el-dialog |
| | | v-model="dialogVisible" |
| | | :title="dialogTitle" |
| | | :width="step === formStep ? 720 : 640" |
| | | append-to-body |
| | | class="approval-template-bind-dialog" |
| | | @closed="onClosed" |
| | | > |
| | | <template v-if="step === 1"> |
| | | <div v-loading="templatesLoading || confirming"> |
| | | <ApprovalTemplatePicker |
| | | :cards="templateCards" |
| | | :loading="false" |
| | | :hint="pickerHint" |
| | | @pick="onPickTemplate" |
| | | /> |
| | | </div> |
| | | </template> |
| | | |
| | | <template v-else> |
| | | <div v-loading="templatesLoading"> |
| | | <el-form |
| | | ref="formRef" |
| | | :model="bindingForm" |
| | | :rules="mergedRules" |
| | | label-width="120px" |
| | | > |
| | | <ApprovalTemplateFormSection |
| | | :active-template="activeTemplate" |
| | | :fields="formFields" |
| | | :form-payload="bindingForm.formPayload" |
| | | v-model:flow-nodes="bindingForm.flowNodes" |
| | | v-model:attachments="bindingForm.storageBlobDTOs" |
| | | :template-attachments="bindingForm.templateAttachments" |
| | | :user-options="flowUserOptions" |
| | | allow-change-template |
| | | @change-template="step = 1" |
| | | /> |
| | | </el-form> |
| | | </div> |
| | | </template> |
| | | |
| | | <template #footer> |
| | | <el-button v-if="step === formStep" type="primary" :loading="confirming" @click="onConfirm"> |
| | | ç¡® å® |
| | | </el-button> |
| | | <el-button v-if="step === formStep" @click="step = 1">é鿍¡æ¿</el-button> |
| | | <el-button @click="dialogVisible = false">{{ step === 1 ? "å æ¶" : "å
³ é" }}</el-button> |
| | | </template> |
| | | </el-dialog> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { computed, ref, watch } from "vue"; |
| | | import { ElMessage } from "element-plus"; |
| | | import ApprovalTemplatePicker from "./ApprovalTemplatePicker.vue"; |
| | | import ApprovalTemplateFormSection from "./ApprovalTemplateFormSection.vue"; |
| | | import { useApprovalTemplateBinding } from "../useApprovalTemplateBinding.js"; |
| | | import { useFlowUserOptions } from "../useFlowUserOptions.js"; |
| | | import { getApprovalModuleConfig } from "../approvalModuleRegistry.js"; |
| | | |
| | | const props = defineProps({ |
| | | visible: { type: Boolean, default: false }, |
| | | /** approvalModuleRegistry ä¸ç moduleKey */ |
| | | moduleKey: { type: String, required: true }, |
| | | /** 为 true æ¶é模æ¿åç´æ¥ç¡®è®¤ï¼è·³è¿ã确认审æ¹ä¿¡æ¯ãå¡«æ¥æ¥éª¤ */ |
| | | skipFormConfirm: { type: Boolean, default: false }, |
| | | }); |
| | | |
| | | const emit = defineEmits(["update:visible", "confirm", "closed"]); |
| | | |
| | | const dialogVisible = computed({ |
| | | get: () => props.visible, |
| | | set: (v) => emit("update:visible", v), |
| | | }); |
| | | |
| | | const { |
| | | step, |
| | | bindingForm, |
| | | templateCards, |
| | | activeTemplate, |
| | | formFields, |
| | | formRules, |
| | | templatesLoading, |
| | | loadTemplates, |
| | | resetBinding, |
| | | pickTemplate, |
| | | validateBinding, |
| | | getBindingPayload, |
| | | moduleConfig, |
| | | } = useApprovalTemplateBinding({ moduleKey: props.moduleKey, mode: "module" }); |
| | | |
| | | const formStep = 2; |
| | | const formRef = ref(); |
| | | const confirming = ref(false); |
| | | const { flowUserOptions, loadFlowUsers } = useFlowUserOptions(); |
| | | |
| | | const mergedRules = computed(() => ({ ...formRules.value })); |
| | | |
| | | const dialogTitle = computed(() => { |
| | | const label = moduleConfig.value?.label || "审æ¹"; |
| | | return step.value === 1 ? `éæ©${label}模æ¿` : `确认${label}审æ¹ä¿¡æ¯`; |
| | | }); |
| | | |
| | | const pickerHint = computed( |
| | | () => `è¯·éæ©ã${moduleConfig.value?.label || "â"}ãç±»åä¸å·²å¯ç¨çå®¡æ¹æ¨¡æ¿ï¼å®¡æ¹æµç¨å°èªå¨å¸¦å
¥ã` |
| | | ); |
| | | |
| | | watch( |
| | | () => props.visible, |
| | | async (v) => { |
| | | if (!v) return; |
| | | resetBinding(); |
| | | step.value = 1; |
| | | await Promise.all([loadTemplates(), loadFlowUsers()]); |
| | | const cfg = getApprovalModuleConfig(props.moduleKey); |
| | | if (!cfg) { |
| | | ElMessage.warning(`æªé
置模åã${props.moduleKey}ãï¼è¯·æ£æ¥ approvalModuleRegistry`); |
| | | return; |
| | | } |
| | | if (!templateCards.value.length) { |
| | | ElMessage.warning( |
| | | `ã${cfg.label}ã䏿æ å·²å¯ç¨çå®¡æ¹æ¨¡æ¿ï¼è¯·å
å¨å®¡æ¹æ¨¡æ¿ç®¡çä¸å建并å¯ç¨å¯¹åºç±»åçæ¨¡æ¿` |
| | | ); |
| | | } |
| | | } |
| | | ); |
| | | |
| | | async function onPickTemplate(card) { |
| | | const ok = await pickTemplate(card); |
| | | if (!ok) return; |
| | | if (props.skipFormConfirm) { |
| | | step.value = 1; |
| | | await onConfirm(); |
| | | return; |
| | | } |
| | | step.value = formStep; |
| | | } |
| | | |
| | | async function onConfirm() { |
| | | confirming.value = true; |
| | | try { |
| | | const check = await validateBinding(props.skipFormConfirm ? null : formRef.value); |
| | | if (!check.ok) { |
| | | if (check.message) ElMessage.warning(check.message); |
| | | return; |
| | | } |
| | | emit("confirm", { ...getBindingPayload(), flowNodes: check.nodes }); |
| | | dialogVisible.value = false; |
| | | } finally { |
| | | confirming.value = false; |
| | | } |
| | | } |
| | | |
| | | function onClosed() { |
| | | resetBinding(); |
| | | emit("closed"); |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .approval-template-bind-dialog :deep(.el-dialog__body) { |
| | | padding-top: 12px; |
| | | } |
| | | </style> |