2015-11-02 10:00:47 -06:00
|
|
|
///<reference path="../../headers/common.d.ts" />
|
|
|
|
|
|
|
|
import angular = require('angular');
|
|
|
|
import $ = require('jquery');
|
|
|
|
import _ = require('lodash');
|
2015-11-04 15:44:08 -06:00
|
|
|
import kbn = require('app/core/utils/kbn');
|
2015-11-05 06:13:13 -06:00
|
|
|
import moment = require('moment');
|
2015-11-04 15:44:08 -06:00
|
|
|
|
|
|
|
import {TablePanelCtrl} from './controller';
|
2015-11-05 06:13:13 -06:00
|
|
|
import {tablePanelEditor} from './editor';
|
2015-11-02 10:00:47 -06:00
|
|
|
|
2015-11-05 06:13:13 -06:00
|
|
|
export function tablePanel() {
|
2015-11-02 10:00:47 -06:00
|
|
|
'use strict';
|
|
|
|
return {
|
|
|
|
restrict: 'E',
|
|
|
|
templateUrl: 'app/panels/table/module.html',
|
|
|
|
controller: TablePanelCtrl,
|
|
|
|
link: function(scope, elem) {
|
|
|
|
var data;
|
2015-11-04 05:56:53 -06:00
|
|
|
var panel = scope.panel;
|
2015-11-04 15:44:08 -06:00
|
|
|
var formaters = [];
|
2015-11-02 10:00:47 -06:00
|
|
|
|
2015-11-03 01:18:35 -06:00
|
|
|
function getTableHeight() {
|
|
|
|
var panelHeight = scope.height || scope.panel.height || scope.row.height;
|
|
|
|
if (_.isString(panelHeight)) {
|
|
|
|
panelHeight = parseInt(panelHeight.replace('px', ''), 10);
|
|
|
|
}
|
|
|
|
|
|
|
|
return (panelHeight - 40) + 'px';
|
|
|
|
}
|
|
|
|
|
2015-11-04 15:44:08 -06:00
|
|
|
function createColumnFormater(style) {
|
|
|
|
return function(v) {
|
2015-11-05 00:43:06 -06:00
|
|
|
if (v === null || v === void 0) {
|
2015-11-04 15:44:08 -06:00
|
|
|
return '-';
|
|
|
|
}
|
2015-11-05 06:13:13 -06:00
|
|
|
if (_.isString(v) || !style) {
|
2015-11-04 15:44:08 -06:00
|
|
|
return v;
|
|
|
|
}
|
2015-11-05 08:55:42 -06:00
|
|
|
|
2015-11-05 06:13:13 -06:00
|
|
|
if (style.type === 'date') {
|
2015-11-05 08:55:42 -06:00
|
|
|
if (_.isArray(v)) { v = v[0]; }
|
2015-11-05 06:13:13 -06:00
|
|
|
var date = moment(v);
|
|
|
|
return date.format(style.dateFormat);
|
|
|
|
}
|
2015-11-05 08:55:42 -06:00
|
|
|
|
|
|
|
if (_.isNumber(v) && style.type === 'number') {
|
|
|
|
let valueFormater = kbn.valueFormats[style.unit];
|
|
|
|
return valueFormater(v, style.decimals);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_.isArray(v)) {
|
|
|
|
v = v.join(', ');
|
|
|
|
}
|
|
|
|
|
|
|
|
return v;
|
2015-11-04 15:44:08 -06:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
function formatColumnValue(colIndex, value) {
|
|
|
|
if (formaters[colIndex]) {
|
|
|
|
return formaters[colIndex](value);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (let i = 0; i < panel.columns.length; i++) {
|
|
|
|
let style = panel.columns[i];
|
|
|
|
let column = data.columns[colIndex];
|
|
|
|
var regex = kbn.stringToJsRegex(style.pattern);
|
|
|
|
if (column.text.match(regex)) {
|
|
|
|
formaters[colIndex] = createColumnFormater(style);
|
|
|
|
return formaters[colIndex](value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
formaters[colIndex] = function(v) {
|
|
|
|
return v;
|
|
|
|
};
|
|
|
|
|
|
|
|
return formaters[colIndex](value);
|
|
|
|
}
|
|
|
|
|
2015-11-04 10:23:16 -06:00
|
|
|
function appendTableRows(tbodyElem) {
|
2015-11-04 15:44:08 -06:00
|
|
|
let rowElements = $(document.createDocumentFragment());
|
|
|
|
let rowEnd = Math.min(panel.pageSize, data.rows.length);
|
|
|
|
let rowStart = 0;
|
2015-11-05 00:43:06 -06:00
|
|
|
// reset formater cache
|
|
|
|
formaters = [];
|
2015-11-04 05:56:53 -06:00
|
|
|
|
|
|
|
for (var y = rowStart; y < rowEnd; y++) {
|
2015-11-04 15:44:08 -06:00
|
|
|
let row = data.rows[y];
|
|
|
|
let rowElem = $('<tr></tr>');
|
2015-11-04 05:56:53 -06:00
|
|
|
for (var i = 0; i < data.columns.length; i++) {
|
2015-11-04 15:44:08 -06:00
|
|
|
var colValue = formatColumnValue(i, row[i]);
|
|
|
|
let colElem = $('<td> ' + colValue + '</td>');
|
2015-11-02 10:00:47 -06:00
|
|
|
rowElem.append(colElem);
|
|
|
|
}
|
2015-11-04 10:23:16 -06:00
|
|
|
rowElements.append(rowElem);
|
2015-11-02 10:00:47 -06:00
|
|
|
}
|
|
|
|
|
2015-11-04 10:23:16 -06:00
|
|
|
tbodyElem.empty();
|
|
|
|
tbodyElem.append(rowElements);
|
2015-11-04 05:56:53 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
function appendPaginationControls(footerElem) {
|
|
|
|
var paginationList = $('<ul></ul>');
|
|
|
|
|
|
|
|
var pageCount = data.rows.length / panel.pageSize;
|
|
|
|
for (var i = 0; i < pageCount; i++) {
|
|
|
|
var pageLinkElem = $('<li><a href="#">' + (i+1) + '</a></li>');
|
|
|
|
paginationList.append(pageLinkElem);
|
|
|
|
}
|
|
|
|
|
|
|
|
var nextLink = $('<li><a href="#">»</a></li>');
|
|
|
|
paginationList.append(nextLink);
|
|
|
|
|
|
|
|
footerElem.empty();
|
2015-11-04 10:23:16 -06:00
|
|
|
footerElem.append(paginationList);
|
2015-11-04 05:56:53 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderPanel() {
|
2015-11-04 10:23:16 -06:00
|
|
|
var rootElem = elem.find('.table-panel-scroll');
|
|
|
|
var tbodyElem = elem.find('tbody');
|
2015-11-04 05:56:53 -06:00
|
|
|
var footerElem = elem.find('.table-panel-footer');
|
2015-11-03 01:18:35 -06:00
|
|
|
|
2015-11-04 10:23:16 -06:00
|
|
|
appendTableRows(tbodyElem);
|
2015-11-03 01:18:35 -06:00
|
|
|
|
2015-11-04 05:56:53 -06:00
|
|
|
rootElem.css({'max-height': getTableHeight()});
|
|
|
|
appendPaginationControls(footerElem);
|
2015-11-02 10:00:47 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
scope.$on('render', function(event, renderData) {
|
|
|
|
data = renderData || data;
|
|
|
|
if (!data) {
|
|
|
|
scope.get_data();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
renderPanel();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2015-11-05 06:13:13 -06:00
|
|
|
angular.module('grafana.directives').directive('grafanaPanelTable', tablePanel);
|
|
|
|
angular.module('grafana.directives').directive('grafanaPanelTableEditor', tablePanelEditor);
|