diff --git a/dist/color_legend.js b/dist/color_legend.js index a182b21..a16b345 100644 --- a/dist/color_legend.js +++ b/dist/color_legend.js @@ -3,7 +3,7 @@ System.register(['angular', 'lodash', 'jquery', 'd3', './libs/d3-scale-chromatic/index', 'app/core/core', 'app/core/utils/ticks'], function (_export, _context) { "use strict"; - var angular, _, $, d3, d3ScaleChromatic, contextSrv, tickStep, mod, MIN_LEGEND_STEPS; + var angular, _, $, d3, d3ScaleChromatic, contextSrv, tickStep, mod, LEGEND_STEP_WIDTH; function drawColorLegend(elem, colorScheme, rangeFrom, rangeTo, maxValue, minValue) { var legendElem = $(elem).find('svg'); @@ -13,24 +13,29 @@ System.register(['angular', 'lodash', 'jquery', 'd3', './libs/d3-scale-chromatic var legendWidth = Math.floor(legendElem.outerWidth()) - 30; // narrow legendWidth by 30px to get space for first and last tick values var legendHeight = legendElem.attr("height"); - var rangeStep = 1; - if (rangeTo - rangeFrom > legendWidth) { - rangeStep = Math.floor((rangeTo - rangeFrom) / legendWidth); - } - - if (rangeStep * MIN_LEGEND_STEPS > rangeTo) { - rangeStep = rangeTo / MIN_LEGEND_STEPS; - } - + var rangeStep = (rangeTo - rangeFrom) / (legendWidth / LEGEND_STEP_WIDTH); + // width in pixels in legend space of unit segment in range space + // rangeStep * witdhFactor == width in pixels of one rangeStep var widthFactor = legendWidth / (rangeTo - rangeFrom); var valuesRange = d3.range(rangeFrom, rangeTo, rangeStep); + // console.debug({ + // "rangeStep": rangeStep, + // "widthFactor": widthFactor, + // "legendWidth": legendWidth, + // "steps": (rangeTo - rangeFrom)/rangeStep, + // }); + // console.debug(valuesRange); + var colorScale = getColorScale(colorScheme, maxValue, minValue); - legend.selectAll(".status-heatmap-color-legend-rect").data(valuesRange).enter().append("rect").attr("x", function (d) { + legend.selectAll(".status-heatmap-color-legend-rect").data(valuesRange).enter().append("rect") + // translate from range space into pixels + // and shift all rectangles to the right by 10 + .attr("x", function (d) { return d * widthFactor + 10; - }) // shift all color rectangles to the right - .attr("y", 0).attr("width", rangeStep * widthFactor + 1) // Overlap rectangles to prevent gaps - .attr("height", legendHeight).attr("stroke-width", 0).attr("fill", function (d) { + }).attr("y", 0) + // rectangles are slightly overlaped to prevent gaps + .attr("width", LEGEND_STEP_WIDTH + 1).attr("height", legendHeight).attr("stroke-width", 0).attr("fill", function (d) { return colorScale(d); }); @@ -45,20 +50,21 @@ System.register(['angular', 'lodash', 'jquery', 'd3', './libs/d3-scale-chromatic var legendWidth = Math.floor(legendElem.outerWidth()) - 30; // narrow legendWidth by 30px to get space for first and last tick values var legendHeight = legendElem.attr("height"); - var rangeStep = 10; + var rangeStep = (rangeTo - rangeFrom) / (legendWidth / LEGEND_STEP_WIDTH); + // width in pixels in legend space of unit segment in range space + // rangeStep * witdhFactor == width in pixels of one rangeStep var widthFactor = legendWidth / (rangeTo - rangeFrom); - - if (rangeStep * MIN_LEGEND_STEPS > rangeTo) { - rangeStep = rangeTo / MIN_LEGEND_STEPS; - } - var valuesRange = d3.range(rangeFrom, rangeTo, rangeStep); var opacityScale = getOpacityScale(options, maxValue, minValue); - legend.selectAll(".status-heatmap-opacity-legend-rect").data(valuesRange).enter().append("rect").attr("x", function (d) { + legend.selectAll(".status-heatmap-opacity-legend-rect").data(valuesRange).enter().append("rect") + // translate from range space into pixels + // and shift all rectangles to the right by 10 + .attr("x", function (d) { return d * widthFactor + 10; - }) // shift all opacity rectangles to the right - .attr("y", 0).attr("width", rangeStep * widthFactor).attr("height", legendHeight).attr("stroke-width", 0).attr("fill", options.cardColor).style("opacity", function (d) { + }).attr("y", 0) + // rectangles are slightly overlaped to prevent gaps + .attr("width", LEGEND_STEP_WIDTH + 1).attr("height", legendHeight).attr("stroke-width", 0).attr("fill", options.cardColor).style("opacity", function (d) { return opacityScale(d); }); @@ -180,22 +186,18 @@ System.register(['angular', 'lodash', 'jquery', 'd3', './libs/d3-scale-chromatic function drawSimpleColorLegend(elem, colorScale) { var legendElem = $(elem).find('svg'); + var legend = d3.select(legendElem.get(0)); clearLegend(elem); var legendWidth = Math.floor(legendElem.outerWidth()); var legendHeight = legendElem.attr("height"); if (legendWidth) { - var valuesNumber = Math.floor(legendWidth / 2); - var rangeStep = Math.floor(legendWidth / valuesNumber); - var valuesRange = d3.range(0, legendWidth, rangeStep); + var valuesRange = d3.range(0, legendWidth, LEGEND_STEP_WIDTH); - var legend = d3.select(legendElem.get(0)); - var legendRects = legend.selectAll(".status-heatmap-color-legend-rect").data(valuesRange); - - legendRects.enter().append("rect").attr("x", function (d) { + legend.selectAll(".status-heatmap-color-legend-rect").data(valuesRange).enter().append("rect").attr("x", function (d) { return d; - }).attr("y", 0).attr("width", rangeStep + 1) // Overlap rectangles to prevent gaps + }).attr("y", 0).attr("width", LEGEND_STEP_WIDTH + 1) // Overlap rectangles to prevent gaps .attr("height", legendHeight).attr("stroke-width", 0).attr("fill", function (d) { return colorScale(d); }); @@ -204,10 +206,9 @@ System.register(['angular', 'lodash', 'jquery', 'd3', './libs/d3-scale-chromatic function drawSimpleOpacityLegend(elem, options) { var legendElem = $(elem).find('svg'); - var graphElem = $(elem); + var legend = d3.select(legendElem.get(0)); clearLegend(elem); - var legend = d3.select(legendElem.get(0)); var legendWidth = Math.floor(legendElem.outerWidth()); var legendHeight = legendElem.attr("height"); @@ -219,13 +220,11 @@ System.register(['angular', 'lodash', 'jquery', 'd3', './libs/d3-scale-chromatic legendOpacityScale = d3.scalePow().exponent(options.exponent).domain([0, legendWidth]).range([0, 1]); } - var rangeStep = 10; - var valuesRange = d3.range(0, legendWidth, rangeStep); - var legendRects = legend.selectAll(".status-heatmap-opacity-legend-rect").data(valuesRange); + var valuesRange = d3.range(0, legendWidth, LEGEND_STEP_WIDTH); - legendRects.enter().append("rect").attr("x", function (d) { + legend.selectAll(".status-heatmap-opacity-legend-rect").data(valuesRange).enter().append("rect").attr("x", function (d) { return d; - }).attr("y", 0).attr("width", rangeStep).attr("height", legendHeight).attr("stroke-width", 0).attr("fill", options.cardColor).style("opacity", function (d) { + }).attr("y", 0).attr("width", LEGEND_STEP_WIDTH + 1).attr("height", legendHeight).attr("stroke-width", 0).attr("fill", options.cardColor).style("opacity", function (d) { return legendOpacityScale(d); }); } @@ -331,7 +330,7 @@ System.register(['angular', 'lodash', 'jquery', 'd3', './libs/d3-scale-chromatic }], execute: function () { mod = angular.module('grafana.directives'); - MIN_LEGEND_STEPS = 10; + LEGEND_STEP_WIDTH = 2; /** @@ -386,6 +385,9 @@ System.register(['angular', 'lodash', 'jquery', 'd3', './libs/d3-scale-chromatic function render() { clearLegend(elem); + if (!ctrl.panel.legend.show) { + return; + } if (!_.isEmpty(ctrl.cardsData) && !_.isEmpty(ctrl.cardsData.cards)) { var rangeFrom = ctrl.cardsData.minValue; var rangeTo = ctrl.cardsData.maxValue; diff --git a/dist/color_legend.js.map b/dist/color_legend.js.map index 92907ec..379a72a 100644 --- a/dist/color_legend.js.map +++ b/dist/color_legend.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/color_legend.js"],"names":["drawColorLegend","elem","colorScheme","rangeFrom","rangeTo","maxValue","minValue","legendElem","$","find","legend","d3","select","get","clearLegend","legendWidth","Math","floor","outerWidth","legendHeight","attr","rangeStep","MIN_LEGEND_STEPS","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","graphWidth","textWidth","text","each","i","thisWidth","getBBox","width","push","parentElement","removeChild","min","max","itemWidth","getDiscreteColor","drawDiscreteLegendValues","childNodes","legendValueScale","scaleLinear","domain","ticks","buildLegendTicks","xAxis","axisBottom","tickValues","tickSize","colorRect","posY","getSvgElemHeight","posX","getSvgElemX","call","remove","thresholdValues","thresholdTooltips","value","tickFormat","t","v","undefined","drawSimpleColorLegend","legendRects","drawSimpleOpacityLegend","graphElem","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","angular","mod","module","directive","restrict","template","link","scope","attrs","ctrl","panel","render","events","on","color","mode","colorSchemes","isEmpty","cardsData","cards"],"mappings":"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","file":"color_legend.js","sourcesContent":["import angular from 'angular';\nimport _ 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';\n\nlet mod = angular.module('grafana.directives');\n\nconst MIN_LEGEND_STEPS = 10;\n\n/**\n * Color legend for heatmap editor.\n */\nmod.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 * Heatmap legend with scale values.\n */\nmod.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 (!_.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 = 1;\n if (rangeTo - rangeFrom > legendWidth) {\n rangeStep = Math.floor((rangeTo - rangeFrom) / legendWidth);\n }\n\n if (rangeStep * MIN_LEGEND_STEPS > rangeTo) {\n rangeStep = rangeTo / MIN_LEGEND_STEPS;\n }\n\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 .attr(\"x\", d => d * widthFactor + 10) // shift all color rectangles to the right\n .attr(\"y\", 0)\n .attr(\"width\", rangeStep * widthFactor + 1) // Overlap rectangles to prevent gaps\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 = 10;\n let widthFactor = legendWidth / (rangeTo - rangeFrom);\n\n if (rangeStep * MIN_LEGEND_STEPS > rangeTo) {\n rangeStep = rangeTo / MIN_LEGEND_STEPS;\n }\n\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 .attr(\"x\", d => d * widthFactor + 10) // shift all opacity rectangles to the right\n .attr(\"y\", 0)\n .attr(\"width\", rangeStep * widthFactor)\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 let $heatmap = $(elem).parent().parent().parent().find('.status-heatmap-panel');\n let graphWidth = $heatmap.find('svg').attr(\"width\");\n\n // calculate max width of tooltip and use it as width for each item\n let textWidth = [];\n legend.selectAll(\".hidden-texts\")\n .data(tooltips)\n .enter().append(\"text\")\n .attr(\"class\", \"axis tick\")\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 this.parentElement.removeChild(this); // remove them just after displaying them in IE friendly way\n });\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 clearLegend(elem);\n\n let legendWidth = Math.floor(legendElem.outerWidth());\n let legendHeight = legendElem.attr(\"height\");\n\n if (legendWidth) {\n let valuesNumber = Math.floor(legendWidth / 2);\n let rangeStep = Math.floor(legendWidth / valuesNumber);\n let valuesRange = d3.range(0, legendWidth, rangeStep);\n\n let legend = d3.select(legendElem.get(0));\n var legendRects = legend.selectAll(\".status-heatmap-color-legend-rect\").data(valuesRange);\n\n legendRects.enter().append(\"rect\")\n .attr(\"x\", d => d)\n .attr(\"y\", 0)\n .attr(\"width\", rangeStep + 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 graphElem = $(elem);\n clearLegend(elem);\n\n let legend = d3.select(legendElem.get(0));\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 rangeStep = 10;\n let valuesRange = d3.range(0, legendWidth, rangeStep);\n var legendRects = legend.selectAll(\".status-heatmap-opacity-legend-rect\").data(valuesRange);\n\n legendRects.enter().append(\"rect\")\n .attr(\"x\", d => d)\n .attr(\"y\", 0)\n .attr(\"width\", rangeStep)\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 = [];\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"]} \ No newline at end of file +{"version":3,"sources":["../src/color_legend.js"],"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","graphWidth","textWidth","text","each","i","thisWidth","getBBox","width","push","parentElement","removeChild","min","max","itemWidth","getDiscreteColor","drawDiscreteLegendValues","childNodes","legendValueScale","scaleLinear","domain","ticks","buildLegendTicks","xAxis","axisBottom","tickValues","tickSize","colorRect","posY","getSvgElemHeight","posX","getSvgElemX","call","remove","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","angular","mod","module","directive","restrict","template","link","scope","attrs","ctrl","panel","render","events","on","color","mode","colorSchemes","show","isEmpty","cardsData","cards"],"mappings":"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","file":"color_legend.js","sourcesContent":["import angular from 'angular';\nimport _ 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';\n\nlet mod = angular.module('grafana.directives');\n\nconst LEGEND_STEP_WIDTH = 2;\n\n/**\n * Color legend for heatmap editor.\n */\nmod.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 * Heatmap legend with scale values.\n */\nmod.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 // console.debug({\n // \"rangeStep\": rangeStep,\n // \"widthFactor\": widthFactor,\n // \"legendWidth\": legendWidth,\n // \"steps\": (rangeTo - rangeFrom)/rangeStep,\n // });\n // console.debug(valuesRange);\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 let $heatmap = $(elem).parent().parent().parent().find('.status-heatmap-panel');\n let graphWidth = $heatmap.find('svg').attr(\"width\");\n\n // calculate max width of tooltip and use it as width for each item\n let textWidth = [];\n legend.selectAll(\".hidden-texts\")\n .data(tooltips)\n .enter().append(\"text\")\n .attr(\"class\", \"axis tick\")\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 this.parentElement.removeChild(this); // remove them just after displaying them in IE friendly way\n });\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 = [];\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"]} \ No newline at end of file diff --git a/dist/css/statusmap.dark.css b/dist/css/statusmap.dark.css index 8775d43..d1ba4a5 100644 --- a/dist/css/statusmap.dark.css +++ b/dist/css/statusmap.dark.css @@ -1,5 +1,7 @@ .status-heatmap-canvas-wrapper { cursor: crosshair; } + .status-heatmap-canvas-wrapper .datapoints-warning { + pointer-events: none; } .status-heatmap-canvas-wrapper .datapoints-warning span { background-color: #333333; color: #d8d9da; diff --git a/dist/css/statusmap.dark.css.map b/dist/css/statusmap.dark.css.map index d00f583..4bbef2c 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;EAEjB,uDAAyB;IACzB,gBAAgB,ECDL,OAAO;IDElB,KAAK,ECLM,OAAO;IDMlB,OAAO,EAAE,GAAG;;AAId,qBAAsB;EACpB,QAAQ,EAAE,QAAQ;EAGhB,sCAAK;IACH,IAAI,ECfG,OAAO;IDgBd,KAAK,EChBE,OAAO;IDiBd,SAAS,EEjBE,IAAI;EFoBjB,sCAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,ECrBM,OAAO;ED0BvB,yBAAI;IACF,cAAc,EAAE,IAAI;IAEpB,8BAAK;MACH,cAAc,EAAE,cAAc;;AAKpC,kBAAmB;EACjB,WAAW,EAAE,MAAM;EACnB,SAAS,EEvCI,IAAI;EFwCjB,gBAAgB,ECrCC,OAAO;EDsCxB,KAAK,ECxCM,OAAO;ED0ClB,iCAAe;IACb,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,GAAG;IACZ,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE,8CAA8C;;AAI/D,yBAA0B;EACxB,IAAI,EClDY,OAAO;;ADsDvB,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,ECxFG,OAAO;IDyFd,KAAK,ECzFE,OAAO;ID0Fd,SAAS,EE1FE,IAAI;EF6FjB,+CAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,EC9FM,OAAO;EDiGrB,kDAAQ;IACN,OAAO,EAAE,GAAG;IACZ,MAAM,ECnGM,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,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", "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 84067e5..349f40f 100644 --- a/dist/css/statusmap.light.css +++ b/dist/css/statusmap.light.css @@ -1,5 +1,7 @@ .status-heatmap-canvas-wrapper { cursor: crosshair; } + .status-heatmap-canvas-wrapper .datapoints-warning { + pointer-events: none; } .status-heatmap-canvas-wrapper .datapoints-warning span { background-color: #e9edf2; color: #52545c; diff --git a/dist/css/statusmap.light.css.map b/dist/css/statusmap.light.css.map index 5bd8ab4..36f5f19 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;EAEjB,uDAAyB;IACzB,gBAAgB,ECDL,OAAO;IDElB,KAAK,ECLM,OAAO;IDMlB,OAAO,EAAE,GAAG;;AAId,qBAAsB;EACpB,QAAQ,EAAE,QAAQ;EAGhB,sCAAK;IACH,IAAI,ECfG,OAAO;IDgBd,KAAK,EChBE,OAAO;IDiBd,SAAS,EEjBE,IAAI;EFoBjB,sCAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,ECrBM,OAAO;ED0BvB,yBAAI;IACF,cAAc,EAAE,IAAI;IAEpB,8BAAK;MACH,cAAc,EAAE,cAAc;;AAKpC,kBAAmB;EACjB,WAAW,EAAE,MAAM;EACnB,SAAS,EEvCI,IAAI;EFwCjB,gBAAgB,ECrCC,OAAO;EDsCxB,KAAK,ECxCM,OAAO;ED0ClB,iCAAe;IACb,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,GAAG;IACZ,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE,8CAA8C;;AAI/D,yBAA0B;EACxB,IAAI,EClDY,OAAO;;ADsDvB,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,ECxFG,OAAO;IDyFd,KAAK,ECzFE,OAAO;ID0Fd,SAAS,EE1FE,IAAI;EF6FjB,+CAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,EC9FM,OAAO;EDiGrB,kDAAQ;IACN,OAAO,EAAE,GAAG;IACZ,MAAM,ECnGM,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,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", "sources": ["../../src/css/_statusmap.scss","../../src/css/_variables.light.scss","../../src/css/_variables.scss"], "names": [], "file": "statusmap.light.css" diff --git a/dist/module.html b/dist/module.html index dd55b5f..a649b27 100644 --- a/dist/module.html +++ b/dist/module.html @@ -1,7 +1,7 @@
-
+
{{ctrl.dataWarnings.multipleValues.title}} {{ctrl.dataWarnings.noColorDefined.title}}
diff --git a/dist/partials/options_editor.html b/dist/partials/options_editor.html index 148e3c1..45563e6 100644 --- a/dist/partials/options_editor.html +++ b/dist/partials/options_editor.html @@ -190,7 +190,7 @@
- +
diff --git a/dist/rendering.js b/dist/rendering.js index 2c68c4a..877fd54 100644 --- a/dist/rendering.js +++ b/dist/rendering.js @@ -363,6 +363,10 @@ System.register(['lodash', 'jquery', 'moment', 'app/core/utils/kbn', 'app/core/c // Card width should be MIN_CARD_SIZE at least w = Math.max(w, MIN_CARD_SIZE); + if (cardHSpacing == 0) { + w = w + 1; + } + return w; } @@ -389,6 +393,10 @@ System.register(['lodash', 'jquery', 'moment', 'app/core/utils/kbn', 'app/core/c // Card height should be MIN_CARD_SIZE at least h = Math.max(h, MIN_CARD_SIZE); + if (cardVSpacing == 0) { + h = h + 1; + } + return h; } diff --git a/dist/rendering.js.map b/dist/rendering.js.map index 64eaea0..ecb5bc3 100644 --- a/dist/rendering.js.map +++ b/dist/rendering.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/rendering.js"],"names":["link","scope","elem","attrs","ctrl","data","cardsData","timeRange","panel","heatmap","$heatmap","find","tooltip","StatusHeatmapTooltip","width","height","yScale","xScale","chartWidth","chartHeight","chartTop","chartBottom","yAxisWidth","xAxisHeight","cardVSpacing","cardHSpacing","cardRound","cardWidth","cardHeight","colorScale","opacityScale","mouseUpHandler","xGridSize","yGridSize","yOffset","selection","active","x1","x2","padding","left","right","top","bottom","margin","dataRangeWidingFactor","DATA_RANGE_WIDING_FACTOR","events","on","render","setElementHeight","row","_","isString","parseInt","replace","legend","show","css","e","getYAxisWidth","axis_text","selectAll","nodes","max_text_width","max","map","text","getBBox","getXAxisHeight","axis_line","select","empty","axis_line_position","parseFloat","attr","canvas_width","addXAxis","d3","scaleTime","domain","from","to","range","ticks","DEFAULT_X_TICK_SIZE_PX","grafanaTimeFormatter","grafanaTimeFormat","timeFormat","dashboardTimeZone","dashboard","getTimezone","utcFormat","xAxis","axisBottom","tickFormat","tickPadding","X_AXIS_TICK_PADDING","tickSize","posY","posX","append","call","remove","getYScale","step","length","push","i","scaleOrdinal","getYAxisScale","addYAxis","uniq","d","target","isEmpty","yAxisSort","sort","a","b","localeCompare","ignorePunctuation","numeric","yAxisScale","yAxis","axisLeft","tickValues","tickSizeInner","Y_AXIS_TICK_PADDING","wideYAxisRange","min","tickInterval","y_widing","y_min","y_max","Math","ceil","floor","tickValueFormatter","decimals","scaledDecimals","format","value","kbn","valueFormats","addHeatmapCanvas","heatmap_elem","cards","CARD_H_SPACING","CARD_V_SPACING","CARD_ROUND","yBucketSize","xBucketSize","style","addHeatmap","maxValue","color","minValue","mode","getColorScale","setOpacityScale","enter","c","id","getCardX","getCardWidth","getCardY","getCardHeight","getCardColor","getCardOpacity","$cards","event","mouseOverBucket","highlightCard","resetCardHighLight","emit","highlightColor","darker","strokeColor","brighter","current_card","originalFillColor","colorScheme","colorSchemes","colorInterpolator","d3ScaleChromatic","colorScaleInverted","invert","contextSrv","user","lightTheme","start","end","scaleSequential","scaleLinear","scalePow","exponent","x","cx","w","cutted_width","MIN_CARD_SIZE","y","ys","h","cardColor","discreteHelper","getBucketColor","values","nullPointMode","getCardStrokeWidth","appEvents","drawSharedCrosshair","pos","clearCrosshair","onMouseDown","offsetX","onMouseUp","$","document","one","unbind","selectionRange","abs","MIN_SELECTION_WIDTH","timeFrom","timeTo","timeSrv","setTime","moment","utc","clearSelection","onMouseLeave","onMouseMove","destroy","limitSelection","drawSelection","emitGraphHoverEvet","drawCrosshair","valueOf","offsetY","pageX","pageY","y1","panelRelY","posX1","posX2","selectionX","selectionWidth","position","graphTooltip","secPerTick","oneDay","oneYear","tickStep","getScaledDecimals","getFlotTickSize","DEFAULT_Y_TICK_SIZE_PX"],"mappings":"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","file":"rendering.js","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 d3 from 'd3';\nimport * as d3ScaleChromatic from './libs/d3-scale-chromatic/index';\nimport {StatusHeatmapTooltip} from './tooltip';\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 link(scope, elem, attrs, ctrl) {\n let data, cardsData, timeRange, panel, heatmap;\n\n // $heatmap is JQuery object, but heatmap is D3\n let $heatmap = elem.find('.status-heatmap-panel');\n let tooltip = new StatusHeatmapTooltip($heatmap, scope);\n\n let width, height,\n yScale, xScale,\n chartWidth, chartHeight,\n chartTop, chartBottom,\n yAxisWidth, xAxisHeight,\n cardVSpacing, cardHSpacing, cardRound,\n cardWidth, cardHeight,\n colorScale, opacityScale,\n mouseUpHandler,\n xGridSize, yGridSize;\n\n let yOffset = 0;\n\n let selection = {\n active: false,\n x1: -1,\n x2: -1\n };\n\n let padding = {left: 0, right: 0, top: 0, bottom: 0},\n margin = {left: 25, right: 15, top: 10, bottom: 20},\n dataRangeWidingFactor = DATA_RANGE_WIDING_FACTOR;\n\n ctrl.events.on('render', () => {\n render();\n });\n\n function setElementHeight() {\n try {\n var height = ctrl.height || panel.height || ctrl.row.height;\n if (_.isString(height)) {\n height = parseInt(height.replace('px', ''), 10);\n }\n\n height -= panel.legend.show ? 32 : 10; // bottom padding and space for legend. Change margin in .status-heatmap-color-legend !\n\n $heatmap.css('height', height + 'px');\n\n return true;\n } catch (e) { // IE throws errors sometimes\n return false;\n }\n }\n\n function getYAxisWidth(elem) {\n let axis_text = elem.selectAll(\".axis-y text\").nodes();\n let max_text_width = _.max(_.map(axis_text, text => {\n // Use SVG getBBox method\n return text.getBBox().width;\n }));\n\n return max_text_width;\n }\n\n function getXAxisHeight(elem) {\n let axis_line = elem.select(\".axis-x line\");\n if (!axis_line.empty()) {\n let axis_line_position = parseFloat(elem.select(\".axis-x line\").attr(\"y2\"));\n let canvas_width = parseFloat(elem.attr(\"height\"));\n return canvas_width - axis_line_position;\n } else {\n // Default height\n return 30;\n }\n }\n\n function addXAxis() {\n // Scale timestamps to cards centers\n scope.xScale = xScale = d3.scaleTime()\n .domain([timeRange.from, timeRange.to])\n .range([xGridSize/2, chartWidth-xGridSize/2]);\n\n let ticks = chartWidth / DEFAULT_X_TICK_SIZE_PX;\n let grafanaTimeFormatter = grafanaTimeFormat(ticks, timeRange.from, timeRange.to);\n let timeFormat;\n let dashboardTimeZone = 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.axisBottom(xScale)\n .ticks(ticks)\n .tickFormat(timeFormat)\n .tickPadding(X_AXIS_TICK_PADDING)\n .tickSize(chartHeight);\n\n let posY = chartTop;\n let posX = yAxisWidth;\n\n 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 heatmap.select(\".axis-x\").select(\".domain\").remove();\n }\n\n // divide chart height by ticks for cards drawing\n function getYScale(ticks) {\n let range = [];\n let step = 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 function getYAxisScale(ticks) {\n let range = [];\n let step = chartHeight / ticks.length;\n // svg has y=0 on the top, so top tick should have a minimal value in range\n range.push(yOffset);\n for (let i = 1; i < ticks.length; i++) {\n range.push(step * i + yOffset);\n }\n return d3.scaleOrdinal()\n .domain(ticks)\n .range(range);\n }\n\n function addYAxis() {\n let ticks = _.uniq(_.map(data, d => d.target));\n\n // Set default Y min and max if no data\n if (_.isEmpty(data)) {\n ticks = [''];\n }\n\n if (panel.yAxisSort == 'a → z') {\n ticks.sort((a, b) => a.localeCompare(b, 'en', {ignorePunctuation: false, numeric: true}));\n } else if (panel.yAxisSort == 'z → a') {\n ticks.sort((b, a) => a.localeCompare(b, 'en', {ignorePunctuation: false, numeric: true}));\n }\n\n let yAxisScale = getYAxisScale(ticks);\n scope.yScale = yScale = getYScale(ticks);\n\n let yAxis = d3.axisLeft(yAxisScale)\n .tickValues(ticks)\n .tickSizeInner(0 - width)\n .tickPadding(Y_AXIS_TICK_PADDING);\n\n heatmap.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 = margin.top;\n let posX = getYAxisWidth(heatmap) + Y_AXIS_TICK_PADDING;\n 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 heatmap.select(\".axis-y\").select(\".domain\").remove();\n heatmap.select(\".axis-y\").selectAll(\".tick line\").remove();\n }\n\n // Wide Y values range and adjust to bucket size\n function wideYAxisRange(min, max, tickInterval) {\n let y_widing = (max * (dataRangeWidingFactor - 1) - min * (dataRangeWidingFactor - 1)) / 2;\n let y_min, y_max;\n\n if (tickInterval === 0) {\n y_max = max * dataRangeWidingFactor;\n y_min = min - min * (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 function tickValueFormatter(decimals, scaledDecimals = null) {\n let format = 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 function addHeatmapCanvas() {\n let heatmap_elem = $heatmap[0];\n\n width = Math.floor($heatmap.width()) - padding.right;\n height = Math.floor($heatmap.height()) - padding.bottom;\n\n if (heatmap) {\n heatmap.remove();\n }\n\n heatmap = d3.select(heatmap_elem)\n .append(\"svg\")\n .attr(\"width\", width)\n .attr(\"height\", height);\n\n chartHeight = height - margin.top - margin.bottom;\n chartTop = margin.top;\n chartBottom = chartTop + chartHeight;\n\n cardHSpacing = panel.cards.cardHSpacing !== null ? panel.cards.cardHSpacing : CARD_H_SPACING;\n cardVSpacing = panel.cards.cardVSpacing !== null ? panel.cards.cardVSpacing : CARD_V_SPACING;\n cardRound = panel.cards.cardRound !== null ? panel.cards.cardRound : CARD_ROUND;\n\n // calculate yOffset for YAxis\n yGridSize = Math.floor(chartHeight / cardsData.yBucketSize);\n cardHeight = yGridSize ? yGridSize - cardVSpacing : 0;\n yOffset = cardHeight / 2;\n\n addYAxis();\n\n yAxisWidth = getYAxisWidth(heatmap) + Y_AXIS_TICK_PADDING;\n chartWidth = width - yAxisWidth - margin.right;\n\n // we need to fill chartWidth with xBucketSize cards.\n xGridSize = chartWidth / (cardsData.xBucketSize+1);\n cardWidth = xGridSize - cardHSpacing;\n\n addXAxis();\n xAxisHeight = getXAxisHeight(heatmap);\n\n if (!panel.yAxis.show) {\n heatmap.select(\".axis-y\").selectAll(\"line\").style(\"opacity\", 0);\n }\n\n if (!panel.xAxis.show) {\n heatmap.select(\".axis-x\").selectAll(\"line\").style(\"opacity\", 0);\n }\n }\n\n function addHeatmap() {\n addHeatmapCanvas();\n\n let maxValue = panel.color.max || cardsData.maxValue;\n let minValue = panel.color.min || cardsData.minValue;\n\n if (panel.color.mode !== 'discrete') {\n colorScale = getColorScale(maxValue, minValue);\n }\n setOpacityScale(maxValue);\n\n let cards = heatmap.selectAll(\".status-heatmap-card\").data(cardsData.cards);\n cards.append(\"title\");\n cards = cards.enter().append(\"rect\")\n .attr(\"cardId\", c => c.id)\n .attr(\"x\", getCardX)\n .attr(\"width\", getCardWidth)\n .attr(\"y\", getCardY)\n .attr(\"height\", getCardHeight)\n .attr(\"rx\", cardRound)\n .attr(\"ry\", cardRound)\n .attr(\"class\", \"bordered status-heatmap-card\")\n .style(\"fill\", getCardColor)\n .style(\"stroke\", getCardColor)\n .style(\"stroke-width\", 0)\n //.style(\"stroke-width\", getCardStrokeWidth)\n //.style(\"stroke-dasharray\", \"3,3\")\n .style(\"opacity\", getCardOpacity);\n\n let $cards = $heatmap.find(\".status-heatmap-card\");\n $cards.on(\"mouseenter\", (event) => {\n tooltip.mouseOverBucket = true;\n highlightCard(event);\n })\n .on(\"mouseleave\", (event) => {\n tooltip.mouseOverBucket = false;\n resetCardHighLight(event);\n });\n\n ctrl.events.emit('render-complete', {\n \"chartWidth\": chartWidth\n });\n }\n\n function highlightCard(event) {\n let color = d3.select(event.target).style(\"fill\");\n let highlightColor = d3.color(color).darker(2);\n let strokeColor = d3.color(color).brighter(4);\n let current_card = d3.select(event.target);\n tooltip.originalFillColor = color;\n current_card.style(\"fill\", highlightColor)\n .style(\"stroke\", strokeColor)\n .style(\"stroke-width\", 1);\n }\n\n function resetCardHighLight(event) {\n d3\n .select(event.target)\n .style(\"fill\", tooltip.originalFillColor)\n .style(\"stroke\", tooltip.originalFillColor)\n .style(\"stroke-width\", 0);\n }\n\n function getColorScale(maxValue, minValue = 0) {\n let colorScheme = _.find(ctrl.colorSchemes, {value: panel.color.colorScheme});\n let colorInterpolator = d3ScaleChromatic[colorScheme.value];\n let colorScaleInverted = colorScheme.invert === 'always' ||\n (colorScheme.invert === 'dark' && !contextSrv.user.lightTheme);\n\n if (maxValue == minValue)\n maxValue = minValue + 1;\n\n let start = colorScaleInverted ? maxValue : minValue;\n let end = colorScaleInverted ? minValue : maxValue;\n\n return d3.scaleSequential(colorInterpolator).domain([start, end]);\n }\n\n function setOpacityScale(maxValue) {\n if (panel.color.colorScale === 'linear') {\n opacityScale = d3.scaleLinear()\n .domain([0, maxValue])\n .range([0, 1]);\n } else if (panel.color.colorScale === 'sqrt') {\n opacityScale = d3.scalePow().exponent(panel.color.exponent)\n .domain([0, maxValue])\n .range([0, 1]);\n }\n }\n\n function getCardX(d) {\n let x;\n // cx is the center of the card. Card should be placed to the left.\n let cx = xScale(d.x);\n\n if (cx - cardWidth/2 < 0) {\n x = yAxisWidth + cardHSpacing/2;\n } else {\n x = yAxisWidth + cx - cardWidth/2;\n }\n\n return x;\n }\n\n // xScale returns card center. Adjust cardWidth in case of overlaping.\n function getCardWidth(d) {\n let w;\n let cx = xScale(d.x);\n\n if (cx < 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 - cardHSpacing/2) + cardWidth/2;\n w = cutted_width > 0 ? cutted_width : 0;\n } else if (chartWidth - cx < cardWidth/2) {\n // Cut card to the right to prevent overlay of right graph edge.\n w = cardWidth/2 + (chartWidth - cx - cardHSpacing/2);\n } else {\n w = cardWidth;\n }\n\n // Card width should be MIN_CARD_SIZE at least\n w = Math.max(w, MIN_CARD_SIZE);\n\n return w;\n }\n\n function getCardY(d) {\n return yScale(d.y) + chartTop - cardHeight - cardVSpacing/2;\n }\n\n function getCardHeight(d) {\n let ys = yScale(d.y);\n let y = ys + chartTop - cardHeight - cardVSpacing/2;\n let h = cardHeight;\n\n // Cut card height to prevent overlay\n if (y < chartTop) {\n h = ys - cardVSpacing/2;\n } else if (ys > chartBottom) {\n h = chartBottom - y;\n } else if (y + cardHeight > chartBottom) {\n h = chartBottom - y;\n }\n\n // Height can't be more than chart height\n h = Math.min(h, chartHeight);\n // Card height should be MIN_CARD_SIZE at least\n h = Math.max(h, MIN_CARD_SIZE);\n\n return h;\n }\n\n function getCardColor(d) {\n if (panel.color.mode === 'opacity') {\n return panel.color.cardColor;\n } else if (panel.color.mode === 'spectrum') {\n return colorScale(d.value);\n } else if (panel.color.mode === 'discrete') {\n return ctrl.discreteHelper.getBucketColor(d.values);\n }\n }\n\n function getCardOpacity(d) {\n if (panel.nullPointMode === 'as empty' && d.value == null ) {\n return 0;\n }\n if (panel.color.mode === 'opacity') {\n return opacityScale(d.value);\n } else {\n return 1;\n }\n }\n\n function getCardStrokeWidth(d) {\n if (panel.color.mode === 'discrete') {\n return '1';\n }\n return '0';\n }\n\n /////////////////////////////\n // Selection and crosshair //\n /////////////////////////////\n\n // Shared crosshair and tooltip\n appEvents.on('graph-hover', event => {\n drawSharedCrosshair(event.pos);\n }, scope);\n\n appEvents.on('graph-hover-clear', () => {\n clearCrosshair();\n }, scope);\n\n function onMouseDown(event) {\n selection.active = true;\n selection.x1 = event.offsetX;\n\n mouseUpHandler = function() {\n onMouseUp();\n };\n\n $(document).one(\"mouseup\", mouseUpHandler);\n }\n\n function onMouseUp() {\n $(document).unbind(\"mouseup\", mouseUpHandler);\n mouseUpHandler = null;\n selection.active = false;\n\n let selectionRange = Math.abs(selection.x2 - selection.x1);\n if (selection.x2 >= 0 && selectionRange > MIN_SELECTION_WIDTH) {\n let timeFrom = xScale.invert(Math.min(selection.x1, selection.x2) - yAxisWidth - xGridSize/2);\n let timeTo = xScale.invert(Math.max(selection.x1, selection.x2) - yAxisWidth - xGridSize/2);\n\n ctrl.timeSrv.setTime({\n from: moment.utc(timeFrom),\n to: moment.utc(timeTo)\n });\n }\n\n clearSelection();\n }\n\n function onMouseLeave() {\n appEvents.emit('graph-hover-clear');\n clearCrosshair();\n }\n\n function onMouseMove(event) {\n if (!heatmap) { return; }\n\n if (selection.active) {\n // Clear crosshair and tooltip\n clearCrosshair();\n tooltip.destroy();\n\n selection.x2 = limitSelection(event.offsetX);\n drawSelection(selection.x1, selection.x2);\n } else {\n emitGraphHoverEvet(event);\n drawCrosshair(event.offsetX);\n tooltip.show(event); //, data);\n }\n }\n\n function emitGraphHoverEvet(event) {\n let x = xScale.invert(event.offsetX - yAxisWidth - xGridSize/2).valueOf();\n let y = 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: null\n };\n\n // Set minimum offset to prevent showing legend from another panel\n pos.panelRelY = Math.max(event.offsetY / height, 0.001);\n\n // broadcast to other graph panels that we are hovering\n appEvents.emit('graph-hover', {pos: pos, panel: panel});\n }\n\n function limitSelection(x2) {\n x2 = Math.max(x2, yAxisWidth);\n x2 = Math.min(x2, chartWidth + yAxisWidth);\n return x2;\n }\n\n function drawSelection(posX1, posX2) {\n if (heatmap) {\n 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 heatmap.append(\"rect\")\n .attr(\"class\", \"status-heatmap-selection\")\n .attr(\"x\", selectionX)\n .attr(\"width\", selectionWidth)\n .attr(\"y\", chartTop)\n .attr(\"height\", chartHeight);\n }\n }\n }\n\n function clearSelection() {\n selection.x1 = -1;\n selection.x2 = -1;\n\n if (heatmap) {\n heatmap.selectAll(\".status-heatmap-selection\").remove();\n }\n }\n\n function drawCrosshair(position) {\n if (heatmap) {\n heatmap.selectAll(\".status-heatmap-crosshair\").remove();\n\n let posX = position;\n posX = Math.max(posX, yAxisWidth);\n posX = Math.min(posX, chartWidth + yAxisWidth);\n\n 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\", chartTop)\n .attr(\"x2\", 1)\n .attr(\"y2\", chartBottom)\n .attr(\"stroke-width\", 1);\n }\n }\n\n // map time to X\n function drawSharedCrosshair(pos) {\n if (heatmap && ctrl.dashboard.graphTooltip !== 0) {\n let posX = xScale(pos.x) + yAxisWidth;\n drawCrosshair(posX);\n }\n }\n\n function clearCrosshair() {\n if (heatmap) {\n heatmap.selectAll(\".status-heatmap-crosshair\").remove();\n }\n }\n\n function render() {\n data = ctrl.data;\n panel = ctrl.panel;\n timeRange = ctrl.range;\n cardsData = ctrl.cardsData;\n\n if (!data || !cardsData || !setElementHeight()) {\n return;\n }\n\n // Draw default axes and return if no data\n if (_.isEmpty(cardsData.cards)) {\n addHeatmapCanvas();\n return;\n }\n\n addHeatmap();\n scope.yAxisWidth = yAxisWidth;\n scope.xAxisHeight = xAxisHeight;\n scope.chartHeight = chartHeight;\n scope.chartWidth = chartWidth;\n scope.chartTop = chartTop;\n }\n\n // Register selection listeners\n $heatmap.on(\"mousedown\", onMouseDown);\n $heatmap.on(\"mousemove\", onMouseMove);\n $heatmap.on(\"mouseleave\", onMouseLeave);\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"]} \ No newline at end of file +{"version":3,"sources":["../src/rendering.js"],"names":["link","scope","elem","attrs","ctrl","data","cardsData","timeRange","panel","heatmap","$heatmap","find","tooltip","StatusHeatmapTooltip","width","height","yScale","xScale","chartWidth","chartHeight","chartTop","chartBottom","yAxisWidth","xAxisHeight","cardVSpacing","cardHSpacing","cardRound","cardWidth","cardHeight","colorScale","opacityScale","mouseUpHandler","xGridSize","yGridSize","yOffset","selection","active","x1","x2","padding","left","right","top","bottom","margin","dataRangeWidingFactor","DATA_RANGE_WIDING_FACTOR","events","on","render","setElementHeight","row","_","isString","parseInt","replace","legend","show","css","e","getYAxisWidth","axis_text","selectAll","nodes","max_text_width","max","map","text","getBBox","getXAxisHeight","axis_line","select","empty","axis_line_position","parseFloat","attr","canvas_width","addXAxis","d3","scaleTime","domain","from","to","range","ticks","DEFAULT_X_TICK_SIZE_PX","grafanaTimeFormatter","grafanaTimeFormat","timeFormat","dashboardTimeZone","dashboard","getTimezone","utcFormat","xAxis","axisBottom","tickFormat","tickPadding","X_AXIS_TICK_PADDING","tickSize","posY","posX","append","call","remove","getYScale","step","length","push","i","scaleOrdinal","getYAxisScale","addYAxis","uniq","d","target","isEmpty","yAxisSort","sort","a","b","localeCompare","ignorePunctuation","numeric","yAxisScale","yAxis","axisLeft","tickValues","tickSizeInner","Y_AXIS_TICK_PADDING","wideYAxisRange","min","tickInterval","y_widing","y_min","y_max","Math","ceil","floor","tickValueFormatter","decimals","scaledDecimals","format","value","kbn","valueFormats","addHeatmapCanvas","heatmap_elem","cards","CARD_H_SPACING","CARD_V_SPACING","CARD_ROUND","yBucketSize","xBucketSize","style","addHeatmap","maxValue","color","minValue","mode","getColorScale","setOpacityScale","enter","c","id","getCardX","getCardWidth","getCardY","getCardHeight","getCardColor","getCardOpacity","$cards","event","mouseOverBucket","highlightCard","resetCardHighLight","emit","highlightColor","darker","strokeColor","brighter","current_card","originalFillColor","colorScheme","colorSchemes","colorInterpolator","d3ScaleChromatic","colorScaleInverted","invert","contextSrv","user","lightTheme","start","end","scaleSequential","scaleLinear","scalePow","exponent","x","cx","w","cutted_width","MIN_CARD_SIZE","y","ys","h","cardColor","discreteHelper","getBucketColor","values","nullPointMode","getCardStrokeWidth","appEvents","drawSharedCrosshair","pos","clearCrosshair","onMouseDown","offsetX","onMouseUp","$","document","one","unbind","selectionRange","abs","MIN_SELECTION_WIDTH","timeFrom","timeTo","timeSrv","setTime","moment","utc","clearSelection","onMouseLeave","onMouseMove","destroy","limitSelection","drawSelection","emitGraphHoverEvet","drawCrosshair","valueOf","offsetY","pageX","pageY","y1","panelRelY","posX1","posX2","selectionX","selectionWidth","position","graphTooltip","secPerTick","oneDay","oneYear","tickStep","getScaledDecimals","getFlotTickSize","DEFAULT_Y_TICK_SIZE_PX"],"mappings":"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","file":"rendering.js","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 d3 from 'd3';\nimport * as d3ScaleChromatic from './libs/d3-scale-chromatic/index';\nimport {StatusHeatmapTooltip} from './tooltip';\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 link(scope, elem, attrs, ctrl) {\n let data, cardsData, timeRange, panel, heatmap;\n\n // $heatmap is JQuery object, but heatmap is D3\n let $heatmap = elem.find('.status-heatmap-panel');\n let tooltip = new StatusHeatmapTooltip($heatmap, scope);\n\n let width, height,\n yScale, xScale,\n chartWidth, chartHeight,\n chartTop, chartBottom,\n yAxisWidth, xAxisHeight,\n cardVSpacing, cardHSpacing, cardRound,\n cardWidth, cardHeight,\n colorScale, opacityScale,\n mouseUpHandler,\n xGridSize, yGridSize;\n\n let yOffset = 0;\n\n let selection = {\n active: false,\n x1: -1,\n x2: -1\n };\n\n let padding = {left: 0, right: 0, top: 0, bottom: 0},\n margin = {left: 25, right: 15, top: 10, bottom: 20},\n dataRangeWidingFactor = DATA_RANGE_WIDING_FACTOR;\n\n ctrl.events.on('render', () => {\n render();\n });\n\n function setElementHeight() {\n try {\n var height = ctrl.height || panel.height || ctrl.row.height;\n if (_.isString(height)) {\n height = parseInt(height.replace('px', ''), 10);\n }\n\n height -= panel.legend.show ? 32 : 10; // bottom padding and space for legend. Change margin in .status-heatmap-color-legend !\n\n $heatmap.css('height', height + 'px');\n\n return true;\n } catch (e) { // IE throws errors sometimes\n return false;\n }\n }\n\n function getYAxisWidth(elem) {\n let axis_text = elem.selectAll(\".axis-y text\").nodes();\n let max_text_width = _.max(_.map(axis_text, text => {\n // Use SVG getBBox method\n return text.getBBox().width;\n }));\n\n return max_text_width;\n }\n\n function getXAxisHeight(elem) {\n let axis_line = elem.select(\".axis-x line\");\n if (!axis_line.empty()) {\n let axis_line_position = parseFloat(elem.select(\".axis-x line\").attr(\"y2\"));\n let canvas_width = parseFloat(elem.attr(\"height\"));\n return canvas_width - axis_line_position;\n } else {\n // Default height\n return 30;\n }\n }\n\n function addXAxis() {\n // Scale timestamps to cards centers\n scope.xScale = xScale = d3.scaleTime()\n .domain([timeRange.from, timeRange.to])\n .range([xGridSize/2, chartWidth-xGridSize/2]);\n\n let ticks = chartWidth / DEFAULT_X_TICK_SIZE_PX;\n let grafanaTimeFormatter = grafanaTimeFormat(ticks, timeRange.from, timeRange.to);\n let timeFormat;\n let dashboardTimeZone = 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.axisBottom(xScale)\n .ticks(ticks)\n .tickFormat(timeFormat)\n .tickPadding(X_AXIS_TICK_PADDING)\n .tickSize(chartHeight);\n\n let posY = chartTop;\n let posX = yAxisWidth;\n\n 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 heatmap.select(\".axis-x\").select(\".domain\").remove();\n }\n\n // divide chart height by ticks for cards drawing\n function getYScale(ticks) {\n let range = [];\n let step = 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 function getYAxisScale(ticks) {\n let range = [];\n let step = chartHeight / ticks.length;\n // svg has y=0 on the top, so top tick should have a minimal value in range\n range.push(yOffset);\n for (let i = 1; i < ticks.length; i++) {\n range.push(step * i + yOffset);\n }\n return d3.scaleOrdinal()\n .domain(ticks)\n .range(range);\n }\n\n function addYAxis() {\n let ticks = _.uniq(_.map(data, d => d.target));\n\n // Set default Y min and max if no data\n if (_.isEmpty(data)) {\n ticks = [''];\n }\n\n if (panel.yAxisSort == 'a → z') {\n ticks.sort((a, b) => a.localeCompare(b, 'en', {ignorePunctuation: false, numeric: true}));\n } else if (panel.yAxisSort == 'z → a') {\n ticks.sort((b, a) => a.localeCompare(b, 'en', {ignorePunctuation: false, numeric: true}));\n }\n\n let yAxisScale = getYAxisScale(ticks);\n scope.yScale = yScale = getYScale(ticks);\n\n let yAxis = d3.axisLeft(yAxisScale)\n .tickValues(ticks)\n .tickSizeInner(0 - width)\n .tickPadding(Y_AXIS_TICK_PADDING);\n\n heatmap.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 = margin.top;\n let posX = getYAxisWidth(heatmap) + Y_AXIS_TICK_PADDING;\n 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 heatmap.select(\".axis-y\").select(\".domain\").remove();\n heatmap.select(\".axis-y\").selectAll(\".tick line\").remove();\n }\n\n // Wide Y values range and adjust to bucket size\n function wideYAxisRange(min, max, tickInterval) {\n let y_widing = (max * (dataRangeWidingFactor - 1) - min * (dataRangeWidingFactor - 1)) / 2;\n let y_min, y_max;\n\n if (tickInterval === 0) {\n y_max = max * dataRangeWidingFactor;\n y_min = min - min * (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 function tickValueFormatter(decimals, scaledDecimals = null) {\n let format = 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 function addHeatmapCanvas() {\n let heatmap_elem = $heatmap[0];\n\n width = Math.floor($heatmap.width()) - padding.right;\n height = Math.floor($heatmap.height()) - padding.bottom;\n\n if (heatmap) {\n heatmap.remove();\n }\n\n heatmap = d3.select(heatmap_elem)\n .append(\"svg\")\n .attr(\"width\", width)\n .attr(\"height\", height);\n\n chartHeight = height - margin.top - margin.bottom;\n chartTop = margin.top;\n chartBottom = chartTop + chartHeight;\n\n cardHSpacing = panel.cards.cardHSpacing !== null ? panel.cards.cardHSpacing : CARD_H_SPACING;\n cardVSpacing = panel.cards.cardVSpacing !== null ? panel.cards.cardVSpacing : CARD_V_SPACING;\n cardRound = panel.cards.cardRound !== null ? panel.cards.cardRound : CARD_ROUND;\n\n // calculate yOffset for YAxis\n yGridSize = Math.floor(chartHeight / cardsData.yBucketSize);\n cardHeight = yGridSize ? yGridSize - cardVSpacing : 0;\n yOffset = cardHeight / 2;\n\n addYAxis();\n\n yAxisWidth = getYAxisWidth(heatmap) + Y_AXIS_TICK_PADDING;\n chartWidth = width - yAxisWidth - margin.right;\n\n // we need to fill chartWidth with xBucketSize cards.\n xGridSize = chartWidth / (cardsData.xBucketSize+1);\n cardWidth = xGridSize - cardHSpacing;\n\n addXAxis();\n xAxisHeight = getXAxisHeight(heatmap);\n\n if (!panel.yAxis.show) {\n heatmap.select(\".axis-y\").selectAll(\"line\").style(\"opacity\", 0);\n }\n\n if (!panel.xAxis.show) {\n heatmap.select(\".axis-x\").selectAll(\"line\").style(\"opacity\", 0);\n }\n }\n\n function addHeatmap() {\n addHeatmapCanvas();\n\n let maxValue = panel.color.max || cardsData.maxValue;\n let minValue = panel.color.min || cardsData.minValue;\n\n if (panel.color.mode !== 'discrete') {\n colorScale = getColorScale(maxValue, minValue);\n }\n setOpacityScale(maxValue);\n\n let cards = heatmap.selectAll(\".status-heatmap-card\").data(cardsData.cards);\n cards.append(\"title\");\n cards = cards.enter().append(\"rect\")\n .attr(\"cardId\", c => c.id)\n .attr(\"x\", getCardX)\n .attr(\"width\", getCardWidth)\n .attr(\"y\", getCardY)\n .attr(\"height\", getCardHeight)\n .attr(\"rx\", cardRound)\n .attr(\"ry\", cardRound)\n .attr(\"class\", \"bordered status-heatmap-card\")\n .style(\"fill\", getCardColor)\n .style(\"stroke\", getCardColor)\n .style(\"stroke-width\", 0)\n //.style(\"stroke-width\", getCardStrokeWidth)\n //.style(\"stroke-dasharray\", \"3,3\")\n .style(\"opacity\", getCardOpacity);\n\n let $cards = $heatmap.find(\".status-heatmap-card\");\n $cards.on(\"mouseenter\", (event) => {\n tooltip.mouseOverBucket = true;\n highlightCard(event);\n })\n .on(\"mouseleave\", (event) => {\n tooltip.mouseOverBucket = false;\n resetCardHighLight(event);\n });\n\n ctrl.events.emit('render-complete', {\n \"chartWidth\": chartWidth\n });\n }\n\n function highlightCard(event) {\n let color = d3.select(event.target).style(\"fill\");\n let highlightColor = d3.color(color).darker(2);\n let strokeColor = d3.color(color).brighter(4);\n let current_card = d3.select(event.target);\n tooltip.originalFillColor = color;\n current_card.style(\"fill\", highlightColor)\n .style(\"stroke\", strokeColor)\n .style(\"stroke-width\", 1);\n }\n\n function resetCardHighLight(event) {\n d3\n .select(event.target)\n .style(\"fill\", tooltip.originalFillColor)\n .style(\"stroke\", tooltip.originalFillColor)\n .style(\"stroke-width\", 0);\n }\n\n function getColorScale(maxValue, minValue = 0) {\n let colorScheme = _.find(ctrl.colorSchemes, {value: panel.color.colorScheme});\n let colorInterpolator = d3ScaleChromatic[colorScheme.value];\n let colorScaleInverted = colorScheme.invert === 'always' ||\n (colorScheme.invert === 'dark' && !contextSrv.user.lightTheme);\n\n if (maxValue == minValue)\n maxValue = minValue + 1;\n\n let start = colorScaleInverted ? maxValue : minValue;\n let end = colorScaleInverted ? minValue : maxValue;\n\n return d3.scaleSequential(colorInterpolator).domain([start, end]);\n }\n\n function setOpacityScale(maxValue) {\n if (panel.color.colorScale === 'linear') {\n opacityScale = d3.scaleLinear()\n .domain([0, maxValue])\n .range([0, 1]);\n } else if (panel.color.colorScale === 'sqrt') {\n opacityScale = d3.scalePow().exponent(panel.color.exponent)\n .domain([0, maxValue])\n .range([0, 1]);\n }\n }\n\n function getCardX(d) {\n let x;\n // cx is the center of the card. Card should be placed to the left.\n let cx = xScale(d.x);\n\n if (cx - cardWidth/2 < 0) {\n x = yAxisWidth + cardHSpacing/2;\n } else {\n x = yAxisWidth + cx - cardWidth/2;\n }\n\n return x;\n }\n\n // xScale returns card center. Adjust cardWidth in case of overlaping.\n function getCardWidth(d) {\n let w;\n let cx = xScale(d.x);\n\n if (cx < 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 - cardHSpacing/2) + cardWidth/2;\n w = cutted_width > 0 ? cutted_width : 0;\n } else if (chartWidth - cx < cardWidth/2) {\n // Cut card to the right to prevent overlay of right graph edge.\n w = cardWidth/2 + (chartWidth - cx - cardHSpacing/2);\n } else {\n w = cardWidth;\n }\n\n // Card width should be MIN_CARD_SIZE at least\n w = Math.max(w, MIN_CARD_SIZE);\n\n if (cardHSpacing == 0) {\n w = w+1;\n }\n\n return w;\n }\n\n function getCardY(d) {\n return yScale(d.y) + chartTop - cardHeight - cardVSpacing/2;\n }\n\n function getCardHeight(d) {\n let ys = yScale(d.y);\n let y = ys + chartTop - cardHeight - cardVSpacing/2;\n let h = cardHeight;\n\n // Cut card height to prevent overlay\n if (y < chartTop) {\n h = ys - cardVSpacing/2;\n } else if (ys > chartBottom) {\n h = chartBottom - y;\n } else if (y + cardHeight > chartBottom) {\n h = chartBottom - y;\n }\n\n // Height can't be more than chart height\n h = Math.min(h, chartHeight);\n // Card height should be MIN_CARD_SIZE at least\n h = Math.max(h, MIN_CARD_SIZE);\n\n if (cardVSpacing == 0) {\n h = h+1\n }\n\n return h;\n }\n\n function getCardColor(d) {\n if (panel.color.mode === 'opacity') {\n return panel.color.cardColor;\n } else if (panel.color.mode === 'spectrum') {\n return colorScale(d.value);\n } else if (panel.color.mode === 'discrete') {\n return ctrl.discreteHelper.getBucketColor(d.values);\n }\n }\n\n function getCardOpacity(d) {\n if (panel.nullPointMode === 'as empty' && d.value == null ) {\n return 0;\n }\n if (panel.color.mode === 'opacity') {\n return opacityScale(d.value);\n } else {\n return 1;\n }\n }\n\n function getCardStrokeWidth(d) {\n if (panel.color.mode === 'discrete') {\n return '1';\n }\n return '0';\n }\n\n /////////////////////////////\n // Selection and crosshair //\n /////////////////////////////\n\n // Shared crosshair and tooltip\n appEvents.on('graph-hover', event => {\n drawSharedCrosshair(event.pos);\n }, scope);\n\n appEvents.on('graph-hover-clear', () => {\n clearCrosshair();\n }, scope);\n\n function onMouseDown(event) {\n selection.active = true;\n selection.x1 = event.offsetX;\n\n mouseUpHandler = function() {\n onMouseUp();\n };\n\n $(document).one(\"mouseup\", mouseUpHandler);\n }\n\n function onMouseUp() {\n $(document).unbind(\"mouseup\", mouseUpHandler);\n mouseUpHandler = null;\n selection.active = false;\n\n let selectionRange = Math.abs(selection.x2 - selection.x1);\n if (selection.x2 >= 0 && selectionRange > MIN_SELECTION_WIDTH) {\n let timeFrom = xScale.invert(Math.min(selection.x1, selection.x2) - yAxisWidth - xGridSize/2);\n let timeTo = xScale.invert(Math.max(selection.x1, selection.x2) - yAxisWidth - xGridSize/2);\n\n ctrl.timeSrv.setTime({\n from: moment.utc(timeFrom),\n to: moment.utc(timeTo)\n });\n }\n\n clearSelection();\n }\n\n function onMouseLeave() {\n appEvents.emit('graph-hover-clear');\n clearCrosshair();\n }\n\n function onMouseMove(event) {\n if (!heatmap) { return; }\n\n if (selection.active) {\n // Clear crosshair and tooltip\n clearCrosshair();\n tooltip.destroy();\n\n selection.x2 = limitSelection(event.offsetX);\n drawSelection(selection.x1, selection.x2);\n } else {\n emitGraphHoverEvet(event);\n drawCrosshair(event.offsetX);\n tooltip.show(event); //, data);\n }\n }\n\n function emitGraphHoverEvet(event) {\n let x = xScale.invert(event.offsetX - yAxisWidth - xGridSize/2).valueOf();\n let y = 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: null\n };\n\n // Set minimum offset to prevent showing legend from another panel\n pos.panelRelY = Math.max(event.offsetY / height, 0.001);\n\n // broadcast to other graph panels that we are hovering\n appEvents.emit('graph-hover', {pos: pos, panel: panel});\n }\n\n function limitSelection(x2) {\n x2 = Math.max(x2, yAxisWidth);\n x2 = Math.min(x2, chartWidth + yAxisWidth);\n return x2;\n }\n\n function drawSelection(posX1, posX2) {\n if (heatmap) {\n 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 heatmap.append(\"rect\")\n .attr(\"class\", \"status-heatmap-selection\")\n .attr(\"x\", selectionX)\n .attr(\"width\", selectionWidth)\n .attr(\"y\", chartTop)\n .attr(\"height\", chartHeight);\n }\n }\n }\n\n function clearSelection() {\n selection.x1 = -1;\n selection.x2 = -1;\n\n if (heatmap) {\n heatmap.selectAll(\".status-heatmap-selection\").remove();\n }\n }\n\n function drawCrosshair(position) {\n if (heatmap) {\n heatmap.selectAll(\".status-heatmap-crosshair\").remove();\n\n let posX = position;\n posX = Math.max(posX, yAxisWidth);\n posX = Math.min(posX, chartWidth + yAxisWidth);\n\n 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\", chartTop)\n .attr(\"x2\", 1)\n .attr(\"y2\", chartBottom)\n .attr(\"stroke-width\", 1);\n }\n }\n\n // map time to X\n function drawSharedCrosshair(pos) {\n if (heatmap && ctrl.dashboard.graphTooltip !== 0) {\n let posX = xScale(pos.x) + yAxisWidth;\n drawCrosshair(posX);\n }\n }\n\n function clearCrosshair() {\n if (heatmap) {\n heatmap.selectAll(\".status-heatmap-crosshair\").remove();\n }\n }\n\n function render() {\n data = ctrl.data;\n panel = ctrl.panel;\n timeRange = ctrl.range;\n cardsData = ctrl.cardsData;\n\n if (!data || !cardsData || !setElementHeight()) {\n return;\n }\n\n // Draw default axes and return if no data\n if (_.isEmpty(cardsData.cards)) {\n addHeatmapCanvas();\n return;\n }\n\n addHeatmap();\n scope.yAxisWidth = yAxisWidth;\n scope.xAxisHeight = xAxisHeight;\n scope.chartHeight = chartHeight;\n scope.chartWidth = chartWidth;\n scope.chartTop = chartTop;\n }\n\n // Register selection listeners\n $heatmap.on(\"mousedown\", onMouseDown);\n $heatmap.on(\"mousemove\", onMouseMove);\n $heatmap.on(\"mouseleave\", onMouseLeave);\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"]} \ No newline at end of file diff --git a/src/color_legend.js b/src/color_legend.js index c232ba0..83938f7 100644 --- a/src/color_legend.js +++ b/src/color_legend.js @@ -8,7 +8,7 @@ import {tickStep} from 'app/core/utils/ticks'; let mod = angular.module('grafana.directives'); -const MIN_LEGEND_STEPS = 10; +const LEGEND_STEP_WIDTH = 2; /** * Color legend for heatmap editor. @@ -62,6 +62,9 @@ mod.directive('statusHeatmapLegend', function() { function render() { clearLegend(elem); + if (!ctrl.panel.legend.show) { + return + } if (!_.isEmpty(ctrl.cardsData) && !_.isEmpty(ctrl.cardsData.cards)) { let rangeFrom = ctrl.cardsData.minValue; let rangeTo = ctrl.cardsData.maxValue; @@ -92,25 +95,30 @@ function drawColorLegend(elem, colorScheme, rangeFrom, rangeTo, maxValue, minVal let legendWidth = Math.floor(legendElem.outerWidth()) - 30; // narrow legendWidth by 30px to get space for first and last tick values let legendHeight = legendElem.attr("height"); - let rangeStep = 1; - if (rangeTo - rangeFrom > legendWidth) { - rangeStep = Math.floor((rangeTo - rangeFrom) / legendWidth); - } - - if (rangeStep * MIN_LEGEND_STEPS > rangeTo) { - rangeStep = rangeTo / MIN_LEGEND_STEPS; - } - + let rangeStep = (rangeTo - rangeFrom) / (legendWidth/LEGEND_STEP_WIDTH); + // width in pixels in legend space of unit segment in range space + // rangeStep * witdhFactor == width in pixels of one rangeStep let widthFactor = legendWidth / (rangeTo - rangeFrom); let valuesRange = d3.range(rangeFrom, rangeTo, rangeStep); + // console.debug({ + // "rangeStep": rangeStep, + // "widthFactor": widthFactor, + // "legendWidth": legendWidth, + // "steps": (rangeTo - rangeFrom)/rangeStep, + // }); + // console.debug(valuesRange); + let colorScale = getColorScale(colorScheme, maxValue, minValue); legend.selectAll(".status-heatmap-color-legend-rect") .data(valuesRange) .enter().append("rect") - .attr("x", d => d * widthFactor + 10) // shift all color rectangles to the right + // translate from range space into pixels + // and shift all rectangles to the right by 10 + .attr("x", d => d * widthFactor+10) .attr("y", 0) - .attr("width", rangeStep * widthFactor + 1) // Overlap rectangles to prevent gaps + // rectangles are slightly overlaped to prevent gaps + .attr("width", LEGEND_STEP_WIDTH+1) .attr("height", legendHeight) .attr("stroke-width", 0) .attr("fill", d => colorScale(d)); @@ -126,22 +134,22 @@ function drawOpacityLegend(elem, options, rangeFrom, rangeTo, maxValue, minValue let legendWidth = Math.floor(legendElem.outerWidth()) - 30; // narrow legendWidth by 30px to get space for first and last tick values let legendHeight = legendElem.attr("height"); - let rangeStep = 10; + let rangeStep = (rangeTo - rangeFrom) / (legendWidth/LEGEND_STEP_WIDTH); + // width in pixels in legend space of unit segment in range space + // rangeStep * witdhFactor == width in pixels of one rangeStep let widthFactor = legendWidth / (rangeTo - rangeFrom); - - if (rangeStep * MIN_LEGEND_STEPS > rangeTo) { - rangeStep = rangeTo / MIN_LEGEND_STEPS; - } - let valuesRange = d3.range(rangeFrom, rangeTo, rangeStep); let opacityScale = getOpacityScale(options, maxValue, minValue); legend.selectAll(".status-heatmap-opacity-legend-rect") .data(valuesRange) .enter().append("rect") - .attr("x", d => d * widthFactor + 10) // shift all opacity rectangles to the right + // translate from range space into pixels + // and shift all rectangles to the right by 10 + .attr("x", d => d * widthFactor+10) .attr("y", 0) - .attr("width", rangeStep * widthFactor) + // rectangles are slightly overlaped to prevent gaps + .attr("width", LEGEND_STEP_WIDTH+1) .attr("height", legendHeight) .attr("stroke-width", 0) .attr("fill", options.cardColor) @@ -289,23 +297,21 @@ function drawDiscreteLegendValues(elem, colorOptions, legendWidth) { function drawSimpleColorLegend(elem, colorScale) { let legendElem = $(elem).find('svg'); + let legend = d3.select(legendElem.get(0)); clearLegend(elem); let legendWidth = Math.floor(legendElem.outerWidth()); let legendHeight = legendElem.attr("height"); if (legendWidth) { - let valuesNumber = Math.floor(legendWidth / 2); - let rangeStep = Math.floor(legendWidth / valuesNumber); - let valuesRange = d3.range(0, legendWidth, rangeStep); + let valuesRange = d3.range(0, legendWidth, LEGEND_STEP_WIDTH); - let legend = d3.select(legendElem.get(0)); - var legendRects = legend.selectAll(".status-heatmap-color-legend-rect").data(valuesRange); - - legendRects.enter().append("rect") + legend.selectAll(".status-heatmap-color-legend-rect") + .data(valuesRange) + .enter().append("rect") .attr("x", d => d) .attr("y", 0) - .attr("width", rangeStep + 1) // Overlap rectangles to prevent gaps + .attr("width", LEGEND_STEP_WIDTH + 1) // Overlap rectangles to prevent gaps .attr("height", legendHeight) .attr("stroke-width", 0) .attr("fill", d => colorScale(d)); @@ -314,10 +320,9 @@ function drawSimpleColorLegend(elem, colorScale) { function drawSimpleOpacityLegend(elem, options) { let legendElem = $(elem).find('svg'); - let graphElem = $(elem); + let legend = d3.select(legendElem.get(0)); clearLegend(elem); - let legend = d3.select(legendElem.get(0)); let legendWidth = Math.floor(legendElem.outerWidth()); let legendHeight = legendElem.attr("height"); @@ -333,14 +338,14 @@ function drawSimpleOpacityLegend(elem, options) { .range([0, 1]); } - let rangeStep = 10; - let valuesRange = d3.range(0, legendWidth, rangeStep); - var legendRects = legend.selectAll(".status-heatmap-opacity-legend-rect").data(valuesRange); + let valuesRange = d3.range(0, legendWidth, LEGEND_STEP_WIDTH); - legendRects.enter().append("rect") + legend.selectAll(".status-heatmap-opacity-legend-rect") + .data(valuesRange) + .enter().append("rect") .attr("x", d => d) .attr("y", 0) - .attr("width", rangeStep) + .attr("width", LEGEND_STEP_WIDTH+1) .attr("height", legendHeight) .attr("stroke-width", 0) .attr("fill", options.cardColor) diff --git a/src/css/_statusmap.scss b/src/css/_statusmap.scss index 2382457..248b57d 100644 --- a/src/css/_statusmap.scss +++ b/src/css/_statusmap.scss @@ -2,6 +2,11 @@ // position: relative; cursor: crosshair; + // allow tooltips on hover of warning text + .datapoints-warning { + pointer-events: none; + } + .datapoints-warning span { background-color: $warning-bg; color: $text-color; diff --git a/src/module.html b/src/module.html index dd55b5f..a649b27 100644 --- a/src/module.html +++ b/src/module.html @@ -1,7 +1,7 @@
-
+
{{ctrl.dataWarnings.multipleValues.title}} {{ctrl.dataWarnings.noColorDefined.title}}
diff --git a/src/partials/options_editor.html b/src/partials/options_editor.html index 148e3c1..45563e6 100644 --- a/src/partials/options_editor.html +++ b/src/partials/options_editor.html @@ -190,7 +190,7 @@
- +
diff --git a/src/rendering.js b/src/rendering.js index 9dae95d..0402c12 100644 --- a/src/rendering.js +++ b/src/rendering.js @@ -394,6 +394,10 @@ export default function link(scope, elem, attrs, ctrl) { // Card width should be MIN_CARD_SIZE at least w = Math.max(w, MIN_CARD_SIZE); + if (cardHSpacing == 0) { + w = w+1; + } + return w; } @@ -420,6 +424,10 @@ export default function link(scope, elem, attrs, ctrl) { // Card height should be MIN_CARD_SIZE at least h = Math.max(h, MIN_CARD_SIZE); + if (cardVSpacing == 0) { + h = h+1 + } + return h; }