[CLAUDE] FE-User: Plan AA Chunk B - WorkflowMatrixViewPage read-only matrix view + types extend

NEW files:
- pages/pe/WorkflowMatrixViewPage.tsx ~215 LOC
  - useQuery GET /approval-workflows-v2?applicableType=N&isUserSelectable=true
  - PageHeader "Luồng duyệt — {label}" + Network icon
  - Loading/Error/Empty state 3 variant rõ
  - WorkflowCard per ghim version: header (code/version + badge "Đang dùng" emerald + "Được ghim" amber Pin icon)
  - Table 10 cột read-only: Bước rowSpan | Cấp | NV duyệt + 7 Allow* flag (✓/—)
  - FlagCell helper component TS indexed-access type union 7 keys
  - Mirror admin Designer ApprovalWorkflowsV2Page layout (drop edit mutations)
- types/approvalWorkflowV2.ts ~55 LOC
  - 5 type subset: AwLevelDto + AwStepDto + AwDefinitionDto + AwTypeSummaryDto + AwAdminOverviewDto
  - Field name khớp BE record positional param (history not versions)

MODIFIED:
- App.tsx +import + Route /purchase-evaluations/workflow-matrix trước /workspace

Why:
- Chunk A BE đã wire endpoint với filter param + menu seed Pe_DuyetNcc_WfView
  cho user xem matrix workflow admin Designer ghim trước khi tạo phiếu.

Verify:
- npm run build fe-user PASS clean 0 TS err, 1907 modules, 2.61s
- Reviewer cumulative A+B PASS 0 critical/major/minor

Pending Chunk C: Docs session log + STATUS + HANDOFF + 4 agent MEMORY drift.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-05-15 16:34:55 +07:00
parent ee776d5745
commit c6678022f7
3 changed files with 305 additions and 0 deletions

View File

@ -12,6 +12,7 @@ import { MyContractsPage } from '@/pages/contracts/MyContractsPage'
import { PurchaseEvaluationsListPage, PurchaseEvaluationDetailPage } from '@/pages/pe/PurchaseEvaluationsListPage'
import { PurchaseEvaluationCreatePage } from '@/pages/pe/PurchaseEvaluationCreatePage'
import { PurchaseEvaluationWorkspacePage } from '@/pages/pe/PurchaseEvaluationWorkspacePage'
import { WorkflowMatrixViewPage } from '@/pages/pe/WorkflowMatrixViewPage'
import { BudgetsListPage, BudgetDetailPage } from '@/pages/budgets/BudgetsListPage'
import { BudgetCreatePage } from '@/pages/budgets/BudgetCreatePage'
@ -34,6 +35,7 @@ function App() {
<Route path="/contracts/:id" element={<ContractDetailPage />} />
<Route path="/my-contracts" element={<MyContractsPage />} />
<Route path="/purchase-evaluations" element={<PurchaseEvaluationsListPage />} />
<Route path="/purchase-evaluations/workflow-matrix" element={<WorkflowMatrixViewPage />} />
<Route path="/purchase-evaluations/workspace" element={<PurchaseEvaluationWorkspacePage />} />
<Route path="/purchase-evaluations/new" element={<PurchaseEvaluationCreatePage />} />
<Route path="/purchase-evaluations/:id" element={<PurchaseEvaluationDetailPage />} />