11'use client' ;
22
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' ;
55import { HiArrowLeft , HiArrowRight , HiCalendar } from 'react-icons/hi' ;
66import { twMerge } from 'tailwind-merge' ;
77import { mergeDeep } from '../../helpers/merge-deep' ;
@@ -71,6 +71,17 @@ export interface FlowbiteDatepickerPopupTheme {
7171 } ;
7272}
7373
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+
7485export interface DatepickerProps extends Omit < TextInputProps , 'theme' > {
7586 open ?: boolean ;
7687 inline ?: boolean ;
@@ -88,25 +99,28 @@ export interface DatepickerProps extends Omit<TextInputProps, 'theme'> {
8899 onSelectedDateChanged ?: ( date : Date ) => void ;
89100}
90101
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+ ) => {
110124 const theme = mergeDeep ( getTheme ( ) . datepicker , customTheme ) ;
111125
112126 // Default date should respect the range
@@ -135,6 +149,22 @@ export const Datepicker: FC<DatepickerProps> = ({
135149 }
136150 } ;
137151
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+
138168 // Render the DatepickerView* node
139169 const renderView = ( type : Views ) : ReactNode => {
140170 switch ( type ) {
@@ -325,4 +355,6 @@ export const Datepicker: FC<DatepickerProps> = ({
325355 ) ;
326356} ;
327357
358+ export const Datepicker = forwardRef ( DatepickerRender ) ;
359+
328360Datepicker . displayName = 'Datepicker' ;
0 commit comments