[CLAUDE] Contract: W7 server-filter per-type — ContractsListPage (kèm 3 fix badge/pagination) + MyContractsPage; InboxPage blocker-note (nợ w7b-inbox-param)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@ -42,27 +42,43 @@ export function ContractsListPage() {
|
||||
|
||||
const urlType = searchParams.get('type')
|
||||
const urlPendingMe = searchParams.get('pendingMe') === '1'
|
||||
const typeFilter = urlType ? Number(urlType) : null
|
||||
// [W7 S187] `type` nay ĐI THẲNG lên BE (không còn lọc client) ⇒ phải chặn giá trị rác
|
||||
// TRƯỚC khi lên dây: `Number('abc') = NaN` mà `NaN != null` là true ⇒ nếu không chặn thì
|
||||
// axios gửi `?type=NaN`, BE bind `ContractType?` hỏng → 400 thay vì "danh sách rỗng".
|
||||
// Khuôn đã chạy CÙNG THƯ MỤC ở `HardCopiesPage.tsx:66-68` (GĐ4) — dùng lại nguyên.
|
||||
const parsedType = urlType === null ? Number.NaN : Number(urlType)
|
||||
const typeFilter = Number.isFinite(parsedType) && parsedType > 0 ? parsedType : null
|
||||
const search = searchParams.get('q') ?? ''
|
||||
const phase = searchParams.get('phase') ?? ''
|
||||
const page = Number(searchParams.get('page') ?? '1')
|
||||
const selectedId = searchParams.get('id')
|
||||
|
||||
const list = useQuery({
|
||||
// `typeFilter` ĐÃ nằm trong key từ trước ⇒ đổi sang lọc server KHÔNG cần thêm trục mới;
|
||||
// cache cũ (payload chưa lọc) tự hết hiệu lực vì mỗi `type` là 1 ô key riêng sẵn rồi.
|
||||
queryKey: ['contracts', { page, search, phase, typeFilter, urlPendingMe }],
|
||||
queryFn: async () => {
|
||||
const res = await api.get<Paged<ContractListItem>>('/contracts', {
|
||||
params: {
|
||||
page,
|
||||
pageSize: 30,
|
||||
search: search || undefined,
|
||||
phase: phase || undefined,
|
||||
},
|
||||
})
|
||||
let items = res.data.items
|
||||
if (typeFilter != null) items = items.filter(c => c.type === typeFilter)
|
||||
return { ...res.data, items }
|
||||
},
|
||||
queryFn: async () =>
|
||||
(
|
||||
await api.get<Paged<ContractListItem>>('/contracts', {
|
||||
params: {
|
||||
page,
|
||||
pageSize: 30,
|
||||
search: search || undefined,
|
||||
phase: phase || undefined,
|
||||
// [W7 S187] Lọc loại HĐ CHUYỂN LÊN SERVER. Trước đây lọc client SAU khi đã cắt
|
||||
// 30 dòng/trang ⇒ 3 cái sai cùng lúc: (a) loại hiếm biến mất IM LẶNG khi nằm
|
||||
// ngoài trang đang xem; (b) badge đếm `{total}` ở header lấy `res.data.total`
|
||||
// = tổng CHƯA lọc ⇒ nói dối khi có `?type=`; (c) phân trang tính theo tổng
|
||||
// chưa lọc ⇒ có trang rỗng hoàn toàn. BE lọc TRƯỚC khi đếm & cắt
|
||||
// (`ContractFeatures.cs:327` → `CountAsync:340` → `Skip/Take:342`) ⇒ chuyển lên
|
||||
// server sửa cả 3. Param có sẵn: `ContractsController.cs:25`.
|
||||
// `?? undefined` ⇒ axios bỏ hẳn key, giữ nguyên hành vi "không chọn loại".
|
||||
type: typeFilter ?? undefined,
|
||||
},
|
||||
})
|
||||
).data,
|
||||
// [W7 S187] Vế `items.filter(c => c.type === typeFilter)` ĐÃ GỠ — BE lọc rồi. Giữ lại
|
||||
// = lọc 2 lần, và che mất lỗi nếu server trả sai loại (sai sẽ THẦM LẶNG).
|
||||
})
|
||||
|
||||
const detail = useQuery({
|
||||
|
||||
Reference in New Issue
Block a user