UNPKG

@spalger/kibana

Version:

Kibana is an open source (Apache Licensed), browser based analytics and search dashboard for Elasticsearch. Kibana is a snap to setup and start using. Kibana strives to be easy to get started with, while also being flexible and powerful, just like Elastic

103 lines (88 loc) 3.63 kB
define(function (require) { var $ = require('jquery'); var _ = require('lodash'); var module = require('ui/modules').get('kibana'); var AggConfigResult = require('ui/Vis/AggConfigResult'); module.directive('kbnRows', function ($compile, $rootScope, getAppState, Private) { var filterBarClickHandler = Private(require('ui/filter_bar/filter_bar_click_handler')); return { restrict: 'A', link: function ($scope, $el, attr) { function addCell($tr, contents) { var $cell = $(document.createElement('td')); // TODO: It would be better to actually check the type of the field, but we don't have // access to it here. This may become a problem with the switch to BigNumber if (_.isNumeric(contents)) $cell.addClass('numeric-value'); var createAggConfigResultCell = function (aggConfigResult) { var $cell = $(document.createElement('td')); var $state = getAppState(); var clickHandler = filterBarClickHandler($state); $cell.scope = $scope.$new(); $cell.addClass('cell-hover'); $cell.attr('ng-click', 'clickHandler($event)'); $cell.scope.clickHandler = function (event) { if ($(event.target).is('a')) return; // Don't add filter if a link was clicked clickHandler({ point: { aggConfigResult: aggConfigResult } }); }; return $compile($cell)($cell.scope); }; if (contents instanceof AggConfigResult) { if (contents.type === 'bucket' && contents.aggConfig.field() && contents.aggConfig.field().filterable) { $cell = createAggConfigResultCell(contents); } contents = contents.toString('html'); } if (_.isObject(contents)) { if (contents.attr) { $cell.attr(contents.attr); } if (contents.class) { $cell.addClass(contents.class); } if (contents.scope) { $cell = $compile($cell.html(contents.markup))(contents.scope); } else { $cell.html(contents.markup); } } else { if (contents === '') { $cell.html('&nbsp;'); } else { $cell.html(contents); } } $tr.append($cell); } function maxRowSize(max, row) { return Math.max(max, row.length); } $scope.$watchMulti([ attr.kbnRows, attr.kbnRowsMin ], function (vals) { var rows = vals[0]; var min = vals[1]; $el.empty(); if (!_.isArray(rows)) rows = []; var width = rows.reduce(maxRowSize, 0); if (isFinite(min) && rows.length < min) { // clone the rows so that we can add elements to it without upsetting the original rows = _.clone(rows); // crate the empty row which will be pushed into the row list over and over var emptyRow = new Array(width); // fill the empty row with values _.times(width, function (i) { emptyRow[i] = ''; }); // push as many empty rows into the row array as needed _.times(min - rows.length, function () { rows.push(emptyRow); }); } rows.forEach(function (row) { var $tr = $(document.createElement('tr')).appendTo($el); row.forEach(function (cell) { addCell($tr, cell); }); }); }); } }; }); });