[CLAUDE] FE-User: PE InfoTab inline edit + PeListPanel pencil edit hover mirror

Chunk 2/3 — mirror y hệt Chunk 1 sang fe-user (rule §3.9). 3 file:
  ~ components/pe/PeDetailTabs.tsx — InfoTab inline edit + autoEditHeader prop
  ~ components/pe/PeListPanel.tsx — pencil icon group-hover absolute right
  ~ pages/pe/PurchaseEvaluationWorkspacePage.tsx — URL editHeader=1 wiring

Verify: npm run build fe-user pass · 0 TS error.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-05-07 14:57:24 +07:00
parent 5a89dd2188
commit 27b291ccea
3 changed files with 160 additions and 19 deletions

View File

@ -34,6 +34,7 @@ export function PurchaseEvaluationWorkspacePage() {
const phase = sp.get('phase') ?? ''
const selectedId = sp.get('id')
const mode = sp.get('mode') // 'new' | null
const autoEditHeader = sp.get('editHeader') === '1'
const detail = useQuery({
queryKey: ['pe-detail', selectedId],
@ -77,17 +78,18 @@ export function PurchaseEvaluationWorkspacePage() {
</header>
<div className="grid flex-1 grid-cols-1 overflow-hidden lg:grid-cols-[320px_1fr]">
{/* Panel 1: List pure picker + sticky create */}
{/* Panel 1: List pure picker + sticky create + pencil edit hover */}
<PeListPanel
typeFilter={typeFilter}
selectedId={selectedId}
search={search}
phase={phase}
onSelect={id => setParams({ id, mode: null })}
onSelect={id => setParams({ id, mode: null, editHeader: null })}
onSearchChange={q => setParams({ q })}
onPhaseChange={p => setParams({ phase: p })}
showCreateButton
onCreate={() => setParams({ mode: 'new', id: null })}
onCreate={() => setParams({ mode: 'new', id: null, editHeader: null })}
onEditClick={id => setParams({ id, mode: null, editHeader: '1' })}
/>
{/* Panel 2: Empty | Header form | Detail tabs (workspace mode) */}
@ -117,9 +119,10 @@ export function PurchaseEvaluationWorkspacePage() {
{selectedId && detail.data && (
<PeDetailTabs
evaluation={detail.data}
onBack={() => setParams({ id: null })}
onBack={() => setParams({ id: null, editHeader: null })}
onDelete={() => del.mutate(detail.data!.id)}
mode="workspace"
autoEditHeader={autoEditHeader}
/>
)}
</main>