Skip to content

Commit

Permalink
fix: customized inputElement should not trigger close when mousedown …
Browse files Browse the repository at this point in the history
…trigger (#761)

* fix: customized trigger should not trigger close when mousedown trigger

* chore: code clean

* fix: null check
  • Loading branch information
MadCcc committed May 19, 2022
1 parent 15babe4 commit fe0fbd9
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 0 deletions.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
"rc-virtual-list": "^3.2.0"
},
"devDependencies": {
"@testing-library/react": "12",
"@types/enzyme": "^3.10.9",
"@types/jest": "^26.0.24",
"@types/react": "^17.0.15",
Expand Down
1 change: 1 addition & 0 deletions src/BaseSelect.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -636,6 +636,7 @@ const BaseSelect = React.forwardRef((props: BaseSelectProps, ref: React.Ref<Base
() => [containerRef.current, triggerRef.current?.getPopupElement()],
triggerOpen,
onToggleOpen,
!!customizeRawInputElement,
);

// ============================ Context =============================
Expand Down
7 changes: 7 additions & 0 deletions src/hooks/useSelectTriggerControl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,22 @@ export default function useSelectTriggerControl(
elements: () => (HTMLElement | undefined)[],
open: boolean,
triggerOpen: (open: boolean) => void,
customizedTrigger: boolean,
) {
const propsRef = React.useRef(null);
propsRef.current = {
open,
triggerOpen,
customizedTrigger,
};

React.useEffect(() => {
function onGlobalMouseDown(event: MouseEvent) {
// If trigger is customized, Trigger will take control of popupVisible
if (propsRef.current?.customizedTrigger) {
return;
}

let target = event.target as HTMLElement;

if (target.shadowRoot && event.composed) {
Expand Down
37 changes: 37 additions & 0 deletions tests/BaseSelect.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { fireEvent, render } from '@testing-library/react';
import BaseSelect from '../src/BaseSelect';
import { forwardRef } from 'react';
import type { OptionListProps, RefOptionListProps } from '@/OptionList';

const OptionList = forwardRef<RefOptionListProps, OptionListProps>(() => (
<div className="popup">Popup</div>
));

describe('BaseSelect', () => {
it('customized inputElement should trigger popup properly', () => {
const { container } = render(
<BaseSelect
prefixCls="rc-select"
getRawInputElement={() => (
<a className="trigger" href="#">
trigger
</a>
)}
OptionList={OptionList}
displayValues={[]}
emptyOptions
id="test"
onDisplayValuesChange={() => {}}
onSearch={() => {}}
searchValue=""
/>,
);
expect(container.querySelector('div.popup')).toBeFalsy();
fireEvent.click(container.querySelector('a.trigger'));
expect(container.querySelector('div.popup')).toBeTruthy();
fireEvent.mouseDown(container.querySelector('a.trigger'));
expect(container.querySelector('div.rc-select-dropdown-hidden')).toBeFalsy();
fireEvent.click(container.querySelector('a.trigger'));
expect(container.querySelector('div.rc-select-dropdown-hidden')).toBeTruthy();
});
});

1 comment on commit fe0fbd9

@vercel
Copy link

@vercel vercel bot commented on fe0fbd9 May 19, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Successfully deployed to the following URLs:

select – ./

select-git-master-react-component.vercel.app
select-react-component.vercel.app
select.vercel.app

Please sign in to comment.