feat: complete LOW priority code quality improvements

Backend:
- LOW-002: Add Query validation with max page size limits (100)
- LOW-003: Replace magic strings with TaskStatus.is_done flag
- LOW-004: Add 'creation' trigger type validation
- Add action_executor.py with UpdateFieldAction and AutoAssignAction

Frontend:
- LOW-005: Replace TypeScript 'any' with 'unknown' + type guards
- LOW-006: Add ConfirmModal component with A11Y support
- LOW-007: Add ToastContext for user feedback notifications
- LOW-009: Add Skeleton components (17 loading states replaced)
- LOW-010: Setup Vitest with 21 tests for ConfirmModal and Skeleton

Components updated:
- App.tsx, ProtectedRoute.tsx, Spaces.tsx, Projects.tsx, Tasks.tsx
- ProjectSettings.tsx, AuditPage.tsx, WorkloadPage.tsx, ProjectHealthPage.tsx
- Comments.tsx, AttachmentList.tsx, TriggerList.tsx, TaskDetailModal.tsx
- NotificationBell.tsx, BlockerDialog.tsx, CalendarView.tsx, WorkloadUserDetail.tsx

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
beabigegg
2026-01-07 21:24:36 +08:00
parent 2d80a8384e
commit 4b5a9c1d0a
66 changed files with 7809 additions and 171 deletions

View File

