module.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. ///<reference path="../../headers/common.d.ts" />
  2. import angular = require('angular');
  3. import $ = require('jquery');
  4. import _ = require('lodash');
  5. import moment = require('moment');
  6. import PanelMeta = require('app/features/panel/panel_meta');
  7. import TimeSeries = require('app/core/time_series');
  8. import {TableModel} from './table_model';
  9. var panelDefaults = {
  10. targets: [{}],
  11. };
  12. export class TablePanelCtrl {
  13. constructor($scope, $rootScope, $q, panelSrv, panelHelper) {
  14. $scope.ctrl = this;
  15. $scope.panelMeta = new PanelMeta({
  16. panelName: 'Table',
  17. editIcon: "fa fa-table",
  18. fullscreen: true,
  19. metricsEditor: true,
  20. });
  21. $scope.panelMeta.addEditorTab('Options', 'app/panels/table/options.html');
  22. $scope.panelMeta.addEditorTab('Time range', 'app/features/panel/partials/panelTime.html');
  23. _.defaults($scope.panel, panelDefaults);
  24. $scope.refreshData = function(datasource) {
  25. panelHelper.updateTimeRange($scope);
  26. return panelHelper.issueMetricQuery($scope, datasource)
  27. .then($scope.dataHandler, function(err) {
  28. $scope.seriesList = [];
  29. $scope.render([]);
  30. throw err;
  31. });
  32. };
  33. $scope.dataHandler = function(results) {
  34. $scope.tableModel = TableModel.transform(results.data, $scope.panel);
  35. panelHelper.broadcastRender($scope, $scope.tableModel);
  36. };
  37. panelSrv.init($scope);
  38. }
  39. }
  40. export function tablePanelDirective() {
  41. 'use strict';
  42. return {
  43. restrict: 'E',
  44. templateUrl: 'app/panels/table/module.html',
  45. controller: TablePanelCtrl,
  46. link: function(scope, elem) {
  47. var data;
  48. function getTableHeight() {
  49. var panelHeight = scope.height || scope.panel.height || scope.row.height;
  50. if (_.isString(panelHeight)) {
  51. panelHeight = parseInt(panelHeight.replace('px', ''), 10);
  52. }
  53. return (panelHeight - 40) + 'px';
  54. }
  55. function renderPanel() {
  56. var rootDiv = elem.find('.table-panel-container');
  57. var tableDiv = $('<table class="gf-table-panel"></table>');
  58. var i, y, rowElem, colElem, column, row;
  59. rowElem = $('<tr></tr>');
  60. for (i = 0; i < data.columns.length; i++) {
  61. column = data.columns[i];
  62. colElem = $('<th>' + column.text + '</th>');
  63. rowElem.append(colElem);
  64. }
  65. var headElem = $('<thead></thead>');
  66. headElem.append(rowElem);
  67. var tbodyElem = $('<tbody></tbody>');
  68. for (y = 0; y < data.rows.length; y++) {
  69. row = data.rows[y];
  70. rowElem = $('<tr></tr>');
  71. for (i = 0; i < data.columns.length; i++) {
  72. colElem = $('<td>' + row[i] + '</td>');
  73. rowElem.append(colElem);
  74. }
  75. tbodyElem.append(rowElem);
  76. }
  77. tableDiv.append(headElem);
  78. tableDiv.append(tbodyElem);
  79. rootDiv.css({'max-height': getTableHeight()});
  80. rootDiv.empty();
  81. rootDiv.append(tableDiv);
  82. }
  83. scope.$on('render', function(event, renderData) {
  84. data = renderData || data;
  85. if (!data) {
  86. scope.get_data();
  87. return;
  88. }
  89. renderPanel();
  90. });
  91. }
  92. };
  93. }
  94. angular.module('grafana.directives').directive('grafanaPanelTable', tablePanelDirective);