Skip to content

Commit a40dcc1

Browse files
committed
wip: opens Datepicker when the input-field is clicked
1 parent 2c74223 commit a40dcc1

File tree

2 files changed

+54
-4
lines changed

2 files changed

+54
-4
lines changed

packages/jokul/src/components/datepicker/DatePicker.tsx

+51-4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import React, {
77
MouseEvent,
88
forwardRef,
99
useCallback,
10+
useEffect,
1011
useRef,
1112
useState,
1213
} from "react";
@@ -87,6 +88,9 @@ export const DatePicker = forwardRef<HTMLInputElement, DatePickerProps>(
8788

8889
const calendarRef = useRef<HTMLDivElement>(null);
8990
const datepickerRef = useRef<HTMLDivElement>(null);
91+
const [returnFocusTo, setReturnFocusTo] = useState<HTMLElement | null>(
92+
null,
93+
);
9094

9195
/// Input events
9296

@@ -180,10 +184,22 @@ export const DatePicker = forwardRef<HTMLInputElement, DatePickerProps>(
180184
[onChange, setError, setDate, setShowCalendar, minDate, maxDate],
181185
);
182186

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+
183198
/// Calendar events
184199

185200
const clickCalendar = useCallback(
186201
(e: MouseEvent<HTMLButtonElement>) => {
202+
console.log("click calendar");
187203
flushSync(() => {
188204
setShowCalendar(!showCalendar);
189205
});
@@ -249,6 +265,21 @@ export const DatePicker = forwardRef<HTMLInputElement, DatePickerProps>(
249265
[setShowCalendar],
250266
);
251267

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+
252283
return (
253284
<InputGroup
254285
id={id}
@@ -277,16 +308,27 @@ export const DatePicker = forwardRef<HTMLInputElement, DatePickerProps>(
277308
type="text"
278309
placeholder={placeholder}
279310
width={width}
311+
onClick={clickInput}
280312
onFocus={handleFocus}
281313
onBlur={handleBlur}
282314
onChange={handleChange}
283315
actionButton={
284316
<Popover
285317
positionReference={inputRef}
286318
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+
}}
290332
offset={8}
291333
>
292334
<Popover.Trigger
@@ -307,8 +349,13 @@ export const DatePicker = forwardRef<HTMLInputElement, DatePickerProps>(
307349
<CalendarIcon />
308350
</IconButton>
309351
</Popover.Trigger>
310-
<Popover.Content initialFocus={-1} padding={24}>
352+
<Popover.Content
353+
initialFocus={-1}
354+
padding={24}
355+
returnFocus={false}
356+
>
311357
<Calendar
358+
tabIndex={-1}
312359
ref={calendarRef}
313360
density={density}
314361
date={date}

packages/jokul/src/components/datepicker/internal/Calendar.tsx

+3
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ interface CalendarProps
4040
yearLabel?: string;
4141
yearsToShow?: YearsToShow;
4242
onTabOutside: React.KeyboardEventHandler;
43+
tabIndex?: number;
4344
}
4445

4546
const defaultMonths = [
@@ -73,6 +74,7 @@ export const Calendar = forwardRef<HTMLDivElement, CalendarProps>(
7374
yearLabel = "Velg år",
7475
yearsToShow = DEFAULT_YEARS_TO_SHOW,
7576
onTabOutside,
77+
tabIndex,
7678
...rest
7779
} = props;
7880

@@ -442,6 +444,7 @@ export const Calendar = forwardRef<HTMLDivElement, CalendarProps>(
442444
id={id}
443445
className="jkl-calendar"
444446
data-testid="jkl-calendar"
447+
tabIndex={tabIndex}
445448
>
446449
{/* Vi lytter på på trykk på Tab inne i kalenderen for å håndtere fokus */}
447450
{/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}

0 commit comments

Comments
 (0)