@@ -6,7 +6,6 @@ import React, {
66 Ref ,
77 FC ,
88 useRef ,
9- useMemo ,
109 useState ,
1110 useEffect ,
1211 useContext ,
@@ -17,15 +16,15 @@ import { Button } from './Button';
1716import { FormElement } from './FormElement' ;
1817import { Input , InputProps } from './Input' ;
1918import { Datepicker , DatepickerProps } from './Datepicker' ;
20- import { isElInChildren } from './util' ;
2119import { ComponentSettingsContext } from './ComponentSettings' ;
22- import mergeRefs from 'react-merge-refs' ;
20+ import { AutoAlign , AutoAlignInjectedProps , AutoAlignProps } from './AutoAlign' ;
21+ import { isElInChildren } from './util' ;
2322import {
2423 useControlledValue ,
2524 useEventCallback ,
2625 useFormElementId ,
26+ useMergeRefs ,
2727} from './hooks' ;
28- import { AutoAlign , AutoAlignInjectedProps , AutoAlignProps } from './AutoAlign' ;
2928import { createFC } from './common' ;
3029
3130/**
@@ -56,32 +55,24 @@ const DatepickerDropdownInner: FC<
5655 minDate,
5756 maxDate,
5857 extensionRenderer,
59- elementRef,
58+ elementRef : elementRef_ ,
6059 autoAlignContentRef,
6160 onSelect,
6261 onBlur,
6362 onClose,
6463 } = props ;
6564 const elRef = useRef < HTMLDivElement | null > ( null ) ;
65+ const elementRef = useMergeRefs ( [ elRef , autoAlignContentRef , elementRef_ ] ) ;
6666 const [ vertAlign , align ] = alignment ;
6767 const datepickerClassNames = classnames (
6868 className ,
6969 'slds-dropdown' ,
7070 align ? `slds-dropdown_${ align } ` : undefined ,
7171 vertAlign ? `slds-dropdown_${ vertAlign } ` : undefined
7272 ) ;
73- const mergedRef = useMemo (
74- ( ) =>
75- mergeRefs ( [
76- elRef ,
77- autoAlignContentRef ,
78- ...( elementRef ? [ elementRef ] : [ ] ) ,
79- ] ) ,
80- [ elementRef , autoAlignContentRef ]
81- ) ;
8273 return (
8374 < Datepicker
84- elementRef = { mergedRef }
75+ elementRef = { elementRef }
8576 className = { datepickerClassNames }
8677 selectedDate = { dateValue }
8778 autoFocus
@@ -126,6 +117,8 @@ export type DateInputProps = {
126117 minDate ?: string ;
127118 maxDate ?: string ;
128119 menuAlign ?: 'left' | 'right' ;
120+ elementRef ?: Ref < HTMLDivElement > ;
121+ datepickerRef ?: Ref < HTMLDivElement > ;
129122 onBlur ?: ( ) => void ;
130123 onValueChange ?: ( value : string | null , prevValue : string | null ) => void ;
131124 onComplete ?: ( ) => void ;
@@ -154,6 +147,9 @@ export const DateInput = createFC<DateInputProps, { isFormElement: boolean }>(
154147 minDate,
155148 maxDate,
156149 extensionRenderer,
150+ elementRef : elementRef_ ,
151+ inputRef : inputRef_ ,
152+ datepickerRef : datepickerRef_ ,
157153 onChange,
158154 onValueChange,
159155 onKeyDown,
@@ -179,9 +175,12 @@ export const DateInput = createFC<DateInputProps, { isFormElement: boolean }>(
179175 ? mvalue . format ( inputValueFormat )
180176 : '' ;
181177
182- const nodeRef = useRef < HTMLDivElement | null > ( null ) ;
183- const datepickerElRef = useRef < HTMLDivElement | null > ( null ) ;
178+ const elRef = useRef < HTMLDivElement | null > ( null ) ;
179+ const elementRef = useMergeRefs ( [ elRef , elementRef_ ] ) ;
184180 const inputElRef = useRef < HTMLInputElement | null > ( null ) ;
181+ const inputRef = useMergeRefs ( [ inputElRef , inputRef_ ] ) ;
182+ const datepickerElRef = useRef < HTMLDivElement | null > ( null ) ;
183+ const datepickerRef = useMergeRefs ( [ datepickerElRef , datepickerRef_ ] ) ;
185184
186185 const { getActiveElement } = useContext ( ComponentSettingsContext ) ;
187186
@@ -204,7 +203,7 @@ export const DateInput = createFC<DateInputProps, { isFormElement: boolean }>(
204203 const isFocusedInComponent = useEventCallback ( ( ) => {
205204 const targetEl = getActiveElement ( ) ;
206205 return (
207- isElInChildren ( nodeRef . current , targetEl ) ||
206+ isElInChildren ( elRef . current , targetEl ) ||
208207 isElInChildren ( datepickerElRef . current , targetEl )
209208 ) ;
210209 } ) ;
@@ -314,13 +313,13 @@ export const DateInput = createFC<DateInputProps, { isFormElement: boolean }>(
314313 }
315314 } ) ;
316315
317- const formElemProps = { id, cols, label, required, error } ;
316+ const formElemProps = { id, cols, label, required, error, elementRef } ;
318317 return (
319- < FormElement formElementRef = { nodeRef } { ...formElemProps } >
318+ < FormElement { ...formElemProps } >
320319 < div className = { classnames ( className , 'slds-dropdown-trigger' ) } >
321320 < div className = 'slds-input-has-icon slds-input-has-icon_right' >
322321 < Input
323- inputRef = { inputElRef }
322+ inputRef = { inputRef }
324323 { ...rprops }
325324 id = { id }
326325 value = { inputValue }
@@ -341,7 +340,7 @@ export const DateInput = createFC<DateInputProps, { isFormElement: boolean }>(
341340 { opened ? (
342341 < DatepickerDropdown
343342 portalClassName = { className }
344- elementRef = { datepickerElRef }
343+ elementRef = { datepickerRef }
345344 dateValue = {
346345 mvalue . isValid ( ) ? mvalue . format ( 'YYYY-MM-DD' ) : undefined
347346 }
0 commit comments