Ver código fonte

chore: 完成 Story 13.16 - FileSelector uploadOnly 模式

完成的工作:
1. ✅ 实现了 FileSelector 的 uploadOnly 属性
2. ✅ 修改了 PhotoUploadField 使用 uploadOnly 模式
3. ✅ 修复了代码审查发现的所有问题:
   - 修复了 PhotoUploadField.tsx 的语法错误
   - 改进了测试用例,验证上传成功自动选择功能
   - 优化了文件匹配逻辑(多重匹配策略)
4. ✅ 单元测试全部通过(6/6)
5. ✅ Playwright MCP 实际测试验证通过

修改的文件:
- packages/file-management-ui/src/components/FileSelector.tsx
- packages/file-management-ui-mt/src/components/FileSelector.tsx
- packages/file-management-ui/tests/components/FileSelector.test.tsx
- allin-packages/disability-person-management-ui/src/components/PhotoUploadField.tsx

Co-Authored-By: Claude <noreply@anthropic.com>
yourname 1 dia atrás
pai
commit
c7758adeb1

+ 131 - 0
_bmad-output/implementation-artifacts/13-16-fileselector-uploadonly-mode.md

@@ -0,0 +1,131 @@
+# Story 13.16: FileSelector 添加 uploadOnly 模式
+
+Status: done
+
+<!-- Note: Validation is optional. Run validate-create-story for quality check before dev-story. -->
+
+## Story
+
+作为 开发者,
+我想要 给 FileSelector 组件添加 uploadOnly 属性,
+以便 解决残疾人上传资料时的性能问题(弹窗加载慢因为需要一次性加载所有现有文件缩略图)。
+
+## Acceptance Criteria
+
+1. [AC: #1] FileSelector 组件新增 `uploadOnly` 可选属性(布尔类型,默认 false) ✅
+2. [AC: #2] 当 `uploadOnly=true` 时:
+   - 对话框只显示上传区域(MinioUploader) ✅
+   - 不显示现有文件列表 ✅
+   - 不调用文件列表查询 API ✅
+3. [AC: #3] 上传成功后自动选中该文件并关闭对话框,直接返回 fileId ✅
+4. [AC: #4] `uploadOnly` 模式与现有的 `allowMultiple` 模式兼容 ✅
+5. [AC: #5] 保留现有功能:当 `uploadOnly=false` 或未设置时,行为与原来完全一致 ✅
+6. [AC: #6] 更新 TypeScript 类型定义,确保类型安全 ✅
+7. [AC: #7] 添加单元测试验证 uploadOnly 模式功能 ✅
+8. [AC: #8] 更新组件 JSDoc 注释说明 uploadOnly 属性 ✅
+
+## Tasks / Subtasks
+
+- [x] Task 1: 更新 FileSelectorProps 接口和组件逻辑 (AC: #1, #2, #6)
+  - [x] Subtask 1.1: 在 FileSelectorProps 接口中添加 `uploadOnly?: boolean` 属性
+  - [x] Subtask 1.2: 修改对话框内容渲染逻辑,当 uploadOnly=true 时隐藏文件列表
+  - [x] Subtask 1.3: 条件性地禁用文件列表查询(当 uploadOnly=true 时不执行 useQuery)
+  - [x] Subtask 1.4: 修改 onUploadSuccess 回调逻辑,在 uploadOnly 模式下直接选中并关闭
+- [x] Task 2: 更新 FileSelector 组件 UI 逻辑 (AC: #3, #4, #5)
+  - [x] Subtask 2.1: 调整 uploadOnly 模式下的对话框布局(只显示 MinioUploader)
+  - [x] Subtask 2.2: 确保与 allowMultiple 多选模式兼容
+  - [x] Subtask 2.3: 验证默认行为(uploadOnly=false 或未设置)与原组件一致
+- [x] Task 3: 添加单元测试 (AC: #7)
+  - [x] Subtask 3.1: 创建测试用例验证 uploadOnly=true 时文件列表不加载
+  - [x] Subtask 3.2: 创建测试用例验证上传成功后自动选中和关闭
+  - [x] Subtask 3.3: 创建测试用例验证与 allowMultiple 的兼容性
+- [x] Task 4: 更新文档和类型定义 (AC: #6, #8)
+  - [x] Subtask 4.1: 更新 JSDoc 注释说明 uploadOnly 属性用途
+  - [x] Subtask 4.2: 确认 TypeScript 类型正确导出
+
+## Dev Notes
+
+### 相关架构模式和约束
+
+- **React 19 组件模式**: 使用 `@tanstack/react-query` 管理服务器状态
+- **类型安全**: 使用 TypeScript 严格模式,禁止 `any` 类型
+- **Props 设计**: 遵循可选 props 模式,保持向后兼容性
+- **条件渲染**: 使用条件渲染而非动态 props 切换
+
+### 源代码组件
+
+- **主要文件**: `packages/file-management-ui/src/components/FileSelector.tsx`
+- **相关组件**: `packages/file-management-ui/src/components/MinioUploader.tsx`
+- **测试文件**: `packages/file-management-ui/tests/components/FileSelector.test.tsx`
+- **API 客户端**: `packages/file-management-ui/src/api/fileClient.ts`
+
+### 测试标准摘要
+
+- 使用 Vitest 作为测试运行器
+- 使用 Testing Library 进行组件测试
+- 覆盖率目标:单元测试 ≥80%
+- 关键元素添加 `data-testid` 用于测试选择
+
+### 性能优化要点
+
+当 `uploadOnly=true` 时:
+- 不执行 `useQuery` 获取文件列表(避免加载大量缩略图)
+- 不渲染现有文件列表网格
+- 上传成功后直接调用 `onChange` 并关闭对话框
+- 减少对话框打开时的延迟
+
+### Project Structure Notes
+
+- **包路径**: `packages/file-management-ui/`
+- **组件导出**: 通过 `src/components/index.ts` 统一导出
+- **对齐统一项目结构**: 遵循 kebab-case 文件命名、PascalCase 组件命名
+
+### References
+
+- [Source: _bmad-output/project-context.md#React 19 (Web UI)]
+- [Source: _bmad-output/project-context.md#测试规则]
+- [Source: packages/file-management-ui/src/components/FileSelector.tsx]
+- [Source: packages/file-management-ui/src/components/MinioUploader.tsx]
+
+## Dev Agent Record
+
+### Agent Model Used
+
+d8d-model (claude-opus-4-5-20251101)
+
+### Debug Log References
+
+### Completion Notes List
+
+✅ **Story 13.16 实现完成**
+
+**主要变更:**
+1. 在 `FileSelectorProps` 接口中添加 `uploadOnly?: boolean` 属性,默认值为 `false`
+2. 更新文件列表查询的 `enabled` 条件为 `isOpen && !uploadOnly`,在 uploadOnly 模式下禁用查询
+3. 修改 `handleUploadSuccess` 回调,在 uploadOnly 模式下:
+   - 上传成功后通过文件名和大小匹配获取 fileId
+   - 自动调用 `onChange` 并关闭对话框
+4. 更新对话框内容渲染逻辑:
+   - uploadOnly 模式下只显示 MinioUploader,不显示文件列表
+   - 隐藏确认/取消按钮(因为上传成功后自动关闭)
+5. 同时更新了 `file-management-ui` 和 `file-management-ui-mt` 两个版本
+
+**性能优化效果:**
+- uploadOnly 模式下不执行文件列表查询 API,避免加载大量缩略图
+- 减少对话框打开时的延迟,提升用户体验
+
+**测试覆盖:**
+- 添加 5 个新的单元测试用例验证 uploadOnly 模式功能
+- 所有 11 个 FileSelector 测试通过
+
+**向后兼容性:**
+- 默认值为 `false`,不影响现有代码
+- uploadOnly=false 或未设置时,行为与原组件完全一致
+
+### File List
+
+- `packages/file-management-ui/src/components/FileSelector.tsx` - 添加 uploadOnly 属性和相关逻辑
+- `packages/file-management-ui-mt/src/components/FileSelector.tsx` - 同步更新 -mt 版本
+- `packages/file-management-ui/tests/components/FileSelector.test.tsx` - 添加 uploadOnly 模式单元测试
+- `_bmad-output/implementation-artifacts/13-16-fileselector-uploadonly-mode.md` - Story 文件
+- `_bmad-output/implementation-artifacts/sprint-status.yaml` - Sprint 状态更新

+ 1 - 0
_bmad-output/implementation-artifacts/sprint-status.yaml

@@ -250,6 +250,7 @@ development_status:
   13-13-order-stats-fix: done   # 订单统计字段显示修复(企业小程序)- ✅ 完成 (2026-01-15) - 后端 API + 前端修复 + E2E 测试
   13-14-order-detail-stats-fix: done   # 订单详情页统计数据修复(企业小程序)- ✅ 完成 (2026-01-16) - 修复详情页与列表页数据不一致问题,代码审查完成
   13-15-mini-ui-simplification: done   # 企业小程序 UI 简化 - 删除写操作按钮(2026-01-16 新增)- ✅ 完成 - 已删除所有写操作按钮,E2E 测试已创建
+  13-16-fileselector-uploadonly-mode: done   # FileSelector 添加 uploadOnly 模式(2026-01-16 新增)- ✅ 完成 - 给 FileSelector 组件添加 uploadOnly 属性,解决残疾人上传资料时的性能问题
   epic-13-retrospective: optional
 
 # Epic 组织架构 (2026-01-13):