diff --git a/README.md b/README.md index 204a57d..0899500 100644 --- a/README.md +++ b/README.md @@ -146,6 +146,7 @@ This plugin is based on "Heatmap" panel by Grafana and partly inspired by ideas ##### v0.0.3 +- Add simple sort options for Y axis - Fix display null values as zero ##### v0.0.2 diff --git a/dist/README.md b/dist/README.md index 204a57d..0899500 100644 --- a/dist/README.md +++ b/dist/README.md @@ -146,6 +146,7 @@ This plugin is based on "Heatmap" panel by Grafana and partly inspired by ideas ##### v0.0.3 +- Add simple sort options for Y axis - Fix display null values as zero ##### v0.0.2 diff --git a/dist/partials/options_editor.html b/dist/partials/options_editor.html index f41f099..14c6a72 100644 --- a/dist/partials/options_editor.html +++ b/dist/partials/options_editor.html @@ -118,7 +118,16 @@ label="Show tooltip" checked="ctrl.panel.tooltip.show" on-change="ctrl.render()"> - +
+ +
+ +
+
+
Bucket
diff --git a/dist/rendering.js b/dist/rendering.js index 76f5b74..b4d84e4 100644 --- a/dist/rendering.js +++ b/dist/rendering.js @@ -121,9 +121,10 @@ System.register(['lodash', 'jquery', 'moment', 'app/core/utils/kbn', 'app/core/c function getYScale(ticks) { var range = []; var step = chartHeight / ticks.length; - range.push(chartHeight); + // svg has y=0 on the top, so top card should have a minimal value in range + range.push(step); for (var i = 1; i < ticks.length; i++) { - range.push(chartHeight - step * i); + range.push(step * (i + 1)); } return d3.scaleOrdinal().domain(ticks).range(range); } @@ -132,9 +133,10 @@ System.register(['lodash', 'jquery', 'moment', 'app/core/utils/kbn', 'app/core/c function getYAxisScale(ticks) { var range = []; var step = chartHeight / ticks.length; - range.push(chartHeight - yOffset); + // svg has y=0 on the top, so top tick should have a minimal value in range + range.push(yOffset); for (var i = 1; i < ticks.length; i++) { - range.push(chartHeight - step * i - yOffset); + range.push(step * i + yOffset); } return d3.scaleOrdinal().domain(ticks).range(range); } @@ -149,6 +151,16 @@ System.register(['lodash', 'jquery', 'moment', 'app/core/utils/kbn', 'app/core/c ticks = ['']; } + if (panel.yAxisSort == 'a → z') { + ticks.sort(function (a, b) { + return a.localeCompare(b, 'en', { ignorePunctuation: false, numeric: true }); + }); + } else if (panel.yAxisSort == 'z → a') { + ticks.sort(function (b, a) { + return a.localeCompare(b, 'en', { ignorePunctuation: false, numeric: true }); + }); + } + var yAxisScale = getYAxisScale(ticks); scope.yScale = yScale = getYScale(ticks); diff --git a/dist/rendering.js.map b/dist/rendering.js.map index 453e2f0..d236fab 100644 --- a/dist/rendering.js.map +++ b/dist/rendering.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/rendering.js"],"names":["link","scope","elem","attrs","ctrl","data","cardsData","timeRange","panel","heatmap","$heatmap","find","tooltip","StatusHeatmapTooltip","width","height","yScale","xScale","chartWidth","chartHeight","chartTop","chartBottom","yAxisWidth","xAxisHeight","cardSpacing","cardRound","cardWidth","cardHeight","colorScale","opacityScale","mouseUpHandler","xGridSize","yGridSize","yOffset","selection","active","x1","x2","padding","left","right","top","bottom","margin","dataRangeWidingFactor","DATA_RANGE_WIDING_FACTOR","events","on","render","setElementHeight","row","_","isString","parseInt","replace","legend","show","css","e","getYAxisWidth","axis_text","selectAll","nodes","max_text_width","max","map","text","getBBox","getXAxisHeight","axis_line","select","empty","axis_line_position","parseFloat","attr","canvas_width","addXAxis","d3","scaleTime","domain","from","to","range","ticks","DEFAULT_X_TICK_SIZE_PX","grafanaTimeFormatter","grafanaTimeFormat","timeFormat","dashboardTimeZone","dashboard","getTimezone","utcFormat","xAxis","axisBottom","tickFormat","tickPadding","X_AXIS_TICK_PADDING","tickSize","posY","posX","append","call","remove","getYScale","step","length","push","i","scaleOrdinal","getYAxisScale","addYAxis","uniq","d","target","isEmpty","yAxisScale","yAxis","axisLeft","tickValues","tickSizeInner","Y_AXIS_TICK_PADDING","wideYAxisRange","min","tickInterval","y_widing","y_min","y_max","Math","ceil","floor","tickValueFormatter","decimals","scaledDecimals","format","value","kbn","valueFormats","addHeatmapCanvas","heatmap_elem","cards","CARD_SPACING","CARD_ROUND","yBucketSize","xBucketSize","style","addHeatmap","maxValue","color","minValue","mode","getColorScale","setOpacityScale","enter","c","id","getCardX","getCardWidth","getCardY","getCardHeight","getCardColor","getCardOpacity","$cards","event","mouseOverBucket","highlightCard","resetCardHighLight","emit","highlightColor","darker","strokeColor","brighter","current_card","originalFillColor","colorScheme","colorSchemes","colorInterpolator","d3ScaleChromatic","colorScaleInverted","invert","contextSrv","user","lightTheme","start","end","scaleSequential","scaleLinear","scalePow","exponent","x","cx","w","cutted_width","MIN_CARD_SIZE","y","ys","h","cardColor","discreteHelper","getBucketColor","values","nullPointMode","getCardStrokeWidth","appEvents","drawSharedCrosshair","pos","clearCrosshair","onMouseDown","offsetX","onMouseUp","$","document","one","unbind","selectionRange","abs","MIN_SELECTION_WIDTH","timeFrom","timeTo","timeSrv","setTime","moment","utc","clearSelection","onMouseLeave","onMouseMove","destroy","limitSelection","drawSelection","emitGraphHoverEvet","drawCrosshair","valueOf","offsetY","pageX","pageY","y1","panelRelY","posX1","posX2","selectionX","selectionWidth","position","graphTooltip","secPerTick","oneDay","oneYear","tickStep","getScaledDecimals","getFlotTickSize","DEFAULT_Y_TICK_SIZE_PX"],"mappings":"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","file":"rendering.js","sourcesContent":["import _ from 'lodash';\nimport $ from 'jquery';\nimport moment from 'moment';\nimport kbn from 'app/core/utils/kbn';\nimport {appEvents, contextSrv} from 'app/core/core';\nimport {tickStep, getScaledDecimals, getFlotTickSize} from 'app/core/utils/ticks';\nimport d3 from 'd3';\nimport * as d3ScaleChromatic from './libs/d3-scale-chromatic/index';\nimport {StatusHeatmapTooltip} from './tooltip';\n\nlet MIN_CARD_SIZE = 5,\n CARD_SPACING = 2,\n CARD_ROUND = 0,\n DATA_RANGE_WIDING_FACTOR = 1.2,\n DEFAULT_X_TICK_SIZE_PX = 100,\n DEFAULT_Y_TICK_SIZE_PX = 50,\n X_AXIS_TICK_PADDING = 10,\n Y_AXIS_TICK_PADDING = 5,\n MIN_SELECTION_WIDTH = 2;\n\nexport default function link(scope, elem, attrs, ctrl) {\n let data, cardsData, timeRange, panel, heatmap;\n\n // $heatmap is JQuery object, but heatmap is D3\n let $heatmap = elem.find('.status-heatmap-panel');\n let tooltip = new StatusHeatmapTooltip($heatmap, scope);\n\n let width, height,\n yScale, xScale,\n chartWidth, chartHeight,\n chartTop, chartBottom,\n yAxisWidth, xAxisHeight,\n cardSpacing, cardRound,\n cardWidth, cardHeight,\n colorScale, opacityScale,\n mouseUpHandler,\n xGridSize, yGridSize;\n\n let yOffset = 0;\n\n let selection = {\n active: false,\n x1: -1,\n x2: -1\n };\n\n let padding = {left: 0, right: 0, top: 0, bottom: 0},\n margin = {left: 25, right: 15, top: 10, bottom: 20},\n dataRangeWidingFactor = DATA_RANGE_WIDING_FACTOR;\n\n ctrl.events.on('render', () => {\n render();\n });\n\n function setElementHeight() {\n try {\n var height = ctrl.height || panel.height || ctrl.row.height;\n if (_.isString(height)) {\n height = parseInt(height.replace('px', ''), 10);\n }\n\n height -= panel.legend.show ? 32 : 10; // bottom padding and space for legend. Change margin in .status-heatmap-color-legend !\n\n $heatmap.css('height', height + 'px');\n\n return true;\n } catch (e) { // IE throws errors sometimes\n return false;\n }\n }\n\n function getYAxisWidth(elem) {\n let axis_text = elem.selectAll(\".axis-y text\").nodes();\n let max_text_width = _.max(_.map(axis_text, text => {\n // Use SVG getBBox method\n return text.getBBox().width;\n }));\n\n return max_text_width;\n }\n\n function getXAxisHeight(elem) {\n let axis_line = elem.select(\".axis-x line\");\n if (!axis_line.empty()) {\n let axis_line_position = parseFloat(elem.select(\".axis-x line\").attr(\"y2\"));\n let canvas_width = parseFloat(elem.attr(\"height\"));\n return canvas_width - axis_line_position;\n } else {\n // Default height\n return 30;\n }\n }\n\n function addXAxis() {\n // Scale timestamps to cards centers\n scope.xScale = xScale = d3.scaleTime()\n .domain([timeRange.from, timeRange.to])\n .range([xGridSize/2, chartWidth-xGridSize/2]);\n\n let ticks = chartWidth / DEFAULT_X_TICK_SIZE_PX;\n let grafanaTimeFormatter = grafanaTimeFormat(ticks, timeRange.from, timeRange.to);\n let timeFormat;\n let dashboardTimeZone = ctrl.dashboard.getTimezone();\n if (dashboardTimeZone === 'utc') {\n timeFormat = d3.utcFormat(grafanaTimeFormatter);\n } else {\n timeFormat = d3.timeFormat(grafanaTimeFormatter);\n }\n\n let xAxis = d3.axisBottom(xScale)\n .ticks(ticks)\n .tickFormat(timeFormat)\n .tickPadding(X_AXIS_TICK_PADDING)\n .tickSize(chartHeight);\n\n let posY = chartTop;\n let posX = yAxisWidth;\n\n heatmap.append(\"g\")\n .attr(\"class\", \"axis axis-x\")\n .attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\")\n .call(xAxis);\n\n // Remove horizontal line in the top of axis labels (called domain in d3)\n heatmap.select(\".axis-x\").select(\".domain\").remove();\n }\n\n // divide chart height by ticks for cards drawing\n function getYScale(ticks) {\n let range = [];\n let step = chartHeight / ticks.length;\n range.push(chartHeight);\n for (let i = 1; i < ticks.length; i++) {\n range.push(chartHeight - step * i);\n }\n return d3.scaleOrdinal()\n .domain(ticks)\n .range(range);\n }\n\n // divide chart height by ticks with offset for ticks drawing\n function getYAxisScale(ticks) {\n let range = [];\n let step = chartHeight / ticks.length;\n range.push(chartHeight - yOffset);\n for (let i = 1; i < ticks.length; i++) {\n range.push(chartHeight - step * i - yOffset);\n }\n return d3.scaleOrdinal()\n .domain(ticks)\n .range(range);\n }\n\n function addYAxis() {\n let ticks = _.uniq(_.map(data, d => d.target));\n\n // Set default Y min and max if no data\n if (_.isEmpty(data)) {\n ticks = [''];\n }\n\n let yAxisScale = getYAxisScale(ticks);\n scope.yScale = yScale = getYScale(ticks);\n\n let yAxis = d3.axisLeft(yAxisScale)\n .tickValues(ticks)\n .tickSizeInner(0 - width)\n .tickPadding(Y_AXIS_TICK_PADDING);\n\n heatmap.append(\"g\")\n .attr(\"class\", \"axis axis-y\")\n .call(yAxis);\n\n // Calculate Y axis width first, then move axis into visible area\n let posY = margin.top;\n let posX = getYAxisWidth(heatmap) + Y_AXIS_TICK_PADDING;\n heatmap.select(\".axis-y\").attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\");\n\n // Remove vertical line in the right of axis labels (called domain in d3)\n heatmap.select(\".axis-y\").select(\".domain\").remove();\n heatmap.select(\".axis-y\").selectAll(\".tick line\").remove();\n }\n\n // Wide Y values range and adjust to bucket size\n function wideYAxisRange(min, max, tickInterval) {\n let y_widing = (max * (dataRangeWidingFactor - 1) - min * (dataRangeWidingFactor - 1)) / 2;\n let y_min, y_max;\n\n if (tickInterval === 0) {\n y_max = max * dataRangeWidingFactor;\n y_min = min - min * (dataRangeWidingFactor - 1);\n tickInterval = (y_max - y_min) / 2;\n } else {\n y_max = Math.ceil((max + y_widing) / tickInterval) * tickInterval;\n y_min = Math.floor((min - y_widing) / tickInterval) * tickInterval;\n }\n\n // Don't wide axis below 0 if all values are positive\n if (min >= 0 && y_min < 0) {\n y_min = 0;\n }\n\n return {y_min, y_max};\n }\n\n function tickValueFormatter(decimals, scaledDecimals = null) {\n let format = panel.yAxis.format;\n return function(value) {\n return kbn.valueFormats[format](value, decimals, scaledDecimals);\n };\n }\n\n // Create svg element, add axes and\n // calculate sizes for cards drawing\n function addHeatmapCanvas() {\n let heatmap_elem = $heatmap[0];\n\n width = Math.floor($heatmap.width()) - padding.right;\n height = Math.floor($heatmap.height()) - padding.bottom;\n\n if (heatmap) {\n heatmap.remove();\n }\n\n heatmap = d3.select(heatmap_elem)\n .append(\"svg\")\n .attr(\"width\", width)\n .attr(\"height\", height);\n\n chartHeight = height - margin.top - margin.bottom;\n chartTop = margin.top;\n chartBottom = chartTop + chartHeight;\n\n cardSpacing = panel.cards.cardSpacing !== null ? panel.cards.cardSpacing : CARD_SPACING;\n cardRound = panel.cards.cardRound !== null ? panel.cards.cardRound : CARD_ROUND;\n\n // calculate yOffset for YAxis\n yGridSize = Math.floor(chartHeight / cardsData.yBucketSize);\n cardHeight = yGridSize ? yGridSize - cardSpacing : 0;\n yOffset = cardHeight / 2;\n\n addYAxis();\n\n yAxisWidth = getYAxisWidth(heatmap) + Y_AXIS_TICK_PADDING;\n chartWidth = width - yAxisWidth - margin.right;\n\n // we need to fill chartWidth with xBucketSize cards.\n xGridSize = chartWidth / (cardsData.xBucketSize+1);\n cardWidth = xGridSize - cardSpacing;\n\n addXAxis();\n xAxisHeight = getXAxisHeight(heatmap);\n\n if (!panel.yAxis.show) {\n heatmap.select(\".axis-y\").selectAll(\"line\").style(\"opacity\", 0);\n }\n\n if (!panel.xAxis.show) {\n heatmap.select(\".axis-x\").selectAll(\"line\").style(\"opacity\", 0);\n }\n }\n\n function addHeatmap() {\n addHeatmapCanvas();\n\n let maxValue = panel.color.max || cardsData.maxValue;\n let minValue = panel.color.min || cardsData.minValue;\n\n if (panel.color.mode !== 'discrete') {\n colorScale = getColorScale(maxValue, minValue);\n }\n setOpacityScale(maxValue);\n\n let cards = heatmap.selectAll(\".status-heatmap-card\").data(cardsData.cards);\n cards.append(\"title\");\n cards = cards.enter().append(\"rect\")\n .attr(\"cardId\", c => c.id)\n .attr(\"x\", getCardX)\n .attr(\"width\", getCardWidth)\n .attr(\"y\", getCardY)\n .attr(\"height\", getCardHeight)\n .attr(\"rx\", cardRound)\n .attr(\"ry\", cardRound)\n .attr(\"class\", \"bordered status-heatmap-card\")\n .style(\"fill\", getCardColor)\n .style(\"stroke\", getCardColor)\n .style(\"stroke-width\", 0)\n //.style(\"stroke-width\", getCardStrokeWidth)\n //.style(\"stroke-dasharray\", \"3,3\")\n .style(\"opacity\", getCardOpacity);\n\n let $cards = $heatmap.find(\".status-heatmap-card\");\n $cards.on(\"mouseenter\", (event) => {\n tooltip.mouseOverBucket = true;\n highlightCard(event);\n })\n .on(\"mouseleave\", (event) => {\n tooltip.mouseOverBucket = false;\n resetCardHighLight(event);\n });\n\n ctrl.events.emit('render-complete', {\n \"chartWidth\": chartWidth\n });\n }\n\n function highlightCard(event) {\n let color = d3.select(event.target).style(\"fill\");\n let highlightColor = d3.color(color).darker(2);\n let strokeColor = d3.color(color).brighter(4);\n let current_card = d3.select(event.target);\n tooltip.originalFillColor = color;\n current_card.style(\"fill\", highlightColor)\n .style(\"stroke\", strokeColor)\n .style(\"stroke-width\", 1);\n }\n\n function resetCardHighLight(event) {\n d3\n .select(event.target)\n .style(\"fill\", tooltip.originalFillColor)\n .style(\"stroke\", tooltip.originalFillColor)\n .style(\"stroke-width\", 0);\n }\n\n function getColorScale(maxValue, minValue = 0) {\n let colorScheme = _.find(ctrl.colorSchemes, {value: panel.color.colorScheme});\n let colorInterpolator = d3ScaleChromatic[colorScheme.value];\n let colorScaleInverted = colorScheme.invert === 'always' ||\n (colorScheme.invert === 'dark' && !contextSrv.user.lightTheme);\n\n if (maxValue == minValue)\n maxValue = minValue + 1;\n\n let start = colorScaleInverted ? maxValue : minValue;\n let end = colorScaleInverted ? minValue : maxValue;\n\n return d3.scaleSequential(colorInterpolator).domain([start, end]);\n }\n\n function setOpacityScale(maxValue) {\n if (panel.color.colorScale === 'linear') {\n opacityScale = d3.scaleLinear()\n .domain([0, maxValue])\n .range([0, 1]);\n } else if (panel.color.colorScale === 'sqrt') {\n opacityScale = d3.scalePow().exponent(panel.color.exponent)\n .domain([0, maxValue])\n .range([0, 1]);\n }\n }\n\n function getCardX(d) {\n let x;\n // cx is the center of the card. Card should be placed to the left.\n let cx = xScale(d.x);\n\n if (cx - cardWidth/2 < 0) {\n x = yAxisWidth + cardSpacing/2;\n } else {\n x = yAxisWidth + cx - cardWidth/2;\n }\n\n return x;\n }\n\n // xScale returns card center. Adjust cardWidth in case of overlaping.\n function getCardWidth(d) {\n let w;\n let cx = xScale(d.x);\n\n if (cx < cardWidth/2) {\n // Center should not exceed half of card.\n // Cut card to the left to prevent overlay of y axis.\n let cutted_width = (cx - cardSpacing/2) + cardWidth/2;\n w = cutted_width > 0 ? cutted_width : 0;\n } else if (chartWidth - cx < cardWidth/2) {\n // Cut card to the right to prevent overlay of right graph edge.\n w = cardWidth/2 + (chartWidth - cx - cardSpacing/2);\n } else {\n w = cardWidth;\n }\n\n // Card width should be MIN_CARD_SIZE at least\n w = Math.max(w, MIN_CARD_SIZE);\n\n return w;\n }\n\n function getCardY(d) {\n return yScale(d.y) + chartTop - cardHeight - cardSpacing/2;\n }\n\n function getCardHeight(d) {\n let ys = yScale(d.y);\n let y = ys + chartTop - cardHeight - cardSpacing/2;\n let h = cardHeight;\n\n // Cut card height to prevent overlay\n if (y < chartTop) {\n h = ys - cardSpacing/2;\n } else if (ys > chartBottom) {\n h = chartBottom - y;\n } else if (y + cardHeight > chartBottom) {\n h = chartBottom - y;\n }\n\n // Height can't be more than chart height\n h = Math.min(h, chartHeight);\n // Card height should be MIN_CARD_SIZE at least\n h = Math.max(h, MIN_CARD_SIZE);\n\n return h;\n }\n\n function getCardColor(d) {\n if (panel.color.mode === 'opacity') {\n return panel.color.cardColor;\n } else if (panel.color.mode === 'spectrum') {\n return colorScale(d.value);\n } else if (panel.color.mode === 'discrete') {\n return ctrl.discreteHelper.getBucketColor(d.values);\n }\n }\n\n function getCardOpacity(d) {\n if (panel.nullPointMode === 'as empty' && d.value == null ) {\n return 0;\n }\n if (panel.color.mode === 'opacity') {\n return opacityScale(d.value);\n } else {\n return 1;\n }\n }\n\n function getCardStrokeWidth(d) {\n if (panel.color.mode === 'discrete') {\n return '1';\n }\n return '0';\n }\n\n /////////////////////////////\n // Selection and crosshair //\n /////////////////////////////\n\n // Shared crosshair and tooltip\n appEvents.on('graph-hover', event => {\n drawSharedCrosshair(event.pos);\n }, scope);\n\n appEvents.on('graph-hover-clear', () => {\n clearCrosshair();\n }, scope);\n\n function onMouseDown(event) {\n selection.active = true;\n selection.x1 = event.offsetX;\n\n mouseUpHandler = function() {\n onMouseUp();\n };\n\n $(document).one(\"mouseup\", mouseUpHandler);\n }\n\n function onMouseUp() {\n $(document).unbind(\"mouseup\", mouseUpHandler);\n mouseUpHandler = null;\n selection.active = false;\n\n let selectionRange = Math.abs(selection.x2 - selection.x1);\n if (selection.x2 >= 0 && selectionRange > MIN_SELECTION_WIDTH) {\n let timeFrom = xScale.invert(Math.min(selection.x1, selection.x2) - yAxisWidth - xGridSize/2);\n let timeTo = xScale.invert(Math.max(selection.x1, selection.x2) - yAxisWidth - xGridSize/2);\n\n ctrl.timeSrv.setTime({\n from: moment.utc(timeFrom),\n to: moment.utc(timeTo)\n });\n }\n\n clearSelection();\n }\n\n function onMouseLeave() {\n appEvents.emit('graph-hover-clear');\n clearCrosshair();\n }\n\n function onMouseMove(event) {\n if (!heatmap) { return; }\n\n if (selection.active) {\n // Clear crosshair and tooltip\n clearCrosshair();\n tooltip.destroy();\n\n selection.x2 = limitSelection(event.offsetX);\n drawSelection(selection.x1, selection.x2);\n } else {\n emitGraphHoverEvet(event);\n drawCrosshair(event.offsetX);\n tooltip.show(event); //, data);\n }\n }\n\n function emitGraphHoverEvet(event) {\n let x = xScale.invert(event.offsetX - yAxisWidth - xGridSize/2).valueOf();\n let y = yScale(event.offsetY);\n let pos = {\n pageX: event.pageX,\n pageY: event.pageY,\n x: x, x1: x,\n y: y, y1: y,\n panelRelY: null\n };\n\n // Set minimum offset to prevent showing legend from another panel\n pos.panelRelY = Math.max(event.offsetY / height, 0.001);\n\n // broadcast to other graph panels that we are hovering\n appEvents.emit('graph-hover', {pos: pos, panel: panel});\n }\n\n function limitSelection(x2) {\n x2 = Math.max(x2, yAxisWidth);\n x2 = Math.min(x2, chartWidth + yAxisWidth);\n return x2;\n }\n\n function drawSelection(posX1, posX2) {\n if (heatmap) {\n heatmap.selectAll(\".status-heatmap-selection\").remove();\n let selectionX = Math.min(posX1, posX2);\n let selectionWidth = Math.abs(posX1 - posX2);\n\n if (selectionWidth > MIN_SELECTION_WIDTH) {\n heatmap.append(\"rect\")\n .attr(\"class\", \"status-heatmap-selection\")\n .attr(\"x\", selectionX)\n .attr(\"width\", selectionWidth)\n .attr(\"y\", chartTop)\n .attr(\"height\", chartHeight);\n }\n }\n }\n\n function clearSelection() {\n selection.x1 = -1;\n selection.x2 = -1;\n\n if (heatmap) {\n heatmap.selectAll(\".status-heatmap-selection\").remove();\n }\n }\n\n function drawCrosshair(position) {\n if (heatmap) {\n heatmap.selectAll(\".status-heatmap-crosshair\").remove();\n\n let posX = position;\n posX = Math.max(posX, yAxisWidth);\n posX = Math.min(posX, chartWidth + yAxisWidth);\n\n heatmap.append(\"g\")\n .attr(\"class\", \"status-heatmap-crosshair\")\n .attr(\"transform\", \"translate(\" + posX + \",0)\")\n .append(\"line\")\n .attr(\"x1\", 1)\n .attr(\"y1\", chartTop)\n .attr(\"x2\", 1)\n .attr(\"y2\", chartBottom)\n .attr(\"stroke-width\", 1);\n }\n }\n\n // map time to X\n function drawSharedCrosshair(pos) {\n if (heatmap && ctrl.dashboard.graphTooltip !== 0) {\n let posX = xScale(pos.x) + yAxisWidth;\n drawCrosshair(posX);\n }\n }\n\n function clearCrosshair() {\n if (heatmap) {\n heatmap.selectAll(\".status-heatmap-crosshair\").remove();\n }\n }\n\n function render() {\n data = ctrl.data;\n panel = ctrl.panel;\n timeRange = ctrl.range;\n cardsData = ctrl.cardsData;\n\n if (!data || !cardsData || !setElementHeight()) {\n return;\n }\n\n // Draw default axes and return if no data\n if (_.isEmpty(cardsData.cards)) {\n addHeatmapCanvas();\n return;\n }\n\n addHeatmap();\n scope.yAxisWidth = yAxisWidth;\n scope.xAxisHeight = xAxisHeight;\n scope.chartHeight = chartHeight;\n scope.chartWidth = chartWidth;\n scope.chartTop = chartTop;\n }\n\n // Register selection listeners\n $heatmap.on(\"mousedown\", onMouseDown);\n $heatmap.on(\"mousemove\", onMouseMove);\n $heatmap.on(\"mouseleave\", onMouseLeave);\n}\n\nfunction grafanaTimeFormat(ticks, min, max) {\n if (min && max && ticks) {\n let range = max - min;\n let secPerTick = (range/ticks) / 1000;\n let oneDay = 86400000;\n let oneYear = 31536000000;\n\n if (secPerTick <= 45) {\n return \"%H:%M:%S\";\n }\n if (secPerTick <= 7200 || range <= oneDay) {\n return \"%H:%M\";\n }\n if (secPerTick <= 80000) {\n return \"%m/%d %H:%M\";\n }\n if (secPerTick <= 2419200 || range <= oneYear) {\n return \"%m/%d\";\n }\n return \"%Y-%m\";\n }\n\n return \"%H:%M\";\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/rendering.js"],"names":["link","scope","elem","attrs","ctrl","data","cardsData","timeRange","panel","heatmap","$heatmap","find","tooltip","StatusHeatmapTooltip","width","height","yScale","xScale","chartWidth","chartHeight","chartTop","chartBottom","yAxisWidth","xAxisHeight","cardSpacing","cardRound","cardWidth","cardHeight","colorScale","opacityScale","mouseUpHandler","xGridSize","yGridSize","yOffset","selection","active","x1","x2","padding","left","right","top","bottom","margin","dataRangeWidingFactor","DATA_RANGE_WIDING_FACTOR","events","on","render","setElementHeight","row","_","isString","parseInt","replace","legend","show","css","e","getYAxisWidth","axis_text","selectAll","nodes","max_text_width","max","map","text","getBBox","getXAxisHeight","axis_line","select","empty","axis_line_position","parseFloat","attr","canvas_width","addXAxis","d3","scaleTime","domain","from","to","range","ticks","DEFAULT_X_TICK_SIZE_PX","grafanaTimeFormatter","grafanaTimeFormat","timeFormat","dashboardTimeZone","dashboard","getTimezone","utcFormat","xAxis","axisBottom","tickFormat","tickPadding","X_AXIS_TICK_PADDING","tickSize","posY","posX","append","call","remove","getYScale","step","length","push","i","scaleOrdinal","getYAxisScale","addYAxis","uniq","d","target","isEmpty","yAxisSort","sort","a","b","localeCompare","ignorePunctuation","numeric","yAxisScale","yAxis","axisLeft","tickValues","tickSizeInner","Y_AXIS_TICK_PADDING","wideYAxisRange","min","tickInterval","y_widing","y_min","y_max","Math","ceil","floor","tickValueFormatter","decimals","scaledDecimals","format","value","kbn","valueFormats","addHeatmapCanvas","heatmap_elem","cards","CARD_SPACING","CARD_ROUND","yBucketSize","xBucketSize","style","addHeatmap","maxValue","color","minValue","mode","getColorScale","setOpacityScale","enter","c","id","getCardX","getCardWidth","getCardY","getCardHeight","getCardColor","getCardOpacity","$cards","event","mouseOverBucket","highlightCard","resetCardHighLight","emit","highlightColor","darker","strokeColor","brighter","current_card","originalFillColor","colorScheme","colorSchemes","colorInterpolator","d3ScaleChromatic","colorScaleInverted","invert","contextSrv","user","lightTheme","start","end","scaleSequential","scaleLinear","scalePow","exponent","x","cx","w","cutted_width","MIN_CARD_SIZE","y","ys","h","cardColor","discreteHelper","getBucketColor","values","nullPointMode","getCardStrokeWidth","appEvents","drawSharedCrosshair","pos","clearCrosshair","onMouseDown","offsetX","onMouseUp","$","document","one","unbind","selectionRange","abs","MIN_SELECTION_WIDTH","timeFrom","timeTo","timeSrv","setTime","moment","utc","clearSelection","onMouseLeave","onMouseMove","destroy","limitSelection","drawSelection","emitGraphHoverEvet","drawCrosshair","valueOf","offsetY","pageX","pageY","y1","panelRelY","posX1","posX2","selectionX","selectionWidth","position","graphTooltip","secPerTick","oneDay","oneYear","tickStep","getScaledDecimals","getFlotTickSize","DEFAULT_Y_TICK_SIZE_PX"],"mappings":"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","file":"rendering.js","sourcesContent":["import _ from 'lodash';\nimport $ from 'jquery';\nimport moment from 'moment';\nimport kbn from 'app/core/utils/kbn';\nimport {appEvents, contextSrv} from 'app/core/core';\nimport {tickStep, getScaledDecimals, getFlotTickSize} from 'app/core/utils/ticks';\nimport d3 from 'd3';\nimport * as d3ScaleChromatic from './libs/d3-scale-chromatic/index';\nimport {StatusHeatmapTooltip} from './tooltip';\n\nlet MIN_CARD_SIZE = 5,\n CARD_SPACING = 2,\n CARD_ROUND = 0,\n DATA_RANGE_WIDING_FACTOR = 1.2,\n DEFAULT_X_TICK_SIZE_PX = 100,\n DEFAULT_Y_TICK_SIZE_PX = 50,\n X_AXIS_TICK_PADDING = 10,\n Y_AXIS_TICK_PADDING = 5,\n MIN_SELECTION_WIDTH = 2;\n\nexport default function link(scope, elem, attrs, ctrl) {\n let data, cardsData, timeRange, panel, heatmap;\n\n // $heatmap is JQuery object, but heatmap is D3\n let $heatmap = elem.find('.status-heatmap-panel');\n let tooltip = new StatusHeatmapTooltip($heatmap, scope);\n\n let width, height,\n yScale, xScale,\n chartWidth, chartHeight,\n chartTop, chartBottom,\n yAxisWidth, xAxisHeight,\n cardSpacing, cardRound,\n cardWidth, cardHeight,\n colorScale, opacityScale,\n mouseUpHandler,\n xGridSize, yGridSize;\n\n let yOffset = 0;\n\n let selection = {\n active: false,\n x1: -1,\n x2: -1\n };\n\n let padding = {left: 0, right: 0, top: 0, bottom: 0},\n margin = {left: 25, right: 15, top: 10, bottom: 20},\n dataRangeWidingFactor = DATA_RANGE_WIDING_FACTOR;\n\n ctrl.events.on('render', () => {\n render();\n });\n\n function setElementHeight() {\n try {\n var height = ctrl.height || panel.height || ctrl.row.height;\n if (_.isString(height)) {\n height = parseInt(height.replace('px', ''), 10);\n }\n\n height -= panel.legend.show ? 32 : 10; // bottom padding and space for legend. Change margin in .status-heatmap-color-legend !\n\n $heatmap.css('height', height + 'px');\n\n return true;\n } catch (e) { // IE throws errors sometimes\n return false;\n }\n }\n\n function getYAxisWidth(elem) {\n let axis_text = elem.selectAll(\".axis-y text\").nodes();\n let max_text_width = _.max(_.map(axis_text, text => {\n // Use SVG getBBox method\n return text.getBBox().width;\n }));\n\n return max_text_width;\n }\n\n function getXAxisHeight(elem) {\n let axis_line = elem.select(\".axis-x line\");\n if (!axis_line.empty()) {\n let axis_line_position = parseFloat(elem.select(\".axis-x line\").attr(\"y2\"));\n let canvas_width = parseFloat(elem.attr(\"height\"));\n return canvas_width - axis_line_position;\n } else {\n // Default height\n return 30;\n }\n }\n\n function addXAxis() {\n // Scale timestamps to cards centers\n scope.xScale = xScale = d3.scaleTime()\n .domain([timeRange.from, timeRange.to])\n .range([xGridSize/2, chartWidth-xGridSize/2]);\n\n let ticks = chartWidth / DEFAULT_X_TICK_SIZE_PX;\n let grafanaTimeFormatter = grafanaTimeFormat(ticks, timeRange.from, timeRange.to);\n let timeFormat;\n let dashboardTimeZone = ctrl.dashboard.getTimezone();\n if (dashboardTimeZone === 'utc') {\n timeFormat = d3.utcFormat(grafanaTimeFormatter);\n } else {\n timeFormat = d3.timeFormat(grafanaTimeFormatter);\n }\n\n let xAxis = d3.axisBottom(xScale)\n .ticks(ticks)\n .tickFormat(timeFormat)\n .tickPadding(X_AXIS_TICK_PADDING)\n .tickSize(chartHeight);\n\n let posY = chartTop;\n let posX = yAxisWidth;\n\n heatmap.append(\"g\")\n .attr(\"class\", \"axis axis-x\")\n .attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\")\n .call(xAxis);\n\n // Remove horizontal line in the top of axis labels (called domain in d3)\n heatmap.select(\".axis-x\").select(\".domain\").remove();\n }\n\n // divide chart height by ticks for cards drawing\n function getYScale(ticks) {\n let range = [];\n let step = chartHeight / ticks.length;\n // svg has y=0 on the top, so top card should have a minimal value in range\n range.push(step);\n for (let i = 1; i < ticks.length; i++) {\n range.push(step * (i+1));\n }\n return d3.scaleOrdinal()\n .domain(ticks)\n .range(range);\n }\n\n // divide chart height by ticks with offset for ticks drawing\n function getYAxisScale(ticks) {\n let range = [];\n let step = chartHeight / ticks.length;\n // svg has y=0 on the top, so top tick should have a minimal value in range\n range.push(yOffset);\n for (let i = 1; i < ticks.length; i++) {\n range.push(step * i + yOffset);\n }\n return d3.scaleOrdinal()\n .domain(ticks)\n .range(range);\n }\n\n function addYAxis() {\n let ticks = _.uniq(_.map(data, d => d.target));\n\n // Set default Y min and max if no data\n if (_.isEmpty(data)) {\n ticks = [''];\n }\n\n if (panel.yAxisSort == 'a → z') {\n ticks.sort((a, b) => a.localeCompare(b, 'en', {ignorePunctuation: false, numeric: true}));\n } else if (panel.yAxisSort == 'z → a') {\n ticks.sort((b, a) => a.localeCompare(b, 'en', {ignorePunctuation: false, numeric: true}));\n }\n\n let yAxisScale = getYAxisScale(ticks);\n scope.yScale = yScale = getYScale(ticks);\n\n let yAxis = d3.axisLeft(yAxisScale)\n .tickValues(ticks)\n .tickSizeInner(0 - width)\n .tickPadding(Y_AXIS_TICK_PADDING);\n\n heatmap.append(\"g\")\n .attr(\"class\", \"axis axis-y\")\n .call(yAxis);\n\n // Calculate Y axis width first, then move axis into visible area\n let posY = margin.top;\n let posX = getYAxisWidth(heatmap) + Y_AXIS_TICK_PADDING;\n heatmap.select(\".axis-y\").attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\");\n\n // Remove vertical line in the right of axis labels (called domain in d3)\n heatmap.select(\".axis-y\").select(\".domain\").remove();\n heatmap.select(\".axis-y\").selectAll(\".tick line\").remove();\n }\n\n // Wide Y values range and adjust to bucket size\n function wideYAxisRange(min, max, tickInterval) {\n let y_widing = (max * (dataRangeWidingFactor - 1) - min * (dataRangeWidingFactor - 1)) / 2;\n let y_min, y_max;\n\n if (tickInterval === 0) {\n y_max = max * dataRangeWidingFactor;\n y_min = min - min * (dataRangeWidingFactor - 1);\n tickInterval = (y_max - y_min) / 2;\n } else {\n y_max = Math.ceil((max + y_widing) / tickInterval) * tickInterval;\n y_min = Math.floor((min - y_widing) / tickInterval) * tickInterval;\n }\n\n // Don't wide axis below 0 if all values are positive\n if (min >= 0 && y_min < 0) {\n y_min = 0;\n }\n\n return {y_min, y_max};\n }\n\n function tickValueFormatter(decimals, scaledDecimals = null) {\n let format = panel.yAxis.format;\n return function(value) {\n return kbn.valueFormats[format](value, decimals, scaledDecimals);\n };\n }\n\n // Create svg element, add axes and\n // calculate sizes for cards drawing\n function addHeatmapCanvas() {\n let heatmap_elem = $heatmap[0];\n\n width = Math.floor($heatmap.width()) - padding.right;\n height = Math.floor($heatmap.height()) - padding.bottom;\n\n if (heatmap) {\n heatmap.remove();\n }\n\n heatmap = d3.select(heatmap_elem)\n .append(\"svg\")\n .attr(\"width\", width)\n .attr(\"height\", height);\n\n chartHeight = height - margin.top - margin.bottom;\n chartTop = margin.top;\n chartBottom = chartTop + chartHeight;\n\n cardSpacing = panel.cards.cardSpacing !== null ? panel.cards.cardSpacing : CARD_SPACING;\n cardRound = panel.cards.cardRound !== null ? panel.cards.cardRound : CARD_ROUND;\n\n // calculate yOffset for YAxis\n yGridSize = Math.floor(chartHeight / cardsData.yBucketSize);\n cardHeight = yGridSize ? yGridSize - cardSpacing : 0;\n yOffset = cardHeight / 2;\n\n addYAxis();\n\n yAxisWidth = getYAxisWidth(heatmap) + Y_AXIS_TICK_PADDING;\n chartWidth = width - yAxisWidth - margin.right;\n\n // we need to fill chartWidth with xBucketSize cards.\n xGridSize = chartWidth / (cardsData.xBucketSize+1);\n cardWidth = xGridSize - cardSpacing;\n\n addXAxis();\n xAxisHeight = getXAxisHeight(heatmap);\n\n if (!panel.yAxis.show) {\n heatmap.select(\".axis-y\").selectAll(\"line\").style(\"opacity\", 0);\n }\n\n if (!panel.xAxis.show) {\n heatmap.select(\".axis-x\").selectAll(\"line\").style(\"opacity\", 0);\n }\n }\n\n function addHeatmap() {\n addHeatmapCanvas();\n\n let maxValue = panel.color.max || cardsData.maxValue;\n let minValue = panel.color.min || cardsData.minValue;\n\n if (panel.color.mode !== 'discrete') {\n colorScale = getColorScale(maxValue, minValue);\n }\n setOpacityScale(maxValue);\n\n let cards = heatmap.selectAll(\".status-heatmap-card\").data(cardsData.cards);\n cards.append(\"title\");\n cards = cards.enter().append(\"rect\")\n .attr(\"cardId\", c => c.id)\n .attr(\"x\", getCardX)\n .attr(\"width\", getCardWidth)\n .attr(\"y\", getCardY)\n .attr(\"height\", getCardHeight)\n .attr(\"rx\", cardRound)\n .attr(\"ry\", cardRound)\n .attr(\"class\", \"bordered status-heatmap-card\")\n .style(\"fill\", getCardColor)\n .style(\"stroke\", getCardColor)\n .style(\"stroke-width\", 0)\n //.style(\"stroke-width\", getCardStrokeWidth)\n //.style(\"stroke-dasharray\", \"3,3\")\n .style(\"opacity\", getCardOpacity);\n\n let $cards = $heatmap.find(\".status-heatmap-card\");\n $cards.on(\"mouseenter\", (event) => {\n tooltip.mouseOverBucket = true;\n highlightCard(event);\n })\n .on(\"mouseleave\", (event) => {\n tooltip.mouseOverBucket = false;\n resetCardHighLight(event);\n });\n\n ctrl.events.emit('render-complete', {\n \"chartWidth\": chartWidth\n });\n }\n\n function highlightCard(event) {\n let color = d3.select(event.target).style(\"fill\");\n let highlightColor = d3.color(color).darker(2);\n let strokeColor = d3.color(color).brighter(4);\n let current_card = d3.select(event.target);\n tooltip.originalFillColor = color;\n current_card.style(\"fill\", highlightColor)\n .style(\"stroke\", strokeColor)\n .style(\"stroke-width\", 1);\n }\n\n function resetCardHighLight(event) {\n d3\n .select(event.target)\n .style(\"fill\", tooltip.originalFillColor)\n .style(\"stroke\", tooltip.originalFillColor)\n .style(\"stroke-width\", 0);\n }\n\n function getColorScale(maxValue, minValue = 0) {\n let colorScheme = _.find(ctrl.colorSchemes, {value: panel.color.colorScheme});\n let colorInterpolator = d3ScaleChromatic[colorScheme.value];\n let colorScaleInverted = colorScheme.invert === 'always' ||\n (colorScheme.invert === 'dark' && !contextSrv.user.lightTheme);\n\n if (maxValue == minValue)\n maxValue = minValue + 1;\n\n let start = colorScaleInverted ? maxValue : minValue;\n let end = colorScaleInverted ? minValue : maxValue;\n\n return d3.scaleSequential(colorInterpolator).domain([start, end]);\n }\n\n function setOpacityScale(maxValue) {\n if (panel.color.colorScale === 'linear') {\n opacityScale = d3.scaleLinear()\n .domain([0, maxValue])\n .range([0, 1]);\n } else if (panel.color.colorScale === 'sqrt') {\n opacityScale = d3.scalePow().exponent(panel.color.exponent)\n .domain([0, maxValue])\n .range([0, 1]);\n }\n }\n\n function getCardX(d) {\n let x;\n // cx is the center of the card. Card should be placed to the left.\n let cx = xScale(d.x);\n\n if (cx - cardWidth/2 < 0) {\n x = yAxisWidth + cardSpacing/2;\n } else {\n x = yAxisWidth + cx - cardWidth/2;\n }\n\n return x;\n }\n\n // xScale returns card center. Adjust cardWidth in case of overlaping.\n function getCardWidth(d) {\n let w;\n let cx = xScale(d.x);\n\n if (cx < cardWidth/2) {\n // Center should not exceed half of card.\n // Cut card to the left to prevent overlay of y axis.\n let cutted_width = (cx - cardSpacing/2) + cardWidth/2;\n w = cutted_width > 0 ? cutted_width : 0;\n } else if (chartWidth - cx < cardWidth/2) {\n // Cut card to the right to prevent overlay of right graph edge.\n w = cardWidth/2 + (chartWidth - cx - cardSpacing/2);\n } else {\n w = cardWidth;\n }\n\n // Card width should be MIN_CARD_SIZE at least\n w = Math.max(w, MIN_CARD_SIZE);\n\n return w;\n }\n\n function getCardY(d) {\n return yScale(d.y) + chartTop - cardHeight - cardSpacing/2;\n }\n\n function getCardHeight(d) {\n let ys = yScale(d.y);\n let y = ys + chartTop - cardHeight - cardSpacing/2;\n let h = cardHeight;\n\n // Cut card height to prevent overlay\n if (y < chartTop) {\n h = ys - cardSpacing/2;\n } else if (ys > chartBottom) {\n h = chartBottom - y;\n } else if (y + cardHeight > chartBottom) {\n h = chartBottom - y;\n }\n\n // Height can't be more than chart height\n h = Math.min(h, chartHeight);\n // Card height should be MIN_CARD_SIZE at least\n h = Math.max(h, MIN_CARD_SIZE);\n\n return h;\n }\n\n function getCardColor(d) {\n if (panel.color.mode === 'opacity') {\n return panel.color.cardColor;\n } else if (panel.color.mode === 'spectrum') {\n return colorScale(d.value);\n } else if (panel.color.mode === 'discrete') {\n return ctrl.discreteHelper.getBucketColor(d.values);\n }\n }\n\n function getCardOpacity(d) {\n if (panel.nullPointMode === 'as empty' && d.value == null ) {\n return 0;\n }\n if (panel.color.mode === 'opacity') {\n return opacityScale(d.value);\n } else {\n return 1;\n }\n }\n\n function getCardStrokeWidth(d) {\n if (panel.color.mode === 'discrete') {\n return '1';\n }\n return '0';\n }\n\n /////////////////////////////\n // Selection and crosshair //\n /////////////////////////////\n\n // Shared crosshair and tooltip\n appEvents.on('graph-hover', event => {\n drawSharedCrosshair(event.pos);\n }, scope);\n\n appEvents.on('graph-hover-clear', () => {\n clearCrosshair();\n }, scope);\n\n function onMouseDown(event) {\n selection.active = true;\n selection.x1 = event.offsetX;\n\n mouseUpHandler = function() {\n onMouseUp();\n };\n\n $(document).one(\"mouseup\", mouseUpHandler);\n }\n\n function onMouseUp() {\n $(document).unbind(\"mouseup\", mouseUpHandler);\n mouseUpHandler = null;\n selection.active = false;\n\n let selectionRange = Math.abs(selection.x2 - selection.x1);\n if (selection.x2 >= 0 && selectionRange > MIN_SELECTION_WIDTH) {\n let timeFrom = xScale.invert(Math.min(selection.x1, selection.x2) - yAxisWidth - xGridSize/2);\n let timeTo = xScale.invert(Math.max(selection.x1, selection.x2) - yAxisWidth - xGridSize/2);\n\n ctrl.timeSrv.setTime({\n from: moment.utc(timeFrom),\n to: moment.utc(timeTo)\n });\n }\n\n clearSelection();\n }\n\n function onMouseLeave() {\n appEvents.emit('graph-hover-clear');\n clearCrosshair();\n }\n\n function onMouseMove(event) {\n if (!heatmap) { return; }\n\n if (selection.active) {\n // Clear crosshair and tooltip\n clearCrosshair();\n tooltip.destroy();\n\n selection.x2 = limitSelection(event.offsetX);\n drawSelection(selection.x1, selection.x2);\n } else {\n emitGraphHoverEvet(event);\n drawCrosshair(event.offsetX);\n tooltip.show(event); //, data);\n }\n }\n\n function emitGraphHoverEvet(event) {\n let x = xScale.invert(event.offsetX - yAxisWidth - xGridSize/2).valueOf();\n let y = yScale(event.offsetY);\n let pos = {\n pageX: event.pageX,\n pageY: event.pageY,\n x: x, x1: x,\n y: y, y1: y,\n panelRelY: null\n };\n\n // Set minimum offset to prevent showing legend from another panel\n pos.panelRelY = Math.max(event.offsetY / height, 0.001);\n\n // broadcast to other graph panels that we are hovering\n appEvents.emit('graph-hover', {pos: pos, panel: panel});\n }\n\n function limitSelection(x2) {\n x2 = Math.max(x2, yAxisWidth);\n x2 = Math.min(x2, chartWidth + yAxisWidth);\n return x2;\n }\n\n function drawSelection(posX1, posX2) {\n if (heatmap) {\n heatmap.selectAll(\".status-heatmap-selection\").remove();\n let selectionX = Math.min(posX1, posX2);\n let selectionWidth = Math.abs(posX1 - posX2);\n\n if (selectionWidth > MIN_SELECTION_WIDTH) {\n heatmap.append(\"rect\")\n .attr(\"class\", \"status-heatmap-selection\")\n .attr(\"x\", selectionX)\n .attr(\"width\", selectionWidth)\n .attr(\"y\", chartTop)\n .attr(\"height\", chartHeight);\n }\n }\n }\n\n function clearSelection() {\n selection.x1 = -1;\n selection.x2 = -1;\n\n if (heatmap) {\n heatmap.selectAll(\".status-heatmap-selection\").remove();\n }\n }\n\n function drawCrosshair(position) {\n if (heatmap) {\n heatmap.selectAll(\".status-heatmap-crosshair\").remove();\n\n let posX = position;\n posX = Math.max(posX, yAxisWidth);\n posX = Math.min(posX, chartWidth + yAxisWidth);\n\n heatmap.append(\"g\")\n .attr(\"class\", \"status-heatmap-crosshair\")\n .attr(\"transform\", \"translate(\" + posX + \",0)\")\n .append(\"line\")\n .attr(\"x1\", 1)\n .attr(\"y1\", chartTop)\n .attr(\"x2\", 1)\n .attr(\"y2\", chartBottom)\n .attr(\"stroke-width\", 1);\n }\n }\n\n // map time to X\n function drawSharedCrosshair(pos) {\n if (heatmap && ctrl.dashboard.graphTooltip !== 0) {\n let posX = xScale(pos.x) + yAxisWidth;\n drawCrosshair(posX);\n }\n }\n\n function clearCrosshair() {\n if (heatmap) {\n heatmap.selectAll(\".status-heatmap-crosshair\").remove();\n }\n }\n\n function render() {\n data = ctrl.data;\n panel = ctrl.panel;\n timeRange = ctrl.range;\n cardsData = ctrl.cardsData;\n\n if (!data || !cardsData || !setElementHeight()) {\n return;\n }\n\n // Draw default axes and return if no data\n if (_.isEmpty(cardsData.cards)) {\n addHeatmapCanvas();\n return;\n }\n\n addHeatmap();\n scope.yAxisWidth = yAxisWidth;\n scope.xAxisHeight = xAxisHeight;\n scope.chartHeight = chartHeight;\n scope.chartWidth = chartWidth;\n scope.chartTop = chartTop;\n }\n\n // Register selection listeners\n $heatmap.on(\"mousedown\", onMouseDown);\n $heatmap.on(\"mousemove\", onMouseMove);\n $heatmap.on(\"mouseleave\", onMouseLeave);\n}\n\nfunction grafanaTimeFormat(ticks, min, max) {\n if (min && max && ticks) {\n let range = max - min;\n let secPerTick = (range/ticks) / 1000;\n let oneDay = 86400000;\n let oneYear = 31536000000;\n\n if (secPerTick <= 45) {\n return \"%H:%M:%S\";\n }\n if (secPerTick <= 7200 || range <= oneDay) {\n return \"%H:%M\";\n }\n if (secPerTick <= 80000) {\n return \"%m/%d %H:%M\";\n }\n if (secPerTick <= 2419200 || range <= oneYear) {\n return \"%m/%d\";\n }\n return \"%Y-%m\";\n }\n\n return \"%H:%M\";\n}\n"]} \ No newline at end of file diff --git a/dist/status_heatmap_ctrl.js b/dist/status_heatmap_ctrl.js index f8c1955..257c8a1 100644 --- a/dist/status_heatmap_ctrl.js +++ b/dist/status_heatmap_ctrl.js @@ -97,6 +97,7 @@ System.register(['app/plugins/sdk', 'lodash', 'app/core/core', 'app/core/utils/k }, // how null points should be handled nullPointMode: 'as empty', + yAxisSort: 'metrics', highlightCards: true, useMax: true }; @@ -263,7 +264,6 @@ System.register(['app/plugins/sdk', 'lodash', 'app/core/core', 'app/core/utils/k // TODO add some logic for targets heirarchy cardsData.targets = _.keys(cardsData.targetIndex); - cardsData.targets.sort(); cardsData.yBucketSize = cardsData.targets.length; cardsData.xBucketSize = _.min(_.map(data, function (d) { return d.datapoints.length; diff --git a/dist/status_heatmap_ctrl.js.map b/dist/status_heatmap_ctrl.js.map index c51dd26..ae4480f 100644 --- a/dist/status_heatmap_ctrl.js.map +++ b/dist/status_heatmap_ctrl.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/status_heatmap_ctrl.js"],"names":["MetricsPanelCtrl","_","contextSrv","kbn","rendering","statusHeatmapOptionsEditor","ColorModeDiscrete","CANVAS","SVG","VALUE_INDEX","TIME_INDEX","panelDefaults","color","mode","cardColor","colorScale","exponent","colorScheme","defaultColor","thresholds","cards","cardMinWidth","cardSpacing","cardRound","xAxis","show","showWeekends","minBucketWidthToShowWeekends","showCrosshair","labelFormat","yAxis","tooltip","legend","data","unitFormat","decimals","nullPointMode","highlightCards","useMax","renderer","colorSchemes","name","value","invert","colorModes","opacityScales","StatusHeatmapCtrl","$scope","$injector","$rootScope","timeSrv","onRenderComplete","graph","chartWidth","renderingCompleted","calculateInterval","panelWidth","Math","ceil","$","window","width","panel","gridPos","w","max","minCardWidth","minSpacing","maxCardsCount","intervalMs","rangeMs","range","to","valueOf","from","discreteHelper","roundIntervalCeil","lowLimitMs","intervalOverride","interval","templateSrv","replace","scopedVars","datasource","slice","interval_to_ms","secondsToHms","onDataReceived","dataList","cardsData","convertToCards","render","onInitEditMode","addEditorTab","unitFormats","getUnitFormats","onRender","multipleValues","noColorDefined","updateCardsValuesHasColorInfo","onCardColorChange","newColor","onDataError","postRefresh","onEditorAddThreshold","push","onEditorRemoveThreshold","index","splice","onEditorAddThreeLights","link","scope","elem","attrs","ctrl","xBucketSize","yBucketSize","maxValue","minValue","length","targetIndex","i","ts","target","undefined","targets","keys","sort","min","map","d","datapoints","j","card","id","values","si","s","datapoint","x","y","defaultsDeep","dataWarnings","title","tip","events","on","templateUrl"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAASA,sB,kBAAAA,gB;;AACFC,O;;AACEC,gB,gBAAAA,U;;AACFC,S;;AAGAC,e;;AAICC,gC,mBAAAA,0B;;AACAC,uB,wBAAAA,iB;;;AAEFC,Y,GAAS,Q;AACTC,S,GAAM,K;AACNC,iB,GAAc,C;AACdC,gB,GAAa,C;AAEbC,mB,GAAgB;AACpB;AACA;AACAC,eAAO;AACLC,gBAAM,UADD;AAELC,qBAAW,SAFN;AAGLC,sBAAY,MAHP;AAILC,oBAAU,GAJL;AAKLC,uBAAa,mBALR;AAML;AACAC,wBAAc,SAPT;AAQLC,sBAAY,EARP,CAQU;AARV,SAHa;AAapBC,eAAO;AACLC,wBAAc,CADT;AAELC,uBAAa,CAFR;AAGLC,qBAAW;AAHN,SAba;AAkBpBC,eAAO;AACLC,gBAAM,IADD;AAELC,wBAAc,IAFT;AAGLC,wCAA8B,CAHzB;AAILC,yBAAe,IAJV;AAKLC,uBAAa;AALR,SAlBa;AAyBpBC,eAAO;AACLL,gBAAM,IADD;AAELG,yBAAe;AAFV,SAzBa;AA6BpBG,iBAAS;AACPN,gBAAM;AADC,SA7BW;AAgCpBO,gBAAQ;AACNP,gBAAM;AADA,SAhCY;AAmCpBQ,cAAM;AACJC,sBAAY,OADR;AAEJC,oBAAU;AAFN,SAnCc;AAuCpB;AACAC,uBAAe,UAxCK;AAyCpBC,wBAAgB,IAzCI;AA0CpBC,gBAAQ;AA1CY,O;AA6ChBC,c,GAAWhC,M;AAEXiC,kB,GAAe;AACnB;AACA,QAAEC,MAAM,UAAR,EAAoBC,OAAO,qBAA3B,EAAkDC,QAAQ,QAA1D,EAFmB,EAGnB,EAAEF,MAAM,QAAR,EAAkBC,OAAO,mBAAzB,EAA8CC,QAAQ,QAAtD,EAHmB,EAInB,EAAEF,MAAM,QAAR,EAAkBC,OAAO,mBAAzB,EAA8CC,QAAQ,QAAtD,EAJmB;;AAMnB;AACA,QAAEF,MAAM,OAAR,EAAiBC,OAAO,kBAAxB,EAA4CC,QAAQ,MAApD,EAPmB,EAQnB,EAAEF,MAAM,QAAR,EAAkBC,OAAO,mBAAzB,EAA8CC,QAAQ,MAAtD,EARmB,EASnB,EAAEF,MAAM,OAAR,EAAiBC,OAAO,kBAAxB,EAA4CC,QAAQ,MAApD,EATmB,EAUnB,EAAEF,MAAM,SAAR,EAAmBC,OAAO,oBAA1B,EAAgDC,QAAQ,MAAxD,EAVmB,EAWnB,EAAEF,MAAM,SAAR,EAAmBC,OAAO,oBAA1B,EAAgDC,QAAQ,MAAxD,EAXmB,EAYnB,EAAEF,MAAM,MAAR,EAAgBC,OAAO,iBAAvB,EAA0CC,QAAQ,MAAlD,EAZmB;;AAcnB;AACA,QAAEF,MAAM,MAAR,EAAgBC,OAAO,iBAAvB,EAA0CC,QAAQ,MAAlD,EAfmB,EAgBnB,EAAEF,MAAM,MAAR,EAAgBC,OAAO,iBAAvB,EAA0CC,QAAQ,MAAlD,EAhBmB,EAiBnB,EAAEF,MAAM,MAAR,EAAgBC,OAAO,iBAAvB,EAA0CC,QAAQ,MAAlD,EAjBmB,EAkBnB,EAAEF,MAAM,MAAR,EAAgBC,OAAO,iBAAvB,EAA0CC,QAAQ,MAAlD,EAlBmB,EAmBnB,EAAEF,MAAM,QAAR,EAAkBC,OAAO,mBAAzB,EAA8CC,QAAQ,MAAtD,EAnBmB,EAoBnB,EAAEF,MAAM,MAAR,EAAgBC,OAAO,iBAAvB,EAA0CC,QAAQ,MAAlD,EApBmB,EAqBnB,EAAEF,MAAM,MAAR,EAAgBC,OAAO,iBAAvB,EAA0CC,QAAQ,MAAlD,EArBmB,EAsBnB,EAAEF,MAAM,MAAR,EAAgBC,OAAO,iBAAvB,EAA0CC,QAAQ,MAAlD,EAtBmB,EAuBnB,EAAEF,MAAM,QAAR,EAAkBC,OAAO,mBAAzB,EAA8CC,QAAQ,MAAtD,EAvBmB,EAwBnB,EAAEF,MAAM,MAAR,EAAgBC,OAAO,iBAAvB,EAA0CC,QAAQ,MAAlD,EAxBmB,EAyBnB,EAAEF,MAAM,QAAR,EAAkBC,OAAO,mBAAzB,EAA8CC,QAAQ,MAAtD,EAzBmB,EA0BnB,EAAEF,MAAM,QAAR,EAAkBC,OAAO,mBAAzB,EAA8CC,QAAQ,MAAtD,EA1BmB,C;AA6BjBC,gB,GAAa,CAAC,SAAD,EAAY,UAAZ,EAAwB,UAAxB,C;AACbC,mB,GAAgB,CAAC,QAAD,EAAW,MAAX,C;;mCAEPC,iB;;;AAGX,mCAAYC,MAAZ,EAAoBC,SAApB,EAA+BC,UAA/B,EAA2CC,OAA3C,EAAoD;AAAA;;AAAA,4IAC5CH,MAD4C,EACpCC,SADoC;;AAAA,gBAuCpDG,gBAvCoD,GAuCjC,UAAClB,IAAD,EAAU;AAC3B,kBAAKmB,KAAL,CAAWC,UAAX,GAAwBpB,KAAKoB,UAA7B;AACA,kBAAKC,kBAAL;AACD,WA1CmD;;AAAA,gBA6CpDC,iBA7CoD,GA6ChC,YAAM;AACxB,gBAAIC,aAAaC,KAAKC,IAAL,CAAUC,EAAEC,MAAF,EAAUC,KAAV,MAAqB,MAAKC,KAAL,CAAWC,OAAX,CAAmBC,CAAnB,GAAuB,EAA5C,CAAV,CAAjB;AACA;AACA,gBAAIX,aAAapD,EAAEgE,GAAF,CAAM,CACnBT,aAAa,GADM,EAEnBA,aAAW,CAFQ,CAAN,CAAjB;;AAKA,gBAAIU,eAAe,MAAKJ,KAAL,CAAW1C,KAAX,CAAiBC,YAApC;AACA,gBAAI8C,aAAa,MAAKL,KAAL,CAAW1C,KAAX,CAAiBE,WAAlC;AACA,gBAAI8C,gBAAgBX,KAAKC,IAAL,CAAU,CAACL,aAAWa,YAAZ,KAA6BA,eAAeC,UAA5C,CAAV,CAApB;;AAEA,gBAAIE,mBAAJ;AACA,gBAAIC,UAAU,MAAKC,KAAL,CAAWC,EAAX,CAAcC,OAAd,KAA0B,MAAKF,KAAL,CAAWG,IAAX,CAAgBD,OAAhB,EAAxC;;AAEA;AACAJ,yBAAa,MAAKM,cAAL,CAAoBC,iBAApB,CAAsCN,UAAUF,aAAhD,CAAb;;AAEA;AACA,gBAAIS,aAAa,CAAjB,CAnBwB,CAmBJ;AACpB,gBAAIC,mBAAmB,MAAKhB,KAAL,CAAWiB,QAAlC;;AAEA;AACA,gBAAID,gBAAJ,EAAsB;AACpBA,iCAAmB,MAAKE,WAAL,CAAiBC,OAAjB,CAAyBH,gBAAzB,EAA2C,MAAKhB,KAAL,CAAWoB,UAAtD,CAAnB;AACD,aAFD,MAEO,IAAI,MAAKC,UAAL,IAAmB,MAAKA,UAAL,CAAgBJ,QAAvC,EAAiD;AACtDD,iCAAmB,MAAKK,UAAL,CAAgBJ,QAAnC;AACD;;AAED,gBAAID,gBAAJ,EAAsB;AACpB,kBAAIA,iBAAiB,CAAjB,MAAwB,GAA5B,EAAiC;AAC/BA,mCAAmBA,iBAAiBM,KAAjB,CAAuB,CAAvB,CAAnB;AACD;AACDP,2BAAa1E,IAAIkF,cAAJ,CAAmBP,gBAAnB,CAAb;AACD;;AAED,gBAAID,aAAaR,UAAjB,EAA6B;AAC3BA,2BAAaQ,UAAb;AACD;;AAED,kBAAKR,UAAL,GAAkBA,UAAlB;AACA,kBAAKU,QAAL,GAAgB5E,IAAImF,YAAJ,CAAiBjB,aAAa,IAA9B,CAAhB;AACD,WAvFmD;;AAAA,gBAyFpDkB,cAzFoD,GAyFnC,UAACC,QAAD,EAAc;AAC7B,kBAAKvD,IAAL,GAAiBuD,QAAjB;AACA,kBAAKC,SAAL,GAAiB,MAAKC,cAAL,CAAoB,MAAKzD,IAAzB,CAAjB;;AAEA,kBAAK0D,MAAL;AACD,WA9FmD;;AAAA,gBAgGpDC,cAhGoD,GAgGnC,YAAM;AACrB,kBAAKC,YAAL,CAAkB,SAAlB,EAA6BxF,0BAA7B,EAAyD,CAAzD;AACA,kBAAKyF,WAAL,GAAmB3F,IAAI4F,cAAJ,EAAnB;AACD,WAnGmD;;AAAA,gBAqGpDC,QArGoD,GAqGzC,YAAM;AACf,gBAAI,CAAC,MAAK/D,IAAV,EAAgB;AAAE;AAAS;;AAE3B,kBAAKgE,cAAL,GAAsB,KAAtB;AACA,gBAAI,CAAC,MAAKnC,KAAL,CAAWxB,MAAhB,EAAwB;AACtB,kBAAI,MAAKmD,SAAT,EAAoB;AAClB,sBAAKQ,cAAL,GAAsB,MAAKR,SAAL,CAAeQ,cAArC;AACD;AACF;;AAED,kBAAKC,cAAL,GAAsB,KAAtB;AACA,gBAAI,MAAKpC,KAAL,CAAWlD,KAAX,CAAiBC,IAAjB,KAA0B,UAA9B,EAA0C;AACxC,oBAAK8D,cAAL,CAAoBwB,6BAApB;AACA,kBAAI,MAAKV,SAAT,EAAoB;AAClB,sBAAKS,cAAL,GAAsB,MAAKT,SAAL,CAAeS,cAArC;AACD;AACF;AACF,WAtHmD;;AAAA,gBAwHpDE,iBAxHoD,GAwHhC,UAACC,QAAD,EAAc;AAChC,kBAAKvC,KAAL,CAAWlD,KAAX,CAAiBE,SAAjB,GAA6BuF,QAA7B;AACA,kBAAKV,MAAL;AACD,WA3HmD;;AAAA,gBA6HpDW,WA7HoD,GA6HtC,YAAM;AAClB,kBAAKrE,IAAL,GAAY,EAAZ;AACA,kBAAK0D,MAAL;AACD,WAhImD;;AAAA,gBAkIpDY,WAlIoD,GAkItC,YAAM;AAClB,kBAAKL,cAAL,GAAsB,KAAtB;AACD,WApImD;;AAAA,gBAsIpDM,oBAtIoD,GAsI7B,YAAM;AAC3B,kBAAK1C,KAAL,CAAWlD,KAAX,CAAiBO,UAAjB,CAA4BsF,IAA5B,CAAiC,EAAE7F,OAAO,MAAKkD,KAAL,CAAW5C,YAApB,EAAjC;AACA,kBAAKyE,MAAL;AACD,WAzImD;;AAAA,gBA2IpDe,uBA3IoD,GA2I1B,UAACC,KAAD,EAAW;AACnC,kBAAK7C,KAAL,CAAWlD,KAAX,CAAiBO,UAAjB,CAA4ByF,MAA5B,CAAmCD,KAAnC,EAA0C,CAA1C;AACA,kBAAKhB,MAAL;AACD,WA9ImD;;AAAA,gBAgJpDkB,sBAhJoD,GAgJ3B,YAAM;AAC7B,kBAAK/C,KAAL,CAAWlD,KAAX,CAAiBO,UAAjB,CAA4BsF,IAA5B,CAAiC,EAAC7F,OAAO,KAAR,EAAe8B,OAAO,CAAtB,EAAyBX,SAAS,OAAlC,EAAjC;AACA,kBAAK+B,KAAL,CAAWlD,KAAX,CAAiBO,UAAjB,CAA4BsF,IAA5B,CAAiC,EAAC7F,OAAO,QAAR,EAAkB8B,OAAO,CAAzB,EAA4BX,SAAS,SAArC,EAAjC;AACA,kBAAK+B,KAAL,CAAWlD,KAAX,CAAiBO,UAAjB,CAA4BsF,IAA5B,CAAiC,EAAC7F,OAAO,OAAR,EAAiB8B,OAAO,CAAxB,EAA2BX,SAAS,IAApC,EAAjC;AACA,kBAAK4D,MAAL;AACD,WArJmD;;AAAA,gBAuJpDmB,IAvJoD,GAuJ7C,UAACC,KAAD,EAAQC,IAAR,EAAcC,KAAd,EAAqBC,IAArB,EAA8B;AACnC9G,sBAAU2G,KAAV,EAAiBC,IAAjB,EAAuBC,KAAvB,EAA8BC,IAA9B;AACD,WAzJmD;;AAAA,gBA4JpDxB,cA5JoD,GA4JnC,UAACzD,IAAD,EAAU;AACzB,gBAAIwD,YAAY;AACdrE,qBAAO,EADO;AAEd+F,2BAAa,CAFC;AAGdC,2BAAa,CAHC;AAIdC,wBAAU,CAJI;AAKdC,wBAAU,CALI;AAMdrB,8BAAgB,KANF;AAOdC,8BAAgB;AAPF,aAAhB;;AAUA,gBAAI,CAACjE,IAAD,IAASA,KAAKsF,MAAL,IAAe,CAA5B,EAA+B;AAAE,qBAAO9B,SAAP;AAAkB;;AAEnD;AACAA,sBAAU+B,WAAV,GAAwB,EAAxB;AACA,iBAAK,IAAIC,IAAI,CAAb,EAAgBA,IAAIxF,KAAKsF,MAAzB,EAAiCE,GAAjC,EAAsC;AACpC,kBAAIC,KAAKzF,KAAKwF,CAAL,CAAT;AACA,kBAAIE,SAASD,GAAGC,MAAhB;AACA,kBAAIlC,UAAU+B,WAAV,CAAsBG,MAAtB,KAAiCC,SAArC,EAAgD;AAC9CnC,0BAAU+B,WAAV,CAAsBG,MAAtB,IAAgC,EAAhC;AACD;AACDlC,wBAAU+B,WAAV,CAAsBG,MAAtB,EAA8BlB,IAA9B,CAAmCgB,CAAnC;AACD;;AAED;AACAhC,sBAAUoC,OAAV,GAAoB5H,EAAE6H,IAAF,CAAOrC,UAAU+B,WAAjB,CAApB;AACA/B,sBAAUoC,OAAV,CAAkBE,IAAlB;AACAtC,sBAAU2B,WAAV,GAAwB3B,UAAUoC,OAAV,CAAkBN,MAA1C;AACA9B,sBAAU0B,WAAV,GAAwBlH,EAAE+H,GAAF,CAAM/H,EAAEgI,GAAF,CAAMhG,IAAN,EAAY;AAAA,qBAAKiG,EAAEC,UAAF,CAAaZ,MAAlB;AAAA,aAAZ,CAAN,CAAxB;;AAEA;AACA,iBAAI,IAAIE,KAAI,CAAZ,EAAeA,KAAIhC,UAAUoC,OAAV,CAAkBN,MAArC,EAA6CE,IAA7C,EAAkD;AAChD,kBAAIE,UAASlC,UAAUoC,OAAV,CAAkBJ,EAAlB,CAAb;;AAEA,mBAAK,IAAIW,IAAI,CAAb,EAAgBA,IAAI3C,UAAU0B,WAA9B,EAA2CiB,GAA3C,EAAgD;AAC9C,oBAAIC,OAAO;AACTC,sBAAIb,KAAEhC,UAAU0B,WAAZ,GAA0BiB,CADrB;AAETG,0BAAQ,EAFC;AAGTtC,kCAAgB,KAHP;AAITC,kCAAgB;AAJP,iBAAX;;AAOA;AACA,qBAAK,IAAIsC,KAAK,CAAd,EAAiBA,KAAK/C,UAAU+B,WAAV,CAAsBG,OAAtB,EAA8BJ,MAApD,EAA4DiB,IAA5D,EAAkE;AAChE,sBAAIC,IAAIxG,KAAKwD,UAAU+B,WAAV,CAAsBG,OAAtB,EAA8Ba,EAA9B,CAAL,CAAR;AACA,sBAAIE,YAAYD,EAAEN,UAAF,CAAaC,CAAb,CAAhB;AACA,sBAAIC,KAAKE,MAAL,CAAYhB,MAAZ,KAAuB,CAA3B,EAA8B;AAC5Bc,yBAAKM,CAAL,GAASD,UAAUhI,UAAV,CAAT;AACA2H,yBAAKO,CAAL,GAASH,EAAEd,MAAX;AACD;AACDU,uBAAKE,MAAL,CAAY9B,IAAZ,CAAiBiC,UAAUjI,WAAV,CAAjB;AACD;AACD4H,qBAAKf,QAAL,GAAgBrH,EAAE+H,GAAF,CAAMK,KAAKE,MAAX,CAAhB;AACAF,qBAAKhB,QAAL,GAAgBpH,EAAEgE,GAAF,CAAMoE,KAAKE,MAAX,CAAhB;AACA,oBAAIF,KAAKE,MAAL,CAAYhB,MAAZ,GAAqB,CAAzB,EAA4B;AAC1B9B,4BAAUQ,cAAV,GAA2B,IAA3B;AACAoC,uBAAKpC,cAAL,GAAsB,IAAtB;AACAoC,uBAAK3F,KAAL,GAAa2F,KAAKhB,QAAlB,CAH0B,CAGE;AAC7B,iBAJD,MAIO;AACLgB,uBAAK3F,KAAL,GAAa2F,KAAKhB,QAAlB,CADK,CACuB;AAC7B;;AAED,oBAAI5B,UAAU4B,QAAV,GAAqBgB,KAAKhB,QAA9B,EACE5B,UAAU4B,QAAV,GAAqBgB,KAAKhB,QAA1B;;AAEF,oBAAI5B,UAAU6B,QAAV,GAAqBe,KAAKf,QAA9B,EACE7B,UAAU6B,QAAV,GAAqBe,KAAKf,QAA1B;;AAEF7B,0BAAUrE,KAAV,CAAgBqF,IAAhB,CAAqB4B,IAArB;AACD;AACF;;AAED,mBAAO5C,SAAP;AACD,WArOmD;;AAElDxF,YAAE4I,YAAF,CAAe,MAAK/E,KAApB,EAA2BnD,aAA3B;;AAEA,gBAAKkC,aAAL,GAAqBA,aAArB;AACA,gBAAKD,UAAL,GAAkBA,UAAlB;AACA,gBAAKJ,YAAL,GAAoBA,YAApB;;AAEA;AACA,gBAAKY,KAAL,GAAa;AACX,0BAAe,CAAC;AADL,WAAb;;AAIA,gBAAK6C,cAAL,GAAsB,KAAtB;AACA,gBAAKC,cAAL,GAAsB,KAAtB;;AAEA,gBAAKvB,cAAL,GAAsB,IAAIrE,iBAAJ,CAAsByC,MAAtB,CAAtB;;AAEA,gBAAK+F,YAAL,GAAoB;AAClB,8BAAkB;AAChBC,qBAAO,qCADS;AAEhBC,mBAAK;AAFW,aADA;AAKlB,8BAAkB;AAChBD,qBAAO,yCADS;AAEhBC,mBAAK;AAFW;AALA,WAApB;;AAWA,gBAAKC,MAAL,CAAYC,EAAZ,CAAe,eAAf,EAAgC,MAAK3D,cAArC;AACA,gBAAK0D,MAAL,CAAYC,EAAZ,CAAe,oBAAf,EAAqC,MAAK3D,cAA1C;AACA,gBAAK0D,MAAL,CAAYC,EAAZ,CAAe,YAAf,EAA6B,MAAK5C,WAAlC;AACA,gBAAK2C,MAAL,CAAYC,EAAZ,CAAe,gBAAf,EAAiC,MAAKtD,cAAtC;AACA,gBAAKqD,MAAL,CAAYC,EAAZ,CAAe,QAAf,EAAyB,MAAKlD,QAA9B;AACA,gBAAKiD,MAAL,CAAYC,EAAZ,CAAe,SAAf,EAA0B,MAAK3C,WAA/B;AACA;AACA,gBAAK0C,MAAL,CAAYC,EAAZ,CAAe,iBAAf,EAAkC,MAAK/F,gBAAvC;AApCkD;AAqCnD;;AAOD;;;AA+GA;;;;QA9JqCnD,gB;;;;AAA1B8C,uB,CACJqG,W,GAAc,a","file":"status_heatmap_ctrl.js","sourcesContent":["import { MetricsPanelCtrl } from 'app/plugins/sdk';\nimport _ from 'lodash';\nimport { contextSrv } from 'app/core/core';\nimport kbn from 'app/core/utils/kbn';\n\nimport './color_legend';\nimport rendering from './rendering';\n// import aggregates, { aggregatesMap } from './aggregates';\n// import fragments, { fragmentsMap } from './fragments';\n// import { labelFormats } from './xAxisLabelFormats';\nimport {statusHeatmapOptionsEditor} from './options_editor';\nimport {ColorModeDiscrete} from \"./color_mode_discrete\";\n\nconst CANVAS = 'CANVAS';\nconst SVG = 'SVG';\nconst VALUE_INDEX = 0,\n TIME_INDEX = 1;\n\nconst panelDefaults = {\n // aggregate: aggregates.AVG,\n // fragment: fragments.HOUR,\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 cards: {\n cardMinWidth: 5,\n cardSpacing: 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 highlightCards: true,\n useMax: true\n};\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\nexport class StatusHeatmapCtrl extends MetricsPanelCtrl {\n static templateUrl = 'module.html';\n\n constructor($scope, $injector, $rootScope, timeSrv) {\n super($scope, $injector);\n _.defaultsDeep(this.panel, panelDefaults);\n\n this.opacityScales = opacityScales;\n this.colorModes = colorModes;\n this.colorSchemes = colorSchemes;\n\n // default graph width for discrete card width calculation\n this.graph = {\n \"chartWidth\" : -1\n };\n\n this.multipleValues = false;\n this.noColorDefined = false;\n\n this.discreteHelper = new ColorModeDiscrete($scope);\n\n this.dataWarnings = {\n \"noColorDefined\": {\n title: 'Data has value with undefined color',\n tip: 'Check metric values, color values or define a new color',\n },\n \"multipleValues\": {\n title: 'Data has multiple values for one target',\n tip: 'Change targets definitions or set \"use max value\"',\n }\n };\n\n this.events.on('data-received', this.onDataReceived);\n this.events.on('data-snapshot-load', this.onDataReceived);\n this.events.on('data-error', this.onDataError);\n this.events.on('init-edit-mode', this.onInitEditMode);\n this.events.on('render', this.onRender);\n this.events.on('refresh', this.postRefresh);\n // custom event from rendering.js\n this.events.on('render-complete', this.onRenderComplete);\n }\n\n onRenderComplete = (data) => {\n this.graph.chartWidth = data.chartWidth;\n this.renderingCompleted();\n };\n\n // override calculateInterval for discrete color mode\n calculateInterval = () => {\n let panelWidth = Math.ceil($(window).width() * (this.panel.gridPos.w / 24));\n // approximate chartWidth because y axis ticks not rendered yet on first data receive.\n let chartWidth = _.max([\n panelWidth - 200,\n panelWidth/2\n ]);\n\n let minCardWidth = this.panel.cards.cardMinWidth;\n let minSpacing = this.panel.cards.cardSpacing;\n let maxCardsCount = Math.ceil((chartWidth-minCardWidth) / (minCardWidth + minSpacing));\n\n let intervalMs;\n let rangeMs = this.range.to.valueOf() - this.range.from.valueOf();\n\n // this is minimal interval! kbn.round_interval will lower it.\n intervalMs = this.discreteHelper.roundIntervalCeil(rangeMs / maxCardsCount);\n\n // Calculate low limit of interval\n let lowLimitMs = 1; // 1 millisecond default low limit\n 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\n this.intervalMs = intervalMs;\n this.interval = kbn.secondsToHms(intervalMs / 1000);\n };\n\n onDataReceived = (dataList) => {\n this.data = dataList;\n this.cardsData = this.convertToCards(this.data);\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.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.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) => {\n this.panel.color.thresholds.splice(index, 1);\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 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 };\n\n if (!data || data.length == 0) { return cardsData;}\n\n // collect uniq targets and their indexes in data array\n cardsData.targetIndex = {};\n for (let i = 0; i < data.length; i++) {\n let ts = data[i];\n let target = ts.target;\n if (cardsData.targetIndex[target] == undefined) {\n cardsData.targetIndex[target] = []\n }\n cardsData.targetIndex[target].push(i);\n }\n\n // TODO add some logic for targets heirarchy\n cardsData.targets = _.keys(cardsData.targetIndex);\n cardsData.targets.sort();\n cardsData.yBucketSize = cardsData.targets.length;\n cardsData.xBucketSize = _.min(_.map(data, d => d.datapoints.length));\n\n // Collect all values for each bucket from datapoints with similar target.\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 = {\n id: i*cardsData.xBucketSize + j,\n values: [],\n multipleValues: false,\n noColorDefined: false,\n };\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 let datapoint = s.datapoints[j];\n if (card.values.length === 0) {\n card.x = datapoint[TIME_INDEX];\n card.y = s.target;\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 cardsData.cards.push(card);\n }\n }\n\n return cardsData;\n };\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../src/status_heatmap_ctrl.js"],"names":["MetricsPanelCtrl","_","contextSrv","kbn","rendering","statusHeatmapOptionsEditor","ColorModeDiscrete","CANVAS","SVG","VALUE_INDEX","TIME_INDEX","panelDefaults","color","mode","cardColor","colorScale","exponent","colorScheme","defaultColor","thresholds","cards","cardMinWidth","cardSpacing","cardRound","xAxis","show","showWeekends","minBucketWidthToShowWeekends","showCrosshair","labelFormat","yAxis","tooltip","legend","data","unitFormat","decimals","nullPointMode","yAxisSort","highlightCards","useMax","renderer","colorSchemes","name","value","invert","colorModes","opacityScales","StatusHeatmapCtrl","$scope","$injector","$rootScope","timeSrv","onRenderComplete","graph","chartWidth","renderingCompleted","calculateInterval","panelWidth","Math","ceil","$","window","width","panel","gridPos","w","max","minCardWidth","minSpacing","maxCardsCount","intervalMs","rangeMs","range","to","valueOf","from","discreteHelper","roundIntervalCeil","lowLimitMs","intervalOverride","interval","templateSrv","replace","scopedVars","datasource","slice","interval_to_ms","secondsToHms","onDataReceived","dataList","cardsData","convertToCards","render","onInitEditMode","addEditorTab","unitFormats","getUnitFormats","onRender","multipleValues","noColorDefined","updateCardsValuesHasColorInfo","onCardColorChange","newColor","onDataError","postRefresh","onEditorAddThreshold","push","onEditorRemoveThreshold","index","splice","onEditorAddThreeLights","link","scope","elem","attrs","ctrl","xBucketSize","yBucketSize","maxValue","minValue","length","targetIndex","i","ts","target","undefined","targets","keys","min","map","d","datapoints","j","card","id","values","si","s","datapoint","x","y","defaultsDeep","dataWarnings","title","tip","events","on","templateUrl"],"mappings":"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","file":"status_heatmap_ctrl.js","sourcesContent":["import { MetricsPanelCtrl } from 'app/plugins/sdk';\nimport _ from 'lodash';\nimport { contextSrv } from 'app/core/core';\nimport kbn from 'app/core/utils/kbn';\n\nimport './color_legend';\nimport rendering from './rendering';\n// import aggregates, { aggregatesMap } from './aggregates';\n// import fragments, { fragmentsMap } from './fragments';\n// import { labelFormats } from './xAxisLabelFormats';\nimport {statusHeatmapOptionsEditor} from './options_editor';\nimport {ColorModeDiscrete} from \"./color_mode_discrete\";\n\nconst CANVAS = 'CANVAS';\nconst SVG = 'SVG';\nconst VALUE_INDEX = 0,\n TIME_INDEX = 1;\n\nconst panelDefaults = {\n // aggregate: aggregates.AVG,\n // fragment: fragments.HOUR,\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 cards: {\n cardMinWidth: 5,\n cardSpacing: 2,\n cardRound: null\n },\n xAxis: {\n show: true,\n showWeekends: true,\n minBucketWidthToShowWeekends: 4,\n showCrosshair: true,\n labelFormat: '%a %m/%d'\n },\n yAxis: {\n show: true,\n showCrosshair: false\n },\n tooltip: {\n show: true\n },\n legend: {\n show: true\n },\n data: {\n unitFormat: 'short',\n decimals: null\n },\n // how null points should be handled\n nullPointMode: 'as empty',\n yAxisSort: 'metrics',\n highlightCards: true,\n useMax: true\n};\n\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\nexport class StatusHeatmapCtrl extends MetricsPanelCtrl {\n static templateUrl = 'module.html';\n\n constructor($scope, $injector, $rootScope, timeSrv) {\n super($scope, $injector);\n _.defaultsDeep(this.panel, panelDefaults);\n\n this.opacityScales = opacityScales;\n this.colorModes = colorModes;\n this.colorSchemes = colorSchemes;\n\n // default graph width for discrete card width calculation\n this.graph = {\n \"chartWidth\" : -1\n };\n\n this.multipleValues = false;\n this.noColorDefined = false;\n\n this.discreteHelper = new ColorModeDiscrete($scope);\n\n this.dataWarnings = {\n \"noColorDefined\": {\n title: 'Data has value with undefined color',\n tip: 'Check metric values, color values or define a new color',\n },\n \"multipleValues\": {\n title: 'Data has multiple values for one target',\n tip: 'Change targets definitions or set \"use max value\"',\n }\n };\n\n this.events.on('data-received', this.onDataReceived);\n this.events.on('data-snapshot-load', this.onDataReceived);\n this.events.on('data-error', this.onDataError);\n this.events.on('init-edit-mode', this.onInitEditMode);\n this.events.on('render', this.onRender);\n this.events.on('refresh', this.postRefresh);\n // custom event from rendering.js\n this.events.on('render-complete', this.onRenderComplete);\n }\n\n onRenderComplete = (data) => {\n this.graph.chartWidth = data.chartWidth;\n this.renderingCompleted();\n };\n\n // override calculateInterval for discrete color mode\n calculateInterval = () => {\n let panelWidth = Math.ceil($(window).width() * (this.panel.gridPos.w / 24));\n // approximate chartWidth because y axis ticks not rendered yet on first data receive.\n let chartWidth = _.max([\n panelWidth - 200,\n panelWidth/2\n ]);\n\n let minCardWidth = this.panel.cards.cardMinWidth;\n let minSpacing = this.panel.cards.cardSpacing;\n let maxCardsCount = Math.ceil((chartWidth-minCardWidth) / (minCardWidth + minSpacing));\n\n let intervalMs;\n let rangeMs = this.range.to.valueOf() - this.range.from.valueOf();\n\n // this is minimal interval! kbn.round_interval will lower it.\n intervalMs = this.discreteHelper.roundIntervalCeil(rangeMs / maxCardsCount);\n\n // Calculate low limit of interval\n let lowLimitMs = 1; // 1 millisecond default low limit\n 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\n this.intervalMs = intervalMs;\n this.interval = kbn.secondsToHms(intervalMs / 1000);\n };\n\n onDataReceived = (dataList) => {\n this.data = dataList;\n this.cardsData = this.convertToCards(this.data);\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.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.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) => {\n this.panel.color.thresholds.splice(index, 1);\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 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 };\n\n if (!data || data.length == 0) { return cardsData;}\n\n // collect uniq targets and their indexes in data array\n cardsData.targetIndex = {};\n for (let i = 0; i < data.length; i++) {\n let ts = data[i];\n let target = ts.target;\n if (cardsData.targetIndex[target] == undefined) {\n cardsData.targetIndex[target] = []\n }\n cardsData.targetIndex[target].push(i);\n }\n\n // TODO add some logic for targets heirarchy\n cardsData.targets = _.keys(cardsData.targetIndex);\n cardsData.yBucketSize = cardsData.targets.length;\n cardsData.xBucketSize = _.min(_.map(data, d => d.datapoints.length));\n\n // Collect all values for each bucket from datapoints with similar target.\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 = {\n id: i*cardsData.xBucketSize + j,\n values: [],\n multipleValues: false,\n noColorDefined: false,\n };\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 let datapoint = s.datapoints[j];\n if (card.values.length === 0) {\n card.x = datapoint[TIME_INDEX];\n card.y = s.target;\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 cardsData.cards.push(card);\n }\n }\n\n return cardsData;\n };\n}\n"]} \ No newline at end of file diff --git a/src/partials/options_editor.html b/src/partials/options_editor.html index f41f099..14c6a72 100644 --- a/src/partials/options_editor.html +++ b/src/partials/options_editor.html @@ -118,7 +118,16 @@ label="Show tooltip" checked="ctrl.panel.tooltip.show" on-change="ctrl.render()"> -
+
+ +
+ +
+
+
Bucket
diff --git a/src/rendering.js b/src/rendering.js index 6097efc..b4cfbb0 100644 --- a/src/rendering.js +++ b/src/rendering.js @@ -129,9 +129,10 @@ export default function link(scope, elem, attrs, ctrl) { function getYScale(ticks) { let range = []; let step = chartHeight / ticks.length; - range.push(chartHeight); + // svg has y=0 on the top, so top card should have a minimal value in range + range.push(step); for (let i = 1; i < ticks.length; i++) { - range.push(chartHeight - step * i); + range.push(step * (i+1)); } return d3.scaleOrdinal() .domain(ticks) @@ -142,9 +143,10 @@ export default function link(scope, elem, attrs, ctrl) { function getYAxisScale(ticks) { let range = []; let step = chartHeight / ticks.length; - range.push(chartHeight - yOffset); + // svg has y=0 on the top, so top tick should have a minimal value in range + range.push(yOffset); for (let i = 1; i < ticks.length; i++) { - range.push(chartHeight - step * i - yOffset); + range.push(step * i + yOffset); } return d3.scaleOrdinal() .domain(ticks) @@ -159,6 +161,12 @@ export default function link(scope, elem, attrs, ctrl) { ticks = ['']; } + if (panel.yAxisSort == 'a → z') { + ticks.sort((a, b) => a.localeCompare(b, 'en', {ignorePunctuation: false, numeric: true})); + } else if (panel.yAxisSort == 'z → a') { + ticks.sort((b, a) => a.localeCompare(b, 'en', {ignorePunctuation: false, numeric: true})); + } + let yAxisScale = getYAxisScale(ticks); scope.yScale = yScale = getYScale(ticks); diff --git a/src/status_heatmap_ctrl.js b/src/status_heatmap_ctrl.js index 9835080..9a242a8 100644 --- a/src/status_heatmap_ctrl.js +++ b/src/status_heatmap_ctrl.js @@ -57,6 +57,7 @@ const panelDefaults = { }, // how null points should be handled nullPointMode: 'as empty', + yAxisSort: 'metrics', highlightCards: true, useMax: true }; @@ -280,7 +281,6 @@ export class StatusHeatmapCtrl extends MetricsPanelCtrl { // TODO add some logic for targets heirarchy cardsData.targets = _.keys(cardsData.targetIndex); - cardsData.targets.sort(); cardsData.yBucketSize = cardsData.targets.length; cardsData.xBucketSize = _.min(_.map(data, d => d.datapoints.length));