1
1
'use client' ;
2
2
3
- import type { FC , ReactNode } from 'react' ;
4
- import { useEffect , useRef , useState } from 'react' ;
3
+ import type { ForwardRefRenderFunction , ReactNode } from 'react' ;
4
+ import { forwardRef , useEffect , useImperativeHandle , useRef , useState } from 'react' ;
5
5
import { HiArrowLeft , HiArrowRight , HiCalendar } from 'react-icons/hi' ;
6
6
import { twMerge } from 'tailwind-merge' ;
7
7
import { mergeDeep } from '../../helpers/merge-deep' ;
@@ -71,6 +71,17 @@ export interface FlowbiteDatepickerPopupTheme {
71
71
} ;
72
72
}
73
73
74
+ export interface DatepickerRef {
75
+ /**
76
+ * Focus the datepicker input.
77
+ */
78
+ focus : ( ) => void ;
79
+ /**
80
+ * Clears the datepicker value back to the defaultDate.
81
+ */
82
+ clear : ( ) => void ;
83
+ }
84
+
74
85
export interface DatepickerProps extends Omit < TextInputProps , 'theme' > {
75
86
open ?: boolean ;
76
87
inline ?: boolean ;
@@ -88,25 +99,28 @@ export interface DatepickerProps extends Omit<TextInputProps, 'theme'> {
88
99
onSelectedDateChanged ?: ( date : Date ) => void ;
89
100
}
90
101
91
- export const Datepicker : FC < DatepickerProps > = ( {
92
- title,
93
- open,
94
- inline = false ,
95
- autoHide = true , // Hide when selected the day
96
- showClearButton = true ,
97
- labelClearButton = 'Clear' ,
98
- showTodayButton = true ,
99
- labelTodayButton = 'Today' ,
100
- defaultDate = new Date ( ) ,
101
- minDate,
102
- maxDate,
103
- language = 'en' ,
104
- weekStart = WeekStart . Sunday ,
105
- className,
106
- theme : customTheme = { } ,
107
- onSelectedDateChanged,
108
- ...props
109
- } ) => {
102
+ const DatepickerRender : ForwardRefRenderFunction < DatepickerRef , DatepickerProps > = (
103
+ {
104
+ title,
105
+ open,
106
+ inline = false ,
107
+ autoHide = true , // Hide when selected the day
108
+ showClearButton = true ,
109
+ labelClearButton = 'Clear' ,
110
+ showTodayButton = true ,
111
+ labelTodayButton = 'Today' ,
112
+ defaultDate = new Date ( ) ,
113
+ minDate,
114
+ maxDate,
115
+ language = 'en' ,
116
+ weekStart = WeekStart . Sunday ,
117
+ className,
118
+ theme : customTheme = { } ,
119
+ onSelectedDateChanged,
120
+ ...props
121
+ } ,
122
+ ref ,
123
+ ) => {
110
124
const theme = mergeDeep ( getTheme ( ) . datepicker , customTheme ) ;
111
125
112
126
// Default date should respect the range
@@ -135,6 +149,22 @@ export const Datepicker: FC<DatepickerProps> = ({
135
149
}
136
150
} ;
137
151
152
+ const clearDate = ( ) => {
153
+ changeSelectedDate ( defaultDate , true ) ;
154
+ if ( defaultDate ) {
155
+ setViewDate ( defaultDate ) ;
156
+ }
157
+ } ;
158
+
159
+ useImperativeHandle ( ref , ( ) => ( {
160
+ focus ( ) {
161
+ inputRef . current ?. focus ( ) ;
162
+ } ,
163
+ clear ( ) {
164
+ clearDate ( ) ;
165
+ } ,
166
+ } ) ) ;
167
+
138
168
// Render the DatepickerView* node
139
169
const renderView = ( type : Views ) : ReactNode => {
140
170
switch ( type ) {
@@ -325,4 +355,6 @@ export const Datepicker: FC<DatepickerProps> = ({
325
355
) ;
326
356
} ;
327
357
358
+ export const Datepicker = forwardRef ( DatepickerRender ) ;
359
+
328
360
Datepicker . displayName = 'Datepicker' ;
0 commit comments