# OA 草稿箱就地弹窗编辑 Implementation Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** 草稿箱内用与「发起审批」相同的弹窗完成草稿回显、保存与提交,不再跳转到发起页。 **Architecture:** 从 `start/index.vue` 抽出 `OaStartFormDialog.vue`(表单 + Kit + 流程预览 + 保存/提交);发起页与草稿箱共用。草稿箱 `openForDraft(draftId)` 回显;列表快捷提交失败时打开同一弹窗。 **Tech Stack:** Vue 3 + Element Plus + form-create;既有 `@/api/oaApproval` 草稿 API(无后端改动)。 **Spec:** `docs/superpowers/specs/2026-08-06-oa-drafts-inline-edit-dialog-design.md` --- ## File map | 文件 | 职责 | |------|------| | `web-admin/src/components/oa-approval/OaStartFormDialog.vue` | **新建**:发起/编辑草稿共用弹窗(从 start 抽出) | | `web-admin/src/views/oa-approval/start/index.vue` | 保留模板卡片列表;弹窗改为挂载共用组件;深链仍打开弹窗 | | `web-admin/src/views/oa-approval/drafts/index.vue` | 去掉跳转;挂载共用组件;编辑/提交失败走弹窗 | 后端与 `oaApproval.ts` API:**不改**。 --- ## Public API(`OaStartFormDialog`) 组件通过 `defineExpose` 暴露: ```ts /** 选模板后新建发起(清空草稿态) */ function openForApp(appRow: { id: string; appName?: string; [k: string]: any }): Promise /** * 打开并回显草稿。 * @param draftId 草稿 id * @param templatesOptional 发起页可传当前模板列表,用于补全 app 行;草稿箱可省略 */ function openForDraft( draftId: string, templatesOptional?: Array<{ id: string; appName?: string }> ): Promise /** * 复制旧实例表单后打开(仅发起页深链 copyFromInstanceId 使用)。 * 内部先 openForApp,再预填 formData。 */ function openForAppWithCopy( appRow: { id: string; appName?: string; [k: string]: any }, copyFromInstanceId: string ): Promise ``` Events: ```ts // 保存草稿成功(create 或 update)后关闭前触发,便于父页刷新列表 emit('saved') // 提交成功;payload 为后端返回的实例(至少含 id) emit('submitted', instance: { id?: string; [k: string]: any }) // 弹窗关闭(取消或保存/提交后) emit('closed') ``` Props:无必填 props(可见性由组件内部 `dlgVisible` 控制)。 弹窗模板须与现 `start/index.vue` 中 `el-dialog` 块一致(`dialog-form-layout`、`protocol-dialog-mask`、form-create、`OaFlowPreview`、底栏取消/保存草稿/提交)。 --- ### Task 1: 抽出 `OaStartFormDialog.vue` **Files:** - Create: `web-admin/src/components/oa-approval/OaStartFormDialog.vue` - Reference (move from): `web-admin/src/views/oa-approval/start/index.vue`(dialog 模板 + 相关 script,约 L87–142 与 L214–714 中弹窗相关部分) - [x] **Step 1: 新建组件骨架** 创建文件:含 `` 模板(从 start 原样搬入)、`