152 lines
6.8 KiB
JavaScript
152 lines
6.8 KiB
JavaScript
|
/* *
|
||
|
*
|
||
|
* (c) 2010-2020 Torstein Honsi
|
||
|
*
|
||
|
* License: www.highcharts.com/license
|
||
|
*
|
||
|
* !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
|
||
|
*
|
||
|
* */
|
||
|
import H from './Globals.js';
|
||
|
import U from './Utilities.js';
|
||
|
var addEvent = U.addEvent, defined = U.defined, pick = U.pick;
|
||
|
/* eslint-disable no-invalid-this, valid-jsdoc */
|
||
|
/**
|
||
|
* Creates scrollbars if enabled.
|
||
|
*
|
||
|
* @private
|
||
|
*/
|
||
|
var ScrollbarAxis = /** @class */ (function () {
|
||
|
function ScrollbarAxis() {
|
||
|
}
|
||
|
/**
|
||
|
* Attaches to axis events to create scrollbars if enabled.
|
||
|
*
|
||
|
* @private
|
||
|
*
|
||
|
* @param AxisClass
|
||
|
* Axis class to extend.
|
||
|
*
|
||
|
* @param ScrollbarClass
|
||
|
* Scrollbar class to use.
|
||
|
*/
|
||
|
ScrollbarAxis.compose = function (AxisClass, ScrollbarClass) {
|
||
|
// Wrap axis initialization and create scrollbar if enabled:
|
||
|
addEvent(AxisClass, 'afterInit', function () {
|
||
|
var axis = this;
|
||
|
if (axis.options &&
|
||
|
axis.options.scrollbar &&
|
||
|
axis.options.scrollbar.enabled) {
|
||
|
// Predefined options:
|
||
|
axis.options.scrollbar.vertical = !axis.horiz;
|
||
|
axis.options.startOnTick = axis.options.endOnTick = false;
|
||
|
axis.scrollbar = new ScrollbarClass(axis.chart.renderer, axis.options.scrollbar, axis.chart);
|
||
|
addEvent(axis.scrollbar, 'changed', function (e) {
|
||
|
var axisMin = pick(axis.options && axis.options.min, axis.min), axisMax = pick(axis.options && axis.options.max, axis.max), unitedMin = defined(axis.dataMin) ?
|
||
|
Math.min(axisMin, axis.min, axis.dataMin) : axisMin, unitedMax = defined(axis.dataMax) ?
|
||
|
Math.max(axisMax, axis.max, axis.dataMax) : axisMax, range = unitedMax - unitedMin, to, from;
|
||
|
// #12834, scroll when show/hide series, wrong extremes
|
||
|
if (!defined(axisMin) || !defined(axisMax)) {
|
||
|
return;
|
||
|
}
|
||
|
if ((axis.horiz && !axis.reversed) ||
|
||
|
(!axis.horiz && axis.reversed)) {
|
||
|
to = unitedMin + range * this.to;
|
||
|
from = unitedMin + range * this.from;
|
||
|
}
|
||
|
else {
|
||
|
// y-values in browser are reversed, but this also
|
||
|
// applies for reversed horizontal axis:
|
||
|
to = unitedMin + range * (1 - this.from);
|
||
|
from = unitedMin + range * (1 - this.to);
|
||
|
}
|
||
|
if (pick(this.options.liveRedraw, H.svg && !H.isTouchDevice && !this.chart.isBoosting) ||
|
||
|
// Mouseup always should change extremes
|
||
|
e.DOMType === 'mouseup' ||
|
||
|
// Internal events
|
||
|
!defined(e.DOMType)) {
|
||
|
axis.setExtremes(from, to, true, e.DOMType !== 'mousemove', e);
|
||
|
}
|
||
|
else {
|
||
|
// When live redraw is disabled, don't change extremes
|
||
|
// Only change the position of the scollbar thumb
|
||
|
this.setRange(this.from, this.to);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
});
|
||
|
// Wrap rendering axis, and update scrollbar if one is created:
|
||
|
addEvent(AxisClass, 'afterRender', function () {
|
||
|
var axis = this, scrollMin = Math.min(pick(axis.options.min, axis.min), axis.min, pick(axis.dataMin, axis.min) // #6930
|
||
|
), scrollMax = Math.max(pick(axis.options.max, axis.max), axis.max, pick(axis.dataMax, axis.max) // #6930
|
||
|
), scrollbar = axis.scrollbar, offset = axis.axisTitleMargin + (axis.titleOffset || 0), scrollbarsOffsets = axis.chart.scrollbarsOffsets, axisMargin = axis.options.margin || 0, offsetsIndex, from, to;
|
||
|
if (scrollbar) {
|
||
|
if (axis.horiz) {
|
||
|
// Reserve space for labels/title
|
||
|
if (!axis.opposite) {
|
||
|
scrollbarsOffsets[1] += offset;
|
||
|
}
|
||
|
scrollbar.position(axis.left, axis.top + axis.height + 2 + scrollbarsOffsets[1] -
|
||
|
(axis.opposite ? axisMargin : 0), axis.width, axis.height);
|
||
|
// Next scrollbar should reserve space for margin (if set)
|
||
|
if (!axis.opposite) {
|
||
|
scrollbarsOffsets[1] += axisMargin;
|
||
|
}
|
||
|
offsetsIndex = 1;
|
||
|
}
|
||
|
else {
|
||
|
// Reserve space for labels/title
|
||
|
if (axis.opposite) {
|
||
|
scrollbarsOffsets[0] += offset;
|
||
|
}
|
||
|
scrollbar.position(axis.left + axis.width + 2 + scrollbarsOffsets[0] -
|
||
|
(axis.opposite ? 0 : axisMargin), axis.top, axis.width, axis.height);
|
||
|
// Next scrollbar should reserve space for margin (if set)
|
||
|
if (axis.opposite) {
|
||
|
scrollbarsOffsets[0] += axisMargin;
|
||
|
}
|
||
|
offsetsIndex = 0;
|
||
|
}
|
||
|
scrollbarsOffsets[offsetsIndex] += scrollbar.size +
|
||
|
scrollbar.options.margin;
|
||
|
if (isNaN(scrollMin) ||
|
||
|
isNaN(scrollMax) ||
|
||
|
!defined(axis.min) ||
|
||
|
!defined(axis.max) ||
|
||
|
axis.min === axis.max // #10733
|
||
|
) {
|
||
|
// default action: when extremes are the same or there is
|
||
|
// not extremes on the axis, but scrollbar exists, make it
|
||
|
// full size
|
||
|
scrollbar.setRange(0, 1);
|
||
|
}
|
||
|
else {
|
||
|
from =
|
||
|
(axis.min - scrollMin) / (scrollMax - scrollMin);
|
||
|
to =
|
||
|
(axis.max - scrollMin) / (scrollMax - scrollMin);
|
||
|
if ((axis.horiz && !axis.reversed) ||
|
||
|
(!axis.horiz && axis.reversed)) {
|
||
|
scrollbar.setRange(from, to);
|
||
|
}
|
||
|
else {
|
||
|
// inverse vertical axis
|
||
|
scrollbar.setRange(1 - to, 1 - from);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
// Make space for a scrollbar:
|
||
|
addEvent(AxisClass, 'afterGetOffset', function () {
|
||
|
var axis = this, index = axis.horiz ? 2 : 1, scrollbar = axis.scrollbar;
|
||
|
if (scrollbar) {
|
||
|
axis.chart.scrollbarsOffsets = [0, 0]; // reset scrollbars offsets
|
||
|
axis.chart.axisOffset[index] +=
|
||
|
scrollbar.size + scrollbar.options.margin;
|
||
|
}
|
||
|
});
|
||
|
};
|
||
|
return ScrollbarAxis;
|
||
|
}());
|
||
|
export default ScrollbarAxis;
|