module.ts 3.4 KB

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