devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
310 lines (262 loc) • 10.5 kB
JavaScript
"use strict";
var extend = require("../../../core/utils/extend").extend,
_extend = extend,
_math = Math,
_floor = _math.floor,
_abs = _math.abs,
symbolPoint = require("./symbol_point"),
CANVAS_POSITION_DEFAULT = "canvas_position_default",
DEFAULT_BAR_TRACKER_SIZE = 9,
CORRECTING_BAR_TRACKER_VALUE = 4,
RIGHT = "right",
LEFT = "left",
TOP = "top",
BOTTOM = "bottom";
module.exports = _extend({}, symbolPoint, {
correctCoordinates: function correctCoordinates(correctOptions) {
var that = this,
correction = _floor(correctOptions.offset - correctOptions.width / 2);
if (that._options.rotated) {
that.height = correctOptions.width;
that.yCorrection = correction;
} else {
that.width = correctOptions.width;
that.xCorrection = correction;
}
},
_getGraphicBBox: function _getGraphicBBox() {
return {
x: this.x,
y: this.y,
width: this.width,
height: this.height
};
},
_getLabelConnector: function _getLabelConnector(location) {
return this._getGraphicBBox(location);
},
_getLabelPosition: function _getLabelPosition() {
var that = this,
position,
initialValue = that.initialValue,
invert = that._getValTranslator().getBusinessRange().invert,
isDiscreteValue = that.series.valueAxisType === "discrete",
isFullStacked = that.series.isFullStackedSeries(),
notAxisInverted = !isDiscreteValue && (initialValue >= 0 && !invert || initialValue < 0 && invert) || isDiscreteValue && !invert || isFullStacked;
if (!that._options.rotated) {
position = notAxisInverted ? TOP : BOTTOM;
} else {
position = notAxisInverted ? RIGHT : LEFT;
}
return position;
},
_getLabelCoords: function _getLabelCoords(label) {
var that = this,
coords;
if (that.initialValue === 0 && that.series.isFullStackedSeries()) {
if (!this._options.rotated) {
coords = that._getLabelCoordOfPosition(label, TOP);
} else {
coords = that._getLabelCoordOfPosition(label, RIGHT);
}
} else if (label.getLayoutOptions().position === "inside") {
coords = that._getLabelCoordOfPosition(label, "inside");
} else {
coords = symbolPoint._getLabelCoords.call(this, label);
}
return coords;
},
_checkLabelPosition: function _checkLabelPosition(label, coord) {
var that = this,
visibleArea = that._getVisibleArea();
if (that._isPointInVisibleArea(visibleArea, that._getGraphicBBox())) {
return that._moveLabelOnCanvas(coord, visibleArea, label.getBoundingRect());
}
return coord;
},
hideInsideLabel: function hideInsideLabel(label, coord) {
var graphicBBox = this._getGraphicBBox(),
labelBBox = label.getBoundingRect();
if (this._options.resolveLabelsOverlapping) {
if ((coord.y <= graphicBBox.y && coord.y + labelBBox.height >= graphicBBox.y + graphicBBox.height || coord.x <= graphicBBox.x && coord.x + labelBBox.width >= graphicBBox.x + graphicBBox.width) && !(coord.y > graphicBBox.y + graphicBBox.height || coord.y + labelBBox.height < graphicBBox.y || coord.x > graphicBBox.x + graphicBBox.width || coord.x + labelBBox.width < graphicBBox.x)) {
label.draw(false);
return true;
}
}
return false;
},
_moveLabelOnCanvas: function _moveLabelOnCanvas(coord, visibleArea, labelBBox) {
var x = coord.x,
y = coord.y;
if (visibleArea.minX > x) {
x = visibleArea.minX;
}
if (visibleArea.maxX < x + labelBBox.width) {
x = visibleArea.maxX - labelBBox.width;
}
if (visibleArea.minY > y) {
y = visibleArea.minY;
}
if (visibleArea.maxY < y + labelBBox.height) {
y = visibleArea.maxY - labelBBox.height;
}
return { x: x, y: y };
},
_showForZeroValues: function _showForZeroValues() {
return this._options.label.showForZeroValues || this.initialValue;
},
_drawMarker: function _drawMarker(renderer, group, animationEnabled) {
var that = this,
style = that._getStyle(),
x = that.x,
y = that.y,
width = that.width,
height = that.height,
r = that._options.cornerRadius;
if (animationEnabled) {
if (that._options.rotated) {
width = 0;
x = that.defaultX;
} else {
height = 0;
y = that.defaultY;
}
}
that.graphic = renderer.rect(x, y, width, height).attr({ rx: r, ry: r }).smartAttr(style).data({ "chart-data-point": that }).append(group);
},
_getSettingsForTracker: function _getSettingsForTracker() {
var that = this,
y = that.y,
height = that.height,
x = that.x,
width = that.width;
if (that._options.rotated) {
if (width === 1) {
width = DEFAULT_BAR_TRACKER_SIZE;
x -= CORRECTING_BAR_TRACKER_VALUE;
}
} else {
if (height === 1) {
height = DEFAULT_BAR_TRACKER_SIZE;
y -= CORRECTING_BAR_TRACKER_VALUE;
}
}
return {
x: x,
y: y,
width: width,
height: height
};
},
getGraphicSettings: function getGraphicSettings() {
var graphic = this.graphic;
return {
x: graphic.attr("x"),
y: graphic.attr("y"),
height: graphic.attr("height"),
width: graphic.attr("width")
};
},
_getEdgeTooltipParams: function _getEdgeTooltipParams(x, y, width, height) {
var isPositive = this.value >= 0,
xCoord,
yCoord,
invertedBusinessRange = this._getValTranslator().getBusinessRange().invert;
if (this._options.rotated) {
yCoord = y + height / 2;
if (invertedBusinessRange) {
xCoord = isPositive ? x : x + width;
} else {
xCoord = isPositive ? x + width : x;
}
} else {
xCoord = x + width / 2;
if (invertedBusinessRange) {
yCoord = isPositive ? y + height : y;
} else {
yCoord = isPositive ? y : y + height;
}
}
return { x: xCoord, y: yCoord, offset: 0 };
},
getTooltipParams: function getTooltipParams(location) {
var x = this.x,
y = this.y,
width = this.width,
height = this.height;
return location === 'edge' ? this._getEdgeTooltipParams(x, y, width, height) : { x: x + width / 2, y: y + height / 2, offset: 0 };
},
_truncateCoord: function _truncateCoord(coord, minBounce, maxBounce) {
if (coord === null) {
return coord;
}
if (coord < minBounce) {
return minBounce;
}
if (coord > maxBounce) {
return maxBounce;
}
return coord;
},
_translateErrorBars: function _translateErrorBars(argVisibleArea) {
symbolPoint._translateErrorBars.call(this);
if (this._errorBarPos < argVisibleArea.min || this._errorBarPos > argVisibleArea.max) {
this._errorBarPos = undefined;
}
},
// TODO check & rework
_translate: function _translate() {
var that = this,
rotated = that._options.rotated,
valAxis = rotated ? "x" : "y",
argAxis = rotated ? "y" : "x",
valIntervalName = rotated ? "width" : "height",
argIntervalName = rotated ? "height" : "width",
argTranslator = that._getArgTranslator(),
valTranslator = that._getValTranslator(),
argVisibleArea = argTranslator.getCanvasVisibleArea(),
valVisibleArea = valTranslator.getCanvasVisibleArea(),
arg,
val,
minVal;
arg = argTranslator.translate(that.argument);
that[argAxis] = arg = arg === null ? arg : arg + (that[argAxis + "Correction"] || 0);
val = valTranslator.translate(that.value);
minVal = valTranslator.translate(that.minValue);
that["v" + valAxis] = val;
that["v" + argAxis] = arg + that[argIntervalName] / 2;
val = that._truncateCoord(val, valVisibleArea.min, valVisibleArea.max);
minVal = that._truncateCoord(minVal, valVisibleArea.min, valVisibleArea.max);
that[valIntervalName] = _abs(val - minVal);
val = val < minVal ? val : minVal;
that._calculateVisibility(rotated ? val : arg, rotated ? arg : val, that.width, that.height);
that[valAxis] = val === null ? val : val + (that[valAxis + "Correction"] || 0);
that["min" + valAxis.toUpperCase()] = minVal === null ? minVal : minVal + (that[valAxis + "Correction"] || 0);
that["default" + valAxis.toUpperCase()] = valTranslator.translate(CANVAS_POSITION_DEFAULT);
that._translateErrorBars(argVisibleArea);
if (that.inVisibleArea && that[argAxis] !== null) {
if (that[argAxis] < argVisibleArea.min) {
that[argIntervalName] = that[argIntervalName] - (argVisibleArea.min - that[argAxis]);
that[argAxis] = argVisibleArea.min;
}
if (that[argAxis] + that[argIntervalName] > argVisibleArea.max) {
that[argIntervalName] = argVisibleArea.max - that[argAxis];
}
}
},
_updateMarker: function _updateMarker(animationEnabled, style) {
this.graphic.smartAttr(_extend({}, style, !animationEnabled ? this.getMarkerCoords() : {}));
},
getMarkerCoords: function getMarkerCoords() {
return {
x: this.x,
y: this.y,
width: this.width,
height: this.height
};
},
coordsIn: function coordsIn(x, y) {
var that = this;
return x >= that.x && x <= that.x + that.width && y >= that.y && y <= that.y + that.height;
}
});