d2recharts
Version:
data driven react components of echarts
91 lines (80 loc) • 2.13 kB
JavaScript
;
/**
* d2pie module
* @module d2pie
* @see module:index
*/
const React = require('react');
const _ = require('lodash');
const Recharts = require('./recharts');
const DataSet = require('../source/data-set');
const OptionGenerator = require('./option-generator');
const util = require('../util/index');
const propTypes = require('./prop-types');
class Pie extends React.Component {
shouldComponentUpdate(nextProps) {
return !_.isEqual(this.props, nextProps);
}
getOption() {
// data => DataSet => option
const me = this;
const props = me.props;
const data = props.data;
let name = props.dimension;
let value = props.measure || (props.measures ? props.measures[0] : '');
const option = {
calculable: true,
tooltip: {
trigger: 'item',
formatter: '{a} <br/>{b} : {c} ({d}%)',
},
};
const extraOption = util.pickExcept(props, [
'data',
'dimension',
'measure',
'measures',
]);
const dataSet = me.dataSet = DataSet.try2init(data);
if (!name) {
name = dataSet.colNamesByType.string[0];
}
if (!value) {
value = dataSet.colNamesByType.number[0];
}
const pieData = _.map(dataSet.data, (row) => ({
name: row[name],
value: parseFloat(row[value]),
}));
if (_.isNumber(props['data-piecesCount'])) {
const otherData = pieData.splice(props['data-piecesCount']);
let otherValue = 0;
otherData.forEach((item) => {
otherValue += item.value;
});
pieData.push({
name: '其他',
value: otherValue,
});
}
_.merge(option, {
series: [{
name: dataSet.colByName[value].comments,
type: 'pie',
data: pieData,
}]
}, extraOption);
const optionGenerator = new OptionGenerator(option);
return optionGenerator.toOption();
}
render() {
return (
<Recharts option={this.getOption()}/>
);
}
}
Pie.propTypes = _.extend({
dimension: React.PropTypes.string,
measure: React.PropTypes.string,
}, propTypes.rechartsWithData);
module.exports = Pie;