Skip to content

Commit 986a688

Browse files
committed
save
1 parent 1ded65d commit 986a688

File tree

6 files changed

+64
-21
lines changed

6 files changed

+64
-21
lines changed

src/BaseSelect/index.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -294,9 +294,6 @@ const BaseSelect = React.forwardRef<BaseSelectRef, BaseSelectProps>((props, ref)
294294
onKeyDown,
295295
onMouseDown,
296296

297-
classNames: selectClassNames,
298-
styles,
299-
300297
// Rest Props
301298
...restProps
302299
} = props;
@@ -411,7 +408,12 @@ const BaseSelect = React.forwardRef<BaseSelectRef, BaseSelectProps>((props, ref)
411408
[tokenSeparators],
412409
);
413410

414-
const { maxCount, rawValues } = React.useContext<SelectContextProps>(SelectContext) || {};
411+
const {
412+
maxCount,
413+
rawValues,
414+
classNames: selectClassNames,
415+
styles,
416+
} = React.useContext<SelectContextProps>(SelectContext) || {};
415417

416418
const onInternalSearch = (searchText: string, fromTyping: boolean, isCompositing: boolean) => {
417419
if (multiple && isValidCount(maxCount) && rawValues?.size >= maxCount) {

src/OptionList.tsx

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ const OptionList: React.ForwardRefRenderFunction<RefOptionListProps, {}> = (_, r
6060
listHeight,
6161
listItemHeight,
6262
optionRender,
63+
classNames: contextClassNames,
64+
styles: contextStyles,
6365
} = React.useContext(SelectContext);
6466

6567
const itemPrefixCls = `${prefixCls}-item`;
@@ -327,6 +329,8 @@ const OptionList: React.ForwardRefRenderFunction<RefOptionListProps, {}> = (_, r
327329
direction={direction}
328330
innerProps={virtual ? null : a11yProps}
329331
showScrollBar={showScrollBar}
332+
className={contextClassNames?.list}
333+
style={contextStyles?.list}
330334
>
331335
{(item, itemIndex) => {
332336
const { group, groupOption, data, label, value } = item;
@@ -355,12 +359,18 @@ const OptionList: React.ForwardRefRenderFunction<RefOptionListProps, {}> = (_, r
355359
const mergedDisabled = disabled || (!selected && overMaxCount);
356360

357361
const optionPrefixCls = `${itemPrefixCls}-option`;
358-
const optionClassName = classNames(itemPrefixCls, optionPrefixCls, className, {
359-
[`${optionPrefixCls}-grouped`]: groupOption,
360-
[`${optionPrefixCls}-active`]: activeIndex === itemIndex && !mergedDisabled,
361-
[`${optionPrefixCls}-disabled`]: mergedDisabled,
362-
[`${optionPrefixCls}-selected`]: selected,
363-
});
362+
const optionClassName = classNames(
363+
itemPrefixCls,
364+
optionPrefixCls,
365+
className,
366+
contextClassNames?.item,
367+
{
368+
[`${optionPrefixCls}-grouped`]: groupOption,
369+
[`${optionPrefixCls}-active`]: activeIndex === itemIndex && !mergedDisabled,
370+
[`${optionPrefixCls}-disabled`]: mergedDisabled,
371+
[`${optionPrefixCls}-selected`]: selected,
372+
},
373+
);
364374

365375
const mergedLabel = getLabel(item);
366376

@@ -393,7 +403,7 @@ const OptionList: React.ForwardRefRenderFunction<RefOptionListProps, {}> = (_, r
393403
onSelectValue(value);
394404
}
395405
}}
396-
style={style}
406+
style={{ ...contextStyles?.item, ...style }}
397407
>
398408
<div className={`${optionPrefixCls}-content`}>
399409
{typeof optionRender === 'function'

src/Select.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ export type SelectHandler<ValueType, OptionType extends BaseOptionType = Default
107107

108108
type ArrayElementType<T> = T extends (infer E)[] ? E : T;
109109

110-
export type SemanticName = 'prefix' | 'suffix';
110+
export type SemanticName = 'prefix' | 'suffix' | 'item' | 'list' | 'input' | 'tag';
111111
export interface SelectProps<ValueType = any, OptionType extends BaseOptionType = DefaultOptionType>
112112
extends BaseSelectPropsWithoutPrivate {
113113
prefixCls?: string;
@@ -207,7 +207,8 @@ const Select = React.forwardRef<BaseSelectRef, SelectProps<any, DefaultOptionTyp
207207
labelInValue,
208208
onChange,
209209
maxCount,
210-
210+
classNames: selectClassNames,
211+
styles,
211212
...restProps
212213
} = props;
213214

@@ -629,8 +630,12 @@ const Select = React.forwardRef<BaseSelectRef, SelectProps<any, DefaultOptionTyp
629630
childrenAsData,
630631
maxCount,
631632
optionRender,
633+
classNames: selectClassNames,
634+
styles,
632635
};
633636
}, [
637+
selectClassNames,
638+
styles,
634639
maxCount,
635640
parsedOptions,
636641
displayOptions,

src/SelectContext.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@ import type {
66
OnActiveValue,
77
OnInternalSelect,
88
SelectProps,
9+
SemanticName,
910
} from './Select';
1011
import type { FlattenOptionData } from './interface';
1112

1213
// Use any here since we do not get the type during compilation
1314
export interface SelectContextProps {
15+
classNames?: Partial<Record<SemanticName, string>>;
16+
styles?: Partial<Record<SemanticName, React.CSSProperties>>;
1417
options: BaseOptionType[];
1518
optionRender?: SelectProps['optionRender'];
1619
flattenOptions: FlattenOptionData<BaseOptionType>[];

src/Selector/Input.tsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import * as React from 'react';
22
import classNames from 'classnames';
33
import { composeRef } from '@rc-component/util/lib/ref';
44
import { warning } from '@rc-component/util/lib/warning';
5-
5+
import SelectContext from '../SelectContext';
66
type InputRef = HTMLInputElement | HTMLTextAreaElement;
77

88
interface InputProps {
@@ -57,6 +57,8 @@ const Input: React.ForwardRefRenderFunction<InputRef, InputProps> = (props, ref)
5757
open,
5858
attrs,
5959
} = props;
60+
const { classNames: contextClassNames, styles: contextStyles } =
61+
React.useContext(SelectContext) || {};
6062

6163
let inputNode: React.ComponentElement<any, any> = inputElement || <input />;
6264

@@ -80,7 +82,6 @@ const Input: React.ForwardRefRenderFunction<InputRef, InputProps> = (props, ref)
8082
inputNode = React.cloneElement(inputNode, {
8183
type: 'search',
8284
...originProps,
83-
8485
// Override over origin props
8586
id,
8687
ref: composeRef(ref, originRef as any),
@@ -89,7 +90,11 @@ const Input: React.ForwardRefRenderFunction<InputRef, InputProps> = (props, ref)
8990
autoComplete: autoComplete || 'off',
9091

9192
autoFocus,
92-
className: classNames(`${prefixCls}-selection-search-input`, inputNode?.props?.className),
93+
className: classNames(
94+
`${prefixCls}-selection-search-input`,
95+
inputNode?.props?.className,
96+
contextClassNames?.input,
97+
),
9398

9499
role: 'combobox',
95100
'aria-expanded': open || false,
@@ -104,7 +109,7 @@ const Input: React.ForwardRefRenderFunction<InputRef, InputProps> = (props, ref)
104109
readOnly: !editable,
105110
unselectable: !editable ? 'on' : null,
106111

107-
style: { ...style, opacity: editable ? null : 0 },
112+
style: { ...style, opacity: editable ? null : 0, ...contextStyles?.input },
108113

109114
onKeyDown: (event: React.KeyboardEvent<HTMLElement>) => {
110115
onKeyDown(event);

tests/Select.test.tsx

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2421,10 +2421,16 @@ describe('Select.Basic', () => {
24212421
const customClassNames = {
24222422
prefix: 'cutsom-prefix',
24232423
suffix: 'custom-suffix',
2424+
list: 'custom-list',
2425+
item: 'custom-item',
2426+
input: 'custom-input',
24242427
};
24252428
const customStyle = {
24262429
prefix: { color: 'red' },
24272430
suffix: { color: 'green' },
2431+
list: { color: 'yellow' },
2432+
item: { color: 'blue' },
2433+
input: { color: 'black' },
24282434
};
24292435
const { container } = render(
24302436
<Select
@@ -2441,11 +2447,23 @@ describe('Select.Basic', () => {
24412447
]}
24422448
/>,
24432449
);
2450+
2451+
console.log(container.innerHTML);
2452+
24442453
const prefix = container.querySelector('.rc-select-prefix');
24452454
const suffix = container.querySelector('.rc-select-arrow');
2446-
expect(prefix).toHaveClass('cutsom-prefix');
2447-
expect(prefix).toHaveStyle('color: red');
2448-
expect(suffix).toHaveClass('custom-suffix');
2449-
expect(suffix).toHaveStyle('color: green');
2455+
const item = container.querySelector('.rc-select-item-option');
2456+
const list = container.querySelector('.rc-virtual-list');
2457+
const input = container.querySelector('.rc-select-selection-search-input');
2458+
expect(prefix).toHaveClass(customClassNames.prefix);
2459+
expect(prefix).toHaveStyle(customStyle.prefix);
2460+
expect(suffix).toHaveClass(customClassNames.suffix);
2461+
expect(suffix).toHaveStyle(customStyle.suffix);
2462+
expect(item).toHaveClass(customClassNames.item);
2463+
expect(item).toHaveStyle(customStyle.item);
2464+
expect(list).toHaveClass(customClassNames.list);
2465+
expect(list).toHaveStyle(customStyle.list);
2466+
expect(input).toHaveClass(customClassNames.input);
2467+
expect(input).toHaveStyle(customStyle.input);
24502468
});
24512469
});

0 commit comments

Comments
 (0)