UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

515 lines (434 loc) • 15.7 kB
"use strict"; var mixins = {}, statesConsts = require("../../components/consts").states, symbolPoint = require("./symbol_point"), barPoint = require("./bar_point"), bubblePoint = require("./bubble_point"), piePoint = require("./pie_point"), rangeSymbolPoint = require("./range_symbol_point"), rangeBarPoint = require("./range_bar_point"), candlestickPoint = require("./candlestick_point"), stockPoint = require("./stock_point"), polarPoints = require("./polar_point"), _normalizeEnum = require("../../core/utils").normalizeEnum, extend = require("../../../core/utils/extend").extend, each = require("../../../core/utils/iterator").each, _each = each, _extend = extend, _isDefined = require("../../../core/utils/type").isDefined, _noop = require("../../../core/utils/common").noop, SYMBOL_POINT = "symbolPoint", POLAR_SYMBOL_POINT = "polarSymbolPoint", BAR_POINT = "barPoint", POLAR_BAR_POINT = "polarBarPoint", PIE_POINT = "piePoint", SELECTED_STATE = statesConsts.selectedMark, HOVER_STATE = statesConsts.hoverMark, NORMAL_STATE = statesConsts.normalMark, HOVER = statesConsts.hover, NORMAL = statesConsts.normal, SELECTION = statesConsts.selection, pointTypes = { chart: { "scatter": SYMBOL_POINT, "line": SYMBOL_POINT, "spline": SYMBOL_POINT, "stepline": SYMBOL_POINT, "stackedline": SYMBOL_POINT, "fullstackedline": SYMBOL_POINT, "stackedspline": SYMBOL_POINT, "fullstackedspline": SYMBOL_POINT, "stackedsplinearea": SYMBOL_POINT, "fullstackedsplinearea": SYMBOL_POINT, "area": SYMBOL_POINT, "splinearea": SYMBOL_POINT, "steparea": SYMBOL_POINT, "stackedarea": SYMBOL_POINT, "fullstackedarea": SYMBOL_POINT, "rangearea": "rangeSymbolPoint", "bar": BAR_POINT, "stackedbar": BAR_POINT, "fullstackedbar": BAR_POINT, "rangebar": "rangeBarPoint", "bubble": "bubblePoint", "stock": "stockPoint", "candlestick": "candlestickPoint" }, pie: { "pie": PIE_POINT, "doughnut": PIE_POINT, "donut": PIE_POINT }, polar: { "scatter": POLAR_SYMBOL_POINT, "line": POLAR_SYMBOL_POINT, "area": POLAR_SYMBOL_POINT, "bar": POLAR_BAR_POINT, "stackedbar": POLAR_BAR_POINT } }; function isNoneMode(mode) { return _normalizeEnum(mode) === "none"; } function Point(series, dataItem, options) { this.fullState = NORMAL_STATE; this.series = series; this.update(dataItem, options); this._viewCounters = { hover: 0, selection: 0 }; this._emptySettings = { fill: null, stroke: null, dashStyle: null }; } exports.Point = Point; mixins.symbolPoint = symbolPoint; mixins.barPoint = barPoint; mixins.bubblePoint = bubblePoint; mixins.piePoint = piePoint; mixins.rangeSymbolPoint = rangeSymbolPoint; mixins.rangeBarPoint = rangeBarPoint; mixins.candlestickPoint = candlestickPoint; mixins.stockPoint = stockPoint; mixins.polarSymbolPoint = polarPoints.polarSymbolPoint; mixins.polarBarPoint = polarPoints.polarBarPoint; Point.prototype = { constructor: Point, getColor: function getColor() { if (!this.hasValue() && !this._styles.usePointCustomOptions) { this.series.customizePoint(this, this._dataItem); } return this._styles.normal.fill || this.series.getColor(); }, _getStyle: function _getStyle() { return this._styles[this._currentStyle || 'normal']; }, update: function update(dataItem, options) { this.updateOptions(options); this.updateData(dataItem); }, updateData: function updateData(dataItem) { var that = this; that.argument = that.initialArgument = that.originalArgument = dataItem.argument; that.tag = dataItem.tag; that.index = dataItem.index; this._dataItem = dataItem; this.data = dataItem.data; that.lowError = dataItem.lowError; that.highError = dataItem.highError; that.aggregationInfo = dataItem.aggregationInfo; that._updateData(dataItem); !that.hasValue() && that.setInvisibility(); that._fillStyle(); that._updateLabelData(); }, deleteMarker: function deleteMarker() { var that = this; if (that.graphic) { that.graphic.dispose(); } that.graphic = null; }, _drawErrorBar: _noop, draw: function draw(renderer, groups, animationEnabled, firstDrawing) { var that = this; if (that._needDeletingOnDraw) { that.deleteMarker(); that._needDeletingOnDraw = false; } if (that._needClearingOnDraw) { that.clearMarker(); that._needClearingOnDraw = false; } if (!that._hasGraphic()) { that._getMarkerVisibility() && that._drawMarker(renderer, groups.markers, animationEnabled, firstDrawing); } else { that._updateMarker(animationEnabled, this._getStyle(), groups.markers); } that._drawLabel(); that._drawErrorBar(renderer, groups.errorBars, animationEnabled); return that; }, applyStyle: function applyStyle(style, callback) { var that = this; that._currentStyle = style; if (that.graphic) { if (style === "normal") { that.clearMarker(); } else { that.graphic.toForeground(); } that._updateMarker(true, that._styles[style], undefined, callback); } return that; }, _getViewStyle: function _getViewStyle() { var state = NORMAL_STATE, fullState = this.fullState, styles = [NORMAL, HOVER, SELECTION, SELECTION]; if (this._viewCounters.hover) { state |= HOVER_STATE; } if (this._viewCounters.selection) { state |= SELECTED_STATE; } if (isNoneMode(this.getOptions().selectionMode)) { fullState &= ~SELECTED_STATE; } if (isNoneMode(this.getOptions().hoverMode)) { fullState &= ~HOVER_STATE; } state |= fullState; return styles[state]; }, applyView: function applyView(legendCallback) { var style = this._getViewStyle(); this.applyStyle(style, legendCallback); }, setView: function setView(style) { this._viewCounters[style]++; this.applyView(); }, resetView: function resetView(style) { --this._viewCounters[style]; ///#DEBUG if (this._viewCounters[style] < 0) { var debug = require("../../../core/utils/console").debug; debug.assert(false, "incorrect view style couinter " + this._viewCounters[style] + " " + style); } ///#ENDDEBUG this.applyView(); }, releaseHoverState: function releaseHoverState() { var that = this; if (that.graphic && !that.isSelected()) { that.graphic.toBackground(); } }, select: function select() { this.series.selectPoint(this); }, clearSelection: function clearSelection() { this.series.deselectPoint(this); }, hover: function hover() { this.series.hoverPoint(this); }, clearHover: function clearHover() { this.series.clearPointHover(); }, showTooltip: function showTooltip() { this.series.showPointTooltip(this); }, hideTooltip: function hideTooltip() { this.series.hidePointTooltip(this); }, _checkLabelsChanging: function _checkLabelsChanging(oldType, newType) { var isNewRange = ~newType.indexOf("range"), isOldRange = ~oldType.indexOf("range"); return isOldRange && !isNewRange || !isOldRange && isNewRange; }, updateOptions: function updateOptions(newOptions) { if (!newOptions) { return; } var that = this, oldOptions = that._options, widgetType = newOptions.widgetType, oldType = oldOptions && oldOptions.type, newType = newOptions.type, newPointTypeMixin = pointTypes[widgetType][newType]; if (oldType !== newType) { that._needDeletingOnDraw = true; that._needClearingOnDraw = false; if (oldType) { that._checkLabelsChanging(oldType, newType) && that.deleteLabel(); that._resetType(mixins[pointTypes[oldType]]); } that._setType(mixins[newPointTypeMixin]); } else { that._needDeletingOnDraw = that._checkSymbol(oldOptions, newOptions); that._needClearingOnDraw = that._checkCustomize(oldOptions, newOptions); } that._options = newOptions; that._fillStyle(); that._updateLabelOptions(newPointTypeMixin); }, translate: function translate() { if (this.hasValue()) { this._translate(); this.translated = true; } }, _checkCustomize: function _checkCustomize(oldOptions, newOptions) { return oldOptions.styles.usePointCustomOptions && !newOptions.styles.usePointCustomOptions; }, _getCustomLabelVisibility: function _getCustomLabelVisibility() { return this._styles.useLabelCustomOptions ? !!this._options.label.visible : null; }, getBoundingRect: function getBoundingRect() { return this._getGraphicBBox(); }, _resetType: function _resetType(methods) { for (var methodName in methods) { delete this[methodName]; } }, _setType: function _setType(methods) { for (var methodName in methods) { this[methodName] = methods[methodName]; } }, isInVisibleArea: function isInVisibleArea() { return this.inVisibleArea; }, isSelected: function isSelected() { return !!(this.fullState & SELECTED_STATE); }, isHovered: function isHovered() { return !!(this.fullState & HOVER_STATE); }, getOptions: function getOptions() { return this._options; }, animate: function animate(complete, settings, partitionDuration) { if (!this.graphic) { complete && complete(); return; } this.graphic.animate(settings, { partitionDuration: partitionDuration }, complete); }, getCoords: function getCoords(min) { var that = this; if (!min) { return { x: that.x, y: that.y }; } if (!that._options.rotated) { return { x: that.x, y: that.minY + (that.y - that.minY ? 0 : 1) }; } return { x: that.minX - (that.x - that.minX ? 0 : 1), y: that.y }; }, getDefaultCoords: function getDefaultCoords() { var that = this; return !that._options.rotated ? { x: that.x, y: that.defaultY } : { x: that.defaultX, y: that.y }; }, setDefaultCoords: function setDefaultCoords() { var coords = this.getDefaultCoords(); this.x = coords.x; this.y = coords.y; }, _getVisibleArea: function _getVisibleArea() { return this.series.getVisibleArea(); }, _getArgTranslator: function _getArgTranslator() { return this.series.getArgumentAxis().getTranslator(); }, _getValTranslator: function _getValTranslator() { return this.series.getValueAxis().getTranslator(); }, _calculateVisibility: function _calculateVisibility(x, y, width, height) { var that = this, visibleArea = that._getVisibleArea(), rotated = that._options.rotated; if (visibleArea.minX > x + (width || 0) || visibleArea.maxX < x || visibleArea.minY > y + (height || 0) || visibleArea.maxY < y || rotated && _isDefined(width) && width !== 0 && (visibleArea.minX === x + width || visibleArea.maxX === x) || !rotated && _isDefined(height) && height !== 0 && (visibleArea.minY === y + height || visibleArea.maxY === y)) { that.inVisibleArea = false; } else { that.inVisibleArea = true; } }, hasValue: function hasValue() { return this.value !== null && this.minValue !== null; }, hasCoords: _noop, correctPosition: _noop, correctRadius: _noop, correctLabelRadius: _noop, getCrosshairData: _noop, getPointRadius: _noop, _populatePointShape: _noop, _checkSymbol: _noop, getMarkerCoords: _noop, hide: _noop, show: _noop, hideMarker: _noop, setInvisibility: _noop, clearVisibility: _noop, isVisible: _noop, resetCorrection: _noop, correctValue: _noop, resetValue: _noop, setPercentValue: _noop, correctCoordinates: _noop, coordsIn: _noop, getTooltipParams: _noop, setLabelEllipsis: _noop, setLabelTrackerData: _noop, updateLabelCoord: _noop, drawLabel: _noop, correctLabelPosition: _noop, getMinValue: _noop, getMaxValue: _noop, dispose: function dispose() { var that = this; that.deleteMarker(); that.deleteLabel(); that._errorBar && this._errorBar.dispose(); that._options = that._styles = that.series = that._errorBar = null; }, getTooltipFormatObject: function getTooltipFormatObject(tooltip) { var that = this; var tooltipFormatObject = that._getFormatObject(tooltip); var sharedTooltipValuesArray = []; var tooltipStackPointsFormatObject = []; if (that.stackPoints) { _each(that.stackPoints, function (_, point) { if (!point.isVisible()) return; var formatObject = point._getFormatObject(tooltip); tooltipStackPointsFormatObject.push(formatObject); sharedTooltipValuesArray.push(formatObject.seriesName + ": " + formatObject.valueText); }); _extend(tooltipFormatObject, { points: tooltipStackPointsFormatObject, valueText: sharedTooltipValuesArray.join("\n"), stackName: that.stackPoints.stackName }); } var aggregationInfo = that.aggregationInfo; if (aggregationInfo) { var axis = that.series.getArgumentAxis(); var rangeText = axis.formatRange(aggregationInfo.intervalStart, aggregationInfo.intervalEnd, aggregationInfo.aggregationInterval); if (rangeText) { tooltipFormatObject.valueText += "\n" + rangeText; } } return tooltipFormatObject; }, setHole: function setHole(holeValue, position) { var that = this, minValue = isFinite(that.minValue) ? that.minValue : 0; if (_isDefined(holeValue)) { if (position === "left") { that.leftHole = that.value - holeValue; that.minLeftHole = minValue - holeValue; } else { that.rightHole = that.value - holeValue; that.minRightHole = minValue - holeValue; } } }, resetHoles: function resetHoles() { this.leftHole = null; this.minLeftHole = null; this.rightHole = null; this.minRightHole = null; }, getLabel: function getLabel() { return this._label; }, getLabels: function getLabels() { return [this._label]; } };