dygraphs
Version:
dygraphs is a fast, flexible open source JavaScript charting library.
148 lines (143 loc) • 17.6 kB
JavaScript
;
/**
* @license
* Copyright 2015 Petr Shevtsov (petr.shevtsov@gmail.com)
* MIT-licenced: https://opensource.org/license/MIT
*
* Rebase plugin
*
* On pan/zoom event, each series will rebase to a specified value (e.g. 100) at the
* start of the displayed period.
*
* See https://web.archive.org/web/20210711110044/https://stats.oecd.org/glossary/detail.asp?ID=2249
*
* Options:
* Value to rebase. Must be either Number or 'percent' or null.
*
* See tests/straw-broom.html for demo.
*/
/* loader wrapper to allow browser use and ES6 imports */
(function _extras_rebase_closure() {
'use strict';
var Dygraph;
if (window.Dygraph) {
Dygraph = window.Dygraph;
} else if (typeof module !== 'undefined') {
Dygraph = require('../dygraph');
if (typeof Dygraph.NAME === 'undefined' && typeof Dygraph["default"] !== 'undefined') Dygraph = Dygraph["default"];
}
/* end of loader wrapper header */
// Matches DefaultHandler.parseFloat
var parseFloat = function parseFloat(val) {
if (val === null) return NaN;
return val;
};
Dygraph.DataHandlers.RebaseHandler = function RebaseHandler(baseOpt) {
this.baseOpt = baseOpt;
};
var RebaseHandler = Dygraph.DataHandlers.RebaseHandler;
RebaseHandler.prototype = new Dygraph.DataHandlers.DefaultHandler();
RebaseHandler.rebase = function rebase(value, initial, base) {
if (base === "percent") {
return (value / initial - 1) * 100;
}
return value * base / initial;
};
RebaseHandler.prototype.getExtremeYValues = function getExtremeYValues(series, dateWindow, stepPlot) {
var minY = null,
maxY = null,
y;
var firstIdx = 0,
lastIdx = series.length - 1;
var initial = series[firstIdx][1];
for (var j = firstIdx; j <= lastIdx; j++) {
if (j === firstIdx) {
y = this.baseOpt === "percent" ? 0 : this.baseOpt;
} else {
y = RebaseHandler.rebase(series[j][1], initial, this.baseOpt);
}
if (y === null || isNaN(y)) continue;
if (maxY === null || y > maxY) {
maxY = y;
}
if (minY === null || y < minY) {
minY = y;
}
}
return [minY, maxY];
};
RebaseHandler.prototype.seriesToPoints = function seriesToPoints(series, setName, boundaryIdStart) {
var points = [];
var firstIdx = 0;
var lastIdx = series.length - 1;
var initial = series[firstIdx][1]; // TODO: check for null
for (var i = 0; i <= lastIdx; ++i) {
var item = series[i];
var yraw = item[1];
var yval = yraw === null ? null : parseFloat(yraw);
if (yval !== null) {
if (i === firstIdx) {
yval = this.baseOpt === "percent" ? 0 : this.baseOpt;
} else {
yval = RebaseHandler.rebase(yval, initial, this.baseOpt);
}
}
var point = {
x: NaN,
y: NaN,
xval: parseFloat(item[0]),
yval: yval,
name: setName,
idx: i + boundaryIdStart
};
points.push(point);
}
this.onPointsCreated_(series, points);
return points;
};
Dygraph.Plugins.Rebase = function _rebase_inner_closure() {
var rebase = function rebase(baseOpt) {
var isNum = function isNum(v) {
return !isNaN(v) && (typeof v === 'number' || {}.toString.call(v) === '[object Number]');
};
if (baseOpt === "percent" || isNum(baseOpt)) {
this.baseOpt_ = baseOpt;
} else {
this.baseOpt_ = null;
}
};
rebase.prototype.toString = function toString() {
return "Rebase Plugin";
};
rebase.prototype.activate = function activate(g) {
if (this.baseOpt_ === null) {
return;
}
return {
predraw: this.predraw
};
};
rebase.prototype.predraw = function predraw(e) {
var g = e.dygraph;
if (this.baseOpt_ === "percent") {
g.updateOptions({
axes: {
y: {
axisLabelFormatter: function axisLabelFormatter(y) {
return y + '%';
},
valueFormatter: function valueFormatter(y) {
return Math.round(y * 100) / 100 + '%';
}
}
}
}, true);
}
g.dataHandler_ = new Dygraph.DataHandlers.RebaseHandler(this.baseOpt_);
};
return rebase;
}();
/* closure and loader wrapper */
Dygraph._require.add('dygraphs/src/extras/rebase.js', /* exports */{});
})();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZXh0cmFzX3JlYmFzZV9jbG9zdXJlIiwiRHlncmFwaCIsIndpbmRvdyIsIm1vZHVsZSIsInJlcXVpcmUiLCJOQU1FIiwicGFyc2VGbG9hdCIsInZhbCIsIk5hTiIsIkRhdGFIYW5kbGVycyIsIlJlYmFzZUhhbmRsZXIiLCJiYXNlT3B0IiwicHJvdG90eXBlIiwiRGVmYXVsdEhhbmRsZXIiLCJyZWJhc2UiLCJ2YWx1ZSIsImluaXRpYWwiLCJiYXNlIiwiZ2V0RXh0cmVtZVlWYWx1ZXMiLCJzZXJpZXMiLCJkYXRlV2luZG93Iiwic3RlcFBsb3QiLCJtaW5ZIiwibWF4WSIsInkiLCJmaXJzdElkeCIsImxhc3RJZHgiLCJsZW5ndGgiLCJqIiwiaXNOYU4iLCJzZXJpZXNUb1BvaW50cyIsInNldE5hbWUiLCJib3VuZGFyeUlkU3RhcnQiLCJwb2ludHMiLCJpIiwiaXRlbSIsInlyYXciLCJ5dmFsIiwicG9pbnQiLCJ4IiwieHZhbCIsIm5hbWUiLCJpZHgiLCJwdXNoIiwib25Qb2ludHNDcmVhdGVkXyIsIlBsdWdpbnMiLCJSZWJhc2UiLCJfcmViYXNlX2lubmVyX2Nsb3N1cmUiLCJpc051bSIsInYiLCJ0b1N0cmluZyIsImNhbGwiLCJiYXNlT3B0XyIsImFjdGl2YXRlIiwiZyIsInByZWRyYXciLCJlIiwiZHlncmFwaCIsInVwZGF0ZU9wdGlvbnMiLCJheGVzIiwiYXhpc0xhYmVsRm9ybWF0dGVyIiwidmFsdWVGb3JtYXR0ZXIiLCJNYXRoIiwicm91bmQiLCJkYXRhSGFuZGxlcl8iLCJfcmVxdWlyZSIsImFkZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leHRyYXMvcmViYXNlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE1IFBldHIgU2hldnRzb3YgKHBldHIuc2hldnRzb3ZAZ21haWwuY29tKVxuICogTUlULWxpY2VuY2VkOiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2UvTUlUXG4gKlxuICogUmViYXNlIHBsdWdpblxuICpcbiAqIE9uIHBhbi96b29tIGV2ZW50LCBlYWNoIHNlcmllcyB3aWxsIHJlYmFzZSB0byBhIHNwZWNpZmllZCB2YWx1ZSAoZS5nLiAxMDApIGF0IHRoZVxuICogc3RhcnQgb2YgdGhlIGRpc3BsYXllZCBwZXJpb2QuXG4gKlxuICogU2VlIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDIxMDcxMTExMDA0NC9odHRwczovL3N0YXRzLm9lY2Qub3JnL2dsb3NzYXJ5L2RldGFpbC5hc3A/SUQ9MjI0OVxuICpcbiAqIE9wdGlvbnM6XG4gKiAgVmFsdWUgdG8gcmViYXNlLiBNdXN0IGJlIGVpdGhlciBOdW1iZXIgb3IgJ3BlcmNlbnQnIG9yIG51bGwuXG4gKlxuICogU2VlIHRlc3RzL3N0cmF3LWJyb29tLmh0bWwgZm9yIGRlbW8uXG4gKi9cblxuLyogbG9hZGVyIHdyYXBwZXIgdG8gYWxsb3cgYnJvd3NlciB1c2UgYW5kIEVTNiBpbXBvcnRzICovXG4oZnVuY3Rpb24gX2V4dHJhc19yZWJhc2VfY2xvc3VyZSgpIHtcbid1c2Ugc3RyaWN0JztcbnZhciBEeWdyYXBoO1xuaWYgKHdpbmRvdy5EeWdyYXBoKSB7XG4gIER5Z3JhcGggPSB3aW5kb3cuRHlncmFwaDtcbn0gZWxzZSBpZiAodHlwZW9mKG1vZHVsZSkgIT09ICd1bmRlZmluZWQnKSB7XG4gIER5Z3JhcGggPSByZXF1aXJlKCcuLi9keWdyYXBoJyk7XG4gIGlmICh0eXBlb2YoRHlncmFwaC5OQU1FKSA9PT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mKER5Z3JhcGguZGVmYXVsdCkgIT09ICd1bmRlZmluZWQnKVxuICAgIER5Z3JhcGggPSBEeWdyYXBoLmRlZmF1bHQ7XG59XG4vKiBlbmQgb2YgbG9hZGVyIHdyYXBwZXIgaGVhZGVyICovXG5cbiAgLy8gTWF0Y2hlcyBEZWZhdWx0SGFuZGxlci5wYXJzZUZsb2F0XG4gIHZhciBwYXJzZUZsb2F0ID0gZnVuY3Rpb24gcGFyc2VGbG9hdCh2YWwpIHtcbiAgICBpZiAodmFsID09PSBudWxsKSByZXR1cm4gTmFOO1xuICAgIHJldHVybiB2YWw7XG4gIH07XG5cbiAgRHlncmFwaC5EYXRhSGFuZGxlcnMuUmViYXNlSGFuZGxlciA9IGZ1bmN0aW9uIFJlYmFzZUhhbmRsZXIoYmFzZU9wdCkge1xuICAgIHRoaXMuYmFzZU9wdCA9IGJhc2VPcHQ7XG4gIH07XG5cbiAgdmFyIFJlYmFzZUhhbmRsZXIgPSBEeWdyYXBoLkRhdGFIYW5kbGVycy5SZWJhc2VIYW5kbGVyO1xuICBSZWJhc2VIYW5kbGVyLnByb3RvdHlwZSA9IG5ldyBEeWdyYXBoLkRhdGFIYW5kbGVycy5EZWZhdWx0SGFuZGxlcigpO1xuXG4gIFJlYmFzZUhhbmRsZXIucmViYXNlID0gZnVuY3Rpb24gcmViYXNlKHZhbHVlLCBpbml0aWFsLCBiYXNlKSB7XG4gICAgaWYgKGJhc2UgPT09IFwicGVyY2VudFwiKSB7XG4gICAgICByZXR1cm4gKHZhbHVlIC8gaW5pdGlhbCAtIDEpICogMTAwO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUgKiBiYXNlIC8gaW5pdGlhbDtcbiAgfTtcblxuICBSZWJhc2VIYW5kbGVyLnByb3RvdHlwZS5nZXRFeHRyZW1lWVZhbHVlcyA9IGZ1bmN0aW9uIGdldEV4dHJlbWVZVmFsdWVzKHNlcmllcywgZGF0ZVdpbmRvdywgc3RlcFBsb3QpIHtcbiAgICB2YXIgbWluWSA9IG51bGwsIG1heFkgPSBudWxsLCB5O1xuICAgIHZhciBmaXJzdElkeCA9IDAsIGxhc3RJZHggPSBzZXJpZXMubGVuZ3RoIC0gMTtcbiAgICB2YXIgaW5pdGlhbCA9IHNlcmllc1tmaXJzdElkeF1bMV07XG5cbiAgICBmb3IgKHZhciBqID0gZmlyc3RJZHg7IGogPD0gbGFzdElkeDsgaisrKSB7XG4gICAgICBpZiAoaiA9PT0gZmlyc3RJZHgpIHtcbiAgICAgICAgeSA9ICh0aGlzLmJhc2VPcHQgPT09IFwicGVyY2VudFwiKSA/IDAgOiB0aGlzLmJhc2VPcHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB5ID0gUmViYXNlSGFuZGxlci5yZWJhc2Uoc2VyaWVzW2pdWzFdLCBpbml0aWFsLCB0aGlzLmJhc2VPcHQpO1xuICAgICAgfVxuICAgICAgaWYgKHkgPT09IG51bGwgfHwgaXNOYU4oeSkpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgaWYgKG1heFkgPT09IG51bGwgfHwgeSA+IG1heFkpIHtcbiAgICAgICAgbWF4WSA9IHk7XG4gICAgICB9XG4gICAgICBpZiAobWluWSA9PT0gbnVsbCB8fCB5IDwgbWluWSkge1xuICAgICAgICBtaW5ZID0geTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFsgbWluWSwgbWF4WSBdO1xuICB9O1xuXG4gIFJlYmFzZUhhbmRsZXIucHJvdG90eXBlLnNlcmllc1RvUG9pbnRzID0gZnVuY3Rpb24gc2VyaWVzVG9Qb2ludHMoc2VyaWVzLCBzZXROYW1lLCBib3VuZGFyeUlkU3RhcnQpIHtcbiAgICB2YXIgcG9pbnRzID0gW107XG4gICAgdmFyIGZpcnN0SWR4ID0gMDtcbiAgICB2YXIgbGFzdElkeCA9IHNlcmllcy5sZW5ndGggLSAxO1xuICAgIHZhciBpbml0aWFsID0gc2VyaWVzW2ZpcnN0SWR4XVsxXTsgLy8gVE9ETzogY2hlY2sgZm9yIG51bGxcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBsYXN0SWR4OyArK2kpIHtcbiAgICAgIHZhciBpdGVtID0gc2VyaWVzW2ldO1xuICAgICAgdmFyIHlyYXcgPSBpdGVtWzFdO1xuICAgICAgdmFyIHl2YWwgPSB5cmF3ID09PSBudWxsID8gbnVsbCA6IHBhcnNlRmxvYXQoeXJhdyk7XG4gICAgICBpZiAoeXZhbCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoaSA9PT0gZmlyc3RJZHgpIHtcbiAgICAgICAgICB5dmFsID0gKHRoaXMuYmFzZU9wdCA9PT0gXCJwZXJjZW50XCIpID8gMCA6IHRoaXMuYmFzZU9wdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB5dmFsID0gUmViYXNlSGFuZGxlci5yZWJhc2UoeXZhbCwgaW5pdGlhbCwgdGhpcy5iYXNlT3B0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIHBvaW50ID0ge1xuICAgICAgICB4OiBOYU4sXG4gICAgICAgIHk6IE5hTixcbiAgICAgICAgeHZhbDogcGFyc2VGbG9hdChpdGVtWzBdKSxcbiAgICAgICAgeXZhbDogeXZhbCxcbiAgICAgICAgbmFtZTogc2V0TmFtZSxcbiAgICAgICAgaWR4OiBpICsgYm91bmRhcnlJZFN0YXJ0XG4gICAgICB9O1xuICAgICAgcG9pbnRzLnB1c2gocG9pbnQpO1xuICAgIH1cbiAgICB0aGlzLm9uUG9pbnRzQ3JlYXRlZF8oc2VyaWVzLCBwb2ludHMpO1xuICAgIHJldHVybiBwb2ludHM7XG4gIH07XG5cbiAgRHlncmFwaC5QbHVnaW5zLlJlYmFzZSA9IChmdW5jdGlvbiBfcmViYXNlX2lubmVyX2Nsb3N1cmUoKSB7XG4gICAgdmFyIHJlYmFzZSA9IGZ1bmN0aW9uIHJlYmFzZShiYXNlT3B0KSB7XG4gICAgICB2YXIgaXNOdW0gPSBmdW5jdGlvbiBpc051bSh2KSB7XG4gICAgICAgIHJldHVybiAhaXNOYU4odikgJiYgKHR5cGVvZiB2ID09PSAnbnVtYmVyJyB8fCB7fS50b1N0cmluZy5jYWxsKHYpID09PSAnW29iamVjdCBOdW1iZXJdJyk7XG4gICAgICB9O1xuICAgICAgaWYgKGJhc2VPcHQgPT09IFwicGVyY2VudFwiIHx8IGlzTnVtKGJhc2VPcHQpKSB7XG4gICAgICAgIHRoaXMuYmFzZU9wdF8gPSBiYXNlT3B0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5iYXNlT3B0XyA9IG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJlYmFzZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiBcIlJlYmFzZSBQbHVnaW5cIjtcbiAgICB9O1xuXG4gICAgcmViYXNlLnByb3RvdHlwZS5hY3RpdmF0ZSA9IGZ1bmN0aW9uIGFjdGl2YXRlKGcpIHtcbiAgICAgIGlmICh0aGlzLmJhc2VPcHRfID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByZWRyYXc6IHRoaXMucHJlZHJhd1xuICAgICAgfTtcbiAgICB9O1xuXG4gICAgcmViYXNlLnByb3RvdHlwZS5wcmVkcmF3ID0gZnVuY3Rpb24gcHJlZHJhdyhlKSB7XG4gICAgICB2YXIgZyA9IGUuZHlncmFwaDtcblxuICAgICAgaWYgKHRoaXMuYmFzZU9wdF8gPT09IFwicGVyY2VudFwiKSB7XG4gICAgICAgIGcudXBkYXRlT3B0aW9ucyh7XG4gICAgICAgICAgYXhlczoge1xuICAgICAgICAgICAgeToge1xuICAgICAgICAgICAgICBheGlzTGFiZWxGb3JtYXR0ZXI6IGZ1bmN0aW9uIGF4aXNMYWJlbEZvcm1hdHRlcih5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHkgKyAnJSc7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHZhbHVlRm9ybWF0dGVyOiBmdW5jdGlvbiB2YWx1ZUZvcm1hdHRlcih5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoeSAqIDEwMCkgLyAxMDAgKyAnJSc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIHRydWUpO1xuICAgICAgfVxuXG4gICAgICBnLmRhdGFIYW5kbGVyXyA9IG5ldyBEeWdyYXBoLkRhdGFIYW5kbGVycy5SZWJhc2VIYW5kbGVyKHRoaXMuYmFzZU9wdF8pO1xuICAgIH07XG5cbiAgICByZXR1cm4gcmViYXNlO1xuICB9KSgpO1xuXG4vKiBjbG9zdXJlIGFuZCBsb2FkZXIgd3JhcHBlciAqL1xuRHlncmFwaC5fcmVxdWlyZS5hZGQoJ2R5Z3JhcGhzL3NyYy9leHRyYXMvcmViYXNlLmpzJywgLyogZXhwb3J0cyAqLyB7fSk7XG59KSgpO1xuIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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