From 8c7279561d54e2d7d13b36c1208ecd9c4438f2b9 Mon Sep 17 00:00:00 2001 From: Ivan Mikheykin Date: Thu, 2 Jul 2020 17:48:23 +0300 Subject: [PATCH] ref: one codebase for hover tooltip and freezed tooltip - rename variables for URL template, use templateSrv to render URL links - fix visibility of tooltip items and url template help popup whe the light theme is used - rework Tooltip settings pane, organize tooltip editor fields - rename properties in panel config, implement migration logic for legacy configuration - close button for the frozen tooltip - use relative positioning for proper page scrolling --- dist/color_legend.js.map | 2 +- dist/css/statusmap.dark.css | 23 +- dist/css/statusmap.dark.css.map | 2 +- dist/css/statusmap.light.css | 23 +- dist/css/statusmap.light.css.map | 2 +- dist/extra_series_format.js | 28 - dist/extra_series_format.js.map | 1 - dist/module.js | 338 +--- dist/module.js.map | 2 +- dist/options_editor.js | 101 +- dist/options_editor.js.map | 2 +- dist/panel_config_migration.js | 165 ++ dist/panel_config_migration.js.map | 1 + dist/partials/options_editor.html | 137 +- dist/partials/tooltip_editor.html | 120 ++ dist/plugin.json | 1 - dist/rendering.js | 53 +- dist/rendering.js.map | 2 +- dist/specs/panel_config_migration.js | 166 ++ dist/specs/panel_config_migration.js.map | 1 + dist/tooltip.js | 228 ++- dist/tooltip.js.map | 2 +- dist/tooltip_editor.js | 95 + dist/tooltip_editor.js.map | 1 + dist/tooltipextraseries.js | 242 --- dist/tooltipextraseries.js.map | 1 - example/k8s/dashboard.json | 32 +- jest.config.js | 13 + package-lock.json | 2226 +++++++++++++++++++++- package.json | 8 +- src/color_legend.ts | 2 +- src/css/_statusmap.scss | 29 +- src/extra_series_format.ts | 9 - src/module.ts | 294 +-- src/options_editor.ts | 54 +- src/panel_config_migration.ts | 115 ++ src/partials/options_editor.html | 137 +- src/partials/tooltip_editor.html | 120 ++ src/plugin.json | 1 - src/rendering.ts | 43 +- src/specs/panel_config_migration.test.ts | 168 ++ src/tooltip.ts | 207 +- src/tooltip_editor.ts | 61 + src/tooltipextraseries.ts | 222 --- 44 files changed, 3967 insertions(+), 1513 deletions(-) delete mode 100644 dist/extra_series_format.js delete mode 100644 dist/extra_series_format.js.map create mode 100644 dist/panel_config_migration.js create mode 100644 dist/panel_config_migration.js.map create mode 100644 dist/partials/tooltip_editor.html create mode 100644 dist/specs/panel_config_migration.js create mode 100644 dist/specs/panel_config_migration.js.map create mode 100644 dist/tooltip_editor.js create mode 100644 dist/tooltip_editor.js.map delete mode 100644 dist/tooltipextraseries.js delete mode 100644 dist/tooltipextraseries.js.map create mode 100644 jest.config.js delete mode 100644 src/extra_series_format.ts create mode 100644 src/panel_config_migration.ts create mode 100644 src/partials/tooltip_editor.html create mode 100644 src/specs/panel_config_migration.test.ts create mode 100644 src/tooltip_editor.ts delete mode 100644 src/tooltipextraseries.ts diff --git a/dist/color_legend.js.map b/dist/color_legend.js.map index 0ac8624..b028591 100644 --- a/dist/color_legend.js.map +++ b/dist/color_legend.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/color_legend.ts"],"names":["drawColorLegend","elem","colorScheme","rangeFrom","rangeTo","maxValue","minValue","legendElem","$","find","legend","d3","select","get","clearLegend","legendWidth","Math","floor","outerWidth","legendHeight","attr","rangeStep","LEGEND_STEP_WIDTH","widthFactor","valuesRange","range","colorScale","getColorScale","selectAll","data","enter","append","d","drawLegendValues","drawOpacityLegend","options","opacityScale","getOpacityScale","cardColor","style","drawDiscreteColorLegend","colorOptions","discreteExtraSeries","thresholds","tooltips","_","map","tr","tooltip","valuesNumber","length","$heatmap","parent","graphWidthAttr","graphWidth","parseInt","textWidth","text","each","i","thisWidth","getBBox","width","push","remove","min","max","itemWidth","getDiscreteColor","drawDiscreteLegendValues","childNodes","legendValueScale","scaleLinear","domain","ticks","buildLegendTicks","xAxis","axisBottom","tickValues","tickSize","colorRect","posY","getSvgElemHeight","posX","getSvgElemX","call","thresholdValues","thresholdTooltips","value","tickFormat","t","v","undefined","drawSimpleColorLegend","drawSimpleOpacityLegend","legendOpacityScale","scalePow","exponent","empty","colorInterpolator","d3ScaleChromatic","colorScaleInverted","invert","contextSrv","user","lightTheme","start","end","scaleSequential","svgElem","x","baseVal","height","tickStepSize","tickStep","ticksNum","round","current","isValueCloseTo","sortBy","uniq","val","valueTo","step","diff","abs","coreModule","directive","restrict","template","link","scope","attrs","ctrl","panel","render","events","on","color","mode","colorSchemes","show","bucketMatrix","noDatapoints"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport $ from 'jquery';\nimport d3 from 'd3';\nimport * as d3ScaleChromatic from './libs/d3-scale-chromatic/index';\nimport {contextSrv} from 'app/core/core';\nimport {tickStep} from 'app/core/utils/ticks';\nimport coreModule from 'app/core/core_module';\nimport { BucketMatrix } from './statusmap_data';\n\nconst LEGEND_STEP_WIDTH = 2;\n\n/**\n * Bigger color legend for opacity and spectrum modes editor.\n */\ncoreModule.directive('optionsColorLegend', function() {\n return {\n restrict: 'E',\n template: '
',\n link: function(scope, elem, attrs) {\n let ctrl = scope.ctrl;\n let panel = scope.ctrl.panel;\n\n render();\n\n ctrl.events.on('render', function() {\n render();\n });\n\n function render() {\n let legendElem = $(elem).find('svg');\n let legendWidth = Math.floor(legendElem.outerWidth());\n\n if (panel.color.mode === 'spectrum') {\n let colorScheme = _.find(ctrl.colorSchemes, {value: panel.color.colorScheme});\n let colorScale = getColorScale(colorScheme, legendWidth);\n drawSimpleColorLegend(elem, colorScale);\n } else if (panel.color.mode === 'opacity') {\n let colorOptions = panel.color;\n drawSimpleOpacityLegend(elem, colorOptions);\n }\n }\n }\n };\n});\n\n/**\n * Graph legend with values.\n */\ncoreModule.directive('statusHeatmapLegend', function() {\n return {\n restrict: 'E',\n template: '
',\n link: function(scope, elem, attrs) {\n let ctrl = scope.ctrl;\n let panel = scope.ctrl.panel;\n\n render();\n ctrl.events.on('render', function() {\n render();\n });\n\n function render() {\n clearLegend(elem);\n if (!ctrl.panel.legend.show) {\n return;\n }\n if (ctrl.bucketMatrix) {\n let rangeFrom = ctrl.bucketMatrix.minValue;\n let rangeTo = ctrl.bucketMatrix.maxValue;\n let maxValue = panel.color.max || rangeTo;\n let minValue = panel.color.min || rangeFrom;\n\n if (ctrl.bucketMatrix.noDatapoints) {\n if (!panel.color.max) {\n rangeTo = maxValue = 100;\n } else {\n rangeTo = 100;\n }\n if (!panel.color.min) {\n rangeFrom = minValue = 0;\n } else {\n rangeFrom = 0;\n }\n }\n\n // console.log(\"legend state:\", {\n // rangeFrom: rangeFrom,\n // rangeTo: rangeTo,\n // maxValue: maxValue,\n // minValue: minValue,\n // colorMode: panel.color.mode\n // });\n\n if (panel.color.mode === 'spectrum') {\n let colorScheme = _.find(ctrl.colorSchemes, {value: panel.color.colorScheme});\n drawColorLegend(elem, colorScheme, rangeFrom, rangeTo, maxValue, minValue);\n } else if (panel.color.mode === 'opacity') {\n let colorOptions = panel.color;\n drawOpacityLegend(elem, colorOptions, rangeFrom, rangeTo, maxValue, minValue);\n } else if (panel.color.mode === 'discrete') {\n let colorOptions = panel.color;\n drawDiscreteColorLegend(elem, colorOptions, ctrl.discreteExtraSeries);\n }\n }\n }\n }\n };\n});\n\nfunction drawColorLegend(elem, colorScheme, rangeFrom: number, rangeTo:number, maxValue: number, minValue:number) {\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n clearLegend(elem);\n\n let legendWidth = Math.floor(legendElem.outerWidth()) - 30; // narrow legendWidth by 30px to get space for first and last tick values\n let legendHeight = legendElem.attr(\"height\");\n\n let rangeStep = (rangeTo - rangeFrom) / (legendWidth/LEGEND_STEP_WIDTH);\n // width in pixels in legend space of unit segment in range space\n // rangeStep * witdhFactor == width in pixels of one rangeStep\n let widthFactor = legendWidth / (rangeTo - rangeFrom);\n let valuesRange = d3.range(rangeFrom, rangeTo, rangeStep);\n\n let colorScale = getColorScale(colorScheme, maxValue, minValue);\n legend.selectAll(\".status-heatmap-color-legend-rect\")\n .data(valuesRange)\n .enter().append(\"rect\")\n // translate from range space into pixels\n // and shift all rectangles to the right by 10\n .attr(\"x\", d => ((d - rangeFrom) * widthFactor)+10)\n .attr(\"y\", 0)\n // rectangles are slightly overlaped to prevent gaps\n .attr(\"width\", LEGEND_STEP_WIDTH+1)\n .attr(\"height\", legendHeight)\n .attr(\"stroke-width\", 0)\n .attr(\"fill\", d => colorScale(d));\n\n drawLegendValues(elem, colorScale, rangeFrom, rangeTo, maxValue, minValue, legendWidth);\n}\n\nfunction drawOpacityLegend(elem, options, rangeFrom, rangeTo, maxValue, minValue) {\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n clearLegend(elem);\n\n let legendWidth = Math.floor(legendElem.outerWidth()) - 30; // narrow legendWidth by 30px to get space for first and last tick values\n let legendHeight = legendElem.attr(\"height\");\n\n let rangeStep = (rangeTo - rangeFrom) / (legendWidth/LEGEND_STEP_WIDTH);\n // width in pixels in legend space of unit segment in range space\n // rangeStep * witdhFactor == width in pixels of one rangeStep\n let widthFactor = legendWidth / (rangeTo - rangeFrom);\n let valuesRange = d3.range(rangeFrom, rangeTo, rangeStep);\n\n let opacityScale = getOpacityScale(options, maxValue, minValue);\n legend.selectAll(\".status-heatmap-opacity-legend-rect\")\n .data(valuesRange)\n .enter().append(\"rect\")\n // translate from range space into pixels\n // and shift all rectangles to the right by 10\n .attr(\"x\", d => d * widthFactor+10)\n .attr(\"y\", 0)\n // rectangles are slightly overlaped to prevent gaps\n .attr(\"width\", LEGEND_STEP_WIDTH+1)\n .attr(\"height\", legendHeight)\n .attr(\"stroke-width\", 0)\n .attr(\"fill\", options.cardColor)\n .style(\"opacity\", d => opacityScale(d));\n\n drawLegendValues(elem, opacityScale, rangeFrom, rangeTo, maxValue, minValue, legendWidth);\n}\n\nfunction drawDiscreteColorLegend(elem, colorOptions, discreteExtraSeries) {\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n clearLegend(elem);\n\n let thresholds = colorOptions.thresholds;\n let tooltips = _.map(thresholds, tr => tr.tooltip);\n let valuesNumber = thresholds.length;\n\n // graph width as a fallback\n const $heatmap = $(elem).parent().parent().parent().find('.statusmap-panel');\n const graphWidthAttr = $heatmap.find('svg').attr(\"width\");\n let graphWidth = parseInt(graphWidthAttr);\n\n\n // calculate max width of tooltip and use it as width for each item\n let textWidth:number[] = [];\n legend.selectAll(\".hidden-texts\")\n .data(tooltips)\n .enter().append(\"text\")\n .attr(\"class\", \"axis tick hidden-texts\")\n .attr(\"font-family\", \"sans-serif\")\n .text(d => d)\n .each(function(d,i) {\n let thisWidth = this.getBBox().width;\n textWidth.push(thisWidth);\n });\n legend.selectAll(\".hidden-texts\").remove();\n\n let legendWidth = Math.floor(_.min([\n graphWidth - 30,\n (_.max(textWidth)! + 3) * valuesNumber,\n ])!);\n legendElem.attr(\"width\", legendWidth);\n\n let legendHeight = legendElem.attr(\"height\");\n\n let itemWidth = Math.floor(legendWidth / valuesNumber);\n let valuesRange = d3.range(valuesNumber); // from 0 to valuesNumber-1\n\n legend.selectAll(\".status-heatmap-color-legend-rect\")\n .data(valuesRange)\n .enter().append(\"rect\")\n .attr(\"x\", d => d*itemWidth)\n .attr(\"y\", 0)\n .attr(\"width\", itemWidth + 1) // Overlap rectangles to prevent gaps\n .attr(\"height\", legendHeight)\n .attr(\"stroke-width\", 0)\n .attr(\"fill\", d => discreteExtraSeries.getDiscreteColor(d));\n\n drawDiscreteLegendValues(elem, colorOptions, legendWidth);\n}\n\n\nfunction drawLegendValues(elem, colorScale, rangeFrom: number, rangeTo: number, maxValue: number, minValue: number, legendWidth: number) {\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n\n if (legendWidth <= 0 || legendElem.get(0).childNodes.length === 0) {\n return;\n }\n\n let legendValueScale = d3.scaleLinear()\n .domain([rangeFrom, rangeTo])\n .range([0, legendWidth]);\n\n let ticks = buildLegendTicks(rangeFrom, rangeTo, maxValue, minValue);\n let xAxis = d3.axisBottom(legendValueScale)\n .tickValues(ticks)\n .tickSize(2);\n\n let colorRect = legendElem.find(\":first-child\");\n let posY = getSvgElemHeight(legendElem) + 2;\n let posX = getSvgElemX(colorRect);\n\n d3.select(legendElem.get(0)).append(\"g\")\n .attr(\"class\", \"axis\")\n .attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\")\n .call(xAxis);\n\n legend.select(\".axis\").select(\".domain\").remove();\n}\n\nfunction drawDiscreteLegendValues(elem, colorOptions, legendWidth) {\n let thresholds = colorOptions.thresholds;\n\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n\n if (legendWidth <= 0 || legendElem.get(0).childNodes.length === 0) {\n return;\n }\n\n let valuesNumber = thresholds.length;\n let rangeStep = Math.floor(legendWidth / valuesNumber);\n let valuesRange = d3.range(0, legendWidth, rangeStep);\n\n\n let legendValueScale = d3.scaleLinear()\n .domain([0, valuesNumber])\n .range([0, legendWidth]);\n\n let thresholdValues = [];\n let thresholdTooltips = [];\n for (let i = 0; i < thresholds.length; i++) {\n thresholdValues.push(thresholds[i].value);\n thresholdTooltips.push(thresholds[i].tooltip);\n }\n\n let xAxis = d3.axisBottom(legendValueScale)\n .tickValues(d3.range(0, valuesNumber, 1)) //thresholdValues)\n .tickSize(2)\n .tickFormat((t) => {\n let i = Math.floor(t);\n let v = thresholdTooltips[i];\n if (v != undefined) {\n return \"\"+v;\n } else {\n v = thresholdValues[i];\n if (v != undefined) {\n return \"\"+v;\n } else {\n return \"n/a\";\n }\n }\n });\n\n let colorRect = legendElem.find(\":first-child\");\n let posY = getSvgElemHeight(legendElem) + 2;\n let posX = getSvgElemX(colorRect) + Math.floor(rangeStep/2);\n\n d3.select(legendElem.get(0)).append(\"g\")\n .attr(\"class\", \"axis\")\n .attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\")\n .call(xAxis);\n\n legend.select(\".axis\").select(\".domain\").remove();\n}\n\nfunction drawSimpleColorLegend(elem, colorScale) {\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n clearLegend(elem);\n\n let legendWidth = Math.floor(legendElem.outerWidth());\n let legendHeight = legendElem.attr(\"height\");\n\n if (legendWidth) {\n let valuesRange = d3.range(0, legendWidth, LEGEND_STEP_WIDTH);\n\n legend.selectAll(\".status-heatmap-color-legend-rect\")\n .data(valuesRange)\n .enter().append(\"rect\")\n .attr(\"x\", d => d)\n .attr(\"y\", 0)\n .attr(\"width\", LEGEND_STEP_WIDTH + 1) // Overlap rectangles to prevent gaps\n .attr(\"height\", legendHeight)\n .attr(\"stroke-width\", 0)\n .attr(\"fill\", d => colorScale(d));\n }\n}\n\nfunction drawSimpleOpacityLegend(elem, options) {\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n clearLegend(elem);\n\n let legendWidth = Math.floor(legendElem.outerWidth());\n let legendHeight = legendElem.attr(\"height\");\n\n if (legendWidth) {\n let legendOpacityScale;\n if (options.colorScale === 'linear') {\n legendOpacityScale = d3.scaleLinear()\n .domain([0, legendWidth])\n .range([0, 1]);\n } else if (options.colorScale === 'sqrt') {\n legendOpacityScale = d3.scalePow().exponent(options.exponent)\n .domain([0, legendWidth])\n .range([0, 1]);\n }\n\n let valuesRange = d3.range(0, legendWidth, LEGEND_STEP_WIDTH);\n\n legend.selectAll(\".status-heatmap-opacity-legend-rect\")\n .data(valuesRange)\n .enter().append(\"rect\")\n .attr(\"x\", d => d)\n .attr(\"y\", 0)\n .attr(\"width\", LEGEND_STEP_WIDTH+1)\n .attr(\"height\", legendHeight)\n .attr(\"stroke-width\", 0)\n .attr(\"fill\", options.cardColor)\n .style(\"opacity\", d => legendOpacityScale(d));\n }\n}\n\n\nfunction clearLegend(elem) {\n let legendElem = $(elem).find('svg');\n legendElem.empty();\n}\n\nfunction getColorScale(colorScheme, maxValue, minValue = 0) {\n let colorInterpolator = d3ScaleChromatic[colorScheme.value];\n let colorScaleInverted = colorScheme.invert === 'always' ||\n (colorScheme.invert === 'dark' && !contextSrv.user.lightTheme);\n\n let start = colorScaleInverted ? maxValue : minValue;\n let end = colorScaleInverted ? minValue : maxValue;\n\n return d3.scaleSequential(colorInterpolator).domain([start, end]);\n}\n\nfunction getOpacityScale(options, maxValue, minValue = 0) {\n let legendOpacityScale;\n if (options.colorScale === 'linear') {\n legendOpacityScale = d3.scaleLinear()\n .domain([minValue, maxValue])\n .range([0, 1]);\n } else if (options.colorScale === 'sqrt') {\n legendOpacityScale = d3.scalePow().exponent(options.exponent)\n .domain([minValue, maxValue])\n .range([0, 1]);\n }\n return legendOpacityScale;\n}\n\nfunction getSvgElemX(elem) {\n let svgElem = elem.get(0);\n if (svgElem && svgElem.x && svgElem.x.baseVal) {\n return svgElem.x.baseVal.value;\n } else {\n return 0;\n }\n}\n\nfunction getSvgElemHeight(elem) {\n let svgElem = elem.get(0);\n if (svgElem && svgElem.height && svgElem.height.baseVal) {\n return svgElem.height.baseVal.value;\n } else {\n return 0;\n }\n}\n\nfunction buildLegendTicks(rangeFrom, rangeTo, maxValue, minValue) {\n let range = rangeTo - rangeFrom;\n let tickStepSize = tickStep(rangeFrom, rangeTo, 3);\n let ticksNum = Math.round(range / tickStepSize);\n let ticks:any = [];\n\n for (let i = 0; i < ticksNum; i++) {\n let current = tickStepSize * i + rangeFrom;\n // Add user-defined min and max if it had been set\n if (isValueCloseTo(minValue, current, tickStepSize)) {\n ticks.push(minValue);\n continue;\n } else if (minValue < current) {\n ticks.push(minValue);\n }\n if (isValueCloseTo(maxValue, current, tickStepSize)) {\n ticks.push(maxValue);\n continue;\n } else if (maxValue < current) {\n ticks.push(maxValue);\n }\n ticks.push(current);\n }\n if (!isValueCloseTo(maxValue, rangeTo, tickStepSize)) {\n ticks.push(maxValue);\n }\n ticks.push(rangeTo);\n ticks = _.sortBy(_.uniq(ticks));\n return ticks;\n}\n\nfunction isValueCloseTo(val, valueTo, step) {\n let diff = Math.abs(val - valueTo);\n return diff < step * 0.3;\n}\n"],"file":"color_legend.js"} \ No newline at end of file +{"version":3,"sources":["../src/color_legend.ts"],"names":["drawColorLegend","elem","colorScheme","rangeFrom","rangeTo","maxValue","minValue","legendElem","$","find","legend","d3","select","get","clearLegend","legendWidth","Math","floor","outerWidth","legendHeight","attr","rangeStep","LEGEND_STEP_WIDTH","widthFactor","valuesRange","range","colorScale","getColorScale","selectAll","data","enter","append","d","drawLegendValues","drawOpacityLegend","options","opacityScale","getOpacityScale","cardColor","style","drawDiscreteColorLegend","colorOptions","discreteExtraSeries","thresholds","tooltips","_","map","tr","tooltip","valuesNumber","length","$heatmap","parent","graphWidthAttr","graphWidth","parseInt","textWidth","text","each","i","thisWidth","getBBox","width","push","remove","min","max","itemWidth","getDiscreteColor","drawDiscreteLegendValues","childNodes","legendValueScale","scaleLinear","domain","ticks","buildLegendTicks","xAxis","axisBottom","tickValues","tickSize","colorRect","posY","getSvgElemHeight","posX","getSvgElemX","call","thresholdValues","thresholdTooltips","value","tickFormat","t","v","undefined","drawSimpleColorLegend","drawSimpleOpacityLegend","legendOpacityScale","scalePow","exponent","empty","colorInterpolator","d3ScaleChromatic","colorScaleInverted","invert","contextSrv","user","lightTheme","start","end","scaleSequential","svgElem","x","baseVal","height","tickStepSize","tickStep","ticksNum","round","current","isValueCloseTo","sortBy","uniq","val","valueTo","step","diff","abs","coreModule","directive","restrict","template","link","scope","attrs","ctrl","panel","render","events","on","color","mode","colorSchemes","show","bucketMatrix","noDatapoints"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport $ from 'jquery';\nimport d3 from 'd3';\nimport * as d3ScaleChromatic from './libs/d3-scale-chromatic/index';\nimport {contextSrv} from 'app/core/core';\nimport {tickStep} from 'app/core/utils/ticks';\nimport coreModule from 'app/core/core_module';\nimport { BucketMatrix } from './statusmap_data';\n\nconst LEGEND_STEP_WIDTH = 2;\n\n/**\n * Bigger color legend for opacity and spectrum modes editor.\n */\ncoreModule.directive('optionsColorLegend', function() {\n return {\n restrict: 'E',\n template: '
',\n link: function(scope: any, elem, attrs) {\n let ctrl = scope.ctrl;\n let panel = scope.ctrl.panel;\n\n render();\n\n ctrl.events.on('render', function() {\n render();\n });\n\n function render() {\n let legendElem = $(elem).find('svg');\n let legendWidth = Math.floor(legendElem.outerWidth());\n\n if (panel.color.mode === 'spectrum') {\n let colorScheme = _.find(ctrl.colorSchemes, {value: panel.color.colorScheme});\n let colorScale = getColorScale(colorScheme, legendWidth);\n drawSimpleColorLegend(elem, colorScale);\n } else if (panel.color.mode === 'opacity') {\n let colorOptions = panel.color;\n drawSimpleOpacityLegend(elem, colorOptions);\n }\n }\n }\n };\n});\n\n/**\n * Graph legend with values.\n */\ncoreModule.directive('statusHeatmapLegend', function() {\n return {\n restrict: 'E',\n template: '
',\n link: function(scope, elem, attrs) {\n let ctrl = scope.ctrl;\n let panel = scope.ctrl.panel;\n\n render();\n ctrl.events.on('render', function() {\n render();\n });\n\n function render() {\n clearLegend(elem);\n if (!ctrl.panel.legend.show) {\n return;\n }\n if (ctrl.bucketMatrix) {\n let rangeFrom = ctrl.bucketMatrix.minValue;\n let rangeTo = ctrl.bucketMatrix.maxValue;\n let maxValue = panel.color.max || rangeTo;\n let minValue = panel.color.min || rangeFrom;\n\n if (ctrl.bucketMatrix.noDatapoints) {\n if (!panel.color.max) {\n rangeTo = maxValue = 100;\n } else {\n rangeTo = 100;\n }\n if (!panel.color.min) {\n rangeFrom = minValue = 0;\n } else {\n rangeFrom = 0;\n }\n }\n\n // console.log(\"legend state:\", {\n // rangeFrom: rangeFrom,\n // rangeTo: rangeTo,\n // maxValue: maxValue,\n // minValue: minValue,\n // colorMode: panel.color.mode\n // });\n\n if (panel.color.mode === 'spectrum') {\n let colorScheme = _.find(ctrl.colorSchemes, {value: panel.color.colorScheme});\n drawColorLegend(elem, colorScheme, rangeFrom, rangeTo, maxValue, minValue);\n } else if (panel.color.mode === 'opacity') {\n let colorOptions = panel.color;\n drawOpacityLegend(elem, colorOptions, rangeFrom, rangeTo, maxValue, minValue);\n } else if (panel.color.mode === 'discrete') {\n let colorOptions = panel.color;\n drawDiscreteColorLegend(elem, colorOptions, ctrl.discreteExtraSeries);\n }\n }\n }\n }\n };\n});\n\nfunction drawColorLegend(elem, colorScheme, rangeFrom: number, rangeTo:number, maxValue: number, minValue:number) {\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n clearLegend(elem);\n\n let legendWidth = Math.floor(legendElem.outerWidth()) - 30; // narrow legendWidth by 30px to get space for first and last tick values\n let legendHeight = legendElem.attr(\"height\");\n\n let rangeStep = (rangeTo - rangeFrom) / (legendWidth/LEGEND_STEP_WIDTH);\n // width in pixels in legend space of unit segment in range space\n // rangeStep * witdhFactor == width in pixels of one rangeStep\n let widthFactor = legendWidth / (rangeTo - rangeFrom);\n let valuesRange = d3.range(rangeFrom, rangeTo, rangeStep);\n\n let colorScale = getColorScale(colorScheme, maxValue, minValue);\n legend.selectAll(\".status-heatmap-color-legend-rect\")\n .data(valuesRange)\n .enter().append(\"rect\")\n // translate from range space into pixels\n // and shift all rectangles to the right by 10\n .attr(\"x\", d => ((d - rangeFrom) * widthFactor)+10)\n .attr(\"y\", 0)\n // rectangles are slightly overlaped to prevent gaps\n .attr(\"width\", LEGEND_STEP_WIDTH+1)\n .attr(\"height\", legendHeight)\n .attr(\"stroke-width\", 0)\n .attr(\"fill\", d => colorScale(d));\n\n drawLegendValues(elem, colorScale, rangeFrom, rangeTo, maxValue, minValue, legendWidth);\n}\n\nfunction drawOpacityLegend(elem, options, rangeFrom, rangeTo, maxValue, minValue) {\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n clearLegend(elem);\n\n let legendWidth = Math.floor(legendElem.outerWidth()) - 30; // narrow legendWidth by 30px to get space for first and last tick values\n let legendHeight = legendElem.attr(\"height\");\n\n let rangeStep = (rangeTo - rangeFrom) / (legendWidth/LEGEND_STEP_WIDTH);\n // width in pixels in legend space of unit segment in range space\n // rangeStep * witdhFactor == width in pixels of one rangeStep\n let widthFactor = legendWidth / (rangeTo - rangeFrom);\n let valuesRange = d3.range(rangeFrom, rangeTo, rangeStep);\n\n let opacityScale = getOpacityScale(options, maxValue, minValue);\n legend.selectAll(\".status-heatmap-opacity-legend-rect\")\n .data(valuesRange)\n .enter().append(\"rect\")\n // translate from range space into pixels\n // and shift all rectangles to the right by 10\n .attr(\"x\", d => d * widthFactor+10)\n .attr(\"y\", 0)\n // rectangles are slightly overlaped to prevent gaps\n .attr(\"width\", LEGEND_STEP_WIDTH+1)\n .attr(\"height\", legendHeight)\n .attr(\"stroke-width\", 0)\n .attr(\"fill\", options.cardColor)\n .style(\"opacity\", d => opacityScale(d));\n\n drawLegendValues(elem, opacityScale, rangeFrom, rangeTo, maxValue, minValue, legendWidth);\n}\n\nfunction drawDiscreteColorLegend(elem, colorOptions, discreteExtraSeries) {\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n clearLegend(elem);\n\n let thresholds = colorOptions.thresholds;\n let tooltips = _.map(thresholds, tr => tr.tooltip);\n let valuesNumber = thresholds.length;\n\n // graph width as a fallback\n const $heatmap = $(elem).parent().parent().parent().find('.statusmap-panel');\n const graphWidthAttr = $heatmap.find('svg').attr(\"width\");\n let graphWidth = parseInt(graphWidthAttr);\n\n\n // calculate max width of tooltip and use it as width for each item\n let textWidth:number[] = [];\n legend.selectAll(\".hidden-texts\")\n .data(tooltips)\n .enter().append(\"text\")\n .attr(\"class\", \"axis tick hidden-texts\")\n .attr(\"font-family\", \"sans-serif\")\n .text(d => d)\n .each(function(d,i) {\n let thisWidth = this.getBBox().width;\n textWidth.push(thisWidth);\n });\n legend.selectAll(\".hidden-texts\").remove();\n\n let legendWidth = Math.floor(_.min([\n graphWidth - 30,\n (_.max(textWidth)! + 3) * valuesNumber,\n ])!);\n legendElem.attr(\"width\", legendWidth);\n\n let legendHeight = legendElem.attr(\"height\");\n\n let itemWidth = Math.floor(legendWidth / valuesNumber);\n let valuesRange = d3.range(valuesNumber); // from 0 to valuesNumber-1\n\n legend.selectAll(\".status-heatmap-color-legend-rect\")\n .data(valuesRange)\n .enter().append(\"rect\")\n .attr(\"x\", d => d*itemWidth)\n .attr(\"y\", 0)\n .attr(\"width\", itemWidth + 1) // Overlap rectangles to prevent gaps\n .attr(\"height\", legendHeight)\n .attr(\"stroke-width\", 0)\n .attr(\"fill\", d => discreteExtraSeries.getDiscreteColor(d));\n\n drawDiscreteLegendValues(elem, colorOptions, legendWidth);\n}\n\n\nfunction drawLegendValues(elem, colorScale, rangeFrom: number, rangeTo: number, maxValue: number, minValue: number, legendWidth: number) {\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n\n if (legendWidth <= 0 || legendElem.get(0).childNodes.length === 0) {\n return;\n }\n\n let legendValueScale = d3.scaleLinear()\n .domain([rangeFrom, rangeTo])\n .range([0, legendWidth]);\n\n let ticks = buildLegendTicks(rangeFrom, rangeTo, maxValue, minValue);\n let xAxis = d3.axisBottom(legendValueScale)\n .tickValues(ticks)\n .tickSize(2);\n\n let colorRect = legendElem.find(\":first-child\");\n let posY = getSvgElemHeight(legendElem) + 2;\n let posX = getSvgElemX(colorRect);\n\n d3.select(legendElem.get(0)).append(\"g\")\n .attr(\"class\", \"axis\")\n .attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\")\n .call(xAxis);\n\n legend.select(\".axis\").select(\".domain\").remove();\n}\n\nfunction drawDiscreteLegendValues(elem, colorOptions, legendWidth) {\n let thresholds = colorOptions.thresholds;\n\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n\n if (legendWidth <= 0 || legendElem.get(0).childNodes.length === 0) {\n return;\n }\n\n let valuesNumber = thresholds.length;\n let rangeStep = Math.floor(legendWidth / valuesNumber);\n let valuesRange = d3.range(0, legendWidth, rangeStep);\n\n\n let legendValueScale = d3.scaleLinear()\n .domain([0, valuesNumber])\n .range([0, legendWidth]);\n\n let thresholdValues = [];\n let thresholdTooltips = [];\n for (let i = 0; i < thresholds.length; i++) {\n thresholdValues.push(thresholds[i].value);\n thresholdTooltips.push(thresholds[i].tooltip);\n }\n\n let xAxis = d3.axisBottom(legendValueScale)\n .tickValues(d3.range(0, valuesNumber, 1)) //thresholdValues)\n .tickSize(2)\n .tickFormat((t) => {\n let i = Math.floor(t);\n let v = thresholdTooltips[i];\n if (v != undefined) {\n return \"\"+v;\n } else {\n v = thresholdValues[i];\n if (v != undefined) {\n return \"\"+v;\n } else {\n return \"n/a\";\n }\n }\n });\n\n let colorRect = legendElem.find(\":first-child\");\n let posY = getSvgElemHeight(legendElem) + 2;\n let posX = getSvgElemX(colorRect) + Math.floor(rangeStep/2);\n\n d3.select(legendElem.get(0)).append(\"g\")\n .attr(\"class\", \"axis\")\n .attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\")\n .call(xAxis);\n\n legend.select(\".axis\").select(\".domain\").remove();\n}\n\nfunction drawSimpleColorLegend(elem, colorScale) {\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n clearLegend(elem);\n\n let legendWidth = Math.floor(legendElem.outerWidth());\n let legendHeight = legendElem.attr(\"height\");\n\n if (legendWidth) {\n let valuesRange = d3.range(0, legendWidth, LEGEND_STEP_WIDTH);\n\n legend.selectAll(\".status-heatmap-color-legend-rect\")\n .data(valuesRange)\n .enter().append(\"rect\")\n .attr(\"x\", d => d)\n .attr(\"y\", 0)\n .attr(\"width\", LEGEND_STEP_WIDTH + 1) // Overlap rectangles to prevent gaps\n .attr(\"height\", legendHeight)\n .attr(\"stroke-width\", 0)\n .attr(\"fill\", d => colorScale(d));\n }\n}\n\nfunction drawSimpleOpacityLegend(elem, options) {\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n clearLegend(elem);\n\n let legendWidth = Math.floor(legendElem.outerWidth());\n let legendHeight = legendElem.attr(\"height\");\n\n if (legendWidth) {\n let legendOpacityScale;\n if (options.colorScale === 'linear') {\n legendOpacityScale = d3.scaleLinear()\n .domain([0, legendWidth])\n .range([0, 1]);\n } else if (options.colorScale === 'sqrt') {\n legendOpacityScale = d3.scalePow().exponent(options.exponent)\n .domain([0, legendWidth])\n .range([0, 1]);\n }\n\n let valuesRange = d3.range(0, legendWidth, LEGEND_STEP_WIDTH);\n\n legend.selectAll(\".status-heatmap-opacity-legend-rect\")\n .data(valuesRange)\n .enter().append(\"rect\")\n .attr(\"x\", d => d)\n .attr(\"y\", 0)\n .attr(\"width\", LEGEND_STEP_WIDTH+1)\n .attr(\"height\", legendHeight)\n .attr(\"stroke-width\", 0)\n .attr(\"fill\", options.cardColor)\n .style(\"opacity\", d => legendOpacityScale(d));\n }\n}\n\n\nfunction clearLegend(elem) {\n let legendElem = $(elem).find('svg');\n legendElem.empty();\n}\n\nfunction getColorScale(colorScheme, maxValue, minValue = 0) {\n let colorInterpolator = d3ScaleChromatic[colorScheme.value];\n let colorScaleInverted = colorScheme.invert === 'always' ||\n (colorScheme.invert === 'dark' && !contextSrv.user.lightTheme);\n\n let start = colorScaleInverted ? maxValue : minValue;\n let end = colorScaleInverted ? minValue : maxValue;\n\n return d3.scaleSequential(colorInterpolator).domain([start, end]);\n}\n\nfunction getOpacityScale(options, maxValue, minValue = 0) {\n let legendOpacityScale;\n if (options.colorScale === 'linear') {\n legendOpacityScale = d3.scaleLinear()\n .domain([minValue, maxValue])\n .range([0, 1]);\n } else if (options.colorScale === 'sqrt') {\n legendOpacityScale = d3.scalePow().exponent(options.exponent)\n .domain([minValue, maxValue])\n .range([0, 1]);\n }\n return legendOpacityScale;\n}\n\nfunction getSvgElemX(elem) {\n let svgElem = elem.get(0);\n if (svgElem && svgElem.x && svgElem.x.baseVal) {\n return svgElem.x.baseVal.value;\n } else {\n return 0;\n }\n}\n\nfunction getSvgElemHeight(elem) {\n let svgElem = elem.get(0);\n if (svgElem && svgElem.height && svgElem.height.baseVal) {\n return svgElem.height.baseVal.value;\n } else {\n return 0;\n }\n}\n\nfunction buildLegendTicks(rangeFrom, rangeTo, maxValue, minValue) {\n let range = rangeTo - rangeFrom;\n let tickStepSize = tickStep(rangeFrom, rangeTo, 3);\n let ticksNum = Math.round(range / tickStepSize);\n let ticks:any = [];\n\n for (let i = 0; i < ticksNum; i++) {\n let current = tickStepSize * i + rangeFrom;\n // Add user-defined min and max if it had been set\n if (isValueCloseTo(minValue, current, tickStepSize)) {\n ticks.push(minValue);\n continue;\n } else if (minValue < current) {\n ticks.push(minValue);\n }\n if (isValueCloseTo(maxValue, current, tickStepSize)) {\n ticks.push(maxValue);\n continue;\n } else if (maxValue < current) {\n ticks.push(maxValue);\n }\n ticks.push(current);\n }\n if (!isValueCloseTo(maxValue, rangeTo, tickStepSize)) {\n ticks.push(maxValue);\n }\n ticks.push(rangeTo);\n ticks = _.sortBy(_.uniq(ticks));\n return ticks;\n}\n\nfunction isValueCloseTo(val, valueTo, step) {\n let diff = Math.abs(val - valueTo);\n return diff < step * 0.3;\n}\n"],"file":"color_legend.js"} \ No newline at end of file diff --git a/dist/css/statusmap.dark.css b/dist/css/statusmap.dark.css index cad3000..94e2b66 100644 --- a/dist/css/statusmap.dark.css +++ b/dist/css/statusmap.dark.css @@ -22,6 +22,15 @@ pointer-events: visiblePainted; } .statusmap-tooltip { + position: absolute; + padding: 10px; + font-weight: 200; + border-radius: 5px; + max-width: 800px; + max-height: 600px; + overflow: hidden; + line-height: 14px; + z-index: 9999; white-space: nowrap; font-size: 12px; background-color: #141414; @@ -32,17 +41,9 @@ font-weight: bold; text-shadow: 0 0 0.2em #212124, 0 0 0.2em #212124, 0 0 0.2em #212124; } -.statusmap-tooltip-extraseries { - white-space: nowrap; - font-size: 12px; - background-color: #141414; - color: #d8d9da; } - .statusmap-tooltip-extraseries .discrete-item { - color: #ffffff; - padding: 1px; - font-weight: bold; - margin-bottom: 0; - text-shadow: 0 0 0.2em #212124, 0 0 0.2em #212124, 0 0 0.2em #212124; } +.statusmap-tooltip-frozen { + position: relative; + z-index: 1; } .statusmap-histogram rect { fill: #8e8e8e; } diff --git a/dist/css/statusmap.dark.css.map b/dist/css/statusmap.dark.css.map index 5954487..abbcde5 100644 --- a/dist/css/statusmap.dark.css.map +++ b/dist/css/statusmap.dark.css.map @@ -1,6 +1,6 @@ { "version": 3, -"mappings": "AAAA,8BAA+B;EAE7B,MAAM,EAAE,SAAS;EAGjB,kDAAoB;IAClB,cAAc,EAAE,IAAI;EAGtB,uDAAyB;IACzB,gBAAgB,ECNL,OAAO;IDOlB,KAAK,ECVM,OAAO;IDWlB,OAAO,EAAE,GAAG;;AAId,gBAAiB;EACf,QAAQ,EAAE,QAAQ;EAGhB,iCAAK;IACH,IAAI,ECpBG,OAAO;IDqBd,KAAK,ECrBE,OAAO;IDsBd,SAAS,EEtBE,IAAI;EFyBjB,iCAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,EC1BM,OAAO;ED+BvB,oBAAI;IACF,cAAc,EAAE,IAAI;IAEpB,yBAAK;MACH,cAAc,EAAE,cAAc;;AAKpC,kBAAmB;EACjB,WAAW,EAAE,MAAM;EACnB,SAAS,EE5CI,IAAI;EF6CjB,gBAAgB,EC1CC,OAAO;ED2CxB,KAAK,EC7CM,OAAO;ED+ClB,iCAAe;IACb,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,GAAG;IACZ,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE,uDAAuD;;AAIxE,8BAA+B;EAC7B,WAAW,EAAE,MAAM;EACnB,SAAS,EE1DI,IAAI;EF2DjB,gBAAgB,ECxDC,OAAO;EDyDxB,KAAK,EC3DM,OAAO;ED6DlB,6CAAe;IACb,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,GAAG;IACZ,WAAW,EAAE,IAAI;IACjB,aAAa,EAAE,CAAC;IAChB,WAAW,EAAE,uDAAuD;;AAIxE,yBAA0B;EACxB,IAAI,ECtEY,OAAO;;AD0EvB,8BAAK;EACH,MAAM,EAAE,OAAgB;EACxB,YAAY,EAAE,CAAC;;AAInB,yBAA0B;EACxB,YAAY,EAAE,CAAC;EACf,IAAI,EAAE,wBAAwB;EAC9B,MAAM,EAAE,wBAAwB;;AAGlC,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AAEA,8BAA+B;EAC7B,MAAM,EAAE,MAAM;EAEd,kCAAI;IACF,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,IAAI;IACX,WAAW,EAAE,MAAM;EAIrB,2DAA6B;IAC3B,UAAU,EAAE,GAAG;EAGjB,4DAA8B;IAC5B,OAAO,EAAE,YAAY;EAIrB,+CAAK;IACH,IAAI,ECxHG,OAAO;IDyHd,KAAK,ECzHE,OAAO;ID0Hd,SAAS,EE1HE,IAAI;EF6HjB,+CAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,EC9HM,OAAO;EDiIrB,kDAAQ;IACN,OAAO,EAAE,GAAG;IACZ,MAAM,ECnIM,OAAO", +"mappings": "AAAA,8BAA+B;EAE7B,MAAM,EAAE,SAAS;EAGjB,kDAAoB;IAClB,cAAc,EAAE,IAAI;EAGtB,uDAAyB;IACzB,gBAAgB,ECNL,OAAO;IDOlB,KAAK,ECVM,OAAO;IDWlB,OAAO,EAAE,GAAG;;AAId,gBAAiB;EACf,QAAQ,EAAE,QAAQ;EAGhB,iCAAK;IACH,IAAI,ECpBG,OAAO;IDqBd,KAAK,ECrBE,OAAO;IDsBd,SAAS,EEtBE,IAAI;EFyBjB,iCAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,EC1BM,OAAO;ED+BvB,oBAAI;IACF,cAAc,EAAE,IAAI;IAEpB,yBAAK;MACH,cAAc,EAAE,cAAc;;AAKpC,kBAAmB;EAGjB,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,GAAG;EAChB,aAAa,EAAE,GAAG;EAClB,SAAS,EAAE,KAAK;EAChB,UAAU,EAAE,KAAK;EACjB,QAAQ,EAAE,MAAM;EAChB,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,IAAI;EAGb,WAAW,EAAE,MAAM;EACnB,SAAS,EEzDI,IAAI;EF0DjB,gBAAgB,ECvDC,OAAO;EDwDxB,KAAK,EC1DM,OAAO;ED4DlB,iCAAe;IACb,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,GAAG;IACZ,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE,uDAAuD;;AAIxE,yBAA0B;EACxB,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,CAAC;;AAGZ,yBAA0B;EACxB,IAAI,ECzEY,OAAO;;AD6EvB,8BAAK;EACH,MAAM,EAAE,OAAgB;EACxB,YAAY,EAAE,CAAC;;AAInB,yBAA0B;EACxB,YAAY,EAAE,CAAC;EACf,IAAI,EAAE,wBAAwB;EAC9B,MAAM,EAAE,wBAAwB;;AAGlC,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AAEA,8BAA+B;EAC7B,MAAM,EAAE,MAAM;EAEd,kCAAI;IACF,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,IAAI;IACX,WAAW,EAAE,MAAM;EAIrB,2DAA6B;IAC3B,UAAU,EAAE,GAAG;EAGjB,4DAA8B;IAC5B,OAAO,EAAE,YAAY;EAIrB,+CAAK;IACH,IAAI,EC3HG,OAAO;ID4Hd,KAAK,EC5HE,OAAO;ID6Hd,SAAS,EE7HE,IAAI;EFgIjB,+CAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,ECjIM,OAAO;EDoIrB,kDAAQ;IACN,OAAO,EAAE,GAAG;IACZ,MAAM,ECtIM,OAAO", "sources": ["../../src/css/_statusmap.scss","../../src/css/_variables.dark.scss","../../src/css/_variables.scss"], "names": [], "file": "statusmap.dark.css" diff --git a/dist/css/statusmap.light.css b/dist/css/statusmap.light.css index d9e7b83..49aca7b 100644 --- a/dist/css/statusmap.light.css +++ b/dist/css/statusmap.light.css @@ -22,6 +22,15 @@ pointer-events: visiblePainted; } .statusmap-tooltip { + position: absolute; + padding: 10px; + font-weight: 200; + border-radius: 5px; + max-width: 800px; + max-height: 600px; + overflow: hidden; + line-height: 14px; + z-index: 9999; white-space: nowrap; font-size: 12px; background-color: #dde4ed; @@ -32,17 +41,9 @@ font-weight: bold; text-shadow: 0 0 0.2em #212124, 0 0 0.2em #212124, 0 0 0.2em #212124; } -.statusmap-tooltip-extraseries { - white-space: nowrap; - font-size: 12px; - background-color: #dde4ed; - color: #52545c; } - .statusmap-tooltip-extraseries .discrete-item { - color: #ffffff; - padding: 1px; - font-weight: bold; - margin-bottom: 0; - text-shadow: 0 0 0.2em #212124, 0 0 0.2em #212124, 0 0 0.2em #212124; } +.statusmap-tooltip-frozen { + position: relative; + z-index: 1; } .statusmap-histogram rect { fill: #767980; } diff --git a/dist/css/statusmap.light.css.map b/dist/css/statusmap.light.css.map index 0c039bc..5f03d2f 100644 --- a/dist/css/statusmap.light.css.map +++ b/dist/css/statusmap.light.css.map @@ -1,6 +1,6 @@ { "version": 3, -"mappings": "AAAA,8BAA+B;EAE7B,MAAM,EAAE,SAAS;EAGjB,kDAAoB;IAClB,cAAc,EAAE,IAAI;EAGtB,uDAAyB;IACzB,gBAAgB,ECNL,OAAO;IDOlB,KAAK,ECVM,OAAO;IDWlB,OAAO,EAAE,GAAG;;AAId,gBAAiB;EACf,QAAQ,EAAE,QAAQ;EAGhB,iCAAK;IACH,IAAI,ECpBG,OAAO;IDqBd,KAAK,ECrBE,OAAO;IDsBd,SAAS,EEtBE,IAAI;EFyBjB,iCAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,EC1BM,OAAO;ED+BvB,oBAAI;IACF,cAAc,EAAE,IAAI;IAEpB,yBAAK;MACH,cAAc,EAAE,cAAc;;AAKpC,kBAAmB;EACjB,WAAW,EAAE,MAAM;EACnB,SAAS,EE5CI,IAAI;EF6CjB,gBAAgB,EC1CC,OAAO;ED2CxB,KAAK,EC7CM,OAAO;ED+ClB,iCAAe;IACb,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,GAAG;IACZ,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE,uDAAuD;;AAIxE,8BAA+B;EAC7B,WAAW,EAAE,MAAM;EACnB,SAAS,EE1DI,IAAI;EF2DjB,gBAAgB,ECxDC,OAAO;EDyDxB,KAAK,EC3DM,OAAO;ED6DlB,6CAAe;IACb,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,GAAG;IACZ,WAAW,EAAE,IAAI;IACjB,aAAa,EAAE,CAAC;IAChB,WAAW,EAAE,uDAAuD;;AAIxE,yBAA0B;EACxB,IAAI,ECtEY,OAAO;;AD0EvB,8BAAK;EACH,MAAM,EAAE,OAAgB;EACxB,YAAY,EAAE,CAAC;;AAInB,yBAA0B;EACxB,YAAY,EAAE,CAAC;EACf,IAAI,EAAE,wBAAwB;EAC9B,MAAM,EAAE,wBAAwB;;AAGlC,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AAEA,8BAA+B;EAC7B,MAAM,EAAE,MAAM;EAEd,kCAAI;IACF,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,IAAI;IACX,WAAW,EAAE,MAAM;EAIrB,2DAA6B;IAC3B,UAAU,EAAE,GAAG;EAGjB,4DAA8B;IAC5B,OAAO,EAAE,YAAY;EAIrB,+CAAK;IACH,IAAI,ECxHG,OAAO;IDyHd,KAAK,ECzHE,OAAO;ID0Hd,SAAS,EE1HE,IAAI;EF6HjB,+CAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,EC9HM,OAAO;EDiIrB,kDAAQ;IACN,OAAO,EAAE,GAAG;IACZ,MAAM,ECnIM,OAAO", +"mappings": "AAAA,8BAA+B;EAE7B,MAAM,EAAE,SAAS;EAGjB,kDAAoB;IAClB,cAAc,EAAE,IAAI;EAGtB,uDAAyB;IACzB,gBAAgB,ECNL,OAAO;IDOlB,KAAK,ECVM,OAAO;IDWlB,OAAO,EAAE,GAAG;;AAId,gBAAiB;EACf,QAAQ,EAAE,QAAQ;EAGhB,iCAAK;IACH,IAAI,ECpBG,OAAO;IDqBd,KAAK,ECrBE,OAAO;IDsBd,SAAS,EEtBE,IAAI;EFyBjB,iCAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,EC1BM,OAAO;ED+BvB,oBAAI;IACF,cAAc,EAAE,IAAI;IAEpB,yBAAK;MACH,cAAc,EAAE,cAAc;;AAKpC,kBAAmB;EAGjB,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,GAAG;EAChB,aAAa,EAAE,GAAG;EAClB,SAAS,EAAE,KAAK;EAChB,UAAU,EAAE,KAAK;EACjB,QAAQ,EAAE,MAAM;EAChB,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,IAAI;EAGb,WAAW,EAAE,MAAM;EACnB,SAAS,EEzDI,IAAI;EF0DjB,gBAAgB,ECvDC,OAAO;EDwDxB,KAAK,EC1DM,OAAO;ED4DlB,iCAAe;IACb,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,GAAG;IACZ,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE,uDAAuD;;AAIxE,yBAA0B;EACxB,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,CAAC;;AAGZ,yBAA0B;EACxB,IAAI,ECzEY,OAAO;;AD6EvB,8BAAK;EACH,MAAM,EAAE,OAAgB;EACxB,YAAY,EAAE,CAAC;;AAInB,yBAA0B;EACxB,YAAY,EAAE,CAAC;EACf,IAAI,EAAE,wBAAwB;EAC9B,MAAM,EAAE,wBAAwB;;AAGlC,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AAEA,8BAA+B;EAC7B,MAAM,EAAE,MAAM;EAEd,kCAAI;IACF,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,IAAI;IACX,WAAW,EAAE,MAAM;EAIrB,2DAA6B;IAC3B,UAAU,EAAE,GAAG;EAGjB,4DAA8B;IAC5B,OAAO,EAAE,YAAY;EAIrB,+CAAK;IACH,IAAI,EC3HG,OAAO;ID4Hd,KAAK,EC5HE,OAAO;ID6Hd,SAAS,EE7HE,IAAI;EFgIjB,+CAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,ECjIM,OAAO;EDoIrB,kDAAQ;IACN,OAAO,EAAE,GAAG;IACZ,MAAM,ECtIM,OAAO", "sources": ["../../src/css/_statusmap.scss","../../src/css/_variables.light.scss","../../src/css/_variables.scss"], "names": [], "file": "statusmap.light.css" diff --git a/dist/extra_series_format.js b/dist/extra_series_format.js deleted file mode 100644 index 6680ce7..0000000 --- a/dist/extra_series_format.js +++ /dev/null @@ -1,28 +0,0 @@ -"use strict"; - -System.register([], function (_export, _context) { - "use strict"; - - var ExtraSeriesFormat, ExtraSeriesFormatValue; - - _export({ - ExtraSeriesFormat: void 0, - ExtraSeriesFormatValue: void 0 - }); - - return { - setters: [], - execute: function () { - (function (ExtraSeriesFormat) { - ExtraSeriesFormat["Date"] = "Date"; - ExtraSeriesFormat["Raw"] = "Raw"; - })(ExtraSeriesFormat || _export("ExtraSeriesFormat", ExtraSeriesFormat = {})); - - (function (ExtraSeriesFormatValue) { - ExtraSeriesFormatValue["Date"] = "YYYY/MM/DD/HH_mm_ss"; - ExtraSeriesFormatValue["Raw"] = ""; - })(ExtraSeriesFormatValue || _export("ExtraSeriesFormatValue", ExtraSeriesFormatValue = {})); - } - }; -}); -//# sourceMappingURL=extra_series_format.js.map diff --git a/dist/extra_series_format.js.map b/dist/extra_series_format.js.map deleted file mode 100644 index 15a0176..0000000 --- a/dist/extra_series_format.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../src/extra_series_format.ts"],"names":["ExtraSeriesFormat","ExtraSeriesFormatValue"],"mappings":";;;;;;;;;;;;;;;iBAAYA,iB;AAAAA,QAAAA,iB;AAAAA,QAAAA,iB;SAAAA,iB,iCAAAA,iB;;iBAKAC,sB;AAAAA,QAAAA,sB;AAAAA,QAAAA,sB;SAAAA,sB,sCAAAA,sB","sourcesContent":["export enum ExtraSeriesFormat {\n Date = 'Date',\n Raw = 'Raw',\n}\n\nexport enum ExtraSeriesFormatValue {\n Date = 'YYYY/MM/DD/HH_mm_ss',\n Raw = '',\n}"],"file":"extra_series_format.js"} \ No newline at end of file diff --git a/dist/module.js b/dist/module.js index f65060c..1fb9cbc 100644 --- a/dist/module.js +++ b/dist/module.js @@ -1,9 +1,9 @@ "use strict"; -System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/sdk", "./statusmap_data", "./rendering", "./options_editor", "./color_mode_discrete", "./extra_series_format"], function (_export, _context) { +System.register(["lodash", "./color_legend", "./options_editor", "./tooltip_editor", "./panel_config_migration", "app/core/utils/kbn", "app/plugins/sdk", "./statusmap_data", "./rendering", "./color_mode_discrete"], function (_export, _context) { "use strict"; - var _, kbn, loadPluginCss, MetricsPanelCtrl, Bucket, BucketMatrix, rendering, statusHeatmapOptionsEditor, ColorModeDiscrete, ExtraSeriesFormat, ExtraSeriesFormatValue, VALUE_INDEX, TIME_INDEX, colorSchemes, colorModes, opacityScales, StatusHeatmapCtrl; + var _, optionsEditorCtrl, tooltipEditorCtrl, migratePanelConfig, kbn, loadPluginCss, MetricsPanelCtrl, Bucket, BucketMatrix, rendering, ColorModeDiscrete, VALUE_INDEX, TIME_INDEX, colorSchemes, colorModes, opacityScales, StatusHeatmapCtrl; function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } @@ -32,7 +32,13 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ return { setters: [function (_lodash) { _ = _lodash.default; - }, function (_color_legend) {}, function (_appCoreUtilsKbn) { + }, function (_color_legend) {}, function (_options_editor) { + optionsEditorCtrl = _options_editor.optionsEditorCtrl; + }, function (_tooltip_editor) { + tooltipEditorCtrl = _tooltip_editor.tooltipEditorCtrl; + }, function (_panel_config_migration) { + migratePanelConfig = _panel_config_migration.migratePanelConfig; + }, function (_appCoreUtilsKbn) { kbn = _appCoreUtilsKbn.default; }, function (_appPluginsSdk) { loadPluginCss = _appPluginsSdk.loadPluginCss; @@ -42,13 +48,8 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ BucketMatrix = _statusmap_data.BucketMatrix; }, function (_rendering) { rendering = _rendering.default; - }, function (_options_editor) { - statusHeatmapOptionsEditor = _options_editor.statusHeatmapOptionsEditor; }, function (_color_mode_discrete) { ColorModeDiscrete = _color_mode_discrete.ColorModeDiscrete; - }, function (_extra_series_format) { - ExtraSeriesFormat = _extra_series_format.ExtraSeriesFormat; - ExtraSeriesFormatValue = _extra_series_format.ExtraSeriesFormatValue; }], execute: function () { VALUE_INDEX = 0; @@ -163,6 +164,7 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ _this = _possibleConstructorReturn(this, _getPrototypeOf(StatusHeatmapCtrl).call(this, $scope, $injector)); _this.annotationsSrv = annotationsSrv; + _this.variableSrv = variableSrv; _defineProperty(_assertThisInitialized(_this), "data", void 0); @@ -190,8 +192,6 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ _defineProperty(_assertThisInitialized(_this), "discreteExtraSeries", void 0); - _defineProperty(_assertThisInitialized(_this), "extraSeriesFormats", []); - _defineProperty(_assertThisInitialized(_this), "annotations", []); _defineProperty(_assertThisInitialized(_this), "annotationsPromise", void 0); @@ -219,8 +219,7 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ cardRound: null }, xAxis: { - show: true, - labelFormat: '%a %m/%d' + show: true }, yAxis: { show: true, @@ -228,88 +227,30 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ maxWidth: -1 }, tooltip: { - show: true + show: true, + freezeOnClick: true, + showItems: false, + items: [] // see tooltip_editor.ts + }, legend: { show: true }, - data: { - unitFormat: 'short', - decimals: null - }, // how null points should be handled nullPointMode: 'as empty', yAxisSort: 'metrics', highlightCards: true, useMax: true, - urls: [{ - tooltip: '', - label: '', - base_url: '', - useExtraSeries: false, - useseriesname: true, - forcelowercase: true, - icon_fa: 'external-link', - extraSeries: { - index: -1 - } - }], - seriesFilterIndex: -1, - usingUrl: false + seriesFilterIndex: -1 }); - _defineProperty(_assertThisInitialized(_this), "onEditorAddUrl", function () { - _this.panel.urls.push({ - label: '', - base_url: '', - useExtraSeries: false, - useseriesname: true, - forcelowercase: true, - icon_fa: 'external-link', - extraSeries: { - index: -1 - } - }); - - _this.render(); - }); - - _defineProperty(_assertThisInitialized(_this), "onEditorRemoveUrl", function (index) { - _this.panel.urls.splice(index, 1); - - _this.render(); - }); - - _defineProperty(_assertThisInitialized(_this), "onEditorRemoveUrls", function () { - _this.panel.urls = []; - - _this.render(); - }); + migratePanelConfig(_this.panel); _.defaultsDeep(_this.panel, _this.panelDefaults); _this.opacityScales = opacityScales; _this.colorModes = colorModes; - _this.colorSchemes = colorSchemes; - _this.variableSrv = variableSrv; - _this.extraSeriesFormats = ExtraSeriesFormat; - - _this.renderLink = function (link, scopedVars, format) { - var scoped = {}; - - for (var key in scopedVars) { - scoped[key] = { - value: scopedVars[key] - }; - } - - if (format) { - return _this.templateSrv.replace(link, scoped, format); - } else { - return _this.templateSrv.replace(link, scoped); - } - }; // default graph width for discrete card width calculation - + _this.colorSchemes = colorSchemes; // default graph width for discrete card width calculation _this.graph = { "chartWidth": -1 @@ -350,8 +291,6 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ _this.events.on('render-complete', _this.onRenderComplete.bind(_assertThisInitialized(_this))); - _this.events.on('onChangeType', _this.onChangeType.bind(_assertThisInitialized(_this))); - _this.onCardColorChange = _this.onCardColorChange.bind(_assertThisInitialized(_this)); return _this; } @@ -359,32 +298,8 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ _createClass(StatusHeatmapCtrl, [{ key: "onRenderComplete", value: function onRenderComplete(data) { - // console.log({ - // data: this.data, - // bucketMatrix: this.bucketMatrix, - // chartWidth: data.chartWidth, - // from: this.range.from.valueOf(), - // to: this.range.to.valueOf() - // }) this.graph.chartWidth = data.chartWidth; this.renderingCompleted(); - } - }, { - key: "onChangeType", - value: function onChangeType(url) { - switch (url.type) { - case ExtraSeriesFormat.Date: - url.extraSeries.format = ExtraSeriesFormatValue.Date; - break; - - case ExtraSeriesFormat.Raw: - url.extraSeries.format = ExtraSeriesFormatValue.Raw; - break; - - default: - url.extraSeries.format = ExtraSeriesFormatValue.Raw; - break; - } } // getChartWidth returns an approximation of chart canvas width or // a saved value calculated during a render. @@ -408,6 +323,7 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ return chartWidth; } // Quick workaround for 6.7 and 7.0+. There is no call to // calculateInterval in updateTimeRange in those versions. + // TODO ts type has no argument for this method. }, { key: "updateTimeRange", @@ -457,16 +373,8 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ var interval = kbn.secondsToHms(intervalMs / 1000); this.intervalMs = intervalMs; this.interval = interval; // Get final buckets count after interval is adjusted + // TODO is it needed? //this.xBucketsCount = Math.floor(rangeMs / intervalMs); - // console.log("calculateInterval: ", { - // interval: this.interval, - // intervalMs: this.intervalMs, - // rangeMs: rangeMs, - // from: this.range.from.valueOf(), - // to: this.range.to.valueOf(), - // numIntervals: rangeMs/this.intervalMs, - // maxCardsCount: maxCardsCount, - // }); } }, { key: "issueQueries", @@ -484,7 +392,7 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ * (but not wait for completion). This resolves * issue 11806. */ - // 5.x before 5.4 doesn't have datasourcePromises. + // 5.x before 5.4 doesn't have datasourcePromises. if ("undefined" !== typeof this.annotationsSrv.datasourcePromises) { return this.annotationsSrv.datasourcePromises.then(function (r) { @@ -549,7 +457,8 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ }, { key: "onInitEditMode", value: function onInitEditMode() { - this.addEditorTab('Options', statusHeatmapOptionsEditor, 2); + this.addEditorTab('Options', optionsEditorCtrl, 2); + this.addEditorTab('Tooltip', tooltipEditorCtrl, 3); this.unitFormats = kbn.getUnitFormats(); } // onRender will be called before StatusmapRenderer.onRender. // Decide if warning should be displayed over cards. @@ -588,8 +497,7 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ if (this.bucketMatrix) { this.noDatapoints = this.bucketMatrix.noDatapoints; - } //console.log(this); - + } } }, { key: "onCardColorChange", @@ -609,104 +517,17 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ value: function postRefresh() { this.noColorDefined = false; } - }, { - key: "onEditorAddThreshold", - value: function onEditorAddThreshold() { - this.panel.color.thresholds.push({ - color: this.panel.defaultColor - }); - this.render(); - } - }, { - key: "onEditorRemoveThreshold", - value: function onEditorRemoveThreshold(index) { - this.panel.color.thresholds.splice(index, 1); - this.render(); - } - }, { - key: "onEditorRemoveThresholds", - value: function onEditorRemoveThresholds() { - this.panel.color.thresholds = []; - this.render(); - } - }, { - key: "onEditorAddThreeLights", - value: function onEditorAddThreeLights() { - this.panel.color.thresholds.push({ - color: "red", - value: 2, - tooltip: "error" - }); - this.panel.color.thresholds.push({ - color: "yellow", - value: 1, - tooltip: "warning" - }); - this.panel.color.thresholds.push({ - color: "green", - value: 0, - tooltip: "ok" - }); - this.render(); - } - /* https://ethanschoonover.com/solarized/ */ - - }, { - key: "onEditorAddSolarized", - value: function onEditorAddSolarized() { - this.panel.color.thresholds.push({ - color: "#b58900", - value: 0, - tooltip: "yellow" - }); - this.panel.color.thresholds.push({ - color: "#cb4b16", - value: 1, - tooltip: "orange" - }); - this.panel.color.thresholds.push({ - color: "#dc322f", - value: 2, - tooltip: "red" - }); - this.panel.color.thresholds.push({ - color: "#d33682", - value: 3, - tooltip: "magenta" - }); - this.panel.color.thresholds.push({ - color: "#6c71c4", - value: 4, - tooltip: "violet" - }); - this.panel.color.thresholds.push({ - color: "#268bd2", - value: 5, - tooltip: "blue" - }); - this.panel.color.thresholds.push({ - color: "#2aa198", - value: 6, - tooltip: "cyan" - }); - this.panel.color.thresholds.push({ - color: "#859900", - value: 7, - tooltip: "green" - }); - this.render(); - } }, { key: "link", value: function link(scope, elem, attrs, ctrl) { rendering(scope, elem, attrs, ctrl); - } + } // Compatible with Grafana 7.0 overrides feature. + }, { key: "retrieveTimeVar", value: function retrieveTimeVar() { var time = this.timeSrv.timeRangeForUrl(); - var var_time = '&from=' + time.from + '&to=' + time.to; - return var_time; + return 'from=' + time.from + '&to=' + time.to; } // convertToBuckets groups values in data into buckets by target and timestamp. // // data is a result from datasource. It is an array of timeseries and tables: @@ -918,109 +739,6 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ bucketMatrix.targets = targetKeys; return bucketMatrix; - this.bucketMatrix = bucketMatrix; // Collect all values for each bucket from datapoints with similar target. - // TODO aggregate values into buckets over datapoint[TIME_INDEX] not over datapoint index (j). - // for(let i = 0; i < cardsData.targets.length; i++) { - // let target = cardsData.targets[i]; - // for (let j = 0; j < cardsData.xBucketSize; j++) { - // let card = new Card(); - // card.id = i*cardsData.xBucketSize + j; - // card.values = []; - // card.y = target; - // card.x = -1; - // // collect values from all timeseries with target - // for (let si = 0; si < cardsData.targetIndex[target].length; si++) { - // let s = data[cardsData.targetIndex[target][si]]; - // if (s.datapoints.length <= j) { - // continue; - // } - // let datapoint = s.datapoints[j]; - // if (card.values.length === 0) { - // card.x = datapoint[TIME_INDEX]; - // } - // card.values.push(datapoint[VALUE_INDEX]); - // } - // card.minValue = _.min(card.values); - // card.maxValue = _.max(card.values); - // if (card.values.length > 1) { - // cardsData.multipleValues = true; - // card.multipleValues = true; - // card.value = card.maxValue; // max value by default - // } else { - // card.value = card.maxValue; // max value by default - // } - // if (cardsData.maxValue < card.maxValue) - // cardsData.maxValue = card.maxValue; - // if (cardsData.minValue > card.minValue) - // cardsData.minValue = card.minValue; - // if (card.x != -1) { - // cardsData.cards.push(card); - // } - // } - // } - // let cardsData = { - // cards: [], - // xBucketSize: 0, - // yBucketSize: 0, - // maxValue: 0, - // minValue: 0, - // multipleValues: false, - // noColorDefined: false, - // targets: [], // array of available unique targets - // targetIndex: {} // indices in data array for each of available unique targets - // }; - // if (!data || data.length == 0) { return cardsData;} - // // Collect uniq timestamps from data and spread over targets and timestamps - // // collect uniq targets and their indices - // _.map(data, (d, i) => { - // cardsData.targetIndex[d.target] = _.concat(_.toArray(cardsData.targetIndex[d.target]), i) - // }); - // // TODO add some logic for targets heirarchy - // cardsData.targets = _.keys(cardsData.targetIndex); - // cardsData.yBucketSize = cardsData.targets.length; - // // Maximum number of buckets over x axis - // cardsData.xBucketSize = _.max(_.map(data, d => d.datapoints.length)); - // // Collect all values for each bucket from datapoints with similar target. - // // TODO aggregate values into buckets over datapoint[TIME_INDEX] not over datapoint index (j). - // for(let i = 0; i < cardsData.targets.length; i++) { - // let target = cardsData.targets[i]; - // for (let j = 0; j < cardsData.xBucketSize; j++) { - // let card = new Card(); - // card.id = i*cardsData.xBucketSize + j; - // card.values = []; - // card.y = target; - // card.x = -1; - // // collect values from all timeseries with target - // for (let si = 0; si < cardsData.targetIndex[target].length; si++) { - // let s = data[cardsData.targetIndex[target][si]]; - // if (s.datapoints.length <= j) { - // continue; - // } - // let datapoint = s.datapoints[j]; - // if (card.values.length === 0) { - // card.x = datapoint[TIME_INDEX]; - // } - // card.values.push(datapoint[VALUE_INDEX]); - // } - // card.minValue = _.min(card.values); - // card.maxValue = _.max(card.values); - // if (card.values.length > 1) { - // cardsData.multipleValues = true; - // card.multipleValues = true; - // card.value = card.maxValue; // max value by default - // } else { - // card.value = card.maxValue; // max value by default - // } - // if (cardsData.maxValue < card.maxValue) - // cardsData.maxValue = card.maxValue; - // if (cardsData.minValue > card.minValue) - // cardsData.minValue = card.minValue; - // if (card.x != -1) { - // cardsData.cards.push(card); - // } - // } - // } - // return cardsData; } }]); diff --git a/dist/module.js.map b/dist/module.js.map index e1ea95e..2e38fba 100644 --- a/dist/module.js.map +++ b/dist/module.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/module.ts"],"names":["_","kbn","loadPluginCss","MetricsPanelCtrl","Bucket","BucketMatrix","rendering","statusHeatmapOptionsEditor","ColorModeDiscrete","ExtraSeriesFormat","ExtraSeriesFormatValue","VALUE_INDEX","TIME_INDEX","colorSchemes","name","value","invert","colorModes","opacityScales","dark","light","StatusHeatmapCtrl","$scope","$injector","timeSrv","annotationsSrv","$window","datasourceSrv","variableSrv","templateSrv","datasource","color","mode","cardColor","colorScale","exponent","colorScheme","defaultColor","thresholds","cards","cardMinWidth","cardVSpacing","cardHSpacing","cardRound","xAxis","show","labelFormat","yAxis","minWidth","maxWidth","tooltip","legend","data","unitFormat","decimals","nullPointMode","yAxisSort","highlightCards","useMax","urls","label","base_url","useExtraSeries","useseriesname","forcelowercase","icon_fa","extraSeries","index","seriesFilterIndex","usingUrl","panel","push","render","splice","defaultsDeep","panelDefaults","extraSeriesFormats","renderLink","link","scopedVars","format","scoped","key","replace","graph","multipleValues","noColorDefined","discreteExtraSeries","dataWarnings","title","tip","noDatapoints","annotations","events","on","onRender","bind","onDataReceived","onDataError","onInitEditMode","postRefresh","onRenderComplete","onChangeType","onCardColorChange","chartWidth","renderingCompleted","url","type","Date","Raw","wndWidth","$","window","width","panelWidthFactor","gridPos","w","panelWidth","Math","ceil","max","ret","calculateInterval","getChartWidth","minCardWidth","minSpacing","maxCardsCount","intervalMs","rangeMs","range","to","valueOf","from","roundIntervalCeil","lowLimitMs","intervalOverride","interval","slice","interval_to_ms","secondsToHms","annotationsPromise","getAnnotations","dashboard","datasourcePromises","then","r","issueQueriesWithInterval","origInterval","res","dataList","bucketMatrix","convertDataToBuckets","result","loading","length","addEditorTab","unitFormats","getUnitFormats","updateCardsValuesHasColorInfo","updateCardsValuesHasColorInfoSingle","newColor","scope","elem","attrs","ctrl","time","timeRangeForUrl","var_time","mostRecentBucket","targets","buckets","xBucketSize","targetIndex","map","queryResult","i","yLabel","target","hasOwnProperty","targetKeys","keys","targetTimestampRanges","targetTimestamps","si","s","datapoints","datapoint","idx","uniq","tsTo","tsFrom","minFrom","targetEmptyBuckets","lastTs","topBucket","relTo","relFrom","values","mostRecent","bucketFrom","b","bucket","xid","minValue","Number","MAX_VALUE","maxValue","MIN_SAFE_INTEGER","dataIndex","dp","belong","put","min","bucketsLen"],"mappings":"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,EApKiH,CA2KjH;;AAEA/D,YAAAA,YAAY,CAACmB,OAAb,GAAuBU,UAAvB;AACA,mBAAO7B,YAAP;AACA,iBAAKA,YAAL,GAAoBA,YAApB,CA/KiH,CAiLjH;AACA;AAGA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACD;;;;QAlyB6BnJ,gB;;sBAA1BkB,iB,iBACiB,a","sourcesContent":["// Libraries\nimport _ from 'lodash';\nimport { auto } from 'angular';\n\n// Components\nimport './color_legend';\n\n// Utils\nimport kbn from 'app/core/utils/kbn';\nimport {loadPluginCss} from 'app/plugins/sdk';\n\n// Types\nimport { MetricsPanelCtrl } from 'app/plugins/sdk';\nimport { AnnotationsSrv } from 'app/features/annotations/annotations_srv';\nimport { Bucket, BucketMatrix } from './statusmap_data';\nimport rendering from './rendering';\n// import aggregates, { aggregatesMap } from './aggregates';\n// import fragments, { fragmentsMap } from './fragments';\n// import { labelFormats } from './xAxisLabelFormats';\nimport {statusHeatmapOptionsEditor} from './options_editor';\nimport {ColorModeDiscrete} from \"./color_mode_discrete\";\nimport { ExtraSeriesFormat, ExtraSeriesFormatValue } from './extra_series_format';\n\nconst VALUE_INDEX = 0,\n TIME_INDEX = 1;\n\nconst colorSchemes = [\n // Diverging\n { name: 'Spectral', value: 'interpolateSpectral', invert: 'always' },\n { name: 'RdYlGn', value: 'interpolateRdYlGn', invert: 'always' },\n { name: 'GnYlRd', value: 'interpolateGnYlRd', invert: 'always' },\n\n // Sequential (Single Hue)\n { name: 'Blues', value: 'interpolateBlues', invert: 'dark' },\n { name: 'Greens', value: 'interpolateGreens', invert: 'dark' },\n { name: 'Greys', value: 'interpolateGreys', invert: 'dark' },\n { name: 'Oranges', value: 'interpolateOranges', invert: 'dark' },\n { name: 'Purples', value: 'interpolatePurples', invert: 'dark' },\n { name: 'Reds', value: 'interpolateReds', invert: 'dark' },\n\n // Sequential (Multi-Hue)\n { name: 'BuGn', value: 'interpolateBuGn', invert: 'dark' },\n { name: 'BuPu', value: 'interpolateBuPu', invert: 'dark' },\n { name: 'GnBu', value: 'interpolateGnBu', invert: 'dark' },\n { name: 'OrRd', value: 'interpolateOrRd', invert: 'dark' },\n { name: 'PuBuGn', value: 'interpolatePuBuGn', invert: 'dark' },\n { name: 'PuBu', value: 'interpolatePuBu', invert: 'dark' },\n { name: 'PuRd', value: 'interpolatePuRd', invert: 'dark' },\n { name: 'RdPu', value: 'interpolateRdPu', invert: 'dark' },\n { name: 'YlGnBu', value: 'interpolateYlGnBu', invert: 'dark' },\n { name: 'YlGn', value: 'interpolateYlGn', invert: 'dark' },\n { name: 'YlOrBr', value: 'interpolateYlOrBr', invert: 'dark' },\n { name: 'YlOrRd', value: 'interpolateYlOrRd', invert: 'dark' }\n];\n\nlet colorModes = ['opacity', 'spectrum', 'discrete'];\nlet opacityScales = ['linear', 'sqrt'];\n\n\nloadPluginCss({\n dark: 'plugins/flant-statusmap-panel/css/statusmap.dark.css',\n light: 'plugins/flant-statusmap-panel/css/statusmap.light.css'\n});\n\nclass StatusHeatmapCtrl extends MetricsPanelCtrl {\n static templateUrl = 'module.html';\n\n data: any;\n bucketMatrix: BucketMatrix;\n\n graph: any;\n discreteHelper: ColorModeDiscrete;\n opacityScales: any = [];\n colorModes: any = [];\n colorSchemes: any = [];\n unitFormats: any;\n\n dataWarnings: {[warningId: string]: {title: string, tip: string}} = {};\n multipleValues: boolean;\n noColorDefined: boolean;\n noDatapoints: boolean;\n\n discreteExtraSeries: ColorModeDiscrete;\n extraSeriesFormats: any = [];\n\n annotations: object[] = [];\n annotationsPromise: any;\n\n panelDefaults: any = {\n // datasource name, null = default datasource\n datasource: null,\n // color mode\n color: {\n mode: 'spectrum',\n cardColor: '#b4ff00',\n colorScale: 'sqrt',\n exponent: 0.5,\n colorScheme: 'interpolateGnYlRd',\n // discrete mode settings\n defaultColor: '#757575',\n thresholds: [] // manual colors\n },\n // buckets settings\n cards: {\n cardMinWidth: 5,\n cardVSpacing: 2,\n cardHSpacing: 2,\n cardRound: null\n },\n xAxis: {\n show: true,\n labelFormat: '%a %m/%d'\n },\n yAxis: {\n show: true,\n minWidth: -1,\n maxWidth: -1,\n },\n tooltip: {\n show: true\n },\n legend: {\n show: true\n },\n data: {\n unitFormat: 'short',\n decimals: null\n },\n // how null points should be handled\n nullPointMode: 'as empty',\n yAxisSort: 'metrics',\n highlightCards: true,\n useMax: true,\n urls: [{\n tooltip: '',\n label: '',\n base_url: '',\n useExtraSeries: false,\n useseriesname: true,\n forcelowercase: true,\n icon_fa: 'external-link',\n extraSeries: {\n index: -1\n }\n }],\n seriesFilterIndex: -1,\n usingUrl: false\n };\n\n /** @ngInject */\n constructor($scope: any, $injector: auto.IInjectorService, timeSrv, private annotationsSrv: AnnotationsSrv, $window, datasourceSrv, variableSrv, templateSrv) {\n super($scope, $injector);\n\n _.defaultsDeep(this.panel, this.panelDefaults);\n\n this.opacityScales = opacityScales;\n this.colorModes = colorModes;\n this.colorSchemes = colorSchemes;\n this.variableSrv = variableSrv;\n this.extraSeriesFormats = ExtraSeriesFormat;\n\n this.renderLink = (link, scopedVars, format) => {\n var scoped = {}\n for (var key in scopedVars) {\n scoped[key] = { value: scopedVars[key] }\n }\n if (format) {\n return this.templateSrv.replace(link, scoped, format)\n } else {\n return this.templateSrv.replace(link, scoped)\n }\n }\n\n // default graph width for discrete card width calculation\n this.graph = {\n \"chartWidth\" : -1\n };\n\n this.multipleValues = false;\n this.noColorDefined = false;\n\n this.discreteExtraSeries = new ColorModeDiscrete($scope);\n\n this.dataWarnings = {\n noColorDefined: {\n title: 'Data has value with undefined color',\n tip: 'Check metric values, color values or define a new color',\n },\n multipleValues: {\n title: 'Data has multiple values for one target',\n tip: 'Change targets definitions or set \"use max value\"',\n },\n noDatapoints: {\n title: 'No data points',\n tip: 'No datapoints returned from data query',\n }\n };\n\n this.annotations = [];\n this.annotationsSrv = annotationsSrv;\n \n this.timeSrv = timeSrv;\n\n this.events.on('render', this.onRender.bind(this));\n this.events.on('data-received', this.onDataReceived.bind(this));\n this.events.on('data-error', this.onDataError.bind(this));\n this.events.on('data-snapshot-load', this.onDataReceived.bind(this));\n this.events.on('init-edit-mode', this.onInitEditMode.bind(this));\n this.events.on('refresh', this.postRefresh.bind(this));\n // custom event from rendering.js\n this.events.on('render-complete', this.onRenderComplete.bind(this));\n this.events.on('onChangeType', this.onChangeType.bind(this));\n\n this.onCardColorChange = this.onCardColorChange.bind(this);\n }\n\n onRenderComplete(data: any):void {\n // console.log({\n // data: this.data,\n // bucketMatrix: this.bucketMatrix,\n // chartWidth: data.chartWidth,\n // from: this.range.from.valueOf(),\n // to: this.range.to.valueOf()\n // })\n\n this.graph.chartWidth = data.chartWidth;\n this.renderingCompleted();\n }\n\n onChangeType(url): void {\n switch (url.type) {\n case ExtraSeriesFormat.Date:\n url.extraSeries.format = ExtraSeriesFormatValue.Date;\n break;\n case ExtraSeriesFormat.Raw:\n url.extraSeries.format = ExtraSeriesFormatValue.Raw;\n break;\n default:\n url.extraSeries.format = ExtraSeriesFormatValue.Raw;\n break;\n }\n }\n\n // getChartWidth returns an approximation of chart canvas width or\n // a saved value calculated during a render.\n getChartWidth():number {\n if (this.graph.chartWidth > 0) {\n return this.graph.chartWidth;\n }\n\n const wndWidth = $(window).width();\n // gripPos.w is a width in grid's measurements. Grid size in Grafana is 24.\n const panelWidthFactor = this.panel.gridPos.w / 24;\n const panelWidth = Math.ceil(wndWidth * panelWidthFactor);\n // approximate width of the chart draw canvas:\n // - y axis ticks are not rendered yet on first data receive,\n // so choose 200 as a decent value for y legend width\n // - chartWidth can not be lower than the half of the panel width.\n const chartWidth = _.max([\n panelWidth - 200,\n panelWidth/2\n ]);\n\n return chartWidth!;\n }\n\n // Quick workaround for 6.7 and 7.0+. There is no call to\n // calculateInterval in updateTimeRange in those versions.\n updateTimeRange(datasource?: any) {\n let ret = super.updateTimeRange(datasource);\n this.calculateInterval();\n return ret;\n }\n\n // calculateInterval is called on 'refresh' to calculate an interval\n // for datasource.\n // It is override of calculateInterval from MetricsPanelCtrl.\n calculateInterval() {\n let chartWidth = this.getChartWidth();\n\n let minCardWidth = this.panel.cards.cardMinWidth;\n let minSpacing = this.panel.cards.cardHSpacing;\n let maxCardsCount = Math.ceil((chartWidth-minCardWidth) / (minCardWidth + minSpacing));\n\n let intervalMs;\n let rangeMs = this.range.to.valueOf() - this.range.from.valueOf();\n\n // this is minimal interval! kbn.round_interval will lower it.\n intervalMs = this.discreteExtraSeries.roundIntervalCeil(rangeMs / maxCardsCount);\n\n // Calculate low limit of interval\n let lowLimitMs = 1; // 1 millisecond default low limit\n \n let intervalOverride = this.panel.interval;\n\n // if no panel interval check datasource\n if (intervalOverride) {\n intervalOverride = this.templateSrv.replace(intervalOverride, this.panel.scopedVars);\n } else if (this.datasource && this.datasource.interval) {\n intervalOverride = this.datasource.interval;\n }\n\n if (intervalOverride) {\n if (intervalOverride[0] === '>') {\n intervalOverride = intervalOverride.slice(1);\n }\n lowLimitMs = kbn.interval_to_ms(intervalOverride);\n }\n\n if (lowLimitMs > intervalMs) {\n intervalMs = lowLimitMs;\n }\n let interval = kbn.secondsToHms(intervalMs / 1000);\n\n this.intervalMs = intervalMs;\n this.interval = interval;\n\n // Get final buckets count after interval is adjusted\n //this.xBucketsCount = Math.floor(rangeMs / intervalMs);\n\n // console.log(\"calculateInterval: \", {\n // interval: this.interval,\n // intervalMs: this.intervalMs,\n // rangeMs: rangeMs,\n // from: this.range.from.valueOf(),\n // to: this.range.to.valueOf(),\n // numIntervals: rangeMs/this.intervalMs,\n // maxCardsCount: maxCardsCount,\n // });\n }\n\n issueQueries(datasource: any) {\n this.annotationsPromise = this.annotationsSrv.getAnnotations({\n dashboard: this.dashboard,\n panel: this.panel,\n range: this.range,\n });\n\n /* Wait for annotationSrv requests to get datasources to\n * resolve before issuing queries. This allows the annotations\n * service to fire annotations queries before graph queries\n * (but not wait for completion). This resolves\n * issue 11806.\n */\n // 5.x before 5.4 doesn't have datasourcePromises. \n\n if (\"undefined\" !== typeof(this.annotationsSrv.datasourcePromises)) {\n return this.annotationsSrv.datasourcePromises.then(r => {\n return this.issueQueriesWithInterval(datasource, this.interval);\n });\n } else {\n return this.issueQueriesWithInterval(datasource, this.interval);\n }\n }\n\n // Grafana 6.2 (and older) is using this.interval for queries,\n // but Grafana 6.3+ is calculating interval again in queryRunner,\n // so we need to save-restore this.panel.interval.\n issueQueriesWithInterval(datasource: any, interval: any) {\n var origInterval = this.panel.interval;\n this.panel.interval = interval;\n var res = super.issueQueries(datasource);\n this.panel.interval = origInterval;\n return res;\n }\n\n\n onDataReceived(dataList: any) {\n this.data = dataList;\n // Quick workaround for 7.0+. There is no call to\n // calculateInterval when enter Edit mode.\n if (!this.intervalMs) {\n this.calculateInterval();\n }\n this.bucketMatrix = this.convertDataToBuckets(dataList, this.range.from.valueOf(), this.range.to.valueOf(), this.intervalMs, true);\n this.noDatapoints = this.bucketMatrix.noDatapoints;\n\n if (this.annotationsPromise) {\n this.annotationsPromise.then(\n (result: { alertState: any; annotations: any }) => {\n this.loading = false;\n //this.alertState = result.alertState;\n if (result.annotations && result.annotations.length > 0) {\n this.annotations = result.annotations;\n } else {\n this.annotations = [];\n }\n this.render();\n },\n () => {\n this.loading = false;\n this.annotations = [];\n this.render();\n }\n );\n } else {\n this.loading = false;\n this.annotations = [];\n this.render();\n }\n }\n\n onInitEditMode() {\n this.addEditorTab('Options', statusHeatmapOptionsEditor, 2);\n this.unitFormats = kbn.getUnitFormats();\n }\n\n // onRender will be called before StatusmapRenderer.onRender.\n // Decide if warning should be displayed over cards.\n onRender() {\n if (!this.range || !this.data) {\n this.noDatapoints = true;\n return;\n }\n\n this.multipleValues = false;\n if (!this.panel.useMax) {\n if (this.bucketMatrix) {\n this.multipleValues = this.bucketMatrix.multipleValues;\n }\n }\n\n this.noColorDefined = false;\n if (this.panel.color.mode === 'discrete') {\n if (this.panel.seriesFilterIndex == -1) {\n this.discreteExtraSeries.updateCardsValuesHasColorInfo();\n } else {\n this.discreteExtraSeries.updateCardsValuesHasColorInfoSingle();\n }\n if (this.bucketMatrix) {\n this.noColorDefined = this.bucketMatrix.noColorDefined;\n }\n }\n\n this.noDatapoints = false;\n if (this.bucketMatrix) {\n this.noDatapoints = this.bucketMatrix.noDatapoints;\n }\n\n //console.log(this);\n }\n\n onCardColorChange(newColor) {\n this.panel.color.cardColor = newColor;\n this.render();\n }\n\n onDataError() {\n this.data = [];\n this.annotations = [];\n this.render();\n }\n\n postRefresh() {\n this.noColorDefined = false;\n }\n\n onEditorAddThreshold() {\n this.panel.color.thresholds.push({ color: this.panel.defaultColor });\n this.render();\n }\n\n onEditorAddUrl = () => {\n this.panel.urls.push({\n label: '',\n base_url: '',\n useExtraSeries: false,\n useseriesname: true,\n forcelowercase: true,\n icon_fa: 'external-link',\n extraSeries: {\n index: -1\n }\n });\n this.render();\n }\n\n onEditorRemoveUrl = (index) => {\n this.panel.urls.splice(index, 1);\n this.render();\n }\n\n onEditorRemoveThreshold(index:number) {\n this.panel.color.thresholds.splice(index, 1);\n this.render();\n }\n\n onEditorRemoveThresholds() {\n this.panel.color.thresholds = [];\n this.render();\n }\n\n\n onEditorRemoveUrls = () => {\n this.panel.urls = [];\n this.render();\n }\n\n onEditorAddThreeLights() {\n this.panel.color.thresholds.push({color: \"red\", value: 2, tooltip: \"error\" });\n this.panel.color.thresholds.push({color: \"yellow\", value: 1, tooltip: \"warning\" });\n this.panel.color.thresholds.push({color: \"green\", value: 0, tooltip: \"ok\" });\n this.render();\n }\n \n /* https://ethanschoonover.com/solarized/ */\n onEditorAddSolarized() {\n this.panel.color.thresholds.push({color: \"#b58900\", value: 0, tooltip: \"yellow\" });\n this.panel.color.thresholds.push({color: \"#cb4b16\", value: 1, tooltip: \"orange\" });\n this.panel.color.thresholds.push({color: \"#dc322f\", value: 2, tooltip: \"red\" });\n this.panel.color.thresholds.push({color: \"#d33682\", value: 3, tooltip: \"magenta\" });\n this.panel.color.thresholds.push({color: \"#6c71c4\", value: 4, tooltip: \"violet\" });\n this.panel.color.thresholds.push({color: \"#268bd2\", value: 5, tooltip: \"blue\" });\n this.panel.color.thresholds.push({color: \"#2aa198\", value: 6, tooltip: \"cyan\" });\n this.panel.color.thresholds.push({color: \"#859900\", value: 7, tooltip: \"green\" });\n this.render();\n }\n\n link(scope, elem, attrs, ctrl) {\n rendering(scope, elem, attrs, ctrl);\n }\n\n retrieveTimeVar() {\n var time = this.timeSrv.timeRangeForUrl();\n var var_time = '&from=' + time.from + '&to=' + time.to;\n return var_time;\n }\n\n // convertToBuckets groups values in data into buckets by target and timestamp.\n //\n // data is a result from datasource. It is an array of timeseries and tables:\n /* [\n // timeseries\n {\n target: \"query alias\",\n refId: \"A\",\n datapoints: [\n [0, 1582681239911],\n [3, 158....],\n ...\n ],\n tags?:{key: value,...}\n },\n // table\n {\n name: \"table name\",\n refId: \"B\",\n columns: [\n {text: \"id\"},\n {text: \"info\"},\n ...\n ],\n rows: [\n [1, \"123\"],\n [2, \"44411\"],\n ...\n ]\n },\n...\n ]\n\n to and from — a time range of the panel.\n intervalMs — a calculated interval. It is used to split a time range.\n */\n convertDataToBuckets(data:any, from:number, to:number, intervalMs: number, mostRecentBucket: boolean):BucketMatrix {\n let bucketMatrix = new BucketMatrix();\n bucketMatrix.rangeMs = to - from;\n bucketMatrix.intervalMs = intervalMs;\n\n if (!data || data.length == 0) { \n // Mimic heatmap and graph 'no data' labels.\n bucketMatrix.targets = [\n \"1.0\", \"0.0\", \"-1.0\"\n ];\n bucketMatrix.buckets[\"1.0\"] = [];\n bucketMatrix.buckets[\"0.0\"] = [];\n bucketMatrix.buckets[\"-1.0\"] = [];\n bucketMatrix.xBucketSize = 42;\n bucketMatrix.noDatapoints = true;\n return bucketMatrix;\n }\n\n let targetIndex: {[target: string]: number[]} = {};\n\n // Group indicies of elements in data by target (y label).\n \n // lodash version:\n //_.map(data, (d, i) => {\n // targetIndex[d.target] = _.concat(_.toArray(targetIndex[d.target]), i);\n //});\n\n data.map((queryResult: any, i: number) => {\n let yLabel = queryResult.target;\n if (!targetIndex.hasOwnProperty(yLabel)) {\n targetIndex[yLabel] = [];\n }\n targetIndex[yLabel].push(i);\n });\n\n let targetKeys = _.keys(targetIndex);\n\n //console.log (\"targetIndex: \", targetIndex, \"targetKeys: \", targetKeys);\n\n let targetTimestampRanges: {[target: string]: {[timestamp: number]: number[]}} = {};\n\n // Collect all timestamps for each target.\n // Make map timestamp => [from, to]. from == previous ts, to == ts from datapoint.\n targetKeys.map((target) => {\n let targetTimestamps: any[] = [];\n\n for (let si = 0; si < targetIndex[target].length; si++) {\n let s = data[targetIndex[target][si]];\n _.map(s.datapoints, (datapoint, idx) => {\n targetTimestamps.push(datapoint[TIME_INDEX]-from);\n })\n }\n\n //console.log(\"timestamps['\"+target+\"'] = \", targetTimestamps);\n\n targetTimestamps = _.uniq(targetTimestamps);\n\n //console.log(\"uniq timestamps['\"+target+\"'] = \", targetTimestamps);\n\n targetTimestampRanges[target] = [];\n for (let i = targetTimestamps.length-1 ; i>=0; i-- ) {\n let tsTo = targetTimestamps[i];\n let tsFrom = 0;\n if (tsTo < 0) {\n tsFrom = tsTo - intervalMs;\n } else {\n if (i-1 >= 0) {\n // Set from to previous timestamp + 1ms;\n tsFrom = targetTimestamps[i-1]+1;\n // tfTo - tfFrom should not be more than intervalMs\n let minFrom = tsTo - intervalMs;\n if (tsFrom < minFrom) {\n tsFrom = minFrom;\n }\n }\n }\n targetTimestampRanges[target][tsTo] = [tsFrom, tsTo];\n }\n });\n\n // console.log (\"targetTimestampRanges: \", targetTimestampRanges);\n\n // Create empty buckets using intervalMs to calculate ranges.\n // If mostRecentBucket is set, create a bucket with a range \"to\":\"to\"\n // to store most recent values.\n targetKeys.map((target) => {\n let targetEmptyBuckets: any[] = [];\n\n let lastTs = to-from;\n\n if (mostRecentBucket) {\n let topBucket = new Bucket();\n topBucket.yLabel = target;\n topBucket.relTo = lastTs;\n topBucket.relFrom = lastTs;\n topBucket.values = [];\n topBucket.mostRecent = true;\n if (targetTimestampRanges[target].hasOwnProperty(lastTs)) {\n topBucket.relFrom = targetTimestampRanges[target][lastTs][0];\n lastTs = topBucket.relFrom;\n }\n topBucket.to = topBucket.relTo+from;\n topBucket.from = topBucket.relFrom+from;\n targetEmptyBuckets.push(topBucket);\n }\n\n let idx = 0;\n let bucketFrom: number = 0;\n while (bucketFrom >= 0) {\n let b = new Bucket();\n b.yLabel = target;\n b.relTo = lastTs - idx*intervalMs;\n b.relFrom = lastTs - ((idx+1) * intervalMs);\n b.to = b.relTo+from;\n b.from = b.relFrom+from;\n b.values = [];\n bucketFrom = b.relFrom;\n targetEmptyBuckets.push(b);\n idx++;\n }\n\n targetEmptyBuckets.map((bucket, i) => {\n bucket.xid = i;\n });\n\n bucketMatrix.buckets[target] = targetEmptyBuckets;\n });\n\n //console.log (\"bucketMatrix: \", bucketMatrix);\n \n // Put values into buckets.\n bucketMatrix.minValue = Number.MAX_VALUE;\n bucketMatrix.maxValue = Number.MIN_SAFE_INTEGER;\n targetKeys.map((target) => {\n targetIndex[target].map((dataIndex) => {\n let s = data[dataIndex];\n s.datapoints.map((dp: any) => {\n for (let i = 0; i < bucketMatrix.buckets[target].length; i++) {\n if (bucketMatrix.buckets[target][i].belong(dp[TIME_INDEX])) {\n bucketMatrix.buckets[target][i].put(dp[VALUE_INDEX]);\n }\n }\n });\n });\n bucketMatrix.buckets[target].map((bucket) => {\n bucket.minValue = _.min(bucket.values);\n bucket.maxValue = _.max(bucket.values);\n if (bucket.minValue < bucketMatrix.minValue) {\n bucketMatrix.minValue = bucket.minValue;\n }\n if (bucket.maxValue > bucketMatrix.maxValue) {\n bucketMatrix.maxValue = bucket.maxValue;\n }\n bucket.value = bucket.maxValue;\n if (bucket.values.length > 1) {\n bucketMatrix.multipleValues = true;\n bucket.multipleValues = true;\n\n bucket.value = this.panel.seriesFilterIndex != -1 ? bucket.values[this.panel.seriesFilterIndex] : bucket.maxValue;\n }\n })\n });\n\n bucketMatrix.xBucketSize = Number.MIN_SAFE_INTEGER;\n targetKeys.map((target) => {\n let bucketsLen: number = bucketMatrix.buckets[target].length;\n if (bucketsLen > bucketMatrix.xBucketSize) {\n bucketMatrix.xBucketSize = bucketsLen;\n }\n });\n\n //console.log (\"bucketMatrix with values: \", bucketMatrix);\n\n bucketMatrix.targets = targetKeys;\n return bucketMatrix;\n this.bucketMatrix = bucketMatrix;\n \n // Collect all values for each bucket from datapoints with similar target.\n // TODO aggregate values into buckets over datapoint[TIME_INDEX] not over datapoint index (j).\n\n\n // for(let i = 0; i < cardsData.targets.length; i++) {\n // let target = cardsData.targets[i];\n\n // for (let j = 0; j < cardsData.xBucketSize; j++) {\n // let card = new Card();\n // card.id = i*cardsData.xBucketSize + j;\n // card.values = [];\n // card.y = target;\n // card.x = -1;\n\n // // collect values from all timeseries with target\n // for (let si = 0; si < cardsData.targetIndex[target].length; si++) {\n // let s = data[cardsData.targetIndex[target][si]];\n // if (s.datapoints.length <= j) {\n // continue;\n // }\n // let datapoint = s.datapoints[j];\n // if (card.values.length === 0) {\n // card.x = datapoint[TIME_INDEX];\n // }\n // card.values.push(datapoint[VALUE_INDEX]);\n // }\n // card.minValue = _.min(card.values);\n // card.maxValue = _.max(card.values);\n // if (card.values.length > 1) {\n // cardsData.multipleValues = true;\n // card.multipleValues = true;\n // card.value = card.maxValue; // max value by default\n // } else {\n // card.value = card.maxValue; // max value by default\n // }\n\n // if (cardsData.maxValue < card.maxValue)\n // cardsData.maxValue = card.maxValue;\n\n // if (cardsData.minValue > card.minValue)\n // cardsData.minValue = card.minValue;\n\n // if (card.x != -1) {\n // cardsData.cards.push(card);\n // }\n // }\n // }\n\n\n\n\n // let cardsData = {\n // cards: [],\n // xBucketSize: 0,\n // yBucketSize: 0,\n // maxValue: 0,\n // minValue: 0,\n // multipleValues: false,\n // noColorDefined: false,\n // targets: [], // array of available unique targets\n // targetIndex: {} // indices in data array for each of available unique targets\n // };\n\n // if (!data || data.length == 0) { return cardsData;}\n\n // // Collect uniq timestamps from data and spread over targets and timestamps\n\n // // collect uniq targets and their indices\n // _.map(data, (d, i) => {\n // cardsData.targetIndex[d.target] = _.concat(_.toArray(cardsData.targetIndex[d.target]), i)\n // });\n\n // // TODO add some logic for targets heirarchy\n // cardsData.targets = _.keys(cardsData.targetIndex);\n // cardsData.yBucketSize = cardsData.targets.length;\n // // Maximum number of buckets over x axis\n // cardsData.xBucketSize = _.max(_.map(data, d => d.datapoints.length));\n\n // // Collect all values for each bucket from datapoints with similar target.\n // // TODO aggregate values into buckets over datapoint[TIME_INDEX] not over datapoint index (j).\n // for(let i = 0; i < cardsData.targets.length; i++) {\n // let target = cardsData.targets[i];\n\n // for (let j = 0; j < cardsData.xBucketSize; j++) {\n // let card = new Card();\n // card.id = i*cardsData.xBucketSize + j;\n // card.values = [];\n // card.y = target;\n // card.x = -1;\n\n // // collect values from all timeseries with target\n // for (let si = 0; si < cardsData.targetIndex[target].length; si++) {\n // let s = data[cardsData.targetIndex[target][si]];\n // if (s.datapoints.length <= j) {\n // continue;\n // }\n // let datapoint = s.datapoints[j];\n // if (card.values.length === 0) {\n // card.x = datapoint[TIME_INDEX];\n // }\n // card.values.push(datapoint[VALUE_INDEX]);\n // }\n // card.minValue = _.min(card.values);\n // card.maxValue = _.max(card.values);\n // if (card.values.length > 1) {\n // cardsData.multipleValues = true;\n // card.multipleValues = true;\n // card.value = card.maxValue; // max value by default\n // } else {\n // card.value = card.maxValue; // max value by default\n // }\n\n // if (cardsData.maxValue < card.maxValue)\n // cardsData.maxValue = card.maxValue;\n\n // if (cardsData.minValue > card.minValue)\n // cardsData.minValue = card.minValue;\n\n // if (card.x != -1) {\n // cardsData.cards.push(card);\n // }\n // }\n // }\n\n // return cardsData;\n }\n}\n\nexport {\n StatusHeatmapCtrl, StatusHeatmapCtrl as PanelCtrl\n};\n"],"file":"module.js"} \ No newline at end of file +{"version":3,"sources":["../src/module.ts"],"names":["_","optionsEditorCtrl","tooltipEditorCtrl","migratePanelConfig","kbn","loadPluginCss","MetricsPanelCtrl","Bucket","BucketMatrix","rendering","ColorModeDiscrete","VALUE_INDEX","TIME_INDEX","colorSchemes","name","value","invert","colorModes","opacityScales","dark","light","StatusHeatmapCtrl","$scope","$injector","timeSrv","annotationsSrv","$window","datasourceSrv","variableSrv","templateSrv","datasource","color","mode","cardColor","colorScale","exponent","colorScheme","defaultColor","thresholds","cards","cardMinWidth","cardVSpacing","cardHSpacing","cardRound","xAxis","show","yAxis","minWidth","maxWidth","tooltip","freezeOnClick","showItems","items","legend","nullPointMode","yAxisSort","highlightCards","useMax","seriesFilterIndex","panel","defaultsDeep","panelDefaults","graph","multipleValues","noColorDefined","discreteExtraSeries","dataWarnings","title","tip","noDatapoints","annotations","events","on","onRender","bind","onDataReceived","onDataError","onInitEditMode","postRefresh","onRenderComplete","onCardColorChange","data","chartWidth","renderingCompleted","wndWidth","$","window","width","panelWidthFactor","gridPos","w","panelWidth","Math","ceil","max","ret","calculateInterval","getChartWidth","minCardWidth","minSpacing","maxCardsCount","intervalMs","rangeMs","range","to","valueOf","from","roundIntervalCeil","lowLimitMs","intervalOverride","interval","replace","scopedVars","slice","interval_to_ms","secondsToHms","annotationsPromise","getAnnotations","dashboard","datasourcePromises","then","r","issueQueriesWithInterval","origInterval","res","dataList","bucketMatrix","convertDataToBuckets","result","loading","length","render","addEditorTab","unitFormats","getUnitFormats","updateCardsValuesHasColorInfo","updateCardsValuesHasColorInfoSingle","newColor","scope","elem","attrs","ctrl","time","timeRangeForUrl","mostRecentBucket","targets","buckets","xBucketSize","targetIndex","map","queryResult","i","yLabel","target","hasOwnProperty","push","targetKeys","keys","targetTimestampRanges","targetTimestamps","si","s","datapoints","datapoint","idx","uniq","tsTo","tsFrom","minFrom","targetEmptyBuckets","lastTs","topBucket","relTo","relFrom","values","mostRecent","bucketFrom","b","bucket","xid","minValue","Number","MAX_VALUE","maxValue","MIN_SAFE_INTEGER","dataIndex","dp","belong","put","min","bucketsLen"],"mappings":"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","sourcesContent":["// Libraries\nimport _ from 'lodash';\nimport { auto } from 'angular';\n\n// Components\nimport './color_legend';\nimport { optionsEditorCtrl } from './options_editor';\nimport { tooltipEditorCtrl } from './tooltip_editor';\nimport { migratePanelConfig } from './panel_config_migration';\n\n// Utils\nimport kbn from 'app/core/utils/kbn';\nimport {loadPluginCss} from 'app/plugins/sdk';\n\n// Types\nimport { MetricsPanelCtrl } from 'app/plugins/sdk';\nimport { AnnotationsSrv } from 'app/features/annotations/annotations_srv';\nimport { Bucket, BucketMatrix } from './statusmap_data';\nimport rendering from './rendering';\n\nimport {ColorModeDiscrete} from \"./color_mode_discrete\";\n\nconst VALUE_INDEX = 0,\n TIME_INDEX = 1;\n\nconst colorSchemes = [\n // Diverging\n { name: 'Spectral', value: 'interpolateSpectral', invert: 'always' },\n { name: 'RdYlGn', value: 'interpolateRdYlGn', invert: 'always' },\n { name: 'GnYlRd', value: 'interpolateGnYlRd', invert: 'always' },\n\n // Sequential (Single Hue)\n { name: 'Blues', value: 'interpolateBlues', invert: 'dark' },\n { name: 'Greens', value: 'interpolateGreens', invert: 'dark' },\n { name: 'Greys', value: 'interpolateGreys', invert: 'dark' },\n { name: 'Oranges', value: 'interpolateOranges', invert: 'dark' },\n { name: 'Purples', value: 'interpolatePurples', invert: 'dark' },\n { name: 'Reds', value: 'interpolateReds', invert: 'dark' },\n\n // Sequential (Multi-Hue)\n { name: 'BuGn', value: 'interpolateBuGn', invert: 'dark' },\n { name: 'BuPu', value: 'interpolateBuPu', invert: 'dark' },\n { name: 'GnBu', value: 'interpolateGnBu', invert: 'dark' },\n { name: 'OrRd', value: 'interpolateOrRd', invert: 'dark' },\n { name: 'PuBuGn', value: 'interpolatePuBuGn', invert: 'dark' },\n { name: 'PuBu', value: 'interpolatePuBu', invert: 'dark' },\n { name: 'PuRd', value: 'interpolatePuRd', invert: 'dark' },\n { name: 'RdPu', value: 'interpolateRdPu', invert: 'dark' },\n { name: 'YlGnBu', value: 'interpolateYlGnBu', invert: 'dark' },\n { name: 'YlGn', value: 'interpolateYlGn', invert: 'dark' },\n { name: 'YlOrBr', value: 'interpolateYlOrBr', invert: 'dark' },\n { name: 'YlOrRd', value: 'interpolateYlOrRd', invert: 'dark' }\n];\n\nlet colorModes = ['opacity', 'spectrum', 'discrete'];\nlet opacityScales = ['linear', 'sqrt'];\n\nloadPluginCss({\n dark: 'plugins/flant-statusmap-panel/css/statusmap.dark.css',\n light: 'plugins/flant-statusmap-panel/css/statusmap.light.css'\n});\n\nclass StatusHeatmapCtrl extends MetricsPanelCtrl {\n static templateUrl = 'module.html';\n\n data: any;\n bucketMatrix: BucketMatrix;\n\n graph: any;\n discreteHelper: ColorModeDiscrete;\n opacityScales: any = [];\n colorModes: any = [];\n colorSchemes: any = [];\n unitFormats: any;\n\n dataWarnings: {[warningId: string]: {title: string, tip: string}} = {};\n multipleValues: boolean;\n noColorDefined: boolean;\n noDatapoints: boolean;\n\n discreteExtraSeries: ColorModeDiscrete;\n\n annotations: object[] = [];\n annotationsPromise: any;\n\n panelDefaults: any = {\n // datasource name, null = default datasource\n datasource: null,\n // color mode\n color: {\n mode: 'spectrum',\n cardColor: '#b4ff00',\n colorScale: 'sqrt',\n exponent: 0.5,\n colorScheme: 'interpolateGnYlRd',\n // discrete mode settings\n defaultColor: '#757575',\n thresholds: [] // manual colors\n },\n // buckets settings\n cards: {\n cardMinWidth: 5,\n cardVSpacing: 2,\n cardHSpacing: 2,\n cardRound: null\n },\n xAxis: {\n show: true\n },\n yAxis: {\n show: true,\n minWidth: -1,\n maxWidth: -1\n },\n tooltip: {\n show: true,\n freezeOnClick: true,\n showItems: false,\n items: [] // see tooltip_editor.ts\n },\n legend: {\n show: true\n },\n // how null points should be handled\n nullPointMode: 'as empty',\n yAxisSort: 'metrics',\n highlightCards: true,\n useMax: true,\n\n seriesFilterIndex: -1\n };\n\n /** @ngInject */\n constructor($scope: any, $injector: auto.IInjectorService, timeSrv, private annotationsSrv: AnnotationsSrv, $window, datasourceSrv, public variableSrv: any, templateSrv) {\n super($scope, $injector);\n\n migratePanelConfig(this.panel);\n _.defaultsDeep(this.panel, this.panelDefaults);\n\n this.opacityScales = opacityScales;\n this.colorModes = colorModes;\n this.colorSchemes = colorSchemes;\n\n // default graph width for discrete card width calculation\n this.graph = {\n \"chartWidth\" : -1\n };\n\n this.multipleValues = false;\n this.noColorDefined = false;\n\n this.discreteExtraSeries = new ColorModeDiscrete($scope);\n\n this.dataWarnings = {\n noColorDefined: {\n title: 'Data has value with undefined color',\n tip: 'Check metric values, color values or define a new color',\n },\n multipleValues: {\n title: 'Data has multiple values for one target',\n tip: 'Change targets definitions or set \"use max value\"',\n },\n noDatapoints: {\n title: 'No data points',\n tip: 'No datapoints returned from data query',\n }\n };\n\n this.annotations = [];\n this.annotationsSrv = annotationsSrv;\n \n this.timeSrv = timeSrv;\n\n this.events.on('render', this.onRender.bind(this));\n this.events.on('data-received', this.onDataReceived.bind(this));\n this.events.on('data-error', this.onDataError.bind(this));\n this.events.on('data-snapshot-load', this.onDataReceived.bind(this));\n this.events.on('init-edit-mode', this.onInitEditMode.bind(this));\n this.events.on('refresh', this.postRefresh.bind(this));\n // custom event from rendering.js\n this.events.on('render-complete', this.onRenderComplete.bind(this));\n\n this.onCardColorChange = this.onCardColorChange.bind(this);\n }\n\n onRenderComplete(data: any):void {\n this.graph.chartWidth = data.chartWidth;\n this.renderingCompleted();\n }\n\n // getChartWidth returns an approximation of chart canvas width or\n // a saved value calculated during a render.\n getChartWidth():number {\n if (this.graph.chartWidth > 0) {\n return this.graph.chartWidth;\n }\n\n const wndWidth = $(window).width();\n // gripPos.w is a width in grid's measurements. Grid size in Grafana is 24.\n const panelWidthFactor = this.panel.gridPos.w / 24;\n const panelWidth = Math.ceil(wndWidth * panelWidthFactor);\n // approximate width of the chart draw canvas:\n // - y axis ticks are not rendered yet on first data receive,\n // so choose 200 as a decent value for y legend width\n // - chartWidth can not be lower than the half of the panel width.\n const chartWidth = _.max([\n panelWidth - 200,\n panelWidth/2\n ]);\n\n return chartWidth!;\n }\n\n // Quick workaround for 6.7 and 7.0+. There is no call to\n // calculateInterval in updateTimeRange in those versions.\n // TODO ts type has no argument for this method.\n updateTimeRange(datasource?: any) {\n let ret = super.updateTimeRange(datasource);\n this.calculateInterval();\n return ret;\n }\n\n // calculateInterval is called on 'refresh' to calculate an interval\n // for datasource.\n // It is override of calculateInterval from MetricsPanelCtrl.\n calculateInterval() {\n let chartWidth = this.getChartWidth();\n\n let minCardWidth = this.panel.cards.cardMinWidth;\n let minSpacing = this.panel.cards.cardHSpacing;\n let maxCardsCount = Math.ceil((chartWidth-minCardWidth) / (minCardWidth + minSpacing));\n\n let intervalMs;\n let rangeMs = this.range.to.valueOf() - this.range.from.valueOf();\n\n // this is minimal interval! kbn.round_interval will lower it.\n intervalMs = this.discreteExtraSeries.roundIntervalCeil(rangeMs / maxCardsCount);\n\n // Calculate low limit of interval\n let lowLimitMs = 1; // 1 millisecond default low limit\n \n let intervalOverride = this.panel.interval;\n\n // if no panel interval check datasource\n if (intervalOverride) {\n intervalOverride = this.templateSrv.replace(intervalOverride, this.panel.scopedVars);\n } else if (this.datasource && this.datasource.interval) {\n intervalOverride = this.datasource.interval;\n }\n\n if (intervalOverride) {\n if (intervalOverride[0] === '>') {\n intervalOverride = intervalOverride.slice(1);\n }\n lowLimitMs = kbn.interval_to_ms(intervalOverride);\n }\n\n if (lowLimitMs > intervalMs) {\n intervalMs = lowLimitMs;\n }\n let interval = kbn.secondsToHms(intervalMs / 1000);\n\n this.intervalMs = intervalMs;\n this.interval = interval;\n\n // Get final buckets count after interval is adjusted\n // TODO is it needed?\n //this.xBucketsCount = Math.floor(rangeMs / intervalMs);\n }\n\n issueQueries(datasource: any) {\n this.annotationsPromise = this.annotationsSrv.getAnnotations({\n dashboard: this.dashboard,\n panel: this.panel,\n range: this.range,\n });\n\n /* Wait for annotationSrv requests to get datasources to\n * resolve before issuing queries. This allows the annotations\n * service to fire annotations queries before graph queries\n * (but not wait for completion). This resolves\n * issue 11806.\n */\n // 5.x before 5.4 doesn't have datasourcePromises.\n if (\"undefined\" !== typeof(this.annotationsSrv.datasourcePromises)) {\n return this.annotationsSrv.datasourcePromises.then(r => {\n return this.issueQueriesWithInterval(datasource, this.interval);\n });\n } else {\n return this.issueQueriesWithInterval(datasource, this.interval);\n }\n }\n\n // Grafana 6.2 (and older) is using this.interval for queries,\n // but Grafana 6.3+ is calculating interval again in queryRunner,\n // so we need to save-restore this.panel.interval.\n issueQueriesWithInterval(datasource: any, interval: any) {\n var origInterval = this.panel.interval;\n this.panel.interval = interval;\n var res = super.issueQueries(datasource);\n this.panel.interval = origInterval;\n return res;\n }\n\n onDataReceived(dataList: any) {\n this.data = dataList;\n // Quick workaround for 7.0+. There is no call to\n // calculateInterval when enter Edit mode.\n if (!this.intervalMs) {\n this.calculateInterval();\n }\n this.bucketMatrix = this.convertDataToBuckets(dataList, this.range.from.valueOf(), this.range.to.valueOf(), this.intervalMs, true);\n this.noDatapoints = this.bucketMatrix.noDatapoints;\n\n if (this.annotationsPromise) {\n this.annotationsPromise.then(\n (result: { alertState: any; annotations: any }) => {\n this.loading = false;\n //this.alertState = result.alertState;\n if (result.annotations && result.annotations.length > 0) {\n this.annotations = result.annotations;\n } else {\n this.annotations = [];\n }\n this.render();\n },\n () => {\n this.loading = false;\n this.annotations = [];\n this.render();\n }\n );\n } else {\n this.loading = false;\n this.annotations = [];\n this.render();\n }\n }\n\n onInitEditMode() {\n this.addEditorTab('Options', optionsEditorCtrl, 2);\n this.addEditorTab('Tooltip', tooltipEditorCtrl, 3);\n this.unitFormats = kbn.getUnitFormats();\n }\n\n // onRender will be called before StatusmapRenderer.onRender.\n // Decide if warning should be displayed over cards.\n onRender() {\n if (!this.range || !this.data) {\n this.noDatapoints = true;\n return;\n }\n\n this.multipleValues = false;\n if (!this.panel.useMax) {\n if (this.bucketMatrix) {\n this.multipleValues = this.bucketMatrix.multipleValues;\n }\n }\n\n this.noColorDefined = false;\n if (this.panel.color.mode === 'discrete') {\n if (this.panel.seriesFilterIndex == -1) {\n this.discreteExtraSeries.updateCardsValuesHasColorInfo();\n } else {\n this.discreteExtraSeries.updateCardsValuesHasColorInfoSingle();\n }\n if (this.bucketMatrix) {\n this.noColorDefined = this.bucketMatrix.noColorDefined;\n }\n }\n\n this.noDatapoints = false;\n if (this.bucketMatrix) {\n this.noDatapoints = this.bucketMatrix.noDatapoints;\n }\n }\n\n onCardColorChange(newColor) {\n this.panel.color.cardColor = newColor;\n this.render();\n }\n\n onDataError() {\n this.data = [];\n this.annotations = [];\n this.render();\n }\n\n postRefresh() {\n this.noColorDefined = false;\n }\n\n link(scope, elem, attrs, ctrl) {\n rendering(scope, elem, attrs, ctrl);\n }\n\n // Compatible with Grafana 7.0 overrides feature.\n retrieveTimeVar() {\n var time = this.timeSrv.timeRangeForUrl();\n return 'from=' + time.from + '&to=' + time.to;\n }\n\n // convertToBuckets groups values in data into buckets by target and timestamp.\n //\n // data is a result from datasource. It is an array of timeseries and tables:\n /* [\n // timeseries\n {\n target: \"query alias\",\n refId: \"A\",\n datapoints: [\n [0, 1582681239911],\n [3, 158....],\n ...\n ],\n tags?:{key: value,...}\n },\n // table\n {\n name: \"table name\",\n refId: \"B\",\n columns: [\n {text: \"id\"},\n {text: \"info\"},\n ...\n ],\n rows: [\n [1, \"123\"],\n [2, \"44411\"],\n ...\n ]\n },\n...\n ]\n\n to and from — a time range of the panel.\n intervalMs — a calculated interval. It is used to split a time range.\n */\n convertDataToBuckets(data:any, from:number, to:number, intervalMs: number, mostRecentBucket: boolean):BucketMatrix {\n let bucketMatrix = new BucketMatrix();\n bucketMatrix.rangeMs = to - from;\n bucketMatrix.intervalMs = intervalMs;\n\n if (!data || data.length == 0) { \n // Mimic heatmap and graph 'no data' labels.\n bucketMatrix.targets = [\n \"1.0\", \"0.0\", \"-1.0\"\n ];\n bucketMatrix.buckets[\"1.0\"] = [];\n bucketMatrix.buckets[\"0.0\"] = [];\n bucketMatrix.buckets[\"-1.0\"] = [];\n bucketMatrix.xBucketSize = 42;\n bucketMatrix.noDatapoints = true;\n return bucketMatrix;\n }\n\n let targetIndex: {[target: string]: number[]} = {};\n\n // Group indicies of elements in data by target (y label).\n \n // lodash version:\n //_.map(data, (d, i) => {\n // targetIndex[d.target] = _.concat(_.toArray(targetIndex[d.target]), i);\n //});\n\n data.map((queryResult: any, i: number) => {\n let yLabel = queryResult.target;\n if (!targetIndex.hasOwnProperty(yLabel)) {\n targetIndex[yLabel] = [];\n }\n targetIndex[yLabel].push(i);\n });\n\n let targetKeys = _.keys(targetIndex);\n\n //console.log (\"targetIndex: \", targetIndex, \"targetKeys: \", targetKeys);\n\n let targetTimestampRanges: {[target: string]: {[timestamp: number]: number[]}} = {};\n\n // Collect all timestamps for each target.\n // Make map timestamp => [from, to]. from == previous ts, to == ts from datapoint.\n targetKeys.map((target) => {\n let targetTimestamps: any[] = [];\n\n for (let si = 0; si < targetIndex[target].length; si++) {\n let s = data[targetIndex[target][si]];\n _.map(s.datapoints, (datapoint, idx) => {\n targetTimestamps.push(datapoint[TIME_INDEX]-from);\n })\n }\n\n //console.log(\"timestamps['\"+target+\"'] = \", targetTimestamps);\n\n targetTimestamps = _.uniq(targetTimestamps);\n\n //console.log(\"uniq timestamps['\"+target+\"'] = \", targetTimestamps);\n\n targetTimestampRanges[target] = [];\n for (let i = targetTimestamps.length-1 ; i>=0; i-- ) {\n let tsTo = targetTimestamps[i];\n let tsFrom = 0;\n if (tsTo < 0) {\n tsFrom = tsTo - intervalMs;\n } else {\n if (i-1 >= 0) {\n // Set from to previous timestamp + 1ms;\n tsFrom = targetTimestamps[i-1]+1;\n // tfTo - tfFrom should not be more than intervalMs\n let minFrom = tsTo - intervalMs;\n if (tsFrom < minFrom) {\n tsFrom = minFrom;\n }\n }\n }\n targetTimestampRanges[target][tsTo] = [tsFrom, tsTo];\n }\n });\n\n // console.log (\"targetTimestampRanges: \", targetTimestampRanges);\n\n // Create empty buckets using intervalMs to calculate ranges.\n // If mostRecentBucket is set, create a bucket with a range \"to\":\"to\"\n // to store most recent values.\n targetKeys.map((target) => {\n let targetEmptyBuckets: any[] = [];\n\n let lastTs = to-from;\n\n if (mostRecentBucket) {\n let topBucket = new Bucket();\n topBucket.yLabel = target;\n topBucket.relTo = lastTs;\n topBucket.relFrom = lastTs;\n topBucket.values = [];\n topBucket.mostRecent = true;\n if (targetTimestampRanges[target].hasOwnProperty(lastTs)) {\n topBucket.relFrom = targetTimestampRanges[target][lastTs][0];\n lastTs = topBucket.relFrom;\n }\n topBucket.to = topBucket.relTo+from;\n topBucket.from = topBucket.relFrom+from;\n targetEmptyBuckets.push(topBucket);\n }\n\n let idx = 0;\n let bucketFrom: number = 0;\n while (bucketFrom >= 0) {\n let b = new Bucket();\n b.yLabel = target;\n b.relTo = lastTs - idx*intervalMs;\n b.relFrom = lastTs - ((idx+1) * intervalMs);\n b.to = b.relTo+from;\n b.from = b.relFrom+from;\n b.values = [];\n bucketFrom = b.relFrom;\n targetEmptyBuckets.push(b);\n idx++;\n }\n\n targetEmptyBuckets.map((bucket, i) => {\n bucket.xid = i;\n });\n\n bucketMatrix.buckets[target] = targetEmptyBuckets;\n });\n\n //console.log (\"bucketMatrix: \", bucketMatrix);\n \n // Put values into buckets.\n bucketMatrix.minValue = Number.MAX_VALUE;\n bucketMatrix.maxValue = Number.MIN_SAFE_INTEGER;\n targetKeys.map((target) => {\n targetIndex[target].map((dataIndex) => {\n let s = data[dataIndex];\n s.datapoints.map((dp: any) => {\n for (let i = 0; i < bucketMatrix.buckets[target].length; i++) {\n if (bucketMatrix.buckets[target][i].belong(dp[TIME_INDEX])) {\n bucketMatrix.buckets[target][i].put(dp[VALUE_INDEX]);\n }\n }\n });\n });\n bucketMatrix.buckets[target].map((bucket) => {\n bucket.minValue = _.min(bucket.values);\n bucket.maxValue = _.max(bucket.values);\n if (bucket.minValue < bucketMatrix.minValue) {\n bucketMatrix.minValue = bucket.minValue;\n }\n if (bucket.maxValue > bucketMatrix.maxValue) {\n bucketMatrix.maxValue = bucket.maxValue;\n }\n bucket.value = bucket.maxValue;\n if (bucket.values.length > 1) {\n bucketMatrix.multipleValues = true;\n bucket.multipleValues = true;\n\n bucket.value = this.panel.seriesFilterIndex != -1 ? bucket.values[this.panel.seriesFilterIndex] : bucket.maxValue;\n }\n })\n });\n\n bucketMatrix.xBucketSize = Number.MIN_SAFE_INTEGER;\n targetKeys.map((target) => {\n let bucketsLen: number = bucketMatrix.buckets[target].length;\n if (bucketsLen > bucketMatrix.xBucketSize) {\n bucketMatrix.xBucketSize = bucketsLen;\n }\n });\n\n //console.log (\"bucketMatrix with values: \", bucketMatrix);\n\n bucketMatrix.targets = targetKeys;\n return bucketMatrix;\n }\n}\n\nexport {\n StatusHeatmapCtrl, StatusHeatmapCtrl as PanelCtrl\n};\n"],"file":"module.js"} \ No newline at end of file diff --git a/dist/options_editor.js b/dist/options_editor.js index 995ce7f..86f3e4c 100644 --- a/dist/options_editor.js +++ b/dist/options_editor.js @@ -13,7 +13,8 @@ System.register(["app/core/utils/kbn"], function (_export, _context) { 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; } - function statusHeatmapOptionsEditor() { + /** @ngInject */ + function optionsEditorCtrl() { 'use strict'; return { @@ -24,7 +25,7 @@ System.register(["app/core/utils/kbn"], function (_export, _context) { }; } - _export("statusHeatmapOptionsEditor", statusHeatmapOptionsEditor); + _export("optionsEditorCtrl", optionsEditorCtrl); return { setters: [function (_appCoreUtilsKbn) { @@ -34,6 +35,9 @@ System.register(["app/core/utils/kbn"], function (_export, _context) { _export("StatusHeatmapOptionsEditorCtrl", StatusHeatmapOptionsEditorCtrl = /*#__PURE__*/ function () { + StatusHeatmapOptionsEditorCtrl.$inject = ["$scope"]; + + /** @ngInject */ function StatusHeatmapOptionsEditorCtrl($scope) { _classCallCheck(this, StatusHeatmapOptionsEditorCtrl); @@ -47,7 +51,6 @@ System.register(["app/core/utils/kbn"], function (_export, _context) { this.panelCtrl = $scope.ctrl; this.panel = this.panelCtrl.panel; this.unitFormats = kbn.getUnitFormats(); - this.panelCtrl.render(); } _createClass(StatusHeatmapOptionsEditorCtrl, [{ @@ -56,6 +59,98 @@ System.register(["app/core/utils/kbn"], function (_export, _context) { this.panel.data.unitFormat = subItem.value; this.panelCtrl.render(); } + }, { + key: "render", + value: function render() { + this.panelCtrl.render(); + } + }, { + key: "onAddThreshold", + value: function onAddThreshold() { + this.panel.color.thresholds.push({ + color: this.panel.defaultColor + }); + this.render(); + } + }, { + key: "onRemoveThreshold", + value: function onRemoveThreshold(index) { + this.panel.color.thresholds.splice(index, 1); + this.render(); + } + }, { + key: "onRemoveThresholds", + value: function onRemoveThresholds() { + this.panel.color.thresholds = []; + this.render(); + } + }, { + key: "onAddThreeLights", + value: function onAddThreeLights() { + this.panel.color.thresholds.push({ + color: "red", + value: 2, + tooltip: "error" + }); + this.panel.color.thresholds.push({ + color: "yellow", + value: 1, + tooltip: "warning" + }); + this.panel.color.thresholds.push({ + color: "green", + value: 0, + tooltip: "ok" + }); + this.render(); + } + /* https://ethanschoonover.com/solarized/ */ + + }, { + key: "onAddSolarized", + value: function onAddSolarized() { + this.panel.color.thresholds.push({ + color: "#b58900", + value: 0, + tooltip: "yellow" + }); + this.panel.color.thresholds.push({ + color: "#cb4b16", + value: 1, + tooltip: "orange" + }); + this.panel.color.thresholds.push({ + color: "#dc322f", + value: 2, + tooltip: "red" + }); + this.panel.color.thresholds.push({ + color: "#d33682", + value: 3, + tooltip: "magenta" + }); + this.panel.color.thresholds.push({ + color: "#6c71c4", + value: 4, + tooltip: "violet" + }); + this.panel.color.thresholds.push({ + color: "#268bd2", + value: 5, + tooltip: "blue" + }); + this.panel.color.thresholds.push({ + color: "#2aa198", + value: 6, + tooltip: "cyan" + }); + this.panel.color.thresholds.push({ + color: "#859900", + value: 7, + tooltip: "green" + }); + this.render(); + } }]); return StatusHeatmapOptionsEditorCtrl; diff --git a/dist/options_editor.js.map b/dist/options_editor.js.map index f41b297..aedecf3 100644 --- a/dist/options_editor.js.map +++ b/dist/options_editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/options_editor.ts"],"names":["statusHeatmapOptionsEditor","restrict","scope","templateUrl","controller","StatusHeatmapOptionsEditorCtrl","kbn","$scope","editor","panelCtrl","ctrl","panel","unitFormats","getUnitFormats","render","subItem","data","unitFormat","value"],"mappings":";;;;;;;;;;;;;;;AAsBO,WAASA,0BAAT,GAAsC;AAC3C;;AACA,WAAO;AACLC,MAAAA,QAAQ,EAAE,GADL;AAELC,MAAAA,KAAK,EAAE,IAFF;AAGLC,MAAAA,WAAW,EAAE,mEAHR;AAILC,MAAAA,UAAU,EAAEC;AAJP,KAAP;AAMD;;wCAReL,0B;;;;AAtBTM,MAAAA,G;;;gDAEMD,8B;;;AAKX,gDAAYE,MAAZ,EAAoB;AAAA;;AAAA;;AAAA;;AAAA;;AAClBA,UAAAA,MAAM,CAACC,MAAP,GAAgB,IAAhB;AACA,eAAKC,SAAL,GAAiBF,MAAM,CAACG,IAAxB;AACA,eAAKC,KAAL,GAAa,KAAKF,SAAL,CAAeE,KAA5B;AACA,eAAKC,WAAL,GAAmBN,GAAG,CAACO,cAAJ,EAAnB;AAEA,eAAKJ,SAAL,CAAeK,MAAf;AACD;;;;wCAEaC,O,EAAS;AACrB,iBAAKJ,KAAL,CAAWK,IAAX,CAAgBC,UAAhB,GAA6BF,OAAO,CAACG,KAArC;AACA,iBAAKT,SAAL,CAAeK,MAAf;AACD","sourcesContent":["import kbn from 'app/core/utils/kbn';\n\nexport class StatusHeatmapOptionsEditorCtrl {\n panel: any;\n panelCtrl: any;\n unitFormats: any;\n\n constructor($scope) {\n $scope.editor = this;\n this.panelCtrl = $scope.ctrl;\n this.panel = this.panelCtrl.panel;\n this.unitFormats = kbn.getUnitFormats();\n\n this.panelCtrl.render();\n }\n\n setUnitFormat(subItem) {\n this.panel.data.unitFormat = subItem.value;\n this.panelCtrl.render();\n }\n}\n\nexport function statusHeatmapOptionsEditor() {\n 'use strict';\n return {\n restrict: 'E',\n scope: true,\n templateUrl: 'public/plugins/flant-statusmap-panel/partials/options_editor.html',\n controller: StatusHeatmapOptionsEditorCtrl,\n };\n}\n"],"file":"options_editor.js"} \ No newline at end of file +{"version":3,"sources":["../src/options_editor.ts"],"names":["optionsEditorCtrl","restrict","scope","templateUrl","controller","StatusHeatmapOptionsEditorCtrl","kbn","$scope","editor","panelCtrl","ctrl","panel","unitFormats","getUnitFormats","subItem","data","unitFormat","value","render","color","thresholds","push","defaultColor","index","splice","tooltip"],"mappings":"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","sourcesContent":["import kbn from 'app/core/utils/kbn';\nimport { StatusHeatmapCtrl } from './module';\n\nexport class StatusHeatmapOptionsEditorCtrl {\n panel: any;\n panelCtrl: StatusHeatmapCtrl;\n unitFormats: any;\n\n /** @ngInject */\n constructor($scope: any) {\n $scope.editor = this;\n this.panelCtrl = $scope.ctrl as StatusHeatmapCtrl;\n this.panel = this.panelCtrl.panel;\n\n this.unitFormats = kbn.getUnitFormats();\n }\n\n setUnitFormat(subItem) {\n this.panel.data.unitFormat = subItem.value;\n this.panelCtrl.render();\n }\n\n render() {\n this.panelCtrl.render();\n }\n\n onAddThreshold() {\n this.panel.color.thresholds.push({ color: this.panel.defaultColor });\n this.render();\n }\n\n onRemoveThreshold(index:number) {\n this.panel.color.thresholds.splice(index, 1);\n this.render();\n }\n\n onRemoveThresholds() {\n this.panel.color.thresholds = [];\n this.render();\n }\n\n onAddThreeLights() {\n this.panel.color.thresholds.push({color: \"red\", value: 2, tooltip: \"error\" });\n this.panel.color.thresholds.push({color: \"yellow\", value: 1, tooltip: \"warning\" });\n this.panel.color.thresholds.push({color: \"green\", value: 0, tooltip: \"ok\" });\n this.render();\n }\n \n /* https://ethanschoonover.com/solarized/ */\n onAddSolarized() {\n this.panel.color.thresholds.push({color: \"#b58900\", value: 0, tooltip: \"yellow\" });\n this.panel.color.thresholds.push({color: \"#cb4b16\", value: 1, tooltip: \"orange\" });\n this.panel.color.thresholds.push({color: \"#dc322f\", value: 2, tooltip: \"red\" });\n this.panel.color.thresholds.push({color: \"#d33682\", value: 3, tooltip: \"magenta\" });\n this.panel.color.thresholds.push({color: \"#6c71c4\", value: 4, tooltip: \"violet\" });\n this.panel.color.thresholds.push({color: \"#268bd2\", value: 5, tooltip: \"blue\" });\n this.panel.color.thresholds.push({color: \"#2aa198\", value: 6, tooltip: \"cyan\" });\n this.panel.color.thresholds.push({color: \"#859900\", value: 7, tooltip: \"green\" });\n this.render();\n }\n\n}\n\n/** @ngInject */\nexport function optionsEditorCtrl() {\n 'use strict';\n return {\n restrict: 'E',\n scope: true,\n templateUrl: 'public/plugins/flant-statusmap-panel/partials/options_editor.html',\n controller: StatusHeatmapOptionsEditorCtrl,\n };\n}\n"],"file":"options_editor.js"} \ No newline at end of file diff --git a/dist/panel_config_migration.js b/dist/panel_config_migration.js new file mode 100644 index 0000000..521d0a8 --- /dev/null +++ b/dist/panel_config_migration.js @@ -0,0 +1,165 @@ +"use strict"; + +System.register(["lodash"], function (_export, _context) { + "use strict"; + + var _; + + function migrate_V0_V1(panel) { + // Remove unused fields. + if (_.has(panel, "xAxis.labelFormat")) { + delete panel.xAxis.labelFormat; + } + + if (_.has(panel, "xAxis.minBucketWidthToShowWeekends")) { + delete panel.xAxis.minBucketWidthToShowWeekends; + } + + if (_.has(panel, "xAxis.showCrosshair")) { + delete panel.xAxis.showCrosshair; + } + + if (_.has(panel, "xAxis.showWeekends")) { + delete panel.xAxis.showWeekends; + } + + if (_.has(panel, "yAxis.showCrosshair")) { + delete panel.yAxis.showCrosshair; + } + + if (_.has(panel, "data.unitFormat")) { + delete panel.data; + } // Migrate cardSpacing value. Seems rare (update from version 0.0.2). + + + if (_.has(panel, "cards.cardSpacing")) { + if (!_.has(panel, "cards.cardVSpacing")) { + if (panel.cards.cardSpacing) { + panel.cards.cardVSpacing = panel.cards.cardSpacing; + panel.cards.cardHSpacing = panel.cards.cardSpacing; + } + } + + delete panel.cards.cardSpacing; + } // Migrate initial config for urls in tooltip (pull/86). + // 'usingUrl' was used to show tooltip with urls on click or not. + + + if (_.has(panel, "usingUrl")) { + if (!_.has(panel, "tooltip.freezeOnClick")) { + panel.tooltip.freezeOnClick = panel.usingUrl; + } + + delete panel.usingUrl; + } // 'urls' array is now tooltip.items array. Also items are changed. + + + if (_.has(panel, "urls")) { + if (!_.has(panel, "tooltip.items")) { + panel.tooltip.items = []; + var hasRealItems = true; + + if (panel.urls.length == 0) { + hasRealItems = false; + } + + if (panel.urls.length == 1) { + var url = panel.urls[0]; + + if (url.base_url === '' && url.label === '') { + hasRealItems = false; + } + } + + if (hasRealItems) { + panel.tooltip.showItems = true; + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = panel.urls[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var _url = _step.value; + var item = { + urlTemplate: _.toString(_url.base_url), + urlText: _.toString(_url.label), + urlIcon: _.toString(_url.icon_fa), + urlToLowerCase: _url.forcelowercase, + valueDateFormat: '' + }; // replace $vars with new ${__vars} if url template is not empty + + if (item.urlTemplate !== "") { + // $time was a graph time with prepended & + item.urlTemplate = _.replace(_url.base_url, /\$time/g, "&${__url_time_range}"); // $series_label was a y axis label + + item.urlTemplate = _.replace(item.urlTemplate, /\$series_label/, "${__y_label}"); // $series_extra was a value from bucket. This value has format options and index. + + var valueVar = "__value"; + + if (_url.useExtraSeries === true) { + // index? + if (_url.extraSeries.index > -1) { + valueVar += "_" + _url.extraSeries.index; + } + + var format = _.toString(_url.extraSeries.format); + + if (format === 'YYYY/MM/DD/HH_mm_ss') { + valueVar += '_date'; + item.valueDateFormat = format; + } + } + + item.urlTemplate = _.replace(item.urlTemplate, /\$series_extra/, "${".concat(valueVar, "}")); + } + + panel.tooltip.items.push(item); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + } + } + + delete panel.urls; + } // create statusmap metadata + + + panel.statusmap = { + "ConfigVersion": "v1" + }; + } + + function migratePanelConfig(panel) { + if (_.has(panel, "statusmap")) { + if (panel.statusmap.ConfigVersion == "v1") { + return; + } + } else { + migrate_V0_V1(panel); + } + + return; + } + + _export("migratePanelConfig", migratePanelConfig); + + return { + setters: [function (_lodash) { + _ = _lodash.default; + }], + execute: function () {} + }; +}); +//# sourceMappingURL=panel_config_migration.js.map diff --git a/dist/panel_config_migration.js.map b/dist/panel_config_migration.js.map new file mode 100644 index 0000000..29aa5d6 --- /dev/null +++ b/dist/panel_config_migration.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/panel_config_migration.ts"],"names":["migrate_V0_V1","panel","_","has","xAxis","labelFormat","minBucketWidthToShowWeekends","showCrosshair","showWeekends","yAxis","data","cards","cardSpacing","cardVSpacing","cardHSpacing","tooltip","freezeOnClick","usingUrl","items","hasRealItems","urls","length","url","base_url","label","showItems","item","urlTemplate","toString","urlText","urlIcon","icon_fa","urlToLowerCase","forcelowercase","valueDateFormat","replace","valueVar","useExtraSeries","extraSeries","index","format","push","statusmap","migratePanelConfig","ConfigVersion"],"mappings":"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","sourcesContent":["import _ from 'lodash';\n\nfunction migrate_V0_V1(panel: any) {\n // Remove unused fields.\n if (_.has(panel, \"xAxis.labelFormat\")) {\n delete panel.xAxis.labelFormat;\n }\n if (_.has(panel, \"xAxis.minBucketWidthToShowWeekends\")) {\n delete panel.xAxis.minBucketWidthToShowWeekends;\n }\n if (_.has(panel, \"xAxis.showCrosshair\")) {\n delete panel.xAxis.showCrosshair;\n }\n if (_.has(panel, \"xAxis.showWeekends\")) {\n delete panel.xAxis.showWeekends;\n }\n if (_.has(panel, \"yAxis.showCrosshair\")) {\n delete panel.yAxis.showCrosshair;\n }\n if (_.has(panel, \"data.unitFormat\")) {\n delete panel.data;\n }\n\n // Migrate cardSpacing value. Seems rare (update from version 0.0.2).\n if (_.has(panel, \"cards.cardSpacing\")) {\n if (!_.has(panel, \"cards.cardVSpacing\")) {\n if (panel.cards.cardSpacing) {\n panel.cards.cardVSpacing = panel.cards.cardSpacing\n panel.cards.cardHSpacing = panel.cards.cardSpacing\n }\n }\n delete panel.cards.cardSpacing;\n }\n\n // Migrate initial config for urls in tooltip (pull/86).\n // 'usingUrl' was used to show tooltip with urls on click or not.\n if (_.has(panel, \"usingUrl\")) {\n if (!_.has(panel, \"tooltip.freezeOnClick\")) {\n panel.tooltip.freezeOnClick = panel.usingUrl;\n }\n delete panel.usingUrl;\n }\n\n // 'urls' array is now tooltip.items array. Also items are changed.\n if (_.has(panel, \"urls\")) {\n if (!_.has(panel, \"tooltip.items\")) {\n panel.tooltip.items = [];\n let hasRealItems = true;\n if (panel.urls.length == 0) {\n hasRealItems = false;\n }\n if (panel.urls.length == 1) {\n let url = panel.urls[0];\n if (url.base_url === '' && url.label === '') {\n hasRealItems = false;\n }\n }\n if (hasRealItems) {\n panel.tooltip.showItems = true;\n for (let url of panel.urls) {\n let item = {\n urlTemplate: _.toString(url.base_url),\n urlText: _.toString(url.label),\n urlIcon: _.toString(url.icon_fa),\n urlToLowerCase: url.forcelowercase,\n valueDateFormat: '',\n }\n // replace $vars with new ${__vars} if url template is not empty\n if (item.urlTemplate !== \"\") {\n // $time was a graph time with prepended &\n item.urlTemplate = _.replace(url.base_url, /\\$time/g, \"&${__url_time_range}\");\n // $series_label was a y axis label\n item.urlTemplate = _.replace(item.urlTemplate, /\\$series_label/, \"${__y_label}\");\n // $series_extra was a value from bucket. This value has format options and index.\n let valueVar = \"__value\";\n if (url.useExtraSeries === true) {\n // index?\n if (url.extraSeries.index > -1) {\n valueVar += \"_\" + url.extraSeries.index;\n }\n\n let format = _.toString(url.extraSeries.format);\n if (format === 'YYYY/MM/DD/HH_mm_ss') {\n valueVar += '_date';\n item.valueDateFormat = format;\n }\n }\n\n item.urlTemplate = _.replace(item.urlTemplate, /\\$series_extra/, `\\${${valueVar}}`);\n }\n panel.tooltip.items.push(item);\n }\n }\n }\n delete panel.urls;\n }\n\n // create statusmap metadata\n panel.statusmap = {\n \"ConfigVersion\": \"v1\",\n }\n}\n\n\nexport function migratePanelConfig(panel: any) {\n if (_.has(panel, \"statusmap\")) {\n if (panel.statusmap.ConfigVersion == \"v1\") {\n return;\n }\n } else {\n migrate_V0_V1(panel);\n }\n return;\n}\n\n"],"file":"panel_config_migration.js"} \ No newline at end of file diff --git a/dist/partials/options_editor.html b/dist/partials/options_editor.html index 54fe018..563e291 100644 --- a/dist/partials/options_editor.html +++ b/dist/partials/options_editor.html @@ -81,7 +81,7 @@
@@ -91,12 +91,12 @@
-
-
@@ -108,12 +108,12 @@
-
-
@@ -144,10 +144,6 @@ label="Show legend" checked="ctrl.panel.legend.show" on-change="ctrl.render()"> - - @@ -159,17 +155,12 @@
- +
- +
-
- -
-
Buckets
-
@@ -180,6 +171,11 @@
+
+ +
+
Buckets
+ @@ -187,6 +183,13 @@
Color for bucket with multiple values is determined by color mode
+
+ + +
@@ -194,6 +197,7 @@
+
@@ -212,105 +216,4 @@
-
-
Filtering
-
- - -
-
- -
-
URL
- -
- Insert the url to navigate
-
- -
- -
- -
-
-
-
-
- -
-
- -
-
- -
-
- - - - - - - -

Specify an URL (relative or absolute)

- - Use special variables to specify cell values: -
- $series_label name of the serie -
- $(template.name) name of the templated to be replaced -
- $time append &from...&to on the URL -
- $series_extra use extraSeries value to use it on URL -
-
-
-
- - - - - - -
- - - - -
- -
- -
- - -
-
-
-
-
- -
diff --git a/dist/partials/tooltip_editor.html b/dist/partials/tooltip_editor.html new file mode 100644 index 0000000..350b136 --- /dev/null +++ b/dist/partials/tooltip_editor.html @@ -0,0 +1,120 @@ +
+
+ + + + + + +
+ +
+
Items
+ +
+ + +
+
+
+ +
+
+
+ + + +
+ +
+
+ + + +
+
+ + +
+ +
+ + +
+ +
+ + +
+
+
+ +
+
+
+ +
+
+ +
+
+
diff --git a/dist/plugin.json b/dist/plugin.json index ba97fe0..679c3f8 100644 --- a/dist/plugin.json +++ b/dist/plugin.json @@ -17,7 +17,6 @@ "links": [ {"name": "Github", "url": "https://github.com/flant/grafana-statusmap"}, {"name": "MIT Licence", "url": "https://github.com/flant/grafana-statusmap/blob/master/LICENSE"} - ], "screenshots": [ {"name": "Panel with light theme", "path": "img/flant-statusmap-panel.png"}, diff --git a/dist/rendering.js b/dist/rendering.js index 0c77222..fa8a733 100644 --- a/dist/rendering.js +++ b/dist/rendering.js @@ -1,9 +1,9 @@ "use strict"; -System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/core", "d3", "./libs/d3-scale-chromatic/index", "./tooltip", "./tooltipextraseries", "./annotations"], function (_export, _context) { +System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/core", "d3", "./libs/d3-scale-chromatic/index", "./tooltip", "./annotations"], function (_export, _context) { "use strict"; - var _, $, moment, kbn, appEvents, contextSrv, d3, d3ScaleChromatic, StatusmapTooltip, StatusHeatmapTooltipExtraSeries, AnnotationTooltip, MIN_CARD_SIZE, CARD_H_SPACING, CARD_V_SPACING, CARD_ROUND, DATA_RANGE_WIDING_FACTOR, DEFAULT_X_TICK_SIZE_PX, DEFAULT_Y_TICK_SIZE_PX, X_AXIS_TICK_PADDING, Y_AXIS_TICK_PADDING, MIN_SELECTION_WIDTH, Statusmap, StatusmapRenderer; + var _, $, moment, kbn, appEvents, contextSrv, d3, d3ScaleChromatic, StatusmapTooltip, AnnotationTooltip, MIN_CARD_SIZE, CARD_H_SPACING, CARD_V_SPACING, CARD_ROUND, DATA_RANGE_WIDING_FACTOR, DEFAULT_X_TICK_SIZE_PX, DEFAULT_Y_TICK_SIZE_PX, X_AXIS_TICK_PADDING, Y_AXIS_TICK_PADDING, MIN_SELECTION_WIDTH, Statusmap, StatusmapRenderer; function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } @@ -66,8 +66,6 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c d3ScaleChromatic = _libsD3ScaleChromaticIndex; }, function (_tooltip) { StatusmapTooltip = _tooltip.StatusmapTooltip; - }, function (_tooltipextraseries) { - StatusHeatmapTooltipExtraSeries = _tooltipextraseries.StatusHeatmapTooltipExtraSeries; }, function (_annotations) { AnnotationTooltip = _annotations.AnnotationTooltip; }], @@ -156,8 +154,6 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c _defineProperty(this, "tooltip", void 0); - _defineProperty(this, "tooltipExtraSeries", void 0); - _defineProperty(this, "annotationTooltip", void 0); _defineProperty(this, "heatmap", void 0); @@ -177,7 +173,6 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c // $heatmap is JQuery object, but heatmap is D3 this.$heatmap = this.elem.find('.statusmap-panel'); this.tooltip = new StatusmapTooltip(this.$heatmap, this.scope); - this.tooltipExtraSeries = new StatusHeatmapTooltipExtraSeries(this.$heatmap, this.scope); this.annotationTooltip = new AnnotationTooltip(this.$heatmap, this.scope); this.yOffset = 0; this.selection = { @@ -410,9 +405,11 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c if (this.heatmap) { this.heatmap.remove(); - } + } // Insert svg as a first child into heatmap_elem + // as the frozen tooltip moving logiс assumes that tooltip is the last child. - this.heatmap = d3.select(heatmap_elem).append("svg").attr("width", this.width).attr("height", this.height); + + this.heatmap = d3.select(heatmap_elem).insert("svg", ":first-child").attr("width", this.width).attr("height", this.height); this.chartHeight = this.height - this.margin.top - this.margin.bottom; this.chartTop = this.margin.top; this.chartBottom = this.chartTop + this.chartHeight; @@ -513,10 +510,7 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c var colorScheme = _.find(this.ctrl.colorSchemes, { value: this.panel.color.colorScheme - }); // if (!colorScheme) { - // - // } - + }); var colorInterpolator = d3ScaleChromatic[colorScheme.value]; var colorScaleInverted = colorScheme.invert === 'always' || colorScheme.invert === 'dark' && !contextSrv.user.lightTheme; @@ -618,28 +612,28 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c } }, { key: "getCardColor", - value: function getCardColor(b) { + value: function getCardColor(bucket) { if (this.panel.color.mode === 'opacity') { return this.panel.color.cardColor; } else if (this.panel.color.mode === 'spectrum') { - return this.colorScale(b.value); + return this.colorScale(bucket.value); } else if (this.panel.color.mode === 'discrete') { if (this.panel.seriesFilterIndex != null && this.panel.seriesFilterIndex != -1) { - return this.ctrl.discreteExtraSeries.getBucketColorSingle(d.values[this.panel.seriesFilterIndex]); + return this.ctrl.discreteExtraSeries.getBucketColorSingle(bucket.values[this.panel.seriesFilterIndex]); } else { - return this.ctrl.discreteExtraSeries.getBucketColor(b.values); + return this.ctrl.discreteExtraSeries.getBucketColor(bucket.values); } } } }, { key: "getCardOpacity", - value: function getCardOpacity(b) { - if (this.panel.nullPointMode === 'as empty' && b.value == null) { + value: function getCardOpacity(bucket) { + if (this.panel.nullPointMode === 'as empty' && bucket.value == null) { return 0; } if (this.panel.color.mode === 'opacity') { - return this.opacityScale(b.value); + return this.opacityScale(bucket.value); } else { return 1; } @@ -705,14 +699,7 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c key: "onMouseLeave", value: function onMouseLeave(e) { appEvents.emit('graph-hover-clear'); - this.clearCrosshair(); //annotationTooltip.destroy(); - - if (e.relatedTarget) { - if (e.relatedTarget.className == "statusmap-tooltip-extraseries graph-tooltip grafana-tooltip" || e.relatedTarget.className == "graph-tooltip-time") {} else { - this.tooltipExtraSeries.destroy(); - } - } - + this.clearCrosshair(); this.annotationTooltip.destroy(); } }, { @@ -738,13 +725,13 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c this.tooltip.show(event); this.annotationTooltip.show(event); } - } + } // TODO emit an event and move logic to panelCtrl + }, { key: "onMouseClick", - value: function onMouseClick(event) { - this.tooltipExtraSeries.show(event); - - if (this.ctrl.panel.usingUrl) { + value: function onMouseClick(e) { + if (this.ctrl.panel.tooltip.freezeOnClick) { + this.tooltip.showFrozen(e); this.tooltip.destroy(); } } diff --git a/dist/rendering.js.map b/dist/rendering.js.map index 20e0b69..eb146ab 100644 --- a/dist/rendering.js.map +++ b/dist/rendering.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/rendering.ts"],"names":["rendering","scope","elem","attrs","ctrl","StatusmapRenderer","grafanaTimeFormat","ticks","min","max","range","secPerTick","oneDay","oneYear","_","$","moment","kbn","appEvents","contextSrv","d3","d3ScaleChromatic","StatusmapTooltip","StatusHeatmapTooltipExtraSeries","AnnotationTooltip","MIN_CARD_SIZE","CARD_H_SPACING","CARD_V_SPACING","CARD_ROUND","DATA_RANGE_WIDING_FACTOR","DEFAULT_X_TICK_SIZE_PX","DEFAULT_Y_TICK_SIZE_PX","X_AXIS_TICK_PADDING","Y_AXIS_TICK_PADDING","MIN_SELECTION_WIDTH","Statusmap","from","to","$heatmap","find","tooltip","tooltipExtraSeries","annotationTooltip","yOffset","selection","active","x1","x2","padding","left","right","top","bottom","margin","events","on","onRender","bind","tickValueFormatter","onGraphHover","onGraphHoverClear","onMouseDown","onMouseMove","onMouseLeave","onMouseClick","clearCrosshair","event","drawSharedCrosshair","pos","render","renderingCompleted","height","panel","row","isString","parseInt","replace","legend","show","css","e","axisText","selectAll","nodes","maxTextWidth","map","text","getBBox","width","Math","ceil","axisLine","select","empty","axisLinePosition","parseFloat","attr","canvasWidth","xScale","scaleTime","domain","timeRange","xGridSize","chartWidth","grafanaTimeFormatter","timeFormat","dashboardTimeZone","dashboard","getTimezone","utcFormat","xAxis","axisBottom","tickFormat","tickPadding","tickSize","chartHeight","posY","chartTop","posX","yAxisWidth","heatmap","append","call","remove","step","length","push","i","scaleOrdinal","bucketMatrix","targets","yAxisSort","sort","a","b","localeCompare","ignorePunctuation","numeric","yAxisScale","getYAxisScale","yScale","getYScale","yAxis","axisLeft","tickValues","tickSizeInner","getYAxisWidth","tickInterval","y_widing","dataRangeWidingFactor","y_min","y_max","floor","decimals","scaledDecimals","format","value","valueFormats","heatmap_elem","chartBottom","cardHSpacing","cards","cardVSpacing","cardRound","yGridSize","cardHeight","addYAxis","xBucketSize","cardWidth","addXAxis","xAxisHeight","getXAxisHeight","style","maxValue","color","minValue","mode","colorScale","getColorScale","setOpacityScale","data","enter","target","buckets","id","xid","yLabel","getCardX","getCardWidth","getCardY","getCardHeight","isEmpty","getCardColor","getCardOpacity","$cards","mouseOverBucket","highlightCard","resetCardHighLight","_renderAnnotations","emit","highlightColor","darker","strokeColor","brighter","current_card","originalFillColor","toString","colorScheme","colorSchemes","colorInterpolator","colorScaleInverted","invert","user","lightTheme","start","end","scaleSequential","opacityScale","scaleLinear","scalePow","exponent","x","rightX","relTo","rangeMs","cx","w","cutted_width","ys","y","h","cardColor","seriesFilterIndex","discreteExtraSeries","getBucketColorSingle","d","values","getBucketColor","nullPointMode","elemOffset","offset","clientX","clientY","getEventOffset","mouseUpHandler","onMouseUp","document","one","unbind","selectionRange","abs","timeFrom","timeTo","timeSrv","setTime","utc","clearSelection","relatedTarget","className","destroy","limitSelection","offsetX","drawSelection","emitGraphHoverEvent","drawCrosshair","usingUrl","valueOf","pageX","pageY","y1","panelRelY","offsetY","posX1","posX2","selectionX","selectionWidth","position","graphTooltip","setElementHeight","addStatusmapCanvas","noDatapoints","addStatusmap","annotations","annoData","time","source","anno","iconColor","join","$ticks","mouseOverAnnotationTick"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport $ from 'jquery';\nimport moment from 'moment';\nimport kbn from 'app/core/utils/kbn';\nimport {appEvents, contextSrv} from 'app/core/core';\nimport {tickStep, getScaledDecimals, getFlotTickSize} from 'app/core/utils/ticks';\nimport * as d3 from 'd3';\nimport * as d3ScaleChromatic from './libs/d3-scale-chromatic/index';\nimport {StatusmapTooltip} from './tooltip';\nimport {StatusHeatmapTooltipExtraSeries} from './tooltipextraseries';\nimport {AnnotationTooltip} from './annotations';\nimport { Bucket, BucketMatrix } from './statusmap_data';\nimport { StatusHeatmapCtrl } from './module';\n\nlet MIN_CARD_SIZE = 5,\n CARD_H_SPACING = 2,\n CARD_V_SPACING = 2,\n CARD_ROUND = 0,\n DATA_RANGE_WIDING_FACTOR = 1.2,\n DEFAULT_X_TICK_SIZE_PX = 100,\n DEFAULT_Y_TICK_SIZE_PX = 50,\n X_AXIS_TICK_PADDING = 10,\n Y_AXIS_TICK_PADDING = 5,\n MIN_SELECTION_WIDTH = 2;\n\nexport default function rendering(scope: any, elem: any, attrs: any, ctrl: any) {\n return new StatusmapRenderer(scope, elem, attrs, ctrl);\n}\n\nclass Statusmap {\n $svg: any;\n svg: any;\n bucketMatrix: BucketMatrix;\n\n timeRange: {from: number, to: number} = {from:0, to:0};\n \n constructor() {\n\n }\n}\n\nexport class StatusmapRenderer {\n width: number = 0;\n height: number = 0;\n yScale: any;\n xScale: any;\n chartWidth: number = 0;\n chartHeight: number = 0;\n chartTop: number = 0;\n chartBottom: number = 0;\n yAxisWidth: number = 0;\n xAxisHeight: number = 0;\n cardVSpacing: number = 0;\n cardHSpacing: number = 0;\n cardRound: number = 0;\n cardWidth: number = 0;\n cardHeight: number = 0;\n colorScale: any;\n opacityScale: any;\n mouseUpHandler: any;\n xGridSize: number = 0;\n yGridSize: number = 0;\n\n bucketMatrix: BucketMatrix;\n panel: any;\n $heatmap: any;\n tooltip: StatusmapTooltip;\n tooltipExtraSeries:StatusHeatmapTooltipExtraSeries;\n annotationTooltip: AnnotationTooltip;\n heatmap: any;\n timeRange: any;\n\n yOffset: number;\n selection: any;\n padding: any;\n margin: any;\n dataRangeWidingFactor: number = DATA_RANGE_WIDING_FACTOR;\n\n constructor(private scope: any, private elem: any, attrs: any, private ctrl: StatusHeatmapCtrl) {\n // $heatmap is JQuery object, but heatmap is D3\n this.$heatmap = this.elem.find('.statusmap-panel');\n this.tooltip = new StatusmapTooltip(this.$heatmap, this.scope);\n this.tooltipExtraSeries = new StatusHeatmapTooltipExtraSeries(this.$heatmap, this.scope);\n this.annotationTooltip = new AnnotationTooltip(this.$heatmap, this.scope);\n\n this.yOffset = 0;\n\n this.selection = {\n active: false,\n x1: -1,\n x2: -1,\n };\n\n this.padding = { left: 0, right: 0, top: 0, bottom: 0 };\n this.margin = { left: 25, right: 15, top: 10, bottom: 20 };\n\n this.ctrl.events.on('render', this.onRender.bind(this));\n\n this.ctrl.tickValueFormatter = this.tickValueFormatter.bind(this);\n\n /////////////////////////////\n // Selection and crosshair //\n /////////////////////////////\n\n // Shared crosshair and tooltip this.empty = true;\n\n appEvents.on('graph-hover', this.onGraphHover.bind(this), this.scope);\n\n appEvents.on('graph-hover-clear', this.onGraphHoverClear.bind(this), this.scope);\n\n // Register selection listeners\n this.$heatmap.on('mousedown', this.onMouseDown.bind(this));\n this.$heatmap.on('mousemove', this.onMouseMove.bind(this));\n this.$heatmap.on('mouseleave', this.onMouseLeave.bind(this));\n this.$heatmap.on('click', this.onMouseClick.bind(this));\n }\n\n onGraphHoverClear() {\n this.clearCrosshair();\n }\n\n onGraphHover(event: { pos: any }) {\n this.drawSharedCrosshair(event.pos);\n }\n\n onRender() {\n this.render();\n this.ctrl.renderingCompleted();\n }\n\n\n setElementHeight(): boolean {\n try {\n var height = this.ctrl.height || this.panel.height || this.ctrl.row.height;\n if (_.isString(height)) {\n height = parseInt(height.replace('px', ''), 10);\n }\n\n height -= this.panel.legend.show ? 32 : 10; // bottom padding and space for legend. Change margin in .status-heatmap-color-legend !\n\n this.$heatmap.css('height', height + 'px');\n\n return true;\n } catch (e) { // IE throws errors sometimes\n return false;\n }\n }\n\n getYAxisWidth(elem: any): number {\n const axisText = elem.selectAll(\".axis-y text\").nodes();\n const maxTextWidth = _.max(_.map(axisText, text => {\n // Use SVG getBBox method\n return text.getBBox().width;\n }));\n\n return Math.ceil(maxTextWidth);\n }\n\n getXAxisHeight(elem: any): number {\n let axisLine = elem.select(\".axis-x line\");\n if (!axisLine.empty()) {\n let axisLinePosition = parseFloat(elem.select(\".axis-x line\").attr(\"y2\"));\n let canvasWidth = parseFloat(elem.attr(\"height\"));\n return canvasWidth - axisLinePosition;\n } else {\n // Default height\n return 30;\n }\n }\n\n addXAxis() {\n // Scale timestamps to cards centers\n //this.scope.xScale = this.xScale = d3.scaleTime()\n // .domain([this.timeRange.from, this.timeRange.to])\n // .range([this.xGridSize/2, this.chartWidth-this.xGridSize/2]);\n // Buckets without the most recent\n this.scope.xScale = this.xScale = d3.scaleTime()\n .domain([this.timeRange.from, this.timeRange.to])\n .range([this.xGridSize/2, this.chartWidth-this.xGridSize/2]);\n\n let ticks = this.chartWidth / DEFAULT_X_TICK_SIZE_PX;\n let grafanaTimeFormatter = grafanaTimeFormat(ticks, this.timeRange.from, this.timeRange.to);\n let timeFormat;\n let dashboardTimeZone = this.ctrl.dashboard.getTimezone();\n if (dashboardTimeZone === 'utc') {\n timeFormat = d3.utcFormat(grafanaTimeFormatter);\n } else {\n timeFormat = d3.timeFormat(grafanaTimeFormatter);\n }\n\n let xAxis = d3\n .axisBottom(this.xScale)\n .ticks(ticks)\n .tickFormat(timeFormat)\n .tickPadding(X_AXIS_TICK_PADDING)\n .tickSize(this.chartHeight);\n\n let posY = this.chartTop; // this.margin.top !\n let posX = this.yAxisWidth;\n\n this.heatmap.append(\"g\")\n .attr(\"class\", \"axis axis-x\")\n .attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\")\n .call(xAxis);\n\n // Remove horizontal line in the top of axis labels (called domain in d3)\n this.heatmap\n .select(\".axis-x\")\n .select(\".domain\")\n .remove();\n }\n\n // divide chart height by ticks for cards drawing\n getYScale(ticks: any[]) {\n let range:any[] = [];\n let step = this.chartHeight / ticks.length;\n // svg has y=0 on the top, so top card should have a minimal value in range\n range.push(step);\n for (let i = 1; i < ticks.length; i++) {\n range.push(step * (i+1));\n }\n return d3.scaleOrdinal()\n .domain(ticks)\n .range(range);\n }\n\n // divide chart height by ticks with offset for ticks drawing\n getYAxisScale(ticks: any[]) {\n let range:any[] = [];\n let step = this.chartHeight / ticks.length;\n // svg has y=0 on the top, so top tick should have a minimal value in range\n range.push(this.yOffset);\n for (let i = 1; i < ticks.length; i++) {\n range.push(step * i + this.yOffset);\n }\n return d3.scaleOrdinal()\n .domain(ticks)\n .range(range);\n }\n\n addYAxis() {\n let ticks = this.bucketMatrix.targets;\n\n if (this.panel.yAxisSort == 'a → z') {\n ticks.sort((a, b) => a.localeCompare(b, 'en', {ignorePunctuation: false, numeric: true}));\n } else if (this.panel.yAxisSort == 'z → a') {\n ticks.sort((b, a) => a.localeCompare(b, 'en', {ignorePunctuation: false, numeric: true}));\n }\n\n let yAxisScale = this.getYAxisScale(ticks);\n this.scope.yScale = this.yScale = this.getYScale(ticks);\n\n let yAxis = d3\n .axisLeft(yAxisScale)\n .tickValues(ticks)\n .tickSizeInner(0 - this.width)\n .tickPadding(Y_AXIS_TICK_PADDING);\n\n this.heatmap\n .append(\"g\")\n .attr(\"class\", \"axis axis-y\")\n .call(yAxis);\n\n // Calculate Y axis width first, then move axis into visible area\n let posY = this.margin.top;\n let posX = this.getYAxisWidth(this.heatmap) + Y_AXIS_TICK_PADDING;\n this.heatmap.select(\".axis-y\").attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\");\n\n // Remove vertical line in the right of axis labels (called domain in d3)\n this.heatmap.select(\".axis-y\").select(\".domain\").remove();\n this.heatmap.select(\".axis-y\").selectAll(\".tick line\").remove();\n }\n\n // Wide Y values range and adjust to bucket size\n wideYAxisRange(min: number, max: number, tickInterval: number) {\n let y_widing = (max * (this.dataRangeWidingFactor - 1) - min * (this.dataRangeWidingFactor - 1)) / 2;\n let y_min, y_max;\n\n if (tickInterval === 0) {\n y_max = max * this.dataRangeWidingFactor;\n y_min = min - min * (this.dataRangeWidingFactor - 1);\n tickInterval = (y_max - y_min) / 2;\n } else {\n y_max = Math.ceil((max + y_widing) / tickInterval) * tickInterval;\n y_min = Math.floor((min - y_widing) / tickInterval) * tickInterval;\n }\n\n // Don't wide axis below 0 if all values are positive\n if (min >= 0 && y_min < 0) {\n y_min = 0;\n }\n\n return {y_min, y_max};\n }\n\n tickValueFormatter(decimals, scaledDecimals = null) {\n let format = this.panel.yAxis.format;\n return function(value) {\n return kbn.valueFormats[format](value, decimals, scaledDecimals);\n };\n }\n\n // Create svg element, add axes and\n // calculate sizes for cards drawing\n addStatusmapCanvas() {\n let heatmap_elem = this.$heatmap[0];\n\n this.width = Math.floor(this.$heatmap.width()) - this.padding.right;\n this.height = Math.floor(this.$heatmap.height()) - this.padding.bottom;\n\n if (this.heatmap) {\n this.heatmap.remove();\n }\n\n this.heatmap = d3.select(heatmap_elem)\n .append(\"svg\")\n .attr(\"width\", this.width)\n .attr(\"height\", this.height);\n\n this.chartHeight = this.height - this.margin.top - this.margin.bottom;\n this.chartTop = this.margin.top;\n this.chartBottom = this.chartTop + this.chartHeight;\n\n this.cardHSpacing = this.panel.cards.cardHSpacing !== null ? this.panel.cards.cardHSpacing : CARD_H_SPACING;\n this.cardVSpacing = this.panel.cards.cardVSpacing !== null ? this.panel.cards.cardVSpacing : CARD_V_SPACING;\n this.cardRound = this.panel.cards.cardRound !== null ? this.panel.cards.cardRound : CARD_ROUND;\n\n // calculate yOffset for YAxis\n this.yGridSize = this.chartHeight;\n if (this.bucketMatrix.targets.length > 0) {\n this.yGridSize = Math.floor(this.chartHeight / this.bucketMatrix.targets.length);\n }\n this.cardHeight = this.yGridSize ? this.yGridSize - this.cardVSpacing : 0;\n this.yOffset = this.cardHeight / 2;\n\n this.addYAxis();\n\n this.yAxisWidth = this.getYAxisWidth(this.heatmap) + Y_AXIS_TICK_PADDING;\n this.chartWidth = this.width - this.yAxisWidth - this.margin.right;\n\n // TODO allow per-y cardWidth!\n // we need to fill chartWidth with xBucketSize cards.\n this.xGridSize = this.chartWidth / (this.bucketMatrix.xBucketSize+1);\n this.cardWidth = this.xGridSize - this.cardHSpacing;\n\n this.addXAxis();\n this.xAxisHeight = this.getXAxisHeight(this.heatmap);\n\n if (!this.panel.yAxis.show) {\n this.heatmap.select(\".axis-y\").selectAll(\"line\").style(\"opacity\", 0);\n }\n\n if (!this.panel.xAxis.show) {\n this.heatmap.select(\".axis-x\").selectAll(\"line\").style(\"opacity\", 0);\n }\n }\n\n addStatusmap():void {\n let maxValue = this.panel.color.max || this.bucketMatrix.maxValue;\n let minValue = this.panel.color.min || this.bucketMatrix.minValue;\n\n if (this.panel.color.mode !== 'discrete') {\n this.colorScale = this.getColorScale(maxValue, minValue);\n }\n this.setOpacityScale(maxValue);\n\n // Draw cards from buckets.\n this.heatmap.selectAll(\".statusmap-cards-row\").data(this.bucketMatrix.targets)\n .enter()\n .selectAll(\".statustmap-card\")\n .data((target:string) => this.bucketMatrix.buckets[target])\n .enter()\n .append(\"rect\")\n .attr(\"cardId\", (b:Bucket) => b.id)\n .attr(\"xid\", (b:Bucket) => b.xid)\n .attr(\"yid\", (b:Bucket) => b.yLabel)\n .attr(\"x\", this.getCardX.bind(this))\n .attr(\"width\", this.getCardWidth.bind(this))\n .attr(\"y\", this.getCardY.bind(this))\n .attr(\"height\", this.getCardHeight.bind(this))\n .attr(\"rx\", this.cardRound)\n .attr(\"ry\", this.cardRound)\n .attr(\"class\", (b:Bucket) => b.isEmpty() ? \"empty-card\" : \"bordered statusmap-card\")\n .style(\"fill\", this.getCardColor.bind(this))\n .style(\"stroke\", this.getCardColor.bind(this))\n .style(\"stroke-width\", 0)\n //.style(\"stroke-width\", getCardStrokeWidth)\n //.style(\"stroke-dasharray\", \"3,3\")\n .style(\"opacity\", this.getCardOpacity.bind(this));\n\n // Set mouse events on cards.\n let $cards = this.$heatmap.find(\".statusmap-card + .bordered\");\n $cards\n .on(\"mouseenter\", (event) => {\n this.tooltip.mouseOverBucket = true;\n this.highlightCard(event);\n })\n .on(\"mouseleave\", (event) => {\n this.tooltip.mouseOverBucket = false;\n this.resetCardHighLight(event);\n });\n\n this._renderAnnotations();\n\n this.ctrl.events.emit('render-complete', {\n \"chartWidth\": this.chartWidth\n });\n }\n\n highlightCard(event) {\n const color = d3.select(event.target).style(\"fill\");\n const highlightColor = d3.color(color).darker(2);\n const strokeColor = d3.color(color).brighter(4);\n const current_card = d3.select(event.target);\n this.tooltip.originalFillColor = color;\n current_card\n .style(\"fill\", highlightColor.toString())\n .style(\"stroke\", strokeColor.toString())\n .style(\"stroke-width\", 1);\n }\n\n resetCardHighLight(event) {\n d3.select(event.target)\n .style(\"fill\", this.tooltip.originalFillColor)\n .style(\"stroke\", this.tooltip.originalFillColor)\n .style(\"stroke-width\", 0);\n }\n\n getColorScale(maxValue, minValue = 0) {\n let colorScheme = _.find(this.ctrl.colorSchemes, {value: this.panel.color.colorScheme});\n // if (!colorScheme) {\n //\n // }\n let colorInterpolator = d3ScaleChromatic[colorScheme.value];\n let colorScaleInverted = colorScheme.invert === 'always' ||\n (colorScheme.invert === 'dark' && !contextSrv.user.lightTheme);\n\n if (maxValue == minValue)\n maxValue = minValue + 1;\n\n let start = colorScaleInverted ? maxValue : minValue;\n let end = colorScaleInverted ? minValue : maxValue;\n\n return d3.scaleSequential(colorInterpolator).domain([start, end]);\n }\n\n setOpacityScale(maxValue) {\n if (this.panel.color.colorScale === 'linear') {\n this.opacityScale = d3.scaleLinear()\n .domain([0, maxValue])\n .range([0, 1]);\n } else if (this.panel.color.colorScale === 'sqrt') {\n this.opacityScale = d3.scalePow().exponent(this.panel.color.exponent)\n .domain([0, maxValue])\n .range([0, 1]);\n }\n }\n\n getCardX(b: Bucket) {\n let x;\n // cx is the center of the card. Card should be placed to the left.\n //let cx = this.xScale(d.x);\n let rightX = (b.relTo / this.bucketMatrix.rangeMs) * this.chartWidth;\n let cx = rightX - this.cardWidth/2;\n\n if (cx - this.cardWidth/2 < 0) {\n x = this.yAxisWidth + this.cardHSpacing/2;\n } else {\n x = this.yAxisWidth + cx - this.cardWidth/2;\n }\n\n return x;\n }\n\n // xScale returns card center. Adjust cardWidth in case of overlaping.\n getCardWidth(b: Bucket) {\n //return 20;\n let w;\n\n let rightX = (b.relTo / this.bucketMatrix.rangeMs) * this.chartWidth;\n let cx = rightX - this.cardWidth/2;\n //let cx = this.xScale(d.x);\n\n if (cx < this.cardWidth/2) {\n // Center should not exceed half of card.\n // Cut card to the left to prevent overlay of y axis.\n let cutted_width = (cx - this.cardHSpacing/2) + this.cardWidth/2;\n w = cutted_width > 0 ? cutted_width : 0;\n } else if (this.chartWidth - cx < this.cardWidth/2) {\n // Cut card to the right to prevent overlay of right graph edge.\n w = this.cardWidth/2 + (this.chartWidth - cx - this.cardHSpacing/2);\n } else {\n w = this.cardWidth;\n }\n\n // Card width should be MIN_CARD_SIZE at least\n w = Math.max(w, MIN_CARD_SIZE);\n\n if (this.cardHSpacing == 0) {\n w = w+1;\n }\n\n return w;\n }\n\n // Top y for card.\n // yScale gives ???\n // \n getCardY(b: Bucket) {\n return this.yScale(b.yLabel) + this.chartTop - this.cardHeight - this.cardVSpacing/2;\n }\n\n getCardHeight(b: Bucket) {\n //return 20;\n let ys = this.yScale(b.yLabel);\n let y = ys + this.chartTop - this.cardHeight - this.cardVSpacing/2;\n let h = this.cardHeight;\n\n // Cut card height to prevent overlay\n if (y < this.chartTop) {\n h = ys - this.cardVSpacing/2;\n } else if (ys > this.chartBottom) {\n h = this.chartBottom - y;\n } else if (y + this.cardHeight > this.chartBottom) {\n h = this.chartBottom - y;\n }\n\n // Height can't be more than chart height\n h = Math.min(h, this.chartHeight);\n // Card height should be MIN_CARD_SIZE at least\n h = Math.max(h, MIN_CARD_SIZE);\n\n if (this.cardVSpacing == 0) {\n h = h+1\n }\n\n return h;\n }\n\n getCardColor(b: Bucket) {\n if (this.panel.color.mode === 'opacity') {\n return this.panel.color.cardColor;\n } else if (this.panel.color.mode === 'spectrum') {\n return this.colorScale(b.value);\n } else if (this.panel.color.mode === 'discrete') {\n if (this.panel.seriesFilterIndex != null && this.panel.seriesFilterIndex != -1) {\n return this.ctrl.discreteExtraSeries.getBucketColorSingle(d.values[this.panel.seriesFilterIndex]);\n } else {\n return this.ctrl.discreteExtraSeries.getBucketColor(b.values);\n }\n }\n }\n\n getCardOpacity(b: Bucket) {\n if (this.panel.nullPointMode === 'as empty' && b.value == null ) {\n return 0;\n }\n if (this.panel.color.mode === 'opacity') {\n return this.opacityScale(b.value);\n } else {\n return 1;\n }\n }\n\n getCardStrokeWidth(b: Bucket) {\n if (this.panel.color.mode === 'discrete') {\n return '1';\n }\n return '0';\n }\n\n\n /////////////////////////////\n // Selection and crosshair //\n /////////////////////////////\n\n getEventOffset(event) {\n const elemOffset = this.$heatmap.offset();\n const x = Math.floor(event.clientX - elemOffset.left);\n const y = Math.floor(event.clientY - elemOffset.top);\n return { x, y };\n }\n\n onMouseDown(event) {\n const offset = this.getEventOffset(event);\n this.selection.active = true;\n this.selection.x1 = offset.x;\n\n this.mouseUpHandler = () => {\n this.onMouseUp();\n };\n\n $(document).one(\"mouseup\", this.mouseUpHandler.bind(this));\n }\n\n onMouseUp() {\n $(document).unbind(\"mouseup\", this.mouseUpHandler.bind(this));\n this.mouseUpHandler = null;\n this.selection.active = false;\n\n let selectionRange = Math.abs(this.selection.x2 - this.selection.x1);\n if (this.selection.x2 >= 0 && selectionRange > MIN_SELECTION_WIDTH) {\n let timeFrom = this.xScale.invert(Math.min(this.selection.x1, this.selection.x2) - this.yAxisWidth - this.xGridSize/2);\n let timeTo = this.xScale.invert(Math.max(this.selection.x1, this.selection.x2) - this.yAxisWidth - this.xGridSize/2);\n\n this.ctrl.timeSrv.setTime({\n from: moment.utc(timeFrom),\n to: moment.utc(timeTo)\n });\n }\n\n this.clearSelection();\n }\n\n onMouseLeave(e) {\n appEvents.emit('graph-hover-clear');\n this.clearCrosshair();\n //annotationTooltip.destroy();\n if (e.relatedTarget) {\n if (e.relatedTarget.className == \"statusmap-tooltip-extraseries graph-tooltip grafana-tooltip\" || e.relatedTarget.className == \"graph-tooltip-time\" ) {\n } else {\n this.tooltipExtraSeries.destroy();\n }\n }\n this.annotationTooltip.destroy(); \n }\n\n onMouseMove(event) {\n if (!this.heatmap) { return; }\n\n const offset = this.getEventOffset(event);\n if (this.selection.active) {\n // Clear crosshair and tooltip\n this.clearCrosshair();\n this.tooltip.destroy();\n this.annotationTooltip.destroy();\n\n this.selection.x2 = this.limitSelection(event.offsetX);\n this.drawSelection(this.selection.x1, this.selection.x2);\n } else {\n //const pos = this.getEventPos(event, offset);\n this.emitGraphHoverEvent(event);\n this.drawCrosshair(offset.x);\n this.tooltip.show(event);\n this.annotationTooltip.show(event);\n }\n }\n\n public onMouseClick(event) {\n this.tooltipExtraSeries.show(event)\n if (this.ctrl.panel.usingUrl) {\n this.tooltip.destroy();\n }\n }\n\n getEventPos(event, offset) {\n const x = this.xScale.invert(offset.x - this.yAxisWidth).valueOf();\n const y = this.yScale.invert(offset.y - this.chartTop);\n const pos = {\n pageX: event.pageX,\n pageY: event.pageY,\n x: x,\n x1: x,\n y: y,\n y1: y,\n panelRelY: null,\n offset,\n };\n\n return pos;\n }\n\n emitGraphHoverEvent(event) {\n let x = this.xScale.invert(event.offsetX - this.yAxisWidth - this.xGridSize/2).valueOf();\n let y = this.yScale(event.offsetY);\n let pos = {\n pageX: event.pageX,\n pageY: event.pageY,\n x: x, x1: x,\n y: y, y1: y,\n panelRelY: 0\n };\n\n // Set minimum offset to prevent showing legend from another panel\n pos.panelRelY = Math.max(event.offsetY / this.height, 0.001);\n\n // broadcast to other graph panels that we are hovering\n appEvents.emit('graph-hover', {pos: pos, panel: this.panel});\n }\n\n limitSelection(x2) {\n x2 = Math.max(x2, this.yAxisWidth);\n x2 = Math.min(x2, this.chartWidth + this.yAxisWidth);\n return x2;\n }\n\n drawSelection(posX1, posX2) {\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-selection\").remove();\n let selectionX = Math.min(posX1, posX2);\n let selectionWidth = Math.abs(posX1 - posX2);\n\n if (selectionWidth > MIN_SELECTION_WIDTH) {\n this.heatmap.append(\"rect\")\n .attr(\"class\", \"status-heatmap-selection\")\n .attr(\"x\", selectionX)\n .attr(\"width\", selectionWidth)\n .attr(\"y\", this.chartTop)\n .attr(\"height\", this.chartHeight);\n }\n }\n }\n\n clearSelection() {\n this.selection.x1 = -1;\n this.selection.x2 = -1;\n\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-selection\").remove();\n }\n }\n\n\n drawCrosshair(position) {\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-crosshair\").remove();\n\n let posX = position;\n posX = Math.max(posX, this.yAxisWidth);\n posX = Math.min(posX, this.chartWidth + this.yAxisWidth);\n\n this.heatmap.append(\"g\")\n .attr(\"class\", \"status-heatmap-crosshair\")\n .attr(\"transform\", \"translate(\" + posX + \",0)\")\n .append(\"line\")\n .attr(\"x1\", 1)\n .attr(\"y1\", this.chartTop)\n .attr(\"x2\", 1)\n .attr(\"y2\", this.chartBottom)\n .attr(\"stroke-width\", 1);\n }\n }\n\n // map time to X\n drawSharedCrosshair(pos) {\n if (this.heatmap && this.ctrl.dashboard.graphTooltip !== 0) {\n const posX = this.xScale(pos.x) + this.yAxisWidth;\n this.drawCrosshair(posX);\n }\n }\n\n clearCrosshair() {\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-crosshair\").remove();\n }\n }\n\n\n render() {\n this.panel = this.ctrl.panel;\n this.timeRange = this.ctrl.range;\n this.bucketMatrix = this.ctrl.bucketMatrix;\n\n if (!this.bucketMatrix || !this.setElementHeight()) {\n return;\n }\n\n // Draw default axes and return if no data\n this.addStatusmapCanvas();\n if (this.bucketMatrix.noDatapoints) {\n return;\n }\n\n this.addStatusmap();\n this.scope.yAxisWidth = this.yAxisWidth;\n this.scope.xAxisHeight = this.xAxisHeight;\n this.scope.chartHeight = this.chartHeight;\n this.scope.chartWidth = this.chartWidth;\n this.scope.chartTop = this.chartTop;\n }\n\n _renderAnnotations() {\n if (!this.ctrl.annotations || this.ctrl.annotations.length == 0) {\n return;\n }\n\n if (!this.heatmap) {\n return;\n }\n\n\n\n let annoData = _.map(this.ctrl.annotations, (d,i) => ({\"x\": Math.floor(this.yAxisWidth + this.xScale(d.time)), \"id\":i, \"anno\": d.source}));\n\n //({\"ctrl_annotations\": this.ctrl.annotations, \"annoData\": annoData});\n\n let anno = this.heatmap\n .append(\"g\")\n .attr(\"class\", \"statusmap-annotations\")\n .attr(\"transform\", \"translate(0.5,0)\")\n .selectAll(\".statusmap-annotations\")\n .data(annoData)\n .enter().append(\"g\")\n ;\n anno.append(\"line\")\n //.attr(\"class\", \"statusmap-annotation-tick\")\n .attr(\"x1\", d => d.x)\n .attr(\"y1\", this.chartTop)\n .attr(\"x2\", d => d.x)\n .attr(\"y2\", this.chartBottom)\n .style(\"stroke\", d => d.anno.iconColor)\n .style(\"stroke-width\", 1)\n .style(\"stroke-dasharray\", \"3,3\")\n ;\n anno.append(\"polygon\")\n .attr(\"points\", d => [[d.x, this.chartBottom+1], [d.x-5, this.chartBottom+6], [d.x+5, this.chartBottom+6]].join(\" \"))\n .style(\"stroke-width\", 0)\n .style(\"fill\", d => d.anno.iconColor)\n ;\n // Polygons didn't fire mouseevents\n anno.append(\"rect\")\n .attr(\"x\", d => d.x-5)\n .attr(\"width\", 10)\n .attr(\"y\", this.chartBottom+1)\n .attr(\"height\", 5)\n .attr(\"class\", \"statusmap-annotation-tick\")\n .attr(\"annoId\", d => d.id)\n .style(\"opacity\", 0)\n ;\n\n let $ticks = this.$heatmap.find(\".statusmap-annotation-tick\");\n $ticks\n .on(\"mouseenter\", (event) => {\n this.annotationTooltip.mouseOverAnnotationTick = true;\n })\n .on(\"mouseleave\", (event) => {\n this.annotationTooltip.mouseOverAnnotationTick = false;\n });\n }\n}\n\nfunction grafanaTimeFormat(ticks, min, max) {\n if (min && max && ticks) {\n let range = max - min;\n let secPerTick = (range/ticks) / 1000;\n let oneDay = 86400000;\n let oneYear = 31536000000;\n\n if (secPerTick <= 45) {\n return \"%H:%M:%S\";\n }\n if (secPerTick <= 7200 || range <= oneDay) {\n return \"%H:%M\";\n }\n if (secPerTick <= 80000) {\n return \"%m/%d %H:%M\";\n }\n if (secPerTick <= 2419200 || range <= oneYear) {\n return \"%m/%d\";\n }\n return \"%Y-%m\";\n }\n\n return \"%H:%M\";\n}\n"],"file":"rendering.js"} \ No newline at end of file +{"version":3,"sources":["../src/rendering.ts"],"names":["rendering","scope","elem","attrs","ctrl","StatusmapRenderer","grafanaTimeFormat","ticks","min","max","range","secPerTick","oneDay","oneYear","_","$","moment","kbn","appEvents","contextSrv","d3","d3ScaleChromatic","StatusmapTooltip","AnnotationTooltip","MIN_CARD_SIZE","CARD_H_SPACING","CARD_V_SPACING","CARD_ROUND","DATA_RANGE_WIDING_FACTOR","DEFAULT_X_TICK_SIZE_PX","DEFAULT_Y_TICK_SIZE_PX","X_AXIS_TICK_PADDING","Y_AXIS_TICK_PADDING","MIN_SELECTION_WIDTH","Statusmap","from","to","$heatmap","find","tooltip","annotationTooltip","yOffset","selection","active","x1","x2","padding","left","right","top","bottom","margin","events","on","onRender","bind","tickValueFormatter","onGraphHover","onGraphHoverClear","onMouseDown","onMouseMove","onMouseLeave","onMouseClick","clearCrosshair","event","drawSharedCrosshair","pos","render","renderingCompleted","height","panel","row","isString","parseInt","replace","legend","show","css","e","axisText","selectAll","nodes","maxTextWidth","map","text","getBBox","width","Math","ceil","axisLine","select","empty","axisLinePosition","parseFloat","attr","canvasWidth","xScale","scaleTime","domain","timeRange","xGridSize","chartWidth","grafanaTimeFormatter","timeFormat","dashboardTimeZone","dashboard","getTimezone","utcFormat","xAxis","axisBottom","tickFormat","tickPadding","tickSize","chartHeight","posY","chartTop","posX","yAxisWidth","heatmap","append","call","remove","step","length","push","i","scaleOrdinal","bucketMatrix","targets","yAxisSort","sort","a","b","localeCompare","ignorePunctuation","numeric","yAxisScale","getYAxisScale","yScale","getYScale","yAxis","axisLeft","tickValues","tickSizeInner","getYAxisWidth","tickInterval","y_widing","dataRangeWidingFactor","y_min","y_max","floor","decimals","scaledDecimals","format","value","valueFormats","heatmap_elem","insert","chartBottom","cardHSpacing","cards","cardVSpacing","cardRound","yGridSize","cardHeight","addYAxis","xBucketSize","cardWidth","addXAxis","xAxisHeight","getXAxisHeight","style","maxValue","color","minValue","mode","colorScale","getColorScale","setOpacityScale","data","enter","target","buckets","id","xid","yLabel","getCardX","getCardWidth","getCardY","getCardHeight","isEmpty","getCardColor","getCardOpacity","$cards","mouseOverBucket","highlightCard","resetCardHighLight","_renderAnnotations","emit","highlightColor","darker","strokeColor","brighter","current_card","originalFillColor","toString","colorScheme","colorSchemes","colorInterpolator","colorScaleInverted","invert","user","lightTheme","start","end","scaleSequential","opacityScale","scaleLinear","scalePow","exponent","x","rightX","relTo","rangeMs","cx","w","cutted_width","ys","y","h","bucket","cardColor","seriesFilterIndex","discreteExtraSeries","getBucketColorSingle","values","getBucketColor","nullPointMode","elemOffset","offset","clientX","clientY","getEventOffset","mouseUpHandler","onMouseUp","document","one","unbind","selectionRange","abs","timeFrom","timeTo","timeSrv","setTime","utc","clearSelection","destroy","limitSelection","offsetX","drawSelection","emitGraphHoverEvent","drawCrosshair","freezeOnClick","showFrozen","valueOf","pageX","pageY","y1","panelRelY","offsetY","posX1","posX2","selectionX","selectionWidth","position","graphTooltip","setElementHeight","addStatusmapCanvas","noDatapoints","addStatusmap","annotations","annoData","d","time","source","anno","iconColor","join","$ticks","mouseOverAnnotationTick"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport $ from 'jquery';\nimport moment from 'moment';\nimport kbn from 'app/core/utils/kbn';\nimport {appEvents, contextSrv} from 'app/core/core';\nimport * as d3 from 'd3';\nimport * as d3ScaleChromatic from './libs/d3-scale-chromatic/index';\nimport {StatusmapTooltip} from './tooltip';\nimport {AnnotationTooltip} from './annotations';\nimport { Bucket, BucketMatrix } from './statusmap_data';\nimport { StatusHeatmapCtrl } from './module';\n\nlet MIN_CARD_SIZE = 5,\n CARD_H_SPACING = 2,\n CARD_V_SPACING = 2,\n CARD_ROUND = 0,\n DATA_RANGE_WIDING_FACTOR = 1.2,\n DEFAULT_X_TICK_SIZE_PX = 100,\n DEFAULT_Y_TICK_SIZE_PX = 50,\n X_AXIS_TICK_PADDING = 10,\n Y_AXIS_TICK_PADDING = 5,\n MIN_SELECTION_WIDTH = 2;\n\nexport default function rendering(scope: any, elem: any, attrs: any, ctrl: any) {\n return new StatusmapRenderer(scope, elem, attrs, ctrl);\n}\n\nclass Statusmap {\n $svg: any;\n svg: any;\n bucketMatrix: BucketMatrix;\n\n timeRange: {from: number, to: number} = {from:0, to:0};\n \n constructor() {\n\n }\n}\n\nexport class StatusmapRenderer {\n width: number = 0;\n height: number = 0;\n yScale: any;\n xScale: any;\n chartWidth: number = 0;\n chartHeight: number = 0;\n chartTop: number = 0;\n chartBottom: number = 0;\n yAxisWidth: number = 0;\n xAxisHeight: number = 0;\n cardVSpacing: number = 0;\n cardHSpacing: number = 0;\n cardRound: number = 0;\n cardWidth: number = 0;\n cardHeight: number = 0;\n colorScale: any;\n opacityScale: any;\n mouseUpHandler: any;\n xGridSize: number = 0;\n yGridSize: number = 0;\n\n bucketMatrix: BucketMatrix;\n panel: any;\n $heatmap: any;\n tooltip: StatusmapTooltip;\n annotationTooltip: AnnotationTooltip;\n heatmap: any;\n timeRange: any;\n\n yOffset: number;\n selection: any;\n padding: any;\n margin: any;\n dataRangeWidingFactor: number = DATA_RANGE_WIDING_FACTOR;\n\n constructor(private scope: any, private elem: any, attrs: any, private ctrl: StatusHeatmapCtrl) {\n // $heatmap is JQuery object, but heatmap is D3\n this.$heatmap = this.elem.find('.statusmap-panel');\n this.tooltip = new StatusmapTooltip(this.$heatmap, this.scope);\n this.annotationTooltip = new AnnotationTooltip(this.$heatmap, this.scope);\n\n this.yOffset = 0;\n\n this.selection = {\n active: false,\n x1: -1,\n x2: -1,\n };\n\n this.padding = { left: 0, right: 0, top: 0, bottom: 0 };\n this.margin = { left: 25, right: 15, top: 10, bottom: 20 };\n\n this.ctrl.events.on('render', this.onRender.bind(this));\n\n this.ctrl.tickValueFormatter = this.tickValueFormatter.bind(this);\n\n /////////////////////////////\n // Selection and crosshair //\n /////////////////////////////\n\n // Shared crosshair and tooltip this.empty = true;\n\n appEvents.on('graph-hover', this.onGraphHover.bind(this), this.scope);\n\n appEvents.on('graph-hover-clear', this.onGraphHoverClear.bind(this), this.scope);\n\n // Register selection listeners\n this.$heatmap.on('mousedown', this.onMouseDown.bind(this));\n this.$heatmap.on('mousemove', this.onMouseMove.bind(this));\n this.$heatmap.on('mouseleave', this.onMouseLeave.bind(this));\n this.$heatmap.on('click', this.onMouseClick.bind(this));\n }\n\n onGraphHoverClear() {\n this.clearCrosshair();\n }\n\n onGraphHover(event: { pos: any }) {\n this.drawSharedCrosshair(event.pos);\n }\n\n onRender() {\n this.render();\n this.ctrl.renderingCompleted();\n }\n\n\n setElementHeight(): boolean {\n try {\n var height = this.ctrl.height || this.panel.height || this.ctrl.row.height;\n if (_.isString(height)) {\n height = parseInt(height.replace('px', ''), 10);\n }\n\n height -= this.panel.legend.show ? 32 : 10; // bottom padding and space for legend. Change margin in .status-heatmap-color-legend !\n\n this.$heatmap.css('height', height + 'px');\n\n return true;\n } catch (e) { // IE throws errors sometimes\n return false;\n }\n }\n\n getYAxisWidth(elem: any): number {\n const axisText = elem.selectAll(\".axis-y text\").nodes();\n const maxTextWidth = _.max(_.map(axisText, text => {\n // Use SVG getBBox method\n return text.getBBox().width;\n }));\n\n return Math.ceil(maxTextWidth);\n }\n\n getXAxisHeight(elem: any): number {\n let axisLine = elem.select(\".axis-x line\");\n if (!axisLine.empty()) {\n let axisLinePosition = parseFloat(elem.select(\".axis-x line\").attr(\"y2\"));\n let canvasWidth = parseFloat(elem.attr(\"height\"));\n return canvasWidth - axisLinePosition;\n } else {\n // Default height\n return 30;\n }\n }\n\n addXAxis() {\n // Scale timestamps to cards centers\n //this.scope.xScale = this.xScale = d3.scaleTime()\n // .domain([this.timeRange.from, this.timeRange.to])\n // .range([this.xGridSize/2, this.chartWidth-this.xGridSize/2]);\n // Buckets without the most recent\n this.scope.xScale = this.xScale = d3.scaleTime()\n .domain([this.timeRange.from, this.timeRange.to])\n .range([this.xGridSize/2, this.chartWidth-this.xGridSize/2]);\n\n let ticks = this.chartWidth / DEFAULT_X_TICK_SIZE_PX;\n let grafanaTimeFormatter = grafanaTimeFormat(ticks, this.timeRange.from, this.timeRange.to);\n let timeFormat;\n let dashboardTimeZone = this.ctrl.dashboard.getTimezone();\n if (dashboardTimeZone === 'utc') {\n timeFormat = d3.utcFormat(grafanaTimeFormatter);\n } else {\n timeFormat = d3.timeFormat(grafanaTimeFormatter);\n }\n\n let xAxis = d3\n .axisBottom(this.xScale)\n .ticks(ticks)\n .tickFormat(timeFormat)\n .tickPadding(X_AXIS_TICK_PADDING)\n .tickSize(this.chartHeight);\n\n let posY = this.chartTop; // this.margin.top !\n let posX = this.yAxisWidth;\n\n this.heatmap.append(\"g\")\n .attr(\"class\", \"axis axis-x\")\n .attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\")\n .call(xAxis);\n\n // Remove horizontal line in the top of axis labels (called domain in d3)\n this.heatmap\n .select(\".axis-x\")\n .select(\".domain\")\n .remove();\n }\n\n // divide chart height by ticks for cards drawing\n getYScale(ticks: any[]) {\n let range:any[] = [];\n let step = this.chartHeight / ticks.length;\n // svg has y=0 on the top, so top card should have a minimal value in range\n range.push(step);\n for (let i = 1; i < ticks.length; i++) {\n range.push(step * (i+1));\n }\n return d3.scaleOrdinal()\n .domain(ticks)\n .range(range);\n }\n\n // divide chart height by ticks with offset for ticks drawing\n getYAxisScale(ticks: any[]) {\n let range:any[] = [];\n let step = this.chartHeight / ticks.length;\n // svg has y=0 on the top, so top tick should have a minimal value in range\n range.push(this.yOffset);\n for (let i = 1; i < ticks.length; i++) {\n range.push(step * i + this.yOffset);\n }\n return d3.scaleOrdinal()\n .domain(ticks)\n .range(range);\n }\n\n addYAxis() {\n let ticks = this.bucketMatrix.targets;\n\n if (this.panel.yAxisSort == 'a → z') {\n ticks.sort((a, b) => a.localeCompare(b, 'en', {ignorePunctuation: false, numeric: true}));\n } else if (this.panel.yAxisSort == 'z → a') {\n ticks.sort((b, a) => a.localeCompare(b, 'en', {ignorePunctuation: false, numeric: true}));\n }\n\n let yAxisScale = this.getYAxisScale(ticks);\n this.scope.yScale = this.yScale = this.getYScale(ticks);\n\n let yAxis = d3\n .axisLeft(yAxisScale)\n .tickValues(ticks)\n .tickSizeInner(0 - this.width)\n .tickPadding(Y_AXIS_TICK_PADDING);\n\n this.heatmap\n .append(\"g\")\n .attr(\"class\", \"axis axis-y\")\n .call(yAxis);\n\n // Calculate Y axis width first, then move axis into visible area\n let posY = this.margin.top;\n let posX = this.getYAxisWidth(this.heatmap) + Y_AXIS_TICK_PADDING;\n this.heatmap.select(\".axis-y\").attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\");\n\n // Remove vertical line in the right of axis labels (called domain in d3)\n this.heatmap.select(\".axis-y\").select(\".domain\").remove();\n this.heatmap.select(\".axis-y\").selectAll(\".tick line\").remove();\n }\n\n // Wide Y values range and adjust to bucket size\n wideYAxisRange(min: number, max: number, tickInterval: number) {\n let y_widing = (max * (this.dataRangeWidingFactor - 1) - min * (this.dataRangeWidingFactor - 1)) / 2;\n let y_min, y_max;\n\n if (tickInterval === 0) {\n y_max = max * this.dataRangeWidingFactor;\n y_min = min - min * (this.dataRangeWidingFactor - 1);\n tickInterval = (y_max - y_min) / 2;\n } else {\n y_max = Math.ceil((max + y_widing) / tickInterval) * tickInterval;\n y_min = Math.floor((min - y_widing) / tickInterval) * tickInterval;\n }\n\n // Don't wide axis below 0 if all values are positive\n if (min >= 0 && y_min < 0) {\n y_min = 0;\n }\n\n return {y_min, y_max};\n }\n\n tickValueFormatter(decimals, scaledDecimals = null) {\n let format = this.panel.yAxis.format;\n return function(value) {\n return kbn.valueFormats[format](value, decimals, scaledDecimals);\n };\n }\n\n // Create svg element, add axes and\n // calculate sizes for cards drawing\n addStatusmapCanvas() {\n let heatmap_elem = this.$heatmap[0];\n\n this.width = Math.floor(this.$heatmap.width()) - this.padding.right;\n this.height = Math.floor(this.$heatmap.height()) - this.padding.bottom;\n\n if (this.heatmap) {\n this.heatmap.remove();\n }\n\n // Insert svg as a first child into heatmap_elem\n // as the frozen tooltip moving logiс assumes that tooltip is the last child.\n this.heatmap = d3.select(heatmap_elem)\n .insert(\"svg\",\":first-child\")\n .attr(\"width\", this.width)\n .attr(\"height\", this.height);\n\n this.chartHeight = this.height - this.margin.top - this.margin.bottom;\n this.chartTop = this.margin.top;\n this.chartBottom = this.chartTop + this.chartHeight;\n\n this.cardHSpacing = this.panel.cards.cardHSpacing !== null ? this.panel.cards.cardHSpacing : CARD_H_SPACING;\n this.cardVSpacing = this.panel.cards.cardVSpacing !== null ? this.panel.cards.cardVSpacing : CARD_V_SPACING;\n this.cardRound = this.panel.cards.cardRound !== null ? this.panel.cards.cardRound : CARD_ROUND;\n\n // calculate yOffset for YAxis\n this.yGridSize = this.chartHeight;\n if (this.bucketMatrix.targets.length > 0) {\n this.yGridSize = Math.floor(this.chartHeight / this.bucketMatrix.targets.length);\n }\n this.cardHeight = this.yGridSize ? this.yGridSize - this.cardVSpacing : 0;\n this.yOffset = this.cardHeight / 2;\n\n this.addYAxis();\n\n this.yAxisWidth = this.getYAxisWidth(this.heatmap) + Y_AXIS_TICK_PADDING;\n this.chartWidth = this.width - this.yAxisWidth - this.margin.right;\n\n // TODO allow per-y cardWidth!\n // we need to fill chartWidth with xBucketSize cards.\n this.xGridSize = this.chartWidth / (this.bucketMatrix.xBucketSize+1);\n this.cardWidth = this.xGridSize - this.cardHSpacing;\n\n this.addXAxis();\n this.xAxisHeight = this.getXAxisHeight(this.heatmap);\n\n if (!this.panel.yAxis.show) {\n this.heatmap.select(\".axis-y\").selectAll(\"line\").style(\"opacity\", 0);\n }\n\n if (!this.panel.xAxis.show) {\n this.heatmap.select(\".axis-x\").selectAll(\"line\").style(\"opacity\", 0);\n }\n }\n\n addStatusmap():void {\n let maxValue = this.panel.color.max || this.bucketMatrix.maxValue;\n let minValue = this.panel.color.min || this.bucketMatrix.minValue;\n\n if (this.panel.color.mode !== 'discrete') {\n this.colorScale = this.getColorScale(maxValue, minValue);\n }\n this.setOpacityScale(maxValue);\n\n // Draw cards from buckets.\n this.heatmap.selectAll(\".statusmap-cards-row\").data(this.bucketMatrix.targets)\n .enter()\n .selectAll(\".statustmap-card\")\n .data((target:string) => this.bucketMatrix.buckets[target])\n .enter()\n .append(\"rect\")\n .attr(\"cardId\", (b:Bucket) => b.id)\n .attr(\"xid\", (b:Bucket) => b.xid)\n .attr(\"yid\", (b:Bucket) => b.yLabel)\n .attr(\"x\", this.getCardX.bind(this))\n .attr(\"width\", this.getCardWidth.bind(this))\n .attr(\"y\", this.getCardY.bind(this))\n .attr(\"height\", this.getCardHeight.bind(this))\n .attr(\"rx\", this.cardRound)\n .attr(\"ry\", this.cardRound)\n .attr(\"class\", (b:Bucket) => b.isEmpty() ? \"empty-card\" : \"bordered statusmap-card\")\n .style(\"fill\", this.getCardColor.bind(this))\n .style(\"stroke\", this.getCardColor.bind(this))\n .style(\"stroke-width\", 0)\n //.style(\"stroke-width\", getCardStrokeWidth)\n //.style(\"stroke-dasharray\", \"3,3\")\n .style(\"opacity\", this.getCardOpacity.bind(this));\n\n // Set mouse events on cards.\n let $cards = this.$heatmap.find(\".statusmap-card + .bordered\");\n $cards\n .on(\"mouseenter\", (event) => {\n this.tooltip.mouseOverBucket = true;\n this.highlightCard(event);\n })\n .on(\"mouseleave\", (event) => {\n this.tooltip.mouseOverBucket = false;\n this.resetCardHighLight(event);\n });\n\n this._renderAnnotations();\n\n this.ctrl.events.emit('render-complete', {\n \"chartWidth\": this.chartWidth\n });\n }\n\n highlightCard(event) {\n const color = d3.select(event.target).style(\"fill\");\n const highlightColor = d3.color(color).darker(2);\n const strokeColor = d3.color(color).brighter(4);\n const current_card = d3.select(event.target);\n this.tooltip.originalFillColor = color;\n current_card\n .style(\"fill\", highlightColor.toString())\n .style(\"stroke\", strokeColor.toString())\n .style(\"stroke-width\", 1);\n }\n\n resetCardHighLight(event) {\n d3.select(event.target)\n .style(\"fill\", this.tooltip.originalFillColor)\n .style(\"stroke\", this.tooltip.originalFillColor)\n .style(\"stroke-width\", 0);\n }\n\n getColorScale(maxValue, minValue = 0) {\n let colorScheme = _.find(this.ctrl.colorSchemes, {value: this.panel.color.colorScheme});\n let colorInterpolator = d3ScaleChromatic[colorScheme.value];\n let colorScaleInverted = colorScheme.invert === 'always' ||\n (colorScheme.invert === 'dark' && !contextSrv.user.lightTheme);\n\n if (maxValue == minValue)\n maxValue = minValue + 1;\n\n let start = colorScaleInverted ? maxValue : minValue;\n let end = colorScaleInverted ? minValue : maxValue;\n\n return d3.scaleSequential(colorInterpolator).domain([start, end]);\n }\n\n setOpacityScale(maxValue) {\n if (this.panel.color.colorScale === 'linear') {\n this.opacityScale = d3.scaleLinear()\n .domain([0, maxValue])\n .range([0, 1]);\n } else if (this.panel.color.colorScale === 'sqrt') {\n this.opacityScale = d3.scalePow().exponent(this.panel.color.exponent)\n .domain([0, maxValue])\n .range([0, 1]);\n }\n }\n\n getCardX(b: Bucket) {\n let x;\n // cx is the center of the card. Card should be placed to the left.\n //let cx = this.xScale(d.x);\n let rightX = (b.relTo / this.bucketMatrix.rangeMs) * this.chartWidth;\n let cx = rightX - this.cardWidth/2;\n\n if (cx - this.cardWidth/2 < 0) {\n x = this.yAxisWidth + this.cardHSpacing/2;\n } else {\n x = this.yAxisWidth + cx - this.cardWidth/2;\n }\n\n return x;\n }\n\n // xScale returns card center. Adjust cardWidth in case of overlaping.\n getCardWidth(b: Bucket) {\n //return 20;\n let w;\n\n let rightX = (b.relTo / this.bucketMatrix.rangeMs) * this.chartWidth;\n let cx = rightX - this.cardWidth/2;\n //let cx = this.xScale(d.x);\n\n if (cx < this.cardWidth/2) {\n // Center should not exceed half of card.\n // Cut card to the left to prevent overlay of y axis.\n let cutted_width = (cx - this.cardHSpacing/2) + this.cardWidth/2;\n w = cutted_width > 0 ? cutted_width : 0;\n } else if (this.chartWidth - cx < this.cardWidth/2) {\n // Cut card to the right to prevent overlay of right graph edge.\n w = this.cardWidth/2 + (this.chartWidth - cx - this.cardHSpacing/2);\n } else {\n w = this.cardWidth;\n }\n\n // Card width should be MIN_CARD_SIZE at least\n w = Math.max(w, MIN_CARD_SIZE);\n\n if (this.cardHSpacing == 0) {\n w = w+1;\n }\n\n return w;\n }\n\n // Top y for card.\n // yScale gives ???\n // \n getCardY(b: Bucket) {\n return this.yScale(b.yLabel) + this.chartTop - this.cardHeight - this.cardVSpacing/2;\n }\n\n getCardHeight(b: Bucket) {\n //return 20;\n let ys = this.yScale(b.yLabel);\n let y = ys + this.chartTop - this.cardHeight - this.cardVSpacing/2;\n let h = this.cardHeight;\n\n // Cut card height to prevent overlay\n if (y < this.chartTop) {\n h = ys - this.cardVSpacing/2;\n } else if (ys > this.chartBottom) {\n h = this.chartBottom - y;\n } else if (y + this.cardHeight > this.chartBottom) {\n h = this.chartBottom - y;\n }\n\n // Height can't be more than chart height\n h = Math.min(h, this.chartHeight);\n // Card height should be MIN_CARD_SIZE at least\n h = Math.max(h, MIN_CARD_SIZE);\n\n if (this.cardVSpacing == 0) {\n h = h+1\n }\n\n return h;\n }\n\n getCardColor(bucket: Bucket) {\n if (this.panel.color.mode === 'opacity') {\n return this.panel.color.cardColor;\n } else if (this.panel.color.mode === 'spectrum') {\n return this.colorScale(bucket.value);\n } else if (this.panel.color.mode === 'discrete') {\n if (this.panel.seriesFilterIndex != null && this.panel.seriesFilterIndex != -1) {\n return this.ctrl.discreteExtraSeries.getBucketColorSingle(bucket.values[this.panel.seriesFilterIndex]);\n } else {\n return this.ctrl.discreteExtraSeries.getBucketColor(bucket.values);\n }\n }\n }\n\n getCardOpacity(bucket: Bucket) {\n if (this.panel.nullPointMode === 'as empty' && bucket.value == null ) {\n return 0;\n }\n if (this.panel.color.mode === 'opacity') {\n return this.opacityScale(bucket.value);\n } else {\n return 1;\n }\n }\n\n getCardStrokeWidth(b: Bucket) {\n if (this.panel.color.mode === 'discrete') {\n return '1';\n }\n return '0';\n }\n\n\n /////////////////////////////\n // Selection and crosshair //\n /////////////////////////////\n\n getEventOffset(event) {\n const elemOffset = this.$heatmap.offset();\n const x = Math.floor(event.clientX - elemOffset.left);\n const y = Math.floor(event.clientY - elemOffset.top);\n return { x, y };\n }\n\n onMouseDown(event) {\n const offset = this.getEventOffset(event);\n this.selection.active = true;\n this.selection.x1 = offset.x;\n\n this.mouseUpHandler = () => {\n this.onMouseUp();\n };\n\n $(document).one(\"mouseup\", this.mouseUpHandler.bind(this));\n }\n\n onMouseUp() {\n $(document).unbind(\"mouseup\", this.mouseUpHandler.bind(this));\n this.mouseUpHandler = null;\n this.selection.active = false;\n\n let selectionRange = Math.abs(this.selection.x2 - this.selection.x1);\n if (this.selection.x2 >= 0 && selectionRange > MIN_SELECTION_WIDTH) {\n let timeFrom = this.xScale.invert(Math.min(this.selection.x1, this.selection.x2) - this.yAxisWidth - this.xGridSize/2);\n let timeTo = this.xScale.invert(Math.max(this.selection.x1, this.selection.x2) - this.yAxisWidth - this.xGridSize/2);\n\n this.ctrl.timeSrv.setTime({\n from: moment.utc(timeFrom),\n to: moment.utc(timeTo)\n });\n }\n\n this.clearSelection();\n }\n\n onMouseLeave(e) {\n appEvents.emit('graph-hover-clear');\n this.clearCrosshair();\n this.annotationTooltip.destroy();\n }\n\n onMouseMove(event: MouseEvent) {\n if (!this.heatmap) { return; }\n\n const offset = this.getEventOffset(event);\n if (this.selection.active) {\n // Clear crosshair and tooltip\n this.clearCrosshair();\n this.tooltip.destroy();\n this.annotationTooltip.destroy();\n\n this.selection.x2 = this.limitSelection(event.offsetX);\n this.drawSelection(this.selection.x1, this.selection.x2);\n } else {\n //const pos = this.getEventPos(event, offset);\n this.emitGraphHoverEvent(event);\n this.drawCrosshair(offset.x);\n this.tooltip.show(event);\n this.annotationTooltip.show(event);\n }\n }\n\n // TODO emit an event and move logic to panelCtrl\n public onMouseClick(e: MouseEvent) {\n if (this.ctrl.panel.tooltip.freezeOnClick) {\n this.tooltip.showFrozen(e);\n this.tooltip.destroy();\n }\n }\n\n getEventPos(event, offset) {\n const x = this.xScale.invert(offset.x - this.yAxisWidth).valueOf();\n const y = this.yScale.invert(offset.y - this.chartTop);\n const pos = {\n pageX: event.pageX,\n pageY: event.pageY,\n x: x,\n x1: x,\n y: y,\n y1: y,\n panelRelY: null,\n offset,\n };\n\n return pos;\n }\n\n emitGraphHoverEvent(event) {\n let x = this.xScale.invert(event.offsetX - this.yAxisWidth - this.xGridSize/2).valueOf();\n let y = this.yScale(event.offsetY);\n let pos = {\n pageX: event.pageX,\n pageY: event.pageY,\n x: x, x1: x,\n y: y, y1: y,\n panelRelY: 0\n };\n\n // Set minimum offset to prevent showing legend from another panel\n pos.panelRelY = Math.max(event.offsetY / this.height, 0.001);\n\n // broadcast to other graph panels that we are hovering\n appEvents.emit('graph-hover', {pos: pos, panel: this.panel});\n }\n\n limitSelection(x2) {\n x2 = Math.max(x2, this.yAxisWidth);\n x2 = Math.min(x2, this.chartWidth + this.yAxisWidth);\n return x2;\n }\n\n drawSelection(posX1, posX2) {\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-selection\").remove();\n let selectionX = Math.min(posX1, posX2);\n let selectionWidth = Math.abs(posX1 - posX2);\n\n if (selectionWidth > MIN_SELECTION_WIDTH) {\n this.heatmap.append(\"rect\")\n .attr(\"class\", \"status-heatmap-selection\")\n .attr(\"x\", selectionX)\n .attr(\"width\", selectionWidth)\n .attr(\"y\", this.chartTop)\n .attr(\"height\", this.chartHeight);\n }\n }\n }\n\n clearSelection() {\n this.selection.x1 = -1;\n this.selection.x2 = -1;\n\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-selection\").remove();\n }\n }\n\n\n drawCrosshair(position) {\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-crosshair\").remove();\n\n let posX = position;\n posX = Math.max(posX, this.yAxisWidth);\n posX = Math.min(posX, this.chartWidth + this.yAxisWidth);\n\n this.heatmap.append(\"g\")\n .attr(\"class\", \"status-heatmap-crosshair\")\n .attr(\"transform\", \"translate(\" + posX + \",0)\")\n .append(\"line\")\n .attr(\"x1\", 1)\n .attr(\"y1\", this.chartTop)\n .attr(\"x2\", 1)\n .attr(\"y2\", this.chartBottom)\n .attr(\"stroke-width\", 1);\n }\n }\n\n // map time to X\n drawSharedCrosshair(pos) {\n if (this.heatmap && this.ctrl.dashboard.graphTooltip !== 0) {\n const posX = this.xScale(pos.x) + this.yAxisWidth;\n this.drawCrosshair(posX);\n }\n }\n\n clearCrosshair() {\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-crosshair\").remove();\n }\n }\n\n\n render() {\n this.panel = this.ctrl.panel;\n this.timeRange = this.ctrl.range;\n this.bucketMatrix = this.ctrl.bucketMatrix;\n\n if (!this.bucketMatrix || !this.setElementHeight()) {\n return;\n }\n\n // Draw default axes and return if no data\n this.addStatusmapCanvas();\n if (this.bucketMatrix.noDatapoints) {\n return;\n }\n\n this.addStatusmap();\n this.scope.yAxisWidth = this.yAxisWidth;\n this.scope.xAxisHeight = this.xAxisHeight;\n this.scope.chartHeight = this.chartHeight;\n this.scope.chartWidth = this.chartWidth;\n this.scope.chartTop = this.chartTop;\n }\n\n _renderAnnotations() {\n if (!this.ctrl.annotations || this.ctrl.annotations.length == 0) {\n return;\n }\n\n if (!this.heatmap) {\n return;\n }\n\n\n\n let annoData = _.map(this.ctrl.annotations, (d,i) => ({\"x\": Math.floor(this.yAxisWidth + this.xScale(d.time)), \"id\":i, \"anno\": d.source}));\n\n //({\"ctrl_annotations\": this.ctrl.annotations, \"annoData\": annoData});\n\n let anno = this.heatmap\n .append(\"g\")\n .attr(\"class\", \"statusmap-annotations\")\n .attr(\"transform\", \"translate(0.5,0)\")\n .selectAll(\".statusmap-annotations\")\n .data(annoData)\n .enter().append(\"g\")\n ;\n anno.append(\"line\")\n //.attr(\"class\", \"statusmap-annotation-tick\")\n .attr(\"x1\", d => d.x)\n .attr(\"y1\", this.chartTop)\n .attr(\"x2\", d => d.x)\n .attr(\"y2\", this.chartBottom)\n .style(\"stroke\", d => d.anno.iconColor)\n .style(\"stroke-width\", 1)\n .style(\"stroke-dasharray\", \"3,3\")\n ;\n anno.append(\"polygon\")\n .attr(\"points\", d => [[d.x, this.chartBottom+1], [d.x-5, this.chartBottom+6], [d.x+5, this.chartBottom+6]].join(\" \"))\n .style(\"stroke-width\", 0)\n .style(\"fill\", d => d.anno.iconColor)\n ;\n // Polygons didn't fire mouseevents\n anno.append(\"rect\")\n .attr(\"x\", d => d.x-5)\n .attr(\"width\", 10)\n .attr(\"y\", this.chartBottom+1)\n .attr(\"height\", 5)\n .attr(\"class\", \"statusmap-annotation-tick\")\n .attr(\"annoId\", d => d.id)\n .style(\"opacity\", 0)\n ;\n\n let $ticks = this.$heatmap.find(\".statusmap-annotation-tick\");\n $ticks\n .on(\"mouseenter\", (event) => {\n this.annotationTooltip.mouseOverAnnotationTick = true;\n })\n .on(\"mouseleave\", (event) => {\n this.annotationTooltip.mouseOverAnnotationTick = false;\n });\n }\n}\n\nfunction grafanaTimeFormat(ticks, min, max) {\n if (min && max && ticks) {\n let range = max - min;\n let secPerTick = (range/ticks) / 1000;\n let oneDay = 86400000;\n let oneYear = 31536000000;\n\n if (secPerTick <= 45) {\n return \"%H:%M:%S\";\n }\n if (secPerTick <= 7200 || range <= oneDay) {\n return \"%H:%M\";\n }\n if (secPerTick <= 80000) {\n return \"%m/%d %H:%M\";\n }\n if (secPerTick <= 2419200 || range <= oneYear) {\n return \"%m/%d\";\n }\n return \"%Y-%m\";\n }\n\n return \"%H:%M\";\n}\n"],"file":"rendering.js"} \ No newline at end of file diff --git a/dist/specs/panel_config_migration.js b/dist/specs/panel_config_migration.js new file mode 100644 index 0000000..178a79c --- /dev/null +++ b/dist/specs/panel_config_migration.js @@ -0,0 +1,166 @@ +"use strict"; + +System.register(["../panel_config_migration"], function (_export, _context) { + "use strict"; + + var migratePanelConfig; + return { + setters: [function (_panel_config_migration) { + migratePanelConfig = _panel_config_migration.migratePanelConfig; + }], + execute: function () { + describe('when migrate from config with urls', function () { + var panel; + describe('given full panel configuration', function () { + var panelConfig = { + "cards": { + "cardHSpacing": 2, + "cardMinWidth": 5, + "cardRound": null, + "cardVSpacing": 2 + }, + "color": { + "cardColor": "#b4ff00", + "colorScale": "sqrt", + "colorScheme": "interpolateGnYlRd", + "defaultColor": "#757575", + "exponent": 0.5, + "mode": "opacity", + "thresholds": [] + }, + "data": { + "decimals": null, + "unitFormat": "short" + }, + "datasource": "TestData DB", + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "highlightCards": true, + "id": 4, + "legend": { + "show": false + }, + "nullPointMode": "as empty", + "seriesFilterIndex": -1, + "targets": [{ + "aggregation": "Last", + "csvWave": { + "timeStep": 60, + "valuesCSV": "0,0,2,2,1,1,3,3" + }, + "decimals": 2, + "displayAliasType": "Warning / Critical", + "displayType": "Regular", + "displayValueWithAlias": "Never", + "refId": "A", + "scenarioId": "predictable_csv_wave", + "stringInput": "", + "units": "none", + "valueHandler": "Number Threshold" + }], + "timeFrom": null, + "timeShift": null, + "title": "Panel Title", + "tooltip": { + "show": true + }, + "type": "flant-statusmap-panel", + "urls": [{ + "base_url": "", + "extraSeries": { + "index": -1 + }, + "forcelowercase": true, + "icon_fa": "external-link", + "label": "", + "tooltip": "", + "useExtraSeries": false, + "useseriesname": true + }], + "useMax": true, + "usingUrl": true, + "xAxis": { + "labelFormat": "%a %m/%d", + "show": true + }, + "yAxis": { + "maxWidth": -1, + "minWidth": -1, + "show": true + }, + "yAxisSort": "metrics" + }; + beforeEach(function () { + panel = Object.assign({}, panelConfig); + migratePanelConfig(panel); + }); + it('should migrate usingUrls to tooltip.freezeOnClick', function () { + expect(panel.usingUrl).toBeUndefined(); + expect(panel.tooltip).toHaveProperty("freezeOnClick", true); + expect(panel.tooltip.freezeOnClick).toBeTruthy(); + }); + it('should have no urls', function () { + expect(panel.urls).toBeUndefined(); + }); + it('should have empty items in tooltip', function () { + expect(panel.tooltip).toHaveProperty("items", []); + expect(panel.tooltip.items).toHaveLength(0); + }); + }); + describe("given configuration with non-empty base_url", function () { + describe("with variables", function () { + var panelConfig = { + "tooltip": { + "show": true + }, + "urls": [{ + "base_url": "https://google.com/$series_label$time", + "extraSeries": { + "index": -1 + }, + "forcelowercase": true, + "icon_fa": "external-link", + "label": "google", + "tooltip": "", + "useExtraSeries": false, + "useseriesname": true + }, { + "base_url": "example.com/$series_extra", + "extraSeries": { + "format": "YYYY/MM/DD/HH_mm_ss", + "index": -1 + }, + "forcelowercase": true, + "icon_fa": "external-link", + "label": "DateLink", + "useExtraSeries": true + }] + }; + beforeEach(function () { + panel = Object.assign({}, panelConfig); + migratePanelConfig(panel); + }); + it("should have equal size of tooltip.items", function () { + expect(panel.tooltip).toHaveProperty("items"); + expect(panel.tooltip.items).toHaveLength(panelConfig.urls.length); + }); + it("should replace time variable with __url_time_range", function () { + expect(panel.tooltip.items[0].urlTemplate).toContain("${__url_time_range}"); + }); + it("should replace series_label variable with __y_label", function () { + expect(panel.tooltip.items[0].urlTemplate).toContain("${__y_label}"); + }); + it("should replace series_extra variable with __value_date", function () { + expect(panel.tooltip.items[1].urlTemplate).toContain("${__value_date}"); + }); + }); + }); + }); + } + }; +}); +//# sourceMappingURL=panel_config_migration.js.map diff --git a/dist/specs/panel_config_migration.js.map b/dist/specs/panel_config_migration.js.map new file mode 100644 index 0000000..e95dd1c --- /dev/null +++ b/dist/specs/panel_config_migration.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../src/specs/panel_config_migration.test.ts"],"names":["migratePanelConfig","describe","panel","panelConfig","beforeEach","Object","assign","it","expect","usingUrl","toBeUndefined","tooltip","toHaveProperty","freezeOnClick","toBeTruthy","urls","items","toHaveLength","length","urlTemplate","toContain"],"mappings":"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","sourcesContent":["import { migratePanelConfig } from '../panel_config_migration';\n\ndescribe('when migrate from config with urls', () => {\n let panel: any;\n\n describe('given full panel configuration', () => {\n const panelConfig = {\n \"cards\": {\n \"cardHSpacing\": 2,\n \"cardMinWidth\": 5,\n \"cardRound\": null,\n \"cardVSpacing\": 2\n },\n \"color\": {\n \"cardColor\": \"#b4ff00\",\n \"colorScale\": \"sqrt\",\n \"colorScheme\": \"interpolateGnYlRd\",\n \"defaultColor\": \"#757575\",\n \"exponent\": 0.5,\n \"mode\": \"opacity\",\n \"thresholds\": []\n },\n \"data\": {\n \"decimals\": null,\n \"unitFormat\": \"short\"\n },\n \"datasource\": \"TestData DB\",\n \"gridPos\": {\n \"h\": 8,\n \"w\": 12,\n \"x\": 0,\n \"y\": 0\n },\n \"highlightCards\": true,\n \"id\": 4,\n \"legend\": {\n \"show\": false\n },\n \"nullPointMode\": \"as empty\",\n \"seriesFilterIndex\": -1,\n \"targets\": [\n {\n \"aggregation\": \"Last\",\n \"csvWave\": {\n \"timeStep\": 60,\n \"valuesCSV\": \"0,0,2,2,1,1,3,3\"\n },\n \"decimals\": 2,\n \"displayAliasType\": \"Warning / Critical\",\n \"displayType\": \"Regular\",\n \"displayValueWithAlias\": \"Never\",\n \"refId\": \"A\",\n \"scenarioId\": \"predictable_csv_wave\",\n \"stringInput\": \"\",\n \"units\": \"none\",\n \"valueHandler\": \"Number Threshold\"\n }\n ],\n \"timeFrom\": null,\n \"timeShift\": null,\n \"title\": \"Panel Title\",\n \"tooltip\": {\n \"show\": true\n },\n \"type\": \"flant-statusmap-panel\",\n \"urls\": [\n {\n \"base_url\": \"\",\n \"extraSeries\": {\n \"index\": -1\n },\n \"forcelowercase\": true,\n \"icon_fa\": \"external-link\",\n \"label\": \"\",\n \"tooltip\": \"\",\n \"useExtraSeries\": false,\n \"useseriesname\": true\n }\n ],\n \"useMax\": true,\n \"usingUrl\": true,\n \"xAxis\": {\n \"labelFormat\": \"%a %m/%d\",\n \"show\": true\n },\n \"yAxis\": {\n \"maxWidth\": -1,\n \"minWidth\": -1,\n \"show\": true\n },\n \"yAxisSort\": \"metrics\"\n }\n\n beforeEach(() => {\n panel = Object.assign({}, panelConfig);\n migratePanelConfig(panel);\n });\n\n it('should migrate usingUrls to tooltip.freezeOnClick', () => {\n expect(panel.usingUrl).toBeUndefined();\n expect(panel.tooltip).toHaveProperty(\"freezeOnClick\", true);\n expect(panel.tooltip.freezeOnClick).toBeTruthy();\n });\n\n it('should have no urls', () => {\n expect(panel.urls).toBeUndefined();\n });\n\n it('should have empty items in tooltip', () => {\n expect(panel.tooltip).toHaveProperty(\"items\", []);\n expect(panel.tooltip.items).toHaveLength(0);\n });\n });\n\n describe(\"given configuration with non-empty base_url\", () => {\n\n describe(\"with variables\", () => {\n const panelConfig = {\n \"tooltip\": {\n \"show\": true\n },\n \"urls\": [\n {\n \"base_url\": \"https://google.com/$series_label$time\",\n \"extraSeries\": {\n \"index\": -1\n },\n \"forcelowercase\": true,\n \"icon_fa\": \"external-link\",\n \"label\": \"google\",\n \"tooltip\": \"\",\n \"useExtraSeries\": false,\n \"useseriesname\": true,\n },\n {\n \"base_url\": \"example.com/$series_extra\",\n \"extraSeries\": {\n \"format\": \"YYYY/MM/DD/HH_mm_ss\",\n \"index\": -1\n },\n \"forcelowercase\": true,\n \"icon_fa\": \"external-link\",\n \"label\": \"DateLink\",\n \"useExtraSeries\": true,\n }\n ]\n };\n beforeEach(() => {\n panel = Object.assign({}, panelConfig);\n migratePanelConfig(panel);\n });\n\n it(\"should have equal size of tooltip.items\", () => {\n expect(panel.tooltip).toHaveProperty(\"items\");\n expect(panel.tooltip.items).toHaveLength(panelConfig.urls.length);\n });\n it(\"should replace time variable with __url_time_range\", () => {\n expect(panel.tooltip.items[0].urlTemplate).toContain(\"${__url_time_range}\");\n });\n it(\"should replace series_label variable with __y_label\", () => {\n expect(panel.tooltip.items[0].urlTemplate).toContain(\"${__y_label}\");\n });\n it(\"should replace series_extra variable with __value_date\", () => {\n expect(panel.tooltip.items[1].urlTemplate).toContain(\"${__value_date}\");\n });\n });\n });\n});\n"],"file":"panel_config_migration.js"} \ No newline at end of file diff --git a/dist/tooltip.js b/dist/tooltip.js index 6ad6d4b..24ef6b8 100644 --- a/dist/tooltip.js +++ b/dist/tooltip.js @@ -3,7 +3,7 @@ System.register(["d3", "jquery", "lodash"], function (_export, _context) { "use strict"; - var d3, $, _, TOOLTIP_PADDING_X, TOOLTIP_PADDING_Y, StatusmapTooltip; + var d3, $, _, TOOLTIP_PADDING_X, TOOLTIP_PADDING_Y, DefaultValueDateFormat, StatusmapTooltip; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -23,7 +23,10 @@ System.register(["d3", "jquery", "lodash"], function (_export, _context) { }], execute: function () { TOOLTIP_PADDING_X = 30; - TOOLTIP_PADDING_Y = 5; + TOOLTIP_PADDING_Y = 5; // TODO rename file to tooltip_ctrl.ts + // TODO move DefaultValueDateFormat into tooltip.ts, as it used in several places (migration, partial and tooltip render) + + DefaultValueDateFormat = 'YYYY/MM/DD/HH_mm_ss'; _export("StatusmapTooltip", StatusmapTooltip = /*#__PURE__*/ @@ -41,17 +44,21 @@ System.register(["d3", "jquery", "lodash"], function (_export, _context) { _defineProperty(this, "panel", void 0); - _defineProperty(this, "heatmapPanel", void 0); + _defineProperty(this, "panelElem", void 0); _defineProperty(this, "mouseOverBucket", void 0); _defineProperty(this, "originalFillColor", void 0); + _defineProperty(this, "tooltipWidth", void 0); + + _defineProperty(this, "tooltipFrozen", void 0); + this.scope = scope; this.dashboard = scope.ctrl.dashboard; this.panelCtrl = scope.ctrl; this.panel = scope.ctrl.panel; - this.heatmapPanel = elem; + this.panelElem = elem; this.mouseOverBucket = false; this.originalFillColor = null; elem.on("mouseover", this.onMouseOver.bind(this)); @@ -67,7 +74,7 @@ System.register(["d3", "jquery", "lodash"], function (_export, _context) { if (!this.tooltip) { this.add(); - this.move(e); + this.move(e, this.tooltip); } } }, { @@ -82,12 +89,12 @@ System.register(["d3", "jquery", "lodash"], function (_export, _context) { return; } - this.move(e); + this.move(e, this.tooltip); } }, { key: "add", value: function add() { - this.tooltip = d3.select("body").append("div").attr("class", "statusmap-tooltip graph-tooltip grafana-tooltip"); + this.tooltip = d3.select("body").append("div").attr("class", "graph-tooltip statusmap-tooltip"); } }, { key: "destroy", @@ -98,6 +105,22 @@ System.register(["d3", "jquery", "lodash"], function (_export, _context) { this.tooltip = null; } + }, { + key: "removeFrozen", + value: function removeFrozen() { + if (this.tooltipFrozen) { + this.tooltipFrozen.remove(); + this.tooltipFrozen = null; + } + } + }, { + key: "showFrozen", + value: function showFrozen(pos) { + this.removeFrozen(); + this.tooltipFrozen = d3.select(this.panelElem[0]).append("div").attr("class", "graph-tooltip statusmap-tooltip statusmap-tooltip-frozen"); + this.displayTooltip(pos, this.tooltipFrozen, true); + this.moveRelative(pos, this.tooltipFrozen); + } }, { key: "show", value: function show(pos) { @@ -110,6 +133,13 @@ System.register(["d3", "jquery", "lodash"], function (_export, _context) { return; } + this.displayTooltip(pos, this.tooltip, false); + this.move(pos, this.tooltip); + } // Retrieve bucket and create html content inside tooltip’s div element. + + }, { + key: "displayTooltip", + value: function displayTooltip(pos, tooltip, frozen) { var cardEl = d3.select(pos.target); var yid = cardEl.attr('yid'); var xid = cardEl.attr('xid'); @@ -121,41 +151,137 @@ System.register(["d3", "jquery", "lodash"], function (_export, _context) { } var timestamp = bucket.to; - var name = bucket.yLabel; + var yLabel = bucket.yLabel; var value = bucket.value; - var values = bucket.values; + var values = bucket.values; // TODO create option for this formatting. + var tooltipTimeFormat = 'YYYY-MM-DD HH:mm:ss'; - var time = this.dashboard.formatDate(+timestamp, tooltipTimeFormat); - var tooltipHtml = "
".concat(time, "
\n
"); - var statuses; + var time = this.dashboard.formatDate(+timestamp, tooltipTimeFormat); // Close button for the frozen tooltip. + + var tooltipClose = ""; + + if (frozen) { + tooltipClose = "\n\n \n\n"; + } + + var tooltipHtml = "
".concat(time).concat(tooltipClose, "
"); if (this.panel.color.mode === 'discrete') { + var statuses; + if (this.panel.seriesFilterIndex >= 0) { statuses = this.panelCtrl.discreteExtraSeries.convertValueToTooltips(value); } else { statuses = this.panelCtrl.discreteExtraSeries.convertValuesToTooltips(values); } - var statusesHtml = ''; + var statusTitle = "status:"; - if (statuses.length === 1) { - statusesHtml = "status:"; - } else if (statuses.length > 1) { - statusesHtml = "statuses:"; + if (statuses.length > 1) { + statusTitle = "statuses:"; } - tooltipHtml += "\n
\n name: ".concat(name, "
\n ").concat(statusesHtml, "\n
    \n ").concat(_.join(_.map(statuses, function (v) { - return "
  • ").concat(v.tooltip, "
  • "); + tooltipHtml += "\n
    \n name: ".concat(yLabel, "\n
    \n ").concat(statusTitle, "\n
      \n ").concat(_.join(_.map(statuses, function (v) { + return "
    • ").concat(v.tooltip, "
    • "); }), ""), "\n
    \n
    "); } else { if (values.length === 1) { tooltipHtml += "
    \n name: ".concat(name, "
    \n value: ").concat(value, "
    \n
    "); } else { - tooltipHtml += "
    \n name: ".concat(name, "}
    \n values:\n
      \n ").concat(_.join(_.map(values, function (v) { + tooltipHtml += "
      \n name: ".concat(name, "
      \n values:\n
        \n ").concat(_.join(_.map(values, function (v) { return "
      • ".concat(v, "
      • "); }), ""), "\n
      \n
      "); } - } // "Ambiguous bucket state: Multiple values!"; + } + + tooltipHtml += "
      "; + + if (this.panel.tooltip.showItems) { + // Additional information: urls, etc. + // Clone additional items + var items = JSON.parse(JSON.stringify(this.panel.tooltip.items)); + var scopedVars = {}; + var valueVar; + + for (var i = 0; i < bucket.values.length; i++) { + valueVar = "__value_".concat(i); + scopedVars[valueVar] = { + value: bucket.values[i] + }; + } + + scopedVars["__value"] = { + value: bucket.value + }; + scopedVars["__y_label"] = { + value: yLabel + }; // Grafana 7.0 compatible + + scopedVars["__url_time_range"] = { + value: this.panelCtrl.retrieveTimeVar() + }; + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = items[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var item = _step.value; + + if (_.isEmpty(item.urlTemplate)) { + item.link = "#"; + } else { + var dateFormat = item.valueDateFormat; + + if (dateFormat == '') { + dateFormat = DefaultValueDateFormat; + } + + var valueDateVar = void 0; + + for (var _i = 0; _i < bucket.values.length; _i++) { + valueDateVar = "__value_".concat(_i, "_date"); + scopedVars[valueDateVar] = { + value: this.dashboard.formatDate(+bucket.values[_i], dateFormat) + }; + } + + scopedVars["__value_date"] = { + value: this.dashboard.formatDate(+bucket.value, dateFormat) + }; + item.link = this.panelCtrl.templateSrv.replace(item.urlTemplate, scopedVars); // Force lowercase for link + + if (item.urlToLowerCase) { + item.link = item.link.toLowerCase(); + } + } + + item.label = item.urlText; + + if (_.isEmpty(item.label)) { + item.label = _.isEmpty(item.urlTemplate) ? "Empty URL" : _.truncate(item.link); + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + tooltipHtml += _.join(_.map(items, function (v) { + return "\n
      \n \n
      \n
      "); + }), "\n"); + } // Ambiguous state: there multiple values in bucket! + // TODO rename useMax to expectMultipleValues if (!this.panel.useMax && bucket.multipleValues) { @@ -172,18 +298,32 @@ System.register(["d3", "jquery", "lodash"], function (_export, _context) { } } - this.tooltip.html(tooltipHtml); - this.move(pos); - } + tooltip.html(tooltipHtml); // Assign mouse event handlers for "frozen" tooltip. + + if (frozen) { + // Stop propagation mouse events up to parents to allow interaction with frozen tooltip’s elements. + tooltip.on("click", function () { + d3.event.stopPropagation(); + }).on("mousedown", function () { + d3.event.stopPropagation(); + }).on("mouseup", function () { + d3.event.stopPropagation(); + }); // Activate close button + + tooltip.select("a.tooltip-close").on("click", this.removeFrozen.bind(this)); + } + } // Move tooltip as absolute positioned element. + }, { key: "move", - value: function move(pos) { - if (!this.tooltip) { + value: function move(pos, tooltip) { + if (!tooltip) { return; } - var elem = $(this.tooltip.node())[0]; + var elem = $(tooltip.node())[0]; var tooltipWidth = elem.clientWidth; + this.tooltipWidth = tooltipWidth; var tooltipHeight = elem.clientHeight; var left = pos.pageX + TOOLTIP_PADDING_X; var top = pos.pageY + TOOLTIP_PADDING_Y; @@ -196,7 +336,39 @@ System.register(["d3", "jquery", "lodash"], function (_export, _context) { top = pos.pageY - tooltipHeight - TOOLTIP_PADDING_Y; } - return this.tooltip.style("left", left + "px").style("top", top + "px"); + return tooltip.style("left", left + "px").style("top", top + "px"); + } // Move tooltip relative to svg element of panel. + + }, { + key: "moveRelative", + value: function moveRelative(pos, tooltip) { + if (!tooltip) { + return; + } + + var panelX = pos.pageX - this.panelElem.offset().left; + var panelY = pos.pageY - this.panelElem.offset().top; + var panelWidth = this.panelElem.width(); + var panelHeight = this.panelElem.height(); // 'position: relative' sets tooltip’s width to 100% of panel element. + // Restore width from floating tooltip and add more space for 'Close' button. + + var tooltipWidth = this.tooltipWidth + 25; // Left property is clamped so tooltip stays inside panel bound box. + + var tooltipLeft = panelX + TOOLTIP_PADDING_X; + + if (tooltipLeft + tooltipWidth > panelWidth) { + tooltipLeft = panelWidth - tooltipWidth; + } + + if (tooltipLeft < 0) { + tooltipLeft = 0; + } // Frozen tooltip’s root element is appended next to panel’s svg element, + // so top property is adjusted to move tooltip’s root element + // up to the mouse pointer position. + + + var tooltipTop = -(panelHeight - panelY + TOOLTIP_PADDING_Y); + return tooltip.style("left", tooltipLeft + "px").style("top", tooltipTop + "px").style("width", tooltipWidth + "px"); } }]); diff --git a/dist/tooltip.js.map b/dist/tooltip.js.map index f9a42df..9f59048 100644 --- a/dist/tooltip.js.map +++ b/dist/tooltip.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/tooltip.ts"],"names":["d3","$","_","TOOLTIP_PADDING_X","TOOLTIP_PADDING_Y","StatusmapTooltip","elem","scope","dashboard","ctrl","panelCtrl","panel","heatmapPanel","mouseOverBucket","originalFillColor","on","onMouseOver","bind","onMouseLeave","e","tooltip","show","data","isEmpty","add","move","destroy","select","append","attr","remove","pos","panelRelY","cardEl","target","yid","xid","bucket","bucketMatrix","get","timestamp","to","name","yLabel","value","values","tooltipTimeFormat","time","formatDate","tooltipHtml","statuses","color","mode","seriesFilterIndex","discreteExtraSeries","convertValueToTooltips","convertValuesToTooltips","statusesHtml","length","join","map","v","useMax","multipleValues","dataWarnings","title","noColorDefined","badValues","getNotColoredValues","html","node","tooltipWidth","clientWidth","tooltipHeight","clientHeight","left","pageX","top","pageY","window","innerWidth","pageYOffset","innerHeight","style"],"mappings":";;;;;;;;;;;;;;;;;AAAOA,MAAAA,E;;AACAC,MAAAA,C;;AACAC,MAAAA,C;;;AAIHC,MAAAA,iB,GAAoB,E;AACpBC,MAAAA,iB,GAAoB,C;;kCAEXC,gB;;;AAUX,kCAAYC,IAAZ,EAAuBC,KAAvB,EAAmC;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AACjC,eAAKA,KAAL,GAAaA,KAAb;AACA,eAAKC,SAAL,GAAiBD,KAAK,CAACE,IAAN,CAAWD,SAA5B;AACA,eAAKE,SAAL,GAAiBH,KAAK,CAACE,IAAvB;AACA,eAAKE,KAAL,GAAaJ,KAAK,CAACE,IAAN,CAAWE,KAAxB;AACA,eAAKC,YAAL,GAAoBN,IAApB;AACA,eAAKO,eAAL,GAAuB,KAAvB;AACA,eAAKC,iBAAL,GAAyB,IAAzB;AAEAR,UAAAA,IAAI,CAACS,EAAL,CAAQ,WAAR,EAAqB,KAAKC,WAAL,CAAiBC,IAAjB,CAAsB,IAAtB,CAArB;AACAX,UAAAA,IAAI,CAACS,EAAL,CAAQ,YAAR,EAAsB,KAAKG,YAAL,CAAkBD,IAAlB,CAAuB,IAAvB,CAAtB;AACD;;;;sCAEWE,C,EAAG;AACb,gBAAI,CAAC,KAAKR,KAAL,CAAWS,OAAX,CAAmBC,IAApB,IAA4B,CAAC,KAAKd,KAAL,CAAWE,IAAX,CAAgBa,IAA7C,IAAqDpB,CAAC,CAACqB,OAAF,CAAU,KAAKhB,KAAL,CAAWE,IAAX,CAAgBa,IAA1B,CAAzD,EAA0F;AAAE;AAAS;;AAErG,gBAAI,CAAC,KAAKF,OAAV,EAAmB;AACjB,mBAAKI,GAAL;AACA,mBAAKC,IAAL,CAAUN,CAAV;AACD;AACF;;;yCAEc;AACb,iBAAKO,OAAL;AACD;;;sCAEWP,C,EAAG;AACb,gBAAI,CAAC,KAAKR,KAAL,CAAWS,OAAX,CAAmBC,IAAxB,EAA8B;AAAE;AAAS;;AAEzC,iBAAKI,IAAL,CAAUN,CAAV;AACD;;;gCAEK;AACJ,iBAAKC,OAAL,GAAepB,EAAE,CAAC2B,MAAH,CAAU,MAAV,EACZC,MADY,CACL,KADK,EAEZC,IAFY,CAEP,OAFO,EAEE,iDAFF,CAAf;AAGD;;;oCAES;AACR,gBAAI,KAAKT,OAAT,EAAkB;AAChB,mBAAKA,OAAL,CAAaU,MAAb;AACD;;AAED,iBAAKV,OAAL,GAAe,IAAf;AACD;;;+BAEIW,G,EAAK;AACR,gBAAI,CAAC,KAAKpB,KAAL,CAAWS,OAAX,CAAmBC,IAApB,IAA4B,CAAC,KAAKD,OAAtC,EAA+C;AAAE;AAAS,aADlD,CAGR;;;AACA,gBAAIW,GAAG,CAACC,SAAR,EAAmB;AACjB;AACD;;AACD,gBAAIC,MAAM,GAAGjC,EAAE,CAAC2B,MAAH,CAAUI,GAAG,CAACG,MAAd,CAAb;AACA,gBAAIC,GAAG,GAAGF,MAAM,CAACJ,IAAP,CAAY,KAAZ,CAAV;AACA,gBAAIO,GAAG,GAAGH,MAAM,CAACJ,IAAP,CAAY,KAAZ,CAAV;AACA,gBAAIQ,MAAM,GAAG,KAAK3B,SAAL,CAAe4B,YAAf,CAA4BC,GAA5B,CAAgCJ,GAAhC,EAAqCC,GAArC,CAAb,CAVQ,CAUgD;;AACxD,gBAAI,CAACC,MAAD,IAAWA,MAAM,CAACd,OAAP,EAAf,EAAiC;AAC/B,mBAAKG,OAAL;AACA;AACD;;AAED,gBAAIc,SAAS,GAAGH,MAAM,CAACI,EAAvB;AACA,gBAAIC,IAAI,GAAGL,MAAM,CAACM,MAAlB;AACA,gBAAIC,KAAK,GAAGP,MAAM,CAACO,KAAnB;AACA,gBAAIC,MAAM,GAAGR,MAAM,CAACQ,MAApB;AACA,gBAAIC,iBAAiB,GAAG,qBAAxB;AACA,gBAAIC,IAAI,GAAG,KAAKvC,SAAL,CAAewC,UAAf,CAA0B,CAACR,SAA3B,EAAsCM,iBAAtC,CAAX;AAEA,gBAAIG,WAAW,+CAAsCF,IAAtC,4DAAf;AAGA,gBAAIG,QAAJ;;AAEA,gBAAI,KAAKvC,KAAL,CAAWwC,KAAX,CAAiBC,IAAjB,KAA0B,UAA9B,EAA0C;AACxC,kBAAI,KAAKzC,KAAL,CAAW0C,iBAAX,IAAgC,CAApC,EAAuC;AACrCH,gBAAAA,QAAQ,GAAG,KAAKxC,SAAL,CAAe4C,mBAAf,CAAmCC,sBAAnC,CAA0DX,KAA1D,CAAX;AACD,eAFD,MAEO;AACLM,gBAAAA,QAAQ,GAAG,KAAKxC,SAAL,CAAe4C,mBAAf,CAAmCE,uBAAnC,CAA2DX,MAA3D,CAAX;AACD;;AAED,kBAAIY,YAAY,GAAG,EAAnB;;AACA,kBAAIP,QAAQ,CAACQ,MAAT,KAAoB,CAAxB,EAA2B;AACzBD,gBAAAA,YAAY,GAAG,SAAf;AACD,eAFD,MAEO,IAAIP,QAAQ,CAACQ,MAAT,GAAkB,CAAtB,EAAyB;AAC9BD,gBAAAA,YAAY,GAAG,WAAf;AACD;;AACDR,cAAAA,WAAW,8CAEEP,IAFF,gCAGPe,YAHO,uCAKLvD,CAAC,CAACyD,IAAF,CAAOzD,CAAC,CAAC0D,GAAF,CAAMV,QAAN,EAAgB,UAAAW,CAAC;AAAA,+DAAoCA,CAAC,CAACV,KAAtC,wCAAsEU,CAAC,CAACzC,OAAxE;AAAA,eAAjB,CAAP,EAAiH,EAAjH,CALK,kCAAX;AAQD,aArBD,MAqBO;AACL,kBAAIyB,MAAM,CAACa,MAAP,KAAkB,CAAtB,EAAyB;AACvBT,gBAAAA,WAAW,qCACFP,IADE,wCAEDE,KAFC,4BAAX;AAID,eALD,MAKO;AACLK,gBAAAA,WAAW,oCACFP,IADE,4DAITxC,CAAC,CAACyD,IAAF,CAAOzD,CAAC,CAAC0D,GAAF,CAAMf,MAAN,EAAc,UAAAgB,CAAC;AAAA,uCAAWA,CAAX;AAAA,iBAAf,CAAP,EAA4C,EAA5C,CAJS,gCAAX;AAOD;AACF,aAhEO,CAkER;;;AACA,gBAAI,CAAC,KAAKlD,KAAL,CAAWmD,MAAZ,IAAsBzB,MAAM,CAAC0B,cAAjC,EAAiD;AAC/Cd,cAAAA,WAAW,iCAA0B,KAAKvC,SAAL,CAAesD,YAAf,CAA4BD,cAA5B,CAA2CE,KAArE,WAAX;AACD,aArEO,CAuER;;;AACA,gBAAI,KAAKtD,KAAL,CAAWwC,KAAX,CAAiBC,IAAjB,KAA0B,UAA9B,EAA0C;AAExC,kBAAIf,MAAM,CAAC6B,cAAX,EAA2B;AACzB,oBAAIC,SAAS,GAAG,KAAKzD,SAAL,CAAe4C,mBAAf,CAAmCc,mBAAnC,CAAuDvB,MAAvD,CAAhB;AACAI,gBAAAA,WAAW,iCAA0B,KAAKvC,SAAL,CAAesD,YAAf,CAA4BE,cAA5B,CAA2CD,KAArE,wEAGP/D,CAAC,CAACyD,IAAF,CAAOzD,CAAC,CAAC0D,GAAF,CAAMO,SAAN,EAAiB,UAAAN,CAAC;AAAA,uCAAWA,CAAX;AAAA,iBAAlB,CAAP,EAA+C,EAA/C,CAHO,oCAAX;AAOD;AACF;;AAED,iBAAKzC,OAAL,CAAaiD,IAAb,CAAkBpB,WAAlB;AAEA,iBAAKxB,IAAL,CAAUM,GAAV;AACD;;;+BAEIA,G,EAAK;AACR,gBAAI,CAAC,KAAKX,OAAV,EAAmB;AAAE;AAAS;;AAE9B,gBAAId,IAAI,GAAGL,CAAC,CAAC,KAAKmB,OAAL,CAAakD,IAAb,EAAD,CAAD,CAAuB,CAAvB,CAAX;AACA,gBAAIC,YAAY,GAAGjE,IAAI,CAACkE,WAAxB;AACA,gBAAIC,aAAa,GAAGnE,IAAI,CAACoE,YAAzB;AAEA,gBAAIC,IAAI,GAAG5C,GAAG,CAAC6C,KAAJ,GAAYzE,iBAAvB;AACA,gBAAI0E,GAAG,GAAG9C,GAAG,CAAC+C,KAAJ,GAAY1E,iBAAtB;;AAEA,gBAAI2B,GAAG,CAAC6C,KAAJ,GAAYL,YAAZ,GAA2B,EAA3B,GAAgCQ,MAAM,CAACC,UAA3C,EAAuD;AACrDL,cAAAA,IAAI,GAAG5C,GAAG,CAAC6C,KAAJ,GAAYL,YAAZ,GAA2BpE,iBAAlC;AACD;;AAED,gBAAI4B,GAAG,CAAC+C,KAAJ,GAAYC,MAAM,CAACE,WAAnB,GAAiCR,aAAjC,GAAiD,EAAjD,GAAsDM,MAAM,CAACG,WAAjE,EAA8E;AAC5EL,cAAAA,GAAG,GAAG9C,GAAG,CAAC+C,KAAJ,GAAYL,aAAZ,GAA4BrE,iBAAlC;AACD;;AAED,mBAAO,KAAKgB,OAAL,CACJ+D,KADI,CACE,MADF,EACUR,IAAI,GAAG,IADjB,EAEJQ,KAFI,CAEE,KAFF,EAESN,GAAG,GAAG,IAFf,CAAP;AAGD","sourcesContent":["import d3 from 'd3';\nimport $ from 'jquery';\nimport _ from 'lodash';\n\nimport { StatusHeatmapCtrl } from './module';\n\nlet TOOLTIP_PADDING_X = 30;\nlet TOOLTIP_PADDING_Y = 5;\n\nexport class StatusmapTooltip {\n tooltip: any;\n scope: any;\n dashboard: any;\n panelCtrl: StatusHeatmapCtrl;\n panel: any;\n heatmapPanel: any;\n mouseOverBucket: any;\n originalFillColor: any;\n\n constructor(elem: any, scope: any) {\n this.scope = scope;\n this.dashboard = scope.ctrl.dashboard;\n this.panelCtrl = scope.ctrl;\n this.panel = scope.ctrl.panel;\n this.heatmapPanel = elem;\n this.mouseOverBucket = false;\n this.originalFillColor = null;\n\n elem.on(\"mouseover\", this.onMouseOver.bind(this));\n elem.on(\"mouseleave\", this.onMouseLeave.bind(this));\n }\n\n onMouseOver(e) {\n if (!this.panel.tooltip.show || !this.scope.ctrl.data || _.isEmpty(this.scope.ctrl.data)) { return; }\n\n if (!this.tooltip) {\n this.add();\n this.move(e);\n }\n }\n\n onMouseLeave() {\n this.destroy();\n }\n\n onMouseMove(e) {\n if (!this.panel.tooltip.show) { return; }\n\n this.move(e);\n }\n\n add() {\n this.tooltip = d3.select(\"body\")\n .append(\"div\")\n .attr(\"class\", \"statusmap-tooltip graph-tooltip grafana-tooltip\");\n }\n\n destroy() {\n if (this.tooltip) {\n this.tooltip.remove();\n }\n\n this.tooltip = null;\n }\n\n show(pos) {\n if (!this.panel.tooltip.show || !this.tooltip) { return; }\n \n // TODO support for shared tooltip mode\n if (pos.panelRelY) {\n return;\n }\n let cardEl = d3.select(pos.target);\n let yid = cardEl.attr('yid');\n let xid = cardEl.attr('xid');\n let bucket = this.panelCtrl.bucketMatrix.get(yid, xid); // TODO string-to-number conversion for xid\n if (!bucket || bucket.isEmpty()) {\n this.destroy();\n return;\n }\n\n let timestamp = bucket.to;\n let name = bucket.yLabel;\n let value = bucket.value;\n let values = bucket.values;\n let tooltipTimeFormat = 'YYYY-MM-DD HH:mm:ss';\n let time = this.dashboard.formatDate(+timestamp, tooltipTimeFormat);\n\n let tooltipHtml = `
      ${time}
      \n
      `;\n\n let statuses;\n\n if (this.panel.color.mode === 'discrete') {\n if (this.panel.seriesFilterIndex >= 0) {\n statuses = this.panelCtrl.discreteExtraSeries.convertValueToTooltips(value);\n } else {\n statuses = this.panelCtrl.discreteExtraSeries.convertValuesToTooltips(values);\n }\n \n let statusesHtml = '';\n if (statuses.length === 1) {\n statusesHtml = \"status:\";\n } else if (statuses.length > 1) {\n statusesHtml = \"statuses:\";\n }\n tooltipHtml += `\n
      \n name: ${name}
      \n ${statusesHtml}\n
        \n ${_.join(_.map(statuses, v => `
      • ${v.tooltip}
      • `), \"\")}\n
      \n
      `;\n } else {\n if (values.length === 1) {\n tooltipHtml += `
      \n name: ${name}
      \n value: ${value}
      \n
      `;\n } else {\n tooltipHtml += `
      \n name: ${name}}
      \n values:\n
        \n ${_.join(_.map(values, v => `
      • ${v}
      • `), \"\")}\n
      \n
      `;\n }\n }\n\n // \"Ambiguous bucket state: Multiple values!\";\n if (!this.panel.useMax && bucket.multipleValues) {\n tooltipHtml += `
      Error: ${this.panelCtrl.dataWarnings.multipleValues.title}
      `;\n }\n\n // Discrete mode errors\n if (this.panel.color.mode === 'discrete') {\n\n if (bucket.noColorDefined) {\n let badValues = this.panelCtrl.discreteExtraSeries.getNotColoredValues(values);\n tooltipHtml += `
      Error: ${this.panelCtrl.dataWarnings.noColorDefined.title}\n
      not colored values:\n
        \n ${_.join(_.map(badValues, v => `
      • ${v}
      • `), \"\")}\n
      \n
      `;\n\n }\n }\n\n this.tooltip.html(tooltipHtml);\n\n this.move(pos);\n }\n\n move(pos) {\n if (!this.tooltip) { return; }\n\n let elem = $(this.tooltip.node())[0];\n let tooltipWidth = elem.clientWidth;\n let tooltipHeight = elem.clientHeight;\n\n let left = pos.pageX + TOOLTIP_PADDING_X;\n let top = pos.pageY + TOOLTIP_PADDING_Y;\n\n if (pos.pageX + tooltipWidth + 40 > window.innerWidth) {\n left = pos.pageX - tooltipWidth - TOOLTIP_PADDING_X;\n }\n\n if (pos.pageY - window.pageYOffset + tooltipHeight + 20 > window.innerHeight) {\n top = pos.pageY - tooltipHeight - TOOLTIP_PADDING_Y;\n }\n\n return this.tooltip\n .style(\"left\", left + \"px\")\n .style(\"top\", top + \"px\");\n }\n}\n"],"file":"tooltip.js"} \ No newline at end of file +{"version":3,"sources":["../src/tooltip.ts"],"names":["d3","$","_","TOOLTIP_PADDING_X","TOOLTIP_PADDING_Y","DefaultValueDateFormat","StatusmapTooltip","elem","scope","dashboard","ctrl","panelCtrl","panel","panelElem","mouseOverBucket","originalFillColor","on","onMouseOver","bind","onMouseLeave","e","tooltip","show","data","isEmpty","add","move","destroy","select","append","attr","remove","tooltipFrozen","pos","removeFrozen","displayTooltip","moveRelative","panelRelY","frozen","cardEl","target","yid","xid","bucket","bucketMatrix","get","timestamp","to","yLabel","value","values","tooltipTimeFormat","time","formatDate","tooltipClose","tooltipHtml","color","mode","statuses","seriesFilterIndex","discreteExtraSeries","convertValueToTooltips","convertValuesToTooltips","statusTitle","length","join","map","v","name","showItems","items","JSON","parse","stringify","scopedVars","valueVar","i","retrieveTimeVar","item","urlTemplate","link","dateFormat","valueDateFormat","valueDateVar","templateSrv","replace","urlToLowerCase","toLowerCase","label","urlText","truncate","urlIcon","useMax","multipleValues","dataWarnings","title","noColorDefined","badValues","getNotColoredValues","html","event","stopPropagation","node","tooltipWidth","clientWidth","tooltipHeight","clientHeight","left","pageX","top","pageY","window","innerWidth","pageYOffset","innerHeight","style","panelX","offset","panelY","panelWidth","width","panelHeight","height","tooltipLeft","tooltipTop"],"mappings":"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","sourcesContent":["import d3 from 'd3';\nimport $ from 'jquery';\nimport _ from 'lodash';\n\nimport { StatusHeatmapCtrl } from './module';\n\nlet TOOLTIP_PADDING_X = 30;\nlet TOOLTIP_PADDING_Y = 5;\n\n// TODO rename file to tooltip_ctrl.ts\n// TODO move DefaultValueDateFormat into tooltip.ts, as it used in several places (migration, partial and tooltip render)\nlet DefaultValueDateFormat = 'YYYY/MM/DD/HH_mm_ss';\n\nexport class StatusmapTooltip {\n tooltip: any;\n scope: any;\n dashboard: any;\n panelCtrl: StatusHeatmapCtrl;\n panel: any;\n panelElem: any;\n mouseOverBucket: any;\n originalFillColor: any;\n\n tooltipWidth: number;\n tooltipFrozen: any;\n\n constructor(elem: any, scope: any) {\n this.scope = scope;\n this.dashboard = scope.ctrl.dashboard;\n this.panelCtrl = scope.ctrl;\n this.panel = scope.ctrl.panel;\n this.panelElem = elem;\n this.mouseOverBucket = false;\n this.originalFillColor = null;\n\n elem.on(\"mouseover\", this.onMouseOver.bind(this));\n elem.on(\"mouseleave\", this.onMouseLeave.bind(this));\n }\n\n onMouseOver(e) {\n if (!this.panel.tooltip.show || !this.scope.ctrl.data || _.isEmpty(this.scope.ctrl.data)) { return; }\n\n if (!this.tooltip) {\n this.add();\n this.move(e, this.tooltip);\n }\n }\n\n onMouseLeave() {\n this.destroy();\n }\n\n onMouseMove(e) {\n if (!this.panel.tooltip.show) { return; }\n\n this.move(e, this.tooltip);\n }\n\n add() {\n this.tooltip = d3.select(\"body\")\n .append(\"div\")\n .attr(\"class\", \"graph-tooltip statusmap-tooltip\");\n }\n\n destroy() {\n if (this.tooltip) {\n this.tooltip.remove();\n }\n\n this.tooltip = null;\n }\n\n removeFrozen() {\n if (this.tooltipFrozen) {\n this.tooltipFrozen.remove();\n this.tooltipFrozen = null\n }\n }\n\n showFrozen(pos: any) {\n this.removeFrozen();\n this.tooltipFrozen = d3.select(this.panelElem[0])\n .append(\"div\")\n .attr(\"class\", \"graph-tooltip statusmap-tooltip statusmap-tooltip-frozen\");\n this.displayTooltip(pos, this.tooltipFrozen, true);\n this.moveRelative(pos, this.tooltipFrozen);\n }\n\n show(pos: any) {\n if (!this.panel.tooltip.show || !this.tooltip) { return; }\n\n // TODO support for shared tooltip mode\n if (pos.panelRelY) {\n return;\n }\n\n this.displayTooltip(pos, this.tooltip, false);\n\n this.move(pos, this.tooltip);\n }\n\n // Retrieve bucket and create html content inside tooltip’s div element.\n displayTooltip(pos: any, tooltip: any, frozen: boolean) {\n let cardEl = d3.select(pos.target);\n let yid = cardEl.attr('yid');\n let xid = cardEl.attr('xid');\n let bucket = this.panelCtrl.bucketMatrix.get(yid, xid); // TODO string-to-number conversion for xid\n if (!bucket || bucket.isEmpty()) {\n this.destroy();\n return;\n }\n\n let timestamp = bucket.to;\n let yLabel = bucket.yLabel;\n let value = bucket.value;\n let values = bucket.values;\n // TODO create option for this formatting.\n let tooltipTimeFormat:string = 'YYYY-MM-DD HH:mm:ss';\n let time: Date = this.dashboard.formatDate(+timestamp, tooltipTimeFormat);\n\n // Close button for the frozen tooltip.\n let tooltipClose:string = ``;\n if (frozen) {\n tooltipClose = `\n\n \n\n`;\n }\n\n let tooltipHtml:string = `
      ${time}${tooltipClose}
      `;\n\n if (this.panel.color.mode === 'discrete') {\n let statuses;\n if (this.panel.seriesFilterIndex >= 0) {\n statuses = this.panelCtrl.discreteExtraSeries.convertValueToTooltips(value);\n } else {\n statuses = this.panelCtrl.discreteExtraSeries.convertValuesToTooltips(values);\n }\n \n let statusTitle:string = \"status:\";\n if (statuses.length > 1) {\n statusTitle = \"statuses:\";\n }\n tooltipHtml += `\n
      \n name: ${yLabel}\n
      \n ${statusTitle}\n
        \n ${_.join(_.map(statuses, v => `
      • ${v.tooltip}
      • `), \"\")}\n
      \n
      `;\n } else {\n if (values.length === 1) {\n tooltipHtml += `
      \n name: ${name}
      \n value: ${value}
      \n
      `;\n } else {\n tooltipHtml += `
      \n name: ${name}
      \n values:\n
        \n ${_.join(_.map(values, v => `
      • ${v}
      • `), \"\")}\n
      \n
      `;\n }\n }\n\n tooltipHtml += `
      `;\n\n if (this.panel.tooltip.showItems) {\n // Additional information: urls, etc.\n // Clone additional items\n let items: any = JSON.parse(JSON.stringify(this.panel.tooltip.items));\n\n let scopedVars = {};\n\n let valueVar;\n for (let i = 0; i < bucket.values.length; i++) {\n valueVar = `__value_${i}`;\n scopedVars[valueVar] = {value: bucket.values[i] };\n }\n scopedVars[`__value`] = {value: bucket.value};\n scopedVars[`__y_label`] = {value: yLabel};\n // Grafana 7.0 compatible\n scopedVars[`__url_time_range`] = {value: this.panelCtrl.retrieveTimeVar()};\n\n for (let item of items) {\n if (_.isEmpty(item.urlTemplate)) {\n item.link = \"#\";\n } else {\n let dateFormat = item.valueDateFormat;\n if (dateFormat == '') {\n dateFormat = DefaultValueDateFormat;\n }\n let valueDateVar;\n for (let i = 0; i < bucket.values.length; i++) {\n valueDateVar = `__value_${i}_date`;\n scopedVars[valueDateVar] = {value: this.dashboard.formatDate(+bucket.values[i], dateFormat)};\n }\n scopedVars[`__value_date`] = {value: this.dashboard.formatDate(+bucket.value, dateFormat)};\n\n item.link = this.panelCtrl.templateSrv.replace(item.urlTemplate, scopedVars)\n\n // Force lowercase for link\n if (item.urlToLowerCase) {\n item.link = item.link.toLowerCase();\n }\n }\n\n item.label = item.urlText;\n if (_.isEmpty(item.label)) {\n item.label = _.isEmpty(item.urlTemplate) ? \"Empty URL\" : _.truncate(item.link);\n }\n }\n\n tooltipHtml += _.join(_.map(items, v => `\n
      \n \n
      \n
      `), \"\\n\");\n\n }\n\n // Ambiguous state: there multiple values in bucket!\n // TODO rename useMax to expectMultipleValues\n if (!this.panel.useMax && bucket.multipleValues) {\n tooltipHtml += `
      Error: ${this.panelCtrl.dataWarnings.multipleValues.title}
      `;\n }\n\n // Discrete mode errors\n if (this.panel.color.mode === 'discrete') {\n if (bucket.noColorDefined) {\n let badValues = this.panelCtrl.discreteExtraSeries.getNotColoredValues(values);\n tooltipHtml += `
      Error: ${this.panelCtrl.dataWarnings.noColorDefined.title}\n
      not colored values:\n
        \n ${_.join(_.map(badValues, v => `
      • ${v}
      • `), \"\")}\n
      \n
      `;\n }\n }\n\n tooltip.html(tooltipHtml);\n\n // Assign mouse event handlers for \"frozen\" tooltip.\n if (frozen) {\n // Stop propagation mouse events up to parents to allow interaction with frozen tooltip’s elements.\n tooltip\n .on(\"click\", function(){d3.event.stopPropagation(); })\n .on(\"mousedown\", function(){d3.event.stopPropagation(); })\n .on(\"mouseup\", function(){d3.event.stopPropagation(); });\n\n // Activate close button\n tooltip.select(\"a.tooltip-close\")\n .on(\"click\", this.removeFrozen.bind(this));\n }\n }\n\n // Move tooltip as absolute positioned element.\n move(pos, tooltip) {\n if (!tooltip) { return; }\n\n let elem = $(tooltip.node())[0];\n let tooltipWidth = elem.clientWidth;\n this.tooltipWidth = tooltipWidth;\n let tooltipHeight = elem.clientHeight;\n\n let left = pos.pageX + TOOLTIP_PADDING_X;\n let top = pos.pageY + TOOLTIP_PADDING_Y;\n\n if (pos.pageX + tooltipWidth + 40 > window.innerWidth) {\n left = pos.pageX - tooltipWidth - TOOLTIP_PADDING_X;\n }\n\n if (pos.pageY - window.pageYOffset + tooltipHeight + 20 > window.innerHeight) {\n top = pos.pageY - tooltipHeight - TOOLTIP_PADDING_Y;\n }\n\n return tooltip\n .style(\"left\", left + \"px\")\n .style(\"top\", top + \"px\");\n }\n\n // Move tooltip relative to svg element of panel.\n moveRelative(pos, tooltip) {\n if (!tooltip) { return; }\n\n let panelX = pos.pageX - this.panelElem.offset().left;\n let panelY = pos.pageY - this.panelElem.offset().top;\n let panelWidth = this.panelElem.width();\n let panelHeight = this.panelElem.height();\n\n // 'position: relative' sets tooltip’s width to 100% of panel element.\n // Restore width from floating tooltip and add more space for 'Close' button.\n let tooltipWidth = this.tooltipWidth + 25;\n\n // Left property is clamped so tooltip stays inside panel bound box.\n let tooltipLeft = panelX + TOOLTIP_PADDING_X;\n if (tooltipLeft + tooltipWidth > panelWidth) {\n tooltipLeft = panelWidth - tooltipWidth;\n }\n if (tooltipLeft < 0 ) {\n tooltipLeft = 0;\n }\n\n // Frozen tooltip’s root element is appended next to panel’s svg element,\n // so top property is adjusted to move tooltip’s root element\n // up to the mouse pointer position.\n let tooltipTop = -(panelHeight - panelY + TOOLTIP_PADDING_Y);\n\n return tooltip\n .style(\"left\", tooltipLeft + \"px\")\n .style(\"top\", tooltipTop + \"px\")\n .style(\"width\", tooltipWidth + \"px\");\n }\n\n\n}\n"],"file":"tooltip.js"} \ No newline at end of file diff --git a/dist/tooltip_editor.js b/dist/tooltip_editor.js new file mode 100644 index 0000000..d624ea5 --- /dev/null +++ b/dist/tooltip_editor.js @@ -0,0 +1,95 @@ +"use strict"; + +System.register([], function (_export, _context) { + "use strict"; + + var emptyTooltipItem, TooltipEditorCtrl; + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + + function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + + 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; } + + function tooltipEditorCtrl() { + 'use strict'; + + return { + restrict: 'E', + scope: true, + templateUrl: 'public/plugins/flant-statusmap-panel/partials/tooltip_editor.html', + controller: TooltipEditorCtrl + }; + } + + _export("tooltipEditorCtrl", tooltipEditorCtrl); + + return { + setters: [], + execute: function () { + emptyTooltipItem = { + urlText: '', + urlTemplate: '', + urlIcon: 'external-link', + urlToLowerCase: true, + valueDateFormat: '' + }; + + _export("TooltipEditorCtrl", TooltipEditorCtrl = + /*#__PURE__*/ + function () { + function TooltipEditorCtrl($scope) { + _classCallCheck(this, TooltipEditorCtrl); + + _defineProperty(this, "panel", void 0); + + _defineProperty(this, "panelCtrl", void 0); + + $scope.editor = this; + this.panelCtrl = $scope.ctrl; + this.panel = this.panelCtrl.panel; + } + + _createClass(TooltipEditorCtrl, [{ + key: "render", + value: function render() { + this.panelCtrl.render(); + } + }, { + key: "onAddUrl", + value: function onAddUrl() { + this.panel.tooltip.items.push(Object.assign({}, emptyTooltipItem)); + this.render(); + } + }, { + key: "onRemoveUrl", + value: function onRemoveUrl(index) { + this.panel.tooltip.items.splice(index, 1); + this.render(); + } + }, { + key: "onRemoveUrls", + value: function onRemoveUrls() { + this.panel.tooltip.items = []; + this.render(); + } + }, { + key: "getFAIconClasses", + value: function getFAIconClasses() { + return ['external-link', 'plus', 'anchor', 'ban', 'globe', 'gear', 'cloud', 'download', 'cloud-download']; + } + }, { + key: "getValueDateFormats", + value: function getValueDateFormats() { + return ['YYYY/MM/DD/HH_mm_ss', 'YYYYMMDDHHmmss', 'YYYY-MM-DD-HH-mm-ss']; + } + }]); + + return TooltipEditorCtrl; + }()); + } + }; +}); +//# sourceMappingURL=tooltip_editor.js.map diff --git a/dist/tooltip_editor.js.map b/dist/tooltip_editor.js.map new file mode 100644 index 0000000..6dd91a0 --- /dev/null +++ b/dist/tooltip_editor.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/tooltip_editor.ts"],"names":["tooltipEditorCtrl","restrict","scope","templateUrl","controller","TooltipEditorCtrl","emptyTooltipItem","urlText","urlTemplate","urlIcon","urlToLowerCase","valueDateFormat","$scope","editor","panelCtrl","ctrl","panel","render","tooltip","items","push","Object","assign","index","splice"],"mappings":";;;;;;;;;;;;;;;AAoDO,WAASA,iBAAT,GAA6B;AAClC;;AACA,WAAO;AACLC,MAAAA,QAAQ,EAAE,GADL;AAELC,MAAAA,KAAK,EAAE,IAFF;AAGLC,MAAAA,WAAW,EAAE,mEAHR;AAILC,MAAAA,UAAU,EAAEC;AAJP,KAAP;AAMD;;+BAReL,iB;;;;;AAlDZM,MAAAA,gB,GAAmB;AACrBC,QAAAA,OAAO,EAAE,EADY;AAErBC,QAAAA,WAAW,EAAE,EAFQ;AAGrBC,QAAAA,OAAO,EAAE,eAHY;AAIrBC,QAAAA,cAAc,EAAE,IAJK;AAKrBC,QAAAA,eAAe,EAAE;AALI,O;;mCAQVN,iB;;;AAIX,mCAAYO,MAAZ,EAAyB;AAAA;;AAAA;;AAAA;;AACvBA,UAAAA,MAAM,CAACC,MAAP,GAAgB,IAAhB;AACA,eAAKC,SAAL,GAAiBF,MAAM,CAACG,IAAxB;AACA,eAAKC,KAAL,GAAa,KAAKF,SAAL,CAAeE,KAA5B;AACD;;;;mCAEQ;AACP,iBAAKF,SAAL,CAAeG,MAAf;AACD;;;qCAEU;AACT,iBAAKD,KAAL,CAAWE,OAAX,CAAmBC,KAAnB,CAAyBC,IAAzB,CAA8BC,MAAM,CAACC,MAAP,CAAc,EAAd,EAAkBhB,gBAAlB,CAA9B;AACA,iBAAKW,MAAL;AACD;;;sCAEWM,K,EAAe;AACzB,iBAAKP,KAAL,CAAWE,OAAX,CAAmBC,KAAnB,CAAyBK,MAAzB,CAAgCD,KAAhC,EAAuC,CAAvC;AACA,iBAAKN,MAAL;AACD;;;yCAEc;AACb,iBAAKD,KAAL,CAAWE,OAAX,CAAmBC,KAAnB,GAA2B,EAA3B;AACA,iBAAKF,MAAL;AACD;;;6CAEkB;AACjB,mBAAO,CAAC,eAAD,EAAkB,MAAlB,EAA0B,QAA1B,EAAoC,KAApC,EAA2C,OAA3C,EAAoD,MAApD,EAA4D,OAA5D,EAAqE,UAArE,EAAiF,gBAAjF,CAAP;AACD;;;gDAEqB;AACpB,mBAAO,CACH,qBADG,EAEH,gBAFG,EAGH,qBAHG,CAAP;AAKD","sourcesContent":["import { StatusHeatmapCtrl } from './module';\n\nlet emptyTooltipItem = {\n urlText: '',\n urlTemplate: '',\n urlIcon: 'external-link',\n urlToLowerCase: true,\n valueDateFormat: ''\n};\n\nexport class TooltipEditorCtrl {\n panel: any;\n panelCtrl: StatusHeatmapCtrl;\n\n constructor($scope: any) {\n $scope.editor = this;\n this.panelCtrl = $scope.ctrl as StatusHeatmapCtrl;\n this.panel = this.panelCtrl.panel;\n }\n\n render() {\n this.panelCtrl.render();\n }\n\n onAddUrl() {\n this.panel.tooltip.items.push(Object.assign({}, emptyTooltipItem));\n this.render();\n }\n\n onRemoveUrl(index: number) {\n this.panel.tooltip.items.splice(index, 1);\n this.render();\n }\n\n onRemoveUrls() {\n this.panel.tooltip.items = [];\n this.render();\n }\n\n getFAIconClasses() {\n return ['external-link', 'plus', 'anchor', 'ban', 'globe', 'gear', 'cloud', 'download', 'cloud-download'];\n }\n\n getValueDateFormats() {\n return [\n 'YYYY/MM/DD/HH_mm_ss',\n 'YYYYMMDDHHmmss',\n 'YYYY-MM-DD-HH-mm-ss'\n ];\n }\n}\n\nexport function tooltipEditorCtrl() {\n 'use strict';\n return {\n restrict: 'E',\n scope: true,\n templateUrl: 'public/plugins/flant-statusmap-panel/partials/tooltip_editor.html',\n controller: TooltipEditorCtrl,\n };\n}\n"],"file":"tooltip_editor.js"} \ No newline at end of file diff --git a/dist/tooltipextraseries.js b/dist/tooltipextraseries.js deleted file mode 100644 index 97760e6..0000000 --- a/dist/tooltipextraseries.js +++ /dev/null @@ -1,242 +0,0 @@ -"use strict"; - -System.register(["d3", "lodash", "jquery", "./extra_series_format"], function (_export, _context) { - "use strict"; - - var d3, _, $, ExtraSeriesFormatValue, TOOLTIP_PADDING_X, TOOLTIP_PADDING_Y, StatusHeatmapTooltipExtraSeries; - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - - function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - - 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; } - - return { - setters: [function (_d) { - d3 = _d.default; - }, function (_lodash) { - _ = _lodash.default; - }, function (_jquery) { - $ = _jquery.default; - }, function (_extra_series_format) { - ExtraSeriesFormatValue = _extra_series_format.ExtraSeriesFormatValue; - }], - execute: function () { - TOOLTIP_PADDING_X = -50; - TOOLTIP_PADDING_Y = 5; - - _export("StatusHeatmapTooltipExtraSeries", StatusHeatmapTooltipExtraSeries = - /*#__PURE__*/ - function () { - function StatusHeatmapTooltipExtraSeries(elem, scope) { - _classCallCheck(this, StatusHeatmapTooltipExtraSeries); - - _defineProperty(this, "scope", void 0); - - _defineProperty(this, "dashboard", void 0); - - _defineProperty(this, "panelCtrl", void 0); - - _defineProperty(this, "panel", void 0); - - _defineProperty(this, "heatmapPanel", void 0); - - _defineProperty(this, "mouseOverBucket", void 0); - - _defineProperty(this, "originalFillColor", void 0); - - _defineProperty(this, "tooltip", void 0); - - this.scope = scope; - this.dashboard = scope.ctrl.dashboard; - this.panelCtrl = scope.ctrl; - this.panel = scope.ctrl.panel; - this.heatmapPanel = elem; - this.mouseOverBucket = false; - this.originalFillColor = null; - elem.on("mouseover", this.onMouseOver.bind(this)); - elem.on("click", this.onMouseClick.bind(this)); - } - - _createClass(StatusHeatmapTooltipExtraSeries, [{ - key: "onMouseOver", - value: function onMouseOver(e) { - if (!this.panel.usingUrl || !this.scope.ctrl.data || _.isEmpty(this.scope.ctrl.data)) { - return; - } - } - }, { - key: "onMouseClick", - value: function onMouseClick(e) { - if (!this.panel.usingUrl) { - return; - } - - this.destroy(); - this.add(); - } - }, { - key: "add", - value: function add() { - this.tooltip = d3.select("body").append("div").attr("class", "statusmap-tooltip-extraseries graph-tooltip grafana-tooltip"); - } - }, { - key: "destroy", - value: function destroy() { - if (this.tooltip) { - this.tooltip.remove(); - } - - this.tooltip = null; - } - }, { - key: "show", - value: function show(pos) { - if (!this.panel.usingUrl || !this.tooltip) { - return; - } // shared tooltip mode - - - if (pos.panelRelY) { - return; - } - - var cardId = d3.select(pos.target).attr('cardId'); - - if (!cardId) { - this.destroy(); - return; - } - - var card = this.panelCtrl.cardsData.cards[cardId]; - - if (!card) { - this.destroy(); - return; - } - - if (card.value == null) { - this.destroy(); - return; - } - - var x = card.x; - var y = card.y; - var value = card.value; - var values = card.values; - var tooltipTimeFormat = 'YYYY-MM-DD HH:mm:ss'; - var time = this.dashboard.formatDate(+x, tooltipTimeFormat); - var tooltipHtml = "
      ".concat(time, "
      "); - - if (this.panel.color.mode === 'discrete') { - var statuses = ""; - - if (this.panelCtrl.panel.seriesFilterIndex == -1) { - statuses = this.panelCtrl.discreteExtraSeries.convertValuesToTooltips(values); - } else { - statuses = this.panelCtrl.discreteExtraSeries.convertValueToTooltips(value); - } - - tooltipHtml += "\n
      \n name: ".concat(y, "\n
      \n
      \n status:\n
        \n ").concat(_.join(_.map(statuses, function (v) { - return "

        ").concat(v.tooltip, "

        "); - }), ""), "\n
      \n
      \n

      "); - } - - tooltipHtml += "
      "; - var urls = this.panelCtrl.panel.urls; - var rtime = this.panelCtrl.retrieveTimeVar(); - var curl = JSON.parse(JSON.stringify(urls)); - - for (var i = 0; i < curl.length; i++) { - //Change name var - curl[i].base_url = _.replace(curl[i].base_url, /\$series_label/g, y); //Set up extra series - - if (curl[i].useExtraSeries == true) { - var tf = curl[i].extraSeries.format; - var vh = card.values[curl[i].extraSeries.index]; //let extraSeries: any = this.dashboard.formatDate(+vh, tf) - - var series_extra = this.formatExtraSeries(vh, tf); - curl[i].base_url = _.replace(curl[i].base_url, /\$series_extra/g, series_extra); - } //Change time var - - - curl[i].base_url = _.replace(curl[i].base_url, /\$time/g, rtime); //Replace vars - - curl[i].base_url = this.panelCtrl.renderLink(curl[i].base_url, this.panelCtrl.variableSrv.variables); - } - - if (this.panelCtrl.panel.usingUrl == true) { - tooltipHtml += "\n
      \n ".concat(_.join(_.map(curl, function (v) { - return "
      \n
      "); - }), ""), "\n

      "); - } // "Ambiguous bucket state: Multiple values!"; - - - if (!this.panel.useMax && card.multipleValues) { - tooltipHtml += "
      Error: ".concat(this.panelCtrl.dataWarnings.multipleValues.title, "
      "); - } // Discrete mode errors - - - if (this.panel.color.mode === 'discrete') { - if (card.noColorDefined) { - var badValues = this.panelCtrl.discreteExtraSeries.getNotColoredValues(values); - tooltipHtml += "
      Error: ".concat(this.panelCtrl.dataWarnings.noColorDefined.title, "\n
      not colored values:\n
        \n ").concat(_.join(_.map(badValues, function (v) { - return "
      • ".concat(v, "
      • "); - }), ""), "\n
      \n
      "); - } - } - - this.tooltip.html(tooltipHtml); - this.move(pos); - } - }, { - key: "formatExtraSeries", - value: function formatExtraSeries(value, type) { - var extraSeries = ''; - - switch (type) { - case ExtraSeriesFormatValue.Date: - extraSeries = this.dashboard.formatDate(+value, type); - return extraSeries; - - case ExtraSeriesFormatValue.Raw: - extraSeries = value; - return extraSeries; - - default: - return extraSeries; - } - } - }, { - key: "move", - value: function move(pos) { - if (!this.tooltip) { - return; - } - - var elem = $(this.tooltip.node())[0]; - var tooltipWidth = elem.clientWidth; - var tooltipHeight = elem.clientHeight; - var left = pos.pageX + TOOLTIP_PADDING_X; - var top = pos.pageY + TOOLTIP_PADDING_Y; - - if (pos.pageX + tooltipWidth + 40 > window.innerWidth) { - left = pos.pageX - tooltipWidth - TOOLTIP_PADDING_X; - } - - if (pos.pageY - window.pageYOffset + tooltipHeight + 20 > window.innerHeight) { - top = pos.pageY - tooltipHeight - TOOLTIP_PADDING_Y; - } - - return this.tooltip.style("left", left + "px").style("top", top + "px"); - } - }]); - - return StatusHeatmapTooltipExtraSeries; - }()); - } - }; -}); -//# sourceMappingURL=tooltipextraseries.js.map diff --git a/dist/tooltipextraseries.js.map b/dist/tooltipextraseries.js.map deleted file mode 100644 index a5546c9..0000000 --- a/dist/tooltipextraseries.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../src/tooltipextraseries.ts"],"names":["d3","_","$","ExtraSeriesFormatValue","TOOLTIP_PADDING_X","TOOLTIP_PADDING_Y","StatusHeatmapTooltipExtraSeries","elem","scope","dashboard","ctrl","panelCtrl","panel","heatmapPanel","mouseOverBucket","originalFillColor","on","onMouseOver","bind","onMouseClick","e","usingUrl","data","isEmpty","destroy","add","tooltip","select","append","attr","remove","pos","panelRelY","cardId","target","card","cardsData","cards","value","x","y","values","tooltipTimeFormat","time","formatDate","tooltipHtml","color","mode","statuses","seriesFilterIndex","discreteExtraSeries","convertValuesToTooltips","convertValueToTooltips","join","map","v","urls","rtime","retrieveTimeVar","curl","JSON","parse","stringify","i","length","base_url","replace","useExtraSeries","tf","extraSeries","format","vh","index","series_extra","formatExtraSeries","renderLink","variableSrv","variables","forcelowercase","toLowerCase","label","truncate","icon_fa","useMax","multipleValues","dataWarnings","title","noColorDefined","badValues","getNotColoredValues","html","move","type","Date","Raw","node","tooltipWidth","clientWidth","tooltipHeight","clientHeight","left","pageX","top","pageY","window","innerWidth","pageYOffset","innerHeight","style"],"mappings":";;;;;;;;;;;;;;;;;AAAOA,MAAAA,E;;AACAC,MAAAA,C;;AACAC,MAAAA,C;;AACEC,MAAAA,sB,wBAAAA,sB;;;AAEHC,MAAAA,iB,GAAoB,CAAC,E;AACrBC,MAAAA,iB,GAAoB,C;;iDAEbC,+B;;;AAUT,iDAAYC,IAAZ,EAAuBC,KAAvB,EAAmC;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAC/B,eAAKA,KAAL,GAAaA,KAAb;AACA,eAAKC,SAAL,GAAiBD,KAAK,CAACE,IAAN,CAAWD,SAA5B;AACA,eAAKE,SAAL,GAAiBH,KAAK,CAACE,IAAvB;AACA,eAAKE,KAAL,GAAaJ,KAAK,CAACE,IAAN,CAAWE,KAAxB;AACA,eAAKC,YAAL,GAAoBN,IAApB;AACA,eAAKO,eAAL,GAAuB,KAAvB;AACA,eAAKC,iBAAL,GAAyB,IAAzB;AAEAR,UAAAA,IAAI,CAACS,EAAL,CAAQ,WAAR,EAAqB,KAAKC,WAAL,CAAiBC,IAAjB,CAAsB,IAAtB,CAArB;AACAX,UAAAA,IAAI,CAACS,EAAL,CAAQ,OAAR,EAAiB,KAAKG,YAAL,CAAkBD,IAAlB,CAAuB,IAAvB,CAAjB;AACH;;;;sCAEsBE,C,EAAU;AACzB,gBAAI,CAAC,KAAKR,KAAL,CAAWS,QAAZ,IAAwB,CAAC,KAAKb,KAAL,CAAWE,IAAX,CAAgBY,IAAzC,IAAiDrB,CAAC,CAACsB,OAAF,CAAU,KAAKf,KAAL,CAAWE,IAAX,CAAgBY,IAA1B,CAArD,EAAsF;AAClF;AACH;AACJ;;;uCAEmBF,C,EAAU;AAC1B,gBAAI,CAAC,KAAKR,KAAL,CAAWS,QAAhB,EAA0B;AACtB;AACH;;AAED,iBAAKG,OAAL;AACA,iBAAKC,GAAL;AACH;;;gCAEY;AACT,iBAAKC,OAAL,GAAe1B,EAAE,CAAC2B,MAAH,CAAU,MAAV,EACZC,MADY,CACL,KADK,EAEZC,IAFY,CAEP,OAFO,EAEE,6DAFF,CAAf;AAGH;;;oCAEgB;AACb,gBAAI,KAAKH,OAAT,EAAkB;AAChB,mBAAKA,OAAL,CAAaI,MAAb;AACD;;AAED,iBAAKJ,OAAL,GAAe,IAAf;AACH;;;+BAEWK,G,EAAU;AAClB,gBAAI,CAAC,KAAKnB,KAAL,CAAWS,QAAZ,IAAwB,CAAC,KAAKK,OAAlC,EAA2C;AACvC;AACH,aAHiB,CAKlB;;;AACA,gBAAIK,GAAG,CAACC,SAAR,EAAmB;AACf;AACH;;AAED,gBAAIC,MAAW,GAAGjC,EAAE,CAAC2B,MAAH,CAAUI,GAAG,CAACG,MAAd,EAAsBL,IAAtB,CAA2B,QAA3B,CAAlB;;AAEA,gBAAI,CAACI,MAAL,EAAa;AACX,mBAAKT,OAAL;AAEA;AACD;;AAED,gBAAIW,IAAS,GAAG,KAAKxB,SAAL,CAAeyB,SAAf,CAAyBC,KAAzB,CAA+BJ,MAA/B,CAAhB;;AAEA,gBAAI,CAACE,IAAL,EAAW;AACT,mBAAKX,OAAL;AAEA;AACD;;AAED,gBAAIW,IAAI,CAACG,KAAL,IAAc,IAAlB,EAAwB;AACpB,mBAAKd,OAAL;AAEA;AACD;;AAEH,gBAAIe,CAAM,GAAGJ,IAAI,CAACI,CAAlB;AACA,gBAAIC,CAAM,GAAGL,IAAI,CAACK,CAAlB;AACA,gBAAIF,KAAU,GAAGH,IAAI,CAACG,KAAtB;AACA,gBAAIG,MAAW,GAAGN,IAAI,CAACM,MAAvB;AACA,gBAAIC,iBAAyB,GAAG,qBAAhC;AACA,gBAAIC,IAAU,GAAG,KAAKlC,SAAL,CAAemC,UAAf,CAA0B,CAACL,CAA3B,EAA8BG,iBAA9B,CAAjB;AAEA,gBAAIG,WAAmB,+CAAsCF,IAAtC,WAAvB;;AAEA,gBAAI,KAAK/B,KAAL,CAAWkC,KAAX,CAAiBC,IAAjB,KAA0B,UAA9B,EAA0C;AAC1C,kBAAIC,QAAa,GAAG,EAApB;;AAEA,kBAAI,KAAKrC,SAAL,CAAeC,KAAf,CAAqBqC,iBAArB,IAA0C,CAAC,CAA/C,EAAkD;AAChDD,gBAAAA,QAAQ,GAAG,KAAKrC,SAAL,CAAeuC,mBAAf,CAAmCC,uBAAnC,CAA2DV,MAA3D,CAAX;AACD,eAFD,MAEO;AACHO,gBAAAA,QAAQ,GAAG,KAAKrC,SAAL,CAAeuC,mBAAf,CAAmCE,sBAAnC,CAA0Dd,KAA1D,CAAX;AACH;;AAEDO,cAAAA,WAAW,gEAEIL,CAFJ,8IAOHvC,CAAC,CAACoD,IAAF,CAAOpD,CAAC,CAACqD,GAAF,CAAMN,QAAN,EAAgB,UAAAO,CAAC;AAAA,8DAAmCA,CAAC,CAACT,KAArC,2DAAwFS,CAAC,CAAC7B,OAA1F;AAAA,eAAjB,CAAP,EAAkI,EAAlI,CAPG,uFAAX;AAWC;;AAEDmB,YAAAA,WAAW,+CAAX;AAEA,gBAAIW,IAAS,GAAG,KAAK7C,SAAL,CAAeC,KAAf,CAAqB4C,IAArC;AACA,gBAAIC,KAAU,GAAG,KAAK9C,SAAL,CAAe+C,eAAf,EAAjB;AAEA,gBAAIC,IAAS,GAAGC,IAAI,CAACC,KAAL,CAAWD,IAAI,CAACE,SAAL,CAAeN,IAAf,CAAX,CAAhB;;AAEA,iBAAK,IAAIO,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGJ,IAAI,CAACK,MAAzB,EAAiCD,CAAC,EAAlC,EAAsC;AAClC;AACAJ,cAAAA,IAAI,CAACI,CAAD,CAAJ,CAAQE,QAAR,GAAmBhE,CAAC,CAACiE,OAAF,CAAUP,IAAI,CAACI,CAAD,CAAJ,CAAQE,QAAlB,EAA4B,iBAA5B,EAA+CzB,CAA/C,CAAnB,CAFkC,CAGlC;;AACA,kBAAImB,IAAI,CAACI,CAAD,CAAJ,CAAQI,cAAR,IAA0B,IAA9B,EAAoC;AAClC,oBAAIC,EAAO,GAAGT,IAAI,CAACI,CAAD,CAAJ,CAAQM,WAAR,CAAoBC,MAAlC;AACA,oBAAIC,EAAO,GAAGpC,IAAI,CAACM,MAAL,CAAYkB,IAAI,CAACI,CAAD,CAAJ,CAAQM,WAAR,CAAoBG,KAAhC,CAAd,CAFkC,CAGlC;;AACA,oBAAIC,YAAiB,GAAG,KAAKC,iBAAL,CAAuBH,EAAvB,EAA0BH,EAA1B,CAAxB;AAEAT,gBAAAA,IAAI,CAACI,CAAD,CAAJ,CAAQE,QAAR,GAAmBhE,CAAC,CAACiE,OAAF,CAAUP,IAAI,CAACI,CAAD,CAAJ,CAAQE,QAAlB,EAA4B,iBAA5B,EAA+CQ,YAA/C,CAAnB;AACD,eAXiC,CAYlC;;;AACAd,cAAAA,IAAI,CAACI,CAAD,CAAJ,CAAQE,QAAR,GAAmBhE,CAAC,CAACiE,OAAF,CAAUP,IAAI,CAACI,CAAD,CAAJ,CAAQE,QAAlB,EAA4B,SAA5B,EAAuCR,KAAvC,CAAnB,CAbkC,CAelC;;AACAE,cAAAA,IAAI,CAACI,CAAD,CAAJ,CAAQE,QAAR,GAAmB,KAAKtD,SAAL,CAAegE,UAAf,CAA0BhB,IAAI,CAACI,CAAD,CAAJ,CAAQE,QAAlC,EAA4C,KAAKtD,SAAL,CAAeiE,WAAf,CAA2BC,SAAvE,CAAnB;AACH;;AAED,gBAAI,KAAKlE,SAAL,CAAeC,KAAf,CAAqBS,QAArB,IAAiC,IAArC,EAA2C;AACvCwB,cAAAA,WAAW,wGAEP5C,CAAC,CAACoD,IAAF,CAAOpD,CAAC,CAACqD,GAAF,CAAMK,IAAN,EAAY,UAAAJ,CAAC;AAAA,mDAAwBA,CAAC,CAACuB,cAAF,GAAmBvB,CAAC,CAACU,QAAF,CAAWc,WAAX,EAAnB,GAA8CxB,CAAC,CAACU,QAAxE,iMACoFV,CAAC,CAACyB,KAAF,GAAUzB,CAAC,CAACyB,KAAZ,GAAqBzB,CAAC,CAACU,QAAF,IAAc,EAAd,GAAmBhE,CAAC,CAACgF,QAAF,CAAW1B,CAAC,CAACU,QAAb,CAAnB,GAA4C,WADrJ,6FAEEV,CAAC,CAAC2B,OAFJ;AAAA,eAAb,CAAP,EAGiC,EAHjC,CAFO,kCAAX;AAOH,aAjGiB,CAmGlB;;;AACA,gBAAI,CAAC,KAAKtE,KAAL,CAAWuE,MAAZ,IAAsBhD,IAAI,CAACiD,cAA/B,EAA+C;AAC3CvC,cAAAA,WAAW,iCAA0B,KAAKlC,SAAL,CAAe0E,YAAf,CAA4BD,cAA5B,CAA2CE,KAArE,WAAX;AACH,aAtGiB,CAwGlB;;;AACA,gBAAI,KAAK1E,KAAL,CAAWkC,KAAX,CAAiBC,IAAjB,KAA0B,UAA9B,EAA0C;AACtC,kBAAIZ,IAAI,CAACoD,cAAT,EAAyB;AACrB,oBAAIC,SAAc,GAAG,KAAK7E,SAAL,CAAeuC,mBAAf,CAAmCuC,mBAAnC,CAAuDhD,MAAvD,CAArB;AACAI,gBAAAA,WAAW,iCAA0B,KAAKlC,SAAL,CAAe0E,YAAf,CAA4BE,cAA5B,CAA2CD,KAArE,0GAGTrF,CAAC,CAACoD,IAAF,CAAOpD,CAAC,CAACqD,GAAF,CAAMkC,SAAN,EAAiB,UAAAjC,CAAC;AAAA,uCAAWA,CAAX;AAAA,iBAAlB,CAAP,EAA+C,EAA/C,CAHS,4DAAX;AAMH;AACJ;;AAED,iBAAK7B,OAAL,CAAagE,IAAb,CAAkB7C,WAAlB;AAEA,iBAAK8C,IAAL,CAAU5D,GAAV;AACH;;;4CAEyBO,K,EAAYsD,I,EAAW;AAC7C,gBAAIvB,WAAgB,GAAG,EAAvB;;AAEA,oBAAOuB,IAAP;AACI,mBAAKzF,sBAAsB,CAAC0F,IAA5B;AACIxB,gBAAAA,WAAW,GAAG,KAAK5D,SAAL,CAAemC,UAAf,CAA0B,CAACN,KAA3B,EAAkCsD,IAAlC,CAAd;AACA,uBAAOvB,WAAP;;AACJ,mBAAKlE,sBAAsB,CAAC2F,GAA5B;AACIzB,gBAAAA,WAAW,GAAG/B,KAAd;AACA,uBAAO+B,WAAP;;AACJ;AACI,uBAAOA,WAAP;AARR;AAUH;;;+BAEWtC,G,EAAU;AAClB,gBAAI,CAAC,KAAKL,OAAV,EAAmB;AACf;AACH;;AAED,gBAAInB,IAAS,GAAGL,CAAC,CAAC,KAAKwB,OAAL,CAAaqE,IAAb,EAAD,CAAD,CAAuB,CAAvB,CAAhB;AACA,gBAAIC,YAAY,GAAGzF,IAAI,CAAC0F,WAAxB;AACA,gBAAIC,aAAa,GAAG3F,IAAI,CAAC4F,YAAzB;AAEA,gBAAIC,IAAI,GAAGrE,GAAG,CAACsE,KAAJ,GAAYjG,iBAAvB;AACA,gBAAIkG,GAAG,GAAGvE,GAAG,CAACwE,KAAJ,GAAYlG,iBAAtB;;AAEA,gBAAI0B,GAAG,CAACsE,KAAJ,GAAYL,YAAZ,GAA2B,EAA3B,GAAgCQ,MAAM,CAACC,UAA3C,EAAuD;AACnDL,cAAAA,IAAI,GAAGrE,GAAG,CAACsE,KAAJ,GAAYL,YAAZ,GAA2B5F,iBAAlC;AACH;;AAED,gBAAI2B,GAAG,CAACwE,KAAJ,GAAYC,MAAM,CAACE,WAAnB,GAAiCR,aAAjC,GAAiD,EAAjD,GAAsDM,MAAM,CAACG,WAAjE,EAA8E;AAC1EL,cAAAA,GAAG,GAAGvE,GAAG,CAACwE,KAAJ,GAAYL,aAAZ,GAA4B7F,iBAAlC;AACH;;AAED,mBAAO,KAAKqB,OAAL,CACJkF,KADI,CACE,MADF,EACUR,IAAI,GAAG,IADjB,EAEJQ,KAFI,CAEE,KAFF,EAESN,GAAG,GAAG,IAFf,CAAP;AAGH","sourcesContent":["import d3 from 'd3';\nimport _ from 'lodash';\nimport $ from 'jquery';\nimport { ExtraSeriesFormatValue } from './extra_series_format';\n\nconst TOOLTIP_PADDING_X = -50;\nconst TOOLTIP_PADDING_Y = 5;\n\nexport class StatusHeatmapTooltipExtraSeries {\n scope: any;\n dashboard: any;\n panelCtrl: any;\n panel: any;\n heatmapPanel: any;\n mouseOverBucket: any;\n originalFillColor: any;\n tooltip: any;\n\n constructor(elem: any, scope: any) {\n this.scope = scope;\n this.dashboard = scope.ctrl.dashboard;\n this.panelCtrl = scope.ctrl;\n this.panel = scope.ctrl.panel;\n this.heatmapPanel = elem;\n this.mouseOverBucket = false;\n this.originalFillColor = null;\n \n elem.on(\"mouseover\", this.onMouseOver.bind(this));\n elem.on(\"click\", this.onMouseClick.bind(this));\n }\n\n public onMouseOver(e: Event) {\n if (!this.panel.usingUrl || !this.scope.ctrl.data || _.isEmpty(this.scope.ctrl.data)) { \n return; \n }\n }\n\n public onMouseClick(e: Event) {\n if (!this.panel.usingUrl) { \n return; \n }\n\n this.destroy();\n this.add();\n }\n\n public add() {\n this.tooltip = d3.select(\"body\")\n .append(\"div\")\n .attr(\"class\", \"statusmap-tooltip-extraseries graph-tooltip grafana-tooltip\");\n }\n\n public destroy() {\n if (this.tooltip) {\n this.tooltip.remove();\n }\n \n this.tooltip = null;\n }\n\n public show(pos: any) {\n if (!this.panel.usingUrl || !this.tooltip) { \n return; \n }\n\n // shared tooltip mode\n if (pos.panelRelY) {\n return;\n }\n\n let cardId: any = d3.select(pos.target).attr('cardId');\n \n if (!cardId) {\n this.destroy();\n \n return;\n }\n \n let card: any = this.panelCtrl.cardsData.cards[cardId];\n \n if (!card) {\n this.destroy();\n \n return;\n } \n \n if (card.value == null) {\n this.destroy();\n \n return;\n }\n \n let x: any = card.x;\n let y: any = card.y;\n let value: any = card.value;\n let values: any = card.values;\n let tooltipTimeFormat: string = 'YYYY-MM-DD HH:mm:ss';\n let time: Date = this.dashboard.formatDate(+x, tooltipTimeFormat);\n \n let tooltipHtml: string = `
      ${time}
      ` \n \n if (this.panel.color.mode === 'discrete') {\n let statuses: any = \"\";\n \n if (this.panelCtrl.panel.seriesFilterIndex == -1) {\n statuses = this.panelCtrl.discreteExtraSeries.convertValuesToTooltips(values);\n } else {\n statuses = this.panelCtrl.discreteExtraSeries.convertValueToTooltips(value);\n }\n \n tooltipHtml += `\n
      \n name: ${y}\n
      \n
      \n status:\n
        \n ${_.join(_.map(statuses, v => `

        ${v.tooltip}

        `), \"\")}\n
      \n
      \n

      `;\n }\n \n tooltipHtml += `
      `;\n \n let urls: any = this.panelCtrl.panel.urls\n let rtime: any = this.panelCtrl.retrieveTimeVar(); \n\n let curl: any = JSON.parse(JSON.stringify(urls));\n\n for (let i = 0; i < curl.length; i++) {\n //Change name var\n curl[i].base_url = _.replace(curl[i].base_url, /\\$series_label/g, y)\n //Set up extra series\n if (curl[i].useExtraSeries == true) {\n let tf: any = curl[i].extraSeries.format\n let vh: any = card.values[curl[i].extraSeries.index]\n //let extraSeries: any = this.dashboard.formatDate(+vh, tf)\n let series_extra: any = this.formatExtraSeries(vh,tf);\n\n curl[i].base_url = _.replace(curl[i].base_url, /\\$series_extra/g, series_extra)\n }\n //Change time var\n curl[i].base_url = _.replace(curl[i].base_url, /\\$time/g, rtime)\n \n //Replace vars\n curl[i].base_url = this.panelCtrl.renderLink(curl[i].base_url, this.panelCtrl.variableSrv.variables)\n }\n \n if (this.panelCtrl.panel.usingUrl == true) {\n tooltipHtml += `\n
      \n ${_.join(_.map(curl, v => `
      \n
      `), \"\")}\n

      `;\n }\n\n // \"Ambiguous bucket state: Multiple values!\";\n if (!this.panel.useMax && card.multipleValues) {\n tooltipHtml += `
      Error: ${this.panelCtrl.dataWarnings.multipleValues.title}
      `;\n }\n\n // Discrete mode errors\n if (this.panel.color.mode === 'discrete') {\n if (card.noColorDefined) {\n let badValues: any = this.panelCtrl.discreteExtraSeries.getNotColoredValues(values);\n tooltipHtml += `
      Error: ${this.panelCtrl.dataWarnings.noColorDefined.title}\n
      not colored values:\n
        \n ${_.join(_.map(badValues, v => `
      • ${v}
      • `), \"\")}\n
      \n
      `;\n }\n }\n\n this.tooltip.html(tooltipHtml);\n\n this.move(pos);\n }\n\n public formatExtraSeries (value: any, type: any) {\n let extraSeries: any = '';\n\n switch(type) {\n case ExtraSeriesFormatValue.Date:\n extraSeries = this.dashboard.formatDate(+value, type);\n return extraSeries;\n case ExtraSeriesFormatValue.Raw:\n extraSeries = value;\n return extraSeries;\n default:\n return extraSeries;\n }\n }\n\n public move(pos: any) {\n if (!this.tooltip) { \n return; \n }\n\n let elem: any = $(this.tooltip.node())[0];\n let tooltipWidth = elem.clientWidth;\n let tooltipHeight = elem.clientHeight;\n\n let left = pos.pageX + TOOLTIP_PADDING_X;\n let top = pos.pageY + TOOLTIP_PADDING_Y;\n\n if (pos.pageX + tooltipWidth + 40 > window.innerWidth) {\n left = pos.pageX - tooltipWidth - TOOLTIP_PADDING_X;\n }\n \n if (pos.pageY - window.pageYOffset + tooltipHeight + 20 > window.innerHeight) {\n top = pos.pageY - tooltipHeight - TOOLTIP_PADDING_Y;\n }\n\n return this.tooltip\n .style(\"left\", left + \"px\")\n .style(\"top\", top + \"px\");\n }\n}"],"file":"tooltipextraseries.js"} \ No newline at end of file diff --git a/example/k8s/dashboard.json b/example/k8s/dashboard.json index 4028342..c9724e9 100644 --- a/example/k8s/dashboard.json +++ b/example/k8s/dashboard.json @@ -63,10 +63,6 @@ } ] }, - "data": { - "decimals": null, - "unitFormat": "short" - }, "datasource": "prometheus", "gridPos": { "h": 16, @@ -130,21 +126,21 @@ ], "title": "Pod Status", "tooltip": { - "show": true + "show": true, + "freezeOnClick": false, + "showItems": false, + "items": [] }, "transparent": true, "type": "flant-statusmap-panel", "useMax": true, "xAxis": { - "labelFormat": "%a %m/%d", - "minBucketWidthToShowWeekends": 4, - "show": true, - "showCrosshair": true, - "showWeekends": true + "show": true }, "yAxis": { "show": true, - "showCrosshair": false + "minWidth": -1, + "maxWidth": -1 }, "yAxisSort": "a → z" }, @@ -310,21 +306,21 @@ ], "title": "Container Status", "tooltip": { - "show": true + "show": true, + "freezeOnClick": true, + "showItems": false, + "items": [] }, "transparent": true, "type": "flant-statusmap-panel", "useMax": true, "xAxis": { - "labelFormat": "%a %m/%d", - "minBucketWidthToShowWeekends": 4, - "show": true, - "showCrosshair": true, - "showWeekends": true + "show": true }, "yAxis": { "show": true, - "showCrosshair": false + "minWidth": -1, + "maxWidth": -1 }, "yAxisSort": "a → z" } diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..2430c06 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,13 @@ +module.exports = { + verbose: false, + transform: { + '^.+\\.(ts|tsx)$': 'ts-jest', + }, + moduleDirectories: ['node_modules'], + roots: ['/src'], + testRegex: '(\\.|/)(test)\\.(jsx?|tsx?)$', + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'], + //setupFiles: ['jest-canvas-mock', './public/test/jest-shim.ts', './public/test/jest-setup.ts'], + //snapshotSerializers: ['enzyme-to-json/serializer'], + globals: { 'ts-jest': { isolatedModules: true } }, +}; diff --git a/package-lock.json b/package-lock.json index 42bc2e1..711fe63 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2215,6 +2215,100 @@ } } }, + "@jest/core": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", + "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/reporters": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-changed-files": "^24.9.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-resolve-dependencies": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "jest-watcher": "^24.9.0", + "micromatch": "^3.1.10", + "p-each-series": "^1.0.0", + "realpath-native": "^1.1.0", + "rimraf": "^2.5.4", + "slash": "^2.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@jest/environment": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", + "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", + "dev": true, + "requires": { + "@jest/fake-timers": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0" + } + }, "@jest/fake-timers": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", @@ -2226,6 +2320,86 @@ "jest-mock": "^24.9.0" } }, + "@jest/reporters": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", + "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", + "dev": true, + "requires": { + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-lib-coverage": "^2.0.2", + "istanbul-lib-instrument": "^3.0.1", + "istanbul-lib-report": "^2.0.4", + "istanbul-lib-source-maps": "^3.0.1", + "istanbul-reports": "^2.2.6", + "jest-haste-map": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.6.0", + "node-notifier": "^5.4.2", + "slash": "^2.0.0", + "source-map": "^0.6.0", + "string-length": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "@jest/source-map": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", @@ -2262,6 +2436,18 @@ "@types/istanbul-lib-coverage": "^2.0.0" } }, + "@jest/test-sequencer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", + "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", + "dev": true, + "requires": { + "@jest/test-result": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0" + } + }, "@jest/transform": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", @@ -2672,6 +2858,24 @@ "@types/istanbul-lib-report": "*" } }, + "@types/jest": { + "version": "24.0.13", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.0.13.tgz", + "integrity": "sha512-3m6RPnO35r7Dg+uMLj1+xfZaOgIHHHut61djNjzwExXN4/Pm9has9C6I1KMYSfz7mahDhWUOVg4HW/nZdv5Pww==", + "dev": true, + "requires": { + "@types/jest-diff": "*" + } + }, + "@types/jest-diff": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/jest-diff/-/jest-diff-24.3.0.tgz", + "integrity": "sha512-vx1CRDeDUwQ0Pc7v+hS61O1ETA81kD04IMEC0hS1kPyVtHDdZrokAvpF7MT9VI/fVSzicelUZNCepDvhRV1PeA==", + "dev": true, + "requires": { + "jest-diff": "*" + } + }, "@types/jquery": { "version": "1.10.35", "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-1.10.35.tgz", @@ -2705,6 +2909,12 @@ "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==", "dev": true }, + "abab": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", + "dev": true + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -2717,6 +2927,24 @@ "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", "dev": true }, + "acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "dev": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true + } + } + }, "acorn-jsx": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", @@ -2734,6 +2962,12 @@ } } }, + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true + }, "ajv": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", @@ -2821,6 +3055,12 @@ "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", "dev": true }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", @@ -2854,24 +3094,69 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", + "dev": true + }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -3084,6 +3369,15 @@ } } }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -3141,6 +3435,29 @@ } } }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, "browserslist": { "version": "4.7.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz", @@ -3152,6 +3469,15 @@ "node-releases": "^1.1.38" } }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, "bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", @@ -3246,9 +3572,15 @@ "rsvp": "^4.8.4" } }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -3332,6 +3664,45 @@ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -3375,6 +3746,15 @@ "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", "dev": true }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, "commander": { "version": "2.18.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz", @@ -3464,6 +3844,27 @@ "lru-cache": "^2.5.0" } }, + "cssfontparser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cssfontparser/-/cssfontparser-1.2.1.tgz", + "integrity": "sha1-9AIvyPlwDGgCnVQghK+69CWj8+M=", + "dev": true + }, + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "cssstyle": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "dev": true, + "requires": { + "cssom": "0.3.x" + } + }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -3746,6 +4147,39 @@ "number-is-nan": "^1.0.0" } }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, "dateformat": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", @@ -3833,6 +4267,24 @@ } } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "diff-sequences": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", + "dev": true + }, "doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -3842,18 +4294,43 @@ "esutils": "^2.0.2" } }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "^4.0.2" + } + }, "duplexer": { "version": "0.1.1", "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "electron-to-chromium": { "version": "1.3.306", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz", "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==", "dev": true }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", @@ -3931,6 +4408,28 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, "eslint": { "version": "4.19.1", "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", @@ -4239,6 +4738,37 @@ } } }, + "expect": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-styles": "^3.2.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.9.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", @@ -4336,6 +4866,12 @@ } } }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, "fast-deep-equal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", @@ -4484,6 +5020,23 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -5068,6 +5621,12 @@ "globule": "^1.0.0" } }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", @@ -5095,6 +5654,15 @@ "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", "dev": true }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, "glob": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", @@ -5148,6 +5716,12 @@ "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", "dev": true }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, "grunt": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.4.tgz", @@ -5378,6 +5952,48 @@ "duplexer": "^0.1.1" } }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -5458,6 +6074,21 @@ "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", "dev": true }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, "html-minifier": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", @@ -5503,6 +6134,17 @@ "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=", "dev": true }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -5517,6 +6159,16 @@ "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -5747,6 +6399,12 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -5820,6 +6478,12 @@ } } }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -5832,6 +6496,12 @@ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -5850,6 +6520,12 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, "istanbul-lib-coverage": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", @@ -5879,6 +6555,384 @@ } } }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", + "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0" + } + }, + "jest": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.8.0.tgz", + "integrity": "sha512-o0HM90RKFRNWmAWvlyV8i5jGZ97pFwkeVoGvPW1EtLTgJc2+jcuqcbbqcSZLE/3f2S5pt0y2ZBETuhpWNl1Reg==", + "dev": true, + "requires": { + "import-local": "^2.0.0", + "jest-cli": "^24.8.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "jest-cli": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", + "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", + "dev": true, + "requires": { + "@jest/core": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "import-local": "^2.0.0", + "is-ci": "^2.0.0", + "jest-config": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "prompts": "^2.0.1", + "realpath-native": "^1.1.0", + "yargs": "^13.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-canvas-mock": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.1.2.tgz", + "integrity": "sha512-1VI4PK4/X70yrSjYScYVkYJYbXYlZLKJkUrAlyHjQsfolv64aoFyIrmMDtqCjpYrpVvWYEcAGUaYv5DVJj00oQ==", + "dev": true, + "requires": { + "cssfontparser": "^1.2.1", + "parse-color": "^1.0.0" + } + }, + "jest-changed-files": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", + "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "execa": "^1.0.0", + "throat": "^4.0.0" + } + }, + "jest-config": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", + "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^24.9.0", + "@jest/types": "^24.9.0", + "babel-jest": "^24.9.0", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^24.9.0", + "jest-environment-node": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "micromatch": "^3.1.10", + "pretty-format": "^24.9.0", + "realpath-native": "^1.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "babel-jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", + "dev": true, + "requires": { + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/babel__core": "^7.1.0", + "babel-plugin-istanbul": "^5.1.0", + "babel-preset-jest": "^24.9.0", + "chalk": "^2.4.2", + "slash": "^2.0.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-date-mock": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/jest-date-mock/-/jest-date-mock-1.0.7.tgz", + "integrity": "sha512-ZgbYlURRhVpf52Jho4tlyUgpJJ+nYvhxIWhIIEdarmsSuTxFZlC9DmKCyQXsuEljfxK+7HsqdBX/L6rxwWraYw==", + "dev": true + }, + "jest-diff": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-docblock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", + "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", + "dev": true, + "requires": { + "detect-newline": "^2.1.0" + } + }, + "jest-each": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", + "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-environment-jsdom": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", + "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", + "dev": true, + "requires": { + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0", + "jsdom": "^11.5.1" + } + }, + "jest-environment-node": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", + "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", + "dev": true, + "requires": { + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0" + } + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true + }, "jest-haste-map": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", @@ -5899,6 +6953,114 @@ "walker": "^1.0.7" } }, + "jest-jasmine2": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", + "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^24.9.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0", + "throat": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-leak-detector": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", + "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", + "dev": true, + "requires": { + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-matcher-utils": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", + "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "jest-message-util": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", @@ -5955,18 +7117,277 @@ "@jest/types": "^24.9.0" } }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true + }, "jest-regex-util": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", "dev": true }, + "jest-resolve": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", + "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-snapshot": "^24.9.0" + } + }, + "jest-runner": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", + "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.4.2", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-config": "^24.9.0", + "jest-docblock": "^24.3.0", + "jest-haste-map": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-leak-detector": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.6.0", + "source-map-support": "^0.5.6", + "throat": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-runtime": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", + "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.9.0", + "@jest/source-map": "^24.3.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "strip-bom": "^3.0.0", + "yargs": "^13.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "jest-serializer": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", "dev": true }, + "jest-snapshot": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", + "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "expect": "^24.9.0", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^24.9.0", + "semver": "^6.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "jest-util": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", @@ -6030,6 +7451,103 @@ } } }, + "jest-validate": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-watcher": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", + "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", + "dev": true, + "requires": { + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "jest-util": "^24.9.0", + "string-length": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "jest-worker": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", @@ -6073,6 +7591,46 @@ "esprima": "^4.0.0" } }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" + } + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -6085,6 +7643,12 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, "json-schema-traverse": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", @@ -6097,6 +7661,12 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, "json5": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", @@ -6106,12 +7676,42 @@ "minimist": "^1.2.0" } }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -6198,6 +7798,18 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -6253,6 +7865,12 @@ } } }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "makeerror": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", @@ -6340,6 +7958,21 @@ "to-regex": "^3.0.2" } }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "requires": { + "mime-db": "1.44.0" + } + }, "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", @@ -6487,6 +8120,19 @@ "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", "dev": true }, + "node-notifier": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, "node-releases": { "version": "1.1.40", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.40.tgz", @@ -6549,6 +8195,18 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -6684,6 +8342,15 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, + "p-each-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", + "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", + "dev": true, + "requires": { + "p-reduce": "^1.0.0" + } + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -6708,6 +8375,12 @@ "p-limit": "^2.0.0" } }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "dev": true + }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -6723,6 +8396,23 @@ "no-case": "^2.2.0" } }, + "parse-color": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", + "integrity": "sha1-e3SLlag/A/FqlPU15S1/PZRlhhk=", + "dev": true, + "requires": { + "color-convert": "~0.5.0" + }, + "dependencies": { + "color-convert": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", + "dev": true + } + } + }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -6732,6 +8422,12 @@ "error-ex": "^1.2.0" } }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -6782,6 +8478,12 @@ "pinkie-promise": "^2.0.0" } }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -6847,6 +8549,12 @@ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", "dev": true }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -6868,6 +8576,35 @@ "number-is-nan": "^1.0.0" } }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + } + } + }, "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", @@ -6886,12 +8623,28 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "prompts": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", + "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.4" + } + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -6902,6 +8655,12 @@ "once": "^1.3.1" } }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", @@ -6918,6 +8677,12 @@ "string_decoder": "0.10" } }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", @@ -7094,6 +8859,60 @@ "is-finite": "^1.0.0" } }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "request-promise-core": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "request-promise-native": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", + "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "dev": true, + "requires": { + "request-promise-core": "1.1.3", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -7127,6 +8946,23 @@ "path-parse": "^1.0.6" } }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, "resolve-from": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", @@ -7251,12 +9087,24 @@ "walker": "~1.0.5" } }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, "semver": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", "dev": true }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -7295,6 +9143,12 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -7307,6 +9161,12 @@ "integrity": "sha1-Krt1qt453rXMgVzhDmGRFkhQuvA=", "dev": true }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, "slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", @@ -7463,6 +9323,24 @@ "urix": "^0.1.0" } }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", @@ -7516,6 +9394,23 @@ "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", "dev": true }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, "stack-parser": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/stack-parser/-/stack-parser-0.0.1.tgz", @@ -7549,6 +9444,39 @@ } } }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "string-template": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", @@ -7653,6 +9581,12 @@ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, "table": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", @@ -7805,6 +9739,12 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "dev": true + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -7905,6 +9845,25 @@ "repeat-string": "^1.6.1" } }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", @@ -7917,12 +9876,62 @@ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, + "ts-jest": { + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-24.1.0.tgz", + "integrity": "sha512-HEGfrIEAZKfu1pkaxB9au17b1d9b56YZSqz5eCVE8mX68+5reOvlM93xGOzzCREIov9mdH7JBG+s0UyNAqr0tQ==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "json5": "2.x", + "lodash.memoize": "4.x", + "make-error": "1.x", + "mkdirp": "0.x", + "resolve": "1.x", + "semver": "^5.5", + "yargs-parser": "10.x" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, "tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", "dev": true }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -8064,6 +10073,15 @@ "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", "dev": true }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "uri-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", @@ -8098,6 +10116,12 @@ "object.getownpropertydescriptors": "^2.0.3" } }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -8108,6 +10132,26 @@ "spdx-expression-parse": "^3.0.0" } }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, "walker": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", @@ -8117,6 +10161,12 @@ "makeerror": "1.0.x" } }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, "websocket-driver": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", @@ -8133,6 +10183,32 @@ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -8142,6 +10218,60 @@ "isexe": "^2.0.0" } }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -8168,6 +10298,21 @@ "signal-exit": "^3.0.2" } }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, "xmlhttprequest": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", @@ -8179,11 +10324,90 @@ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", "dev": true }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } } } } diff --git a/package.json b/package.json index 6f1ab2a..f63dd5d 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "main": "README.md", "scripts": { "build": "grunt", - "check-types": "node_modules/typescript/bin/tsc" + "check-types": "node_modules/typescript/bin/tsc", + "test": "jest" }, "author": "Flant JSC", "license": "Apache-2.0", @@ -26,6 +27,7 @@ "@types/d3-scale-chromatic": "1.3.1", "@types/angular": "1.6.56", "@types/grafana": "github:flant/types-grafana", + "@types/jest": "24.0.13", "@types/jquery": "1.10.35", "@types/lodash": "4.14.123", "babel-core": "7.0.0-bridge.0", @@ -43,8 +45,12 @@ "grunt-contrib-uglify": "^3.0.1", "grunt-contrib-watch": "^1.0.0", "grunt-notify": "^0.4.5", + "jest": "24.8.0", + "jest-canvas-mock": "2.1.2", + "jest-date-mock": "1.0.7", "load-grunt-tasks": "^3.5.2", "typescript": "3.7.2", + "ts-jest": "24.1.0", "tslib": "1.10.0" }, "dependencies": { diff --git a/src/color_legend.ts b/src/color_legend.ts index 7be9027..3210f34 100644 --- a/src/color_legend.ts +++ b/src/color_legend.ts @@ -16,7 +16,7 @@ coreModule.directive('optionsColorLegend', function() { return { restrict: 'E', template: '
      ', - link: function(scope, elem, attrs) { + link: function(scope: any, elem, attrs) { let ctrl = scope.ctrl; let panel = scope.ctrl.panel; diff --git a/src/css/_statusmap.scss b/src/css/_statusmap.scss index febdcfd..3919578 100644 --- a/src/css/_statusmap.scss +++ b/src/css/_statusmap.scss @@ -41,6 +41,19 @@ } .statusmap-tooltip { + // from .grafana-tooltip + // '.grafana-tooltip a' makes links not readable for tooltip items. + position: absolute; + padding: 10px; + font-weight: 200; + border-radius: 5px; + max-width: 800px; + max-height: 600px; + overflow: hidden; + line-height: 14px; + z-index: 9999; + + // more overrides white-space: nowrap; font-size: $font-size-sm; background-color: $graph-tooltip-bg; @@ -54,19 +67,9 @@ } } -.statusmap-tooltip-extraseries { - white-space: nowrap; - font-size: $font-size-sm; - background-color: $graph-tooltip-bg; - color: $text-color; - - .discrete-item { - color: #ffffff; - padding: 1px; - font-weight: bold; - margin-bottom: 0; - text-shadow: 0 0 0.2em #212124, 0 0 0.2em #212124, 0 0 0.2em #212124; - } +.statusmap-tooltip-frozen { + position: relative; + z-index: 1; } .statusmap-histogram rect { diff --git a/src/extra_series_format.ts b/src/extra_series_format.ts deleted file mode 100644 index 4d6dea3..0000000 --- a/src/extra_series_format.ts +++ /dev/null @@ -1,9 +0,0 @@ -export enum ExtraSeriesFormat { - Date = 'Date', - Raw = 'Raw', -} - -export enum ExtraSeriesFormatValue { - Date = 'YYYY/MM/DD/HH_mm_ss', - Raw = '', -} \ No newline at end of file diff --git a/src/module.ts b/src/module.ts index 53332a7..15d7351 100644 --- a/src/module.ts +++ b/src/module.ts @@ -4,6 +4,9 @@ import { auto } from 'angular'; // Components import './color_legend'; +import { optionsEditorCtrl } from './options_editor'; +import { tooltipEditorCtrl } from './tooltip_editor'; +import { migratePanelConfig } from './panel_config_migration'; // Utils import kbn from 'app/core/utils/kbn'; @@ -14,12 +17,8 @@ import { MetricsPanelCtrl } from 'app/plugins/sdk'; import { AnnotationsSrv } from 'app/features/annotations/annotations_srv'; import { Bucket, BucketMatrix } from './statusmap_data'; import rendering from './rendering'; -// import aggregates, { aggregatesMap } from './aggregates'; -// import fragments, { fragmentsMap } from './fragments'; -// import { labelFormats } from './xAxisLabelFormats'; -import {statusHeatmapOptionsEditor} from './options_editor'; + import {ColorModeDiscrete} from "./color_mode_discrete"; -import { ExtraSeriesFormat, ExtraSeriesFormatValue } from './extra_series_format'; const VALUE_INDEX = 0, TIME_INDEX = 1; @@ -56,7 +55,6 @@ const colorSchemes = [ let colorModes = ['opacity', 'spectrum', 'discrete']; let opacityScales = ['linear', 'sqrt']; - loadPluginCss({ dark: 'plugins/flant-statusmap-panel/css/statusmap.dark.css', light: 'plugins/flant-statusmap-panel/css/statusmap.light.css' @@ -81,7 +79,6 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { noDatapoints: boolean; discreteExtraSeries: ColorModeDiscrete; - extraSeriesFormats: any = []; annotations: object[] = []; annotationsPromise: any; @@ -108,68 +105,41 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { cardRound: null }, xAxis: { - show: true, - labelFormat: '%a %m/%d' + show: true }, yAxis: { show: true, minWidth: -1, - maxWidth: -1, + maxWidth: -1 }, tooltip: { - show: true + show: true, + freezeOnClick: true, + showItems: false, + items: [] // see tooltip_editor.ts }, legend: { show: true }, - data: { - unitFormat: 'short', - decimals: null - }, // how null points should be handled nullPointMode: 'as empty', yAxisSort: 'metrics', highlightCards: true, useMax: true, - urls: [{ - tooltip: '', - label: '', - base_url: '', - useExtraSeries: false, - useseriesname: true, - forcelowercase: true, - icon_fa: 'external-link', - extraSeries: { - index: -1 - } - }], - seriesFilterIndex: -1, - usingUrl: false + + seriesFilterIndex: -1 }; /** @ngInject */ - constructor($scope: any, $injector: auto.IInjectorService, timeSrv, private annotationsSrv: AnnotationsSrv, $window, datasourceSrv, variableSrv, templateSrv) { + constructor($scope: any, $injector: auto.IInjectorService, timeSrv, private annotationsSrv: AnnotationsSrv, $window, datasourceSrv, public variableSrv: any, templateSrv) { super($scope, $injector); + migratePanelConfig(this.panel); _.defaultsDeep(this.panel, this.panelDefaults); this.opacityScales = opacityScales; this.colorModes = colorModes; this.colorSchemes = colorSchemes; - this.variableSrv = variableSrv; - this.extraSeriesFormats = ExtraSeriesFormat; - - this.renderLink = (link, scopedVars, format) => { - var scoped = {} - for (var key in scopedVars) { - scoped[key] = { value: scopedVars[key] } - } - if (format) { - return this.templateSrv.replace(link, scoped, format) - } else { - return this.templateSrv.replace(link, scoped) - } - } // default graph width for discrete card width calculation this.graph = { @@ -209,38 +179,15 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { this.events.on('refresh', this.postRefresh.bind(this)); // custom event from rendering.js this.events.on('render-complete', this.onRenderComplete.bind(this)); - this.events.on('onChangeType', this.onChangeType.bind(this)); this.onCardColorChange = this.onCardColorChange.bind(this); } onRenderComplete(data: any):void { - // console.log({ - // data: this.data, - // bucketMatrix: this.bucketMatrix, - // chartWidth: data.chartWidth, - // from: this.range.from.valueOf(), - // to: this.range.to.valueOf() - // }) - this.graph.chartWidth = data.chartWidth; this.renderingCompleted(); } - onChangeType(url): void { - switch (url.type) { - case ExtraSeriesFormat.Date: - url.extraSeries.format = ExtraSeriesFormatValue.Date; - break; - case ExtraSeriesFormat.Raw: - url.extraSeries.format = ExtraSeriesFormatValue.Raw; - break; - default: - url.extraSeries.format = ExtraSeriesFormatValue.Raw; - break; - } - } - // getChartWidth returns an approximation of chart canvas width or // a saved value calculated during a render. getChartWidth():number { @@ -266,6 +213,7 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { // Quick workaround for 6.7 and 7.0+. There is no call to // calculateInterval in updateTimeRange in those versions. + // TODO ts type has no argument for this method. updateTimeRange(datasource?: any) { let ret = super.updateTimeRange(datasource); this.calculateInterval(); @@ -316,17 +264,8 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { this.interval = interval; // Get final buckets count after interval is adjusted + // TODO is it needed? //this.xBucketsCount = Math.floor(rangeMs / intervalMs); - - // console.log("calculateInterval: ", { - // interval: this.interval, - // intervalMs: this.intervalMs, - // rangeMs: rangeMs, - // from: this.range.from.valueOf(), - // to: this.range.to.valueOf(), - // numIntervals: rangeMs/this.intervalMs, - // maxCardsCount: maxCardsCount, - // }); } issueQueries(datasource: any) { @@ -342,8 +281,7 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { * (but not wait for completion). This resolves * issue 11806. */ - // 5.x before 5.4 doesn't have datasourcePromises. - + // 5.x before 5.4 doesn't have datasourcePromises. if ("undefined" !== typeof(this.annotationsSrv.datasourcePromises)) { return this.annotationsSrv.datasourcePromises.then(r => { return this.issueQueriesWithInterval(datasource, this.interval); @@ -364,7 +302,6 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { return res; } - onDataReceived(dataList: any) { this.data = dataList; // Quick workaround for 7.0+. There is no call to @@ -401,7 +338,8 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { } onInitEditMode() { - this.addEditorTab('Options', statusHeatmapOptionsEditor, 2); + this.addEditorTab('Options', optionsEditorCtrl, 2); + this.addEditorTab('Tooltip', tooltipEditorCtrl, 3); this.unitFormats = kbn.getUnitFormats(); } @@ -436,8 +374,6 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { if (this.bucketMatrix) { this.noDatapoints = this.bucketMatrix.noDatapoints; } - - //console.log(this); } onCardColorChange(newColor) { @@ -455,75 +391,14 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { this.noColorDefined = false; } - onEditorAddThreshold() { - this.panel.color.thresholds.push({ color: this.panel.defaultColor }); - this.render(); - } - - onEditorAddUrl = () => { - this.panel.urls.push({ - label: '', - base_url: '', - useExtraSeries: false, - useseriesname: true, - forcelowercase: true, - icon_fa: 'external-link', - extraSeries: { - index: -1 - } - }); - this.render(); - } - - onEditorRemoveUrl = (index) => { - this.panel.urls.splice(index, 1); - this.render(); - } - - onEditorRemoveThreshold(index:number) { - this.panel.color.thresholds.splice(index, 1); - this.render(); - } - - onEditorRemoveThresholds() { - this.panel.color.thresholds = []; - this.render(); - } - - - onEditorRemoveUrls = () => { - this.panel.urls = []; - this.render(); - } - - onEditorAddThreeLights() { - this.panel.color.thresholds.push({color: "red", value: 2, tooltip: "error" }); - this.panel.color.thresholds.push({color: "yellow", value: 1, tooltip: "warning" }); - this.panel.color.thresholds.push({color: "green", value: 0, tooltip: "ok" }); - this.render(); - } - - /* https://ethanschoonover.com/solarized/ */ - onEditorAddSolarized() { - this.panel.color.thresholds.push({color: "#b58900", value: 0, tooltip: "yellow" }); - this.panel.color.thresholds.push({color: "#cb4b16", value: 1, tooltip: "orange" }); - this.panel.color.thresholds.push({color: "#dc322f", value: 2, tooltip: "red" }); - this.panel.color.thresholds.push({color: "#d33682", value: 3, tooltip: "magenta" }); - this.panel.color.thresholds.push({color: "#6c71c4", value: 4, tooltip: "violet" }); - this.panel.color.thresholds.push({color: "#268bd2", value: 5, tooltip: "blue" }); - this.panel.color.thresholds.push({color: "#2aa198", value: 6, tooltip: "cyan" }); - this.panel.color.thresholds.push({color: "#859900", value: 7, tooltip: "green" }); - this.render(); - } - link(scope, elem, attrs, ctrl) { rendering(scope, elem, attrs, ctrl); } + // Compatible with Grafana 7.0 overrides feature. retrieveTimeVar() { var time = this.timeSrv.timeRangeForUrl(); - var var_time = '&from=' + time.from + '&to=' + time.to; - return var_time; + return 'from=' + time.from + '&to=' + time.to; } // convertToBuckets groups values in data into buckets by target and timestamp. @@ -737,133 +612,6 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { bucketMatrix.targets = targetKeys; return bucketMatrix; - this.bucketMatrix = bucketMatrix; - - // Collect all values for each bucket from datapoints with similar target. - // TODO aggregate values into buckets over datapoint[TIME_INDEX] not over datapoint index (j). - - - // for(let i = 0; i < cardsData.targets.length; i++) { - // let target = cardsData.targets[i]; - - // for (let j = 0; j < cardsData.xBucketSize; j++) { - // let card = new Card(); - // card.id = i*cardsData.xBucketSize + j; - // card.values = []; - // card.y = target; - // card.x = -1; - - // // collect values from all timeseries with target - // for (let si = 0; si < cardsData.targetIndex[target].length; si++) { - // let s = data[cardsData.targetIndex[target][si]]; - // if (s.datapoints.length <= j) { - // continue; - // } - // let datapoint = s.datapoints[j]; - // if (card.values.length === 0) { - // card.x = datapoint[TIME_INDEX]; - // } - // card.values.push(datapoint[VALUE_INDEX]); - // } - // card.minValue = _.min(card.values); - // card.maxValue = _.max(card.values); - // if (card.values.length > 1) { - // cardsData.multipleValues = true; - // card.multipleValues = true; - // card.value = card.maxValue; // max value by default - // } else { - // card.value = card.maxValue; // max value by default - // } - - // if (cardsData.maxValue < card.maxValue) - // cardsData.maxValue = card.maxValue; - - // if (cardsData.minValue > card.minValue) - // cardsData.minValue = card.minValue; - - // if (card.x != -1) { - // cardsData.cards.push(card); - // } - // } - // } - - - - - // let cardsData = { - // cards: [], - // xBucketSize: 0, - // yBucketSize: 0, - // maxValue: 0, - // minValue: 0, - // multipleValues: false, - // noColorDefined: false, - // targets: [], // array of available unique targets - // targetIndex: {} // indices in data array for each of available unique targets - // }; - - // if (!data || data.length == 0) { return cardsData;} - - // // Collect uniq timestamps from data and spread over targets and timestamps - - // // collect uniq targets and their indices - // _.map(data, (d, i) => { - // cardsData.targetIndex[d.target] = _.concat(_.toArray(cardsData.targetIndex[d.target]), i) - // }); - - // // TODO add some logic for targets heirarchy - // cardsData.targets = _.keys(cardsData.targetIndex); - // cardsData.yBucketSize = cardsData.targets.length; - // // Maximum number of buckets over x axis - // cardsData.xBucketSize = _.max(_.map(data, d => d.datapoints.length)); - - // // Collect all values for each bucket from datapoints with similar target. - // // TODO aggregate values into buckets over datapoint[TIME_INDEX] not over datapoint index (j). - // for(let i = 0; i < cardsData.targets.length; i++) { - // let target = cardsData.targets[i]; - - // for (let j = 0; j < cardsData.xBucketSize; j++) { - // let card = new Card(); - // card.id = i*cardsData.xBucketSize + j; - // card.values = []; - // card.y = target; - // card.x = -1; - - // // collect values from all timeseries with target - // for (let si = 0; si < cardsData.targetIndex[target].length; si++) { - // let s = data[cardsData.targetIndex[target][si]]; - // if (s.datapoints.length <= j) { - // continue; - // } - // let datapoint = s.datapoints[j]; - // if (card.values.length === 0) { - // card.x = datapoint[TIME_INDEX]; - // } - // card.values.push(datapoint[VALUE_INDEX]); - // } - // card.minValue = _.min(card.values); - // card.maxValue = _.max(card.values); - // if (card.values.length > 1) { - // cardsData.multipleValues = true; - // card.multipleValues = true; - // card.value = card.maxValue; // max value by default - // } else { - // card.value = card.maxValue; // max value by default - // } - - // if (cardsData.maxValue < card.maxValue) - // cardsData.maxValue = card.maxValue; - - // if (cardsData.minValue > card.minValue) - // cardsData.minValue = card.minValue; - - // if (card.x != -1) { - // cardsData.cards.push(card); - // } - // } - // } - - // return cardsData; } } diff --git a/src/options_editor.ts b/src/options_editor.ts index 66cdffb..f9731bb 100644 --- a/src/options_editor.ts +++ b/src/options_editor.ts @@ -1,26 +1,68 @@ import kbn from 'app/core/utils/kbn'; +import { StatusHeatmapCtrl } from './module'; export class StatusHeatmapOptionsEditorCtrl { panel: any; - panelCtrl: any; + panelCtrl: StatusHeatmapCtrl; unitFormats: any; - constructor($scope) { + /** @ngInject */ + constructor($scope: any) { $scope.editor = this; - this.panelCtrl = $scope.ctrl; + this.panelCtrl = $scope.ctrl as StatusHeatmapCtrl; this.panel = this.panelCtrl.panel; - this.unitFormats = kbn.getUnitFormats(); - this.panelCtrl.render(); + this.unitFormats = kbn.getUnitFormats(); } setUnitFormat(subItem) { this.panel.data.unitFormat = subItem.value; this.panelCtrl.render(); } + + render() { + this.panelCtrl.render(); + } + + onAddThreshold() { + this.panel.color.thresholds.push({ color: this.panel.defaultColor }); + this.render(); + } + + onRemoveThreshold(index:number) { + this.panel.color.thresholds.splice(index, 1); + this.render(); + } + + onRemoveThresholds() { + this.panel.color.thresholds = []; + this.render(); + } + + onAddThreeLights() { + this.panel.color.thresholds.push({color: "red", value: 2, tooltip: "error" }); + this.panel.color.thresholds.push({color: "yellow", value: 1, tooltip: "warning" }); + this.panel.color.thresholds.push({color: "green", value: 0, tooltip: "ok" }); + this.render(); + } + + /* https://ethanschoonover.com/solarized/ */ + onAddSolarized() { + this.panel.color.thresholds.push({color: "#b58900", value: 0, tooltip: "yellow" }); + this.panel.color.thresholds.push({color: "#cb4b16", value: 1, tooltip: "orange" }); + this.panel.color.thresholds.push({color: "#dc322f", value: 2, tooltip: "red" }); + this.panel.color.thresholds.push({color: "#d33682", value: 3, tooltip: "magenta" }); + this.panel.color.thresholds.push({color: "#6c71c4", value: 4, tooltip: "violet" }); + this.panel.color.thresholds.push({color: "#268bd2", value: 5, tooltip: "blue" }); + this.panel.color.thresholds.push({color: "#2aa198", value: 6, tooltip: "cyan" }); + this.panel.color.thresholds.push({color: "#859900", value: 7, tooltip: "green" }); + this.render(); + } + } -export function statusHeatmapOptionsEditor() { +/** @ngInject */ +export function optionsEditorCtrl() { 'use strict'; return { restrict: 'E', diff --git a/src/panel_config_migration.ts b/src/panel_config_migration.ts new file mode 100644 index 0000000..6535a72 --- /dev/null +++ b/src/panel_config_migration.ts @@ -0,0 +1,115 @@ +import _ from 'lodash'; + +function migrate_V0_V1(panel: any) { + // Remove unused fields. + if (_.has(panel, "xAxis.labelFormat")) { + delete panel.xAxis.labelFormat; + } + if (_.has(panel, "xAxis.minBucketWidthToShowWeekends")) { + delete panel.xAxis.minBucketWidthToShowWeekends; + } + if (_.has(panel, "xAxis.showCrosshair")) { + delete panel.xAxis.showCrosshair; + } + if (_.has(panel, "xAxis.showWeekends")) { + delete panel.xAxis.showWeekends; + } + if (_.has(panel, "yAxis.showCrosshair")) { + delete panel.yAxis.showCrosshair; + } + if (_.has(panel, "data.unitFormat")) { + delete panel.data; + } + + // Migrate cardSpacing value. Seems rare (update from version 0.0.2). + if (_.has(panel, "cards.cardSpacing")) { + if (!_.has(panel, "cards.cardVSpacing")) { + if (panel.cards.cardSpacing) { + panel.cards.cardVSpacing = panel.cards.cardSpacing + panel.cards.cardHSpacing = panel.cards.cardSpacing + } + } + delete panel.cards.cardSpacing; + } + + // Migrate initial config for urls in tooltip (pull/86). + // 'usingUrl' was used to show tooltip with urls on click or not. + if (_.has(panel, "usingUrl")) { + if (!_.has(panel, "tooltip.freezeOnClick")) { + panel.tooltip.freezeOnClick = panel.usingUrl; + } + delete panel.usingUrl; + } + + // 'urls' array is now tooltip.items array. Also items are changed. + if (_.has(panel, "urls")) { + if (!_.has(panel, "tooltip.items")) { + panel.tooltip.items = []; + let hasRealItems = true; + if (panel.urls.length == 0) { + hasRealItems = false; + } + if (panel.urls.length == 1) { + let url = panel.urls[0]; + if (url.base_url === '' && url.label === '') { + hasRealItems = false; + } + } + if (hasRealItems) { + panel.tooltip.showItems = true; + for (let url of panel.urls) { + let item = { + urlTemplate: _.toString(url.base_url), + urlText: _.toString(url.label), + urlIcon: _.toString(url.icon_fa), + urlToLowerCase: url.forcelowercase, + valueDateFormat: '', + } + // replace $vars with new ${__vars} if url template is not empty + if (item.urlTemplate !== "") { + // $time was a graph time with prepended & + item.urlTemplate = _.replace(url.base_url, /\$time/g, "&${__url_time_range}"); + // $series_label was a y axis label + item.urlTemplate = _.replace(item.urlTemplate, /\$series_label/, "${__y_label}"); + // $series_extra was a value from bucket. This value has format options and index. + let valueVar = "__value"; + if (url.useExtraSeries === true) { + // index? + if (url.extraSeries.index > -1) { + valueVar += "_" + url.extraSeries.index; + } + + let format = _.toString(url.extraSeries.format); + if (format === 'YYYY/MM/DD/HH_mm_ss') { + valueVar += '_date'; + item.valueDateFormat = format; + } + } + + item.urlTemplate = _.replace(item.urlTemplate, /\$series_extra/, `\${${valueVar}}`); + } + panel.tooltip.items.push(item); + } + } + } + delete panel.urls; + } + + // create statusmap metadata + panel.statusmap = { + "ConfigVersion": "v1", + } +} + + +export function migratePanelConfig(panel: any) { + if (_.has(panel, "statusmap")) { + if (panel.statusmap.ConfigVersion == "v1") { + return; + } + } else { + migrate_V0_V1(panel); + } + return; +} + diff --git a/src/partials/options_editor.html b/src/partials/options_editor.html index 54fe018..563e291 100644 --- a/src/partials/options_editor.html +++ b/src/partials/options_editor.html @@ -81,7 +81,7 @@
      @@ -91,12 +91,12 @@
      -
      -
      @@ -108,12 +108,12 @@
      -
      -
      @@ -144,10 +144,6 @@ label="Show legend" checked="ctrl.panel.legend.show" on-change="ctrl.render()"> - - @@ -159,17 +155,12 @@
      - +
      - +
      -
      - -
      -
      Buckets
      -
      @@ -180,6 +171,11 @@
      +
      + +
      +
      Buckets
      + @@ -187,6 +183,13 @@
      Color for bucket with multiple values is determined by color mode
      +
      + + +
      @@ -194,6 +197,7 @@
      +
      @@ -212,105 +216,4 @@
      -
      -
      Filtering
      -
      - - -
      -
      - -
      -
      URL
      - -
      - Insert the url to navigate
      -
      - -
      - -
      - -
      -
      -
      -
      -
      - -
      -
      - -
      -
      - -
      -
      - - - - - - - -

      Specify an URL (relative or absolute)

      - - Use special variables to specify cell values: -
      - $series_label name of the serie -
      - $(template.name) name of the templated to be replaced -
      - $time append &from...&to on the URL -
      - $series_extra use extraSeries value to use it on URL -
      -
      -
      -
      - - - - - - -
      - - - - -
      - -
      - -
      - - -
      -
      -
      -
      -
      - -
      diff --git a/src/partials/tooltip_editor.html b/src/partials/tooltip_editor.html new file mode 100644 index 0000000..350b136 --- /dev/null +++ b/src/partials/tooltip_editor.html @@ -0,0 +1,120 @@ +
      +
      + + + + + + +
      + +
      +
      Items
      + +
      + + +
      +
      +
      + +
      +
      +
      + + + +
      + +
      +
      + + + +
      +
      + + +
      + +
      + + +
      + +
      + + +
      +
      +
      + +
      +
      +
      + +
      +
      + +
      +
      +
      diff --git a/src/plugin.json b/src/plugin.json index ba97fe0..679c3f8 100644 --- a/src/plugin.json +++ b/src/plugin.json @@ -17,7 +17,6 @@ "links": [ {"name": "Github", "url": "https://github.com/flant/grafana-statusmap"}, {"name": "MIT Licence", "url": "https://github.com/flant/grafana-statusmap/blob/master/LICENSE"} - ], "screenshots": [ {"name": "Panel with light theme", "path": "img/flant-statusmap-panel.png"}, diff --git a/src/rendering.ts b/src/rendering.ts index 4eb7328..1b78b20 100644 --- a/src/rendering.ts +++ b/src/rendering.ts @@ -3,11 +3,9 @@ import $ from 'jquery'; import moment from 'moment'; import kbn from 'app/core/utils/kbn'; import {appEvents, contextSrv} from 'app/core/core'; -import {tickStep, getScaledDecimals, getFlotTickSize} from 'app/core/utils/ticks'; import * as d3 from 'd3'; import * as d3ScaleChromatic from './libs/d3-scale-chromatic/index'; import {StatusmapTooltip} from './tooltip'; -import {StatusHeatmapTooltipExtraSeries} from './tooltipextraseries'; import {AnnotationTooltip} from './annotations'; import { Bucket, BucketMatrix } from './statusmap_data'; import { StatusHeatmapCtrl } from './module'; @@ -65,7 +63,6 @@ export class StatusmapRenderer { panel: any; $heatmap: any; tooltip: StatusmapTooltip; - tooltipExtraSeries:StatusHeatmapTooltipExtraSeries; annotationTooltip: AnnotationTooltip; heatmap: any; timeRange: any; @@ -80,7 +77,6 @@ export class StatusmapRenderer { // $heatmap is JQuery object, but heatmap is D3 this.$heatmap = this.elem.find('.statusmap-panel'); this.tooltip = new StatusmapTooltip(this.$heatmap, this.scope); - this.tooltipExtraSeries = new StatusHeatmapTooltipExtraSeries(this.$heatmap, this.scope); this.annotationTooltip = new AnnotationTooltip(this.$heatmap, this.scope); this.yOffset = 0; @@ -312,8 +308,10 @@ export class StatusmapRenderer { this.heatmap.remove(); } + // Insert svg as a first child into heatmap_elem + // as the frozen tooltip moving logiс assumes that tooltip is the last child. this.heatmap = d3.select(heatmap_elem) - .append("svg") + .insert("svg",":first-child") .attr("width", this.width) .attr("height", this.height); @@ -428,9 +426,6 @@ export class StatusmapRenderer { getColorScale(maxValue, minValue = 0) { let colorScheme = _.find(this.ctrl.colorSchemes, {value: this.panel.color.colorScheme}); - // if (!colorScheme) { - // - // } let colorInterpolator = d3ScaleChromatic[colorScheme.value]; let colorScaleInverted = colorScheme.invert === 'always' || (colorScheme.invert === 'dark' && !contextSrv.user.lightTheme); @@ -537,26 +532,26 @@ export class StatusmapRenderer { return h; } - getCardColor(b: Bucket) { + getCardColor(bucket: Bucket) { if (this.panel.color.mode === 'opacity') { return this.panel.color.cardColor; } else if (this.panel.color.mode === 'spectrum') { - return this.colorScale(b.value); + return this.colorScale(bucket.value); } else if (this.panel.color.mode === 'discrete') { if (this.panel.seriesFilterIndex != null && this.panel.seriesFilterIndex != -1) { - return this.ctrl.discreteExtraSeries.getBucketColorSingle(d.values[this.panel.seriesFilterIndex]); + return this.ctrl.discreteExtraSeries.getBucketColorSingle(bucket.values[this.panel.seriesFilterIndex]); } else { - return this.ctrl.discreteExtraSeries.getBucketColor(b.values); + return this.ctrl.discreteExtraSeries.getBucketColor(bucket.values); } } } - getCardOpacity(b: Bucket) { - if (this.panel.nullPointMode === 'as empty' && b.value == null ) { + getCardOpacity(bucket: Bucket) { + if (this.panel.nullPointMode === 'as empty' && bucket.value == null ) { return 0; } if (this.panel.color.mode === 'opacity') { - return this.opacityScale(b.value); + return this.opacityScale(bucket.value); } else { return 1; } @@ -615,17 +610,10 @@ export class StatusmapRenderer { onMouseLeave(e) { appEvents.emit('graph-hover-clear'); this.clearCrosshair(); - //annotationTooltip.destroy(); - if (e.relatedTarget) { - if (e.relatedTarget.className == "statusmap-tooltip-extraseries graph-tooltip grafana-tooltip" || e.relatedTarget.className == "graph-tooltip-time" ) { - } else { - this.tooltipExtraSeries.destroy(); - } - } - this.annotationTooltip.destroy(); + this.annotationTooltip.destroy(); } - onMouseMove(event) { + onMouseMove(event: MouseEvent) { if (!this.heatmap) { return; } const offset = this.getEventOffset(event); @@ -646,9 +634,10 @@ export class StatusmapRenderer { } } - public onMouseClick(event) { - this.tooltipExtraSeries.show(event) - if (this.ctrl.panel.usingUrl) { + // TODO emit an event and move logic to panelCtrl + public onMouseClick(e: MouseEvent) { + if (this.ctrl.panel.tooltip.freezeOnClick) { + this.tooltip.showFrozen(e); this.tooltip.destroy(); } } diff --git a/src/specs/panel_config_migration.test.ts b/src/specs/panel_config_migration.test.ts new file mode 100644 index 0000000..a2d9159 --- /dev/null +++ b/src/specs/panel_config_migration.test.ts @@ -0,0 +1,168 @@ +import { migratePanelConfig } from '../panel_config_migration'; + +describe('when migrate from config with urls', () => { + let panel: any; + + describe('given full panel configuration', () => { + const panelConfig = { + "cards": { + "cardHSpacing": 2, + "cardMinWidth": 5, + "cardRound": null, + "cardVSpacing": 2 + }, + "color": { + "cardColor": "#b4ff00", + "colorScale": "sqrt", + "colorScheme": "interpolateGnYlRd", + "defaultColor": "#757575", + "exponent": 0.5, + "mode": "opacity", + "thresholds": [] + }, + "data": { + "decimals": null, + "unitFormat": "short" + }, + "datasource": "TestData DB", + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "highlightCards": true, + "id": 4, + "legend": { + "show": false + }, + "nullPointMode": "as empty", + "seriesFilterIndex": -1, + "targets": [ + { + "aggregation": "Last", + "csvWave": { + "timeStep": 60, + "valuesCSV": "0,0,2,2,1,1,3,3" + }, + "decimals": 2, + "displayAliasType": "Warning / Critical", + "displayType": "Regular", + "displayValueWithAlias": "Never", + "refId": "A", + "scenarioId": "predictable_csv_wave", + "stringInput": "", + "units": "none", + "valueHandler": "Number Threshold" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Panel Title", + "tooltip": { + "show": true + }, + "type": "flant-statusmap-panel", + "urls": [ + { + "base_url": "", + "extraSeries": { + "index": -1 + }, + "forcelowercase": true, + "icon_fa": "external-link", + "label": "", + "tooltip": "", + "useExtraSeries": false, + "useseriesname": true + } + ], + "useMax": true, + "usingUrl": true, + "xAxis": { + "labelFormat": "%a %m/%d", + "show": true + }, + "yAxis": { + "maxWidth": -1, + "minWidth": -1, + "show": true + }, + "yAxisSort": "metrics" + } + + beforeEach(() => { + panel = Object.assign({}, panelConfig); + migratePanelConfig(panel); + }); + + it('should migrate usingUrls to tooltip.freezeOnClick', () => { + expect(panel.usingUrl).toBeUndefined(); + expect(panel.tooltip).toHaveProperty("freezeOnClick", true); + expect(panel.tooltip.freezeOnClick).toBeTruthy(); + }); + + it('should have no urls', () => { + expect(panel.urls).toBeUndefined(); + }); + + it('should have empty items in tooltip', () => { + expect(panel.tooltip).toHaveProperty("items", []); + expect(panel.tooltip.items).toHaveLength(0); + }); + }); + + describe("given configuration with non-empty base_url", () => { + + describe("with variables", () => { + const panelConfig = { + "tooltip": { + "show": true + }, + "urls": [ + { + "base_url": "https://google.com/$series_label$time", + "extraSeries": { + "index": -1 + }, + "forcelowercase": true, + "icon_fa": "external-link", + "label": "google", + "tooltip": "", + "useExtraSeries": false, + "useseriesname": true, + }, + { + "base_url": "example.com/$series_extra", + "extraSeries": { + "format": "YYYY/MM/DD/HH_mm_ss", + "index": -1 + }, + "forcelowercase": true, + "icon_fa": "external-link", + "label": "DateLink", + "useExtraSeries": true, + } + ] + }; + beforeEach(() => { + panel = Object.assign({}, panelConfig); + migratePanelConfig(panel); + }); + + it("should have equal size of tooltip.items", () => { + expect(panel.tooltip).toHaveProperty("items"); + expect(panel.tooltip.items).toHaveLength(panelConfig.urls.length); + }); + it("should replace time variable with __url_time_range", () => { + expect(panel.tooltip.items[0].urlTemplate).toContain("${__url_time_range}"); + }); + it("should replace series_label variable with __y_label", () => { + expect(panel.tooltip.items[0].urlTemplate).toContain("${__y_label}"); + }); + it("should replace series_extra variable with __value_date", () => { + expect(panel.tooltip.items[1].urlTemplate).toContain("${__value_date}"); + }); + }); + }); +}); diff --git a/src/tooltip.ts b/src/tooltip.ts index 35051dd..ae91408 100644 --- a/src/tooltip.ts +++ b/src/tooltip.ts @@ -7,22 +7,29 @@ import { StatusHeatmapCtrl } from './module'; let TOOLTIP_PADDING_X = 30; let TOOLTIP_PADDING_Y = 5; +// TODO rename file to tooltip_ctrl.ts +// TODO move DefaultValueDateFormat into tooltip.ts, as it used in several places (migration, partial and tooltip render) +let DefaultValueDateFormat = 'YYYY/MM/DD/HH_mm_ss'; + export class StatusmapTooltip { tooltip: any; scope: any; dashboard: any; panelCtrl: StatusHeatmapCtrl; panel: any; - heatmapPanel: any; + panelElem: any; mouseOverBucket: any; originalFillColor: any; + tooltipWidth: number; + tooltipFrozen: any; + constructor(elem: any, scope: any) { this.scope = scope; this.dashboard = scope.ctrl.dashboard; this.panelCtrl = scope.ctrl; this.panel = scope.ctrl.panel; - this.heatmapPanel = elem; + this.panelElem = elem; this.mouseOverBucket = false; this.originalFillColor = null; @@ -35,7 +42,7 @@ export class StatusmapTooltip { if (!this.tooltip) { this.add(); - this.move(e); + this.move(e, this.tooltip); } } @@ -46,13 +53,13 @@ export class StatusmapTooltip { onMouseMove(e) { if (!this.panel.tooltip.show) { return; } - this.move(e); + this.move(e, this.tooltip); } add() { this.tooltip = d3.select("body") .append("div") - .attr("class", "statusmap-tooltip graph-tooltip grafana-tooltip"); + .attr("class", "graph-tooltip statusmap-tooltip"); } destroy() { @@ -63,13 +70,37 @@ export class StatusmapTooltip { this.tooltip = null; } - show(pos) { + removeFrozen() { + if (this.tooltipFrozen) { + this.tooltipFrozen.remove(); + this.tooltipFrozen = null + } + } + + showFrozen(pos: any) { + this.removeFrozen(); + this.tooltipFrozen = d3.select(this.panelElem[0]) + .append("div") + .attr("class", "graph-tooltip statusmap-tooltip statusmap-tooltip-frozen"); + this.displayTooltip(pos, this.tooltipFrozen, true); + this.moveRelative(pos, this.tooltipFrozen); + } + + show(pos: any) { if (!this.panel.tooltip.show || !this.tooltip) { return; } - + // TODO support for shared tooltip mode if (pos.panelRelY) { return; } + + this.displayTooltip(pos, this.tooltip, false); + + this.move(pos, this.tooltip); + } + + // Retrieve bucket and create html content inside tooltip’s div element. + displayTooltip(pos: any, tooltip: any, frozen: boolean) { let cardEl = d3.select(pos.target); let yid = cardEl.attr('yid'); let xid = cardEl.attr('xid'); @@ -80,36 +111,44 @@ export class StatusmapTooltip { } let timestamp = bucket.to; - let name = bucket.yLabel; + let yLabel = bucket.yLabel; let value = bucket.value; let values = bucket.values; - let tooltipTimeFormat = 'YYYY-MM-DD HH:mm:ss'; - let time = this.dashboard.formatDate(+timestamp, tooltipTimeFormat); + // TODO create option for this formatting. + let tooltipTimeFormat:string = 'YYYY-MM-DD HH:mm:ss'; + let time: Date = this.dashboard.formatDate(+timestamp, tooltipTimeFormat); - let tooltipHtml = `
      ${time}
      -
      `; + // Close button for the frozen tooltip. + let tooltipClose:string = ``; + if (frozen) { + tooltipClose = ` + + + +`; + } - let statuses; + let tooltipHtml:string = `
      ${time}${tooltipClose}
      `; if (this.panel.color.mode === 'discrete') { + let statuses; if (this.panel.seriesFilterIndex >= 0) { statuses = this.panelCtrl.discreteExtraSeries.convertValueToTooltips(value); } else { statuses = this.panelCtrl.discreteExtraSeries.convertValuesToTooltips(values); } - let statusesHtml = ''; - if (statuses.length === 1) { - statusesHtml = "status:"; - } else if (statuses.length > 1) { - statusesHtml = "statuses:"; + let statusTitle:string = "status:"; + if (statuses.length > 1) { + statusTitle = "statuses:"; } tooltipHtml += `
      - name: ${name}
      - ${statusesHtml} + name: ${yLabel} +
      + ${statusTitle}
        - ${_.join(_.map(statuses, v => `
      • ${v.tooltip}
      • `), "")} + ${_.join(_.map(statuses, v => `
      • ${v.tooltip}
      • `), "")}
      `; } else { @@ -120,7 +159,7 @@ export class StatusmapTooltip {
      `; } else { tooltipHtml += `
      - name: ${name}}
      + name: ${name}
      values:
        ${_.join(_.map(values, v => `
      • ${v}
      • `), "")} @@ -129,14 +168,73 @@ export class StatusmapTooltip { } } - // "Ambiguous bucket state: Multiple values!"; + tooltipHtml += `
        `; + + if (this.panel.tooltip.showItems) { + // Additional information: urls, etc. + // Clone additional items + let items: any = JSON.parse(JSON.stringify(this.panel.tooltip.items)); + + let scopedVars = {}; + + let valueVar; + for (let i = 0; i < bucket.values.length; i++) { + valueVar = `__value_${i}`; + scopedVars[valueVar] = {value: bucket.values[i] }; + } + scopedVars[`__value`] = {value: bucket.value}; + scopedVars[`__y_label`] = {value: yLabel}; + // Grafana 7.0 compatible + scopedVars[`__url_time_range`] = {value: this.panelCtrl.retrieveTimeVar()}; + + for (let item of items) { + if (_.isEmpty(item.urlTemplate)) { + item.link = "#"; + } else { + let dateFormat = item.valueDateFormat; + if (dateFormat == '') { + dateFormat = DefaultValueDateFormat; + } + let valueDateVar; + for (let i = 0; i < bucket.values.length; i++) { + valueDateVar = `__value_${i}_date`; + scopedVars[valueDateVar] = {value: this.dashboard.formatDate(+bucket.values[i], dateFormat)}; + } + scopedVars[`__value_date`] = {value: this.dashboard.formatDate(+bucket.value, dateFormat)}; + + item.link = this.panelCtrl.templateSrv.replace(item.urlTemplate, scopedVars) + + // Force lowercase for link + if (item.urlToLowerCase) { + item.link = item.link.toLowerCase(); + } + } + + item.label = item.urlText; + if (_.isEmpty(item.label)) { + item.label = _.isEmpty(item.urlTemplate) ? "Empty URL" : _.truncate(item.link); + } + } + + tooltipHtml += _.join(_.map(items, v => ` +
        + +
        +
        `), "\n"); + + } + + // Ambiguous state: there multiple values in bucket! + // TODO rename useMax to expectMultipleValues if (!this.panel.useMax && bucket.multipleValues) { tooltipHtml += `
        Error: ${this.panelCtrl.dataWarnings.multipleValues.title}
        `; } // Discrete mode errors if (this.panel.color.mode === 'discrete') { - if (bucket.noColorDefined) { let badValues = this.panelCtrl.discreteExtraSeries.getNotColoredValues(values); tooltipHtml += `
        Error: ${this.panelCtrl.dataWarnings.noColorDefined.title} @@ -145,20 +243,32 @@ export class StatusmapTooltip { ${_.join(_.map(badValues, v => `
      • ${v}
      • `), "")}
      `; - } } - this.tooltip.html(tooltipHtml); + tooltip.html(tooltipHtml); - this.move(pos); + // Assign mouse event handlers for "frozen" tooltip. + if (frozen) { + // Stop propagation mouse events up to parents to allow interaction with frozen tooltip’s elements. + tooltip + .on("click", function(){d3.event.stopPropagation(); }) + .on("mousedown", function(){d3.event.stopPropagation(); }) + .on("mouseup", function(){d3.event.stopPropagation(); }); + + // Activate close button + tooltip.select("a.tooltip-close") + .on("click", this.removeFrozen.bind(this)); + } } - move(pos) { - if (!this.tooltip) { return; } + // Move tooltip as absolute positioned element. + move(pos, tooltip) { + if (!tooltip) { return; } - let elem = $(this.tooltip.node())[0]; + let elem = $(tooltip.node())[0]; let tooltipWidth = elem.clientWidth; + this.tooltipWidth = tooltipWidth; let tooltipHeight = elem.clientHeight; let left = pos.pageX + TOOLTIP_PADDING_X; @@ -172,8 +282,43 @@ export class StatusmapTooltip { top = pos.pageY - tooltipHeight - TOOLTIP_PADDING_Y; } - return this.tooltip + return tooltip .style("left", left + "px") .style("top", top + "px"); } + + // Move tooltip relative to svg element of panel. + moveRelative(pos, tooltip) { + if (!tooltip) { return; } + + let panelX = pos.pageX - this.panelElem.offset().left; + let panelY = pos.pageY - this.panelElem.offset().top; + let panelWidth = this.panelElem.width(); + let panelHeight = this.panelElem.height(); + + // 'position: relative' sets tooltip’s width to 100% of panel element. + // Restore width from floating tooltip and add more space for 'Close' button. + let tooltipWidth = this.tooltipWidth + 25; + + // Left property is clamped so tooltip stays inside panel bound box. + let tooltipLeft = panelX + TOOLTIP_PADDING_X; + if (tooltipLeft + tooltipWidth > panelWidth) { + tooltipLeft = panelWidth - tooltipWidth; + } + if (tooltipLeft < 0 ) { + tooltipLeft = 0; + } + + // Frozen tooltip’s root element is appended next to panel’s svg element, + // so top property is adjusted to move tooltip’s root element + // up to the mouse pointer position. + let tooltipTop = -(panelHeight - panelY + TOOLTIP_PADDING_Y); + + return tooltip + .style("left", tooltipLeft + "px") + .style("top", tooltipTop + "px") + .style("width", tooltipWidth + "px"); + } + + } diff --git a/src/tooltip_editor.ts b/src/tooltip_editor.ts new file mode 100644 index 0000000..d50bd3e --- /dev/null +++ b/src/tooltip_editor.ts @@ -0,0 +1,61 @@ +import { StatusHeatmapCtrl } from './module'; + +let emptyTooltipItem = { + urlText: '', + urlTemplate: '', + urlIcon: 'external-link', + urlToLowerCase: true, + valueDateFormat: '' +}; + +export class TooltipEditorCtrl { + panel: any; + panelCtrl: StatusHeatmapCtrl; + + constructor($scope: any) { + $scope.editor = this; + this.panelCtrl = $scope.ctrl as StatusHeatmapCtrl; + this.panel = this.panelCtrl.panel; + } + + render() { + this.panelCtrl.render(); + } + + onAddUrl() { + this.panel.tooltip.items.push(Object.assign({}, emptyTooltipItem)); + this.render(); + } + + onRemoveUrl(index: number) { + this.panel.tooltip.items.splice(index, 1); + this.render(); + } + + onRemoveUrls() { + this.panel.tooltip.items = []; + this.render(); + } + + getFAIconClasses() { + return ['external-link', 'plus', 'anchor', 'ban', 'globe', 'gear', 'cloud', 'download', 'cloud-download']; + } + + getValueDateFormats() { + return [ + 'YYYY/MM/DD/HH_mm_ss', + 'YYYYMMDDHHmmss', + 'YYYY-MM-DD-HH-mm-ss' + ]; + } +} + +export function tooltipEditorCtrl() { + 'use strict'; + return { + restrict: 'E', + scope: true, + templateUrl: 'public/plugins/flant-statusmap-panel/partials/tooltip_editor.html', + controller: TooltipEditorCtrl, + }; +} diff --git a/src/tooltipextraseries.ts b/src/tooltipextraseries.ts deleted file mode 100644 index 3a92afb..0000000 --- a/src/tooltipextraseries.ts +++ /dev/null @@ -1,222 +0,0 @@ -import d3 from 'd3'; -import _ from 'lodash'; -import $ from 'jquery'; -import { ExtraSeriesFormatValue } from './extra_series_format'; - -const TOOLTIP_PADDING_X = -50; -const TOOLTIP_PADDING_Y = 5; - -export class StatusHeatmapTooltipExtraSeries { - scope: any; - dashboard: any; - panelCtrl: any; - panel: any; - heatmapPanel: any; - mouseOverBucket: any; - originalFillColor: any; - tooltip: any; - - constructor(elem: any, scope: any) { - this.scope = scope; - this.dashboard = scope.ctrl.dashboard; - this.panelCtrl = scope.ctrl; - this.panel = scope.ctrl.panel; - this.heatmapPanel = elem; - this.mouseOverBucket = false; - this.originalFillColor = null; - - elem.on("mouseover", this.onMouseOver.bind(this)); - elem.on("click", this.onMouseClick.bind(this)); - } - - public onMouseOver(e: Event) { - if (!this.panel.usingUrl || !this.scope.ctrl.data || _.isEmpty(this.scope.ctrl.data)) { - return; - } - } - - public onMouseClick(e: Event) { - if (!this.panel.usingUrl) { - return; - } - - this.destroy(); - this.add(); - } - - public add() { - this.tooltip = d3.select("body") - .append("div") - .attr("class", "statusmap-tooltip-extraseries graph-tooltip grafana-tooltip"); - } - - public destroy() { - if (this.tooltip) { - this.tooltip.remove(); - } - - this.tooltip = null; - } - - public show(pos: any) { - if (!this.panel.usingUrl || !this.tooltip) { - return; - } - - // shared tooltip mode - if (pos.panelRelY) { - return; - } - - let cardId: any = d3.select(pos.target).attr('cardId'); - - if (!cardId) { - this.destroy(); - - return; - } - - let card: any = this.panelCtrl.cardsData.cards[cardId]; - - if (!card) { - this.destroy(); - - return; - } - - if (card.value == null) { - this.destroy(); - - return; - } - - let x: any = card.x; - let y: any = card.y; - let value: any = card.value; - let values: any = card.values; - let tooltipTimeFormat: string = 'YYYY-MM-DD HH:mm:ss'; - let time: Date = this.dashboard.formatDate(+x, tooltipTimeFormat); - - let tooltipHtml: string = `
      ${time}
      ` - - if (this.panel.color.mode === 'discrete') { - let statuses: any = ""; - - if (this.panelCtrl.panel.seriesFilterIndex == -1) { - statuses = this.panelCtrl.discreteExtraSeries.convertValuesToTooltips(values); - } else { - statuses = this.panelCtrl.discreteExtraSeries.convertValueToTooltips(value); - } - - tooltipHtml += ` -
      - name: ${y} -
      -
      - status: -
        - ${_.join(_.map(statuses, v => `

        ${v.tooltip}

        `), "")} -
      -
      -

      `; - } - - tooltipHtml += `
      `; - - let urls: any = this.panelCtrl.panel.urls - let rtime: any = this.panelCtrl.retrieveTimeVar(); - - let curl: any = JSON.parse(JSON.stringify(urls)); - - for (let i = 0; i < curl.length; i++) { - //Change name var - curl[i].base_url = _.replace(curl[i].base_url, /\$series_label/g, y) - //Set up extra series - if (curl[i].useExtraSeries == true) { - let tf: any = curl[i].extraSeries.format - let vh: any = card.values[curl[i].extraSeries.index] - //let extraSeries: any = this.dashboard.formatDate(+vh, tf) - let series_extra: any = this.formatExtraSeries(vh,tf); - - curl[i].base_url = _.replace(curl[i].base_url, /\$series_extra/g, series_extra) - } - //Change time var - curl[i].base_url = _.replace(curl[i].base_url, /\$time/g, rtime) - - //Replace vars - curl[i].base_url = this.panelCtrl.renderLink(curl[i].base_url, this.panelCtrl.variableSrv.variables) - } - - if (this.panelCtrl.panel.usingUrl == true) { - tooltipHtml += ` -
      - ${_.join(_.map(curl, v => `
      -
      `), "")} -

      `; - } - - // "Ambiguous bucket state: Multiple values!"; - if (!this.panel.useMax && card.multipleValues) { - tooltipHtml += `
      Error: ${this.panelCtrl.dataWarnings.multipleValues.title}
      `; - } - - // Discrete mode errors - if (this.panel.color.mode === 'discrete') { - if (card.noColorDefined) { - let badValues: any = this.panelCtrl.discreteExtraSeries.getNotColoredValues(values); - tooltipHtml += `
      Error: ${this.panelCtrl.dataWarnings.noColorDefined.title} -
      not colored values: -
        - ${_.join(_.map(badValues, v => `
      • ${v}
      • `), "")} -
      -
      `; - } - } - - this.tooltip.html(tooltipHtml); - - this.move(pos); - } - - public formatExtraSeries (value: any, type: any) { - let extraSeries: any = ''; - - switch(type) { - case ExtraSeriesFormatValue.Date: - extraSeries = this.dashboard.formatDate(+value, type); - return extraSeries; - case ExtraSeriesFormatValue.Raw: - extraSeries = value; - return extraSeries; - default: - return extraSeries; - } - } - - public move(pos: any) { - if (!this.tooltip) { - return; - } - - let elem: any = $(this.tooltip.node())[0]; - let tooltipWidth = elem.clientWidth; - let tooltipHeight = elem.clientHeight; - - let left = pos.pageX + TOOLTIP_PADDING_X; - let top = pos.pageY + TOOLTIP_PADDING_Y; - - if (pos.pageX + tooltipWidth + 40 > window.innerWidth) { - left = pos.pageX - tooltipWidth - TOOLTIP_PADDING_X; - } - - if (pos.pageY - window.pageYOffset + tooltipHeight + 20 > window.innerHeight) { - top = pos.pageY - tooltipHeight - TOOLTIP_PADDING_Y; - } - - return this.tooltip - .style("left", left + "px") - .style("top", top + "px"); - } -} \ No newline at end of file