diff --git a/fe-admin/src/components/pe/PeDetailTabs.tsx b/fe-admin/src/components/pe/PeDetailTabs.tsx index e0ec9c6..6b795ae 100644 --- a/fe-admin/src/components/pe/PeDetailTabs.tsx +++ b/fe-admin/src/components/pe/PeDetailTabs.tsx @@ -108,16 +108,17 @@ export function PeDetailTabs({ const actorMatchesLevel = isAdmin || (currentUser?.id != null && v2Approvers.some(a => a.userId === currentUser.id)) const approverEditMode = evaluation.phase === PurchaseEvaluationPhase.ChoDuyet - && (evaluation.workflowOptions?.allowApproverEditDetails ?? false) + // Mig 29 (S21 t5) — read F3 từ currentLevelOptions (per-NV slot) + && (evaluation.currentLevelOptions?.allowApproverEditDetails ?? false) && actorMatchesLevel const itemsReadOnly = readOnly && !approverEditMode // "Lưu & Gửi Duyệt" workspace mode (user 2026-05-07): trigger transition // sang phase tiếp theo (= Đã gửi duyệt). nextPhases[0] thường là ChoPurchasing // (skip TuChoi). Sau success → toast + invalidate + onBack đóng workspace. - // Mig 28 (S21 t4) — F2: Drafter skip thẳng Cấp cuối. Workflow phải bật flag. + // Mig 29 (S21 t5) — F2: per-Drafter user flag (User Management page). const [skipToFinal, setSkipToFinal] = useState(false) - const allowSkipToFinal = evaluation.workflowOptions?.allowDrafterSkipToFinal ?? false + const allowSkipToFinal = evaluation.drafterAllowSkipToFinal ?? false const submitForApproval = useMutation({ mutationFn: async (opts: { skipToFinal: boolean }) => { diff --git a/fe-admin/src/components/pe/PeWorkflowPanel.tsx b/fe-admin/src/components/pe/PeWorkflowPanel.tsx index 35a73e1..e47876b 100644 --- a/fe-admin/src/components/pe/PeWorkflowPanel.tsx +++ b/fe-admin/src/components/pe/PeWorkflowPanel.tsx @@ -41,8 +41,8 @@ export function PeWorkflowPanel({ const { user: currentUser } = useAuth() const isAdmin = currentUser?.roles?.includes('Admin') ?? false - // Mig 28 — F1 workflow options. Null nếu V1 legacy → fallback chỉ "Trả về Drafter". - const wfOptions = evaluation.workflowOptions + // Mig 29 (S21 t5) — F1 options per-Level (Cấp Approver hiện tại). + const levelOptions = evaluation.currentLevelOptions // List approvers đã ký (cho mode Assignee dropdown pick) const signedApprovers = (evaluation.levelOpinions ?? []) .map(o => ({ userId: o.approverUserId, fullName: o.approverFullName ?? 'NV' })) @@ -307,15 +307,15 @@ export function PeWorkflowPanel({ <> {/* Mig 28 (S21 t4) — F1 mode picker khi Trả lại. Show modes enabled per workflow.options. Default Drafter (S17 fallback). */} - {(wfOptions?.allowReturnOneLevel - || wfOptions?.allowReturnOneStep - || wfOptions?.allowReturnToAssignee - || wfOptions?.allowReturnToDrafter - || !wfOptions) && ( + {(levelOptions?.allowReturnOneLevel + || levelOptions?.allowReturnOneStep + || levelOptions?.allowReturnToAssignee + || levelOptions?.allowReturnToDrafter + || !levelOptions) && (
- {(wfOptions?.allowReturnOneLevel) && ( + {(levelOptions?.allowReturnOneLevel) && ( )} - {(wfOptions?.allowReturnOneStep) && ( + {(levelOptions?.allowReturnOneStep) && ( )} - {(wfOptions?.allowReturnToAssignee) && ( + {(levelOptions?.allowReturnToAssignee) && ( )} - {(wfOptions?.allowReturnToDrafter !== false) && ( + {(levelOptions?.allowReturnToDrafter !== false) && (