1
1
import React , { forwardRef , useEffect , useState } from 'react' ;
2
2
import clsx from 'clsx' ;
3
3
import { useValue } from '@bifrostui/utils' ;
4
- import { DatePickerProps , DatePickerType } from './DatePicker.types' ;
5
- import Picker , { IPickerOptionItem } from '../Picker' ;
4
+ import {
5
+ DatePickerProps ,
6
+ DatePickerType ,
7
+ DatePickerOption ,
8
+ } from './DatePicker.types' ;
9
+ import Picker from '../Picker' ;
10
+ import { useLocaleText } from '../locales' ;
6
11
7
12
const MIN_DATE = new Date ( new Date ( ) . getFullYear ( ) - 10 , 0 , 1 ) ;
8
13
const MAX_DATE = new Date ( new Date ( ) . getFullYear ( ) + 10 , 11 , 31 ) ;
@@ -58,7 +63,9 @@ const DatePicker = forwardRef<HTMLDivElement, DatePickerProps>((props, ref) => {
58
63
views = DEFAULT_PICKER ,
59
64
minDate : propMinDate = MIN_DATE ,
60
65
maxDate : propMaxDate = MAX_DATE ,
66
+ showUnit = false ,
61
67
formatter,
68
+ filter,
62
69
disableDateTimeView,
63
70
dateTimeStep,
64
71
onConfirm,
@@ -67,8 +74,9 @@ const DatePicker = forwardRef<HTMLDivElement, DatePickerProps>((props, ref) => {
67
74
...others
68
75
} = props ;
69
76
70
- const [ options , setOptions ] = useState < IPickerOptionItem [ ] [ ] > ( [ ] ) ;
77
+ const [ options , setOptions ] = useState < DatePickerOption [ ] [ ] > ( [ ] ) ;
71
78
const [ pickerValue , setPickerValue ] = useState < ( string | number ) [ ] > ( [ ] ) ;
79
+ const datePickerText = useLocaleText ( 'datePicker' ) ;
72
80
73
81
const formatDate = ( date : Date | null ) => {
74
82
let formattedDate = date ;
@@ -142,6 +150,23 @@ const DatePicker = forwardRef<HTMLDivElement, DatePickerProps>((props, ref) => {
142
150
onChange ?.( e , { type : views [ columnIndex ] , value : current } ) ;
143
151
} ;
144
152
153
+ const formatOption = ( type : DatePickerType , value : number ) => {
154
+ let label = padZero ( value ) ;
155
+
156
+ if ( formatter ) {
157
+ return formatter ( type , {
158
+ value,
159
+ label,
160
+ } ) ;
161
+ }
162
+
163
+ if ( showUnit ) {
164
+ label += datePickerText [ type ] ;
165
+ }
166
+
167
+ return { value, label } ;
168
+ } ;
169
+
145
170
const generateOptions = (
146
171
min : number ,
147
172
max : number ,
@@ -155,23 +180,11 @@ const DatePicker = forwardRef<HTMLDivElement, DatePickerProps>((props, ref) => {
155
180
( _ , index ) => {
156
181
const value = index * step + min ;
157
182
158
- const option = {
159
- value : padZero ( value ) ,
160
- label : padZero ( value ) ,
161
- } ;
162
-
163
183
if ( value <= getDateTypeValue ( currentDate , type ) ) {
164
184
valueIndex = index ;
165
185
}
166
186
167
- if ( formatter ) {
168
- return formatter ( type , {
169
- value : option . value ,
170
- label : option . label ,
171
- } ) ;
172
- }
173
-
174
- return option ;
187
+ return formatOption ( type , value ) ;
175
188
} ,
176
189
) ;
177
190
@@ -182,10 +195,12 @@ const DatePicker = forwardRef<HTMLDivElement, DatePickerProps>((props, ref) => {
182
195
disableDateTimeView ?. [ type ] &&
183
196
typeof disableDateTimeView [ type ] === 'function'
184
197
) {
185
- const disabledOptions = disableDateTimeView [ type ] ( optionsArray ) ;
198
+ const disabledOptionsValue = disableDateTimeView [ type ] (
199
+ optionsArray . map ( ( i ) => i . value ) ,
200
+ ) ;
186
201
187
202
return optionsArray . map ( ( option ) => {
188
- if ( disabledOptions . includes ( option ) ) {
203
+ if ( disabledOptionsValue . includes ( option . value ) ) {
189
204
return {
190
205
...option ,
191
206
disabled : true ,
@@ -196,6 +211,10 @@ const DatePicker = forwardRef<HTMLDivElement, DatePickerProps>((props, ref) => {
196
211
} ) ;
197
212
}
198
213
214
+ if ( filter ) {
215
+ return filter ( type , optionsArray ) ;
216
+ }
217
+
199
218
return optionsArray ;
200
219
} ;
201
220
@@ -289,6 +308,7 @@ const DatePicker = forwardRef<HTMLDivElement, DatePickerProps>((props, ref) => {
289
308
return (
290
309
< Picker
291
310
{ ...others }
311
+ data-selected = { currentDate ? currentDate . getTime ( ) : '' }
292
312
className = { clsx ( 'bui-date-picker' , className ) }
293
313
ref = { ref }
294
314
options = { options }
0 commit comments