kibana-with-account
Version:
kibana-with-account is develop based kibana project
168 lines (133 loc) • 5.09 kB
JavaScript
define(function (require) {
require('ui/modules')
.get('kibana/directive')
.directive('visualize', function (Notifier, SavedVis, indexPatterns, Private, config, $timeout) {
require('ui/visualize/spy');
require('ui/visualize/visualize.less');
require('ui/visualize/visualize_legend');
var $ = require('jquery');
var _ = require('lodash');
var visTypes = Private(require('ui/registry/vis_types'));
var notify = new Notifier({
location: 'Visualize'
});
return {
restrict: 'E',
scope : {
showSpyPanel: '=?',
vis: '=',
uiState: '=?',
searchSource: '=?',
editableVis: '=?',
esResp: '=?',
},
template: require('ui/visualize/visualize.html'),
link: function ($scope, $el, attr) {
var chart; // set in "vis" watcher
var minVisChartHeight = 180;
if (_.isUndefined($scope.showSpyPanel)) {
$scope.showSpyPanel = true;
}
function getter(selector) {
return function () {
var $sel = $el.find(selector);
if ($sel.size()) return $sel;
};
}
var getVisEl = getter('.visualize-chart');
var getVisContainer = getter('.vis-container');
// Show no results message when isZeroHits is true and it requires search
$scope.showNoResultsMessage = function () {
var requiresSearch = _.get($scope, 'vis.type.requiresSearch');
var isZeroHits = _.get($scope,'esResp.hits.total') === 0;
var shouldShowMessage = !_.get($scope, 'vis.params.handleNoResults');
return Boolean(requiresSearch && isZeroHits && shouldShowMessage);
};
$scope.fullScreenSpy = false;
$scope.spy = {};
$scope.spy.mode = ($scope.uiState) ? $scope.uiState.get('spy.mode', {}) : {};
var applyClassNames = function () {
var $visEl = getVisContainer();
var fullSpy = ($scope.spy.mode && ($scope.spy.mode.fill || $scope.fullScreenSpy));
$visEl.toggleClass('spy-only', Boolean(fullSpy));
$timeout(function () {
if (shouldHaveFullSpy()) {
$visEl.addClass('spy-only');
};
}, 0);
};
// we need to wait for some watchers to fire at least once
// before we are "ready", this manages that
var prereq = (function () {
var 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');
}
}
};
};
}());
var loadingDelay = config.get('visualization:loadingDelay');
$scope.loadingStyle = {
'-webkit-transition-delay': loadingDelay,
'transition-delay': loadingDelay
};
function shouldHaveFullSpy() {
var $visEl = getVisEl();
if (!$visEl) return;
return ($visEl.height() < minVisChartHeight)
&& _.get($scope.spy, 'mode.fill')
&& _.get($scope.spy, 'mode.name');
}
// spy watchers
$scope.$watch('fullScreenSpy', applyClassNames);
$scope.$watchCollection('spy.mode', function () {
$scope.fullScreenSpy = shouldHaveFullSpy();
applyClassNames();
});
$scope.$watch('vis', prereq(function (vis, oldVis) {
var $visEl = getVisEl();
if (!$visEl) return;
if (!attr.editableVis) {
$scope.editableVis = vis;
}
if (oldVis) $scope.renderbot = null;
if (vis) $scope.renderbot = vis.type.createRenderbot(vis, $visEl, $scope.uiState);
}));
$scope.$watchCollection('vis.params', prereq(function () {
if ($scope.renderbot) $scope.renderbot.updateParams();
}));
$scope.$watch('searchSource', prereq(function (searchSource) {
if (!searchSource || attr.esResp) return;
// TODO: we need to have some way to clean up result requests
searchSource.onResults().then(function onResults(resp) {
if ($scope.searchSource !== searchSource) return;
$scope.esResp = resp;
return searchSource.onResults().then(onResults);
}).catch(notify.fatal);
searchSource.onError(notify.error).catch(notify.fatal);
}));
$scope.$watch('esResp', prereq(function (resp, prevResp) {
if (!resp) return;
$scope.renderbot.render(resp);
}));
$scope.$watch('renderbot', function (newRenderbot, oldRenderbot) {
if (oldRenderbot && newRenderbot !== oldRenderbot) {
oldRenderbot.destroy();
}
});
$scope.$on('$destroy', function () {
if ($scope.renderbot) {
$scope.renderbot.destroy();
}
});
}
};
});
});