module.ts 2.8 KB

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