From 18574c3fa14309f5e9bf9f78bccdab49b877b660 Mon Sep 17 00:00:00 2001 From: Joaquin Jimenez Garcia Date: Tue, 14 Jan 2020 13:48:20 +0100 Subject: [PATCH] Created a new tooltip when click in a value to have different external links. Which links can be created with values from the series. --- README.md | 28 ++++ dist/README.md | 28 ++++ dist/color_legend.js | 6 +- dist/color_legend.js.map | 2 +- dist/color_mode_discrete.js | 58 ++++++- dist/color_mode_discrete.js.map | 2 +- dist/css/statusmap.dark.css | 28 +++- dist/css/statusmap.dark.css.map | 2 +- dist/css/statusmap.light.css | 28 +++- dist/css/statusmap.light.css.map | 2 +- dist/extra_series_format.js | 28 ++++ dist/extra_series_format.js.map | 1 + dist/img/tooltip-editor.png | Bin 0 -> 34584 bytes dist/img/tooltip-url.png | Bin 0 -> 10403 bytes dist/module.js | 127 ++++++++++++++-- dist/module.js.map | 2 +- dist/partials/options_editor.html | 98 +++++++++++- dist/rendering.js | 37 ++++- dist/rendering.js.map | 2 +- dist/statusmap_data.js | 2 + dist/statusmap_data.js.map | 2 +- dist/tooltip.js | 10 +- dist/tooltip.js.map | 2 +- dist/tooltipextraseries.js | 242 ++++++++++++++++++++++++++++++ dist/tooltipextraseries.js.map | 1 + src/color_legend.ts | 6 +- src/color_mode_discrete.ts | 53 ++++++- src/css/_statusmap.scss | 31 +++- src/extra_series_format.ts | 9 ++ src/img/tooltip-editor.png | Bin 0 -> 34584 bytes src/img/tooltip-url.png | Bin 0 -> 10403 bytes src/module.ts | 105 +++++++++++-- src/partials/options_editor.html | 98 +++++++++++- src/rendering.ts | 28 +++- src/statusmap_data.ts | 1 + src/tooltip.ts | 11 +- src/tooltipextraseries.ts | 222 +++++++++++++++++++++++++++ tsconfig.json | 2 +- 38 files changed, 1241 insertions(+), 63 deletions(-) create mode 100644 dist/extra_series_format.js create mode 100644 dist/extra_series_format.js.map create mode 100644 dist/img/tooltip-editor.png create mode 100644 dist/img/tooltip-url.png create mode 100644 dist/tooltipextraseries.js create mode 100644 dist/tooltipextraseries.js.map create mode 100644 src/extra_series_format.ts create mode 100644 src/img/tooltip-editor.png create mode 100644 src/img/tooltip-url.png create mode 100644 src/tooltipextraseries.ts diff --git a/README.md b/README.md index f65e570..2f9f6a4 100644 --- a/README.md +++ b/README.md @@ -182,6 +182,34 @@ __Show tooltip__ toggles tooltip display on mouse over buckets. __Y axis sort__ can be used to sort labels on Y axis. Metrics — sort y labels as they are defined on Metrics tab. a→z and z→a sort labels descending or ascending in a [natural](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare) order. +#### Tooltip with external link +![Tooltip with external link](src/img/tooltip-url.png) + +A new tooltip that will appear when mouse click in a value showing one or more links to navigate. It can be configured in the options editor. Also it can be disabled to not appear. + +#### Tooltip editor +![Tooltip options](src/img/tooltip-editor.png) + +__Show Extra Series Tooltip when clicking elements__ toggles tooltip with links display on mouse click. + +__Add new URL__ creates a new form to add a new link + +__Remove all URLs__ removes all the urls created before + +__Label__ name to show in the link instead of the URL + +__URL__ URL to navigate + +__Icon__ icon to show next to the url + +__Force lowercase__ forces the url to be lowercase even if it is written in capital letters + +__Extra Series Completer__ toggles extra series to write the URL + +__Extra Series Index__ fields index to use its value on URL using $series_extra. Use -1 to disable it + +__Extra Series Date Format__ date format to transform extra herlper when its type is Date + ## Development To test and improve the plugin you can run Grafana instance in Docker using following command (in diff --git a/dist/README.md b/dist/README.md index f65e570..2f9f6a4 100644 --- a/dist/README.md +++ b/dist/README.md @@ -182,6 +182,34 @@ __Show tooltip__ toggles tooltip display on mouse over buckets. __Y axis sort__ can be used to sort labels on Y axis. Metrics — sort y labels as they are defined on Metrics tab. a→z and z→a sort labels descending or ascending in a [natural](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare) order. +#### Tooltip with external link +![Tooltip with external link](src/img/tooltip-url.png) + +A new tooltip that will appear when mouse click in a value showing one or more links to navigate. It can be configured in the options editor. Also it can be disabled to not appear. + +#### Tooltip editor +![Tooltip options](src/img/tooltip-editor.png) + +__Show Extra Series Tooltip when clicking elements__ toggles tooltip with links display on mouse click. + +__Add new URL__ creates a new form to add a new link + +__Remove all URLs__ removes all the urls created before + +__Label__ name to show in the link instead of the URL + +__URL__ URL to navigate + +__Icon__ icon to show next to the url + +__Force lowercase__ forces the url to be lowercase even if it is written in capital letters + +__Extra Series Completer__ toggles extra series to write the URL + +__Extra Series Index__ fields index to use its value on URL using $series_extra. Use -1 to disable it + +__Extra Series Date Format__ date format to transform extra herlper when its type is Date + ## Development To test and improve the plugin you can run Grafana instance in Docker using following command (in diff --git a/dist/color_legend.js b/dist/color_legend.js index a69fd66..35a4072 100644 --- a/dist/color_legend.js +++ b/dist/color_legend.js @@ -53,7 +53,7 @@ System.register(["lodash", "jquery", "d3", "./libs/d3-scale-chromatic/index", "a drawLegendValues(elem, opacityScale, rangeFrom, rangeTo, maxValue, minValue, legendWidth); } - function drawDiscreteColorLegend(elem, colorOptions, discreteHelper) { + function drawDiscreteColorLegend(elem, colorOptions, discreteExtraSeries) { var legendElem = $(elem).find('svg'); var legend = d3.select(legendElem.get(0)); clearLegend(elem); @@ -87,7 +87,7 @@ System.register(["lodash", "jquery", "d3", "./libs/d3-scale-chromatic/index", "a return d * itemWidth; }).attr("y", 0).attr("width", itemWidth + 1) // Overlap rectangles to prevent gaps .attr("height", legendHeight).attr("stroke-width", 0).attr("fill", function (d) { - return discreteHelper.getDiscreteColor(d); + return discreteExtraSeries.getDiscreteColor(d); }); drawDiscreteLegendValues(elem, colorOptions, legendWidth); } @@ -378,7 +378,7 @@ System.register(["lodash", "jquery", "d3", "./libs/d3-scale-chromatic/index", "a drawOpacityLegend(elem, colorOptions, rangeFrom, rangeTo, maxValue, minValue); } else if (panel.color.mode === 'discrete') { var _colorOptions = panel.color; - drawDiscreteColorLegend(elem, _colorOptions, ctrl.discreteHelper); + drawDiscreteColorLegend(elem, _colorOptions, ctrl.discreteExtraSeries); } } } diff --git a/dist/color_legend.js.map b/dist/color_legend.js.map index bbacfb5..1eade9b 100644 --- a/dist/color_legend.js.map +++ b/dist/color_legend.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/color_legend.ts"],"names":["drawColorLegend","elem","colorScheme","rangeFrom","rangeTo","maxValue","minValue","legendElem","$","find","legend","d3","select","get","clearLegend","legendWidth","Math","floor","outerWidth","legendHeight","attr","rangeStep","LEGEND_STEP_WIDTH","widthFactor","valuesRange","range","colorScale","getColorScale","selectAll","data","enter","append","d","drawLegendValues","drawOpacityLegend","options","opacityScale","getOpacityScale","cardColor","style","drawDiscreteColorLegend","colorOptions","discreteHelper","thresholds","tooltips","_","map","tr","tooltip","valuesNumber","length","$heatmap","parent","graphWidthAttr","graphWidth","parseInt","textWidth","text","each","i","thisWidth","getBBox","width","push","remove","min","max","itemWidth","getDiscreteColor","drawDiscreteLegendValues","childNodes","legendValueScale","scaleLinear","domain","ticks","buildLegendTicks","xAxis","axisBottom","tickValues","tickSize","colorRect","posY","getSvgElemHeight","posX","getSvgElemX","call","thresholdValues","thresholdTooltips","value","tickFormat","t","v","undefined","drawSimpleColorLegend","drawSimpleOpacityLegend","legendOpacityScale","scalePow","exponent","empty","colorInterpolator","d3ScaleChromatic","colorScaleInverted","invert","contextSrv","user","lightTheme","start","end","scaleSequential","svgElem","x","baseVal","height","tickStepSize","tickStep","ticksNum","round","current","isValueCloseTo","sortBy","uniq","val","valueTo","step","diff","abs","coreModule","directive","restrict","template","link","scope","attrs","ctrl","panel","render","events","on","color","mode","colorSchemes","show","isEmpty","cardsData","cards"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport $ from 'jquery';\nimport d3 from 'd3';\nimport * as d3ScaleChromatic from './libs/d3-scale-chromatic/index';\nimport {contextSrv} from 'app/core/core';\nimport {tickStep} from 'app/core/utils/ticks';\nimport coreModule from 'app/core/core_module';\n\nconst LEGEND_STEP_WIDTH = 2;\n\n/**\n * Bigger color legend for opacity and spectrum modes editor.\n */\ncoreModule.directive('optionsColorLegend', function() {\n return {\n restrict: 'E',\n template: '
',\n link: function(scope, elem, attrs) {\n let ctrl = scope.ctrl;\n let panel = scope.ctrl.panel;\n\n render();\n\n ctrl.events.on('render', function() {\n render();\n });\n\n function render() {\n let legendElem = $(elem).find('svg');\n let legendWidth = Math.floor(legendElem.outerWidth());\n\n if (panel.color.mode === 'spectrum') {\n let colorScheme = _.find(ctrl.colorSchemes, {value: panel.color.colorScheme});\n let colorScale = getColorScale(colorScheme, legendWidth);\n drawSimpleColorLegend(elem, colorScale);\n } else if (panel.color.mode === 'opacity') {\n let colorOptions = panel.color;\n drawSimpleOpacityLegend(elem, colorOptions);\n }\n }\n }\n };\n});\n\n/**\n * Graph legend with values.\n */\ncoreModule.directive('statusHeatmapLegend', function() {\n return {\n restrict: 'E',\n template: '
',\n link: function(scope, elem, attrs) {\n let ctrl = scope.ctrl;\n let panel = scope.ctrl.panel;\n\n render();\n ctrl.events.on('render', function() {\n render();\n });\n\n function render() {\n clearLegend(elem);\n if (!ctrl.panel.legend.show) {\n return \n }\n if (!_.isEmpty(ctrl.cardsData) && !_.isEmpty(ctrl.cardsData.cards)) {\n let rangeFrom = ctrl.cardsData.minValue;\n let rangeTo = ctrl.cardsData.maxValue;\n let maxValue = panel.color.max || rangeTo;\n let minValue = panel.color.min || rangeFrom;\n\n if (panel.color.mode === 'spectrum') {\n let colorScheme = _.find(ctrl.colorSchemes, {value: panel.color.colorScheme});\n drawColorLegend(elem, colorScheme, rangeFrom, rangeTo, maxValue, minValue);\n } else if (panel.color.mode === 'opacity') {\n let colorOptions = panel.color;\n drawOpacityLegend(elem, colorOptions, rangeFrom, rangeTo, maxValue, minValue);\n } else if (panel.color.mode === 'discrete') {\n let colorOptions = panel.color;\n drawDiscreteColorLegend(elem, colorOptions, ctrl.discreteHelper);\n }\n }\n }\n }\n };\n});\n\nfunction drawColorLegend(elem, colorScheme, rangeFrom, rangeTo, maxValue, minValue) {\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n clearLegend(elem);\n\n let legendWidth = Math.floor(legendElem.outerWidth()) - 30; // narrow legendWidth by 30px to get space for first and last tick values\n let legendHeight = legendElem.attr(\"height\");\n\n let rangeStep = (rangeTo - rangeFrom) / (legendWidth/LEGEND_STEP_WIDTH);\n // width in pixels in legend space of unit segment in range space\n // rangeStep * witdhFactor == width in pixels of one rangeStep\n let widthFactor = legendWidth / (rangeTo - rangeFrom);\n let valuesRange = d3.range(rangeFrom, rangeTo, rangeStep);\n\n let colorScale = getColorScale(colorScheme, maxValue, minValue);\n legend.selectAll(\".status-heatmap-color-legend-rect\")\n .data(valuesRange)\n .enter().append(\"rect\")\n // translate from range space into pixels\n // and shift all rectangles to the right by 10\n .attr(\"x\", d => d * widthFactor+10)\n .attr(\"y\", 0)\n // rectangles are slightly overlaped to prevent gaps\n .attr(\"width\", LEGEND_STEP_WIDTH+1)\n .attr(\"height\", legendHeight)\n .attr(\"stroke-width\", 0)\n .attr(\"fill\", d => colorScale(d));\n\n drawLegendValues(elem, colorScale, rangeFrom, rangeTo, maxValue, minValue, legendWidth);\n}\n\nfunction drawOpacityLegend(elem, options, rangeFrom, rangeTo, maxValue, minValue) {\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n clearLegend(elem);\n\n let legendWidth = Math.floor(legendElem.outerWidth()) - 30; // narrow legendWidth by 30px to get space for first and last tick values\n let legendHeight = legendElem.attr(\"height\");\n\n let rangeStep = (rangeTo - rangeFrom) / (legendWidth/LEGEND_STEP_WIDTH);\n // width in pixels in legend space of unit segment in range space\n // rangeStep * witdhFactor == width in pixels of one rangeStep\n let widthFactor = legendWidth / (rangeTo - rangeFrom);\n let valuesRange = d3.range(rangeFrom, rangeTo, rangeStep);\n\n let opacityScale = getOpacityScale(options, maxValue, minValue);\n legend.selectAll(\".status-heatmap-opacity-legend-rect\")\n .data(valuesRange)\n .enter().append(\"rect\")\n // translate from range space into pixels\n // and shift all rectangles to the right by 10\n .attr(\"x\", d => d * widthFactor+10)\n .attr(\"y\", 0)\n // rectangles are slightly overlaped to prevent gaps\n .attr(\"width\", LEGEND_STEP_WIDTH+1)\n .attr(\"height\", legendHeight)\n .attr(\"stroke-width\", 0)\n .attr(\"fill\", options.cardColor)\n .style(\"opacity\", d => opacityScale(d));\n\n drawLegendValues(elem, opacityScale, rangeFrom, rangeTo, maxValue, minValue, legendWidth);\n}\n\nfunction drawDiscreteColorLegend(elem, colorOptions, discreteHelper) {\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n clearLegend(elem);\n\n let thresholds = colorOptions.thresholds;\n let tooltips = _.map(thresholds, tr => tr.tooltip);\n let valuesNumber = thresholds.length;\n\n // graph width as a fallback\n const $heatmap = $(elem).parent().parent().parent().find('.status-heatmap-panel');\n const graphWidthAttr = $heatmap.find('svg').attr(\"width\");\n let graphWidth = parseInt(graphWidthAttr);\n\n\n // calculate max width of tooltip and use it as width for each item\n let textWidth:number[] = [];\n legend.selectAll(\".hidden-texts\")\n .data(tooltips)\n .enter().append(\"text\")\n .attr(\"class\", \"axis tick hidden-texts\")\n .attr(\"font-family\", \"sans-serif\")\n .text(d => d)\n .each(function(d,i) {\n let thisWidth = this.getBBox().width;\n textWidth.push(thisWidth);\n });\n legend.selectAll(\".hidden-texts\").remove();\n\n let legendWidth = Math.floor(_.min([\n graphWidth - 30,\n (_.max(textWidth)! + 3) * valuesNumber,\n ])!);\n legendElem.attr(\"width\", legendWidth);\n\n let legendHeight = legendElem.attr(\"height\");\n\n let itemWidth = Math.floor(legendWidth / valuesNumber);\n let valuesRange = d3.range(valuesNumber); // from 0 to valuesNumber-1\n\n legend.selectAll(\".status-heatmap-color-legend-rect\")\n .data(valuesRange)\n .enter().append(\"rect\")\n .attr(\"x\", d => d*itemWidth)\n .attr(\"y\", 0)\n .attr(\"width\", itemWidth + 1) // Overlap rectangles to prevent gaps\n .attr(\"height\", legendHeight)\n .attr(\"stroke-width\", 0)\n .attr(\"fill\", d => discreteHelper.getDiscreteColor(d));\n\n drawDiscreteLegendValues(elem, colorOptions, legendWidth);\n}\n\n\nfunction drawLegendValues(elem, colorScale, rangeFrom, rangeTo, maxValue, minValue, legendWidth) {\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n\n if (legendWidth <= 0 || legendElem.get(0).childNodes.length === 0) {\n return;\n }\n\n let legendValueScale = d3.scaleLinear()\n .domain([0, rangeTo])\n .range([0, legendWidth]);\n\n let ticks = buildLegendTicks(0, rangeTo, maxValue, minValue);\n let xAxis = d3.axisBottom(legendValueScale)\n .tickValues(ticks)\n .tickSize(2);\n\n let colorRect = legendElem.find(\":first-child\");\n let posY = getSvgElemHeight(legendElem) + 2;\n let posX = getSvgElemX(colorRect);\n\n d3.select(legendElem.get(0)).append(\"g\")\n .attr(\"class\", \"axis\")\n .attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\")\n .call(xAxis);\n\n legend.select(\".axis\").select(\".domain\").remove();\n}\n\nfunction drawDiscreteLegendValues(elem, colorOptions, legendWidth) {\n let thresholds = colorOptions.thresholds;\n\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n\n if (legendWidth <= 0 || legendElem.get(0).childNodes.length === 0) {\n return;\n }\n\n let valuesNumber = thresholds.length;\n let rangeStep = Math.floor(legendWidth / valuesNumber);\n let valuesRange = d3.range(0, legendWidth, rangeStep);\n\n\n let legendValueScale = d3.scaleLinear()\n .domain([0, valuesNumber])\n .range([0, legendWidth]);\n\n let thresholdValues = [];\n let thresholdTooltips = [];\n for (let i = 0; i < thresholds.length; i++) {\n thresholdValues.push(thresholds[i].value);\n thresholdTooltips.push(thresholds[i].tooltip);\n }\n\n let xAxis = d3.axisBottom(legendValueScale)\n .tickValues(d3.range(0, valuesNumber, 1)) //thresholdValues)\n .tickSize(2)\n .tickFormat((t) => {\n let i = Math.floor(t);\n let v = thresholdTooltips[i];\n if (v != undefined) {\n return \"\"+v;\n } else {\n v = thresholdValues[i];\n if (v != undefined) {\n return \"\"+v;\n } else {\n return \"n/a\";\n }\n }\n });\n\n let colorRect = legendElem.find(\":first-child\");\n let posY = getSvgElemHeight(legendElem) + 2;\n let posX = getSvgElemX(colorRect) + Math.floor(rangeStep/2);\n\n d3.select(legendElem.get(0)).append(\"g\")\n .attr(\"class\", \"axis\")\n .attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\")\n .call(xAxis);\n\n legend.select(\".axis\").select(\".domain\").remove();\n}\n\nfunction drawSimpleColorLegend(elem, colorScale) {\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n clearLegend(elem);\n\n let legendWidth = Math.floor(legendElem.outerWidth());\n let legendHeight = legendElem.attr(\"height\");\n\n if (legendWidth) {\n let valuesRange = d3.range(0, legendWidth, LEGEND_STEP_WIDTH);\n\n legend.selectAll(\".status-heatmap-color-legend-rect\")\n .data(valuesRange)\n .enter().append(\"rect\")\n .attr(\"x\", d => d)\n .attr(\"y\", 0)\n .attr(\"width\", LEGEND_STEP_WIDTH + 1) // Overlap rectangles to prevent gaps\n .attr(\"height\", legendHeight)\n .attr(\"stroke-width\", 0)\n .attr(\"fill\", d => colorScale(d));\n }\n}\n\nfunction drawSimpleOpacityLegend(elem, options) {\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n clearLegend(elem);\n\n let legendWidth = Math.floor(legendElem.outerWidth());\n let legendHeight = legendElem.attr(\"height\");\n\n if (legendWidth) {\n let legendOpacityScale;\n if (options.colorScale === 'linear') {\n legendOpacityScale = d3.scaleLinear()\n .domain([0, legendWidth])\n .range([0, 1]);\n } else if (options.colorScale === 'sqrt') {\n legendOpacityScale = d3.scalePow().exponent(options.exponent)\n .domain([0, legendWidth])\n .range([0, 1]);\n }\n\n let valuesRange = d3.range(0, legendWidth, LEGEND_STEP_WIDTH);\n\n legend.selectAll(\".status-heatmap-opacity-legend-rect\")\n .data(valuesRange)\n .enter().append(\"rect\")\n .attr(\"x\", d => d)\n .attr(\"y\", 0)\n .attr(\"width\", LEGEND_STEP_WIDTH+1)\n .attr(\"height\", legendHeight)\n .attr(\"stroke-width\", 0)\n .attr(\"fill\", options.cardColor)\n .style(\"opacity\", d => legendOpacityScale(d));\n }\n}\n\n\nfunction clearLegend(elem) {\n let legendElem = $(elem).find('svg');\n legendElem.empty();\n}\n\nfunction getColorScale(colorScheme, maxValue, minValue = 0) {\n let colorInterpolator = d3ScaleChromatic[colorScheme.value];\n let colorScaleInverted = colorScheme.invert === 'always' ||\n (colorScheme.invert === 'dark' && !contextSrv.user.lightTheme);\n\n let start = colorScaleInverted ? maxValue : minValue;\n let end = colorScaleInverted ? minValue : maxValue;\n\n return d3.scaleSequential(colorInterpolator).domain([start, end]);\n}\n\nfunction getOpacityScale(options, maxValue, minValue = 0) {\n let legendOpacityScale;\n if (options.colorScale === 'linear') {\n legendOpacityScale = d3.scaleLinear()\n .domain([minValue, maxValue])\n .range([0, 1]);\n } else if (options.colorScale === 'sqrt') {\n legendOpacityScale = d3.scalePow().exponent(options.exponent)\n .domain([minValue, maxValue])\n .range([0, 1]);\n }\n return legendOpacityScale;\n}\n\nfunction getSvgElemX(elem) {\n let svgElem = elem.get(0);\n if (svgElem && svgElem.x && svgElem.x.baseVal) {\n return svgElem.x.baseVal.value;\n } else {\n return 0;\n }\n}\n\nfunction getSvgElemHeight(elem) {\n let svgElem = elem.get(0);\n if (svgElem && svgElem.height && svgElem.height.baseVal) {\n return svgElem.height.baseVal.value;\n } else {\n return 0;\n }\n}\n\nfunction buildLegendTicks(rangeFrom, rangeTo, maxValue, minValue) {\n let range = rangeTo - rangeFrom;\n let tickStepSize = tickStep(rangeFrom, rangeTo, 3);\n let ticksNum = Math.round(range / tickStepSize);\n let ticks:any = [];\n\n for (let i = 0; i < ticksNum; i++) {\n let current = tickStepSize * i;\n // Add user-defined min and max if it had been set\n if (isValueCloseTo(minValue, current, tickStepSize)) {\n ticks.push(minValue);\n continue;\n } else if (minValue < current) {\n ticks.push(minValue);\n }\n if (isValueCloseTo(maxValue, current, tickStepSize)) {\n ticks.push(maxValue);\n continue;\n } else if (maxValue < current) {\n ticks.push(maxValue);\n }\n ticks.push(tickStepSize * i);\n }\n if (!isValueCloseTo(maxValue, rangeTo, tickStepSize)) {\n ticks.push(maxValue);\n }\n ticks.push(rangeTo);\n ticks = _.sortBy(_.uniq(ticks));\n return ticks;\n}\n\nfunction isValueCloseTo(val, valueTo, step) {\n let diff = Math.abs(val - valueTo);\n return diff < step * 0.3;\n}\n"],"file":"color_legend.js"} \ No newline at end of file +{"version":3,"sources":["../src/color_legend.ts"],"names":["drawColorLegend","elem","colorScheme","rangeFrom","rangeTo","maxValue","minValue","legendElem","$","find","legend","d3","select","get","clearLegend","legendWidth","Math","floor","outerWidth","legendHeight","attr","rangeStep","LEGEND_STEP_WIDTH","widthFactor","valuesRange","range","colorScale","getColorScale","selectAll","data","enter","append","d","drawLegendValues","drawOpacityLegend","options","opacityScale","getOpacityScale","cardColor","style","drawDiscreteColorLegend","colorOptions","discreteExtraSeries","thresholds","tooltips","_","map","tr","tooltip","valuesNumber","length","$heatmap","parent","graphWidthAttr","graphWidth","parseInt","textWidth","text","each","i","thisWidth","getBBox","width","push","remove","min","max","itemWidth","getDiscreteColor","drawDiscreteLegendValues","childNodes","legendValueScale","scaleLinear","domain","ticks","buildLegendTicks","xAxis","axisBottom","tickValues","tickSize","colorRect","posY","getSvgElemHeight","posX","getSvgElemX","call","thresholdValues","thresholdTooltips","value","tickFormat","t","v","undefined","drawSimpleColorLegend","drawSimpleOpacityLegend","legendOpacityScale","scalePow","exponent","empty","colorInterpolator","d3ScaleChromatic","colorScaleInverted","invert","contextSrv","user","lightTheme","start","end","scaleSequential","svgElem","x","baseVal","height","tickStepSize","tickStep","ticksNum","round","current","isValueCloseTo","sortBy","uniq","val","valueTo","step","diff","abs","coreModule","directive","restrict","template","link","scope","attrs","ctrl","panel","render","events","on","color","mode","colorSchemes","show","isEmpty","cardsData","cards"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport $ from 'jquery';\nimport d3 from 'd3';\nimport * as d3ScaleChromatic from './libs/d3-scale-chromatic/index';\nimport {contextSrv} from 'app/core/core';\nimport {tickStep} from 'app/core/utils/ticks';\nimport coreModule from 'app/core/core_module';\n\nconst LEGEND_STEP_WIDTH = 2;\n\n/**\n * Bigger color legend for opacity and spectrum modes editor.\n */\ncoreModule.directive('optionsColorLegend', function() {\n return {\n restrict: 'E',\n template: '
',\n link: function(scope, elem, attrs) {\n let ctrl = scope.ctrl;\n let panel = scope.ctrl.panel;\n\n render();\n\n ctrl.events.on('render', function() {\n render();\n });\n\n function render() {\n let legendElem = $(elem).find('svg');\n let legendWidth = Math.floor(legendElem.outerWidth());\n\n if (panel.color.mode === 'spectrum') {\n let colorScheme = _.find(ctrl.colorSchemes, {value: panel.color.colorScheme});\n let colorScale = getColorScale(colorScheme, legendWidth);\n drawSimpleColorLegend(elem, colorScale);\n } else if (panel.color.mode === 'opacity') {\n let colorOptions = panel.color;\n drawSimpleOpacityLegend(elem, colorOptions);\n }\n }\n }\n };\n});\n\n/**\n * Graph legend with values.\n */\ncoreModule.directive('statusHeatmapLegend', function() {\n return {\n restrict: 'E',\n template: '
',\n link: function(scope, elem, attrs) {\n let ctrl = scope.ctrl;\n let panel = scope.ctrl.panel;\n\n render();\n ctrl.events.on('render', function() {\n render();\n });\n\n function render() {\n clearLegend(elem);\n if (!ctrl.panel.legend.show) {\n return \n }\n if (!_.isEmpty(ctrl.cardsData) && !_.isEmpty(ctrl.cardsData.cards)) {\n let rangeFrom = ctrl.cardsData.minValue;\n let rangeTo = ctrl.cardsData.maxValue;\n let maxValue = panel.color.max || rangeTo;\n let minValue = panel.color.min || rangeFrom;\n\n if (panel.color.mode === 'spectrum') {\n let colorScheme = _.find(ctrl.colorSchemes, {value: panel.color.colorScheme});\n drawColorLegend(elem, colorScheme, rangeFrom, rangeTo, maxValue, minValue);\n } else if (panel.color.mode === 'opacity') {\n let colorOptions = panel.color;\n drawOpacityLegend(elem, colorOptions, rangeFrom, rangeTo, maxValue, minValue);\n } else if (panel.color.mode === 'discrete') {\n let colorOptions = panel.color;\n drawDiscreteColorLegend(elem, colorOptions, ctrl.discreteExtraSeries);\n }\n }\n }\n }\n };\n});\n\nfunction drawColorLegend(elem, colorScheme, rangeFrom, rangeTo, maxValue, minValue) {\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n clearLegend(elem);\n\n let legendWidth = Math.floor(legendElem.outerWidth()) - 30; // narrow legendWidth by 30px to get space for first and last tick values\n let legendHeight = legendElem.attr(\"height\");\n\n let rangeStep = (rangeTo - rangeFrom) / (legendWidth/LEGEND_STEP_WIDTH);\n // width in pixels in legend space of unit segment in range space\n // rangeStep * witdhFactor == width in pixels of one rangeStep\n let widthFactor = legendWidth / (rangeTo - rangeFrom);\n let valuesRange = d3.range(rangeFrom, rangeTo, rangeStep);\n\n let colorScale = getColorScale(colorScheme, maxValue, minValue);\n legend.selectAll(\".status-heatmap-color-legend-rect\")\n .data(valuesRange)\n .enter().append(\"rect\")\n // translate from range space into pixels\n // and shift all rectangles to the right by 10\n .attr(\"x\", d => d * widthFactor+10)\n .attr(\"y\", 0)\n // rectangles are slightly overlaped to prevent gaps\n .attr(\"width\", LEGEND_STEP_WIDTH+1)\n .attr(\"height\", legendHeight)\n .attr(\"stroke-width\", 0)\n .attr(\"fill\", d => colorScale(d));\n\n drawLegendValues(elem, colorScale, rangeFrom, rangeTo, maxValue, minValue, legendWidth);\n}\n\nfunction drawOpacityLegend(elem, options, rangeFrom, rangeTo, maxValue, minValue) {\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n clearLegend(elem);\n\n let legendWidth = Math.floor(legendElem.outerWidth()) - 30; // narrow legendWidth by 30px to get space for first and last tick values\n let legendHeight = legendElem.attr(\"height\");\n\n let rangeStep = (rangeTo - rangeFrom) / (legendWidth/LEGEND_STEP_WIDTH);\n // width in pixels in legend space of unit segment in range space\n // rangeStep * witdhFactor == width in pixels of one rangeStep\n let widthFactor = legendWidth / (rangeTo - rangeFrom);\n let valuesRange = d3.range(rangeFrom, rangeTo, rangeStep);\n\n let opacityScale = getOpacityScale(options, maxValue, minValue);\n legend.selectAll(\".status-heatmap-opacity-legend-rect\")\n .data(valuesRange)\n .enter().append(\"rect\")\n // translate from range space into pixels\n // and shift all rectangles to the right by 10\n .attr(\"x\", d => d * widthFactor+10)\n .attr(\"y\", 0)\n // rectangles are slightly overlaped to prevent gaps\n .attr(\"width\", LEGEND_STEP_WIDTH+1)\n .attr(\"height\", legendHeight)\n .attr(\"stroke-width\", 0)\n .attr(\"fill\", options.cardColor)\n .style(\"opacity\", d => opacityScale(d));\n\n drawLegendValues(elem, opacityScale, rangeFrom, rangeTo, maxValue, minValue, legendWidth);\n}\n\nfunction drawDiscreteColorLegend(elem, colorOptions, discreteExtraSeries) {\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n clearLegend(elem);\n\n let thresholds = colorOptions.thresholds;\n let tooltips = _.map(thresholds, tr => tr.tooltip);\n let valuesNumber = thresholds.length;\n\n // graph width as a fallback\n const $heatmap = $(elem).parent().parent().parent().find('.status-heatmap-panel');\n const graphWidthAttr = $heatmap.find('svg').attr(\"width\");\n let graphWidth = parseInt(graphWidthAttr);\n\n\n // calculate max width of tooltip and use it as width for each item\n let textWidth:number[] = [];\n legend.selectAll(\".hidden-texts\")\n .data(tooltips)\n .enter().append(\"text\")\n .attr(\"class\", \"axis tick hidden-texts\")\n .attr(\"font-family\", \"sans-serif\")\n .text(d => d)\n .each(function(d,i) {\n let thisWidth = this.getBBox().width;\n textWidth.push(thisWidth);\n });\n legend.selectAll(\".hidden-texts\").remove();\n\n let legendWidth = Math.floor(_.min([\n graphWidth - 30,\n (_.max(textWidth)! + 3) * valuesNumber,\n ])!);\n legendElem.attr(\"width\", legendWidth);\n\n let legendHeight = legendElem.attr(\"height\");\n\n let itemWidth = Math.floor(legendWidth / valuesNumber);\n let valuesRange = d3.range(valuesNumber); // from 0 to valuesNumber-1\n\n legend.selectAll(\".status-heatmap-color-legend-rect\")\n .data(valuesRange)\n .enter().append(\"rect\")\n .attr(\"x\", d => d*itemWidth)\n .attr(\"y\", 0)\n .attr(\"width\", itemWidth + 1) // Overlap rectangles to prevent gaps\n .attr(\"height\", legendHeight)\n .attr(\"stroke-width\", 0)\n .attr(\"fill\", d => discreteExtraSeries.getDiscreteColor(d));\n\n drawDiscreteLegendValues(elem, colorOptions, legendWidth);\n}\n\n\nfunction drawLegendValues(elem, colorScale, rangeFrom, rangeTo, maxValue, minValue, legendWidth) {\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n\n if (legendWidth <= 0 || legendElem.get(0).childNodes.length === 0) {\n return;\n }\n\n let legendValueScale = d3.scaleLinear()\n .domain([0, rangeTo])\n .range([0, legendWidth]);\n\n let ticks = buildLegendTicks(0, rangeTo, maxValue, minValue);\n let xAxis = d3.axisBottom(legendValueScale)\n .tickValues(ticks)\n .tickSize(2);\n\n let colorRect = legendElem.find(\":first-child\");\n let posY = getSvgElemHeight(legendElem) + 2;\n let posX = getSvgElemX(colorRect);\n\n d3.select(legendElem.get(0)).append(\"g\")\n .attr(\"class\", \"axis\")\n .attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\")\n .call(xAxis);\n\n legend.select(\".axis\").select(\".domain\").remove();\n}\n\nfunction drawDiscreteLegendValues(elem, colorOptions, legendWidth) {\n let thresholds = colorOptions.thresholds;\n\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n\n if (legendWidth <= 0 || legendElem.get(0).childNodes.length === 0) {\n return;\n }\n\n let valuesNumber = thresholds.length;\n let rangeStep = Math.floor(legendWidth / valuesNumber);\n let valuesRange = d3.range(0, legendWidth, rangeStep);\n\n\n let legendValueScale = d3.scaleLinear()\n .domain([0, valuesNumber])\n .range([0, legendWidth]);\n\n let thresholdValues = [];\n let thresholdTooltips = [];\n for (let i = 0; i < thresholds.length; i++) {\n thresholdValues.push(thresholds[i].value);\n thresholdTooltips.push(thresholds[i].tooltip);\n }\n\n let xAxis = d3.axisBottom(legendValueScale)\n .tickValues(d3.range(0, valuesNumber, 1)) //thresholdValues)\n .tickSize(2)\n .tickFormat((t) => {\n let i = Math.floor(t);\n let v = thresholdTooltips[i];\n if (v != undefined) {\n return \"\"+v;\n } else {\n v = thresholdValues[i];\n if (v != undefined) {\n return \"\"+v;\n } else {\n return \"n/a\";\n }\n }\n });\n\n let colorRect = legendElem.find(\":first-child\");\n let posY = getSvgElemHeight(legendElem) + 2;\n let posX = getSvgElemX(colorRect) + Math.floor(rangeStep/2);\n\n d3.select(legendElem.get(0)).append(\"g\")\n .attr(\"class\", \"axis\")\n .attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\")\n .call(xAxis);\n\n legend.select(\".axis\").select(\".domain\").remove();\n}\n\nfunction drawSimpleColorLegend(elem, colorScale) {\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n clearLegend(elem);\n\n let legendWidth = Math.floor(legendElem.outerWidth());\n let legendHeight = legendElem.attr(\"height\");\n\n if (legendWidth) {\n let valuesRange = d3.range(0, legendWidth, LEGEND_STEP_WIDTH);\n\n legend.selectAll(\".status-heatmap-color-legend-rect\")\n .data(valuesRange)\n .enter().append(\"rect\")\n .attr(\"x\", d => d)\n .attr(\"y\", 0)\n .attr(\"width\", LEGEND_STEP_WIDTH + 1) // Overlap rectangles to prevent gaps\n .attr(\"height\", legendHeight)\n .attr(\"stroke-width\", 0)\n .attr(\"fill\", d => colorScale(d));\n }\n}\n\nfunction drawSimpleOpacityLegend(elem, options) {\n let legendElem = $(elem).find('svg');\n let legend = d3.select(legendElem.get(0));\n clearLegend(elem);\n\n let legendWidth = Math.floor(legendElem.outerWidth());\n let legendHeight = legendElem.attr(\"height\");\n\n if (legendWidth) {\n let legendOpacityScale;\n if (options.colorScale === 'linear') {\n legendOpacityScale = d3.scaleLinear()\n .domain([0, legendWidth])\n .range([0, 1]);\n } else if (options.colorScale === 'sqrt') {\n legendOpacityScale = d3.scalePow().exponent(options.exponent)\n .domain([0, legendWidth])\n .range([0, 1]);\n }\n\n let valuesRange = d3.range(0, legendWidth, LEGEND_STEP_WIDTH);\n\n legend.selectAll(\".status-heatmap-opacity-legend-rect\")\n .data(valuesRange)\n .enter().append(\"rect\")\n .attr(\"x\", d => d)\n .attr(\"y\", 0)\n .attr(\"width\", LEGEND_STEP_WIDTH+1)\n .attr(\"height\", legendHeight)\n .attr(\"stroke-width\", 0)\n .attr(\"fill\", options.cardColor)\n .style(\"opacity\", d => legendOpacityScale(d));\n }\n}\n\n\nfunction clearLegend(elem) {\n let legendElem = $(elem).find('svg');\n legendElem.empty();\n}\n\nfunction getColorScale(colorScheme, maxValue, minValue = 0) {\n let colorInterpolator = d3ScaleChromatic[colorScheme.value];\n let colorScaleInverted = colorScheme.invert === 'always' ||\n (colorScheme.invert === 'dark' && !contextSrv.user.lightTheme);\n\n let start = colorScaleInverted ? maxValue : minValue;\n let end = colorScaleInverted ? minValue : maxValue;\n\n return d3.scaleSequential(colorInterpolator).domain([start, end]);\n}\n\nfunction getOpacityScale(options, maxValue, minValue = 0) {\n let legendOpacityScale;\n if (options.colorScale === 'linear') {\n legendOpacityScale = d3.scaleLinear()\n .domain([minValue, maxValue])\n .range([0, 1]);\n } else if (options.colorScale === 'sqrt') {\n legendOpacityScale = d3.scalePow().exponent(options.exponent)\n .domain([minValue, maxValue])\n .range([0, 1]);\n }\n return legendOpacityScale;\n}\n\nfunction getSvgElemX(elem) {\n let svgElem = elem.get(0);\n if (svgElem && svgElem.x && svgElem.x.baseVal) {\n return svgElem.x.baseVal.value;\n } else {\n return 0;\n }\n}\n\nfunction getSvgElemHeight(elem) {\n let svgElem = elem.get(0);\n if (svgElem && svgElem.height && svgElem.height.baseVal) {\n return svgElem.height.baseVal.value;\n } else {\n return 0;\n }\n}\n\nfunction buildLegendTicks(rangeFrom, rangeTo, maxValue, minValue) {\n let range = rangeTo - rangeFrom;\n let tickStepSize = tickStep(rangeFrom, rangeTo, 3);\n let ticksNum = Math.round(range / tickStepSize);\n let ticks:any = [];\n\n for (let i = 0; i < ticksNum; i++) {\n let current = tickStepSize * i;\n // Add user-defined min and max if it had been set\n if (isValueCloseTo(minValue, current, tickStepSize)) {\n ticks.push(minValue);\n continue;\n } else if (minValue < current) {\n ticks.push(minValue);\n }\n if (isValueCloseTo(maxValue, current, tickStepSize)) {\n ticks.push(maxValue);\n continue;\n } else if (maxValue < current) {\n ticks.push(maxValue);\n }\n ticks.push(tickStepSize * i);\n }\n if (!isValueCloseTo(maxValue, rangeTo, tickStepSize)) {\n ticks.push(maxValue);\n }\n ticks.push(rangeTo);\n ticks = _.sortBy(_.uniq(ticks));\n return ticks;\n}\n\nfunction isValueCloseTo(val, valueTo, step) {\n let diff = Math.abs(val - valueTo);\n return diff < step * 0.3;\n}\n"],"file":"color_legend.js"} \ No newline at end of file diff --git a/dist/color_mode_discrete.js b/dist/color_mode_discrete.js index 74e964e..58d1dde 100644 --- a/dist/color_mode_discrete.js +++ b/dist/color_mode_discrete.js @@ -16,7 +16,7 @@ System.register([], function (_export, _context) { return { setters: [], execute: function () { - // Helper methods to handle discrete color mode + // Extra Series methods to handle discrete color mode _export("ColorModeDiscrete", ColorModeDiscrete = /*#__PURE__*/ function () { @@ -55,6 +55,24 @@ System.register([], function (_export, _context) { return tooltips; } }, { + key: "convertValueToTooltips", + value: function convertValueToTooltips(values) { + var thresholds = this.panel.color.thresholds; + var tooltips = []; + + for (var i = 0; i < thresholds.length; i++) { + //for (let j = 0; j < values.length; j++) { + if (values == thresholds[i].value) { + tooltips.push({ + "tooltip": thresholds[i].tooltip ? thresholds[i].tooltip : values, + "color": thresholds[i].color + }); //} + } + } + + return tooltips; + } + }, { key: "getNotMatchedValues", value: function getNotMatchedValues(values) { var notMatched = []; @@ -92,6 +110,23 @@ System.register([], function (_export, _context) { } return color; + } + }, { + key: "getBucketColorSingle", + value: function getBucketColorSingle(value) { + //let thresholds = this.panel.color.thresholds; + if (value == null) { + // treat as null value + return 'rgba(0,0,0,1)'; //return this.getMatchedThreshold(null).color; + } + + var threshold = this.getMatchedThreshold(value); + + if (!threshold || !threshold.color || threshold.color == "") { + return 'rgba(0,0,0,1)'; + } else { + return threshold.color; + } } // returns color from first matched thresold in order from 0 to thresholds.length }, { @@ -136,6 +171,27 @@ System.register([], function (_export, _context) { return 'rgba(0,0,0,1)'; } + }, { + key: "updateCardsValuesHasColorInfoSingle", + value: function updateCardsValuesHasColorInfoSingle() { + if (!this.panelCtrl.cardsData) { + return; + } + + this.panelCtrl.cardsData.noColorDefined = false; + var cards = this.panelCtrl.cardsData.cards; + + for (var i = 0; i < cards.length; i++) { + cards[i].noColorDefined = false; + var values = cards[i].value; + var threshold = this.getMatchedThreshold(values); + + if (!threshold || !threshold.color || threshold.color == "") { + cards[i].noColorDefined = true; + this.panelCtrl.cardsData.noColorDefined = true; + } + } + } }, { key: "updateCardsValuesHasColorInfo", value: function updateCardsValuesHasColorInfo() { diff --git a/dist/color_mode_discrete.js.map b/dist/color_mode_discrete.js.map index dd8e025..30a558d 100644 --- a/dist/color_mode_discrete.js.map +++ b/dist/color_mode_discrete.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/color_mode_discrete.ts"],"names":["ColorModeDiscrete","scope","panelCtrl","ctrl","panel","values","thresholds","color","tooltips","i","length","j","value","push","tooltip","notMatched","getMatchedThreshold","threshold","index","getThreshold","isAllValuesNulls","getDiscreteColor","cardsData","noColorDefined","cards","nullPointMode","k","interval"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport {StatusHeatmapCtrl} from \"./status_heatmap_ctrl\";\n\ninterface Tooltip {\n tooltip: string;\n color: string;\n}\n\ndeclare class DiscreteColorThreshold {\n color: string;\n value: number;\n tooltip: string;\n}\n\n// Helper methods to handle discrete color mode\nexport class ColorModeDiscrete {\n scope: any;\n panelCtrl: StatusHeatmapCtrl;\n panel: any;\n\n constructor(scope) {\n this.scope = scope;\n this.panelCtrl = scope.ctrl;\n this.panel = scope.ctrl.panel;\n }\n\n // get tooltip for each value ordered by thresholds priority\n convertValuesToTooltips(values:any[]) : Tooltip[] {\n let thresholds = this.panel.color.thresholds;\n let tooltips:Tooltip[] = [];\n\n for (let i = 0; i < thresholds.length; i++) {\n for (let j = 0; j < values.length; j++) {\n if (values[j] == thresholds[i].value) {\n tooltips.push({\n \"tooltip\": thresholds[i].tooltip?thresholds[i].tooltip:values[j],\n \"color\": thresholds[i].color\n });\n }\n }\n }\n return tooltips;\n }\n\n getNotMatchedValues(values:any[]) {\n let notMatched:any[] = [];\n for (let j = 0; j < values.length; j++) {\n if (!this.getMatchedThreshold(values[j])) {\n notMatched.push(values[j]);\n }\n }\n return notMatched;\n }\n\n getNotColoredValues(values:any[]) {\n let notMatched:any[] = [];\n for (let j = 0; j < values.length; j++) {\n let threshold = this.getMatchedThreshold(values[j]);\n if (!threshold || !threshold.color || threshold.color == \"\") {\n notMatched.push(values[j]);\n }\n }\n return notMatched;\n }\n\n getDiscreteColor(index) {\n let color = this.getThreshold(index).color;\n if (!color || color == \"\") {\n return 'rgba(0,0,0,1)';\n }\n return color;\n }\n\n // returns color from first matched thresold in order from 0 to thresholds.length\n getBucketColor(values) {\n let thresholds = this.panel.color.thresholds;\n\n if (!values || values.length == 0) {\n // treat as null value\n return this.getMatchedThreshold(null).color;\n }\n\n if (values.length == 1) {\n let threshold = this.getMatchedThreshold(values[0]);\n if (!threshold || !threshold.color || threshold.color == \"\") {\n return 'rgba(0,0,0,1)';\n } else {\n return threshold.color;\n }\n }\n\n let isAllValuesNulls = true;\n for (let j = 0; j < values.length; j++) {\n if (values[j] != null) {\n isAllValuesNulls = false;\n }\n }\n if (isAllValuesNulls) {\n return this.getMatchedThreshold(null).color;\n }\n\n for (let i = 0; i < thresholds.length; i++) {\n for (let j = 0; j < values.length; j++) {\n if (values[j] == thresholds[i].value) {\n return this.getDiscreteColor(i);\n }\n }\n }\n return 'rgba(0,0,0,1)';\n }\n\n updateCardsValuesHasColorInfo() {\n if (!this.panelCtrl.cardsData) {\n return\n }\n this.panelCtrl.cardsData.noColorDefined = false;\n let cards = this.panelCtrl.cardsData.cards;\n for (let i=0; i= thresholds.length == null) {\n return {\n \"color\": \"rgba(0,0,0,0)\",\n \"value\": \"null\",\n \"tooltip\": \"null\",\n }\n }\n return thresholds[index];\n }\n\n roundIntervalCeil(interval) {\n switch (true) {\n case interval <= 10:\n return 10; // 0.01s\n case interval <= 20:\n return 20; // 0.02s\n case interval <= 50:\n return 50; // 0.05s\n case interval <= 100:\n return 100; // 0.1s\n case interval <= 200:\n return 200; // 0.2s\n case interval <= 500:\n return 500; // 0.5s\n case interval <= 1000:\n return 1000; // 1s\n case interval <= 2000:\n return 2000; // 2s\n case interval <= 5000:\n return 5000; // 5s\n case interval <= 10000:\n return 10000; // 10s\n case interval <= 15000:\n return 15000; // 15s\n case interval <= 20000:\n return 20000; // 20s\n case interval <= 30000:\n return 30000; // 30s\n case interval <= 60000:\n return 60000; // 1m\n case interval <= 120000:\n return 120000; // 2m\n case interval <= 300000:\n return 300000; // 5m\n case interval <= 600000:\n return 600000; // 10m\n case interval <= 900000:\n return 900000; // 15m\n case interval <= 1200000:\n return 1200000; // 20m\n case interval <= 1800000:\n return 1800000; // 30m\n case interval <= 3600000:\n return 3600000; // 1h\n case interval <= 7200000:\n return 7200000; // 2h\n case interval <= 10800000:\n return 10800000; // 3h\n case interval <= 21600000:\n return 21600000; // 6h\n case interval <= 43200000:\n return 43200000; // 12h\n case interval <= 86400000:\n return 86400000; // 1d\n case interval <= 604800000:\n return 604800000; // 1w\n case interval <= 2592000000:\n return 2592000000; // 30d\n default:\n return 31536000000; // 1y\n }\n }\n}\n"],"file":"color_mode_discrete.js"} \ No newline at end of file +{"version":3,"sources":["../src/color_mode_discrete.ts"],"names":["ColorModeDiscrete","scope","panelCtrl","ctrl","panel","values","thresholds","color","tooltips","i","length","j","value","push","tooltip","notMatched","getMatchedThreshold","threshold","index","getThreshold","isAllValuesNulls","getDiscreteColor","cardsData","noColorDefined","cards","nullPointMode","k","interval"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport {StatusHeatmapCtrl} from \"./status_heatmap_ctrl\";\n\ninterface Tooltip {\n tooltip: string;\n color: string;\n}\n\ndeclare class DiscreteColorThreshold {\n color: string;\n value: number;\n tooltip: string;\n}\n\n// Extra Series methods to handle discrete color mode\nexport class ColorModeDiscrete {\n scope: any;\n panelCtrl: StatusHeatmapCtrl;\n panel: any;\n\n constructor(scope) {\n this.scope = scope;\n this.panelCtrl = scope.ctrl;\n this.panel = scope.ctrl.panel;\n }\n\n // get tooltip for each value ordered by thresholds priority\n convertValuesToTooltips(values:any[]) : Tooltip[] {\n let thresholds = this.panel.color.thresholds;\n let tooltips:Tooltip[] = [];\n\n for (let i = 0; i < thresholds.length; i++) {\n for (let j = 0; j < values.length; j++) {\n if (values[j] == thresholds[i].value) {\n tooltips.push({\n \"tooltip\": thresholds[i].tooltip?thresholds[i].tooltip:values[j],\n \"color\": thresholds[i].color\n });\n }\n }\n }\n return tooltips;\n }\n\n convertValueToTooltips(values) {\n let thresholds = this.panel.color.thresholds;\n let tooltips = [];\n\n for (let i = 0; i < thresholds.length; i++) {\n //for (let j = 0; j < values.length; j++) {\n if (values == thresholds[i].value) {\n tooltips.push({\n \"tooltip\": thresholds[i].tooltip?thresholds[i].tooltip:values,\n \"color\": thresholds[i].color\n });\n //}\n }\n }\n return tooltips;\n }\n\n getNotMatchedValues(values:any[]) {\n let notMatched:any[] = [];\n for (let j = 0; j < values.length; j++) {\n if (!this.getMatchedThreshold(values[j])) {\n notMatched.push(values[j]);\n }\n }\n return notMatched;\n }\n\n getNotColoredValues(values:any[]) {\n let notMatched:any[] = [];\n for (let j = 0; j < values.length; j++) {\n let threshold = this.getMatchedThreshold(values[j]);\n if (!threshold || !threshold.color || threshold.color == \"\") {\n notMatched.push(values[j]);\n }\n }\n return notMatched;\n }\n\n getDiscreteColor(index) {\n let color = this.getThreshold(index).color;\n if (!color || color == \"\") {\n return 'rgba(0,0,0,1)';\n }\n return color;\n }\n\n getBucketColorSingle(value) {\n //let thresholds = this.panel.color.thresholds;\n if (value == null) {\n // treat as null value\n return 'rgba(0,0,0,1)';\n //return this.getMatchedThreshold(null).color;\n }\n let threshold = this.getMatchedThreshold(value);\n\n if (!threshold || !threshold.color || threshold.color == \"\") {\n return 'rgba(0,0,0,1)';\n } else {\n return threshold.color;\n }\n }\n\n // returns color from first matched thresold in order from 0 to thresholds.length\n getBucketColor(values) {\n let thresholds = this.panel.color.thresholds;\n\n if (!values || values.length == 0) {\n // treat as null value\n return this.getMatchedThreshold(null).color;\n }\n\n if (values.length == 1) {\n let threshold = this.getMatchedThreshold(values[0]);\n if (!threshold || !threshold.color || threshold.color == \"\") {\n return 'rgba(0,0,0,1)';\n } else {\n return threshold.color;\n }\n }\n\n let isAllValuesNulls = true;\n for (let j = 0; j < values.length; j++) {\n if (values[j] != null) {\n isAllValuesNulls = false;\n }\n }\n if (isAllValuesNulls) {\n return this.getMatchedThreshold(null).color;\n }\n\n for (let i = 0; i < thresholds.length; i++) {\n for (let j = 0; j < values.length; j++) {\n if (values[j] == thresholds[i].value) {\n return this.getDiscreteColor(i);\n }\n }\n }\n return 'rgba(0,0,0,1)';\n }\n\n\n updateCardsValuesHasColorInfoSingle() {\n if (!this.panelCtrl.cardsData) {\n return;\n }\n this.panelCtrl.cardsData.noColorDefined = false;\n var cards = this.panelCtrl.cardsData.cards;\n for (var i = 0; i < cards.length; i++) {\n cards[i].noColorDefined = false;\n var values = cards[i].value;\n var threshold = this.getMatchedThreshold(values);\n if (!threshold || !threshold.color || threshold.color == \"\") {\n cards[i].noColorDefined = true;\n this.panelCtrl.cardsData.noColorDefined = true;\n }\n }\n }\n\n updateCardsValuesHasColorInfo() {\n if (!this.panelCtrl.cardsData) {\n return\n }\n this.panelCtrl.cardsData.noColorDefined = false;\n let cards = this.panelCtrl.cardsData.cards;\n for (let i=0; i= thresholds.length == null) {\n return {\n \"color\": \"rgba(0,0,0,0)\",\n \"value\": \"null\",\n \"tooltip\": \"null\",\n }\n }\n return thresholds[index];\n }\n\n roundIntervalCeil(interval) {\n switch (true) {\n case interval <= 10:\n return 10; // 0.01s\n case interval <= 20:\n return 20; // 0.02s\n case interval <= 50:\n return 50; // 0.05s\n case interval <= 100:\n return 100; // 0.1s\n case interval <= 200:\n return 200; // 0.2s\n case interval <= 500:\n return 500; // 0.5s\n case interval <= 1000:\n return 1000; // 1s\n case interval <= 2000:\n return 2000; // 2s\n case interval <= 5000:\n return 5000; // 5s\n case interval <= 10000:\n return 10000; // 10s\n case interval <= 15000:\n return 15000; // 15s\n case interval <= 20000:\n return 20000; // 20s\n case interval <= 30000:\n return 30000; // 30s\n case interval <= 60000:\n return 60000; // 1m\n case interval <= 120000:\n return 120000; // 2m\n case interval <= 300000:\n return 300000; // 5m\n case interval <= 600000:\n return 600000; // 10m\n case interval <= 900000:\n return 900000; // 15m\n case interval <= 1200000:\n return 1200000; // 20m\n case interval <= 1800000:\n return 1800000; // 30m\n case interval <= 3600000:\n return 3600000; // 1h\n case interval <= 7200000:\n return 7200000; // 2h\n case interval <= 10800000:\n return 10800000; // 3h\n case interval <= 21600000:\n return 21600000; // 6h\n case interval <= 43200000:\n return 43200000; // 12h\n case interval <= 86400000:\n return 86400000; // 1d\n case interval <= 604800000:\n return 604800000; // 1w\n case interval <= 2592000000:\n return 2592000000; // 30d\n default:\n return 31536000000; // 1y\n }\n }\n}\n"],"file":"color_mode_discrete.js"} \ No newline at end of file diff --git a/dist/css/statusmap.dark.css b/dist/css/statusmap.dark.css index d1ba4a5..81f1068 100644 --- a/dist/css/statusmap.dark.css +++ b/dist/css/statusmap.dark.css @@ -27,10 +27,22 @@ background-color: #141414; color: #d8d9da; } .statusmap-tooltip .discrete-item { - color: #52545c; + color: #ffffff; padding: 1px; font-weight: bold; - text-shadow: 0 0 0.2em #FFF, 0 0 0.2em #FFF, 0 0 0.2em #FFF; } + text-shadow: 0 0 0.2em #212124, 0 0 0.2em #212124, 0 0 0.2em #212124; } + +.statusmap-tooltip-extraseries { + white-space: nowrap; + font-size: 12px; + background-color: #141414; + color: #d8d9da; } + .statusmap-tooltip-extraseries .discrete-item { + color: #ffffff; + padding: 1px; + font-weight: bold; + margin-bottom: 0; + text-shadow: 0 0 0.2em #212124, 0 0 0.2em #212124, 0 0 0.2em #212124; } .statusmap-histogram rect { fill: #8e8e8e; } @@ -44,6 +56,18 @@ fill: rgba(102, 102, 102, 0.4); stroke: rgba(102, 102, 102, 0.8); } +.width-c-40 { + width: 40rem !important; } + +.width-c-50 { + width: 50rem !important; } + +.width-c-60 { + width: 60rem !important; } + +.width-c-70 { + width: 70rem !important; } + .status-heatmap-legend-wrapper { margin: 0 10px; } .status-heatmap-legend-wrapper svg { diff --git a/dist/css/statusmap.dark.css.map b/dist/css/statusmap.dark.css.map index 4bbef2c..0091a78 100644 --- a/dist/css/statusmap.dark.css.map +++ b/dist/css/statusmap.dark.css.map @@ -1,6 +1,6 @@ { "version": 3, -"mappings": "AAAA,8BAA+B;EAE7B,MAAM,EAAE,SAAS;EAGjB,kDAAoB;IAClB,cAAc,EAAE,IAAI;EAGtB,uDAAyB;IACzB,gBAAgB,ECNL,OAAO;IDOlB,KAAK,ECVM,OAAO;IDWlB,OAAO,EAAE,GAAG;;AAId,qBAAsB;EACpB,QAAQ,EAAE,QAAQ;EAGhB,sCAAK;IACH,IAAI,ECpBG,OAAO;IDqBd,KAAK,ECrBE,OAAO;IDsBd,SAAS,EEtBE,IAAI;EFyBjB,sCAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,EC1BM,OAAO;ED+BvB,yBAAI;IACF,cAAc,EAAE,IAAI;IAEpB,8BAAK;MACH,cAAc,EAAE,cAAc;;AAKpC,kBAAmB;EACjB,WAAW,EAAE,MAAM;EACnB,SAAS,EE5CI,IAAI;EF6CjB,gBAAgB,EC1CC,OAAO;ED2CxB,KAAK,EC7CM,OAAO;ED+ClB,iCAAe;IACb,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,GAAG;IACZ,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE,8CAA8C;;AAI/D,yBAA0B;EACxB,IAAI,ECvDY,OAAO;;AD2DvB,8BAAK;EACH,MAAM,EAAE,OAAgB;EACxB,YAAY,EAAE,CAAC;;AAInB,yBAA0B;EACxB,YAAY,EAAE,CAAC;EACf,IAAI,EAAE,wBAAwB;EAC9B,MAAM,EAAE,wBAAwB;;AAIlC,8BAA+B;EAC7B,MAAM,EAAE,MAAM;EAEd,kCAAI;IACF,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,IAAI;IACX,WAAW,EAAE,MAAM;EAIrB,2DAA6B;IAC3B,UAAU,EAAE,GAAG;EAGjB,4DAA8B;IAC5B,OAAO,EAAE,YAAY;EAIrB,+CAAK;IACH,IAAI,EC7FG,OAAO;ID8Fd,KAAK,EC9FE,OAAO;ID+Fd,SAAS,EE/FE,IAAI;EFkGjB,+CAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,ECnGM,OAAO;EDsGrB,kDAAQ;IACN,OAAO,EAAE,GAAG;IACZ,MAAM,ECxGM,OAAO", +"mappings": "AAAA,8BAA+B;EAE7B,MAAM,EAAE,SAAS;EAGjB,kDAAoB;IAClB,cAAc,EAAE,IAAI;EAGtB,uDAAyB;IACzB,gBAAgB,ECNL,OAAO;IDOlB,KAAK,ECVM,OAAO;IDWlB,OAAO,EAAE,GAAG;;AAId,qBAAsB;EACpB,QAAQ,EAAE,QAAQ;EAGhB,sCAAK;IACH,IAAI,ECpBG,OAAO;IDqBd,KAAK,ECrBE,OAAO;IDsBd,SAAS,EEtBE,IAAI;EFyBjB,sCAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,EC1BM,OAAO;ED+BvB,yBAAI;IACF,cAAc,EAAE,IAAI;IAEpB,8BAAK;MACH,cAAc,EAAE,cAAc;;AAKpC,kBAAmB;EACjB,WAAW,EAAE,MAAM;EACnB,SAAS,EE5CI,IAAI;EF6CjB,gBAAgB,EC1CC,OAAO;ED2CxB,KAAK,EC7CM,OAAO;ED+ClB,iCAAe;IACb,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,GAAG;IACZ,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE,uDAAuD;;AAIxE,8BAA+B;EAC7B,WAAW,EAAE,MAAM;EACnB,SAAS,EE1DI,IAAI;EF2DjB,gBAAgB,ECxDC,OAAO;EDyDxB,KAAK,EC3DM,OAAO;ED6DlB,6CAAe;IACb,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,GAAG;IACZ,WAAW,EAAE,IAAI;IACjB,aAAa,EAAE,CAAC;IAChB,WAAW,EAAE,uDAAuD;;AAIxE,yBAA0B;EACxB,IAAI,ECtEY,OAAO;;AD0EvB,8BAAK;EACH,MAAM,EAAE,OAAgB;EACxB,YAAY,EAAE,CAAC;;AAInB,yBAA0B;EACxB,YAAY,EAAE,CAAC;EACf,IAAI,EAAE,wBAAwB;EAC9B,MAAM,EAAE,wBAAwB;;AAGlC,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AAEA,8BAA+B;EAC7B,MAAM,EAAE,MAAM;EAEd,kCAAI;IACF,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,IAAI;IACX,WAAW,EAAE,MAAM;EAIrB,2DAA6B;IAC3B,UAAU,EAAE,GAAG;EAGjB,4DAA8B;IAC5B,OAAO,EAAE,YAAY;EAIrB,+CAAK;IACH,IAAI,ECxHG,OAAO;IDyHd,KAAK,ECzHE,OAAO;ID0Hd,SAAS,EE1HE,IAAI;EF6HjB,+CAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,EC9HM,OAAO;EDiIrB,kDAAQ;IACN,OAAO,EAAE,GAAG;IACZ,MAAM,ECnIM,OAAO", "sources": ["../../src/css/_statusmap.scss","../../src/css/_variables.dark.scss","../../src/css/_variables.scss"], "names": [], "file": "statusmap.dark.css" diff --git a/dist/css/statusmap.light.css b/dist/css/statusmap.light.css index 349f40f..085ec7a 100644 --- a/dist/css/statusmap.light.css +++ b/dist/css/statusmap.light.css @@ -27,10 +27,22 @@ background-color: #dde4ed; color: #52545c; } .statusmap-tooltip .discrete-item { - color: #52545c; + color: #ffffff; padding: 1px; font-weight: bold; - text-shadow: 0 0 0.2em #FFF, 0 0 0.2em #FFF, 0 0 0.2em #FFF; } + text-shadow: 0 0 0.2em #212124, 0 0 0.2em #212124, 0 0 0.2em #212124; } + +.statusmap-tooltip-extraseries { + white-space: nowrap; + font-size: 12px; + background-color: #dde4ed; + color: #52545c; } + .statusmap-tooltip-extraseries .discrete-item { + color: #ffffff; + padding: 1px; + font-weight: bold; + margin-bottom: 0; + text-shadow: 0 0 0.2em #212124, 0 0 0.2em #212124, 0 0 0.2em #212124; } .statusmap-histogram rect { fill: #767980; } @@ -44,6 +56,18 @@ fill: rgba(102, 102, 102, 0.4); stroke: rgba(102, 102, 102, 0.8); } +.width-c-40 { + width: 40rem !important; } + +.width-c-50 { + width: 50rem !important; } + +.width-c-60 { + width: 60rem !important; } + +.width-c-70 { + width: 70rem !important; } + .status-heatmap-legend-wrapper { margin: 0 10px; } .status-heatmap-legend-wrapper svg { diff --git a/dist/css/statusmap.light.css.map b/dist/css/statusmap.light.css.map index 36f5f19..c322387 100644 --- a/dist/css/statusmap.light.css.map +++ b/dist/css/statusmap.light.css.map @@ -1,6 +1,6 @@ { "version": 3, -"mappings": "AAAA,8BAA+B;EAE7B,MAAM,EAAE,SAAS;EAGjB,kDAAoB;IAClB,cAAc,EAAE,IAAI;EAGtB,uDAAyB;IACzB,gBAAgB,ECNL,OAAO;IDOlB,KAAK,ECVM,OAAO;IDWlB,OAAO,EAAE,GAAG;;AAId,qBAAsB;EACpB,QAAQ,EAAE,QAAQ;EAGhB,sCAAK;IACH,IAAI,ECpBG,OAAO;IDqBd,KAAK,ECrBE,OAAO;IDsBd,SAAS,EEtBE,IAAI;EFyBjB,sCAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,EC1BM,OAAO;ED+BvB,yBAAI;IACF,cAAc,EAAE,IAAI;IAEpB,8BAAK;MACH,cAAc,EAAE,cAAc;;AAKpC,kBAAmB;EACjB,WAAW,EAAE,MAAM;EACnB,SAAS,EE5CI,IAAI;EF6CjB,gBAAgB,EC1CC,OAAO;ED2CxB,KAAK,EC7CM,OAAO;ED+ClB,iCAAe;IACb,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,GAAG;IACZ,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE,8CAA8C;;AAI/D,yBAA0B;EACxB,IAAI,ECvDY,OAAO;;AD2DvB,8BAAK;EACH,MAAM,EAAE,OAAgB;EACxB,YAAY,EAAE,CAAC;;AAInB,yBAA0B;EACxB,YAAY,EAAE,CAAC;EACf,IAAI,EAAE,wBAAwB;EAC9B,MAAM,EAAE,wBAAwB;;AAIlC,8BAA+B;EAC7B,MAAM,EAAE,MAAM;EAEd,kCAAI;IACF,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,IAAI;IACX,WAAW,EAAE,MAAM;EAIrB,2DAA6B;IAC3B,UAAU,EAAE,GAAG;EAGjB,4DAA8B;IAC5B,OAAO,EAAE,YAAY;EAIrB,+CAAK;IACH,IAAI,EC7FG,OAAO;ID8Fd,KAAK,EC9FE,OAAO;ID+Fd,SAAS,EE/FE,IAAI;EFkGjB,+CAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,ECnGM,OAAO;EDsGrB,kDAAQ;IACN,OAAO,EAAE,GAAG;IACZ,MAAM,ECxGM,OAAO", +"mappings": "AAAA,8BAA+B;EAE7B,MAAM,EAAE,SAAS;EAGjB,kDAAoB;IAClB,cAAc,EAAE,IAAI;EAGtB,uDAAyB;IACzB,gBAAgB,ECNL,OAAO;IDOlB,KAAK,ECVM,OAAO;IDWlB,OAAO,EAAE,GAAG;;AAId,qBAAsB;EACpB,QAAQ,EAAE,QAAQ;EAGhB,sCAAK;IACH,IAAI,ECpBG,OAAO;IDqBd,KAAK,ECrBE,OAAO;IDsBd,SAAS,EEtBE,IAAI;EFyBjB,sCAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,EC1BM,OAAO;ED+BvB,yBAAI;IACF,cAAc,EAAE,IAAI;IAEpB,8BAAK;MACH,cAAc,EAAE,cAAc;;AAKpC,kBAAmB;EACjB,WAAW,EAAE,MAAM;EACnB,SAAS,EE5CI,IAAI;EF6CjB,gBAAgB,EC1CC,OAAO;ED2CxB,KAAK,EC7CM,OAAO;ED+ClB,iCAAe;IACb,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,GAAG;IACZ,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE,uDAAuD;;AAIxE,8BAA+B;EAC7B,WAAW,EAAE,MAAM;EACnB,SAAS,EE1DI,IAAI;EF2DjB,gBAAgB,ECxDC,OAAO;EDyDxB,KAAK,EC3DM,OAAO;ED6DlB,6CAAe;IACb,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,GAAG;IACZ,WAAW,EAAE,IAAI;IACjB,aAAa,EAAE,CAAC;IAChB,WAAW,EAAE,uDAAuD;;AAIxE,yBAA0B;EACxB,IAAI,ECtEY,OAAO;;AD0EvB,8BAAK;EACH,MAAM,EAAE,OAAgB;EACxB,YAAY,EAAE,CAAC;;AAInB,yBAA0B;EACxB,YAAY,EAAE,CAAC;EACf,IAAI,EAAE,wBAAwB;EAC9B,MAAM,EAAE,wBAAwB;;AAGlC,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AAEA,8BAA+B;EAC7B,MAAM,EAAE,MAAM;EAEd,kCAAI;IACF,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,IAAI;IACX,WAAW,EAAE,MAAM;EAIrB,2DAA6B;IAC3B,UAAU,EAAE,GAAG;EAGjB,4DAA8B;IAC5B,OAAO,EAAE,YAAY;EAIrB,+CAAK;IACH,IAAI,ECxHG,OAAO;IDyHd,KAAK,ECzHE,OAAO;ID0Hd,SAAS,EE1HE,IAAI;EF6HjB,+CAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,EC9HM,OAAO;EDiIrB,kDAAQ;IACN,OAAO,EAAE,GAAG;IACZ,MAAM,ECnIM,OAAO", "sources": ["../../src/css/_statusmap.scss","../../src/css/_variables.light.scss","../../src/css/_variables.scss"], "names": [], "file": "statusmap.light.css" diff --git a/dist/extra_series_format.js b/dist/extra_series_format.js new file mode 100644 index 0000000..6680ce7 --- /dev/null +++ b/dist/extra_series_format.js @@ -0,0 +1,28 @@ +"use strict"; + +System.register([], function (_export, _context) { + "use strict"; + + var ExtraSeriesFormat, ExtraSeriesFormatValue; + + _export({ + ExtraSeriesFormat: void 0, + ExtraSeriesFormatValue: void 0 + }); + + return { + setters: [], + execute: function () { + (function (ExtraSeriesFormat) { + ExtraSeriesFormat["Date"] = "Date"; + ExtraSeriesFormat["Raw"] = "Raw"; + })(ExtraSeriesFormat || _export("ExtraSeriesFormat", ExtraSeriesFormat = {})); + + (function (ExtraSeriesFormatValue) { + ExtraSeriesFormatValue["Date"] = "YYYY/MM/DD/HH_mm_ss"; + ExtraSeriesFormatValue["Raw"] = ""; + })(ExtraSeriesFormatValue || _export("ExtraSeriesFormatValue", ExtraSeriesFormatValue = {})); + } + }; +}); +//# sourceMappingURL=extra_series_format.js.map diff --git a/dist/extra_series_format.js.map b/dist/extra_series_format.js.map new file mode 100644 index 0000000..15a0176 --- /dev/null +++ b/dist/extra_series_format.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/extra_series_format.ts"],"names":["ExtraSeriesFormat","ExtraSeriesFormatValue"],"mappings":";;;;;;;;;;;;;;;iBAAYA,iB;AAAAA,QAAAA,iB;AAAAA,QAAAA,iB;SAAAA,iB,iCAAAA,iB;;iBAKAC,sB;AAAAA,QAAAA,sB;AAAAA,QAAAA,sB;SAAAA,sB,sCAAAA,sB","sourcesContent":["export enum ExtraSeriesFormat {\n Date = 'Date',\n Raw = 'Raw',\n}\n\nexport enum ExtraSeriesFormatValue {\n Date = 'YYYY/MM/DD/HH_mm_ss',\n Raw = '',\n}"],"file":"extra_series_format.js"} \ No newline at end of file diff --git a/dist/img/tooltip-editor.png b/dist/img/tooltip-editor.png new file mode 100644 index 0000000000000000000000000000000000000000..97a26d8e4cf53e8b93f74e14c94da3fff0cacf84 GIT binary patch literal 34584 zcmd42XH=72v@mFS6%hd`QUw$hq^mUPq7;!PAiaz95_*TIh=eY^gVI9pJwQ-;4G?NV z2)*}`&_X8h{qA>X-Mj9Z@5iiJ!;hSYQ}@|tpWRRBdo@M!+f28wT)9H7^j1#u%9VfG zu3Wile(M^chVi{DAECJJ_FCz~ty{N{^XhZNT6cLpcP)UGyO+7E@Zd1oxypL*u%(_>SyBkUSJ+w({x3t^WlLdA~f+YEJ;BeBt6`NI!1a% zGd5|75b^D=ijOs$E%z6!Y;F?g9ZpX@X6>1yQWhDCdY&~kCt+is}Ms;4GcDt!@^})F8bFSU8 znIDb&aIbFp(@9~6JFG{DKf=r}L<1$Q$M!VHL})19Xp- zyWm*K)Ks32QK=^e>0*9}xc1EZPy;gc%$EiH)V`?u4znV-6i!Y+y|A5ZOW9=GPVjn8 zmhZ<=Pho#K|6C2Zi1|>OtXsUQY=<3jG%so@_L!UbH}r{1U0J%8SV5Qp@=UO9C*)C@ zB3dT!e0|4Y%po;DG=JJ5m1BX8hS{KLZKM&YEdOc0#xjP?FXUXngqL0WoKD@Kx#hK7 z?mpbD$TL6Ev>C+_D+4rk_yjfdw^X+E#yfkgF75YMJF=g`tx(h$12Zl4>%>Lp@~wP9 zQKe%U*0Tj)zO#Yd%p& z63^|k@-Kb1Y&W%{o|ues89|_ZTcSr7Z>^B3g)qeagXw& z_u9u13EhG`mt}h4txtxZc8bKrB{l!;&L0(iewT%cDlI=$?3vIQdh+RMankl-Bx?dS z4bvJM1D)VLE?CKYH49&}PfKKdLsL*xG|m^O{fM(nCD9feHTwtdPV6wp-gI)WC;Sz;vcH#_t9t>o9B6Y? z@X$QArI9OGh1jFbr{M+9k0OA#|408%Yvhx?zjo^cQbhuMTDNBu|I#~uTLR;Qe<^?F zUgNiW#8J-cRR2~vJ^U}%Hu%c_a8EN;Un+p%#*53#>xGl+@m6ei)ijNbx7VlR``yI~ z3JVKIg;e1Nz7L4gr^;%@_6nO!t{rENs}&Zy2%mp;rfvaS%gYBBU!^L<`A%!bH$nCH z#x^5w24xp%evo|J}wDK-C2&$xhh==`Oe&Kx2=H2HH zwDL=RJ!-s>tEKS%|p!Z?d{pD&l6#=xv9G`=mF#|)2cZF4V8*W z^;tp@bcBY_=iawB?=6NkoLBzhacU#>9g4cWl#nYOVSHIw(t4qXfA#l(b;Y@V5L>U* z-~E3;R{s;yAKweO>}66$Vdt7h+UjUwpLI^Rka}othKX-!Q)kQZepd#>3t(7n_9sBJ zh);@@IInK`3gwSP)^-ymKN*W{PDZu?A4_j9gx7wfo@yj6C0b;Vz?w?ZsUYKkV*Le7KZAL{Co52w}( z+bgQ+6DCPK!>$>&NCVv#tbJrI_Kp`q!vjw?SwZf}tSL`b0MvSn&~6gauQse=0zYI!?vcPzp|z>BWm5>|AMCgK!GqK25v| z2mNy=rJ5gCc$ezAysCcfLc*;#L27p%URQ+S%sQL2*@jro%|Nnph_1ZADu)BX-ojn$ z665ESQk`KUr-Hf(jm4OEA?_W5WyaxS%{1$o7#61w zl>UZ4$1mLre$Mrn0vur6I>ZB@S0wDa`*I-tHhlY$0>#$I>;p_mqd?0``!sDiIsc2t zZaWcJj17?aSwp!}2X%&I9aMe#z?NpVH-?qef{ik!#dLQP;c;g)JkQNqW}mcC_|?(X zhgUV@tI;Ot;D-y-@eL2`SGGv2MGW73&wY$38Vu6$&ao{&%1XwX&4 zmX{@lj&#C?cjWuwbe0C2(ZcdiS{Z2G*ZCv9-9V?EJ&~S-++hDytYebRBBqIr%h$GD z7%v*nVIz$rx1Ze(buBz)W!pPRTV z6RszY-Qe|s=a=-1rcW^>zzv(8KOO$^A!r(bK*(QR!RbM>LLG&y&oe2O3Una3t$c0G2@ zrej0rSFPd~Uy|<~LQMTuB+mupHBZKA0jFPcF(037%|g#p%cF_asKqdNGgK zuX==}viqX#X0k9{VJgL2*!9{6Ws0CcxBQ$G@L@Vr0&_9H$1d@#FF&M8yb62yu5M6u zI?>4vXpjHBe_cUc!<4DDU}Uux{~}H0V?R%EDQ{xZ2T<>)*aN8>6H^$LM=C7+o+@bC z*qLfw(ZP>M=;mB#J2^*OQ9{z>_tB~s#rdgB`SLM{<8<Aa?cPH>Dx*0m(ZV(<*H@#SZJDed4zTc+BCX*nc*He9f3Lv6^sWoca_>V9FYPN_lYeJU!Aah;+MEWap- z;$&{YX2tITC0zou1V;HS>kL>C3%YFI*?C$Q8w;1Ns*$uuvaVy^E(B3YWh+FiEo;?T z46=s2#O!cUv$5eWORgzu46#Cb9eDeu;m?4GYLV?K)R>Iz+uh87o190K70V7o;;Pb) z9Wil@-BvHs9Q~>=B1WHzzTbK0W2xew^?*$qE+?d#YvVQ{TYLC9+3>nQBKRm=eT&Wc zyY*?ThfA}i~jP4KO z?q)Q5nIu>2{LJ%u-IuK4f_iLy`AuI!9cW>8y3rda*mvz?tS0L&7ev!EC1dq2)p=$* zb>%kBHTq5N1AC}81>Keaz&%~ct?SznI~=8+7qRBZoh)O1R_C^?NYy=C>LW68yULYm z+um5z;()_`b$$_@{Nf}(HbVcAP)IbgdVI$z@r*3vrCI zBAM=kV<`pek_?(vuU~_5DteXt$Fj=R5$mqnc)ip_RuH7D;VMyCeF;%!cyRq+DGUPX z`BL1M{F#Ooi@wG99Do{)kvgUaIwXlM-_C`vZ$JU-r^GSClBreSYD0H_RIE4-jwZ#2 zf=pqT&oczQO8VwIBb;oL`;7P}m+=(Q2DKKLu}ynBI|E-{!Z@P7#QlRpv37MmTJR{P zg5BaZAPDqLvf5^Q;7cI;s0jaYoIK29Jndg8heO9DMeW+tWnC?|j@Ztlry3#YxU{}3 zQhyjcDBx(`iVZXdH>ePd-+k}BTD{xLMQY9p?(J*ccB%*xTXWO;u67o^$8+k1>cv%IJ@ zLV>8~T@v9I3d;ZRAX=M+rn4XZrW~G8BfcLEz$6yn-iUiURH7$FcoU)cXxs5!7Jwa? zMQ^`!t%-|W+FT0x@m(eiLCN8<6~ns zsXFqXiFRw*ZB^1AYT(0YnW(V)QpY)cEI!Z+!6~SRJ!$J@5*sD1_7LsvBP-g}YIt-E zOXwkv|W-P<32&?u|~H_1%qoeVV^5MK!|FKGL4hz4%?#Ev(-h zkK3D>u;^w;att{wS25J*F2YUpBn@^4%G}>GONRX#d<5p}ofzx;xmO6> z9Bq1WemEwEqia1ng0n-={+rcVl%_rYM6JFpOUF${4*X2Q^l+D&ZWdMVtnXXL_foRT z?`NfuO#M-bqHV3|kT%$^CT+ywsEC`d)TSZGPQ;XR@;I%D%gufzzYteOQ$51Ve$Pa)*BH348W( z8S+v&twQ$t8(aXc{bL;U`DqwKJIzNx;nWNBqm9ut3q?8O!g?CwRewche~EoXx4MF7 z4{@!(7iQClJSZkCQdYXpAI!)Iscl=!{qlwW;8|MOcpRtW%hUP#mF0_xi3Ed&0=p{LUgXZUT6Th!C zToVHR%aok8+5b;1tN-wT{8ujae{7ol|8D{zu2)Ps)=n4RACi4PD$nf&Gozy^X=CQT zJuws%+`KH&7XvK(eDAg`-TK^3Bru&8aVO}n>&3`7lRjsJO;91)RHvj+0Y5BDx?iq3 z_Fby6`Q)SfzmBC({9V)&|N3u?jFO=Nr{9ze9qNyw51_YDe-D8_FFb%USEsqWq0a`R z4Qu(=x#H?M!j^5(`g_Z=THA&m!ba@c*6E>fJ=czcC6jjf9ECX!rmtrHTmQuQIcxT! zhuhYlfhojp^hJZyL66YEBVwD;KEYEZOjWyY9BGHLqACR5E`H8yzH#>$axqHA^pMzP zu4*{PD^GN|DEU&ykeuI3L$yn zHGQ^wVWFiUA9Ca7&F>0P4D@UUm4W+o$lmjN0$C6fvgl~CG67wt0G#@s@S*cx`=vos zXrHy`PYt~StC9*x*=M&&M>`~N0QF)%Wo!m6X{+6@s@!k#!cNY;ORHa)s(jNIT2tYL z11pL^-SOYHC4c^P29*61)(KYq-=4aLwcRg&F>S>1{~1O0-=ljFsUaxBf1h<~X7DDb ze~pV>JYr^$c$3@4b8WA_cxm4IJ!PcJiZ#68i$=S}>p@O{NJwXg;+d$Iwd#G9LxRKa za6LWwP)Y{BCmZx9K%nn45w~+S{N=Ylne8TDqSSjGTFtLpuwNJO3D`RdvJK2L)a1-{ z;*y32eZbFFK5zMVxBS1z?)RlHnBJEcq!%L7F$I&XOha;(x%oDsRF?VNQ9-mU0 zHn=E!Fm4ob80%B-4lay@NY|dxdyblYz!zw^NgGtVw09*Oc6I)f^}$bAVQ}ii>D@(d z&WoGfxy_IRcqFrEiNEL*@rpXQI;X+}3k$(ZnHn0Supjx(SNIp^E_yFlj14d_Q(-l4 zuSA1JzZBL?K(ty5=vSLBcB#{=-KTY+CB1*S(-%KmTDB>A4EI{R4s$spB6e6M_1Cp& zjwyWim^t>yN2pXtNSc4z$U>dD7|D z_U=xSa1ba-zp7h?ASJ^mReVpr*h&-!8eNV_!FUCvX1&)Btap8^js>)l94I^#UL`Nr zjQHnlC;ehg3M<)2aDg&VbF2lSTkE9{5zM23p^=O{i2LDI>%VOuDpP0G(EEf?EPbZM>~a!UDHqeD2CNGKTZ zF+UAe12EpJfzdmB!ZcHZs{O;UV(kPkG5mkVRZ zbrqNMocA88vm_+S0GBK*=;#r0JgC;j_XC%$nrROnwMVf3jxo2}Y1+D(!QAdkqU)e! znhAhAbQ->>;;|D=;!oRK>S=7e$9``*&CSsYh>ja7Ed>8{`>%Fai!sB6sB%Cy1Rtjg zGb_D}Mej?lAylliqf=or;F%xl;3#$g9KGvrg9@JLjS3OSDF+m9I{5@>K^NIRYzs2W zbMsf6`YKfGm-Yxq&l;~s-=p5y_nLI7P?2{kkz(bYu_f%Zk!jf7oCdtN?UrNHw6K~q((1ADXjLwu%S)@fI61ew5n+yJzSM@aZ!TzJ1WEnH9}sTBzT4eAbN zPCS))7d*(Z!aTq!FJrM(pnHzYmpNQZ)Kq<~7$CVHZ;j48{1-NTqj+$|8Ad%t&_ga+ zze7jEyjWE!IBoJCNjHbWDYN_sd=FL5$FJ(-9;u)a2Wc^O+f)v#>eC3u_x&bWr3#(h zA*tF_ZZ;~Tpq}s1oTX2B$FKRxpA{E9eS+1RFLWuteXeSWj6Ly@ss zur5pR6;ruj7^t9VT86jDv?9qs^m3GMGyDySLecal)2d>nBRU-r6%kD#RHT6K`C{&9 zm-d`ln~G|DjhP80b0l6XLS`?bsx{bZb)5b$9SkmI|I_p5=sEo0dK?`gDzcAzjGwWE zPw0YZ`B??IkPH&Uu!u~i_;9m8{a$<;W$ji3U)^3I&uWLzyH~-6FAf40=>vthx9%{G z)&(GX8t<8NDNi^|H9V_?@JZCyjDT%z8(a6uL`zR?j08%Lexz}Zm_4i8vVF8l7t-4F zY4Q6LtsIB&E)|69&W-Hgek;E6Tg>%)i@{nXsQ2mT8Tk`W771HCDCVv!he@4+2r3^3 zK$Ie-8UueqlQR~E_>x$ro?*z4+~B;d=(g~N#}%txpim8Zd)aiH_gjgrCGD<%6#TE_ z%qm;YA5n9};LI)TFr&Em=?u4655ar?mHQ0^{O@j1t7dxMoX z9eFP^!W!K9!64;T_jfp~u<*NDt^4Eev}=ot42tYK@*4vyY<(syOj*wsA?WDZqe8;s zS6(t+r5?0e!>X-E#@;e-Z|QFH>t6@h7p1gZrOk7rQhS86SkS`!w`f zO6eRzR>W7FLzOQV=11yPi=Uz=cqnxE1uE-~NQoT6rlZ}=!K1a?$Zb$qZSwTK87MV& zUjZHFk#?JlM>wSw_AR1*ry6ik(iTYSSIcsW8k9mePCgSlVshbP4{M-ZKG985){x`m z*N|HkzpO!KV1i1KMa0jq{sp#%f6*c8_BPDlyd?Rb9(P zF6);Co|nEgRsi|&5E%%?c=}0n#h*g|(~vD0&n))C46%)Hce#eajN26z4-A+4< zG)XT_`ZCiKyfC+H1^T8d$DQXS>Gcs%6=3bagO6b#WzdgE!O?05_5^em03+xDIsa9V z-8`=Ugu;F#s)Pj-#FxqnXf#Q3JvTK{)1d7n5Cg4CXf}vI8SHAhC{K9}yUB8KyL83- zLs<@pzkBgcN06bWz{FtjnKiS0r;(6u>DFH}X>Zf5$`Y3Gomg_7uq0#@bZ{ znK%$A*(t!^*C86pxQ#CHb=+&x zxd4ncK|adXs>X@dfXNY9!M18ftvLK)thUvQI|uvKZ)er>oq}jW6g`~423UZapQUGF zDVB#3cDB{4B~gbDJhRZJ!tFdyc|F3QcQV{0E#0N<;VkNV^ABgQ zAJIiD1NzbdXJI%G3$OUqZC-k+aM-I*=Ph(hZ96}EzEgX?P5X2YcE!@7GE|u=bLZuKfcG0n&`8j)Eh$%DEu23OtD#+^nQu4Uipyh z#P;0PEE;pO(t0ppy;C1)*Y7SJ7%S%0<>yxeC1;qKeEcy~jTMOoJDk>#?k>HJ{#F?s z(lc9*wci%Mx!yV2SeO%b^ci}v`;+V+R+3yY6@!bcN#3pbc#F#A!Kj5H?c zmD*&C;tN?<+0oY9+*%L{7KxYaJ%+neX_*J3OCBq+)hLeGknw6aFe#%3hyxwFFFJBE#57_TnovIsc4NY4y~afEIu z8UC>J0-@|C<+hfe=!BTa<$l_nnJx~KJDM%dk1)`#s_)^pOnHv&I6GO-dkVmiS#0mW z$yR8g%1Kx*RRZ!z9dcU8?HWd&!)NtkY!h(OEp#2nw?=mF#sG8%lhZV~vayBC>Tl7k z()SFz^GcD+!xG|(5xXY51j|aE)N#Gk~Fm!?XdLa$}SWHj9-}P)HU}+)i%gdfaGT?v&bD z2b}y(6OuN-p^Z2O+B@Q#$Vme3us<=JT)wmG2}!NCg0I63jLRt?C&#QYFV8sQG_>Vw znlk#`=$d1z+vX-~0b7eMy>StkZk%W=zI<@O}YN*6+VduAfN2d`sq4u8osy(Cbu` z6?|!~>ABWKf-O6HwsvBu-cHndA;N+BU>M~nn1plh+SkvfS$tF@FFJri0{>uUsU%V6VC5EB4?`;-f(6#Z4n(XHPTj*9?=Gw^PHz9A!tdBq z34eOu$78W@{?BPaDo3`hby_8SuzkKn72+Uztj;tFvCjHUio5P0md4zY*KP%uJKkiZ z`ZywL*FWRf)@CAgeusIsySon9ovBq z?*c46GvCN<`MJL9sKfS4QN(;L!Rd(URY3Q%KlrUgRNCJ74gza-Nqa=Ew{?{qM7czx z^H=yXpge$)1%W)|qc=?(c{bY!Nxq+^e?DU(U+8EkAd0TRw_zNVyHA#%q}uI0R~or+ zp&{fA_)@5;G19P^&p_Q5mOK(PTYV3BiYd?Jp5!&(MQdf%bFJPHeIf2@rK&PG($pF4 zBP_rDNx0;cptZ_dffp#;hd$73{?}8Qe1QE2HC}X`NIzm{$DGo` zKHbhyXIl^dq7z;Hjm+>T)&DJsP2gV+TMq$J}974EgI}g&n z;F6&@n1T@E83Ik16sgt!n#mCLA*#6zw8W&RL#Zx8Qjg-GSf64;hd4zRRzYqySQ zuXaPzh@VovQ2}g(r-!M{nyAmt`J`1MN{aXICWSPph_5RNW*h!RUTsMR!nP zpQsm_Q+!QuKF$N4!$)8GH-*o}MOWj-3$wkFyhDX=4G>5k8kiXHtO`8;k)qHiMVy@B zzzk-kK1amUTxR}1Jx$n7Q>PLi!)ni^_{J7LqP7m9KnSe-NKGn4q9{9OcHAZmHnXC^ zU@&~$VO@hb5O`bFCo-g6qjb_wCu=3i^Gz1%E@#h{ELYn0Ll|!=b%ouDVE;Qp7Evn- zY%{Z{&z?;Q!oe;wA95Iubm=czZ5Pl6Af+FffFM$B1quEwYqhiwG&ZP zC>6~bkF$n#32tWhd6Z*MHK|v~NdacJnocFN^|ZtOwyNy7d8jwHSQ!@W zpX-2Msp+k*-ax-C2e66ajzc0+EEEPLrz&;PkZn`2qev&ruhg)&i#;n7#j9DzgG> zSC&&T4uPI*NwJXEWwXeC2YtpZend}se56g>c|^?yZOKt8@v#T1tHR(+YOlL5VNncI z#~eAh^HMSn7{X}6XK6wA8U|2XS1h&P7~X#-c{yClA=bdNoe-M#uA@|`f+7{KAj1~p zS?=%fF5swBCF@HlOnPikeY_7-o+0IP$zOcI==0a?N6Z&Et$+Dn=q3HpT@)3%u)O|@ zkjdATb+JD>^k0sO-%$0SNMI$ zp!dc@zH@eQqMS^zLmk(k$>#e4cg}YTZ-`TouB}zi;ie@Z6igFdHh6WYFTQP`qS;R- z?c#^&?~9bfEo1!YiB`^zfVXE-HfYT~%*5-08K0a)?Z@oNo80iqmy$I--Q8^Jr7G3P z`oO%BfYg$k*>7bx%zZ6had|mODOz>;4$dC0?q;#-pzN#-Y|k5%$Ph0<7#&=g9QeH&U z?JnSBzce5~;pOc;I(&EYYp5Va4SrSdO=iGHbj75XSgJD@tk4+ZNuM*lqPgguTJg(^=q41 zlqBLt2aEajv*)?*TW$T+&7NUI<8)Vd?P_~~IExOrsGpOc z*ePn}HdW(_P3_xS9JXC#kSnCFMbOc*EV<8Cq)u>s@k!i4a)zt9P0C!bB1Q`J!asr~)> z?@<3uwEGQ;q>C!s9g-~CKJ51HHdO-D4AHlZ*l(qPh>}9_&5(kleUTIS$MDMM&k~7NXJxIxP1IUt8dG06EvQDEW^-|Le zxv8JBvm0#FtIEj%{#O9J&=fTi60y>>%e3S9b;JQv#9dku3bHvZ2Cw$-TQNT~wWc*R z59VP1*l!}qXDAm*9U~%&=5<}#YM&IM(vT-;IoyG~Qrpr+)04a=qRq`5hsy|Z?ar06 zbAqF)I%($FUdzB259YulVG#$@nng~pW`SdWPFcBJ=aD7R02+&KzKDc3=M%70q0*DB z)f>c3(3cUsD2Wir`vnpO<@F6)BpE>MZB*n7gzIYNL-dEKs2+joMMW_EMDSz7!hf>z zJPhUK6OyJKXbbP|lZW3Pcb&}A^eKM%i6&>HB+MrJ=6A(YT?aHjyQ_`i20P=C`ybHW z7AX>@QC_V*)q%fR-DCSAS4TtRq2hrlP(-*sa4f2#>BPEvx@f6;92RYAY(P)LLvhNP zSzCUX@eh>-A@&d)p4kG7WnvKfxS-ridS0cNDNaR%e7GbPC(K$mlhIj6)_I{)_pkK;WS!MKR&t5@C=pr@A z&0_G*ho*pjFKRkbZVpLF-?4`HlfX+4q!&OxQ``%Tkl^B)@!l{ew>?F=Qr3p5sDx2O z-xqpZqPnO~HVMFMkh8pe$~!zMBP4GAL1ivfW2&yaU)uG}CkLn*5Z$)du=LIOP;5ta zY$o%cG*y~$sP3nN@`o=)mIp(7M}D^!%m#rTtgB#Dx3^nR|*3-2iEb$DYm8nB2+G59UYe|e>{+|#)h$NrKhOa%F;hjJZS2f zWq-}{@G#sWc*w`^LxCe|X^bzPjmUD0+zCVY7=x@VJe{X|8 z<><&mH$XbTwWv9^8QPSq(eEIPyabgc%G|-(B=P@ zR&GwZnGhmIbfOHi7yJ)dBg$m6*9)Po0e;~o=j&~h2~lMCJG02Je|y_d@#%iqI_QWO z&2K(KFmvIN7=OxfFQp5!agtEuqexLxd>b>5ZtH&A@u2W)BPU);71LVRv+I-L?w~A) zt7RX{nHw8Xz56+BWOJjc_sF;9@Q+LXvFRyijpPT@YbE9qL zlM?bMEj8N?i0&uOAkag}B6w^~0GQXg6lpBB-iBaPn?(%7Bc?_hXeRf4o+9^$zB(pk zi+XHgVYBMdqk*b#k(?gCz|-Hyn^(agkj)K7L0x(f!*yR7Z*)*jY+$7Nw6mB(PnWKq ztv@4wkTMYuMks!l8>8omkR5XSVtT5|n(|U#9}=m%qGR0bny1^VS^oP$Z*sR;ygXvF z(F%}Re$!Xp!)b-9_NB?!!fkC^&dE8NUi7;nJ50!U0b7fP5UvT zV6-**ASFlZ6K8m<|8DGhx&KA!8#&-2%f7ngOiPPAKwzrXSqHH?QBk@3L|p1U1Ku@6uu#e0qpuTSrw@@?_!_|}U9PO8%dPNxb2*`AWmaLsGa248csEk{=vmQey9&yVy_(6!*&b`k*K zz_V>ON4Av2v!7ct9|7o=IQc%pLC#vwVksiG%tmx~aF0C>NX{?sHrBOgsNV_rsq7a% z8)$|F@8$(I??zL&0Mr|cFSa=~rHg5CXj2vSjSBleG;pj>)@WdRr7;^Fwj(E|{)F-V z@(m=tnmY1w^M>lT^Q4utiUx3qf@cK-p+O=kw*_}fIg>+1I1W%xUMqGOi)@J+Jn$RT=&KT^qJ8U2)N2{%^J#I!C8g}b$=@ODUq_zE#Mchs`Enk+H$1J~Y z(l4dx*=%~Mq_@brGZr!{*sReCYI$Vogqch_{kfaZmsWVtn_WAe1swL<66c>IAGV=% zaX?ZrJg2wU%UA&Igw)9QytV0C3Tjo>;|%hcTxoGV!$jNr0X~ifh$i}gjT9S)9pm}>XyVt(u;LBg`1Znw8zjp|wtmQy$tlh=MrA*?&S6a1vpA3Qfw5Y=E?;BU&bqqi z`f|NZ{|>d!UgCrHRzq>0r1*IKrf;>TXK%n5SF`!noJfNYOYt66efvIpe$EHkB=T}{ zJm^|8gkR&hhXglRzX17Rb$pm@*;7?csvRr>!4(kR>0wu8^fV#8fo8Y?Tl+vQ$OX@+ zI`Y`pPGN%WAmLH&xw7$}pm^bI0)$(rS^|XVyCdg?oAm-0W}9ANCiGM+qlGQT+w)erj66LTIn|3GJRel7_W9d(u)YP-`aTjOVX3INX z-O+XUy+Hxs+siY+u3uMqOLVs0CMPtIgNe`FF-lnrn=vU|Hi{R;bvENg?iZT{6NTpc z%~5`H5C44(nWD&KB4yBypEQTuy~>?rQERtG5C{hjK!-|i4LOH<&czvpn4F6El@rcI zVz(i%{ar|XJ$J&g%;eKBc5&3c=^^>-%@M+F_R1hwT0?vGt?j?GXyxr_RppG>IRF4{ zl^6kmNXgcaV*|jc7|?VY+7$8~C)ML>c9`4JqToSJiQV~`=rD~9>$)1|Lm7hT-~Ih z944T(`ms27Nk1P(jbpQn@4V>PE4>xB2yEZ$W-D!yK3EbIs67@bC<4WsuC>R^vHW3qy>Qlhn_p1&qguL&CT5cayta)mP!n=lFHD+OH`(Onj+#s;sI)sS?Jp-y z@$b(IvyIN9B_IrPpXb8cZTM@-dt>L*_J3Dzi@4TBe0ZhoU=Y$*dh(iM!^XQI%!j_8B)Hpvovu_HXe&&zQw%dV;!Rtni5ip7!K{NWgV(h zm-C@mk{nj=9;eEk%L|B|h8i+3K;o=oK9th)X)^9lGVEQ^pKdE zgTuIy@szbxp37wUti-H-50r4wAw%~Na}WlME;p}lr0dZYNL2RH1}bs}NdY=f zMl8A_SOu+)l11wi!c9+%Gva3iJdvs>Hs4(3b4 zNrg0Jk-)9rA=K^1m;*pPpZ;0U8@VFvw)9UA>@03PnqBjxv#jcz9oUD`4H*3`!=L#~ zDf2>isU3zgAKrR`F3URgJkwRobFq7Qwj6u>1jW{j|20ewAVf>Hci;K%mo-tAW`QLy zCzkc$nqj&D&4L@J(C*pBqdavu$G}+T$tn)NTU_VGrrEp(O*N#9DJy0>QxlcLwJ@|(PB z|DHs7(?0KFD?k*M=i@h;HYt4yb+Ooa20Cur!J>^C)W4|^({4bZr*v5&s?t-Flau;d z@Uff>VPQ2wzJ{cvjc3_ZIVhC9_P;+dA|{| zSEI4;xNt2>!oDaYEM&F!aEdo+#hV$N z{yA;qKkSj3tAR@U|B(xzZtmF84u>zsuSgzq3KVHeN^Od8v9gMb1@?r#xkssPjGKrv zJlY%cOP{KgT_j9d*zd*cc(f-8N7CHueB-t8n;c^2&Q0Dm$(!mEv!oe~X5DE+F&I@SytGEZx(OVMmPk7k>U-N=&fBQWc zksA;rHq!mCCp`a|O+;Vwtv0_20Y7|A|9heN*(z}kgT5Qu4;(!q{mbImz=mfOAvu?R zD;F;&_dXI0TU|!Vpi1pH$}-|#;rZ8?v&U+AOn!Ye(XK|UV;oJ4yY_3E6V4(SZxsK2HY zUqtzqEobNEc5oS!ZXVC;gs<68b$I#s=x8f=HiXBG3+N1l1LYe&7V2H~3-S)FSDv|D zQc>yr#U`%C>UHcc+toXFW4^KaS-~-sNhbT*D_iu5-A<2;IovN?+8tc z_G)|*NmJ#B^T=ZORVnxD{hh~!&(o|`vefc4IlYm;F<*%=U6z~+GQ5hqstDnZc>U`$ zu1io+TV19BtS&h#_F9W9`1SL&LE77SaI>{c5zhsk*A4qfL1-}YcQ3p9fvU~ z@1KGQQ9p{_k!w9l9WyZR)my53i8*{KvG%f+Ef2okeO&;JIkryE_amblq90m##!JI5 z=>T}|e|{|L!NQ;@eN)=OEPWnjWOHA&X+w1VMFbJD5s{glFL7z_dG*DBbRi=?=PE0l zDW}3swq>*UI)}lHQHN^*1e^39l*6o0abX_ApsI>p^ zwb}AP$}`b=Th#80K&i>3=O+4Td(S@05x4*PmMWK%G%HH?W1R_p;SheBmBoJwDO+{4 zj=~)j$u#t}UMMQuktU=zBSEY*4R>Kt7L zM9&^0+95Ipdm60Qljp83-MM5RIk3!L?tgv5sit!JvFeZa?~klQVKhl;87G~mkCjkAyVH>no3BE4%~!WhnDmTs!XcHoJ2@`N81wdM8#(+j_y8yt!>y zTB35Uy;xi9;l%03@1IP>AG+-7f4oL_jer%QD~l*VIVyl4CMYjWjIV>!7-p<_mP=7Tg^!8axCI4#Az^?(Xg`2?R)RcXxMp zcXxMp=bhYpzgxdo_1^hw*QqTtJ$t5m)>_?L(jZTuj`fo)6yS)QNltnvM_Hnt?qlCu5tHpaxU>$`7-+DWVraml*pJ<=a}rbE;l;gnyJqS3iW3k>l{%# zHA7o3o>hJ|-_Ar(X4od<`(bQ4^GtIwg=pdHLYriAe(|23~L0b-Z`cF1bke zALrjOcg1Qlxnlay{(vqLb4sEm}$~ApyBHnHk%00(8-< zt9x2epY9}&@S(mt?eba`v0RWV*aj$3GAQ z6+<-SG(Lcd?K7EKe1pE1-gC4Hft-Q3ibwK>rqEaKp(q}jgrOi`6hTvkY4%w0$l1&N z5x3s{(O7}=nODdAbIf-or|M0r7WZ4b6HhqW@bmM2ONQ5z;i018#(j*7u3>NMZZQ$J zJI&9_zF_P$uK)&&Qpsk}b`Q(MA{Z zdHbn6K4;~`mKY-yEnCfWANR|3w7ET)O^yY}wd1F+*!H}=4Y!ByMwDy}OS1&{rn>`3 z{67zsr#Dn8y`AqT(#w#X6VoZqyas*7GmCLeU~MUN{UP!sbRw8{%DCk~ z`->`VgSfLQRn;^95?2zQyM*6>frs<;TLS+inc{pjbz4+aj2%H4q{>Vx)+Fcj#o&BU zQfWSt!RWS0ZbiHF=LY?$#QsrGwm1Tjm+Nvmp=R^&(bVBj*kuh{WVqegq0r?JdDyxk z=NtIU_oK3`l&fPZa!mjbY`E?kmGlS@nY89>p{4kc zEV>UiON6&oWiQh)E9Uxdc@0d*6{=b)UfFeJvk{9&!v=d&O>NRb;6UfrWd@Vo>k}QP zIIIhi1Ok}aRx?1On*4(r>auZhNIWh1J*V8F_NP~v7Fo!f2b z?4VJ}MNJIq%2O}A)Dz2KIVr9CZ0JEZO?%*oD=*krT|r}vdgu3}UD_<<;urnTXcv@} z{h|}F(BYrDr+qSgA?Qa(+3*YM4uiAQCrb!Z=_Ys{h(c$S1g@3Ibqsz?E5xbO+$FGJ zg-bw`d3(nJ!6jnr6}-oIa1b?6^SOy3S;pFuTCaOYr$J8}t%+#XE<_JyMxdHYRPky$ zG}h(HB9N4X5@Ev zl)ZQ+Iv)fv=`Kb{kS?gVYQ-hxUc|MaZ^5q&fC!{IzTy_w@h&%wFxDrF!Z7V{hMAkO zNbe5tKTa)=giEK(oHN8_onPPgxAv_mzyye^N8v#kT4^7#X$54d!7Sn1jNadGs%qPS zrteoX9!>dcNa9NfPqUxBZw%7dF2s$R$h$SZ8H8Zfi^4pp1{ROMZ>}Z>K?#3h#J^EG zzbWO+gO5N>3_C<4(24=N!D50YL*G;+X={M+sUA8#c|k+lxE4s@rgmzl#O4glms#!0 zy;R`$b{#OZA1+qzs@_3Z8_v$|b_bQebd~k=&OPuCyK<(I#pBj*i~J8Nkc+I0hFHI% zWyP1u&^ICi;e{aqlIvKPq{H0-x$?>}tJdV1pI8$=BreKu7avwml_F0&T4NRfXu2G?(u!>9lvL)W_8(_3V~a z8Snyo1Pd~QS64aJPaP&Ikmcx=LumIH%F#ghVF-3$-uJ*B_IdZ*0YtdVU&Ln-H^B<9 z9rbE;h}qv@>r_+}vD+9i(<7uMLgSoTCwufdOp!RjQ|r&9 zMw`m`SP+d4m%kN@OLj)BqOZ7KxBdwBUpf;YEY&Rg>uYs`9QedEF1W9UL~iizX{V!+ zok`V;f<&=G6PrLjdxHmX(^y_LPyPjO7I@r#v^!kuik|P~F*_VKMoZE!luC(n-i&G4 zQdb*%jCwIoaqGWi)sf(Gg!9)&!;T6)YPw8g3$auz;2+s_er0V6?~PJkOjGia>uDpr zbT)Ri6k2@i=@F!Wt6Ks`?Yho*rbsCaJr%E&USy3DUgA(#DvkYpYK4+=VWv(p9v}=% z92(l)%QwB7z>Lx{Sme2gxWV37s+=vEz}n9#{4VBh&7ztPV1%^YU8GwMp8N>8TnzCm z+^sN3QdZ>3VtSp9;DBj9Ivot&RzH39@32(=9H>$%g(60R$socZU_+lN^$Mth3&Kup z=&V1Sm}}TFPQOhzg1&W2?n~>0)=E9|Q_7_LKGz1NXsLztH3maQ|M zC+;T96adh!_F1p$xU}TE)2j3SJ+sL)XTN)7m;ka3H3-n)O-N|feA3*GYM`^3<7a`MLPP%dlgkcUk+I3%?;`Zg3jT1a9ZcL@ka|E z;vHhV+R61?AvLx9V!GDMTX^-xf%&j)bd*L48r@(eszrKTgRZ`eO(`rECZ0mGmemE& zk3;tc77-rvkpAX4G2Wl?h6Eo|E0x#(fC$EU|5Ei7k;Y0RJJit4^#H%QK(WZ9yOko` zQm!tbpDu2QrqUVBRdO3WZp^ZTgYlKbTFEg@1c%gp!2k6wOKS|ILkkDjiA`#l*lCv&fqfVzaV5H z!*@oy9qA%VS(*WJJ{m)}Vb|D|>+x<+N)`x*hozHJ!LA3Ee#}eD@s$I8Nr^0RkXRZg zSflY7NmJgVe5J)gG=?wp!E#=-*Q*VWnHrvP2DR(L2$VtEaf9x{UZW+iXDwB}2*Y8jKiberj^;jhhk zdOi}1z?#^(`JpD7jGefzKyo-+7}4ayKWr_afbrRyb!DoO5+1Cg!`{B1WY7=OPL4ygOo|HIGkFii=IF<&!*ny<@24 z0)WCv(*vR|{TZw4|f&ytJ+ZwX|?R)QTAWrCRnHq3kNCGeP0?%%RJDdB1Fa@r2_=x61cNOJ2T;W zXP8W*lrECg20L5w7cXcbGo4fuIbe1!Vmjn$Bd%3$Va@6Y0~+>Dp6 zQFq?cF5$`s@`Fh6!iIS%hFa0}0rgA?y-CJD23gr?`&R05Nvt1@Z7%8kmk^ptglfh`t$)0|jxo&Q~V#9mdsV*%Y zHDtyO7l|GO!8l+YSLm6Q0-17je1(cd&COhZ)Iyz*L)M1{ZPl&pTzSOFFuq@r_LPBK zj09-6?(PsDWf7M>wYP_`g~iA>1+UaQFFnnE=*JK#Gc)Bq$jOg?6Q@%Q!uO6Z!!Zr| zZHxR9Hn{2~)T31=P5tkk+}6Q#dgJ>>r|bT}<)RNH2#p|+vzmKSdTh1vnXWMdGPFpC z| z2Iy~)8%BiJ?)vgZjS*_ZD?Uu802`hwu5w)Q57vZyg87qzz>mO$=NodQi^zl`%VE)a z&M?!TOGWUVk^68W_#^N`V=u=Ll0w}h>Y}rt_5T5ke4>l_ws8pPeNWu$9tQ zrW#X)@2!|sY4~Rs$=cvN_n3~{cuMX|Wq-o`5JjGvlJXw{M{4m3x=C{SM|}>k9Y$my zZ}>E4XXiXQQ5J=l>G3=9{w1MTp^S;tR8z(0Tu!_%TwGe3ntfc@uzr)KW|_6SP#A5mO&4MaZVpNn(V{5 z7baI%XODgeECIc2|3H?g zW4$?sOgJ^_rOL&ryav#73m>=M0$_x+j5zj7&2G%%2HAf0!Lk2<8eMG6&hEB^vaLc4 znb@Z^gBQ4wdSV7U-ZZ?-E^=$BzTg-e8=KCTO&3WQ$&|~RY3qAscG}<^mfz&G@C4=E zTB-?6eKROjq=Mf5n6S|5#c~#m&M$LOhzHhT$(Afdd7KSx{{aKOmp=-x+O6;AP?5&T ze_n`1Ff}z5nTUJCmIDJG>i)LJ@45HvB4xMWB89cB!Uz%bZ)8*bbo{fil#6rP0qDLF zp!+INWBC49M)HWj;1LbK97C-_9<~b?%yh*2AR{9KF#QHuCJfZvGZ@9Kwlsd*_65|m zY68r(>OSnclFXyRN`OCm5&$gd@V-N=x$B*ov^WHwWbZcwKVy*YF#X@h&#AJwB5@(m zYM-C|vaSCskN}Nng#hhr&Mu@`SFEC8f`oGe)-W;++Lylb(~ak+Ifr6)L0HZY+$Nkj z+$Pc}3sul?pr>$$5c>U#NRk@r;PC&6to{r!9>)KfDxqZS5I<0=%Hxf{(C?u+aKq|g zFMVbyTKo$3xz{kuH&LHWzC(&N5g1XdhLfT+&!4npk|)NKGNj6#hE)$}6cAc#dauYj z-EV)tv2EcC73zHb8#(?I07fooDmT|ExXu%=cNQv6ZHz8Qt;?*DMgRpG4nwwY)QZ)M zmeA(;i!araFB{n1Uag0IYd00spa7wJ(Ckx4ZQ$qZ4DnZ^YWEhtUjZHe+_o|>z9ItI zWw5a5^JVo@%TQ#y?d#V-THs$G@{29F=HOvbx&AYyZ(qdt6PYm8He}7^SU(Qu(>qSH zjt4xDVG(g&rt?v`+WVWYK3noA|0f)2^?*WQlZR*7C&nai-h~3$_T|R*!q3HrdYe3@ zN7%0tjCUUGZr0pJ9M^iVpVl}91_Um)!_3XC=Vn$)3Y**yiw(GX zJ@;Hq;4;Pg*2sSSoQQ^J?#^PNkl@=-7+cgc(9EPyPO|q>K$*yc&j!DbjyZAySl$Dv(!q@h6Hr! z9y6GN?L1Gpgt);c!JX5kkSdOZ9AnPhk9D2ecRl^*Mobia>@MT14HxUeezfR3)e1al zoDpx0t)4gIJn!xfyVB?CD6=7xS|#nb6pUKzJ=-T_w0-kpVBeSQjqaD$S)-G_qF-uk z%+Q0?z%wZ${TQ+(+P_Jt83+w!De=6wUhyZJ=phyfM0~tLqq=AQ&YiyNvkAW zz)uQdjJ}IfZJgY?6D*Xrz;8ZhmQL;Z#OSVY$2~LJq_Gh$M3k*u!o>T7&250Gy#5V` zRQn@#{tijgq9yKRmha*R{z{@lW~WyDJYd$88UJStjQciU?aux?OFe$-6V-xVR+=?? ziHm!~7H51iviGCF^RTKn%1X)!Brr&DSz7pJr&XH*?I&mhyNYx;8*0vP|&F8v(+Xko*Unza&gfth(>BOW!N?_P|X}-lekv8OvH5 zeLQ>D;ZJh$&CrwO?bOo2UcHD5mr&lZVhV1ktXMl@*H2sZ>CgG4xxq7FrfpHLi?L-5 zE-_10CLPR`I&QIK(7!%tyRO8=g3J0_#_bahaOBT`1rWDU7%y5fQZ6cLC8S>F3f`xX zKiejh)g+O^y830t?dP99SB-TnCp@QBd~w?Tt>HX|1_B|Y&@e}gexHVJmF&z!d4RyE zn@JR-mCzn|`i8K`)Cj7GJ@YO7eQJ5f%H4#j%qNBBoEV&#ENb2!NX3Vc#LtfGp zgpXn%xMElOCPjMsGG z=X$I@++P1R;}q|3@1|b-R-1a zUL4=VdxQ*RQ-uhvuczaSSt0Ec%V{;fIpCZgb$*?jm#HT2-AZMhbII;?H`$W+lkb$l zNV4jlksTwAlI(2*2C$HQnRQ6snUg4Pjhn0@XON-0(f=hK%4k1@fRVj+n~d?C>w@oy zAo=X@;dyJWz(86+Je}gI=w0aSxxbeHDEHE-tbQlCT}sEzDOPHJ6tr_35l;7ZYC{<9 z4}*|4krk7~2g>Gfan2dGY)vQNy^i@{|Ex_(=7`#D=7)WP?ZRQ6{K|5xfVBf#zg5Ed zFm!DeHJMh?#9|3OI=_LqG8=%>xt)s2()6J;^tcq*=z|L(5z~?yTbCyC*PVnCoN4m%Aui?wgx^bVvPz5Fw9PQb?~bY8s$Jd~ zVLa>J>Rp%qrv(VoQj@sy_a2>@P2+L&Q^msUGl{xYVZJj|Tn*uU?I5t%S}S{$^4)zN zx8ucCm? z#g7)z+k2lt9M0jk5EkL<4g!S`4k~U3AUChHUQk;7tkPR1`59Swv?Z?TX>@iO;kMJ` zGleDzrdlC0GlzB;Swd%}yr+`(k=fxKXV_Z&F>9~JJ`_dV?>ZGoAj9K%w1fwz)xB8? zM5UdhRJsVe-yGdOV}9Pv3u%z}V+HkS3=&jHxbA|0gQf!)-xW7iHH@G`x zNs;{w$M#Td?MLe&UZS;JAr7B3;DZboI0gq;-u7~Ez!dk|-o*u~_pfq#D6HdpTR04Z zZWb25bcuxDuGerK8EJu17aC`KUZm~xtn2EwU+2!~!*GXMen#dxjr7_ruU$>f(j>v9 z$9n;u;GS9?pZS>}aN2ma4ZUioI*`Jb8SczJzL4+s5Z*;Klp-w34h1h)1-f8YS~xhL zM9n#1+5CXh2Mn}l_9#Y-AUN6IP}vYUPATj#!x@v>ixlzoVE^1Q`<-uecg#G_*U18qXr zH>!TBcnAmMv7c4|hX}R8P$?5<=Tv?b^T)d|CBG>^osqC{p+^m;(NM-Phi_(&IR3T2E@ldAVyJpuhPE9U zROYv@fN^A$*5yoR-vb9D)=9m*g5FNj*n>Hv_GaU*2OYkf|2DlFOjz4m?=*XR+hMc0 zp5B=DdJ4&Na;Mt<*&S?D*-F6F^RS5aSd8(_QWjwE9M;aMs#1pmHoE38y;{6nym>t2 zNA`k#%5z=G(j(U6cXlUB0!%_vNUf)(Vmj@ASvpmD8XKy2feZew)n9u8kJWaw?QP*R zWCyn;LpBOVuiBZV1u+|yUDFCZk%?9Mg0_f1zlTT4RyPSsgWO?6IEjOsYGsA5aQ*H9;USv*ry(7wjLMp9ck;8>%^YlH7Q z1G~z;lx**&JAz=@L?F;Y@2aSR>LAMrzzL|yQ;~?CmOKON*c5E!@EfP# z2jw$3o_`-9|AZl8LvLAQAixRVp3pv^58@%lOz^kx)?hbkV*2+r6~R~Z;br>h?p$bR z!8+E*h&b%ecqjJA?@B8_Lx#O-B{7`w+BXsnnSlv#fg4wkW8M=cZP2Hj3oGXlaA+9$ zN=&iasC4{gbBJjqNj^S*&AHKB%Tm}13GVzl%qyoOmu~<=kHLIw|GAw`MTpR34ekeD zy7KLUC6nW9zw>P2aZD*Ro)GHCi%Yuza}rn**x<}vduRO<><_7U4>peuU&>AfTV1>P zKR-a7-Xgdn#jr7U<0P%WAQ)YcX#p`Z(c(5Nd`!HX!ym&Fv)J)`Zf~Z^#y2}mrIPB- zET86va5LB{ux}Y3hj-`JXC2}^H7k0qEUfyHmnF~RB@yEHzmkif8t(Qh1a$(VgyewG z>XiFBKZI+|yzv3=l3m@Sax0$tP_NBbdu}s1zM*U&TECs!Jb)g%UV^u@_+3*SH-?~g z6!~b}TXDr4Fm06uKTy}0{jve@i^j5C51RwQChcEz)*MVEEhgJiE9|<53R=UmXIy9y z92^Yc34QF|pUMH>Jz7y-9t~vvshc1wK*T!S@`2X&pATQ+A#$- z;Y$m~(c^Xb7mHe_H*D~Z)G2h~-Fvey?@XlUp*LR((T=?0=#d<@Co*zvycdq_Ya<{h zYT1er0rni?Rh-K=f~3jjz}P`u|EAul#W$0~-?CsUUF>Lv7R9@{aagS46`UWAmFVG#tml}_rb)xi4QEvsJ@-39l)?fzYwmU+a_i|^ z`8-6b3=9x1(H$-;33s<$1q*yh^&Wka!TO7Q+gzQA5V)DIgRxRZ{N)s$$E6ho>05?z z@L5>AlCEIEyTSc0;<~=^^|7=Nq?-K^P?L$K=+u`L zZ-vMF{IS@Up)|41W9iQ%3IYb9Dtt$FVwTH(l6hMo+F@u1}GC~e)(aNxcK z$@r&~o!)LU(1UXzoVaPIT8aKT-u8$=r@&_=^ov&em-XY*;H;5UVb0H<`(YFo>@Drc zS@p-3vp#??FAo&nayVk3%2r|6k2vfBO14rTE8NL`kpZHaStXYNRxq$Pb>b}31S#kMHh0mtk3lk2{Ml4s19xnKF}8|yH_o*;OG~?6=X}n)|B;3BxqrAq>VEF| zfP8sFQJWy4#N!uL;0ao7D|p97#Cx_Bf@l*L65UaK72V#{fwuK}%Jbvt1O+SLo0*%o zM^QB?UlZ#iX>NEwY^Y**lY@qjoQ=(I?xen9y8zsS8DC&Oem(oYU#dXo#iP`?W9i4vhl zec0Un5O=$5sCHC@3HpRjhWu})9$Hz|2|3DpSZ^xQ3Vm6qzF)5gN0{)!F3UNEPU;t1 zw!j$#69)lwfrf`Hi&=J`c`Z4M*2?W;^!#yuTrwC;^vs@1Jv*Qh)5KL|QIwRi3lS!XpAkTBbreD#Y$ z^}hJJ1Iss^A$9SpKUs_j4vfI6b4F&*Mzv+dzJzgx`n5slL0O)t?0a0y8(Qut?VZrc zt(DXA#GMZEHBGHY%A01tJ<}bg*MRI3P{-h5VtwDb(}ZPveW;<~ynPdIx>BpG#AfA6 z%k6JC=Oe#*?>e?wA+THoar-C!$Fkv#FDo)72V3bSHWE2NrYfT;v8GxjlTA7F;m(IR zSPqS5-{B3#xwQ&6NLb#SR5bbX0-AM(7drnS>I93t_@Dd+t230_pjMjIn?Y~y^ zt2~FiLpFucz8vHR4=M{cdZY+f2Y{?~Zg)cum#hHkOH{7_I#%mrBHX|eX?5RmCU@|F zEkPp$lgX!1$vwy*s*;<4C0eCcnQDkx)$)wkFwa&FUa;R9S>VPCrWd#Iw8`In!!_cb z$JL1H*?djQ=&XQ=S!MRmoCK*`%GCn$g*lB4{Gc!zm{51C#qwPHuDP>)c-U-erAeNC z8EA=P3JJy%oIidd{Cl`5O}Q5->g0_?jd>r6%~Tvf6ARckx~8WY#cCJ^9Bvr0E7&IQLG)3D*DFL*Sj@Rd_9fXI6uv=2Sv%jsla5bg)sG7e z2COIBmIukKt++=NHgg0)bbbpXC!WnNW46_TGdFnuFkQEY7GL3Gc7`p}<05k(qEfPV z#V$<}xJ%Q5Umw9>+xdB^;Sq|L#es}w_1h))V3Z|1CGz2Jq4xsWf+luO%FGExlXC4B zE-vB74SrGAx^f@i_pXal;-1m`S9-?wDP69R$S(j}-PJ-=)v7!JxW?n;Z)n|zF@&u~ zFoQb7XD+=oAqo2&5gRl@Eu*pi{^LbGyXG~m9y!DOJsJTOZxUhkairy#7B^CjM>UDQ zS+KTkqid*Yh}RP@3`LB+S@-YXcz>ddZC!zrF^{J#Vu}Gw0ow*ah*LKwB{zazVhSao zFF#C}igj_xaSW%jZiEI*<|+PO*`T%~(ZNBBPDB~WnudGkK~zW1C=`>9GxLvD5Ttyf zU)dhb7!V&VqXf@#ZpA-aw7=V~aqw!(tJN}a*{8u3NRD!`aSvFvEu7jjLPqpib=e4w zU=&}&IxKFDxqQ<(1_P2TV(Bx=N=smvW|V2f3(Cu8!GM~fsk^}>j?8mPn=tr{j}p(G zl`DMs!4ij)v|rXVerPB^6(n={j_OSxT~FH&4f;yW7u0{_Mbjhm7=Y(nIZ2W=?BQYJM zpTuW?ClDlAiY$`E*Il~e1yfegs$#uXOE#1)=UI20y`?-6yPxAdx$|+cp6_!+d8;Ey zz2<#R6pZa6=$j0P}~8KVz6GczoH#$F4fZkQk1|&WWFG(-)uk zVA`s#Sa=7o(XOCNIJR7L&0}*^mQO+4kaGj_B`W94SH8_|Y_k2`lc)sFwmJYEq(F8H!LmSCRvrO14 zP@S0ml=T)GZxOXM!F^`gXM-ol0K1wqO+3;h^xXf$pVqwv z69KB=;u3;iNo*)U zD-Ie3A-3eM&7-l4*)&Vaq@oV0lrO9wX9~SMAoM@D=~-N{dJ%1tdKq}>ajBjqN=;EQ zEXnVYa(bB`*3PyMHzD$0pvw>DsFA79^_dILZ06) z>wC`JWRs-<=dvDlMO>)x3nx<`Z zeet75o!k{`!@~%93x5-B+?y$&ZRXdDkX*By88?HR0viYK26T6nBb1?yT)dT`3I%aEeKW7q6XKJ<_TFC?7jB|Aliyii zPECd&&@q9u%p@Nk#J%x^y*CW4Lel#cyqURt-3QBA|+?HzHzO5x6EpWhg4y3aJQ0xit-}qLWd`?%cj;5tdTt_U^DXSB~6{+Bv z%oLBlF@;N{a*jSyO}$L$LVre4%r{9%HN(j7qIA-m?r~LoCJ%XrB83s&F4t^d$$ymE z+jo-H#vu*t!-(L|5{GEVuWs&)bX03$nKr9r_ln>;rBK0}PBeGO8NOFC&>=X zq?>C5E(=w`kdknS!QB!3cPsGRYq$b;fz6ntFx}d5-jxTf!ZlQkhYJ@Qdmzp-f@=jz z$iFuTdJs&M3YiJ8;`S7w(9=ZhK3zD)G$X9Lg>W4q4S0z6tuCV1h4y1&Q|cXqftk4f=JO-%L= zr}ObYq+-AuWq3(nZ@Hl!4Ye2u!~0(0fBDOdb2=Ik(Y&5Bd7EwI-Y7s_KIS)r(t#&C z(eQ_<*`ig?OpY(nb*^@DT8}@5lp!=KD6I_&(y=qknp2w3rzM=u5pj|*cU6uz%o_z$ zqtQ_t53Y|KNcPF{x*A1CeVyX@D|mGiB+?JYj=9wu};#BFyv%zgEx zx43XOr;9!6(dEvaHOKux2_naTZ9@J+zD4#EbaBp-FGN2(-X9y2!N!ii9D~9W7Rmli zF3uyaP?(BdM#Fe2Vi@PQ#MfsRHp?HSg^M1udj-3`1bXcp^3(tZ ze9+$4Oa%~*Kkc@)ARu#)-h*m0O24@L@=PfIR&#`&u1#qoS^{S3Y@apqP%k|w&&Zzs z%u<`!Zrq*s(5C@cH7=_>DyfQliML9B0(HAfxUZ42z_-%y>GbY>Dup0tcAIl}6Qron zJh*iSt$GIkDmR?$o%`^@pqW#EDMRMhmup6#eSwD^7LjPKyRh4m4Y{G5_{Bs*%0zKw zY5nv|gUEGcaaD?}efzPi-7Gk9-G>#ha;i~}}-&ue`eGD8%lY5SAe(B(O>(L4WB z_b(?t`FE=}-$y>R=ZN%k-*w%lJK~sPO%gG~t~6WuoA(L=~hS6&KI<*GO`K#QVIB-u<+; zcYapqAl6`_dYzx`j^H@N=4X5)HzE`BFT35-I?+AjZ<6=i&p*wUB;St;%O7>`FZJm? zKhrZ&*In^A5&T?-c|A2(`2+)lf6o%5v=z4 z7QMVj_&y4fh3uDnx*P5e*-i}_3>D0+N^{#g%unkoRwYcHG@Xei7mw;z#kPPJG_@x? z_fAc{a4H)PD-X8$iQ4Y-YvHQ@c)SUCRXNw9_8G7G{#J&d=b(k{LfKKSKd$}b)IBqJ z5b~g+k#0H`?uocoUE%o3^Prh)&1W)57_@KoIjK%j9!^0=uiwwz*HUu?9zu9{v$HEw za$&JmC{2AHSHed^b2~AXhO#ewX#IO^9&5*A{)P)sMWsm)FqZNctA5lGeH~ z36^wzZ!_4o=p;4sCdT`Wk6&zYZYJ=~7qTvX93eA+v^+`Hab4d2MBCtTN%>gfDmrqU z<2W4pa-N9V-}dW9Ey9(alJn~E-1*IJx}LE7j5GQvE0wp9?9g-`Jo-@3Q8WgWcv`BA z{Qj%=JoeSp?f1z8Dxi%K(hi9ier)kOlVN=jdWrLom@8n>k}Xkc?i2a{O90djOJXO( z1nPwIeF$-4J8EmQiNS$Ic`L(O%L&EAO6&7Ba_{J_z#q%o`Gb}^Aqy**ub`D0dlSNxBGMZXx_&- z$N_0FgR=!{HyhH)x5#t&skZs9Yqt6KN?V(#;Ru|`2;`m}KI@^X_G1r$qT`kYoEc+oiQxh5grDcMIP5><|8WX!wz4|BG+{32O88JNX^FZg|vIk)dVZ*4~kuR zeMNhIfYL1UDOPxKufB8GwdU!73T>d*@g00V9Xv!A~dIsWyJi|JO zP#P-qI<@W==9xo`cMF55f_vE%vHkPq>XqiVbFaOIx?35~%w2_vTqzaQO<0pN8CvUHhYQRFoO=FA7aL0d_lUlzuRT{i%wqWVVP8l z1l%LYQ^L#|7qTpR1bicuqSLYQ#+H?HL!W`v5O*3V+_-p99uynuY$X!w(=`gG;FBYT3PE$ zBYV&G;K!e6|0(_g<_K@;zyE|cRtxc5it2`aD4$pMY?f@{(OiAQidUtV zgpp2^l0mNd`YTY^tfE*@d1~w^mh(#{O&rM3!kz$NoMFnKrL8LB@6^!yCt+%M$Q@Zi z9YmbzPFg{my0;P?K!#PMBK=8gn$O{4w*ZOwQhwf4z-tn}mz9Rk?&a<&QOATvl?X!d zm$I<73)*RT^VT=~-ni_y`0&RO{(^XkEpz zu{RPy8TIjlJ2#D6{NS*e)Cm;vu{G!uTvG;<=a}g#u8@qF;1zqJK~EM?nB;ndg`?^; z_OZh>?k3%MsWQGIHrHNX!l2w0gphv82zAbZiaM1XJk`@wHq4Lyj`W#_uHv$46)C4; zwKBZd0d%=K2qFHP%fUHXnTm(Yu|sd{@2ms(w@=VPSvn7_HA*W&f(=*KtuSzKz(m|& z*aN zC=@}9^)utjMlKgQPaxl|ibMQoj=(NN#M@uPmaCd#${5NA5M=ivV?h>dppVpm9=3C% zD;}k~;9XiV{ym=`L+boK3v&-#{JW@7kd)ar&-}!9-MFfplQohlJJtU>LW#CEm0Nao zJ#PtZVpv;JvT9Q%r}L=;9EkIiKpDIJhKWt%-YNk5)uA+<&P;$xl}MApCC=85{M1mQ zLL|=n;V%1rg{MK2K^6rq*^XJfU}#yV0FOHLQ~#DIxfr+>n5uu7P6O#DI7yT6z1`BW z>;$%dCO9l2st$%!xftQaU*FvH)P!6w49@i-tF}DVG^oo@JkR~U3Q{A@#0%etJ-2it zr^3NZSm0q8h0N#g)0PCYz0Rd_HzV<{&yg@nYNb*%OCzO>sXAbWe%)GPHVdMZBZn`g zj~-G(`1;pe>-N4)WM8&0Xt~(xv-7!9_}6U|>ir+bl_W)3z4!r$OE>WUh!Qd$BT38y zOnI+BkojlQwQsFKio*cDsu!EPH5=Ln!AVs;?9MUaL$j42t?gB`L~c`a^SaN4?!d?Y zrrFV_HLx8;p$2!?3U{bq?%_w;&j%}7oL2xEqn_};4Y(AnE5;K&_5b$VE$;Y_cKDCD z{(pXrG!Xj#LI?i$|5F%SX3J5>9XilOmy`4}MYaAQ`_~bY;=3E45S;%c@xa@({?F&i zF=Eher(zq*@=Su1i2ppA^!eZi5h#~o(Xuau{|nl1n$sV7{Wg`RL$Z;e5z%*#BLhDf*uj-V_70<&Pr2{qKDe5i6b!cfp$I397F6|CB`k-wqma z-193GGKIgfgzs^8^>@AGxar0_p7FWr#ro5S>%qj~>+J;MztkFn#$? zDZeaZVnS7i{inT%Ir)5_*KiZjf~ToG%$KIeSWL1}N0_n(Jx^mJYC(#4mL!LKIFKfu zXR@NY+Cfw_WD$O2XTbEsZDLQNAc~C47<%35#J@QV>2I%zo6@wQ!G;`QOOZl0zt7J!wblY<4TtC@?1g`=yrliLYWhbRD0 z0dkV>HN8@g{Co`Yb(Y~=^hs|?xskI%Zt)IBR}Fd|{(f8f(ZN)zUCg?`YTdhpp;Z;S ziqdNO-az%BEPF;sdsczjy4SH+yGnnmo$7(C#qQ85}t@+U_V zpf*Y7xpU{6oZQ3Z$~Nk~?K_$zKuXPjn}mk5(6ttlt;3$KI+rp^46I)5P437g1S64r ztJ1XweA@$_axr_dkdWUe4&QhS`&TeP@UYXU&;#>_Q)%0Sp4|oHd@-?lK1ScZ=9lxu zPNfw^Q^w1Xh`hkF{pe;NtN!i2_($~*eHtJjwz%(?^uTzoMuuPsmj|vy&IdD1b?!ZG zt5MsOvJkwj#5t0nTsa*zOBGjPpTm+K!q0_j32`?2du*=eJr2hJVB@Bq{ih>;ebqVq zz;tSLm!A&eVK~f&n)gE`0^32In7HIXZy;-2V}l0CVP*IJeEq}AY`mCka}W8LZCN#x z2NEW3LEeR?IY)dSV7vqR#P%f1MDMhiPP*sBEakm?c~~QDv2c7Ohmpm~>M5dnBJD??%VD97{PYf(={&tj@ zfE-g4ghE`cEyBQVC>qzj|9L@Xldh8?uv;9Z%>$#{Q+9)_nq% zl{rR-FYS|O;~2bcd-am<2DSXw#jLbLq^!toMg%Ik{p`W7N1N z%@DKLS5jkIE$>Ng>jnL={3 z@2d4GbcjzxjMTJ!>rny5S4`A|;)y(TCz+(*HC9?sPq{#rOR|PKgY1LZXMvPzIL$U~q-vZJ(uL8!cfmIa|;)JL| zT7=HRCIBy>Y5@J&X$X+2BWl^U{x1I~EIu08U2uXYxC}!ORV%E14GvHD()Imfj8d*E ztavMmA!`v)6g?Lfi=G8HuVSO;L+)vbOAo#kdmEWVjmAMI;4ui=AsnQ| z1FF|vXnaEo32_d(Q1_h2zAJz><684_PXb{|+^Z^g8t_;<>K9{?G$C!b9mWM~i!HjnD zt#v{=OZQ`MBzO7c-&xAZe^rIrE6DkMq83IVj7z87SkX-H&><)O8zp@ZQ86Nl4VWwG z$&s>-$HmS3$!AdpmCMUVFbU|Y-PcKKL+fjQgr%gtA{P~)%m1jBbcHL|YDbhSB;oY| z4~Lpft1o}6>RrvTiL#L%muzxA!bI|$7jJ;)hX74QqZT%`h~$aI*62@El{87U(1{zK zl%3%^qbZw5mEt-;_F&7{nw8~^R4tBvR*hB*ivbF0F>>s(*f6a{6G7c>F?kbLd@uNvO?Ema`t*Ke(Bt z`B>EL8_rWEO$ib*c%vb!=CSlCfE185wbB~qc5q9W%aIzJZ2gKAZrorg->3?8x$6!r z;Rc$eE6~2W1ij8Az<6OYc94Rwmq?iMj^;6iZJS-+!2zpH*$H)19_594)=z}({Nxk6 z3ft1LnWq{fCxF%k1?4M~g?Oe>LBZ0dF0^eUv1AtN79%90$%uqo7^d(&6df6tgi};h zenzQ`RzB}_0MyG~JWw9B)A$uRh?PbzL{l8md}?BJ#P_PVS%)zoT8^>Po?A4f{pm8P z!h=B$L7goD;2;SLxWYB_Q^FSuV#*EBWWzyDzPcAW#uJIkZJ|okv>dl)Qek>&5q%DXIAbVr1D){o}r1#;}Cb3&h8}-114hxr9~Ou+|26FlSmkw zhE_g0KTb)}m6j_=Rq(g+@{TQPPAdMffLlVkYV{Tv9bJYP+a1AgxotW$jwkDP(SDcG z$MjYhzG5h093EzV+p&D8>SwclJo=7CFwjJ9S2bxmP1AlRIOIqEIqb0PNwsWAK&aMZ zCv1dW(cK=Nr8pcav9VLinjGMJe_Tr+ZhKj=GJ7|r^V67gp*)=GULchgT zx|sKDEW#`45#3L2AH=&G8w$a%6A7J2Q;;oMT$qPhy!!JU-9qxK`kR{y))50g^^#yk z<#8Tj%=2^Ruv|sc@b;j0LE(%AVRTJ{k%lu8)CpqHyWh#vbP)-7W>Wr+UA<(<(Sx#W z^=|G)rezPW=h2$B{R{4zwSBZo+KQ+5ld*u^WLpN2)Nw z{yIJ8z?Wm#6lZU5yaBDKdOy!-add9ETDoMmS=tO?xC5zCj;%REShH`KDzgNq&d`!V!xj?EafjLDj=-L?_~_*5u~9@$d)tkmp=eekkc?+ zC7-Liv)WC6*KAM5E3t0Z)h*@4j!+1Ru@1##-k0dlrF$!Nbo59=2Z;UI%xzwm)0(Dn zdo!>)l9P+jzN~n)Ri;fcJch9229|tmfe$L_=L6W_%EwqEvkK!#WQ6 zim-)O2P-}474du05|u6XMb&YvpILRg;QBB3=9f92zU>+tRBRmhuHe5`~ z^lr$3Q~tbE->-g|hp(pI%g$NPdLdR!OsD$7T8dRl0hhUi^E?|MDN&A#wYgMdtlB`T z%X?6cliwN$c?BmR#3QuocxiZX&6p-YuP#83?E>I3nc<~uiIdbq9}GkuF@Uk*x~nDj zMXs z8tgf6Fu1H`vorE%oOED!D`WV26?b9IevI(RxvzX7y$J}o*KZ?zS0w&koKCvV^Mt8r$PB*`$&_O;P4Z~D5W5Ixs1V0NGu{qQ+-S5)WOVp>p91h4vM`MSRSL6zN zF9goSLSlc7`1^67s7m11Ok~qh$a-JUkAe*7=ZqsX8aa=nL+&g@ zOvZ}pL@2j4RvjetBe(9lN_+Mn^p9OiN$zl4hgeq1@I$H$IIkzmz>V$&54SU9TxW+pRR~hc>(3z>2=R~!-rc3_ese^1Wr>!Z_!FHX!>#6DtB7EkNvby)&-8Vrl#uj5nF zh}t8^c`f>B_q0#4>4A%1qJ^2yxIp%4H*`{pd{S#_Bktaq3?fS%C2xz(md3L;&F3;G zF{zXL_BFg%-Z)A!-drUGwhek_Pa~zn;~TbMT6Mf1#gNea4tNXLewvY(J@jVR3j2w5 z%?M9j!1XAVCL7x$t@@? zA3agXsFp~n2ANnr{MRyE{VifYc|cm z?!2mDu+tiha0)G$67sa!A`Nb5(N6%<>Pcgf1J2fqFrEflaM-oq*EERHC_Ej)_9E2_ z=?^NNcoQ6dca;7X^u1o(3wIuVI9J%uQXJBc&RwTwv-&uS{P4OFh4A11x9hRhd|`Z` zzKV2PRSg1C^IArB^H3(GkwBN8oH|KMhbjeuP6A(2u6_d*jS&Rb=mj z(E7%JOv_yf&Y{l@$*D>Q&;<18+0FEcgNqWr4L%Ks|-!b?q zoWj+|z~{tYTHMV8?@1w?QqgMmSpk_&L$!QQk+>_+<_{Zsp^BTtbHNOkO&?2Sgz2IIfKnJY09h<$ z;l+C=$_|_raa;g+Ly{jud|tBlCJ-(D8tn)tUGY5#MDBKq)YKtB08ZJ??W-qVvCt$LB>0! zbZj}VfX+x2ITR?^Z`T0nKJxGBT}Fqn>t>9N#MkW45xs z`SGiNSDPHT>#-&Nf%OK3`t#dDoJn}+tyxLl^n}5p0n5n&@sy0%z4qc&MRi~Amw?Ty z=*#Vg7r&my8-^FL1K2mC{BCzq_DO3e9fT3O4p@N;F@nRJ&hyNKOyWJ2>vK+#ProK< zUI3I{v=ul5cEs}wbG$hAXk#Na(5*X!qazCA3?`A&Sh>K6YxlID7eFOmTDvIZU-G0! ze?M4x@!#dF|09CjJTVoRw(6HYy}Y_|Tn4s@L>9F+&tBJizQdBh{W@6CQ}fM(?G#s$ zSd;{n4W>*Vx-wvXCh`FfnWQi21xKd@hXd z(9MUra#ARX#h)RjmqB;O)8rl2#%~70KO3FqXG>fV`H`8UM{@~Ea(BvT%V~%Q|A9Tetbg`=W1PF{N;mfVY>^gGo5R? z>=^cb&d1rR!u15FJ4wal^pfJh2=ka_IJ`T|-ECiR`p&zgy=r=?h(YlFiwSh$p(R*R zM$}&B6`L;*Cia?=lQsaE1U0^|cyNV$KI&EI-CT5IiaS1les8HZQ@sJMJ$ty+QBDFw z;g`*KDEbR8C$or=OkR)JY_wdVN#JroZdZ?RI`V`bsvAH4oo?1fG?y{p7o5(T{p(Zs zm+R*FgOnY0en7<{<7J`NwZ_NJbSj))pM6)Ija0f)ag^4+IVi*eg}r9myWJjJVRgXj zsa>*bb=e#mPUvU8Kl`G7(;uVrinliJQt8y3L2Gr-94{Kh0J!gqa>$0Hsam4@~{x7+lkFi$Nr~n2zP6L$h_d-T7=PFYi43 zwq4Rp=28juT=%yt+5yCMlflnhdv{^yktZWc6eSS<3GNTafeCw$dXsEtGAz2B3~~ug z55+;#2W1wO-k8`UHE;!Pm*eiLc)!r->CN9#%-i%@R)>ADwd46;o-MUZ4oj`I#5^ZY zdDF~rDs)R#O|PXW6dz`m2xds&d;ArD3*0bzd^)_Yc~Jd@j|83-RQCet`e~|x`J(_4 z@Z0H&iyrnVA0t7T(n@b#_<(@gAuOJIS9oiyK;ENC$xqr~Hien}M;bLeLD~1O2_hSX zphm-ncixJ3n0mc$TVr(>;yNtE3E!%XBVc@{^1j-7Qz%#l5!n5P-&AwMSJ}r4h-H}O zQ0tGdw2sY5ufh@%@^fF3cN%8es1xvtmBNoF%7ZQ>iDGX0a6SXOy2bmO7lim1@g0Pw zO@@^pHdcCwSt*oLmTr3#*s8kd+OwUAEZ7A6Q$!}v1@{7hs$FG>SxTIfy>-?1zz5E7 zipON2CsF@cj216Mw#s^JlQr1k;Z!jW0ogfbn)~x zi@|p+FRyIW0FBz~3!-Vc)~fgF0gY^Y9tN%9Uz{)hs5E5Lt-mfYAX@MHBVf#l{Jzs$ zWKQGqZAcFIFy}3BbAbbx>OE~t@SEnlU4y|<7(<;9X8QJ+UMIql*126a* zfmGOj;g;%%Z>1hU4*aI%^+r|<^<|1MucW7xoo$<@x9ixg9*qPtE^;9roTP%5VjFbL z)sg}Qu)g>tFgan7W$?OW0)fEvFFpKV49Vh6t&{vhL=(=sTHV#hI~fMrQE6n)TcnQk zc!4)zrf2gG>r>iGSv%hc=RqC`jY&{lF#0!BH>rc0f{~04K4o*8sr2R64PQ)TlQG@k z1f4?&we(V+A1KwHmSlShxCDL ze*|O??^wQfOgM|POYuTf(Fr_K`}xRTuX4>aX;yLasq>KD_LKNQ3#3mcvK|kndZQpX zahQ<`7QXD42&bcL{`F?~df=`{1L`$Tw+dT(3H2JM!(Op}oB@KTEM4s_vrnO+~S>G6BLTD1ITjBd0%)Ja+N=|?qbXOayFENtFdaGq(iSEntU@D zDsj6Vb4#Du^=-KGT8otjDAL=C>x%-xloG+(>!U_V9_$P921RXQ)S0^@=Ln75o%B66 zf27b8f=Gd0CzG?Z^{V4U%04rrpIUBsrl8!#>X0*E*SHiZ{1gk7u|y3c|iF%V%MMD{La%4|fsl z`QP@L=^k!kAszi>?w#45f?>d_W4YCa&;yOI#m>TuF2Gtt0-|NHCL^`7fN=AfEYlvS`cPjy|p0` zjC1JA_kM3j*dL%m*VT7~TigWqv(VtlpaEFFib8ejqbmq z=R1yMa80PN>wVJ_ctu=&+~>lks@|L2xAJ>-4Z5AJ+c>d`i1!c6sh_vJ2JaUa>x)xw zA|gjZ_;>D_moB0$x6_H~Mp9mDLu%i;LkS^u?Cxi9+pe+Lpcnk{A{#f1e;vOS43X@~ z%rW;A&*p@IDyQ{1tUq`-9v4sJ_n@RdJR`;#nc0@QC;wR3<+5gdT|$T`%$jw+b*F{5 zvp%US@H9c@dpQBrqb|s?z>>rIlVeFUtTb|SdJJ-$bSFU8rL8wU}(ODi7MT}^Zra1UfJC< zjCGy(!-V7;&^5*vy3Nk$tUG_`3y)m8!4K8nC$m0KD+^~O>VP9iO30*<0Efd^AqLo< zj#9fj{<&{}J{6YgL~CR$f>6zxYl`$~XGIALl)k9}?xZhx?<`+po*_vhAWqt}h#W3W zWf2QK^w1rfM6Lx;d0l3ER|ro!(~tj@^Y+$lhheUfE7UN&w0V?&w79C1xeg|bZ01La#)`Itw(@+f)9&ubXpH6^q)VUqi{INOnJFg2t4&9nZmv z;d)5~PX2w0LRk;qit3Nflcy9?{J`3sb_WC!d(K^9tkKA=&$W-tE|x!z zTTE>}`zJ=gKVHWSdW}J*F45286sF8MF|u7eB(LW3FIS#wO?pu94X4hrmKTjD%D|@z zMxlZu6H9f4R+fBfF*}On8E??L2Oktx+1g$3LmqvWo_1Z}Yr5ybt|7Bfo5GxLEbV{K za?t2QPY$ts+Sz<>Y8+u zSo;TouD1Byd7CEx*e$B%kI5pNq(2=e9k28Gq*T&~_}tC&e6pA0hkEsbO7TSN|4TYP z2((c>uc_j;XXJm>WJSwAl)Qgl+*vfZ^}!MqC$W74XWR5R;r23xl%(DFuysmO>$#fY zR?=MU^%wp}TAwp#wQcp03w%4X&Vgo*PHhcaD0|@!%5`X&*sioaXr&z5Z}RvjSvpVK z2}sMx{&{MmuvCT`)7#~G`1|`-Zu(i_jlyn8J&+?m(xf_IjzrYuo&Ql z4n?P)h^Ixd;j@C7s-LeT@e$T6r;sfteGUbqhP@WSrJmlEJx@48W5kB~Z~lJMwHD*T zd%`AIDYC;F*QfyXTA@oT8=GH&Uh{E%-$eT59%og2tQ#Ob-1S)S#`XTPSH?ibe3+Egk^~nQ&7j>VUG$kn zSDCTTEDBip-h^qCA6k>&7N?;YnGwSsd-$4Azg%-)9B=!XfB2YUwGh_(RWS>N0)^N8 zk(Fvak_&$>cG&AATM4#qT<^d5dZ;@Z>0gSyGQ{N&_VeJL4g$9lIlIF^%4dY6ymgt4 zx4Tg}!Jg*r*46Dv2x%##|LQRTb>F(YaK}R7kJZWo`zWsv{-%(o@^bk?H0MpKc1JUA ziT)6yR%YinHa>=~x9{aiyqbyO9%t%~D=q5H@6N(8Bd z!=|}7nm98pgzNxM(Z|K>hN$uP45Cgjf%THr_oWH02#5&YM=?BiP#-)()4+)rMNM;ml|Q@q?S$Ylf3bjR~ulkeh4NrK7&#+zs-m4Um-<7 zv#8-D#OD`7VC$G5hz*k<>rNc74yHHXWP#LkTiJ|ESm?#1Z?!~#DA5c>A1%N2aUCoZ z=jO32^3v#j72@OGnLTPZ`OuA^HYFqzG5^EsE{ByUPU;a(7+OXfzB8gpM;jJTOtgHN z4=x=dPbfKVy~eYfROzg++WraEZ~5TlvOM&Z4Q$kf&ay<9ecajIdhr|y_>B+J63aJ~ ze%pb3Z|f($0)?PYlM5=}H}eLjnmlVn+bx~>{Jm}!IYviED@r=l2v9E1D=nUacs|<3 zXOur)Wps6fe5z-UjGJRHF=2P_`UZwRCUi{I3uZKJq)O*}?%&8_xTKP+Flrq+`(m(C z2M=w89<0x9X(=J9fhfhE+)D2MPIN2%1y9!1rzqY)`fwfuL}Gu%Ky*{Vskb8sI+X83 z7K3`*lGd_dYnJ(lo)@kR(78m)&pupVGzKU(N|f7?COQ3Gxt>1S;-_S^zIhH-213H| z;MPOD=PKAYaO*B!uv5Lt2ngp0=cMtg4;NC(T_XH+k?tR1Lh#%a;Ne{P7{2y@@t?NO m|MPa$zq{-Iak%31?Gu*)@MzEB{Cvs~0OX{UCCkN40{') {\n intervalOverride = intervalOverride.slice(1);\n }\n lowLimitMs = kbn.interval_to_ms(intervalOverride);\n }\n\n if (lowLimitMs > intervalMs) {\n intervalMs = lowLimitMs;\n }\n let interval = kbn.secondsToHms(intervalMs / 1000);\n\n this.intervalMs = intervalMs;\n this.interval = interval;\n }\n\n issueQueries(datasource: any) {\n this.annotationsPromise = this.annotationsSrv.getAnnotations({\n dashboard: this.dashboard,\n panel: this.panel,\n range: this.range,\n });\n\n /* Wait for annotationSrv requests to get datasources to\n * resolve before issuing queries. This allows the annotations\n * service to fire annotations queries before graph queries\n * (but not wait for completion). This resolves\n * issue 11806.\n */\n // 5.x before 5.4 doesn't have datasourcePromises. \n\n if (\"undefined\" !== typeof(this.annotationsSrv.datasourcePromises)) {\n return this.annotationsSrv.datasourcePromises.then(r => {\n return this.issueQueriesWithInterval(datasource, this.interval);\n });\n } else {\n return this.issueQueriesWithInterval(datasource, this.interval);\n }\n }\n\n // Grafana 6.2 (and older) is using this.interval for queries,\n // but Grafana 6.3+ is calculating interval again in queryRunner,\n // so we need to save-restore this.panel.interval.\n issueQueriesWithInterval(datasource: any, interval: any) {\n var origInterval = this.panel.interval;\n this.panel.interval = this.interval;\n var res = super.issueQueries(datasource);\n this.panel.interval = origInterval;\n return res;\n }\n\n\n onDataReceived(dataList: any) {\n this.data = dataList;\n this.cardsData = this.convertToCards(this.data);\n\n console.log(\"OnDataReceived\");\n\n this.annotationsPromise.then(\n (result: { alertState: any; annotations: any }) => {\n this.loading = false;\n //this.alertState = result.alertState;\n if (result.annotations && result.annotations.length > 0) {\n this.annotations = result.annotations;\n } else {\n this.annotations = [];\n }\n console.log(\"annotationsPromise result \" + this.annotations.length + \" annotations\");\n this.render();\n },\n () => {\n this.loading = false;\n this.annotations = [];\n console.log(\"annotationsPromise onrejected\");\n this.render();\n }\n );\n\n //this.render();\n }\n\n onInitEditMode() {\n this.addEditorTab('Options', statusHeatmapOptionsEditor, 2);\n this.unitFormats = kbn.getUnitFormats();\n }\n\n onRender() {\n if (!this.range || !this.data) { return; }\n\n this.multipleValues = false;\n if (!this.panel.useMax) {\n if (this.cardsData) {\n this.multipleValues = this.cardsData.multipleValues;\n }\n }\n\n this.noColorDefined = false;\n if (this.panel.color.mode === 'discrete') {\n this.discreteHelper.updateCardsValuesHasColorInfo();\n if (this.cardsData) {\n this.noColorDefined = this.cardsData.noColorDefined;\n }\n }\n }\n\n onCardColorChange(newColor) {\n this.panel.color.cardColor = newColor;\n this.render();\n }\n\n onDataError() {\n this.data = [];\n this.annotations = [];\n this.render();\n }\n\n postRefresh() {\n this.noColorDefined = false;\n }\n\n onEditorAddThreshold() {\n this.panel.color.thresholds.push({ color: this.panel.defaultColor });\n this.render();\n }\n\n onEditorRemoveThreshold(index:number) {\n this.panel.color.thresholds.splice(index, 1);\n this.render();\n }\n\n onEditorRemoveThresholds() {\n this.panel.color.thresholds = [];\n this.render();\n }\n\n onEditorAddThreeLights() {\n this.panel.color.thresholds.push({color: \"red\", value: 2, tooltip: \"error\" });\n this.panel.color.thresholds.push({color: \"yellow\", value: 1, tooltip: \"warning\" });\n this.panel.color.thresholds.push({color: \"green\", value: 0, tooltip: \"ok\" });\n this.render();\n }\n \n /* https://ethanschoonover.com/solarized/ */\n onEditorAddSolarized() {\n this.panel.color.thresholds.push({color: \"#b58900\", value: 0, tooltip: \"yellow\" });\n this.panel.color.thresholds.push({color: \"#cb4b16\", value: 1, tooltip: \"orange\" });\n this.panel.color.thresholds.push({color: \"#dc322f\", value: 2, tooltip: \"red\" });\n this.panel.color.thresholds.push({color: \"#d33682\", value: 3, tooltip: \"magenta\" });\n this.panel.color.thresholds.push({color: \"#6c71c4\", value: 4, tooltip: \"violet\" });\n this.panel.color.thresholds.push({color: \"#268bd2\", value: 5, tooltip: \"blue\" });\n this.panel.color.thresholds.push({color: \"#2aa198\", value: 6, tooltip: \"cyan\" });\n this.panel.color.thresholds.push({color: \"#859900\", value: 7, tooltip: \"green\" });\n this.render();\n }\n\n link(scope, elem, attrs, ctrl) {\n rendering(scope, elem, attrs, ctrl);\n }\n\n // group values into buckets by target\n convertToCards(data) {\n let cardsData = {\n cards: [],\n xBucketSize: 0,\n yBucketSize: 0,\n maxValue: 0,\n minValue: 0,\n multipleValues: false,\n noColorDefined: false,\n targets: [], // array of available unique targets\n targetIndex: {} // indices in data array for each of available unique targets\n };\n\n if (!data || data.length == 0) { return cardsData;}\n\n // Collect uniq timestamps from data and spread over targets and timestamps\n\n // collect uniq targets and their indices\n _.map(data, (d, i) => {\n cardsData.targetIndex[d.target] = _.concat(_.toArray(cardsData.targetIndex[d.target]), i)\n });\n\n // TODO add some logic for targets heirarchy\n cardsData.targets = _.keys(cardsData.targetIndex);\n cardsData.yBucketSize = cardsData.targets.length;\n // Maximum number of buckets over x axis\n cardsData.xBucketSize = _.max(_.map(data, d => d.datapoints.length));\n\n // Collect all values for each bucket from datapoints with similar target.\n // TODO aggregate values into buckets over datapoint[TIME_INDEX] not over datapoint index (j).\n for(let i = 0; i < cardsData.targets.length; i++) {\n let target = cardsData.targets[i];\n\n for (let j = 0; j < cardsData.xBucketSize; j++) {\n let card = new Card();\n card.id = i*cardsData.xBucketSize + j;\n card.values = [];\n card.y = target;\n card.x = -1;\n\n // collect values from all timeseries with target\n for (let si = 0; si < cardsData.targetIndex[target].length; si++) {\n let s = data[cardsData.targetIndex[target][si]];\n if (s.datapoints.length <= j) {\n continue;\n }\n let datapoint = s.datapoints[j];\n if (card.values.length === 0) {\n card.x = datapoint[TIME_INDEX];\n }\n card.values.push(datapoint[VALUE_INDEX]);\n }\n card.minValue = _.min(card.values);\n card.maxValue = _.max(card.values);\n if (card.values.length > 1) {\n cardsData.multipleValues = true;\n card.multipleValues = true;\n card.value = card.maxValue; // max value by default\n } else {\n card.value = card.maxValue; // max value by default\n }\n\n if (cardsData.maxValue < card.maxValue)\n cardsData.maxValue = card.maxValue;\n\n if (cardsData.minValue > card.minValue)\n cardsData.minValue = card.minValue;\n\n if (card.x != -1) {\n cardsData.cards.push(card);\n }\n }\n }\n\n return cardsData;\n }\n}\n\nexport {\n StatusHeatmapCtrl, StatusHeatmapCtrl as PanelCtrl\n};\n"],"file":"module.js"} \ No newline at end of file +{"version":3,"sources":["../src/module.ts"],"names":["_","kbn","loadPluginCss","MetricsPanelCtrl","Card","rendering","statusHeatmapOptionsEditor","ColorModeDiscrete","ExtraSeriesFormat","ExtraSeriesFormatValue","CANVAS","SVG","VALUE_INDEX","TIME_INDEX","renderer","colorSchemes","name","value","invert","colorModes","opacityScales","dark","light","StatusHeatmapCtrl","$scope","$injector","timeSrv","annotationsSrv","$window","datasourceSrv","variableSrv","templateSrv","datasource","color","mode","cardColor","colorScale","exponent","colorScheme","defaultColor","thresholds","cards","cardMinWidth","cardVSpacing","cardHSpacing","cardRound","xAxis","show","showWeekends","minBucketWidthToShowWeekends","showCrosshair","labelFormat","yAxis","tooltip","legend","data","unitFormat","decimals","nullPointMode","yAxisSort","highlightCards","useMax","urls","label","base_url","useExtraSeries","useseriesname","forcelowercase","icon_fa","extraSeries","index","seriesFilterIndex","usingUrl","panel","push","render","splice","defaultsDeep","panelDefaults","extraSeriesFormats","renderLink","link","scopedVars","format","scoped","key","replace","graph","multipleValues","noColorDefined","discreteExtraSeries","dataWarnings","title","tip","annotations","events","on","onRender","bind","onDataReceived","onDataError","onInitEditMode","postRefresh","onRenderComplete","onChangeType","chartWidth","renderingCompleted","url","type","Date","Raw","wndWidth","$","window","width","panelWidthFactor","gridPos","w","panelWidth","Math","ceil","max","getChartWidth","minCardWidth","minSpacing","maxCardsCount","intervalMs","rangeMs","range","to","valueOf","from","roundIntervalCeil","lowLimitMs","intervalOverride","interval","slice","interval_to_ms","secondsToHms","annotationsPromise","getAnnotations","dashboard","datasourcePromises","then","r","issueQueriesWithInterval","origInterval","res","dataList","cardsData","convertToCards","result","loading","length","addEditorTab","unitFormats","getUnitFormats","updateCardsValuesHasColorInfo","updateCardsValuesHasColorInfoSingle","newColor","scope","elem","attrs","ctrl","time","timeRangeForUrl","var_time","xBucketSize","yBucketSize","maxValue","minValue","targets","targetIndex","map","d","i","target","concat","toArray","keys","datapoints","j","card","id","values","columns","y","x","si","s","datapoint","min"],"mappings":"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","sourcesContent":["// Libraries\nimport _ from 'lodash';\nimport { auto } from 'angular';\n\n// Components\nimport './color_legend';\n\n// Utils\nimport kbn from 'app/core/utils/kbn';\nimport {loadPluginCss} from 'app/plugins/sdk';\n\n// Types\nimport { MetricsPanelCtrl } from 'app/plugins/sdk';\nimport { AnnotationsSrv } from 'app/features/annotations/annotations_srv';\nimport {CardsStorage, Card} from './statusmap_data';\nimport rendering from './rendering';\n// import aggregates, { aggregatesMap } from './aggregates';\n// import fragments, { fragmentsMap } from './fragments';\n// import { labelFormats } from './xAxisLabelFormats';\nimport {statusHeatmapOptionsEditor} from './options_editor';\nimport {ColorModeDiscrete} from \"./color_mode_discrete\";\nimport { ExtraSeriesFormat, ExtraSeriesFormatValue } from './extra_series_format';\n\nconst CANVAS = 'CANVAS';\nconst SVG = 'SVG';\nconst VALUE_INDEX = 0,\n TIME_INDEX = 1;\n\nconst renderer = CANVAS;\n\nconst colorSchemes = [\n // Diverging\n { name: 'Spectral', value: 'interpolateSpectral', invert: 'always' },\n { name: 'RdYlGn', value: 'interpolateRdYlGn', invert: 'always' },\n { name: 'GnYlRd', value: 'interpolateGnYlRd', invert: 'always' },\n\n // Sequential (Single Hue)\n { name: 'Blues', value: 'interpolateBlues', invert: 'dark' },\n { name: 'Greens', value: 'interpolateGreens', invert: 'dark' },\n { name: 'Greys', value: 'interpolateGreys', invert: 'dark' },\n { name: 'Oranges', value: 'interpolateOranges', invert: 'dark' },\n { name: 'Purples', value: 'interpolatePurples', invert: 'dark' },\n { name: 'Reds', value: 'interpolateReds', invert: 'dark' },\n\n // Sequential (Multi-Hue)\n { name: 'BuGn', value: 'interpolateBuGn', invert: 'dark' },\n { name: 'BuPu', value: 'interpolateBuPu', invert: 'dark' },\n { name: 'GnBu', value: 'interpolateGnBu', invert: 'dark' },\n { name: 'OrRd', value: 'interpolateOrRd', invert: 'dark' },\n { name: 'PuBuGn', value: 'interpolatePuBuGn', invert: 'dark' },\n { name: 'PuBu', value: 'interpolatePuBu', invert: 'dark' },\n { name: 'PuRd', value: 'interpolatePuRd', invert: 'dark' },\n { name: 'RdPu', value: 'interpolateRdPu', invert: 'dark' },\n { name: 'YlGnBu', value: 'interpolateYlGnBu', invert: 'dark' },\n { name: 'YlGn', value: 'interpolateYlGn', invert: 'dark' },\n { name: 'YlOrBr', value: 'interpolateYlOrBr', invert: 'dark' },\n { name: 'YlOrRd', value: 'interpolateYlOrRd', invert: 'dark' }\n];\n\nlet colorModes = ['opacity', 'spectrum', 'discrete'];\nlet opacityScales = ['linear', 'sqrt'];\n\ninterface DataWarning {\n title: string;\n tip: string;\n}\n\ninterface DataWarnings {\n noColorDefined: DataWarning;\n multipleValues: DataWarning;\n}\n\ninterface ColorThreshold {\n\n}\n\n\n\n\nloadPluginCss({\n dark: 'plugins/flant-statusmap-panel/css/statusmap.dark.css',\n light: 'plugins/flant-statusmap-panel/css/statusmap.light.css'\n});\n\nclass StatusHeatmapCtrl extends MetricsPanelCtrl {\n static templateUrl = 'module.html';\n\n opacityScales: any = [];\n colorModes: any = [];\n colorSchemes: any = [];\n unitFormats: any;\n data: any;\n cardsData: any;\n graph: any;\n multipleValues: boolean;\n noColorDefined: boolean;\n discreteExtraSeries: ColorModeDiscrete;\n dataWarnings: DataWarnings;\n extraSeriesFormats: any = [];\n\n annotations: object[] = [];\n annotationsPromise: any;\n\n panelDefaults: any = {\n // datasource name, null = default datasource\n datasource: null,\n // color mode\n color: {\n mode: 'spectrum',\n cardColor: '#b4ff00',\n colorScale: 'sqrt',\n exponent: 0.5,\n colorScheme: 'interpolateGnYlRd',\n // discrete mode settings\n defaultColor: '#757575',\n thresholds: [] // manual colors\n },\n // buckets settings\n cards: {\n cardMinWidth: 5,\n cardVSpacing: 2,\n cardHSpacing: 2,\n cardRound: null\n },\n xAxis: {\n show: true,\n showWeekends: true,\n minBucketWidthToShowWeekends: 4,\n showCrosshair: true,\n labelFormat: '%a %m/%d'\n },\n yAxis: {\n show: true,\n showCrosshair: false\n },\n tooltip: {\n show: true\n },\n legend: {\n show: true\n },\n data: {\n unitFormat: 'short',\n decimals: null\n },\n // how null points should be handled\n nullPointMode: 'as empty',\n yAxisSort: 'metrics',\n highlightCards: true,\n useMax: true,\n urls: [{\n tooltip: '',\n label: '',\n base_url: '',\n useExtraSeries: false,\n useseriesname: true,\n forcelowercase: true,\n icon_fa: 'external-link',\n extraSeries: {\n index: -1\n }\n }],\n seriesFilterIndex: -1,\n usingUrl: false\n };\n\n /** @ngInject */\n constructor($scope: any, $injector: auto.IInjectorService, timeSrv, private annotationsSrv: AnnotationsSrv, $window, datasourceSrv, variableSrv, templateSrv) {\n super($scope, $injector);\n\n _.defaultsDeep(this.panel, this.panelDefaults);\n\n this.opacityScales = opacityScales;\n this.colorModes = colorModes;\n this.colorSchemes = colorSchemes;\n this.variableSrv = variableSrv;\n this.extraSeriesFormats = ExtraSeriesFormat;\n\n this.renderLink = (link, scopedVars, format) => {\n var scoped = {}\n for (var key in scopedVars) {\n scoped[key] = { value: scopedVars[key] }\n }\n if (format) {\n return this.templateSrv.replace(link, scoped, format)\n } else {\n return this.templateSrv.replace(link, scoped)\n }\n }\n\n // default graph width for discrete card width calculation\n this.graph = {\n \"chartWidth\" : -1\n };\n\n this.multipleValues = false;\n this.noColorDefined = false;\n\n this.discreteExtraSeries = new ColorModeDiscrete($scope);\n\n this.dataWarnings = {\n \"noColorDefined\": {\n title: 'Data has value with undefined color',\n tip: 'Check metric values, color values or define a new color',\n },\n \"multipleValues\": {\n title: 'Data has multiple values for one target',\n tip: 'Change targets definitions or set \"use max value\"',\n }\n };\n\n this.annotations = [];\n this.annotationsSrv = annotationsSrv;\n \n this.timeSrv = timeSrv;\n\n this.events.on('render', this.onRender.bind(this));\n this.events.on('data-received', this.onDataReceived.bind(this));\n this.events.on('data-error', this.onDataError.bind(this));\n this.events.on('data-snapshot-load', this.onDataReceived.bind(this));\n this.events.on('init-edit-mode', this.onInitEditMode.bind(this));\n this.events.on('refresh', this.postRefresh.bind(this));\n // custom event from rendering.js\n this.events.on('render-complete', this.onRenderComplete.bind(this));\n this.events.on('onChangeType', this.onChangeType.bind(this));\n }\n\n onRenderComplete(data):void {\n this.graph.chartWidth = data.chartWidth;\n this.renderingCompleted();\n }\n\n onChangeType(url): void {\n switch (url.type) {\n case ExtraSeriesFormat.Date:\n url.extraSeries.format = ExtraSeriesFormatValue.Date;\n break;\n case ExtraSeriesFormat.Raw:\n url.extraSeries.format = ExtraSeriesFormatValue.Raw;\n break;\n default:\n url.extraSeries.format = ExtraSeriesFormatValue.Raw;\n break;\n }\n }\n\n getChartWidth():number {\n const wndWidth = $(window).width();\n // gripPos.w is a width in grid's measurements. Grid size in Grafana is 24.\n const panelWidthFactor = this.panel.gridPos.w / 24;\n const panelWidth = Math.ceil(wndWidth * panelWidthFactor);\n // approximate chartWidth because y axis ticks not rendered yet on first data receive.\n const chartWidth = _.max([\n panelWidth - 200,\n panelWidth/2\n ]);\n\n return chartWidth!;\n }\n\n // override calculateInterval for discrete color mode\n calculateInterval() {\n let chartWidth = this.getChartWidth();\n\n let minCardWidth = this.panel.cards.cardMinWidth;\n let minSpacing = this.panel.cards.cardHSpacing;\n let maxCardsCount = Math.ceil((chartWidth-minCardWidth) / (minCardWidth + minSpacing));\n\n let intervalMs;\n let rangeMs = this.range.to.valueOf() - this.range.from.valueOf();\n\n // this is minimal interval! kbn.round_interval will lower it.\n intervalMs = this.discreteExtraSeries.roundIntervalCeil(rangeMs / maxCardsCount);\n\n // Calculate low limit of interval\n let lowLimitMs = 1; // 1 millisecond default low limit\n \n let intervalOverride = this.panel.interval;\n\n // if no panel interval check datasource\n if (intervalOverride) {\n intervalOverride = this.templateSrv.replace(intervalOverride, this.panel.scopedVars);\n } else if (this.datasource && this.datasource.interval) {\n intervalOverride = this.datasource.interval;\n }\n\n if (intervalOverride) {\n if (intervalOverride[0] === '>') {\n intervalOverride = intervalOverride.slice(1);\n }\n lowLimitMs = kbn.interval_to_ms(intervalOverride);\n }\n\n if (lowLimitMs > intervalMs) {\n intervalMs = lowLimitMs;\n }\n let interval = kbn.secondsToHms(intervalMs / 1000);\n\n this.intervalMs = intervalMs;\n this.interval = interval;\n }\n\n issueQueries(datasource: any) {\n this.annotationsPromise = this.annotationsSrv.getAnnotations({\n dashboard: this.dashboard,\n panel: this.panel,\n range: this.range,\n });\n\n /* Wait for annotationSrv requests to get datasources to\n * resolve before issuing queries. This allows the annotations\n * service to fire annotations queries before graph queries\n * (but not wait for completion). This resolves\n * issue 11806.\n */\n // 5.x before 5.4 doesn't have datasourcePromises. \n\n if (\"undefined\" !== typeof(this.annotationsSrv.datasourcePromises)) {\n return this.annotationsSrv.datasourcePromises.then(r => {\n return this.issueQueriesWithInterval(datasource, this.interval);\n });\n } else {\n return this.issueQueriesWithInterval(datasource, this.interval);\n }\n }\n\n // Grafana 6.2 (and older) is using this.interval for queries,\n // but Grafana 6.3+ is calculating interval again in queryRunner,\n // so we need to save-restore this.panel.interval.\n issueQueriesWithInterval(datasource: any, interval: any) {\n var origInterval = this.panel.interval;\n this.panel.interval = this.interval;\n var res = super.issueQueries(datasource);\n this.panel.interval = origInterval;\n return res;\n }\n\n\n onDataReceived(dataList: any) {\n this.data = dataList;\n this.cardsData = this.convertToCards(this.data);\n\n this.annotationsPromise.then(\n (result: { alertState: any; annotations: any }) => {\n this.loading = false;\n //this.alertState = result.alertState;\n if (result.annotations && result.annotations.length > 0) {\n this.annotations = result.annotations;\n } else {\n this.annotations = [];\n }\n this.render();\n },\n () => {\n this.loading = false;\n this.annotations = [];\n this.render();\n }\n );\n\n //this.render();\n }\n\n onInitEditMode() {\n this.addEditorTab('Options', statusHeatmapOptionsEditor, 2);\n this.unitFormats = kbn.getUnitFormats();\n }\n\n onRender() {\n if (!this.range || !this.data) { return; }\n\n this.multipleValues = false;\n if (!this.panel.useMax) {\n if (this.cardsData) {\n this.multipleValues = this.cardsData.multipleValues;\n }\n }\n\n this.noColorDefined = false;\n if (this.panel.color.mode === 'discrete') {\n if (this.panel.seriesFilterIndex == -1) {\n this.discreteExtraSeries.updateCardsValuesHasColorInfo();\n } else {\n this.discreteExtraSeries.updateCardsValuesHasColorInfoSingle();\n }\n if (this.cardsData) {\n this.noColorDefined = this.cardsData.noColorDefined;\n }\n }\n }\n\n onCardColorChange(newColor) {\n this.panel.color.cardColor = newColor;\n this.render();\n }\n\n onDataError() {\n this.data = [];\n this.annotations = [];\n this.render();\n }\n\n postRefresh() {\n this.noColorDefined = false;\n }\n\n onEditorAddThreshold() {\n this.panel.color.thresholds.push({ color: this.panel.defaultColor });\n this.render();\n }\n\n onEditorAddUrl = () => {\n this.panel.urls.push({\n label: '',\n base_url: '',\n useExtraSeries: false,\n useseriesname: true,\n forcelowercase: true,\n icon_fa: 'external-link',\n extraSeries: {\n index: -1\n }\n });\n this.render();\n }\n\n onEditorRemoveUrl = (index) => {\n this.panel.urls.splice(index, 1);\n this.render();\n }\n\n onEditorRemoveThreshold(index:number) {\n this.panel.color.thresholds.splice(index, 1);\n this.render();\n }\n\n onEditorRemoveThresholds() {\n this.panel.color.thresholds = [];\n this.render();\n }\n\n\n onEditorRemoveUrls = () => {\n this.panel.urls = [];\n this.render();\n }\n\n onEditorAddThreeLights() {\n this.panel.color.thresholds.push({color: \"red\", value: 2, tooltip: \"error\" });\n this.panel.color.thresholds.push({color: \"yellow\", value: 1, tooltip: \"warning\" });\n this.panel.color.thresholds.push({color: \"green\", value: 0, tooltip: \"ok\" });\n this.render();\n }\n \n /* https://ethanschoonover.com/solarized/ */\n onEditorAddSolarized() {\n this.panel.color.thresholds.push({color: \"#b58900\", value: 0, tooltip: \"yellow\" });\n this.panel.color.thresholds.push({color: \"#cb4b16\", value: 1, tooltip: \"orange\" });\n this.panel.color.thresholds.push({color: \"#dc322f\", value: 2, tooltip: \"red\" });\n this.panel.color.thresholds.push({color: \"#d33682\", value: 3, tooltip: \"magenta\" });\n this.panel.color.thresholds.push({color: \"#6c71c4\", value: 4, tooltip: \"violet\" });\n this.panel.color.thresholds.push({color: \"#268bd2\", value: 5, tooltip: \"blue\" });\n this.panel.color.thresholds.push({color: \"#2aa198\", value: 6, tooltip: \"cyan\" });\n this.panel.color.thresholds.push({color: \"#859900\", value: 7, tooltip: \"green\" });\n this.render();\n }\n\n link(scope, elem, attrs, ctrl) {\n rendering(scope, elem, attrs, ctrl);\n }\n\n retrieveTimeVar() {\n var time = this.timeSrv.timeRangeForUrl();\n var var_time = '&from=' + time.from + '&to=' + time.to;\n return var_time;\n }\n\n // group values into buckets by target\n convertToCards(data) {\n let cardsData = {\n cards: [],\n xBucketSize: 0,\n yBucketSize: 0,\n maxValue: 0,\n minValue: 0,\n multipleValues: false,\n noColorDefined: false,\n targets: [], // array of available unique targets\n targetIndex: {} // indices in data array for each of available unique targets\n };\n\n if (!data || data.length == 0) { return cardsData;}\n\n // Collect uniq timestamps from data and spread over targets and timestamps\n\n // collect uniq targets and their indices\n _.map(data, (d, i) => {\n cardsData.targetIndex[d.target] = _.concat(_.toArray(cardsData.targetIndex[d.target]), i)\n });\n\n // TODO add some logic for targets heirarchy\n cardsData.targets = _.keys(cardsData.targetIndex);\n cardsData.yBucketSize = cardsData.targets.length;\n // Maximum number of buckets over x axis\n cardsData.xBucketSize = _.max(_.map(data, d => d.datapoints.length));\n\n // Collect all values for each bucket from datapoints with similar target.\n // TODO aggregate values into buckets over datapoint[TIME_INDEX] not over datapoint index (j).\n for(let i = 0; i < cardsData.targets.length; i++) {\n let target = cardsData.targets[i];\n\n for (let j = 0; j < cardsData.xBucketSize; j++) {\n let card = new Card();\n card.id = i*cardsData.xBucketSize + j;\n card.values = [];\n card.columns = [];\n card.multipleValues = false;\n card.noColorDefined = false;\n card.y = target;\n card.x = -1;\n\n // collect values from all timeseries with target\n for (let si = 0; si < cardsData.targetIndex[target].length; si++) {\n let s = data[cardsData.targetIndex[target][si]];\n if (s.datapoints.length <= j) {\n continue;\n }\n let datapoint = s.datapoints[j];\n if (card.values.length === 0) {\n card.x = datapoint[TIME_INDEX];\n }\n card.values.push(datapoint[VALUE_INDEX]);\n }\n card.minValue = _.min(card.values);\n card.maxValue = _.max(card.values);\n if (card.values.length > 1) {\n cardsData.multipleValues = true;\n card.multipleValues = true;\n card.value = this.panel.seriesFilterIndex != -1 ? card.values[this.panel.seriesFilterIndex] : card.maxValue;\n } else {\n card.value = card.maxValue; // max value by default\n }\n\n if (cardsData.maxValue < card.maxValue)\n cardsData.maxValue = card.maxValue;\n\n if (cardsData.minValue > card.minValue)\n cardsData.minValue = card.minValue;\n\n if (card.x != -1) {\n cardsData.cards.push(card);\n }\n }\n }\n\n return cardsData;\n }\n}\n\nexport {\n StatusHeatmapCtrl, StatusHeatmapCtrl as PanelCtrl\n};\n"],"file":"module.js"} \ No newline at end of file diff --git a/dist/partials/options_editor.html b/dist/partials/options_editor.html index 45563e6..ee06808 100644 --- a/dist/partials/options_editor.html +++ b/dist/partials/options_editor.html @@ -194,9 +194,105 @@ -
+
+
Filtering
+
+ + +
+
URL
+ +
+ Insert the url to navigate
+
+ +
+ +
+ +
+
+
+
+
+ +
+
+ +
+
+ +
+
+ + + + + + + +

Specify an URL (relative or absolute)

+ + Use special variables to specify cell values: +
+ $series_label name of the serie +
+ $(template.name) name of the templated to be replaced +
+ $time append &from...&to on the URL +
+ $series_extra use extraSeries value to use it on URL +
+
+
+
+ + + + + + +
+ + + + +
+ +
+ +
+ + +
+
+
+
+
+
diff --git a/dist/rendering.js b/dist/rendering.js index 90c3922..1517755 100644 --- a/dist/rendering.js +++ b/dist/rendering.js @@ -1,9 +1,9 @@ "use strict"; -System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/core", "d3", "./libs/d3-scale-chromatic/index", "./tooltip", "./annotations"], function (_export, _context) { +System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/core", "d3", "./libs/d3-scale-chromatic/index", "./tooltip", "./tooltipextraseries", "./annotations"], function (_export, _context) { "use strict"; - var _, $, moment, kbn, appEvents, contextSrv, d3, d3ScaleChromatic, StatusmapTooltip, AnnotationTooltip, MIN_CARD_SIZE, CARD_H_SPACING, CARD_V_SPACING, CARD_ROUND, DATA_RANGE_WIDING_FACTOR, DEFAULT_X_TICK_SIZE_PX, DEFAULT_Y_TICK_SIZE_PX, X_AXIS_TICK_PADDING, Y_AXIS_TICK_PADDING, MIN_SELECTION_WIDTH, StatusmapRenderer; + var _, $, moment, kbn, appEvents, contextSrv, d3, d3ScaleChromatic, StatusmapTooltip, StatusHeatmapTooltipExtraSeries, AnnotationTooltip, MIN_CARD_SIZE, CARD_H_SPACING, CARD_V_SPACING, CARD_ROUND, DATA_RANGE_WIDING_FACTOR, DEFAULT_X_TICK_SIZE_PX, DEFAULT_Y_TICK_SIZE_PX, X_AXIS_TICK_PADDING, Y_AXIS_TICK_PADDING, MIN_SELECTION_WIDTH, StatusmapRenderer; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -66,6 +66,8 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c d3ScaleChromatic = _libsD3ScaleChromaticIndex; }, function (_tooltip) { StatusmapTooltip = _tooltip.StatusmapTooltip; + }, function (_tooltipextraseries) { + StatusHeatmapTooltipExtraSeries = _tooltipextraseries.StatusHeatmapTooltipExtraSeries; }, function (_annotations) { AnnotationTooltip = _annotations.AnnotationTooltip; }], @@ -141,6 +143,8 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c _defineProperty(this, "tooltip", void 0); + _defineProperty(this, "tooltipExtraSeries", void 0); + _defineProperty(this, "annotationTooltip", void 0); _defineProperty(this, "heatmap", void 0); @@ -160,6 +164,7 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c // $heatmap is JQuery object, but heatmap is D3 this.$heatmap = this.elem.find('.status-heatmap-panel'); this.tooltip = new StatusmapTooltip(this.$heatmap, this.scope); + this.tooltipExtraSeries = new StatusHeatmapTooltipExtraSeries(this.$heatmap, this.scope); this.annotationTooltip = new AnnotationTooltip(this.$heatmap, this.scope); this.yOffset = 0; this.selection = { @@ -191,6 +196,7 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c this.$heatmap.on('mousedown', this.onMouseDown.bind(this)); this.$heatmap.on('mousemove', this.onMouseMove.bind(this)); this.$heatmap.on('mouseleave', this.onMouseLeave.bind(this)); + this.$heatmap.on('click', this.onMouseClick.bind(this)); } _createClass(StatusmapRenderer, [{ @@ -588,7 +594,11 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c } else if (this.panel.color.mode === 'spectrum') { return this.colorScale(d.value); } else if (this.panel.color.mode === 'discrete') { - return this.ctrl.discreteHelper.getBucketColor(d.values); + if (this.panel.seriesFilterIndex != -1 || this.panel.seriesFilterIndex != null) { + return this.ctrl.discreteExtraSeries.getBucketColorSingle(d.values[this.panel.seriesFilterIndex]); + } else { + return this.ctrl.discreteExtraSeries.getBucketColor(d.values); + } } } }, { @@ -663,9 +673,17 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c } }, { key: "onMouseLeave", - value: function onMouseLeave() { + value: function onMouseLeave(e) { appEvents.emit('graph-hover-clear'); this.clearCrosshair(); //annotationTooltip.destroy(); + + if (e.relatedTarget) { + if (e.relatedTarget.className == "statusmap-tooltip-extraseries graph-tooltip grafana-tooltip" || e.relatedTarget.className == "graph-tooltip-time") {} else { + this.tooltipExtraSeries.destroy(); + } + } + + this.annotationTooltip.destroy(); } }, { key: "onMouseMove", @@ -692,6 +710,15 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c this.annotationTooltip.show(event); } } + }, { + key: "onMouseClick", + value: function onMouseClick(event) { + this.tooltipExtraSeries.show(event); + + if (this.ctrl.panel.usingUrl) { + this.tooltip.destroy(); + } + } }, { key: "getEventPos", value: function getEventPos(event, offset) { @@ -832,7 +859,7 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c "id": i, "anno": d.source }; - }); //console.log({"ctrl_annotations": this.ctrl.annotations, "annoData": annoData}); + }); //({"ctrl_annotations": this.ctrl.annotations, "annoData": annoData}); var anno = this.heatmap.append("g").attr("class", "statusmap-annotations").attr("transform", "translate(0.5,0)").selectAll(".statusmap-annotations").data(annoData).enter().append("g"); diff --git a/dist/rendering.js.map b/dist/rendering.js.map index d7109f7..391d144 100644 --- a/dist/rendering.js.map +++ b/dist/rendering.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/rendering.ts"],"names":["rendering","scope","elem","attrs","ctrl","StatusmapRenderer","grafanaTimeFormat","ticks","min","max","range","secPerTick","oneDay","oneYear","_","$","moment","kbn","appEvents","contextSrv","d3","d3ScaleChromatic","StatusmapTooltip","AnnotationTooltip","MIN_CARD_SIZE","CARD_H_SPACING","CARD_V_SPACING","CARD_ROUND","DATA_RANGE_WIDING_FACTOR","DEFAULT_X_TICK_SIZE_PX","DEFAULT_Y_TICK_SIZE_PX","X_AXIS_TICK_PADDING","Y_AXIS_TICK_PADDING","MIN_SELECTION_WIDTH","$heatmap","find","tooltip","annotationTooltip","yOffset","selection","active","x1","x2","padding","left","right","top","bottom","margin","events","on","onRender","bind","tickValueFormatter","onGraphHover","onGraphHoverClear","onMouseDown","onMouseMove","onMouseLeave","clearCrosshair","event","drawSharedCrosshair","pos","render","renderingCompleted","height","panel","row","isString","parseInt","replace","legend","show","css","e","axisText","selectAll","nodes","maxTextWidth","map","text","getBBox","width","Math","ceil","axisLine","select","empty","axisLinePosition","parseFloat","attr","canvasWidth","xScale","scaleTime","domain","timeRange","from","to","xGridSize","chartWidth","grafanaTimeFormatter","timeFormat","dashboardTimeZone","dashboard","getTimezone","utcFormat","xAxis","axisBottom","tickFormat","tickPadding","tickSize","chartHeight","posY","chartTop","posX","yAxisWidth","heatmap","append","call","remove","step","length","push","i","scaleOrdinal","uniq","data","d","target","isEmpty","yAxisSort","sort","a","b","localeCompare","ignorePunctuation","numeric","yAxisScale","getYAxisScale","yScale","getYScale","yAxis","axisLeft","tickValues","tickSizeInner","getYAxisWidth","tickInterval","y_widing","dataRangeWidingFactor","y_min","y_max","floor","decimals","scaledDecimals","format","value","valueFormats","heatmap_elem","chartBottom","cardHSpacing","cards","cardVSpacing","cardRound","yGridSize","cardsData","yBucketSize","cardHeight","addYAxis","xBucketSize","cardWidth","addXAxis","xAxisHeight","getXAxisHeight","style","addHeatmapCanvas","maxValue","color","minValue","mode","colorScale","getColorScale","setOpacityScale","enter","c","id","getCardX","getCardWidth","getCardY","getCardHeight","getCardColor","getCardOpacity","$cards","mouseOverBucket","highlightCard","resetCardHighLight","_renderAnnotations","emit","highlightColor","darker","strokeColor","brighter","current_card","originalFillColor","toString","colorScheme","colorSchemes","colorInterpolator","colorScaleInverted","invert","user","lightTheme","start","end","scaleSequential","opacityScale","scaleLinear","scalePow","exponent","x","cx","w","cutted_width","y","ys","h","cardColor","discreteHelper","getBucketColor","values","nullPointMode","elemOffset","offset","clientX","clientY","getEventOffset","mouseUpHandler","onMouseUp","document","one","unbind","selectionRange","abs","timeFrom","timeTo","timeSrv","setTime","utc","clearSelection","destroy","limitSelection","offsetX","drawSelection","emitGraphHoverEvent","drawCrosshair","valueOf","pageX","pageY","y1","panelRelY","offsetY","posX1","posX2","selectionX","selectionWidth","position","graphTooltip","setElementHeight","addHeatmap","annotations","annoData","time","source","anno","iconColor","join","$ticks","mouseOverAnnotationTick"],"mappings":";;;;;;;;;;;;;;;AAsBe,WAASA,SAAT,CAAmBC,KAAnB,EAA+BC,IAA/B,EAA0CC,KAA1C,EAAsDC,IAAtD,EAAiE;AAC9E,WAAO,IAAIC,iBAAJ,CAAsBJ,KAAtB,EAA6BC,IAA7B,EAAmCC,KAAnC,EAA0CC,IAA1C,CAAP;AACD;;AA4vBD,WAASE,iBAAT,CAA2BC,KAA3B,EAAkCC,GAAlC,EAAuCC,GAAvC,EAA4C;AAC1C,QAAID,GAAG,IAAIC,GAAP,IAAcF,KAAlB,EAAyB;AACvB,UAAIG,KAAK,GAAGD,GAAG,GAAGD,GAAlB;AACA,UAAIG,UAAU,GAAID,KAAK,GAACH,KAAP,GAAgB,IAAjC;AACA,UAAIK,MAAM,GAAG,QAAb;AACA,UAAIC,OAAO,GAAG,WAAd;;AAEA,UAAIF,UAAU,IAAI,EAAlB,EAAsB;AACpB,eAAO,UAAP;AACD;;AACD,UAAIA,UAAU,IAAI,IAAd,IAAsBD,KAAK,IAAIE,MAAnC,EAA2C;AACzC,eAAO,OAAP;AACD;;AACD,UAAID,UAAU,IAAI,KAAlB,EAAyB;AACvB,eAAO,aAAP;AACD;;AACD,UAAIA,UAAU,IAAI,OAAd,IAAyBD,KAAK,IAAIG,OAAtC,EAA+C;AAC7C,eAAO,OAAP;AACD;;AACD,aAAO,OAAP;AACD;;AAED,WAAO,OAAP;AACD;;qBArxBuBb,S;;;;AAtBjBc,MAAAA,C;;AACAC,MAAAA,C;;AACAC,MAAAA,M;;AACAC,MAAAA,G;;AACCC,MAAAA,S,gBAAAA,S;AAAWC,MAAAA,U,gBAAAA,U;;AAEPC,MAAAA,E;;AACAC,MAAAA,gB;;AACJC,MAAAA,gB,YAAAA,gB;;AACAC,MAAAA,iB,gBAAAA,iB;;;AAEJC,MAAAA,a,GAAgB,C;AAChBC,MAAAA,c,GAAiB,C;AACjBC,MAAAA,c,GAAiB,C;AACjBC,MAAAA,U,GAAa,C;AACbC,MAAAA,wB,GAA2B,G;AAC3BC,MAAAA,sB,GAAyB,G;AACzBC,MAAAA,sB,GAAyB,E;AACzBC,MAAAA,mB,GAAsB,E;AACtBC,MAAAA,mB,GAAsB,C;AACtBC,MAAAA,mB,GAAsB,C;;mCAMb5B,iB;;;AAoCX,mCAAoBJ,KAApB,EAAwCC,IAAxC,EAAmDC,KAAnD,EAAuEC,IAAvE,EAAkF;AAAA;;AAAA,eAA9DH,KAA8D,GAA9DA,KAA8D;AAAA,eAA1CC,IAA0C,GAA1CA,IAA0C;AAAA,eAAXE,IAAW,GAAXA,IAAW;;AAAA,yCAnClE,CAmCkE;;AAAA,0CAlCjE,CAkCiE;;AAAA;;AAAA;;AAAA,8CA/B7D,CA+B6D;;AAAA,+CA9B5D,CA8B4D;;AAAA,4CA7B/D,CA6B+D;;AAAA,+CA5B5D,CA4B4D;;AAAA,8CA3B7D,CA2B6D;;AAAA,+CA1B5D,CA0B4D;;AAAA,gDAzB3D,CAyB2D;;AAAA,gDAxB3D,CAwB2D;;AAAA,6CAvB9D,CAuB8D;;AAAA,6CAtB9D,CAsB8D;;AAAA,8CArB7D,CAqB6D;;AAAA;;AAAA;;AAAA;;AAAA,6CAjB9D,CAiB8D;;AAAA,6CAhB9D,CAgB8D;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA,yDAFlDwB,wBAEkD;;AAChF;AACA,eAAKM,QAAL,GAAgB,KAAKhC,IAAL,CAAUiC,IAAV,CAAe,uBAAf,CAAhB;AACA,eAAKC,OAAL,GAAe,IAAId,gBAAJ,CAAqB,KAAKY,QAA1B,EAAoC,KAAKjC,KAAzC,CAAf;AACA,eAAKoC,iBAAL,GAAyB,IAAId,iBAAJ,CAAsB,KAAKW,QAA3B,EAAqC,KAAKjC,KAA1C,CAAzB;AAEA,eAAKqC,OAAL,GAAe,CAAf;AAEA,eAAKC,SAAL,GAAiB;AACfC,YAAAA,MAAM,EAAE,KADO;AAEfC,YAAAA,EAAE,EAAE,CAAC,CAFU;AAGfC,YAAAA,EAAE,EAAE,CAAC;AAHU,WAAjB;AAMA,eAAKC,OAAL,GAAe;AAAEC,YAAAA,IAAI,EAAE,CAAR;AAAWC,YAAAA,KAAK,EAAE,CAAlB;AAAqBC,YAAAA,GAAG,EAAE,CAA1B;AAA6BC,YAAAA,MAAM,EAAE;AAArC,WAAf;AACA,eAAKC,MAAL,GAAc;AAAEJ,YAAAA,IAAI,EAAE,EAAR;AAAYC,YAAAA,KAAK,EAAE,EAAnB;AAAuBC,YAAAA,GAAG,EAAE,EAA5B;AAAgCC,YAAAA,MAAM,EAAE;AAAxC,WAAd;AAEA,eAAK3C,IAAL,CAAU6C,MAAV,CAAiBC,EAAjB,CAAoB,QAApB,EAA8B,KAAKC,QAAL,CAAcC,IAAd,CAAmB,IAAnB,CAA9B;AAEA,eAAKhD,IAAL,CAAUiD,kBAAV,GAA+B,KAAKA,kBAAL,CAAwBD,IAAxB,CAA6B,IAA7B,CAA/B,CAnBgF,CAqBhF;AACA;AACA;AAEA;;AACAlC,UAAAA,SAAS,CAACgC,EAAV,CAAa,aAAb,EAA4B,KAAKI,YAAL,CAAkBF,IAAlB,CAAuB,IAAvB,CAA5B,EAA0D,KAAKnD,KAA/D;AAEAiB,UAAAA,SAAS,CAACgC,EAAV,CAAa,mBAAb,EAAkC,KAAKK,iBAAL,CAAuBH,IAAvB,CAA4B,IAA5B,CAAlC,EAAqE,KAAKnD,KAA1E,EA5BgF,CA8BhF;;AACA,eAAKiC,QAAL,CAAcgB,EAAd,CAAiB,WAAjB,EAA8B,KAAKM,WAAL,CAAiBJ,IAAjB,CAAsB,IAAtB,CAA9B;AACA,eAAKlB,QAAL,CAAcgB,EAAd,CAAiB,WAAjB,EAA8B,KAAKO,WAAL,CAAiBL,IAAjB,CAAsB,IAAtB,CAA9B;AACA,eAAKlB,QAAL,CAAcgB,EAAd,CAAiB,YAAjB,EAA+B,KAAKQ,YAAL,CAAkBN,IAAlB,CAAuB,IAAvB,CAA/B;AACD;;;;8CAEmB;AAClB,iBAAKO,cAAL;AACD;;;uCAEYC,K,EAAqB;AAChC,iBAAKC,mBAAL,CAAyBD,KAAK,CAACE,GAA/B;AACD;;;qCAEU;AACT,iBAAKC,MAAL;AACA,iBAAK3D,IAAL,CAAU4D,kBAAV;AACD;;;6CAGkB;AACjB,gBAAI;AACF,kBAAIC,MAAM,GAAG,KAAK7D,IAAL,CAAU6D,MAAV,IAAoB,KAAKC,KAAL,CAAWD,MAA/B,IAAyC,KAAK7D,IAAL,CAAU+D,GAAV,CAAcF,MAApE;;AACA,kBAAInD,CAAC,CAACsD,QAAF,CAAWH,MAAX,CAAJ,EAAwB;AACtBA,gBAAAA,MAAM,GAAGI,QAAQ,CAACJ,MAAM,CAACK,OAAP,CAAe,IAAf,EAAqB,EAArB,CAAD,EAA2B,EAA3B,CAAjB;AACD;;AAEDL,cAAAA,MAAM,IAAI,KAAKC,KAAL,CAAWK,MAAX,CAAkBC,IAAlB,GAAyB,EAAzB,GAA8B,EAAxC,CANE,CAM0C;;AAE5C,mBAAKtC,QAAL,CAAcuC,GAAd,CAAkB,QAAlB,EAA4BR,MAAM,GAAG,IAArC;AAEA,qBAAO,IAAP;AACD,aAXD,CAWE,OAAOS,CAAP,EAAU;AAAE;AACZ,qBAAO,KAAP;AACD;AACF;;;wCAEaxE,I,EAAW;AACvB,gBAAMyE,QAAQ,GAAGzE,IAAI,CAAC0E,SAAL,CAAe,cAAf,EAA+BC,KAA/B,EAAjB;;AACA,gBAAMC,YAAY,GAAGhE,CAAC,CAACL,GAAF,CAAMK,CAAC,CAACiE,GAAF,CAAMJ,QAAN,EAAgB,UAAAK,IAAI,EAAI;AACjD;AACA,qBAAOA,IAAI,CAACC,OAAL,GAAeC,KAAtB;AACD,aAH0B,CAAN,CAArB;;AAKA,mBAAOC,IAAI,CAACC,IAAL,CAAUN,YAAV,CAAP;AACD;;;yCAEc5E,I,EAAW;AACxB,gBAAImF,QAAQ,GAAGnF,IAAI,CAACoF,MAAL,CAAY,cAAZ,CAAf;;AACA,gBAAI,CAACD,QAAQ,CAACE,KAAT,EAAL,EAAuB;AACrB,kBAAIC,gBAAgB,GAAGC,UAAU,CAACvF,IAAI,CAACoF,MAAL,CAAY,cAAZ,EAA4BI,IAA5B,CAAiC,IAAjC,CAAD,CAAjC;AACA,kBAAIC,WAAW,GAAGF,UAAU,CAACvF,IAAI,CAACwF,IAAL,CAAU,QAAV,CAAD,CAA5B;AACA,qBAAOC,WAAW,GAAGH,gBAArB;AACD,aAJD,MAIO;AACL;AACA,qBAAO,EAAP;AACD;AACF;;;qCAEU;AACT;AACA,iBAAKvF,KAAL,CAAW2F,MAAX,GAAoB,KAAKA,MAAL,GAAcxE,EAAE,CAACyE,SAAH,GAC7BC,MAD6B,CACtB,CAAC,KAAKC,SAAL,CAAeC,IAAhB,EAAsB,KAAKD,SAAL,CAAeE,EAArC,CADsB,EAE7BvF,KAF6B,CAEvB,CAAC,KAAKwF,SAAL,GAAe,CAAhB,EAAmB,KAAKC,UAAL,GAAgB,KAAKD,SAAL,GAAe,CAAlD,CAFuB,CAAlC;AAIA,gBAAI3F,KAAK,GAAG,KAAK4F,UAAL,GAAkBtE,sBAA9B;AACA,gBAAIuE,oBAAoB,GAAG9F,iBAAiB,CAACC,KAAD,EAAQ,KAAKwF,SAAL,CAAeC,IAAvB,EAA6B,KAAKD,SAAL,CAAeE,EAA5C,CAA5C;AACA,gBAAII,UAAJ;AACA,gBAAIC,iBAAiB,GAAG,KAAKlG,IAAL,CAAUmG,SAAV,CAAoBC,WAApB,EAAxB;;AACA,gBAAIF,iBAAiB,KAAK,KAA1B,EAAiC;AAC/BD,cAAAA,UAAU,GAAGjF,EAAE,CAACqF,SAAH,CAAaL,oBAAb,CAAb;AACD,aAFD,MAEO;AACLC,cAAAA,UAAU,GAAGjF,EAAE,CAACiF,UAAH,CAAcD,oBAAd,CAAb;AACD;;AAED,gBAAIM,KAAK,GAAGtF,EAAE,CACTuF,UADO,CACI,KAAKf,MADT,EAEPrF,KAFO,CAEDA,KAFC,EAGPqG,UAHO,CAGIP,UAHJ,EAIPQ,WAJO,CAIK9E,mBAJL,EAKP+E,QALO,CAKE,KAAKC,WALP,CAAZ;AAOA,gBAAIC,IAAI,GAAG,KAAKC,QAAhB,CAvBS,CAuBiB;;AAC1B,gBAAIC,IAAI,GAAG,KAAKC,UAAhB;AAEA,iBAAKC,OAAL,CAAaC,MAAb,CAAoB,GAApB,EACK3B,IADL,CACU,OADV,EACmB,aADnB,EAEKA,IAFL,CAEU,WAFV,EAEuB,eAAewB,IAAf,GAAsB,GAAtB,GAA4BF,IAA5B,GAAmC,GAF1D,EAGKM,IAHL,CAGUZ,KAHV,EA1BS,CA+BT;;AACA,iBAAKU,OAAL,CACK9B,MADL,CACY,SADZ,EAEKA,MAFL,CAEY,SAFZ,EAGKiC,MAHL;AAID,W,CAED;;;;oCACUhH,K,EAAO;AACf,gBAAIG,KAAW,GAAG,EAAlB;AACA,gBAAI8G,IAAI,GAAG,KAAKT,WAAL,GAAmBxG,KAAK,CAACkH,MAApC,CAFe,CAGf;;AACA/G,YAAAA,KAAK,CAACgH,IAAN,CAAWF,IAAX;;AACA,iBAAK,IAAIG,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGpH,KAAK,CAACkH,MAA1B,EAAkCE,CAAC,EAAnC,EAAuC;AACrCjH,cAAAA,KAAK,CAACgH,IAAN,CAAWF,IAAI,IAAIG,CAAC,GAAC,CAAN,CAAf;AACD;;AACD,mBAAOvG,EAAE,CAACwG,YAAH,GACF9B,MADE,CACKvF,KADL,EAEFG,KAFE,CAEIA,KAFJ,CAAP;AAGD,W,CAED;;;;wCACcH,K,EAAO;AACnB,gBAAIG,KAAW,GAAG,EAAlB;AACA,gBAAI8G,IAAI,GAAG,KAAKT,WAAL,GAAmBxG,KAAK,CAACkH,MAApC,CAFmB,CAGnB;;AACA/G,YAAAA,KAAK,CAACgH,IAAN,CAAW,KAAKpF,OAAhB;;AACA,iBAAK,IAAIqF,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGpH,KAAK,CAACkH,MAA1B,EAAkCE,CAAC,EAAnC,EAAuC;AACrCjH,cAAAA,KAAK,CAACgH,IAAN,CAAWF,IAAI,GAAGG,CAAP,GAAW,KAAKrF,OAA3B;AACD;;AACD,mBAAOlB,EAAE,CAACwG,YAAH,GACF9B,MADE,CACKvF,KADL,EAEFG,KAFE,CAEIA,KAFJ,CAAP;AAGD;;;qCAEU;AACT,gBAAIH,KAAK,GAAGO,CAAC,CAAC+G,IAAF,CAAO/G,CAAC,CAACiE,GAAF,CAAM,KAAK+C,IAAX,EAAiB,UAAAC,CAAC;AAAA,qBAAIA,CAAC,CAACC,MAAN;AAAA,aAAlB,CAAP,CAAZ,CADS,CAGT;;;AACA,gBAAIlH,CAAC,CAACmH,OAAF,CAAU,KAAKH,IAAf,CAAJ,EAA0B;AACxBvH,cAAAA,KAAK,GAAG,CAAC,EAAD,CAAR;AACD;;AAED,gBAAI,KAAK2D,KAAL,CAAWgE,SAAX,IAAwB,OAA5B,EAAqC;AACnC3H,cAAAA,KAAK,CAAC4H,IAAN,CAAW,UAACC,CAAD,EAAIC,CAAJ;AAAA,uBAAUD,CAAC,CAACE,aAAF,CAAgBD,CAAhB,EAAmB,IAAnB,EAAyB;AAACE,kBAAAA,iBAAiB,EAAE,KAApB;AAA2BC,kBAAAA,OAAO,EAAE;AAApC,iBAAzB,CAAV;AAAA,eAAX;AACD,aAFD,MAEO,IAAI,KAAKtE,KAAL,CAAWgE,SAAX,IAAwB,OAA5B,EAAqC;AAC1C3H,cAAAA,KAAK,CAAC4H,IAAN,CAAW,UAACE,CAAD,EAAID,CAAJ;AAAA,uBAAUA,CAAC,CAACE,aAAF,CAAgBD,CAAhB,EAAmB,IAAnB,EAAyB;AAACE,kBAAAA,iBAAiB,EAAE,KAApB;AAA2BC,kBAAAA,OAAO,EAAE;AAApC,iBAAzB,CAAV;AAAA,eAAX;AACD;;AAED,gBAAIC,UAAU,GAAG,KAAKC,aAAL,CAAmBnI,KAAnB,CAAjB;AACA,iBAAKN,KAAL,CAAW0I,MAAX,GAAoB,KAAKA,MAAL,GAAc,KAAKC,SAAL,CAAerI,KAAf,CAAlC;AAEA,gBAAIsI,KAAK,GAAGzH,EAAE,CACT0H,QADO,CACEL,UADF,EAEPM,UAFO,CAEIxI,KAFJ,EAGPyI,aAHO,CAGO,IAAI,KAAK9D,KAHhB,EAIP2B,WAJO,CAIK7E,mBAJL,CAAZ;AAMA,iBAAKoF,OAAL,CACKC,MADL,CACY,GADZ,EAEK3B,IAFL,CAEU,OAFV,EAEmB,aAFnB,EAGK4B,IAHL,CAGUuB,KAHV,EAvBS,CA4BT;;AACA,gBAAI7B,IAAI,GAAG,KAAKhE,MAAL,CAAYF,GAAvB;AACA,gBAAIoE,IAAI,GAAG,KAAK+B,aAAL,CAAmB,KAAK7B,OAAxB,IAAmCpF,mBAA9C;AACA,iBAAKoF,OAAL,CAAa9B,MAAb,CAAoB,SAApB,EAA+BI,IAA/B,CAAoC,WAApC,EAAiD,eAAewB,IAAf,GAAsB,GAAtB,GAA4BF,IAA5B,GAAmC,GAApF,EA/BS,CAiCT;;AACA,iBAAKI,OAAL,CAAa9B,MAAb,CAAoB,SAApB,EAA+BA,MAA/B,CAAsC,SAAtC,EAAiDiC,MAAjD;AACA,iBAAKH,OAAL,CAAa9B,MAAb,CAAoB,SAApB,EAA+BV,SAA/B,CAAyC,YAAzC,EAAuD2C,MAAvD;AACD,W,CAED;;;;yCACe/G,G,EAAKC,G,EAAKyI,Y,EAAc;AACrC,gBAAIC,QAAQ,GAAG,CAAC1I,GAAG,IAAI,KAAK2I,qBAAL,GAA6B,CAAjC,CAAH,GAAyC5I,GAAG,IAAI,KAAK4I,qBAAL,GAA6B,CAAjC,CAA7C,IAAoF,CAAnG;AACA,gBAAIC,KAAJ,EAAWC,KAAX;;AAEA,gBAAIJ,YAAY,KAAK,CAArB,EAAwB;AACtBI,cAAAA,KAAK,GAAG7I,GAAG,GAAG,KAAK2I,qBAAnB;AACAC,cAAAA,KAAK,GAAG7I,GAAG,GAAGA,GAAG,IAAI,KAAK4I,qBAAL,GAA6B,CAAjC,CAAjB;AACAF,cAAAA,YAAY,GAAG,CAACI,KAAK,GAAGD,KAAT,IAAkB,CAAjC;AACD,aAJD,MAIO;AACLC,cAAAA,KAAK,GAAGnE,IAAI,CAACC,IAAL,CAAU,CAAC3E,GAAG,GAAG0I,QAAP,IAAmBD,YAA7B,IAA6CA,YAArD;AACAG,cAAAA,KAAK,GAAGlE,IAAI,CAACoE,KAAL,CAAW,CAAC/I,GAAG,GAAG2I,QAAP,IAAmBD,YAA9B,IAA8CA,YAAtD;AACD,aAXoC,CAarC;;;AACA,gBAAI1I,GAAG,IAAI,CAAP,IAAY6I,KAAK,GAAG,CAAxB,EAA2B;AACzBA,cAAAA,KAAK,GAAG,CAAR;AACD;;AAED,mBAAO;AAACA,cAAAA,KAAK,EAALA,KAAD;AAAQC,cAAAA,KAAK,EAALA;AAAR,aAAP;AACD;;;6CAEkBE,Q,EAAiC;AAAA,gBAAvBC,cAAuB,uEAAN,IAAM;AAClD,gBAAIC,MAAM,GAAG,KAAKxF,KAAL,CAAW2E,KAAX,CAAiBa,MAA9B;AACA,mBAAO,UAASC,KAAT,EAAgB;AACrB,qBAAO1I,GAAG,CAAC2I,YAAJ,CAAiBF,MAAjB,EAAyBC,KAAzB,EAAgCH,QAAhC,EAA0CC,cAA1C,CAAP;AACD,aAFD;AAGD,W,CAED;AACA;;;;6CACmB;AACjB,gBAAII,YAAY,GAAG,KAAK3H,QAAL,CAAc,CAAd,CAAnB;AAEA,iBAAKgD,KAAL,GAAaC,IAAI,CAACoE,KAAL,CAAW,KAAKrH,QAAL,CAAcgD,KAAd,EAAX,IAAoC,KAAKvC,OAAL,CAAaE,KAA9D;AACA,iBAAKoB,MAAL,GAAckB,IAAI,CAACoE,KAAL,CAAW,KAAKrH,QAAL,CAAc+B,MAAd,EAAX,IAAqC,KAAKtB,OAAL,CAAaI,MAAhE;;AAEA,gBAAI,KAAKqE,OAAT,EAAkB;AAChB,mBAAKA,OAAL,CAAaG,MAAb;AACD;;AAED,iBAAKH,OAAL,GAAehG,EAAE,CAACkE,MAAH,CAAUuE,YAAV,EACVxC,MADU,CACH,KADG,EAEV3B,IAFU,CAEL,OAFK,EAEI,KAAKR,KAFT,EAGVQ,IAHU,CAGL,QAHK,EAGK,KAAKzB,MAHV,CAAf;AAKA,iBAAK8C,WAAL,GAAmB,KAAK9C,MAAL,GAAc,KAAKjB,MAAL,CAAYF,GAA1B,GAAgC,KAAKE,MAAL,CAAYD,MAA/D;AACA,iBAAKkE,QAAL,GAAgB,KAAKjE,MAAL,CAAYF,GAA5B;AACA,iBAAKgH,WAAL,GAAmB,KAAK7C,QAAL,GAAgB,KAAKF,WAAxC;AAEA,iBAAKgD,YAAL,GAAoB,KAAK7F,KAAL,CAAW8F,KAAX,CAAiBD,YAAjB,KAAkC,IAAlC,GAAyC,KAAK7F,KAAL,CAAW8F,KAAX,CAAiBD,YAA1D,GAAyEtI,cAA7F;AACA,iBAAKwI,YAAL,GAAoB,KAAK/F,KAAL,CAAW8F,KAAX,CAAiBC,YAAjB,KAAkC,IAAlC,GAAyC,KAAK/F,KAAL,CAAW8F,KAAX,CAAiBC,YAA1D,GAAyEvI,cAA7F;AACA,iBAAKwI,SAAL,GAAiB,KAAKhG,KAAL,CAAW8F,KAAX,CAAiBE,SAAjB,KAA+B,IAA/B,GAAsC,KAAKhG,KAAL,CAAW8F,KAAX,CAAiBE,SAAvD,GAAmEvI,UAApF,CArBiB,CAuBjB;;AACA,iBAAKwI,SAAL,GAAiBhF,IAAI,CAACoE,KAAL,CAAW,KAAKxC,WAAL,GAAmB,KAAKqD,SAAL,CAAeC,WAA7C,CAAjB;AACA,iBAAKC,UAAL,GAAkB,KAAKH,SAAL,GAAiB,KAAKA,SAAL,GAAiB,KAAKF,YAAvC,GAAsD,CAAxE;AACA,iBAAK3H,OAAL,GAAe,KAAKgI,UAAL,GAAkB,CAAjC;AAEA,iBAAKC,QAAL;AAEA,iBAAKpD,UAAL,GAAkB,KAAK8B,aAAL,CAAmB,KAAK7B,OAAxB,IAAmCpF,mBAArD;AACA,iBAAKmE,UAAL,GAAkB,KAAKjB,KAAL,GAAa,KAAKiC,UAAlB,GAA+B,KAAKnE,MAAL,CAAYH,KAA7D,CA/BiB,CAiCjB;AACA;;AACA,iBAAKqD,SAAL,GAAiB,KAAKC,UAAL,IAAmB,KAAKiE,SAAL,CAAeI,WAAf,GAA2B,CAA9C,CAAjB;AACA,iBAAKC,SAAL,GAAiB,KAAKvE,SAAL,GAAiB,KAAK6D,YAAvC;AAEA,iBAAKW,QAAL;AACA,iBAAKC,WAAL,GAAmB,KAAKC,cAAL,CAAoB,KAAKxD,OAAzB,CAAnB;;AAEA,gBAAI,CAAC,KAAKlD,KAAL,CAAW2E,KAAX,CAAiBrE,IAAtB,EAA4B;AAC1B,mBAAK4C,OAAL,CAAa9B,MAAb,CAAoB,SAApB,EAA+BV,SAA/B,CAAyC,MAAzC,EAAiDiG,KAAjD,CAAuD,SAAvD,EAAkE,CAAlE;AACD;;AAED,gBAAI,CAAC,KAAK3G,KAAL,CAAWwC,KAAX,CAAiBlC,IAAtB,EAA4B;AAC1B,mBAAK4C,OAAL,CAAa9B,MAAb,CAAoB,SAApB,EAA+BV,SAA/B,CAAyC,MAAzC,EAAiDiG,KAAjD,CAAuD,SAAvD,EAAkE,CAAlE;AACD;AACF;;;uCAEY;AAAA;;AACX,iBAAKC,gBAAL;AAEA,gBAAIC,QAAQ,GAAG,KAAK7G,KAAL,CAAW8G,KAAX,CAAiBvK,GAAjB,IAAwB,KAAK2J,SAAL,CAAeW,QAAtD;AACA,gBAAIE,QAAQ,GAAG,KAAK/G,KAAL,CAAW8G,KAAX,CAAiBxK,GAAjB,IAAwB,KAAK4J,SAAL,CAAea,QAAtD;;AAEA,gBAAI,KAAK/G,KAAL,CAAW8G,KAAX,CAAiBE,IAAjB,KAA0B,UAA9B,EAA0C;AACxC,mBAAKC,UAAL,GAAkB,KAAKC,aAAL,CAAmBL,QAAnB,EAA6BE,QAA7B,CAAlB;AACD;;AACD,iBAAKI,eAAL,CAAqBN,QAArB;AAEA,gBAAIf,KAAK,GAAG,KAAK5C,OAAL,CAAaxC,SAAb,CAAuB,sBAAvB,EAA+CkD,IAA/C,CAAoD,KAAKsC,SAAL,CAAeJ,KAAnE,CAAZ;AACAA,YAAAA,KAAK,CAAC3C,MAAN,CAAa,OAAb;AACA2C,YAAAA,KAAK,GAAGA,KAAK,CAACsB,KAAN,GAAcjE,MAAd,CAAqB,MAArB,EACH3B,IADG,CACE,QADF,EACY,UAAA6F,CAAC;AAAA,qBAAIA,CAAC,CAACC,EAAN;AAAA,aADb,EAEH9F,IAFG,CAEE,GAFF,EAEO,KAAK+F,QAAL,CAAcrI,IAAd,CAAmB,IAAnB,CAFP,EAGHsC,IAHG,CAGE,OAHF,EAGW,KAAKgG,YAAL,CAAkBtI,IAAlB,CAAuB,IAAvB,CAHX,EAIHsC,IAJG,CAIE,GAJF,EAIO,KAAKiG,QAAL,CAAcvI,IAAd,CAAmB,IAAnB,CAJP,EAKHsC,IALG,CAKE,QALF,EAKY,KAAKkG,aAAL,CAAmBxI,IAAnB,CAAwB,IAAxB,CALZ,EAMHsC,IANG,CAME,IANF,EAMQ,KAAKwE,SANb,EAOHxE,IAPG,CAOE,IAPF,EAOQ,KAAKwE,SAPb,EAQHxE,IARG,CAQE,OARF,EAQW,8BARX,EASHmF,KATG,CASG,MATH,EASW,KAAKgB,YAAL,CAAkBzI,IAAlB,CAAuB,IAAvB,CATX,EAUHyH,KAVG,CAUG,QAVH,EAUa,KAAKgB,YAAL,CAAkBzI,IAAlB,CAAuB,IAAvB,CAVb,EAWHyH,KAXG,CAWG,cAXH,EAWmB,CAXnB,EAYJ;AACA;AAbI,aAcHA,KAdG,CAcG,SAdH,EAcc,KAAKiB,cAAL,CAAoB1I,IAApB,CAAyB,IAAzB,CAdd,CAAR;AAgBA,gBAAI2I,MAAM,GAAG,KAAK7J,QAAL,CAAcC,IAAd,CAAmB,sBAAnB,CAAb;AACA4J,YAAAA,MAAM,CACH7I,EADH,CACM,YADN,EACoB,UAACU,KAAD,EAAW;AAC3B,cAAA,KAAI,CAACxB,OAAL,CAAa4J,eAAb,GAA+B,IAA/B;;AACA,cAAA,KAAI,CAACC,aAAL,CAAmBrI,KAAnB;AACD,aAJH,EAKGV,EALH,CAKM,YALN,EAKoB,UAACU,KAAD,EAAW;AAC3B,cAAA,KAAI,CAACxB,OAAL,CAAa4J,eAAb,GAA+B,KAA/B;;AACA,cAAA,KAAI,CAACE,kBAAL,CAAwBtI,KAAxB;AACD,aARH;;AAUA,iBAAKuI,kBAAL;;AAEA,iBAAK/L,IAAL,CAAU6C,MAAV,CAAiBmJ,IAAjB,CAAsB,iBAAtB,EAAyC;AACvC,4BAAc,KAAKjG;AADoB,aAAzC;AAGD;;;wCAEavC,K,EAAO;AACnB,gBAAMoH,KAAK,GAAG5J,EAAE,CAACkE,MAAH,CAAU1B,KAAK,CAACoE,MAAhB,EAAwB6C,KAAxB,CAA8B,MAA9B,CAAd;AACA,gBAAMwB,cAAc,GAAGjL,EAAE,CAAC4J,KAAH,CAASA,KAAT,EAAgBsB,MAAhB,CAAuB,CAAvB,CAAvB;AACA,gBAAMC,WAAW,GAAGnL,EAAE,CAAC4J,KAAH,CAASA,KAAT,EAAgBwB,QAAhB,CAAyB,CAAzB,CAApB;AACA,gBAAMC,YAAY,GAAGrL,EAAE,CAACkE,MAAH,CAAU1B,KAAK,CAACoE,MAAhB,CAArB;AACA,iBAAK5F,OAAL,CAAasK,iBAAb,GAAiC1B,KAAjC;AACAyB,YAAAA,YAAY,CACP5B,KADL,CACW,MADX,EACmBwB,cAAc,CAACM,QAAf,EADnB,EAEK9B,KAFL,CAEW,QAFX,EAEqB0B,WAAW,CAACI,QAAZ,EAFrB,EAGK9B,KAHL,CAGW,cAHX,EAG2B,CAH3B;AAID;;;6CAEkBjH,K,EAAO;AACxBxC,YAAAA,EAAE,CAACkE,MAAH,CAAU1B,KAAK,CAACoE,MAAhB,EACG6C,KADH,CACS,MADT,EACiB,KAAKzI,OAAL,CAAasK,iBAD9B,EAEG7B,KAFH,CAES,QAFT,EAEmB,KAAKzI,OAAL,CAAasK,iBAFhC,EAGG7B,KAHH,CAGS,cAHT,EAGyB,CAHzB;AAID;;;wCAEaE,Q,EAAwB;AAAA,gBAAdE,QAAc,uEAAH,CAAG;;AACpC,gBAAI2B,WAAW,GAAG9L,CAAC,CAACqB,IAAF,CAAO,KAAK/B,IAAL,CAAUyM,YAAjB,EAA+B;AAAClD,cAAAA,KAAK,EAAE,KAAKzF,KAAL,CAAW8G,KAAX,CAAiB4B;AAAzB,aAA/B,CAAlB,CADoC,CAEpC;AACA;AACA;;;AACA,gBAAIE,iBAAiB,GAAGzL,gBAAgB,CAACuL,WAAW,CAACjD,KAAb,CAAxC;AACA,gBAAIoD,kBAAkB,GAAGH,WAAW,CAACI,MAAZ,KAAuB,QAAvB,IACpBJ,WAAW,CAACI,MAAZ,KAAuB,MAAvB,IAAiC,CAAC7L,UAAU,CAAC8L,IAAX,CAAgBC,UADvD;AAGA,gBAAInC,QAAQ,IAAIE,QAAhB,EACEF,QAAQ,GAAGE,QAAQ,GAAG,CAAtB;AAEF,gBAAIkC,KAAK,GAAGJ,kBAAkB,GAAGhC,QAAH,GAAcE,QAA5C;AACA,gBAAImC,GAAG,GAAGL,kBAAkB,GAAG9B,QAAH,GAAcF,QAA1C;AAEA,mBAAO3J,EAAE,CAACiM,eAAH,CAAmBP,iBAAnB,EAAsChH,MAAtC,CAA6C,CAACqH,KAAD,EAAQC,GAAR,CAA7C,CAAP;AACD;;;0CAEerC,Q,EAAU;AACxB,gBAAI,KAAK7G,KAAL,CAAW8G,KAAX,CAAiBG,UAAjB,KAAgC,QAApC,EAA8C;AAC5C,mBAAKmC,YAAL,GAAoBlM,EAAE,CAACmM,WAAH,GACfzH,MADe,CACR,CAAC,CAAD,EAAIiF,QAAJ,CADQ,EAEfrK,KAFe,CAET,CAAC,CAAD,EAAI,CAAJ,CAFS,CAApB;AAGD,aAJD,MAIO,IAAI,KAAKwD,KAAL,CAAW8G,KAAX,CAAiBG,UAAjB,KAAgC,MAApC,EAA4C;AACjD,mBAAKmC,YAAL,GAAoBlM,EAAE,CAACoM,QAAH,GAAcC,QAAd,CAAuB,KAAKvJ,KAAL,CAAW8G,KAAX,CAAiByC,QAAxC,EACf3H,MADe,CACR,CAAC,CAAD,EAAIiF,QAAJ,CADQ,EAEfrK,KAFe,CAET,CAAC,CAAD,EAAI,CAAJ,CAFS,CAApB;AAGD;AACF;;;mCAEQqH,C,EAAG;AACV,gBAAI2F,CAAJ,CADU,CAEV;;AACA,gBAAIC,EAAE,GAAG,KAAK/H,MAAL,CAAYmC,CAAC,CAAC2F,CAAd,CAAT;;AAEA,gBAAIC,EAAE,GAAG,KAAKlD,SAAL,GAAe,CAApB,GAAwB,CAA5B,EAA+B;AAC7BiD,cAAAA,CAAC,GAAG,KAAKvG,UAAL,GAAkB,KAAK4C,YAAL,GAAkB,CAAxC;AACD,aAFD,MAEO;AACL2D,cAAAA,CAAC,GAAG,KAAKvG,UAAL,GAAkBwG,EAAlB,GAAuB,KAAKlD,SAAL,GAAe,CAA1C;AACD;;AAED,mBAAOiD,CAAP;AACD,W,CAED;;;;uCACa3F,C,EAAG;AACd,gBAAI6F,CAAJ;AACA,gBAAID,EAAE,GAAG,KAAK/H,MAAL,CAAYmC,CAAC,CAAC2F,CAAd,CAAT;;AAEA,gBAAIC,EAAE,GAAG,KAAKlD,SAAL,GAAe,CAAxB,EAA2B;AACzB;AACA;AACA,kBAAIoD,YAAY,GAAIF,EAAE,GAAG,KAAK5D,YAAL,GAAkB,CAAxB,GAA6B,KAAKU,SAAL,GAAe,CAA/D;AACAmD,cAAAA,CAAC,GAAGC,YAAY,GAAG,CAAf,GAAmBA,YAAnB,GAAkC,CAAtC;AACD,aALD,MAKO,IAAI,KAAK1H,UAAL,GAAkBwH,EAAlB,GAAuB,KAAKlD,SAAL,GAAe,CAA1C,EAA6C;AAClD;AACAmD,cAAAA,CAAC,GAAG,KAAKnD,SAAL,GAAe,CAAf,IAAoB,KAAKtE,UAAL,GAAkBwH,EAAlB,GAAuB,KAAK5D,YAAL,GAAkB,CAA7D,CAAJ;AACD,aAHM,MAGA;AACL6D,cAAAA,CAAC,GAAG,KAAKnD,SAAT;AACD,aAda,CAgBd;;;AACAmD,YAAAA,CAAC,GAAGzI,IAAI,CAAC1E,GAAL,CAASmN,CAAT,EAAYpM,aAAZ,CAAJ;;AAEA,gBAAI,KAAKuI,YAAL,IAAqB,CAAzB,EAA4B;AAC1B6D,cAAAA,CAAC,GAAGA,CAAC,GAAC,CAAN;AACD;;AAED,mBAAOA,CAAP;AACD;;;mCAEQ7F,C,EAAG;AACV,mBAAO,KAAKY,MAAL,CAAYZ,CAAC,CAAC+F,CAAd,IAAmB,KAAK7G,QAAxB,GAAmC,KAAKqD,UAAxC,GAAqD,KAAKL,YAAL,GAAkB,CAA9E;AACD;;;wCAEalC,C,EAAG;AACf,gBAAIgG,EAAE,GAAG,KAAKpF,MAAL,CAAYZ,CAAC,CAAC+F,CAAd,CAAT;AACA,gBAAIA,CAAC,GAAGC,EAAE,GAAG,KAAK9G,QAAV,GAAqB,KAAKqD,UAA1B,GAAuC,KAAKL,YAAL,GAAkB,CAAjE;AACA,gBAAI+D,CAAC,GAAG,KAAK1D,UAAb,CAHe,CAKf;;AACA,gBAAIwD,CAAC,GAAG,KAAK7G,QAAb,EAAuB;AACrB+G,cAAAA,CAAC,GAAGD,EAAE,GAAG,KAAK9D,YAAL,GAAkB,CAA3B;AACD,aAFD,MAEO,IAAI8D,EAAE,GAAG,KAAKjE,WAAd,EAA2B;AAChCkE,cAAAA,CAAC,GAAG,KAAKlE,WAAL,GAAmBgE,CAAvB;AACD,aAFM,MAEA,IAAIA,CAAC,GAAG,KAAKxD,UAAT,GAAsB,KAAKR,WAA/B,EAA4C;AACjDkE,cAAAA,CAAC,GAAG,KAAKlE,WAAL,GAAmBgE,CAAvB;AACD,aAZc,CAcf;;;AACAE,YAAAA,CAAC,GAAG7I,IAAI,CAAC3E,GAAL,CAASwN,CAAT,EAAY,KAAKjH,WAAjB,CAAJ,CAfe,CAgBf;;AACAiH,YAAAA,CAAC,GAAG7I,IAAI,CAAC1E,GAAL,CAASuN,CAAT,EAAYxM,aAAZ,CAAJ;;AAEA,gBAAI,KAAKyI,YAAL,IAAqB,CAAzB,EAA4B;AAC1B+D,cAAAA,CAAC,GAAGA,CAAC,GAAC,CAAN;AACD;;AAED,mBAAOA,CAAP;AACD;;;uCAEYjG,C,EAAG;AACd,gBAAI,KAAK7D,KAAL,CAAW8G,KAAX,CAAiBE,IAAjB,KAA0B,SAA9B,EAAyC;AACvC,qBAAO,KAAKhH,KAAL,CAAW8G,KAAX,CAAiBiD,SAAxB;AACD,aAFD,MAEO,IAAI,KAAK/J,KAAL,CAAW8G,KAAX,CAAiBE,IAAjB,KAA0B,UAA9B,EAA0C;AAC/C,qBAAO,KAAKC,UAAL,CAAgBpD,CAAC,CAAC4B,KAAlB,CAAP;AACD,aAFM,MAEA,IAAI,KAAKzF,KAAL,CAAW8G,KAAX,CAAiBE,IAAjB,KAA0B,UAA9B,EAA0C;AAC/C,qBAAO,KAAK9K,IAAL,CAAU8N,cAAV,CAAyBC,cAAzB,CAAwCpG,CAAC,CAACqG,MAA1C,CAAP;AACD;AACF;;;yCAEcrG,C,EAAG;AAChB,gBAAI,KAAK7D,KAAL,CAAWmK,aAAX,KAA6B,UAA7B,IAA2CtG,CAAC,CAAC4B,KAAF,IAAW,IAA1D,EAAiE;AAC/D,qBAAO,CAAP;AACD;;AACD,gBAAI,KAAKzF,KAAL,CAAW8G,KAAX,CAAiBE,IAAjB,KAA0B,SAA9B,EAAyC;AACvC,qBAAO,KAAKoC,YAAL,CAAkBvF,CAAC,CAAC4B,KAApB,CAAP;AACD,aAFD,MAEO;AACL,qBAAO,CAAP;AACD;AACF;;;6CAEkB5B,C,EAAG;AACpB,gBAAI,KAAK7D,KAAL,CAAW8G,KAAX,CAAiBE,IAAjB,KAA0B,UAA9B,EAA0C;AACxC,qBAAO,GAAP;AACD;;AACD,mBAAO,GAAP;AACD,W,CAGD;AACA;AACA;;;;yCAEetH,K,EAAO;AACpB,gBAAM0K,UAAU,GAAG,KAAKpM,QAAL,CAAcqM,MAAd,EAAnB;AACA,gBAAMb,CAAC,GAAGvI,IAAI,CAACoE,KAAL,CAAW3F,KAAK,CAAC4K,OAAN,GAAgBF,UAAU,CAAC1L,IAAtC,CAAV;AACA,gBAAMkL,CAAC,GAAG3I,IAAI,CAACoE,KAAL,CAAW3F,KAAK,CAAC6K,OAAN,GAAgBH,UAAU,CAACxL,GAAtC,CAAV;AACA,mBAAO;AAAE4K,cAAAA,CAAC,EAADA,CAAF;AAAKI,cAAAA,CAAC,EAADA;AAAL,aAAP;AACD;;;sCAEWlK,K,EAAO;AAAA;;AACjB,gBAAM2K,MAAM,GAAG,KAAKG,cAAL,CAAoB9K,KAApB,CAAf;AACA,iBAAKrB,SAAL,CAAeC,MAAf,GAAwB,IAAxB;AACA,iBAAKD,SAAL,CAAeE,EAAf,GAAoB8L,MAAM,CAACb,CAA3B;;AAEA,iBAAKiB,cAAL,GAAsB,YAAM;AAC1B,cAAA,MAAI,CAACC,SAAL;AACD,aAFD;;AAIA7N,YAAAA,CAAC,CAAC8N,QAAD,CAAD,CAAYC,GAAZ,CAAgB,SAAhB,EAA2B,KAAKH,cAAL,CAAoBvL,IAApB,CAAyB,IAAzB,CAA3B;AACD;;;sCAEW;AACVrC,YAAAA,CAAC,CAAC8N,QAAD,CAAD,CAAYE,MAAZ,CAAmB,SAAnB,EAA8B,KAAKJ,cAAL,CAAoBvL,IAApB,CAAyB,IAAzB,CAA9B;AACA,iBAAKuL,cAAL,GAAsB,IAAtB;AACA,iBAAKpM,SAAL,CAAeC,MAAf,GAAwB,KAAxB;AAEA,gBAAIwM,cAAc,GAAG7J,IAAI,CAAC8J,GAAL,CAAS,KAAK1M,SAAL,CAAeG,EAAf,GAAoB,KAAKH,SAAL,CAAeE,EAA5C,CAArB;;AACA,gBAAI,KAAKF,SAAL,CAAeG,EAAf,IAAqB,CAArB,IAA0BsM,cAAc,GAAG/M,mBAA/C,EAAoE;AAClE,kBAAIiN,QAAQ,GAAG,KAAKtJ,MAAL,CAAYoH,MAAZ,CAAmB7H,IAAI,CAAC3E,GAAL,CAAS,KAAK+B,SAAL,CAAeE,EAAxB,EAA4B,KAAKF,SAAL,CAAeG,EAA3C,IAAiD,KAAKyE,UAAtD,GAAmE,KAAKjB,SAAL,GAAe,CAArG,CAAf;AACA,kBAAIiJ,MAAM,GAAG,KAAKvJ,MAAL,CAAYoH,MAAZ,CAAmB7H,IAAI,CAAC1E,GAAL,CAAS,KAAK8B,SAAL,CAAeE,EAAxB,EAA4B,KAAKF,SAAL,CAAeG,EAA3C,IAAiD,KAAKyE,UAAtD,GAAmE,KAAKjB,SAAL,GAAe,CAArG,CAAb;AAEA,mBAAK9F,IAAL,CAAUgP,OAAV,CAAkBC,OAAlB,CAA0B;AACxBrJ,gBAAAA,IAAI,EAAEhF,MAAM,CAACsO,GAAP,CAAWJ,QAAX,CADkB;AAExBjJ,gBAAAA,EAAE,EAAEjF,MAAM,CAACsO,GAAP,CAAWH,MAAX;AAFoB,eAA1B;AAID;;AAED,iBAAKI,cAAL;AACD;;;yCAEc;AACbrO,YAAAA,SAAS,CAACkL,IAAV,CAAe,mBAAf;AACA,iBAAKzI,cAAL,GAFa,CAGb;AACD;;;sCAEWC,K,EAAO;AACjB,gBAAI,CAAC,KAAKwD,OAAV,EAAmB;AAAE;AAAS;;AAE9B,gBAAMmH,MAAM,GAAG,KAAKG,cAAL,CAAoB9K,KAApB,CAAf;;AACA,gBAAI,KAAKrB,SAAL,CAAeC,MAAnB,EAA2B;AACzB;AACA,mBAAKmB,cAAL;AACA,mBAAKvB,OAAL,CAAaoN,OAAb;AACA,mBAAKnN,iBAAL,CAAuBmN,OAAvB;AAEA,mBAAKjN,SAAL,CAAeG,EAAf,GAAoB,KAAK+M,cAAL,CAAoB7L,KAAK,CAAC8L,OAA1B,CAApB;AACA,mBAAKC,aAAL,CAAmB,KAAKpN,SAAL,CAAeE,EAAlC,EAAsC,KAAKF,SAAL,CAAeG,EAArD;AACD,aARD,MAQO;AACL;AACA,mBAAKkN,mBAAL,CAAyBhM,KAAzB;AACA,mBAAKiM,aAAL,CAAmBtB,MAAM,CAACb,CAA1B;AACA,mBAAKtL,OAAL,CAAaoC,IAAb,CAAkBZ,KAAlB,EAJK,CAIqB;;AAC1B,mBAAKvB,iBAAL,CAAuBmC,IAAvB,CAA4BZ,KAA5B;AACD;AACF;;;sCAEWA,K,EAAO2K,M,EAAQ;AACzB,gBAAMb,CAAC,GAAG,KAAK9H,MAAL,CAAYoH,MAAZ,CAAmBuB,MAAM,CAACb,CAAP,GAAW,KAAKvG,UAAnC,EAA+C2I,OAA/C,EAAV;AACA,gBAAMhC,CAAC,GAAG,KAAKnF,MAAL,CAAYqE,MAAZ,CAAmBuB,MAAM,CAACT,CAAP,GAAW,KAAK7G,QAAnC,CAAV;AACA,gBAAMnD,GAAG,GAAG;AACViM,cAAAA,KAAK,EAAEnM,KAAK,CAACmM,KADH;AAEVC,cAAAA,KAAK,EAAEpM,KAAK,CAACoM,KAFH;AAGVtC,cAAAA,CAAC,EAAEA,CAHO;AAIVjL,cAAAA,EAAE,EAAEiL,CAJM;AAKVI,cAAAA,CAAC,EAAEA,CALO;AAMVmC,cAAAA,EAAE,EAAEnC,CANM;AAOVoC,cAAAA,SAAS,EAAE,IAPD;AAQV3B,cAAAA,MAAM,EAANA;AARU,aAAZ;AAWA,mBAAOzK,GAAP;AACD;;;8CAEmBF,K,EAAO;AACzB,gBAAI8J,CAAC,GAAG,KAAK9H,MAAL,CAAYoH,MAAZ,CAAmBpJ,KAAK,CAAC8L,OAAN,GAAgB,KAAKvI,UAArB,GAAkC,KAAKjB,SAAL,GAAe,CAApE,EAAuE4J,OAAvE,EAAR;AACA,gBAAIhC,CAAC,GAAG,KAAKnF,MAAL,CAAY/E,KAAK,CAACuM,OAAlB,CAAR;AACA,gBAAIrM,GAAG,GAAG;AACRiM,cAAAA,KAAK,EAAEnM,KAAK,CAACmM,KADL;AAERC,cAAAA,KAAK,EAAEpM,KAAK,CAACoM,KAFL;AAGRtC,cAAAA,CAAC,EAAEA,CAHK;AAGFjL,cAAAA,EAAE,EAAEiL,CAHF;AAIRI,cAAAA,CAAC,EAAEA,CAJK;AAIFmC,cAAAA,EAAE,EAAEnC,CAJF;AAKRoC,cAAAA,SAAS,EAAE;AALH,aAAV,CAHyB,CAWzB;;AACApM,YAAAA,GAAG,CAACoM,SAAJ,GAAgB/K,IAAI,CAAC1E,GAAL,CAASmD,KAAK,CAACuM,OAAN,GAAgB,KAAKlM,MAA9B,EAAsC,KAAtC,CAAhB,CAZyB,CAczB;;AACA/C,YAAAA,SAAS,CAACkL,IAAV,CAAe,aAAf,EAA8B;AAACtI,cAAAA,GAAG,EAAEA,GAAN;AAAWI,cAAAA,KAAK,EAAE,KAAKA;AAAvB,aAA9B;AACD;;;yCAEcxB,E,EAAI;AACjBA,YAAAA,EAAE,GAAGyC,IAAI,CAAC1E,GAAL,CAASiC,EAAT,EAAa,KAAKyE,UAAlB,CAAL;AACAzE,YAAAA,EAAE,GAAGyC,IAAI,CAAC3E,GAAL,CAASkC,EAAT,EAAa,KAAKyD,UAAL,GAAkB,KAAKgB,UAApC,CAAL;AACA,mBAAOzE,EAAP;AACD;;;wCAEa0N,K,EAAOC,K,EAAO;AAC1B,gBAAI,KAAKjJ,OAAT,EAAkB;AAChB,mBAAKA,OAAL,CAAaxC,SAAb,CAAuB,2BAAvB,EAAoD2C,MAApD;AACA,kBAAI+I,UAAU,GAAGnL,IAAI,CAAC3E,GAAL,CAAS4P,KAAT,EAAgBC,KAAhB,CAAjB;AACA,kBAAIE,cAAc,GAAGpL,IAAI,CAAC8J,GAAL,CAASmB,KAAK,GAAGC,KAAjB,CAArB;;AAEA,kBAAIE,cAAc,GAAGtO,mBAArB,EAA0C;AACxC,qBAAKmF,OAAL,CAAaC,MAAb,CAAoB,MAApB,EACC3B,IADD,CACM,OADN,EACe,0BADf,EAECA,IAFD,CAEM,GAFN,EAEW4K,UAFX,EAGC5K,IAHD,CAGM,OAHN,EAGe6K,cAHf,EAIC7K,IAJD,CAIM,GAJN,EAIW,KAAKuB,QAJhB,EAKCvB,IALD,CAKM,QALN,EAKgB,KAAKqB,WALrB;AAMD;AACF;AACF;;;2CAEgB;AACf,iBAAKxE,SAAL,CAAeE,EAAf,GAAoB,CAAC,CAArB;AACA,iBAAKF,SAAL,CAAeG,EAAf,GAAoB,CAAC,CAArB;;AAEA,gBAAI,KAAK0E,OAAT,EAAkB;AAChB,mBAAKA,OAAL,CAAaxC,SAAb,CAAuB,2BAAvB,EAAoD2C,MAApD;AACD;AACF;;;wCAGaiJ,Q,EAAU;AACtB,gBAAI,KAAKpJ,OAAT,EAAkB;AAChB,mBAAKA,OAAL,CAAaxC,SAAb,CAAuB,2BAAvB,EAAoD2C,MAApD;AAEA,kBAAIL,IAAI,GAAGsJ,QAAX;AACAtJ,cAAAA,IAAI,GAAG/B,IAAI,CAAC1E,GAAL,CAASyG,IAAT,EAAe,KAAKC,UAApB,CAAP;AACAD,cAAAA,IAAI,GAAG/B,IAAI,CAAC3E,GAAL,CAAS0G,IAAT,EAAe,KAAKf,UAAL,GAAkB,KAAKgB,UAAtC,CAAP;AAEA,mBAAKC,OAAL,CAAaC,MAAb,CAAoB,GAApB,EACG3B,IADH,CACQ,OADR,EACiB,0BADjB,EAEGA,IAFH,CAEQ,WAFR,EAEqB,eAAewB,IAAf,GAAsB,KAF3C,EAGGG,MAHH,CAGU,MAHV,EAIG3B,IAJH,CAIQ,IAJR,EAIc,CAJd,EAKGA,IALH,CAKQ,IALR,EAKc,KAAKuB,QALnB,EAMGvB,IANH,CAMQ,IANR,EAMc,CANd,EAOGA,IAPH,CAOQ,IAPR,EAOc,KAAKoE,WAPnB,EAQGpE,IARH,CAQQ,cARR,EAQwB,CARxB;AASD;AACF,W,CAED;;;;8CACoB5B,G,EAAK;AACvB,gBAAI,KAAKsD,OAAL,IAAgB,KAAKhH,IAAL,CAAUmG,SAAV,CAAoBkK,YAApB,KAAqC,CAAzD,EAA4D;AAC1D,kBAAMvJ,IAAI,GAAG,KAAKtB,MAAL,CAAY9B,GAAG,CAAC4J,CAAhB,IAAqB,KAAKvG,UAAvC;AACA,mBAAK0I,aAAL,CAAmB3I,IAAnB;AACD;AACF;;;2CAEgB;AACf,gBAAI,KAAKE,OAAT,EAAkB;AAChB,mBAAKA,OAAL,CAAaxC,SAAb,CAAuB,2BAAvB,EAAoD2C,MAApD;AACD;AACF;;;mCAGQ;AACP,iBAAKO,IAAL,GAAY,KAAK1H,IAAL,CAAU0H,IAAtB;AACA,iBAAK5D,KAAL,GAAa,KAAK9D,IAAL,CAAU8D,KAAvB;AACA,iBAAK6B,SAAL,GAAiB,KAAK3F,IAAL,CAAUM,KAA3B;AACA,iBAAK0J,SAAL,GAAiB,KAAKhK,IAAL,CAAUgK,SAA3B;;AAEA,gBAAI,CAAC,KAAKtC,IAAN,IAAc,CAAC,KAAKsC,SAApB,IAAiC,CAAC,KAAKsG,gBAAL,EAAtC,EAA+D;AAC7D;AACD,aARM,CAUP;;;AACA,gBAAI5P,CAAC,CAACmH,OAAF,CAAU,KAAKmC,SAAL,CAAeJ,KAAzB,CAAJ,EAAqC;AACnC,mBAAKc,gBAAL;AACA;AACD;;AAED,iBAAK6F,UAAL;AACA,iBAAK1Q,KAAL,CAAWkH,UAAX,GAAwB,KAAKA,UAA7B;AACA,iBAAKlH,KAAL,CAAW0K,WAAX,GAAyB,KAAKA,WAA9B;AACA,iBAAK1K,KAAL,CAAW8G,WAAX,GAAyB,KAAKA,WAA9B;AACA,iBAAK9G,KAAL,CAAWkG,UAAX,GAAwB,KAAKA,UAA7B;AACA,iBAAKlG,KAAL,CAAWgH,QAAX,GAAsB,KAAKA,QAA3B;AACD;;;+CAEoB;AAAA;;AACnB,gBAAI,CAAC,KAAK7G,IAAL,CAAUwQ,WAAX,IAA0B,KAAKxQ,IAAL,CAAUwQ,WAAV,CAAsBnJ,MAAtB,IAAgC,CAA9D,EAAiE;AAC/D;AACD;;AAED,gBAAI,CAAC,KAAKL,OAAV,EAAmB;AACjB;AACD;;AAID,gBAAIyJ,QAAQ,GAAG/P,CAAC,CAACiE,GAAF,CAAM,KAAK3E,IAAL,CAAUwQ,WAAhB,EAA6B,UAAC7I,CAAD,EAAGJ,CAAH;AAAA,qBAAU;AAAC,qBAAKxC,IAAI,CAACoE,KAAL,CAAW,MAAI,CAACpC,UAAL,GAAkB,MAAI,CAACvB,MAAL,CAAYmC,CAAC,CAAC+I,IAAd,CAA7B,CAAN;AAAyD,sBAAKnJ,CAA9D;AAAiE,wBAAQI,CAAC,CAACgJ;AAA3E,eAAV;AAAA,aAA7B,CAAf,CAXmB,CAanB;;;AAEA,gBAAIC,IAAI,GAAG,KAAK5J,OAAL,CACNC,MADM,CACC,GADD,EAEN3B,IAFM,CAED,OAFC,EAEQ,uBAFR,EAGNA,IAHM,CAGD,WAHC,EAGY,kBAHZ,EAINd,SAJM,CAII,wBAJJ,EAKNkD,IALM,CAKD+I,QALC,EAMNvF,KANM,GAMEjE,MANF,CAMS,GANT,CAAX;AAQA2J,YAAAA,IAAI,CAAC3J,MAAL,CAAY,MAAZ,EACA;AADA,aAEK3B,IAFL,CAEU,IAFV,EAEgB,UAAAqC,CAAC;AAAA,qBAAIA,CAAC,CAAC2F,CAAN;AAAA,aAFjB,EAGKhI,IAHL,CAGU,IAHV,EAGgB,KAAKuB,QAHrB,EAIKvB,IAJL,CAIU,IAJV,EAIgB,UAAAqC,CAAC;AAAA,qBAAIA,CAAC,CAAC2F,CAAN;AAAA,aAJjB,EAKKhI,IALL,CAKU,IALV,EAKgB,KAAKoE,WALrB,EAMKe,KANL,CAMW,QANX,EAMqB,UAAA9C,CAAC;AAAA,qBAAIA,CAAC,CAACiJ,IAAF,CAAOC,SAAX;AAAA,aANtB,EAOKpG,KAPL,CAOW,cAPX,EAO2B,CAP3B,EAQKA,KARL,CAQW,kBARX,EAQ+B,KAR/B;AAUAmG,YAAAA,IAAI,CAAC3J,MAAL,CAAY,SAAZ,EACK3B,IADL,CACU,QADV,EACoB,UAAAqC,CAAC;AAAA,qBAAI,CAAC,CAACA,CAAC,CAAC2F,CAAH,EAAM,MAAI,CAAC5D,WAAL,GAAiB,CAAvB,CAAD,EAA4B,CAAC/B,CAAC,CAAC2F,CAAF,GAAI,CAAL,EAAQ,MAAI,CAAC5D,WAAL,GAAiB,CAAzB,CAA5B,EAAyD,CAAC/B,CAAC,CAAC2F,CAAF,GAAI,CAAL,EAAQ,MAAI,CAAC5D,WAAL,GAAiB,CAAzB,CAAzD,EAAsFoH,IAAtF,CAA2F,GAA3F,CAAJ;AAAA,aADrB,EAEKrG,KAFL,CAEW,cAFX,EAE2B,CAF3B,EAGKA,KAHL,CAGW,MAHX,EAGmB,UAAA9C,CAAC;AAAA,qBAAIA,CAAC,CAACiJ,IAAF,CAAOC,SAAX;AAAA,aAHpB,EAjCmB,CAsCnB;;AACAD,YAAAA,IAAI,CAAC3J,MAAL,CAAY,MAAZ,EACK3B,IADL,CACU,GADV,EACe,UAAAqC,CAAC;AAAA,qBAAIA,CAAC,CAAC2F,CAAF,GAAI,CAAR;AAAA,aADhB,EAEKhI,IAFL,CAEU,OAFV,EAEmB,EAFnB,EAGKA,IAHL,CAGU,GAHV,EAGe,KAAKoE,WAAL,GAAiB,CAHhC,EAIKpE,IAJL,CAIU,QAJV,EAIoB,CAJpB,EAKKA,IALL,CAKU,OALV,EAKmB,2BALnB,EAMKA,IANL,CAMU,QANV,EAMoB,UAAAqC,CAAC;AAAA,qBAAIA,CAAC,CAACyD,EAAN;AAAA,aANrB,EAOKX,KAPL,CAOW,SAPX,EAOsB,CAPtB;AAUA,gBAAIsG,MAAM,GAAG,KAAKjP,QAAL,CAAcC,IAAd,CAAmB,4BAAnB,CAAb;AACAgP,YAAAA,MAAM,CACHjO,EADH,CACM,YADN,EACoB,UAACU,KAAD,EAAW;AAC3B,cAAA,MAAI,CAACvB,iBAAL,CAAuB+O,uBAAvB,GAAiD,IAAjD;AACD,aAHH,EAIGlO,EAJH,CAIM,YAJN,EAIoB,UAACU,KAAD,EAAW;AAC3B,cAAA,MAAI,CAACvB,iBAAL,CAAuB+O,uBAAvB,GAAiD,KAAjD;AACD,aANH;AAOD","sourcesContent":["import _ from 'lodash';\nimport $ from 'jquery';\nimport moment from 'moment';\nimport kbn from 'app/core/utils/kbn';\nimport {appEvents, contextSrv} from 'app/core/core';\nimport {tickStep, getScaledDecimals, getFlotTickSize} from 'app/core/utils/ticks';\nimport * as d3 from 'd3';\nimport * as d3ScaleChromatic from './libs/d3-scale-chromatic/index';\nimport {StatusmapTooltip} from './tooltip';\nimport {AnnotationTooltip} from './annotations';\n\nlet MIN_CARD_SIZE = 5,\n CARD_H_SPACING = 2,\n CARD_V_SPACING = 2,\n CARD_ROUND = 0,\n DATA_RANGE_WIDING_FACTOR = 1.2,\n DEFAULT_X_TICK_SIZE_PX = 100,\n DEFAULT_Y_TICK_SIZE_PX = 50,\n X_AXIS_TICK_PADDING = 10,\n Y_AXIS_TICK_PADDING = 5,\n MIN_SELECTION_WIDTH = 2;\n\nexport default function rendering(scope: any, elem: any, attrs: any, ctrl: any) {\n return new StatusmapRenderer(scope, elem, attrs, ctrl);\n}\n\nexport class StatusmapRenderer {\n width: number = 0;\n height: number = 0;\n yScale: any;\n xScale: any;\n chartWidth: number = 0;\n chartHeight: number = 0;\n chartTop: number = 0;\n chartBottom: number = 0;\n yAxisWidth: number = 0;\n xAxisHeight: number = 0;\n cardVSpacing: number = 0;\n cardHSpacing: number = 0;\n cardRound: number = 0;\n cardWidth: number = 0;\n cardHeight: number = 0;\n colorScale: any;\n opacityScale: any;\n mouseUpHandler: any;\n xGridSize: number = 0;\n yGridSize: number = 0;\n data: any;\n cardsData: any;\n panel: any;\n $heatmap: any;\n tooltip: StatusmapTooltip;\n annotationTooltip: AnnotationTooltip;\n heatmap: any;\n timeRange: any;\n\n yOffset: number;\n selection: any;\n padding: any;\n margin: any;\n dataRangeWidingFactor: number = DATA_RANGE_WIDING_FACTOR;\n\n constructor(private scope: any, private elem: any, attrs: any, private ctrl: any) {\n // $heatmap is JQuery object, but heatmap is D3\n this.$heatmap = this.elem.find('.status-heatmap-panel');\n this.tooltip = new StatusmapTooltip(this.$heatmap, this.scope);\n this.annotationTooltip = new AnnotationTooltip(this.$heatmap, this.scope);\n\n this.yOffset = 0;\n\n this.selection = {\n active: false,\n x1: -1,\n x2: -1,\n };\n\n this.padding = { left: 0, right: 0, top: 0, bottom: 0 };\n this.margin = { left: 25, right: 15, top: 10, bottom: 20 };\n\n this.ctrl.events.on('render', this.onRender.bind(this));\n\n this.ctrl.tickValueFormatter = this.tickValueFormatter.bind(this);\n\n /////////////////////////////\n // Selection and crosshair //\n /////////////////////////////\n\n // Shared crosshair and tooltip\n appEvents.on('graph-hover', this.onGraphHover.bind(this), this.scope);\n\n appEvents.on('graph-hover-clear', this.onGraphHoverClear.bind(this), this.scope);\n\n // Register selection listeners\n this.$heatmap.on('mousedown', this.onMouseDown.bind(this));\n this.$heatmap.on('mousemove', this.onMouseMove.bind(this));\n this.$heatmap.on('mouseleave', this.onMouseLeave.bind(this));\n }\n\n onGraphHoverClear() {\n this.clearCrosshair();\n }\n\n onGraphHover(event: { pos: any }) {\n this.drawSharedCrosshair(event.pos);\n }\n\n onRender() {\n this.render();\n this.ctrl.renderingCompleted();\n }\n\n\n setElementHeight() {\n try {\n var height = this.ctrl.height || this.panel.height || this.ctrl.row.height;\n if (_.isString(height)) {\n height = parseInt(height.replace('px', ''), 10);\n }\n\n height -= this.panel.legend.show ? 32 : 10; // bottom padding and space for legend. Change margin in .status-heatmap-color-legend !\n\n this.$heatmap.css('height', height + 'px');\n\n return true;\n } catch (e) { // IE throws errors sometimes\n return false;\n }\n }\n\n getYAxisWidth(elem: any) {\n const axisText = elem.selectAll(\".axis-y text\").nodes();\n const maxTextWidth = _.max(_.map(axisText, text => {\n // Use SVG getBBox method\n return text.getBBox().width;\n }));\n\n return Math.ceil(maxTextWidth);\n }\n\n getXAxisHeight(elem: any) {\n let axisLine = elem.select(\".axis-x line\");\n if (!axisLine.empty()) {\n let axisLinePosition = parseFloat(elem.select(\".axis-x line\").attr(\"y2\"));\n let canvasWidth = parseFloat(elem.attr(\"height\"));\n return canvasWidth - axisLinePosition;\n } else {\n // Default height\n return 30;\n }\n }\n\n addXAxis() {\n // Scale timestamps to cards centers\n this.scope.xScale = this.xScale = d3.scaleTime()\n .domain([this.timeRange.from, this.timeRange.to])\n .range([this.xGridSize/2, this.chartWidth-this.xGridSize/2]);\n\n let ticks = this.chartWidth / DEFAULT_X_TICK_SIZE_PX;\n let grafanaTimeFormatter = grafanaTimeFormat(ticks, this.timeRange.from, this.timeRange.to);\n let timeFormat;\n let dashboardTimeZone = this.ctrl.dashboard.getTimezone();\n if (dashboardTimeZone === 'utc') {\n timeFormat = d3.utcFormat(grafanaTimeFormatter);\n } else {\n timeFormat = d3.timeFormat(grafanaTimeFormatter);\n }\n\n let xAxis = d3\n .axisBottom(this.xScale)\n .ticks(ticks)\n .tickFormat(timeFormat)\n .tickPadding(X_AXIS_TICK_PADDING)\n .tickSize(this.chartHeight);\n\n let posY = this.chartTop; // this.margin.top !\n let posX = this.yAxisWidth;\n\n this.heatmap.append(\"g\")\n .attr(\"class\", \"axis axis-x\")\n .attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\")\n .call(xAxis);\n\n // Remove horizontal line in the top of axis labels (called domain in d3)\n this.heatmap\n .select(\".axis-x\")\n .select(\".domain\")\n .remove();\n }\n\n // divide chart height by ticks for cards drawing\n getYScale(ticks) {\n let range:any[] = [];\n let step = this.chartHeight / ticks.length;\n // svg has y=0 on the top, so top card should have a minimal value in range\n range.push(step);\n for (let i = 1; i < ticks.length; i++) {\n range.push(step * (i+1));\n }\n return d3.scaleOrdinal()\n .domain(ticks)\n .range(range);\n }\n\n // divide chart height by ticks with offset for ticks drawing\n getYAxisScale(ticks) {\n let range:any[] = [];\n let step = this.chartHeight / ticks.length;\n // svg has y=0 on the top, so top tick should have a minimal value in range\n range.push(this.yOffset);\n for (let i = 1; i < ticks.length; i++) {\n range.push(step * i + this.yOffset);\n }\n return d3.scaleOrdinal()\n .domain(ticks)\n .range(range);\n }\n\n addYAxis() {\n let ticks = _.uniq(_.map(this.data, d => d.target));\n\n // Set default Y min and max if no data\n if (_.isEmpty(this.data)) {\n ticks = [''];\n }\n\n if (this.panel.yAxisSort == 'a → z') {\n ticks.sort((a, b) => a.localeCompare(b, 'en', {ignorePunctuation: false, numeric: true}));\n } else if (this.panel.yAxisSort == 'z → a') {\n ticks.sort((b, a) => a.localeCompare(b, 'en', {ignorePunctuation: false, numeric: true}));\n }\n\n let yAxisScale = this.getYAxisScale(ticks);\n this.scope.yScale = this.yScale = this.getYScale(ticks);\n\n let yAxis = d3\n .axisLeft(yAxisScale)\n .tickValues(ticks)\n .tickSizeInner(0 - this.width)\n .tickPadding(Y_AXIS_TICK_PADDING);\n\n this.heatmap\n .append(\"g\")\n .attr(\"class\", \"axis axis-y\")\n .call(yAxis);\n\n // Calculate Y axis width first, then move axis into visible area\n let posY = this.margin.top;\n let posX = this.getYAxisWidth(this.heatmap) + Y_AXIS_TICK_PADDING;\n this.heatmap.select(\".axis-y\").attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\");\n\n // Remove vertical line in the right of axis labels (called domain in d3)\n this.heatmap.select(\".axis-y\").select(\".domain\").remove();\n this.heatmap.select(\".axis-y\").selectAll(\".tick line\").remove();\n }\n\n // Wide Y values range and adjust to bucket size\n wideYAxisRange(min, max, tickInterval) {\n let y_widing = (max * (this.dataRangeWidingFactor - 1) - min * (this.dataRangeWidingFactor - 1)) / 2;\n let y_min, y_max;\n\n if (tickInterval === 0) {\n y_max = max * this.dataRangeWidingFactor;\n y_min = min - min * (this.dataRangeWidingFactor - 1);\n tickInterval = (y_max - y_min) / 2;\n } else {\n y_max = Math.ceil((max + y_widing) / tickInterval) * tickInterval;\n y_min = Math.floor((min - y_widing) / tickInterval) * tickInterval;\n }\n\n // Don't wide axis below 0 if all values are positive\n if (min >= 0 && y_min < 0) {\n y_min = 0;\n }\n\n return {y_min, y_max};\n }\n\n tickValueFormatter(decimals, scaledDecimals = null) {\n let format = this.panel.yAxis.format;\n return function(value) {\n return kbn.valueFormats[format](value, decimals, scaledDecimals);\n };\n }\n\n // Create svg element, add axes and\n // calculate sizes for cards drawing\n addHeatmapCanvas() {\n let heatmap_elem = this.$heatmap[0];\n\n this.width = Math.floor(this.$heatmap.width()) - this.padding.right;\n this.height = Math.floor(this.$heatmap.height()) - this.padding.bottom;\n\n if (this.heatmap) {\n this.heatmap.remove();\n }\n\n this.heatmap = d3.select(heatmap_elem)\n .append(\"svg\")\n .attr(\"width\", this.width)\n .attr(\"height\", this.height);\n\n this.chartHeight = this.height - this.margin.top - this.margin.bottom;\n this.chartTop = this.margin.top;\n this.chartBottom = this.chartTop + this.chartHeight;\n\n this.cardHSpacing = this.panel.cards.cardHSpacing !== null ? this.panel.cards.cardHSpacing : CARD_H_SPACING;\n this.cardVSpacing = this.panel.cards.cardVSpacing !== null ? this.panel.cards.cardVSpacing : CARD_V_SPACING;\n this.cardRound = this.panel.cards.cardRound !== null ? this.panel.cards.cardRound : CARD_ROUND;\n\n // calculate yOffset for YAxis\n this.yGridSize = Math.floor(this.chartHeight / this.cardsData.yBucketSize);\n this.cardHeight = this.yGridSize ? this.yGridSize - this.cardVSpacing : 0;\n this.yOffset = this.cardHeight / 2;\n\n this.addYAxis();\n\n this.yAxisWidth = this.getYAxisWidth(this.heatmap) + Y_AXIS_TICK_PADDING;\n this.chartWidth = this.width - this.yAxisWidth - this.margin.right;\n\n // TODO allow per-y cardWidth!\n // we need to fill chartWidth with xBucketSize cards.\n this.xGridSize = this.chartWidth / (this.cardsData.xBucketSize+1);\n this.cardWidth = this.xGridSize - this.cardHSpacing;\n\n this.addXAxis();\n this.xAxisHeight = this.getXAxisHeight(this.heatmap);\n\n if (!this.panel.yAxis.show) {\n this.heatmap.select(\".axis-y\").selectAll(\"line\").style(\"opacity\", 0);\n }\n\n if (!this.panel.xAxis.show) {\n this.heatmap.select(\".axis-x\").selectAll(\"line\").style(\"opacity\", 0);\n }\n }\n\n addHeatmap() {\n this.addHeatmapCanvas();\n\n let maxValue = this.panel.color.max || this.cardsData.maxValue;\n let minValue = this.panel.color.min || this.cardsData.minValue;\n\n if (this.panel.color.mode !== 'discrete') {\n this.colorScale = this.getColorScale(maxValue, minValue);\n }\n this.setOpacityScale(maxValue);\n\n let cards = this.heatmap.selectAll(\".status-heatmap-card\").data(this.cardsData.cards);\n cards.append(\"title\");\n cards = cards.enter().append(\"rect\")\n .attr(\"cardId\", c => c.id)\n .attr(\"x\", this.getCardX.bind(this))\n .attr(\"width\", this.getCardWidth.bind(this))\n .attr(\"y\", this.getCardY.bind(this))\n .attr(\"height\", this.getCardHeight.bind(this))\n .attr(\"rx\", this.cardRound)\n .attr(\"ry\", this.cardRound)\n .attr(\"class\", \"bordered status-heatmap-card\")\n .style(\"fill\", this.getCardColor.bind(this))\n .style(\"stroke\", this.getCardColor.bind(this))\n .style(\"stroke-width\", 0)\n //.style(\"stroke-width\", getCardStrokeWidth)\n //.style(\"stroke-dasharray\", \"3,3\")\n .style(\"opacity\", this.getCardOpacity.bind(this));\n\n let $cards = this.$heatmap.find(\".status-heatmap-card\");\n $cards\n .on(\"mouseenter\", (event) => {\n this.tooltip.mouseOverBucket = true;\n this.highlightCard(event);\n })\n .on(\"mouseleave\", (event) => {\n this.tooltip.mouseOverBucket = false;\n this.resetCardHighLight(event);\n });\n\n this._renderAnnotations();\n\n this.ctrl.events.emit('render-complete', {\n \"chartWidth\": this.chartWidth\n });\n }\n\n highlightCard(event) {\n const color = d3.select(event.target).style(\"fill\");\n const highlightColor = d3.color(color).darker(2);\n const strokeColor = d3.color(color).brighter(4);\n const current_card = d3.select(event.target);\n this.tooltip.originalFillColor = color;\n current_card\n .style(\"fill\", highlightColor.toString())\n .style(\"stroke\", strokeColor.toString())\n .style(\"stroke-width\", 1);\n }\n\n resetCardHighLight(event) {\n d3.select(event.target)\n .style(\"fill\", this.tooltip.originalFillColor)\n .style(\"stroke\", this.tooltip.originalFillColor)\n .style(\"stroke-width\", 0);\n }\n\n getColorScale(maxValue, minValue = 0) {\n let colorScheme = _.find(this.ctrl.colorSchemes, {value: this.panel.color.colorScheme});\n // if (!colorScheme) {\n //\n // }\n let colorInterpolator = d3ScaleChromatic[colorScheme.value];\n let colorScaleInverted = colorScheme.invert === 'always' ||\n (colorScheme.invert === 'dark' && !contextSrv.user.lightTheme);\n\n if (maxValue == minValue)\n maxValue = minValue + 1;\n\n let start = colorScaleInverted ? maxValue : minValue;\n let end = colorScaleInverted ? minValue : maxValue;\n\n return d3.scaleSequential(colorInterpolator).domain([start, end]);\n }\n\n setOpacityScale(maxValue) {\n if (this.panel.color.colorScale === 'linear') {\n this.opacityScale = d3.scaleLinear()\n .domain([0, maxValue])\n .range([0, 1]);\n } else if (this.panel.color.colorScale === 'sqrt') {\n this.opacityScale = d3.scalePow().exponent(this.panel.color.exponent)\n .domain([0, maxValue])\n .range([0, 1]);\n }\n }\n\n getCardX(d) {\n let x;\n // cx is the center of the card. Card should be placed to the left.\n let cx = this.xScale(d.x);\n\n if (cx - this.cardWidth/2 < 0) {\n x = this.yAxisWidth + this.cardHSpacing/2;\n } else {\n x = this.yAxisWidth + cx - this.cardWidth/2;\n }\n\n return x;\n }\n\n // xScale returns card center. Adjust cardWidth in case of overlaping.\n getCardWidth(d) {\n let w;\n let cx = this.xScale(d.x);\n\n if (cx < this.cardWidth/2) {\n // Center should not exceed half of card.\n // Cut card to the left to prevent overlay of y axis.\n let cutted_width = (cx - this.cardHSpacing/2) + this.cardWidth/2;\n w = cutted_width > 0 ? cutted_width : 0;\n } else if (this.chartWidth - cx < this.cardWidth/2) {\n // Cut card to the right to prevent overlay of right graph edge.\n w = this.cardWidth/2 + (this.chartWidth - cx - this.cardHSpacing/2);\n } else {\n w = this.cardWidth;\n }\n\n // Card width should be MIN_CARD_SIZE at least\n w = Math.max(w, MIN_CARD_SIZE);\n\n if (this.cardHSpacing == 0) {\n w = w+1;\n }\n\n return w;\n }\n\n getCardY(d) {\n return this.yScale(d.y) + this.chartTop - this.cardHeight - this.cardVSpacing/2;\n }\n\n getCardHeight(d) {\n let ys = this.yScale(d.y);\n let y = ys + this.chartTop - this.cardHeight - this.cardVSpacing/2;\n let h = this.cardHeight;\n\n // Cut card height to prevent overlay\n if (y < this.chartTop) {\n h = ys - this.cardVSpacing/2;\n } else if (ys > this.chartBottom) {\n h = this.chartBottom - y;\n } else if (y + this.cardHeight > this.chartBottom) {\n h = this.chartBottom - y;\n }\n\n // Height can't be more than chart height\n h = Math.min(h, this.chartHeight);\n // Card height should be MIN_CARD_SIZE at least\n h = Math.max(h, MIN_CARD_SIZE);\n\n if (this.cardVSpacing == 0) {\n h = h+1\n }\n\n return h;\n }\n\n getCardColor(d) {\n if (this.panel.color.mode === 'opacity') {\n return this.panel.color.cardColor;\n } else if (this.panel.color.mode === 'spectrum') {\n return this.colorScale(d.value);\n } else if (this.panel.color.mode === 'discrete') {\n return this.ctrl.discreteHelper.getBucketColor(d.values);\n }\n }\n\n getCardOpacity(d) {\n if (this.panel.nullPointMode === 'as empty' && d.value == null ) {\n return 0;\n }\n if (this.panel.color.mode === 'opacity') {\n return this.opacityScale(d.value);\n } else {\n return 1;\n }\n }\n\n getCardStrokeWidth(d) {\n if (this.panel.color.mode === 'discrete') {\n return '1';\n }\n return '0';\n }\n\n\n /////////////////////////////\n // Selection and crosshair //\n /////////////////////////////\n\n getEventOffset(event) {\n const elemOffset = this.$heatmap.offset();\n const x = Math.floor(event.clientX - elemOffset.left);\n const y = Math.floor(event.clientY - elemOffset.top);\n return { x, y };\n }\n\n onMouseDown(event) {\n const offset = this.getEventOffset(event);\n this.selection.active = true;\n this.selection.x1 = offset.x;\n\n this.mouseUpHandler = () => {\n this.onMouseUp();\n };\n\n $(document).one(\"mouseup\", this.mouseUpHandler.bind(this));\n }\n\n onMouseUp() {\n $(document).unbind(\"mouseup\", this.mouseUpHandler.bind(this));\n this.mouseUpHandler = null;\n this.selection.active = false;\n\n let selectionRange = Math.abs(this.selection.x2 - this.selection.x1);\n if (this.selection.x2 >= 0 && selectionRange > MIN_SELECTION_WIDTH) {\n let timeFrom = this.xScale.invert(Math.min(this.selection.x1, this.selection.x2) - this.yAxisWidth - this.xGridSize/2);\n let timeTo = this.xScale.invert(Math.max(this.selection.x1, this.selection.x2) - this.yAxisWidth - this.xGridSize/2);\n\n this.ctrl.timeSrv.setTime({\n from: moment.utc(timeFrom),\n to: moment.utc(timeTo)\n });\n }\n\n this.clearSelection();\n }\n\n onMouseLeave() {\n appEvents.emit('graph-hover-clear');\n this.clearCrosshair();\n //annotationTooltip.destroy();\n }\n\n onMouseMove(event) {\n if (!this.heatmap) { return; }\n\n const offset = this.getEventOffset(event);\n if (this.selection.active) {\n // Clear crosshair and tooltip\n this.clearCrosshair();\n this.tooltip.destroy();\n this.annotationTooltip.destroy();\n\n this.selection.x2 = this.limitSelection(event.offsetX);\n this.drawSelection(this.selection.x1, this.selection.x2);\n } else {\n //const pos = this.getEventPos(event, offset);\n this.emitGraphHoverEvent(event);\n this.drawCrosshair(offset.x);\n this.tooltip.show(event); //, data); // pos, this.data\n this.annotationTooltip.show(event);\n }\n }\n\n getEventPos(event, offset) {\n const x = this.xScale.invert(offset.x - this.yAxisWidth).valueOf();\n const y = this.yScale.invert(offset.y - this.chartTop);\n const pos = {\n pageX: event.pageX,\n pageY: event.pageY,\n x: x,\n x1: x,\n y: y,\n y1: y,\n panelRelY: null,\n offset,\n };\n\n return pos;\n }\n\n emitGraphHoverEvent(event) {\n let x = this.xScale.invert(event.offsetX - this.yAxisWidth - this.xGridSize/2).valueOf();\n let y = this.yScale(event.offsetY);\n let pos = {\n pageX: event.pageX,\n pageY: event.pageY,\n x: x, x1: x,\n y: y, y1: y,\n panelRelY: 0\n };\n\n // Set minimum offset to prevent showing legend from another panel\n pos.panelRelY = Math.max(event.offsetY / this.height, 0.001);\n\n // broadcast to other graph panels that we are hovering\n appEvents.emit('graph-hover', {pos: pos, panel: this.panel});\n }\n\n limitSelection(x2) {\n x2 = Math.max(x2, this.yAxisWidth);\n x2 = Math.min(x2, this.chartWidth + this.yAxisWidth);\n return x2;\n }\n\n drawSelection(posX1, posX2) {\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-selection\").remove();\n let selectionX = Math.min(posX1, posX2);\n let selectionWidth = Math.abs(posX1 - posX2);\n\n if (selectionWidth > MIN_SELECTION_WIDTH) {\n this.heatmap.append(\"rect\")\n .attr(\"class\", \"status-heatmap-selection\")\n .attr(\"x\", selectionX)\n .attr(\"width\", selectionWidth)\n .attr(\"y\", this.chartTop)\n .attr(\"height\", this.chartHeight);\n }\n }\n }\n\n clearSelection() {\n this.selection.x1 = -1;\n this.selection.x2 = -1;\n\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-selection\").remove();\n }\n }\n\n\n drawCrosshair(position) {\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-crosshair\").remove();\n\n let posX = position;\n posX = Math.max(posX, this.yAxisWidth);\n posX = Math.min(posX, this.chartWidth + this.yAxisWidth);\n\n this.heatmap.append(\"g\")\n .attr(\"class\", \"status-heatmap-crosshair\")\n .attr(\"transform\", \"translate(\" + posX + \",0)\")\n .append(\"line\")\n .attr(\"x1\", 1)\n .attr(\"y1\", this.chartTop)\n .attr(\"x2\", 1)\n .attr(\"y2\", this.chartBottom)\n .attr(\"stroke-width\", 1);\n }\n }\n\n // map time to X\n drawSharedCrosshair(pos) {\n if (this.heatmap && this.ctrl.dashboard.graphTooltip !== 0) {\n const posX = this.xScale(pos.x) + this.yAxisWidth;\n this.drawCrosshair(posX);\n }\n }\n\n clearCrosshair() {\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-crosshair\").remove();\n }\n }\n\n\n render() {\n this.data = this.ctrl.data;\n this.panel = this.ctrl.panel;\n this.timeRange = this.ctrl.range;\n this.cardsData = this.ctrl.cardsData;\n\n if (!this.data || !this.cardsData || !this.setElementHeight()) {\n return;\n }\n\n // Draw default axes and return if no data\n if (_.isEmpty(this.cardsData.cards)) {\n this.addHeatmapCanvas();\n return;\n }\n\n this.addHeatmap();\n this.scope.yAxisWidth = this.yAxisWidth;\n this.scope.xAxisHeight = this.xAxisHeight;\n this.scope.chartHeight = this.chartHeight;\n this.scope.chartWidth = this.chartWidth;\n this.scope.chartTop = this.chartTop;\n }\n\n _renderAnnotations() {\n if (!this.ctrl.annotations || this.ctrl.annotations.length == 0) {\n return;\n }\n\n if (!this.heatmap) {\n return;\n }\n\n\n\n let annoData = _.map(this.ctrl.annotations, (d,i) => ({\"x\": Math.floor(this.yAxisWidth + this.xScale(d.time)), \"id\":i, \"anno\": d.source}));\n\n //console.log({\"ctrl_annotations\": this.ctrl.annotations, \"annoData\": annoData});\n\n let anno = this.heatmap\n .append(\"g\")\n .attr(\"class\", \"statusmap-annotations\")\n .attr(\"transform\", \"translate(0.5,0)\")\n .selectAll(\".statusmap-annotations\")\n .data(annoData)\n .enter().append(\"g\")\n ;\n anno.append(\"line\")\n //.attr(\"class\", \"statusmap-annotation-tick\")\n .attr(\"x1\", d => d.x)\n .attr(\"y1\", this.chartTop)\n .attr(\"x2\", d => d.x)\n .attr(\"y2\", this.chartBottom)\n .style(\"stroke\", d => d.anno.iconColor)\n .style(\"stroke-width\", 1)\n .style(\"stroke-dasharray\", \"3,3\")\n ;\n anno.append(\"polygon\")\n .attr(\"points\", d => [[d.x, this.chartBottom+1], [d.x-5, this.chartBottom+6], [d.x+5, this.chartBottom+6]].join(\" \"))\n .style(\"stroke-width\", 0)\n .style(\"fill\", d => d.anno.iconColor)\n ;\n // Polygons didn't fire mouseevents\n anno.append(\"rect\")\n .attr(\"x\", d => d.x-5)\n .attr(\"width\", 10)\n .attr(\"y\", this.chartBottom+1)\n .attr(\"height\", 5)\n .attr(\"class\", \"statusmap-annotation-tick\")\n .attr(\"annoId\", d => d.id)\n .style(\"opacity\", 0)\n ;\n\n let $ticks = this.$heatmap.find(\".statusmap-annotation-tick\");\n $ticks\n .on(\"mouseenter\", (event) => {\n this.annotationTooltip.mouseOverAnnotationTick = true;\n })\n .on(\"mouseleave\", (event) => {\n this.annotationTooltip.mouseOverAnnotationTick = false;\n });\n }\n}\n\nfunction grafanaTimeFormat(ticks, min, max) {\n if (min && max && ticks) {\n let range = max - min;\n let secPerTick = (range/ticks) / 1000;\n let oneDay = 86400000;\n let oneYear = 31536000000;\n\n if (secPerTick <= 45) {\n return \"%H:%M:%S\";\n }\n if (secPerTick <= 7200 || range <= oneDay) {\n return \"%H:%M\";\n }\n if (secPerTick <= 80000) {\n return \"%m/%d %H:%M\";\n }\n if (secPerTick <= 2419200 || range <= oneYear) {\n return \"%m/%d\";\n }\n return \"%Y-%m\";\n }\n\n return \"%H:%M\";\n}\n"],"file":"rendering.js"} \ No newline at end of file +{"version":3,"sources":["../src/rendering.ts"],"names":["rendering","scope","elem","attrs","ctrl","StatusmapRenderer","grafanaTimeFormat","ticks","min","max","range","secPerTick","oneDay","oneYear","_","$","moment","kbn","appEvents","contextSrv","d3","d3ScaleChromatic","StatusmapTooltip","StatusHeatmapTooltipExtraSeries","AnnotationTooltip","MIN_CARD_SIZE","CARD_H_SPACING","CARD_V_SPACING","CARD_ROUND","DATA_RANGE_WIDING_FACTOR","DEFAULT_X_TICK_SIZE_PX","DEFAULT_Y_TICK_SIZE_PX","X_AXIS_TICK_PADDING","Y_AXIS_TICK_PADDING","MIN_SELECTION_WIDTH","$heatmap","find","tooltip","tooltipExtraSeries","annotationTooltip","yOffset","selection","active","x1","x2","padding","left","right","top","bottom","margin","events","on","onRender","bind","tickValueFormatter","onGraphHover","onGraphHoverClear","onMouseDown","onMouseMove","onMouseLeave","onMouseClick","clearCrosshair","event","drawSharedCrosshair","pos","render","renderingCompleted","height","panel","row","isString","parseInt","replace","legend","show","css","e","axisText","selectAll","nodes","maxTextWidth","map","text","getBBox","width","Math","ceil","axisLine","select","empty","axisLinePosition","parseFloat","attr","canvasWidth","xScale","scaleTime","domain","timeRange","from","to","xGridSize","chartWidth","grafanaTimeFormatter","timeFormat","dashboardTimeZone","dashboard","getTimezone","utcFormat","xAxis","axisBottom","tickFormat","tickPadding","tickSize","chartHeight","posY","chartTop","posX","yAxisWidth","heatmap","append","call","remove","step","length","push","i","scaleOrdinal","uniq","data","d","target","isEmpty","yAxisSort","sort","a","b","localeCompare","ignorePunctuation","numeric","yAxisScale","getYAxisScale","yScale","getYScale","yAxis","axisLeft","tickValues","tickSizeInner","getYAxisWidth","tickInterval","y_widing","dataRangeWidingFactor","y_min","y_max","floor","decimals","scaledDecimals","format","value","valueFormats","heatmap_elem","chartBottom","cardHSpacing","cards","cardVSpacing","cardRound","yGridSize","cardsData","yBucketSize","cardHeight","addYAxis","xBucketSize","cardWidth","addXAxis","xAxisHeight","getXAxisHeight","style","addHeatmapCanvas","maxValue","color","minValue","mode","colorScale","getColorScale","setOpacityScale","enter","c","id","getCardX","getCardWidth","getCardY","getCardHeight","getCardColor","getCardOpacity","$cards","mouseOverBucket","highlightCard","resetCardHighLight","_renderAnnotations","emit","highlightColor","darker","strokeColor","brighter","current_card","originalFillColor","toString","colorScheme","colorSchemes","colorInterpolator","colorScaleInverted","invert","user","lightTheme","start","end","scaleSequential","opacityScale","scaleLinear","scalePow","exponent","x","cx","w","cutted_width","y","ys","h","cardColor","seriesFilterIndex","discreteExtraSeries","getBucketColorSingle","values","getBucketColor","nullPointMode","elemOffset","offset","clientX","clientY","getEventOffset","mouseUpHandler","onMouseUp","document","one","unbind","selectionRange","abs","timeFrom","timeTo","timeSrv","setTime","utc","clearSelection","relatedTarget","className","destroy","limitSelection","offsetX","drawSelection","emitGraphHoverEvent","drawCrosshair","usingUrl","valueOf","pageX","pageY","y1","panelRelY","offsetY","posX1","posX2","selectionX","selectionWidth","position","graphTooltip","setElementHeight","addHeatmap","annotations","annoData","time","source","anno","iconColor","join","$ticks","mouseOverAnnotationTick"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport $ from 'jquery';\nimport moment from 'moment';\nimport kbn from 'app/core/utils/kbn';\nimport {appEvents, contextSrv} from 'app/core/core';\nimport {tickStep, getScaledDecimals, getFlotTickSize} from 'app/core/utils/ticks';\nimport * as d3 from 'd3';\nimport * as d3ScaleChromatic from './libs/d3-scale-chromatic/index';\nimport {StatusmapTooltip} from './tooltip';\nimport {StatusHeatmapTooltipExtraSeries} from './tooltipextraseries';\nimport {AnnotationTooltip} from './annotations';\n\nlet MIN_CARD_SIZE = 5,\n CARD_H_SPACING = 2,\n CARD_V_SPACING = 2,\n CARD_ROUND = 0,\n DATA_RANGE_WIDING_FACTOR = 1.2,\n DEFAULT_X_TICK_SIZE_PX = 100,\n DEFAULT_Y_TICK_SIZE_PX = 50,\n X_AXIS_TICK_PADDING = 10,\n Y_AXIS_TICK_PADDING = 5,\n MIN_SELECTION_WIDTH = 2;\n\nexport default function rendering(scope: any, elem: any, attrs: any, ctrl: any) {\n return new StatusmapRenderer(scope, elem, attrs, ctrl);\n}\n\nexport class StatusmapRenderer {\n width: number = 0;\n height: number = 0;\n yScale: any;\n xScale: any;\n chartWidth: number = 0;\n chartHeight: number = 0;\n chartTop: number = 0;\n chartBottom: number = 0;\n yAxisWidth: number = 0;\n xAxisHeight: number = 0;\n cardVSpacing: number = 0;\n cardHSpacing: number = 0;\n cardRound: number = 0;\n cardWidth: number = 0;\n cardHeight: number = 0;\n colorScale: any;\n opacityScale: any;\n mouseUpHandler: any;\n xGridSize: number = 0;\n yGridSize: number = 0;\n data: any;\n cardsData: any;\n panel: any;\n $heatmap: any;\n tooltip: StatusmapTooltip;\n tooltipExtraSeries:StatusHeatmapTooltipExtraSeries;\n annotationTooltip: AnnotationTooltip;\n heatmap: any;\n timeRange: any;\n\n yOffset: number;\n selection: any;\n padding: any;\n margin: any;\n dataRangeWidingFactor: number = DATA_RANGE_WIDING_FACTOR;\n\n constructor(private scope: any, private elem: any, attrs: any, private ctrl: any) {\n // $heatmap is JQuery object, but heatmap is D3\n this.$heatmap = this.elem.find('.status-heatmap-panel');\n this.tooltip = new StatusmapTooltip(this.$heatmap, this.scope);\n this.tooltipExtraSeries = new StatusHeatmapTooltipExtraSeries(this.$heatmap, this.scope);\n this.annotationTooltip = new AnnotationTooltip(this.$heatmap, this.scope);\n\n this.yOffset = 0;\n\n this.selection = {\n active: false,\n x1: -1,\n x2: -1,\n };\n\n this.padding = { left: 0, right: 0, top: 0, bottom: 0 };\n this.margin = { left: 25, right: 15, top: 10, bottom: 20 };\n\n this.ctrl.events.on('render', this.onRender.bind(this));\n\n this.ctrl.tickValueFormatter = this.tickValueFormatter.bind(this);\n\n /////////////////////////////\n // Selection and crosshair //\n /////////////////////////////\n\n // Shared crosshair and tooltip\n appEvents.on('graph-hover', this.onGraphHover.bind(this), this.scope);\n\n appEvents.on('graph-hover-clear', this.onGraphHoverClear.bind(this), this.scope);\n\n // Register selection listeners\n this.$heatmap.on('mousedown', this.onMouseDown.bind(this));\n this.$heatmap.on('mousemove', this.onMouseMove.bind(this));\n this.$heatmap.on('mouseleave', this.onMouseLeave.bind(this));\n this.$heatmap.on('click', this.onMouseClick.bind(this));\n }\n\n onGraphHoverClear() {\n this.clearCrosshair();\n }\n\n onGraphHover(event: { pos: any }) {\n this.drawSharedCrosshair(event.pos);\n }\n\n onRender() {\n this.render();\n this.ctrl.renderingCompleted();\n }\n\n\n setElementHeight() {\n try {\n var height = this.ctrl.height || this.panel.height || this.ctrl.row.height;\n if (_.isString(height)) {\n height = parseInt(height.replace('px', ''), 10);\n }\n\n height -= this.panel.legend.show ? 32 : 10; // bottom padding and space for legend. Change margin in .status-heatmap-color-legend !\n\n this.$heatmap.css('height', height + 'px');\n\n return true;\n } catch (e) { // IE throws errors sometimes\n return false;\n }\n }\n\n getYAxisWidth(elem: any) {\n const axisText = elem.selectAll(\".axis-y text\").nodes();\n const maxTextWidth = _.max(_.map(axisText, text => {\n // Use SVG getBBox method\n return text.getBBox().width;\n }));\n\n return Math.ceil(maxTextWidth);\n }\n\n getXAxisHeight(elem: any) {\n let axisLine = elem.select(\".axis-x line\");\n if (!axisLine.empty()) {\n let axisLinePosition = parseFloat(elem.select(\".axis-x line\").attr(\"y2\"));\n let canvasWidth = parseFloat(elem.attr(\"height\"));\n return canvasWidth - axisLinePosition;\n } else {\n // Default height\n return 30;\n }\n }\n\n addXAxis() {\n // Scale timestamps to cards centers\n this.scope.xScale = this.xScale = d3.scaleTime()\n .domain([this.timeRange.from, this.timeRange.to])\n .range([this.xGridSize/2, this.chartWidth-this.xGridSize/2]);\n\n let ticks = this.chartWidth / DEFAULT_X_TICK_SIZE_PX;\n let grafanaTimeFormatter = grafanaTimeFormat(ticks, this.timeRange.from, this.timeRange.to);\n let timeFormat;\n let dashboardTimeZone = this.ctrl.dashboard.getTimezone();\n if (dashboardTimeZone === 'utc') {\n timeFormat = d3.utcFormat(grafanaTimeFormatter);\n } else {\n timeFormat = d3.timeFormat(grafanaTimeFormatter);\n }\n\n let xAxis = d3\n .axisBottom(this.xScale)\n .ticks(ticks)\n .tickFormat(timeFormat)\n .tickPadding(X_AXIS_TICK_PADDING)\n .tickSize(this.chartHeight);\n\n let posY = this.chartTop; // this.margin.top !\n let posX = this.yAxisWidth;\n\n this.heatmap.append(\"g\")\n .attr(\"class\", \"axis axis-x\")\n .attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\")\n .call(xAxis);\n\n // Remove horizontal line in the top of axis labels (called domain in d3)\n this.heatmap\n .select(\".axis-x\")\n .select(\".domain\")\n .remove();\n }\n\n // divide chart height by ticks for cards drawing\n getYScale(ticks) {\n let range:any[] = [];\n let step = this.chartHeight / ticks.length;\n // svg has y=0 on the top, so top card should have a minimal value in range\n range.push(step);\n for (let i = 1; i < ticks.length; i++) {\n range.push(step * (i+1));\n }\n return d3.scaleOrdinal()\n .domain(ticks)\n .range(range);\n }\n\n // divide chart height by ticks with offset for ticks drawing\n getYAxisScale(ticks) {\n let range:any[] = [];\n let step = this.chartHeight / ticks.length;\n // svg has y=0 on the top, so top tick should have a minimal value in range\n range.push(this.yOffset);\n for (let i = 1; i < ticks.length; i++) {\n range.push(step * i + this.yOffset);\n }\n return d3.scaleOrdinal()\n .domain(ticks)\n .range(range);\n }\n\n addYAxis() {\n let ticks = _.uniq(_.map(this.data, d => d.target));\n\n // Set default Y min and max if no data\n if (_.isEmpty(this.data)) {\n ticks = [''];\n }\n\n if (this.panel.yAxisSort == 'a → z') {\n ticks.sort((a, b) => a.localeCompare(b, 'en', {ignorePunctuation: false, numeric: true}));\n } else if (this.panel.yAxisSort == 'z → a') {\n ticks.sort((b, a) => a.localeCompare(b, 'en', {ignorePunctuation: false, numeric: true}));\n }\n\n let yAxisScale = this.getYAxisScale(ticks);\n this.scope.yScale = this.yScale = this.getYScale(ticks);\n\n let yAxis = d3\n .axisLeft(yAxisScale)\n .tickValues(ticks)\n .tickSizeInner(0 - this.width)\n .tickPadding(Y_AXIS_TICK_PADDING);\n\n this.heatmap\n .append(\"g\")\n .attr(\"class\", \"axis axis-y\")\n .call(yAxis);\n\n // Calculate Y axis width first, then move axis into visible area\n let posY = this.margin.top;\n let posX = this.getYAxisWidth(this.heatmap) + Y_AXIS_TICK_PADDING;\n this.heatmap.select(\".axis-y\").attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\");\n\n // Remove vertical line in the right of axis labels (called domain in d3)\n this.heatmap.select(\".axis-y\").select(\".domain\").remove();\n this.heatmap.select(\".axis-y\").selectAll(\".tick line\").remove();\n }\n\n // Wide Y values range and adjust to bucket size\n wideYAxisRange(min, max, tickInterval) {\n let y_widing = (max * (this.dataRangeWidingFactor - 1) - min * (this.dataRangeWidingFactor - 1)) / 2;\n let y_min, y_max;\n\n if (tickInterval === 0) {\n y_max = max * this.dataRangeWidingFactor;\n y_min = min - min * (this.dataRangeWidingFactor - 1);\n tickInterval = (y_max - y_min) / 2;\n } else {\n y_max = Math.ceil((max + y_widing) / tickInterval) * tickInterval;\n y_min = Math.floor((min - y_widing) / tickInterval) * tickInterval;\n }\n\n // Don't wide axis below 0 if all values are positive\n if (min >= 0 && y_min < 0) {\n y_min = 0;\n }\n\n return {y_min, y_max};\n }\n\n tickValueFormatter(decimals, scaledDecimals = null) {\n let format = this.panel.yAxis.format;\n return function(value) {\n return kbn.valueFormats[format](value, decimals, scaledDecimals);\n };\n }\n\n // Create svg element, add axes and\n // calculate sizes for cards drawing\n addHeatmapCanvas() {\n let heatmap_elem = this.$heatmap[0];\n\n this.width = Math.floor(this.$heatmap.width()) - this.padding.right;\n this.height = Math.floor(this.$heatmap.height()) - this.padding.bottom;\n\n if (this.heatmap) {\n this.heatmap.remove();\n }\n\n this.heatmap = d3.select(heatmap_elem)\n .append(\"svg\")\n .attr(\"width\", this.width)\n .attr(\"height\", this.height);\n\n this.chartHeight = this.height - this.margin.top - this.margin.bottom;\n this.chartTop = this.margin.top;\n this.chartBottom = this.chartTop + this.chartHeight;\n\n this.cardHSpacing = this.panel.cards.cardHSpacing !== null ? this.panel.cards.cardHSpacing : CARD_H_SPACING;\n this.cardVSpacing = this.panel.cards.cardVSpacing !== null ? this.panel.cards.cardVSpacing : CARD_V_SPACING;\n this.cardRound = this.panel.cards.cardRound !== null ? this.panel.cards.cardRound : CARD_ROUND;\n\n // calculate yOffset for YAxis\n this.yGridSize = Math.floor(this.chartHeight / this.cardsData.yBucketSize);\n this.cardHeight = this.yGridSize ? this.yGridSize - this.cardVSpacing : 0;\n this.yOffset = this.cardHeight / 2;\n\n this.addYAxis();\n\n this.yAxisWidth = this.getYAxisWidth(this.heatmap) + Y_AXIS_TICK_PADDING;\n this.chartWidth = this.width - this.yAxisWidth - this.margin.right;\n\n // TODO allow per-y cardWidth!\n // we need to fill chartWidth with xBucketSize cards.\n this.xGridSize = this.chartWidth / (this.cardsData.xBucketSize+1);\n this.cardWidth = this.xGridSize - this.cardHSpacing;\n\n this.addXAxis();\n this.xAxisHeight = this.getXAxisHeight(this.heatmap);\n\n if (!this.panel.yAxis.show) {\n this.heatmap.select(\".axis-y\").selectAll(\"line\").style(\"opacity\", 0);\n }\n\n if (!this.panel.xAxis.show) {\n this.heatmap.select(\".axis-x\").selectAll(\"line\").style(\"opacity\", 0);\n }\n }\n\n addHeatmap() {\n this.addHeatmapCanvas();\n\n let maxValue = this.panel.color.max || this.cardsData.maxValue;\n let minValue = this.panel.color.min || this.cardsData.minValue;\n\n if (this.panel.color.mode !== 'discrete') {\n this.colorScale = this.getColorScale(maxValue, minValue);\n }\n this.setOpacityScale(maxValue);\n\n let cards = this.heatmap.selectAll(\".status-heatmap-card\").data(this.cardsData.cards);\n cards.append(\"title\");\n cards = cards.enter().append(\"rect\")\n .attr(\"cardId\", c => c.id)\n .attr(\"x\", this.getCardX.bind(this))\n .attr(\"width\", this.getCardWidth.bind(this))\n .attr(\"y\", this.getCardY.bind(this))\n .attr(\"height\", this.getCardHeight.bind(this))\n .attr(\"rx\", this.cardRound)\n .attr(\"ry\", this.cardRound)\n .attr(\"class\", \"bordered status-heatmap-card\")\n .style(\"fill\", this.getCardColor.bind(this))\n .style(\"stroke\", this.getCardColor.bind(this))\n .style(\"stroke-width\", 0)\n //.style(\"stroke-width\", getCardStrokeWidth)\n //.style(\"stroke-dasharray\", \"3,3\")\n .style(\"opacity\", this.getCardOpacity.bind(this));\n\n let $cards = this.$heatmap.find(\".status-heatmap-card\");\n $cards\n .on(\"mouseenter\", (event) => {\n this.tooltip.mouseOverBucket = true;\n this.highlightCard(event);\n })\n .on(\"mouseleave\", (event) => {\n this.tooltip.mouseOverBucket = false;\n this.resetCardHighLight(event);\n });\n\n this._renderAnnotations();\n\n this.ctrl.events.emit('render-complete', {\n \"chartWidth\": this.chartWidth\n });\n }\n\n highlightCard(event) {\n const color = d3.select(event.target).style(\"fill\");\n const highlightColor = d3.color(color).darker(2);\n const strokeColor = d3.color(color).brighter(4);\n const current_card = d3.select(event.target);\n this.tooltip.originalFillColor = color;\n current_card\n .style(\"fill\", highlightColor.toString())\n .style(\"stroke\", strokeColor.toString())\n .style(\"stroke-width\", 1);\n }\n\n resetCardHighLight(event) {\n d3.select(event.target)\n .style(\"fill\", this.tooltip.originalFillColor)\n .style(\"stroke\", this.tooltip.originalFillColor)\n .style(\"stroke-width\", 0);\n }\n\n getColorScale(maxValue, minValue = 0) {\n let colorScheme = _.find(this.ctrl.colorSchemes, {value: this.panel.color.colorScheme});\n // if (!colorScheme) {\n //\n // }\n let colorInterpolator = d3ScaleChromatic[colorScheme.value];\n let colorScaleInverted = colorScheme.invert === 'always' ||\n (colorScheme.invert === 'dark' && !contextSrv.user.lightTheme);\n\n if (maxValue == minValue)\n maxValue = minValue + 1;\n\n let start = colorScaleInverted ? maxValue : minValue;\n let end = colorScaleInverted ? minValue : maxValue;\n\n return d3.scaleSequential(colorInterpolator).domain([start, end]);\n }\n\n setOpacityScale(maxValue) {\n if (this.panel.color.colorScale === 'linear') {\n this.opacityScale = d3.scaleLinear()\n .domain([0, maxValue])\n .range([0, 1]);\n } else if (this.panel.color.colorScale === 'sqrt') {\n this.opacityScale = d3.scalePow().exponent(this.panel.color.exponent)\n .domain([0, maxValue])\n .range([0, 1]);\n }\n }\n\n getCardX(d) {\n let x;\n // cx is the center of the card. Card should be placed to the left.\n let cx = this.xScale(d.x);\n\n if (cx - this.cardWidth/2 < 0) {\n x = this.yAxisWidth + this.cardHSpacing/2;\n } else {\n x = this.yAxisWidth + cx - this.cardWidth/2;\n }\n\n return x;\n }\n\n // xScale returns card center. Adjust cardWidth in case of overlaping.\n getCardWidth(d) {\n let w;\n let cx = this.xScale(d.x);\n\n if (cx < this.cardWidth/2) {\n // Center should not exceed half of card.\n // Cut card to the left to prevent overlay of y axis.\n let cutted_width = (cx - this.cardHSpacing/2) + this.cardWidth/2;\n w = cutted_width > 0 ? cutted_width : 0;\n } else if (this.chartWidth - cx < this.cardWidth/2) {\n // Cut card to the right to prevent overlay of right graph edge.\n w = this.cardWidth/2 + (this.chartWidth - cx - this.cardHSpacing/2);\n } else {\n w = this.cardWidth;\n }\n\n // Card width should be MIN_CARD_SIZE at least\n w = Math.max(w, MIN_CARD_SIZE);\n\n if (this.cardHSpacing == 0) {\n w = w+1;\n }\n\n return w;\n }\n\n getCardY(d) {\n return this.yScale(d.y) + this.chartTop - this.cardHeight - this.cardVSpacing/2;\n }\n\n getCardHeight(d) {\n let ys = this.yScale(d.y);\n let y = ys + this.chartTop - this.cardHeight - this.cardVSpacing/2;\n let h = this.cardHeight;\n\n // Cut card height to prevent overlay\n if (y < this.chartTop) {\n h = ys - this.cardVSpacing/2;\n } else if (ys > this.chartBottom) {\n h = this.chartBottom - y;\n } else if (y + this.cardHeight > this.chartBottom) {\n h = this.chartBottom - y;\n }\n\n // Height can't be more than chart height\n h = Math.min(h, this.chartHeight);\n // Card height should be MIN_CARD_SIZE at least\n h = Math.max(h, MIN_CARD_SIZE);\n\n if (this.cardVSpacing == 0) {\n h = h+1\n }\n\n return h;\n }\n\n getCardColor(d) {\n if (this.panel.color.mode === 'opacity') {\n return this.panel.color.cardColor;\n } else if (this.panel.color.mode === 'spectrum') {\n return this.colorScale(d.value);\n } else if (this.panel.color.mode === 'discrete') {\n if (this.panel.seriesFilterIndex != -1 || this.panel.seriesFilterIndex != null) {\n return this.ctrl.discreteExtraSeries.getBucketColorSingle(d.values[this.panel.seriesFilterIndex]);\n } else {\n return this.ctrl.discreteExtraSeries.getBucketColor(d.values);\n }\n }\n }\n\n getCardOpacity(d) {\n if (this.panel.nullPointMode === 'as empty' && d.value == null ) {\n return 0;\n }\n if (this.panel.color.mode === 'opacity') {\n return this.opacityScale(d.value);\n } else {\n return 1;\n }\n }\n\n getCardStrokeWidth(d) {\n if (this.panel.color.mode === 'discrete') {\n return '1';\n }\n return '0';\n }\n\n\n /////////////////////////////\n // Selection and crosshair //\n /////////////////////////////\n\n getEventOffset(event) {\n const elemOffset = this.$heatmap.offset();\n const x = Math.floor(event.clientX - elemOffset.left);\n const y = Math.floor(event.clientY - elemOffset.top);\n return { x, y };\n }\n\n onMouseDown(event) {\n const offset = this.getEventOffset(event);\n this.selection.active = true;\n this.selection.x1 = offset.x;\n\n this.mouseUpHandler = () => {\n this.onMouseUp();\n };\n\n $(document).one(\"mouseup\", this.mouseUpHandler.bind(this));\n }\n\n onMouseUp() {\n $(document).unbind(\"mouseup\", this.mouseUpHandler.bind(this));\n this.mouseUpHandler = null;\n this.selection.active = false;\n\n let selectionRange = Math.abs(this.selection.x2 - this.selection.x1);\n if (this.selection.x2 >= 0 && selectionRange > MIN_SELECTION_WIDTH) {\n let timeFrom = this.xScale.invert(Math.min(this.selection.x1, this.selection.x2) - this.yAxisWidth - this.xGridSize/2);\n let timeTo = this.xScale.invert(Math.max(this.selection.x1, this.selection.x2) - this.yAxisWidth - this.xGridSize/2);\n\n this.ctrl.timeSrv.setTime({\n from: moment.utc(timeFrom),\n to: moment.utc(timeTo)\n });\n }\n\n this.clearSelection();\n }\n\n onMouseLeave(e) {\n appEvents.emit('graph-hover-clear');\n this.clearCrosshair();\n //annotationTooltip.destroy();\n if (e.relatedTarget) {\n if (e.relatedTarget.className == \"statusmap-tooltip-extraseries graph-tooltip grafana-tooltip\" || e.relatedTarget.className == \"graph-tooltip-time\" ) {\n } else {\n this.tooltipExtraSeries.destroy();\n }\n }\n this.annotationTooltip.destroy(); \n }\n\n onMouseMove(event) {\n if (!this.heatmap) { return; }\n\n const offset = this.getEventOffset(event);\n if (this.selection.active) {\n // Clear crosshair and tooltip\n this.clearCrosshair();\n this.tooltip.destroy();\n this.annotationTooltip.destroy();\n\n this.selection.x2 = this.limitSelection(event.offsetX);\n this.drawSelection(this.selection.x1, this.selection.x2);\n } else {\n //const pos = this.getEventPos(event, offset);\n this.emitGraphHoverEvent(event);\n this.drawCrosshair(offset.x);\n this.tooltip.show(event); //, data); // pos, this.data\n this.annotationTooltip.show(event);\n }\n }\n\n public onMouseClick(event) {\n this.tooltipExtraSeries.show(event)\n if (this.ctrl.panel.usingUrl) {\n this.tooltip.destroy();\n }\n }\n\n getEventPos(event, offset) {\n const x = this.xScale.invert(offset.x - this.yAxisWidth).valueOf();\n const y = this.yScale.invert(offset.y - this.chartTop);\n const pos = {\n pageX: event.pageX,\n pageY: event.pageY,\n x: x,\n x1: x,\n y: y,\n y1: y,\n panelRelY: null,\n offset,\n };\n\n return pos;\n }\n\n emitGraphHoverEvent(event) {\n let x = this.xScale.invert(event.offsetX - this.yAxisWidth - this.xGridSize/2).valueOf();\n let y = this.yScale(event.offsetY);\n let pos = {\n pageX: event.pageX,\n pageY: event.pageY,\n x: x, x1: x,\n y: y, y1: y,\n panelRelY: 0\n };\n\n // Set minimum offset to prevent showing legend from another panel\n pos.panelRelY = Math.max(event.offsetY / this.height, 0.001);\n\n // broadcast to other graph panels that we are hovering\n appEvents.emit('graph-hover', {pos: pos, panel: this.panel});\n }\n\n limitSelection(x2) {\n x2 = Math.max(x2, this.yAxisWidth);\n x2 = Math.min(x2, this.chartWidth + this.yAxisWidth);\n return x2;\n }\n\n drawSelection(posX1, posX2) {\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-selection\").remove();\n let selectionX = Math.min(posX1, posX2);\n let selectionWidth = Math.abs(posX1 - posX2);\n\n if (selectionWidth > MIN_SELECTION_WIDTH) {\n this.heatmap.append(\"rect\")\n .attr(\"class\", \"status-heatmap-selection\")\n .attr(\"x\", selectionX)\n .attr(\"width\", selectionWidth)\n .attr(\"y\", this.chartTop)\n .attr(\"height\", this.chartHeight);\n }\n }\n }\n\n clearSelection() {\n this.selection.x1 = -1;\n this.selection.x2 = -1;\n\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-selection\").remove();\n }\n }\n\n\n drawCrosshair(position) {\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-crosshair\").remove();\n\n let posX = position;\n posX = Math.max(posX, this.yAxisWidth);\n posX = Math.min(posX, this.chartWidth + this.yAxisWidth);\n\n this.heatmap.append(\"g\")\n .attr(\"class\", \"status-heatmap-crosshair\")\n .attr(\"transform\", \"translate(\" + posX + \",0)\")\n .append(\"line\")\n .attr(\"x1\", 1)\n .attr(\"y1\", this.chartTop)\n .attr(\"x2\", 1)\n .attr(\"y2\", this.chartBottom)\n .attr(\"stroke-width\", 1);\n }\n }\n\n // map time to X\n drawSharedCrosshair(pos) {\n if (this.heatmap && this.ctrl.dashboard.graphTooltip !== 0) {\n const posX = this.xScale(pos.x) + this.yAxisWidth;\n this.drawCrosshair(posX);\n }\n }\n\n clearCrosshair() {\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-crosshair\").remove();\n }\n }\n\n\n render() {\n this.data = this.ctrl.data;\n this.panel = this.ctrl.panel;\n this.timeRange = this.ctrl.range;\n this.cardsData = this.ctrl.cardsData;\n\n if (!this.data || !this.cardsData || !this.setElementHeight()) {\n return;\n }\n\n // Draw default axes and return if no data\n if (_.isEmpty(this.cardsData.cards)) {\n this.addHeatmapCanvas();\n return;\n }\n\n this.addHeatmap();\n this.scope.yAxisWidth = this.yAxisWidth;\n this.scope.xAxisHeight = this.xAxisHeight;\n this.scope.chartHeight = this.chartHeight;\n this.scope.chartWidth = this.chartWidth;\n this.scope.chartTop = this.chartTop;\n }\n\n _renderAnnotations() {\n if (!this.ctrl.annotations || this.ctrl.annotations.length == 0) {\n return;\n }\n\n if (!this.heatmap) {\n return;\n }\n\n\n\n let annoData = _.map(this.ctrl.annotations, (d,i) => ({\"x\": Math.floor(this.yAxisWidth + this.xScale(d.time)), \"id\":i, \"anno\": d.source}));\n\n //({\"ctrl_annotations\": this.ctrl.annotations, \"annoData\": annoData});\n\n let anno = this.heatmap\n .append(\"g\")\n .attr(\"class\", \"statusmap-annotations\")\n .attr(\"transform\", \"translate(0.5,0)\")\n .selectAll(\".statusmap-annotations\")\n .data(annoData)\n .enter().append(\"g\")\n ;\n anno.append(\"line\")\n //.attr(\"class\", \"statusmap-annotation-tick\")\n .attr(\"x1\", d => d.x)\n .attr(\"y1\", this.chartTop)\n .attr(\"x2\", d => d.x)\n .attr(\"y2\", this.chartBottom)\n .style(\"stroke\", d => d.anno.iconColor)\n .style(\"stroke-width\", 1)\n .style(\"stroke-dasharray\", \"3,3\")\n ;\n anno.append(\"polygon\")\n .attr(\"points\", d => [[d.x, this.chartBottom+1], [d.x-5, this.chartBottom+6], [d.x+5, this.chartBottom+6]].join(\" \"))\n .style(\"stroke-width\", 0)\n .style(\"fill\", d => d.anno.iconColor)\n ;\n // Polygons didn't fire mouseevents\n anno.append(\"rect\")\n .attr(\"x\", d => d.x-5)\n .attr(\"width\", 10)\n .attr(\"y\", this.chartBottom+1)\n .attr(\"height\", 5)\n .attr(\"class\", \"statusmap-annotation-tick\")\n .attr(\"annoId\", d => d.id)\n .style(\"opacity\", 0)\n ;\n\n let $ticks = this.$heatmap.find(\".statusmap-annotation-tick\");\n $ticks\n .on(\"mouseenter\", (event) => {\n this.annotationTooltip.mouseOverAnnotationTick = true;\n })\n .on(\"mouseleave\", (event) => {\n this.annotationTooltip.mouseOverAnnotationTick = false;\n });\n }\n}\n\nfunction grafanaTimeFormat(ticks, min, max) {\n if (min && max && ticks) {\n let range = max - min;\n let secPerTick = (range/ticks) / 1000;\n let oneDay = 86400000;\n let oneYear = 31536000000;\n\n if (secPerTick <= 45) {\n return \"%H:%M:%S\";\n }\n if (secPerTick <= 7200 || range <= oneDay) {\n return \"%H:%M\";\n }\n if (secPerTick <= 80000) {\n return \"%m/%d %H:%M\";\n }\n if (secPerTick <= 2419200 || range <= oneYear) {\n return \"%m/%d\";\n }\n return \"%Y-%m\";\n }\n\n return \"%H:%M\";\n}\n"],"file":"rendering.js"} \ No newline at end of file diff --git a/dist/statusmap_data.js b/dist/statusmap_data.js index 09bf159..7c773b3 100644 --- a/dist/statusmap_data.js +++ b/dist/statusmap_data.js @@ -27,6 +27,8 @@ System.register([], function (_export, _context) { _defineProperty(this, "values", []); + _defineProperty(this, "columns", []); + _defineProperty(this, "multipleValues", false); _defineProperty(this, "noColorDefined", false); diff --git a/dist/statusmap_data.js.map b/dist/statusmap_data.js.map index 59b0615..2b386de 100644 --- a/dist/statusmap_data.js.map +++ b/dist/statusmap_data.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/statusmap_data.ts"],"names":["Card","CardsStorage","maxValue","minValue"],"mappings":";;;;;;;;;;;;;;AAEA;sBACMA,I,GACF;AAEA;AAEA;AAEA;AAEA;AAEA;AAEA;AAKA,sBAAc;AAAA;;AAAA,oCAhBD,CAgBC;;AAAA,wCAdE,EAcF;;AAAA,gDAZY,KAYZ;;AAAA,gDAVY,KAUZ;;AAAA,mCARF,EAQE;;AAAA,mCANF,CAME;;AAAA,0CAJK,CAIL;;AAAA,0CAHK,CAGL;;AAAA,uCAFE,CAEF;AAEb,O;;8BAGCC,Y,GAWF,wBAAc;AAAA;;AAAA,uCAVE,EAUF;;AAAA,6CATQ,CASR;;AAAA,6CARQ,CAQR;;AAAA;;AAAA;;AAAA,gDALY,KAKZ;;AAAA,gDAJY,KAIZ;;AAAA,yCAHM,EAGN;;AAAA;;AACV,aAAKC,QAAL,GAAgB,CAAhB;AACA,aAAKC,QAAL,GAAgB,CAAhB;AAEH,O","sourcesContent":["\n\n// A holder of values\nclass Card {\n // uniq\n id: number = 0;\n // Array of values in this bucket\n values: any[] = [];\n // card has multiple values\n multipleValues: boolean = false;\n // card has values that has no color\n noColorDefined: boolean = false;\n //\n y: string = \"\";\n //\n x: number = 0;\n //\n minValue: number = 0;\n maxValue: number = 0;\n value: number = 0;\n \n constructor() {\n\n }\n }\n \nclass CardsStorage {\n cards: Card[] = [];\n xBucketSize: number = 0;\n yBucketSize: number = 0;\n maxValue: number;\n minValue: number;\n multipleValues: boolean = false;\n noColorDefined: boolean = false;\n targets: string[] = [];\n targetIndex: any;\n\n constructor() {\n this.maxValue = 0;\n this.minValue = 0;\n\n }\n }\n\nexport {CardsStorage, Card};"],"file":"statusmap_data.js"} \ No newline at end of file +{"version":3,"sources":["../src/statusmap_data.ts"],"names":["Card","CardsStorage","maxValue","minValue"],"mappings":";;;;;;;;;;;;;;AAEA;sBACMA,I,GACF;AAEA;AAGA;AAEA;AAEA;AAEA;AAEA;AAKA,sBAAc;AAAA;;AAAA,oCAjBD,CAiBC;;AAAA,wCAfE,EAeF;;AAAA,yCAdG,EAcH;;AAAA,gDAZY,KAYZ;;AAAA,gDAVY,KAUZ;;AAAA,mCARF,EAQE;;AAAA,mCANF,CAME;;AAAA,0CAJK,CAIL;;AAAA,0CAHK,CAGL;;AAAA,uCAFE,CAEF;AAEb,O;;8BAGCC,Y,GAWF,wBAAc;AAAA;;AAAA,uCAVE,EAUF;;AAAA,6CATQ,CASR;;AAAA,6CARQ,CAQR;;AAAA;;AAAA;;AAAA,gDALY,KAKZ;;AAAA,gDAJY,KAIZ;;AAAA,yCAHM,EAGN;;AAAA;;AACV,aAAKC,QAAL,GAAgB,CAAhB;AACA,aAAKC,QAAL,GAAgB,CAAhB;AAEH,O","sourcesContent":["\n\n// A holder of values\nclass Card {\n // uniq\n id: number = 0;\n // Array of values in this bucket\n values: any[] = [];\n columns: any[] = [];\n // card has multiple values\n multipleValues: boolean = false;\n // card has values that has no color\n noColorDefined: boolean = false;\n //\n y: string = \"\";\n //\n x: number = 0;\n //\n minValue: number = 0;\n maxValue: number = 0;\n value: number = 0;\n \n constructor() {\n\n }\n }\n \nclass CardsStorage {\n cards: Card[] = [];\n xBucketSize: number = 0;\n yBucketSize: number = 0;\n maxValue: number;\n minValue: number;\n multipleValues: boolean = false;\n noColorDefined: boolean = false;\n targets: string[] = [];\n targetIndex: any;\n\n constructor() {\n this.maxValue = 0;\n this.minValue = 0;\n\n }\n }\n\nexport {CardsStorage, Card};"],"file":"statusmap_data.js"} \ No newline at end of file diff --git a/dist/tooltip.js b/dist/tooltip.js index 735bdbc..2fa1662 100644 --- a/dist/tooltip.js +++ b/dist/tooltip.js @@ -131,9 +131,15 @@ System.register(["d3", "jquery", "lodash"], function (_export, _context) { var tooltipTimeFormat = 'YYYY-MM-DD HH:mm:ss'; var time = this.dashboard.formatDate(+x, tooltipTimeFormat); var tooltipHtml = "
".concat(time, "
\n
"); + var statuses; if (this.panel.color.mode === 'discrete') { - var statuses = this.panelCtrl.discreteHelper.convertValuesToTooltips(values); + if (this.panel.seriesFilterIndex > 0) { + statuses = this.panelCtrl.discreteExtraSeries.convertValueToTooltips(value); + } else { + statuses = this.panelCtrl.discreteExtraSeries.convertValuesToTooltips(values); + } + var statusesHtml = ''; if (statuses.length === 1) { @@ -163,7 +169,7 @@ System.register(["d3", "jquery", "lodash"], function (_export, _context) { if (this.panel.color.mode === 'discrete') { if (card.noColorDefined) { - var badValues = this.panelCtrl.discreteHelper.getNotColoredValues(values); + var badValues = this.panelCtrl.discreteExtraSeries.getNotColoredValues(values); tooltipHtml += "
Error: ".concat(this.panelCtrl.dataWarnings.noColorDefined.title, "\n
not colored values:\n
    \n ").concat(_.join(_.map(badValues, function (v) { return "
  • ".concat(v, "
  • "); }), ""), "\n
\n
"); diff --git a/dist/tooltip.js.map b/dist/tooltip.js.map index 840f890..d606c5f 100644 --- a/dist/tooltip.js.map +++ b/dist/tooltip.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/tooltip.ts"],"names":["d3","$","_","TOOLTIP_PADDING_X","TOOLTIP_PADDING_Y","StatusmapTooltip","elem","scope","dashboard","ctrl","panelCtrl","panel","heatmapPanel","mouseOverBucket","originalFillColor","on","onMouseOver","bind","onMouseLeave","e","tooltip","show","data","isEmpty","add","move","destroy","select","append","attr","remove","pos","panelRelY","cardId","target","card","cardsData","cards","x","y","value","values","tooltipTimeFormat","time","formatDate","tooltipHtml","color","mode","statuses","discreteHelper","convertValuesToTooltips","statusesHtml","length","join","map","v","useMax","multipleValues","dataWarnings","title","noColorDefined","badValues","getNotColoredValues","html","node","tooltipWidth","clientWidth","tooltipHeight","clientHeight","left","pageX","top","pageY","window","innerWidth","pageYOffset","innerHeight","style"],"mappings":"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","sourcesContent":["import d3 from 'd3';\nimport $ from 'jquery';\nimport _ from 'lodash';\n\nlet TOOLTIP_PADDING_X = 30;\nlet TOOLTIP_PADDING_Y = 5;\n\nexport class StatusmapTooltip {\n tooltip: any;\n scope: any;\n dashboard: any;\n panelCtrl: any;\n panel: any;\n heatmapPanel: any;\n mouseOverBucket: any;\n originalFillColor: any;\n\n constructor(elem: any, scope: any) {\n this.scope = scope;\n this.dashboard = scope.ctrl.dashboard;\n this.panelCtrl = scope.ctrl;\n this.panel = scope.ctrl.panel;\n this.heatmapPanel = elem;\n this.mouseOverBucket = false;\n this.originalFillColor = null;\n\n elem.on(\"mouseover\", this.onMouseOver.bind(this));\n elem.on(\"mouseleave\", this.onMouseLeave.bind(this));\n }\n\n onMouseOver(e) {\n if (!this.panel.tooltip.show || !this.scope.ctrl.data || _.isEmpty(this.scope.ctrl.data)) { return; }\n\n if (!this.tooltip) {\n this.add();\n this.move(e);\n }\n }\n\n onMouseLeave() {\n this.destroy();\n }\n\n onMouseMove(e) {\n if (!this.panel.tooltip.show) { return; }\n\n this.move(e);\n }\n\n add() {\n this.tooltip = d3.select(\"body\")\n .append(\"div\")\n .attr(\"class\", \"statusmap-tooltip graph-tooltip grafana-tooltip\");\n }\n\n destroy() {\n if (this.tooltip) {\n this.tooltip.remove();\n }\n\n this.tooltip = null;\n }\n\n show(pos) {\n if (!this.panel.tooltip.show || !this.tooltip) { return; }\n // shared tooltip mode\n if (pos.panelRelY) {\n return;\n }\n let cardId = d3.select(pos.target).attr('cardId');\n if (!cardId) {\n this.destroy();\n return;\n }\n\n let card = this.panelCtrl.cardsData.cards[cardId];\n if (!card) {\n this.destroy();\n return;\n }\n\n let x = card.x;\n let y = card.y;\n let value = card.value;\n let values = card.values;\n let tooltipTimeFormat = 'YYYY-MM-DD HH:mm:ss';\n let time = this.dashboard.formatDate(+x, tooltipTimeFormat);\n\n let tooltipHtml = `
${time}
\n
`;\n\n if (this.panel.color.mode === 'discrete') {\n let statuses = this.panelCtrl.discreteHelper.convertValuesToTooltips(values);\n let statusesHtml = '';\n if (statuses.length === 1) {\n statusesHtml = \"status:\";\n } else if (statuses.length > 1) {\n statusesHtml = \"statuses:\";\n }\n tooltipHtml += `\n
\n name: ${y}
\n ${statusesHtml}\n
    \n ${_.join(_.map(statuses, v => `
  • ${v.tooltip}
  • `), \"\")}\n
\n
`;\n } else {\n if (values.length === 1) {\n tooltipHtml += `
\n name: ${y}
\n value: ${value}
\n
`;\n } else {\n tooltipHtml += `
\n name: ${y}
\n values:\n
    \n ${_.join(_.map(values, v => `
  • ${v}
  • `), \"\")}\n
\n
`;\n }\n }\n\n // \"Ambiguous bucket state: Multiple values!\";\n if (!this.panel.useMax && card.multipleValues) {\n tooltipHtml += `
Error: ${this.panelCtrl.dataWarnings.multipleValues.title}
`;\n }\n\n // Discrete mode errors\n if (this.panel.color.mode === 'discrete') {\n if (card.noColorDefined) {\n let badValues = this.panelCtrl.discreteHelper.getNotColoredValues(values);\n tooltipHtml += `
Error: ${this.panelCtrl.dataWarnings.noColorDefined.title}\n
not colored values:\n
    \n ${_.join(_.map(badValues, v => `
  • ${v}
  • `), \"\")}\n
\n
`;\n\n }\n }\n\n this.tooltip.html(tooltipHtml);\n\n this.move(pos);\n }\n\n move(pos) {\n if (!this.tooltip) { return; }\n\n let elem = $(this.tooltip.node())[0];\n let tooltipWidth = elem.clientWidth;\n let tooltipHeight = elem.clientHeight;\n\n let left = pos.pageX + TOOLTIP_PADDING_X;\n let top = pos.pageY + TOOLTIP_PADDING_Y;\n\n if (pos.pageX + tooltipWidth + 40 > window.innerWidth) {\n left = pos.pageX - tooltipWidth - TOOLTIP_PADDING_X;\n }\n\n if (pos.pageY - window.pageYOffset + tooltipHeight + 20 > window.innerHeight) {\n top = pos.pageY - tooltipHeight - TOOLTIP_PADDING_Y;\n }\n\n return this.tooltip\n .style(\"left\", left + \"px\")\n .style(\"top\", top + \"px\");\n }\n}\n"],"file":"tooltip.js"} \ No newline at end of file +{"version":3,"sources":["../src/tooltip.ts"],"names":["d3","$","_","TOOLTIP_PADDING_X","TOOLTIP_PADDING_Y","StatusmapTooltip","elem","scope","dashboard","ctrl","panelCtrl","panel","heatmapPanel","mouseOverBucket","originalFillColor","on","onMouseOver","bind","onMouseLeave","e","tooltip","show","data","isEmpty","add","move","destroy","select","append","attr","remove","pos","panelRelY","cardId","target","card","cardsData","cards","x","y","value","values","tooltipTimeFormat","time","formatDate","tooltipHtml","statuses","color","mode","seriesFilterIndex","discreteExtraSeries","convertValueToTooltips","convertValuesToTooltips","statusesHtml","length","join","map","v","useMax","multipleValues","dataWarnings","title","noColorDefined","badValues","getNotColoredValues","html","node","tooltipWidth","clientWidth","tooltipHeight","clientHeight","left","pageX","top","pageY","window","innerWidth","pageYOffset","innerHeight","style"],"mappings":"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","sourcesContent":["import d3 from 'd3';\nimport $ from 'jquery';\nimport _ from 'lodash';\n\nlet TOOLTIP_PADDING_X = 30;\nlet TOOLTIP_PADDING_Y = 5;\n\nexport class StatusmapTooltip {\n tooltip: any;\n scope: any;\n dashboard: any;\n panelCtrl: any;\n panel: any;\n heatmapPanel: any;\n mouseOverBucket: any;\n originalFillColor: any;\n\n constructor(elem: any, scope: any) {\n this.scope = scope;\n this.dashboard = scope.ctrl.dashboard;\n this.panelCtrl = scope.ctrl;\n this.panel = scope.ctrl.panel;\n this.heatmapPanel = elem;\n this.mouseOverBucket = false;\n this.originalFillColor = null;\n\n elem.on(\"mouseover\", this.onMouseOver.bind(this));\n elem.on(\"mouseleave\", this.onMouseLeave.bind(this));\n }\n\n onMouseOver(e) {\n if (!this.panel.tooltip.show || !this.scope.ctrl.data || _.isEmpty(this.scope.ctrl.data)) { return; }\n\n if (!this.tooltip) {\n this.add();\n this.move(e);\n }\n }\n\n onMouseLeave() {\n this.destroy();\n }\n\n onMouseMove(e) {\n if (!this.panel.tooltip.show) { return; }\n\n this.move(e);\n }\n\n add() {\n this.tooltip = d3.select(\"body\")\n .append(\"div\")\n .attr(\"class\", \"statusmap-tooltip graph-tooltip grafana-tooltip\");\n }\n\n destroy() {\n if (this.tooltip) {\n this.tooltip.remove();\n }\n\n this.tooltip = null;\n }\n\n show(pos) {\n if (!this.panel.tooltip.show || !this.tooltip) { return; }\n // shared tooltip mode\n if (pos.panelRelY) {\n return;\n }\n let cardId = d3.select(pos.target).attr('cardId');\n if (!cardId) {\n this.destroy();\n return;\n }\n\n let card = this.panelCtrl.cardsData.cards[cardId];\n if (!card) {\n this.destroy();\n return;\n }\n\n let x = card.x;\n let y = card.y;\n let value = card.value;\n let values = card.values;\n let tooltipTimeFormat = 'YYYY-MM-DD HH:mm:ss';\n let time = this.dashboard.formatDate(+x, tooltipTimeFormat);\n\n let tooltipHtml = `
${time}
\n
`;\n\n let statuses;\n\n if (this.panel.color.mode === 'discrete') {\n if (this.panel.seriesFilterIndex > 0) {\n statuses = this.panelCtrl.discreteExtraSeries.convertValueToTooltips(value);\n } else {\n statuses = this.panelCtrl.discreteExtraSeries.convertValuesToTooltips(values);\n }\n \n let statusesHtml = '';\n if (statuses.length === 1) {\n statusesHtml = \"status:\";\n } else if (statuses.length > 1) {\n statusesHtml = \"statuses:\";\n }\n tooltipHtml += `\n
\n name: ${y}
\n ${statusesHtml}\n
    \n ${_.join(_.map(statuses, v => `
  • ${v.tooltip}
  • `), \"\")}\n
\n
`;\n } else {\n if (values.length === 1) {\n tooltipHtml += `
\n name: ${y}
\n value: ${value}
\n
`;\n } else {\n tooltipHtml += `
\n name: ${y}
\n values:\n
    \n ${_.join(_.map(values, v => `
  • ${v}
  • `), \"\")}\n
\n
`;\n }\n }\n\n // \"Ambiguous bucket state: Multiple values!\";\n if (!this.panel.useMax && card.multipleValues) {\n tooltipHtml += `
Error: ${this.panelCtrl.dataWarnings.multipleValues.title}
`;\n }\n\n // Discrete mode errors\n if (this.panel.color.mode === 'discrete') {\n if (card.noColorDefined) {\n let badValues = this.panelCtrl.discreteExtraSeries.getNotColoredValues(values);\n tooltipHtml += `
Error: ${this.panelCtrl.dataWarnings.noColorDefined.title}\n
not colored values:\n
    \n ${_.join(_.map(badValues, v => `
  • ${v}
  • `), \"\")}\n
\n
`;\n\n }\n }\n\n this.tooltip.html(tooltipHtml);\n\n this.move(pos);\n }\n\n move(pos) {\n if (!this.tooltip) { return; }\n\n let elem = $(this.tooltip.node())[0];\n let tooltipWidth = elem.clientWidth;\n let tooltipHeight = elem.clientHeight;\n\n let left = pos.pageX + TOOLTIP_PADDING_X;\n let top = pos.pageY + TOOLTIP_PADDING_Y;\n\n if (pos.pageX + tooltipWidth + 40 > window.innerWidth) {\n left = pos.pageX - tooltipWidth - TOOLTIP_PADDING_X;\n }\n\n if (pos.pageY - window.pageYOffset + tooltipHeight + 20 > window.innerHeight) {\n top = pos.pageY - tooltipHeight - TOOLTIP_PADDING_Y;\n }\n\n return this.tooltip\n .style(\"left\", left + \"px\")\n .style(\"top\", top + \"px\");\n }\n}\n"],"file":"tooltip.js"} \ No newline at end of file diff --git a/dist/tooltipextraseries.js b/dist/tooltipextraseries.js new file mode 100644 index 0000000..97760e6 --- /dev/null +++ b/dist/tooltipextraseries.js @@ -0,0 +1,242 @@ +"use strict"; + +System.register(["d3", "lodash", "jquery", "./extra_series_format"], function (_export, _context) { + "use strict"; + + var d3, _, $, ExtraSeriesFormatValue, TOOLTIP_PADDING_X, TOOLTIP_PADDING_Y, StatusHeatmapTooltipExtraSeries; + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + + function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + + function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + + return { + setters: [function (_d) { + d3 = _d.default; + }, function (_lodash) { + _ = _lodash.default; + }, function (_jquery) { + $ = _jquery.default; + }, function (_extra_series_format) { + ExtraSeriesFormatValue = _extra_series_format.ExtraSeriesFormatValue; + }], + execute: function () { + TOOLTIP_PADDING_X = -50; + TOOLTIP_PADDING_Y = 5; + + _export("StatusHeatmapTooltipExtraSeries", StatusHeatmapTooltipExtraSeries = + /*#__PURE__*/ + function () { + function StatusHeatmapTooltipExtraSeries(elem, scope) { + _classCallCheck(this, StatusHeatmapTooltipExtraSeries); + + _defineProperty(this, "scope", void 0); + + _defineProperty(this, "dashboard", void 0); + + _defineProperty(this, "panelCtrl", void 0); + + _defineProperty(this, "panel", void 0); + + _defineProperty(this, "heatmapPanel", void 0); + + _defineProperty(this, "mouseOverBucket", void 0); + + _defineProperty(this, "originalFillColor", void 0); + + _defineProperty(this, "tooltip", void 0); + + this.scope = scope; + this.dashboard = scope.ctrl.dashboard; + this.panelCtrl = scope.ctrl; + this.panel = scope.ctrl.panel; + this.heatmapPanel = elem; + this.mouseOverBucket = false; + this.originalFillColor = null; + elem.on("mouseover", this.onMouseOver.bind(this)); + elem.on("click", this.onMouseClick.bind(this)); + } + + _createClass(StatusHeatmapTooltipExtraSeries, [{ + key: "onMouseOver", + value: function onMouseOver(e) { + if (!this.panel.usingUrl || !this.scope.ctrl.data || _.isEmpty(this.scope.ctrl.data)) { + return; + } + } + }, { + key: "onMouseClick", + value: function onMouseClick(e) { + if (!this.panel.usingUrl) { + return; + } + + this.destroy(); + this.add(); + } + }, { + key: "add", + value: function add() { + this.tooltip = d3.select("body").append("div").attr("class", "statusmap-tooltip-extraseries graph-tooltip grafana-tooltip"); + } + }, { + key: "destroy", + value: function destroy() { + if (this.tooltip) { + this.tooltip.remove(); + } + + this.tooltip = null; + } + }, { + key: "show", + value: function show(pos) { + if (!this.panel.usingUrl || !this.tooltip) { + return; + } // shared tooltip mode + + + if (pos.panelRelY) { + return; + } + + var cardId = d3.select(pos.target).attr('cardId'); + + if (!cardId) { + this.destroy(); + return; + } + + var card = this.panelCtrl.cardsData.cards[cardId]; + + if (!card) { + this.destroy(); + return; + } + + if (card.value == null) { + this.destroy(); + return; + } + + var x = card.x; + var y = card.y; + var value = card.value; + var values = card.values; + var tooltipTimeFormat = 'YYYY-MM-DD HH:mm:ss'; + var time = this.dashboard.formatDate(+x, tooltipTimeFormat); + var tooltipHtml = "
".concat(time, "
"); + + if (this.panel.color.mode === 'discrete') { + var statuses = ""; + + if (this.panelCtrl.panel.seriesFilterIndex == -1) { + statuses = this.panelCtrl.discreteExtraSeries.convertValuesToTooltips(values); + } else { + statuses = this.panelCtrl.discreteExtraSeries.convertValueToTooltips(value); + } + + tooltipHtml += "\n
\n name: ".concat(y, "\n
\n
\n status:\n
    \n ").concat(_.join(_.map(statuses, function (v) { + return "

    ").concat(v.tooltip, "

    "); + }), ""), "\n
\n
\n

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

"); + } // "Ambiguous bucket state: Multiple values!"; + + + if (!this.panel.useMax && card.multipleValues) { + tooltipHtml += "
Error: ".concat(this.panelCtrl.dataWarnings.multipleValues.title, "
"); + } // Discrete mode errors + + + if (this.panel.color.mode === 'discrete') { + if (card.noColorDefined) { + var badValues = this.panelCtrl.discreteExtraSeries.getNotColoredValues(values); + tooltipHtml += "
Error: ".concat(this.panelCtrl.dataWarnings.noColorDefined.title, "\n
not colored values:\n
    \n ").concat(_.join(_.map(badValues, function (v) { + return "
  • ".concat(v, "
  • "); + }), ""), "\n
\n
"); + } + } + + this.tooltip.html(tooltipHtml); + this.move(pos); + } + }, { + key: "formatExtraSeries", + value: function formatExtraSeries(value, type) { + var extraSeries = ''; + + switch (type) { + case ExtraSeriesFormatValue.Date: + extraSeries = this.dashboard.formatDate(+value, type); + return extraSeries; + + case ExtraSeriesFormatValue.Raw: + extraSeries = value; + return extraSeries; + + default: + return extraSeries; + } + } + }, { + key: "move", + value: function move(pos) { + if (!this.tooltip) { + return; + } + + var elem = $(this.tooltip.node())[0]; + var tooltipWidth = elem.clientWidth; + var tooltipHeight = elem.clientHeight; + var left = pos.pageX + TOOLTIP_PADDING_X; + var top = pos.pageY + TOOLTIP_PADDING_Y; + + if (pos.pageX + tooltipWidth + 40 > window.innerWidth) { + left = pos.pageX - tooltipWidth - TOOLTIP_PADDING_X; + } + + if (pos.pageY - window.pageYOffset + tooltipHeight + 20 > window.innerHeight) { + top = pos.pageY - tooltipHeight - TOOLTIP_PADDING_Y; + } + + return this.tooltip.style("left", left + "px").style("top", top + "px"); + } + }]); + + return StatusHeatmapTooltipExtraSeries; + }()); + } + }; +}); +//# sourceMappingURL=tooltipextraseries.js.map diff --git a/dist/tooltipextraseries.js.map b/dist/tooltipextraseries.js.map new file mode 100644 index 0000000..a5546c9 --- /dev/null +++ b/dist/tooltipextraseries.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/tooltipextraseries.ts"],"names":["d3","_","$","ExtraSeriesFormatValue","TOOLTIP_PADDING_X","TOOLTIP_PADDING_Y","StatusHeatmapTooltipExtraSeries","elem","scope","dashboard","ctrl","panelCtrl","panel","heatmapPanel","mouseOverBucket","originalFillColor","on","onMouseOver","bind","onMouseClick","e","usingUrl","data","isEmpty","destroy","add","tooltip","select","append","attr","remove","pos","panelRelY","cardId","target","card","cardsData","cards","value","x","y","values","tooltipTimeFormat","time","formatDate","tooltipHtml","color","mode","statuses","seriesFilterIndex","discreteExtraSeries","convertValuesToTooltips","convertValueToTooltips","join","map","v","urls","rtime","retrieveTimeVar","curl","JSON","parse","stringify","i","length","base_url","replace","useExtraSeries","tf","extraSeries","format","vh","index","series_extra","formatExtraSeries","renderLink","variableSrv","variables","forcelowercase","toLowerCase","label","truncate","icon_fa","useMax","multipleValues","dataWarnings","title","noColorDefined","badValues","getNotColoredValues","html","move","type","Date","Raw","node","tooltipWidth","clientWidth","tooltipHeight","clientHeight","left","pageX","top","pageY","window","innerWidth","pageYOffset","innerHeight","style"],"mappings":"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","sourcesContent":["import d3 from 'd3';\nimport _ from 'lodash';\nimport $ from 'jquery';\nimport { ExtraSeriesFormatValue } from './extra_series_format';\n\nconst TOOLTIP_PADDING_X = -50;\nconst TOOLTIP_PADDING_Y = 5;\n\nexport class StatusHeatmapTooltipExtraSeries {\n scope: any;\n dashboard: any;\n panelCtrl: any;\n panel: any;\n heatmapPanel: any;\n mouseOverBucket: any;\n originalFillColor: any;\n tooltip: any;\n\n constructor(elem: any, scope: any) {\n this.scope = scope;\n this.dashboard = scope.ctrl.dashboard;\n this.panelCtrl = scope.ctrl;\n this.panel = scope.ctrl.panel;\n this.heatmapPanel = elem;\n this.mouseOverBucket = false;\n this.originalFillColor = null;\n \n elem.on(\"mouseover\", this.onMouseOver.bind(this));\n elem.on(\"click\", this.onMouseClick.bind(this));\n }\n\n public onMouseOver(e: Event) {\n if (!this.panel.usingUrl || !this.scope.ctrl.data || _.isEmpty(this.scope.ctrl.data)) { \n return; \n }\n }\n\n public onMouseClick(e: Event) {\n if (!this.panel.usingUrl) { \n return; \n }\n\n this.destroy();\n this.add();\n }\n\n public add() {\n this.tooltip = d3.select(\"body\")\n .append(\"div\")\n .attr(\"class\", \"statusmap-tooltip-extraseries graph-tooltip grafana-tooltip\");\n }\n\n public destroy() {\n if (this.tooltip) {\n this.tooltip.remove();\n }\n \n this.tooltip = null;\n }\n\n public show(pos: any) {\n if (!this.panel.usingUrl || !this.tooltip) { \n return; \n }\n\n // shared tooltip mode\n if (pos.panelRelY) {\n return;\n }\n\n let cardId: any = d3.select(pos.target).attr('cardId');\n \n if (!cardId) {\n this.destroy();\n \n return;\n }\n \n let card: any = this.panelCtrl.cardsData.cards[cardId];\n \n if (!card) {\n this.destroy();\n \n return;\n } \n \n if (card.value == null) {\n this.destroy();\n \n return;\n }\n \n let x: any = card.x;\n let y: any = card.y;\n let value: any = card.value;\n let values: any = card.values;\n let tooltipTimeFormat: string = 'YYYY-MM-DD HH:mm:ss';\n let time: Date = this.dashboard.formatDate(+x, tooltipTimeFormat);\n \n let tooltipHtml: string = `
${time}
` \n \n if (this.panel.color.mode === 'discrete') {\n let statuses: any = \"\";\n \n if (this.panelCtrl.panel.seriesFilterIndex == -1) {\n statuses = this.panelCtrl.discreteExtraSeries.convertValuesToTooltips(values);\n } else {\n statuses = this.panelCtrl.discreteExtraSeries.convertValueToTooltips(value);\n }\n \n tooltipHtml += `\n
\n name: ${y}\n
\n
\n status:\n
    \n ${_.join(_.map(statuses, v => `

    ${v.tooltip}

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

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

`;\n }\n\n // \"Ambiguous bucket state: Multiple values!\";\n if (!this.panel.useMax && card.multipleValues) {\n tooltipHtml += `
Error: ${this.panelCtrl.dataWarnings.multipleValues.title}
`;\n }\n\n // Discrete mode errors\n if (this.panel.color.mode === 'discrete') {\n if (card.noColorDefined) {\n let badValues: any = this.panelCtrl.discreteExtraSeries.getNotColoredValues(values);\n tooltipHtml += `
Error: ${this.panelCtrl.dataWarnings.noColorDefined.title}\n
not colored values:\n
    \n ${_.join(_.map(badValues, v => `
  • ${v}
  • `), \"\")}\n
\n
`;\n }\n }\n\n this.tooltip.html(tooltipHtml);\n\n this.move(pos);\n }\n\n public formatExtraSeries (value: any, type: any) {\n let extraSeries: any = '';\n\n switch(type) {\n case ExtraSeriesFormatValue.Date:\n extraSeries = this.dashboard.formatDate(+value, type);\n return extraSeries;\n case ExtraSeriesFormatValue.Raw:\n extraSeries = value;\n return extraSeries;\n default:\n return extraSeries;\n }\n }\n\n public move(pos: any) {\n if (!this.tooltip) { \n return; \n }\n\n let elem: any = $(this.tooltip.node())[0];\n let tooltipWidth = elem.clientWidth;\n let tooltipHeight = elem.clientHeight;\n\n let left = pos.pageX + TOOLTIP_PADDING_X;\n let top = pos.pageY + TOOLTIP_PADDING_Y;\n\n if (pos.pageX + tooltipWidth + 40 > window.innerWidth) {\n left = pos.pageX - tooltipWidth - TOOLTIP_PADDING_X;\n }\n \n if (pos.pageY - window.pageYOffset + tooltipHeight + 20 > window.innerHeight) {\n top = pos.pageY - tooltipHeight - TOOLTIP_PADDING_Y;\n }\n\n return this.tooltip\n .style(\"left\", left + \"px\")\n .style(\"top\", top + \"px\");\n }\n}"],"file":"tooltipextraseries.js"} \ No newline at end of file diff --git a/src/color_legend.ts b/src/color_legend.ts index 8e2ce93..a53556b 100644 --- a/src/color_legend.ts +++ b/src/color_legend.ts @@ -77,7 +77,7 @@ coreModule.directive('statusHeatmapLegend', function() { drawOpacityLegend(elem, colorOptions, rangeFrom, rangeTo, maxValue, minValue); } else if (panel.color.mode === 'discrete') { let colorOptions = panel.color; - drawDiscreteColorLegend(elem, colorOptions, ctrl.discreteHelper); + drawDiscreteColorLegend(elem, colorOptions, ctrl.discreteExtraSeries); } } } @@ -148,7 +148,7 @@ function drawOpacityLegend(elem, options, rangeFrom, rangeTo, maxValue, minValue drawLegendValues(elem, opacityScale, rangeFrom, rangeTo, maxValue, minValue, legendWidth); } -function drawDiscreteColorLegend(elem, colorOptions, discreteHelper) { +function drawDiscreteColorLegend(elem, colorOptions, discreteExtraSeries) { let legendElem = $(elem).find('svg'); let legend = d3.select(legendElem.get(0)); clearLegend(elem); @@ -196,7 +196,7 @@ function drawDiscreteColorLegend(elem, colorOptions, discreteHelper) { .attr("width", itemWidth + 1) // Overlap rectangles to prevent gaps .attr("height", legendHeight) .attr("stroke-width", 0) - .attr("fill", d => discreteHelper.getDiscreteColor(d)); + .attr("fill", d => discreteExtraSeries.getDiscreteColor(d)); drawDiscreteLegendValues(elem, colorOptions, legendWidth); } diff --git a/src/color_mode_discrete.ts b/src/color_mode_discrete.ts index a812560..d19c020 100644 --- a/src/color_mode_discrete.ts +++ b/src/color_mode_discrete.ts @@ -12,7 +12,7 @@ declare class DiscreteColorThreshold { tooltip: string; } -// Helper methods to handle discrete color mode +// Extra Series methods to handle discrete color mode export class ColorModeDiscrete { scope: any; panelCtrl: StatusHeatmapCtrl; @@ -42,6 +42,23 @@ export class ColorModeDiscrete { return tooltips; } + convertValueToTooltips(values) { + let thresholds = this.panel.color.thresholds; + let tooltips = []; + + for (let i = 0; i < thresholds.length; i++) { + //for (let j = 0; j < values.length; j++) { + if (values == thresholds[i].value) { + tooltips.push({ + "tooltip": thresholds[i].tooltip?thresholds[i].tooltip:values, + "color": thresholds[i].color + }); + //} + } + } + return tooltips; + } + getNotMatchedValues(values:any[]) { let notMatched:any[] = []; for (let j = 0; j < values.length; j++) { @@ -71,6 +88,22 @@ export class ColorModeDiscrete { return color; } + getBucketColorSingle(value) { + //let thresholds = this.panel.color.thresholds; + if (value == null) { + // treat as null value + return 'rgba(0,0,0,1)'; + //return this.getMatchedThreshold(null).color; + } + let threshold = this.getMatchedThreshold(value); + + if (!threshold || !threshold.color || threshold.color == "") { + return 'rgba(0,0,0,1)'; + } else { + return threshold.color; + } + } + // returns color from first matched thresold in order from 0 to thresholds.length getBucketColor(values) { let thresholds = this.panel.color.thresholds; @@ -109,6 +142,24 @@ export class ColorModeDiscrete { return 'rgba(0,0,0,1)'; } + + updateCardsValuesHasColorInfoSingle() { + if (!this.panelCtrl.cardsData) { + return; + } + this.panelCtrl.cardsData.noColorDefined = false; + var cards = this.panelCtrl.cardsData.cards; + for (var i = 0; i < cards.length; i++) { + cards[i].noColorDefined = false; + var values = cards[i].value; + var threshold = this.getMatchedThreshold(values); + if (!threshold || !threshold.color || threshold.color == "") { + cards[i].noColorDefined = true; + this.panelCtrl.cardsData.noColorDefined = true; + } + } + } + updateCardsValuesHasColorInfo() { if (!this.panelCtrl.cardsData) { return diff --git a/src/css/_statusmap.scss b/src/css/_statusmap.scss index 248b57d..96570d7 100644 --- a/src/css/_statusmap.scss +++ b/src/css/_statusmap.scss @@ -47,10 +47,25 @@ color: $text-color; .discrete-item { - color: #52545c; + color: #ffffff; padding: 1px; font-weight: bold; - text-shadow: 0 0 0.2em #FFF, 0 0 0.2em #FFF, 0 0 0.2em #FFF; + text-shadow: 0 0 0.2em #212124, 0 0 0.2em #212124, 0 0 0.2em #212124; + } +} + +.statusmap-tooltip-extraseries { + white-space: nowrap; + font-size: $font-size-sm; + background-color: $graph-tooltip-bg; + color: $text-color; + + .discrete-item { + color: #ffffff; + padding: 1px; + font-weight: bold; + margin-bottom: 0; + text-shadow: 0 0 0.2em #212124, 0 0 0.2em #212124, 0 0 0.2em #212124; } } @@ -71,6 +86,18 @@ stroke: rgba(102, 102, 102, 0.8); } +.width-c-40 { + width: 40.0rem!important +} +.width-c-50 { + width: 50.0rem!important +} +.width-c-60 { + width: 60.0rem!important +} +.width-c-70 { + width: 70.0rem!important +} .status-heatmap-legend-wrapper { margin: 0 10px; diff --git a/src/extra_series_format.ts b/src/extra_series_format.ts new file mode 100644 index 0000000..4d6dea3 --- /dev/null +++ b/src/extra_series_format.ts @@ -0,0 +1,9 @@ +export enum ExtraSeriesFormat { + Date = 'Date', + Raw = 'Raw', +} + +export enum ExtraSeriesFormatValue { + Date = 'YYYY/MM/DD/HH_mm_ss', + Raw = '', +} \ No newline at end of file diff --git a/src/img/tooltip-editor.png b/src/img/tooltip-editor.png new file mode 100644 index 0000000000000000000000000000000000000000..97a26d8e4cf53e8b93f74e14c94da3fff0cacf84 GIT binary patch literal 34584 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 { + var scoped = {} + for (var key in scopedVars) { + scoped[key] = { value: scopedVars[key] } + } + if (format) { + return this.templateSrv.replace(link, scoped, format) + } else { + return this.templateSrv.replace(link, scoped) + } + } // default graph width for discrete card width calculation this.graph = { @@ -166,7 +196,7 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { this.multipleValues = false; this.noColorDefined = false; - this.discreteHelper = new ColorModeDiscrete($scope); + this.discreteExtraSeries = new ColorModeDiscrete($scope); this.dataWarnings = { "noColorDefined": { @@ -180,6 +210,9 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { }; this.annotations = []; + this.annotationsSrv = annotationsSrv; + + this.timeSrv = timeSrv; this.events.on('render', this.onRender.bind(this)); this.events.on('data-received', this.onDataReceived.bind(this)); @@ -189,6 +222,7 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { this.events.on('refresh', this.postRefresh.bind(this)); // custom event from rendering.js this.events.on('render-complete', this.onRenderComplete.bind(this)); + this.events.on('onChangeType', this.onChangeType.bind(this)); } onRenderComplete(data):void { @@ -196,6 +230,20 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { this.renderingCompleted(); } + onChangeType(url): void { + switch (url.type) { + case ExtraSeriesFormat.Date: + url.extraSeries.format = ExtraSeriesFormatValue.Date; + break; + case ExtraSeriesFormat.Raw: + url.extraSeries.format = ExtraSeriesFormatValue.Raw; + break; + default: + url.extraSeries.format = ExtraSeriesFormatValue.Raw; + break; + } + } + getChartWidth():number { const wndWidth = $(window).width(); // gripPos.w is a width in grid's measurements. Grid size in Grafana is 24. @@ -222,7 +270,7 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { let rangeMs = this.range.to.valueOf() - this.range.from.valueOf(); // this is minimal interval! kbn.round_interval will lower it. - intervalMs = this.discreteHelper.roundIntervalCeil(rangeMs / maxCardsCount); + intervalMs = this.discreteExtraSeries.roundIntervalCeil(rangeMs / maxCardsCount); // Calculate low limit of interval let lowLimitMs = 1; // 1 millisecond default low limit @@ -292,8 +340,6 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { this.data = dataList; this.cardsData = this.convertToCards(this.data); - console.log("OnDataReceived"); - this.annotationsPromise.then( (result: { alertState: any; annotations: any }) => { this.loading = false; @@ -303,13 +349,11 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { } else { this.annotations = []; } - console.log("annotationsPromise result " + this.annotations.length + " annotations"); this.render(); }, () => { this.loading = false; this.annotations = []; - console.log("annotationsPromise onrejected"); this.render(); } ); @@ -334,7 +378,11 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { this.noColorDefined = false; if (this.panel.color.mode === 'discrete') { - this.discreteHelper.updateCardsValuesHasColorInfo(); + if (this.panel.seriesFilterIndex == -1) { + this.discreteExtraSeries.updateCardsValuesHasColorInfo(); + } else { + this.discreteExtraSeries.updateCardsValuesHasColorInfoSingle(); + } if (this.cardsData) { this.noColorDefined = this.cardsData.noColorDefined; } @@ -361,6 +409,26 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { this.render(); } + onEditorAddUrl = () => { + this.panel.urls.push({ + label: '', + base_url: '', + useExtraSeries: false, + useseriesname: true, + forcelowercase: true, + icon_fa: 'external-link', + extraSeries: { + index: -1 + } + }); + this.render(); + } + + onEditorRemoveUrl = (index) => { + this.panel.urls.splice(index, 1); + this.render(); + } + onEditorRemoveThreshold(index:number) { this.panel.color.thresholds.splice(index, 1); this.render(); @@ -371,6 +439,12 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { this.render(); } + + onEditorRemoveUrls = () => { + this.panel.urls = []; + this.render(); + } + onEditorAddThreeLights() { this.panel.color.thresholds.push({color: "red", value: 2, tooltip: "error" }); this.panel.color.thresholds.push({color: "yellow", value: 1, tooltip: "warning" }); @@ -395,6 +469,12 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { rendering(scope, elem, attrs, ctrl); } + retrieveTimeVar() { + var time = this.timeSrv.timeRangeForUrl(); + var var_time = '&from=' + time.from + '&to=' + time.to; + return var_time; + } + // group values into buckets by target convertToCards(data) { let cardsData = { @@ -433,6 +513,9 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { let card = new Card(); card.id = i*cardsData.xBucketSize + j; card.values = []; + card.columns = []; + card.multipleValues = false; + card.noColorDefined = false; card.y = target; card.x = -1; @@ -453,7 +536,7 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { if (card.values.length > 1) { cardsData.multipleValues = true; card.multipleValues = true; - card.value = card.maxValue; // max value by default + card.value = this.panel.seriesFilterIndex != -1 ? card.values[this.panel.seriesFilterIndex] : card.maxValue; } else { card.value = card.maxValue; // max value by default } diff --git a/src/partials/options_editor.html b/src/partials/options_editor.html index 45563e6..ee06808 100644 --- a/src/partials/options_editor.html +++ b/src/partials/options_editor.html @@ -194,9 +194,105 @@
-
+
+
Filtering
+
+ + +
+
URL
+ +
+ Insert the url to navigate
+
+ +
+ +
+ +
+
+
+
+
+ +
+
+ +
+
+ +
+
+ + + + + + + +

Specify an URL (relative or absolute)

+ + Use special variables to specify cell values: +
+ $series_label name of the serie +
+ $(template.name) name of the templated to be replaced +
+ $time append &from...&to on the URL +
+ $series_extra use extraSeries value to use it on URL +
+
+
+
+ + + + + + +
+ + + + +
+ +
+ +
+ + +
+
+
+
+
+
diff --git a/src/rendering.ts b/src/rendering.ts index 03bf772..c7df204 100644 --- a/src/rendering.ts +++ b/src/rendering.ts @@ -7,6 +7,7 @@ import {tickStep, getScaledDecimals, getFlotTickSize} from 'app/core/utils/ticks import * as d3 from 'd3'; import * as d3ScaleChromatic from './libs/d3-scale-chromatic/index'; import {StatusmapTooltip} from './tooltip'; +import {StatusHeatmapTooltipExtraSeries} from './tooltipextraseries'; import {AnnotationTooltip} from './annotations'; let MIN_CARD_SIZE = 5, @@ -50,6 +51,7 @@ export class StatusmapRenderer { panel: any; $heatmap: any; tooltip: StatusmapTooltip; + tooltipExtraSeries:StatusHeatmapTooltipExtraSeries; annotationTooltip: AnnotationTooltip; heatmap: any; timeRange: any; @@ -64,6 +66,7 @@ export class StatusmapRenderer { // $heatmap is JQuery object, but heatmap is D3 this.$heatmap = this.elem.find('.status-heatmap-panel'); this.tooltip = new StatusmapTooltip(this.$heatmap, this.scope); + this.tooltipExtraSeries = new StatusHeatmapTooltipExtraSeries(this.$heatmap, this.scope); this.annotationTooltip = new AnnotationTooltip(this.$heatmap, this.scope); this.yOffset = 0; @@ -94,6 +97,7 @@ export class StatusmapRenderer { this.$heatmap.on('mousedown', this.onMouseDown.bind(this)); this.$heatmap.on('mousemove', this.onMouseMove.bind(this)); this.$heatmap.on('mouseleave', this.onMouseLeave.bind(this)); + this.$heatmap.on('click', this.onMouseClick.bind(this)); } onGraphHoverClear() { @@ -507,7 +511,11 @@ export class StatusmapRenderer { } else if (this.panel.color.mode === 'spectrum') { return this.colorScale(d.value); } else if (this.panel.color.mode === 'discrete') { - return this.ctrl.discreteHelper.getBucketColor(d.values); + if (this.panel.seriesFilterIndex != -1 || this.panel.seriesFilterIndex != null) { + return this.ctrl.discreteExtraSeries.getBucketColorSingle(d.values[this.panel.seriesFilterIndex]); + } else { + return this.ctrl.discreteExtraSeries.getBucketColor(d.values); + } } } @@ -572,10 +580,17 @@ export class StatusmapRenderer { this.clearSelection(); } - onMouseLeave() { + onMouseLeave(e) { appEvents.emit('graph-hover-clear'); this.clearCrosshair(); //annotationTooltip.destroy(); + if (e.relatedTarget) { + if (e.relatedTarget.className == "statusmap-tooltip-extraseries graph-tooltip grafana-tooltip" || e.relatedTarget.className == "graph-tooltip-time" ) { + } else { + this.tooltipExtraSeries.destroy(); + } + } + this.annotationTooltip.destroy(); } onMouseMove(event) { @@ -599,6 +614,13 @@ export class StatusmapRenderer { } } + public onMouseClick(event) { + this.tooltipExtraSeries.show(event) + if (this.ctrl.panel.usingUrl) { + this.tooltip.destroy(); + } + } + getEventPos(event, offset) { const x = this.xScale.invert(offset.x - this.yAxisWidth).valueOf(); const y = this.yScale.invert(offset.y - this.chartTop); @@ -739,7 +761,7 @@ export class StatusmapRenderer { let annoData = _.map(this.ctrl.annotations, (d,i) => ({"x": Math.floor(this.yAxisWidth + this.xScale(d.time)), "id":i, "anno": d.source})); - //console.log({"ctrl_annotations": this.ctrl.annotations, "annoData": annoData}); + //({"ctrl_annotations": this.ctrl.annotations, "annoData": annoData}); let anno = this.heatmap .append("g") diff --git a/src/statusmap_data.ts b/src/statusmap_data.ts index 3560151..8f6116e 100644 --- a/src/statusmap_data.ts +++ b/src/statusmap_data.ts @@ -6,6 +6,7 @@ class Card { id: number = 0; // Array of values in this bucket values: any[] = []; + columns: any[] = []; // card has multiple values multipleValues: boolean = false; // card has values that has no color diff --git a/src/tooltip.ts b/src/tooltip.ts index 16940f4..b09de3d 100644 --- a/src/tooltip.ts +++ b/src/tooltip.ts @@ -89,8 +89,15 @@ export class StatusmapTooltip { let tooltipHtml = `
${time}
`; + let statuses; + if (this.panel.color.mode === 'discrete') { - let statuses = this.panelCtrl.discreteHelper.convertValuesToTooltips(values); + if (this.panel.seriesFilterIndex > 0) { + statuses = this.panelCtrl.discreteExtraSeries.convertValueToTooltips(value); + } else { + statuses = this.panelCtrl.discreteExtraSeries.convertValuesToTooltips(values); + } + let statusesHtml = ''; if (statuses.length === 1) { statusesHtml = "status:"; @@ -130,7 +137,7 @@ export class StatusmapTooltip { // Discrete mode errors if (this.panel.color.mode === 'discrete') { if (card.noColorDefined) { - let badValues = this.panelCtrl.discreteHelper.getNotColoredValues(values); + let badValues = this.panelCtrl.discreteExtraSeries.getNotColoredValues(values); tooltipHtml += `
Error: ${this.panelCtrl.dataWarnings.noColorDefined.title}
not colored values:
    diff --git a/src/tooltipextraseries.ts b/src/tooltipextraseries.ts new file mode 100644 index 0000000..3a92afb --- /dev/null +++ b/src/tooltipextraseries.ts @@ -0,0 +1,222 @@ +import d3 from 'd3'; +import _ from 'lodash'; +import $ from 'jquery'; +import { ExtraSeriesFormatValue } from './extra_series_format'; + +const TOOLTIP_PADDING_X = -50; +const TOOLTIP_PADDING_Y = 5; + +export class StatusHeatmapTooltipExtraSeries { + scope: any; + dashboard: any; + panelCtrl: any; + panel: any; + heatmapPanel: any; + mouseOverBucket: any; + originalFillColor: any; + tooltip: any; + + constructor(elem: any, scope: any) { + this.scope = scope; + this.dashboard = scope.ctrl.dashboard; + this.panelCtrl = scope.ctrl; + this.panel = scope.ctrl.panel; + this.heatmapPanel = elem; + this.mouseOverBucket = false; + this.originalFillColor = null; + + elem.on("mouseover", this.onMouseOver.bind(this)); + elem.on("click", this.onMouseClick.bind(this)); + } + + public onMouseOver(e: Event) { + if (!this.panel.usingUrl || !this.scope.ctrl.data || _.isEmpty(this.scope.ctrl.data)) { + return; + } + } + + public onMouseClick(e: Event) { + if (!this.panel.usingUrl) { + return; + } + + this.destroy(); + this.add(); + } + + public add() { + this.tooltip = d3.select("body") + .append("div") + .attr("class", "statusmap-tooltip-extraseries graph-tooltip grafana-tooltip"); + } + + public destroy() { + if (this.tooltip) { + this.tooltip.remove(); + } + + this.tooltip = null; + } + + public show(pos: any) { + if (!this.panel.usingUrl || !this.tooltip) { + return; + } + + // shared tooltip mode + if (pos.panelRelY) { + return; + } + + let cardId: any = d3.select(pos.target).attr('cardId'); + + if (!cardId) { + this.destroy(); + + return; + } + + let card: any = this.panelCtrl.cardsData.cards[cardId]; + + if (!card) { + this.destroy(); + + return; + } + + if (card.value == null) { + this.destroy(); + + return; + } + + let x: any = card.x; + let y: any = card.y; + let value: any = card.value; + let values: any = card.values; + let tooltipTimeFormat: string = 'YYYY-MM-DD HH:mm:ss'; + let time: Date = this.dashboard.formatDate(+x, tooltipTimeFormat); + + let tooltipHtml: string = `
    ${time}
    ` + + if (this.panel.color.mode === 'discrete') { + let statuses: any = ""; + + if (this.panelCtrl.panel.seriesFilterIndex == -1) { + statuses = this.panelCtrl.discreteExtraSeries.convertValuesToTooltips(values); + } else { + statuses = this.panelCtrl.discreteExtraSeries.convertValueToTooltips(value); + } + + tooltipHtml += ` +
    + name: ${y} +
    +
    + status: +
      + ${_.join(_.map(statuses, v => `

      ${v.tooltip}

      `), "")} +
    +
    +

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

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