Skip to content

Commit 983759a

Browse files
committed
✨ Feat: Enhance TimePicker with ref forwarding and next element focus handling
Introduces issue of not being able to focus backwards when SHIFT+TAB ing
1 parent 97c97ae commit 983759a

File tree

3 files changed

+47
-13
lines changed

3 files changed

+47
-13
lines changed

packages/web/src/components/TimePicker/TimePicker.tsx

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import React, { useState } from "react";
2-
import ReactSelect, { Props as RSProps } from "react-select";
1+
import React, { ForwardedRef, forwardRef, useRef, useState } from "react";
2+
import ReactSelect, { Props as RSProps, SelectInstance } from "react-select";
33
import { Key } from "ts-key-enum";
44
import { SelectOption } from "@web/common/types/component.types";
55
import { Option_Time } from "@web/common/types/util.types";
@@ -8,20 +8,26 @@ import { StyledTimePicker, StyledDivider } from "./styled";
88

99
export interface Props extends Omit<RSProps, "value"> {
1010
bgColor: string;
11+
nextElementRef?: React.RefObject<HTMLTextAreaElement>;
1112
onChange: (option: SelectOption<string>) => void;
1213
options?: Option_Time[];
1314
selectClassName?: string;
1415
value: SelectOption<string>;
1516
}
1617

17-
export const TimePicker: React.FC<Props> = ({
18-
bgColor,
19-
onChange: _onChange,
20-
options,
21-
selectClassName,
22-
value,
23-
...props
24-
}) => {
18+
export const _TimePicker = (
19+
{
20+
bgColor,
21+
nextElementRef,
22+
onChange: _onChange,
23+
options,
24+
selectClassName,
25+
value,
26+
...props
27+
}: Props,
28+
ref: ForwardedRef<ReactSelect>
29+
// ref: Ref<SelectInstance>
30+
) => {
2531
const [isFocused, setIsFocused] = useState(false);
2632
const [isMenuOpened, setIsMenuOpen] = useState(false);
2733

@@ -32,13 +38,18 @@ export const TimePicker: React.FC<Props> = ({
3238
<StyledTimePicker bgColor={bgColor} isOpen={isMenuOpened}>
3339
<ReactSelect
3440
{...props}
41+
ref={ref}
3542
className={selectClassName}
3643
classNamePrefix={TIMEPICKER}
3744
value={value}
3845
maxMenuHeight={4 * 41}
3946
noOptionsMessage={() => "Nothin'. Typo?"}
40-
onBlur={() => setIsFocused(false)}
47+
onBlur={() => {
48+
console.log("blurred");
49+
setIsFocused(false);
50+
}}
4151
onFocus={() => {
52+
console.log("focused");
4253
setIsFocused(true);
4354
}}
4455
onChange={_onChange}
@@ -71,8 +82,17 @@ export const TimePicker: React.FC<Props> = ({
7182
setIsMenuOpen(true);
7283
}}
7384
onMenuClose={() => {
85+
console.log("closed menu");
86+
setIsFocused(false);
7487
setIsMenuOpen(false);
7588
clearTimeout(scrollTimer);
89+
90+
if (nextElementRef && nextElementRef.current) {
91+
console.log("focusing on next input...");
92+
nextElementRef.current.focus();
93+
} else {
94+
console.log("doing nothing with refs");
95+
}
7696
}}
7797
openMenuOnFocus={true}
7898
options={options}
@@ -82,3 +102,5 @@ export const TimePicker: React.FC<Props> = ({
82102
</StyledTimePicker>
83103
);
84104
};
105+
106+
export const TimePicker = forwardRef(_TimePicker);

packages/web/src/views/Forms/EventForm/DateTimeSection/DateTimeSection.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { FC, SetStateAction } from "react";
1+
import React, { FC, SetStateAction, useRef } from "react";
22
import dayjs from "dayjs";
33
import customParseFormat from "dayjs/plugin/customParseFormat";
44
import { Categories_Event, Schema_Event } from "@core/types/event.types";
@@ -24,6 +24,7 @@ export interface Props {
2424
event: Schema_Event;
2525
endTime: SelectOption<string>;
2626
inputColor?: string;
27+
nextElementRef: React.RefObject<HTMLTextAreaElement>;
2728
isEndDatePickerOpen: boolean;
2829
isStartDatePickerOpen: boolean;
2930
selectedEndDate: Date;
@@ -43,6 +44,7 @@ export const DateTimeSection: FC<Props> = ({
4344
category,
4445
event,
4546
inputColor,
47+
nextElementRef,
4648
isEndDatePickerOpen,
4749
isStartDatePickerOpen,
4850
selectedEndDate,
@@ -59,6 +61,8 @@ export const DateTimeSection: FC<Props> = ({
5961
}) => {
6062
const timeOptions = getTimeOptions();
6163

64+
const endTimeRef = useRef(null);
65+
6266
const adjustComplimentTimeIfNeeded = (
6367
changed: "start" | "end",
6468
value: string
@@ -165,18 +169,21 @@ export const DateTimeSection: FC<Props> = ({
165169
bgColor={bgColor}
166170
value={startTime}
167171
inputId="startTimePicker"
172+
nextElementRef={endTimeRef}
168173
onChange={onSelectStartTime}
169-
openMenuOnFocus={true}
174+
openMenuOnFocus
170175
options={timeOptions}
171176
/>
172177
-
173178
<TimePicker
174179
bgColor={bgColor}
175180
value={endTime}
176181
inputId="endTimePicker"
182+
nextElementRef={nextElementRef}
177183
onChange={onSelectEndTime}
178184
openMenuOnFocus
179185
options={timeOptions}
186+
ref={endTimeRef}
180187
/>
181188
</StyledTimeFlex>
182189
)}

packages/web/src/views/Forms/EventForm/EventForm.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import React, {
55
KeyboardEventHandler,
66
useCallback,
77
useEffect,
8+
useRef,
89
useState,
910
} from "react";
1011
import { Key } from "ts-key-enum";
@@ -67,6 +68,8 @@ export const EventForm: React.FC<FormProps> = ({
6768
const [selectedEndDate, setSelectedEndDate] = useState(new Date());
6869
const [selectedStartDate, setSelectedStartDate] = useState(new Date());
6970

71+
const descriptionRef = useRef<HTMLTextAreaElement>(null);
72+
7073
/********
7174
* Effect
7275
*********/
@@ -299,6 +302,7 @@ export const EventForm: React.FC<FormProps> = ({
299302
category={category}
300303
endTime={endTime}
301304
inputColor={hoverColorByPriority[priority || Priorities.UNASSIGNED]}
305+
nextElementRef={descriptionRef}
302306
isEndDatePickerOpen={isEndDatePickerOpen}
303307
isStartDatePickerOpen={isStartDatePickerOpen}
304308
selectedEndDate={selectedEndDate}
@@ -318,6 +322,7 @@ export const EventForm: React.FC<FormProps> = ({
318322
onChange={onChangeEventTextField("description")}
319323
onKeyDown={ignoreDelete}
320324
placeholder="Description"
325+
ref={descriptionRef}
321326
value={event.description || ""}
322327
/>
323328

0 commit comments

Comments
 (0)