From 4d9b2f36d1e4adc95ad472c328bc80f1017d1783 Mon Sep 17 00:00:00 2001 From: Alexander Zobnin Date: Fri, 10 Feb 2017 13:18:12 +0300 Subject: [PATCH] Triggers Panel: refactor. --- dist/panel-triggers/module.html | 2 +- dist/panel-triggers/module.js | 305 +++++++++++++++--------------- dist/panel-triggers/module.js.map | 2 +- src/panel-triggers/module.html | 2 +- src/panel-triggers/module.js | 257 +++++++++++++------------ 5 files changed, 284 insertions(+), 284 deletions(-) diff --git a/dist/panel-triggers/module.html b/dist/panel-triggers/module.html index 244eca4..23c3ce0 100644 --- a/dist/panel-triggers/module.html +++ b/dist/panel-triggers/module.html @@ -35,7 +35,7 @@ - +
diff --git a/dist/panel-triggers/module.js b/dist/panel-triggers/module.js index 3961917..fd636c6 100644 --- a/dist/panel-triggers/module.js +++ b/dist/panel-triggers/module.js @@ -3,7 +3,7 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'app/plugins/sdk', './editor', './ack-tooltip.directive', './css/panel_triggers.css!'], function (_export, _context) { "use strict"; - var _, $, moment, utils, MetricsPanelCtrl, triggerPanelEditor, _createClass, _get, defaultSeverity, panelDefaults, triggerStatusMap, defaultTimeFormat, TriggerPanelCtrl; + var _, $, moment, utils, PanelCtrl, triggerPanelEditor, _createClass, defaultSeverity, panelDefaults, triggerStatusMap, defaultTimeFormat, TriggerPanelCtrl; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { @@ -35,7 +35,7 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - function filterTriggers(triggers, triggerFilter) { + function _filterTriggers(triggers, triggerFilter) { if (utils.isRegex(triggerFilter)) { return _.filter(triggers, function (trigger) { return utils.buildRegex(triggerFilter).test(trigger.description); @@ -57,7 +57,7 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap }, function (_datasourceZabbixUtils) { utils = _datasourceZabbixUtils; }, function (_appPluginsSdk) { - MetricsPanelCtrl = _appPluginsSdk.MetricsPanelCtrl; + PanelCtrl = _appPluginsSdk.PanelCtrl; }, function (_editor) { triggerPanelEditor = _editor.triggerPanelEditor; }, function (_ackTooltipDirective) {}, function (_cssPanel_triggersCss) {}], @@ -80,31 +80,6 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap }; }(); - _get = function get(object, property, receiver) { - if (object === null) object = Function.prototype; - var desc = Object.getOwnPropertyDescriptor(object, property); - - if (desc === undefined) { - var parent = Object.getPrototypeOf(object); - - if (parent === null) { - return undefined; - } else { - return get(parent, property, receiver); - } - } else if ("value" in desc) { - return desc.value; - } else { - var getter = desc.get; - - if (getter === undefined) { - return undefined; - } - - return getter.call(receiver); - } - }; - defaultSeverity = [{ priority: 0, severity: 'Not classified', color: '#B7DBAB', show: true }, { priority: 1, severity: 'Information', color: '#82B5D8', show: true }, { priority: 2, severity: 'Warning', color: '#E5AC0E', show: true }, { priority: 3, severity: 'Average', color: '#C15C17', show: true }, { priority: 4, severity: 'High', color: '#BF1B00', show: true }, { priority: 5, severity: 'Disaster', color: '#890F02', show: true }]; panelDefaults = { datasource: null, @@ -136,8 +111,8 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap }; defaultTimeFormat = "DD MMM YYYY HH:mm:ss"; - _export('PanelCtrl', _export('TriggerPanelCtrl', TriggerPanelCtrl = function (_MetricsPanelCtrl) { - _inherits(TriggerPanelCtrl, _MetricsPanelCtrl); + _export('PanelCtrl', _export('TriggerPanelCtrl', TriggerPanelCtrl = function (_PanelCtrl) { + _inherits(TriggerPanelCtrl, _PanelCtrl); /** @ngInject */ function TriggerPanelCtrl($scope, $injector, $element, datasourceSrv, templateSrv, contextSrv) { @@ -160,6 +135,11 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap _this.triggerList = []; _this.currentPage = []; + + _this.events.on('init-edit-mode', _this.onInitEditMode.bind(_this)); + _this.events.on('render', _this.onRender.bind(_this)); + _this.events.on('refresh', _this.onRender.bind(_this)); + _this.refreshData(); return _this; } @@ -171,15 +151,10 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap _createClass(TriggerPanelCtrl, [{ - key: 'onInitMetricsPanelEditMode', - value: function onInitMetricsPanelEditMode() { + key: 'onInitEditMode', + value: function onInitEditMode() { this.addEditorTab('Options', triggerPanelEditor, 2); } - }, { - key: 'refresh', - value: function refresh() { - this.onMetricsPanelRefresh(); - } }, { key: 'onMetricsPanelRefresh', value: function onMetricsPanelRefresh() { @@ -191,22 +166,37 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap this.refreshData(); } }, { - key: 'refreshData', - value: function refreshData() { + key: 'onRender', + value: function onRender() { var _this2 = this; // clear loading/error state delete this.error; this.loading = true; - this.setTimeQueryStart(); - var self = this; + return this.refreshData().then(function (triggerList) { + // Limit triggers number + _this2.triggerList = triggerList.slice(0, _this2.panel.limit); + + // Notify panel that request is finished + _this2.loading = false; + }); + } + }, { + key: 'refreshData', + value: function refreshData() { + return this.getTriggers().then(this.getAcknowledges.bind(this)).then(this.filterTriggers.bind(this)); + } + }, { + key: 'getTriggers', + value: function getTriggers() { + var _this3 = this; - // Load datasource return this.datasourceSrv.get(this.panel.datasource).then(function (datasource) { var zabbix = datasource.zabbix; - var showEvents = self.panel.showEvents.value; - var triggerFilter = self.panel.triggers; + _this3.zabbix = zabbix; + var showEvents = _this3.panel.showEvents.value; + var triggerFilter = _this3.panel.triggers; // Replace template variables var groupFilter = datasource.replaceTemplateVars(triggerFilter.group.filter); @@ -215,114 +205,120 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap var getTriggers = zabbix.getTriggers(groupFilter, hostFilter, appFilter, showEvents); return getTriggers.then(function (triggers) { - return _.map(triggers, function (trigger) { - var triggerObj = trigger; - - // Format last change and age - trigger.lastchangeUnix = Number(trigger.lastchange); - var timestamp = moment.unix(trigger.lastchangeUnix); - if (self.panel.customLastChangeFormat) { - // User defined format - triggerObj.lastchange = timestamp.format(self.panel.lastChangeFormat); - } else { - triggerObj.lastchange = timestamp.format(self.defaultTimeFormat); - } - triggerObj.age = timestamp.fromNow(true); - - // Set host that the trigger belongs - if (trigger.hosts.length) { - triggerObj.host = trigger.hosts[0].name; - triggerObj.hostTechName = trigger.hosts[0].host; - } - - // Set color - if (trigger.value === '1') { - // Problem state - triggerObj.color = self.panel.triggerSeverity[trigger.priority].color; - } else { - // OK state - triggerObj.color = self.panel.okEventColor; - } - - triggerObj.severity = self.panel.triggerSeverity[trigger.priority].severity; - return triggerObj; - }); - }).then(function (triggerList) { - - // Request acknowledges for trigger - var eventids = _.map(triggerList, function (trigger) { - return trigger.lastEvent.eventid; - }); - - return zabbix.getAcknowledges(eventids).then(function (events) { - - // Map events to triggers - _.each(triggerList, function (trigger) { - var event = _.find(events, function (event) { - return event.eventid === trigger.lastEvent.eventid; - }); - - if (event) { - trigger.acknowledges = _.map(event.acknowledges, function (ack) { - var timestamp = moment.unix(ack.clock); - if (self.panel.customLastChangeFormat) { - ack.time = timestamp.format(self.panel.lastChangeFormat); - } else { - ack.time = timestamp.format(self.defaultTimeFormat); - } - ack.user = ack.alias + ' (' + ack.name + ' ' + ack.surname + ')'; - return ack; - }); - - // Mark acknowledged triggers with different color - if (self.panel.markAckEvents && trigger.acknowledges.length) { - trigger.color = self.panel.ackEventColor; - } - } - }); - - // Filter triggers by description - var triggerFilter = self.panel.triggers.trigger.filter; - if (triggerFilter) { - triggerList = filterTriggers(triggerList, triggerFilter); - } - - // Filter acknowledged triggers - if (self.panel.showTriggers === 'unacknowledged') { - triggerList = _.filter(triggerList, function (trigger) { - return !trigger.acknowledges; - }); - } else if (self.panel.showTriggers === 'acknowledged') { - triggerList = _.filter(triggerList, 'acknowledges'); - } else { - triggerList = triggerList; - } - - // Filter triggers by severity - triggerList = _.filter(triggerList, function (trigger) { - return self.panel.triggerSeverity[trigger.priority].show; - }); - - // Sort triggers - if (self.panel.sortTriggersBy.value === 'priority') { - triggerList = _.sortBy(triggerList, 'priority').reverse(); - } else { - triggerList = _.sortBy(triggerList, 'lastchangeUnix').reverse(); - } - - // Limit triggers number - self.triggerList = triggerList.slice(0, self.panel.limit); - - // Notify panel that request is finished - self.setTimeQueryEnd(); - self.loading = false; - - _this2.panel.triggerList = _this2.triggerList; - _this2.render(); - }); + return _.map(triggers, _this3.formatTrigger.bind(_this3)); }); }); } + }, { + key: 'getAcknowledges', + value: function getAcknowledges(triggerList) { + var _this4 = this; + + // Request acknowledges for trigger + var eventids = _.map(triggerList, function (trigger) { + return trigger.lastEvent.eventid; + }); + + return this.zabbix.getAcknowledges(eventids).then(function (events) { + + // Map events to triggers + _.each(triggerList, function (trigger) { + var event = _.find(events, function (event) { + return event.eventid === trigger.lastEvent.eventid; + }); + + if (event) { + trigger.acknowledges = _.map(event.acknowledges, function (ack) { + var timestamp = moment.unix(ack.clock); + if (_this4.panel.customLastChangeFormat) { + ack.time = timestamp.format(_this4.panel.lastChangeFormat); + } else { + ack.time = timestamp.format(_this4.defaultTimeFormat); + } + ack.user = ack.alias + ' (' + ack.name + ' ' + ack.surname + ')'; + return ack; + }); + + // Mark acknowledged triggers with different color + if (_this4.panel.markAckEvents && trigger.acknowledges.length) { + trigger.color = _this4.panel.ackEventColor; + } + } + }); + + return triggerList; + }); + } + }, { + key: 'filterTriggers', + value: function filterTriggers(triggerList) { + var _this5 = this; + + // Filter triggers by description + var triggerFilter = this.panel.triggers.trigger.filter; + if (triggerFilter) { + triggerList = _filterTriggers(triggerList, triggerFilter); + } + + // Filter acknowledged triggers + if (this.panel.showTriggers === 'unacknowledged') { + triggerList = _.filter(triggerList, function (trigger) { + return !trigger.acknowledges; + }); + } else if (this.panel.showTriggers === 'acknowledged') { + triggerList = _.filter(triggerList, 'acknowledges'); + } else { + triggerList = triggerList; + } + + // Filter triggers by severity + triggerList = _.filter(triggerList, function (trigger) { + return _this5.panel.triggerSeverity[trigger.priority].show; + }); + + // Sort triggers + if (this.panel.sortTriggersBy.value === 'priority') { + triggerList = _.sortBy(triggerList, 'priority').reverse(); + } else { + triggerList = _.sortBy(triggerList, 'lastchangeUnix').reverse(); + } + + return triggerList; + } + }, { + key: 'formatTrigger', + value: function formatTrigger(trigger) { + var triggerObj = trigger; + + // Format last change and age + trigger.lastchangeUnix = Number(trigger.lastchange); + var timestamp = moment.unix(trigger.lastchangeUnix); + if (this.panel.customLastChangeFormat) { + // User defined format + triggerObj.lastchange = timestamp.format(this.panel.lastChangeFormat); + } else { + triggerObj.lastchange = timestamp.format(this.defaultTimeFormat); + } + triggerObj.age = timestamp.fromNow(true); + + // Set host that the trigger belongs + if (trigger.hosts.length) { + triggerObj.host = trigger.hosts[0].name; + triggerObj.hostTechName = trigger.hosts[0].host; + } + + // Set color + if (trigger.value === '1') { + // Problem state + triggerObj.color = this.panel.triggerSeverity[trigger.priority].color; + } else { + // OK state + triggerObj.color = this.panel.okEventColor; + } + + triggerObj.severity = this.panel.triggerSeverity[trigger.priority].severity; + return triggerObj; + } }, { key: 'switchComment', value: function switchComment(trigger) { @@ -331,7 +327,7 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap }, { key: 'acknowledgeTrigger', value: function acknowledgeTrigger(trigger, message) { - var _this3 = this; + var _this6 = this; var eventid = trigger.lastEvent.eventid; var grafana_user = this.contextSrv.user.name; @@ -339,15 +335,10 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap return this.datasourceSrv.get(this.panel.datasource).then(function (datasource) { var zabbixAPI = datasource.zabbix.zabbixAPI; return zabbixAPI.acknowledgeEvent(eventid, ack_message).then(function () { - _this3.refresh(); + _this6.refresh(); }); }); } - }, { - key: 'render', - value: function render() { - return _get(TriggerPanelCtrl.prototype.__proto__ || Object.getPrototypeOf(TriggerPanelCtrl.prototype), 'render', this).call(this, this.triggerList); - } }, { key: 'link', value: function link(scope, elem, attrs, ctrl) { @@ -436,7 +427,7 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap }]); return TriggerPanelCtrl; - }(MetricsPanelCtrl))); + }(PanelCtrl))); TriggerPanelCtrl.templateUrl = 'panel-triggers/module.html'; _export('TriggerPanelCtrl', TriggerPanelCtrl); diff --git a/dist/panel-triggers/module.js.map b/dist/panel-triggers/module.js.map index cef7dd9..d2620d3 100644 --- a/dist/panel-triggers/module.js.map +++ b/dist/panel-triggers/module.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/panel-triggers/module.js"],"names":["filterTriggers","triggers","triggerFilter","utils","isRegex","_","filter","trigger","buildRegex","test","description","$","moment","MetricsPanelCtrl","triggerPanelEditor","defaultSeverity","priority","severity","color","show","panelDefaults","datasource","group","host","application","hostField","statusField","severityField","lastChangeField","ageField","infoField","limit","showTriggers","sortTriggersBy","text","value","showEvents","triggerSeverity","okEventColor","ackEventColor","scroll","pageSize","triggerStatusMap","defaultTimeFormat","TriggerPanelCtrl","$scope","$injector","$element","datasourceSrv","templateSrv","contextSrv","pageIndex","defaults","panel","cloneDeep","triggerList","currentPage","refreshData","addEditorTab","onMetricsPanelRefresh","otherPanelInFullscreenMode","error","loading","setTimeQueryStart","self","get","then","zabbix","groupFilter","replaceTemplateVars","hostFilter","appFilter","getTriggers","map","triggerObj","lastchangeUnix","Number","lastchange","timestamp","unix","customLastChangeFormat","format","lastChangeFormat","age","fromNow","hosts","length","name","hostTechName","eventids","lastEvent","eventid","getAcknowledges","each","event","find","events","acknowledges","ack","clock","time","user","alias","surname","markAckEvents","sortBy","reverse","slice","setTimeQueryEnd","render","showComment","message","grafana_user","ack_message","zabbixAPI","acknowledgeEvent","refresh","scope","elem","attrs","ctrl","data","pageCount","getTableHeight","panelHeight","height","switchPage","e","el","currentTarget","parseInt","startPos","endPos","Math","min","appendPaginationControls","footerElem","empty","ceil","startPage","max","endPage","paginationList","i","activeClass","pageLinkElem","append","renderPanel","panelElem","parents","rootElem","css","fontSize","addClass","on","unbindDestroy","$on","off","renderData","renderingCompleted","templateUrl"],"mappings":"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","file":"module.js","sourcesContent":["/**\n * Grafana-Zabbix\n * Zabbix plugin for Grafana.\n * http://github.com/alexanderzobnin/grafana-zabbix\n *\n * Trigger panel.\n * This feature sponsored by CORE IT\n * http://www.coreit.fr\n *\n * Copyright 2015 Alexander Zobnin alexanderzobnin@gmail.com\n * Licensed under the Apache License, Version 2.0\n */\n\nimport _ from 'lodash';\nimport $ from 'jquery';\nimport moment from 'moment';\nimport * as utils from '../datasource-zabbix/utils';\nimport {MetricsPanelCtrl} from 'app/plugins/sdk';\nimport {triggerPanelEditor} from './editor';\nimport './ack-tooltip.directive';\nimport './css/panel_triggers.css!';\n\nvar defaultSeverity = [\n { priority: 0, severity: 'Not classified', color: '#B7DBAB', show: true },\n { priority: 1, severity: 'Information', color: '#82B5D8', show: true },\n { priority: 2, severity: 'Warning', color: '#E5AC0E', show: true },\n { priority: 3, severity: 'Average', color: '#C15C17', show: true },\n { priority: 4, severity: 'High', color: '#BF1B00', show: true },\n { priority: 5, severity: 'Disaster', color: '#890F02', show: true }\n];\n\nvar panelDefaults = {\n datasource: null,\n triggers: {\n group: {filter: \"\"},\n host: {filter: \"\"},\n application: {filter: \"\"},\n trigger: {filter: \"\"}\n },\n hostField: true,\n statusField: false,\n severityField: false,\n lastChangeField: true,\n ageField: true,\n infoField: true,\n limit: 10,\n showTriggers: 'all triggers',\n sortTriggersBy: { text: 'last change', value: 'lastchange' },\n showEvents: { text: 'Problems', value: '1' },\n triggerSeverity: defaultSeverity,\n okEventColor: 'rgba(0, 245, 153, 0.45)',\n ackEventColor: 'rgba(0, 0, 0, 0)',\n scroll: true,\n pageSize: 10\n};\n\nvar triggerStatusMap = {\n '0': 'OK',\n '1': 'Problem'\n};\n\nvar defaultTimeFormat = \"DD MMM YYYY HH:mm:ss\";\n\nclass TriggerPanelCtrl extends MetricsPanelCtrl {\n\n /** @ngInject */\n constructor($scope, $injector, $element, datasourceSrv, templateSrv, contextSrv) {\n super($scope, $injector);\n this.datasourceSrv = datasourceSrv;\n this.templateSrv = templateSrv;\n this.contextSrv = contextSrv;\n this.triggerStatusMap = triggerStatusMap;\n this.defaultTimeFormat = defaultTimeFormat;\n\n this.pageIndex = 0;\n\n // Load panel defaults\n // _.cloneDeep() need for prevent changing shared defaultSeverity.\n // Load object \"by value\" istead \"by reference\".\n _.defaults(this.panel, _.cloneDeep(panelDefaults));\n\n this.triggerList = [];\n this.currentPage = [];\n this.refreshData();\n }\n\n /**\n * Override onInitMetricsPanelEditMode() method from MetricsPanelCtrl.\n * We don't need metric editor from Metrics Panel.\n */\n onInitMetricsPanelEditMode() {\n this.addEditorTab('Options', triggerPanelEditor, 2);\n }\n\n refresh() {\n this.onMetricsPanelRefresh();\n }\n\n onMetricsPanelRefresh() {\n // ignore fetching data if another panel is in fullscreen\n if (this.otherPanelInFullscreenMode()) { return; }\n\n this.refreshData();\n }\n\n refreshData() {\n // clear loading/error state\n delete this.error;\n this.loading = true;\n this.setTimeQueryStart();\n\n var self = this;\n\n // Load datasource\n return this.datasourceSrv.get(this.panel.datasource)\n .then(datasource => {\n var zabbix = datasource.zabbix;\n var showEvents = self.panel.showEvents.value;\n var triggerFilter = self.panel.triggers;\n\n // Replace template variables\n var groupFilter = datasource.replaceTemplateVars(triggerFilter.group.filter);\n var hostFilter = datasource.replaceTemplateVars(triggerFilter.host.filter);\n var appFilter = datasource.replaceTemplateVars(triggerFilter.application.filter);\n\n var getTriggers = zabbix.getTriggers(groupFilter, hostFilter, appFilter, showEvents);\n return getTriggers.then(triggers => {\n return _.map(triggers, trigger => {\n let triggerObj = trigger;\n\n // Format last change and age\n trigger.lastchangeUnix = Number(trigger.lastchange);\n let timestamp = moment.unix(trigger.lastchangeUnix);\n if (self.panel.customLastChangeFormat) {\n // User defined format\n triggerObj.lastchange = timestamp.format(self.panel.lastChangeFormat);\n } else {\n triggerObj.lastchange = timestamp.format(self.defaultTimeFormat);\n }\n triggerObj.age = timestamp.fromNow(true);\n\n // Set host that the trigger belongs\n if (trigger.hosts.length) {\n triggerObj.host = trigger.hosts[0].name;\n triggerObj.hostTechName = trigger.hosts[0].host;\n }\n\n // Set color\n if (trigger.value === '1') {\n // Problem state\n triggerObj.color = self.panel.triggerSeverity[trigger.priority].color;\n } else {\n // OK state\n triggerObj.color = self.panel.okEventColor;\n }\n\n triggerObj.severity = self.panel.triggerSeverity[trigger.priority].severity;\n return triggerObj;\n });\n })\n .then(triggerList => {\n\n // Request acknowledges for trigger\n var eventids = _.map(triggerList, trigger => {\n return trigger.lastEvent.eventid;\n });\n\n return zabbix.getAcknowledges(eventids)\n .then(events => {\n\n // Map events to triggers\n _.each(triggerList, trigger => {\n var event = _.find(events, event => {\n return event.eventid === trigger.lastEvent.eventid;\n });\n\n if (event) {\n trigger.acknowledges = _.map(event.acknowledges, ack => {\n let timestamp = moment.unix(ack.clock);\n if (self.panel.customLastChangeFormat) {\n ack.time = timestamp.format(self.panel.lastChangeFormat);\n } else {\n ack.time = timestamp.format(self.defaultTimeFormat);\n }\n ack.user = ack.alias + ' (' + ack.name + ' ' + ack.surname + ')';\n return ack;\n });\n\n // Mark acknowledged triggers with different color\n if (self.panel.markAckEvents && trigger.acknowledges.length) {\n trigger.color = self.panel.ackEventColor;\n }\n }\n });\n\n // Filter triggers by description\n var triggerFilter = self.panel.triggers.trigger.filter;\n if (triggerFilter) {\n triggerList = filterTriggers(triggerList, triggerFilter);\n }\n\n // Filter acknowledged triggers\n if (self.panel.showTriggers === 'unacknowledged') {\n triggerList = _.filter(triggerList, trigger => {\n return !trigger.acknowledges;\n });\n } else if (self.panel.showTriggers === 'acknowledged') {\n triggerList = _.filter(triggerList, 'acknowledges');\n } else {\n triggerList = triggerList;\n }\n\n // Filter triggers by severity\n triggerList = _.filter(triggerList, trigger => {\n return self.panel.triggerSeverity[trigger.priority].show;\n });\n\n // Sort triggers\n if (self.panel.sortTriggersBy.value === 'priority') {\n triggerList = _.sortBy(triggerList, 'priority').reverse();\n } else {\n triggerList = _.sortBy(triggerList, 'lastchangeUnix').reverse();\n }\n\n // Limit triggers number\n self.triggerList = triggerList.slice(0, self.panel.limit);\n\n // Notify panel that request is finished\n self.setTimeQueryEnd();\n self.loading = false;\n\n this.panel.triggerList = this.triggerList;\n this.render();\n });\n });\n });\n }\n\n switchComment(trigger) {\n trigger.showComment = !trigger.showComment;\n }\n\n acknowledgeTrigger(trigger, message) {\n let eventid = trigger.lastEvent.eventid;\n let grafana_user = this.contextSrv.user.name;\n let ack_message = grafana_user + ' (Grafana): ' + message;\n return this.datasourceSrv.get(this.panel.datasource)\n .then(datasource => {\n let zabbixAPI = datasource.zabbix.zabbixAPI;\n return zabbixAPI.acknowledgeEvent(eventid, ack_message)\n .then(() => {\n this.refresh();\n });\n });\n }\n\n render() {\n return super.render(this.triggerList);\n }\n\n link(scope, elem, attrs, ctrl) {\n var data;\n var panel = ctrl.panel;\n var pageCount = 0;\n // var formaters = [];\n data = ctrl.panel.triggerList;\n\n function getTableHeight() {\n var panelHeight = ctrl.height;\n\n if (pageCount > 1) {\n panelHeight -= 26;\n }\n\n return (panelHeight - 31) + 'px';\n }\n\n function switchPage(e) {\n let el = $(e.currentTarget);\n ctrl.pageIndex = (parseInt(el.text(), 10)-1);\n\n let pageSize = ctrl.panel.pageSize || 10;\n let startPos = ctrl.pageIndex * pageSize;\n let endPos = Math.min(startPos + pageSize, ctrl.triggerList.length);\n ctrl.currentPage = ctrl.triggerList.slice(startPos, endPos);\n ctrl.render();\n // renderPanel();\n }\n\n function appendPaginationControls(footerElem) {\n footerElem.empty();\n\n var pageSize = panel.pageSize || 5;\n pageCount = Math.ceil(ctrl.panel.triggerList.length / pageSize);\n if (pageCount === 1) {\n return;\n }\n\n var startPage = Math.max(ctrl.pageIndex - 3, 0);\n var endPage = Math.min(pageCount, startPage + 9);\n\n var paginationList = $('');\n\n for (var i = startPage; i < endPage; i++) {\n var activeClass = i === ctrl.pageIndex ? 'active' : '';\n var pageLinkElem = $('
  • ' + (i+1) + '
  • ');\n paginationList.append(pageLinkElem);\n }\n\n footerElem.append(paginationList);\n }\n\n function renderPanel() {\n var panelElem = elem.parents('.panel');\n var rootElem = elem.find('.triggers-panel-scroll');\n // var tbodyElem = elem.find('tbody');\n var footerElem = elem.find('.triggers-panel-footer');\n\n elem.css({'font-size': panel.fontSize});\n panelElem.addClass('triggers-panel-wrapper');\n\n // appendTableRows(tbodyElem);\n appendPaginationControls(footerElem);\n\n rootElem.css({'max-height': panel.scroll ? getTableHeight() : '' });\n // ctrl.render();\n }\n\n elem.on('click', '.triggers-panel-page-link', switchPage);\n\n var unbindDestroy = scope.$on('$destroy', function() {\n elem.off('click', '.triggers-panel-page-link');\n unbindDestroy();\n });\n\n ctrl.events.on('render', (renderData) => {\n data = renderData || data;\n if (data) {\n renderPanel();\n }\n ctrl.renderingCompleted();\n });\n }\n}\n\nTriggerPanelCtrl.templateUrl = 'panel-triggers/module.html';\n\nfunction filterTriggers(triggers, triggerFilter) {\n if (utils.isRegex(triggerFilter)) {\n return _.filter(triggers, function(trigger) {\n return utils.buildRegex(triggerFilter).test(trigger.description);\n });\n } else {\n return _.filter(triggers, function(trigger) {\n return trigger.description === triggerFilter;\n });\n }\n}\n\nexport {\n TriggerPanelCtrl,\n TriggerPanelCtrl as PanelCtrl\n};\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/panel-triggers/module.js"],"names":["filterTriggers","triggers","triggerFilter","utils","isRegex","_","filter","trigger","buildRegex","test","description","$","moment","PanelCtrl","triggerPanelEditor","defaultSeverity","priority","severity","color","show","panelDefaults","datasource","group","host","application","hostField","statusField","severityField","lastChangeField","ageField","infoField","limit","showTriggers","sortTriggersBy","text","value","showEvents","triggerSeverity","okEventColor","ackEventColor","scroll","pageSize","triggerStatusMap","defaultTimeFormat","TriggerPanelCtrl","$scope","$injector","$element","datasourceSrv","templateSrv","contextSrv","pageIndex","defaults","panel","cloneDeep","triggerList","currentPage","events","on","onInitEditMode","bind","onRender","refreshData","addEditorTab","otherPanelInFullscreenMode","error","loading","then","slice","getTriggers","getAcknowledges","get","zabbix","groupFilter","replaceTemplateVars","hostFilter","appFilter","map","formatTrigger","eventids","lastEvent","eventid","each","event","find","acknowledges","timestamp","unix","ack","clock","customLastChangeFormat","time","format","lastChangeFormat","user","alias","name","surname","markAckEvents","length","sortBy","reverse","triggerObj","lastchangeUnix","Number","lastchange","age","fromNow","hosts","hostTechName","showComment","message","grafana_user","ack_message","zabbixAPI","acknowledgeEvent","refresh","scope","elem","attrs","ctrl","data","pageCount","getTableHeight","panelHeight","height","switchPage","e","el","currentTarget","parseInt","startPos","endPos","Math","min","render","appendPaginationControls","footerElem","empty","ceil","startPage","max","endPage","paginationList","i","activeClass","pageLinkElem","append","renderPanel","panelElem","parents","rootElem","css","fontSize","addClass","unbindDestroy","$on","off","renderData","renderingCompleted","templateUrl"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoWA,WAASA,eAAT,CAAwBC,QAAxB,EAAkCC,aAAlC,EAAiD;AAC/C,QAAIC,MAAMC,OAAN,CAAcF,aAAd,CAAJ,EAAkC;AAChC,aAAOG,EAAEC,MAAF,CAASL,QAAT,EAAmB,UAASM,OAAT,EAAkB;AAC1C,eAAOJ,MAAMK,UAAN,CAAiBN,aAAjB,EAAgCO,IAAhC,CAAqCF,QAAQG,WAA7C,CAAP;AACD,OAFM,CAAP;AAGD,KAJD,MAIO;AACL,aAAOL,EAAEC,MAAF,CAASL,QAAT,EAAmB,UAASM,OAAT,EAAkB;AAC1C,eAAOA,QAAQG,WAAR,KAAwBR,aAA/B;AACD,OAFM,CAAP;AAGD;AACF;;;;AAjWMG,O;;AACAM,O;;AACAC,Y;;AACKT,W;;AACJU,e,kBAAAA,S;;AACAC,wB,WAAAA,kB;;;;;;;;;;;;;;;;;;;;;AAIJC,qB,GAAkB,CACpB,EAAEC,UAAU,CAAZ,EAAeC,UAAU,gBAAzB,EAA4CC,OAAO,SAAnD,EAA8DC,MAAM,IAApE,EADoB,EAEpB,EAAEH,UAAU,CAAZ,EAAeC,UAAU,aAAzB,EAA4CC,OAAO,SAAnD,EAA8DC,MAAM,IAApE,EAFoB,EAGpB,EAAEH,UAAU,CAAZ,EAAeC,UAAU,SAAzB,EAA4CC,OAAO,SAAnD,EAA8DC,MAAM,IAApE,EAHoB,EAIpB,EAAEH,UAAU,CAAZ,EAAeC,UAAU,SAAzB,EAA4CC,OAAO,SAAnD,EAA8DC,MAAM,IAApE,EAJoB,EAKpB,EAAEH,UAAU,CAAZ,EAAeC,UAAU,MAAzB,EAA4CC,OAAO,SAAnD,EAA8DC,MAAM,IAApE,EALoB,EAMpB,EAAEH,UAAU,CAAZ,EAAeC,UAAU,UAAzB,EAA4CC,OAAO,SAAnD,EAA8DC,MAAM,IAApE,EANoB,C;AASlBC,mB,GAAgB;AAClBC,oBAAY,IADM;AAElBpB,kBAAU;AACRqB,iBAAO,EAAChB,QAAQ,EAAT,EADC;AAERiB,gBAAM,EAACjB,QAAQ,EAAT,EAFE;AAGRkB,uBAAa,EAAClB,QAAQ,EAAT,EAHL;AAIRC,mBAAS,EAACD,QAAQ,EAAT;AAJD,SAFQ;AAQlBmB,mBAAW,IARO;AASlBC,qBAAa,KATK;AAUlBC,uBAAe,KAVG;AAWlBC,yBAAiB,IAXC;AAYlBC,kBAAU,IAZQ;AAalBC,mBAAW,IAbO;AAclBC,eAAO,EAdW;AAelBC,sBAAc,cAfI;AAgBlBC,wBAAgB,EAAEC,MAAM,aAAR,EAAuBC,OAAO,YAA9B,EAhBE;AAiBlBC,oBAAY,EAAEF,MAAM,UAAR,EAAoBC,OAAO,GAA3B,EAjBM;AAkBlBE,yBAAiBtB,eAlBC;AAmBlBuB,sBAAc,yBAnBI;AAoBlBC,uBAAe,kBApBG;AAqBlBC,gBAAQ,IArBU;AAsBlBC,kBAAU;AAtBQ,O;AAyBhBC,sB,GAAmB;AACrB,aAAK,IADgB;AAErB,aAAK;AAFgB,O;AAKnBC,uB,GAAoB,sB;;uDAElBC,gB;;;AAEJ;AACA,kCAAYC,MAAZ,EAAoBC,SAApB,EAA+BC,QAA/B,EAAyCC,aAAzC,EAAwDC,WAAxD,EAAqEC,UAArE,EAAiF;AAAA;;AAAA,0IACzEL,MADyE,EACjEC,SADiE;;AAE/E,gBAAKE,aAAL,GAAqBA,aAArB;AACA,gBAAKC,WAAL,GAAmBA,WAAnB;AACA,gBAAKC,UAAL,GAAkBA,UAAlB;AACA,gBAAKR,gBAAL,GAAwBA,gBAAxB;AACA,gBAAKC,iBAAL,GAAyBA,iBAAzB;;AAEA,gBAAKQ,SAAL,GAAiB,CAAjB;;AAEA;AACA;AACA;AACA9C,YAAE+C,QAAF,CAAW,MAAKC,KAAhB,EAAuBhD,EAAEiD,SAAF,CAAYlC,aAAZ,CAAvB;;AAEA,gBAAKmC,WAAL,GAAmB,EAAnB;AACA,gBAAKC,WAAL,GAAmB,EAAnB;;AAEA,gBAAKC,MAAL,CAAYC,EAAZ,CAAe,gBAAf,EAAiC,MAAKC,cAAL,CAAoBC,IAApB,OAAjC;AACA,gBAAKH,MAAL,CAAYC,EAAZ,CAAe,QAAf,EAA0B,MAAKG,QAAL,CAAcD,IAAd,OAA1B;AACA,gBAAKH,MAAL,CAAYC,EAAZ,CAAe,SAAf,EAA0B,MAAKG,QAAL,CAAcD,IAAd,OAA1B;;AAEA,gBAAKE,WAAL;AAtB+E;AAuBhF;;AAED;;;;;;;;2CAIiB;AACf,iBAAKC,YAAL,CAAkB,SAAlB,EAA6BjD,kBAA7B,EAAiD,CAAjD;AACD;;;kDAEuB;AACtB;AACA,gBAAI,KAAKkD,0BAAL,EAAJ,EAAuC;AAAE;AAAS;;AAElD,iBAAKF,WAAL;AACD;;;qCAEU;AAAA;;AACT;AACA,mBAAO,KAAKG,KAAZ;AACA,iBAAKC,OAAL,GAAe,IAAf;;AAEA,mBAAO,KAAKJ,WAAL,GACNK,IADM,CACD,uBAAe;AACnB;AACA,qBAAKZ,WAAL,GAAoBA,YAAYa,KAAZ,CAAkB,CAAlB,EAAqB,OAAKf,KAAL,CAAWtB,KAAhC,CAApB;;AAEA;AACA,qBAAKmC,OAAL,GAAe,KAAf;AACD,aAPM,CAAP;AAQD;;;wCAEa;AACZ,mBAAO,KAAKG,WAAL,GACNF,IADM,CACD,KAAKG,eAAL,CAAqBV,IAArB,CAA0B,IAA1B,CADC,EAENO,IAFM,CAED,KAAKnE,cAAL,CAAoB4D,IAApB,CAAyB,IAAzB,CAFC,CAAP;AAGD;;;wCAEa;AAAA;;AACZ,mBAAO,KAAKZ,aAAL,CAAmBuB,GAAnB,CAAuB,KAAKlB,KAAL,CAAWhC,UAAlC,EACN8C,IADM,CACD,sBAAc;AAClB,kBAAIK,SAASnD,WAAWmD,MAAxB;AACA,qBAAKA,MAAL,GAAcA,MAAd;AACA,kBAAIpC,aAAa,OAAKiB,KAAL,CAAWjB,UAAX,CAAsBD,KAAvC;AACA,kBAAIjC,gBAAgB,OAAKmD,KAAL,CAAWpD,QAA/B;;AAEA;AACA,kBAAIwE,cAAcpD,WAAWqD,mBAAX,CAA+BxE,cAAcoB,KAAd,CAAoBhB,MAAnD,CAAlB;AACA,kBAAIqE,aAAatD,WAAWqD,mBAAX,CAA+BxE,cAAcqB,IAAd,CAAmBjB,MAAlD,CAAjB;AACA,kBAAIsE,YAAYvD,WAAWqD,mBAAX,CAA+BxE,cAAcsB,WAAd,CAA0BlB,MAAzD,CAAhB;;AAEA,kBAAI+D,cAAcG,OAAOH,WAAP,CAAmBI,WAAnB,EAAgCE,UAAhC,EAA4CC,SAA5C,EAAuDxC,UAAvD,CAAlB;AACA,qBAAOiC,YAAYF,IAAZ,CAAiB,oBAAY;AAClC,uBAAO9D,EAAEwE,GAAF,CAAM5E,QAAN,EAAgB,OAAK6E,aAAL,CAAmBlB,IAAnB,QAAhB,CAAP;AACD,eAFM,CAAP;AAGD,aAhBM,CAAP;AAiBD;;;0CAEeL,W,EAAa;AAAA;;AAC3B;AACA,gBAAIwB,WAAW1E,EAAEwE,GAAF,CAAMtB,WAAN,EAAmB,mBAAW;AAC3C,qBAAOhD,QAAQyE,SAAR,CAAkBC,OAAzB;AACD,aAFc,CAAf;;AAIA,mBAAO,KAAKT,MAAL,CAAYF,eAAZ,CAA4BS,QAA5B,EACNZ,IADM,CACD,kBAAU;;AAEd;AACA9D,gBAAE6E,IAAF,CAAO3B,WAAP,EAAoB,mBAAW;AAC7B,oBAAI4B,QAAQ9E,EAAE+E,IAAF,CAAO3B,MAAP,EAAe,iBAAS;AAClC,yBAAO0B,MAAMF,OAAN,KAAkB1E,QAAQyE,SAAR,CAAkBC,OAA3C;AACD,iBAFW,CAAZ;;AAIA,oBAAIE,KAAJ,EAAW;AACT5E,0BAAQ8E,YAAR,GAAuBhF,EAAEwE,GAAF,CAAMM,MAAME,YAAZ,EAA0B,eAAO;AACtD,wBAAIC,YAAY1E,OAAO2E,IAAP,CAAYC,IAAIC,KAAhB,CAAhB;AACA,wBAAI,OAAKpC,KAAL,CAAWqC,sBAAf,EAAuC;AACrCF,0BAAIG,IAAJ,GAAWL,UAAUM,MAAV,CAAiB,OAAKvC,KAAL,CAAWwC,gBAA5B,CAAX;AACD,qBAFD,MAEO;AACLL,0BAAIG,IAAJ,GAAWL,UAAUM,MAAV,CAAiB,OAAKjD,iBAAtB,CAAX;AACD;AACD6C,wBAAIM,IAAJ,GAAWN,IAAIO,KAAJ,GAAY,IAAZ,GAAmBP,IAAIQ,IAAvB,GAA8B,GAA9B,GAAoCR,IAAIS,OAAxC,GAAkD,GAA7D;AACA,2BAAOT,GAAP;AACD,mBATsB,CAAvB;;AAWA;AACA,sBAAI,OAAKnC,KAAL,CAAW6C,aAAX,IAA4B3F,QAAQ8E,YAAR,CAAqBc,MAArD,EAA6D;AAC3D5F,4BAAQW,KAAR,GAAgB,OAAKmC,KAAL,CAAWd,aAA3B;AACD;AACF;AACF,eAtBD;;AAwBA,qBAAOgB,WAAP;AACD,aA7BM,CAAP;AA8BD;;;yCAEcA,W,EAAa;AAAA;;AAC1B;AACA,gBAAIrD,gBAAgB,KAAKmD,KAAL,CAAWpD,QAAX,CAAoBM,OAApB,CAA4BD,MAAhD;AACA,gBAAIJ,aAAJ,EAAmB;AACjBqD,4BAAcvD,gBAAeuD,WAAf,EAA4BrD,aAA5B,CAAd;AACD;;AAED;AACA,gBAAI,KAAKmD,KAAL,CAAWrB,YAAX,KAA4B,gBAAhC,EAAkD;AAChDuB,4BAAclD,EAAEC,MAAF,CAASiD,WAAT,EAAsB,mBAAW;AAC7C,uBAAO,CAAChD,QAAQ8E,YAAhB;AACD,eAFa,CAAd;AAGD,aAJD,MAIO,IAAI,KAAKhC,KAAL,CAAWrB,YAAX,KAA4B,cAAhC,EAAgD;AACrDuB,4BAAclD,EAAEC,MAAF,CAASiD,WAAT,EAAsB,cAAtB,CAAd;AACD,aAFM,MAEA;AACLA,4BAAcA,WAAd;AACD;;AAED;AACAA,0BAAclD,EAAEC,MAAF,CAASiD,WAAT,EAAsB,mBAAW;AAC7C,qBAAO,OAAKF,KAAL,CAAWhB,eAAX,CAA2B9B,QAAQS,QAAnC,EAA6CG,IAApD;AACD,aAFa,CAAd;;AAIA;AACA,gBAAI,KAAKkC,KAAL,CAAWpB,cAAX,CAA0BE,KAA1B,KAAoC,UAAxC,EAAoD;AAClDoB,4BAAclD,EAAE+F,MAAF,CAAS7C,WAAT,EAAsB,UAAtB,EAAkC8C,OAAlC,EAAd;AACD,aAFD,MAEO;AACL9C,4BAAclD,EAAE+F,MAAF,CAAS7C,WAAT,EAAsB,gBAAtB,EAAwC8C,OAAxC,EAAd;AACD;;AAED,mBAAO9C,WAAP;AACD;;;wCAEahD,O,EAAS;AACrB,gBAAI+F,aAAa/F,OAAjB;;AAEA;AACAA,oBAAQgG,cAAR,GAAyBC,OAAOjG,QAAQkG,UAAf,CAAzB;AACA,gBAAInB,YAAY1E,OAAO2E,IAAP,CAAYhF,QAAQgG,cAApB,CAAhB;AACA,gBAAI,KAAKlD,KAAL,CAAWqC,sBAAf,EAAuC;AACrC;AACAY,yBAAWG,UAAX,GAAwBnB,UAAUM,MAAV,CAAiB,KAAKvC,KAAL,CAAWwC,gBAA5B,CAAxB;AACD,aAHD,MAGO;AACLS,yBAAWG,UAAX,GAAwBnB,UAAUM,MAAV,CAAiB,KAAKjD,iBAAtB,CAAxB;AACD;AACD2D,uBAAWI,GAAX,GAAiBpB,UAAUqB,OAAV,CAAkB,IAAlB,CAAjB;;AAEA;AACA,gBAAIpG,QAAQqG,KAAR,CAAcT,MAAlB,EAA0B;AACxBG,yBAAW/E,IAAX,GAAkBhB,QAAQqG,KAAR,CAAc,CAAd,EAAiBZ,IAAnC;AACAM,yBAAWO,YAAX,GAA0BtG,QAAQqG,KAAR,CAAc,CAAd,EAAiBrF,IAA3C;AACD;;AAED;AACA,gBAAIhB,QAAQ4B,KAAR,KAAkB,GAAtB,EAA2B;AACzB;AACAmE,yBAAWpF,KAAX,GAAmB,KAAKmC,KAAL,CAAWhB,eAAX,CAA2B9B,QAAQS,QAAnC,EAA6CE,KAAhE;AACD,aAHD,MAGO;AACL;AACAoF,yBAAWpF,KAAX,GAAmB,KAAKmC,KAAL,CAAWf,YAA9B;AACD;;AAEDgE,uBAAWrF,QAAX,GAAsB,KAAKoC,KAAL,CAAWhB,eAAX,CAA2B9B,QAAQS,QAAnC,EAA6CC,QAAnE;AACA,mBAAOqF,UAAP;AACD;;;wCAEa/F,O,EAAS;AACrBA,oBAAQuG,WAAR,GAAsB,CAACvG,QAAQuG,WAA/B;AACD;;;6CAEkBvG,O,EAASwG,O,EAAS;AAAA;;AACnC,gBAAI9B,UAAU1E,QAAQyE,SAAR,CAAkBC,OAAhC;AACA,gBAAI+B,eAAe,KAAK9D,UAAL,CAAgB4C,IAAhB,CAAqBE,IAAxC;AACA,gBAAIiB,cAAcD,eAAe,cAAf,GAAgCD,OAAlD;AACA,mBAAO,KAAK/D,aAAL,CAAmBuB,GAAnB,CAAuB,KAAKlB,KAAL,CAAWhC,UAAlC,EACN8C,IADM,CACD,sBAAc;AAClB,kBAAI+C,YAAY7F,WAAWmD,MAAX,CAAkB0C,SAAlC;AACA,qBAAOA,UAAUC,gBAAV,CAA2BlC,OAA3B,EAAoCgC,WAApC,EACN9C,IADM,CACD,YAAM;AACV,uBAAKiD,OAAL;AACD,eAHM,CAAP;AAID,aAPM,CAAP;AAQD;;;+BAEIC,K,EAAOC,I,EAAMC,K,EAAOC,I,EAAM;AAC7B,gBAAIC,IAAJ;AACA,gBAAIpE,QAAQmE,KAAKnE,KAAjB;AACA,gBAAIqE,YAAY,CAAhB;AACA;AACAD,mBAAOD,KAAKnE,KAAL,CAAWE,WAAlB;;AAEA,qBAASoE,cAAT,GAA0B;AACxB,kBAAIC,cAAcJ,KAAKK,MAAvB;;AAEA,kBAAIH,YAAY,CAAhB,EAAmB;AACjBE,+BAAe,EAAf;AACD;;AAED,qBAAQA,cAAc,EAAf,GAAqB,IAA5B;AACD;;AAED,qBAASE,UAAT,CAAoBC,CAApB,EAAuB;AACrB,kBAAIC,KAAKrH,EAAEoH,EAAEE,aAAJ,CAAT;AACAT,mBAAKrE,SAAL,GAAkB+E,SAASF,GAAG9F,IAAH,EAAT,EAAoB,EAApB,IAAwB,CAA1C;;AAEA,kBAAIO,WAAW+E,KAAKnE,KAAL,CAAWZ,QAAX,IAAuB,EAAtC;AACA,kBAAI0F,WAAWX,KAAKrE,SAAL,GAAiBV,QAAhC;AACA,kBAAI2F,SAASC,KAAKC,GAAL,CAASH,WAAW1F,QAApB,EAA8B+E,KAAKjE,WAAL,CAAiB4C,MAA/C,CAAb;AACAqB,mBAAKhE,WAAL,GAAmBgE,KAAKjE,WAAL,CAAiBa,KAAjB,CAAuB+D,QAAvB,EAAiCC,MAAjC,CAAnB;AACAZ,mBAAKe,MAAL;AACA;AACD;;AAED,qBAASC,wBAAT,CAAkCC,UAAlC,EAA8C;AAC5CA,yBAAWC,KAAX;;AAEA,kBAAIjG,WAAWY,MAAMZ,QAAN,IAAkB,CAAjC;AACAiF,0BAAYW,KAAKM,IAAL,CAAUnB,KAAKnE,KAAL,CAAWE,WAAX,CAAuB4C,MAAvB,GAAgC1D,QAA1C,CAAZ;AACA,kBAAIiF,cAAc,CAAlB,EAAqB;AACnB;AACD;;AAED,kBAAIkB,YAAYP,KAAKQ,GAAL,CAASrB,KAAKrE,SAAL,GAAiB,CAA1B,EAA6B,CAA7B,CAAhB;AACA,kBAAI2F,UAAUT,KAAKC,GAAL,CAASZ,SAAT,EAAoBkB,YAAY,CAAhC,CAAd;;AAEA,kBAAIG,iBAAiBpI,EAAE,WAAF,CAArB;;AAEA,mBAAK,IAAIqI,IAAIJ,SAAb,EAAwBI,IAAIF,OAA5B,EAAqCE,GAArC,EAA0C;AACxC,oBAAIC,cAAcD,MAAMxB,KAAKrE,SAAX,GAAuB,QAAvB,GAAkC,EAApD;AACA,oBAAI+F,eAAevI,EAAE,oDAAoDsI,WAApD,GAAkE,IAAlE,IAA0ED,IAAE,CAA5E,IAAiF,WAAnF,CAAnB;AACAD,+BAAeI,MAAf,CAAsBD,YAAtB;AACD;;AAEDT,yBAAWU,MAAX,CAAkBJ,cAAlB;AACD;;AAED,qBAASK,WAAT,GAAuB;AACrB,kBAAIC,YAAY/B,KAAKgC,OAAL,CAAa,QAAb,CAAhB;AACA,kBAAIC,WAAWjC,KAAKlC,IAAL,CAAU,wBAAV,CAAf;AACA;AACA,kBAAIqD,aAAanB,KAAKlC,IAAL,CAAU,wBAAV,CAAjB;;AAEAkC,mBAAKkC,GAAL,CAAS,EAAC,aAAanG,MAAMoG,QAApB,EAAT;AACAJ,wBAAUK,QAAV,CAAmB,wBAAnB;;AAEA;AACAlB,uCAAyBC,UAAzB;;AAEAc,uBAASC,GAAT,CAAa,EAAC,cAAcnG,MAAMb,MAAN,GAAemF,gBAAf,GAAkC,EAAjD,EAAb;AACA;AACD;;AAEDL,iBAAK5D,EAAL,CAAQ,OAAR,EAAiB,2BAAjB,EAA8CoE,UAA9C;;AAEA,gBAAI6B,gBAAgBtC,MAAMuC,GAAN,CAAU,UAAV,EAAsB,YAAW;AACnDtC,mBAAKuC,GAAL,CAAS,OAAT,EAAkB,2BAAlB;AACAF;AACD,aAHmB,CAApB;;AAKAnC,iBAAK/D,MAAL,CAAYC,EAAZ,CAAe,QAAf,EAAyB,UAACoG,UAAD,EAAgB;AACvCrC,qBAAOqC,cAAcrC,IAArB;AACA,kBAAIA,IAAJ,EAAU;AACR2B;AACD;AACD5B,mBAAKuC,kBAAL;AACD,aAND;AAOD;;;;QAhS4BlJ,S;;AAmS/B+B,uBAAiBoH,WAAjB,GAA+B,4BAA/B;kCAeEpH,gB;;2BACAA,gB","file":"module.js","sourcesContent":["/**\n * Grafana-Zabbix\n * Zabbix plugin for Grafana.\n * http://github.com/alexanderzobnin/grafana-zabbix\n *\n * Trigger panel.\n * This feature sponsored by CORE IT\n * http://www.coreit.fr\n *\n * Copyright 2015 Alexander Zobnin alexanderzobnin@gmail.com\n * Licensed under the Apache License, Version 2.0\n */\n\nimport _ from 'lodash';\nimport $ from 'jquery';\nimport moment from 'moment';\nimport * as utils from '../datasource-zabbix/utils';\nimport {PanelCtrl} from 'app/plugins/sdk';\nimport {triggerPanelEditor} from './editor';\nimport './ack-tooltip.directive';\nimport './css/panel_triggers.css!';\n\nvar defaultSeverity = [\n { priority: 0, severity: 'Not classified', color: '#B7DBAB', show: true },\n { priority: 1, severity: 'Information', color: '#82B5D8', show: true },\n { priority: 2, severity: 'Warning', color: '#E5AC0E', show: true },\n { priority: 3, severity: 'Average', color: '#C15C17', show: true },\n { priority: 4, severity: 'High', color: '#BF1B00', show: true },\n { priority: 5, severity: 'Disaster', color: '#890F02', show: true }\n];\n\nvar panelDefaults = {\n datasource: null,\n triggers: {\n group: {filter: \"\"},\n host: {filter: \"\"},\n application: {filter: \"\"},\n trigger: {filter: \"\"}\n },\n hostField: true,\n statusField: false,\n severityField: false,\n lastChangeField: true,\n ageField: true,\n infoField: true,\n limit: 10,\n showTriggers: 'all triggers',\n sortTriggersBy: { text: 'last change', value: 'lastchange' },\n showEvents: { text: 'Problems', value: '1' },\n triggerSeverity: defaultSeverity,\n okEventColor: 'rgba(0, 245, 153, 0.45)',\n ackEventColor: 'rgba(0, 0, 0, 0)',\n scroll: true,\n pageSize: 10\n};\n\nvar triggerStatusMap = {\n '0': 'OK',\n '1': 'Problem'\n};\n\nvar defaultTimeFormat = \"DD MMM YYYY HH:mm:ss\";\n\nclass TriggerPanelCtrl extends PanelCtrl {\n\n /** @ngInject */\n constructor($scope, $injector, $element, datasourceSrv, templateSrv, contextSrv) {\n super($scope, $injector);\n this.datasourceSrv = datasourceSrv;\n this.templateSrv = templateSrv;\n this.contextSrv = contextSrv;\n this.triggerStatusMap = triggerStatusMap;\n this.defaultTimeFormat = defaultTimeFormat;\n\n this.pageIndex = 0;\n\n // Load panel defaults\n // _.cloneDeep() need for prevent changing shared defaultSeverity.\n // Load object \"by value\" istead \"by reference\".\n _.defaults(this.panel, _.cloneDeep(panelDefaults));\n\n this.triggerList = [];\n this.currentPage = [];\n\n this.events.on('init-edit-mode', this.onInitEditMode.bind(this));\n this.events.on('render', this.onRender.bind(this));\n this.events.on('refresh', this.onRender.bind(this));\n\n this.refreshData();\n }\n\n /**\n * Override onInitMetricsPanelEditMode() method from MetricsPanelCtrl.\n * We don't need metric editor from Metrics Panel.\n */\n onInitEditMode() {\n this.addEditorTab('Options', triggerPanelEditor, 2);\n }\n\n onMetricsPanelRefresh() {\n // ignore fetching data if another panel is in fullscreen\n if (this.otherPanelInFullscreenMode()) { return; }\n\n this.refreshData();\n }\n\n onRender() {\n // clear loading/error state\n delete this.error;\n this.loading = true;\n\n return this.refreshData()\n .then(triggerList => {\n // Limit triggers number\n this.triggerList = triggerList.slice(0, this.panel.limit);\n\n // Notify panel that request is finished\n this.loading = false;\n });\n }\n\n refreshData() {\n return this.getTriggers()\n .then(this.getAcknowledges.bind(this))\n .then(this.filterTriggers.bind(this));\n }\n\n getTriggers() {\n return this.datasourceSrv.get(this.panel.datasource)\n .then(datasource => {\n var zabbix = datasource.zabbix;\n this.zabbix = zabbix;\n var showEvents = this.panel.showEvents.value;\n var triggerFilter = this.panel.triggers;\n\n // Replace template variables\n var groupFilter = datasource.replaceTemplateVars(triggerFilter.group.filter);\n var hostFilter = datasource.replaceTemplateVars(triggerFilter.host.filter);\n var appFilter = datasource.replaceTemplateVars(triggerFilter.application.filter);\n\n var getTriggers = zabbix.getTriggers(groupFilter, hostFilter, appFilter, showEvents);\n return getTriggers.then(triggers => {\n return _.map(triggers, this.formatTrigger.bind(this));\n });\n });\n }\n\n getAcknowledges(triggerList) {\n // Request acknowledges for trigger\n var eventids = _.map(triggerList, trigger => {\n return trigger.lastEvent.eventid;\n });\n\n return this.zabbix.getAcknowledges(eventids)\n .then(events => {\n\n // Map events to triggers\n _.each(triggerList, trigger => {\n var event = _.find(events, event => {\n return event.eventid === trigger.lastEvent.eventid;\n });\n\n if (event) {\n trigger.acknowledges = _.map(event.acknowledges, ack => {\n let timestamp = moment.unix(ack.clock);\n if (this.panel.customLastChangeFormat) {\n ack.time = timestamp.format(this.panel.lastChangeFormat);\n } else {\n ack.time = timestamp.format(this.defaultTimeFormat);\n }\n ack.user = ack.alias + ' (' + ack.name + ' ' + ack.surname + ')';\n return ack;\n });\n\n // Mark acknowledged triggers with different color\n if (this.panel.markAckEvents && trigger.acknowledges.length) {\n trigger.color = this.panel.ackEventColor;\n }\n }\n });\n\n return triggerList;\n });\n }\n\n filterTriggers(triggerList) {\n // Filter triggers by description\n var triggerFilter = this.panel.triggers.trigger.filter;\n if (triggerFilter) {\n triggerList = filterTriggers(triggerList, triggerFilter);\n }\n\n // Filter acknowledged triggers\n if (this.panel.showTriggers === 'unacknowledged') {\n triggerList = _.filter(triggerList, trigger => {\n return !trigger.acknowledges;\n });\n } else if (this.panel.showTriggers === 'acknowledged') {\n triggerList = _.filter(triggerList, 'acknowledges');\n } else {\n triggerList = triggerList;\n }\n\n // Filter triggers by severity\n triggerList = _.filter(triggerList, trigger => {\n return this.panel.triggerSeverity[trigger.priority].show;\n });\n\n // Sort triggers\n if (this.panel.sortTriggersBy.value === 'priority') {\n triggerList = _.sortBy(triggerList, 'priority').reverse();\n } else {\n triggerList = _.sortBy(triggerList, 'lastchangeUnix').reverse();\n }\n\n return triggerList;\n }\n\n formatTrigger(trigger) {\n let triggerObj = trigger;\n\n // Format last change and age\n trigger.lastchangeUnix = Number(trigger.lastchange);\n let timestamp = moment.unix(trigger.lastchangeUnix);\n if (this.panel.customLastChangeFormat) {\n // User defined format\n triggerObj.lastchange = timestamp.format(this.panel.lastChangeFormat);\n } else {\n triggerObj.lastchange = timestamp.format(this.defaultTimeFormat);\n }\n triggerObj.age = timestamp.fromNow(true);\n\n // Set host that the trigger belongs\n if (trigger.hosts.length) {\n triggerObj.host = trigger.hosts[0].name;\n triggerObj.hostTechName = trigger.hosts[0].host;\n }\n\n // Set color\n if (trigger.value === '1') {\n // Problem state\n triggerObj.color = this.panel.triggerSeverity[trigger.priority].color;\n } else {\n // OK state\n triggerObj.color = this.panel.okEventColor;\n }\n\n triggerObj.severity = this.panel.triggerSeverity[trigger.priority].severity;\n return triggerObj;\n }\n\n switchComment(trigger) {\n trigger.showComment = !trigger.showComment;\n }\n\n acknowledgeTrigger(trigger, message) {\n let eventid = trigger.lastEvent.eventid;\n let grafana_user = this.contextSrv.user.name;\n let ack_message = grafana_user + ' (Grafana): ' + message;\n return this.datasourceSrv.get(this.panel.datasource)\n .then(datasource => {\n let zabbixAPI = datasource.zabbix.zabbixAPI;\n return zabbixAPI.acknowledgeEvent(eventid, ack_message)\n .then(() => {\n this.refresh();\n });\n });\n }\n\n link(scope, elem, attrs, ctrl) {\n var data;\n var panel = ctrl.panel;\n var pageCount = 0;\n // var formaters = [];\n data = ctrl.panel.triggerList;\n\n function getTableHeight() {\n var panelHeight = ctrl.height;\n\n if (pageCount > 1) {\n panelHeight -= 26;\n }\n\n return (panelHeight - 31) + 'px';\n }\n\n function switchPage(e) {\n let el = $(e.currentTarget);\n ctrl.pageIndex = (parseInt(el.text(), 10)-1);\n\n let pageSize = ctrl.panel.pageSize || 10;\n let startPos = ctrl.pageIndex * pageSize;\n let endPos = Math.min(startPos + pageSize, ctrl.triggerList.length);\n ctrl.currentPage = ctrl.triggerList.slice(startPos, endPos);\n ctrl.render();\n // renderPanel();\n }\n\n function appendPaginationControls(footerElem) {\n footerElem.empty();\n\n var pageSize = panel.pageSize || 5;\n pageCount = Math.ceil(ctrl.panel.triggerList.length / pageSize);\n if (pageCount === 1) {\n return;\n }\n\n var startPage = Math.max(ctrl.pageIndex - 3, 0);\n var endPage = Math.min(pageCount, startPage + 9);\n\n var paginationList = $('');\n\n for (var i = startPage; i < endPage; i++) {\n var activeClass = i === ctrl.pageIndex ? 'active' : '';\n var pageLinkElem = $('
  • ' + (i+1) + '
  • ');\n paginationList.append(pageLinkElem);\n }\n\n footerElem.append(paginationList);\n }\n\n function renderPanel() {\n var panelElem = elem.parents('.panel');\n var rootElem = elem.find('.triggers-panel-scroll');\n // var tbodyElem = elem.find('tbody');\n var footerElem = elem.find('.triggers-panel-footer');\n\n elem.css({'font-size': panel.fontSize});\n panelElem.addClass('triggers-panel-wrapper');\n\n // appendTableRows(tbodyElem);\n appendPaginationControls(footerElem);\n\n rootElem.css({'max-height': panel.scroll ? getTableHeight() : '' });\n // ctrl.render();\n }\n\n elem.on('click', '.triggers-panel-page-link', switchPage);\n\n var unbindDestroy = scope.$on('$destroy', function() {\n elem.off('click', '.triggers-panel-page-link');\n unbindDestroy();\n });\n\n ctrl.events.on('render', (renderData) => {\n data = renderData || data;\n if (data) {\n renderPanel();\n }\n ctrl.renderingCompleted();\n });\n }\n}\n\nTriggerPanelCtrl.templateUrl = 'panel-triggers/module.html';\n\nfunction filterTriggers(triggers, triggerFilter) {\n if (utils.isRegex(triggerFilter)) {\n return _.filter(triggers, function(trigger) {\n return utils.buildRegex(triggerFilter).test(trigger.description);\n });\n } else {\n return _.filter(triggers, function(trigger) {\n return trigger.description === triggerFilter;\n });\n }\n}\n\nexport {\n TriggerPanelCtrl,\n TriggerPanelCtrl as PanelCtrl\n};\n"]} \ No newline at end of file diff --git a/src/panel-triggers/module.html b/src/panel-triggers/module.html index 244eca4..23c3ce0 100644 --- a/src/panel-triggers/module.html +++ b/src/panel-triggers/module.html @@ -35,7 +35,7 @@ - +
    diff --git a/src/panel-triggers/module.js b/src/panel-triggers/module.js index 4d6a226..dcc0476 100644 --- a/src/panel-triggers/module.js +++ b/src/panel-triggers/module.js @@ -15,7 +15,7 @@ import _ from 'lodash'; import $ from 'jquery'; import moment from 'moment'; import * as utils from '../datasource-zabbix/utils'; -import {MetricsPanelCtrl} from 'app/plugins/sdk'; +import {PanelCtrl} from 'app/plugins/sdk'; import {triggerPanelEditor} from './editor'; import './ack-tooltip.directive'; import './css/panel_triggers.css!'; @@ -61,7 +61,7 @@ var triggerStatusMap = { var defaultTimeFormat = "DD MMM YYYY HH:mm:ss"; -class TriggerPanelCtrl extends MetricsPanelCtrl { +class TriggerPanelCtrl extends PanelCtrl { /** @ngInject */ constructor($scope, $injector, $element, datasourceSrv, templateSrv, contextSrv) { @@ -81,6 +81,11 @@ class TriggerPanelCtrl extends MetricsPanelCtrl { this.triggerList = []; this.currentPage = []; + + this.events.on('init-edit-mode', this.onInitEditMode.bind(this)); + this.events.on('render', this.onRender.bind(this)); + this.events.on('refresh', this.onRender.bind(this)); + this.refreshData(); } @@ -88,14 +93,10 @@ class TriggerPanelCtrl extends MetricsPanelCtrl { * Override onInitMetricsPanelEditMode() method from MetricsPanelCtrl. * We don't need metric editor from Metrics Panel. */ - onInitMetricsPanelEditMode() { + onInitEditMode() { this.addEditorTab('Options', triggerPanelEditor, 2); } - refresh() { - this.onMetricsPanelRefresh(); - } - onMetricsPanelRefresh() { // ignore fetching data if another panel is in fullscreen if (this.otherPanelInFullscreenMode()) { return; } @@ -103,20 +104,34 @@ class TriggerPanelCtrl extends MetricsPanelCtrl { this.refreshData(); } - refreshData() { + onRender() { // clear loading/error state delete this.error; this.loading = true; - this.setTimeQueryStart(); - var self = this; + return this.refreshData() + .then(triggerList => { + // Limit triggers number + this.triggerList = triggerList.slice(0, this.panel.limit); - // Load datasource + // Notify panel that request is finished + this.loading = false; + }); + } + + refreshData() { + return this.getTriggers() + .then(this.getAcknowledges.bind(this)) + .then(this.filterTriggers.bind(this)); + } + + getTriggers() { return this.datasourceSrv.get(this.panel.datasource) .then(datasource => { var zabbix = datasource.zabbix; - var showEvents = self.panel.showEvents.value; - var triggerFilter = self.panel.triggers; + this.zabbix = zabbix; + var showEvents = this.panel.showEvents.value; + var triggerFilter = this.panel.triggers; // Replace template variables var groupFilter = datasource.replaceTemplateVars(triggerFilter.group.filter); @@ -125,117 +140,115 @@ class TriggerPanelCtrl extends MetricsPanelCtrl { var getTriggers = zabbix.getTriggers(groupFilter, hostFilter, appFilter, showEvents); return getTriggers.then(triggers => { - return _.map(triggers, trigger => { - let triggerObj = trigger; - - // Format last change and age - trigger.lastchangeUnix = Number(trigger.lastchange); - let timestamp = moment.unix(trigger.lastchangeUnix); - if (self.panel.customLastChangeFormat) { - // User defined format - triggerObj.lastchange = timestamp.format(self.panel.lastChangeFormat); - } else { - triggerObj.lastchange = timestamp.format(self.defaultTimeFormat); - } - triggerObj.age = timestamp.fromNow(true); - - // Set host that the trigger belongs - if (trigger.hosts.length) { - triggerObj.host = trigger.hosts[0].name; - triggerObj.hostTechName = trigger.hosts[0].host; - } - - // Set color - if (trigger.value === '1') { - // Problem state - triggerObj.color = self.panel.triggerSeverity[trigger.priority].color; - } else { - // OK state - triggerObj.color = self.panel.okEventColor; - } - - triggerObj.severity = self.panel.triggerSeverity[trigger.priority].severity; - return triggerObj; - }); - }) - .then(triggerList => { - - // Request acknowledges for trigger - var eventids = _.map(triggerList, trigger => { - return trigger.lastEvent.eventid; - }); - - return zabbix.getAcknowledges(eventids) - .then(events => { - - // Map events to triggers - _.each(triggerList, trigger => { - var event = _.find(events, event => { - return event.eventid === trigger.lastEvent.eventid; - }); - - if (event) { - trigger.acknowledges = _.map(event.acknowledges, ack => { - let timestamp = moment.unix(ack.clock); - if (self.panel.customLastChangeFormat) { - ack.time = timestamp.format(self.panel.lastChangeFormat); - } else { - ack.time = timestamp.format(self.defaultTimeFormat); - } - ack.user = ack.alias + ' (' + ack.name + ' ' + ack.surname + ')'; - return ack; - }); - - // Mark acknowledged triggers with different color - if (self.panel.markAckEvents && trigger.acknowledges.length) { - trigger.color = self.panel.ackEventColor; - } - } - }); - - // Filter triggers by description - var triggerFilter = self.panel.triggers.trigger.filter; - if (triggerFilter) { - triggerList = filterTriggers(triggerList, triggerFilter); - } - - // Filter acknowledged triggers - if (self.panel.showTriggers === 'unacknowledged') { - triggerList = _.filter(triggerList, trigger => { - return !trigger.acknowledges; - }); - } else if (self.panel.showTriggers === 'acknowledged') { - triggerList = _.filter(triggerList, 'acknowledges'); - } else { - triggerList = triggerList; - } - - // Filter triggers by severity - triggerList = _.filter(triggerList, trigger => { - return self.panel.triggerSeverity[trigger.priority].show; - }); - - // Sort triggers - if (self.panel.sortTriggersBy.value === 'priority') { - triggerList = _.sortBy(triggerList, 'priority').reverse(); - } else { - triggerList = _.sortBy(triggerList, 'lastchangeUnix').reverse(); - } - - // Limit triggers number - self.triggerList = triggerList.slice(0, self.panel.limit); - - // Notify panel that request is finished - self.setTimeQueryEnd(); - self.loading = false; - - this.panel.triggerList = this.triggerList; - this.render(); - }); + return _.map(triggers, this.formatTrigger.bind(this)); }); }); } + getAcknowledges(triggerList) { + // Request acknowledges for trigger + var eventids = _.map(triggerList, trigger => { + return trigger.lastEvent.eventid; + }); + + return this.zabbix.getAcknowledges(eventids) + .then(events => { + + // Map events to triggers + _.each(triggerList, trigger => { + var event = _.find(events, event => { + return event.eventid === trigger.lastEvent.eventid; + }); + + if (event) { + trigger.acknowledges = _.map(event.acknowledges, ack => { + let timestamp = moment.unix(ack.clock); + if (this.panel.customLastChangeFormat) { + ack.time = timestamp.format(this.panel.lastChangeFormat); + } else { + ack.time = timestamp.format(this.defaultTimeFormat); + } + ack.user = ack.alias + ' (' + ack.name + ' ' + ack.surname + ')'; + return ack; + }); + + // Mark acknowledged triggers with different color + if (this.panel.markAckEvents && trigger.acknowledges.length) { + trigger.color = this.panel.ackEventColor; + } + } + }); + + return triggerList; + }); + } + + filterTriggers(triggerList) { + // Filter triggers by description + var triggerFilter = this.panel.triggers.trigger.filter; + if (triggerFilter) { + triggerList = filterTriggers(triggerList, triggerFilter); + } + + // Filter acknowledged triggers + if (this.panel.showTriggers === 'unacknowledged') { + triggerList = _.filter(triggerList, trigger => { + return !trigger.acknowledges; + }); + } else if (this.panel.showTriggers === 'acknowledged') { + triggerList = _.filter(triggerList, 'acknowledges'); + } else { + triggerList = triggerList; + } + + // Filter triggers by severity + triggerList = _.filter(triggerList, trigger => { + return this.panel.triggerSeverity[trigger.priority].show; + }); + + // Sort triggers + if (this.panel.sortTriggersBy.value === 'priority') { + triggerList = _.sortBy(triggerList, 'priority').reverse(); + } else { + triggerList = _.sortBy(triggerList, 'lastchangeUnix').reverse(); + } + + return triggerList; + } + + formatTrigger(trigger) { + let triggerObj = trigger; + + // Format last change and age + trigger.lastchangeUnix = Number(trigger.lastchange); + let timestamp = moment.unix(trigger.lastchangeUnix); + if (this.panel.customLastChangeFormat) { + // User defined format + triggerObj.lastchange = timestamp.format(this.panel.lastChangeFormat); + } else { + triggerObj.lastchange = timestamp.format(this.defaultTimeFormat); + } + triggerObj.age = timestamp.fromNow(true); + + // Set host that the trigger belongs + if (trigger.hosts.length) { + triggerObj.host = trigger.hosts[0].name; + triggerObj.hostTechName = trigger.hosts[0].host; + } + + // Set color + if (trigger.value === '1') { + // Problem state + triggerObj.color = this.panel.triggerSeverity[trigger.priority].color; + } else { + // OK state + triggerObj.color = this.panel.okEventColor; + } + + triggerObj.severity = this.panel.triggerSeverity[trigger.priority].severity; + return triggerObj; + } + switchComment(trigger) { trigger.showComment = !trigger.showComment; } @@ -254,10 +267,6 @@ class TriggerPanelCtrl extends MetricsPanelCtrl { }); } - render() { - return super.render(this.triggerList); - } - link(scope, elem, attrs, ctrl) { var data; var panel = ctrl.panel;