@@ -1,9 +1,9 @@
# PROJECT CONTROL - Issue Tracking
> 審核日期: 2026-01-04
> 更新日期: 2026-01-05
> 整體完成度: 約 99%
> 已修復問題: 25 (CRIT-001~003, HIGH-001~008, MED-001~012, NEW-001~002)
> 更新日期: 2026-01-06
> 整體完成度: 100% (核心功能及 A11Y 全部完成)
> 已修復問題: 32 (CRIT-001~003, HIGH-001~008, MED-001~012, NEW-001~002, A11Y-001~006)
---
@@ -403,7 +403,7 @@
- **模組**: Backend - API
- **檔案**: 多個 list endpoints
- **問題描述**: 雖有分頁實作,但部分 endpoints 無最大 page size 限制。
- **狀態**: [ ] 修復
- **狀態**: [x] 修復 (Query validation with max limits)
---
@@ -414,7 +414,7 @@
- **檔案**: `backend/app/services/report_service.py:84-92`
- **問題描述**: 使用硬編碼字串比對狀態名稱 `["done", "completed", "完成"]`。
- **建議修復**: 統一使用 TaskStatus model 的 is_done flag
- **狀態**: [ ] 待改善
- **狀態**: [x] 已修復 (使用 TaskStatus.is_done flag)
---
@@ -424,7 +424,7 @@
- **模組**: Backend - Automation
- **檔案**: `backend/app/api/triggers/router.py:62-66`
- **問題描述**: 觸發器類型僅驗證 "field_change" 和 "schedule",但 spec 提及 "creation" 類型。
- **狀態**: [ ] 修復
- **狀態**: [x] 修復 (新增 "creation" 類型驗證)
---
@@ -435,7 +435,7 @@
- **檔案**: `frontend/src/pages/Login.tsx:21`
- **問題描述**: `catch (err: any)` 失去類型安全。
- **建議修復**: 使用 `catch (err: unknown)` 並進行類型守衛
- **狀態**: [ ] 待改善
- **狀態**: [x] 已修復 (使用 unknown + type guard)
---
@@ -450,7 +450,7 @@
- `frontend/src/components/WeeklyReportPreview.tsx:171`
- **問題描述**: 使用原生對話框,非無障礙且 UX 不一致。
- **建議修復**: 建立可重用的確認 Modal 元件
- **狀態**: [ ] 待改善
- **狀態**: [x] 已修復 (ConfirmModal 元件 + A11Y 支援)
---
@@ -461,7 +461,7 @@
- **檔案**: `frontend/src/pages/Spaces.tsx:31-32`
- **問題描述**: 錯誤僅記錄至 console無向使用者顯示。
- **建議修復**: 新增 toast 通知系統
- **狀態**: [ ] 待改善
- **狀態**: [x] 已修復 (ToastContext + 整合至 Spaces/Projects/ProjectSettings 等頁面)
---
@@ -482,7 +482,9 @@
- **模組**: Frontend - Multiple
- **問題描述**: 所有載入狀態顯示純文字 "Loading...",造成版面跳動。
- **建議修復**: 新增骨架元件 (skeleton components)
- **狀態**: [ ] 待改善
- **狀態**: [x] 已修復 (Skeleton 元件系列 + 全站整合)
- **已整合頁面**: App.tsx, ProtectedRoute.tsx, Spaces.tsx, Projects.tsx, Tasks.tsx, ProjectSettings.tsx, AuditPage.tsx, WorkloadPage.tsx, ProjectHealthPage.tsx
- **已整合元件**: Comments.tsx, AttachmentList.tsx, TriggerList.tsx, TaskDetailModal.tsx, NotificationBell.tsx, BlockerDialog.tsx, CalendarView.tsx, WorkloadUserDetail.tsx
---
@@ -492,7 +494,7 @@
- **模組**: Frontend
- **問題描述**: 未發現任何測試檔案。
- **建議修復**: 新增 Vitest/Jest 單元測試
- **狀態**: [ ] 待開發
- **狀態**: [x] 已修復 (Vitest + 21 測試)
---
@@ -504,18 +506,18 @@
| FEAT-002 | Task Management | 看板視角 (Kanban View) | 有 | 有 | 高 | ✅ 已完成 (KanbanBoard.tsx) |
| FEAT-003 | Task Management | 甘特圖視角 (Gantt View) | 有 | 有 | 中 | ✅ 已完成 (2026-01-05) |
| FEAT-004 | Task Management | 行事曆視角 (Calendar View) | 有 | 有 | 中 | ✅ 已完成 (2026-01-05) |
| FEAT-005 | Task Management | 子任務建立 UI | 有 | | 中 | 待開發 |
| FEAT-005 | Task Management | 子任務建立 UI | 有 | | 中 | ✅ 已完成 (2026-01-06) |
| FEAT-006 | Task Management | 拖拉變更狀態 | 有 | 有 | 中 | ✅ 已完成 (KanbanBoard drag-drop) |
| FEAT-007 | Resource Management | 負載熱圖 UI | 有 | 有 | 高 | ✅ 已完成 (WorkloadPage.tsx) |
| FEAT-008 | Resource Management | 專案健康看板 | 有 | 有 | 中 | ✅ 已完成 (ProjectHealthPage.tsx) |
| FEAT-009 | Resource Management | 容量更新 API | 有 | N/A | 低 | ✅ 已完成 (PUT /api/users/{id}/capacity) |
| FEAT-010 | Document Management | AES-256 加密存儲 | 有 | N/A | 高 | ✅ 已完成 (2026-01-05) |
| FEAT-011 | Document Management | 動態浮水印 | 有 | N/A | 中 | ✅ 已完成 (watermark_service.py) |
| FEAT-012 | Document Management | 版本還原 UI | 有 | | 低 | 待開發 |
| FEAT-012 | Document Management | 版本還原 UI | 有 | | 低 | ✅ 已完成 (2026-01-06) |
| FEAT-013 | Automation | 排程觸發器執行 | 有 | N/A | 中 | ✅ 已完成 (trigger_scheduler.py) |
| FEAT-014 | Automation | 更新欄位動作 | | | 低 | 待開發 |
| FEAT-015 | Automation | 自動指派動作 | | | 低 | 待開發 |
| FEAT-016 | Audit Trail | 稽核完整性驗證 UI | 有 | | 低 | 待開發 |
| FEAT-014 | Automation | 更新欄位動作 | | N/A | 低 | ✅ 已完成 (2026-01-06) |
| FEAT-015 | Automation | 自動指派動作 | | N/A | 低 | ✅ 已完成 (2026-01-06) |
| FEAT-016 | Audit Trail | 稽核完整性驗證 UI | 有 | | 低 | ✅ 已完成 (2026-01-06) |
---
@@ -526,7 +528,8 @@
- **檔案**: `frontend/src/pages/Spaces.tsx:95-101`
- **問題**: Modal 中的 input 欄位缺少關聯的 `<label>` 元素。
- **WCAG**: 1.3.1 Info and Relationships
- **狀態**: [ ] 修復
- **狀態**: [x] 修復 (2026-01-06)
- **修復方式**: 新增 visuallyHidden label 元素關聯 input 欄位,同時修復 Tasks.tsx, Projects.tsx
---
@@ -535,7 +538,8 @@
- **檔案**: `frontend/src/components/ResourceHistory.tsx:46`
- **問題**: 可點擊的 div 缺少 button role 或鍵盤處理。
- **WCAG**: 4.1.2 Name, Role, Value
- **狀態**: [ ] 修復
- **狀態**: [x] 修復 (2026-01-06)
- **修復方式**: 新增 `role="button"`, `tabIndex={0}`, `onKeyDown` 處理 Enter/Space 鍵, `aria-expanded`, `aria-label`
---
@@ -544,16 +548,18 @@
- **檔案**: `frontend/src/pages/AuditPage.tsx:16`
- **問題**: 關閉按鈕 (x) 缺少 aria-label。
- **WCAG**: 4.1.2 Name, Role, Value
- **狀態**: [ ] 修復
- **狀態**: [x] 修復 (2026-01-06)
- **修復方式**: 新增 `aria-label="Close"` 至所有 Modal 關閉按鈕
---
### A11Y-004: 顏色對比不足
- **檔案**: 多個檔案
- **問題**: 使用淺灰色文字 (#999, #666) 可能未達 WCAG AA 對比度標準。
- **問題**: 使用淺灰色文字 (#999) 未達 WCAG AA 對比度標準 (2.85:1 < 4.5:1)
- **WCAG**: 1.4.3 Contrast (Minimum)
- **狀態**: [ ] 待檢查
- **狀態**: [x] 已修復 (2026-01-06)
- **修復方式**: 將所有 `#999` 改為 `#767676` (對比度 4.54:1符合 WCAG AA)
---
@@ -562,7 +568,8 @@
- **檔案**: `frontend/src/pages/Login.tsx`
- **問題**: Input 樣式設定 `outline: none` 但無自訂焦點樣式。
- **WCAG**: 2.4.7 Focus Visible
- **狀態**: [ ] 修復
- **狀態**: [x] 修復 (2026-01-06)
- **修復方式**: 在 index.css 新增全域 `*:focus-visible` 樣式和 `.login-input:focus` 自訂樣式
---
@@ -571,7 +578,8 @@
- **檔案**: 多個 Modal 元件
- **問題**: Modal 未捕獲焦點,不支援 Escape 鍵關閉。
- **WCAG**: 2.1.2 No Keyboard Trap
- **狀態**: [ ] 修復
- **狀態**: [x] 修復 (2026-01-06)
- **修復方式**: 所有 Modal 新增 `useEffect` 監聽 document keydown 事件處理 Escape 鍵,新增 `role="dialog"`, `aria-modal="true"`, `aria-labelledby`, `tabIndex={-1}`
---
@@ -614,8 +622,8 @@
- [x] 高優先問題全部修復 (8/8 已完成)
- [x] 中優先問題全部修復 (12/12 已完成)
- [x] 核心功能實作完成
- [ ] 可訪問性問題修復
- [ ] 程式碼品質改善
- [x] 可訪問性問題修復 (6/6 已完成)
- [x] 程式碼品質改善 (LOW-002~010 已完成, LOW-001/LOW-008 待改善)
### 本次修復摘要 (2026-01-04)
@@ -645,12 +653,42 @@
| MED-011 | DOM 操作在元件外執行 | ✅ 已修復 |
| MED-012 | PDF 匯出未實作 | ✅ 已修復 |
### 本次修復摘要 (2026-01-06)
| Issue ID | 問題 | 狀態 |
|----------|------|------|
| FEAT-005 | 子任務建立 UI | ✅ 已完成 (SubtaskList.tsx) |
| FEAT-012 | 版本還原 UI | ✅ 已完成 (AttachmentVersionHistory.tsx) |
| FEAT-014 | 更新欄位動作 | ✅ 已完成 (action_executor.py UpdateFieldAction) |
| FEAT-015 | 自動指派動作 | ✅ 已完成 (action_executor.py AutoAssignAction) |
| FEAT-016 | 稽核完整性驗證 UI | ✅ 已完成 (IntegrityVerificationModal) |
| A11Y-001 | 表單缺少 Label | ✅ 已修復 (visuallyHidden labels) |
| A11Y-002 | 非語義化按鈕 | ✅ 已修復 (role, tabIndex, onKeyDown) |
| A11Y-003 | 圖示按鈕缺少 aria-label | ✅ 已修復 |
| A11Y-005 | 缺少焦點指示器 | ✅ 已修復 (global focus-visible styles) |
| A11Y-004 | 顏色對比不足 | ✅ 已修復 (#999 → #767676) |
| A11Y-006 | Modal 無焦點捕獲 | ✅ 已修復 (Escape key, ARIA attrs) |
| 機密專案 | 強制加密上傳 | ✅ 已完成 (attachments/router.py) |
### 本次修復摘要 (2026-01-07)
| Issue ID | 問題 | 狀態 |
|----------|------|------|
| LOW-002 | 分頁無最大限制 | ✅ 已修復 (Query validation with max limits) |
| LOW-003 | 狀態名稱使用魔術字串 | ✅ 已修復 (使用 TaskStatus.is_done flag) |
| LOW-004 | 觸發器類型驗證不完整 | ✅ 已修復 (新增 "creation" 類型驗證) |
| LOW-005 | 使用 any 類型 | ✅ 已修復 (使用 unknown + type guard) |
| LOW-006 | 使用原生 confirm()/alert() | ✅ 已修復 (ConfirmModal 元件 + A11Y 支援) |
| LOW-007 | 錯誤處理無使用者回饋 | ✅ 已修復 (ToastContext + 整合多頁面) |
| LOW-009 | 缺少載入骨架 | ✅ 已修復 (Skeleton 元件系列 + 全站 17 處整合) |
| LOW-010 | 缺少前端測試 | ✅ 已修復 (Vitest + 21 測試) |
### 後續待處理
| 類別 | 問題 | 備註 |
|------|------|------|
| LOW-001~010 | 低優先問題 | 程式碼品質改善 |
| A11Y-001~006 | 可訪問性問題 | WCAG 合規 |
| LOW-001 | 缺少完整類型提示 | Backend services 待改善 |
| LOW-008 | 樣式方法不一致 | 非關鍵,建議後續統一 |
### QA 驗證結果
@@ -742,4 +780,4 @@
---
*此文件由 Claude Code 自動生成於 2026-01-04*
*更新於 2026-01-05*
*更新於 2026-01-07*