var FlowRow = React.createClass({ render: function () { var flow = this.props.flow; var columns = this.props.columns.map(function (Column) { return ; }.bind(this)); var className = ""; if (this.props.selected) { className += "selected"; } return ( {columns} ); }, shouldComponentUpdate: function (nextProps) { var isEqual = ( this.props.columns.length === nextProps.columns.length && this.props.selected === nextProps.selected && this.props.flow.response === nextProps.flow.response); return !isEqual; } }); var FlowTableHead = React.createClass({ render: function () { var columns = this.props.columns.map(function (column) { return column.renderTitle(); }.bind(this)); return {columns} ; } }); var FlowTableBody = React.createClass({ render: function () { var rows = this.props.flows.map(function (flow) { var selected = (flow == this.props.selected); return ; }.bind(this)); return {rows}; } }); var FlowTable = React.createClass({ mixins: [StickyHeadMixin, AutoScrollMixin], getInitialState: function () { return { columns: all_columns }; }, scrollIntoView: function (flow) { // Now comes the fun part: Scroll the flow into the view. var viewport = this.getDOMNode(); var flowNode = this.refs.body.refs[flow.id].getDOMNode(); var viewport_top = viewport.scrollTop; var viewport_bottom = viewport_top + viewport.offsetHeight; var flowNode_top = flowNode.offsetTop; var flowNode_bottom = flowNode_top + flowNode.offsetHeight; // Account for pinned thead by pretending that the flowNode starts // -thead_height pixel earlier. flowNode_top -= this.refs.body.getDOMNode().offsetTop; if (flowNode_top < viewport_top) { viewport.scrollTop = flowNode_top; } else if (flowNode_bottom > viewport_bottom) { viewport.scrollTop = flowNode_bottom - viewport.offsetHeight; } }, render: function () { return (
); } });