rumble-charts
Version:
Truly declarative React charts components
114 lines (107 loc) • 5.94 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var tslib_es6 = require('./external/tslib/tslib.es6.js');
var React = require('react');
var colorFunc = require('./helpers/colorFunc.js');
require('d3-shape');
require('d3-ease');
var normalizeNumber = require('./helpers/normalizeNumber.js');
var value = require('./helpers/value.js');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
/**
* Renders bars for your bar chart.
*/
function Bars(props) {
var _a;
var className = props.className, style = props.style, _b = props.colors, colors = _b === void 0 ? colorFunc.defaultSchemeName : _b, opacity = props.opacity;
var x = props.scaleX.factory(props);
var y = props.scaleY.factory(props);
var domainX = x.domain();
var naturalDirection = domainX[1] > domainX[0];
if (domainX[0] === props.minX || domainX[0] === props.maxX) {
x.domain([domainX[0] + (naturalDirection ? -0.5 : 0.5), domainX[1]]);
domainX = x.domain();
}
if (domainX[1] === props.minX || domainX[1] === props.maxX) {
x.domain([domainX[0], domainX[1] + (naturalDirection ? 0.5 : -0.5)]);
}
var baseWidth = Math.abs(x(1) - x(0));
var _y0 = y(0);
var color = colorFunc.colorFunc(colors);
var _c = React.useMemo(function () {
var _a = props.innerPadding, innerPadding = _a === void 0 ? 0 : _a, _b = props.groupPadding, groupPadding = _b === void 0 ? 0 : _b;
return {
innerPadding: normalizeNumber.normalizeNumber(value.value(innerPadding, props), props.layerWidth),
groupPadding: normalizeNumber.normalizeNumber(value.value(groupPadding, props), props.layerWidth)
};
}, [props.innerPadding, props.groupPadding, props.layerWidth]), innerPadding = _c.innerPadding, groupPadding = _c.groupPadding;
var barWidth = React.useMemo(function () {
if (props.barWidth) {
return normalizeNumber.normalizeNumber(value.value(props.barWidth, props), props.layerWidth);
}
else {
if (props.combined) {
return baseWidth - innerPadding;
}
else {
return (baseWidth - groupPadding) / (props.series || []).length - innerPadding;
}
}
}, [
props.barWidth, props.layerWidth, innerPadding, groupPadding,
props.combined, (props.series || []).length, baseWidth
]);
var renderBar = function (x, y, width, height, seriesIndex, pointIndex, point) {
var series = props.series[seriesIndex];
if ('barVisible' in props) {
var barVisible = value.value(props.barVisible, { seriesIndex: seriesIndex, pointIndex: pointIndex, point: point, series: series, props: props });
if (!barVisible) {
return;
}
}
var groupStyle = value.value(props.groupStyle, { seriesIndex: seriesIndex, pointIndex: pointIndex, point: point, series: series, props: props });
var d = (props.scaleX.swap || props.scaleY.swap) ?
('M0,' + (-height / 2) + ' h' + (width) + ' v' + height + ' h' + (-width) + ' Z') :
('M' + (-width / 2) + ',0 v' + height + ' h' + width + ' v' + (-height) + ' Z');
var barAttributes = value.value(props.barAttributes, { seriesIndex: seriesIndex, pointIndex: pointIndex, point: point, series: series, props: props });
var barStyle = value.value([point.style, series.style, props.barStyle], {
seriesIndex: seriesIndex,
pointIndex: pointIndex,
point: point,
series: series,
props: props
});
return React__default["default"].createElement("g", { key: pointIndex, className: className && (className + '-bar ' + className + '-bar-' + pointIndex), transform: 'translate(' + x + ' ' + y + ')', style: groupStyle },
React__default["default"].createElement("path", tslib_es6.__assign({ style: barStyle, fill: point.color || series.color || color(seriesIndex), fillOpacity: point.opacity, d: d }, barAttributes)));
};
var renderSeries = function (series, index) {
if ('seriesVisible' in props) {
var seriesVisible = value.value(props.seriesVisible, { seriesIndex: index, series: series, props: props });
if (!seriesVisible) {
return;
}
}
var seriesAttributes = value.value(props.seriesAttributes, { seriesIndex: index, series: series, props: props });
var seriesStyle = value.value(props.seriesStyle, { seriesIndex: index, series: series, props: props });
var deltaX = 0;
if (!props.combined) {
deltaX = barWidth * index -
(props.series.length - 1) * 0.5 * barWidth +
(index - (props.series.length - 1) / 2) * innerPadding;
}
return React__default["default"].createElement("g", tslib_es6.__assign({ key: index, className: className && (className + '-series ' + className + '-series-' + index), opacity: series.opacity, style: seriesStyle }, seriesAttributes), series && series.data.map(function (point, pointIndex) {
var y0 = point.y0 ? y(point.y0) : _y0;
var y1 = y(point.y);
var x1 = x(point.x) + deltaX * (props.scaleX.direction || 1);
if (props.scaleX.swap || props.scaleY.swap) {
return renderBar(y1, x1, y0 - y1, barWidth, index, pointIndex, point);
}
else {
return renderBar(x1, y1, barWidth, y0 - y1, index, pointIndex, point);
}
}));
};
return (React__default["default"].createElement("g", { className: className, style: style, opacity: opacity }, (_a = props.series) === null || _a === void 0 ? void 0 : _a.map(renderSeries)));
}
exports.Bars = Bars;