Skip to content

Commit fe0fbd9

Browse files
authored
fix: customized inputElement should not trigger close when mousedown trigger (#761)
* fix: customized trigger should not trigger close when mousedown trigger * chore: code clean * fix: null check
1 parent 15babe4 commit fe0fbd9

File tree

4 files changed

+46
-0
lines changed

4 files changed

+46
-0
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
"rc-virtual-list": "^3.2.0"
5454
},
5555
"devDependencies": {
56+
"@testing-library/react": "12",
5657
"@types/enzyme": "^3.10.9",
5758
"@types/jest": "^26.0.24",
5859
"@types/react": "^17.0.15",

src/BaseSelect.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -636,6 +636,7 @@ const BaseSelect = React.forwardRef((props: BaseSelectProps, ref: React.Ref<Base
636636
() => [containerRef.current, triggerRef.current?.getPopupElement()],
637637
triggerOpen,
638638
onToggleOpen,
639+
!!customizeRawInputElement,
639640
);
640641

641642
// ============================ Context =============================

src/hooks/useSelectTriggerControl.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,22 @@ export default function useSelectTriggerControl(
44
elements: () => (HTMLElement | undefined)[],
55
open: boolean,
66
triggerOpen: (open: boolean) => void,
7+
customizedTrigger: boolean,
78
) {
89
const propsRef = React.useRef(null);
910
propsRef.current = {
1011
open,
1112
triggerOpen,
13+
customizedTrigger,
1214
};
1315

1416
React.useEffect(() => {
1517
function onGlobalMouseDown(event: MouseEvent) {
18+
// If trigger is customized, Trigger will take control of popupVisible
19+
if (propsRef.current?.customizedTrigger) {
20+
return;
21+
}
22+
1623
let target = event.target as HTMLElement;
1724

1825
if (target.shadowRoot && event.composed) {

tests/BaseSelect.test.tsx

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { fireEvent, render } from '@testing-library/react';
2+
import BaseSelect from '../src/BaseSelect';
3+
import { forwardRef } from 'react';
4+
import type { OptionListProps, RefOptionListProps } from '@/OptionList';
5+
6+
const OptionList = forwardRef<RefOptionListProps, OptionListProps>(() => (
7+
<div className="popup">Popup</div>
8+
));
9+
10+
describe('BaseSelect', () => {
11+
it('customized inputElement should trigger popup properly', () => {
12+
const { container } = render(
13+
<BaseSelect
14+
prefixCls="rc-select"
15+
getRawInputElement={() => (
16+
<a className="trigger" href="#">
17+
trigger
18+
</a>
19+
)}
20+
OptionList={OptionList}
21+
displayValues={[]}
22+
emptyOptions
23+
id="test"
24+
onDisplayValuesChange={() => {}}
25+
onSearch={() => {}}
26+
searchValue=""
27+
/>,
28+
);
29+
expect(container.querySelector('div.popup')).toBeFalsy();
30+
fireEvent.click(container.querySelector('a.trigger'));
31+
expect(container.querySelector('div.popup')).toBeTruthy();
32+
fireEvent.mouseDown(container.querySelector('a.trigger'));
33+
expect(container.querySelector('div.rc-select-dropdown-hidden')).toBeFalsy();
34+
fireEvent.click(container.querySelector('a.trigger'));
35+
expect(container.querySelector('div.rc-select-dropdown-hidden')).toBeTruthy();
36+
});
37+
});

0 commit comments

Comments
 (0)