diff --git a/fe-admin/src/components/pe/PeDetailTabs.tsx b/fe-admin/src/components/pe/PeDetailTabs.tsx index 92875ec..9167056 100644 --- a/fe-admin/src/components/pe/PeDetailTabs.tsx +++ b/fe-admin/src/components/pe/PeDetailTabs.tsx @@ -966,7 +966,13 @@ function BudgetAdjustSection({ ev, readOnly }: { ev: PeDetailBundle; readOnly: b && actorInCurrentLevel && approverEditBudgetAllowed - const canAdjust = !readOnly && (isAdmin || (isDrafter && isDrafterPhase) || isApproverChoDuyet) + // S23 t2 bug fix: F4 Approver scope BYPASS readOnly (mirror F3 itemsReadOnly + // pattern). Khi admin tick AllowApproverEditBudget cho slot + actor match + + // Phase=ChoDuyet → button "Điều chỉnh" enable trong menu Duyệt (readOnly=true) + // dù chế độ chỉ-đọc. Drafter + Admin vẫn cần !readOnly (chỉ active từ Workspace). + const canAdjust = isAdmin + || (!readOnly && isDrafter && isDrafterPhase) + || isApproverChoDuyet const initialManual = (ev.budgetManualName !== null || ev.budgetManualAmount !== null) && !ev.budgetId const [manualMode, setManualMode] = useState(initialManual) diff --git a/fe-user/src/components/pe/PeDetailTabs.tsx b/fe-user/src/components/pe/PeDetailTabs.tsx index dec220d..2bb6a9c 100644 --- a/fe-user/src/components/pe/PeDetailTabs.tsx +++ b/fe-user/src/components/pe/PeDetailTabs.tsx @@ -970,7 +970,13 @@ function BudgetAdjustSection({ ev, readOnly }: { ev: PeDetailBundle; readOnly: b && actorInCurrentLevel && approverEditBudgetAllowed - const canAdjust = !readOnly && (isAdmin || (isDrafter && isDrafterPhase) || isApproverChoDuyet) + // S23 t2 bug fix: F4 Approver scope BYPASS readOnly (mirror F3 itemsReadOnly + // pattern line 118). Khi admin tick AllowApproverEditBudget cho slot + actor + // match + Phase=ChoDuyet → button "Điều chỉnh" enable trong menu Duyệt (readOnly=true) + // dù chế độ chỉ-đọc. Drafter + Admin vẫn cần !readOnly (chỉ active từ Workspace). + const canAdjust = isAdmin + || (!readOnly && isDrafter && isDrafterPhase) + || isApproverChoDuyet const initialManual = (ev.budgetManualName !== null || ev.budgetManualAmount !== null) && !ev.budgetId const [manualMode, setManualMode] = useState(initialManual)