module.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. ///<reference path="../../../headers/common.d.ts" />
  2. import _ = require('lodash');
  3. import kbn = require('app/core/utils/kbn');
  4. import $ from 'jquery';
  5. import moment from 'moment';
  6. import angular from 'angular';
  7. import {TablePanelCtrl} from './controller';
  8. import {TableRenderer} from './renderer';
  9. import {tablePanelEditor} from './editor';
  10. export function tablePanel() {
  11. 'use strict';
  12. return {
  13. restrict: 'E',
  14. templateUrl: 'app/plugins/panels/table/module.html',
  15. controller: TablePanelCtrl,
  16. link: function(scope, elem) {
  17. var data;
  18. var panel = scope.panel;
  19. var pageCount = 0;
  20. var formaters = [];
  21. function getTableHeight() {
  22. var panelHeight = scope.height || scope.panel.height || scope.row.height;
  23. if (_.isString(panelHeight)) {
  24. panelHeight = parseInt(panelHeight.replace('px', ''), 10);
  25. }
  26. if (pageCount > 1) {
  27. panelHeight -= 28;
  28. }
  29. return (panelHeight - 60) + 'px';
  30. }
  31. function appendTableRows(tbodyElem) {
  32. var renderer = new TableRenderer(panel, data, scope.dashboard.timezone);
  33. tbodyElem.empty();
  34. tbodyElem.html(renderer.render(scope.pageIndex));
  35. }
  36. function switchPage(e) {
  37. var el = $(e.currentTarget);
  38. scope.pageIndex = (parseInt(el.text(), 10)-1);
  39. renderPanel();
  40. }
  41. function appendPaginationControls(footerElem) {
  42. footerElem.empty();
  43. var pageSize = panel.pageSize || 100;
  44. pageCount = Math.ceil(data.rows.length / pageSize);
  45. if (pageCount === 1) {
  46. return;
  47. }
  48. var startPage = Math.max(scope.pageIndex - 3, 0);
  49. var endPage = Math.min(pageCount, startPage + 9);
  50. var paginationList = $('<ul></ul>');
  51. for (var i = startPage; i < endPage; i++) {
  52. var activeClass = i === scope.pageIndex ? 'active' : '';
  53. var pageLinkElem = $('<li><a class="table-panel-page-link pointer ' + activeClass + '">' + (i+1) + '</a></li>');
  54. paginationList.append(pageLinkElem);
  55. }
  56. footerElem.append(paginationList);
  57. }
  58. function renderPanel() {
  59. var container = elem.find('.table-panel-container');
  60. var rootElem = elem.find('.table-panel-scroll');
  61. var tbodyElem = elem.find('tbody');
  62. var footerElem = elem.find('.table-panel-footer');
  63. appendTableRows(tbodyElem);
  64. container.css({'font-size': panel.fontSize});
  65. appendPaginationControls(footerElem);
  66. rootElem.css({'max-height': panel.scroll ? getTableHeight() : '' });
  67. }
  68. elem.on('click', '.table-panel-page-link', switchPage);
  69. scope.$on('$destroy', function() {
  70. elem.off('click', '.table-panel-page-link');
  71. });
  72. scope.$on('render', function(event, renderData) {
  73. data = renderData || data;
  74. if (!data) {
  75. scope.get_data();
  76. return;
  77. }
  78. renderPanel();
  79. });
  80. }
  81. };
  82. }
  83. angular.module('grafana.directives').directive('grafanaPanelTable', tablePanel);
  84. angular.module('grafana.directives').directive('grafanaPanelTableEditor', tablePanelEditor);