// Pure picker panel cho workspace 2-panel "Thao tác" (Pe_*_Create leaf). // KHÔNG có inline Edit/Delete (per Q1 user 2026-05-07): chỉ click để pick, + // optional sticky bottom "+ Thêm mới" button khi showCreateButton=true. // // Reuse-able: caller quản URL state qua props (search/phase/typeFilter), panel // chỉ render + invoke callbacks. Pendingme vẫn truyền được nếu cần dùng cho // inbox view khác (hiện chỉ workspace dùng pendingMe=false). import { useQuery } from '@tanstack/react-query' import { ClipboardCheck, Pencil, Plus, Search } from 'lucide-react' import { Button } from '@/components/ui/Button' import { Input } from '@/components/ui/Input' import { Select } from '@/components/ui/Select' import { EmptyState } from '@/components/EmptyState' import { SlaTimer } from '@/components/SlaTimer' import { api } from '@/lib/api' import { cn } from '@/lib/cn' import type { Paged } from '@/types/master' import { PeDisplayStatus, PeDisplayStatusColor, PeDisplayStatusLabel, PurchaseEvaluationPhase, PurchaseEvaluationTypeLabel, getPeDisplayStatus, isEditablePhase, type PeListItem, } from '@/types/purchaseEvaluation' export function PeListPanel({ typeFilter, pendingMe = false, selectedId, search, phase, onSelect, onSearchChange, onPhaseChange, showCreateButton = false, onCreate, onEditClick, editableOnly = false, editingRowId = null, }: { typeFilter: number | null pendingMe?: boolean selectedId: string | null search: string phase: string onSelect: (id: string) => void onSearchChange: (q: string) => void onPhaseChange: (p: string) => void showCreateButton?: boolean onCreate?: () => void /** Pencil edit icon hover next-to-row — click → select + auto-open Section 1 edit mode (URL ?editHeader=1). */ onEditClick?: (id: string) => void /** Workspace mode: chỉ list phiếu editable (DangSoanThao + TraLai). Filter * client-side sau khi fetch — BE chưa hỗ trợ multi-phase param. */ editableOnly?: boolean /** Row đang được edit (URL editHeader=1) — pencil icon "sáng lên" active state. * User 2026-05-07: visual feedback khi click pencil. */ editingRowId?: string | null }) { const list = useQuery({ queryKey: ['pe-list', { typeFilter, pendingMe, search, phase }], queryFn: async () => { if (pendingMe) { const res = await api.get('/purchase-evaluations/inbox', { params: { type: typeFilter ?? undefined }, }) return { items: res.data, total: res.data.length, page: 1, pageSize: res.data.length } } const res = await api.get>('/purchase-evaluations', { params: { pageSize: 50, search: search || undefined, type: typeFilter ?? undefined, phase: phase || undefined, }, }) return res.data }, }) const allRows = list.data?.items ?? [] const rows = editableOnly ? allRows.filter(p => isEditablePhase(p.phase)) : allRows return ( ) } // Map display status → phase enum cho filter dropdown. // Bản nháp = DangSoanThao (1), Đã duyệt = DaDuyet (7), Từ chối = TuChoi (99). // Đã gửi duyệt = không filter exact phase (cần BE hỗ trợ multi-phase filter // hoặc filter client-side). Tạm thời: trả về '' (không filter) → list show // hết, user vẫn thấy được phiếu Đã gửi duyệt cùng với tất cả khác. Trade-off // chấp nhận tới khi BE thêm multi-phase param. function statusToPhaseValue(status: PeDisplayStatus): string { if (status === PeDisplayStatus.Nhap) return String(PurchaseEvaluationPhase.DangSoanThao) if (status === PeDisplayStatus.DaDuyet) return String(PurchaseEvaluationPhase.DaDuyet) if (status === PeDisplayStatus.TuChoi) return String(PurchaseEvaluationPhase.TuChoi) return '' // DaGuiDuyet — multi-phase, không filter exact (TODO BE add support) }