UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

188 lines (187 loc) 7.86 kB
/** * DevExtreme (cjs/viz/series/range_series.js) * Version: 24.2.7 * Build date: Mon Apr 28 2025 * * Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/ */ "use strict"; exports.chart = void 0; var _extend2 = require("../../core/utils/extend"); var _type = require("../../core/utils/type"); var _utils = require("../core/utils"); var _common = require("../../core/utils/common"); var _scatter_series = require("./scatter_series"); var _bar_series = require("./bar_series"); var _area_series = require("./area_series"); const _extend = _extend2.extend; const barSeries = _bar_series.chart.bar; const areaSeries = _area_series.chart.area; const chart = exports.chart = {}; const baseRangeSeries = { areErrorBarsVisible: _common.noop, _createErrorBarGroup: _common.noop, _checkData: function(data, skippedFields) { const valueFields = this.getValueFields(); return _scatter_series.chart._checkData.call(this, data, skippedFields, { minValue: valueFields[0], value: valueFields[1] }) && data.minValue === data.minValue }, getValueRangeInitialValue: _scatter_series.chart.getValueRangeInitialValue, _getPointDataSelector: function(data) { const valueFields = this.getValueFields(); const val1Field = valueFields[0]; const val2Field = valueFields[1]; const tagField = this.getTagField(); const argumentField = this.getArgumentField(); return data => ({ tag: data[tagField], minValue: this._processEmptyValue(data[val1Field]), value: this._processEmptyValue(data[val2Field]), argument: data[argumentField], data: data }) }, _defaultAggregator: "range", _aggregators: { range(_ref, series) { let { intervalStart: intervalStart, intervalEnd: intervalEnd, data: data } = _ref; if (!data.length) { return } const valueFields = series.getValueFields(); const val1Field = valueFields[0]; const val2Field = valueFields[1]; const result = data.reduce(((result, item) => { const val1 = item[val1Field]; const val2 = item[val2Field]; if (!(0, _type.isDefined)(val1) || !(0, _type.isDefined)(val2)) { return result } result[val1Field] = Math.min(result[val1Field], Math.min(val1, val2)); result[val2Field] = Math.max(result[val2Field], Math.max(val1, val2)); return result }), { [val1Field]: 1 / 0, [val2Field]: -1 / 0, [series.getArgumentField()]: series._getIntervalCenter(intervalStart, intervalEnd) }); if (!isFinite(result[val1Field]) || !isFinite(result[val2Field])) { if (data.filter((i => null === i[val1Field] && null === i[val2Field])).length === data.length) { result[val1Field] = result[val2Field] = null } else { return } } return result } }, getValueFields: function() { return [this._options.rangeValue1Field || "val1", this._options.rangeValue2Field || "val2"] }, getSeriesPairCoord(coord, isArgument) { let oppositeCoord = null; const { rotated: rotated } = this._options; const isOpposite = !isArgument && !rotated || isArgument && rotated; const coordName = isOpposite ? "vy" : "vx"; const minCoordName = rotated ? "minX" : "minY"; const oppositeCoordName = isOpposite ? "vx" : "vy"; const points = this.getPoints(); for (let i = 0; i < points.length; i++) { const p = points[i]; let tmpCoord; if (isArgument) { tmpCoord = p.getCenterCoord()[coordName[1]] === coord ? p[oppositeCoordName] : void 0 } else { const coords = [Math.min(p[coordName], p[minCoordName]), Math.max(p[coordName], p[minCoordName])]; tmpCoord = coord >= coords[0] && coord <= coords[1] ? p[oppositeCoordName] : void 0 } if (this._checkAxisVisibleAreaCoord(!isArgument, tmpCoord)) { oppositeCoord = tmpCoord; break } } return oppositeCoord } }; chart.rangebar = _extend({}, barSeries, baseRangeSeries); chart.rangearea = _extend({}, areaSeries, { _drawPoint: function(options) { const point = options.point; if (point.isInVisibleArea()) { point.clearVisibility(); point.draw(this._renderer, options.groups); this._drawnPoints.push(point); if (!point.visibleTopMarker) { point.hideMarker("top") } if (!point.visibleBottomMarker) { point.hideMarker("bottom") } } else { point.setInvisibility() } }, _prepareSegment: function(points, rotated) { const processedPoints = this._processSinglePointsAreaSegment(points, rotated); const processedMinPointsCoords = (0, _utils.map)(processedPoints, (function(pt) { return pt.getCoords(true) })); return { line: processedPoints, bottomLine: processedMinPointsCoords, area: (0, _utils.map)(processedPoints, (function(pt) { return pt.getCoords() })).concat(processedMinPointsCoords.slice().reverse()), singlePointSegment: processedPoints !== points } }, _getDefaultSegment: function(segment) { const defaultSegment = areaSeries._getDefaultSegment.call(this, segment); defaultSegment.bottomLine = defaultSegment.line; return defaultSegment }, _removeElement: function(element) { areaSeries._removeElement.call(this, element); element.bottomLine && element.bottomLine.remove() }, _drawElement: function(segment, group) { const drawnElement = areaSeries._drawElement.call(this, segment, group); drawnElement.bottomLine = this._bordersGroup && this._createBorderElement(segment.bottomLine, { "stroke-width": this._styles.normal.border["stroke-width"] }).append(this._bordersGroup); return drawnElement }, _applyStyle: function(style) { const elementsGroup = this._elementsGroup; const bordersGroup = this._bordersGroup; elementsGroup && elementsGroup.smartAttr(style.elements); bordersGroup && bordersGroup.attr(style.border); (this._graphics || []).forEach((function(graphic) { graphic.line && graphic.line.attr({ "stroke-width": style.border["stroke-width"] }); graphic.bottomLine && graphic.bottomLine.attr({ "stroke-width": style.border["stroke-width"] }) })) }, _updateElement: function(element, segment, animate, complete) { const bottomLineParams = { points: segment.bottomLine }; const bottomBorderElement = element.bottomLine; areaSeries._updateElement.apply(this, arguments); if (bottomBorderElement) { animate ? bottomBorderElement.animate(bottomLineParams) : bottomBorderElement.attr(bottomLineParams) } } }, baseRangeSeries);