@@ -7,6 +7,7 @@ import React, {
7
7
MouseEvent ,
8
8
forwardRef ,
9
9
useCallback ,
10
+ useEffect ,
10
11
useRef ,
11
12
useState ,
12
13
} from "react" ;
@@ -87,6 +88,9 @@ export const DatePicker = forwardRef<HTMLInputElement, DatePickerProps>(
87
88
88
89
const calendarRef = useRef < HTMLDivElement > ( null ) ;
89
90
const datepickerRef = useRef < HTMLDivElement > ( null ) ;
91
+ const [ returnFocusTo , setReturnFocusTo ] = useState < HTMLElement | null > (
92
+ null ,
93
+ ) ;
90
94
91
95
/// Input events
92
96
@@ -180,10 +184,22 @@ export const DatePicker = forwardRef<HTMLInputElement, DatePickerProps>(
180
184
[ onChange , setError , setDate , setShowCalendar , minDate , maxDate ] ,
181
185
) ;
182
186
187
+ const clickInput = useCallback ( ( ) => {
188
+ setShowCalendar ( ( isOpen ) => {
189
+ if ( ! isOpen ) {
190
+ window . requestAnimationFrame ( ( ) => {
191
+ calendarRef . current ?. focus ( ) ;
192
+ } ) ;
193
+ }
194
+ return ! isOpen ;
195
+ } ) ;
196
+ } , [ setShowCalendar ] ) ;
197
+
183
198
/// Calendar events
184
199
185
200
const clickCalendar = useCallback (
186
201
( e : MouseEvent < HTMLButtonElement > ) => {
202
+ console . log ( "click calendar" ) ;
187
203
flushSync ( ( ) => {
188
204
setShowCalendar ( ! showCalendar ) ;
189
205
} ) ;
@@ -249,6 +265,21 @@ export const DatePicker = forwardRef<HTMLInputElement, DatePickerProps>(
249
265
[ setShowCalendar ] ,
250
266
) ;
251
267
268
+ useEffect ( ( ) => {
269
+ if ( showCalendar ) {
270
+ setReturnFocusTo ( document . activeElement as HTMLElement ) ;
271
+ } else {
272
+ if (
273
+ inputRef . current ?. contains ( document . activeElement ) ||
274
+ document . activeElement === document . body
275
+ ) {
276
+ window . requestAnimationFrame ( ( ) => {
277
+ returnFocusTo ?. focus ( ) ;
278
+ } ) ;
279
+ }
280
+ }
281
+ } , [ showCalendar ] ) ;
282
+
252
283
return (
253
284
< InputGroup
254
285
id = { id }
@@ -277,16 +308,27 @@ export const DatePicker = forwardRef<HTMLInputElement, DatePickerProps>(
277
308
type = "text"
278
309
placeholder = { placeholder }
279
310
width = { width }
311
+ onClick = { clickInput }
280
312
onFocus = { handleFocus }
281
313
onBlur = { handleBlur }
282
314
onChange = { handleChange }
283
315
actionButton = {
284
316
< Popover
285
317
positionReference = { inputRef }
286
318
open = { showCalendar }
287
- onOpenChange = { ( ) =>
288
- setShowCalendar ( ! showCalendar )
289
- }
319
+ onOpenChange = { ( open , event ) => {
320
+ if (
321
+ event ?. target &&
322
+ event . type === "click" &&
323
+ event . target === inputRef ?. current
324
+ ) {
325
+ // We're toggling the open state on input
326
+ // clicks in a different event-handler.
327
+ console . log ( { open } ) ;
328
+ return ;
329
+ }
330
+ setShowCalendar ( open ) ;
331
+ } }
290
332
offset = { 8 }
291
333
>
292
334
< Popover . Trigger
@@ -307,8 +349,13 @@ export const DatePicker = forwardRef<HTMLInputElement, DatePickerProps>(
307
349
< CalendarIcon />
308
350
</ IconButton >
309
351
</ Popover . Trigger >
310
- < Popover . Content initialFocus = { - 1 } padding = { 24 } >
352
+ < Popover . Content
353
+ initialFocus = { - 1 }
354
+ padding = { 24 }
355
+ returnFocus = { false }
356
+ >
311
357
< Calendar
358
+ tabIndex = { - 1 }
312
359
ref = { calendarRef }
313
360
density = { density }
314
361
date = { date }
0 commit comments