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

142 lines (114 loc) 4.32 kB
define(function (require) { require('ui/modules') .get('kibana/directive') .directive('visualize', function (Notifier, SavedVis, indexPatterns, Private) { require('ui/visualize/spy'); require('ui/visualize/visualize.less'); var $ = require('jquery'); var _ = require('lodash'); var visTypes = Private(require('ui/registry/vis_types')); var notify = new Notifier({ location: 'Visualize' }); return { restrict: 'E', scope : { vis: '=', editableVis: '=?', esResp: '=?', searchSource: '=?' }, template: require('ui/visualize/visualize.html'), link: function ($scope, $el, attr) { var chart; // set in "vis" watcher var minVisChartHeight = 180; function getter(selector) { return function () { var $sel = $el.find(selector); if ($sel.size()) return $sel; }; } var getVisEl = getter('.visualize-chart'); var getSpyEl = getter('visualize-spy'); $scope.spy = {mode: false}; $scope.fullScreenSpy = false; var applyClassNames = function () { var $spyEl = getSpyEl(); var $visEl = getVisEl(); var fullSpy = ($scope.spy.mode && ($scope.spy.mode.fill || $scope.fullScreenSpy)); // external $el.toggleClass('only-visualization', !$scope.spy.mode); $el.toggleClass('visualization-and-spy', $scope.spy.mode && !fullSpy); $el.toggleClass('only-spy', Boolean(fullSpy)); if ($spyEl) $spyEl.toggleClass('only', Boolean(fullSpy)); // internal $visEl.toggleClass('spy-visible', Boolean($scope.spy.mode)); $visEl.toggleClass('spy-only', Boolean(fullSpy)); }; // 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'); } } }; }; }()); $scope.$watch('fullScreenSpy', applyClassNames); $scope.$watchCollection('spy.mode', function (spyMode, oldSpyMode) { var $visEl = getVisEl(); if (!$visEl) return; // if the spy has been opened, check chart height if (spyMode && !oldSpyMode) { $scope.fullScreenSpy = $visEl.height() < minVisChartHeight; } 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.$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(); } }); } }; }); });