DatePicker
날짜 선택, 범위 선택, 월/연도 선택, 주간 선택, 빠른 단축 등을 내장한 올인원 날짜 입력 컴포넌트
개요
Cals DatePicker는 Foundation DatePicker를 래핑하여 CALS 제품의 날짜 입력 UI를 선언적으로 구현하는 컴포넌트입니다. 폼 레이블, 날짜 비활성화, 빠른 선택 단축, 검색 모드 등 CALS에서 자주 쓰이는 날짜 처리를 prop으로 제공합니다.
주요 특징
- ✅ 7가지 mode: single, range, month, year, month-range, year-range, week
- ✅ controlled / uncontrolled: value/onChange 또는 defaultValue로 값 관리
- ✅ 날짜 비활성화: disabledDate 콜백 + inactiveMode로 과거/미래 날짜 제한
- ✅ 빠른 선택: shortcuts 배열로 “오늘”, “이번 주” 등 단축 버튼 제공
- ✅ 검색 모드: isSearch + onSearch로 Enter 검색 지원
- ✅ FormItem 내장: label/required/description/error prop으로 폼 레이블 자동 래핑
- ✅ 라벨 도움말: labelTooltip으로 레이블 옆 도움말 아이콘 표시
- ✅ 가시성/포커스 제어: visible prop, ref.focus()/blur()/element
- ✅ 디자인 토큰: 조건부 토큰 오버라이드 (prop이 있을 때만 적용)
기본 사용
placeholder로 입력 전 안내 문구를 표시합니다.
Preview
기본값 설정
defaultValue로 초기 날짜를 설정합니다.
Preview
날짜 선택기 유형 (mode)
mode prop으로 선택 유형을 변경합니다. week 모드는 선택한 날짜가 속한 주의 월요일을 반환합니다.
Preview
크기
size prop으로 입력란 크기를 지정합니다. xs / sm / md / lg / xl을 지원합니다.
Preview
비활성화 / 읽기 전용
disabled, readOnly는 모두 비활성화된 외관으로 표시되며 날짜를 변경할 수 없습니다.
Preview
레이블 / 필수 입력
label로 레이블을 표시하고, required로 필수 표시 기호(*)를 추가합니다.
Preview
레이블 위치
orientation=“horizontal”이면 레이블이 입력란 왼쪽에 배치됩니다.
Preview
라벨 도움말
labelTooltip 지정 시 레이블 옆 아이콘에 마우스를 올리면 도움말이 표시됩니다.
Preview
선택 불가 날짜 (disabledDate)
disabledDate 콜백으로 특정 날짜의 선택을 차단합니다. true를 반환하면 해당 날짜 선택이 무시됩니다.
Preview
과거/미래 날짜 비활성 (inactiveMode)
inactiveMode로 오늘 기준 과거/미래 날짜 선택을 제한합니다. 원본 inactiveBfAf에 대응합니다.
| 값 | 설명 |
|---|---|
"lt" | 오늘 이전 비활성 (오늘 선택 가능) |
"lte" | 오늘 포함 이전 비활성 (내일부터 선택 가능) |
"gt" | 오늘 이후 비활성 (오늘 선택 가능) |
"gte" | 오늘 포함 이후 비활성 (어제까지 선택 가능) |
"none" | 제한 없음 (기본값) |
Preview
빠른 선택 (shortcuts)
shortcuts 배열로 빠른 선택 버튼을 제공합니다. 원본 pickerOptions.shortcuts에 대응합니다.
Preview
선택된 날짜: (없음)
범위 빠른 선택
range 모드에서도 shortcuts를 사용하여 기간을 빠르게 선택할 수 있습니다.
Preview
선택된 기간: (없음)
검색 폼 모드 (isSearch / onSearch)
isSearch=true에서 Enter 키 입력 시 onSearch가 호출됩니다.
Preview
스타일 설정
backgroundColor, color, borderColor 등으로 디자인 토큰을 오버라이드합니다.
Preview
API Reference
Props
| Prop | Type | Default | Description |
|---|---|---|---|
mode | "single" | "range" | "month" | "year" | "month-range" | "year-range" | "week" | "single" | 날짜 선택 유형 |
value | Date | DateRange | - | 선택된 날짜 값 (controlled) |
defaultValue | Date | - | 초기 기본값 (uncontrolled) |
placeholder | string | - | 입력 전 안내 문구 |
showPlaceholder | boolean | true | 안내 문구 표시 여부 |
size | "xs" | "sm" | "md" | "lg" | "xl" | "md" | 입력란 크기 |
visible | boolean | true | 표시 여부 (false → 렌더링 안 함) |
disabled | boolean | false | 비활성화 |
readOnly | boolean | false | 읽기 전용 (disabled와 동일 처리) |
clearable | boolean | true | 클리어 버튼 표시 |
disabledDate | (date: Date) => boolean | - | 선택 불가 날짜 판별 함수 |
inactiveMode | "lt" | "lte" | "gt" | "gte" | "none" | "none" | 오늘 기준 과거/미래 날짜 비활성화 |
maxRangeDays | number | - | range 모드 최대 선택 일수 |
onRangeExceeded | (days: number) => void | - | 최대 일수 초과 시 콜백 |
numberOfMonths | number | - | range 모드 표시 월 수 |
isSearch | boolean | false | 검색 폼 여부 (Enter 시 onSearch 발생) |
shortcuts | DatePickerShortcut[] | - | 빠른 선택 단축 항목 목록 |
width | string | number | "100%" | 컨트롤 너비 |
title | string | - | HTML title 속성 (native tooltip) |
required | boolean | - | 필수 입력 (FormItem 필수 표시) |
showLabel | boolean | false | 빈 레이블 공간 표시 여부 |
labelTooltip | string | - | 레이블 도움말 (아이콘 hover 시 표시) |
backgroundColor | string | - | 배경색 토큰 오버라이드 |
color | string | - | 텍스트 색상 토큰 오버라이드 |
borderColor | string | - | 테두리 색상 토큰 오버라이드 |
borderWidth | string | - | 테두리 두께 |
fontSize | string | - | 폰트 크기 |
fontWeight | string | number | - | 폰트 굵기 |
fontFamily | string | - | 폰트 패밀리 |
fontStyle | string | - | 폰트 스타일 (italic 등) |
textAlign | string | - | 텍스트 정렬 |
className | string | - | 컴포넌트 컨테이너에 적용할 CSS 클래스 |
formClassName | string | - | FormItem 래퍼에 적용할 CSS 클래스 |
label | string | - | FormItem 레이블 |
orientation | "horizontal" | "vertical" | - | FormItem 레이블 방향 |
description | string | - | FormItem 설명 |
error | string | - | FormItem 에러 메시지 |
DatePickerShortcut
| 필드 | Type | Description |
|---|---|---|
label | string | 표시 텍스트 (예: “오늘”, “이번 주”) |
value | Date | DateRange | 클릭 시 적용할 날짜 값 |
Events
| Event | Type | Description |
|---|---|---|
onChange | (value: Date | DateRange | undefined) => void | 값 변경 시 호출 |
onSearch | () => void | isSearch=true에서 Enter 입력 시 호출 |
onRangeExceeded | (days: number) => void | range 최대 일수 초과 시 호출 |
Ref
| 메서드/속성 | Type | Description |
|---|---|---|
focus() | () => void | 입력란에 포커스 |
blur() | () => void | 포커스 해제 |
element | HTMLElement | null | 내부 DOM 요소 |
접근성
권장 사항
- ✅ label 또는 aria-label로 입력란의 목적을 명확히 제공하세요.
- ✅ 필수 입력은 required로 설정하여 스크린 리더에 전달하세요.
- ❌ placeholder만으로 레이블을 대체하지 마세요. 값 입력 시 사라집니다.
관련 컴포넌트
- Foundation DatePicker: 기본 날짜 선택 컴포넌트
- FormItem: 폼 레이블 래퍼
- Cals Input: 텍스트 입력 컴포넌트