[CLAUDE] Contract: UAT S174 vong-4 — Thao tac chi 3 trang-thai mo + go vien card cua cay KHKK
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 6m49s

1. Tang duoi man Thao tac: DANH-SACH-TRANG 3 trang-thai — anh: "cho thao tac chi hien tra
   lai va nhap, tu choi thoi nhe" => {DangSoanThao, TraLai, TuChoi}. `ChoDuyet` CUNG bi loai
   (khac vong-3 chi bo `DaDuyet`): phieu dang trinh duyet thi nguoi soan khong thao tac gi
   duoc nua.
   🔴 Doi tu LOAI-TRU sang DANH-SACH-TRANG la CO CHU DICH: loai-tru (`!== DaDuyet`) se tu
   dong NHAN moi phase them ve sau; danh-sach-trang thi phase moi phai khai TUONG MINH moi
   hien. O man chi nen chua viec CON SUA DUOC, im lang nhan them la hong => chon ve chat.
   Tieu-de doi thanh "KHKK · nhap / tra lai / tu choi" — noi DUNG tap dang hien, de nguoi
   dung biet ngay vi sao phieu vua gui duyet "bien mat".

2. Cay toan trinh trong man Danh sach KHKK: GO vo card — anh: "style cho no giong nhau dong
   bo nhe, style ben KHKK co cai vien ben ngoai".
   🔴 GOC RE + BAI HOC: truoc do da truyen `className="border-0 shadow-none"` voi Y DINH tat
   vo card, nhung `.card-accent` khai o `index.css:112` NAM NGOAI `@layer` nen THANG utility
   cua Tailwind v4 => lenh tat bi VO HIEU IM LANG. Day dung la gotcha #66 cua chinh repo
   (rule tho ngoai @layer thang utility). Fix = GO CLASS theo dieu kien (`!hideHeader &&
   'card-accent lg:sticky lg:top-4'`), KHONG de bang utility.
   `hideHeader` nay mang dung nghia "dang NHUNG trong panel khac" => bo ca vo card lan sticky
   cho lien mach voi host, y nhu cay ben Duyet NCC. 6 host con lai khong truyen => nguyen ven.

Verify: build 2 app PASS; mirror SHA256 3/3 cap KHOP; grep xac nhan `card-accent` nay nam
sau dieu kien `!hideHeader`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-08-05 15:53:25 +07:00
parent f86f30d291
commit d0453bad7b
6 changed files with 54 additions and 22 deletions

View File

@ -291,7 +291,6 @@ export function KhkkListPanel({
{!flatMode && (
<PipelineTreePanel
currentStage={2}
className="border-0 shadow-none"
hideHeader
bodyMaxHClass="max-h-[28rem] lg:max-h-none"
stage2Options={{ stage2Content, stage2Count, onOpenKhkk: onSelect }}

View File

@ -124,14 +124,19 @@ export function KhkkWorkListPanel({
else byProject.set(key, [pe])
}
// [S174 owner] "đã duyệt bỏ đi luôn" — tầng dưới chỉ giữ kế hoạch CHƯA xong việc
// (nháp / chờ duyệt / trả lại / từ chối). Phiếu `DaDuyet` đã hết việc ở màn Thao tác.
// 🔴 KHAI GIỚI-HẠN (lọc ở FE): endpoint chỉ nhận `phase` ĐƠN, không có tham số "loại trừ"
// ⇒ (1) `plans.data.total` của server ĐÃ GỒM phiếu DaDuyet nên KHÔNG được dùng làm số
// hiển thị — đếm từ chính mảng đã lọc; (2) cửa-sổ 30 phiếu mới nhất có thể TOÀN DaDuyet,
// khi đó tầng dưới rỗng dù còn phiếu nháp cũ hơn. Chấp nhận ở UAT; muốn chuẩn thì BE thêm
// tham số loại-trừ rồi lọc SERVER-SIDE.
const planItems = (plans.data?.items ?? []).filter((k) => k.phase !== KhkkPhase.DaDuyet)
// [S174 owner] "chỗ thao tác chỉ hiển trả lại và nháp, từ chối thôi nhé" ⇒ DANH-SÁCH-TRẮNG
// 3 trạng thái, KHÔNG phải loại-trừ. 🔴 Đổi từ loại-trừ sang danh-sách-trắng là CÓ CHỦ ĐÍCH:
// loại-trừ (`!== DaDuyet`) sẽ tự động NHẬN mọi phase mới thêm về sau; danh-sách-trắng thì
// phase mới phải được khai TƯỜNG MINH mới hiện. Ở màn Thao tác — nơi chỉ nên có việc CÒN
// SỬA ĐƯỢC — im lặng nhận thêm là hỏng, nên chọn vế chặt.
// 🔸 `ChoDuyet` CŨNG bị loại (khác lượt trước chỉ bỏ `DaDuyet`): phiếu đang trình duyệt thì
// người soạn không thao tác gì được nữa.
// 🔴 KHAI GIỚI-HẠN (lọc ở FE): endpoint chỉ nhận `phase` ĐƠN, không nhận nhiều ⇒ (1) KHÔNG
// dùng `plans.data.total` làm số hiển thị (nó đếm MỌI phase) — đếm từ mảng đã lọc;
// (2) cửa-sổ 30 phiếu mới nhất có thể toàn phiếu đã duyệt ⇒ tầng dưới rỗng dù còn nháp
// cũ hơn. Chấp nhận ở UAT; muốn chuẩn thì BE nhận `phases[]` rồi lọc SERVER-SIDE.
const OPEN_PHASES: number[] = [KhkkPhase.DangSoanThao, KhkkPhase.TraLai, KhkkPhase.TuChoi]
const planItems = (plans.data?.items ?? []).filter((k) => OPEN_PHASES.includes(k.phase))
return (
<aside className="flex min-h-0 flex-col overflow-hidden border-r border-slate-200 bg-white">
@ -214,7 +219,9 @@ export function KhkkWorkListPanel({
<div className="shrink-0 border-t-2 border-slate-200" />
<Tier
title="Kế hoạch ký kết đang xử lý"
// Tên nói ĐÚNG tập đang hiện, không nói chung chung — người đọc phải biết ngay
// vì sao phiếu họ vừa gửi duyệt "biến mất" khỏi đây.
title="KHKK · nháp / trả lại / từ chối"
// Đếm từ mảng ĐÃ LỌC, KHÔNG lấy `total` của server (xem khối lọc phía trên).
count={plans.data ? planItems.length : null}
accent="bg-violet-50 text-violet-600"