bd-peanut
Version:
React chart components
89 lines (78 loc) • 2.63 kB
JSX
var React = require('react');
var _ = require('lodash');
var CSS = require('../utils/CSS');
var Column_series = React.createClass({
displayName: 'Column_series',
propTypes: {
value: React.PropTypes.number,
seriesIndex: React.PropTypes.number,
containerSize: React.PropTypes.number,
column_data: React.PropTypes.object,
columnStyle: React.PropTypes.func,
colors: React.PropTypes.array,
computedValues: React.PropTypes.object
},
getDefaultProps: function () {
return {
value: 0,
yPos: 0
};
},
// shouldComponentUpdate: function (nextProps) {
// // Make sure to ignore nested object and arrays.
// for (var prop in nextProps) {
// if(Compare.shallowNotEqual(this.props[prop], nextProps[prop])) {
// return true;
// }
// }
// return false;
// },
onColumnOver: function (e) {
if (this.props.onColumnOver) {
this.props.onColumnOver(e);
}
},
onColumnOut: function (e) {
if (this.props.onColumnOut) {
this.props.onColumnOut(e);
}
},
render: function() {
var value = this.props.value;
if (value === undefined || value === null) {
return null;
}
var max = this.props.computedValues.max,
min = this.props.computedValues.min,
ammount;
if (min === 0 && min === max) {
// Don't display column
ammount = 100;
}
else if(this.props.containerSize) {
ammount = 100 - (Math.round(this.props.containerSize * value / max) / this.props.containerSize * 100);
} else {
// no value is 0;
ammount = 100;
}
var style = {
backgroundColor: this.props.colors[this.props.seriesIndex]
};
if (this.props.columnStyle) {
style = _.defaults(this.props.columnStyle(value, this.props.column_data) || {}, style);
}
var css = new CSS(style);
css.translateY(Math.max(0, ammount) + '%');
return (
<div className="Column_seriesReposition" key={this.props.seriesIndex}>
<div
className="Column_series"
style={css.prefix()}
onMouseOver={this.onColumnOver.bind(this, ammount)}
onMouseOut={this.onColumnOut}
></div>
</div>
);
}
});
module.exports = Column_series;