1 | import React from 'react';
|
2 | import PropTypes from 'prop-types';
|
3 | import classNames from 'classnames';
|
4 | import { DropdownContext } from './DropdownContext';
|
5 | import { mapToCssModules, omit, tagPropType } from './utils';
|
6 |
|
7 | const propTypes = {
|
8 | children: PropTypes.node,
|
9 | active: PropTypes.bool,
|
10 | disabled: PropTypes.bool,
|
11 | divider: PropTypes.bool,
|
12 | tag: tagPropType,
|
13 | header: PropTypes.bool,
|
14 | onClick: PropTypes.func,
|
15 | className: PropTypes.string,
|
16 | cssModule: PropTypes.object,
|
17 | toggle: PropTypes.bool,
|
18 | text: PropTypes.bool,
|
19 | };
|
20 |
|
21 | class DropdownItem extends React.Component {
|
22 | constructor(props) {
|
23 | super(props);
|
24 |
|
25 | this.onClick = this.onClick.bind(this);
|
26 | this.getTabIndex = this.getTabIndex.bind(this);
|
27 | }
|
28 |
|
29 | onClick(e) {
|
30 | const { disabled, header, divider, text } = this.props;
|
31 | if (disabled || header || divider || text) {
|
32 | e.preventDefault();
|
33 | return;
|
34 | }
|
35 |
|
36 | if (this.props.onClick) {
|
37 | this.props.onClick(e);
|
38 | }
|
39 |
|
40 | if (this.props.toggle ?? true) {
|
41 | this.context.toggle(e);
|
42 | }
|
43 | }
|
44 |
|
45 | getRole() {
|
46 | if (this.context.menuRole === 'listbox') {
|
47 | return 'option';
|
48 | }
|
49 | return 'menuitem';
|
50 | }
|
51 |
|
52 | getTabIndex() {
|
53 | const { disabled, header, divider, text } = this.props;
|
54 | if (disabled || header || divider || text) {
|
55 | return '-1';
|
56 | }
|
57 |
|
58 | return '0';
|
59 | }
|
60 |
|
61 | render() {
|
62 | const tabIndex = this.getTabIndex();
|
63 | const role = tabIndex > -1 ? this.getRole() : undefined;
|
64 | let {
|
65 | className,
|
66 | cssModule,
|
67 | divider,
|
68 | tag: Tag = 'button',
|
69 | header,
|
70 | active,
|
71 | text,
|
72 | ...props
|
73 | } = omit(this.props, ['toggle']);
|
74 |
|
75 | const classes = mapToCssModules(
|
76 | classNames(className, {
|
77 | disabled: props.disabled,
|
78 | 'dropdown-item': !divider && !header && !text,
|
79 | active: active,
|
80 | 'dropdown-header': header,
|
81 | 'dropdown-divider': divider,
|
82 | 'dropdown-item-text': text,
|
83 | }),
|
84 | cssModule,
|
85 | );
|
86 |
|
87 | if (Tag === 'button') {
|
88 | if (header) {
|
89 | Tag = 'h6';
|
90 | } else if (divider) {
|
91 | Tag = 'div';
|
92 | } else if (props.href) {
|
93 | Tag = 'a';
|
94 | } else if (text) {
|
95 | Tag = 'span';
|
96 | }
|
97 | }
|
98 |
|
99 | return (
|
100 | <Tag
|
101 | type={
|
102 | Tag === 'button' && (props.onClick || this.props.toggle)
|
103 | ? 'button'
|
104 | : undefined
|
105 | }
|
106 | {...props}
|
107 | tabIndex={tabIndex}
|
108 | role={role}
|
109 | className={classes}
|
110 | onClick={this.onClick}
|
111 | />
|
112 | );
|
113 | }
|
114 | }
|
115 |
|
116 | DropdownItem.propTypes = propTypes;
|
117 | DropdownItem.contextType = DropdownContext;
|
118 |
|
119 | export default DropdownItem;
|