[CLAUDE] FE-User: PE Danh sách disable interactions mirror fe-admin
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 2m59s

Mirror commit `7dfeb1a` cho fe-user (rule §3.9 duplicate có chủ đích).
PurchaseEvaluationsListPage readOnly=true cho PeDetailTabs + readOnly={!pendingMe}
cho PeWorkflowPanel. PeWorkflowPanel thêm prop readOnly hide Chuyển tiếp.

UAT mode: skip verify, push ngay.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-05-07 15:12:52 +07:00
parent 7dfeb1a486
commit a1665ee9d0
2 changed files with 18 additions and 4 deletions

View File

@ -22,7 +22,14 @@ import {
} from '@/types/purchaseEvaluation' } from '@/types/purchaseEvaluation'
import { PeApprovalsSection, PeHistorySection } from './PeDetailTabs' import { PeApprovalsSection, PeHistorySection } from './PeDetailTabs'
export function PeWorkflowPanel({ evaluation }: { evaluation: PeDetailBundle }) { export function PeWorkflowPanel({
evaluation,
readOnly = false,
}: {
evaluation: PeDetailBundle
/** true = ẩn Chuyển tiếp + Dialog transition (dùng cho Danh sách, không dùng Duyệt). */
readOnly?: boolean
}) {
const [target, setTarget] = useState<number | null>(null) const [target, setTarget] = useState<number | null>(null)
const [comment, setComment] = useState('') const [comment, setComment] = useState('')
const qc = useQueryClient() const qc = useQueryClient()
@ -92,7 +99,7 @@ export function PeWorkflowPanel({ evaluation }: { evaluation: PeDetailBundle })
})} })}
</ol> </ol>
{next.length > 0 && ( {next.length > 0 && !readOnly && (
<div> <div>
<Label className="text-xs">Chuyển tiếp:</Label> <Label className="text-xs">Chuyển tiếp:</Label>
<div className="mt-1 flex flex-wrap gap-1.5"> <div className="mt-1 flex flex-wrap gap-1.5">
@ -113,6 +120,11 @@ export function PeWorkflowPanel({ evaluation }: { evaluation: PeDetailBundle })
</div> </div>
</div> </div>
)} )}
{readOnly && next.length > 0 && (
<div className="rounded border border-dashed border-slate-200 px-3 py-2 text-[11px] text-slate-500">
Vào menu &ldquo;Duyệt&rdquo; đ chuyển phase.
</div>
)}
{target !== null && ( {target !== null && (
<Dialog <Dialog

View File

@ -204,12 +204,14 @@ export function PurchaseEvaluationsListPage() {
evaluation={detail.data} evaluation={detail.data}
onBack={() => setParam('id', null)} onBack={() => setParam('id', null)}
onDelete={() => del.mutate(detail.data!.id)} onDelete={() => del.mutate(detail.data!.id)}
readOnly={pendingMe} readOnly={true}
/> />
)} )}
</main> </main>
{/* Panel 3: Workflow + history */} {/* Panel 3: Workflow + history */}
{/* Danh sách (pendingMe=false) → readOnly=true → ẩn Chuyển tiếp transition.
Duyệt (pendingMe=true) → readOnly=false → cho approver chuyển phase. */}
<aside className="hidden overflow-y-auto border-l border-slate-200 bg-white p-4 lg:block"> <aside className="hidden overflow-y-auto border-l border-slate-200 bg-white p-4 lg:block">
{!selectedId && ( {!selectedId && (
<div className="rounded-lg border border-dashed border-slate-200 p-6 text-center text-sm text-slate-400"> <div className="rounded-lg border border-dashed border-slate-200 p-6 text-center text-sm text-slate-400">
@ -217,7 +219,7 @@ export function PurchaseEvaluationsListPage() {
Quy trình duyệt sẽ hiện khi chọn phiếu. Quy trình duyệt sẽ hiện khi chọn phiếu.
</div> </div>
)} )}
{selectedId && detail.data && <PeWorkflowPanel evaluation={detail.data} />} {selectedId && detail.data && <PeWorkflowPanel evaluation={detail.data} readOnly={!pendingMe} />}
</aside> </aside>
</div> </div>
</div> </div>