Skip to content

Commit 1756d71

Browse files
authored
feat: add direction (#471)
* feat: add dropdown placement * add: api * feat: use direction * feat: add rtl demo * fix: id * feat: add test * fix: test case
1 parent d5d51ec commit 1756d71

File tree

5 files changed

+49
-1
lines changed

5 files changed

+49
-1
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ React.render(c, container);
115115
| dropdownRender | render custom dropdown menu | (menu: React.Node, props: MenuProps) => ReactNode | - |
116116
| loading | show loading icon in arrow | Boolean | false |
117117
| virtual | Disable virtual scroll | Boolean | true |
118+
| direction | direction of dropdown | 'ltr' \| 'rtl' | 'ltr' |
118119

119120
### Methods
120121

examples/single.tsx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,22 @@ class Test extends React.Component {
125125
))}
126126
</select>
127127

128+
<h2>RTL Select</h2>
129+
130+
<div style={{ width: 300 }}>
131+
<Select
132+
id="my-select-rtl"
133+
placeholder="rtl"
134+
direction="rtl"
135+
dropdownMatchSelectWidth={300}
136+
dropdownStyle={{ minWidth: 300 }}
137+
style={{ width: 500 }}
138+
>
139+
<Option value="1">1</Option>
140+
<Option value="2">2</Option>
141+
</Select>
142+
</div>
143+
128144
<p>
129145
<button type="button" onClick={this.onDestroy}>
130146
destroy

src/SelectTrigger.tsx

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,14 @@ const getBuiltInPlacements = (dropdownMatchSelectWidth: number | boolean) => {
1616
adjustY: 1,
1717
},
1818
},
19+
bottomRight: {
20+
points: ['tr', 'br'],
21+
offset: [0, 4],
22+
overflow: {
23+
adjustX,
24+
adjustY: 1,
25+
},
26+
},
1927
topLeft: {
2028
points: ['bl', 'tl'],
2129
offset: [0, -4],
@@ -24,6 +32,14 @@ const getBuiltInPlacements = (dropdownMatchSelectWidth: number | boolean) => {
2432
adjustY: 1,
2533
},
2634
},
35+
topRight: {
36+
points: ['br', 'tr'],
37+
offset: [0, -4],
38+
overflow: {
39+
adjustX,
40+
adjustY: 1,
41+
},
42+
},
2743
};
2844
};
2945

@@ -43,6 +59,7 @@ export interface SelectTriggerProps {
4359
containerWidth: number;
4460
dropdownStyle: React.CSSProperties;
4561
dropdownClassName: string;
62+
direction: string;
4663
dropdownMatchSelectWidth?: boolean | number;
4764
dropdownRender?: (menu: React.ReactElement) => React.ReactElement;
4865
getPopupContainer?: RenderDOMFunc;
@@ -67,6 +84,7 @@ const SelectTrigger: React.RefForwardingComponent<RefTriggerProps, SelectTrigger
6784
transitionName,
6885
dropdownStyle,
6986
dropdownClassName,
87+
direction = 'ltr',
7088
dropdownMatchSelectWidth = true,
7189
dropdownRender,
7290
dropdownAlign,
@@ -113,7 +131,7 @@ const SelectTrigger: React.RefForwardingComponent<RefTriggerProps, SelectTrigger
113131
{...restProps}
114132
showAction={[]}
115133
hideAction={[]}
116-
popupPlacement="bottomLeft"
134+
popupPlacement={direction === 'rtl' ? 'bottomRight' : 'bottomLeft'}
117135
builtinPlacements={builtInPlacements}
118136
prefixCls={dropdownPrefixCls}
119137
popupTransitionName={mergedTransitionName}

src/generate.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ export interface SelectProps<OptionsType extends object[], ValueType> extends Re
108108
animation?: string;
109109
transitionName?: string;
110110
getPopupContainer?: RenderDOMFunc;
111+
direction?: string;
111112

112113
// Others
113114
disabled?: boolean;
@@ -282,6 +283,7 @@ export default function generateSelector<
282283
dropdownRender,
283284
dropdownAlign,
284285
showAction = [],
286+
direction,
285287

286288
// Tags
287289
tokenSeparators,
@@ -951,6 +953,7 @@ export default function generateSelector<
951953
transitionName={transitionName}
952954
dropdownStyle={dropdownStyle}
953955
dropdownClassName={dropdownClassName}
956+
direction={direction}
954957
dropdownMatchSelectWidth={dropdownMatchSelectWidth}
955958
dropdownRender={dropdownRender}
956959
dropdownAlign={dropdownAlign}

tests/Select.test.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,16 @@ describe('Select.Basic', () => {
209209
expect(wrapper2.find('.rc-select-clear-icon').length).toBeFalsy();
210210
});
211211

212+
it('should direction rtl', () => {
213+
const wrapper = mount(
214+
<Select direction="rtl">
215+
<Option value="1">1</Option>
216+
<Option value="2">2</Option>
217+
</Select>,
218+
);
219+
expect(wrapper.find('Trigger').props().popupPlacement).toBe('bottomRight');
220+
});
221+
212222
it('should not response click event when select is disabled', () => {
213223
const wrapper = mount(
214224
<Select disabled defaultValue="2">

0 commit comments

Comments
 (0)