- 견적 목록에 대표 상품(세션 item) 조인 노출 → '대상 상품 확인 불가' 해소 (backend protocol/crud/service + orval 재생성 + front mapQuotation 매핑) - 견적·협상카드 목록 클라이언트 페이지네이션 추가 (useClientPagination) - 견적중단을 서버 stop_quotation 호출로 영속 처리(상태=견적마감) - 신규 협상견적 라벨 발의→등록 통일 - 발의 위저드 카드선택에 협상/와일드 구분 뱃지 추가 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
23 lines
1.0 KiB
TypeScript
23 lines
1.0 KiB
TypeScript
import { useEffect, useState } from 'react';
|
|
|
|
// 클라이언트사이드 페이지네이션 단일 출처.
|
|
// 서버가 전량(또는 큰 페이지)을 한 번에 주고, 검색·필터를 프론트에서 거른 뒤
|
|
// 그 결과 배열을 화면용으로 잘라 보여줄 때 쓴다(견적·카드 목록).
|
|
// 서버 page/size 를 직접 보내는 useServerList 와 달리, 이 훅은 이미 받은 배열을 slice 만 한다.
|
|
export function useClientPagination<T>(items: T[], pageSize = 10) {
|
|
const [page, setPage] = useState(1);
|
|
|
|
const totalCount = items.length;
|
|
const totalPages = Math.max(1, Math.ceil(totalCount / pageSize));
|
|
|
|
// 필터·삭제로 결과가 줄어 현재 페이지가 범위를 벗어나면 마지막 페이지로 당긴다.
|
|
useEffect(() => {
|
|
if (page > totalPages) setPage(totalPages);
|
|
}, [page, totalPages]);
|
|
|
|
const safePage = Math.min(page, totalPages);
|
|
const pageItems = items.slice((safePage - 1) * pageSize, safePage * pageSize);
|
|
|
|
return { page: safePage, setPage, pageSize, totalPages, totalCount, pageItems };
|
|
}
|