UNPKG

react-cm-ui

Version:
203 lines (181 loc) 6.92 kB
import _ from 'lodash'; import ClassNames from 'classnames'; import PropTypes from 'prop-types'; import React from 'react'; import ActivityIndicator from '../../feedback/activityIndicator'; import Header from '../header'; import Icon from '../icon'; import List from '../list'; import DataGroupExpandedRow from './dataGroupExpandedRow'; import DataGroupRow from './dataGroupRow'; import { groupPropTypes } from './dataGroupsPropTypes'; const propTypes = { group: groupPropTypes.isRequired, data: PropTypes.shape({}).isRequired, moduleType: PropTypes.string.isRequired, style: PropTypes.shape({}), }; const defaultProps = { style: {}, }; class DataGroup extends React.PureComponent { constructor(props) { super(props); this.state = { isExpanded: false, }; this.onToggleExpandClick = this.onToggleExpandClick.bind(this); } onToggleExpandClick() { const isElementHighlighted = window.getSelection().toString(); if (!isElementHighlighted) { this.setState((prevState) => ({ isExpanded: !prevState.isExpanded, })); } } render() { const { group: { className, expandableSections, id, isExpandable, header, rows, style, }, data, moduleType, } = this.props; const { isExpanded } = this.state; const bemClassName = `${moduleType}--data_group`; const rootClasses = ClassNames(bemClassName, className, { [`${bemClassName}-is_expandable`]: isExpandable, [`${bemClassName}-expanded`]: isExpandable && isExpanded, }); let expandableJSX; const rowJSX = ( <div className={`${bemClassName}_contract_section`}> <List className={`${bemClassName}_list`} divide > {_.map(rows, (row, index) => ( <List.Item key={`${bemClassName}_list_item-${index}`} > <DataGroupRow bemClassName={bemClassName} data={data} row={row} /> </List.Item> ))} </List> </div> ); if (isExpandable && !_.isEmpty(expandableSections)) { expandableJSX = ( <div className={`${bemClassName}_expand_section`} > {_.map(expandableSections, (expandRow, expandIndex) => ( <div className={`${bemClassName}_expand_section_list`} key={`${bemClassName}_expand_section_list-${expandIndex}`} > {expandRow.header && ( <Header className={`${bemClassName}_header`} size="medium" style={{ marginBottom: '22px', lineHeight: '16px', }} weight="semibold" > {expandRow.header} </Header> )} <List className={`${bemClassName}_list`} > {_.map(expandRow.rows, (row, index) => ( <List.Item key={`${bemClassName}_list_item-${index}`} > <DataGroupExpandedRow bemClassName={bemClassName} data={data} row={row} /> </List.Item> ))} </List> </div> ))} </div> ); } return ( <div className={rootClasses} id={id} onClick={this.onToggleExpandClick} role="presentation" style={style} > {isExpandable && isExpanded && !_.isEmpty(expandableSections) && ( <div className={`${bemClassName}_inner_container_loader`}> <ActivityIndicator color="backgroundColorStatic" size={32} /> </div> )} <div className={`${bemClassName}_inner_container`} > <div className={`${bemClassName}_header_section`} style={{ marginBottom: '33px', }} > {header && ( <Header className={`${bemClassName}_header_title`} weight="bold" size="large" style={{ margin: '0', lineHeight: '16px', }} > {header} </Header> )} {isExpandable && !_.isEmpty(expandableSections) && ( <div className={`${bemClassName}_header_icon_section`} > <Icon className={`${bemClassName}_header_icon`} type={isExpanded ? 'contract' : 'expand'} /> </div> )} </div> {rowJSX} {isExpandable && !_.isEmpty(expandableSections) && ( expandableJSX )} </div> </div> ); } } DataGroup.propTypes = propTypes; DataGroup.defaultProps = defaultProps; export default DataGroup;