react-d3-tooltip
Version:
react-d3 tooltip implementation
196 lines (150 loc) • 6.56 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _d = require('d3');
var _d2 = _interopRequireDefault(_d);
var _d3Voronoi = require('d3-voronoi');
var _d3Voronoi2 = _interopRequireDefault(_d3Voronoi);
var _d3Selection = require('d3-selection');
var _d3Selection2 = _interopRequireDefault(_d3Selection);
var _d3Collection = require('d3-collection');
var _d3Collection2 = _interopRequireDefault(_d3Collection);
var _d3Array = require('d3-array');
var _d3Array2 = _interopRequireDefault(_d3Array);
var _reactFauxDom = require('react-faux-dom');
var _reactFauxDom2 = _interopRequireDefault(_reactFauxDom);
var _reactD3Shape = require('react-d3-shape');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var Voronoi = function (_Component) {
_inherits(Voronoi, _Component);
function Voronoi(props) {
_classCallCheck(this, Voronoi);
return _possibleConstructorReturn(this, Object.getPrototypeOf(Voronoi).call(this, props));
}
_createClass(Voronoi, [{
key: 'triggerOut',
value: function triggerOut(d, e) {
this.props.onMouseOut(e, d);
}
}, {
key: 'triggerOver',
value: function triggerOver(d, e) {
var _props = this.props;
var xScaleSet = _props.xScaleSet;
var yScaleSet = _props.yScaleSet;
var stack = _props.stack;
this.props.onMouseOver(e, d, xScaleSet, yScaleSet, stack);
}
}, {
key: '_mkVoronoi',
value: function _mkVoronoi() {
var _this2 = this;
var _props2 = this.props;
var x = _props2.x;
var y = _props2.y;
var stack = _props2.stack;
var height = _props2.height;
// because d3.geom.voronoi does not handle coincident points (and this data from the government comes pre-rounded to a tenth of a degree), d3.nest is used to collapse coincident points before constructing the Voronoi.
// see example: http://bl.ocks.org/mbostock/8033015
var mkSeries = (0, _reactD3Shape.series)(this.props);
if (stack) {
var _setStack = this._setStack();
var dataset = _setStack(mkSeries);
} else {
var dataset = mkSeries;
}
var nestData = _d2.default.nest().key(function (d) {
return d.x + "," + d.y + "," + d.y0;
}).rollup(function (v) {
return v[0];
}).entries(_d2.default.merge(dataset.map(function (d) {
return d.data;
}))).map(function (d) {
return d.values;
});
var voronoiPolygon = this._setGeomVoronoi().call(this, nestData);
return _react2.default.createElement(
'g',
null,
voronoiPolygon.map(function (area) {
return _react2.default.createElement('path', {
d: "M" + area.join("L") + "Z",
onMouseOut: _this2.triggerOut.bind(_this2, area.point),
onMouseOver: _this2.triggerOver.bind(_this2, area.point),
style: { fill: 'none', pointerEvents: 'all' }
});
})
);
}
}, {
key: '_setStack',
value: function _setStack() {
var chartSeries = this.props.chartSeries;
var buildOut = function buildOut(len) {
// baseline for positive and negative bars respectively.
var currentXOffsets = [];
var currentXIndex = 0;
return function (d, y0, y) {
if (currentXIndex++ % len === 0) {
currentXOffsets = [0, 0];
}
if (y >= 0) {
d.y0 = currentXOffsets[1];
d.y = y;
currentXOffsets[1] += y;
} else {
d.y0 = currentXOffsets[0] + y;
d.y = -y;
currentXOffsets[0] += y;
}
};
};
return _d2.default.layout.stack().values(function (d) {
return d.data;
}).out(buildOut(chartSeries.length));
}
}, {
key: '_setGeomVoronoi',
value: function _setGeomVoronoi() {
var _props3 = this.props;
var width = _props3.width;
var height = _props3.height;
var margins = _props3.margins;
var x = _props3.x;
var xScaleSet = _props3.xScaleSet;
var y = _props3.y;
var yScaleSet = _props3.yScaleSet;
var stack = _props3.stack;
var voronoi = _d2.default.geom.voronoi().x(function (d) {
return xScaleSet(d.x);
}).y(function (d) {
return stack ? yScaleSet(d.y + d.y0) : yScaleSet(d.y);
}).clipExtent([[-margins.left, -margins.top], [width + margins.right, height + margins.bottom]]);
return voronoi;
}
}, {
key: 'render',
value: function render() {
var voronoi = this._mkVoronoi();
return _react2.default.createElement(
'g',
{ className: 'react-d3-basics__voronoi_utils' },
voronoi
);
}
}]);
return Voronoi;
}(_react.Component);
Voronoi.defaultProps = {
onMouseOver: function onMouseOver(d) {},
onMouseOut: function onMouseOut(d) {}
};
exports.default = Voronoi;
module.exports = exports['default'];