update_cow_list_ui

This commit is contained in:
NYD
2026-01-07 15:13:42 +09:00
parent 0780f2e47c
commit dae3808221
10 changed files with 1081 additions and 502 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -404,14 +404,30 @@
/* 테이블 헤더 셀 */
.cow-table-header {
@apply text-center py-3 px-3 font-semibold;
font-size: 0.9375rem; /* 15px */
@apply text-center font-bold;
padding: 0.5rem 0.5rem; /* py-2 px-2 */
font-size: 1.25rem; /* 20px */
}
@media (min-width: 640px) {
.cow-table-header {
padding: 0.625rem 0.625rem; /* py-2.5 px-2.5 */
font-size: 1.375rem; /* 22px */
}
}
@media (min-width: 768px) {
.cow-table-header {
padding: 0.75rem 0.75rem; /* py-3 px-3 */
font-size: 1.5rem; /* 24px */
}
}
/* 테이블 바디 셀 */
.cow-table-cell {
@apply text-center py-3 px-3;
font-size: 0.9375rem; /* 15px */
@apply text-center;
padding: 0.5rem 0.375rem; /* py-2 px-1.5 */
font-size: 1.35rem; /* 21.6px */
}
/* 분석불가 행 - 각 td에 오버레이 */

View File

@@ -31,12 +31,12 @@ const userNavMain = [
},
{
title: "개체 조회",
url: "/cow",
url: "/cow?reset=true",
icon: IconListDetails,
items: [
{
title: "개체 목록",
url: "/cow",
url: "/cow?reset=true",
},
],
},

View File

@@ -6,6 +6,7 @@
* 기능:
* - 현재 연도부터 5년 전까지 선택 가능 (예: 2025~2020)
* - URL 파라미터 ?year=2024 와 동기화
* - 농장의 가장 최근 분석 연도를 기본값으로 사용
*
* 사용처:
* - site-header.tsx: 헤더 연도 선택 드롭다운
@@ -33,28 +34,59 @@ function AnalysisYearProviderInner({ children }: { children: React.ReactNode })
const currentYear = new Date().getFullYear()
const availableYears = Array.from({ length: 6 }, (_, i) => currentYear - i)
// URL 파라미터에서 연도 가져오기, 없으면 현재 연도 사용
const yearFromUrl = searchParams.get('year')
const initialYear = yearFromUrl && !isNaN(Number(yearFromUrl))
? Number(yearFromUrl)
: currentYear
// 초기 년도는 현재 년도로 설정 (클라이언트에서 useEffect로 업데이트)
const [selectedYear, setSelectedYearState] = useState<number>(currentYear)
const [isInitialized, setIsInitialized] = useState<boolean>(false)
const [selectedYear, setSelectedYearState] = useState<number>(initialYear)
// URL 파라미터와 동기화
// 클라이언트 사이드에서만 실행: localStorage와 URL에서 초기 년도 설정
useEffect(() => {
if (isInitialized || typeof window === 'undefined') return
const yearFromUrl = searchParams.get('year')
if (yearFromUrl && !isNaN(Number(yearFromUrl))) {
console.log('[AnalysisYear] Initial year from URL:', yearFromUrl)
setSelectedYearState(Number(yearFromUrl))
setIsInitialized(true)
return
}
const savedYear = localStorage.getItem('defaultAnalysisYear')
if (savedYear && !isNaN(Number(savedYear))) {
console.log('[AnalysisYear] Initial year from localStorage:', savedYear)
const year = Number(savedYear)
setSelectedYearState(year)
// URL에 year 파라미터 추가
const params = new URLSearchParams(searchParams.toString())
params.set('year', year.toString())
router.replace(`${pathname}?${params.toString()}`)
}
setIsInitialized(true)
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []) // 의도적으로 빈 배열 사용 (최초 1회만 실행)
// URL 파라미터와 동기화 (초기화 이후에만 실행)
useEffect(() => {
if (!isInitialized) return
const yearParam = searchParams.get('year')
if (yearParam && !isNaN(Number(yearParam))) {
const year = Number(yearParam)
if (availableYears.includes(year)) {
if (availableYears.includes(year) && year !== selectedYear) {
setSelectedYearState(year)
}
}
}, [searchParams, availableYears])
}, [searchParams, availableYears, isInitialized, selectedYear])
const setSelectedYear = (year: number) => {
console.log('[AnalysisYear] setSelectedYear:', year)
setSelectedYearState(year)
// localStorage 업데이트 (사용자가 선택한 년도를 디폴트로 저장)
if (typeof window !== 'undefined') {
localStorage.setItem('defaultAnalysisYear', year.toString())
}
// URL 파라미터 업데이트
const params = new URLSearchParams(searchParams.toString())
params.set('year', year.toString())