UNPKG

@future-grid/fgp-graph

Version:

fgp-graph is a chart lib based on Dygraphs

156 lines (119 loc) 19.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var RectSelection = /** * rect selection plugin * @param onSelect callback func */ function RectSelection(onSelect) { var _this = this; _classCallCheck(this, RectSelection); this.onSelect = onSelect; _defineProperty(this, "g", void 0); _defineProperty(this, "canvas", void 0); _defineProperty(this, "drawable", false); _defineProperty(this, "mousePosition", void 0); _defineProperty(this, "activate", function (graph) { var _dygraph$graphDiv, _dygraph$graphDiv2, _dygraph$graphDiv3; var dygraph = _this.g = graph; _this.canvas.width = (_dygraph$graphDiv = dygraph.graphDiv) === null || _dygraph$graphDiv === void 0 ? void 0 : _dygraph$graphDiv.clientWidth; _this.canvas.height = (_dygraph$graphDiv2 = dygraph.graphDiv) === null || _dygraph$graphDiv2 === void 0 ? void 0 : _dygraph$graphDiv2.clientHeight; _this.canvas.setAttribute("style", "position:absolute;"); _this.canvas.style.display = "none"; // add canvas to graphDiv (_dygraph$graphDiv3 = dygraph.graphDiv) === null || _dygraph$graphDiv3 === void 0 ? void 0 : _dygraph$graphDiv3.appendChild(_this.canvas); console.log("".concat(_this.canvas.width, " ").concat(_this.canvas.height)); // init mouse event listener var ctx = _this.canvas.getContext("2d"); if (ctx) { _this.interactions(_this.canvas, dygraph, ctx); } }); _defineProperty(this, "interactions", function (canvas, g, ctx) { // mousedown canvas.addEventListener("mousedown", function (e) { _this.drawable = true; // set draw position _this.mousePosition = { x: e.offsetX, y: e.offsetY, startX: e.offsetX, startY: e.offsetY }; // canvas.style.cursor = "crosshair"; // clean draw area ctx === null || ctx === void 0 ? void 0 : ctx.clearRect(0, 0, g.width_, g.height_); }); // mousemove canvas.addEventListener("mousemove", function (e) { if (_this.drawable) { _this.mousePosition.x = e.offsetX; _this.mousePosition.y = e.offsetY; ctx.strokeStyle = "#FF0000"; ctx.lineWidth = 1; ctx.setLineDash([5, 10]); ctx.clearRect(0, 0, g.width_, g.height_); // draw rect ctx.strokeRect(_this.mousePosition.startX, _this.mousePosition.startY, _this.mousePosition.x - _this.mousePosition.startX, _this.mousePosition.y - _this.mousePosition.startY); } }); // mouseup canvas.addEventListener("mouseup", function (e) { _this.drawable = false; _this.canvas.style.cursor = "default"; var rect = _this.mousePosition; // reset start end var startX = rect.startX <= rect.x ? rect.startX : rect.x; var endX = rect.startX > rect.x ? rect.startX : rect.x; var startY = rect.startY <= rect.y ? rect.startY : rect.y; var endY = rect.startY > rect.y ? rect.startY : rect.y; var minDate = g.toDataXCoord(startX); var maxDate = g.toDataXCoord(endX); var maxY = g.toDataYCoord(startY); var minY = g.toDataYCoord(endY); var graphData = g.file_; var labels = g.getLabels(); var visibility = g.getOption('visibility'); var chosenSeries = []; // get points graphData.forEach(function (_d) { // check date range if (_d[0] instanceof Date && _d[0] >= minDate && _d[0] <= maxDate) { for (var i = 1; i < _d.length; i++) { if (_d[i] >= minY && _d[i] <= maxY && chosenSeries.indexOf(labels[i]) == -1) { if (visibility[i - 1]) { chosenSeries.push(labels[i]); } } } } }); // call callback if (_this.onSelect && chosenSeries.length > 0) { _this.onSelect(chosenSeries); } }); }); _defineProperty(this, "setCallback", function (onSelect) { onSelect ? _this.onSelect = onSelect : null; }); _defineProperty(this, "enable", function () { _this.canvas.style.display = ""; }); _defineProperty(this, "disable", function () { var ctx = _this.canvas.getContext("2d"); ctx === null || ctx === void 0 ? void 0 : ctx.clearRect(0, 0, _this.canvas.width, _this.canvas.height); _this.canvas.style.display = "none"; }); _defineProperty(this, "clear", function () { var ctx = _this.canvas.getContext("2d"); ctx === null || ctx === void 0 ? void 0 : ctx.clearRect(0, 0, _this.canvas.width, _this.canvas.height); }); _defineProperty(this, "destroy", function () { _this.canvas.remove(); }); this.canvas = document.createElement("canvas"); // init mouse position var this.mousePosition = { x: 0, y: 0, startX: 0, startY: 0 }; }; exports["default"] = RectSelection; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9leHRyYXMvdG9vbGJhci9SZWN0U2VsZWN0aW9uLnRzIl0sIm5hbWVzIjpbIlJlY3RTZWxlY3Rpb24iLCJvblNlbGVjdCIsImdyYXBoIiwiZHlncmFwaCIsImciLCJjYW52YXMiLCJ3aWR0aCIsImdyYXBoRGl2IiwiY2xpZW50V2lkdGgiLCJoZWlnaHQiLCJjbGllbnRIZWlnaHQiLCJzZXRBdHRyaWJ1dGUiLCJzdHlsZSIsImRpc3BsYXkiLCJhcHBlbmRDaGlsZCIsImNvbnNvbGUiLCJsb2ciLCJjdHgiLCJnZXRDb250ZXh0IiwiaW50ZXJhY3Rpb25zIiwiYWRkRXZlbnRMaXN0ZW5lciIsImUiLCJkcmF3YWJsZSIsIm1vdXNlUG9zaXRpb24iLCJ4Iiwib2Zmc2V0WCIsInkiLCJvZmZzZXRZIiwic3RhcnRYIiwic3RhcnRZIiwiY3Vyc29yIiwiY2xlYXJSZWN0Iiwid2lkdGhfIiwiaGVpZ2h0XyIsInN0cm9rZVN0eWxlIiwibGluZVdpZHRoIiwic2V0TGluZURhc2giLCJzdHJva2VSZWN0IiwicmVjdCIsImVuZFgiLCJlbmRZIiwibWluRGF0ZSIsInRvRGF0YVhDb29yZCIsIm1heERhdGUiLCJtYXhZIiwidG9EYXRhWUNvb3JkIiwibWluWSIsImdyYXBoRGF0YSIsImZpbGVfIiwibGFiZWxzIiwiZ2V0TGFiZWxzIiwidmlzaWJpbGl0eSIsImdldE9wdGlvbiIsImNob3NlblNlcmllcyIsImZvckVhY2giLCJfZCIsIkRhdGUiLCJpIiwibGVuZ3RoIiwiaW5kZXhPZiIsInB1c2giLCJyZW1vdmUiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0lBRXFCQSxhO0FBVWpCOzs7O0FBSUEsdUJBQW1CQyxRQUFuQixFQUErRDtBQUFBOztBQUFBOztBQUFBLE9BQTVDQSxRQUE0QyxHQUE1Q0EsUUFBNEM7O0FBQUE7O0FBQUE7O0FBQUEsb0NBUjVDLEtBUTRDOztBQUFBOztBQUFBLG9DQVdwRCxVQUFD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QUcsV0FBSCxZQUFBQSxHQUFHLENBQUVjLFNBQUwsQ0FBZSxDQUFmLEVBQWtCLENBQWxCLEVBQXFCLEtBQUksQ0FBQzFCLE1BQUwsQ0FBWUMsS0FBakMsRUFBd0MsS0FBSSxDQUFDRCxNQUFMLENBQVlJLE1BQXBEO0FBQ0gsR0FySThEOztBQUFBLG1DQXVJckQsWUFBTTtBQUNaLElBQUEsS0FBSSxDQUFDSixNQUFMLENBQVl3RCxNQUFaO0FBQ0gsR0F6SThEOztBQUMzRCxPQUFLeEQsTUFBTCxHQUFjeUQsUUFBUSxDQUFDQyxhQUFULENBQXVCLFFBQXZCLENBQWQsQ0FEMkQsQ0FFM0Q7O0FBQ0EsT0FBS3hDLGFBQUwsR0FBcUI7QUFDakJDLElBQUFBLENBQUMsRUFBRSxDQURjO0FBRWpCRSxJQUFBQSxDQUFDLEVBQUUsQ0FGYztBQUdqQkUsSUFBQUEsTUFBTSxFQUFFLENBSFM7QUFJakJDLElBQUFBLE1BQU0sRUFBRTtBQUpTLEdBQXJCO0FBTUgsQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEeWdyYXBoIGZyb20gXCJkeWdyYXBoc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWN0U2VsZWN0aW9uIHtcblxuICAgIHByaXZhdGUgZz86IER5Z3JhcGg7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG5cbiAgICBwcml2YXRlIGRyYXdhYmxlID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIG1vdXNlUG9zaXRpb246IHsgeDogbnVtYmVyLCB5OiBudW1iZXIsIHN0YXJ0WDogbnVtYmVyLCBzdGFydFk6IG51bWJlciB9O1xuXG4gICAgLyoqXG4gICAgICogcmVjdCBzZWxlY3Rpb24gcGx1Z2luXG4gICAgICogQHBhcmFtIG9uU2VsZWN0ICBjYWxsYmFjayBmdW5jXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHVibGljIG9uU2VsZWN0PzogKHNlcmllczogQXJyYXk8c3RyaW5nPikgPT4gdm9pZCkge1xuICAgICAgICB0aGlzLmNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgICAgIC8vIGluaXQgbW91c2UgcG9zaXRpb24gdmFyXG4gICAgICAgIHRoaXMubW91c2VQb3NpdGlvbiA9IHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgc3RhcnRYOiAwLFxuICAgICAgICAgICAgc3RhcnRZOiAwXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgYWN0aXZhdGUgPSAoZ3JhcGg6IER5Z3JhcGgpID0+IHtcbiAgICAgICAgY29uc3QgZHlncmFwaDogYW55ID0gdGhpcy5nID0gZ3JhcGg7XG5cbiAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSBkeWdyYXBoLmdyYXBoRGl2Py5jbGllbnRXaWR0aDtcbiAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gZHlncmFwaC5ncmFwaERpdj8uY2xpZW50SGVpZ2h0O1xuICAgICAgICB0aGlzLmNhbnZhcy5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBgcG9zaXRpb246YWJzb2x1dGU7YCk7XG4gICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgLy8gYWRkIGNhbnZhcyB0byBncmFwaERpdlxuICAgICAgICBkeWdyYXBoLmdyYXBoRGl2Py5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcyk7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke3RoaXMuY2FudmFzLndpZHRofSAke3RoaXMuY2FudmFzLmhlaWdodH1gKTtcblxuICAgICAgICAvLyBpbml0IG1vdXNlIGV2ZW50IGxpc3RlbmVyXG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgICAgaWYgKGN0eCkge1xuICAgICAgICAgICAgdGhpcy5pbnRlcmFjdGlvbnModGhpcy5jYW52YXMsIGR5Z3JhcGgsIGN0eCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG5cbiAgICBwcml2YXRlIGludGVyYWN0aW9ucyA9IChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCBnOiBhbnksIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKSA9PiB7XG4gICAgICAgIC8vIG1vdXNlZG93blxuICAgICAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCAoZTogTW91c2VFdmVudCkgPT4ge1xuXG4gICAgICAgICAgICB0aGlzLmRyYXdhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIHNldCBkcmF3IHBvc2l0aW9uXG4gICAgICAgICAgICB0aGlzLm1vdXNlUG9zaXRpb24gPSB7XG4gICAgICAgICAgICAgICAgeDogZS5vZmZzZXRYLFxuICAgICAgICAgICAgICAgIHk6IGUub2Zmc2V0WSxcbiAgICAgICAgICAgICAgICBzdGFydFg6IGUub2Zmc2V0WCxcbiAgICAgICAgICAgICAgICBzdGFydFk6IGUub2Zmc2V0WVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gXCJjcm9zc2hhaXJcIjtcbiAgICAgICAgICAgIC8vIGNsZWFuIGRyYXcgYXJlYVxuICAgICAgICAgICAgY3R4Py5jbGVhclJlY3QoMCwgMCwgZy53aWR0aF8sIGcuaGVpZ2h0Xyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIG1vdXNlbW92ZVxuICAgICAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZHJhd2FibGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vdXNlUG9zaXRpb24ueCA9IGUub2Zmc2V0WDtcbiAgICAgICAgICAgICAgICB0aGlzLm1vdXNlUG9zaXRpb24ueSA9IGUub2Zmc2V0WTtcblxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IFwiI0ZGMDAwMFwiO1xuICAgICAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSAxO1xuICAgICAgICAgICAgICAgIGN0eC5zZXRMaW5lRGFzaChbNSwgMTBdKTtcbiAgICAgICAgICAgICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIGcud2lkdGhfLCBnLmhlaWdodF8pO1xuICAgICAgICAgICAgICAgIC8vIGRyYXcgcmVjdFxuICAgICAgICAgICAgICAgIGN0eC5zdHJva2VSZWN0KHRoaXMubW91c2VQb3NpdGlvbi5zdGFydFgsIHRoaXMubW91c2VQb3NpdGlvbi5zdGFydFksIHRoaXMubW91c2VQb3NpdGlvbi54IC0gdGhpcy5tb3VzZVBvc2l0aW9uLnN0YXJ0WCwgdGhpcy5tb3VzZVBvc2l0aW9uLnkgLSB0aGlzLm1vdXNlUG9zaXRpb24uc3RhcnRZKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gbW91c2V1cFxuICAgICAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZHJhd2FibGUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLmN1cnNvciA9IFwiZGVmYXVsdFwiO1xuXG4gICAgICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5tb3VzZVBvc2l0aW9uO1xuICAgICAgICAgICAgLy8gcmVzZXQgc3RhcnQgZW5kXG4gICAgICAgICAgICBjb25zdCBzdGFydFggPSByZWN0LnN0YXJ0WCA8PSByZWN0LnggPyByZWN0LnN0YXJ0WCA6IHJlY3QueDtcbiAgICAgICAgICAgIGNvbnN0IGVuZFggPSByZWN0LnN0YXJ0WCA+IHJlY3QueCA/IHJlY3Quc3RhcnRYIDogcmVjdC54O1xuXG4gICAgICAgICAgICBjb25zdCBzdGFydFkgPSByZWN0LnN0YXJ0WSA8PSByZWN0LnkgPyByZWN0LnN0YXJ0WSA6IHJlY3QueTtcbiAgICAgICAgICAgIGNvbnN0IGVuZFkgPSByZWN0LnN0YXJ0WSA+IHJlY3QueSA/IHJlY3Quc3RhcnRZIDogcmVjdC55O1xuXG4gICAgICAgICAgICBjb25zdCBtaW5EYXRlID0gZy50b0RhdGFYQ29vcmQoc3RhcnRYKTtcbiAgICAgICAgICAgIGNvbnN0IG1heERhdGUgPSBnLnRvRGF0YVhDb29yZChlbmRYKTtcblxuICAgICAgICAgICAgY29uc3QgbWF4WSA9IGcudG9EYXRhWUNvb3JkKHN0YXJ0WSk7XG4gICAgICAgICAgICBjb25zdCBtaW5ZID0gZy50b0RhdGFZQ29vcmQoZW5kWSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGdyYXBoRGF0YSA9IGcuZmlsZV87XG4gICAgICAgICAgICBjb25zdCBsYWJlbHMgPSBnLmdldExhYmVscygpO1xuICAgICAgICAgICAgY29uc3QgdmlzaWJpbGl0eSA9IGcuZ2V0T3B0aW9uKCd2aXNpYmlsaXR5Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNob3NlblNlcmllczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgICAgICAgICAgLy8gZ2V0IHBvaW50c1xuICAgICAgICAgICAgZ3JhcGhEYXRhLmZvckVhY2goKF9kOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBkYXRlIHJhbmdlXG4gICAgICAgICAgICAgICAgaWYgKF9kWzBdIGluc3RhbmNlb2YgRGF0ZSAmJiBfZFswXSA+PSBtaW5EYXRlICYmIF9kWzBdIDw9IG1heERhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBfZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9kW2ldID49IG1pblkgJiYgX2RbaV0gPD0gbWF4WSAmJiBjaG9zZW5TZXJpZXMuaW5kZXhPZihsYWJlbHNbaV0pID09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpc2liaWxpdHlbaSAtIDFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob3NlblNlcmllcy5wdXNoKGxhYmVsc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIGNhbGwgY2FsbGJhY2tcbiAgICAgICAgICAgIGlmICh0aGlzLm9uU2VsZWN0ICYmIGNob3NlblNlcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblNlbGVjdChjaG9zZW5TZXJpZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIH07XG5cblxuICAgIC8qKlxuICAgICAqIGR5bmFtaWMgc2V0IGNhbGxiYWNrIGZ1bmNcbiAgICAgKiBAcGFyYW0gb25TZWxlY3RcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0Q2FsbGJhY2sgPSAob25TZWxlY3Q/OiAoc2VyaWVzOiBBcnJheTxzdHJpbmc+KSA9PiB2b2lkKSA9PiB7XG4gICAgICAgIG9uU2VsZWN0ID8gdGhpcy5vblNlbGVjdCA9IG9uU2VsZWN0IDogbnVsbDtcbiAgICB9O1xuXG5cbiAgICBlbmFibGUgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuICAgIH07XG5cbiAgICBkaXNhYmxlID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjdHggPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICAgIGN0eD8uY2xlYXJSZWN0KDAsIDAsIHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHQpO1xuICAgICAgICB0aGlzLmNhbnZhcy5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgfTtcblxuXG4gICAgY2xlYXIgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgICAgY3R4Py5jbGVhclJlY3QoMCwgMCwgdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodCk7XG4gICAgfTtcblxuICAgIGRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2FudmFzLnJlbW92ZSgpO1xuICAgIH07XG5cbn0iXX0=