Files
frontend/apps/sn/app/components/ui/YearRangeSelectBox.tsx
T
swcho 7a9038bbe2 feat, fix : SidoSigunguSelectBox 및 YearRangeSelectBox, SelectBox2 컴포넌트 추가, SearchModal.tsx 스타일 수정
- 선택한 시도에 따라 동적으로 시군구 옵션이 바뀌는 SidoSigunguSelectBox 구현
- 시작/종료년도 유효성 검증이 포함된 YearRangeSelectBox 구현
- 드롭다운 z-index 개선 및 재사용 가능한 SelectBox2 컴포넌트 도입
- SearchModal.tsx 태그들 공통 컴포넌트로 변환하여 스타일 통일
2025-05-14 17:53:38 +09:00

69 lines
1.9 KiB
TypeScript

import React from "react";
import { SelectBox2 } from "@common/business_components/ui/select/index-2";
interface YearRangeSelectBoxProps {
start: string;
end: string;
onChange: (range: { start: string; end: string }) => void;
startLabel?: string;
endLabel?: string;
minYear?: number;
maxYear?: number;
className?: string;
selectClass?: string;
}
export function YearRangeSelectBox({
start,
end,
onChange,
startLabel = "시작년도",
endLabel = "",
minYear = 1900,
maxYear = new Date().getFullYear(),
className = "",
selectClass = "rounded-lg bg-white"
}: YearRangeSelectBoxProps) {
// 시작년도 배열
const getStartYearArray = () => {
const years = Array.from({ length: maxYear - minYear + 1 }, (_, i) =>
(maxYear - i).toString()
).filter(y => !end || parseInt(y) <= parseInt(end));
return [
{ val: "0", text: "년" },
...years.map(y => ({ val: y, text: y })),
];
};
// 종료년도 배열
const getEndYearArray = () => {
const years = Array.from({ length: maxYear - minYear + 1 }, (_, i) =>
(maxYear - i).toString()
).filter(y => !start || parseInt(y) >= parseInt(start));
return [
{ val: "9999", text: "년" },
...years.map(y => ({ val: y, text: y })),
];
};
return (
<div className={`flex items-center ${className}`}>
<SelectBox2
className="w-50 mr-3"
selectClass={selectClass}
label={startLabel}
selectArray={getStartYearArray()}
onSelectValue={val => onChange({ start: String(val), end })}
value={start}
/>
<span className="font-semibold text-xl mx-2">~</span>
<SelectBox2
className="w-50 mr-8"
selectClass={selectClass}
label={endLabel}
selectArray={getEndYearArray()}
onSelectValue={val => onChange({ start, end: String(val) })}
value={end}
/>
</div>
);
}