react-cm-ui
Version:
React UI for Healthy Church
70 lines (61 loc) • 2.16 kB
JSX
import _ from 'lodash';
import ClassNames from 'classnames';
import PropTypes from 'prop-types';
import React from 'react';
import Header from '../header';
const propTypes = {
columns: PropTypes.arrayOf(PropTypes.shape({
style: PropTypes.shape({}),
})).isRequired,
data: PropTypes.shape({}).isRequired,
moduleType: PropTypes.oneOf(['drawer', 'page']).isRequired,
};
function DataCardColumn(props) {
const {
columns,
data,
moduleType,
} = props;
const elementClassName = `${moduleType}--data_card_column`;
return _.map(columns, (column, index) => {
const accessorClasses = ClassNames(`${elementClassName}_accessor`, {
'font-size-medium': column.fontSize === 'medium',
'font-size-small': !column.fontSize || column.fontSize === 'small',
'font-weight-bold': column.fontWeight === 'bold',
'font-weight-normal': !column.fontWeight || column.fontWeight === 'normal',
'font-weight-semibold': column.fontWeight === 'semibold',
});
let accessor = null;
if (_.isString(column.accessor)) {
accessor = _.get(data, column.accessor);
} else if (_.isFunction(column.accessor)) {
accessor = column.accessor(data);
}
return (
<div
className={elementClassName}
key={`${elementClassName}-${index}`}
style={{
marginBottom: column.width ? '11px' : null,
width: column.width,
...(column.style || {}),
}}
>
{column.header && (
<Header
color="static"
size="xsmall"
style={{ margin: 0 }}
>
{column.header}
</Header>
)}
<span className={accessorClasses}>
{accessor}
</span>
</div>
);
});
}
DataCardColumn.propTypes = propTypes;
export default DataCardColumn;