-
{{ display.alias }}
+
{{ display.alias }}
{{ display.alias }}
-
- {{ display.display_value | numberOrTextWithRegex : display.valueDisplayRegex }}
+
- {{ display.display_value | numberOrTextWithRegex : display.valueDisplayRegex }}
-
{{ crit.alias }}
+
{{ crit.alias }}
{{ crit.alias }}
-
- {{ crit.display_value | numberOrTextWithRegex : crit.valueDisplayRegex }}
+
- {{ crit.display_value | numberOrTextWithRegex : crit.valueDisplayRegex }}
-
{{ warn.alias }}
+
{{ warn.alias }}
{{ warn.alias }}
-
- {{ warn.display_value | numberOrTextWithRegex : warn.valueDisplayRegex }}
+
- {{ warn.display_value | numberOrTextWithRegex : warn.valueDisplayRegex }}
diff --git a/dist/module.js.map b/dist/module.js.map
index 962a6d1c..b8a3058f 100644
--- a/dist/module.js.map
+++ b/dist/module.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/module.js"],"names":["StatusPluginCtrl"],"mappings":";;;;;;;;AAAQA,sB,gBAAAA,gB;;;2BAGNA,gB","file":"module.js","sourcesContent":["import {StatusPluginCtrl} from './status_ctrl';\n\nexport {\n StatusPluginCtrl as PanelCtrl\n};\n"]}
\ No newline at end of file
+{"version":3,"sources":["../src/module.js"],"names":["StatusPluginCtrl"],"mappings":";;;;;;;;AAAQA,sB,gBAAAA,gB;;;2BAGNA,gB","file":"module.js","sourcesContent":["import {StatusPluginCtrl} from './status_ctrl';\r\n\r\nexport {\r\n StatusPluginCtrl as PanelCtrl\r\n};\r\n"]}
\ No newline at end of file
diff --git a/dist/status_ctrl.js b/dist/status_ctrl.js
index 83e845f6..c9e13fbf 100644
--- a/dist/status_ctrl.js
+++ b/dist/status_ctrl.js
@@ -77,7 +77,8 @@ System.register(["app/plugins/sdk", "lodash", "app/core/time_series2", "app/core
crit: 'rgba(245, 54, 54, 0.9)',
warn: 'rgba(237, 129, 40, 0.9)',
ok: 'rgba(50, 128, 45, 0.9)',
- disable: 'rgba(128, 128, 128, 0.9)'
+ disable: 'rgba(128, 128, 128, 0.9)',
+ dimm: 'rgba(0, 0, 0, 0.5)'
},
isGrayOnNoData: false,
isIgnoreOKColors: false,
@@ -90,7 +91,7 @@ System.register(["app/plugins/sdk", "lodash", "app/core/time_series2", "app/core
_inherits(StatusPluginCtrl, _MetricsPanelCtrl);
/** @ngInject */
- function StatusPluginCtrl($scope, $injector, $log, $filter, annotationsSrv) {
+ function StatusPluginCtrl($scope, $injector, $log, $filter, annotationsSrv, $compile) {
_classCallCheck(this, StatusPluginCtrl);
var _this = _possibleConstructorReturn(this, (StatusPluginCtrl.__proto__ || Object.getPrototypeOf(StatusPluginCtrl)).call(this, $scope, $injector));
@@ -99,14 +100,16 @@ System.register(["app/plugins/sdk", "lodash", "app/core/time_series2", "app/core
//this.log = $log.debug;
_this.filter = $filter;
+ _this.compile = $compile;
- _this.valueHandlers = ['Number Threshold', 'String Threshold', 'Date Threshold', 'Disable Criteria', 'Text Only'];
+ _this.valueHandlers = ['Number Threshold', 'String Threshold', 'Date Threshold', 'Disable Criteria', 'Dimming Criteria', 'Text Only', 'Template'];
_this.aggregations = ['Last', 'First', 'Max', 'Min', 'Sum', 'Avg', 'Delta'];
_this.displayTypes = ['Regular', 'Annotation'];
_this.displayAliasTypes = ['Warning / Critical', 'Always'];
_this.displayValueTypes = ['Never', 'When Alias Displayed', 'Warning / Critical', 'Critical Only'];
_this.colorModes = ['Panel', 'Metric', 'Disabled'];
_this.fontFormats = ['Regular', 'Bold', 'Italic'];
+ _this.compareTypes = ['More than', 'More or equals', 'Equals', 'Less or equals', 'Less than'];
// Dates get stored as strings and will need to be converted back to a Date objects
_.each(_this.panel.targets, function (t) {
@@ -322,7 +325,9 @@ System.register(["app/plugins/sdk", "lodash", "app/core/time_series2", "app/core
this.display = [];
this.annotation = [];
this.extraMoreAlerts = null;
+ this.isDimmed = false;
+ var processTemplate = false;
_.each(this.series, function (s) {
var target = _.find(targets, function (target) {
return target.alias == s.alias || target.target == s.alias;
@@ -337,6 +342,7 @@ System.register(["app/plugins/sdk", "lodash", "app/core/time_series2", "app/core
s.isDisplayValue = true;
s.displayType = target.displayType;
s.valueDisplayRegex = "";
+ s.hideCard = target.hideCard;
if (_this5.validateRegex(target.valueDisplayRegex)) {
s.valueDisplayRegex = target.valueDisplayRegex;
@@ -383,11 +389,28 @@ System.register(["app/plugins/sdk", "lodash", "app/core/time_series2", "app/core
_this5.handleThresholdStatus(s, target);
} else if (target.valueHandler == "Disable Criteria") {
_this5.handleDisabledStatus(s, target);
+ } else if (target.valueHandler == 'Dimming Criteria') {
+ _this5.handleDimmingCriteria(s, target);
} else if (target.valueHandler == "Text Only") {
_this5.handleTextOnly(s, target);
+ } else if (target.valueHandler == "Template") {
+ processTemplate = true;
}
});
+ //Template need to be processed last, because it needs display_value in all of series
+ if (processTemplate) {
+ _.each(this.series, function (s) {
+ var target = _.find(targets, function (target) {
+ return target.valueHandler == "Template" && (target.alias == s.alias || target.target == s.alias);
+ });
+
+ if (target) {
+ _this5.handleTemplate(s, target, _this5.series);
+ }
+ });
+ }
+
if (this.panel.isHideAlertsOnDisable && this.disabled.length > 0) {
this.crit = [];
this.warn = [];
@@ -554,6 +577,43 @@ System.register(["app/plugins/sdk", "lodash", "app/core/time_series2", "app/core
this.disabled.push(series);
}
}
+ }, {
+ key: "handleDimmingCriteria",
+ value: function handleDimmingCriteria(series, target) {
+ var compareValue = target.dimmCriteria;
+ if (!compareValue) return;
+
+ series.displayType = this.displayTypes[0];
+ var compareResult = void 0;
+ if (isNaN(compareValue)) {
+ compareResult = compareValue.localeCompare(series.display_value);
+ } else {
+ compareResult = StatusPluginCtrl.compareNumbers(compareValue, series.display_value);
+ }
+
+ this.isDimmed = false;
+ switch (target.dimmCompare) {
+ case "More than":
+ if (compareResult < 0) this.isDimmed = true;
+ break;
+ case "More or equals":
+ if (compareResult <= 0) this.isDimmed = true;
+ break;
+ case "Equals":
+ if (compareResult == 0) this.isDimmed = true;
+ break;
+ case "Less or equals":
+ if (compareResult >= 0) this.isDimmed = true;
+ break;
+ case "Less than":
+ if (compareResult > 0) this.isDimmed = true;
+ break;
+ default:
+ break;
+ }
+
+ this.display.push(series);
+ }
}, {
key: "handleTextOnly",
value: function handleTextOnly(series, target) {
@@ -563,6 +623,29 @@ System.register(["app/plugins/sdk", "lodash", "app/core/time_series2", "app/core
this.display.push(series);
}
}
+ }, {
+ key: "handleTemplate",
+ value: function handleTemplate(series, target, allSeries) {
+ var valueTemplate = target.template;
+ var result = valueTemplate;
+ var aliasRegExp = new RegExp("%[^%]+%", "g");
+ var regexResult = void 0;
+ while (regexResult = aliasRegExp.exec(valueTemplate)) {
+ var serie = _.find(allSeries, function (s) {
+ return s.alias == regexResult[0].replace(/%/g, '').trim();
+ });
+ if (serie) {
+ result = result.replace(regexResult[0], serie.display_value);
+ }
+ }
+
+ series.display_value = result;
+ if (series.displayType == "Annotation") {
+ this.annotation.push(series);
+ } else {
+ this.display.push(series);
+ }
+ }
}, {
key: "updatePanelState",
value: function updatePanelState() {
@@ -698,6 +781,10 @@ System.register(["app/plugins/sdk", "lodash", "app/core/time_series2", "app/core
this.$panelContainer = elem.find('.panel-container');
this.$panelContainer.addClass("st-card");
this.$panelContoller = ctrl;
+ if (this.$panelContainer.find('.dimm-state').length == 0) {
+ var dimmElement = angular.element("
");
+ this.$panelContainer.append(ctrl.compile(dimmElement)(scope));
+ }
}
}], [{
key: "parseThresholds",
@@ -737,6 +824,13 @@ System.register(["app/plugins/sdk", "lodash", "app/core/time_series2", "app/core
}
return false;
}
+ }, {
+ key: "compareNumbers",
+ value: function compareNumbers(val1, val2) {
+ if (val1 == val2) return 0;
+ if (val1 < val2) return -1;
+ if (val1 > val2) return 1;
+ }
}, {
key: "seriesHandler",
value: function seriesHandler(seriesData) {
diff --git a/dist/status_ctrl.js.map b/dist/status_ctrl.js.map
index 28151695..8c19e02f 100644
--- a/dist/status_ctrl.js.map
+++ b/dist/status_ctrl.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/status_ctrl.js"],"names":["MetricsPanelCtrl","_","TimeSeries","coreModule","kbn","moment","panelDefaults","flipCard","flipTime","colorMode","colors","crit","warn","ok","disable","isGrayOnNoData","isIgnoreOKColors","isHideAlertsOnDisable","cornerRadius","isAutoScrollOnOverflow","StatusPluginCtrl","$scope","$injector","$log","$filter","annotationsSrv","defaultsDeep","panel","filter","valueHandlers","aggregations","displayTypes","displayAliasTypes","displayValueTypes","colorModes","fontFormats","each","targets","t","valueHandler","Date","events","on","onRender","bind","postRefresh","onDataError","onDataReceived","onInitEditMode","onColorChange","addFilters","numberOrTextFilter","input","angular","isNumber","$stateful","textRegex","length","regex","RegExp","e","matchResults","match","fixedSpan","span","measurements","duplicates","measurement","hide","m","res","alias","target","addEditorTab","unitFormats","getUnitFormats","subItem","units","value","render","panelHeaderHeight","title","$panelContainer","find","css","$panelContoller","height","minHeight","tail","panelWidth","innerWidth","isNaN","parseInt","slice","maxWidth","element","overflowY","offsetHeight","scrollHeight","Number","undefined","String","c","w","getTime","item","color","fixPanelHeader","setElementHeight","setTextMaxWidth","upgradeOldVersion","clusterName","displayName","replace","namePrefix","addClass","removeClass","disabled","display","annotation","extraMoreAlerts","series","s","url","isDisplayValue","displayType","valueDisplayRegex","validateRegex","aggregation","max","datapoints","point","stats","min","diff","total","avg","display_value","handleThresholdStatus","handleDisabledStatus","handleTextOnly","autoFlip","updatePanelState","handleCssDisplay","parseUri","handleMaxAlertsToShow","displayAliasType","displayValueWithAlias","isFloat","thresholds","parseThresholds","inverted","isCritical","isWarning","isCheckRanges","warnIsNumber","critIsNumber","formatDisplayValue","displayValueWhenAliasDisplayed","displayValueFromWarning","displayValueFromCritical","push","isFinite","decimals","decimalPlaces","Math","valueFormats","date","dashboard","isTimezoneUtc","utc","format","dateFormat","num","disabledValue","panelState","radius","okColor","maxAlertNumber","currentMaxAllowedAlerts","filteredOutAlerts","arrayNamesToSlice","forEach","originAlertCount","arrayName","links","link","type","uri","dashUri","params","targetBlank","dataList","map","seriesHandler","timeoutId","clearInterval","setInterval","toggleClass","scope","elem","attrs","ctrl","metricOptions","parseFloat","valueOf","val","toString","toLowerCase","indexOf","seriesData","flotpairs","getFlotPairs","templateUrl"],"mappings":"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","file":"status_ctrl.js","sourcesContent":["import {MetricsPanelCtrl} from \"app/plugins/sdk\";\nimport _ from \"lodash\";\nimport TimeSeries from \"app/core/time_series2\";\nimport coreModule from \"app/core/core_module\";\nimport kbn from \"app/core/utils/kbn\";\nimport moment from \"moment\";\n\nimport './css/status_panel.css!';\n\n// Set and populate panel defaults\nconst panelDefaults = {\n\tflipCard: false,\n\tflipTime: 5,\n\tcolorMode: 'Panel',\n\t// Changed colors to match Table Panel so colorised text is easier to read\n\tcolors: {\n\t\tcrit: 'rgba(245, 54, 54, 0.9)',\n\t\twarn: 'rgba(237, 129, 40, 0.9)',\n\t\tok: 'rgba(50, 128, 45, 0.9)',\n\t\tdisable: 'rgba(128, 128, 128, 0.9)'\n\t},\n\tisGrayOnNoData: false,\n\tisIgnoreOKColors: false,\n\tisHideAlertsOnDisable: false,\n\tcornerRadius: 0,\n\tisAutoScrollOnOverflow: false\n};\n\nexport class StatusPluginCtrl extends MetricsPanelCtrl {\n\t/** @ngInject */\n\tconstructor($scope, $injector, $log, $filter, annotationsSrv) {\n\t\tsuper($scope, $injector);\n\t\t_.defaultsDeep(this.panel, panelDefaults);\n\n\t\t//this.log = $log.debug;\n\t\tthis.filter = $filter;\n\n\t\tthis.valueHandlers = ['Number Threshold', 'String Threshold', 'Date Threshold', 'Disable Criteria', 'Text Only'];\n\t\tthis.aggregations = ['Last', 'First', 'Max', 'Min', 'Sum', 'Avg', 'Delta'];\n\t\tthis.displayTypes = ['Regular', 'Annotation'];\n\t\tthis.displayAliasTypes = ['Warning / Critical', 'Always'];\n\t\tthis.displayValueTypes = ['Never', 'When Alias Displayed', 'Warning / Critical', 'Critical Only'];\n\t\tthis.colorModes = ['Panel', 'Metric', 'Disabled'];\n\t\tthis.fontFormats = ['Regular', 'Bold', 'Italic'];\n\n\t\t// Dates get stored as strings and will need to be converted back to a Date objects\n\t\t_.each(this.panel.targets, (t) => {\n\t\t\tif (t.valueHandler === \"Date Threshold\") {\n\t\t\t\tif (typeof t.crit != \"undefined\") t.crit = new Date(t.crit);\n\t\t\t\tif (typeof t.warn != \"undefined\") t.warn = new Date(t.warn);\n\t\t\t}\n\t\t});\n\n\t\tthis.panel.flipTime = this.panel.flipTime || 5;\n\n\t\t/** Bind events to functions **/\n\t\tthis.events.on('render', this.onRender.bind(this));\n\t\tthis.events.on('refresh', this.postRefresh.bind(this));\n\t\tthis.events.on('data-error', this.onDataError.bind(this));\n\t\tthis.events.on('data-received', this.onDataReceived.bind(this));\n\t\tthis.events.on('data-snapshot-load', this.onDataReceived.bind(this));\n\t\tthis.events.on('init-edit-mode', this.onInitEditMode.bind(this));\n\n\t\tthis.onColorChange = this.onColorChange.bind(this);\n\n\t\tthis.addFilters()\n\t}\n\n\taddFilters() {\n\t\tcoreModule.filter('numberOrText', () => {\n\t\t\tlet numberOrTextFilter = (input) => {\n\t\t\t\tif(angular.isNumber(input)) {\n\t\t\t\t\treturn this.filter('number')(input);\n\t\t\t\t} else {\n\t\t\t\t\treturn input;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tnumberOrTextFilter.$stateful = true;\n\t\t\treturn numberOrTextFilter;\n\t\t});\n\n\t\tcoreModule.filter('numberOrTextWithRegex', () => {\n\t\t\tlet numberOrTextFilter = (input, textRegex) => {\n\t\t\t\tif(angular.isNumber(input)) {\n\t\t\t\t\treturn this.filter('number')(input);\n\t\t\t\t} else {\n\t\t\t\t\tif(textRegex == null || textRegex.length == 0) {\n\t\t\t\t\t\treturn input;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlet regex;\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tregex = new RegExp(textRegex);\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\treturn input;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!input) {\n\t\t\t\t\t\t\treturn input;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet matchResults = input.match(regex);\n\t\t\t\t\t\tif (matchResults == null) {\n\t\t\t\t\t\t\treturn input;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn matchResults[0];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tnumberOrTextFilter.$stateful = true;\n\t\t\treturn numberOrTextFilter;\n\t\t});\n\t}\n\n\tpostRefresh() {\n\t\tif (this.panel.fixedSpan) {\n\t\t\tthis.panel.span = this.panel.fixedSpan;\n\t\t}\n\n\t\tthis.measurements = this.panel.targets;\n\n\t\t/** Duplicate alias validation **/\n\t\tthis.duplicates = false;\n\n\t\tthis.measurements = _.filter(this.measurements, (measurement) => {\n\t\t\treturn !measurement.hide;\n\t\t});\n\n\t\t_.each(this.measurements, (m) => {\n\t\t\tlet res = _.filter(this.measurements, (measurement) => {\n\t\t\t\treturn (m.alias == measurement.alias || (m.target == measurement.target && m.target)) && !m.hide;\n\t\t\t});\n\n\t\t\tif (res.length > 1) {\n\t\t\t\tthis.duplicates = true;\n\t\t\t}\n\t\t});\n\t}\n\n\tonInitEditMode() {\n\t\tthis.addEditorTab('Options', 'public/plugins/vonage-status-panel/editor.html', 2);\n\t\t// Load in the supported units-of-measure formats so they can be displayed in the editor\n\t\tthis.unitFormats = kbn.getUnitFormats();\n\t}\n\n\tsetUnitFormat(measurement, subItem) {\n\t\tmeasurement.units = subItem.value;\n\t\tthis.render();\n\t}\n\n\tfixPanelHeader() {\n\t\t// Handle the panel top menu height, since it's display doesn't look good with the panel\n\t\tlet panelHeaderHeight = '';\n\t\tif(this.panel.title.length === 0) {\n\t\t\tpanelHeaderHeight = '10px';\n\t\t}\n\t\tthis.$panelContainer.find('.panel-header').css('height', panelHeaderHeight);\n\t\tthis.$panelContainer.find('.panel-menu-container').css('height', panelHeaderHeight);\n\t\tthis.$panelContainer.find('.fa-caret-down').css('display', 'none');\n\t}\n\n\tsetElementHeight() {\n\t\t// Handle the panel height\n\t\tthis.$panelContainer.find('.status-panel').css('min-height', this.$panelContoller.height + 'px');\n\t\tthis.minHeight = this.$panelContoller.height-10;\n\t}\n\n\tsetTextMaxWidth() {\n\t\tlet tail = ' …';\n\t\tlet panelWidth = this.$panelContainer.innerWidth();\n\t\tif (isNaN(panelWidth))\n\t\t\tpanelWidth = parseInt(panelWidth.slice(0, -2), 10) / 12;\n\t\tpanelWidth = panelWidth - 20;\n\t\tthis.maxWidth = panelWidth;\n\t}\n\n\tisAutoScrollAlerts() {\n\t\tif(!this.panel.isAutoScrollOnOverflow) {\n\t\t\treturn false;\n\t\t}\n\n\t\tlet element = this.$panelContainer.find('.status-panel')[0];\n\t\tlet overflowY = element.offsetHeight < element.scrollHeight;\n\t\treturn overflowY;\n\t}\n\n\tonHandlerChange(measurement) {\n\t\t// If the Threshold type changes between Number/String/Date then try and recast the thresholds to keep consistent\n\t\tif (measurement.valueHandler === \"Number Threshold\") {\n\t\t\tmeasurement.crit = (isNaN(Number(measurement.crit))) ? undefined : Number(measurement.crit);\n\t\t\tmeasurement.warn = (isNaN(Number(measurement.warn))) ? undefined : Number(measurement.warn);\n\t\t} else if (measurement.valueHandler === \"String Threshold\") {\n\t\t\tif (typeof measurement.crit != \"undefined\") measurement.crit = String(measurement.crit);\n\t\t\tif (typeof measurement.warn != \"undefined\") measurement.warn = String(measurement.warn);\n\t\t} else if (measurement.valueHandler === \"Date Threshold\") {\n\t\t\tlet c = new Date(measurement.crit), w = new Date(measurement.warn);\n\t\t\tmeasurement.crit = (isNaN(c.getTime())) ? undefined : c;\n\t\t\tmeasurement.warn = (isNaN(w.getTime())) ? undefined : w;\n\t\t}\n\t\tthis.onRender();\n\t}\n\n\tonColorChange(item) {\n\t\treturn (color) => {\n\t\t\tthis.panel.colors[item] = color;\n\t\t\tthis.render();\n\t\t};\n\t}\n\n\tonRender() {\n\t\tthis.fixPanelHeader();\n\t\tthis.setElementHeight();\n\t\tthis.setTextMaxWidth();\n\t\tthis.upgradeOldVersion();\n\n\t\tif (this.panel.clusterName) {\n\t\t\tthis.panel.displayName =\n\t\t\t\tthis.filter('interpolateTemplateVars')(this.panel.clusterName, this.$scope)\n\t\t\t\t\t.replace(new RegExp(this.panel.namePrefix, 'i'), '');\n\t\t} else {\n\t\t\tthis.panel.displayName = \"\";\n\t\t}\n\n\t\tif(this.panel.flipCard){\n\t\t\tthis.$panelContainer.addClass(\"effect-hover\");\n\t\t} else {\n\t\t\tthis.$panelContainer.removeClass(\"effect-hover\");\n\t\t}\n\n\t\tlet targets = this.panel.targets;\n\n\t\tthis.crit = [];\n\t\tthis.warn = [];\n\t\tthis.disabled = [];\n\t\tthis.display = [];\n\t\tthis.annotation = [];\n\t\tthis.extraMoreAlerts = null;\n\n\t\t_.each(this.series, (s) => {\n\t\t\tlet target = _.find(targets, (target) => {\n\t\t\t\treturn target.alias == s.alias || target.target == s.alias;\n\t\t\t});\n\n\t\t\tif (!target) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ts.alias = target.alias;\n\t\t\ts.url = target.url;\n\t\t\ts.isDisplayValue = true;\n\t\t\ts.displayType = target.displayType;\n\t\t\ts.valueDisplayRegex = \"\";\n\n\t\t\tif(this.validateRegex(target.valueDisplayRegex)) {\n\t\t\t\ts.valueDisplayRegex = target.valueDisplayRegex;\n\t\t\t}\n\n\t\t\tlet value;\n\t\t\tswitch (target.aggregation) {\n\t\t\t\tcase 'Max':\n\t\t\t\t\tvalue = _.max(s.datapoints, (point) => { return point[0]; })[0];\n\t\t\t\t\tvalue = s.stats.max;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Min':\n\t\t\t\t\tvalue = _.min(s.datapoints, (point) => { return point[0]; })[0];\n\t\t\t\t\tvalue = s.stats.min;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Delta':\n\t\t\t\t\tvalue = s.datapoints[s.datapoints.length - 1][0] - s.datapoints[0][0];\n\t\t\t\t\tvalue = s.stats.diff;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Sum':\n\t\t\t\t\tvalue = 0;\n\t\t\t\t\t_.each(s.datapoints, (point) => { value += point[0] });\n\t\t\t\t\tvalue = s.stats.total;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Avg':\n\t\t\t\t\tvalue = s.stats.avg;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'First':\n\t\t\t\t\tvalue = s.datapoints[0][0];\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tvalue = s.datapoints[s.datapoints.length - 1][0];\n\t\t\t}\n\n\t\t\ts.display_value = value;\n\n\t\t\tif (target.valueHandler == \"Number Threshold\" ||\n\t\t\t\ttarget.valueHandler == \"String Threshold\" ||\n\t\t\t\ttarget.valueHandler == \"Date Threshold\") {\n\t\t\t\tthis.handleThresholdStatus(s, target);\n\t\t\t}\n\t\t\telse if (target.valueHandler == \"Disable Criteria\") {\n\t\t\t\tthis.handleDisabledStatus(s,target);\n\t\t\t}\n\t\t\telse if (target.valueHandler == \"Text Only\") {\n\t\t\t\tthis.handleTextOnly(s, target);\n\t\t\t}\n\t\t});\n\n\t\tif(this.panel.isHideAlertsOnDisable && this.disabled.length > 0) {\n\t\t\tthis.crit = [];\n\t\t\tthis.warn = [];\n\t\t\tthis.display = [];\n\t\t}\n\n\t\tthis.autoFlip();\n\t\tthis.updatePanelState();\n\t\tthis.handleCssDisplay();\n\t\tthis.parseUri();\n\n\t\t//This must appear after handling the css style of the panel\n\t\tthis.handleMaxAlertsToShow();\n\t}\n\n\tupgradeOldVersion() {\n\t\tlet targets = this.panel.targets;\n\n\t\t//Handle legacy code\n\t\t_.each(targets, (target) => {\n\t\t\tif(target.valueHandler == null) {\n\t\t\t\tif(target.displayType != null) {\n\t\t\t\t\ttarget.valueHandler = target.displayType;\n\t\t\t\t\tif (target.valueHandler == \"Annotation\") {\n\t\t\t\t\t\ttarget.valueHandler = \"Text Only\"\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttarget.valueHandler = this.valueHandlers[0]\n\t\t\t\t}\n\t\t\t\ttarget.displayType = this.displayTypes[0];\n\t\t\t}\n\n\t\t\tif(target.display != null){\n\t\t\t\ttarget.displayAliasType = target.display ? \"Always\" : this.displayAliasTypes[0];\n\t\t\t\ttarget.displayValueWithAlias = target.display ? 'When Alias Displayed' : this.displayValueTypes[0];\n\t\t\t\tdelete target.display;\n\n\t\t\t}\n\t\t});\n\n\t\t// Depreciate Threshold in favour of Type specific versions\n\t\t_.each(targets, (target) => {\n\t\t\tif (target.valueHandler === \"Threshold\") {\n\t\t\t\t// Use the same logic as Threshold Parsing to ensure we retain same behaviour\n\t\t\t\t// i.e. map to Number Threshold if two floats (i.e. range check) otherwise map to String Threshold (i.e. exact match)\n\t\t\t\tif (StatusPluginCtrl.isFloat(target.crit) && StatusPluginCtrl.isFloat(target.warn)) {\n\t\t\t\t\ttarget.valueHandler = \"Number Threshold\"\n\t\t\t\t\ttarget.crit = Number(target.crit);\n\t\t\t\t\ttarget.warn = Number(target.warn);\n\t\t\t\t} else {\n\t\t\t\t\ttarget.valueHandler = \"String Threshold\"\n\t\t\t\t\tif (typeof target.crit != \"undefined\") target.crit = String(target.crit);\n\t\t\t\t\tif (typeof target.warn != \"undefined\") target.warn = String(target.warn);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\thandleThresholdStatus(series, target) {\n\t\tseries.thresholds = StatusPluginCtrl.parseThresholds(target);\n\t\tseries.inverted = series.thresholds.crit < series.thresholds.warn;\n\n\t\tlet isCritical = false;\n\t\tlet isWarning = false;\n\t\tlet isCheckRanges = series.thresholds.warnIsNumber && series.thresholds.critIsNumber;\n\t\tif (isCheckRanges) {\n\t\t\tif (!series.inverted) {\n\t\t\t\tif (series.display_value >= series.thresholds.crit) {\n\t\t\t\t\tisCritical = true\n\t\t\t\t} else if (series.display_value >= series.thresholds.warn) {\n\t\t\t\t\tisWarning = true\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (series.display_value <= series.thresholds.crit) {\n\t\t\t\t\tisCritical = true\n\t\t\t\t} else if (series.display_value <= series.thresholds.warn) {\n\t\t\t\t\tisWarning = true\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (series.display_value == series.thresholds.crit) {\n\t\t\t\tisCritical = true\n\t\t\t} else if (series.display_value == series.thresholds.warn) {\n\t\t\t\tisWarning = true\n\t\t\t}\n\t\t}\n\n\t\t// Add units-of-measure and decimal formatting or date formatting as needed\n\t\tseries.display_value = this.formatDisplayValue(series.display_value, target);\n\n\t\tlet displayValueWhenAliasDisplayed = 'When Alias Displayed' === target.displayValueWithAlias;\n\t\tlet displayValueFromWarning = 'Warning / Critical' === target.displayValueWithAlias;\n\t\tlet displayValueFromCritical = 'Critical Only' === target.displayValueWithAlias;\n\n\t\tif(isCritical) {\n\t\t\t//In critical state we don't show the error as annotation\n\t\t\tseries.displayType = this.displayTypes[0];\n\t\t\tseries.isDisplayValue = displayValueWhenAliasDisplayed || displayValueFromWarning || displayValueFromCritical;\n\t\t\tthis.crit.push(series);\n\t\t} else if(isWarning) {\n\t\t\t//In warning state we don't show the warning as annotation\n\t\t\tseries.displayType = this.displayTypes[0];\n\t\t\tseries.isDisplayValue = displayValueWhenAliasDisplayed || displayValueFromWarning;\n\t\t\tthis.warn.push(series);\n\t\t} else if (\"Always\" == target.displayAliasType) {\n\t\t\tseries.isDisplayValue = displayValueWhenAliasDisplayed;\n\t\t\tif(series.displayType == \"Annotation\") {\n\t\t\t\tthis.annotation.push(series);\n\t\t\t} else {\n\t\t\t\tthis.display.push(series);\n\t\t\t}\n\t\t}\n\t}\n\n\tformatDisplayValue(value, target) {\n\t\t// Format the display value. Set to \"Invalid\" if value is out-of-bounds or a type mismatch with the handler\n\t\tif (target.valueHandler === \"Number Threshold\") {\n\t\t\tif (_.isFinite(value)) {\n\t\t\t\tlet units = (typeof target.units === \"string\") ? target.units : 'none';\n\t\t\t\tlet decimals = this.decimalPlaces(value);\n\t\t\t\t// We define the decimal percision by the minimal decimal needed\n\t\t\t\tdecimals = (typeof target.decimals === \"number\") ? Math.min(target.decimals, decimals) : decimals;\n\t\t\t\tvalue = kbn.valueFormats[units](value, decimals, null);\n\t\t\t} else {\n\t\t\t\tvalue = \"Invalid Number\";\n\t\t\t}\n\t\t} else if (target.valueHandler === \"String Threshold\") {\n\t\t\tif (value === undefined || value === null || value !== value)\n\t\t\t\tvalue = \"Invalid String\";\n\t\t} else if (target.valueHandler === \"Date Threshold\") {\n\t\t\tif (_.isFinite(value)) {\n\t\t\t\tlet date = moment(new Date(value));\n\t\t\t\tif (this.dashboard.isTimezoneUtc()) date = date.utc();\n\t\t\t\tvalue = date.format(target.dateFormat);\n\t\t\t} else {\n\t\t\t\tvalue = \"Invalid Date\";\n\t\t\t}\n\t\t}\n\t\treturn value;\n\t}\n\n\tdecimalPlaces(num) {\n\t\tvar match = (''+num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n\t\tif (!match) { return 0; }\n\t\treturn Math.max(\n\t\t\t0,\n\t\t\t// Number of digits right of decimal point.\n\t\t\t(match[1] ? match[1].length : 0)\n\t\t\t// Adjust for scientific notation.\n\t\t\t- (match[2] ? +match[2] : 0));\n\t}\n\n\thandleDisabledStatus(series, target) {\n\t\tseries.displayType = this.displayTypes[0];\n\t\tseries.disabledValue = target.disabledValue;\n\n\t\tif (series.display_value == series.disabledValue) {\n\t\t\tthis.disabled.push(series);\n\t\t}\n\t}\n\n\thandleTextOnly(series, target) {\n\t\tif(series.displayType == \"Annotation\") {\n\t\t\tthis.annotation.push(series);\n\t\t} else {\n\t\t\tthis.display.push(series);\n\t\t}\n\t}\n\n\tupdatePanelState() {\n\t\tif(this.duplicates) {\n\t\t\tthis.panelState = 'error-state';\n\t\t} else if (this.disabled.length > 0) {\n\t\t\tthis.panelState = 'disabled-state';\n\t\t} else if (this.crit.length > 0) {\n\t\t\tthis.panelState = 'error-state';\n\t\t} else if (this.warn.length > 0) {\n\t\t\tthis.panelState = 'warn-state';\n\t\t} else if((this.series == undefined || this.series.length == 0) && this.panel.isGrayOnNoData) {\n\t\t\tthis.panelState = 'no-data-state';\n\t\t} else {\n\t\t\tthis.panelState = 'ok-state';\n\t\t}\n\t}\n\n\thandleCssDisplay() {\n\t\tthis.$panelContainer.removeClass('error-state warn-state disabled-state ok-state no-data-state');\n\t\tthis.$panelContainer.addClass(this.panelState);\n\n\t\tlet radius = _.isNumber(this.panel.cornerRadius) ? this.panel.cornerRadius : 0\n\t\tthis.$panelContainer.css('border-radius', radius + '%');\n\n\t\tlet okColor = (this.panel.isIgnoreOKColors) ? '' : this.panel.colors.ok;\n\n\t\tif (this.panel.colorMode === \"Panel\") {\n\t\t\tswitch(this.panelState) {\n\t\t\t\tcase 'disabled-state': this.$panelContainer.css('background-color', this.panel.colors.disable); break;\n\t\t\t\tcase 'error-state': this.$panelContainer.css('background-color', this.panel.colors.crit); break;\n\t\t\t\tcase 'warn-state': this.$panelContainer.css('background-color', this.panel.colors.warn); break;\n\t\t\t\tcase 'no-data-state': this.$panelContainer.css('background-color', this.panel.colors.disable); break;\n\t\t\t\tdefault: this.$panelContainer.css('background-color', okColor); break;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.$panelContainer.css('background-color', '');\n\t\t}\n\t}\n\n\thandleMaxAlertsToShow() {\n\t\tif(this.panel.maxAlertNumber != null && this.panel.maxAlertNumber >= 0) {\n\t\t\tlet currentMaxAllowedAlerts = this.panel.maxAlertNumber;\n\t\t\tlet filteredOutAlerts = 0;\n\t\t\tlet arrayNamesToSlice = [\"disabled\", \"crit\", \"warn\", \"display\"];\n\t\t\tarrayNamesToSlice.forEach( arrayName => {\n\t\t\t\tlet originAlertCount = this[arrayName].length;\n\t\t\t\tthis[arrayName] = this[arrayName].slice(0,currentMaxAllowedAlerts);\n\t\t\t\tcurrentMaxAllowedAlerts = Math.max(currentMaxAllowedAlerts - this[arrayName].length, 0);\n\t\t\t\tfilteredOutAlerts += (originAlertCount - this[arrayName].length);\n\t\t\t});\n\n\t\t\tif(filteredOutAlerts > 0) {\n\t\t\t\tthis.extraMoreAlerts = \"+ \" + filteredOutAlerts + \" more\"\n\t\t\t}\n\t\t}\n\t}\n\n\tparseUri() {\n\t\tif (this.panel.links && this.panel.links.length > 0) {\n\t\t\tlet link = this.panel.links[0];\n\n\t\t\tif (link.type == \"absolute\") {\n\t\t\t\tthis.uri = link.url;\n\t\t\t} else {\n\t\t\t\tthis.uri = 'dashboard/' + link.dashUri;\n\t\t\t}\n\n\t\t\tif (link.params) {\n\t\t\t\tthis.uri += \"?\" + link.params;\n\t\t\t}\n\n\t\t\tthis.targetBlank = link.targetBlank;\n\t\t} else {\n\t\t\tthis.uri = undefined;\n\t\t}\n\t}\n\n\tvalidateRegex(textRegex) {\n\t\tif(textRegex == null || textRegex.length == 0) {\n\t\t\treturn true\n\t\t}\n\t\ttry {\n\t\t\tlet regex = new RegExp(textRegex);\n\t\t\treturn true\n\t\t} catch(e) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tstatic parseThresholds(metricOptions) {\n\t\tlet res = {};\n\n\t\tif (StatusPluginCtrl.isFloat(metricOptions.warn)) {\n\t\t\tres.warn = parseFloat(metricOptions.warn);\n\t\t\tres.warnIsNumber = true;\n\t\t} else if (metricOptions.warn instanceof Date) {\n\t\t\t// Convert Dates to Numbers and leverage existing threshold logic\n\t\t\tres.warn = metricOptions.warn.valueOf();\n\t\t\tres.warnIsNumber = true;\n\t\t} else {\n\t\t\tres.warn = metricOptions.warn;\n\t\t\tres.warnIsNumber = false;\n\t\t}\n\n\t\tif (StatusPluginCtrl.isFloat(metricOptions.crit)) {\n\t\t\tres.crit = parseFloat(metricOptions.crit);\n\t\t\tres.critIsNumber = true;\n\t\t} else if (metricOptions.crit instanceof Date) {\n\t\t\tres.crit = metricOptions.crit.valueOf();\n\t\t\tres.critIsNumber = true;\n\t\t} else {\n\t\t\tres.crit = metricOptions.crit;\n\t\t\tres.critIsNumber = false;\n\t\t}\n\n\t\treturn res;\n\t}\n\n\tstatic isFloat(val) {\n\t\tif (!isNaN(val) && val.toString().toLowerCase().indexOf('e') == -1) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tonDataReceived(dataList) {\n\t\tthis.series = dataList.map(StatusPluginCtrl.seriesHandler.bind(this));\n\t\tthis.render();\n\t}\n\n\tonDataError() {\n\t\tthis.crit = [];\n\t\tthis.warn = [];\n\t}\n\n\tstatic seriesHandler(seriesData) {\n\t\tvar series = new TimeSeries({\n\t\t\tdatapoints: seriesData.datapoints,\n\t\t\talias: seriesData.target\n\t\t});\n\n\t\tseries.flotpairs = series.getFlotPairs(\"connected\");\n\n\t\treturn series;\n\t}\n\n\t$onDestroy() {\n\t\tif(this.timeoutId) clearInterval(this.timeoutId);\n\t}\n\n\tautoFlip() {\n\t\tif (this.timeoutId) clearInterval(this.timeoutId);\n\t\tif (this.panel.flipCard && (this.crit.length > 0 || this.warn.length > 0 || this.disabled.length > 0)) {\n\t\t\tthis.timeoutId = setInterval(() => {\n\t\t\t\tthis.$panelContainer.toggleClass(\"flipped\");\n\t\t\t}, this.panel.flipTime * 1000);\n\t\t}\n\t}\n\n\tlink(scope, elem, attrs, ctrl) {\n\t\tthis.$panelContainer = elem.find('.panel-container');\n\t\tthis.$panelContainer.addClass(\"st-card\");\n\t\tthis.$panelContoller = ctrl;\n\t}\n}\n\nStatusPluginCtrl.templateUrl = 'module.html';\n"]}
\ No newline at end of file
+{"version":3,"sources":["../src/status_ctrl.js"],"names":["MetricsPanelCtrl","_","TimeSeries","coreModule","kbn","moment","panelDefaults","flipCard","flipTime","colorMode","colors","crit","warn","ok","disable","dimm","isGrayOnNoData","isIgnoreOKColors","isHideAlertsOnDisable","cornerRadius","isAutoScrollOnOverflow","StatusPluginCtrl","$scope","$injector","$log","$filter","annotationsSrv","$compile","defaultsDeep","panel","filter","compile","valueHandlers","aggregations","displayTypes","displayAliasTypes","displayValueTypes","colorModes","fontFormats","compareTypes","each","targets","t","valueHandler","Date","events","on","onRender","bind","postRefresh","onDataError","onDataReceived","onInitEditMode","onColorChange","addFilters","numberOrTextFilter","input","angular","isNumber","$stateful","textRegex","length","regex","RegExp","e","matchResults","match","fixedSpan","span","measurements","duplicates","measurement","hide","m","res","alias","target","addEditorTab","unitFormats","getUnitFormats","subItem","units","value","render","panelHeaderHeight","title","$panelContainer","find","css","$panelContoller","height","minHeight","tail","panelWidth","innerWidth","isNaN","parseInt","slice","maxWidth","element","overflowY","offsetHeight","scrollHeight","Number","undefined","String","c","w","getTime","item","color","fixPanelHeader","setElementHeight","setTextMaxWidth","upgradeOldVersion","clusterName","displayName","replace","namePrefix","addClass","removeClass","disabled","display","annotation","extraMoreAlerts","isDimmed","processTemplate","series","s","url","isDisplayValue","displayType","valueDisplayRegex","hideCard","validateRegex","aggregation","max","datapoints","point","stats","min","diff","total","avg","display_value","handleThresholdStatus","handleDisabledStatus","handleDimmingCriteria","handleTextOnly","handleTemplate","autoFlip","updatePanelState","handleCssDisplay","parseUri","handleMaxAlertsToShow","displayAliasType","displayValueWithAlias","isFloat","thresholds","parseThresholds","inverted","isCritical","isWarning","isCheckRanges","warnIsNumber","critIsNumber","formatDisplayValue","displayValueWhenAliasDisplayed","displayValueFromWarning","displayValueFromCritical","push","isFinite","decimals","decimalPlaces","Math","valueFormats","date","dashboard","isTimezoneUtc","utc","format","dateFormat","num","disabledValue","compareValue","dimmCriteria","compareResult","localeCompare","compareNumbers","dimmCompare","allSeries","valueTemplate","template","result","aliasRegExp","regexResult","exec","serie","trim","panelState","radius","okColor","maxAlertNumber","currentMaxAllowedAlerts","filteredOutAlerts","arrayNamesToSlice","forEach","originAlertCount","arrayName","links","link","type","uri","dashUri","params","targetBlank","dataList","map","seriesHandler","timeoutId","clearInterval","setInterval","toggleClass","scope","elem","attrs","ctrl","dimmElement","append","metricOptions","parseFloat","valueOf","val","toString","toLowerCase","indexOf","val1","val2","seriesData","flotpairs","getFlotPairs","templateUrl"],"mappings":"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","file":"status_ctrl.js","sourcesContent":["import {MetricsPanelCtrl} from \"app/plugins/sdk\";\nimport _ from \"lodash\";\nimport TimeSeries from \"app/core/time_series2\";\nimport coreModule from \"app/core/core_module\";\nimport kbn from \"app/core/utils/kbn\";\nimport moment from \"moment\";\n\nimport './css/status_panel.css!';\n\n// Set and populate panel defaults\nconst panelDefaults = {\n\tflipCard: false,\n\tflipTime: 5,\n\tcolorMode: 'Panel',\n\t// Changed colors to match Table Panel so colorised text is easier to read\n\tcolors: {\n\t\tcrit: 'rgba(245, 54, 54, 0.9)',\n\t\twarn: 'rgba(237, 129, 40, 0.9)',\n\t\tok: 'rgba(50, 128, 45, 0.9)',\n\t\tdisable: 'rgba(128, 128, 128, 0.9)',\n\t\tdimm: 'rgba(0, 0, 0, 0.5)'\n\t},\n\tisGrayOnNoData: false,\n\tisIgnoreOKColors: false,\n\tisHideAlertsOnDisable: false,\n\tcornerRadius: 0,\n\tisAutoScrollOnOverflow: false\n};\n\nexport class StatusPluginCtrl extends MetricsPanelCtrl {\n\t/** @ngInject */\n\tconstructor($scope, $injector, $log, $filter, annotationsSrv, $compile) {\n\t\tsuper($scope, $injector);\n\t\t_.defaultsDeep(this.panel, panelDefaults);\n\n\t\t//this.log = $log.debug;\n\t\tthis.filter = $filter;\n\t\tthis.compile = $compile;\n\n\t\tthis.valueHandlers = ['Number Threshold', 'String Threshold', 'Date Threshold', 'Disable Criteria', 'Dimming Criteria', 'Text Only', 'Template'];\n\t\tthis.aggregations = ['Last', 'First', 'Max', 'Min', 'Sum', 'Avg', 'Delta'];\n\t\tthis.displayTypes = ['Regular', 'Annotation'];\n\t\tthis.displayAliasTypes = ['Warning / Critical', 'Always'];\n\t\tthis.displayValueTypes = ['Never', 'When Alias Displayed', 'Warning / Critical', 'Critical Only'];\n\t\tthis.colorModes = ['Panel', 'Metric', 'Disabled'];\n\t\tthis.fontFormats = ['Regular', 'Bold', 'Italic'];\n\t\tthis.compareTypes = ['More than', 'More or equals', 'Equals', 'Less or equals', 'Less than'];\n\n\t\t// Dates get stored as strings and will need to be converted back to a Date objects\n\t\t_.each(this.panel.targets, (t) => {\n\t\t\tif (t.valueHandler === \"Date Threshold\") {\n\t\t\t\tif (typeof t.crit != \"undefined\") t.crit = new Date(t.crit);\n\t\t\t\tif (typeof t.warn != \"undefined\") t.warn = new Date(t.warn);\n\t\t\t}\n\t\t});\n\n\t\tthis.panel.flipTime = this.panel.flipTime || 5;\n\n\t\t/** Bind events to functions **/\n\t\tthis.events.on('render', this.onRender.bind(this));\n\t\tthis.events.on('refresh', this.postRefresh.bind(this));\n\t\tthis.events.on('data-error', this.onDataError.bind(this));\n\t\tthis.events.on('data-received', this.onDataReceived.bind(this));\n\t\tthis.events.on('data-snapshot-load', this.onDataReceived.bind(this));\n\t\tthis.events.on('init-edit-mode', this.onInitEditMode.bind(this));\n\n\t\tthis.onColorChange = this.onColorChange.bind(this);\n\n\t\tthis.addFilters()\n\t}\n\n\taddFilters() {\n\t\tcoreModule.filter('numberOrText', () => {\n\t\t\tlet numberOrTextFilter = (input) => {\n\t\t\t\tif(angular.isNumber(input)) {\n\t\t\t\t\treturn this.filter('number')(input);\n\t\t\t\t} else {\n\t\t\t\t\treturn input;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tnumberOrTextFilter.$stateful = true;\n\t\t\treturn numberOrTextFilter;\n\t\t});\n\n\t\tcoreModule.filter('numberOrTextWithRegex', () => {\n\t\t\tlet numberOrTextFilter = (input, textRegex) => {\n\t\t\t\tif(angular.isNumber(input)) {\n\t\t\t\t\treturn this.filter('number')(input);\n\t\t\t\t} else {\n\t\t\t\t\tif(textRegex == null || textRegex.length == 0) {\n\t\t\t\t\t\treturn input;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlet regex;\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tregex = new RegExp(textRegex);\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\treturn input;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!input) {\n\t\t\t\t\t\t\treturn input;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet matchResults = input.match(regex);\n\t\t\t\t\t\tif (matchResults == null) {\n\t\t\t\t\t\t\treturn input;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn matchResults[0];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tnumberOrTextFilter.$stateful = true;\n\t\t\treturn numberOrTextFilter;\n\t\t});\n\t}\n\n\tpostRefresh() {\n\t\tif (this.panel.fixedSpan) {\n\t\t\tthis.panel.span = this.panel.fixedSpan;\n\t\t}\n\n\t\tthis.measurements = this.panel.targets;\n\n\t\t/** Duplicate alias validation **/\n\t\tthis.duplicates = false;\n\n\t\tthis.measurements = _.filter(this.measurements, (measurement) => {\n\t\t\treturn !measurement.hide;\n\t\t});\n\n\t\t_.each(this.measurements, (m) => {\n\t\t\tlet res = _.filter(this.measurements, (measurement) => {\n\t\t\t\treturn (m.alias == measurement.alias || (m.target == measurement.target && m.target)) && !m.hide;\n\t\t\t});\n\n\t\t\tif (res.length > 1) {\n\t\t\t\tthis.duplicates = true;\n\t\t\t}\n\t\t});\n\t}\n\n\tonInitEditMode() {\n\t\tthis.addEditorTab('Options', 'public/plugins/vonage-status-panel/editor.html', 2);\n\t\t// Load in the supported units-of-measure formats so they can be displayed in the editor\n\t\tthis.unitFormats = kbn.getUnitFormats();\n\t}\n\n\tsetUnitFormat(measurement, subItem) {\n\t\tmeasurement.units = subItem.value;\n\t\tthis.render();\n\t}\n\n\tfixPanelHeader() {\n\t\t// Handle the panel top menu height, since it's display doesn't look good with the panel\n\t\tlet panelHeaderHeight = '';\n\t\tif(this.panel.title.length === 0) {\n\t\t\tpanelHeaderHeight = '10px';\n\t\t}\n\t\tthis.$panelContainer.find('.panel-header').css('height', panelHeaderHeight);\n\t\tthis.$panelContainer.find('.panel-menu-container').css('height', panelHeaderHeight);\n\t\tthis.$panelContainer.find('.fa-caret-down').css('display', 'none');\n\t}\n\n\tsetElementHeight() {\n\t\t// Handle the panel height\n\t\tthis.$panelContainer.find('.status-panel').css('min-height', this.$panelContoller.height + 'px');\n\t\tthis.minHeight = this.$panelContoller.height-10;\n\t}\n\n\tsetTextMaxWidth() {\n\t\tlet tail = ' …';\n\t\tlet panelWidth = this.$panelContainer.innerWidth();\n\t\tif (isNaN(panelWidth))\n\t\t\tpanelWidth = parseInt(panelWidth.slice(0, -2), 10) / 12;\n\t\tpanelWidth = panelWidth - 20;\n\t\tthis.maxWidth = panelWidth;\n\t}\n\n\tisAutoScrollAlerts() {\n\t\tif(!this.panel.isAutoScrollOnOverflow) {\n\t\t\treturn false;\n\t\t}\n\n\t\tlet element = this.$panelContainer.find('.status-panel')[0];\n\t\tlet overflowY = element.offsetHeight < element.scrollHeight;\n\t\treturn overflowY;\n\t}\n\n\tonHandlerChange(measurement) {\n\t\t// If the Threshold type changes between Number/String/Date then try and recast the thresholds to keep consistent\n\t\tif (measurement.valueHandler === \"Number Threshold\") {\n\t\t\tmeasurement.crit = (isNaN(Number(measurement.crit))) ? undefined : Number(measurement.crit);\n\t\t\tmeasurement.warn = (isNaN(Number(measurement.warn))) ? undefined : Number(measurement.warn);\n\t\t} else if (measurement.valueHandler === \"String Threshold\") {\n\t\t\tif (typeof measurement.crit != \"undefined\") measurement.crit = String(measurement.crit);\n\t\t\tif (typeof measurement.warn != \"undefined\") measurement.warn = String(measurement.warn);\n\t\t} else if (measurement.valueHandler === \"Date Threshold\") {\n\t\t\tlet c = new Date(measurement.crit), w = new Date(measurement.warn);\n\t\t\tmeasurement.crit = (isNaN(c.getTime())) ? undefined : c;\n\t\t\tmeasurement.warn = (isNaN(w.getTime())) ? undefined : w;\n\t\t}\n\t\tthis.onRender();\n\t}\n\n\tonColorChange(item) {\n\t\treturn (color) => {\n\t\t\tthis.panel.colors[item] = color;\n\t\t\tthis.render();\n\t\t};\n\t}\n\n\tonRender() {\n\t\tthis.fixPanelHeader();\n\t\tthis.setElementHeight();\n\t\tthis.setTextMaxWidth();\n\t\tthis.upgradeOldVersion();\n\n\t\tif (this.panel.clusterName) {\n\t\t\tthis.panel.displayName =\n\t\t\t\tthis.filter('interpolateTemplateVars')(this.panel.clusterName, this.$scope)\n\t\t\t\t\t.replace(new RegExp(this.panel.namePrefix, 'i'), '');\n\t\t} else {\n\t\t\tthis.panel.displayName = \"\";\n\t\t}\n\n\t\tif(this.panel.flipCard){\n\t\t\tthis.$panelContainer.addClass(\"effect-hover\");\n\t\t} else {\n\t\t\tthis.$panelContainer.removeClass(\"effect-hover\");\n\t\t}\n\n\t\tlet targets = this.panel.targets;\n\n\t\tthis.crit = [];\n\t\tthis.warn = [];\n\t\tthis.disabled = [];\n\t\tthis.display = [];\n\t\tthis.annotation = [];\n\t\tthis.extraMoreAlerts = null;\n\t\tthis.isDimmed = false;\n\n\t\tlet processTemplate = false;\n\t\t_.each(this.series, (s) => {\n\t\t\tlet target = _.find(targets, (target) => {\n\t\t\t\treturn target.alias == s.alias || target.target == s.alias;\n\t\t\t});\n\n\t\t\tif (!target) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ts.alias = target.alias;\n\t\t\ts.url = target.url;\n\t\t\ts.isDisplayValue = true;\n\t\t\ts.displayType = target.displayType;\n\t\t\ts.valueDisplayRegex = \"\";\n\t\t\ts.hideCard = target.hideCard;\n\n\t\t\tif(this.validateRegex(target.valueDisplayRegex)) {\n\t\t\t\ts.valueDisplayRegex = target.valueDisplayRegex;\n\t\t\t}\n\n\t\t\tlet value;\n\t\t\tswitch (target.aggregation) {\n\t\t\t\tcase 'Max':\n\t\t\t\t\tvalue = _.max(s.datapoints, (point) => { return point[0]; })[0];\n\t\t\t\t\tvalue = s.stats.max;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Min':\n\t\t\t\t\tvalue = _.min(s.datapoints, (point) => { return point[0]; })[0];\n\t\t\t\t\tvalue = s.stats.min;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Delta':\n\t\t\t\t\tvalue = s.datapoints[s.datapoints.length - 1][0] - s.datapoints[0][0];\n\t\t\t\t\tvalue = s.stats.diff;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Sum':\n\t\t\t\t\tvalue = 0;\n\t\t\t\t\t_.each(s.datapoints, (point) => { value += point[0] });\n\t\t\t\t\tvalue = s.stats.total;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Avg':\n\t\t\t\t\tvalue = s.stats.avg;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'First':\n\t\t\t\t\tvalue = s.datapoints[0][0];\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tvalue = s.datapoints[s.datapoints.length - 1][0];\n\t\t\t}\n\n\t\t\ts.display_value = value;\n\n\t\t\tif (target.valueHandler == \"Number Threshold\" ||\n\t\t\t\ttarget.valueHandler == \"String Threshold\" ||\n\t\t\t\ttarget.valueHandler == \"Date Threshold\") {\n\t\t\t\tthis.handleThresholdStatus(s, target);\n\t\t\t}\n\t\t\telse if (target.valueHandler == \"Disable Criteria\") {\n\t\t\t\tthis.handleDisabledStatus(s,target);\n\t\t\t} else if (target.valueHandler == 'Dimming Criteria') {\n\t\t\t\tthis.handleDimmingCriteria(s, target);\n\t\t\t}\n\t\t\telse if (target.valueHandler == \"Text Only\") {\n\t\t\t\tthis.handleTextOnly(s, target);\n\t\t\t} else if (target.valueHandler == \"Template\") {\n\t\t\t\tprocessTemplate = true;\n\t\t\t}\n\t\t});\n\n\t\t//Template need to be processed last, because it needs display_value in all of series\n\t\tif(processTemplate){\n\t\t\t_.each(this.series, (s) => {\n\t\t\t\tlet target = _.find(targets, (target) => {\n\t\t\t\t\treturn target.valueHandler == \"Template\" &&(target.alias == s.alias || target.target == s.alias);\n\t\t\t\t});\n\n\t\t\t\tif(target) {\n\t\t\t\t\tthis.handleTemplate(s, target, this.series);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif(this.panel.isHideAlertsOnDisable && this.disabled.length > 0) {\n\t\t\tthis.crit = [];\n\t\t\tthis.warn = [];\n\t\t\tthis.display = [];\n\t\t}\n\n\t\tthis.autoFlip();\n\t\tthis.updatePanelState();\n\t\tthis.handleCssDisplay();\n\t\tthis.parseUri();\n\n\t\t//This must appear after handling the css style of the panel\n\t\tthis.handleMaxAlertsToShow();\n\t}\n\n\tupgradeOldVersion() {\n\t\tlet targets = this.panel.targets;\n\n\t\t//Handle legacy code\n\t\t_.each(targets, (target) => {\n\t\t\tif(target.valueHandler == null) {\n\t\t\t\tif(target.displayType != null) {\n\t\t\t\t\ttarget.valueHandler = target.displayType;\n\t\t\t\t\tif (target.valueHandler == \"Annotation\") {\n\t\t\t\t\t\ttarget.valueHandler = \"Text Only\"\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttarget.valueHandler = this.valueHandlers[0]\n\t\t\t\t}\n\t\t\t\ttarget.displayType = this.displayTypes[0];\n\t\t\t}\n\n\t\t\tif(target.display != null){\n\t\t\t\ttarget.displayAliasType = target.display ? \"Always\" : this.displayAliasTypes[0];\n\t\t\t\ttarget.displayValueWithAlias = target.display ? 'When Alias Displayed' : this.displayValueTypes[0];\n\t\t\t\tdelete target.display;\n\n\t\t\t}\n\t\t});\n\n\t\t// Depreciate Threshold in favour of Type specific versions\n\t\t_.each(targets, (target) => {\n\t\t\tif (target.valueHandler === \"Threshold\") {\n\t\t\t\t// Use the same logic as Threshold Parsing to ensure we retain same behaviour\n\t\t\t\t// i.e. map to Number Threshold if two floats (i.e. range check) otherwise map to String Threshold (i.e. exact match)\n\t\t\t\tif (StatusPluginCtrl.isFloat(target.crit) && StatusPluginCtrl.isFloat(target.warn)) {\n\t\t\t\t\ttarget.valueHandler = \"Number Threshold\"\n\t\t\t\t\ttarget.crit = Number(target.crit);\n\t\t\t\t\ttarget.warn = Number(target.warn);\n\t\t\t\t} else {\n\t\t\t\t\ttarget.valueHandler = \"String Threshold\"\n\t\t\t\t\tif (typeof target.crit != \"undefined\") target.crit = String(target.crit);\n\t\t\t\t\tif (typeof target.warn != \"undefined\") target.warn = String(target.warn);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\thandleThresholdStatus(series, target) {\n\t\tseries.thresholds = StatusPluginCtrl.parseThresholds(target);\n\t\tseries.inverted = series.thresholds.crit < series.thresholds.warn;\n\n\t\tlet isCritical = false;\n\t\tlet isWarning = false;\n\t\tlet isCheckRanges = series.thresholds.warnIsNumber && series.thresholds.critIsNumber;\n\t\tif (isCheckRanges) {\n\t\t\tif (!series.inverted) {\n\t\t\t\tif (series.display_value >= series.thresholds.crit) {\n\t\t\t\t\tisCritical = true\n\t\t\t\t} else if (series.display_value >= series.thresholds.warn) {\n\t\t\t\t\tisWarning = true\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (series.display_value <= series.thresholds.crit) {\n\t\t\t\t\tisCritical = true\n\t\t\t\t} else if (series.display_value <= series.thresholds.warn) {\n\t\t\t\t\tisWarning = true\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (series.display_value == series.thresholds.crit) {\n\t\t\t\tisCritical = true\n\t\t\t} else if (series.display_value == series.thresholds.warn) {\n\t\t\t\tisWarning = true\n\t\t\t}\n\t\t}\n\n\t\t// Add units-of-measure and decimal formatting or date formatting as needed\n\t\tseries.display_value = this.formatDisplayValue(series.display_value, target);\n\n\t\tlet displayValueWhenAliasDisplayed = 'When Alias Displayed' === target.displayValueWithAlias;\n\t\tlet displayValueFromWarning = 'Warning / Critical' === target.displayValueWithAlias;\n\t\tlet displayValueFromCritical = 'Critical Only' === target.displayValueWithAlias;\n\n\t\tif(isCritical) {\n\t\t\t//In critical state we don't show the error as annotation\n\t\t\tseries.displayType = this.displayTypes[0];\n\t\t\tseries.isDisplayValue = displayValueWhenAliasDisplayed || displayValueFromWarning || displayValueFromCritical;\n\t\t\tthis.crit.push(series);\n\t\t} else if(isWarning) {\n\t\t\t//In warning state we don't show the warning as annotation\n\t\t\tseries.displayType = this.displayTypes[0];\n\t\t\tseries.isDisplayValue = displayValueWhenAliasDisplayed || displayValueFromWarning;\n\t\t\tthis.warn.push(series);\n\t\t} else if (\"Always\" == target.displayAliasType) {\n\t\t\tseries.isDisplayValue = displayValueWhenAliasDisplayed;\n\t\t\tif(series.displayType == \"Annotation\") {\n\t\t\t\tthis.annotation.push(series);\n\t\t\t} else {\n\t\t\t\tthis.display.push(series);\n\t\t\t}\n\t\t}\n\t}\n\n\tformatDisplayValue(value, target) {\n\t\t// Format the display value. Set to \"Invalid\" if value is out-of-bounds or a type mismatch with the handler\n\t\tif (target.valueHandler === \"Number Threshold\") {\n\t\t\tif (_.isFinite(value)) {\n\t\t\t\tlet units = (typeof target.units === \"string\") ? target.units : 'none';\n\t\t\t\tlet decimals = this.decimalPlaces(value);\n\t\t\t\t// We define the decimal percision by the minimal decimal needed\n\t\t\t\tdecimals = (typeof target.decimals === \"number\") ? Math.min(target.decimals, decimals) : decimals;\n\t\t\t\tvalue = kbn.valueFormats[units](value, decimals, null);\n\t\t\t} else {\n\t\t\t\tvalue = \"Invalid Number\";\n\t\t\t}\n\t\t} else if (target.valueHandler === \"String Threshold\") {\n\t\t\tif (value === undefined || value === null || value !== value)\n\t\t\t\tvalue = \"Invalid String\";\n\t\t} else if (target.valueHandler === \"Date Threshold\") {\n\t\t\tif (_.isFinite(value)) {\n\t\t\t\tlet date = moment(new Date(value));\n\t\t\t\tif (this.dashboard.isTimezoneUtc()) date = date.utc();\n\t\t\t\tvalue = date.format(target.dateFormat);\n\t\t\t} else {\n\t\t\t\tvalue = \"Invalid Date\";\n\t\t\t}\n\t\t}\n\t\treturn value;\n\t}\n\n\tdecimalPlaces(num) {\n\t\tvar match = (''+num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n\t\tif (!match) { return 0; }\n\t\treturn Math.max(\n\t\t\t0,\n\t\t\t// Number of digits right of decimal point.\n\t\t\t(match[1] ? match[1].length : 0)\n\t\t\t// Adjust for scientific notation.\n\t\t\t- (match[2] ? +match[2] : 0));\n\t}\n\n\thandleDisabledStatus(series, target) {\n\t\tseries.displayType = this.displayTypes[0];\n\t\tseries.disabledValue = target.disabledValue;\n\n\t\tif (series.display_value == series.disabledValue) {\n\t\t\tthis.disabled.push(series);\n\t\t}\n\t}\n\n\thandleDimmingCriteria(series, target) {\n\t\tlet compareValue = target.dimmCriteria;\n\t\tif (!compareValue) return;\n\n\t\tseries.displayType = this.displayTypes[0];\n\t\tlet compareResult;\n\t\tif (isNaN(compareValue)) {\n\t\t\tcompareResult = compareValue.localeCompare(series.display_value);\n\t\t} else {\n\t\t\tcompareResult = StatusPluginCtrl.compareNumbers(compareValue, series.display_value);\n\t\t}\n\n\t\tthis.isDimmed = false;\n\t\tswitch (target.dimmCompare) {\n\t\t\tcase \"More than\":\n\t\t\t\tif(compareResult < 0) this.isDimmed = true;\n\t\t\t\tbreak;\n\t\t\tcase \"More or equals\":\n\t\t\t\tif(compareResult <= 0) this.isDimmed = true;\n\t\t\t\tbreak;\n\t\t\tcase \"Equals\":\n\t\t\t\tif(compareResult == 0) this.isDimmed = true;\n\t\t\t\tbreak;\n\t\t\tcase \"Less or equals\":\n\t\t\t\tif(compareResult >= 0) this.isDimmed = true;\n\t\t\t\tbreak;\n\t\t\tcase \"Less than\":\n\t\t\t\tif(compareResult > 0) this.isDimmed = true;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.display.push(series);\n\t}\n\n\thandleTextOnly(series, target) {\n\t\tif(series.displayType == \"Annotation\") {\n\t\t\tthis.annotation.push(series);\n\t\t} else {\n\t\t\tthis.display.push(series);\n\t\t}\n\t}\n\n\thandleTemplate(series, target, allSeries) {\n\t\tlet valueTemplate = target.template;\n\t\tlet result = valueTemplate;\n\t\tlet aliasRegExp = new RegExp(\"%[^%]+%\", \"g\");\n\t\tlet regexResult;\n\t\twhile(regexResult = aliasRegExp.exec(valueTemplate)) {\n\t\t\tlet serie = _.find(allSeries, (s) => {\n\t\t\t\treturn s.alias == regexResult[0].replace(/%/g, '').trim();\n\t\t\t});\n\t\t\tif(serie) {\n\t\t\t\tresult = result.replace(regexResult[0], serie.display_value);\n\t\t\t}\n\t\t}\n\n\t\tseries.display_value = result;\n\t\tif(series.displayType == \"Annotation\") {\n\t\t\tthis.annotation.push(series);\n\t\t} else {\n\t\t\tthis.display.push(series);\n\t\t}\n\t}\n\n\tupdatePanelState() {\n\t\tif(this.duplicates) {\n\t\t\tthis.panelState = 'error-state';\n\t\t} else if (this.disabled.length > 0) {\n\t\t\tthis.panelState = 'disabled-state';\n\t\t} else if (this.crit.length > 0) {\n\t\t\tthis.panelState = 'error-state';\n\t\t} else if (this.warn.length > 0) {\n\t\t\tthis.panelState = 'warn-state';\n\t\t} else if((this.series == undefined || this.series.length == 0) && this.panel.isGrayOnNoData) {\n\t\t\tthis.panelState = 'no-data-state';\n\t\t} else {\n\t\t\tthis.panelState = 'ok-state';\n\t\t}\n\t}\n\n\thandleCssDisplay() {\n\t\tthis.$panelContainer.removeClass('error-state warn-state disabled-state ok-state no-data-state');\n\t\tthis.$panelContainer.addClass(this.panelState);\n\n\t\tlet radius = _.isNumber(this.panel.cornerRadius) ? this.panel.cornerRadius : 0\n\t\tthis.$panelContainer.css('border-radius', radius + '%');\n\n\t\tlet okColor = (this.panel.isIgnoreOKColors) ? '' : this.panel.colors.ok;\n\n\t\tif (this.panel.colorMode === \"Panel\") {\n\t\t\tswitch(this.panelState) {\n\t\t\t\tcase 'disabled-state': this.$panelContainer.css('background-color', this.panel.colors.disable); break;\n\t\t\t\tcase 'error-state': this.$panelContainer.css('background-color', this.panel.colors.crit); break;\n\t\t\t\tcase 'warn-state': this.$panelContainer.css('background-color', this.panel.colors.warn); break;\n\t\t\t\tcase 'no-data-state': this.$panelContainer.css('background-color', this.panel.colors.disable); break;\n\t\t\t\tdefault: this.$panelContainer.css('background-color', okColor); break;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.$panelContainer.css('background-color', '');\n\t\t}\n\t}\n\n\thandleMaxAlertsToShow() {\n\t\tif(this.panel.maxAlertNumber != null && this.panel.maxAlertNumber >= 0) {\n\t\t\tlet currentMaxAllowedAlerts = this.panel.maxAlertNumber;\n\t\t\tlet filteredOutAlerts = 0;\n\t\t\tlet arrayNamesToSlice = [\"disabled\", \"crit\", \"warn\", \"display\"];\n\t\t\tarrayNamesToSlice.forEach( arrayName => {\n\t\t\t\tlet originAlertCount = this[arrayName].length;\n\t\t\t\tthis[arrayName] = this[arrayName].slice(0,currentMaxAllowedAlerts);\n\t\t\t\tcurrentMaxAllowedAlerts = Math.max(currentMaxAllowedAlerts - this[arrayName].length, 0);\n\t\t\t\tfilteredOutAlerts += (originAlertCount - this[arrayName].length);\n\t\t\t});\n\n\t\t\tif(filteredOutAlerts > 0) {\n\t\t\t\tthis.extraMoreAlerts = \"+ \" + filteredOutAlerts + \" more\"\n\t\t\t}\n\t\t}\n\t}\n\n\tparseUri() {\n\t\tif (this.panel.links && this.panel.links.length > 0) {\n\t\t\tlet link = this.panel.links[0];\n\n\t\t\tif (link.type == \"absolute\") {\n\t\t\t\tthis.uri = link.url;\n\t\t\t} else {\n\t\t\t\tthis.uri = 'dashboard/' + link.dashUri;\n\t\t\t}\n\n\t\t\tif (link.params) {\n\t\t\t\tthis.uri += \"?\" + link.params;\n\t\t\t}\n\n\t\t\tthis.targetBlank = link.targetBlank;\n\t\t} else {\n\t\t\tthis.uri = undefined;\n\t\t}\n\t}\n\n\tvalidateRegex(textRegex) {\n\t\tif(textRegex == null || textRegex.length == 0) {\n\t\t\treturn true\n\t\t}\n\t\ttry {\n\t\t\tlet regex = new RegExp(textRegex);\n\t\t\treturn true\n\t\t} catch(e) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tstatic parseThresholds(metricOptions) {\n\t\tlet res = {};\n\n\t\tif (StatusPluginCtrl.isFloat(metricOptions.warn)) {\n\t\t\tres.warn = parseFloat(metricOptions.warn);\n\t\t\tres.warnIsNumber = true;\n\t\t} else if (metricOptions.warn instanceof Date) {\n\t\t\t// Convert Dates to Numbers and leverage existing threshold logic\n\t\t\tres.warn = metricOptions.warn.valueOf();\n\t\t\tres.warnIsNumber = true;\n\t\t} else {\n\t\t\tres.warn = metricOptions.warn;\n\t\t\tres.warnIsNumber = false;\n\t\t}\n\n\t\tif (StatusPluginCtrl.isFloat(metricOptions.crit)) {\n\t\t\tres.crit = parseFloat(metricOptions.crit);\n\t\t\tres.critIsNumber = true;\n\t\t} else if (metricOptions.crit instanceof Date) {\n\t\t\tres.crit = metricOptions.crit.valueOf();\n\t\t\tres.critIsNumber = true;\n\t\t} else {\n\t\t\tres.crit = metricOptions.crit;\n\t\t\tres.critIsNumber = false;\n\t\t}\n\n\t\treturn res;\n\t}\n\n\tstatic isFloat(val) {\n\t\tif (!isNaN(val) && val.toString().toLowerCase().indexOf('e') == -1) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tstatic compareNumbers(val1, val2) {\n\t\tif (val1 == val2) return 0;\n\t\tif (val1 < val2) return -1;\n\t\tif (val1 > val2) return 1;\n\t}\n\n\tonDataReceived(dataList) {\n\t\tthis.series = dataList.map(StatusPluginCtrl.seriesHandler.bind(this));\n\t\tthis.render();\n\t}\n\n\tonDataError() {\n\t\tthis.crit = [];\n\t\tthis.warn = [];\n\t}\n\n\tstatic seriesHandler(seriesData) {\n\t\tvar series = new TimeSeries({\n\t\t\tdatapoints: seriesData.datapoints,\n\t\t\talias: seriesData.target\n\t\t});\n\n\t\tseries.flotpairs = series.getFlotPairs(\"connected\");\n\n\t\treturn series;\n\t}\n\n\t$onDestroy() {\n\t\tif(this.timeoutId) clearInterval(this.timeoutId);\n\t}\n\n\tautoFlip() {\n\t\tif (this.timeoutId) clearInterval(this.timeoutId);\n\t\tif (this.panel.flipCard && (this.crit.length > 0 || this.warn.length > 0 || this.disabled.length > 0)) {\n\t\t\tthis.timeoutId = setInterval(() => {\n\t\t\t\tthis.$panelContainer.toggleClass(\"flipped\");\n\t\t\t}, this.panel.flipTime * 1000);\n\t\t}\n\t}\n\n\tlink(scope, elem, attrs, ctrl) {\n\t\tthis.$panelContainer = elem.find('.panel-container');\n\t\tthis.$panelContainer.addClass(\"st-card\");\n\t\tthis.$panelContoller = ctrl;\n\t\tif (this.$panelContainer.find('.dimm-state').length == 0) {\n\t\t\tvar dimmElement = angular.element(\"
\");\n\t\t\tthis.$panelContainer.append(ctrl.compile(dimmElement)(scope));\n\t\t}\n\t}\n}\n\nStatusPluginCtrl.templateUrl = 'module.html';\n"]}
\ No newline at end of file
diff --git a/src/css/status_panel.scss b/src/css/status_panel.scss
index 6871f853..4186747c 100644
--- a/src/css/status_panel.scss
+++ b/src/css/status_panel.scss
@@ -129,6 +129,15 @@
}
}
+.dimm-state {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ pointer-events: none;
+}
+
.st-card.effect-hover .st-card-back {
-webkit-transform: rotateY(-180deg);
transform: rotateY(-180deg);
diff --git a/src/editor.html b/src/editor.html
index 04243007..e38d76d0 100644
--- a/src/editor.html
+++ b/src/editor.html
@@ -108,6 +108,9 @@
Threshold Preferences
+
+
+