[CLAUDE] FE-User: K4c SP-002 WfView loc theo nhom + test MAJOR-A /deleted lọc server (chot cum-2)
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 6m17s
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 6m17s
Gate PASS 0-blocker (sub-reviewer-gate-k4c.md): WorkflowMatrixViewPage doc ?group= (guard
/^[1-8]$/ chan ca "03") -> loc wf.code === KHKK-N{n} client-side co-chu-dich (payload da
tai tron theo type — khong ro cache, BE khong nhan truc group) + badge nhom + link xem-tat-ca
+ rong-vi-loc tach cau; type≠10 = 0 doi hanh vi (PE matrix regression chung-la-khong).
fe-admin 0-diff (lech co-y 2026-07-27). +1 Fact ListDeleted_FiltersByApprovalGroup (5 ve +
nhanh-Admin-cung-loc, assert Total, RED->GREEN 2 chieu do that — gate-K4b MAJOR-A dong).
Suite 622/0 (45D+577I) do tuoi ca gate lan lead. Ghi mo: 1 test cu
DeleteContractSigningPlan_SoftDeletes flaky 1/12 luot quan sat (gate truy 3 ve khong ra
duong diff — moc cho CI neu tai). No con: gate-K4c 3-MINOR (helper-dispose · link-mat-query
· highlight) + K5-MINOR-3 chu SAP + MAJOR-C da dong o wave nay.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@ -15,10 +15,11 @@
|
||||
// Mirror layout admin `fe-admin/src/pages/system/ApprovalWorkflowsV2Page.tsx`
|
||||
// line 853-949 cho 7 checkbox label (read-only — drop input onChange).
|
||||
import { useQuery } from '@tanstack/react-query'
|
||||
import { useSearchParams } from 'react-router-dom'
|
||||
import { Network, CheckCircle2, Pin } from 'lucide-react'
|
||||
import { Link, useLocation, useSearchParams } from 'react-router-dom'
|
||||
import { Network, CheckCircle2, Pin, Layers } from 'lucide-react'
|
||||
import { PageHeader } from '@/components/PageHeader'
|
||||
import { api } from '@/lib/api'
|
||||
import { khkkGroupMenuLabel, khkkGroupWorkflowCode } from '@/types/khkk'
|
||||
import type { AwAdminOverviewDto, AwDefinitionDto, AwLevelDto } from '@/types/approvalWorkflowV2'
|
||||
|
||||
// Mig 23 ApplicableType enum mirror (BE Domain/ApprovalWorkflowsV2)
|
||||
@ -50,6 +51,9 @@ const LEVEL_PALETTE = [
|
||||
|
||||
export function WorkflowMatrixViewPage() {
|
||||
const [searchParams] = useSearchParams()
|
||||
// Trang này gắn ở 3 route (/purchase-evaluations|/contracts|/khkk + /workflow-matrix)
|
||||
// ⇒ link "xem tất cả" phải bám đường dẫn ĐANG đứng, không hardcode một cái.
|
||||
const { pathname } = useLocation()
|
||||
const rawType = Number(searchParams.get('type'))
|
||||
// [S159-đợt5] +3 = Contract (ApplicableType.Contract — HĐ dùng CHUNG 1 bộ workflow V2
|
||||
// cho mọi ContractType ⇒ 7 leaf 'Luồng duyệt' của 7 nhóm HĐ đều trỏ về matrix này).
|
||||
@ -68,9 +72,32 @@ export function WorkflowMatrixViewPage() {
|
||||
|
||||
// Em chỉ render type được chọn — BE đã filter applicableType.
|
||||
const summary = data?.types.find(t => t.applicableType === typeInt)
|
||||
const workflows: AwDefinitionDto[] = summary?.history ?? []
|
||||
const allWorkflows: AwDefinitionDto[] = summary?.history ?? []
|
||||
const typeLabel = summary?.applicableTypeLabel ?? TYPE_LABEL[typeInt] ?? 'Quy trình duyệt'
|
||||
|
||||
// ── [K4c S166] Lọc theo NHÓM DUYỆT KHKK ────────────────────────────────────
|
||||
// 8 leaf "Luồng duyệt" của 8 nhóm (K4b) đều trỏ về CÙNG trang này, chỉ khác
|
||||
// `?group=n`. Không lọc thì cả 8 leaf hiện y hệt nhau — mục menu nói dối tên nó.
|
||||
// 🔴 Chỉ áp cho type 10 (Kế hoạch ký kết): `group` là khái niệm của riêng KHKK.
|
||||
// Type khác, hoặc `group` rác/thiếu ⇒ BỎ QUA hoàn toàn, hành vi cũ giữ nguyên
|
||||
// (thà hiện đủ còn hơn lọc theo một con số vô nghĩa rồi ra trang trắng).
|
||||
const rawGroup = searchParams.get('group')
|
||||
const khkkGroup =
|
||||
typeInt === 10 && rawGroup !== null && /^[1-8]$/.test(rawGroup) ? Number(rawGroup) : null
|
||||
|
||||
// 🔴 LỌC CLIENT-SIDE, CÓ CHỦ ĐÍCH: query trên kia đã tải TRỌN bộ quy trình của
|
||||
// type này rồi (`/approval-workflows-v2?applicableType=10`), nhóm chỉ là lát cắt
|
||||
// của đúng bộ đó ⇒ KHÔNG thêm trục `group` vào `queryKey`. Thêm vào sẽ đẻ 8 lần
|
||||
// gọi mạng cho cùng một payload, và 8 ô cache cùng nội dung.
|
||||
// Khớp bằng `code` (`AwDefinitionDto.code`) chứ không bằng tên/thứ tự: BE seed
|
||||
// `KHKK-N{n}` (`DbInitializer.cs:609`) và cũng chính `code` này là thứ BE dùng để
|
||||
// gác phiếu-pin-đúng-nhóm (`ContractSigningPlanFeatures.cs:420` regex `^KHKK-N([1-8])$`).
|
||||
// Một quy trình có thể có nhiều VERSION cùng `code` ⇒ lọc giữ đủ các version.
|
||||
const workflows =
|
||||
khkkGroup !== null
|
||||
? allWorkflows.filter(wf => wf.code === khkkGroupWorkflowCode(khkkGroup))
|
||||
: allWorkflows
|
||||
|
||||
return (
|
||||
// [Plan AA hotfix S24 t1] Bro UAT request: dịch hết content sang trái.
|
||||
// px-6 → px-2 (24px → 8px) cho title + table sát sidebar.
|
||||
@ -80,9 +107,34 @@ export function WorkflowMatrixViewPage() {
|
||||
<span className="flex items-center gap-2">
|
||||
<Network className="h-5 w-5 text-slate-500" />
|
||||
Luồng duyệt — {typeLabel}
|
||||
{khkkGroup !== null && (
|
||||
<span className="inline-flex items-center gap-1 rounded-md border border-violet-300 bg-violet-100 px-2 py-0.5 text-xs font-semibold text-violet-800">
|
||||
<Layers className="h-3.5 w-3.5" />
|
||||
Nhóm N{khkkGroup}
|
||||
</span>
|
||||
)}
|
||||
</span>
|
||||
}
|
||||
description="Cấu hình do Admin quản trị. Có thắc mắc liên hệ Admin."
|
||||
description={
|
||||
// Đang xem lát cắt của một nhóm thì phải nói RÕ nhóm nào — nếu không,
|
||||
// 8 leaf menu mở ra 8 trang trông hệt nhau và người dùng không biết
|
||||
// mình đang đứng ở đâu.
|
||||
khkkGroup !== null
|
||||
? `${khkkGroupMenuLabel(khkkGroup)} — cấu hình do Admin quản trị. Có thắc mắc liên hệ Admin.`
|
||||
: 'Cấu hình do Admin quản trị. Có thắc mắc liên hệ Admin.'
|
||||
}
|
||||
actions={
|
||||
khkkGroup !== null ? (
|
||||
// Giữ nguyên đường dẫn hiện tại (trang này gắn ở 3 route), chỉ bỏ
|
||||
// `group` ⇒ về lại chế độ xem cả 8 nhóm.
|
||||
<Link
|
||||
to={`${pathname}?type=${typeInt}`}
|
||||
className="rounded-md border border-slate-300 px-2.5 py-1 text-xs font-medium text-slate-600 transition hover:bg-slate-50"
|
||||
>
|
||||
Xem tất cả nhóm
|
||||
</Link>
|
||||
) : undefined
|
||||
}
|
||||
/>
|
||||
|
||||
{isLoading && (
|
||||
@ -99,7 +151,18 @@ export function WorkflowMatrixViewPage() {
|
||||
|
||||
{!isLoading && !isError && workflows.length === 0 && (
|
||||
<div className="rounded-xl border border-dashed border-slate-300 bg-slate-50/40 p-8 text-center text-sm text-slate-500">
|
||||
Chưa có quy trình nào được Admin ghim cho loại phiếu này. Liên hệ Admin.
|
||||
{/* 🔴 Rỗng-vì-lọc ⟂ rỗng-vì-chưa-có-gì là HAI chuyện khác nhau. Dùng
|
||||
chung một câu thì người dùng nhóm N5 tưởng cả module chưa cấu hình,
|
||||
trong khi 7 nhóm kia đang chạy bình thường. */}
|
||||
{khkkGroup !== null ? (
|
||||
<>
|
||||
Chưa có quy trình nào được Admin ghim cho nhóm{' '}
|
||||
<span className="font-medium text-slate-700">N{khkkGroup}</span>
|
||||
{allWorkflows.length > 0 && <> (loại phiếu này có {allWorkflows.length} quy trình ở nhóm khác)</>}. Liên hệ Admin.
|
||||
</>
|
||||
) : (
|
||||
<>Chưa có quy trình nào được Admin ghim cho loại phiếu này. Liên hệ Admin.</>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user