renderer.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. ///<reference path="../../headers/common.d.ts" />
  2. import _ = require('lodash');
  3. import kbn = require('app/core/utils/kbn');
  4. import moment = require('moment');
  5. export class TableRenderer {
  6. formaters: any[];
  7. constructor(private panel, private table, private timezone) {
  8. this.formaters = [];
  9. }
  10. createColumnFormater(style) {
  11. return (v) => {
  12. if (v === null || v === void 0) {
  13. return '-';
  14. }
  15. if (_.isString(v) || !style) {
  16. return v;
  17. }
  18. if (style.type === 'date') {
  19. if (_.isArray(v)) { v = v[0]; }
  20. var date = moment(v);
  21. if (this.timezone === 'utc') {
  22. date = date.utc();
  23. }
  24. return date.format(style.dateFormat);
  25. }
  26. if (_.isNumber(v) && style.type === 'number') {
  27. let valueFormater = kbn.valueFormats[style.unit];
  28. return valueFormater(v, style.decimals);
  29. }
  30. if (_.isArray(v)) {
  31. v = v.join(',&nbsp;');
  32. }
  33. return v;
  34. };
  35. }
  36. formatColumnValue(colIndex, value) {
  37. if (this.formaters[colIndex]) {
  38. return this.formaters[colIndex](value);
  39. }
  40. for (let i = 0; i < this.panel.columns.length; i++) {
  41. let style = this.panel.columns[i];
  42. let column = this.table.columns[colIndex];
  43. var regex = kbn.stringToJsRegex(style.pattern);
  44. if (column.text.match(regex)) {
  45. this.formaters[colIndex] = this.createColumnFormater(style);
  46. return this.formaters[colIndex](value);
  47. }
  48. }
  49. this.formaters[colIndex] = function(v) {
  50. return v;
  51. };
  52. return this.formaters[colIndex](value);
  53. }
  54. renderCell(columnIndex, value) {
  55. var colValue = this.formatColumnValue(columnIndex, value);
  56. return '<td>' + colValue + '</td>';
  57. }
  58. render(page) {
  59. let endPos = Math.min(this.panel.pageSize, this.table.rows.length);
  60. let startPos = 0;
  61. var html = "";
  62. for (var y = startPos; y < endPos; y++) {
  63. let row = this.table.rows[y];
  64. html += '<tr>';
  65. for (var i = 0; i < this.table.columns.length; i++) {
  66. html += this.renderCell(i, row[i]);
  67. }
  68. html += '</tr>';
  69. }
  70. return html;
  71. }
  72. }