module.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. ///<reference path="../../headers/common.d.ts" />
  2. import angular = require('angular');
  3. import $ = require('jquery');
  4. import _ = require('lodash');
  5. import kbn = require('app/core/utils/kbn');
  6. import {TablePanelCtrl} from './controller';
  7. export function tablePanelDirective() {
  8. 'use strict';
  9. return {
  10. restrict: 'E',
  11. templateUrl: 'app/panels/table/module.html',
  12. controller: TablePanelCtrl,
  13. link: function(scope, elem) {
  14. var data;
  15. var panel = scope.panel;
  16. var formaters = [];
  17. function getTableHeight() {
  18. var panelHeight = scope.height || scope.panel.height || scope.row.height;
  19. if (_.isString(panelHeight)) {
  20. panelHeight = parseInt(panelHeight.replace('px', ''), 10);
  21. }
  22. return (panelHeight - 40) + 'px';
  23. }
  24. function appendTableHeader(tableElem) {
  25. var rowElem = $('<tr></tr>');
  26. for (var i = 0; i < data.columns.length; i++) {
  27. var column = data.columns[i];
  28. var colElem = $('<th>' + column.text + '</th>');
  29. rowElem.append(colElem);
  30. }
  31. var headElem = $('<thead></thead>');
  32. headElem.append(rowElem);
  33. headElem.appendTo(tableElem);
  34. }
  35. function createColumnFormater(style) {
  36. return function(v) {
  37. if (v === null) {
  38. return '-';
  39. }
  40. if (_.isString(v)) {
  41. return v;
  42. }
  43. let valueFormater = kbn.valueFormats[style.unit];
  44. return valueFormater(v, style.decimals);
  45. };
  46. }
  47. function formatColumnValue(colIndex, value) {
  48. if (formaters[colIndex]) {
  49. return formaters[colIndex](value);
  50. }
  51. for (let i = 0; i < panel.columns.length; i++) {
  52. let style = panel.columns[i];
  53. let column = data.columns[colIndex];
  54. var regex = kbn.stringToJsRegex(style.pattern);
  55. if (column.text.match(regex)) {
  56. formaters[colIndex] = createColumnFormater(style);
  57. return formaters[colIndex](value);
  58. }
  59. }
  60. formaters[colIndex] = function(v) {
  61. return v;
  62. };
  63. return formaters[colIndex](value);
  64. }
  65. function appendTableRows(tbodyElem) {
  66. let rowElements = $(document.createDocumentFragment());
  67. let rowEnd = Math.min(panel.pageSize, data.rows.length);
  68. let rowStart = 0;
  69. for (var y = rowStart; y < rowEnd; y++) {
  70. let row = data.rows[y];
  71. let rowElem = $('<tr></tr>');
  72. for (var i = 0; i < data.columns.length; i++) {
  73. var colValue = formatColumnValue(i, row[i]);
  74. let colElem = $('<td> ' + colValue + '</td>');
  75. rowElem.append(colElem);
  76. }
  77. rowElements.append(rowElem);
  78. }
  79. tbodyElem.empty();
  80. tbodyElem.append(rowElements);
  81. }
  82. function appendPaginationControls(footerElem) {
  83. var paginationList = $('<ul></ul>');
  84. var pageCount = data.rows.length / panel.pageSize;
  85. for (var i = 0; i < pageCount; i++) {
  86. var pageLinkElem = $('<li><a href="#">' + (i+1) + '</a></li>');
  87. paginationList.append(pageLinkElem);
  88. }
  89. var nextLink = $('<li><a href="#">»</a></li>');
  90. paginationList.append(nextLink);
  91. footerElem.empty();
  92. footerElem.append(paginationList);
  93. }
  94. function renderPanel() {
  95. var rootElem = elem.find('.table-panel-scroll');
  96. var tbodyElem = elem.find('tbody');
  97. var footerElem = elem.find('.table-panel-footer');
  98. appendTableRows(tbodyElem);
  99. rootElem.css({'max-height': getTableHeight()});
  100. appendPaginationControls(footerElem);
  101. }
  102. scope.$on('render', function(event, renderData) {
  103. data = renderData || data;
  104. if (!data) {
  105. scope.get_data();
  106. return;
  107. }
  108. renderPanel();
  109. });
  110. }
  111. };
  112. }
  113. angular.module('grafana.directives').directive('grafanaPanelTable', tablePanelDirective);