UNPKG

dygraphs

Version:

dygraphs is a fast, flexible open source JavaScript charting library.

148 lines (143 loc) 17.6 kB
"use strict"; /** * @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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