react-cm-ui
Version:
React UI for Healthy Church
203 lines (181 loc) • 6.92 kB
JSX
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;