diff --git a/README.md b/README.md index f65e570..2f9f6a4 100644 --- a/README.md +++ b/README.md @@ -182,6 +182,34 @@ __Show tooltip__ toggles tooltip display on mouse over buckets. __Y axis sort__ can be used to sort labels on Y axis. Metrics — sort y labels as they are defined on Metrics tab. a→z and z→a sort labels descending or ascending in a [natural](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare) order. +#### Tooltip with external link +![Tooltip with external link](src/img/tooltip-url.png) + +A new tooltip that will appear when mouse click in a value showing one or more links to navigate. It can be configured in the options editor. Also it can be disabled to not appear. + +#### Tooltip editor +![Tooltip options](src/img/tooltip-editor.png) + +__Show Extra Series Tooltip when clicking elements__ toggles tooltip with links display on mouse click. + +__Add new URL__ creates a new form to add a new link + +__Remove all URLs__ removes all the urls created before + +__Label__ name to show in the link instead of the URL + +__URL__ URL to navigate + +__Icon__ icon to show next to the url + +__Force lowercase__ forces the url to be lowercase even if it is written in capital letters + +__Extra Series Completer__ toggles extra series to write the URL + +__Extra Series Index__ fields index to use its value on URL using $series_extra. Use -1 to disable it + +__Extra Series Date Format__ date format to transform extra herlper when its type is Date + ## Development To test and improve the plugin you can run Grafana instance in Docker using following command (in diff --git a/dist/README.md b/dist/README.md index f65e570..2f9f6a4 100644 --- a/dist/README.md +++ b/dist/README.md @@ -182,6 +182,34 @@ __Show tooltip__ toggles tooltip display on mouse over buckets. __Y axis sort__ can be used to sort labels on Y axis. Metrics — sort y labels as they are defined on Metrics tab. a→z and z→a sort labels descending or ascending in a [natural](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare) order. +#### Tooltip with external link +![Tooltip with external link](src/img/tooltip-url.png) + +A new tooltip that will appear when mouse click in a value showing one or more links to navigate. It can be configured in the options editor. Also it can be disabled to not appear. + +#### Tooltip editor +![Tooltip options](src/img/tooltip-editor.png) + +__Show Extra Series Tooltip when clicking elements__ toggles tooltip with links display on mouse click. + +__Add new URL__ creates a new form to add a new link + +__Remove all URLs__ removes all the urls created before + +__Label__ name to show in the link instead of the URL + +__URL__ URL to navigate + +__Icon__ icon to show next to the url + +__Force lowercase__ forces the url to be lowercase even if it is written in capital letters + +__Extra Series Completer__ toggles extra series to write the URL + +__Extra Series Index__ fields index to use its value on URL using $series_extra. Use -1 to disable it + +__Extra Series Date Format__ date format to transform extra herlper when its type is Date + ## Development To test and improve the plugin you can run Grafana instance in Docker using following command (in diff --git a/dist/color_legend.js b/dist/color_legend.js index a69fd66..35a4072 100644 --- a/dist/color_legend.js +++ b/dist/color_legend.js @@ -53,7 +53,7 @@ System.register(["lodash", "jquery", "d3", "./libs/d3-scale-chromatic/index", "a drawLegendValues(elem, opacityScale, rangeFrom, rangeTo, maxValue, minValue, legendWidth); } - function drawDiscreteColorLegend(elem, colorOptions, discreteHelper) { + function drawDiscreteColorLegend(elem, colorOptions, discreteExtraSeries) { var legendElem = $(elem).find('svg'); var legend = d3.select(legendElem.get(0)); clearLegend(elem); @@ -87,7 +87,7 @@ System.register(["lodash", "jquery", "d3", "./libs/d3-scale-chromatic/index", "a return d * itemWidth; }).attr("y", 0).attr("width", itemWidth + 1) // Overlap rectangles to prevent gaps .attr("height", legendHeight).attr("stroke-width", 0).attr("fill", function (d) { - return discreteHelper.getDiscreteColor(d); + return discreteExtraSeries.getDiscreteColor(d); }); drawDiscreteLegendValues(elem, colorOptions, legendWidth); } @@ -378,7 +378,7 @@ System.register(["lodash", "jquery", "d3", "./libs/d3-scale-chromatic/index", "a drawOpacityLegend(elem, colorOptions, rangeFrom, rangeTo, maxValue, minValue); } else if (panel.color.mode === 'discrete') { var _colorOptions = panel.color; - drawDiscreteColorLegend(elem, _colorOptions, ctrl.discreteHelper); + drawDiscreteColorLegend(elem, _colorOptions, ctrl.discreteExtraSeries); } } } diff --git a/dist/color_legend.js.map b/dist/color_legend.js.map index bbacfb5..1eade9b 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","discreteHelper","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","isEmpty","cardsData","cards"],"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';\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 (!_.isEmpty(ctrl.cardsData) && !_.isEmpty(ctrl.cardsData.cards)) {\n let rangeFrom = ctrl.cardsData.minValue;\n let rangeTo = ctrl.cardsData.maxValue;\n let maxValue = panel.color.max || rangeTo;\n let minValue = panel.color.min || rangeFrom;\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.discreteHelper);\n }\n }\n }\n }\n };\n});\n\nfunction drawColorLegend(elem, colorScheme, 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 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 * 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, discreteHelper) {\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('.status-heatmap-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 => discreteHelper.getDiscreteColor(d));\n\n drawDiscreteLegendValues(elem, colorOptions, legendWidth);\n}\n\n\nfunction drawLegendValues(elem, colorScale, rangeFrom, rangeTo, maxValue, minValue, legendWidth) {\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([0, rangeTo])\n .range([0, legendWidth]);\n\n let ticks = buildLegendTicks(0, 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;\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(tickStepSize * i);\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","isEmpty","cardsData","cards"],"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';\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 (!_.isEmpty(ctrl.cardsData) && !_.isEmpty(ctrl.cardsData.cards)) {\n let rangeFrom = ctrl.cardsData.minValue;\n let rangeTo = ctrl.cardsData.maxValue;\n let maxValue = panel.color.max || rangeTo;\n let minValue = panel.color.min || rangeFrom;\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, 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 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 * 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('.status-heatmap-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, rangeTo, maxValue, minValue, legendWidth) {\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([0, rangeTo])\n .range([0, legendWidth]);\n\n let ticks = buildLegendTicks(0, 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;\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(tickStepSize * i);\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/color_mode_discrete.js b/dist/color_mode_discrete.js index 74e964e..58d1dde 100644 --- a/dist/color_mode_discrete.js +++ b/dist/color_mode_discrete.js @@ -16,7 +16,7 @@ System.register([], function (_export, _context) { return { setters: [], execute: function () { - // Helper methods to handle discrete color mode + // Extra Series methods to handle discrete color mode _export("ColorModeDiscrete", ColorModeDiscrete = /*#__PURE__*/ function () { @@ -55,6 +55,24 @@ System.register([], function (_export, _context) { return tooltips; } }, { + key: "convertValueToTooltips", + value: function convertValueToTooltips(values) { + var thresholds = this.panel.color.thresholds; + var tooltips = []; + + for (var i = 0; i < thresholds.length; i++) { + //for (let j = 0; j < values.length; j++) { + if (values == thresholds[i].value) { + tooltips.push({ + "tooltip": thresholds[i].tooltip ? thresholds[i].tooltip : values, + "color": thresholds[i].color + }); //} + } + } + + return tooltips; + } + }, { key: "getNotMatchedValues", value: function getNotMatchedValues(values) { var notMatched = []; @@ -92,6 +110,23 @@ System.register([], function (_export, _context) { } return color; + } + }, { + key: "getBucketColorSingle", + value: function getBucketColorSingle(value) { + //let thresholds = this.panel.color.thresholds; + if (value == null) { + // treat as null value + return 'rgba(0,0,0,1)'; //return this.getMatchedThreshold(null).color; + } + + var threshold = this.getMatchedThreshold(value); + + if (!threshold || !threshold.color || threshold.color == "") { + return 'rgba(0,0,0,1)'; + } else { + return threshold.color; + } } // returns color from first matched thresold in order from 0 to thresholds.length }, { @@ -136,6 +171,27 @@ System.register([], function (_export, _context) { return 'rgba(0,0,0,1)'; } + }, { + key: "updateCardsValuesHasColorInfoSingle", + value: function updateCardsValuesHasColorInfoSingle() { + if (!this.panelCtrl.cardsData) { + return; + } + + this.panelCtrl.cardsData.noColorDefined = false; + var cards = this.panelCtrl.cardsData.cards; + + for (var i = 0; i < cards.length; i++) { + cards[i].noColorDefined = false; + var values = cards[i].value; + var threshold = this.getMatchedThreshold(values); + + if (!threshold || !threshold.color || threshold.color == "") { + cards[i].noColorDefined = true; + this.panelCtrl.cardsData.noColorDefined = true; + } + } + } }, { key: "updateCardsValuesHasColorInfo", value: function updateCardsValuesHasColorInfo() { diff --git a/dist/color_mode_discrete.js.map b/dist/color_mode_discrete.js.map index dd8e025..30a558d 100644 --- a/dist/color_mode_discrete.js.map +++ b/dist/color_mode_discrete.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/color_mode_discrete.ts"],"names":["ColorModeDiscrete","scope","panelCtrl","ctrl","panel","values","thresholds","color","tooltips","i","length","j","value","push","tooltip","notMatched","getMatchedThreshold","threshold","index","getThreshold","isAllValuesNulls","getDiscreteColor","cardsData","noColorDefined","cards","nullPointMode","k","interval"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport {StatusHeatmapCtrl} from \"./status_heatmap_ctrl\";\n\ninterface Tooltip {\n tooltip: string;\n color: string;\n}\n\ndeclare class DiscreteColorThreshold {\n color: string;\n value: number;\n tooltip: string;\n}\n\n// Helper methods to handle discrete color mode\nexport class ColorModeDiscrete {\n scope: any;\n panelCtrl: StatusHeatmapCtrl;\n panel: any;\n\n constructor(scope) {\n this.scope = scope;\n this.panelCtrl = scope.ctrl;\n this.panel = scope.ctrl.panel;\n }\n\n // get tooltip for each value ordered by thresholds priority\n convertValuesToTooltips(values:any[]) : Tooltip[] {\n let thresholds = this.panel.color.thresholds;\n let tooltips:Tooltip[] = [];\n\n for (let i = 0; i < thresholds.length; i++) {\n for (let j = 0; j < values.length; j++) {\n if (values[j] == thresholds[i].value) {\n tooltips.push({\n \"tooltip\": thresholds[i].tooltip?thresholds[i].tooltip:values[j],\n \"color\": thresholds[i].color\n });\n }\n }\n }\n return tooltips;\n }\n\n getNotMatchedValues(values:any[]) {\n let notMatched:any[] = [];\n for (let j = 0; j < values.length; j++) {\n if (!this.getMatchedThreshold(values[j])) {\n notMatched.push(values[j]);\n }\n }\n return notMatched;\n }\n\n getNotColoredValues(values:any[]) {\n let notMatched:any[] = [];\n for (let j = 0; j < values.length; j++) {\n let threshold = this.getMatchedThreshold(values[j]);\n if (!threshold || !threshold.color || threshold.color == \"\") {\n notMatched.push(values[j]);\n }\n }\n return notMatched;\n }\n\n getDiscreteColor(index) {\n let color = this.getThreshold(index).color;\n if (!color || color == \"\") {\n return 'rgba(0,0,0,1)';\n }\n return color;\n }\n\n // returns color from first matched thresold in order from 0 to thresholds.length\n getBucketColor(values) {\n let thresholds = this.panel.color.thresholds;\n\n if (!values || values.length == 0) {\n // treat as null value\n return this.getMatchedThreshold(null).color;\n }\n\n if (values.length == 1) {\n let threshold = this.getMatchedThreshold(values[0]);\n if (!threshold || !threshold.color || threshold.color == \"\") {\n return 'rgba(0,0,0,1)';\n } else {\n return threshold.color;\n }\n }\n\n let isAllValuesNulls = true;\n for (let j = 0; j < values.length; j++) {\n if (values[j] != null) {\n isAllValuesNulls = false;\n }\n }\n if (isAllValuesNulls) {\n return this.getMatchedThreshold(null).color;\n }\n\n for (let i = 0; i < thresholds.length; i++) {\n for (let j = 0; j < values.length; j++) {\n if (values[j] == thresholds[i].value) {\n return this.getDiscreteColor(i);\n }\n }\n }\n return 'rgba(0,0,0,1)';\n }\n\n updateCardsValuesHasColorInfo() {\n if (!this.panelCtrl.cardsData) {\n return\n }\n this.panelCtrl.cardsData.noColorDefined = false;\n let cards = this.panelCtrl.cardsData.cards;\n for (let i=0; i= thresholds.length == null) {\n return {\n \"color\": \"rgba(0,0,0,0)\",\n \"value\": \"null\",\n \"tooltip\": \"null\",\n }\n }\n return thresholds[index];\n }\n\n roundIntervalCeil(interval) {\n switch (true) {\n case interval <= 10:\n return 10; // 0.01s\n case interval <= 20:\n return 20; // 0.02s\n case interval <= 50:\n return 50; // 0.05s\n case interval <= 100:\n return 100; // 0.1s\n case interval <= 200:\n return 200; // 0.2s\n case interval <= 500:\n return 500; // 0.5s\n case interval <= 1000:\n return 1000; // 1s\n case interval <= 2000:\n return 2000; // 2s\n case interval <= 5000:\n return 5000; // 5s\n case interval <= 10000:\n return 10000; // 10s\n case interval <= 15000:\n return 15000; // 15s\n case interval <= 20000:\n return 20000; // 20s\n case interval <= 30000:\n return 30000; // 30s\n case interval <= 60000:\n return 60000; // 1m\n case interval <= 120000:\n return 120000; // 2m\n case interval <= 300000:\n return 300000; // 5m\n case interval <= 600000:\n return 600000; // 10m\n case interval <= 900000:\n return 900000; // 15m\n case interval <= 1200000:\n return 1200000; // 20m\n case interval <= 1800000:\n return 1800000; // 30m\n case interval <= 3600000:\n return 3600000; // 1h\n case interval <= 7200000:\n return 7200000; // 2h\n case interval <= 10800000:\n return 10800000; // 3h\n case interval <= 21600000:\n return 21600000; // 6h\n case interval <= 43200000:\n return 43200000; // 12h\n case interval <= 86400000:\n return 86400000; // 1d\n case interval <= 604800000:\n return 604800000; // 1w\n case interval <= 2592000000:\n return 2592000000; // 30d\n default:\n return 31536000000; // 1y\n }\n }\n}\n"],"file":"color_mode_discrete.js"} \ No newline at end of file +{"version":3,"sources":["../src/color_mode_discrete.ts"],"names":["ColorModeDiscrete","scope","panelCtrl","ctrl","panel","values","thresholds","color","tooltips","i","length","j","value","push","tooltip","notMatched","getMatchedThreshold","threshold","index","getThreshold","isAllValuesNulls","getDiscreteColor","cardsData","noColorDefined","cards","nullPointMode","k","interval"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport {StatusHeatmapCtrl} from \"./status_heatmap_ctrl\";\n\ninterface Tooltip {\n tooltip: string;\n color: string;\n}\n\ndeclare class DiscreteColorThreshold {\n color: string;\n value: number;\n tooltip: string;\n}\n\n// Extra Series methods to handle discrete color mode\nexport class ColorModeDiscrete {\n scope: any;\n panelCtrl: StatusHeatmapCtrl;\n panel: any;\n\n constructor(scope) {\n this.scope = scope;\n this.panelCtrl = scope.ctrl;\n this.panel = scope.ctrl.panel;\n }\n\n // get tooltip for each value ordered by thresholds priority\n convertValuesToTooltips(values:any[]) : Tooltip[] {\n let thresholds = this.panel.color.thresholds;\n let tooltips:Tooltip[] = [];\n\n for (let i = 0; i < thresholds.length; i++) {\n for (let j = 0; j < values.length; j++) {\n if (values[j] == thresholds[i].value) {\n tooltips.push({\n \"tooltip\": thresholds[i].tooltip?thresholds[i].tooltip:values[j],\n \"color\": thresholds[i].color\n });\n }\n }\n }\n return tooltips;\n }\n\n convertValueToTooltips(values) {\n let thresholds = this.panel.color.thresholds;\n let tooltips = [];\n\n for (let i = 0; i < thresholds.length; i++) {\n //for (let j = 0; j < values.length; j++) {\n if (values == thresholds[i].value) {\n tooltips.push({\n \"tooltip\": thresholds[i].tooltip?thresholds[i].tooltip:values,\n \"color\": thresholds[i].color\n });\n //}\n }\n }\n return tooltips;\n }\n\n getNotMatchedValues(values:any[]) {\n let notMatched:any[] = [];\n for (let j = 0; j < values.length; j++) {\n if (!this.getMatchedThreshold(values[j])) {\n notMatched.push(values[j]);\n }\n }\n return notMatched;\n }\n\n getNotColoredValues(values:any[]) {\n let notMatched:any[] = [];\n for (let j = 0; j < values.length; j++) {\n let threshold = this.getMatchedThreshold(values[j]);\n if (!threshold || !threshold.color || threshold.color == \"\") {\n notMatched.push(values[j]);\n }\n }\n return notMatched;\n }\n\n getDiscreteColor(index) {\n let color = this.getThreshold(index).color;\n if (!color || color == \"\") {\n return 'rgba(0,0,0,1)';\n }\n return color;\n }\n\n getBucketColorSingle(value) {\n //let thresholds = this.panel.color.thresholds;\n if (value == null) {\n // treat as null value\n return 'rgba(0,0,0,1)';\n //return this.getMatchedThreshold(null).color;\n }\n let threshold = this.getMatchedThreshold(value);\n\n if (!threshold || !threshold.color || threshold.color == \"\") {\n return 'rgba(0,0,0,1)';\n } else {\n return threshold.color;\n }\n }\n\n // returns color from first matched thresold in order from 0 to thresholds.length\n getBucketColor(values) {\n let thresholds = this.panel.color.thresholds;\n\n if (!values || values.length == 0) {\n // treat as null value\n return this.getMatchedThreshold(null).color;\n }\n\n if (values.length == 1) {\n let threshold = this.getMatchedThreshold(values[0]);\n if (!threshold || !threshold.color || threshold.color == \"\") {\n return 'rgba(0,0,0,1)';\n } else {\n return threshold.color;\n }\n }\n\n let isAllValuesNulls = true;\n for (let j = 0; j < values.length; j++) {\n if (values[j] != null) {\n isAllValuesNulls = false;\n }\n }\n if (isAllValuesNulls) {\n return this.getMatchedThreshold(null).color;\n }\n\n for (let i = 0; i < thresholds.length; i++) {\n for (let j = 0; j < values.length; j++) {\n if (values[j] == thresholds[i].value) {\n return this.getDiscreteColor(i);\n }\n }\n }\n return 'rgba(0,0,0,1)';\n }\n\n\n updateCardsValuesHasColorInfoSingle() {\n if (!this.panelCtrl.cardsData) {\n return;\n }\n this.panelCtrl.cardsData.noColorDefined = false;\n var cards = this.panelCtrl.cardsData.cards;\n for (var i = 0; i < cards.length; i++) {\n cards[i].noColorDefined = false;\n var values = cards[i].value;\n var threshold = this.getMatchedThreshold(values);\n if (!threshold || !threshold.color || threshold.color == \"\") {\n cards[i].noColorDefined = true;\n this.panelCtrl.cardsData.noColorDefined = true;\n }\n }\n }\n\n updateCardsValuesHasColorInfo() {\n if (!this.panelCtrl.cardsData) {\n return\n }\n this.panelCtrl.cardsData.noColorDefined = false;\n let cards = this.panelCtrl.cardsData.cards;\n for (let i=0; i= thresholds.length == null) {\n return {\n \"color\": \"rgba(0,0,0,0)\",\n \"value\": \"null\",\n \"tooltip\": \"null\",\n }\n }\n return thresholds[index];\n }\n\n roundIntervalCeil(interval) {\n switch (true) {\n case interval <= 10:\n return 10; // 0.01s\n case interval <= 20:\n return 20; // 0.02s\n case interval <= 50:\n return 50; // 0.05s\n case interval <= 100:\n return 100; // 0.1s\n case interval <= 200:\n return 200; // 0.2s\n case interval <= 500:\n return 500; // 0.5s\n case interval <= 1000:\n return 1000; // 1s\n case interval <= 2000:\n return 2000; // 2s\n case interval <= 5000:\n return 5000; // 5s\n case interval <= 10000:\n return 10000; // 10s\n case interval <= 15000:\n return 15000; // 15s\n case interval <= 20000:\n return 20000; // 20s\n case interval <= 30000:\n return 30000; // 30s\n case interval <= 60000:\n return 60000; // 1m\n case interval <= 120000:\n return 120000; // 2m\n case interval <= 300000:\n return 300000; // 5m\n case interval <= 600000:\n return 600000; // 10m\n case interval <= 900000:\n return 900000; // 15m\n case interval <= 1200000:\n return 1200000; // 20m\n case interval <= 1800000:\n return 1800000; // 30m\n case interval <= 3600000:\n return 3600000; // 1h\n case interval <= 7200000:\n return 7200000; // 2h\n case interval <= 10800000:\n return 10800000; // 3h\n case interval <= 21600000:\n return 21600000; // 6h\n case interval <= 43200000:\n return 43200000; // 12h\n case interval <= 86400000:\n return 86400000; // 1d\n case interval <= 604800000:\n return 604800000; // 1w\n case interval <= 2592000000:\n return 2592000000; // 30d\n default:\n return 31536000000; // 1y\n }\n }\n}\n"],"file":"color_mode_discrete.js"} \ No newline at end of file diff --git a/dist/css/statusmap.dark.css b/dist/css/statusmap.dark.css index d1ba4a5..81f1068 100644 --- a/dist/css/statusmap.dark.css +++ b/dist/css/statusmap.dark.css @@ -27,10 +27,22 @@ background-color: #141414; color: #d8d9da; } .statusmap-tooltip .discrete-item { - color: #52545c; + color: #ffffff; padding: 1px; font-weight: bold; - text-shadow: 0 0 0.2em #FFF, 0 0 0.2em #FFF, 0 0 0.2em #FFF; } + 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-histogram rect { fill: #8e8e8e; } @@ -44,6 +56,18 @@ fill: rgba(102, 102, 102, 0.4); stroke: rgba(102, 102, 102, 0.8); } +.width-c-40 { + width: 40rem !important; } + +.width-c-50 { + width: 50rem !important; } + +.width-c-60 { + width: 60rem !important; } + +.width-c-70 { + width: 70rem !important; } + .status-heatmap-legend-wrapper { margin: 0 10px; } .status-heatmap-legend-wrapper svg { diff --git a/dist/css/statusmap.dark.css.map b/dist/css/statusmap.dark.css.map index 4bbef2c..0091a78 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,qBAAsB;EACpB,QAAQ,EAAE,QAAQ;EAGhB,sCAAK;IACH,IAAI,ECpBG,OAAO;IDqBd,KAAK,ECrBE,OAAO;IDsBd,SAAS,EEtBE,IAAI;EFyBjB,sCAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,EC1BM,OAAO;ED+BvB,yBAAI;IACF,cAAc,EAAE,IAAI;IAEpB,8BAAK;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,8CAA8C;;AAI/D,yBAA0B;EACxB,IAAI,ECvDY,OAAO;;AD2DvB,8BAAK;EACH,MAAM,EAAE,OAAgB;EACxB,YAAY,EAAE,CAAC;;AAInB,yBAA0B;EACxB,YAAY,EAAE,CAAC;EACf,IAAI,EAAE,wBAAwB;EAC9B,MAAM,EAAE,wBAAwB;;AAIlC,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,EC7FG,OAAO;ID8Fd,KAAK,EC9FE,OAAO;ID+Fd,SAAS,EE/FE,IAAI;EFkGjB,+CAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,ECnGM,OAAO;EDsGrB,kDAAQ;IACN,OAAO,EAAE,GAAG;IACZ,MAAM,ECxGM,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,qBAAsB;EACpB,QAAQ,EAAE,QAAQ;EAGhB,sCAAK;IACH,IAAI,ECpBG,OAAO;IDqBd,KAAK,ECrBE,OAAO;IDsBd,SAAS,EEtBE,IAAI;EFyBjB,sCAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,EC1BM,OAAO;ED+BvB,yBAAI;IACF,cAAc,EAAE,IAAI;IAEpB,8BAAK;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", "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 349f40f..085ec7a 100644 --- a/dist/css/statusmap.light.css +++ b/dist/css/statusmap.light.css @@ -27,10 +27,22 @@ background-color: #dde4ed; color: #52545c; } .statusmap-tooltip .discrete-item { - color: #52545c; + color: #ffffff; padding: 1px; font-weight: bold; - text-shadow: 0 0 0.2em #FFF, 0 0 0.2em #FFF, 0 0 0.2em #FFF; } + 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-histogram rect { fill: #767980; } @@ -44,6 +56,18 @@ fill: rgba(102, 102, 102, 0.4); stroke: rgba(102, 102, 102, 0.8); } +.width-c-40 { + width: 40rem !important; } + +.width-c-50 { + width: 50rem !important; } + +.width-c-60 { + width: 60rem !important; } + +.width-c-70 { + width: 70rem !important; } + .status-heatmap-legend-wrapper { margin: 0 10px; } .status-heatmap-legend-wrapper svg { diff --git a/dist/css/statusmap.light.css.map b/dist/css/statusmap.light.css.map index 36f5f19..c322387 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,qBAAsB;EACpB,QAAQ,EAAE,QAAQ;EAGhB,sCAAK;IACH,IAAI,ECpBG,OAAO;IDqBd,KAAK,ECrBE,OAAO;IDsBd,SAAS,EEtBE,IAAI;EFyBjB,sCAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,EC1BM,OAAO;ED+BvB,yBAAI;IACF,cAAc,EAAE,IAAI;IAEpB,8BAAK;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,8CAA8C;;AAI/D,yBAA0B;EACxB,IAAI,ECvDY,OAAO;;AD2DvB,8BAAK;EACH,MAAM,EAAE,OAAgB;EACxB,YAAY,EAAE,CAAC;;AAInB,yBAA0B;EACxB,YAAY,EAAE,CAAC;EACf,IAAI,EAAE,wBAAwB;EAC9B,MAAM,EAAE,wBAAwB;;AAIlC,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,EC7FG,OAAO;ID8Fd,KAAK,EC9FE,OAAO;ID+Fd,SAAS,EE/FE,IAAI;EFkGjB,+CAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,ECnGM,OAAO;EDsGrB,kDAAQ;IACN,OAAO,EAAE,GAAG;IACZ,MAAM,ECxGM,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,qBAAsB;EACpB,QAAQ,EAAE,QAAQ;EAGhB,sCAAK;IACH,IAAI,ECpBG,OAAO;IDqBd,KAAK,ECrBE,OAAO;IDsBd,SAAS,EEtBE,IAAI;EFyBjB,sCAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,EC1BM,OAAO;ED+BvB,yBAAI;IACF,cAAc,EAAE,IAAI;IAEpB,8BAAK;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", "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 new file mode 100644 index 0000000..6680ce7 --- /dev/null +++ b/dist/extra_series_format.js @@ -0,0 +1,28 @@ +"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 new file mode 100644 index 0000000..15a0176 --- /dev/null +++ b/dist/extra_series_format.js.map @@ -0,0 +1 @@ +{"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/img/tooltip-editor.png b/dist/img/tooltip-editor.png new file mode 100644 index 0000000..97a26d8 Binary files /dev/null and b/dist/img/tooltip-editor.png differ diff --git a/dist/img/tooltip-url.png b/dist/img/tooltip-url.png new file mode 100644 index 0000000..cb65c49 Binary files /dev/null and b/dist/img/tooltip-url.png differ diff --git a/dist/module.js b/dist/module.js index 5c2ff3c..a6ad457 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"], function (_export, _context) { +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) { "use strict"; - var _, kbn, loadPluginCss, MetricsPanelCtrl, Card, rendering, statusHeatmapOptionsEditor, ColorModeDiscrete, CANVAS, SVG, VALUE_INDEX, TIME_INDEX, renderer, colorSchemes, colorModes, opacityScales, StatusHeatmapCtrl; + var _, kbn, loadPluginCss, MetricsPanelCtrl, Card, rendering, statusHeatmapOptionsEditor, ColorModeDiscrete, ExtraSeriesFormat, ExtraSeriesFormatValue, CANVAS, SVG, VALUE_INDEX, TIME_INDEX, renderer, 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); } @@ -45,6 +45,9 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ 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 () { CANVAS = 'CANVAS'; @@ -150,12 +153,12 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ _export("PanelCtrl", _export("StatusHeatmapCtrl", StatusHeatmapCtrl = /*#__PURE__*/ function (_MetricsPanelCtrl) { - StatusHeatmapCtrl.$inject = ["$scope", "$injector", "annotationsSrv"]; + StatusHeatmapCtrl.$inject = ["$scope", "$injector", "timeSrv", "annotationsSrv", "$window", "datasourceSrv", "variableSrv", "templateSrv"]; _inherits(StatusHeatmapCtrl, _MetricsPanelCtrl); /** @ngInject */ - function StatusHeatmapCtrl($scope, $injector, annotationsSrv) { + function StatusHeatmapCtrl($scope, $injector, timeSrv, annotationsSrv, $window, datasourceSrv, variableSrv, templateSrv) { var _this; _classCallCheck(this, StatusHeatmapCtrl); @@ -181,10 +184,12 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ _defineProperty(_assertThisInitialized(_this), "noColorDefined", void 0); - _defineProperty(_assertThisInitialized(_this), "discreteHelper", void 0); + _defineProperty(_assertThisInitialized(_this), "discreteExtraSeries", void 0); _defineProperty(_assertThisInitialized(_this), "dataWarnings", void 0); + _defineProperty(_assertThisInitialized(_this), "extraSeriesFormats", []); + _defineProperty(_assertThisInitialized(_this), "annotations", []); _defineProperty(_assertThisInitialized(_this), "annotationsPromise", void 0); @@ -236,21 +241,82 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ nullPointMode: 'as empty', yAxisSort: 'metrics', highlightCards: true, - useMax: 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 + }); + + _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(); }); _.defaultsDeep(_this.panel, _this.panelDefaults); _this.opacityScales = opacityScales; _this.colorModes = colorModes; - _this.colorSchemes = colorSchemes; // default graph width for discrete card width calculation + _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.graph = { "chartWidth": -1 }; _this.multipleValues = false; _this.noColorDefined = false; - _this.discreteHelper = new ColorModeDiscrete($scope); + _this.discreteExtraSeries = new ColorModeDiscrete($scope); _this.dataWarnings = { "noColorDefined": { title: 'Data has value with undefined color', @@ -262,6 +328,8 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ } }; _this.annotations = []; + _this.annotationsSrv = annotationsSrv; + _this.timeSrv = timeSrv; _this.events.on('render', _this.onRender.bind(_assertThisInitialized(_this))); @@ -278,6 +346,8 @@ 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))); + return _this; } @@ -287,6 +357,23 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ 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; + } + } }, { key: "getChartWidth", value: function getChartWidth() { @@ -310,7 +397,7 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ var intervalMs; var rangeMs = this.range.to.valueOf() - this.range.from.valueOf(); // this is minimal interval! kbn.round_interval will lower it. - intervalMs = this.discreteHelper.roundIntervalCeil(rangeMs / maxCardsCount); // Calculate low limit of interval + intervalMs = this.discreteExtraSeries.roundIntervalCeil(rangeMs / maxCardsCount); // Calculate low limit of interval var lowLimitMs = 1; // 1 millisecond default low limit @@ -385,7 +472,6 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ this.data = dataList; this.cardsData = this.convertToCards(this.data); - console.log("OnDataReceived"); this.annotationsPromise.then(function (result) { _this3.loading = false; //this.alertState = result.alertState; @@ -395,13 +481,10 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ _this3.annotations = []; } - console.log("annotationsPromise result " + _this3.annotations.length + " annotations"); - _this3.render(); }, function () { _this3.loading = false; _this3.annotations = []; - console.log("annotationsPromise onrejected"); _this3.render(); }); //this.render(); @@ -430,7 +513,11 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ this.noColorDefined = false; if (this.panel.color.mode === 'discrete') { - this.discreteHelper.updateCardsValuesHasColorInfo(); + if (this.panel.seriesFilterIndex == -1) { + this.discreteExtraSeries.updateCardsValuesHasColorInfo(); + } else { + this.discreteExtraSeries.updateCardsValuesHasColorInfoSingle(); + } if (this.cardsData) { this.noColorDefined = this.cardsData.noColorDefined; @@ -546,6 +633,13 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ key: "link", value: function link(scope, elem, attrs, ctrl) { rendering(scope, elem, attrs, ctrl); + } + }, { + key: "retrieveTimeVar", + value: function retrieveTimeVar() { + var time = this.timeSrv.timeRangeForUrl(); + var var_time = '&from=' + time.from + '&to=' + time.to; + return var_time; } // group values into buckets by target }, { @@ -591,6 +685,9 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ var card = new Card(); card.id = i * cardsData.xBucketSize + j; card.values = []; + card.columns = []; + card.multipleValues = false; + card.noColorDefined = false; card.y = target; card.x = -1; // collect values from all timeseries with target @@ -616,7 +713,7 @@ System.register(["lodash", "./color_legend", "app/core/utils/kbn", "app/plugins/ if (card.values.length > 1) { cardsData.multipleValues = true; card.multipleValues = true; - card.value = card.maxValue; // max value by default + card.value = this.panel.seriesFilterIndex != -1 ? card.values[this.panel.seriesFilterIndex] : card.maxValue; } else { card.value = card.maxValue; // max value by default } diff --git a/dist/module.js.map b/dist/module.js.map index ff228c4..7322a64 100644 --- a/dist/module.js.map +++ b/dist/module.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/module.ts"],"names":["_","kbn","loadPluginCss","MetricsPanelCtrl","Card","rendering","statusHeatmapOptionsEditor","ColorModeDiscrete","CANVAS","SVG","VALUE_INDEX","TIME_INDEX","renderer","colorSchemes","name","value","invert","colorModes","opacityScales","dark","light","StatusHeatmapCtrl","$scope","$injector","annotationsSrv","datasource","color","mode","cardColor","colorScale","exponent","colorScheme","defaultColor","thresholds","cards","cardMinWidth","cardVSpacing","cardHSpacing","cardRound","xAxis","show","showWeekends","minBucketWidthToShowWeekends","showCrosshair","labelFormat","yAxis","tooltip","legend","data","unitFormat","decimals","nullPointMode","yAxisSort","highlightCards","useMax","defaultsDeep","panel","panelDefaults","graph","multipleValues","noColorDefined","discreteHelper","dataWarnings","title","tip","annotations","events","on","onRender","bind","onDataReceived","onDataError","onInitEditMode","postRefresh","onRenderComplete","chartWidth","renderingCompleted","wndWidth","$","window","width","panelWidthFactor","gridPos","w","panelWidth","Math","ceil","max","getChartWidth","minCardWidth","minSpacing","maxCardsCount","intervalMs","rangeMs","range","to","valueOf","from","roundIntervalCeil","lowLimitMs","intervalOverride","interval","templateSrv","replace","scopedVars","slice","interval_to_ms","secondsToHms","annotationsPromise","getAnnotations","dashboard","datasourcePromises","then","r","issueQueriesWithInterval","origInterval","res","dataList","cardsData","convertToCards","console","log","result","loading","length","render","addEditorTab","unitFormats","getUnitFormats","updateCardsValuesHasColorInfo","newColor","push","index","splice","scope","elem","attrs","ctrl","xBucketSize","yBucketSize","maxValue","minValue","targets","targetIndex","map","d","i","target","concat","toArray","keys","datapoints","j","card","id","values","y","x","si","s","datapoint","min"],"mappings":"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","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 {CardsStorage, Card} 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\";\n\nconst CANVAS = 'CANVAS';\nconst SVG = 'SVG';\nconst VALUE_INDEX = 0,\n TIME_INDEX = 1;\n\nconst renderer = CANVAS;\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\ninterface DataWarning {\n title: string;\n tip: string;\n}\n\ninterface DataWarnings {\n noColorDefined: DataWarning;\n multipleValues: DataWarning;\n}\n\ninterface ColorThreshold {\n\n}\n\n\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 opacityScales: any = [];\n colorModes: any = [];\n colorSchemes: any = [];\n unitFormats: any;\n data: any;\n cardsData: any;\n graph: any;\n multipleValues: boolean;\n noColorDefined: boolean;\n discreteHelper: ColorModeDiscrete;\n dataWarnings: DataWarnings;\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 showWeekends: true,\n minBucketWidthToShowWeekends: 4,\n showCrosshair: true,\n labelFormat: '%a %m/%d'\n },\n yAxis: {\n show: true,\n showCrosshair: false\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 };\n\n /** @ngInject */\n constructor($scope: any, $injector: auto.IInjectorService, private annotationsSrv: AnnotationsSrv) {\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\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.discreteHelper = 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 };\n\n this.annotations = [];\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\n onRenderComplete(data):void {\n this.graph.chartWidth = data.chartWidth;\n this.renderingCompleted();\n }\n\n getChartWidth():number {\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 chartWidth because y axis ticks not rendered yet on first data receive.\n const chartWidth = _.max([\n panelWidth - 200,\n panelWidth/2\n ]);\n\n return chartWidth!;\n }\n\n // override calculateInterval for discrete color mode\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.discreteHelper.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\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 = this.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 this.cardsData = this.convertToCards(this.data);\n\n console.log(\"OnDataReceived\");\n\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 console.log(\"annotationsPromise result \" + this.annotations.length + \" annotations\");\n this.render();\n },\n () => {\n this.loading = false;\n this.annotations = [];\n console.log(\"annotationsPromise onrejected\");\n this.render();\n }\n );\n\n //this.render();\n }\n\n onInitEditMode() {\n this.addEditorTab('Options', statusHeatmapOptionsEditor, 2);\n this.unitFormats = kbn.getUnitFormats();\n }\n\n onRender() {\n if (!this.range || !this.data) { return; }\n\n this.multipleValues = false;\n if (!this.panel.useMax) {\n if (this.cardsData) {\n this.multipleValues = this.cardsData.multipleValues;\n }\n }\n\n this.noColorDefined = false;\n if (this.panel.color.mode === 'discrete') {\n this.discreteHelper.updateCardsValuesHasColorInfo();\n if (this.cardsData) {\n this.noColorDefined = this.cardsData.noColorDefined;\n }\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 onEditorAddThreshold() {\n this.panel.color.thresholds.push({ color: this.panel.defaultColor });\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 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 // group values into buckets by target\n convertToCards(data) {\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":["_","kbn","loadPluginCss","MetricsPanelCtrl","Card","rendering","statusHeatmapOptionsEditor","ColorModeDiscrete","ExtraSeriesFormat","ExtraSeriesFormatValue","CANVAS","SVG","VALUE_INDEX","TIME_INDEX","renderer","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","showWeekends","minBucketWidthToShowWeekends","showCrosshair","labelFormat","yAxis","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","annotations","events","on","onRender","bind","onDataReceived","onDataError","onInitEditMode","postRefresh","onRenderComplete","onChangeType","chartWidth","renderingCompleted","url","type","Date","Raw","wndWidth","$","window","width","panelWidthFactor","gridPos","w","panelWidth","Math","ceil","max","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","cardsData","convertToCards","result","loading","length","addEditorTab","unitFormats","getUnitFormats","updateCardsValuesHasColorInfo","updateCardsValuesHasColorInfoSingle","newColor","scope","elem","attrs","ctrl","time","timeRangeForUrl","var_time","xBucketSize","yBucketSize","maxValue","minValue","targets","targetIndex","map","d","i","target","concat","toArray","keys","datapoints","j","card","id","values","columns","y","x","si","s","datapoint","min"],"mappings":"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","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 {CardsStorage, Card} 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 CANVAS = 'CANVAS';\nconst SVG = 'SVG';\nconst VALUE_INDEX = 0,\n TIME_INDEX = 1;\n\nconst renderer = CANVAS;\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\ninterface DataWarning {\n title: string;\n tip: string;\n}\n\ninterface DataWarnings {\n noColorDefined: DataWarning;\n multipleValues: DataWarning;\n}\n\ninterface ColorThreshold {\n\n}\n\n\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 opacityScales: any = [];\n colorModes: any = [];\n colorSchemes: any = [];\n unitFormats: any;\n data: any;\n cardsData: any;\n graph: any;\n multipleValues: boolean;\n noColorDefined: boolean;\n discreteExtraSeries: ColorModeDiscrete;\n dataWarnings: DataWarnings;\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 showWeekends: true,\n minBucketWidthToShowWeekends: 4,\n showCrosshair: true,\n labelFormat: '%a %m/%d'\n },\n yAxis: {\n show: true,\n showCrosshair: false\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 };\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\n onRenderComplete(data):void {\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():number {\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 chartWidth because y axis ticks not rendered yet on first data receive.\n const chartWidth = _.max([\n panelWidth - 200,\n panelWidth/2\n ]);\n\n return chartWidth!;\n }\n\n // override calculateInterval for discrete color mode\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\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 = this.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 this.cardsData = this.convertToCards(this.data);\n\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\n //this.render();\n }\n\n onInitEditMode() {\n this.addEditorTab('Options', statusHeatmapOptionsEditor, 2);\n this.unitFormats = kbn.getUnitFormats();\n }\n\n onRender() {\n if (!this.range || !this.data) { return; }\n\n this.multipleValues = false;\n if (!this.panel.useMax) {\n if (this.cardsData) {\n this.multipleValues = this.cardsData.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.cardsData) {\n this.noColorDefined = this.cardsData.noColorDefined;\n }\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 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 // group values into buckets by target\n convertToCards(data) {\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.columns = [];\n card.multipleValues = false;\n card.noColorDefined = false;\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 = this.panel.seriesFilterIndex != -1 ? card.values[this.panel.seriesFilterIndex] : card.maxValue;\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 diff --git a/dist/partials/options_editor.html b/dist/partials/options_editor.html index 45563e6..ee06808 100644 --- a/dist/partials/options_editor.html +++ b/dist/partials/options_editor.html @@ -194,9 +194,105 @@ -
+
+
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/rendering.js b/dist/rendering.js index 90c3922..1517755 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", "./annotations"], function (_export, _context) { +System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/core", "d3", "./libs/d3-scale-chromatic/index", "./tooltip", "./tooltipextraseries", "./annotations"], function (_export, _context) { "use strict"; - 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, StatusmapRenderer; + 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, StatusmapRenderer; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -66,6 +66,8 @@ 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; }], @@ -141,6 +143,8 @@ 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); @@ -160,6 +164,7 @@ 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('.status-heatmap-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 = { @@ -191,6 +196,7 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c this.$heatmap.on('mousedown', this.onMouseDown.bind(this)); this.$heatmap.on('mousemove', this.onMouseMove.bind(this)); this.$heatmap.on('mouseleave', this.onMouseLeave.bind(this)); + this.$heatmap.on('click', this.onMouseClick.bind(this)); } _createClass(StatusmapRenderer, [{ @@ -588,7 +594,11 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c } else if (this.panel.color.mode === 'spectrum') { return this.colorScale(d.value); } else if (this.panel.color.mode === 'discrete') { - return this.ctrl.discreteHelper.getBucketColor(d.values); + if (this.panel.seriesFilterIndex != -1 || this.panel.seriesFilterIndex != null) { + return this.ctrl.discreteExtraSeries.getBucketColorSingle(d.values[this.panel.seriesFilterIndex]); + } else { + return this.ctrl.discreteExtraSeries.getBucketColor(d.values); + } } } }, { @@ -663,9 +673,17 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c } }, { key: "onMouseLeave", - value: function 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.annotationTooltip.destroy(); } }, { key: "onMouseMove", @@ -692,6 +710,15 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c this.annotationTooltip.show(event); } } + }, { + key: "onMouseClick", + value: function onMouseClick(event) { + this.tooltipExtraSeries.show(event); + + if (this.ctrl.panel.usingUrl) { + this.tooltip.destroy(); + } + } }, { key: "getEventPos", value: function getEventPos(event, offset) { @@ -832,7 +859,7 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c "id": i, "anno": d.source }; - }); //console.log({"ctrl_annotations": this.ctrl.annotations, "annoData": annoData}); + }); //({"ctrl_annotations": this.ctrl.annotations, "annoData": annoData}); var anno = this.heatmap.append("g").attr("class", "statusmap-annotations").attr("transform", "translate(0.5,0)").selectAll(".statusmap-annotations").data(annoData).enter().append("g"); diff --git a/dist/rendering.js.map b/dist/rendering.js.map index d7109f7..391d144 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","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","$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","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","from","to","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","uniq","data","d","target","isEmpty","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","cardsData","yBucketSize","cardHeight","addYAxis","xBucketSize","cardWidth","addXAxis","xAxisHeight","getXAxisHeight","style","addHeatmapCanvas","maxValue","color","minValue","mode","colorScale","getColorScale","setOpacityScale","enter","c","id","getCardX","getCardWidth","getCardY","getCardHeight","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","cx","w","cutted_width","y","ys","h","cardColor","discreteHelper","getBucketColor","values","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","valueOf","pageX","pageY","y1","panelRelY","offsetY","posX1","posX2","selectionX","selectionWidth","position","graphTooltip","setElementHeight","addHeatmap","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 {AnnotationTooltip} from './annotations';\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\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 data: any;\n cardsData: any;\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: any) {\n // $heatmap is JQuery object, but heatmap is D3\n this.$heatmap = this.elem.find('.status-heatmap-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\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 }\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() {\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) {\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) {\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\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) {\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) {\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 = _.uniq(_.map(this.data, d => d.target));\n\n // Set default Y min and max if no data\n if (_.isEmpty(this.data)) {\n ticks = [''];\n }\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, max, tickInterval) {\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 addHeatmapCanvas() {\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 = Math.floor(this.chartHeight / this.cardsData.yBucketSize);\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.cardsData.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 addHeatmap() {\n this.addHeatmapCanvas();\n\n let maxValue = this.panel.color.max || this.cardsData.maxValue;\n let minValue = this.panel.color.min || this.cardsData.minValue;\n\n if (this.panel.color.mode !== 'discrete') {\n this.colorScale = this.getColorScale(maxValue, minValue);\n }\n this.setOpacityScale(maxValue);\n\n let cards = this.heatmap.selectAll(\".status-heatmap-card\").data(this.cardsData.cards);\n cards.append(\"title\");\n cards = cards.enter().append(\"rect\")\n .attr(\"cardId\", c => c.id)\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\", \"bordered status-heatmap-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 let $cards = this.$heatmap.find(\".status-heatmap-card\");\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(d) {\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\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(d) {\n let w;\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 getCardY(d) {\n return this.yScale(d.y) + this.chartTop - this.cardHeight - this.cardVSpacing/2;\n }\n\n getCardHeight(d) {\n let ys = this.yScale(d.y);\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(d) {\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(d.value);\n } else if (this.panel.color.mode === 'discrete') {\n return this.ctrl.discreteHelper.getBucketColor(d.values);\n }\n }\n\n getCardOpacity(d) {\n if (this.panel.nullPointMode === 'as empty' && d.value == null ) {\n return 0;\n }\n if (this.panel.color.mode === 'opacity') {\n return this.opacityScale(d.value);\n } else {\n return 1;\n }\n }\n\n getCardStrokeWidth(d) {\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() {\n appEvents.emit('graph-hover-clear');\n this.clearCrosshair();\n //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); //, data); // pos, this.data\n this.annotationTooltip.show(event);\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.data = this.ctrl.data;\n this.panel = this.ctrl.panel;\n this.timeRange = this.ctrl.range;\n this.cardsData = this.ctrl.cardsData;\n\n if (!this.data || !this.cardsData || !this.setElementHeight()) {\n return;\n }\n\n // Draw default axes and return if no data\n if (_.isEmpty(this.cardsData.cards)) {\n this.addHeatmapCanvas();\n return;\n }\n\n this.addHeatmap();\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 //console.log({\"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","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","$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","from","to","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","uniq","data","d","target","isEmpty","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","cardsData","yBucketSize","cardHeight","addYAxis","xBucketSize","cardWidth","addXAxis","xAxisHeight","getXAxisHeight","style","addHeatmapCanvas","maxValue","color","minValue","mode","colorScale","getColorScale","setOpacityScale","enter","c","id","getCardX","getCardWidth","getCardY","getCardHeight","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","cx","w","cutted_width","y","ys","h","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","relatedTarget","className","destroy","limitSelection","offsetX","drawSelection","emitGraphHoverEvent","drawCrosshair","usingUrl","valueOf","pageX","pageY","y1","panelRelY","offsetY","posX1","posX2","selectionX","selectionWidth","position","graphTooltip","setElementHeight","addHeatmap","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';\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\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 data: any;\n cardsData: any;\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: any) {\n // $heatmap is JQuery object, but heatmap is D3\n this.$heatmap = this.elem.find('.status-heatmap-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\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() {\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) {\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) {\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\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) {\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) {\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 = _.uniq(_.map(this.data, d => d.target));\n\n // Set default Y min and max if no data\n if (_.isEmpty(this.data)) {\n ticks = [''];\n }\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, max, tickInterval) {\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 addHeatmapCanvas() {\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 = Math.floor(this.chartHeight / this.cardsData.yBucketSize);\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.cardsData.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 addHeatmap() {\n this.addHeatmapCanvas();\n\n let maxValue = this.panel.color.max || this.cardsData.maxValue;\n let minValue = this.panel.color.min || this.cardsData.minValue;\n\n if (this.panel.color.mode !== 'discrete') {\n this.colorScale = this.getColorScale(maxValue, minValue);\n }\n this.setOpacityScale(maxValue);\n\n let cards = this.heatmap.selectAll(\".status-heatmap-card\").data(this.cardsData.cards);\n cards.append(\"title\");\n cards = cards.enter().append(\"rect\")\n .attr(\"cardId\", c => c.id)\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\", \"bordered status-heatmap-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 let $cards = this.$heatmap.find(\".status-heatmap-card\");\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(d) {\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\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(d) {\n let w;\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 getCardY(d) {\n return this.yScale(d.y) + this.chartTop - this.cardHeight - this.cardVSpacing/2;\n }\n\n getCardHeight(d) {\n let ys = this.yScale(d.y);\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(d) {\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(d.value);\n } else if (this.panel.color.mode === 'discrete') {\n if (this.panel.seriesFilterIndex != -1 || this.panel.seriesFilterIndex != null) {\n return this.ctrl.discreteExtraSeries.getBucketColorSingle(d.values[this.panel.seriesFilterIndex]);\n } else {\n return this.ctrl.discreteExtraSeries.getBucketColor(d.values);\n }\n }\n }\n\n getCardOpacity(d) {\n if (this.panel.nullPointMode === 'as empty' && d.value == null ) {\n return 0;\n }\n if (this.panel.color.mode === 'opacity') {\n return this.opacityScale(d.value);\n } else {\n return 1;\n }\n }\n\n getCardStrokeWidth(d) {\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); //, data); // pos, this.data\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.data = this.ctrl.data;\n this.panel = this.ctrl.panel;\n this.timeRange = this.ctrl.range;\n this.cardsData = this.ctrl.cardsData;\n\n if (!this.data || !this.cardsData || !this.setElementHeight()) {\n return;\n }\n\n // Draw default axes and return if no data\n if (_.isEmpty(this.cardsData.cards)) {\n this.addHeatmapCanvas();\n return;\n }\n\n this.addHeatmap();\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/statusmap_data.js b/dist/statusmap_data.js index 09bf159..7c773b3 100644 --- a/dist/statusmap_data.js +++ b/dist/statusmap_data.js @@ -27,6 +27,8 @@ System.register([], function (_export, _context) { _defineProperty(this, "values", []); + _defineProperty(this, "columns", []); + _defineProperty(this, "multipleValues", false); _defineProperty(this, "noColorDefined", false); diff --git a/dist/statusmap_data.js.map b/dist/statusmap_data.js.map index 59b0615..2b386de 100644 --- a/dist/statusmap_data.js.map +++ b/dist/statusmap_data.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/statusmap_data.ts"],"names":["Card","CardsStorage","maxValue","minValue"],"mappings":";;;;;;;;;;;;;;AAEA;sBACMA,I,GACF;AAEA;AAEA;AAEA;AAEA;AAEA;AAEA;AAKA,sBAAc;AAAA;;AAAA,oCAhBD,CAgBC;;AAAA,wCAdE,EAcF;;AAAA,gDAZY,KAYZ;;AAAA,gDAVY,KAUZ;;AAAA,mCARF,EAQE;;AAAA,mCANF,CAME;;AAAA,0CAJK,CAIL;;AAAA,0CAHK,CAGL;;AAAA,uCAFE,CAEF;AAEb,O;;8BAGCC,Y,GAWF,wBAAc;AAAA;;AAAA,uCAVE,EAUF;;AAAA,6CATQ,CASR;;AAAA,6CARQ,CAQR;;AAAA;;AAAA;;AAAA,gDALY,KAKZ;;AAAA,gDAJY,KAIZ;;AAAA,yCAHM,EAGN;;AAAA;;AACV,aAAKC,QAAL,GAAgB,CAAhB;AACA,aAAKC,QAAL,GAAgB,CAAhB;AAEH,O","sourcesContent":["\n\n// A holder of values\nclass Card {\n // uniq\n id: number = 0;\n // Array of values in this bucket\n values: any[] = [];\n // card has multiple values\n multipleValues: boolean = false;\n // card has values that has no color\n noColorDefined: boolean = false;\n //\n y: string = \"\";\n //\n x: number = 0;\n //\n minValue: number = 0;\n maxValue: number = 0;\n value: number = 0;\n \n constructor() {\n\n }\n }\n \nclass CardsStorage {\n cards: Card[] = [];\n xBucketSize: number = 0;\n yBucketSize: number = 0;\n maxValue: number;\n minValue: number;\n multipleValues: boolean = false;\n noColorDefined: boolean = false;\n targets: string[] = [];\n targetIndex: any;\n\n constructor() {\n this.maxValue = 0;\n this.minValue = 0;\n\n }\n }\n\nexport {CardsStorage, Card};"],"file":"statusmap_data.js"} \ No newline at end of file +{"version":3,"sources":["../src/statusmap_data.ts"],"names":["Card","CardsStorage","maxValue","minValue"],"mappings":";;;;;;;;;;;;;;AAEA;sBACMA,I,GACF;AAEA;AAGA;AAEA;AAEA;AAEA;AAEA;AAKA,sBAAc;AAAA;;AAAA,oCAjBD,CAiBC;;AAAA,wCAfE,EAeF;;AAAA,yCAdG,EAcH;;AAAA,gDAZY,KAYZ;;AAAA,gDAVY,KAUZ;;AAAA,mCARF,EAQE;;AAAA,mCANF,CAME;;AAAA,0CAJK,CAIL;;AAAA,0CAHK,CAGL;;AAAA,uCAFE,CAEF;AAEb,O;;8BAGCC,Y,GAWF,wBAAc;AAAA;;AAAA,uCAVE,EAUF;;AAAA,6CATQ,CASR;;AAAA,6CARQ,CAQR;;AAAA;;AAAA;;AAAA,gDALY,KAKZ;;AAAA,gDAJY,KAIZ;;AAAA,yCAHM,EAGN;;AAAA;;AACV,aAAKC,QAAL,GAAgB,CAAhB;AACA,aAAKC,QAAL,GAAgB,CAAhB;AAEH,O","sourcesContent":["\n\n// A holder of values\nclass Card {\n // uniq\n id: number = 0;\n // Array of values in this bucket\n values: any[] = [];\n columns: any[] = [];\n // card has multiple values\n multipleValues: boolean = false;\n // card has values that has no color\n noColorDefined: boolean = false;\n //\n y: string = \"\";\n //\n x: number = 0;\n //\n minValue: number = 0;\n maxValue: number = 0;\n value: number = 0;\n \n constructor() {\n\n }\n }\n \nclass CardsStorage {\n cards: Card[] = [];\n xBucketSize: number = 0;\n yBucketSize: number = 0;\n maxValue: number;\n minValue: number;\n multipleValues: boolean = false;\n noColorDefined: boolean = false;\n targets: string[] = [];\n targetIndex: any;\n\n constructor() {\n this.maxValue = 0;\n this.minValue = 0;\n\n }\n }\n\nexport {CardsStorage, Card};"],"file":"statusmap_data.js"} \ No newline at end of file diff --git a/dist/tooltip.js b/dist/tooltip.js index 735bdbc..2fa1662 100644 --- a/dist/tooltip.js +++ b/dist/tooltip.js @@ -131,9 +131,15 @@ System.register(["d3", "jquery", "lodash"], function (_export, _context) { var tooltipTimeFormat = 'YYYY-MM-DD HH:mm:ss'; var time = this.dashboard.formatDate(+x, tooltipTimeFormat); var tooltipHtml = "
".concat(time, "
\n
"); + var statuses; if (this.panel.color.mode === 'discrete') { - var statuses = this.panelCtrl.discreteHelper.convertValuesToTooltips(values); + if (this.panel.seriesFilterIndex > 0) { + statuses = this.panelCtrl.discreteExtraSeries.convertValueToTooltips(value); + } else { + statuses = this.panelCtrl.discreteExtraSeries.convertValuesToTooltips(values); + } + var statusesHtml = ''; if (statuses.length === 1) { @@ -163,7 +169,7 @@ System.register(["d3", "jquery", "lodash"], function (_export, _context) { if (this.panel.color.mode === 'discrete') { if (card.noColorDefined) { - var badValues = this.panelCtrl.discreteHelper.getNotColoredValues(values); + 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
"); diff --git a/dist/tooltip.js.map b/dist/tooltip.js.map index 840f890..d606c5f 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","cardId","target","card","cardsData","cards","x","y","value","values","tooltipTimeFormat","time","formatDate","tooltipHtml","color","mode","statuses","discreteHelper","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":"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","sourcesContent":["import d3 from 'd3';\nimport $ from 'jquery';\nimport _ from 'lodash';\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: any;\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 // shared tooltip mode\n if (pos.panelRelY) {\n return;\n }\n let cardId = d3.select(pos.target).attr('cardId');\n if (!cardId) {\n this.destroy();\n return;\n }\n\n let card = this.panelCtrl.cardsData.cards[cardId];\n if (!card) {\n this.destroy();\n return;\n }\n\n let x = card.x;\n let y = card.y;\n let value = card.value;\n let values = card.values;\n let tooltipTimeFormat = 'YYYY-MM-DD HH:mm:ss';\n let time = this.dashboard.formatDate(+x, tooltipTimeFormat);\n\n let tooltipHtml = `
${time}
\n
`;\n\n if (this.panel.color.mode === 'discrete') {\n let statuses = this.panelCtrl.discreteHelper.convertValuesToTooltips(values);\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: ${y}
\n ${statusesHtml}\n
    \n ${_.join(_.map(statuses, v => `
  • ${v.tooltip}
  • `), \"\")}\n
\n
`;\n } else {\n if (values.length === 1) {\n tooltipHtml += `
\n name: ${y}
\n value: ${value}
\n
`;\n } else {\n tooltipHtml += `
\n name: ${y}
\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 && 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 = this.panelCtrl.discreteHelper.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","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","cardId","target","card","cardsData","cards","x","y","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":"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","sourcesContent":["import d3 from 'd3';\nimport $ from 'jquery';\nimport _ from 'lodash';\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: any;\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 // shared tooltip mode\n if (pos.panelRelY) {\n return;\n }\n let cardId = d3.select(pos.target).attr('cardId');\n if (!cardId) {\n this.destroy();\n return;\n }\n\n let card = this.panelCtrl.cardsData.cards[cardId];\n if (!card) {\n this.destroy();\n return;\n }\n\n let x = card.x;\n let y = card.y;\n let value = card.value;\n let values = card.values;\n let tooltipTimeFormat = 'YYYY-MM-DD HH:mm:ss';\n let time = this.dashboard.formatDate(+x, 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: ${y}
\n ${statusesHtml}\n
    \n ${_.join(_.map(statuses, v => `
  • ${v.tooltip}
  • `), \"\")}\n
\n
`;\n } else {\n if (values.length === 1) {\n tooltipHtml += `
\n name: ${y}
\n value: ${value}
\n
`;\n } else {\n tooltipHtml += `
\n name: ${y}
\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 && 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 = 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 diff --git a/dist/tooltipextraseries.js b/dist/tooltipextraseries.js new file mode 100644 index 0000000..97760e6 --- /dev/null +++ b/dist/tooltipextraseries.js @@ -0,0 +1,242 @@ +"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 new file mode 100644 index 0000000..a5546c9 --- /dev/null +++ b/dist/tooltipextraseries.js.map @@ -0,0 +1 @@ +{"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":"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","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/src/color_legend.ts b/src/color_legend.ts index 8e2ce93..a53556b 100644 --- a/src/color_legend.ts +++ b/src/color_legend.ts @@ -77,7 +77,7 @@ coreModule.directive('statusHeatmapLegend', function() { drawOpacityLegend(elem, colorOptions, rangeFrom, rangeTo, maxValue, minValue); } else if (panel.color.mode === 'discrete') { let colorOptions = panel.color; - drawDiscreteColorLegend(elem, colorOptions, ctrl.discreteHelper); + drawDiscreteColorLegend(elem, colorOptions, ctrl.discreteExtraSeries); } } } @@ -148,7 +148,7 @@ function drawOpacityLegend(elem, options, rangeFrom, rangeTo, maxValue, minValue drawLegendValues(elem, opacityScale, rangeFrom, rangeTo, maxValue, minValue, legendWidth); } -function drawDiscreteColorLegend(elem, colorOptions, discreteHelper) { +function drawDiscreteColorLegend(elem, colorOptions, discreteExtraSeries) { let legendElem = $(elem).find('svg'); let legend = d3.select(legendElem.get(0)); clearLegend(elem); @@ -196,7 +196,7 @@ function drawDiscreteColorLegend(elem, colorOptions, discreteHelper) { .attr("width", itemWidth + 1) // Overlap rectangles to prevent gaps .attr("height", legendHeight) .attr("stroke-width", 0) - .attr("fill", d => discreteHelper.getDiscreteColor(d)); + .attr("fill", d => discreteExtraSeries.getDiscreteColor(d)); drawDiscreteLegendValues(elem, colorOptions, legendWidth); } diff --git a/src/color_mode_discrete.ts b/src/color_mode_discrete.ts index a812560..d19c020 100644 --- a/src/color_mode_discrete.ts +++ b/src/color_mode_discrete.ts @@ -12,7 +12,7 @@ declare class DiscreteColorThreshold { tooltip: string; } -// Helper methods to handle discrete color mode +// Extra Series methods to handle discrete color mode export class ColorModeDiscrete { scope: any; panelCtrl: StatusHeatmapCtrl; @@ -42,6 +42,23 @@ export class ColorModeDiscrete { return tooltips; } + convertValueToTooltips(values) { + let thresholds = this.panel.color.thresholds; + let tooltips = []; + + for (let i = 0; i < thresholds.length; i++) { + //for (let j = 0; j < values.length; j++) { + if (values == thresholds[i].value) { + tooltips.push({ + "tooltip": thresholds[i].tooltip?thresholds[i].tooltip:values, + "color": thresholds[i].color + }); + //} + } + } + return tooltips; + } + getNotMatchedValues(values:any[]) { let notMatched:any[] = []; for (let j = 0; j < values.length; j++) { @@ -71,6 +88,22 @@ export class ColorModeDiscrete { return color; } + getBucketColorSingle(value) { + //let thresholds = this.panel.color.thresholds; + if (value == null) { + // treat as null value + return 'rgba(0,0,0,1)'; + //return this.getMatchedThreshold(null).color; + } + let threshold = this.getMatchedThreshold(value); + + if (!threshold || !threshold.color || threshold.color == "") { + return 'rgba(0,0,0,1)'; + } else { + return threshold.color; + } + } + // returns color from first matched thresold in order from 0 to thresholds.length getBucketColor(values) { let thresholds = this.panel.color.thresholds; @@ -109,6 +142,24 @@ export class ColorModeDiscrete { return 'rgba(0,0,0,1)'; } + + updateCardsValuesHasColorInfoSingle() { + if (!this.panelCtrl.cardsData) { + return; + } + this.panelCtrl.cardsData.noColorDefined = false; + var cards = this.panelCtrl.cardsData.cards; + for (var i = 0; i < cards.length; i++) { + cards[i].noColorDefined = false; + var values = cards[i].value; + var threshold = this.getMatchedThreshold(values); + if (!threshold || !threshold.color || threshold.color == "") { + cards[i].noColorDefined = true; + this.panelCtrl.cardsData.noColorDefined = true; + } + } + } + updateCardsValuesHasColorInfo() { if (!this.panelCtrl.cardsData) { return diff --git a/src/css/_statusmap.scss b/src/css/_statusmap.scss index 248b57d..96570d7 100644 --- a/src/css/_statusmap.scss +++ b/src/css/_statusmap.scss @@ -47,10 +47,25 @@ color: $text-color; .discrete-item { - color: #52545c; + color: #ffffff; padding: 1px; font-weight: bold; - text-shadow: 0 0 0.2em #FFF, 0 0 0.2em #FFF, 0 0 0.2em #FFF; + 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: $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; } } @@ -71,6 +86,18 @@ stroke: rgba(102, 102, 102, 0.8); } +.width-c-40 { + width: 40.0rem!important +} +.width-c-50 { + width: 50.0rem!important +} +.width-c-60 { + width: 60.0rem!important +} +.width-c-70 { + width: 70.0rem!important +} .status-heatmap-legend-wrapper { margin: 0 10px; diff --git a/src/extra_series_format.ts b/src/extra_series_format.ts new file mode 100644 index 0000000..4d6dea3 --- /dev/null +++ b/src/extra_series_format.ts @@ -0,0 +1,9 @@ +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/img/tooltip-editor.png b/src/img/tooltip-editor.png new file mode 100644 index 0000000..97a26d8 Binary files /dev/null and b/src/img/tooltip-editor.png differ diff --git a/src/img/tooltip-url.png b/src/img/tooltip-url.png new file mode 100644 index 0000000..cb65c49 Binary files /dev/null and b/src/img/tooltip-url.png differ diff --git a/src/module.ts b/src/module.ts index 2b03526..c0a201d 100644 --- a/src/module.ts +++ b/src/module.ts @@ -19,6 +19,7 @@ import rendering from './rendering'; // import { labelFormats } from './xAxisLabelFormats'; import {statusHeatmapOptionsEditor} from './options_editor'; import {ColorModeDiscrete} from "./color_mode_discrete"; +import { ExtraSeriesFormat, ExtraSeriesFormatValue } from './extra_series_format'; const CANVAS = 'CANVAS'; const SVG = 'SVG'; @@ -93,8 +94,9 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { graph: any; multipleValues: boolean; noColorDefined: boolean; - discreteHelper: ColorModeDiscrete; + discreteExtraSeries: ColorModeDiscrete; dataWarnings: DataWarnings; + extraSeriesFormats: any = []; annotations: object[] = []; annotationsPromise: any; @@ -145,11 +147,25 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { nullPointMode: 'as empty', yAxisSort: 'metrics', highlightCards: true, - useMax: 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 }; /** @ngInject */ - constructor($scope: any, $injector: auto.IInjectorService, private annotationsSrv: AnnotationsSrv) { + constructor($scope: any, $injector: auto.IInjectorService, timeSrv, private annotationsSrv: AnnotationsSrv, $window, datasourceSrv, variableSrv, templateSrv) { super($scope, $injector); _.defaultsDeep(this.panel, this.panelDefaults); @@ -157,6 +173,20 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { 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 = { @@ -166,7 +196,7 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { this.multipleValues = false; this.noColorDefined = false; - this.discreteHelper = new ColorModeDiscrete($scope); + this.discreteExtraSeries = new ColorModeDiscrete($scope); this.dataWarnings = { "noColorDefined": { @@ -180,6 +210,9 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { }; this.annotations = []; + this.annotationsSrv = annotationsSrv; + + this.timeSrv = timeSrv; this.events.on('render', this.onRender.bind(this)); this.events.on('data-received', this.onDataReceived.bind(this)); @@ -189,6 +222,7 @@ 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)); } onRenderComplete(data):void { @@ -196,6 +230,20 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { 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():number { const wndWidth = $(window).width(); // gripPos.w is a width in grid's measurements. Grid size in Grafana is 24. @@ -222,7 +270,7 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { let rangeMs = this.range.to.valueOf() - this.range.from.valueOf(); // this is minimal interval! kbn.round_interval will lower it. - intervalMs = this.discreteHelper.roundIntervalCeil(rangeMs / maxCardsCount); + intervalMs = this.discreteExtraSeries.roundIntervalCeil(rangeMs / maxCardsCount); // Calculate low limit of interval let lowLimitMs = 1; // 1 millisecond default low limit @@ -292,8 +340,6 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { this.data = dataList; this.cardsData = this.convertToCards(this.data); - console.log("OnDataReceived"); - this.annotationsPromise.then( (result: { alertState: any; annotations: any }) => { this.loading = false; @@ -303,13 +349,11 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { } else { this.annotations = []; } - console.log("annotationsPromise result " + this.annotations.length + " annotations"); this.render(); }, () => { this.loading = false; this.annotations = []; - console.log("annotationsPromise onrejected"); this.render(); } ); @@ -334,7 +378,11 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { this.noColorDefined = false; if (this.panel.color.mode === 'discrete') { - this.discreteHelper.updateCardsValuesHasColorInfo(); + if (this.panel.seriesFilterIndex == -1) { + this.discreteExtraSeries.updateCardsValuesHasColorInfo(); + } else { + this.discreteExtraSeries.updateCardsValuesHasColorInfoSingle(); + } if (this.cardsData) { this.noColorDefined = this.cardsData.noColorDefined; } @@ -361,6 +409,26 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { 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(); @@ -371,6 +439,12 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { 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" }); @@ -395,6 +469,12 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { rendering(scope, elem, attrs, ctrl); } + retrieveTimeVar() { + var time = this.timeSrv.timeRangeForUrl(); + var var_time = '&from=' + time.from + '&to=' + time.to; + return var_time; + } + // group values into buckets by target convertToCards(data) { let cardsData = { @@ -433,6 +513,9 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { let card = new Card(); card.id = i*cardsData.xBucketSize + j; card.values = []; + card.columns = []; + card.multipleValues = false; + card.noColorDefined = false; card.y = target; card.x = -1; @@ -453,7 +536,7 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { if (card.values.length > 1) { cardsData.multipleValues = true; card.multipleValues = true; - card.value = card.maxValue; // max value by default + card.value = this.panel.seriesFilterIndex != -1 ? card.values[this.panel.seriesFilterIndex] : card.maxValue; } else { card.value = card.maxValue; // max value by default } diff --git a/src/partials/options_editor.html b/src/partials/options_editor.html index 45563e6..ee06808 100644 --- a/src/partials/options_editor.html +++ b/src/partials/options_editor.html @@ -194,9 +194,105 @@
-
+
+
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/rendering.ts b/src/rendering.ts index 03bf772..c7df204 100644 --- a/src/rendering.ts +++ b/src/rendering.ts @@ -7,6 +7,7 @@ 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'; let MIN_CARD_SIZE = 5, @@ -50,6 +51,7 @@ export class StatusmapRenderer { panel: any; $heatmap: any; tooltip: StatusmapTooltip; + tooltipExtraSeries:StatusHeatmapTooltipExtraSeries; annotationTooltip: AnnotationTooltip; heatmap: any; timeRange: any; @@ -64,6 +66,7 @@ export class StatusmapRenderer { // $heatmap is JQuery object, but heatmap is D3 this.$heatmap = this.elem.find('.status-heatmap-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; @@ -94,6 +97,7 @@ export class StatusmapRenderer { this.$heatmap.on('mousedown', this.onMouseDown.bind(this)); this.$heatmap.on('mousemove', this.onMouseMove.bind(this)); this.$heatmap.on('mouseleave', this.onMouseLeave.bind(this)); + this.$heatmap.on('click', this.onMouseClick.bind(this)); } onGraphHoverClear() { @@ -507,7 +511,11 @@ export class StatusmapRenderer { } else if (this.panel.color.mode === 'spectrum') { return this.colorScale(d.value); } else if (this.panel.color.mode === 'discrete') { - return this.ctrl.discreteHelper.getBucketColor(d.values); + if (this.panel.seriesFilterIndex != -1 || this.panel.seriesFilterIndex != null) { + return this.ctrl.discreteExtraSeries.getBucketColorSingle(d.values[this.panel.seriesFilterIndex]); + } else { + return this.ctrl.discreteExtraSeries.getBucketColor(d.values); + } } } @@ -572,10 +580,17 @@ export class StatusmapRenderer { this.clearSelection(); } - onMouseLeave() { + 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(); } onMouseMove(event) { @@ -599,6 +614,13 @@ export class StatusmapRenderer { } } + public onMouseClick(event) { + this.tooltipExtraSeries.show(event) + if (this.ctrl.panel.usingUrl) { + this.tooltip.destroy(); + } + } + getEventPos(event, offset) { const x = this.xScale.invert(offset.x - this.yAxisWidth).valueOf(); const y = this.yScale.invert(offset.y - this.chartTop); @@ -739,7 +761,7 @@ export class StatusmapRenderer { let annoData = _.map(this.ctrl.annotations, (d,i) => ({"x": Math.floor(this.yAxisWidth + this.xScale(d.time)), "id":i, "anno": d.source})); - //console.log({"ctrl_annotations": this.ctrl.annotations, "annoData": annoData}); + //({"ctrl_annotations": this.ctrl.annotations, "annoData": annoData}); let anno = this.heatmap .append("g") diff --git a/src/statusmap_data.ts b/src/statusmap_data.ts index 3560151..8f6116e 100644 --- a/src/statusmap_data.ts +++ b/src/statusmap_data.ts @@ -6,6 +6,7 @@ class Card { id: number = 0; // Array of values in this bucket values: any[] = []; + columns: any[] = []; // card has multiple values multipleValues: boolean = false; // card has values that has no color diff --git a/src/tooltip.ts b/src/tooltip.ts index 16940f4..b09de3d 100644 --- a/src/tooltip.ts +++ b/src/tooltip.ts @@ -89,8 +89,15 @@ export class StatusmapTooltip { let tooltipHtml = `
${time}
`; + let statuses; + if (this.panel.color.mode === 'discrete') { - let statuses = this.panelCtrl.discreteHelper.convertValuesToTooltips(values); + 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:"; @@ -130,7 +137,7 @@ export class StatusmapTooltip { // Discrete mode errors if (this.panel.color.mode === 'discrete') { if (card.noColorDefined) { - let badValues = this.panelCtrl.discreteHelper.getNotColoredValues(values); + let badValues = this.panelCtrl.discreteExtraSeries.getNotColoredValues(values); tooltipHtml += `
Error: ${this.panelCtrl.dataWarnings.noColorDefined.title}
not colored values:
    diff --git a/src/tooltipextraseries.ts b/src/tooltipextraseries.ts new file mode 100644 index 0000000..3a92afb --- /dev/null +++ b/src/tooltipextraseries.ts @@ -0,0 +1,222 @@ +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 diff --git a/tsconfig.json b/tsconfig.json index f4cefe2..42bb8eb 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -30,7 +30,7 @@ "noImplicitReturns": true, "noImplicitThis": true, "noImplicitUseStrict": false, - "noImplicitAny": true, + "noImplicitAny": false, "noEmitOnError": false, "downlevelIteration": true, "noUnusedLocals": true,