diff --git a/dist/panel-triggers/module.html b/dist/panel-triggers/module.html index 23c3ce0..244eca4 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 1e04a3c..3961917 100644 --- a/dist/panel-triggers/module.js +++ b/dist/panel-triggers/module.js @@ -159,6 +159,7 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap _.defaults(_this.panel, _.cloneDeep(panelDefaults)); _this.triggerList = []; + _this.currentPage = []; _this.refreshData(); return _this; } @@ -345,7 +346,7 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap }, { key: 'render', value: function render() { - return _get(TriggerPanelCtrl.prototype.__proto__ || Object.getPrototypeOf(TriggerPanelCtrl.prototype), 'render', this).call(this, this.table); + return _get(TriggerPanelCtrl.prototype.__proto__ || Object.getPrototypeOf(TriggerPanelCtrl.prototype), 'render', this).call(this, this.triggerList); } }, { key: 'link', @@ -366,16 +367,16 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap return panelHeight - 31 + 'px'; } - // function appendTableRows(tbodyElem) { - // var renderer = new TableRenderer(panel, data, ctrl.dashboard.isTimezoneUtc(), ctrl.$sanitize); - // tbodyElem.empty(); - // tbodyElem.html(renderer.render(ctrl.pageIndex)); - // } - function switchPage(e) { var el = $(e.currentTarget); ctrl.pageIndex = parseInt(el.text(), 10) - 1; - renderPanel(); + + var pageSize = ctrl.panel.pageSize || 10; + var startPos = ctrl.pageIndex * pageSize; + var endPos = Math.min(startPos + pageSize, ctrl.triggerList.length); + ctrl.currentPage = ctrl.triggerList.slice(startPos, endPos); + ctrl.render(); + // renderPanel(); } function appendPaginationControls(footerElem) { @@ -414,6 +415,7 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap appendPaginationControls(footerElem); rootElem.css({ 'max-height': panel.scroll ? getTableHeight() : '' }); + // ctrl.render(); } elem.on('click', '.triggers-panel-page-link', switchPage); @@ -423,8 +425,12 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap unbindDestroy(); }); - ctrl.events.on('render', function () { - renderPanel(); + ctrl.events.on('render', function (renderData) { + data = renderData || data; + if (data) { + renderPanel(); + } + ctrl.renderingCompleted(); }); } }]); diff --git a/dist/panel-triggers/module.js.map b/dist/panel-triggers/module.js.map index 27b7b48..cef7dd9 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","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","table","scope","elem","attrs","ctrl","data","pageCount","getTableHeight","panelHeight","height","switchPage","e","el","currentTarget","parseInt","renderPanel","appendPaginationControls","footerElem","empty","Math","ceil","startPage","max","endPage","min","paginationList","i","activeClass","pageLinkElem","append","panelElem","parents","rootElem","css","fontSize","addClass","on","unbindDestroy","$on","off","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.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.table);\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 appendTableRows(tbodyElem) {\n // var renderer = new TableRenderer(panel, data, ctrl.dashboard.isTimezoneUtc(), ctrl.$sanitize);\n // tbodyElem.empty();\n // tbodyElem.html(renderer.render(ctrl.pageIndex));\n // }\n\n function switchPage(e) {\n var el = $(e.currentTarget);\n ctrl.pageIndex = (parseInt(el.text(), 10)-1);\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 }\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', () => {\n renderPanel();\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","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 diff --git a/src/panel-triggers/module.html b/src/panel-triggers/module.html index 23c3ce0..244eca4 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 cea971b..4d6a226 100644 --- a/src/panel-triggers/module.js +++ b/src/panel-triggers/module.js @@ -80,6 +80,7 @@ class TriggerPanelCtrl extends MetricsPanelCtrl { _.defaults(this.panel, _.cloneDeep(panelDefaults)); this.triggerList = []; + this.currentPage = []; this.refreshData(); } @@ -254,7 +255,7 @@ class TriggerPanelCtrl extends MetricsPanelCtrl { } render() { - return super.render(this.table); + return super.render(this.triggerList); } link(scope, elem, attrs, ctrl) { @@ -274,16 +275,16 @@ class TriggerPanelCtrl extends MetricsPanelCtrl { return (panelHeight - 31) + 'px'; } - // function appendTableRows(tbodyElem) { - // var renderer = new TableRenderer(panel, data, ctrl.dashboard.isTimezoneUtc(), ctrl.$sanitize); - // tbodyElem.empty(); - // tbodyElem.html(renderer.render(ctrl.pageIndex)); - // } - function switchPage(e) { - var el = $(e.currentTarget); + let el = $(e.currentTarget); ctrl.pageIndex = (parseInt(el.text(), 10)-1); - renderPanel(); + + let pageSize = ctrl.panel.pageSize || 10; + let startPos = ctrl.pageIndex * pageSize; + let endPos = Math.min(startPos + pageSize, ctrl.triggerList.length); + ctrl.currentPage = ctrl.triggerList.slice(startPos, endPos); + ctrl.render(); + // renderPanel(); } function appendPaginationControls(footerElem) { @@ -322,6 +323,7 @@ class TriggerPanelCtrl extends MetricsPanelCtrl { appendPaginationControls(footerElem); rootElem.css({'max-height': panel.scroll ? getTableHeight() : '' }); + // ctrl.render(); } elem.on('click', '.triggers-panel-page-link', switchPage); @@ -331,8 +333,12 @@ class TriggerPanelCtrl extends MetricsPanelCtrl { unbindDestroy(); }); - ctrl.events.on('render', () => { - renderPanel(); + ctrl.events.on('render', (renderData) => { + data = renderData || data; + if (data) { + renderPanel(); + } + ctrl.renderingCompleted(); }); } }