Chunk 4/5 — mirror y hệt Chunk 3 sang fe-user (rule §3.9 duplicate có chủ đích).
Files:
~ fe-user/src/types/purchaseEvaluation.ts — PeDetailBundle +2 field
~ fe-user/src/types/contracts.ts — ContractDetail +2 field
~ fe-user/src/components/pe/PeHeaderForm.tsx (copy từ fe-admin)
~ fe-user/src/components/pe/PeDetailTabs.tsx — Section "b. Ngân sách"
fallback display khi !ev.budget + có manual data
~ fe-user/src/pages/pe/PurchaseEvaluationCreatePage.tsx (copy refactor wrap)
~ fe-user/src/pages/contracts/ContractCreatePage.tsx — toggle pattern cho
NewContractForm + EditContractForm (giống fe-admin)
Verify: npm run build fe-user pass · 1904 modules · 0 TS error.
Next: Chunk 5 docs + push.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
34 lines
1.3 KiB
TypeScript
34 lines
1.3 KiB
TypeScript
// Page Create / edit header phiếu Duyệt NCC riêng (deep-link "Sửa header"
|
|
// button trong PeDetailTabs). Refactor 2026-05-07: wrap PeHeaderForm cho DRY
|
|
// + auto support manual budget (Mig 17). NCC + Báo giá + Items vẫn chỉnh ở
|
|
// Detail tabs sau khi save.
|
|
import { useNavigate, useSearchParams } from 'react-router-dom'
|
|
import { ClipboardCheck } from 'lucide-react'
|
|
import { PeHeaderForm } from '@/components/pe/PeHeaderForm'
|
|
import { PurchaseEvaluationType } from '@/types/purchaseEvaluation'
|
|
|
|
export function PurchaseEvaluationCreatePage() {
|
|
const navigate = useNavigate()
|
|
const [sp] = useSearchParams()
|
|
const editId = sp.get('id')
|
|
const urlType = sp.get('type') ? Number(sp.get('type')) : PurchaseEvaluationType.DuyetNcc
|
|
|
|
return (
|
|
<div className="space-y-4 p-6">
|
|
<header className="flex items-center gap-2">
|
|
<ClipboardCheck className="h-5 w-5 text-slate-500" />
|
|
<h1 className="text-base font-semibold tracking-tight text-slate-900">
|
|
{editId ? 'Sửa phiếu Duyệt NCC' : 'Tạo phiếu Duyệt NCC mới'}
|
|
</h1>
|
|
</header>
|
|
|
|
<PeHeaderForm
|
|
editId={editId}
|
|
defaultType={urlType}
|
|
onSaved={(id, type) => navigate(`/purchase-evaluations?id=${id}&type=${type}`)}
|
|
onCancel={() => navigate(-1)}
|
|
/>
|
|
</div>
|
|
)
|
|
}
|