| | |
| | | |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="附件"> |
| | | |
| | | <div class="upload-block"> |
| | | |
| | | <FileUpload v-model:file-list="form.storageBlobDTOs" :limit="10" button-text="点击选择文件" /> |
| | | |
| | | </div> |
| | | |
| | | <p class="flow-tip">可上传模板说明文档、制度文件等(选填)。</p> |
| | | |
| | | </el-form-item> |
| | | |
| | | </el-form> |
| | | |
| | | <template #footer> |
| | |
| | | |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="选项来源" width="100"> |
| | | |
| | | <template #default="{ row }"> |
| | | |
| | | {{ row.type === 'select' ? selectOptionSourceLabel(row.optionSource) : '—' }} |
| | | |
| | | </template> |
| | | |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="必填" width="70" align="center"> |
| | | |
| | | <template #default="{ row }">{{ row.required !== false ? "是" : "否" }}</template> |
| | |
| | | |
| | | <el-empty v-else description="暂无流程节点" :image-size="60" /> |
| | | |
| | | <el-divider content-position="left">附件({{ detailAttachments.length }} 个)</el-divider> |
| | | |
| | | <template v-if="detailAttachments.length"> |
| | | |
| | | <el-tag |
| | | |
| | | v-for="(f, i) in detailAttachments" |
| | | |
| | | :key="i" |
| | | |
| | | class="detail-attachment-tag" |
| | | |
| | | type="info" |
| | | |
| | | effect="plain" |
| | | |
| | | > |
| | | |
| | | {{ attachmentDisplayName(f) }} |
| | | |
| | | </el-tag> |
| | | |
| | | </template> |
| | | |
| | | <el-empty v-else description="暂无附件" :image-size="48" /> |
| | | |
| | | </div> |
| | | |
| | | <template #footer> |
| | |
| | | |
| | | import { userListNoPageByTenantId } from "@/api/system/user.js"; |
| | | |
| | | import FileUpload from "@/components/AttachmentUpload/file/index.vue"; |
| | | |
| | | import FormConfigEditor from "./components/FormConfigEditor.vue"; |
| | | |
| | | import TemplateFlowEditor from "./components/TemplateFlowEditor.vue"; |
| | | |
| | | import { formatDisplayTime } from "./approveTemplateConstants.js"; |
| | | import { formatDisplayTime, mapAttachmentsFromApi } from "./approveTemplateConstants.js"; |
| | | |
| | | import { formatDefaultValueDisplay, formFieldTypeLabel, parseFormConfigToData } from "./formConfigUtils.js"; |
| | | import { selectOptionSourceLabel } from "./selectOptionSource.js"; |
| | | |
| | | import { useApproveTemplate } from "./useApproveTemplate.js"; |
| | | |
| | |
| | | parseFormConfigToData(detailRow.value?.formConfigData ?? detailRow.value?.formConfig) |
| | | |
| | | ); |
| | | |
| | | |
| | | |
| | | const detailAttachments = computed(() => mapAttachmentsFromApi(detailRow.value)); |
| | | |
| | | |
| | | |
| | | function attachmentDisplayName(file) { |
| | | |
| | | if (!file) return "未命名"; |
| | | |
| | | return file.name || file.originalFilename || file.fileName || "未命名"; |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | |
| | | |
| | | } |
| | | |
| | | .upload-block { |
| | | |
| | | width: 100%; |
| | | |
| | | } |
| | | |
| | | .detail-attachment-tag { |
| | | |
| | | margin: 0 8px 8px 0; |
| | | |
| | | } |
| | | |
| | | .text-muted { |
| | | |
| | | font-size: 12px; |