diff --git a/fe-user/src/pages/pe/WorkflowMatrixViewPage.tsx b/fe-user/src/pages/pe/WorkflowMatrixViewPage.tsx index 9896056..a04c45b 100644 --- a/fe-user/src/pages/pe/WorkflowMatrixViewPage.tsx +++ b/fe-user/src/pages/pe/WorkflowMatrixViewPage.tsx @@ -1,11 +1,15 @@ // Plan AA Chunk B (S24, 2026-05-15) — User read-only matrix view của workflow // V2 đã admin Designer ghim (`IsUserSelectable=true`, Mig 25). Hiển thị tất cả -// version ghim cho ApplicableType (1=DuyetNcc, 2=DuyetNccPhuongAn) dưới dạng -// table 10 cột — Bước/Cấp/NV duyệt + 7 Allow* flag. +// version ghim cho ApplicableType (1=DuyetNcc, 2=DuyetNccPhuongAn). +// +// [Plan AA redesign S24 t1] Bro UAT request: drop table 11 cột compact symbol → +// switch sang panel-per-NV layout mirror admin Designer read-only. 7 label rõ +// tiếng Việt + color coding 2 layer (Step/Phòng + Cấp). Group levels theo +// `level.order` (OR-of-N approvers cùng Cấp render N panel song song). // // URL: /purchase-evaluations/workflow-matrix?type=1|2 // Mirror layout admin `fe-admin/src/pages/system/ApprovalWorkflowsV2Page.tsx` -// nhưng drop mutation (Clone/Ghim/Xoá) + render table thay vì ol/li. +// line 853-949 (read-only — drop input onChange). import { useQuery } from '@tanstack/react-query' import { useSearchParams } from 'react-router-dom' import { Network, CheckCircle2, Pin } from 'lucide-react' @@ -19,6 +23,26 @@ const TYPE_LABEL: Record = { 2: 'Duyệt NCC + Giải pháp', } +// Color palette per Step (Phòng) — cycle 5 màu để phân biệt Bước. Tailwind JIT +// yêu cầu full class strings (không dynamic interpolation). +const STEP_PALETTE = [ + { bg: 'bg-blue-50/40', border: 'border-blue-200', headerBg: 'bg-blue-100', headerText: 'text-blue-800' }, + { bg: 'bg-purple-50/40', border: 'border-purple-200', headerBg: 'bg-purple-100', headerText: 'text-purple-800' }, + { bg: 'bg-emerald-50/40', border: 'border-emerald-200', headerBg: 'bg-emerald-100', headerText: 'text-emerald-800' }, + { bg: 'bg-amber-50/40', border: 'border-amber-200', headerBg: 'bg-amber-100', headerText: 'text-amber-800' }, + { bg: 'bg-pink-50/40', border: 'border-pink-200', headerBg: 'bg-pink-100', headerText: 'text-pink-800' }, +] as const + +// Color palette per Cấp (Level order) — cycle 5 màu để phân biệt Cấp trong cùng +// Bước. Badge ring + tone đậm. +const LEVEL_PALETTE = [ + 'bg-violet-100 text-violet-800 ring-violet-300', + 'bg-sky-100 text-sky-800 ring-sky-300', + 'bg-teal-100 text-teal-800 ring-teal-300', + 'bg-orange-100 text-orange-800 ring-orange-300', + 'bg-rose-100 text-rose-800 ring-rose-300', +] as const + export function WorkflowMatrixViewPage() { const [searchParams] = useSearchParams() const rawType = Number(searchParams.get('type')) @@ -79,12 +103,11 @@ export function WorkflowMatrixViewPage() { } function WorkflowCard({ wf }: { wf: AwDefinitionDto }) { - // Tính tổng số row table = tổng levels qua all steps. - const totalRows = wf.steps.reduce((sum, s) => sum + s.levels.length, 0) + const totalLevels = wf.steps.reduce((sum, s) => sum + s.levels.length, 0) return (
-
+

@@ -112,118 +135,19 @@ function WorkflowCard({ wf }: { wf: AwDefinitionDto }) {

-
- {totalRows === 0 ? ( +
+ {totalLevels === 0 ? (
Quy trình chưa cấu hình bước duyệt nào.
) : ( -
- - - - - - - - - - - - - - - - - {wf.steps.map((step, sIdx) => ( - step.levels.length === 0 ? ( - - - - - ) : ( - step.levels.map((level, lIdx) => ( - - {lIdx === 0 && ( - - )} - - - - - - - - - - - )) - ) - ))} - -
Bước (Phòng)CấpNV duyệt - {'↶'} 1 Cấp - - {'↶'} 1 Bước - - {'↶'} Chỉ định - - {'↶'} Drafter - - {'✎'} Section 2 - - {'✎'} Ngân sách - - {'⏩'} Cấp cuối -
- Bước {sIdx + 1} — {step.departmentName ?? '(Không gắn phòng)'} - - Chưa có cấp duyệt -
- Bước {sIdx + 1} — {step.departmentName ?? '(Không gắn phòng)'} - - - Cấp {level.order} - - - - {level.approverUserName ?? level.approverUserId} - - {level.approverEmail && ( - - {level.approverEmail} - - )} -
-
+ wf.steps.map((step, sIdx) => ( + + )) )}
-