UNPKG

react-cm-ui

Version:
171 lines (149 loc) 5.85 kB
import _ from 'lodash'; import ClassNames from 'classnames'; import PropTypes from 'prop-types'; import React from 'react'; // eslint-disable-next-line import/extensions, import/no-unresolved import colorStyles from '../../styles/colorExports'; import ActionBarActionsButtonDrawerSubOption, { singleOptionPropTypeShape, } from './actionBarActionsButtonDrawerSubOption'; import Icon from '../../dataDisplay/icon'; const rootOptionPropTypeShape = { ...singleOptionPropTypeShape, options: PropTypes.arrayOf(PropTypes.shape(singleOptionPropTypeShape)), }; const propTypes = { hide: PropTypes.bool, idNumber: PropTypes.number, isSelected: PropTypes.bool, onClick: PropTypes.func.isRequired, onRequestPrompt: PropTypes.func, onDrawerToggle: PropTypes.func, option: PropTypes.shape(rootOptionPropTypeShape).isRequired, }; const defaultProps = { hide: false, idNumber: false, isSelected: false, onRequestPrompt: undefined, onDrawerToggle: undefined, }; class ActionBarActionsButtonDrawerOption extends React.PureComponent { constructor() { super(); this.onParentClick = this.onParentClick.bind(this); } onParentClick() { const { isSelected, onClick, onRequestPrompt, onDrawerToggle, option, } = this.props; if (_.isFunction(option.onClick)) { if (option.disabled) { return; } if (option.requiresPrompt) { if (_.isFunction(onRequestPrompt)) { onRequestPrompt(option); return; } } onDrawerToggle(); option.onClick(); return; } onClick(isSelected ? {} : option); } render() { const { hide, idNumber, isSelected, onRequestPrompt, onDrawerToggle, option, } = this.props; const containerClasses = ClassNames( 'actions_button_drawer--option_container', `actions_button_drawer--option_container-${idNumber}`, `${hide ? `actions_button_drawer--option_container-${idNumber}-hide` : ''}`, `${!hide && !isSelected ? `actions_button_drawer--option_container-${idNumber}-show` : ''}`, { 'actions_button_drawer--option_container-selected': isSelected, }, ); const parentOptionClasses = ClassNames('actions_button_drawer--option', { 'actions_button_drawer--option-selected': isSelected, 'actions_button_drawer--option-disabled': option.disabled, }); const subOptionsClasses = ClassNames('actions_button_drawer--sub_options', { 'actions_button_drawer--sub_options-hide': !isSelected, 'actions_button_drawer--sub_options-show': isSelected, }); let subOptionClassNameNum = 1; let subOptionKeyNum = 1; /* eslint-disable jsx-a11y/click-events-have-key-events */ return ( <div className={containerClasses} > <div className={parentOptionClasses} onClick={this.onParentClick} role="menuitem" tabIndex={idNumber} > {option.iconType && ( <div className="actions_button_drawer_option--icon_container" id={option.id} style={{ backgroundColor: option.disabled ? colorStyles.backgroundColorStatic : option.iconBackgroundColor, }} > <Icon color={option.iconColor} compact className="actions_button_drawer_option--icon" inverse size={option.iconSize || 16} type={option.iconType} /> </div> )} <div className="actions_button_drawer_option--label" > {option.label} </div> </div> {option.options && ( <div className={subOptionsClasses}> {_.map(option.options, (subOption) => { const classNameNumber = subOptionClassNameNum++; // eslint-disable-line max-len,no-plusplus return ( <ActionBarActionsButtonDrawerSubOption isSelected={isSelected} key={`actions_button_drawer_sub_option-${subOptionKeyNum++/* eslint-disable-line no-plusplus */}`} onRequestPrompt={onRequestPrompt} onDrawerToggle={onDrawerToggle} subOption={subOption} subOptionClassNameNum={classNameNumber} /> ); })} </div> )} </div> ); /* eslint-enable jsx-a11y/click-events-have-key-events */ } } ActionBarActionsButtonDrawerOption.propTypes = propTypes; ActionBarActionsButtonDrawerOption.defaultProps = defaultProps; export default ActionBarActionsButtonDrawerOption;