devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
167 lines (146 loc) • 6.38 kB
JavaScript
;
// there stackedline, fullstackedline, stackedbar, fullstackedbar, stackedarea, fullstackedarea
var _noop = require("../../core/utils/common").noop,
_extend = require("../../core/utils/extend").extend,
each = require("../../core/utils/iterator").each,
areaSeries = require("./area_series").chart,
chartAreaSeries = areaSeries.area,
barSeries = require("./bar_series"),
chartBarSeries = barSeries.chart.bar,
lineSeries = require("./line_series").chart,
vizUtils = require("../core/utils"),
objectUtils = require("../../core/utils/object"),
baseStackedSeries = {
getErrorBarRangeCorrector: _noop,
_calculateErrorBars: _noop,
_updateOptions: function _updateOptions(options) {
this._stackName = "axis_" + (options.axis || "default");
}
};
exports.chart = {};
exports.polar = {};
exports.chart["stackedline"] = _extend({}, lineSeries.line, baseStackedSeries, {});
exports.chart["stackedspline"] = _extend({}, lineSeries["spline"], baseStackedSeries, {});
exports.chart["fullstackedline"] = _extend({}, lineSeries.line, baseStackedSeries, {
getValueRangeInitialValue: areaSeries.area.getValueRangeInitialValue
});
exports.chart["fullstackedspline"] = _extend({}, lineSeries["spline"], baseStackedSeries, {
getValueRangeInitialValue: areaSeries.area.getValueRangeInitialValue
});
var stackedBar = exports.chart["stackedbar"] = _extend({}, chartBarSeries, baseStackedSeries, {
_updateOptions: function _updateOptions(options) {
baseStackedSeries._updateOptions.call(this, options);
this._stackName = this._stackName + "_stack_" + (options.stack || "default");
}
});
exports.chart["fullstackedbar"] = _extend({}, chartBarSeries, baseStackedSeries, {
_updateOptions: stackedBar._updateOptions
});
function clonePoint(point, value, minValue, position) {
point = objectUtils.clone(point);
point.value = value;
point.minValue = minValue;
point.translate();
point.argument = point.argument + position;
return point;
}
function preparePointsForStackedAreaSegment(points) {
var i = 0,
p,
result = [],
array,
len = points.length;
while (i < len) {
p = points[i];
array = [p];
if (p.leftHole) {
array = [clonePoint(p, p.leftHole, p.minLeftHole, "left"), p];
}
if (p.rightHole) {
array.push(clonePoint(p, p.rightHole, p.minRightHole, "right"));
}
result.push(array);
i++;
}
return [].concat.apply([], result);
}
exports.chart["stackedarea"] = _extend({}, chartAreaSeries, baseStackedSeries, {
_prepareSegment: function _prepareSegment(points, rotated) {
return chartAreaSeries._prepareSegment.call(this, preparePointsForStackedAreaSegment(points), rotated);
},
_appendInGroup: function _appendInGroup() {
this._group.append(this._extGroups.seriesGroup).toBackground();
}
});
function getPointsByArgFromPrevSeries(prevSeries, argument) {
var result;
while (!result && prevSeries) {
result = prevSeries._segmentByArg && prevSeries._segmentByArg[argument]; // T357324
prevSeries = prevSeries._prevSeries;
}
return result;
}
exports.chart["stackedsplinearea"] = _extend({}, areaSeries["splinearea"], baseStackedSeries, {
_prepareSegment: function _prepareSegment(points, rotated) {
var that = this,
areaSegment;
points = preparePointsForStackedAreaSegment(points);
if (!this._prevSeries || points.length === 1) {
areaSegment = areaSeries["splinearea"]._prepareSegment.call(this, points, rotated);
} else {
var forwardPoints = lineSeries.spline._calculateBezierPoints(points, rotated),
backwardPoints = vizUtils.map(points, function (p) {
var point = p.getCoords(true);
point.argument = p.argument;
return point;
}),
prevSeriesForwardPoints = [],
pointByArg = {},
i = 0,
len = that._prevSeries._segments.length;
while (i < len) {
prevSeriesForwardPoints = prevSeriesForwardPoints.concat(that._prevSeries._segments[i].line);
i++;
}
each(prevSeriesForwardPoints, function (_, p) {
if (p.argument !== null) {
var argument = p.argument.valueOf();
if (!pointByArg[argument]) {
pointByArg[argument] = [p];
} else {
pointByArg[argument].push(p);
}
}
});
that._prevSeries._segmentByArg = pointByArg;
backwardPoints = lineSeries.spline._calculateBezierPoints(backwardPoints, rotated);
each(backwardPoints, function (i, p) {
var argument = p.argument.valueOf(),
prevSeriesPoints;
if (i % 3 === 0) {
prevSeriesPoints = pointByArg[argument] || getPointsByArgFromPrevSeries(that._prevSeries, argument);
if (prevSeriesPoints) {
backwardPoints[i - 1] && prevSeriesPoints[0] && (backwardPoints[i - 1] = prevSeriesPoints[0]);
backwardPoints[i + 1] && (backwardPoints[i + 1] = prevSeriesPoints[2] || p);
}
}
});
areaSegment = {
line: forwardPoints,
area: forwardPoints.concat(backwardPoints.reverse())
};
that._areaPointsToSplineAreaPoints(areaSegment.area);
}
return areaSegment;
},
_appendInGroup: exports.chart["stackedarea"]._appendInGroup
});
exports.chart["fullstackedarea"] = _extend({}, chartAreaSeries, baseStackedSeries, {
_prepareSegment: exports.chart["stackedarea"]._prepareSegment,
_appendInGroup: exports.chart["stackedarea"]._appendInGroup
});
exports.chart["fullstackedsplinearea"] = _extend({}, areaSeries["splinearea"], baseStackedSeries, {
_prepareSegment: exports.chart["stackedsplinearea"]._prepareSegment,
_appendInGroup: exports.chart["stackedarea"]._appendInGroup
});
exports.polar["stackedbar"] = _extend({}, barSeries.polar.bar, baseStackedSeries, {});