From 7da691e4c661805cff5323a1b2a584ab5a93dad4 Mon Sep 17 00:00:00 2001 From: zlwu <704541015@qq.com> Date: Wed, 12 Aug 2026 18:11:43 +0800 Subject: [PATCH] docs: add mobile OA detail actions fold implementation plan Break the folded footer and default-remark work into helper tests plus OaDetail.vue tasks. Co-authored-by: Cursor --- ...026-08-12-mobile-oa-detail-actions-fold.md | 399 ++++++++++++++++++ 1 file changed, 399 insertions(+) create mode 100644 docs/superpowers/plans/2026-08-12-mobile-oa-detail-actions-fold.md diff --git a/docs/superpowers/plans/2026-08-12-mobile-oa-detail-actions-fold.md b/docs/superpowers/plans/2026-08-12-mobile-oa-detail-actions-fold.md new file mode 100644 index 00000000..1ae0a803 --- /dev/null +++ b/docs/superpowers/plans/2026-08-12-mobile-oa-detail-actions-fold.md @@ -0,0 +1,399 @@ +# Mobile OA Detail Actions Fold 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:** Collapse approve-mode footer on mobile OA detail to `⋯` + 打回 + 同意, put other actions in an ActionSheet, and prefill default remarks for comment / add-sign / transfer. + +**Architecture:** Extract pure helpers (`defaultComment`, `buildMoreActions`) for defaults and more-menu items; change only `OaDetail.vue` approve footer + sheet wiring. Non-approve footers stay as today. Visual authority: `mobile-ui/zkxw-mobile-oa-detail-actions-demo.html` scheme A. + +**Tech Stack:** Vue 3, Vant 4 (`van-action-sheet`, existing `van-dialog` / `van-popup`), Vite; Node built-in `node:test` for pure helper tests (no new test deps). + +**Spec:** `docs/superpowers/specs/2026-08-12-mobile-oa-detail-actions-fold-design.md` + +--- + +## File map + +| File | Responsibility | +|------|----------------| +| Create: `mobile-oa-h5/src/oa/oa-action-defaults.js` | Default remark strings + `buildMoreActions(detail)` | +| Create: `mobile-oa-h5/src/oa/oa-action-defaults.test.js` | Node tests for helpers | +| Modify: `mobile-oa-h5/src/views/OaDetail.vue` | Approve footer fold, ActionSheet, wire defaults | +| Unchanged: `mobile-ui/zkxw-mobile-oa-detail-actions-demo.html` | Visual reference only | + +--- + +### Task 1: Pure helpers for defaults and more actions + +**Files:** +- Create: `mobile-oa-h5/src/oa/oa-action-defaults.js` +- Create: `mobile-oa-h5/src/oa/oa-action-defaults.test.js` + +- [ ] **Step 1: Write the failing test** + +Create `mobile-oa-h5/src/oa/oa-action-defaults.test.js`: + +```js +import { describe, it } from 'node:test' +import assert from 'node:assert/strict' +import { defaultComment, buildMoreActions } from './oa-action-defaults.js' + +describe('defaultComment', () => { + it('returns fixed defaults by kind', () => { + assert.equal(defaultComment('approve'), '同意') + assert.equal(defaultComment('reject'), '拒绝') + assert.equal(defaultComment('return'), '请修改后重新提交') + assert.equal(defaultComment('addSign'), '加签') + assert.equal(defaultComment('transfer'), '转交') + }) + + it('returns empty string for unknown kind', () => { + assert.equal(defaultComment('x'), '') + }) +}) + +describe('buildMoreActions', () => { + it('orders reject, addSign, transfer, print, close when all allowed', () => { + const keys = buildMoreActions({ allowAddSign: true }).map((a) => a.key) + assert.deepEqual(keys, ['reject', 'addSign', 'transfer', 'print', 'close']) + }) + + it('omits addSign when allowAddSign is false', () => { + const keys = buildMoreActions({ allowAddSign: false }).map((a) => a.key) + assert.deepEqual(keys, ['reject', 'transfer', 'print', 'close']) + }) + + it('includes addSign when allowAddSign is undefined', () => { + const keys = buildMoreActions({}).map((a) => a.key) + assert.ok(keys.includes('addSign')) + }) + + it('sets name and optional color on actions', () => { + const reject = buildMoreActions({}).find((a) => a.key === 'reject') + assert.equal(reject.name, '拒绝') + assert.equal(reject.color, '#ee0a24') + }) +}) +``` + +- [ ] **Step 2: Run test to verify it fails** + +```bash +cd mobile-oa-h5 && node --test src/oa/oa-action-defaults.test.js +``` + +Expected: FAIL (module not found / cannot resolve `./oa-action-defaults.js`) + +- [ ] **Step 3: Write minimal implementation** + +Create `mobile-oa-h5/src/oa/oa-action-defaults.js`: + +```js +const DEFAULT_COMMENTS = { + approve: '同意', + reject: '拒绝', + return: '请修改后重新提交', + addSign: '加签', + transfer: '转交' +} + +/** @param {string} kind */ +export function defaultComment(kind) { + return DEFAULT_COMMENTS[kind] || '' +} + +/** + * More ActionSheet items for approve mode (spec order). + * @param {{ allowAddSign?: boolean } | null | undefined} detail + * @returns {{ key: string, name: string, color?: string }[]} + */ +export function buildMoreActions(detail) { + const list = [{ key: 'reject', name: '拒绝', color: '#ee0a24' }] + if (detail?.allowAddSign !== false) { + list.push({ key: 'addSign', name: '加签' }) + } + list.push( + { key: 'transfer', name: '转交' }, + { key: 'print', name: '打印' }, + { key: 'close', name: '关闭' } + ) + return list +} +``` + +- [ ] **Step 4: Run tests to verify they pass** + +```bash +cd mobile-oa-h5 && node --test src/oa/oa-action-defaults.test.js +``` + +Expected: PASS (all tests) + +- [ ] **Step 5: Commit** + +```bash +git add mobile-oa-h5/src/oa/oa-action-defaults.js mobile-oa-h5/src/oa/oa-action-defaults.test.js +git commit -m "$(cat <<'EOF' +feat(oa): add mobile detail action defaults helpers + +Centralize default approval remarks and more-menu action order for the folded footer. +EOF +)" +``` + +--- + +### Task 2: Fold approve footer + ActionSheet + default remarks in OaDetail + +**Files:** +- Modify: `mobile-oa-h5/src/views/OaDetail.vue` +- Test: manual checklist below + re-run helper tests + +- [ ] **Step 1: Import helpers and add sheet state** + +Near other imports in `