@qogni/dygraphs
Version:
dygraphs is a fast, flexible open source JavaScript charting library.
157 lines (148 loc) • 21.5 kB
JavaScript
/**
* @license
* Copyright 2012 Dan Vanderkam (danvdk@gmail.com)
* MIT-licenced: https://opensource.org/licenses/MIT
*/
/*global Dygraph:false */
;
/**
Current bits of jankiness:
- Uses dygraph.layout_ to get the parsed annotations.
- Uses dygraph.plotter_.area
It would be nice if the plugin didn't require so much special support inside
the core dygraphs classes, but annotations involve quite a bit of parsing and
layout.
TODO(danvk): cache DOM elements.
*/
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var annotations = function annotations() {
this.annotations_ = [];
};
annotations.prototype.toString = function () {
return "Annotations Plugin";
};
annotations.prototype.activate = function (g) {
return {
clearChart: this.clearChart,
didDrawChart: this.didDrawChart
};
};
annotations.prototype.detachLabels = function () {
for (var i = 0; i < this.annotations_.length; i++) {
var a = this.annotations_[i];
if (a.parentNode) a.parentNode.removeChild(a);
this.annotations_[i] = null;
}
this.annotations_ = [];
};
annotations.prototype.clearChart = function (e) {
this.detachLabels();
};
annotations.prototype.didDrawChart = function (e) {
var g = e.dygraph;
// Early out in the (common) case of zero annotations.
var points = g.layout_.annotated_points;
if (!points || points.length === 0) return;
var containerDiv = e.canvas.parentNode;
var bindEvt = function bindEvt(eventName, classEventName, pt) {
return function (annotation_event) {
var a = pt.annotation;
if (a.hasOwnProperty(eventName)) {
a[eventName](a, pt, g, annotation_event);
} else if (g.getOption(classEventName)) {
g.getOption(classEventName)(a, pt, g, annotation_event);
}
};
};
// Add the annotations one-by-one.
var area = e.dygraph.getArea();
// x-coord to sum of previous annotation's heights (used for stacking).
var xToUsedHeight = {};
for (var i = 0; i < points.length; i++) {
var p = points[i];
if (p.canvasx < area.x || p.canvasx > area.x + area.w || p.canvasy < area.y || p.canvasy > area.y + area.h) {
continue;
}
var a = p.annotation;
var tick_height = 6;
if (a.hasOwnProperty("tickHeight")) {
tick_height = a.tickHeight;
}
// TODO: deprecate axisLabelFontSize in favor of CSS
var div = document.createElement("div");
div.style['fontSize'] = g.getOption('axisLabelFontSize') + "px";
var className = 'dygraph-annotation';
if (!a.hasOwnProperty('icon')) {
// camelCase class names are deprecated.
className += ' dygraphDefaultAnnotation dygraph-default-annotation';
}
if (a.hasOwnProperty('cssClass')) {
className += " " + a.cssClass;
}
div.className = className;
var width = a.hasOwnProperty('width') ? a.width : 16;
var height = a.hasOwnProperty('height') ? a.height : 16;
if (a.hasOwnProperty('icon')) {
var img = document.createElement("img");
img.src = a.icon;
img.width = width;
img.height = height;
div.appendChild(img);
} else if (p.annotation.hasOwnProperty('shortText')) {
div.appendChild(document.createTextNode(p.annotation.shortText));
}
var left = p.canvasx - width / 2;
div.style.left = left + "px";
var divTop = 0;
if (a.attachAtBottom) {
var y = area.y + area.h - height - tick_height;
if (xToUsedHeight[left]) {
y -= xToUsedHeight[left];
} else {
xToUsedHeight[left] = 0;
}
xToUsedHeight[left] += tick_height + height;
divTop = y;
} else {
divTop = p.canvasy - height - tick_height;
}
div.style.top = divTop + "px";
div.style.width = width + "px";
div.style.height = height + "px";
div.title = p.annotation.text;
div.style.color = g.colorsMap_[p.name];
div.style.borderColor = g.colorsMap_[p.name];
a.div = div;
g.addAndTrackEvent(div, 'click', bindEvt('clickHandler', 'annotationClickHandler', p, this));
g.addAndTrackEvent(div, 'mouseover', bindEvt('mouseOverHandler', 'annotationMouseOverHandler', p, this));
g.addAndTrackEvent(div, 'mouseout', bindEvt('mouseOutHandler', 'annotationMouseOutHandler', p, this));
g.addAndTrackEvent(div, 'dblclick', bindEvt('dblClickHandler', 'annotationDblClickHandler', p, this));
containerDiv.appendChild(div);
this.annotations_.push(div);
var ctx = e.drawingContext;
ctx.save();
ctx.strokeStyle = a.hasOwnProperty('tickColor') ? a.tickColor : g.colorsMap_[p.name];
ctx.lineWidth = a.hasOwnProperty('tickWidth') ? a.tickWidth : g.getOption('strokeWidth');
ctx.beginPath();
if (!a.attachAtBottom) {
ctx.moveTo(p.canvasx, p.canvasy);
ctx.lineTo(p.canvasx, p.canvasy - 2 - tick_height);
} else {
var y = divTop + height;
ctx.moveTo(p.canvasx, y);
ctx.lineTo(p.canvasx, y + tick_height);
}
ctx.closePath();
ctx.stroke();
ctx.restore();
}
};
annotations.prototype.destroy = function () {
this.detachLabels();
};
var _default = exports["default"] = annotations;
module.exports = exports.default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsImFubm90YXRpb25zIiwiYW5ub3RhdGlvbnNfIiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJhY3RpdmF0ZSIsImciLCJjbGVhckNoYXJ0IiwiZGlkRHJhd0NoYXJ0IiwiZGV0YWNoTGFiZWxzIiwiaSIsImxlbmd0aCIsImEiLCJwYXJlbnROb2RlIiwicmVtb3ZlQ2hpbGQiLCJlIiwiZHlncmFwaCIsInBvaW50cyIsImxheW91dF8iLCJhbm5vdGF0ZWRfcG9pbnRzIiwiY29udGFpbmVyRGl2IiwiY2FudmFzIiwiYmluZEV2dCIsImV2ZW50TmFtZSIsImNsYXNzRXZlbnROYW1lIiwicHQiLCJhbm5vdGF0aW9uX2V2ZW50IiwiYW5ub3RhdGlvbiIsImhhc093blByb3BlcnR5IiwiZ2V0T3B0aW9uIiwiYXJlYSIsImdldEFyZWEiLCJ4VG9Vc2VkSGVpZ2h0IiwicCIsImNhbnZhc3giLCJ4IiwidyIsImNhbnZhc3kiLCJ5IiwiaCIsInRpY2tfaGVpZ2h0IiwidGlja0hlaWdodCIsImRpdiIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInN0eWxlIiwiY2xhc3NOYW1lIiwiY3NzQ2xhc3MiLCJ3aWR0aCIsImhlaWdodCIsImltZyIsInNyYyIsImljb24iLCJhcHBlbmRDaGlsZCIsImNyZWF0ZVRleHROb2RlIiwic2hvcnRUZXh0IiwibGVmdCIsImRpdlRvcCIsImF0dGFjaEF0Qm90dG9tIiwidG9wIiwidGl0bGUiLCJ0ZXh0IiwiY29sb3IiLCJjb2xvcnNNYXBfIiwibmFtZSIsImJvcmRlckNvbG9yIiwiYWRkQW5kVHJhY2tFdmVudCIsInB1c2giLCJjdHgiLCJkcmF3aW5nQ29udGV4dCIsInNhdmUiLCJzdHJva2VTdHlsZSIsInRpY2tDb2xvciIsImxpbmVXaWR0aCIsInRpY2tXaWR0aCIsImJlZ2luUGF0aCIsIm1vdmVUbyIsImxpbmVUbyIsImNsb3NlUGF0aCIsInN0cm9rZSIsInJlc3RvcmUiLCJkZXN0cm95IiwiX2RlZmF1bHQiLCJtb2R1bGUiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbnMvYW5ub3RhdGlvbnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTIgRGFuIFZhbmRlcmthbSAoZGFudmRrQGdtYWlsLmNvbSlcbiAqIE1JVC1saWNlbmNlZDogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcbiAqL1xuXG4vKmdsb2JhbCBEeWdyYXBoOmZhbHNlICovXG5cblwidXNlIHN0cmljdFwiO1xuXG4vKipcbkN1cnJlbnQgYml0cyBvZiBqYW5raW5lc3M6XG4tIFVzZXMgZHlncmFwaC5sYXlvdXRfIHRvIGdldCB0aGUgcGFyc2VkIGFubm90YXRpb25zLlxuLSBVc2VzIGR5Z3JhcGgucGxvdHRlcl8uYXJlYVxuXG5JdCB3b3VsZCBiZSBuaWNlIGlmIHRoZSBwbHVnaW4gZGlkbid0IHJlcXVpcmUgc28gbXVjaCBzcGVjaWFsIHN1cHBvcnQgaW5zaWRlXG50aGUgY29yZSBkeWdyYXBocyBjbGFzc2VzLCBidXQgYW5ub3RhdGlvbnMgaW52b2x2ZSBxdWl0ZSBhIGJpdCBvZiBwYXJzaW5nIGFuZFxubGF5b3V0LlxuXG5UT0RPKGRhbnZrKTogY2FjaGUgRE9NIGVsZW1lbnRzLlxuKi9cblxudmFyIGFubm90YXRpb25zID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuYW5ub3RhdGlvbnNfID0gW107XG59O1xuXG5hbm5vdGF0aW9ucy5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIFwiQW5ub3RhdGlvbnMgUGx1Z2luXCI7XG59O1xuXG5hbm5vdGF0aW9ucy5wcm90b3R5cGUuYWN0aXZhdGUgPSBmdW5jdGlvbihnKSB7XG4gIHJldHVybiB7XG4gICAgY2xlYXJDaGFydDogdGhpcy5jbGVhckNoYXJ0LFxuICAgIGRpZERyYXdDaGFydDogdGhpcy5kaWREcmF3Q2hhcnRcbiAgfTtcbn07XG5cbmFubm90YXRpb25zLnByb3RvdHlwZS5kZXRhY2hMYWJlbHMgPSBmdW5jdGlvbigpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmFubm90YXRpb25zXy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBhID0gdGhpcy5hbm5vdGF0aW9uc19baV07XG4gICAgaWYgKGEucGFyZW50Tm9kZSkgYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpO1xuICAgIHRoaXMuYW5ub3RhdGlvbnNfW2ldID0gbnVsbDtcbiAgfVxuICB0aGlzLmFubm90YXRpb25zXyA9IFtdO1xufTtcblxuYW5ub3RhdGlvbnMucHJvdG90eXBlLmNsZWFyQ2hhcnQgPSBmdW5jdGlvbihlKSB7XG4gIHRoaXMuZGV0YWNoTGFiZWxzKCk7XG59O1xuXG5hbm5vdGF0aW9ucy5wcm90b3R5cGUuZGlkRHJhd0NoYXJ0ID0gZnVuY3Rpb24oZSkge1xuICB2YXIgZyA9IGUuZHlncmFwaDtcblxuICAvLyBFYXJseSBvdXQgaW4gdGhlIChjb21tb24pIGNhc2Ugb2YgemVybyBhbm5vdGF0aW9ucy5cbiAgdmFyIHBvaW50cyA9IGcubGF5b3V0Xy5hbm5vdGF0ZWRfcG9pbnRzO1xuICBpZiAoIXBvaW50cyB8fCBwb2ludHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgdmFyIGNvbnRhaW5lckRpdiA9IGUuY2FudmFzLnBhcmVudE5vZGU7XG5cbiAgdmFyIGJpbmRFdnQgPSBmdW5jdGlvbihldmVudE5hbWUsIGNsYXNzRXZlbnROYW1lLCBwdCkge1xuICAgIHJldHVybiBmdW5jdGlvbihhbm5vdGF0aW9uX2V2ZW50KSB7XG4gICAgICB2YXIgYSA9IHB0LmFubm90YXRpb247XG4gICAgICBpZiAoYS5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpKSB7XG4gICAgICAgIGFbZXZlbnROYW1lXShhLCBwdCwgZywgYW5ub3RhdGlvbl9ldmVudCk7XG4gICAgICB9IGVsc2UgaWYgKGcuZ2V0T3B0aW9uKGNsYXNzRXZlbnROYW1lKSkge1xuICAgICAgICBnLmdldE9wdGlvbihjbGFzc0V2ZW50TmFtZSkoYSwgcHQsIGcsIGFubm90YXRpb25fZXZlbnQgKTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIC8vIEFkZCB0aGUgYW5ub3RhdGlvbnMgb25lLWJ5LW9uZS5cbiAgdmFyIGFyZWEgPSBlLmR5Z3JhcGguZ2V0QXJlYSgpO1xuXG4gIC8vIHgtY29vcmQgdG8gc3VtIG9mIHByZXZpb3VzIGFubm90YXRpb24ncyBoZWlnaHRzICh1c2VkIGZvciBzdGFja2luZykuXG4gIHZhciB4VG9Vc2VkSGVpZ2h0ID0ge307XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcCA9IHBvaW50c1tpXTtcbiAgICBpZiAocC5jYW52YXN4IDwgYXJlYS54IHx8IHAuY2FudmFzeCA+IGFyZWEueCArIGFyZWEudyB8fFxuICAgICAgICBwLmNhbnZhc3kgPCBhcmVhLnkgfHwgcC5jYW52YXN5ID4gYXJlYS55ICsgYXJlYS5oKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgYSA9IHAuYW5ub3RhdGlvbjtcbiAgICB2YXIgdGlja19oZWlnaHQgPSA2O1xuICAgIGlmIChhLmhhc093blByb3BlcnR5KFwidGlja0hlaWdodFwiKSkge1xuICAgICAgdGlja19oZWlnaHQgPSBhLnRpY2tIZWlnaHQ7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogZGVwcmVjYXRlIGF4aXNMYWJlbEZvbnRTaXplIGluIGZhdm9yIG9mIENTU1xuICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGRpdi5zdHlsZVsnZm9udFNpemUnXSA9IGcuZ2V0T3B0aW9uKCdheGlzTGFiZWxGb250U2l6ZScpICsgXCJweFwiO1xuICAgIHZhciBjbGFzc05hbWUgPSAnZHlncmFwaC1hbm5vdGF0aW9uJztcbiAgICBpZiAoIWEuaGFzT3duUHJvcGVydHkoJ2ljb24nKSkge1xuICAgICAgLy8gY2FtZWxDYXNlIGNsYXNzIG5hbWVzIGFyZSBkZXByZWNhdGVkLlxuICAgICAgY2xhc3NOYW1lICs9ICcgZHlncmFwaERlZmF1bHRBbm5vdGF0aW9uIGR5Z3JhcGgtZGVmYXVsdC1hbm5vdGF0aW9uJztcbiAgICB9XG4gICAgaWYgKGEuaGFzT3duUHJvcGVydHkoJ2Nzc0NsYXNzJykpIHtcbiAgICAgIGNsYXNzTmFtZSArPSBcIiBcIiArIGEuY3NzQ2xhc3M7XG4gICAgfVxuICAgIGRpdi5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG5cbiAgICB2YXIgd2lkdGggPSBhLmhhc093blByb3BlcnR5KCd3aWR0aCcpID8gYS53aWR0aCA6IDE2O1xuICAgIHZhciBoZWlnaHQgPSBhLmhhc093blByb3BlcnR5KCdoZWlnaHQnKSA/IGEuaGVpZ2h0IDogMTY7XG4gICAgaWYgKGEuaGFzT3duUHJvcGVydHkoJ2ljb24nKSkge1xuICAgICAgdmFyIGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgICBpbWcuc3JjID0gYS5pY29uO1xuICAgICAgaW1nLndpZHRoID0gd2lkdGg7XG4gICAgICBpbWcuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgZGl2LmFwcGVuZENoaWxkKGltZyk7XG4gICAgfSBlbHNlIGlmIChwLmFubm90YXRpb24uaGFzT3duUHJvcGVydHkoJ3Nob3J0VGV4dCcpKSB7XG4gICAgICBkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocC5hbm5vdGF0aW9uLnNob3J0VGV4dCkpO1xuICAgIH1cbiAgICB2YXIgbGVmdCA9IHAuY2FudmFzeCAtIHdpZHRoIC8gMjtcbiAgICBkaXYuc3R5bGUubGVmdCA9IGxlZnQgKyBcInB4XCI7XG4gICAgdmFyIGRpdlRvcCA9IDA7XG4gICAgaWYgKGEuYXR0YWNoQXRCb3R0b20pIHtcbiAgICAgIHZhciB5ID0gKGFyZWEueSArIGFyZWEuaCAtIGhlaWdodCAtIHRpY2tfaGVpZ2h0KTtcbiAgICAgIGlmICh4VG9Vc2VkSGVpZ2h0W2xlZnRdKSB7XG4gICAgICAgIHkgLT0geFRvVXNlZEhlaWdodFtsZWZ0XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHhUb1VzZWRIZWlnaHRbbGVmdF0gPSAwO1xuICAgICAgfVxuICAgICAgeFRvVXNlZEhlaWdodFtsZWZ0XSArPSAodGlja19oZWlnaHQgKyBoZWlnaHQpO1xuICAgICAgZGl2VG9wID0geTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGl2VG9wID0gcC5jYW52YXN5IC0gaGVpZ2h0IC0gdGlja19oZWlnaHQ7XG4gICAgfVxuICAgIGRpdi5zdHlsZS50b3AgPSBkaXZUb3AgKyBcInB4XCI7XG4gICAgZGl2LnN0eWxlLndpZHRoID0gd2lkdGggKyBcInB4XCI7XG4gICAgZGl2LnN0eWxlLmhlaWdodCA9IGhlaWdodCArIFwicHhcIjtcbiAgICBkaXYudGl0bGUgPSBwLmFubm90YXRpb24udGV4dDtcbiAgICBkaXYuc3R5bGUuY29sb3IgPSBnLmNvbG9yc01hcF9bcC5uYW1lXTtcbiAgICBkaXYuc3R5bGUuYm9yZGVyQ29sb3IgPSBnLmNvbG9yc01hcF9bcC5uYW1lXTtcbiAgICBhLmRpdiA9IGRpdjtcblxuICAgIGcuYWRkQW5kVHJhY2tFdmVudChkaXYsICdjbGljaycsXG4gICAgICAgIGJpbmRFdnQoJ2NsaWNrSGFuZGxlcicsICdhbm5vdGF0aW9uQ2xpY2tIYW5kbGVyJywgcCwgdGhpcykpO1xuICAgIGcuYWRkQW5kVHJhY2tFdmVudChkaXYsICdtb3VzZW92ZXInLFxuICAgICAgICBiaW5kRXZ0KCdtb3VzZU92ZXJIYW5kbGVyJywgJ2Fubm90YXRpb25Nb3VzZU92ZXJIYW5kbGVyJywgcCwgdGhpcykpO1xuICAgIGcuYWRkQW5kVHJhY2tFdmVudChkaXYsICdtb3VzZW91dCcsXG4gICAgICAgIGJpbmRFdnQoJ21vdXNlT3V0SGFuZGxlcicsICdhbm5vdGF0aW9uTW91c2VPdXRIYW5kbGVyJywgcCwgdGhpcykpO1xuICAgIGcuYWRkQW5kVHJhY2tFdmVudChkaXYsICdkYmxjbGljaycsXG4gICAgICAgIGJpbmRFdnQoJ2RibENsaWNrSGFuZGxlcicsICdhbm5vdGF0aW9uRGJsQ2xpY2tIYW5kbGVyJywgcCwgdGhpcykpO1xuXG4gICAgY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKGRpdik7XG4gICAgdGhpcy5hbm5vdGF0aW9uc18ucHVzaChkaXYpO1xuXG4gICAgdmFyIGN0eCA9IGUuZHJhd2luZ0NvbnRleHQ7XG4gICAgY3R4LnNhdmUoKTtcbiAgICBjdHguc3Ryb2tlU3R5bGUgPSBhLmhhc093blByb3BlcnR5KCd0aWNrQ29sb3InKSA/IGEudGlja0NvbG9yIDogZy5jb2xvcnNNYXBfW3AubmFtZV07XG4gICAgY3R4LmxpbmVXaWR0aCA9IGEuaGFzT3duUHJvcGVydHkoJ3RpY2tXaWR0aCcpID8gYS50aWNrV2lkdGggOiBnLmdldE9wdGlvbignc3Ryb2tlV2lkdGgnKTtcbiAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgaWYgKCFhLmF0dGFjaEF0Qm90dG9tKSB7XG4gICAgICBjdHgubW92ZVRvKHAuY2FudmFzeCwgcC5jYW52YXN5KTtcbiAgICAgIGN0eC5saW5lVG8ocC5jYW52YXN4LCBwLmNhbnZhc3kgLSAyIC0gdGlja19oZWlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgeSA9IGRpdlRvcCArIGhlaWdodDtcbiAgICAgIGN0eC5tb3ZlVG8ocC5jYW52YXN4LCB5KTtcbiAgICAgIGN0eC5saW5lVG8ocC5jYW52YXN4LCB5ICsgdGlja19oZWlnaHQpO1xuICAgIH1cbiAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgY3R4LnN0cm9rZSgpO1xuICAgIGN0eC5yZXN0b3JlKCk7XG4gIH1cbn07XG5cbmFubm90YXRpb25zLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZGV0YWNoTGFiZWxzKCk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBhbm5vdGF0aW9ucztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7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