kibana-123
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
115 lines (90 loc) • 3.43 kB
JavaScript
import _ from 'lodash';
import html from 'ui/doc_table/doc_table.html';
import getSort from 'ui/doc_table/lib/get_sort';
import 'ui/doc_table/doc_table.less';
import 'ui/directives/truncated';
import 'ui/directives/infinite_scroll';
import 'ui/doc_table/components/table_header';
import 'ui/doc_table/components/table_row';
import uiModules from 'ui/modules';
uiModules.get('kibana')
.directive('docTable', function (config, Notifier, getAppState) {
return {
restrict: 'E',
template: html,
scope: {
sorting: '=',
columns: '=',
hits: '=?', // You really want either hits & indexPattern, OR searchSource
indexPattern: '=?',
searchSource: '=?',
infiniteScroll: '=?',
filter: '=?',
},
link: function ($scope) {
let notify = new Notifier();
$scope.limit = 50;
$scope.persist = {
sorting: $scope.sorting,
columns: $scope.columns
};
let prereq = (function () {
let fns = [];
return function register(fn) {
fns.push(fn);
return function () {
fn.apply(this, arguments);
if (fns.length) {
_.pull(fns, fn);
if (!fns.length) {
$scope.$root.$broadcast('ready:vis');
}
}
};
};
}());
$scope.addRows = function () {
$scope.limit += 50;
};
// This exists to fix the problem of an empty initial column list not playing nice with watchCollection.
$scope.$watch('columns', function (columns) {
if (columns.length !== 0) return;
let $state = getAppState();
$scope.columns.push('_source');
if ($state) $state.replace();
});
$scope.$watchCollection('columns', function (columns, oldColumns) {
if (oldColumns.length === 1 && oldColumns[0] === '_source' && $scope.columns.length > 1) {
_.pull($scope.columns, '_source');
}
if ($scope.columns.length === 0) $scope.columns.push('_source');
});
$scope.$watch('searchSource', prereq(function (searchSource) {
if (!$scope.searchSource) return;
$scope.indexPattern = $scope.searchSource.get('index');
$scope.searchSource.size(config.get('discover:sampleSize'));
$scope.searchSource.sort(getSort($scope.sorting, $scope.indexPattern));
// Set the watcher after initialization
$scope.$watchCollection('sorting', function (newSort, oldSort) {
// Don't react if sort values didn't really change
if (newSort === oldSort) return;
$scope.searchSource.sort(getSort(newSort, $scope.indexPattern));
$scope.searchSource.fetchQueued();
});
$scope.$on('$destroy', function () {
if ($scope.searchSource) $scope.searchSource.destroy();
});
// TODO: we need to have some way to clean up result requests
$scope.searchSource.onResults().then(function onResults(resp) {
// Reset infinite scroll limit
$scope.limit = 50;
// Abort if something changed
if ($scope.searchSource !== $scope.searchSource) return;
$scope.hits = resp.hits.hits;
return $scope.searchSource.onResults().then(onResults);
}).catch(notify.fatal);
$scope.searchSource.onError(notify.error).catch(notify.fatal);
}));
}
};
});