UNPKG

@qogni/dygraphs

Version:

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

157 lines (148 loc) 21.5 kB
/** * @license * Copyright 2012 Dan Vanderkam (danvdk@gmail.com) * MIT-licenced: https://opensource.org/licenses/MIT */ /*global Dygraph:false */ "use strict"; /** 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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