diff --git a/fe-admin/src/components/pe/PeKhkkSidePanel.tsx b/fe-admin/src/components/khkk/KhkkWorkListPanel.tsx similarity index 77% rename from fe-admin/src/components/pe/PeKhkkSidePanel.tsx rename to fe-admin/src/components/khkk/KhkkWorkListPanel.tsx index 8952a81..d918fdf 100644 --- a/fe-admin/src/components/pe/PeKhkkSidePanel.tsx +++ b/fe-admin/src/components/khkk/KhkkWorkListPanel.tsx @@ -1,9 +1,15 @@ -// [S174 owner] Cột PHẢI của màn "Duyệt NCC — Thao tác" — 1 cột, 2 TẦNG 50/50: +// [S174 owner] PANEL 1 (danh sách) của màn "Kế hoạch ký kết HĐ — Thao tác" — 1 cột, 2 TẦNG: // · tầng TRÊN = phiếu Duyệt NCC ĐÃ DUYỆT (có NCC trúng thầu) mà CHƯA lập kế hoạch ký kết, -// gom theo DỰ ÁN — đây là "việc còn phải làm"; -// · tầng DƯỚI = kế hoạch ký kết ĐÃ TẠO — đây là "việc đã làm rồi". -// Anh chốt: "Thử ý tưởng 1 cột 2 tầng thử, 50% tầng trên là duyệt NCC, còn 50% tầng dưới -// là KHKK". File MIRROR SHA256 identical với fe-user counterpart. +// gom theo DỰ ÁN — "việc còn phải làm"; bấm = nạp thẳng vào form tạo; +// · tầng DƯỚI = kế hoạch ký kết ĐÃ TẠO — "việc đã làm rồi"; bấm = XEM tại chỗ (read-only). +// File MIRROR SHA256 identical với fe-user counterpart. +// +// 🔴 LỊCH SỬ ĐẶT SAI CHỖ — ghi để không tái phạm: bản đầu S174 gắn panel này thành cột 3 của +// màn *Duyệt NCC — Thao tác* (`PurchaseEvaluationWorkspacePage`). Anh bác: **"chỗ duyệt NCC +// đã golive và đã tốt rồi"** — ý anh từ đầu là làm màn Thao tác của KHKK **GIỐNG GIAO DIỆN** +// Thao tác của Duyệt NCC, chứ không phải chèn thêm thứ vào màn Duyệt NCC. Đã revert +// `PurchaseEvaluationWorkspacePage` về đúng byte của `1b3bcaa`. Bài: "làm giống màn X" ≠ +// "sửa màn X". // // 🔴 0 ENDPOINT MỚI — dùng lại đúng 2 cửa đã sống: // · `GET /contract-signing-plans/approved-pe-awaiting-plan` (chính cửa `KhkkCreatePage` @@ -18,7 +24,6 @@ // con). Người chỉ có quyền PE mà không có KHKK sẽ ăn 403 rải khắp cột. ⇒ gate bằng ĐÚNG key // của endpoint, và khi thiếu quyền thì NÓI RA thay vì để cột trắng trông như "chưa có gì". import { useQuery } from '@tanstack/react-query' -import { useNavigate } from 'react-router-dom' import { FileCheck, FileSignature, Lock } from 'lucide-react' import { usePermission } from '@/hooks/usePermission' import { api } from '@/lib/api' @@ -68,8 +73,23 @@ function Tier({ ) } -export function PeKhkkSidePanel() { - const navigate = useNavigate() +export function KhkkWorkListPanel({ + onPickPe, + onPickPlan, + selectedPeId, + selectedPlanId, + footer, +}: { + /** Bấm PE ở tầng trên → host nạp phiếu đó vào form tạo (Ở LẠI màn, không điều hướng). */ + onPickPe: (peId: string) => void + /** Bấm KHKK ở tầng dưới → host mở phiếu đó ở panel 2, CHỈ XEM. Anh chốt: "click vào phiếu + * nào thì cho hiện phiếu đó luôn, chỉ view là đc, ko re-direct về phiếu gốc". */ + onPickPlan: (planId: string) => void + selectedPeId?: string | null + selectedPlanId?: string | null + /** Nút "+ Thêm mới" dính đáy — mirror `PeListPanel` của màn Duyệt NCC — Thao tác. */ + footer?: React.ReactNode +}) { const { can } = usePermission() // 🔴 ĐÚNG key policy của endpoint — KHÔNG dùng `Khkk_*` (đó là key MENU, tầng hiển thị). const canKhkk = can('KeHoachKyKet', 'Read') @@ -109,7 +129,7 @@ export function PeKhkkSidePanel() { const planItems = plans.data?.items ?? [] return ( -