@qogni/dygraphs
Version:
dygraphs is a fast, flexible open source JavaScript charting library.
109 lines (100 loc) • 13.2 kB
JavaScript
/**
* @license
* Copyright 2013 David Eberlein (david.eberlein@ch.sauter-bc.com)
* MIT-licenced: https://opensource.org/licenses/MIT
*/
/**
* @fileoverview DataHandler base implementation for the "bar"
* data formats. This implementation must be extended and the
* extractSeries and rollingAverage must be implemented.
* @author David Eberlein (david.eberlein@ch.sauter-bc.com)
*/
/*global Dygraph:false */
/*global DygraphLayout:false */
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _datahandler = _interopRequireDefault(require("./datahandler"));
var _dygraphLayout = _interopRequireDefault(require("../dygraph-layout"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
/**
* @constructor
* @extends {Dygraph.DataHandler}
*/
var BarsHandler = function BarsHandler() {
_datahandler["default"].call(this);
};
BarsHandler.prototype = new _datahandler["default"]();
// TODO(danvk): figure out why the jsdoc has to be copy/pasted from superclass.
// (I get closure compiler errors if this isn't here.)
/**
* @override
* @param {!Array.<Array>} rawData The raw data passed into dygraphs where
* rawData[i] = [x,ySeries1,...,ySeriesN].
* @param {!number} seriesIndex Index of the series to extract. All other
* series should be ignored.
* @param {!DygraphOptions} options Dygraph options.
* @return {Array.<[!number,?number,?]>} The series in the unified data format
* where series[i] = [x,y,{extras}].
*/
BarsHandler.prototype.extractSeries = function (rawData, seriesIndex, options) {
// Not implemented here must be extended
};
/**
* @override
* @param {!Array.<[!number,?number,?]>} series The series in the unified
* data format where series[i] = [x,y,{extras}].
* @param {!number} rollPeriod The number of points over which to average the data
* @param {!DygraphOptions} options The dygraph options.
* @param {!number} seriesIndex Index of the series this was extracted from.
* TODO(danvk): be more specific than "Array" here.
* @return {!Array.<[!number,?number,?]>} the rolled series.
*/
BarsHandler.prototype.rollingAverage = function (series, rollPeriod, options, seriesIndex) {
// Not implemented here, must be extended.
};
/** @inheritDoc */
BarsHandler.prototype.onPointsCreated_ = function (series, points) {
for (var i = 0; i < series.length; ++i) {
var item = series[i];
var point = points[i];
point.y_top = NaN;
point.y_bottom = NaN;
point.yval_minus = _datahandler["default"].parseFloat(item[2][0]);
point.yval_plus = _datahandler["default"].parseFloat(item[2][1]);
}
};
/** @inheritDoc */
BarsHandler.prototype.getExtremeYValues = function (series, dateWindow, stepPlot) {
var minY = null,
maxY = null,
y;
var firstIdx = 0;
var lastIdx = series.length - 1;
for (var j = firstIdx; j <= lastIdx; j++) {
y = series[j][1];
if (y === null || isNaN(y)) continue;
var low = series[j][2][0];
var high = series[j][2][1];
if (low > y) low = y; // this can happen with custom bars,
if (high < y) high = y; // e.g. in tests/custom-bars.html
if (maxY === null || high > maxY) maxY = high;
if (minY === null || low < minY) minY = low;
}
return [minY, maxY];
};
/** @inheritDoc */
BarsHandler.prototype.onLineEvaluated = function (points, axis, logscale) {
var point;
for (var j = 0; j < points.length; j++) {
// Copy over the error terms
point = points[j];
point.y_top = _dygraphLayout["default"].calcYNormal_(axis, point.yval_minus, logscale);
point.y_bottom = _dygraphLayout["default"].calcYNormal_(axis, point.yval_plus, logscale);
}
};
var _default = exports["default"] = BarsHandler;
module.exports = exports.default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsIl9kYXRhaGFuZGxlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2R5Z3JhcGhMYXlvdXQiLCJlIiwiX19lc01vZHVsZSIsIkJhcnNIYW5kbGVyIiwiRHlncmFwaERhdGFIYW5kbGVyIiwiY2FsbCIsInByb3RvdHlwZSIsImV4dHJhY3RTZXJpZXMiLCJyYXdEYXRhIiwic2VyaWVzSW5kZXgiLCJvcHRpb25zIiwicm9sbGluZ0F2ZXJhZ2UiLCJzZXJpZXMiLCJyb2xsUGVyaW9kIiwib25Qb2ludHNDcmVhdGVkXyIsInBvaW50cyIsImkiLCJsZW5ndGgiLCJpdGVtIiwicG9pbnQiLCJ5X3RvcCIsIk5hTiIsInlfYm90dG9tIiwieXZhbF9taW51cyIsInBhcnNlRmxvYXQiLCJ5dmFsX3BsdXMiLCJnZXRFeHRyZW1lWVZhbHVlcyIsImRhdGVXaW5kb3ciLCJzdGVwUGxvdCIsIm1pblkiLCJtYXhZIiwieSIsImZpcnN0SWR4IiwibGFzdElkeCIsImoiLCJpc05hTiIsImxvdyIsImhpZ2giLCJvbkxpbmVFdmFsdWF0ZWQiLCJheGlzIiwibG9nc2NhbGUiLCJEeWdyYXBoTGF5b3V0IiwiY2FsY1lOb3JtYWxfIiwiX2RlZmF1bHQiLCJtb2R1bGUiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGFoYW5kbGVyL2JhcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTMgRGF2aWQgRWJlcmxlaW4gKGRhdmlkLmViZXJsZWluQGNoLnNhdXRlci1iYy5jb20pXG4gKiBNSVQtbGljZW5jZWQ6IGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXG4gKi9cblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IERhdGFIYW5kbGVyIGJhc2UgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBcImJhclwiXG4gKiBkYXRhIGZvcm1hdHMuIFRoaXMgaW1wbGVtZW50YXRpb24gbXVzdCBiZSBleHRlbmRlZCBhbmQgdGhlXG4gKiBleHRyYWN0U2VyaWVzIGFuZCByb2xsaW5nQXZlcmFnZSBtdXN0IGJlIGltcGxlbWVudGVkLlxuICogQGF1dGhvciBEYXZpZCBFYmVybGVpbiAoZGF2aWQuZWJlcmxlaW5AY2guc2F1dGVyLWJjLmNvbSlcbiAqL1xuXG4vKmdsb2JhbCBEeWdyYXBoOmZhbHNlICovXG4vKmdsb2JhbCBEeWdyYXBoTGF5b3V0OmZhbHNlICovXG5cInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IER5Z3JhcGhEYXRhSGFuZGxlciBmcm9tICcuL2RhdGFoYW5kbGVyJztcbmltcG9ydCBEeWdyYXBoTGF5b3V0IGZyb20gJy4uL2R5Z3JhcGgtbGF5b3V0JztcblxuLyoqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIHtEeWdyYXBoLkRhdGFIYW5kbGVyfVxuICovXG52YXIgQmFyc0hhbmRsZXIgPSBmdW5jdGlvbigpIHtcbiAgRHlncmFwaERhdGFIYW5kbGVyLmNhbGwodGhpcyk7XG59O1xuQmFyc0hhbmRsZXIucHJvdG90eXBlID0gbmV3IER5Z3JhcGhEYXRhSGFuZGxlcigpO1xuXG4vLyBUT0RPKGRhbnZrKTogZmlndXJlIG91dCB3aHkgdGhlIGpzZG9jIGhhcyB0byBiZSBjb3B5L3Bhc3RlZCBmcm9tIHN1cGVyY2xhc3MuXG4vLyAgIChJIGdldCBjbG9zdXJlIGNvbXBpbGVyIGVycm9ycyBpZiB0aGlzIGlzbid0IGhlcmUuKVxuLyoqXG4gKiBAb3ZlcnJpZGVcbiAqIEBwYXJhbSB7IUFycmF5LjxBcnJheT59IHJhd0RhdGEgVGhlIHJhdyBkYXRhIHBhc3NlZCBpbnRvIGR5Z3JhcGhzIHdoZXJlXG4gKiAgICAgcmF3RGF0YVtpXSA9IFt4LHlTZXJpZXMxLC4uLix5U2VyaWVzTl0uXG4gKiBAcGFyYW0geyFudW1iZXJ9IHNlcmllc0luZGV4IEluZGV4IG9mIHRoZSBzZXJpZXMgdG8gZXh0cmFjdC4gQWxsIG90aGVyXG4gKiAgICAgc2VyaWVzIHNob3VsZCBiZSBpZ25vcmVkLlxuICogQHBhcmFtIHshRHlncmFwaE9wdGlvbnN9IG9wdGlvbnMgRHlncmFwaCBvcHRpb25zLlxuICogQHJldHVybiB7QXJyYXkuPFshbnVtYmVyLD9udW1iZXIsP10+fSBUaGUgc2VyaWVzIGluIHRoZSB1bmlmaWVkIGRhdGEgZm9ybWF0XG4gKiAgICAgd2hlcmUgc2VyaWVzW2ldID0gW3gseSx7ZXh0cmFzfV0uXG4gKi9cbkJhcnNIYW5kbGVyLnByb3RvdHlwZS5leHRyYWN0U2VyaWVzID0gZnVuY3Rpb24ocmF3RGF0YSwgc2VyaWVzSW5kZXgsIG9wdGlvbnMpIHtcbiAgLy8gTm90IGltcGxlbWVudGVkIGhlcmUgbXVzdCBiZSBleHRlbmRlZFxufTtcblxuLyoqXG4gKiBAb3ZlcnJpZGVcbiAqIEBwYXJhbSB7IUFycmF5LjxbIW51bWJlciw/bnVtYmVyLD9dPn0gc2VyaWVzIFRoZSBzZXJpZXMgaW4gdGhlIHVuaWZpZWRcbiAqICAgICAgICAgIGRhdGEgZm9ybWF0IHdoZXJlIHNlcmllc1tpXSA9IFt4LHkse2V4dHJhc31dLlxuICogQHBhcmFtIHshbnVtYmVyfSByb2xsUGVyaW9kIFRoZSBudW1iZXIgb2YgcG9pbnRzIG92ZXIgd2hpY2ggdG8gYXZlcmFnZSB0aGUgZGF0YVxuICogQHBhcmFtIHshRHlncmFwaE9wdGlvbnN9IG9wdGlvbnMgVGhlIGR5Z3JhcGggb3B0aW9ucy5cbiAqIEBwYXJhbSB7IW51bWJlcn0gc2VyaWVzSW5kZXggSW5kZXggb2YgdGhlIHNlcmllcyB0aGlzIHdhcyBleHRyYWN0ZWQgZnJvbS5cbiAqIFRPRE8oZGFudmspOiBiZSBtb3JlIHNwZWNpZmljIHRoYW4gXCJBcnJheVwiIGhlcmUuXG4gKiBAcmV0dXJuIHshQXJyYXkuPFshbnVtYmVyLD9udW1iZXIsP10+fSB0aGUgcm9sbGVkIHNlcmllcy5cbiAqL1xuQmFyc0hhbmRsZXIucHJvdG90eXBlLnJvbGxpbmdBdmVyYWdlID1cbiAgICBmdW5jdGlvbihzZXJpZXMsIHJvbGxQZXJpb2QsIG9wdGlvbnMsIHNlcmllc0luZGV4KSB7XG4gIC8vIE5vdCBpbXBsZW1lbnRlZCBoZXJlLCBtdXN0IGJlIGV4dGVuZGVkLlxufTtcblxuLyoqIEBpbmhlcml0RG9jICovXG5CYXJzSGFuZGxlci5wcm90b3R5cGUub25Qb2ludHNDcmVhdGVkXyA9IGZ1bmN0aW9uKHNlcmllcywgcG9pbnRzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2VyaWVzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGl0ZW0gPSBzZXJpZXNbaV07XG4gICAgdmFyIHBvaW50ID0gcG9pbnRzW2ldO1xuICAgIHBvaW50LnlfdG9wID0gTmFOO1xuICAgIHBvaW50LnlfYm90dG9tID0gTmFOO1xuICAgIHBvaW50Lnl2YWxfbWludXMgPSBEeWdyYXBoRGF0YUhhbmRsZXIucGFyc2VGbG9hdChpdGVtWzJdWzBdKTtcbiAgICBwb2ludC55dmFsX3BsdXMgPSBEeWdyYXBoRGF0YUhhbmRsZXIucGFyc2VGbG9hdChpdGVtWzJdWzFdKTtcbiAgfVxufTtcblxuLyoqIEBpbmhlcml0RG9jICovXG5CYXJzSGFuZGxlci5wcm90b3R5cGUuZ2V0RXh0cmVtZVlWYWx1ZXMgPSBmdW5jdGlvbihzZXJpZXMsIGRhdGVXaW5kb3csIHN0ZXBQbG90KSB7XG4gIHZhciBtaW5ZID0gbnVsbCwgbWF4WSA9IG51bGwsIHk7XG5cbiAgdmFyIGZpcnN0SWR4ID0gMDtcbiAgdmFyIGxhc3RJZHggPSBzZXJpZXMubGVuZ3RoIC0gMTtcblxuICBmb3IgKCB2YXIgaiA9IGZpcnN0SWR4OyBqIDw9IGxhc3RJZHg7IGorKykge1xuICAgIHkgPSBzZXJpZXNbal1bMV07XG4gICAgaWYgKHkgPT09IG51bGwgfHwgaXNOYU4oeSkpIGNvbnRpbnVlO1xuXG4gICAgdmFyIGxvdyA9IHNlcmllc1tqXVsyXVswXTtcbiAgICB2YXIgaGlnaCA9IHNlcmllc1tqXVsyXVsxXTtcblxuICAgIGlmIChsb3cgPiB5KSBsb3cgPSB5OyAvLyB0aGlzIGNhbiBoYXBwZW4gd2l0aCBjdXN0b20gYmFycyxcbiAgICBpZiAoaGlnaCA8IHkpIGhpZ2ggPSB5OyAvLyBlLmcuIGluIHRlc3RzL2N1c3RvbS1iYXJzLmh0bWxcblxuICAgIGlmIChtYXhZID09PSBudWxsIHx8IGhpZ2ggPiBtYXhZKSBtYXhZID0gaGlnaDtcbiAgICBpZiAobWluWSA9PT0gbnVsbCB8fCBsb3cgPCBtaW5ZKSBtaW5ZID0gbG93O1xuICB9XG5cbiAgcmV0dXJuIFsgbWluWSwgbWF4WSBdO1xufTtcblxuLyoqIEBpbmhlcml0RG9jICovXG5CYXJzSGFuZGxlci5wcm90b3R5cGUub25MaW5lRXZhbHVhdGVkID0gZnVuY3Rpb24ocG9pbnRzLCBheGlzLCBsb2dzY2FsZSkge1xuICB2YXIgcG9pbnQ7XG4gIGZvciAodmFyIGogPSAwOyBqIDwgcG9pbnRzLmxlbmd0aDsgaisrKSB7XG4gICAgLy8gQ29weSBvdmVyIHRoZSBlcnJvciB0ZXJtc1xuICAgIHBvaW50ID0gcG9pbnRzW2pdO1xuICAgIHBvaW50LnlfdG9wID0gRHlncmFwaExheW91dC5jYWxjWU5vcm1hbF8oYXhpcywgcG9pbnQueXZhbF9taW51cywgbG9nc2NhbGUpO1xuICAgIHBvaW50LnlfYm90dG9tID0gRHlncmFwaExheW91dC5jYWxjWU5vcm1hbF8oYXhpcywgcG9pbnQueXZhbF9wbHVzLCBsb2dzY2FsZSk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEJhcnNIYW5kbGVyO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWTs7QUFBQ0EsTUFBQSxDQUFBQyxjQUFBLENBQUFDLE9BQUE7RUFBQUMsS0FBQTtBQUFBO0FBQUFELE9BQUE7QUFFYixJQUFBRSxZQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxjQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFBOEMsU0FBQUQsdUJB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