165 lines
5.4 KiB
JavaScript
165 lines
5.4 KiB
JavaScript
|
/* *
|
||
|
*
|
||
|
* (c) 2010-2020 Torstein Honsi
|
||
|
*
|
||
|
* License: www.highcharts.com/license
|
||
|
*
|
||
|
* !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
|
||
|
*
|
||
|
* */
|
||
|
'use strict';
|
||
|
import H from './Globals.js';
|
||
|
var isTouchDevice = H.isTouchDevice;
|
||
|
import U from './Utilities.js';
|
||
|
var addEvent = U.addEvent, correctFloat = U.correctFloat, defined = U.defined, isNumber = U.isNumber, pick = U.pick;
|
||
|
/* eslint-disable valid-jsdoc */
|
||
|
/**
|
||
|
* @private
|
||
|
* @class
|
||
|
*/
|
||
|
var NavigatorAxisAdditions = /** @class */ (function () {
|
||
|
/* *
|
||
|
*
|
||
|
* Constructors
|
||
|
*
|
||
|
* */
|
||
|
function NavigatorAxisAdditions(axis) {
|
||
|
this.axis = axis;
|
||
|
}
|
||
|
/* *
|
||
|
*
|
||
|
* Functions
|
||
|
*
|
||
|
* */
|
||
|
/**
|
||
|
* @private
|
||
|
*/
|
||
|
NavigatorAxisAdditions.prototype.destroy = function () {
|
||
|
this.axis = void 0;
|
||
|
};
|
||
|
/**
|
||
|
* Add logic to normalize the zoomed range in order to preserve the pressed
|
||
|
* state of range selector buttons
|
||
|
*
|
||
|
* @private
|
||
|
* @function Highcharts.Axis#toFixedRange
|
||
|
* @param {number} [pxMin]
|
||
|
* @param {number} [pxMax]
|
||
|
* @param {number} [fixedMin]
|
||
|
* @param {number} [fixedMax]
|
||
|
* @return {*}
|
||
|
*/
|
||
|
NavigatorAxisAdditions.prototype.toFixedRange = function (pxMin, pxMax, fixedMin, fixedMax) {
|
||
|
var navigator = this;
|
||
|
var axis = navigator.axis;
|
||
|
var chart = axis.chart;
|
||
|
var fixedRange = chart && chart.fixedRange, halfPointRange = (axis.pointRange || 0) / 2, newMin = pick(fixedMin, axis.translate(pxMin, true, !axis.horiz)), newMax = pick(fixedMax, axis.translate(pxMax, true, !axis.horiz)), changeRatio = fixedRange && (newMax - newMin) / fixedRange;
|
||
|
// Add/remove half point range to/from the extremes (#1172)
|
||
|
if (!defined(fixedMin)) {
|
||
|
newMin = correctFloat(newMin + halfPointRange);
|
||
|
}
|
||
|
if (!defined(fixedMax)) {
|
||
|
newMax = correctFloat(newMax - halfPointRange);
|
||
|
}
|
||
|
// If the difference between the fixed range and the actual requested
|
||
|
// range is too great, the user is dragging across an ordinal gap, and
|
||
|
// we need to release the range selector button.
|
||
|
if (changeRatio > 0.7 && changeRatio < 1.3) {
|
||
|
if (fixedMax) {
|
||
|
newMin = newMax - fixedRange;
|
||
|
}
|
||
|
else {
|
||
|
newMax = newMin + fixedRange;
|
||
|
}
|
||
|
}
|
||
|
if (!isNumber(newMin) || !isNumber(newMax)) { // #1195, #7411
|
||
|
newMin = newMax = void 0;
|
||
|
}
|
||
|
return {
|
||
|
min: newMin,
|
||
|
max: newMax
|
||
|
};
|
||
|
};
|
||
|
return NavigatorAxisAdditions;
|
||
|
}());
|
||
|
/**
|
||
|
* @private
|
||
|
* @class
|
||
|
*/
|
||
|
var NavigatorAxis = /** @class */ (function () {
|
||
|
function NavigatorAxis() {
|
||
|
}
|
||
|
/* *
|
||
|
*
|
||
|
* Static Functions
|
||
|
*
|
||
|
* */
|
||
|
/**
|
||
|
* @private
|
||
|
*/
|
||
|
NavigatorAxis.compose = function (AxisClass) {
|
||
|
AxisClass.keepProps.push('navigatorAxis');
|
||
|
/* eslint-disable no-invalid-this */
|
||
|
addEvent(AxisClass, 'init', function () {
|
||
|
var axis = this;
|
||
|
if (!axis.navigatorAxis) {
|
||
|
axis.navigatorAxis = new NavigatorAxisAdditions(axis);
|
||
|
}
|
||
|
});
|
||
|
// For Stock charts, override selection zooming with some special
|
||
|
// features because X axis zooming is already allowed by the Navigator
|
||
|
// and Range selector.
|
||
|
addEvent(AxisClass, 'zoom', function (e) {
|
||
|
var axis = this;
|
||
|
var chart = axis.chart;
|
||
|
var chartOptions = chart.options;
|
||
|
var navigator = chartOptions.navigator;
|
||
|
var navigatorAxis = axis.navigatorAxis;
|
||
|
var pinchType = chartOptions.chart.pinchType;
|
||
|
var rangeSelector = chartOptions.rangeSelector;
|
||
|
var zoomType = chartOptions.chart.zoomType;
|
||
|
var previousZoom;
|
||
|
if (axis.isXAxis && ((navigator && navigator.enabled) ||
|
||
|
(rangeSelector && rangeSelector.enabled))) {
|
||
|
// For y only zooming, ignore the X axis completely
|
||
|
if (zoomType === 'y') {
|
||
|
e.zoomed = false;
|
||
|
// For xy zooming, record the state of the zoom before zoom
|
||
|
// selection, then when the reset button is pressed, revert to
|
||
|
// this state. This should apply only if the chart is
|
||
|
// initialized with a range (#6612), otherwise zoom all the way
|
||
|
// out.
|
||
|
}
|
||
|
else if (((!isTouchDevice && zoomType === 'xy') ||
|
||
|
(isTouchDevice && pinchType === 'xy')) &&
|
||
|
axis.options.range) {
|
||
|
previousZoom = navigatorAxis.previousZoom;
|
||
|
if (defined(e.newMin)) {
|
||
|
navigatorAxis.previousZoom = [axis.min, axis.max];
|
||
|
}
|
||
|
else if (previousZoom) {
|
||
|
e.newMin = previousZoom[0];
|
||
|
e.newMax = previousZoom[1];
|
||
|
navigatorAxis.previousZoom = void 0;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (typeof e.zoomed !== 'undefined') {
|
||
|
e.preventDefault();
|
||
|
}
|
||
|
});
|
||
|
/* eslint-enable no-invalid-this */
|
||
|
};
|
||
|
/* *
|
||
|
*
|
||
|
* Static Properties
|
||
|
*
|
||
|
* */
|
||
|
/**
|
||
|
* @private
|
||
|
*/
|
||
|
NavigatorAxis.AdditionsClass = NavigatorAxisAdditions;
|
||
|
return NavigatorAxis;
|
||
|
}());
|
||
|
export default NavigatorAxis;
|