import React from 'react';
import { Row } from 'react-bootstrap';
import ReactGridCell from './react-grid-cell';
import Expandable from './expandable';
import { Size } from '../commons/grid-utils';
export default class ReactGrid extends React.Component {
constructor(props) {
super(props);
this.cellRender = this.cellRender.bind(this);
}
gridRender() {
const vals = this.props.values;
const rows = [];
const onCellSize = this.props.onCellSize;
let size = new Size();
// cell render
let cells = [];
vals.forEach((item, index) => {
// get the cell size (width)
const cellSize = onCellSize ? onCellSize(item) : this.props.cellSize;
// rend cell
const cell = (
);
cells.push(cell);
size.add(cellSize);
// check if next cell fits in ermaining size or if it is the last item
if (!size.fitInSize(cellSize) || index === vals.length - 1) {
// add cells to the row
rows.push({cells}
);
// empty the left size
size = new Size();
// empty cells
cells = [];
}
});
return rows;
}
cellRender(item, cell) {
// check if there is a row render defined
if (this.props.onCellRender) {
const content = this.props.onCellRender(item, cell);
// render returned any content ?
if (content) {
return content;
}
}
const collapsed = this.props.onCollapseRender ? this.props.onCollapseRender(item, cell) : null;
const clickable = !!this.props.onExpandRender;
const self = this;
const expandRender = it => {
if (self.props.onExpandRender) {
return self.props.onExpandRender(it, cell);
}
return null;
};
return (
{
clickable ?
{collapsed}
:
collapsed
}
);
}
render() {
const className = (this.props.onCollapseRender ? 'tbl-hover' : null);
return (
{this.gridRender()}
);
}
}
ReactGrid.propTypes = {
onCellRender: React.PropTypes.func,
onCollapseRender: React.PropTypes.func,
onExpandRender: React.PropTypes.func,
cellSize: React.PropTypes.object,
values: React.PropTypes.array,
/**
* Function to return custom cell size in format func(item)
* @type {object} Object containing the size in several bootstrap sizes
*/
onCellSize: React.PropTypes.func,
/**
* function that will be called when the user clicks on the reactCell
* @type {[type]}
*/
onReactCellClick: React.PropTypes.func
};
ReactGrid.defaultProps = {
cellSize: { sm: 6 }
};