@qogni/dygraphs
Version:
dygraphs is a fast, flexible open source JavaScript charting library.
121 lines (115 loc) • 13.9 kB
JavaScript
/**
* @license
* Copyright 2012 Dan Vanderkam (danvdk@gmail.com)
* MIT-licenced: https://opensource.org/licenses/MIT
*/
/*global Dygraph:false */
/*
Current bits of jankiness:
- Direct layout access
- Direct area access
*/
;
/**
* Draws the gridlines, i.e. the gray horizontal & vertical lines running the
* length of the chart.
*
* @constructor
*/
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var grid = function grid() {};
grid.prototype.toString = function () {
return "Gridline Plugin";
};
grid.prototype.activate = function (g) {
return {
willDrawChart: this.willDrawChart
};
};
grid.prototype.willDrawChart = function (e) {
// Draw the new X/Y grid. Lines appear crisper when pixels are rounded to
// half-integers. This prevents them from drawing in two rows/cols.
var g = e.dygraph;
var ctx = e.drawingContext;
var layout = g.layout_;
var area = e.dygraph.plotter_.area;
function halfUp(x) {
return Math.round(x) + 0.5;
}
function halfDown(y) {
return Math.round(y) - 0.5;
}
var x, y, i, ticks;
if (g.getOptionForAxis('drawGrid', 'y')) {
var axes = ["y", "y2"];
var strokeStyles = [],
lineWidths = [],
drawGrid = [],
stroking = [],
strokePattern = [];
for (var i = 0; i < axes.length; i++) {
drawGrid[i] = g.getOptionForAxis('drawGrid', axes[i]);
if (drawGrid[i]) {
strokeStyles[i] = g.getOptionForAxis('gridLineColor', axes[i]);
lineWidths[i] = g.getOptionForAxis('gridLineWidth', axes[i]);
strokePattern[i] = g.getOptionForAxis('gridLinePattern', axes[i]);
stroking[i] = strokePattern[i] && strokePattern[i].length >= 2;
}
}
ticks = layout.yticks;
ctx.save();
// draw grids for the different y axes
ticks.forEach(function (tick) {
if (!tick.has_tick) return;
var axis = tick.axis;
if (drawGrid[axis]) {
ctx.save();
if (stroking[axis]) {
if (ctx.setLineDash) ctx.setLineDash(strokePattern[axis]);
}
ctx.strokeStyle = strokeStyles[axis];
ctx.lineWidth = lineWidths[axis];
x = halfUp(area.x);
y = halfDown(area.y + tick.pos * area.h);
ctx.beginPath();
ctx.moveTo(x, y);
ctx.lineTo(x + area.w, y);
ctx.stroke();
ctx.restore();
}
});
ctx.restore();
}
// draw grid for x axis
if (g.getOptionForAxis('drawGrid', 'x')) {
ticks = layout.xticks;
ctx.save();
var strokePattern = g.getOptionForAxis('gridLinePattern', 'x');
var stroking = strokePattern && strokePattern.length >= 2;
if (stroking) {
if (ctx.setLineDash) ctx.setLineDash(strokePattern);
}
ctx.strokeStyle = g.getOptionForAxis('gridLineColor', 'x');
ctx.lineWidth = g.getOptionForAxis('gridLineWidth', 'x');
ticks.forEach(function (tick) {
if (!tick.has_tick) return;
x = halfUp(area.x + tick.pos * area.w);
y = halfDown(area.y + area.h);
ctx.beginPath();
ctx.moveTo(x, y);
ctx.lineTo(x, area.y);
ctx.stroke();
});
if (stroking) {
if (ctx.setLineDash) ctx.setLineDash([]);
}
ctx.restore();
}
};
grid.prototype.destroy = function () {};
var _default = exports["default"] = grid;
module.exports = exports.default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsImdyaWQiLCJwcm90b3R5cGUiLCJ0b1N0cmluZyIsImFjdGl2YXRlIiwiZyIsIndpbGxEcmF3Q2hhcnQiLCJlIiwiZHlncmFwaCIsImN0eCIsImRyYXdpbmdDb250ZXh0IiwibGF5b3V0IiwibGF5b3V0XyIsImFyZWEiLCJwbG90dGVyXyIsImhhbGZVcCIsIngiLCJNYXRoIiwicm91bmQiLCJoYWxmRG93biIsInkiLCJpIiwidGlja3MiLCJnZXRPcHRpb25Gb3JBeGlzIiwiYXhlcyIsInN0cm9rZVN0eWxlcyIsImxpbmVXaWR0aHMiLCJkcmF3R3JpZCIsInN0cm9raW5nIiwic3Ryb2tlUGF0dGVybiIsImxlbmd0aCIsInl0aWNrcyIsInNhdmUiLCJmb3JFYWNoIiwidGljayIsImhhc190aWNrIiwiYXhpcyIsInNldExpbmVEYXNoIiwic3Ryb2tlU3R5bGUiLCJsaW5lV2lkdGgiLCJwb3MiLCJoIiwiYmVnaW5QYXRoIiwibW92ZVRvIiwibGluZVRvIiwidyIsInN0cm9rZSIsInJlc3RvcmUiLCJ4dGlja3MiLCJkZXN0cm95IiwiX2RlZmF1bHQiLCJtb2R1bGUiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbnMvZ3JpZC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxMiBEYW4gVmFuZGVya2FtIChkYW52ZGtAZ21haWwuY29tKVxuICogTUlULWxpY2VuY2VkOiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxuICovXG4vKmdsb2JhbCBEeWdyYXBoOmZhbHNlICovXG5cbi8qXG5cbkN1cnJlbnQgYml0cyBvZiBqYW5raW5lc3M6XG4tIERpcmVjdCBsYXlvdXQgYWNjZXNzXG4tIERpcmVjdCBhcmVhIGFjY2Vzc1xuXG4qL1xuXG5cInVzZSBzdHJpY3RcIjtcblxuLyoqXG4gKiBEcmF3cyB0aGUgZ3JpZGxpbmVzLCBpLmUuIHRoZSBncmF5IGhvcml6b250YWwgJiB2ZXJ0aWNhbCBsaW5lcyBydW5uaW5nIHRoZVxuICogbGVuZ3RoIG9mIHRoZSBjaGFydC5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqL1xudmFyIGdyaWQgPSBmdW5jdGlvbigpIHtcbn07XG5cbmdyaWQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBcIkdyaWRsaW5lIFBsdWdpblwiO1xufTtcblxuZ3JpZC5wcm90b3R5cGUuYWN0aXZhdGUgPSBmdW5jdGlvbihnKSB7XG4gIHJldHVybiB7XG4gICAgd2lsbERyYXdDaGFydDogdGhpcy53aWxsRHJhd0NoYXJ0XG4gIH07XG59O1xuXG5ncmlkLnByb3RvdHlwZS53aWxsRHJhd0NoYXJ0ID0gZnVuY3Rpb24oZSkge1xuICAvLyBEcmF3IHRoZSBuZXcgWC9ZIGdyaWQuIExpbmVzIGFwcGVhciBjcmlzcGVyIHdoZW4gcGl4ZWxzIGFyZSByb3VuZGVkIHRvXG4gIC8vIGhhbGYtaW50ZWdlcnMuIFRoaXMgcHJldmVudHMgdGhlbSBmcm9tIGRyYXdpbmcgaW4gdHdvIHJvd3MvY29scy5cbiAgdmFyIGcgPSBlLmR5Z3JhcGg7XG4gIHZhciBjdHggPSBlLmRyYXdpbmdDb250ZXh0O1xuICB2YXIgbGF5b3V0ID0gZy5sYXlvdXRfO1xuICB2YXIgYXJlYSA9IGUuZHlncmFwaC5wbG90dGVyXy5hcmVhO1xuXG4gIGZ1bmN0aW9uIGhhbGZVcCh4KSAgeyByZXR1cm4gTWF0aC5yb3VuZCh4KSArIDAuNTsgfVxuICBmdW5jdGlvbiBoYWxmRG93bih5KXsgcmV0dXJuIE1hdGgucm91bmQoeSkgLSAwLjU7IH1cblxuICB2YXIgeCwgeSwgaSwgdGlja3M7XG4gIGlmIChnLmdldE9wdGlvbkZvckF4aXMoJ2RyYXdHcmlkJywgJ3knKSkge1xuICAgIHZhciBheGVzID0gW1wieVwiLCBcInkyXCJdO1xuICAgIHZhciBzdHJva2VTdHlsZXMgPSBbXSwgbGluZVdpZHRocyA9IFtdLCBkcmF3R3JpZCA9IFtdLCBzdHJva2luZyA9IFtdLCBzdHJva2VQYXR0ZXJuID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBheGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkcmF3R3JpZFtpXSA9IGcuZ2V0T3B0aW9uRm9yQXhpcygnZHJhd0dyaWQnLCBheGVzW2ldKTtcbiAgICAgIGlmIChkcmF3R3JpZFtpXSkge1xuICAgICAgICBzdHJva2VTdHlsZXNbaV0gPSBnLmdldE9wdGlvbkZvckF4aXMoJ2dyaWRMaW5lQ29sb3InLCBheGVzW2ldKTtcbiAgICAgICAgbGluZVdpZHRoc1tpXSA9IGcuZ2V0T3B0aW9uRm9yQXhpcygnZ3JpZExpbmVXaWR0aCcsIGF4ZXNbaV0pO1xuICAgICAgICBzdHJva2VQYXR0ZXJuW2ldID0gZy5nZXRPcHRpb25Gb3JBeGlzKCdncmlkTGluZVBhdHRlcm4nLCBheGVzW2ldKTtcbiAgICAgICAgc3Ryb2tpbmdbaV0gPSBzdHJva2VQYXR0ZXJuW2ldICYmIChzdHJva2VQYXR0ZXJuW2ldLmxlbmd0aCA+PSAyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGlja3MgPSBsYXlvdXQueXRpY2tzO1xuICAgIGN0eC5zYXZlKCk7XG4gICAgLy8gZHJhdyBncmlkcyBmb3IgdGhlIGRpZmZlcmVudCB5IGF4ZXNcbiAgICB0aWNrcy5mb3JFYWNoKHRpY2sgPT4ge1xuICAgICAgaWYgKCF0aWNrLmhhc190aWNrKSByZXR1cm47XG4gICAgICB2YXIgYXhpcyA9IHRpY2suYXhpcztcbiAgICAgIGlmIChkcmF3R3JpZFtheGlzXSkge1xuICAgICAgICBjdHguc2F2ZSgpO1xuICAgICAgICBpZiAoc3Ryb2tpbmdbYXhpc10pIHtcbiAgICAgICAgICBpZiAoY3R4LnNldExpbmVEYXNoKSBjdHguc2V0TGluZURhc2goc3Ryb2tlUGF0dGVybltheGlzXSk7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gc3Ryb2tlU3R5bGVzW2F4aXNdO1xuICAgICAgICBjdHgubGluZVdpZHRoID0gbGluZVdpZHRoc1theGlzXTtcblxuICAgICAgICB4ID0gaGFsZlVwKGFyZWEueCk7XG4gICAgICAgIHkgPSBoYWxmRG93bihhcmVhLnkgKyB0aWNrLnBvcyAqIGFyZWEuaCk7XG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgY3R4Lm1vdmVUbyh4LCB5KTtcbiAgICAgICAgY3R4LmxpbmVUbyh4ICsgYXJlYS53LCB5KTtcbiAgICAgICAgY3R4LnN0cm9rZSgpO1xuXG4gICAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY3R4LnJlc3RvcmUoKTtcbiAgfVxuXG4gIC8vIGRyYXcgZ3JpZCBmb3IgeCBheGlzXG4gIGlmIChnLmdldE9wdGlvbkZvckF4aXMoJ2RyYXdHcmlkJywgJ3gnKSkge1xuICAgIHRpY2tzID0gbGF5b3V0Lnh0aWNrcztcbiAgICBjdHguc2F2ZSgpO1xuICAgIHZhciBzdHJva2VQYXR0ZXJuID0gZy5nZXRPcHRpb25Gb3JBeGlzKCdncmlkTGluZVBhdHRlcm4nLCAneCcpO1xuICAgIHZhciBzdHJva2luZyA9IHN0cm9rZVBhdHRlcm4gJiYgKHN0cm9rZVBhdHRlcm4ubGVuZ3RoID49IDIpO1xuICAgIGlmIChzdHJva2luZykge1xuICAgICAgaWYgKGN0eC5zZXRMaW5lRGFzaCkgY3R4LnNldExpbmVEYXNoKHN0cm9rZVBhdHRlcm4pO1xuICAgIH1cbiAgICBjdHguc3Ryb2tlU3R5bGUgPSBnLmdldE9wdGlvbkZvckF4aXMoJ2dyaWRMaW5lQ29sb3InLCAneCcpO1xuICAgIGN0eC5saW5lV2lkdGggPSBnLmdldE9wdGlvbkZvckF4aXMoJ2dyaWRMaW5lV2lkdGgnLCAneCcpO1xuICAgIHRpY2tzLmZvckVhY2godGljayA9PiB7XG4gICAgICBpZiAoIXRpY2suaGFzX3RpY2spIHJldHVybjtcbiAgICAgIHggPSBoYWxmVXAoYXJlYS54ICsgdGljay5wb3MgKiBhcmVhLncpO1xuICAgICAgeSA9IGhhbGZEb3duKGFyZWEueSArIGFyZWEuaCk7XG4gICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICBjdHgubW92ZVRvKHgsIHkpO1xuICAgICAgY3R4LmxpbmVUbyh4LCBhcmVhLnkpO1xuICAgICAgY3R4LnN0cm9rZSgpO1xuICAgIH0pO1xuICAgIGlmIChzdHJva2luZykge1xuICAgICAgaWYgKGN0eC5zZXRMaW5lRGFzaCkgY3R4LnNldExpbmVEYXNoKFtdKTtcbiAgICB9XG4gICAgY3R4LnJlc3RvcmUoKTtcbiAgfVxufTtcblxuZ3JpZC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZ3JpZDtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFlBQVk7O0FBRVo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEFBLE1BQUEsQ0FBQUMsY0FBQSxDQUFBQyxPQUFBO0VBQUFDLEtBQUE7QUFBQTtBQUFBRCxPQUFBO0FBTUEsSUFBSUUsSUFBSSxHQUFHLFNBQVBBLElBQUlBLENBQUEsRUFBYyxDQUN0QixDQUFDO0FBRURBLElBQUksQ0FBQ0MsU0FBUyxDQUFDQyxRQUFRLEdBQUcsWUFBVztFQUNuQyxPQUFPLGlCQUFpQjtBQUMxQixDQUFDO0FBRURGLElBQUksQ0FBQ0MsU0FBUyxDQUFDRSxRQUFRLEdBQUcsVUFBU0MsQ0FBQyxFQUFFO0VBQ3BDLE9BQU87SUFDTEMsYUFBYSxFQUFFLElBQUksQ0FBQ0E7RUFDdEIsQ0FBQztBQUNILENBQUM7QUFFREwsSUFBSSxDQUFDQyxTQUFTLENBQUNJLGFBQWEsR0FBRyxVQUFTQyxDQUFDLEVBQUU7RUFDekM7RUFDQTtFQUNBLElBQUlGLENBQUMsR0FBR0UsQ0FBQyxDQUFDQyxPQUFPO0VBQ2pCLElBQUlDLEdBQUcsR0FBR0YsQ0FBQyxDQUFDRyxjQUFjO0VBQzFCLElBQUlDLE1BQU0sR0FBR04sQ0FBQyxDQUFDTyxP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