Skip to content

Commit 3960106

Browse files
authored
feat(Dropdown): Add Dropdown.ItemText component (react-bootstrap#5315)
1 parent dc5d64f commit 3960106

File tree

6 files changed

+31
-0
lines changed

6 files changed

+31
-0
lines changed

src/Dropdown.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ const DropdownHeader = createWithBsPrefix('dropdown-header', {
2222
const DropdownDivider = createWithBsPrefix('dropdown-divider', {
2323
defaultProps: { role: 'separator' },
2424
});
25+
const DropdownItemText = createWithBsPrefix('dropdown-item-text', {
26+
Component: 'span',
27+
});
2528

2629
export interface DropdownProps extends BsPrefixPropsWithChildren {
2730
drop?: 'up' | 'left' | 'right' | 'down';
@@ -42,6 +45,7 @@ type Dropdown = BsPrefixRefForwardingComponent<'div', DropdownProps> & {
4245
Toggle: typeof DropdownToggle;
4346
Menu: typeof DropdownMenu;
4447
Item: typeof DropdownItem;
48+
ItemText: typeof DropdownItemText;
4549
Divider: typeof DropdownDivider;
4650
Header: typeof DropdownHeader;
4751
};
@@ -191,6 +195,7 @@ Dropdown.defaultProps = defaultProps;
191195
Dropdown.Divider = DropdownDivider;
192196
Dropdown.Header = DropdownHeader;
193197
Dropdown.Item = DropdownItem;
198+
Dropdown.ItemText = DropdownItemText;
194199
Dropdown.Menu = DropdownMenu;
195200
Dropdown.Toggle = DropdownToggle;
196201

src/NavDropdown.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export interface NavDropdownProps extends BsPrefixPropsWithChildren {
2121

2222
type NavDropdown = BsPrefixRefForwardingComponent<'div', NavDropdownProps> & {
2323
Item: typeof Dropdown.Item;
24+
ItemText: typeof Dropdown.ItemText;
2425
Divider: typeof Dropdown.Divider;
2526
Header: typeof Dropdown.Header;
2627
};
@@ -104,6 +105,7 @@ const NavDropdown: NavDropdown = (React.forwardRef(
104105
NavDropdown.displayName = 'NavDropdown';
105106
NavDropdown.propTypes = propTypes;
106107
NavDropdown.Item = Dropdown.Item;
108+
NavDropdown.ItemText = Dropdown.ItemText;
107109
NavDropdown.Divider = Dropdown.Divider;
108110
NavDropdown.Header = Dropdown.Header;
109111

test/DropdownItemSpec.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,24 @@ describe('<Dropdown.Item>', () => {
3838
node.style.height.should.equal('100px');
3939
});
4040

41+
it('renders Dropdown.ItemText', () => {
42+
mount(<Dropdown.ItemText>My text</Dropdown.ItemText>)
43+
.assertSingle('span.dropdown-item-text')
44+
.text()
45+
.should.equal('My text');
46+
});
47+
48+
it('renders Dropdown.ItemText className and style', () => {
49+
const node = mount(
50+
<Dropdown.ItemText className="foo bar" style={{ height: '100px' }}>
51+
My text
52+
</Dropdown.ItemText>,
53+
).getDOMNode();
54+
55+
node.className.should.match(/\bfoo bar dropdown-item-text\b/);
56+
node.style.height.should.equal('100px');
57+
});
58+
4159
it('renders menu item link', (done) => {
4260
mount(
4361
<Dropdown.Item onKeyDown={() => done()} href="/herpa-derpa">

tests/simple-types-test.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,7 @@ const MegaComponent = () => (
330330
<Dropdown.Item href="#/action-3">Something else</Dropdown.Item>
331331
<Dropdown.Header as="div" bsPrefix="dropdownheader" style={style} />
332332
<Dropdown.Divider as="div" bsPrefix="dropdowndivider" style={style} />
333+
<Dropdown.Divider as="div" bsPrefix="prefix" style={style} />
333334
</Dropdown.Menu>
334335
</Dropdown>
335336
<DropdownButton
@@ -751,6 +752,7 @@ const MegaComponent = () => (
751752
<NavDropdown.Item eventKey="4.3">Something else here</NavDropdown.Item>
752753
<NavDropdown.Divider />
753754
<NavDropdown.Item eventKey="4.4">Separated link</NavDropdown.Item>
755+
<NavDropdown.ItemText bsPrefix="prefix" as="div" />
754756
</NavDropdown>
755757
</Nav>
756758
<Navbar

www/src/examples/Dropdown/DropdownItemTags.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
<DropdownButton id="dropdown-item-button" title="Dropdown button">
2+
<Dropdown.ItemText>Dropdown item text</Dropdown.ItemText>
23
<Dropdown.Item as="button">Action</Dropdown.Item>
34
<Dropdown.Item as="button">Another action</Dropdown.Item>
45
<Dropdown.Item as="button">Something else</Dropdown.Item>

www/src/pages/components/dropdowns.mdx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@ Historically dropdown menu contents had to be links, but that’s no
104104
longer the case with v4. Now you can optionally use
105105
`<button>` elements in your dropdowns instead of just `<a>`s.
106106

107+
You can also create non-interactive dropdown items with `<Dropdown.ItemText>`.
108+
Feel free to style further with custom CSS or text utilities.
109+
107110
<ReactPlayground codeText={DropdownItemTags} />
108111

109112
### Menu alignment

0 commit comments

Comments
 (0)