Skip to content

Commit d04df92

Browse files
committed
chore: connect combobox
1 parent fcc578d commit d04df92

3 files changed

Lines changed: 25 additions & 16 deletions

File tree

src/SelectInput/Content/index.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,19 @@ import * as React from 'react';
22
import SingleContent from './SingleContent';
33
import MultipleContent from './MultipleContent';
44
import { useSelectInputContext } from '../context';
5+
import useBaseProps from '../../hooks/useBaseProps';
56

67
export interface SharedContentProps {
7-
inputProps: React.HTMLAttributes<HTMLInputElement>;
8+
inputProps: React.InputHTMLAttributes<HTMLInputElement>;
89
}
910

1011
const SelectContent = React.forwardRef<HTMLInputElement>(function SelectContent(_, ref) {
1112
const { multiple, onInputKeyDown } = useSelectInputContext();
13+
const { showSearch } = useBaseProps();
1214

1315
const sharedInputProps: SharedContentProps['inputProps'] = {
1416
onKeyDown: onInputKeyDown,
17+
readOnly: !showSearch,
1518
};
1619

1720
if (multiple) {

src/SelectInput/index.tsx

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import * as React from 'react';
2-
import clsx from 'clsx';
32
import Affix from './Affix';
43
import SelectContent from './Content';
54
import SelectInputContext from './context';
@@ -94,7 +93,7 @@ export default React.forwardRef<SelectInputRef, SelectInputProps>(function Selec
9493
...restProps
9594
} = props;
9695

97-
const { triggerOpen, toggleOpen } = useBaseProps();
96+
const { triggerOpen, toggleOpen, showSearch, disabled } = useBaseProps();
9897

9998
const rootRef = React.useRef<HTMLDivElement>(null);
10099
const inputRef = React.useRef<HTMLInputElement>(null);
@@ -151,14 +150,23 @@ export default React.forwardRef<SelectInputRef, SelectInputProps>(function Selec
151150

152151
// ====================== Open ======================
153152
const onInternalMouseDown: SelectInputProps['onMouseDown'] = useEvent((event) => {
154-
event.preventDefault();
155-
156-
if (!(event.nativeEvent as any)._select_lazy) {
157-
inputRef.current?.focus();
158-
toggleOpen();
159-
} else if (triggerOpen) {
160-
// Lazy should also close when click clear icon
161-
toggleOpen(false);
153+
if (!disabled) {
154+
event.preventDefault();
155+
156+
// Check if we should prevent closing when clicking on selector
157+
// Don't close if: open && not multiple && (combobox mode || showSearch)
158+
const shouldPreventClose = triggerOpen && !multiple && (mode === 'combobox' || showSearch);
159+
160+
if (!(event.nativeEvent as any)._select_lazy) {
161+
inputRef.current?.focus();
162+
// Only toggle open if we should not prevent close
163+
if (!shouldPreventClose) {
164+
toggleOpen();
165+
}
166+
} else if (triggerOpen) {
167+
// Lazy should also close when click clear icon
168+
toggleOpen(false);
169+
}
162170
}
163171

164172
onMouseDown?.(event);
@@ -184,7 +192,7 @@ export default React.forwardRef<SelectInputRef, SelectInputProps>(function Selec
184192
{...domProps}
185193
// Style
186194
ref={rootRef}
187-
className={clsx(className)}
195+
className={className}
188196
style={style}
189197
// Open
190198
onMouseDown={onInternalMouseDown}

tests/Combobox.test.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -486,8 +486,6 @@ describe('Select.Combobox', () => {
486486
jest.useRealTimers();
487487
});
488488

489-
return;
490-
491489
it('should keep close after blur', async () => {
492490
const { container } = render(
493491
<Select mode="combobox" notFoundContent={null}>
@@ -619,7 +617,7 @@ describe('Select.Combobox', () => {
619617
</Select>,
620618
);
621619

622-
const selectorEle = container.querySelector('.rc-select-selector');
620+
const selectorEle = container.querySelector('.rc-select');
623621

624622
const mouseDownEvent = createEvent.mouseDown(selectorEle);
625623
mouseDownEvent.preventDefault = preventDefault;
@@ -636,7 +634,7 @@ describe('Select.Combobox', () => {
636634
</Select>,
637635
);
638636

639-
const selectorEle = container.querySelector('.rc-select-selector');
637+
const selectorEle = container.querySelector('.rc-select');
640638

641639
const mouseDownEvent = createEvent.mouseDown(selectorEle);
642640
mouseDownEvent.preventDefault = preventDefault;

0 commit comments

Comments
 (0)