Color for bucket with multiple values is determined by color mode
+
+
+
+
@@ -194,6 +197,7 @@
+
@@ -212,105 +216,4 @@
-
-
Filtering
-
-
-
-
-
-
-
-
URL
-
-
- Insert the url to navigate
-
-
-
-
-
-
-
-
-
-
-
-
- Add new URL
-
-
-
-
- Remove all URLs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Specify an URL (relative or absolute)
-
- Use special variables to specify cell values:
-
- $series_label name of the serie
-
- $(template.name) name of the templated to be replaced
-
- $time append &from...&to on the URL
-
- $series_extra use extraSeries value to use it on URL
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/dist/partials/tooltip_editor.html b/dist/partials/tooltip_editor.html
new file mode 100644
index 0000000..350b136
--- /dev/null
+++ b/dist/partials/tooltip_editor.html
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
Items
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Add URL
+
+
+
+
+ Remove all
+
+
+
+
diff --git a/dist/plugin.json b/dist/plugin.json
index ba97fe0..679c3f8 100644
--- a/dist/plugin.json
+++ b/dist/plugin.json
@@ -17,7 +17,6 @@
"links": [
{"name": "Github", "url": "https://github.com/flant/grafana-statusmap"},
{"name": "MIT Licence", "url": "https://github.com/flant/grafana-statusmap/blob/master/LICENSE"}
-
],
"screenshots": [
{"name": "Panel with light theme", "path": "img/flant-statusmap-panel.png"},
diff --git a/dist/rendering.js b/dist/rendering.js
index 0c77222..fa8a733 100644
--- a/dist/rendering.js
+++ b/dist/rendering.js
@@ -1,9 +1,9 @@
"use strict";
-System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/core", "d3", "./libs/d3-scale-chromatic/index", "./tooltip", "./tooltipextraseries", "./annotations"], function (_export, _context) {
+System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/core", "d3", "./libs/d3-scale-chromatic/index", "./tooltip", "./annotations"], function (_export, _context) {
"use strict";
- var _, $, moment, kbn, appEvents, contextSrv, d3, d3ScaleChromatic, StatusmapTooltip, StatusHeatmapTooltipExtraSeries, AnnotationTooltip, MIN_CARD_SIZE, CARD_H_SPACING, CARD_V_SPACING, CARD_ROUND, DATA_RANGE_WIDING_FACTOR, DEFAULT_X_TICK_SIZE_PX, DEFAULT_Y_TICK_SIZE_PX, X_AXIS_TICK_PADDING, Y_AXIS_TICK_PADDING, MIN_SELECTION_WIDTH, Statusmap, StatusmapRenderer;
+ var _, $, moment, kbn, appEvents, contextSrv, d3, d3ScaleChromatic, StatusmapTooltip, AnnotationTooltip, MIN_CARD_SIZE, CARD_H_SPACING, CARD_V_SPACING, CARD_ROUND, DATA_RANGE_WIDING_FACTOR, DEFAULT_X_TICK_SIZE_PX, DEFAULT_Y_TICK_SIZE_PX, X_AXIS_TICK_PADDING, Y_AXIS_TICK_PADDING, MIN_SELECTION_WIDTH, Statusmap, StatusmapRenderer;
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
@@ -66,8 +66,6 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c
d3ScaleChromatic = _libsD3ScaleChromaticIndex;
}, function (_tooltip) {
StatusmapTooltip = _tooltip.StatusmapTooltip;
- }, function (_tooltipextraseries) {
- StatusHeatmapTooltipExtraSeries = _tooltipextraseries.StatusHeatmapTooltipExtraSeries;
}, function (_annotations) {
AnnotationTooltip = _annotations.AnnotationTooltip;
}],
@@ -156,8 +154,6 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c
_defineProperty(this, "tooltip", void 0);
- _defineProperty(this, "tooltipExtraSeries", void 0);
-
_defineProperty(this, "annotationTooltip", void 0);
_defineProperty(this, "heatmap", void 0);
@@ -177,7 +173,6 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c
// $heatmap is JQuery object, but heatmap is D3
this.$heatmap = this.elem.find('.statusmap-panel');
this.tooltip = new StatusmapTooltip(this.$heatmap, this.scope);
- this.tooltipExtraSeries = new StatusHeatmapTooltipExtraSeries(this.$heatmap, this.scope);
this.annotationTooltip = new AnnotationTooltip(this.$heatmap, this.scope);
this.yOffset = 0;
this.selection = {
@@ -410,9 +405,11 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c
if (this.heatmap) {
this.heatmap.remove();
- }
+ } // Insert svg as a first child into heatmap_elem
+ // as the frozen tooltip moving logiс assumes that tooltip is the last child.
- this.heatmap = d3.select(heatmap_elem).append("svg").attr("width", this.width).attr("height", this.height);
+
+ this.heatmap = d3.select(heatmap_elem).insert("svg", ":first-child").attr("width", this.width).attr("height", this.height);
this.chartHeight = this.height - this.margin.top - this.margin.bottom;
this.chartTop = this.margin.top;
this.chartBottom = this.chartTop + this.chartHeight;
@@ -513,10 +510,7 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c
var colorScheme = _.find(this.ctrl.colorSchemes, {
value: this.panel.color.colorScheme
- }); // if (!colorScheme) {
- //
- // }
-
+ });
var colorInterpolator = d3ScaleChromatic[colorScheme.value];
var colorScaleInverted = colorScheme.invert === 'always' || colorScheme.invert === 'dark' && !contextSrv.user.lightTheme;
@@ -618,28 +612,28 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c
}
}, {
key: "getCardColor",
- value: function getCardColor(b) {
+ value: function getCardColor(bucket) {
if (this.panel.color.mode === 'opacity') {
return this.panel.color.cardColor;
} else if (this.panel.color.mode === 'spectrum') {
- return this.colorScale(b.value);
+ return this.colorScale(bucket.value);
} else if (this.panel.color.mode === 'discrete') {
if (this.panel.seriesFilterIndex != null && this.panel.seriesFilterIndex != -1) {
- return this.ctrl.discreteExtraSeries.getBucketColorSingle(d.values[this.panel.seriesFilterIndex]);
+ return this.ctrl.discreteExtraSeries.getBucketColorSingle(bucket.values[this.panel.seriesFilterIndex]);
} else {
- return this.ctrl.discreteExtraSeries.getBucketColor(b.values);
+ return this.ctrl.discreteExtraSeries.getBucketColor(bucket.values);
}
}
}
}, {
key: "getCardOpacity",
- value: function getCardOpacity(b) {
- if (this.panel.nullPointMode === 'as empty' && b.value == null) {
+ value: function getCardOpacity(bucket) {
+ if (this.panel.nullPointMode === 'as empty' && bucket.value == null) {
return 0;
}
if (this.panel.color.mode === 'opacity') {
- return this.opacityScale(b.value);
+ return this.opacityScale(bucket.value);
} else {
return 1;
}
@@ -705,14 +699,7 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c
key: "onMouseLeave",
value: function onMouseLeave(e) {
appEvents.emit('graph-hover-clear');
- this.clearCrosshair(); //annotationTooltip.destroy();
-
- if (e.relatedTarget) {
- if (e.relatedTarget.className == "statusmap-tooltip-extraseries graph-tooltip grafana-tooltip" || e.relatedTarget.className == "graph-tooltip-time") {} else {
- this.tooltipExtraSeries.destroy();
- }
- }
-
+ this.clearCrosshair();
this.annotationTooltip.destroy();
}
}, {
@@ -738,13 +725,13 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c
this.tooltip.show(event);
this.annotationTooltip.show(event);
}
- }
+ } // TODO emit an event and move logic to panelCtrl
+
}, {
key: "onMouseClick",
- value: function onMouseClick(event) {
- this.tooltipExtraSeries.show(event);
-
- if (this.ctrl.panel.usingUrl) {
+ value: function onMouseClick(e) {
+ if (this.ctrl.panel.tooltip.freezeOnClick) {
+ this.tooltip.showFrozen(e);
this.tooltip.destroy();
}
}
diff --git a/dist/rendering.js.map b/dist/rendering.js.map
index 20e0b69..eb146ab 100644
--- a/dist/rendering.js.map
+++ b/dist/rendering.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/rendering.ts"],"names":["rendering","scope","elem","attrs","ctrl","StatusmapRenderer","grafanaTimeFormat","ticks","min","max","range","secPerTick","oneDay","oneYear","_","$","moment","kbn","appEvents","contextSrv","d3","d3ScaleChromatic","StatusmapTooltip","StatusHeatmapTooltipExtraSeries","AnnotationTooltip","MIN_CARD_SIZE","CARD_H_SPACING","CARD_V_SPACING","CARD_ROUND","DATA_RANGE_WIDING_FACTOR","DEFAULT_X_TICK_SIZE_PX","DEFAULT_Y_TICK_SIZE_PX","X_AXIS_TICK_PADDING","Y_AXIS_TICK_PADDING","MIN_SELECTION_WIDTH","Statusmap","from","to","$heatmap","find","tooltip","tooltipExtraSeries","annotationTooltip","yOffset","selection","active","x1","x2","padding","left","right","top","bottom","margin","events","on","onRender","bind","tickValueFormatter","onGraphHover","onGraphHoverClear","onMouseDown","onMouseMove","onMouseLeave","onMouseClick","clearCrosshair","event","drawSharedCrosshair","pos","render","renderingCompleted","height","panel","row","isString","parseInt","replace","legend","show","css","e","axisText","selectAll","nodes","maxTextWidth","map","text","getBBox","width","Math","ceil","axisLine","select","empty","axisLinePosition","parseFloat","attr","canvasWidth","xScale","scaleTime","domain","timeRange","xGridSize","chartWidth","grafanaTimeFormatter","timeFormat","dashboardTimeZone","dashboard","getTimezone","utcFormat","xAxis","axisBottom","tickFormat","tickPadding","tickSize","chartHeight","posY","chartTop","posX","yAxisWidth","heatmap","append","call","remove","step","length","push","i","scaleOrdinal","bucketMatrix","targets","yAxisSort","sort","a","b","localeCompare","ignorePunctuation","numeric","yAxisScale","getYAxisScale","yScale","getYScale","yAxis","axisLeft","tickValues","tickSizeInner","getYAxisWidth","tickInterval","y_widing","dataRangeWidingFactor","y_min","y_max","floor","decimals","scaledDecimals","format","value","valueFormats","heatmap_elem","chartBottom","cardHSpacing","cards","cardVSpacing","cardRound","yGridSize","cardHeight","addYAxis","xBucketSize","cardWidth","addXAxis","xAxisHeight","getXAxisHeight","style","maxValue","color","minValue","mode","colorScale","getColorScale","setOpacityScale","data","enter","target","buckets","id","xid","yLabel","getCardX","getCardWidth","getCardY","getCardHeight","isEmpty","getCardColor","getCardOpacity","$cards","mouseOverBucket","highlightCard","resetCardHighLight","_renderAnnotations","emit","highlightColor","darker","strokeColor","brighter","current_card","originalFillColor","toString","colorScheme","colorSchemes","colorInterpolator","colorScaleInverted","invert","user","lightTheme","start","end","scaleSequential","opacityScale","scaleLinear","scalePow","exponent","x","rightX","relTo","rangeMs","cx","w","cutted_width","ys","y","h","cardColor","seriesFilterIndex","discreteExtraSeries","getBucketColorSingle","d","values","getBucketColor","nullPointMode","elemOffset","offset","clientX","clientY","getEventOffset","mouseUpHandler","onMouseUp","document","one","unbind","selectionRange","abs","timeFrom","timeTo","timeSrv","setTime","utc","clearSelection","relatedTarget","className","destroy","limitSelection","offsetX","drawSelection","emitGraphHoverEvent","drawCrosshair","usingUrl","valueOf","pageX","pageY","y1","panelRelY","offsetY","posX1","posX2","selectionX","selectionWidth","position","graphTooltip","setElementHeight","addStatusmapCanvas","noDatapoints","addStatusmap","annotations","annoData","time","source","anno","iconColor","join","$ticks","mouseOverAnnotationTick"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport $ from 'jquery';\nimport moment from 'moment';\nimport kbn from 'app/core/utils/kbn';\nimport {appEvents, contextSrv} from 'app/core/core';\nimport {tickStep, getScaledDecimals, getFlotTickSize} from 'app/core/utils/ticks';\nimport * as d3 from 'd3';\nimport * as d3ScaleChromatic from './libs/d3-scale-chromatic/index';\nimport {StatusmapTooltip} from './tooltip';\nimport {StatusHeatmapTooltipExtraSeries} from './tooltipextraseries';\nimport {AnnotationTooltip} from './annotations';\nimport { Bucket, BucketMatrix } from './statusmap_data';\nimport { StatusHeatmapCtrl } from './module';\n\nlet MIN_CARD_SIZE = 5,\n CARD_H_SPACING = 2,\n CARD_V_SPACING = 2,\n CARD_ROUND = 0,\n DATA_RANGE_WIDING_FACTOR = 1.2,\n DEFAULT_X_TICK_SIZE_PX = 100,\n DEFAULT_Y_TICK_SIZE_PX = 50,\n X_AXIS_TICK_PADDING = 10,\n Y_AXIS_TICK_PADDING = 5,\n MIN_SELECTION_WIDTH = 2;\n\nexport default function rendering(scope: any, elem: any, attrs: any, ctrl: any) {\n return new StatusmapRenderer(scope, elem, attrs, ctrl);\n}\n\nclass Statusmap {\n $svg: any;\n svg: any;\n bucketMatrix: BucketMatrix;\n\n timeRange: {from: number, to: number} = {from:0, to:0};\n \n constructor() {\n\n }\n}\n\nexport class StatusmapRenderer {\n width: number = 0;\n height: number = 0;\n yScale: any;\n xScale: any;\n chartWidth: number = 0;\n chartHeight: number = 0;\n chartTop: number = 0;\n chartBottom: number = 0;\n yAxisWidth: number = 0;\n xAxisHeight: number = 0;\n cardVSpacing: number = 0;\n cardHSpacing: number = 0;\n cardRound: number = 0;\n cardWidth: number = 0;\n cardHeight: number = 0;\n colorScale: any;\n opacityScale: any;\n mouseUpHandler: any;\n xGridSize: number = 0;\n yGridSize: number = 0;\n\n bucketMatrix: BucketMatrix;\n panel: any;\n $heatmap: any;\n tooltip: StatusmapTooltip;\n tooltipExtraSeries:StatusHeatmapTooltipExtraSeries;\n annotationTooltip: AnnotationTooltip;\n heatmap: any;\n timeRange: any;\n\n yOffset: number;\n selection: any;\n padding: any;\n margin: any;\n dataRangeWidingFactor: number = DATA_RANGE_WIDING_FACTOR;\n\n constructor(private scope: any, private elem: any, attrs: any, private ctrl: StatusHeatmapCtrl) {\n // $heatmap is JQuery object, but heatmap is D3\n this.$heatmap = this.elem.find('.statusmap-panel');\n this.tooltip = new StatusmapTooltip(this.$heatmap, this.scope);\n this.tooltipExtraSeries = new StatusHeatmapTooltipExtraSeries(this.$heatmap, this.scope);\n this.annotationTooltip = new AnnotationTooltip(this.$heatmap, this.scope);\n\n this.yOffset = 0;\n\n this.selection = {\n active: false,\n x1: -1,\n x2: -1,\n };\n\n this.padding = { left: 0, right: 0, top: 0, bottom: 0 };\n this.margin = { left: 25, right: 15, top: 10, bottom: 20 };\n\n this.ctrl.events.on('render', this.onRender.bind(this));\n\n this.ctrl.tickValueFormatter = this.tickValueFormatter.bind(this);\n\n /////////////////////////////\n // Selection and crosshair //\n /////////////////////////////\n\n // Shared crosshair and tooltip this.empty = true;\n\n appEvents.on('graph-hover', this.onGraphHover.bind(this), this.scope);\n\n appEvents.on('graph-hover-clear', this.onGraphHoverClear.bind(this), this.scope);\n\n // Register selection listeners\n this.$heatmap.on('mousedown', this.onMouseDown.bind(this));\n this.$heatmap.on('mousemove', this.onMouseMove.bind(this));\n this.$heatmap.on('mouseleave', this.onMouseLeave.bind(this));\n this.$heatmap.on('click', this.onMouseClick.bind(this));\n }\n\n onGraphHoverClear() {\n this.clearCrosshair();\n }\n\n onGraphHover(event: { pos: any }) {\n this.drawSharedCrosshair(event.pos);\n }\n\n onRender() {\n this.render();\n this.ctrl.renderingCompleted();\n }\n\n\n setElementHeight(): boolean {\n try {\n var height = this.ctrl.height || this.panel.height || this.ctrl.row.height;\n if (_.isString(height)) {\n height = parseInt(height.replace('px', ''), 10);\n }\n\n height -= this.panel.legend.show ? 32 : 10; // bottom padding and space for legend. Change margin in .status-heatmap-color-legend !\n\n this.$heatmap.css('height', height + 'px');\n\n return true;\n } catch (e) { // IE throws errors sometimes\n return false;\n }\n }\n\n getYAxisWidth(elem: any): number {\n const axisText = elem.selectAll(\".axis-y text\").nodes();\n const maxTextWidth = _.max(_.map(axisText, text => {\n // Use SVG getBBox method\n return text.getBBox().width;\n }));\n\n return Math.ceil(maxTextWidth);\n }\n\n getXAxisHeight(elem: any): number {\n let axisLine = elem.select(\".axis-x line\");\n if (!axisLine.empty()) {\n let axisLinePosition = parseFloat(elem.select(\".axis-x line\").attr(\"y2\"));\n let canvasWidth = parseFloat(elem.attr(\"height\"));\n return canvasWidth - axisLinePosition;\n } else {\n // Default height\n return 30;\n }\n }\n\n addXAxis() {\n // Scale timestamps to cards centers\n //this.scope.xScale = this.xScale = d3.scaleTime()\n // .domain([this.timeRange.from, this.timeRange.to])\n // .range([this.xGridSize/2, this.chartWidth-this.xGridSize/2]);\n // Buckets without the most recent\n this.scope.xScale = this.xScale = d3.scaleTime()\n .domain([this.timeRange.from, this.timeRange.to])\n .range([this.xGridSize/2, this.chartWidth-this.xGridSize/2]);\n\n let ticks = this.chartWidth / DEFAULT_X_TICK_SIZE_PX;\n let grafanaTimeFormatter = grafanaTimeFormat(ticks, this.timeRange.from, this.timeRange.to);\n let timeFormat;\n let dashboardTimeZone = this.ctrl.dashboard.getTimezone();\n if (dashboardTimeZone === 'utc') {\n timeFormat = d3.utcFormat(grafanaTimeFormatter);\n } else {\n timeFormat = d3.timeFormat(grafanaTimeFormatter);\n }\n\n let xAxis = d3\n .axisBottom(this.xScale)\n .ticks(ticks)\n .tickFormat(timeFormat)\n .tickPadding(X_AXIS_TICK_PADDING)\n .tickSize(this.chartHeight);\n\n let posY = this.chartTop; // this.margin.top !\n let posX = this.yAxisWidth;\n\n this.heatmap.append(\"g\")\n .attr(\"class\", \"axis axis-x\")\n .attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\")\n .call(xAxis);\n\n // Remove horizontal line in the top of axis labels (called domain in d3)\n this.heatmap\n .select(\".axis-x\")\n .select(\".domain\")\n .remove();\n }\n\n // divide chart height by ticks for cards drawing\n getYScale(ticks: any[]) {\n let range:any[] = [];\n let step = this.chartHeight / ticks.length;\n // svg has y=0 on the top, so top card should have a minimal value in range\n range.push(step);\n for (let i = 1; i < ticks.length; i++) {\n range.push(step * (i+1));\n }\n return d3.scaleOrdinal()\n .domain(ticks)\n .range(range);\n }\n\n // divide chart height by ticks with offset for ticks drawing\n getYAxisScale(ticks: any[]) {\n let range:any[] = [];\n let step = this.chartHeight / ticks.length;\n // svg has y=0 on the top, so top tick should have a minimal value in range\n range.push(this.yOffset);\n for (let i = 1; i < ticks.length; i++) {\n range.push(step * i + this.yOffset);\n }\n return d3.scaleOrdinal()\n .domain(ticks)\n .range(range);\n }\n\n addYAxis() {\n let ticks = this.bucketMatrix.targets;\n\n if (this.panel.yAxisSort == 'a → z') {\n ticks.sort((a, b) => a.localeCompare(b, 'en', {ignorePunctuation: false, numeric: true}));\n } else if (this.panel.yAxisSort == 'z → a') {\n ticks.sort((b, a) => a.localeCompare(b, 'en', {ignorePunctuation: false, numeric: true}));\n }\n\n let yAxisScale = this.getYAxisScale(ticks);\n this.scope.yScale = this.yScale = this.getYScale(ticks);\n\n let yAxis = d3\n .axisLeft(yAxisScale)\n .tickValues(ticks)\n .tickSizeInner(0 - this.width)\n .tickPadding(Y_AXIS_TICK_PADDING);\n\n this.heatmap\n .append(\"g\")\n .attr(\"class\", \"axis axis-y\")\n .call(yAxis);\n\n // Calculate Y axis width first, then move axis into visible area\n let posY = this.margin.top;\n let posX = this.getYAxisWidth(this.heatmap) + Y_AXIS_TICK_PADDING;\n this.heatmap.select(\".axis-y\").attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\");\n\n // Remove vertical line in the right of axis labels (called domain in d3)\n this.heatmap.select(\".axis-y\").select(\".domain\").remove();\n this.heatmap.select(\".axis-y\").selectAll(\".tick line\").remove();\n }\n\n // Wide Y values range and adjust to bucket size\n wideYAxisRange(min: number, max: number, tickInterval: number) {\n let y_widing = (max * (this.dataRangeWidingFactor - 1) - min * (this.dataRangeWidingFactor - 1)) / 2;\n let y_min, y_max;\n\n if (tickInterval === 0) {\n y_max = max * this.dataRangeWidingFactor;\n y_min = min - min * (this.dataRangeWidingFactor - 1);\n tickInterval = (y_max - y_min) / 2;\n } else {\n y_max = Math.ceil((max + y_widing) / tickInterval) * tickInterval;\n y_min = Math.floor((min - y_widing) / tickInterval) * tickInterval;\n }\n\n // Don't wide axis below 0 if all values are positive\n if (min >= 0 && y_min < 0) {\n y_min = 0;\n }\n\n return {y_min, y_max};\n }\n\n tickValueFormatter(decimals, scaledDecimals = null) {\n let format = this.panel.yAxis.format;\n return function(value) {\n return kbn.valueFormats[format](value, decimals, scaledDecimals);\n };\n }\n\n // Create svg element, add axes and\n // calculate sizes for cards drawing\n addStatusmapCanvas() {\n let heatmap_elem = this.$heatmap[0];\n\n this.width = Math.floor(this.$heatmap.width()) - this.padding.right;\n this.height = Math.floor(this.$heatmap.height()) - this.padding.bottom;\n\n if (this.heatmap) {\n this.heatmap.remove();\n }\n\n this.heatmap = d3.select(heatmap_elem)\n .append(\"svg\")\n .attr(\"width\", this.width)\n .attr(\"height\", this.height);\n\n this.chartHeight = this.height - this.margin.top - this.margin.bottom;\n this.chartTop = this.margin.top;\n this.chartBottom = this.chartTop + this.chartHeight;\n\n this.cardHSpacing = this.panel.cards.cardHSpacing !== null ? this.panel.cards.cardHSpacing : CARD_H_SPACING;\n this.cardVSpacing = this.panel.cards.cardVSpacing !== null ? this.panel.cards.cardVSpacing : CARD_V_SPACING;\n this.cardRound = this.panel.cards.cardRound !== null ? this.panel.cards.cardRound : CARD_ROUND;\n\n // calculate yOffset for YAxis\n this.yGridSize = this.chartHeight;\n if (this.bucketMatrix.targets.length > 0) {\n this.yGridSize = Math.floor(this.chartHeight / this.bucketMatrix.targets.length);\n }\n this.cardHeight = this.yGridSize ? this.yGridSize - this.cardVSpacing : 0;\n this.yOffset = this.cardHeight / 2;\n\n this.addYAxis();\n\n this.yAxisWidth = this.getYAxisWidth(this.heatmap) + Y_AXIS_TICK_PADDING;\n this.chartWidth = this.width - this.yAxisWidth - this.margin.right;\n\n // TODO allow per-y cardWidth!\n // we need to fill chartWidth with xBucketSize cards.\n this.xGridSize = this.chartWidth / (this.bucketMatrix.xBucketSize+1);\n this.cardWidth = this.xGridSize - this.cardHSpacing;\n\n this.addXAxis();\n this.xAxisHeight = this.getXAxisHeight(this.heatmap);\n\n if (!this.panel.yAxis.show) {\n this.heatmap.select(\".axis-y\").selectAll(\"line\").style(\"opacity\", 0);\n }\n\n if (!this.panel.xAxis.show) {\n this.heatmap.select(\".axis-x\").selectAll(\"line\").style(\"opacity\", 0);\n }\n }\n\n addStatusmap():void {\n let maxValue = this.panel.color.max || this.bucketMatrix.maxValue;\n let minValue = this.panel.color.min || this.bucketMatrix.minValue;\n\n if (this.panel.color.mode !== 'discrete') {\n this.colorScale = this.getColorScale(maxValue, minValue);\n }\n this.setOpacityScale(maxValue);\n\n // Draw cards from buckets.\n this.heatmap.selectAll(\".statusmap-cards-row\").data(this.bucketMatrix.targets)\n .enter()\n .selectAll(\".statustmap-card\")\n .data((target:string) => this.bucketMatrix.buckets[target])\n .enter()\n .append(\"rect\")\n .attr(\"cardId\", (b:Bucket) => b.id)\n .attr(\"xid\", (b:Bucket) => b.xid)\n .attr(\"yid\", (b:Bucket) => b.yLabel)\n .attr(\"x\", this.getCardX.bind(this))\n .attr(\"width\", this.getCardWidth.bind(this))\n .attr(\"y\", this.getCardY.bind(this))\n .attr(\"height\", this.getCardHeight.bind(this))\n .attr(\"rx\", this.cardRound)\n .attr(\"ry\", this.cardRound)\n .attr(\"class\", (b:Bucket) => b.isEmpty() ? \"empty-card\" : \"bordered statusmap-card\")\n .style(\"fill\", this.getCardColor.bind(this))\n .style(\"stroke\", this.getCardColor.bind(this))\n .style(\"stroke-width\", 0)\n //.style(\"stroke-width\", getCardStrokeWidth)\n //.style(\"stroke-dasharray\", \"3,3\")\n .style(\"opacity\", this.getCardOpacity.bind(this));\n\n // Set mouse events on cards.\n let $cards = this.$heatmap.find(\".statusmap-card + .bordered\");\n $cards\n .on(\"mouseenter\", (event) => {\n this.tooltip.mouseOverBucket = true;\n this.highlightCard(event);\n })\n .on(\"mouseleave\", (event) => {\n this.tooltip.mouseOverBucket = false;\n this.resetCardHighLight(event);\n });\n\n this._renderAnnotations();\n\n this.ctrl.events.emit('render-complete', {\n \"chartWidth\": this.chartWidth\n });\n }\n\n highlightCard(event) {\n const color = d3.select(event.target).style(\"fill\");\n const highlightColor = d3.color(color).darker(2);\n const strokeColor = d3.color(color).brighter(4);\n const current_card = d3.select(event.target);\n this.tooltip.originalFillColor = color;\n current_card\n .style(\"fill\", highlightColor.toString())\n .style(\"stroke\", strokeColor.toString())\n .style(\"stroke-width\", 1);\n }\n\n resetCardHighLight(event) {\n d3.select(event.target)\n .style(\"fill\", this.tooltip.originalFillColor)\n .style(\"stroke\", this.tooltip.originalFillColor)\n .style(\"stroke-width\", 0);\n }\n\n getColorScale(maxValue, minValue = 0) {\n let colorScheme = _.find(this.ctrl.colorSchemes, {value: this.panel.color.colorScheme});\n // if (!colorScheme) {\n //\n // }\n let colorInterpolator = d3ScaleChromatic[colorScheme.value];\n let colorScaleInverted = colorScheme.invert === 'always' ||\n (colorScheme.invert === 'dark' && !contextSrv.user.lightTheme);\n\n if (maxValue == minValue)\n maxValue = minValue + 1;\n\n let start = colorScaleInverted ? maxValue : minValue;\n let end = colorScaleInverted ? minValue : maxValue;\n\n return d3.scaleSequential(colorInterpolator).domain([start, end]);\n }\n\n setOpacityScale(maxValue) {\n if (this.panel.color.colorScale === 'linear') {\n this.opacityScale = d3.scaleLinear()\n .domain([0, maxValue])\n .range([0, 1]);\n } else if (this.panel.color.colorScale === 'sqrt') {\n this.opacityScale = d3.scalePow().exponent(this.panel.color.exponent)\n .domain([0, maxValue])\n .range([0, 1]);\n }\n }\n\n getCardX(b: Bucket) {\n let x;\n // cx is the center of the card. Card should be placed to the left.\n //let cx = this.xScale(d.x);\n let rightX = (b.relTo / this.bucketMatrix.rangeMs) * this.chartWidth;\n let cx = rightX - this.cardWidth/2;\n\n if (cx - this.cardWidth/2 < 0) {\n x = this.yAxisWidth + this.cardHSpacing/2;\n } else {\n x = this.yAxisWidth + cx - this.cardWidth/2;\n }\n\n return x;\n }\n\n // xScale returns card center. Adjust cardWidth in case of overlaping.\n getCardWidth(b: Bucket) {\n //return 20;\n let w;\n\n let rightX = (b.relTo / this.bucketMatrix.rangeMs) * this.chartWidth;\n let cx = rightX - this.cardWidth/2;\n //let cx = this.xScale(d.x);\n\n if (cx < this.cardWidth/2) {\n // Center should not exceed half of card.\n // Cut card to the left to prevent overlay of y axis.\n let cutted_width = (cx - this.cardHSpacing/2) + this.cardWidth/2;\n w = cutted_width > 0 ? cutted_width : 0;\n } else if (this.chartWidth - cx < this.cardWidth/2) {\n // Cut card to the right to prevent overlay of right graph edge.\n w = this.cardWidth/2 + (this.chartWidth - cx - this.cardHSpacing/2);\n } else {\n w = this.cardWidth;\n }\n\n // Card width should be MIN_CARD_SIZE at least\n w = Math.max(w, MIN_CARD_SIZE);\n\n if (this.cardHSpacing == 0) {\n w = w+1;\n }\n\n return w;\n }\n\n // Top y for card.\n // yScale gives ???\n // \n getCardY(b: Bucket) {\n return this.yScale(b.yLabel) + this.chartTop - this.cardHeight - this.cardVSpacing/2;\n }\n\n getCardHeight(b: Bucket) {\n //return 20;\n let ys = this.yScale(b.yLabel);\n let y = ys + this.chartTop - this.cardHeight - this.cardVSpacing/2;\n let h = this.cardHeight;\n\n // Cut card height to prevent overlay\n if (y < this.chartTop) {\n h = ys - this.cardVSpacing/2;\n } else if (ys > this.chartBottom) {\n h = this.chartBottom - y;\n } else if (y + this.cardHeight > this.chartBottom) {\n h = this.chartBottom - y;\n }\n\n // Height can't be more than chart height\n h = Math.min(h, this.chartHeight);\n // Card height should be MIN_CARD_SIZE at least\n h = Math.max(h, MIN_CARD_SIZE);\n\n if (this.cardVSpacing == 0) {\n h = h+1\n }\n\n return h;\n }\n\n getCardColor(b: Bucket) {\n if (this.panel.color.mode === 'opacity') {\n return this.panel.color.cardColor;\n } else if (this.panel.color.mode === 'spectrum') {\n return this.colorScale(b.value);\n } else if (this.panel.color.mode === 'discrete') {\n if (this.panel.seriesFilterIndex != null && this.panel.seriesFilterIndex != -1) {\n return this.ctrl.discreteExtraSeries.getBucketColorSingle(d.values[this.panel.seriesFilterIndex]);\n } else {\n return this.ctrl.discreteExtraSeries.getBucketColor(b.values);\n }\n }\n }\n\n getCardOpacity(b: Bucket) {\n if (this.panel.nullPointMode === 'as empty' && b.value == null ) {\n return 0;\n }\n if (this.panel.color.mode === 'opacity') {\n return this.opacityScale(b.value);\n } else {\n return 1;\n }\n }\n\n getCardStrokeWidth(b: Bucket) {\n if (this.panel.color.mode === 'discrete') {\n return '1';\n }\n return '0';\n }\n\n\n /////////////////////////////\n // Selection and crosshair //\n /////////////////////////////\n\n getEventOffset(event) {\n const elemOffset = this.$heatmap.offset();\n const x = Math.floor(event.clientX - elemOffset.left);\n const y = Math.floor(event.clientY - elemOffset.top);\n return { x, y };\n }\n\n onMouseDown(event) {\n const offset = this.getEventOffset(event);\n this.selection.active = true;\n this.selection.x1 = offset.x;\n\n this.mouseUpHandler = () => {\n this.onMouseUp();\n };\n\n $(document).one(\"mouseup\", this.mouseUpHandler.bind(this));\n }\n\n onMouseUp() {\n $(document).unbind(\"mouseup\", this.mouseUpHandler.bind(this));\n this.mouseUpHandler = null;\n this.selection.active = false;\n\n let selectionRange = Math.abs(this.selection.x2 - this.selection.x1);\n if (this.selection.x2 >= 0 && selectionRange > MIN_SELECTION_WIDTH) {\n let timeFrom = this.xScale.invert(Math.min(this.selection.x1, this.selection.x2) - this.yAxisWidth - this.xGridSize/2);\n let timeTo = this.xScale.invert(Math.max(this.selection.x1, this.selection.x2) - this.yAxisWidth - this.xGridSize/2);\n\n this.ctrl.timeSrv.setTime({\n from: moment.utc(timeFrom),\n to: moment.utc(timeTo)\n });\n }\n\n this.clearSelection();\n }\n\n onMouseLeave(e) {\n appEvents.emit('graph-hover-clear');\n this.clearCrosshair();\n //annotationTooltip.destroy();\n if (e.relatedTarget) {\n if (e.relatedTarget.className == \"statusmap-tooltip-extraseries graph-tooltip grafana-tooltip\" || e.relatedTarget.className == \"graph-tooltip-time\" ) {\n } else {\n this.tooltipExtraSeries.destroy();\n }\n }\n this.annotationTooltip.destroy(); \n }\n\n onMouseMove(event) {\n if (!this.heatmap) { return; }\n\n const offset = this.getEventOffset(event);\n if (this.selection.active) {\n // Clear crosshair and tooltip\n this.clearCrosshair();\n this.tooltip.destroy();\n this.annotationTooltip.destroy();\n\n this.selection.x2 = this.limitSelection(event.offsetX);\n this.drawSelection(this.selection.x1, this.selection.x2);\n } else {\n //const pos = this.getEventPos(event, offset);\n this.emitGraphHoverEvent(event);\n this.drawCrosshair(offset.x);\n this.tooltip.show(event);\n this.annotationTooltip.show(event);\n }\n }\n\n public onMouseClick(event) {\n this.tooltipExtraSeries.show(event)\n if (this.ctrl.panel.usingUrl) {\n this.tooltip.destroy();\n }\n }\n\n getEventPos(event, offset) {\n const x = this.xScale.invert(offset.x - this.yAxisWidth).valueOf();\n const y = this.yScale.invert(offset.y - this.chartTop);\n const pos = {\n pageX: event.pageX,\n pageY: event.pageY,\n x: x,\n x1: x,\n y: y,\n y1: y,\n panelRelY: null,\n offset,\n };\n\n return pos;\n }\n\n emitGraphHoverEvent(event) {\n let x = this.xScale.invert(event.offsetX - this.yAxisWidth - this.xGridSize/2).valueOf();\n let y = this.yScale(event.offsetY);\n let pos = {\n pageX: event.pageX,\n pageY: event.pageY,\n x: x, x1: x,\n y: y, y1: y,\n panelRelY: 0\n };\n\n // Set minimum offset to prevent showing legend from another panel\n pos.panelRelY = Math.max(event.offsetY / this.height, 0.001);\n\n // broadcast to other graph panels that we are hovering\n appEvents.emit('graph-hover', {pos: pos, panel: this.panel});\n }\n\n limitSelection(x2) {\n x2 = Math.max(x2, this.yAxisWidth);\n x2 = Math.min(x2, this.chartWidth + this.yAxisWidth);\n return x2;\n }\n\n drawSelection(posX1, posX2) {\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-selection\").remove();\n let selectionX = Math.min(posX1, posX2);\n let selectionWidth = Math.abs(posX1 - posX2);\n\n if (selectionWidth > MIN_SELECTION_WIDTH) {\n this.heatmap.append(\"rect\")\n .attr(\"class\", \"status-heatmap-selection\")\n .attr(\"x\", selectionX)\n .attr(\"width\", selectionWidth)\n .attr(\"y\", this.chartTop)\n .attr(\"height\", this.chartHeight);\n }\n }\n }\n\n clearSelection() {\n this.selection.x1 = -1;\n this.selection.x2 = -1;\n\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-selection\").remove();\n }\n }\n\n\n drawCrosshair(position) {\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-crosshair\").remove();\n\n let posX = position;\n posX = Math.max(posX, this.yAxisWidth);\n posX = Math.min(posX, this.chartWidth + this.yAxisWidth);\n\n this.heatmap.append(\"g\")\n .attr(\"class\", \"status-heatmap-crosshair\")\n .attr(\"transform\", \"translate(\" + posX + \",0)\")\n .append(\"line\")\n .attr(\"x1\", 1)\n .attr(\"y1\", this.chartTop)\n .attr(\"x2\", 1)\n .attr(\"y2\", this.chartBottom)\n .attr(\"stroke-width\", 1);\n }\n }\n\n // map time to X\n drawSharedCrosshair(pos) {\n if (this.heatmap && this.ctrl.dashboard.graphTooltip !== 0) {\n const posX = this.xScale(pos.x) + this.yAxisWidth;\n this.drawCrosshair(posX);\n }\n }\n\n clearCrosshair() {\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-crosshair\").remove();\n }\n }\n\n\n render() {\n this.panel = this.ctrl.panel;\n this.timeRange = this.ctrl.range;\n this.bucketMatrix = this.ctrl.bucketMatrix;\n\n if (!this.bucketMatrix || !this.setElementHeight()) {\n return;\n }\n\n // Draw default axes and return if no data\n this.addStatusmapCanvas();\n if (this.bucketMatrix.noDatapoints) {\n return;\n }\n\n this.addStatusmap();\n this.scope.yAxisWidth = this.yAxisWidth;\n this.scope.xAxisHeight = this.xAxisHeight;\n this.scope.chartHeight = this.chartHeight;\n this.scope.chartWidth = this.chartWidth;\n this.scope.chartTop = this.chartTop;\n }\n\n _renderAnnotations() {\n if (!this.ctrl.annotations || this.ctrl.annotations.length == 0) {\n return;\n }\n\n if (!this.heatmap) {\n return;\n }\n\n\n\n let annoData = _.map(this.ctrl.annotations, (d,i) => ({\"x\": Math.floor(this.yAxisWidth + this.xScale(d.time)), \"id\":i, \"anno\": d.source}));\n\n //({\"ctrl_annotations\": this.ctrl.annotations, \"annoData\": annoData});\n\n let anno = this.heatmap\n .append(\"g\")\n .attr(\"class\", \"statusmap-annotations\")\n .attr(\"transform\", \"translate(0.5,0)\")\n .selectAll(\".statusmap-annotations\")\n .data(annoData)\n .enter().append(\"g\")\n ;\n anno.append(\"line\")\n //.attr(\"class\", \"statusmap-annotation-tick\")\n .attr(\"x1\", d => d.x)\n .attr(\"y1\", this.chartTop)\n .attr(\"x2\", d => d.x)\n .attr(\"y2\", this.chartBottom)\n .style(\"stroke\", d => d.anno.iconColor)\n .style(\"stroke-width\", 1)\n .style(\"stroke-dasharray\", \"3,3\")\n ;\n anno.append(\"polygon\")\n .attr(\"points\", d => [[d.x, this.chartBottom+1], [d.x-5, this.chartBottom+6], [d.x+5, this.chartBottom+6]].join(\" \"))\n .style(\"stroke-width\", 0)\n .style(\"fill\", d => d.anno.iconColor)\n ;\n // Polygons didn't fire mouseevents\n anno.append(\"rect\")\n .attr(\"x\", d => d.x-5)\n .attr(\"width\", 10)\n .attr(\"y\", this.chartBottom+1)\n .attr(\"height\", 5)\n .attr(\"class\", \"statusmap-annotation-tick\")\n .attr(\"annoId\", d => d.id)\n .style(\"opacity\", 0)\n ;\n\n let $ticks = this.$heatmap.find(\".statusmap-annotation-tick\");\n $ticks\n .on(\"mouseenter\", (event) => {\n this.annotationTooltip.mouseOverAnnotationTick = true;\n })\n .on(\"mouseleave\", (event) => {\n this.annotationTooltip.mouseOverAnnotationTick = false;\n });\n }\n}\n\nfunction grafanaTimeFormat(ticks, min, max) {\n if (min && max && ticks) {\n let range = max - min;\n let secPerTick = (range/ticks) / 1000;\n let oneDay = 86400000;\n let oneYear = 31536000000;\n\n if (secPerTick <= 45) {\n return \"%H:%M:%S\";\n }\n if (secPerTick <= 7200 || range <= oneDay) {\n return \"%H:%M\";\n }\n if (secPerTick <= 80000) {\n return \"%m/%d %H:%M\";\n }\n if (secPerTick <= 2419200 || range <= oneYear) {\n return \"%m/%d\";\n }\n return \"%Y-%m\";\n }\n\n return \"%H:%M\";\n}\n"],"file":"rendering.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/rendering.ts"],"names":["rendering","scope","elem","attrs","ctrl","StatusmapRenderer","grafanaTimeFormat","ticks","min","max","range","secPerTick","oneDay","oneYear","_","$","moment","kbn","appEvents","contextSrv","d3","d3ScaleChromatic","StatusmapTooltip","AnnotationTooltip","MIN_CARD_SIZE","CARD_H_SPACING","CARD_V_SPACING","CARD_ROUND","DATA_RANGE_WIDING_FACTOR","DEFAULT_X_TICK_SIZE_PX","DEFAULT_Y_TICK_SIZE_PX","X_AXIS_TICK_PADDING","Y_AXIS_TICK_PADDING","MIN_SELECTION_WIDTH","Statusmap","from","to","$heatmap","find","tooltip","annotationTooltip","yOffset","selection","active","x1","x2","padding","left","right","top","bottom","margin","events","on","onRender","bind","tickValueFormatter","onGraphHover","onGraphHoverClear","onMouseDown","onMouseMove","onMouseLeave","onMouseClick","clearCrosshair","event","drawSharedCrosshair","pos","render","renderingCompleted","height","panel","row","isString","parseInt","replace","legend","show","css","e","axisText","selectAll","nodes","maxTextWidth","map","text","getBBox","width","Math","ceil","axisLine","select","empty","axisLinePosition","parseFloat","attr","canvasWidth","xScale","scaleTime","domain","timeRange","xGridSize","chartWidth","grafanaTimeFormatter","timeFormat","dashboardTimeZone","dashboard","getTimezone","utcFormat","xAxis","axisBottom","tickFormat","tickPadding","tickSize","chartHeight","posY","chartTop","posX","yAxisWidth","heatmap","append","call","remove","step","length","push","i","scaleOrdinal","bucketMatrix","targets","yAxisSort","sort","a","b","localeCompare","ignorePunctuation","numeric","yAxisScale","getYAxisScale","yScale","getYScale","yAxis","axisLeft","tickValues","tickSizeInner","getYAxisWidth","tickInterval","y_widing","dataRangeWidingFactor","y_min","y_max","floor","decimals","scaledDecimals","format","value","valueFormats","heatmap_elem","insert","chartBottom","cardHSpacing","cards","cardVSpacing","cardRound","yGridSize","cardHeight","addYAxis","xBucketSize","cardWidth","addXAxis","xAxisHeight","getXAxisHeight","style","maxValue","color","minValue","mode","colorScale","getColorScale","setOpacityScale","data","enter","target","buckets","id","xid","yLabel","getCardX","getCardWidth","getCardY","getCardHeight","isEmpty","getCardColor","getCardOpacity","$cards","mouseOverBucket","highlightCard","resetCardHighLight","_renderAnnotations","emit","highlightColor","darker","strokeColor","brighter","current_card","originalFillColor","toString","colorScheme","colorSchemes","colorInterpolator","colorScaleInverted","invert","user","lightTheme","start","end","scaleSequential","opacityScale","scaleLinear","scalePow","exponent","x","rightX","relTo","rangeMs","cx","w","cutted_width","ys","y","h","bucket","cardColor","seriesFilterIndex","discreteExtraSeries","getBucketColorSingle","values","getBucketColor","nullPointMode","elemOffset","offset","clientX","clientY","getEventOffset","mouseUpHandler","onMouseUp","document","one","unbind","selectionRange","abs","timeFrom","timeTo","timeSrv","setTime","utc","clearSelection","destroy","limitSelection","offsetX","drawSelection","emitGraphHoverEvent","drawCrosshair","freezeOnClick","showFrozen","valueOf","pageX","pageY","y1","panelRelY","offsetY","posX1","posX2","selectionX","selectionWidth","position","graphTooltip","setElementHeight","addStatusmapCanvas","noDatapoints","addStatusmap","annotations","annoData","d","time","source","anno","iconColor","join","$ticks","mouseOverAnnotationTick"],"mappings":";;;;;;;;;;;;;;;AAuBe,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;;AAqyBD,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;;qBA9zBuBb,S;;;;AAvBjBc,MAAAA,C;;AACAC,MAAAA,C;;AACAC,MAAAA,M;;AACAC,MAAAA,G;;AACCC,MAAAA,S,gBAAAA,S;AAAWC,MAAAA,U,gBAAAA,U;;AACPC,MAAAA,E;;AACAC,MAAAA,gB;;AACJC,MAAAA,gB,YAAAA,gB;;AACAC,MAAAA,iB,gBAAAA,iB;;;AAIJC,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;;AAMpBC,MAAAA,S,GAOJ,qBAAc;AAAA;;AAAA;;AAAA;;AAAA;;AAAA,2CAF0B;AAACC,UAAAA,IAAI,EAAC,CAAN;AAASC,UAAAA,EAAE,EAAC;AAAZ,SAE1B;AAEb,O;;mCAGU/B,iB;;;AAoCX,mCAAoBJ,KAApB,EAAwCC,IAAxC,EAAmDC,KAAnD,EAAuEC,IAAvE,EAAgG;AAAA;;AAAA,eAA5EH,KAA4E,GAA5EA,KAA4E;AAAA,eAAxDC,IAAwD,GAAxDA,IAAwD;AAAA,eAAzBE,IAAyB,GAAzBA,IAAyB;;AAAA,yCAnChF,CAmCgF;;AAAA,0CAlC/E,CAkC+E;;AAAA;;AAAA;;AAAA,8CA/B3E,CA+B2E;;AAAA,+CA9B1E,CA8B0E;;AAAA,4CA7B7E,CA6B6E;;AAAA,+CA5B1E,CA4B0E;;AAAA,8CA3B3E,CA2B2E;;AAAA,+CA1B1E,CA0B0E;;AAAA,gDAzBzE,CAyByE;;AAAA,gDAxBzE,CAwByE;;AAAA,6CAvB5E,CAuB4E;;AAAA,6CAtB5E,CAsB4E;;AAAA,8CArB3E,CAqB2E;;AAAA;;AAAA;;AAAA;;AAAA,6CAjB5E,CAiB4E;;AAAA,6CAhB5E,CAgB4E;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA,yDAFhEwB,wBAEgE;;AAC9F;AACA,eAAKS,QAAL,GAAgB,KAAKnC,IAAL,CAAUoC,IAAV,CAAe,kBAAf,CAAhB;AACA,eAAKC,OAAL,GAAe,IAAIjB,gBAAJ,CAAqB,KAAKe,QAA1B,EAAoC,KAAKpC,KAAzC,CAAf;AACA,eAAKuC,iBAAL,GAAyB,IAAIjB,iBAAJ,CAAsB,KAAKc,QAA3B,EAAqC,KAAKpC,KAA1C,CAAzB;AAEA,eAAKwC,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,eAAK9C,IAAL,CAAUgD,MAAV,CAAiBC,EAAjB,CAAoB,QAApB,EAA8B,KAAKC,QAAL,CAAcC,IAAd,CAAmB,IAAnB,CAA9B;AAEA,eAAKnD,IAAL,CAAUoD,kBAAV,GAA+B,KAAKA,kBAAL,CAAwBD,IAAxB,CAA6B,IAA7B,CAA/B,CAnB8F,CAqB9F;AACA;AACA;AAEA;;AAEArC,UAAAA,SAAS,CAACmC,EAAV,CAAa,aAAb,EAA4B,KAAKI,YAAL,CAAkBF,IAAlB,CAAuB,IAAvB,CAA5B,EAA0D,KAAKtD,KAA/D;AAEAiB,UAAAA,SAAS,CAACmC,EAAV,CAAa,mBAAb,EAAkC,KAAKK,iBAAL,CAAuBH,IAAvB,CAA4B,IAA5B,CAAlC,EAAqE,KAAKtD,KAA1E,EA7B8F,CA+B9F;;AACA,eAAKoC,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;AACA,eAAKlB,QAAL,CAAcgB,EAAd,CAAiB,OAAjB,EAA0B,KAAKS,YAAL,CAAkBP,IAAlB,CAAuB,IAAvB,CAA1B;AACD;;;;8CAEmB;AAClB,iBAAKQ,cAAL;AACD;;;uCAEYC,K,EAAqB;AAChC,iBAAKC,mBAAL,CAAyBD,KAAK,CAACE,GAA/B;AACD;;;qCAEU;AACT,iBAAKC,MAAL;AACA,iBAAK/D,IAAL,CAAUgE,kBAAV;AACD;;;6CAG2B;AAC1B,gBAAI;AACF,kBAAIC,MAAM,GAAG,KAAKjE,IAAL,CAAUiE,MAAV,IAAoB,KAAKC,KAAL,CAAWD,MAA/B,IAAyC,KAAKjE,IAAL,CAAUmE,GAAV,CAAcF,MAApE;;AACA,kBAAIvD,CAAC,CAAC0D,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,mBAAKvC,QAAL,CAAcwC,GAAd,CAAkB,QAAlB,EAA4BR,MAAM,GAAG,IAArC;AAEA,qBAAO,IAAP;AACD,aAXD,CAWE,OAAOS,CAAP,EAAU;AAAE;AACZ,qBAAO,KAAP;AACD;AACF;;;wCAEa5E,I,EAAmB;AAC/B,gBAAM6E,QAAQ,GAAG7E,IAAI,CAAC8E,SAAL,CAAe,cAAf,EAA+BC,KAA/B,EAAjB;;AACA,gBAAMC,YAAY,GAAGpE,CAAC,CAACL,GAAF,CAAMK,CAAC,CAACqE,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;;;yCAEchF,I,EAAmB;AAChC,gBAAIuF,QAAQ,GAAGvF,IAAI,CAACwF,MAAL,CAAY,cAAZ,CAAf;;AACA,gBAAI,CAACD,QAAQ,CAACE,KAAT,EAAL,EAAuB;AACrB,kBAAIC,gBAAgB,GAAGC,UAAU,CAAC3F,IAAI,CAACwF,MAAL,CAAY,cAAZ,EAA4BI,IAA5B,CAAiC,IAAjC,CAAD,CAAjC;AACA,kBAAIC,WAAW,GAAGF,UAAU,CAAC3F,IAAI,CAAC4F,IAAL,CAAU,QAAV,CAAD,CAA5B;AACA,qBAAOC,WAAW,GAAGH,gBAArB;AACD,aAJD,MAIO;AACL;AACA,qBAAO,EAAP;AACD;AACF;;;qCAEU;AACT;AACA;AACA;AACA;AACA;AACA,iBAAK3F,KAAL,CAAW+F,MAAX,GAAoB,KAAKA,MAAL,GAAc5E,EAAE,CAAC6E,SAAH,GAC7BC,MAD6B,CACtB,CAAC,KAAKC,SAAL,CAAehE,IAAhB,EAAsB,KAAKgE,SAAL,CAAe/D,EAArC,CADsB,EAE7B1B,KAF6B,CAEvB,CAAC,KAAK0F,SAAL,GAAe,CAAhB,EAAmB,KAAKC,UAAL,GAAgB,KAAKD,SAAL,GAAe,CAAlD,CAFuB,CAAlC;AAIA,gBAAI7F,KAAK,GAAG,KAAK8F,UAAL,GAAkBxE,sBAA9B;AACA,gBAAIyE,oBAAoB,GAAGhG,iBAAiB,CAACC,KAAD,EAAQ,KAAK4F,SAAL,CAAehE,IAAvB,EAA6B,KAAKgE,SAAL,CAAe/D,EAA5C,CAA5C;AACA,gBAAImE,UAAJ;AACA,gBAAIC,iBAAiB,GAAG,KAAKpG,IAAL,CAAUqG,SAAV,CAAoBC,WAApB,EAAxB;;AACA,gBAAIF,iBAAiB,KAAK,KAA1B,EAAiC;AAC/BD,cAAAA,UAAU,GAAGnF,EAAE,CAACuF,SAAH,CAAaL,oBAAb,CAAb;AACD,aAFD,MAEO;AACLC,cAAAA,UAAU,GAAGnF,EAAE,CAACmF,UAAH,CAAcD,oBAAd,CAAb;AACD;;AAED,gBAAIM,KAAK,GAAGxF,EAAE,CACTyF,UADO,CACI,KAAKb,MADT,EAEPzF,KAFO,CAEDA,KAFC,EAGPuG,UAHO,CAGIP,UAHJ,EAIPQ,WAJO,CAIKhF,mBAJL,EAKPiF,QALO,CAKE,KAAKC,WALP,CAAZ;AAOA,gBAAIC,IAAI,GAAG,KAAKC,QAAhB,CA3BS,CA2BiB;;AAC1B,gBAAIC,IAAI,GAAG,KAAKC,UAAhB;AAEA,iBAAKC,OAAL,CAAaC,MAAb,CAAoB,GAApB,EACKzB,IADL,CACU,OADV,EACmB,aADnB,EAEKA,IAFL,CAEU,WAFV,EAEuB,eAAesB,IAAf,GAAsB,GAAtB,GAA4BF,IAA5B,GAAmC,GAF1D,EAGKM,IAHL,CAGUZ,KAHV,EA9BS,CAmCT;;AACA,iBAAKU,OAAL,CACK5B,MADL,CACY,SADZ,EAEKA,MAFL,CAEY,SAFZ,EAGK+B,MAHL;AAID,W,CAED;;;;oCACUlH,K,EAAc;AACtB,gBAAIG,KAAW,GAAG,EAAlB;AACA,gBAAIgH,IAAI,GAAG,KAAKT,WAAL,GAAmB1G,KAAK,CAACoH,MAApC,CAFsB,CAGtB;;AACAjH,YAAAA,KAAK,CAACkH,IAAN,CAAWF,IAAX;;AACA,iBAAK,IAAIG,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGtH,KAAK,CAACoH,MAA1B,EAAkCE,CAAC,EAAnC,EAAuC;AACrCnH,cAAAA,KAAK,CAACkH,IAAN,CAAWF,IAAI,IAAIG,CAAC,GAAC,CAAN,CAAf;AACD;;AACD,mBAAOzG,EAAE,CAAC0G,YAAH,GACF5B,MADE,CACK3F,KADL,EAEFG,KAFE,CAEIA,KAFJ,CAAP;AAGD,W,CAED;;;;wCACcH,K,EAAc;AAC1B,gBAAIG,KAAW,GAAG,EAAlB;AACA,gBAAIgH,IAAI,GAAG,KAAKT,WAAL,GAAmB1G,KAAK,CAACoH,MAApC,CAF0B,CAG1B;;AACAjH,YAAAA,KAAK,CAACkH,IAAN,CAAW,KAAKnF,OAAhB;;AACA,iBAAK,IAAIoF,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGtH,KAAK,CAACoH,MAA1B,EAAkCE,CAAC,EAAnC,EAAuC;AACrCnH,cAAAA,KAAK,CAACkH,IAAN,CAAWF,IAAI,GAAGG,CAAP,GAAW,KAAKpF,OAA3B;AACD;;AACD,mBAAOrB,EAAE,CAAC0G,YAAH,GACF5B,MADE,CACK3F,KADL,EAEFG,KAFE,CAEIA,KAFJ,CAAP;AAGD;;;qCAEU;AACT,gBAAIH,KAAK,GAAG,KAAKwH,YAAL,CAAkBC,OAA9B;;AAEA,gBAAI,KAAK1D,KAAL,CAAW2D,SAAX,IAAwB,OAA5B,EAAqC;AACnC1H,cAAAA,KAAK,CAAC2H,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,KAAKjE,KAAL,CAAW2D,SAAX,IAAwB,OAA5B,EAAqC;AAC1C1H,cAAAA,KAAK,CAAC2H,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,CAAmBlI,KAAnB,CAAjB;AACA,iBAAKN,KAAL,CAAWyI,MAAX,GAAoB,KAAKA,MAAL,GAAc,KAAKC,SAAL,CAAepI,KAAf,CAAlC;AAEA,gBAAIqI,KAAK,GAAGxH,EAAE,CACTyH,QADO,CACEL,UADF,EAEPM,UAFO,CAEIvI,KAFJ,EAGPwI,aAHO,CAGO,IAAI,KAAKzD,KAHhB,EAIPyB,WAJO,CAIK/E,mBAJL,CAAZ;AAMA,iBAAKsF,OAAL,CACKC,MADL,CACY,GADZ,EAEKzB,IAFL,CAEU,OAFV,EAEmB,aAFnB,EAGK0B,IAHL,CAGUoB,KAHV,EAlBS,CAuBT;;AACA,gBAAI1B,IAAI,GAAG,KAAK/D,MAAL,CAAYF,GAAvB;AACA,gBAAImE,IAAI,GAAG,KAAK4B,aAAL,CAAmB,KAAK1B,OAAxB,IAAmCtF,mBAA9C;AACA,iBAAKsF,OAAL,CAAa5B,MAAb,CAAoB,SAApB,EAA+BI,IAA/B,CAAoC,WAApC,EAAiD,eAAesB,IAAf,GAAsB,GAAtB,GAA4BF,IAA5B,GAAmC,GAApF,EA1BS,CA4BT;;AACA,iBAAKI,OAAL,CAAa5B,MAAb,CAAoB,SAApB,EAA+BA,MAA/B,CAAsC,SAAtC,EAAiD+B,MAAjD;AACA,iBAAKH,OAAL,CAAa5B,MAAb,CAAoB,SAApB,EAA+BV,SAA/B,CAAyC,YAAzC,EAAuDyC,MAAvD;AACD,W,CAED;;;;yCACejH,G,EAAaC,G,EAAawI,Y,EAAsB;AAC7D,gBAAIC,QAAQ,GAAG,CAACzI,GAAG,IAAI,KAAK0I,qBAAL,GAA6B,CAAjC,CAAH,GAAyC3I,GAAG,IAAI,KAAK2I,qBAAL,GAA6B,CAAjC,CAA7C,IAAoF,CAAnG;AACA,gBAAIC,KAAJ,EAAWC,KAAX;;AAEA,gBAAIJ,YAAY,KAAK,CAArB,EAAwB;AACtBI,cAAAA,KAAK,GAAG5I,GAAG,GAAG,KAAK0I,qBAAnB;AACAC,cAAAA,KAAK,GAAG5I,GAAG,GAAGA,GAAG,IAAI,KAAK2I,qBAAL,GAA6B,CAAjC,CAAjB;AACAF,cAAAA,YAAY,GAAG,CAACI,KAAK,GAAGD,KAAT,IAAkB,CAAjC;AACD,aAJD,MAIO;AACLC,cAAAA,KAAK,GAAG9D,IAAI,CAACC,IAAL,CAAU,CAAC/E,GAAG,GAAGyI,QAAP,IAAmBD,YAA7B,IAA6CA,YAArD;AACAG,cAAAA,KAAK,GAAG7D,IAAI,CAAC+D,KAAL,CAAW,CAAC9I,GAAG,GAAG0I,QAAP,IAAmBD,YAA9B,IAA8CA,YAAtD;AACD,aAX4D,CAa7D;;;AACA,gBAAIzI,GAAG,IAAI,CAAP,IAAY4I,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,KAAKnF,KAAL,CAAWsE,KAAX,CAAiBa,MAA9B;AACA,mBAAO,UAASC,KAAT,EAAgB;AACrB,qBAAOzI,GAAG,CAAC0I,YAAJ,CAAiBF,MAAjB,EAAyBC,KAAzB,EAAgCH,QAAhC,EAA0CC,cAA1C,CAAP;AACD,aAFD;AAGD,W,CAED;AACA;;;;+CACqB;AACnB,gBAAII,YAAY,GAAG,KAAKvH,QAAL,CAAc,CAAd,CAAnB;AAEA,iBAAKiD,KAAL,GAAaC,IAAI,CAAC+D,KAAL,CAAW,KAAKjH,QAAL,CAAciD,KAAd,EAAX,IAAoC,KAAKxC,OAAL,CAAaE,KAA9D;AACA,iBAAKqB,MAAL,GAAckB,IAAI,CAAC+D,KAAL,CAAW,KAAKjH,QAAL,CAAcgC,MAAd,EAAX,IAAqC,KAAKvB,OAAL,CAAaI,MAAhE;;AAEA,gBAAI,KAAKoE,OAAT,EAAkB;AAChB,mBAAKA,OAAL,CAAaG,MAAb;AACD,aARkB,CAUnB;AACA;;;AACA,iBAAKH,OAAL,GAAelG,EAAE,CAACsE,MAAH,CAAUkE,YAAV,EACVC,MADU,CACH,KADG,EACG,cADH,EAEV/D,IAFU,CAEL,OAFK,EAEI,KAAKR,KAFT,EAGVQ,IAHU,CAGL,QAHK,EAGK,KAAKzB,MAHV,CAAf;AAKA,iBAAK4C,WAAL,GAAmB,KAAK5C,MAAL,GAAc,KAAKlB,MAAL,CAAYF,GAA1B,GAAgC,KAAKE,MAAL,CAAYD,MAA/D;AACA,iBAAKiE,QAAL,GAAgB,KAAKhE,MAAL,CAAYF,GAA5B;AACA,iBAAK6G,WAAL,GAAmB,KAAK3C,QAAL,GAAgB,KAAKF,WAAxC;AAEA,iBAAK8C,YAAL,GAAoB,KAAKzF,KAAL,CAAW0F,KAAX,CAAiBD,YAAjB,KAAkC,IAAlC,GAAyC,KAAKzF,KAAL,CAAW0F,KAAX,CAAiBD,YAA1D,GAAyEtI,cAA7F;AACA,iBAAKwI,YAAL,GAAoB,KAAK3F,KAAL,CAAW0F,KAAX,CAAiBC,YAAjB,KAAkC,IAAlC,GAAyC,KAAK3F,KAAL,CAAW0F,KAAX,CAAiBC,YAA1D,GAAyEvI,cAA7F;AACA,iBAAKwI,SAAL,GAAiB,KAAK5F,KAAL,CAAW0F,KAAX,CAAiBE,SAAjB,KAA+B,IAA/B,GAAsC,KAAK5F,KAAL,CAAW0F,KAAX,CAAiBE,SAAvD,GAAmEvI,UAApF,CAvBmB,CAyBnB;;AACA,iBAAKwI,SAAL,GAAiB,KAAKlD,WAAtB;;AACA,gBAAI,KAAKc,YAAL,CAAkBC,OAAlB,CAA0BL,MAA1B,GAAmC,CAAvC,EAA0C;AACxC,mBAAKwC,SAAL,GAAiB5E,IAAI,CAAC+D,KAAL,CAAW,KAAKrC,WAAL,GAAmB,KAAKc,YAAL,CAAkBC,OAAlB,CAA0BL,MAAxD,CAAjB;AACD;;AACD,iBAAKyC,UAAL,GAAkB,KAAKD,SAAL,GAAiB,KAAKA,SAAL,GAAiB,KAAKF,YAAvC,GAAsD,CAAxE;AACA,iBAAKxH,OAAL,GAAe,KAAK2H,UAAL,GAAkB,CAAjC;AAEA,iBAAKC,QAAL;AAEA,iBAAKhD,UAAL,GAAkB,KAAK2B,aAAL,CAAmB,KAAK1B,OAAxB,IAAmCtF,mBAArD;AACA,iBAAKqE,UAAL,GAAkB,KAAKf,KAAL,GAAa,KAAK+B,UAAlB,GAA+B,KAAKlE,MAAL,CAAYH,KAA7D,CApCmB,CAsCnB;AACA;;AACA,iBAAKoD,SAAL,GAAiB,KAAKC,UAAL,IAAmB,KAAK0B,YAAL,CAAkBuC,WAAlB,GAA8B,CAAjD,CAAjB;AACA,iBAAKC,SAAL,GAAiB,KAAKnE,SAAL,GAAiB,KAAK2D,YAAvC;AAEA,iBAAKS,QAAL;AACA,iBAAKC,WAAL,GAAmB,KAAKC,cAAL,CAAoB,KAAKpD,OAAzB,CAAnB;;AAEA,gBAAI,CAAC,KAAKhD,KAAL,CAAWsE,KAAX,CAAiBhE,IAAtB,EAA4B;AAC1B,mBAAK0C,OAAL,CAAa5B,MAAb,CAAoB,SAApB,EAA+BV,SAA/B,CAAyC,MAAzC,EAAiD2F,KAAjD,CAAuD,SAAvD,EAAkE,CAAlE;AACD;;AAED,gBAAI,CAAC,KAAKrG,KAAL,CAAWsC,KAAX,CAAiBhC,IAAtB,EAA4B;AAC1B,mBAAK0C,OAAL,CAAa5B,MAAb,CAAoB,SAApB,EAA+BV,SAA/B,CAAyC,MAAzC,EAAiD2F,KAAjD,CAAuD,SAAvD,EAAkE,CAAlE;AACD;AACF;;;yCAEmB;AAAA;;AAClB,gBAAIC,QAAQ,GAAG,KAAKtG,KAAL,CAAWuG,KAAX,CAAiBpK,GAAjB,IAAwB,KAAKsH,YAAL,CAAkB6C,QAAzD;AACA,gBAAIE,QAAQ,GAAG,KAAKxG,KAAL,CAAWuG,KAAX,CAAiBrK,GAAjB,IAAwB,KAAKuH,YAAL,CAAkB+C,QAAzD;;AAEA,gBAAI,KAAKxG,KAAL,CAAWuG,KAAX,CAAiBE,IAAjB,KAA0B,UAA9B,EAA0C;AACxC,mBAAKC,UAAL,GAAkB,KAAKC,aAAL,CAAmBL,QAAnB,EAA6BE,QAA7B,CAAlB;AACD;;AACD,iBAAKI,eAAL,CAAqBN,QAArB,EAPkB,CASlB;;AACA,iBAAKtD,OAAL,CAAatC,SAAb,CAAuB,sBAAvB,EAA+CmG,IAA/C,CAAoD,KAAKpD,YAAL,CAAkBC,OAAtE,EACGoD,KADH,GAEKpG,SAFL,CAEe,kBAFf,EAGKmG,IAHL,CAGU,UAACE,MAAD;AAAA,qBAAmB,KAAI,CAACtD,YAAL,CAAkBuD,OAAlB,CAA0BD,MAA1B,CAAnB;AAAA,aAHV,EAIKD,KAJL,GAKO7D,MALP,CAKc,MALd,EAMOzB,IANP,CAMY,QANZ,EAMsB,UAACsC,CAAD;AAAA,qBAAcA,CAAC,CAACmD,EAAhB;AAAA,aANtB,EAOOzF,IAPP,CAOY,KAPZ,EAOmB,UAACsC,CAAD;AAAA,qBAAcA,CAAC,CAACoD,GAAhB;AAAA,aAPnB,EAQO1F,IARP,CAQY,KARZ,EAQmB,UAACsC,CAAD;AAAA,qBAAcA,CAAC,CAACqD,MAAhB;AAAA,aARnB,EASO3F,IATP,CASY,GATZ,EASiB,KAAK4F,QAAL,CAAcnI,IAAd,CAAmB,IAAnB,CATjB,EAUOuC,IAVP,CAUY,OAVZ,EAUqB,KAAK6F,YAAL,CAAkBpI,IAAlB,CAAuB,IAAvB,CAVrB,EAWOuC,IAXP,CAWY,GAXZ,EAWiB,KAAK8F,QAAL,CAAcrI,IAAd,CAAmB,IAAnB,CAXjB,EAYOuC,IAZP,CAYY,QAZZ,EAYsB,KAAK+F,aAAL,CAAmBtI,IAAnB,CAAwB,IAAxB,CAZtB,EAaOuC,IAbP,CAaY,IAbZ,EAakB,KAAKoE,SAbvB,EAcOpE,IAdP,CAcY,IAdZ,EAckB,KAAKoE,SAdvB,EAeOpE,IAfP,CAeY,OAfZ,EAeqB,UAACsC,CAAD;AAAA,qBAAcA,CAAC,CAAC0D,OAAF,KAAc,YAAd,GAA6B,yBAA3C;AAAA,aAfrB,EAgBOnB,KAhBP,CAgBa,MAhBb,EAgBqB,KAAKoB,YAAL,CAAkBxI,IAAlB,CAAuB,IAAvB,CAhBrB,EAiBOoH,KAjBP,CAiBa,QAjBb,EAiBuB,KAAKoB,YAAL,CAAkBxI,IAAlB,CAAuB,IAAvB,CAjBvB,EAkBOoH,KAlBP,CAkBa,cAlBb,EAkB6B,CAlB7B,EAmBM;AACA;AApBN,aAqBOA,KArBP,CAqBa,SArBb,EAqBwB,KAAKqB,cAAL,CAAoBzI,IAApB,CAAyB,IAAzB,CArBxB,EAVkB,CAiClB;;AACA,gBAAI0I,MAAM,GAAG,KAAK5J,QAAL,CAAcC,IAAd,CAAmB,6BAAnB,CAAb;AACA2J,YAAAA,MAAM,CACH5I,EADH,CACM,YADN,EACoB,UAACW,KAAD,EAAW;AAC3B,cAAA,KAAI,CAACzB,OAAL,CAAa2J,eAAb,GAA+B,IAA/B;;AACA,cAAA,KAAI,CAACC,aAAL,CAAmBnI,KAAnB;AACD,aAJH,EAKGX,EALH,CAKM,YALN,EAKoB,UAACW,KAAD,EAAW;AAC3B,cAAA,KAAI,CAACzB,OAAL,CAAa2J,eAAb,GAA+B,KAA/B;;AACA,cAAA,KAAI,CAACE,kBAAL,CAAwBpI,KAAxB;AACD,aARH;;AAUA,iBAAKqI,kBAAL;;AAEA,iBAAKjM,IAAL,CAAUgD,MAAV,CAAiBkJ,IAAjB,CAAsB,iBAAtB,EAAyC;AACvC,4BAAc,KAAKjG;AADoB,aAAzC;AAGD;;;wCAEarC,K,EAAO;AACnB,gBAAM6G,KAAK,GAAGzJ,EAAE,CAACsE,MAAH,CAAU1B,KAAK,CAACqH,MAAhB,EAAwBV,KAAxB,CAA8B,MAA9B,CAAd;AACA,gBAAM4B,cAAc,GAAGnL,EAAE,CAACyJ,KAAH,CAASA,KAAT,EAAgB2B,MAAhB,CAAuB,CAAvB,CAAvB;AACA,gBAAMC,WAAW,GAAGrL,EAAE,CAACyJ,KAAH,CAASA,KAAT,EAAgB6B,QAAhB,CAAyB,CAAzB,CAApB;AACA,gBAAMC,YAAY,GAAGvL,EAAE,CAACsE,MAAH,CAAU1B,KAAK,CAACqH,MAAhB,CAArB;AACA,iBAAK9I,OAAL,CAAaqK,iBAAb,GAAiC/B,KAAjC;AACA8B,YAAAA,YAAY,CACPhC,KADL,CACW,MADX,EACmB4B,cAAc,CAACM,QAAf,EADnB,EAEKlC,KAFL,CAEW,QAFX,EAEqB8B,WAAW,CAACI,QAAZ,EAFrB,EAGKlC,KAHL,CAGW,cAHX,EAG2B,CAH3B;AAID;;;6CAEkB3G,K,EAAO;AACxB5C,YAAAA,EAAE,CAACsE,MAAH,CAAU1B,KAAK,CAACqH,MAAhB,EACGV,KADH,CACS,MADT,EACiB,KAAKpI,OAAL,CAAaqK,iBAD9B,EAEGjC,KAFH,CAES,QAFT,EAEmB,KAAKpI,OAAL,CAAaqK,iBAFhC,EAGGjC,KAHH,CAGS,cAHT,EAGyB,CAHzB;AAID;;;wCAEaC,Q,EAAwB;AAAA,gBAAdE,QAAc,uEAAH,CAAG;;AACpC,gBAAIgC,WAAW,GAAGhM,CAAC,CAACwB,IAAF,CAAO,KAAKlC,IAAL,CAAU2M,YAAjB,EAA+B;AAACrD,cAAAA,KAAK,EAAE,KAAKpF,KAAL,CAAWuG,KAAX,CAAiBiC;AAAzB,aAA/B,CAAlB;;AACA,gBAAIE,iBAAiB,GAAG3L,gBAAgB,CAACyL,WAAW,CAACpD,KAAb,CAAxC;AACA,gBAAIuD,kBAAkB,GAAGH,WAAW,CAACI,MAAZ,KAAuB,QAAvB,IACpBJ,WAAW,CAACI,MAAZ,KAAuB,MAAvB,IAAiC,CAAC/L,UAAU,CAACgM,IAAX,CAAgBC,UADvD;AAGA,gBAAIxC,QAAQ,IAAIE,QAAhB,EACEF,QAAQ,GAAGE,QAAQ,GAAG,CAAtB;AAEF,gBAAIuC,KAAK,GAAGJ,kBAAkB,GAAGrC,QAAH,GAAcE,QAA5C;AACA,gBAAIwC,GAAG,GAAGL,kBAAkB,GAAGnC,QAAH,GAAcF,QAA1C;AAEA,mBAAOxJ,EAAE,CAACmM,eAAH,CAAmBP,iBAAnB,EAAsC9G,MAAtC,CAA6C,CAACmH,KAAD,EAAQC,GAAR,CAA7C,CAAP;AACD;;;0CAEe1C,Q,EAAU;AACxB,gBAAI,KAAKtG,KAAL,CAAWuG,KAAX,CAAiBG,UAAjB,KAAgC,QAApC,EAA8C;AAC5C,mBAAKwC,YAAL,GAAoBpM,EAAE,CAACqM,WAAH,GACfvH,MADe,CACR,CAAC,CAAD,EAAI0E,QAAJ,CADQ,EAEflK,KAFe,CAET,CAAC,CAAD,EAAI,CAAJ,CAFS,CAApB;AAGD,aAJD,MAIO,IAAI,KAAK4D,KAAL,CAAWuG,KAAX,CAAiBG,UAAjB,KAAgC,MAApC,EAA4C;AACjD,mBAAKwC,YAAL,GAAoBpM,EAAE,CAACsM,QAAH,GAAcC,QAAd,CAAuB,KAAKrJ,KAAL,CAAWuG,KAAX,CAAiB8C,QAAxC,EACfzH,MADe,CACR,CAAC,CAAD,EAAI0E,QAAJ,CADQ,EAEflK,KAFe,CAET,CAAC,CAAD,EAAI,CAAJ,CAFS,CAApB;AAGD;AACF;;;mCAEQ0H,C,EAAW;AAClB,gBAAIwF,CAAJ,CADkB,CAElB;AACA;;AACA,gBAAIC,MAAM,GAAIzF,CAAC,CAAC0F,KAAF,GAAU,KAAK/F,YAAL,CAAkBgG,OAA7B,GAAwC,KAAK1H,UAA1D;AACA,gBAAI2H,EAAE,GAAGH,MAAM,GAAG,KAAKtD,SAAL,GAAe,CAAjC;;AAEA,gBAAIyD,EAAE,GAAG,KAAKzD,SAAL,GAAe,CAApB,GAAwB,CAA5B,EAA+B;AAC7BqD,cAAAA,CAAC,GAAG,KAAKvG,UAAL,GAAkB,KAAK0C,YAAL,GAAkB,CAAxC;AACD,aAFD,MAEO;AACL6D,cAAAA,CAAC,GAAG,KAAKvG,UAAL,GAAkB2G,EAAlB,GAAuB,KAAKzD,SAAL,GAAe,CAA1C;AACD;;AAED,mBAAOqD,CAAP;AACD,W,CAED;;;;uCACaxF,C,EAAW;AACtB;AACA,gBAAI6F,CAAJ;AAEA,gBAAIJ,MAAM,GAAIzF,CAAC,CAAC0F,KAAF,GAAU,KAAK/F,YAAL,CAAkBgG,OAA7B,GAAwC,KAAK1H,UAA1D;AACA,gBAAI2H,EAAE,GAAGH,MAAM,GAAG,KAAKtD,SAAL,GAAe,CAAjC,CALsB,CAMtB;;AAEA,gBAAIyD,EAAE,GAAG,KAAKzD,SAAL,GAAe,CAAxB,EAA2B;AACzB;AACA;AACA,kBAAI2D,YAAY,GAAIF,EAAE,GAAG,KAAKjE,YAAL,GAAkB,CAAxB,GAA6B,KAAKQ,SAAL,GAAe,CAA/D;AACA0D,cAAAA,CAAC,GAAGC,YAAY,GAAG,CAAf,GAAmBA,YAAnB,GAAkC,CAAtC;AACD,aALD,MAKO,IAAI,KAAK7H,UAAL,GAAkB2H,EAAlB,GAAuB,KAAKzD,SAAL,GAAe,CAA1C,EAA6C;AAClD;AACA0D,cAAAA,CAAC,GAAG,KAAK1D,SAAL,GAAe,CAAf,IAAoB,KAAKlE,UAAL,GAAkB2H,EAAlB,GAAuB,KAAKjE,YAAL,GAAkB,CAA7D,CAAJ;AACD,aAHM,MAGA;AACLkE,cAAAA,CAAC,GAAG,KAAK1D,SAAT;AACD,aAlBqB,CAoBtB;;;AACA0D,YAAAA,CAAC,GAAG1I,IAAI,CAAC9E,GAAL,CAASwN,CAAT,EAAYzM,aAAZ,CAAJ;;AAEA,gBAAI,KAAKuI,YAAL,IAAqB,CAAzB,EAA4B;AAC1BkE,cAAAA,CAAC,GAAGA,CAAC,GAAC,CAAN;AACD;;AAED,mBAAOA,CAAP;AACD,W,CAED;AACA;AACA;;;;mCACS7F,C,EAAW;AAClB,mBAAO,KAAKM,MAAL,CAAYN,CAAC,CAACqD,MAAd,IAAwB,KAAKtE,QAA7B,GAAwC,KAAKiD,UAA7C,GAA0D,KAAKH,YAAL,GAAkB,CAAnF;AACD;;;wCAEa7B,C,EAAW;AACvB;AACA,gBAAI+F,EAAE,GAAG,KAAKzF,MAAL,CAAYN,CAAC,CAACqD,MAAd,CAAT;AACA,gBAAI2C,CAAC,GAAGD,EAAE,GAAG,KAAKhH,QAAV,GAAqB,KAAKiD,UAA1B,GAAuC,KAAKH,YAAL,GAAkB,CAAjE;AACA,gBAAIoE,CAAC,GAAG,KAAKjE,UAAb,CAJuB,CAMvB;;AACA,gBAAIgE,CAAC,GAAG,KAAKjH,QAAb,EAAuB;AACrBkH,cAAAA,CAAC,GAAGF,EAAE,GAAG,KAAKlE,YAAL,GAAkB,CAA3B;AACD,aAFD,MAEO,IAAIkE,EAAE,GAAG,KAAKrE,WAAd,EAA2B;AAChCuE,cAAAA,CAAC,GAAG,KAAKvE,WAAL,GAAmBsE,CAAvB;AACD,aAFM,MAEA,IAAIA,CAAC,GAAG,KAAKhE,UAAT,GAAsB,KAAKN,WAA/B,EAA4C;AACjDuE,cAAAA,CAAC,GAAG,KAAKvE,WAAL,GAAmBsE,CAAvB;AACD,aAbsB,CAevB;;;AACAC,YAAAA,CAAC,GAAG9I,IAAI,CAAC/E,GAAL,CAAS6N,CAAT,EAAY,KAAKpH,WAAjB,CAAJ,CAhBuB,CAiBvB;;AACAoH,YAAAA,CAAC,GAAG9I,IAAI,CAAC9E,GAAL,CAAS4N,CAAT,EAAY7M,aAAZ,CAAJ;;AAEA,gBAAI,KAAKyI,YAAL,IAAqB,CAAzB,EAA4B;AAC1BoE,cAAAA,CAAC,GAAGA,CAAC,GAAC,CAAN;AACD;;AAED,mBAAOA,CAAP;AACD;;;uCAEYC,M,EAAgB;AAC3B,gBAAI,KAAKhK,KAAL,CAAWuG,KAAX,CAAiBE,IAAjB,KAA0B,SAA9B,EAAyC;AACvC,qBAAO,KAAKzG,KAAL,CAAWuG,KAAX,CAAiB0D,SAAxB;AACD,aAFD,MAEO,IAAI,KAAKjK,KAAL,CAAWuG,KAAX,CAAiBE,IAAjB,KAA0B,UAA9B,EAA0C;AAC/C,qBAAO,KAAKC,UAAL,CAAgBsD,MAAM,CAAC5E,KAAvB,CAAP;AACD,aAFM,MAEA,IAAI,KAAKpF,KAAL,CAAWuG,KAAX,CAAiBE,IAAjB,KAA0B,UAA9B,EAA0C;AAC/C,kBAAI,KAAKzG,KAAL,CAAWkK,iBAAX,IAAgC,IAAhC,IAAwC,KAAKlK,KAAL,CAAWkK,iBAAX,IAAgC,CAAC,CAA7E,EAAgF;AAC9E,uBAAO,KAAKpO,IAAL,CAAUqO,mBAAV,CAA8BC,oBAA9B,CAAmDJ,MAAM,CAACK,MAAP,CAAc,KAAKrK,KAAL,CAAWkK,iBAAzB,CAAnD,CAAP;AACD,eAFD,MAEO;AACL,uBAAO,KAAKpO,IAAL,CAAUqO,mBAAV,CAA8BG,cAA9B,CAA6CN,MAAM,CAACK,MAApD,CAAP;AACD;AACF;AACF;;;yCAEcL,M,EAAgB;AAC7B,gBAAI,KAAKhK,KAAL,CAAWuK,aAAX,KAA6B,UAA7B,IAA2CP,MAAM,CAAC5E,KAAP,IAAgB,IAA/D,EAAsE;AACpE,qBAAO,CAAP;AACD;;AACD,gBAAI,KAAKpF,KAAL,CAAWuG,KAAX,CAAiBE,IAAjB,KAA0B,SAA9B,EAAyC;AACvC,qBAAO,KAAKyC,YAAL,CAAkBc,MAAM,CAAC5E,KAAzB,CAAP;AACD,aAFD,MAEO;AACL,qBAAO,CAAP;AACD;AACF;;;6CAEkBtB,C,EAAW;AAC5B,gBAAI,KAAK9D,KAAL,CAAWuG,KAAX,CAAiBE,IAAjB,KAA0B,UAA9B,EAA0C;AACxC,qBAAO,GAAP;AACD;;AACD,mBAAO,GAAP;AACD,W,CAGD;AACA;AACA;;;;yCAEe/G,K,EAAO;AACpB,gBAAM8K,UAAU,GAAG,KAAKzM,QAAL,CAAc0M,MAAd,EAAnB;AACA,gBAAMnB,CAAC,GAAGrI,IAAI,CAAC+D,KAAL,CAAWtF,KAAK,CAACgL,OAAN,GAAgBF,UAAU,CAAC/L,IAAtC,CAAV;AACA,gBAAMqL,CAAC,GAAG7I,IAAI,CAAC+D,KAAL,CAAWtF,KAAK,CAACiL,OAAN,GAAgBH,UAAU,CAAC7L,GAAtC,CAAV;AACA,mBAAO;AAAE2K,cAAAA,CAAC,EAADA,CAAF;AAAKQ,cAAAA,CAAC,EAADA;AAAL,aAAP;AACD;;;sCAEWpK,K,EAAO;AAAA;;AACjB,gBAAM+K,MAAM,GAAG,KAAKG,cAAL,CAAoBlL,KAApB,CAAf;AACA,iBAAKtB,SAAL,CAAeC,MAAf,GAAwB,IAAxB;AACA,iBAAKD,SAAL,CAAeE,EAAf,GAAoBmM,MAAM,CAACnB,CAA3B;;AAEA,iBAAKuB,cAAL,GAAsB,YAAM;AAC1B,cAAA,MAAI,CAACC,SAAL;AACD,aAFD;;AAIArO,YAAAA,CAAC,CAACsO,QAAD,CAAD,CAAYC,GAAZ,CAAgB,SAAhB,EAA2B,KAAKH,cAAL,CAAoB5L,IAApB,CAAyB,IAAzB,CAA3B;AACD;;;sCAEW;AACVxC,YAAAA,CAAC,CAACsO,QAAD,CAAD,CAAYE,MAAZ,CAAmB,SAAnB,EAA8B,KAAKJ,cAAL,CAAoB5L,IAApB,CAAyB,IAAzB,CAA9B;AACA,iBAAK4L,cAAL,GAAsB,IAAtB;AACA,iBAAKzM,SAAL,CAAeC,MAAf,GAAwB,KAAxB;AAEA,gBAAI6M,cAAc,GAAGjK,IAAI,CAACkK,GAAL,CAAS,KAAK/M,SAAL,CAAeG,EAAf,GAAoB,KAAKH,SAAL,CAAeE,EAA5C,CAArB;;AACA,gBAAI,KAAKF,SAAL,CAAeG,EAAf,IAAqB,CAArB,IAA0B2M,cAAc,GAAGvN,mBAA/C,EAAoE;AAClE,kBAAIyN,QAAQ,GAAG,KAAK1J,MAAL,CAAYkH,MAAZ,CAAmB3H,IAAI,CAAC/E,GAAL,CAAS,KAAKkC,SAAL,CAAeE,EAAxB,EAA4B,KAAKF,SAAL,CAAeG,EAA3C,IAAiD,KAAKwE,UAAtD,GAAmE,KAAKjB,SAAL,GAAe,CAArG,CAAf;AACA,kBAAIuJ,MAAM,GAAG,KAAK3J,MAAL,CAAYkH,MAAZ,CAAmB3H,IAAI,CAAC9E,GAAL,CAAS,KAAKiC,SAAL,CAAeE,EAAxB,EAA4B,KAAKF,SAAL,CAAeG,EAA3C,IAAiD,KAAKwE,UAAtD,GAAmE,KAAKjB,SAAL,GAAe,CAArG,CAAb;AAEA,mBAAKhG,IAAL,CAAUwP,OAAV,CAAkBC,OAAlB,CAA0B;AACxB1N,gBAAAA,IAAI,EAAEnB,MAAM,CAAC8O,GAAP,CAAWJ,QAAX,CADkB;AAExBtN,gBAAAA,EAAE,EAAEpB,MAAM,CAAC8O,GAAP,CAAWH,MAAX;AAFoB,eAA1B;AAID;;AAED,iBAAKI,cAAL;AACD;;;uCAEYjL,C,EAAG;AACd5D,YAAAA,SAAS,CAACoL,IAAV,CAAe,mBAAf;AACA,iBAAKvI,cAAL;AACA,iBAAKvB,iBAAL,CAAuBwN,OAAvB;AACD;;;sCAEWhM,K,EAAmB;AAC7B,gBAAI,CAAC,KAAKsD,OAAV,EAAmB;AAAE;AAAS;;AAE9B,gBAAMyH,MAAM,GAAG,KAAKG,cAAL,CAAoBlL,KAApB,CAAf;;AACA,gBAAI,KAAKtB,SAAL,CAAeC,MAAnB,EAA2B;AACzB;AACA,mBAAKoB,cAAL;AACA,mBAAKxB,OAAL,CAAayN,OAAb;AACA,mBAAKxN,iBAAL,CAAuBwN,OAAvB;AAEA,mBAAKtN,SAAL,CAAeG,EAAf,GAAoB,KAAKoN,cAAL,CAAoBjM,KAAK,CAACkM,OAA1B,CAApB;AACA,mBAAKC,aAAL,CAAmB,KAAKzN,SAAL,CAAeE,EAAlC,EAAsC,KAAKF,SAAL,CAAeG,EAArD;AACD,aARD,MAQO;AACL;AACA,mBAAKuN,mBAAL,CAAyBpM,KAAzB;AACA,mBAAKqM,aAAL,CAAmBtB,MAAM,CAACnB,CAA1B;AACA,mBAAKrL,OAAL,CAAaqC,IAAb,CAAkBZ,KAAlB;AACA,mBAAKxB,iBAAL,CAAuBoC,IAAvB,CAA4BZ,KAA5B;AACD;AACF,W,CAED;;;;uCACoBc,C,EAAe;AACjC,gBAAI,KAAK1E,IAAL,CAAUkE,KAAV,CAAgB/B,OAAhB,CAAwB+N,aAA5B,EAA2C;AACzC,mBAAK/N,OAAL,CAAagO,UAAb,CAAwBzL,CAAxB;AACA,mBAAKvC,OAAL,CAAayN,OAAb;AACD;AACF;;;sCAEWhM,K,EAAO+K,M,EAAQ;AACzB,gBAAMnB,CAAC,GAAG,KAAK5H,MAAL,CAAYkH,MAAZ,CAAmB6B,MAAM,CAACnB,CAAP,GAAW,KAAKvG,UAAnC,EAA+CmJ,OAA/C,EAAV;AACA,gBAAMpC,CAAC,GAAG,KAAK1F,MAAL,CAAYwE,MAAZ,CAAmB6B,MAAM,CAACX,CAAP,GAAW,KAAKjH,QAAnC,CAAV;AACA,gBAAMjD,GAAG,GAAG;AACVuM,cAAAA,KAAK,EAAEzM,KAAK,CAACyM,KADH;AAEVC,cAAAA,KAAK,EAAE1M,KAAK,CAAC0M,KAFH;AAGV9C,cAAAA,CAAC,EAAEA,CAHO;AAIVhL,cAAAA,EAAE,EAAEgL,CAJM;AAKVQ,cAAAA,CAAC,EAAEA,CALO;AAMVuC,cAAAA,EAAE,EAAEvC,CANM;AAOVwC,cAAAA,SAAS,EAAE,IAPD;AAQV7B,cAAAA,MAAM,EAANA;AARU,aAAZ;AAWA,mBAAO7K,GAAP;AACD;;;8CAEmBF,K,EAAO;AACzB,gBAAI4J,CAAC,GAAG,KAAK5H,MAAL,CAAYkH,MAAZ,CAAmBlJ,KAAK,CAACkM,OAAN,GAAgB,KAAK7I,UAArB,GAAkC,KAAKjB,SAAL,GAAe,CAApE,EAAuEoK,OAAvE,EAAR;AACA,gBAAIpC,CAAC,GAAG,KAAK1F,MAAL,CAAY1E,KAAK,CAAC6M,OAAlB,CAAR;AACA,gBAAI3M,GAAG,GAAG;AACRuM,cAAAA,KAAK,EAAEzM,KAAK,CAACyM,KADL;AAERC,cAAAA,KAAK,EAAE1M,KAAK,CAAC0M,KAFL;AAGR9C,cAAAA,CAAC,EAAEA,CAHK;AAGFhL,cAAAA,EAAE,EAAEgL,CAHF;AAIRQ,cAAAA,CAAC,EAAEA,CAJK;AAIFuC,cAAAA,EAAE,EAAEvC,CAJF;AAKRwC,cAAAA,SAAS,EAAE;AALH,aAAV,CAHyB,CAWzB;;AACA1M,YAAAA,GAAG,CAAC0M,SAAJ,GAAgBrL,IAAI,CAAC9E,GAAL,CAASuD,KAAK,CAAC6M,OAAN,GAAgB,KAAKxM,MAA9B,EAAsC,KAAtC,CAAhB,CAZyB,CAczB;;AACAnD,YAAAA,SAAS,CAACoL,IAAV,CAAe,aAAf,EAA8B;AAACpI,cAAAA,GAAG,EAAEA,GAAN;AAAWI,cAAAA,KAAK,EAAE,KAAKA;AAAvB,aAA9B;AACD;;;yCAEczB,E,EAAI;AACjBA,YAAAA,EAAE,GAAG0C,IAAI,CAAC9E,GAAL,CAASoC,EAAT,EAAa,KAAKwE,UAAlB,CAAL;AACAxE,YAAAA,EAAE,GAAG0C,IAAI,CAAC/E,GAAL,CAASqC,EAAT,EAAa,KAAKwD,UAAL,GAAkB,KAAKgB,UAApC,CAAL;AACA,mBAAOxE,EAAP;AACD;;;wCAEaiO,K,EAAOC,K,EAAO;AAC1B,gBAAI,KAAKzJ,OAAT,EAAkB;AAChB,mBAAKA,OAAL,CAAatC,SAAb,CAAuB,2BAAvB,EAAoDyC,MAApD;AACA,kBAAIuJ,UAAU,GAAGzL,IAAI,CAAC/E,GAAL,CAASsQ,KAAT,EAAgBC,KAAhB,CAAjB;AACA,kBAAIE,cAAc,GAAG1L,IAAI,CAACkK,GAAL,CAASqB,KAAK,GAAGC,KAAjB,CAArB;;AAEA,kBAAIE,cAAc,GAAGhP,mBAArB,EAA0C;AACxC,qBAAKqF,OAAL,CAAaC,MAAb,CAAoB,MAApB,EACCzB,IADD,CACM,OADN,EACe,0BADf,EAECA,IAFD,CAEM,GAFN,EAEWkL,UAFX,EAGClL,IAHD,CAGM,OAHN,EAGemL,cAHf,EAICnL,IAJD,CAIM,GAJN,EAIW,KAAKqB,QAJhB,EAKCrB,IALD,CAKM,QALN,EAKgB,KAAKmB,WALrB;AAMD;AACF;AACF;;;2CAEgB;AACf,iBAAKvE,SAAL,CAAeE,EAAf,GAAoB,CAAC,CAArB;AACA,iBAAKF,SAAL,CAAeG,EAAf,GAAoB,CAAC,CAArB;;AAEA,gBAAI,KAAKyE,OAAT,EAAkB;AAChB,mBAAKA,OAAL,CAAatC,SAAb,CAAuB,2BAAvB,EAAoDyC,MAApD;AACD;AACF;;;wCAGayJ,Q,EAAU;AACtB,gBAAI,KAAK5J,OAAT,EAAkB;AAChB,mBAAKA,OAAL,CAAatC,SAAb,CAAuB,2BAAvB,EAAoDyC,MAApD;AAEA,kBAAIL,IAAI,GAAG8J,QAAX;AACA9J,cAAAA,IAAI,GAAG7B,IAAI,CAAC9E,GAAL,CAAS2G,IAAT,EAAe,KAAKC,UAApB,CAAP;AACAD,cAAAA,IAAI,GAAG7B,IAAI,CAAC/E,GAAL,CAAS4G,IAAT,EAAe,KAAKf,UAAL,GAAkB,KAAKgB,UAAtC,CAAP;AAEA,mBAAKC,OAAL,CAAaC,MAAb,CAAoB,GAApB,EACGzB,IADH,CACQ,OADR,EACiB,0BADjB,EAEGA,IAFH,CAEQ,WAFR,EAEqB,eAAesB,IAAf,GAAsB,KAF3C,EAGGG,MAHH,CAGU,MAHV,EAIGzB,IAJH,CAIQ,IAJR,EAIc,CAJd,EAKGA,IALH,CAKQ,IALR,EAKc,KAAKqB,QALnB,EAMGrB,IANH,CAMQ,IANR,EAMc,CANd,EAOGA,IAPH,CAOQ,IAPR,EAOc,KAAKgE,WAPnB,EAQGhE,IARH,CAQQ,cARR,EAQwB,CARxB;AASD;AACF,W,CAED;;;;8CACoB5B,G,EAAK;AACvB,gBAAI,KAAKoD,OAAL,IAAgB,KAAKlH,IAAL,CAAUqG,SAAV,CAAoB0K,YAApB,KAAqC,CAAzD,EAA4D;AAC1D,kBAAM/J,IAAI,GAAG,KAAKpB,MAAL,CAAY9B,GAAG,CAAC0J,CAAhB,IAAqB,KAAKvG,UAAvC;AACA,mBAAKgJ,aAAL,CAAmBjJ,IAAnB;AACD;AACF;;;2CAEgB;AACf,gBAAI,KAAKE,OAAT,EAAkB;AAChB,mBAAKA,OAAL,CAAatC,SAAb,CAAuB,2BAAvB,EAAoDyC,MAApD;AACD;AACF;;;mCAGQ;AACP,iBAAKnD,KAAL,GAAa,KAAKlE,IAAL,CAAUkE,KAAvB;AACA,iBAAK6B,SAAL,GAAiB,KAAK/F,IAAL,CAAUM,KAA3B;AACA,iBAAKqH,YAAL,GAAoB,KAAK3H,IAAL,CAAU2H,YAA9B;;AAEA,gBAAI,CAAC,KAAKA,YAAN,IAAsB,CAAC,KAAKqJ,gBAAL,EAA3B,EAAoD;AAClD;AACD,aAPM,CASP;;;AACA,iBAAKC,kBAAL;;AACA,gBAAI,KAAKtJ,YAAL,CAAkBuJ,YAAtB,EAAoC;AAClC;AACD;;AAED,iBAAKC,YAAL;AACA,iBAAKtR,KAAL,CAAWoH,UAAX,GAAwB,KAAKA,UAA7B;AACA,iBAAKpH,KAAL,CAAWwK,WAAX,GAAyB,KAAKA,WAA9B;AACA,iBAAKxK,KAAL,CAAWgH,WAAX,GAAyB,KAAKA,WAA9B;AACA,iBAAKhH,KAAL,CAAWoG,UAAX,GAAwB,KAAKA,UAA7B;AACA,iBAAKpG,KAAL,CAAWkH,QAAX,GAAsB,KAAKA,QAA3B;AACD;;;+CAEoB;AAAA;;AACnB,gBAAI,CAAC,KAAK/G,IAAL,CAAUoR,WAAX,IAA0B,KAAKpR,IAAL,CAAUoR,WAAV,CAAsB7J,MAAtB,IAAgC,CAA9D,EAAiE;AAC/D;AACD;;AAED,gBAAI,CAAC,KAAKL,OAAV,EAAmB;AACjB;AACD;;AAID,gBAAImK,QAAQ,GAAG3Q,CAAC,CAACqE,GAAF,CAAM,KAAK/E,IAAL,CAAUoR,WAAhB,EAA6B,UAACE,CAAD,EAAG7J,CAAH;AAAA,qBAAU;AAAC,qBAAKtC,IAAI,CAAC+D,KAAL,CAAW,MAAI,CAACjC,UAAL,GAAkB,MAAI,CAACrB,MAAL,CAAY0L,CAAC,CAACC,IAAd,CAA7B,CAAN;AAAyD,sBAAK9J,CAA9D;AAAiE,wBAAQ6J,CAAC,CAACE;AAA3E,eAAV;AAAA,aAA7B,CAAf,CAXmB,CAanB;;;AAEA,gBAAIC,IAAI,GAAG,KAAKvK,OAAL,CACNC,MADM,CACC,GADD,EAENzB,IAFM,CAED,OAFC,EAEQ,uBAFR,EAGNA,IAHM,CAGD,WAHC,EAGY,kBAHZ,EAINd,SAJM,CAII,wBAJJ,EAKNmG,IALM,CAKDsG,QALC,EAMNrG,KANM,GAME7D,MANF,CAMS,GANT,CAAX;AAQAsK,YAAAA,IAAI,CAACtK,MAAL,CAAY,MAAZ,EACA;AADA,aAEKzB,IAFL,CAEU,IAFV,EAEgB,UAAA4L,CAAC;AAAA,qBAAIA,CAAC,CAAC9D,CAAN;AAAA,aAFjB,EAGK9H,IAHL,CAGU,IAHV,EAGgB,KAAKqB,QAHrB,EAIKrB,IAJL,CAIU,IAJV,EAIgB,UAAA4L,CAAC;AAAA,qBAAIA,CAAC,CAAC9D,CAAN;AAAA,aAJjB,EAKK9H,IALL,CAKU,IALV,EAKgB,KAAKgE,WALrB,EAMKa,KANL,CAMW,QANX,EAMqB,UAAA+G,CAAC;AAAA,qBAAIA,CAAC,CAACG,IAAF,CAAOC,SAAX;AAAA,aANtB,EAOKnH,KAPL,CAOW,cAPX,EAO2B,CAP3B,EAQKA,KARL,CAQW,kBARX,EAQ+B,KAR/B;AAUAkH,YAAAA,IAAI,CAACtK,MAAL,CAAY,SAAZ,EACKzB,IADL,CACU,QADV,EACoB,UAAA4L,CAAC;AAAA,qBAAI,CAAC,CAACA,CAAC,CAAC9D,CAAH,EAAM,MAAI,CAAC9D,WAAL,GAAiB,CAAvB,CAAD,EAA4B,CAAC4H,CAAC,CAAC9D,CAAF,GAAI,CAAL,EAAQ,MAAI,CAAC9D,WAAL,GAAiB,CAAzB,CAA5B,EAAyD,CAAC4H,CAAC,CAAC9D,CAAF,GAAI,CAAL,EAAQ,MAAI,CAAC9D,WAAL,GAAiB,CAAzB,CAAzD,EAAsFiI,IAAtF,CAA2F,GAA3F,CAAJ;AAAA,aADrB,EAEKpH,KAFL,CAEW,cAFX,EAE2B,CAF3B,EAGKA,KAHL,CAGW,MAHX,EAGmB,UAAA+G,CAAC;AAAA,qBAAIA,CAAC,CAACG,IAAF,CAAOC,SAAX;AAAA,aAHpB,EAjCmB,CAsCnB;;AACAD,YAAAA,IAAI,CAACtK,MAAL,CAAY,MAAZ,EACKzB,IADL,CACU,GADV,EACe,UAAA4L,CAAC;AAAA,qBAAIA,CAAC,CAAC9D,CAAF,GAAI,CAAR;AAAA,aADhB,EAEK9H,IAFL,CAEU,OAFV,EAEmB,EAFnB,EAGKA,IAHL,CAGU,GAHV,EAGe,KAAKgE,WAAL,GAAiB,CAHhC,EAIKhE,IAJL,CAIU,QAJV,EAIoB,CAJpB,EAKKA,IALL,CAKU,OALV,EAKmB,2BALnB,EAMKA,IANL,CAMU,QANV,EAMoB,UAAA4L,CAAC;AAAA,qBAAIA,CAAC,CAACnG,EAAN;AAAA,aANrB,EAOKZ,KAPL,CAOW,SAPX,EAOsB,CAPtB;AAUA,gBAAIqH,MAAM,GAAG,KAAK3P,QAAL,CAAcC,IAAd,CAAmB,4BAAnB,CAAb;AACA0P,YAAAA,MAAM,CACH3O,EADH,CACM,YADN,EACoB,UAACW,KAAD,EAAW;AAC3B,cAAA,MAAI,CAACxB,iBAAL,CAAuByP,uBAAvB,GAAiD,IAAjD;AACD,aAHH,EAIG5O,EAJH,CAIM,YAJN,EAIoB,UAACW,KAAD,EAAW;AAC3B,cAAA,MAAI,CAACxB,iBAAL,CAAuByP,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 * as d3 from 'd3';\nimport * as d3ScaleChromatic from './libs/d3-scale-chromatic/index';\nimport {StatusmapTooltip} from './tooltip';\nimport {AnnotationTooltip} from './annotations';\nimport { Bucket, BucketMatrix } from './statusmap_data';\nimport { StatusHeatmapCtrl } from './module';\n\nlet MIN_CARD_SIZE = 5,\n CARD_H_SPACING = 2,\n CARD_V_SPACING = 2,\n CARD_ROUND = 0,\n DATA_RANGE_WIDING_FACTOR = 1.2,\n DEFAULT_X_TICK_SIZE_PX = 100,\n DEFAULT_Y_TICK_SIZE_PX = 50,\n X_AXIS_TICK_PADDING = 10,\n Y_AXIS_TICK_PADDING = 5,\n MIN_SELECTION_WIDTH = 2;\n\nexport default function rendering(scope: any, elem: any, attrs: any, ctrl: any) {\n return new StatusmapRenderer(scope, elem, attrs, ctrl);\n}\n\nclass Statusmap {\n $svg: any;\n svg: any;\n bucketMatrix: BucketMatrix;\n\n timeRange: {from: number, to: number} = {from:0, to:0};\n \n constructor() {\n\n }\n}\n\nexport class StatusmapRenderer {\n width: number = 0;\n height: number = 0;\n yScale: any;\n xScale: any;\n chartWidth: number = 0;\n chartHeight: number = 0;\n chartTop: number = 0;\n chartBottom: number = 0;\n yAxisWidth: number = 0;\n xAxisHeight: number = 0;\n cardVSpacing: number = 0;\n cardHSpacing: number = 0;\n cardRound: number = 0;\n cardWidth: number = 0;\n cardHeight: number = 0;\n colorScale: any;\n opacityScale: any;\n mouseUpHandler: any;\n xGridSize: number = 0;\n yGridSize: number = 0;\n\n bucketMatrix: BucketMatrix;\n panel: any;\n $heatmap: any;\n tooltip: StatusmapTooltip;\n annotationTooltip: AnnotationTooltip;\n heatmap: any;\n timeRange: any;\n\n yOffset: number;\n selection: any;\n padding: any;\n margin: any;\n dataRangeWidingFactor: number = DATA_RANGE_WIDING_FACTOR;\n\n constructor(private scope: any, private elem: any, attrs: any, private ctrl: StatusHeatmapCtrl) {\n // $heatmap is JQuery object, but heatmap is D3\n this.$heatmap = this.elem.find('.statusmap-panel');\n this.tooltip = new StatusmapTooltip(this.$heatmap, this.scope);\n this.annotationTooltip = new AnnotationTooltip(this.$heatmap, this.scope);\n\n this.yOffset = 0;\n\n this.selection = {\n active: false,\n x1: -1,\n x2: -1,\n };\n\n this.padding = { left: 0, right: 0, top: 0, bottom: 0 };\n this.margin = { left: 25, right: 15, top: 10, bottom: 20 };\n\n this.ctrl.events.on('render', this.onRender.bind(this));\n\n this.ctrl.tickValueFormatter = this.tickValueFormatter.bind(this);\n\n /////////////////////////////\n // Selection and crosshair //\n /////////////////////////////\n\n // Shared crosshair and tooltip this.empty = true;\n\n appEvents.on('graph-hover', this.onGraphHover.bind(this), this.scope);\n\n appEvents.on('graph-hover-clear', this.onGraphHoverClear.bind(this), this.scope);\n\n // Register selection listeners\n this.$heatmap.on('mousedown', this.onMouseDown.bind(this));\n this.$heatmap.on('mousemove', this.onMouseMove.bind(this));\n this.$heatmap.on('mouseleave', this.onMouseLeave.bind(this));\n this.$heatmap.on('click', this.onMouseClick.bind(this));\n }\n\n onGraphHoverClear() {\n this.clearCrosshair();\n }\n\n onGraphHover(event: { pos: any }) {\n this.drawSharedCrosshair(event.pos);\n }\n\n onRender() {\n this.render();\n this.ctrl.renderingCompleted();\n }\n\n\n setElementHeight(): boolean {\n try {\n var height = this.ctrl.height || this.panel.height || this.ctrl.row.height;\n if (_.isString(height)) {\n height = parseInt(height.replace('px', ''), 10);\n }\n\n height -= this.panel.legend.show ? 32 : 10; // bottom padding and space for legend. Change margin in .status-heatmap-color-legend !\n\n this.$heatmap.css('height', height + 'px');\n\n return true;\n } catch (e) { // IE throws errors sometimes\n return false;\n }\n }\n\n getYAxisWidth(elem: any): number {\n const axisText = elem.selectAll(\".axis-y text\").nodes();\n const maxTextWidth = _.max(_.map(axisText, text => {\n // Use SVG getBBox method\n return text.getBBox().width;\n }));\n\n return Math.ceil(maxTextWidth);\n }\n\n getXAxisHeight(elem: any): number {\n let axisLine = elem.select(\".axis-x line\");\n if (!axisLine.empty()) {\n let axisLinePosition = parseFloat(elem.select(\".axis-x line\").attr(\"y2\"));\n let canvasWidth = parseFloat(elem.attr(\"height\"));\n return canvasWidth - axisLinePosition;\n } else {\n // Default height\n return 30;\n }\n }\n\n addXAxis() {\n // Scale timestamps to cards centers\n //this.scope.xScale = this.xScale = d3.scaleTime()\n // .domain([this.timeRange.from, this.timeRange.to])\n // .range([this.xGridSize/2, this.chartWidth-this.xGridSize/2]);\n // Buckets without the most recent\n this.scope.xScale = this.xScale = d3.scaleTime()\n .domain([this.timeRange.from, this.timeRange.to])\n .range([this.xGridSize/2, this.chartWidth-this.xGridSize/2]);\n\n let ticks = this.chartWidth / DEFAULT_X_TICK_SIZE_PX;\n let grafanaTimeFormatter = grafanaTimeFormat(ticks, this.timeRange.from, this.timeRange.to);\n let timeFormat;\n let dashboardTimeZone = this.ctrl.dashboard.getTimezone();\n if (dashboardTimeZone === 'utc') {\n timeFormat = d3.utcFormat(grafanaTimeFormatter);\n } else {\n timeFormat = d3.timeFormat(grafanaTimeFormatter);\n }\n\n let xAxis = d3\n .axisBottom(this.xScale)\n .ticks(ticks)\n .tickFormat(timeFormat)\n .tickPadding(X_AXIS_TICK_PADDING)\n .tickSize(this.chartHeight);\n\n let posY = this.chartTop; // this.margin.top !\n let posX = this.yAxisWidth;\n\n this.heatmap.append(\"g\")\n .attr(\"class\", \"axis axis-x\")\n .attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\")\n .call(xAxis);\n\n // Remove horizontal line in the top of axis labels (called domain in d3)\n this.heatmap\n .select(\".axis-x\")\n .select(\".domain\")\n .remove();\n }\n\n // divide chart height by ticks for cards drawing\n getYScale(ticks: any[]) {\n let range:any[] = [];\n let step = this.chartHeight / ticks.length;\n // svg has y=0 on the top, so top card should have a minimal value in range\n range.push(step);\n for (let i = 1; i < ticks.length; i++) {\n range.push(step * (i+1));\n }\n return d3.scaleOrdinal()\n .domain(ticks)\n .range(range);\n }\n\n // divide chart height by ticks with offset for ticks drawing\n getYAxisScale(ticks: any[]) {\n let range:any[] = [];\n let step = this.chartHeight / ticks.length;\n // svg has y=0 on the top, so top tick should have a minimal value in range\n range.push(this.yOffset);\n for (let i = 1; i < ticks.length; i++) {\n range.push(step * i + this.yOffset);\n }\n return d3.scaleOrdinal()\n .domain(ticks)\n .range(range);\n }\n\n addYAxis() {\n let ticks = this.bucketMatrix.targets;\n\n if (this.panel.yAxisSort == 'a → z') {\n ticks.sort((a, b) => a.localeCompare(b, 'en', {ignorePunctuation: false, numeric: true}));\n } else if (this.panel.yAxisSort == 'z → a') {\n ticks.sort((b, a) => a.localeCompare(b, 'en', {ignorePunctuation: false, numeric: true}));\n }\n\n let yAxisScale = this.getYAxisScale(ticks);\n this.scope.yScale = this.yScale = this.getYScale(ticks);\n\n let yAxis = d3\n .axisLeft(yAxisScale)\n .tickValues(ticks)\n .tickSizeInner(0 - this.width)\n .tickPadding(Y_AXIS_TICK_PADDING);\n\n this.heatmap\n .append(\"g\")\n .attr(\"class\", \"axis axis-y\")\n .call(yAxis);\n\n // Calculate Y axis width first, then move axis into visible area\n let posY = this.margin.top;\n let posX = this.getYAxisWidth(this.heatmap) + Y_AXIS_TICK_PADDING;\n this.heatmap.select(\".axis-y\").attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\");\n\n // Remove vertical line in the right of axis labels (called domain in d3)\n this.heatmap.select(\".axis-y\").select(\".domain\").remove();\n this.heatmap.select(\".axis-y\").selectAll(\".tick line\").remove();\n }\n\n // Wide Y values range and adjust to bucket size\n wideYAxisRange(min: number, max: number, tickInterval: number) {\n let y_widing = (max * (this.dataRangeWidingFactor - 1) - min * (this.dataRangeWidingFactor - 1)) / 2;\n let y_min, y_max;\n\n if (tickInterval === 0) {\n y_max = max * this.dataRangeWidingFactor;\n y_min = min - min * (this.dataRangeWidingFactor - 1);\n tickInterval = (y_max - y_min) / 2;\n } else {\n y_max = Math.ceil((max + y_widing) / tickInterval) * tickInterval;\n y_min = Math.floor((min - y_widing) / tickInterval) * tickInterval;\n }\n\n // Don't wide axis below 0 if all values are positive\n if (min >= 0 && y_min < 0) {\n y_min = 0;\n }\n\n return {y_min, y_max};\n }\n\n tickValueFormatter(decimals, scaledDecimals = null) {\n let format = this.panel.yAxis.format;\n return function(value) {\n return kbn.valueFormats[format](value, decimals, scaledDecimals);\n };\n }\n\n // Create svg element, add axes and\n // calculate sizes for cards drawing\n addStatusmapCanvas() {\n let heatmap_elem = this.$heatmap[0];\n\n this.width = Math.floor(this.$heatmap.width()) - this.padding.right;\n this.height = Math.floor(this.$heatmap.height()) - this.padding.bottom;\n\n if (this.heatmap) {\n this.heatmap.remove();\n }\n\n // Insert svg as a first child into heatmap_elem\n // as the frozen tooltip moving logiс assumes that tooltip is the last child.\n this.heatmap = d3.select(heatmap_elem)\n .insert(\"svg\",\":first-child\")\n .attr(\"width\", this.width)\n .attr(\"height\", this.height);\n\n this.chartHeight = this.height - this.margin.top - this.margin.bottom;\n this.chartTop = this.margin.top;\n this.chartBottom = this.chartTop + this.chartHeight;\n\n this.cardHSpacing = this.panel.cards.cardHSpacing !== null ? this.panel.cards.cardHSpacing : CARD_H_SPACING;\n this.cardVSpacing = this.panel.cards.cardVSpacing !== null ? this.panel.cards.cardVSpacing : CARD_V_SPACING;\n this.cardRound = this.panel.cards.cardRound !== null ? this.panel.cards.cardRound : CARD_ROUND;\n\n // calculate yOffset for YAxis\n this.yGridSize = this.chartHeight;\n if (this.bucketMatrix.targets.length > 0) {\n this.yGridSize = Math.floor(this.chartHeight / this.bucketMatrix.targets.length);\n }\n this.cardHeight = this.yGridSize ? this.yGridSize - this.cardVSpacing : 0;\n this.yOffset = this.cardHeight / 2;\n\n this.addYAxis();\n\n this.yAxisWidth = this.getYAxisWidth(this.heatmap) + Y_AXIS_TICK_PADDING;\n this.chartWidth = this.width - this.yAxisWidth - this.margin.right;\n\n // TODO allow per-y cardWidth!\n // we need to fill chartWidth with xBucketSize cards.\n this.xGridSize = this.chartWidth / (this.bucketMatrix.xBucketSize+1);\n this.cardWidth = this.xGridSize - this.cardHSpacing;\n\n this.addXAxis();\n this.xAxisHeight = this.getXAxisHeight(this.heatmap);\n\n if (!this.panel.yAxis.show) {\n this.heatmap.select(\".axis-y\").selectAll(\"line\").style(\"opacity\", 0);\n }\n\n if (!this.panel.xAxis.show) {\n this.heatmap.select(\".axis-x\").selectAll(\"line\").style(\"opacity\", 0);\n }\n }\n\n addStatusmap():void {\n let maxValue = this.panel.color.max || this.bucketMatrix.maxValue;\n let minValue = this.panel.color.min || this.bucketMatrix.minValue;\n\n if (this.panel.color.mode !== 'discrete') {\n this.colorScale = this.getColorScale(maxValue, minValue);\n }\n this.setOpacityScale(maxValue);\n\n // Draw cards from buckets.\n this.heatmap.selectAll(\".statusmap-cards-row\").data(this.bucketMatrix.targets)\n .enter()\n .selectAll(\".statustmap-card\")\n .data((target:string) => this.bucketMatrix.buckets[target])\n .enter()\n .append(\"rect\")\n .attr(\"cardId\", (b:Bucket) => b.id)\n .attr(\"xid\", (b:Bucket) => b.xid)\n .attr(\"yid\", (b:Bucket) => b.yLabel)\n .attr(\"x\", this.getCardX.bind(this))\n .attr(\"width\", this.getCardWidth.bind(this))\n .attr(\"y\", this.getCardY.bind(this))\n .attr(\"height\", this.getCardHeight.bind(this))\n .attr(\"rx\", this.cardRound)\n .attr(\"ry\", this.cardRound)\n .attr(\"class\", (b:Bucket) => b.isEmpty() ? \"empty-card\" : \"bordered statusmap-card\")\n .style(\"fill\", this.getCardColor.bind(this))\n .style(\"stroke\", this.getCardColor.bind(this))\n .style(\"stroke-width\", 0)\n //.style(\"stroke-width\", getCardStrokeWidth)\n //.style(\"stroke-dasharray\", \"3,3\")\n .style(\"opacity\", this.getCardOpacity.bind(this));\n\n // Set mouse events on cards.\n let $cards = this.$heatmap.find(\".statusmap-card + .bordered\");\n $cards\n .on(\"mouseenter\", (event) => {\n this.tooltip.mouseOverBucket = true;\n this.highlightCard(event);\n })\n .on(\"mouseleave\", (event) => {\n this.tooltip.mouseOverBucket = false;\n this.resetCardHighLight(event);\n });\n\n this._renderAnnotations();\n\n this.ctrl.events.emit('render-complete', {\n \"chartWidth\": this.chartWidth\n });\n }\n\n highlightCard(event) {\n const color = d3.select(event.target).style(\"fill\");\n const highlightColor = d3.color(color).darker(2);\n const strokeColor = d3.color(color).brighter(4);\n const current_card = d3.select(event.target);\n this.tooltip.originalFillColor = color;\n current_card\n .style(\"fill\", highlightColor.toString())\n .style(\"stroke\", strokeColor.toString())\n .style(\"stroke-width\", 1);\n }\n\n resetCardHighLight(event) {\n d3.select(event.target)\n .style(\"fill\", this.tooltip.originalFillColor)\n .style(\"stroke\", this.tooltip.originalFillColor)\n .style(\"stroke-width\", 0);\n }\n\n getColorScale(maxValue, minValue = 0) {\n let colorScheme = _.find(this.ctrl.colorSchemes, {value: this.panel.color.colorScheme});\n let colorInterpolator = d3ScaleChromatic[colorScheme.value];\n let colorScaleInverted = colorScheme.invert === 'always' ||\n (colorScheme.invert === 'dark' && !contextSrv.user.lightTheme);\n\n if (maxValue == minValue)\n maxValue = minValue + 1;\n\n let start = colorScaleInverted ? maxValue : minValue;\n let end = colorScaleInverted ? minValue : maxValue;\n\n return d3.scaleSequential(colorInterpolator).domain([start, end]);\n }\n\n setOpacityScale(maxValue) {\n if (this.panel.color.colorScale === 'linear') {\n this.opacityScale = d3.scaleLinear()\n .domain([0, maxValue])\n .range([0, 1]);\n } else if (this.panel.color.colorScale === 'sqrt') {\n this.opacityScale = d3.scalePow().exponent(this.panel.color.exponent)\n .domain([0, maxValue])\n .range([0, 1]);\n }\n }\n\n getCardX(b: Bucket) {\n let x;\n // cx is the center of the card. Card should be placed to the left.\n //let cx = this.xScale(d.x);\n let rightX = (b.relTo / this.bucketMatrix.rangeMs) * this.chartWidth;\n let cx = rightX - this.cardWidth/2;\n\n if (cx - this.cardWidth/2 < 0) {\n x = this.yAxisWidth + this.cardHSpacing/2;\n } else {\n x = this.yAxisWidth + cx - this.cardWidth/2;\n }\n\n return x;\n }\n\n // xScale returns card center. Adjust cardWidth in case of overlaping.\n getCardWidth(b: Bucket) {\n //return 20;\n let w;\n\n let rightX = (b.relTo / this.bucketMatrix.rangeMs) * this.chartWidth;\n let cx = rightX - this.cardWidth/2;\n //let cx = this.xScale(d.x);\n\n if (cx < this.cardWidth/2) {\n // Center should not exceed half of card.\n // Cut card to the left to prevent overlay of y axis.\n let cutted_width = (cx - this.cardHSpacing/2) + this.cardWidth/2;\n w = cutted_width > 0 ? cutted_width : 0;\n } else if (this.chartWidth - cx < this.cardWidth/2) {\n // Cut card to the right to prevent overlay of right graph edge.\n w = this.cardWidth/2 + (this.chartWidth - cx - this.cardHSpacing/2);\n } else {\n w = this.cardWidth;\n }\n\n // Card width should be MIN_CARD_SIZE at least\n w = Math.max(w, MIN_CARD_SIZE);\n\n if (this.cardHSpacing == 0) {\n w = w+1;\n }\n\n return w;\n }\n\n // Top y for card.\n // yScale gives ???\n // \n getCardY(b: Bucket) {\n return this.yScale(b.yLabel) + this.chartTop - this.cardHeight - this.cardVSpacing/2;\n }\n\n getCardHeight(b: Bucket) {\n //return 20;\n let ys = this.yScale(b.yLabel);\n let y = ys + this.chartTop - this.cardHeight - this.cardVSpacing/2;\n let h = this.cardHeight;\n\n // Cut card height to prevent overlay\n if (y < this.chartTop) {\n h = ys - this.cardVSpacing/2;\n } else if (ys > this.chartBottom) {\n h = this.chartBottom - y;\n } else if (y + this.cardHeight > this.chartBottom) {\n h = this.chartBottom - y;\n }\n\n // Height can't be more than chart height\n h = Math.min(h, this.chartHeight);\n // Card height should be MIN_CARD_SIZE at least\n h = Math.max(h, MIN_CARD_SIZE);\n\n if (this.cardVSpacing == 0) {\n h = h+1\n }\n\n return h;\n }\n\n getCardColor(bucket: Bucket) {\n if (this.panel.color.mode === 'opacity') {\n return this.panel.color.cardColor;\n } else if (this.panel.color.mode === 'spectrum') {\n return this.colorScale(bucket.value);\n } else if (this.panel.color.mode === 'discrete') {\n if (this.panel.seriesFilterIndex != null && this.panel.seriesFilterIndex != -1) {\n return this.ctrl.discreteExtraSeries.getBucketColorSingle(bucket.values[this.panel.seriesFilterIndex]);\n } else {\n return this.ctrl.discreteExtraSeries.getBucketColor(bucket.values);\n }\n }\n }\n\n getCardOpacity(bucket: Bucket) {\n if (this.panel.nullPointMode === 'as empty' && bucket.value == null ) {\n return 0;\n }\n if (this.panel.color.mode === 'opacity') {\n return this.opacityScale(bucket.value);\n } else {\n return 1;\n }\n }\n\n getCardStrokeWidth(b: Bucket) {\n if (this.panel.color.mode === 'discrete') {\n return '1';\n }\n return '0';\n }\n\n\n /////////////////////////////\n // Selection and crosshair //\n /////////////////////////////\n\n getEventOffset(event) {\n const elemOffset = this.$heatmap.offset();\n const x = Math.floor(event.clientX - elemOffset.left);\n const y = Math.floor(event.clientY - elemOffset.top);\n return { x, y };\n }\n\n onMouseDown(event) {\n const offset = this.getEventOffset(event);\n this.selection.active = true;\n this.selection.x1 = offset.x;\n\n this.mouseUpHandler = () => {\n this.onMouseUp();\n };\n\n $(document).one(\"mouseup\", this.mouseUpHandler.bind(this));\n }\n\n onMouseUp() {\n $(document).unbind(\"mouseup\", this.mouseUpHandler.bind(this));\n this.mouseUpHandler = null;\n this.selection.active = false;\n\n let selectionRange = Math.abs(this.selection.x2 - this.selection.x1);\n if (this.selection.x2 >= 0 && selectionRange > MIN_SELECTION_WIDTH) {\n let timeFrom = this.xScale.invert(Math.min(this.selection.x1, this.selection.x2) - this.yAxisWidth - this.xGridSize/2);\n let timeTo = this.xScale.invert(Math.max(this.selection.x1, this.selection.x2) - this.yAxisWidth - this.xGridSize/2);\n\n this.ctrl.timeSrv.setTime({\n from: moment.utc(timeFrom),\n to: moment.utc(timeTo)\n });\n }\n\n this.clearSelection();\n }\n\n onMouseLeave(e) {\n appEvents.emit('graph-hover-clear');\n this.clearCrosshair();\n this.annotationTooltip.destroy();\n }\n\n onMouseMove(event: MouseEvent) {\n if (!this.heatmap) { return; }\n\n const offset = this.getEventOffset(event);\n if (this.selection.active) {\n // Clear crosshair and tooltip\n this.clearCrosshair();\n this.tooltip.destroy();\n this.annotationTooltip.destroy();\n\n this.selection.x2 = this.limitSelection(event.offsetX);\n this.drawSelection(this.selection.x1, this.selection.x2);\n } else {\n //const pos = this.getEventPos(event, offset);\n this.emitGraphHoverEvent(event);\n this.drawCrosshair(offset.x);\n this.tooltip.show(event);\n this.annotationTooltip.show(event);\n }\n }\n\n // TODO emit an event and move logic to panelCtrl\n public onMouseClick(e: MouseEvent) {\n if (this.ctrl.panel.tooltip.freezeOnClick) {\n this.tooltip.showFrozen(e);\n this.tooltip.destroy();\n }\n }\n\n getEventPos(event, offset) {\n const x = this.xScale.invert(offset.x - this.yAxisWidth).valueOf();\n const y = this.yScale.invert(offset.y - this.chartTop);\n const pos = {\n pageX: event.pageX,\n pageY: event.pageY,\n x: x,\n x1: x,\n y: y,\n y1: y,\n panelRelY: null,\n offset,\n };\n\n return pos;\n }\n\n emitGraphHoverEvent(event) {\n let x = this.xScale.invert(event.offsetX - this.yAxisWidth - this.xGridSize/2).valueOf();\n let y = this.yScale(event.offsetY);\n let pos = {\n pageX: event.pageX,\n pageY: event.pageY,\n x: x, x1: x,\n y: y, y1: y,\n panelRelY: 0\n };\n\n // Set minimum offset to prevent showing legend from another panel\n pos.panelRelY = Math.max(event.offsetY / this.height, 0.001);\n\n // broadcast to other graph panels that we are hovering\n appEvents.emit('graph-hover', {pos: pos, panel: this.panel});\n }\n\n limitSelection(x2) {\n x2 = Math.max(x2, this.yAxisWidth);\n x2 = Math.min(x2, this.chartWidth + this.yAxisWidth);\n return x2;\n }\n\n drawSelection(posX1, posX2) {\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-selection\").remove();\n let selectionX = Math.min(posX1, posX2);\n let selectionWidth = Math.abs(posX1 - posX2);\n\n if (selectionWidth > MIN_SELECTION_WIDTH) {\n this.heatmap.append(\"rect\")\n .attr(\"class\", \"status-heatmap-selection\")\n .attr(\"x\", selectionX)\n .attr(\"width\", selectionWidth)\n .attr(\"y\", this.chartTop)\n .attr(\"height\", this.chartHeight);\n }\n }\n }\n\n clearSelection() {\n this.selection.x1 = -1;\n this.selection.x2 = -1;\n\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-selection\").remove();\n }\n }\n\n\n drawCrosshair(position) {\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-crosshair\").remove();\n\n let posX = position;\n posX = Math.max(posX, this.yAxisWidth);\n posX = Math.min(posX, this.chartWidth + this.yAxisWidth);\n\n this.heatmap.append(\"g\")\n .attr(\"class\", \"status-heatmap-crosshair\")\n .attr(\"transform\", \"translate(\" + posX + \",0)\")\n .append(\"line\")\n .attr(\"x1\", 1)\n .attr(\"y1\", this.chartTop)\n .attr(\"x2\", 1)\n .attr(\"y2\", this.chartBottom)\n .attr(\"stroke-width\", 1);\n }\n }\n\n // map time to X\n drawSharedCrosshair(pos) {\n if (this.heatmap && this.ctrl.dashboard.graphTooltip !== 0) {\n const posX = this.xScale(pos.x) + this.yAxisWidth;\n this.drawCrosshair(posX);\n }\n }\n\n clearCrosshair() {\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-crosshair\").remove();\n }\n }\n\n\n render() {\n this.panel = this.ctrl.panel;\n this.timeRange = this.ctrl.range;\n this.bucketMatrix = this.ctrl.bucketMatrix;\n\n if (!this.bucketMatrix || !this.setElementHeight()) {\n return;\n }\n\n // Draw default axes and return if no data\n this.addStatusmapCanvas();\n if (this.bucketMatrix.noDatapoints) {\n return;\n }\n\n this.addStatusmap();\n this.scope.yAxisWidth = this.yAxisWidth;\n this.scope.xAxisHeight = this.xAxisHeight;\n this.scope.chartHeight = this.chartHeight;\n this.scope.chartWidth = this.chartWidth;\n this.scope.chartTop = this.chartTop;\n }\n\n _renderAnnotations() {\n if (!this.ctrl.annotations || this.ctrl.annotations.length == 0) {\n return;\n }\n\n if (!this.heatmap) {\n return;\n }\n\n\n\n let annoData = _.map(this.ctrl.annotations, (d,i) => ({\"x\": Math.floor(this.yAxisWidth + this.xScale(d.time)), \"id\":i, \"anno\": d.source}));\n\n //({\"ctrl_annotations\": this.ctrl.annotations, \"annoData\": annoData});\n\n let anno = this.heatmap\n .append(\"g\")\n .attr(\"class\", \"statusmap-annotations\")\n .attr(\"transform\", \"translate(0.5,0)\")\n .selectAll(\".statusmap-annotations\")\n .data(annoData)\n .enter().append(\"g\")\n ;\n anno.append(\"line\")\n //.attr(\"class\", \"statusmap-annotation-tick\")\n .attr(\"x1\", d => d.x)\n .attr(\"y1\", this.chartTop)\n .attr(\"x2\", d => d.x)\n .attr(\"y2\", this.chartBottom)\n .style(\"stroke\", d => d.anno.iconColor)\n .style(\"stroke-width\", 1)\n .style(\"stroke-dasharray\", \"3,3\")\n ;\n anno.append(\"polygon\")\n .attr(\"points\", d => [[d.x, this.chartBottom+1], [d.x-5, this.chartBottom+6], [d.x+5, this.chartBottom+6]].join(\" \"))\n .style(\"stroke-width\", 0)\n .style(\"fill\", d => d.anno.iconColor)\n ;\n // Polygons didn't fire mouseevents\n anno.append(\"rect\")\n .attr(\"x\", d => d.x-5)\n .attr(\"width\", 10)\n .attr(\"y\", this.chartBottom+1)\n .attr(\"height\", 5)\n .attr(\"class\", \"statusmap-annotation-tick\")\n .attr(\"annoId\", d => d.id)\n .style(\"opacity\", 0)\n ;\n\n let $ticks = this.$heatmap.find(\".statusmap-annotation-tick\");\n $ticks\n .on(\"mouseenter\", (event) => {\n this.annotationTooltip.mouseOverAnnotationTick = true;\n })\n .on(\"mouseleave\", (event) => {\n this.annotationTooltip.mouseOverAnnotationTick = false;\n });\n }\n}\n\nfunction grafanaTimeFormat(ticks, min, max) {\n if (min && max && ticks) {\n let range = max - min;\n let secPerTick = (range/ticks) / 1000;\n let oneDay = 86400000;\n let oneYear = 31536000000;\n\n if (secPerTick <= 45) {\n return \"%H:%M:%S\";\n }\n if (secPerTick <= 7200 || range <= oneDay) {\n return \"%H:%M\";\n }\n if (secPerTick <= 80000) {\n return \"%m/%d %H:%M\";\n }\n if (secPerTick <= 2419200 || range <= oneYear) {\n return \"%m/%d\";\n }\n return \"%Y-%m\";\n }\n\n return \"%H:%M\";\n}\n"],"file":"rendering.js"}
\ No newline at end of file
diff --git a/dist/specs/panel_config_migration.js b/dist/specs/panel_config_migration.js
new file mode 100644
index 0000000..178a79c
--- /dev/null
+++ b/dist/specs/panel_config_migration.js
@@ -0,0 +1,166 @@
+"use strict";
+
+System.register(["../panel_config_migration"], function (_export, _context) {
+ "use strict";
+
+ var migratePanelConfig;
+ return {
+ setters: [function (_panel_config_migration) {
+ migratePanelConfig = _panel_config_migration.migratePanelConfig;
+ }],
+ execute: function () {
+ describe('when migrate from config with urls', function () {
+ var panel;
+ describe('given full panel configuration', function () {
+ var panelConfig = {
+ "cards": {
+ "cardHSpacing": 2,
+ "cardMinWidth": 5,
+ "cardRound": null,
+ "cardVSpacing": 2
+ },
+ "color": {
+ "cardColor": "#b4ff00",
+ "colorScale": "sqrt",
+ "colorScheme": "interpolateGnYlRd",
+ "defaultColor": "#757575",
+ "exponent": 0.5,
+ "mode": "opacity",
+ "thresholds": []
+ },
+ "data": {
+ "decimals": null,
+ "unitFormat": "short"
+ },
+ "datasource": "TestData DB",
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 0
+ },
+ "highlightCards": true,
+ "id": 4,
+ "legend": {
+ "show": false
+ },
+ "nullPointMode": "as empty",
+ "seriesFilterIndex": -1,
+ "targets": [{
+ "aggregation": "Last",
+ "csvWave": {
+ "timeStep": 60,
+ "valuesCSV": "0,0,2,2,1,1,3,3"
+ },
+ "decimals": 2,
+ "displayAliasType": "Warning / Critical",
+ "displayType": "Regular",
+ "displayValueWithAlias": "Never",
+ "refId": "A",
+ "scenarioId": "predictable_csv_wave",
+ "stringInput": "",
+ "units": "none",
+ "valueHandler": "Number Threshold"
+ }],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Panel Title",
+ "tooltip": {
+ "show": true
+ },
+ "type": "flant-statusmap-panel",
+ "urls": [{
+ "base_url": "",
+ "extraSeries": {
+ "index": -1
+ },
+ "forcelowercase": true,
+ "icon_fa": "external-link",
+ "label": "",
+ "tooltip": "",
+ "useExtraSeries": false,
+ "useseriesname": true
+ }],
+ "useMax": true,
+ "usingUrl": true,
+ "xAxis": {
+ "labelFormat": "%a %m/%d",
+ "show": true
+ },
+ "yAxis": {
+ "maxWidth": -1,
+ "minWidth": -1,
+ "show": true
+ },
+ "yAxisSort": "metrics"
+ };
+ beforeEach(function () {
+ panel = Object.assign({}, panelConfig);
+ migratePanelConfig(panel);
+ });
+ it('should migrate usingUrls to tooltip.freezeOnClick', function () {
+ expect(panel.usingUrl).toBeUndefined();
+ expect(panel.tooltip).toHaveProperty("freezeOnClick", true);
+ expect(panel.tooltip.freezeOnClick).toBeTruthy();
+ });
+ it('should have no urls', function () {
+ expect(panel.urls).toBeUndefined();
+ });
+ it('should have empty items in tooltip', function () {
+ expect(panel.tooltip).toHaveProperty("items", []);
+ expect(panel.tooltip.items).toHaveLength(0);
+ });
+ });
+ describe("given configuration with non-empty base_url", function () {
+ describe("with variables", function () {
+ var panelConfig = {
+ "tooltip": {
+ "show": true
+ },
+ "urls": [{
+ "base_url": "https://google.com/$series_label$time",
+ "extraSeries": {
+ "index": -1
+ },
+ "forcelowercase": true,
+ "icon_fa": "external-link",
+ "label": "google",
+ "tooltip": "",
+ "useExtraSeries": false,
+ "useseriesname": true
+ }, {
+ "base_url": "example.com/$series_extra",
+ "extraSeries": {
+ "format": "YYYY/MM/DD/HH_mm_ss",
+ "index": -1
+ },
+ "forcelowercase": true,
+ "icon_fa": "external-link",
+ "label": "DateLink",
+ "useExtraSeries": true
+ }]
+ };
+ beforeEach(function () {
+ panel = Object.assign({}, panelConfig);
+ migratePanelConfig(panel);
+ });
+ it("should have equal size of tooltip.items", function () {
+ expect(panel.tooltip).toHaveProperty("items");
+ expect(panel.tooltip.items).toHaveLength(panelConfig.urls.length);
+ });
+ it("should replace time variable with __url_time_range", function () {
+ expect(panel.tooltip.items[0].urlTemplate).toContain("${__url_time_range}");
+ });
+ it("should replace series_label variable with __y_label", function () {
+ expect(panel.tooltip.items[0].urlTemplate).toContain("${__y_label}");
+ });
+ it("should replace series_extra variable with __value_date", function () {
+ expect(panel.tooltip.items[1].urlTemplate).toContain("${__value_date}");
+ });
+ });
+ });
+ });
+ }
+ };
+});
+//# sourceMappingURL=panel_config_migration.js.map
diff --git a/dist/specs/panel_config_migration.js.map b/dist/specs/panel_config_migration.js.map
new file mode 100644
index 0000000..e95dd1c
--- /dev/null
+++ b/dist/specs/panel_config_migration.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../../src/specs/panel_config_migration.test.ts"],"names":["migratePanelConfig","describe","panel","panelConfig","beforeEach","Object","assign","it","expect","usingUrl","toBeUndefined","tooltip","toHaveProperty","freezeOnClick","toBeTruthy","urls","items","toHaveLength","length","urlTemplate","toContain"],"mappings":"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","sourcesContent":["import { migratePanelConfig } from '../panel_config_migration';\n\ndescribe('when migrate from config with urls', () => {\n let panel: any;\n\n describe('given full panel configuration', () => {\n const panelConfig = {\n \"cards\": {\n \"cardHSpacing\": 2,\n \"cardMinWidth\": 5,\n \"cardRound\": null,\n \"cardVSpacing\": 2\n },\n \"color\": {\n \"cardColor\": \"#b4ff00\",\n \"colorScale\": \"sqrt\",\n \"colorScheme\": \"interpolateGnYlRd\",\n \"defaultColor\": \"#757575\",\n \"exponent\": 0.5,\n \"mode\": \"opacity\",\n \"thresholds\": []\n },\n \"data\": {\n \"decimals\": null,\n \"unitFormat\": \"short\"\n },\n \"datasource\": \"TestData DB\",\n \"gridPos\": {\n \"h\": 8,\n \"w\": 12,\n \"x\": 0,\n \"y\": 0\n },\n \"highlightCards\": true,\n \"id\": 4,\n \"legend\": {\n \"show\": false\n },\n \"nullPointMode\": \"as empty\",\n \"seriesFilterIndex\": -1,\n \"targets\": [\n {\n \"aggregation\": \"Last\",\n \"csvWave\": {\n \"timeStep\": 60,\n \"valuesCSV\": \"0,0,2,2,1,1,3,3\"\n },\n \"decimals\": 2,\n \"displayAliasType\": \"Warning / Critical\",\n \"displayType\": \"Regular\",\n \"displayValueWithAlias\": \"Never\",\n \"refId\": \"A\",\n \"scenarioId\": \"predictable_csv_wave\",\n \"stringInput\": \"\",\n \"units\": \"none\",\n \"valueHandler\": \"Number Threshold\"\n }\n ],\n \"timeFrom\": null,\n \"timeShift\": null,\n \"title\": \"Panel Title\",\n \"tooltip\": {\n \"show\": true\n },\n \"type\": \"flant-statusmap-panel\",\n \"urls\": [\n {\n \"base_url\": \"\",\n \"extraSeries\": {\n \"index\": -1\n },\n \"forcelowercase\": true,\n \"icon_fa\": \"external-link\",\n \"label\": \"\",\n \"tooltip\": \"\",\n \"useExtraSeries\": false,\n \"useseriesname\": true\n }\n ],\n \"useMax\": true,\n \"usingUrl\": true,\n \"xAxis\": {\n \"labelFormat\": \"%a %m/%d\",\n \"show\": true\n },\n \"yAxis\": {\n \"maxWidth\": -1,\n \"minWidth\": -1,\n \"show\": true\n },\n \"yAxisSort\": \"metrics\"\n }\n\n beforeEach(() => {\n panel = Object.assign({}, panelConfig);\n migratePanelConfig(panel);\n });\n\n it('should migrate usingUrls to tooltip.freezeOnClick', () => {\n expect(panel.usingUrl).toBeUndefined();\n expect(panel.tooltip).toHaveProperty(\"freezeOnClick\", true);\n expect(panel.tooltip.freezeOnClick).toBeTruthy();\n });\n\n it('should have no urls', () => {\n expect(panel.urls).toBeUndefined();\n });\n\n it('should have empty items in tooltip', () => {\n expect(panel.tooltip).toHaveProperty(\"items\", []);\n expect(panel.tooltip.items).toHaveLength(0);\n });\n });\n\n describe(\"given configuration with non-empty base_url\", () => {\n\n describe(\"with variables\", () => {\n const panelConfig = {\n \"tooltip\": {\n \"show\": true\n },\n \"urls\": [\n {\n \"base_url\": \"https://google.com/$series_label$time\",\n \"extraSeries\": {\n \"index\": -1\n },\n \"forcelowercase\": true,\n \"icon_fa\": \"external-link\",\n \"label\": \"google\",\n \"tooltip\": \"\",\n \"useExtraSeries\": false,\n \"useseriesname\": true,\n },\n {\n \"base_url\": \"example.com/$series_extra\",\n \"extraSeries\": {\n \"format\": \"YYYY/MM/DD/HH_mm_ss\",\n \"index\": -1\n },\n \"forcelowercase\": true,\n \"icon_fa\": \"external-link\",\n \"label\": \"DateLink\",\n \"useExtraSeries\": true,\n }\n ]\n };\n beforeEach(() => {\n panel = Object.assign({}, panelConfig);\n migratePanelConfig(panel);\n });\n\n it(\"should have equal size of tooltip.items\", () => {\n expect(panel.tooltip).toHaveProperty(\"items\");\n expect(panel.tooltip.items).toHaveLength(panelConfig.urls.length);\n });\n it(\"should replace time variable with __url_time_range\", () => {\n expect(panel.tooltip.items[0].urlTemplate).toContain(\"${__url_time_range}\");\n });\n it(\"should replace series_label variable with __y_label\", () => {\n expect(panel.tooltip.items[0].urlTemplate).toContain(\"${__y_label}\");\n });\n it(\"should replace series_extra variable with __value_date\", () => {\n expect(panel.tooltip.items[1].urlTemplate).toContain(\"${__value_date}\");\n });\n });\n });\n});\n"],"file":"panel_config_migration.js"}
\ No newline at end of file
diff --git a/dist/tooltip.js b/dist/tooltip.js
index 6ad6d4b..24ef6b8 100644
--- a/dist/tooltip.js
+++ b/dist/tooltip.js
@@ -3,7 +3,7 @@
System.register(["d3", "jquery", "lodash"], function (_export, _context) {
"use strict";
- var d3, $, _, TOOLTIP_PADDING_X, TOOLTIP_PADDING_Y, StatusmapTooltip;
+ var d3, $, _, TOOLTIP_PADDING_X, TOOLTIP_PADDING_Y, DefaultValueDateFormat, StatusmapTooltip;
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
@@ -23,7 +23,10 @@ System.register(["d3", "jquery", "lodash"], function (_export, _context) {
}],
execute: function () {
TOOLTIP_PADDING_X = 30;
- TOOLTIP_PADDING_Y = 5;
+ TOOLTIP_PADDING_Y = 5; // TODO rename file to tooltip_ctrl.ts
+ // TODO move DefaultValueDateFormat into tooltip.ts, as it used in several places (migration, partial and tooltip render)
+
+ DefaultValueDateFormat = 'YYYY/MM/DD/HH_mm_ss';
_export("StatusmapTooltip", StatusmapTooltip =
/*#__PURE__*/
@@ -41,17 +44,21 @@ System.register(["d3", "jquery", "lodash"], function (_export, _context) {
_defineProperty(this, "panel", void 0);
- _defineProperty(this, "heatmapPanel", void 0);
+ _defineProperty(this, "panelElem", void 0);
_defineProperty(this, "mouseOverBucket", void 0);
_defineProperty(this, "originalFillColor", void 0);
+ _defineProperty(this, "tooltipWidth", void 0);
+
+ _defineProperty(this, "tooltipFrozen", void 0);
+
this.scope = scope;
this.dashboard = scope.ctrl.dashboard;
this.panelCtrl = scope.ctrl;
this.panel = scope.ctrl.panel;
- this.heatmapPanel = elem;
+ this.panelElem = elem;
this.mouseOverBucket = false;
this.originalFillColor = null;
elem.on("mouseover", this.onMouseOver.bind(this));
@@ -67,7 +74,7 @@ System.register(["d3", "jquery", "lodash"], function (_export, _context) {
if (!this.tooltip) {
this.add();
- this.move(e);
+ this.move(e, this.tooltip);
}
}
}, {
@@ -82,12 +89,12 @@ System.register(["d3", "jquery", "lodash"], function (_export, _context) {
return;
}
- this.move(e);
+ this.move(e, this.tooltip);
}
}, {
key: "add",
value: function add() {
- this.tooltip = d3.select("body").append("div").attr("class", "statusmap-tooltip graph-tooltip grafana-tooltip");
+ this.tooltip = d3.select("body").append("div").attr("class", "graph-tooltip statusmap-tooltip");
}
}, {
key: "destroy",
@@ -98,6 +105,22 @@ System.register(["d3", "jquery", "lodash"], function (_export, _context) {
this.tooltip = null;
}
+ }, {
+ key: "removeFrozen",
+ value: function removeFrozen() {
+ if (this.tooltipFrozen) {
+ this.tooltipFrozen.remove();
+ this.tooltipFrozen = null;
+ }
+ }
+ }, {
+ key: "showFrozen",
+ value: function showFrozen(pos) {
+ this.removeFrozen();
+ this.tooltipFrozen = d3.select(this.panelElem[0]).append("div").attr("class", "graph-tooltip statusmap-tooltip statusmap-tooltip-frozen");
+ this.displayTooltip(pos, this.tooltipFrozen, true);
+ this.moveRelative(pos, this.tooltipFrozen);
+ }
}, {
key: "show",
value: function show(pos) {
@@ -110,6 +133,13 @@ System.register(["d3", "jquery", "lodash"], function (_export, _context) {
return;
}
+ this.displayTooltip(pos, this.tooltip, false);
+ this.move(pos, this.tooltip);
+ } // Retrieve bucket and create html content inside tooltip’s div element.
+
+ }, {
+ key: "displayTooltip",
+ value: function displayTooltip(pos, tooltip, frozen) {
var cardEl = d3.select(pos.target);
var yid = cardEl.attr('yid');
var xid = cardEl.attr('xid');
@@ -121,41 +151,137 @@ System.register(["d3", "jquery", "lodash"], function (_export, _context) {
}
var timestamp = bucket.to;
- var name = bucket.yLabel;
+ var yLabel = bucket.yLabel;
var value = bucket.value;
- var values = bucket.values;
+ var values = bucket.values; // TODO create option for this formatting.
+
var tooltipTimeFormat = 'YYYY-MM-DD HH:mm:ss';
- var time = this.dashboard.formatDate(+timestamp, tooltipTimeFormat);
- var tooltipHtml = "
".concat(time, "
\n ");
- var statuses;
+ var time = this.dashboard.formatDate(+timestamp, tooltipTimeFormat); // Close button for the frozen tooltip.
+
+ var tooltipClose = "";
+
+ if (frozen) {
+ tooltipClose = "\n\n \n\n";
+ }
+
+ var tooltipHtml = "
".concat(time).concat(tooltipClose, "
");
if (this.panel.color.mode === 'discrete') {
+ var statuses;
+
if (this.panel.seriesFilterIndex >= 0) {
statuses = this.panelCtrl.discreteExtraSeries.convertValueToTooltips(value);
} else {
statuses = this.panelCtrl.discreteExtraSeries.convertValuesToTooltips(values);
}
- var statusesHtml = '';
+ var statusTitle = "status:";
- if (statuses.length === 1) {
- statusesHtml = "status:";
- } else if (statuses.length > 1) {
- statusesHtml = "statuses:";
+ if (statuses.length > 1) {
+ statusTitle = "statuses:";
}
- tooltipHtml += "\n
`), \"\\n\");\n\n }\n\n // Ambiguous state: there multiple values in bucket!\n // TODO rename useMax to expectMultipleValues\n if (!this.panel.useMax && bucket.multipleValues) {\n tooltipHtml += `
");
- } // Discrete mode errors
-
-
- if (this.panel.color.mode === 'discrete') {
- if (card.noColorDefined) {
- var badValues = this.panelCtrl.discreteExtraSeries.getNotColoredValues(values);
- tooltipHtml += "
Error: ".concat(this.panelCtrl.dataWarnings.noColorDefined.title, "\n not colored values:\n
\n ").concat(_.join(_.map(badValues, function (v) {
- return "
".concat(v, "
");
- }), ""), "\n
\n
");
- }
- }
-
- this.tooltip.html(tooltipHtml);
- this.move(pos);
- }
- }, {
- key: "formatExtraSeries",
- value: function formatExtraSeries(value, type) {
- var extraSeries = '';
-
- switch (type) {
- case ExtraSeriesFormatValue.Date:
- extraSeries = this.dashboard.formatDate(+value, type);
- return extraSeries;
-
- case ExtraSeriesFormatValue.Raw:
- extraSeries = value;
- return extraSeries;
-
- default:
- return extraSeries;
- }
- }
- }, {
- key: "move",
- value: function move(pos) {
- if (!this.tooltip) {
- return;
- }
-
- var elem = $(this.tooltip.node())[0];
- var tooltipWidth = elem.clientWidth;
- var tooltipHeight = elem.clientHeight;
- var left = pos.pageX + TOOLTIP_PADDING_X;
- var top = pos.pageY + TOOLTIP_PADDING_Y;
-
- if (pos.pageX + tooltipWidth + 40 > window.innerWidth) {
- left = pos.pageX - tooltipWidth - TOOLTIP_PADDING_X;
- }
-
- if (pos.pageY - window.pageYOffset + tooltipHeight + 20 > window.innerHeight) {
- top = pos.pageY - tooltipHeight - TOOLTIP_PADDING_Y;
- }
-
- return this.tooltip.style("left", left + "px").style("top", top + "px");
- }
- }]);
-
- return StatusHeatmapTooltipExtraSeries;
- }());
- }
- };
-});
-//# sourceMappingURL=tooltipextraseries.js.map
diff --git a/dist/tooltipextraseries.js.map b/dist/tooltipextraseries.js.map
deleted file mode 100644
index a5546c9..0000000
--- a/dist/tooltipextraseries.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../src/tooltipextraseries.ts"],"names":["d3","_","$","ExtraSeriesFormatValue","TOOLTIP_PADDING_X","TOOLTIP_PADDING_Y","StatusHeatmapTooltipExtraSeries","elem","scope","dashboard","ctrl","panelCtrl","panel","heatmapPanel","mouseOverBucket","originalFillColor","on","onMouseOver","bind","onMouseClick","e","usingUrl","data","isEmpty","destroy","add","tooltip","select","append","attr","remove","pos","panelRelY","cardId","target","card","cardsData","cards","value","x","y","values","tooltipTimeFormat","time","formatDate","tooltipHtml","color","mode","statuses","seriesFilterIndex","discreteExtraSeries","convertValuesToTooltips","convertValueToTooltips","join","map","v","urls","rtime","retrieveTimeVar","curl","JSON","parse","stringify","i","length","base_url","replace","useExtraSeries","tf","extraSeries","format","vh","index","series_extra","formatExtraSeries","renderLink","variableSrv","variables","forcelowercase","toLowerCase","label","truncate","icon_fa","useMax","multipleValues","dataWarnings","title","noColorDefined","badValues","getNotColoredValues","html","move","type","Date","Raw","node","tooltipWidth","clientWidth","tooltipHeight","clientHeight","left","pageX","top","pageY","window","innerWidth","pageYOffset","innerHeight","style"],"mappings":"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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
Color for bucket with multiple values is determined by color mode
+
+
+
+
@@ -194,6 +197,7 @@
+
@@ -212,105 +216,4 @@
-
-
Filtering
-
-
-
-
-
-
-
-
URL
-
-
- Insert the url to navigate
-
-
-
-
-
-
-
-
-
-
-
-
- Add new URL
-
-
-
-
- Remove all URLs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Specify an URL (relative or absolute)
-
- Use special variables to specify cell values:
-
- $series_label name of the serie
-
- $(template.name) name of the templated to be replaced
-
- $time append &from...&to on the URL
-
- $series_extra use extraSeries value to use it on URL
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/partials/tooltip_editor.html b/src/partials/tooltip_editor.html
new file mode 100644
index 0000000..350b136
--- /dev/null
+++ b/src/partials/tooltip_editor.html
@@ -0,0 +1,120 @@
+
`;
- }
-
- 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 += `
-