diff --git a/src/plugins/kibana/public/dashboard/index.js b/src/plugins/kibana/public/dashboard/index.js
index e8322ea212c16..40fbd0934ebce 100644
--- a/src/plugins/kibana/public/dashboard/index.js
+++ b/src/plugins/kibana/public/dashboard/index.js
@@ -6,7 +6,6 @@ import 'ui/courier';
import 'ui/config';
import 'ui/notify';
import 'ui/typeahead';
-import 'ui/navbar_extensions';
import 'ui/share';
import 'plugins/kibana/dashboard/directives/grid';
import 'plugins/kibana/dashboard/components/panel/panel';
diff --git a/src/plugins/kibana/public/discover/index.js b/src/plugins/kibana/public/discover/index.js
index 2888306ae454f..0a11459aa5602 100644
--- a/src/plugins/kibana/public/discover/index.js
+++ b/src/plugins/kibana/public/discover/index.js
@@ -1,7 +1,6 @@
import 'plugins/kibana/discover/saved_searches/saved_searches';
import 'plugins/kibana/discover/directives/no_results';
import 'plugins/kibana/discover/directives/timechart';
-import 'ui/navbar_extensions';
import 'ui/collapsible_sidebar';
import 'plugins/kibana/discover/components/field_chooser/field_chooser';
import 'plugins/kibana/discover/controllers/discover';
diff --git a/src/plugins/kibana/public/visualize/editor/editor.js b/src/plugins/kibana/public/visualize/editor/editor.js
index 580bbb0aec632..552f6c01c4b8f 100644
--- a/src/plugins/kibana/public/visualize/editor/editor.js
+++ b/src/plugins/kibana/public/visualize/editor/editor.js
@@ -2,7 +2,6 @@ import _ from 'lodash';
import 'plugins/kibana/visualize/saved_visualizations/saved_visualizations';
import 'plugins/kibana/visualize/editor/sidebar';
import 'plugins/kibana/visualize/editor/agg_filter';
-import 'ui/navbar_extensions';
import 'ui/visualize';
import 'ui/collapsible_sidebar';
import 'ui/share';
diff --git a/src/ui/public/kbn_top_nav/__tests__/kbn_top_nav.js b/src/ui/public/kbn_top_nav/__tests__/kbn_top_nav.js
index 57b23e6a5b4af..8d3b213db66db 100644
--- a/src/ui/public/kbn_top_nav/__tests__/kbn_top_nav.js
+++ b/src/ui/public/kbn_top_nav/__tests__/kbn_top_nav.js
@@ -7,7 +7,6 @@ import '../kbn_top_nav';
import KbnTopNavControllerProvider from '../kbn_top_nav_controller';
import navbarExtensionsRegistry from 'ui/registry/navbar_extensions';
import Registry from 'ui/registry/_registry';
-import 'ui/navbar_extensions';
describe('kbnTopNav directive', function () {
let build;
@@ -31,7 +30,7 @@ describe('kbnTopNav directive', function () {
const { $scope } = build();
expect($scope.kbnTopNav.open).to.be.a(Function);
expect($scope.kbnTopNav.close).to.be.a(Function);
- expect($scope.kbnTopNav.is).to.be.a(Function);
+ expect($scope.kbnTopNav.getCurrent).to.be.a(Function);
expect($scope.kbnTopNav.toggle).to.be.a(Function);
});
diff --git a/src/ui/public/kbn_top_nav/__tests__/kbn_top_nav_controller.js b/src/ui/public/kbn_top_nav/__tests__/kbn_top_nav_controller.js
index 5b4f86333ef08..7a72d3e3754f4 100644
--- a/src/ui/public/kbn_top_nav/__tests__/kbn_top_nav_controller.js
+++ b/src/ui/public/kbn_top_nav/__tests__/kbn_top_nav_controller.js
@@ -94,11 +94,11 @@ describe('KbnTopNavController', function () {
const opt = controller.opts[0];
expect(opt.run).to.be.a('function');
- expect(controller.which()).to.not.be(opt.key);
+ expect(controller.getCurrent()).to.not.be(opt.key);
opt.run(opt);
- expect(controller.which()).to.be(opt.key);
+ expect(controller.getCurrent()).to.be(opt.key);
opt.run(opt);
- expect(controller.which()).to.not.be(opt.key);
+ expect(controller.getCurrent()).to.not.be(opt.key);
});
it('uses the supplied run function otherwise', function (done) { // eslint-disable-line mocha/handle-done-callback
@@ -112,82 +112,82 @@ describe('KbnTopNavController', function () {
});
});
- describe('', function () {
+ describe('methods', function () {
const init = function () {
const controller = new KbnTopNavController([
{ key: 'foo', template: 'Say Foo!' },
{ key: 'bar', template: 'Whisper Bar' },
]);
const render = sinon.spy(controller, '_render');
- const set = sinon.spy(controller, 'set');
- const is = sinon.spy(controller, 'is');
+ const setCurrent = sinon.spy(controller, 'setCurrent');
+ const getCurrent = sinon.spy(controller, 'getCurrent');
- return { controller, render, set };
+ return { controller, render, setCurrent, getCurrent };
};
- describe('#set([key])', function () {
+ describe('#setCurrent([key])', function () {
it('assigns the passed key to the current key', function () {
const { controller } = init();
- expect(controller.which()).to.not.be('foo');
- controller.set('foo');
- expect(controller.which()).to.be('foo');
+ expect(controller.getCurrent()).to.not.be('foo');
+ controller.setCurrent('foo');
+ expect(controller.getCurrent()).to.be('foo');
});
it('throws if the key does not match a known template', function () {
const { controller } = init();
expect(function () {
- controller.set('june');
+ controller.setCurrent('june');
}).to.throwError(/unknown template key/);
});
it('sets to "null" for falsy values', function () {
const { controller } = init();
- controller.set();
- expect(controller.which()).to.be(null);
+ controller.setCurrent();
+ expect(controller.getCurrent()).to.be(null);
- controller.set(false);
- expect(controller.which()).to.be(null);
+ controller.setCurrent(false);
+ expect(controller.getCurrent()).to.be(null);
- controller.set(null);
- expect(controller.which()).to.be(null);
+ controller.setCurrent(null);
+ expect(controller.getCurrent()).to.be(null);
- controller.set('');
- expect(controller.which()).to.be(null);
+ controller.setCurrent('');
+ expect(controller.getCurrent()).to.be(null);
});
it('rerenders after setting', function () {
const { controller, render } = init();
sinon.assert.notCalled(render);
- controller.set('bar');
+ controller.setCurrent('bar');
sinon.assert.calledOnce(render);
- controller.set('bar');
+ controller.setCurrent('bar');
sinon.assert.calledTwice(render);
});
});
- describe('#is(key)', function () {
+ describe('#isCurrent(key)', function () {
it('returns true when key matches', function () {
const { controller } = init();
- controller.set('foo');
- expect(controller.is('foo')).to.be(true);
- expect(controller.is('bar')).to.be(false);
+ controller.setCurrent('foo');
+ expect(controller.isCurrent('foo')).to.be(true);
+ expect(controller.isCurrent('bar')).to.be(false);
- controller.set('bar');
- expect(controller.is('bar')).to.be(true);
- expect(controller.is('foo')).to.be(false);
+ controller.setCurrent('bar');
+ expect(controller.isCurrent('bar')).to.be(true);
+ expect(controller.isCurrent('foo')).to.be(false);
});
});
describe('#open(key)', function () {
it('alias for set', function () {
- const { controller, set } = init();
+ const { controller, setCurrent } = init();
controller.open('foo');
- sinon.assert.calledOnce(set);
- sinon.assert.calledWithExactly(set, 'foo');
+ sinon.assert.calledOnce(setCurrent);
+ sinon.assert.calledWithExactly(setCurrent, 'foo');
});
});
@@ -197,7 +197,7 @@ describe('KbnTopNavController', function () {
controller.open('foo');
controller.close();
- expect(controller.which()).to.be(null);
+ expect(controller.getCurrent()).to.be(null);
});
});
@@ -205,23 +205,23 @@ describe('KbnTopNavController', function () {
it('sets to null if key is open', function () {
const { controller } = init();
- expect(controller.which()).to.be(null);
+ expect(controller.getCurrent()).to.be(null);
controller.close('foo');
- expect(controller.which()).to.be(null);
+ expect(controller.getCurrent()).to.be(null);
controller.open('foo');
- expect(controller.which()).to.be('foo');
+ expect(controller.getCurrent()).to.be('foo');
controller.close('foo');
- expect(controller.which()).to.be(null);
+ expect(controller.getCurrent()).to.be(null);
});
it('ignores if other key is open', function () {
const { controller } = init();
- expect(controller.which()).to.be(null);
+ expect(controller.getCurrent()).to.be(null);
controller.open('foo');
- expect(controller.which()).to.be('foo');
+ expect(controller.getCurrent()).to.be('foo');
controller.close('bar');
- expect(controller.which()).to.be('foo');
+ expect(controller.getCurrent()).to.be('foo');
});
});
@@ -229,28 +229,70 @@ describe('KbnTopNavController', function () {
it('opens if closed', function () {
const { controller } = init();
- expect(controller.which()).to.be(null);
+ expect(controller.getCurrent()).to.be(null);
controller.toggle('foo');
- expect(controller.which()).to.be('foo');
+ expect(controller.getCurrent()).to.be('foo');
});
it('opens if other is open', function () {
const { controller } = init();
controller.open('bar');
- expect(controller.which()).to.be('bar');
+ expect(controller.getCurrent()).to.be('bar');
controller.toggle('foo');
- expect(controller.which()).to.be('foo');
+ expect(controller.getCurrent()).to.be('foo');
});
it('closes if open', function () {
const { controller } = init();
controller.open('bar');
- expect(controller.which()).to.be('bar');
+ expect(controller.getCurrent()).to.be('bar');
controller.toggle('bar');
- expect(controller.which()).to.be(null);
+ expect(controller.getCurrent()).to.be(null);
});
});
+
+ describe('#addItems(opts)', function () {
+ it('should append to existing menu items', function () {
+ const { controller } = init();
+ const newItems = [
+ { key: 'green', template: 'Green means go' },
+ { key: 'red', template: 'Red means stop' },
+ ];
+
+ expect(controller.menuItems).to.have.length(2);
+ controller.addItems(newItems);
+ expect(controller.menuItems).to.have.length(4);
+
+ // check that the items were added
+ var matches = controller.menuItems.reduce((acc, item) => {
+ if (item.key === 'green' || item.key === 'red') {
+ acc[item.key] = item;
+ }
+ return acc;
+ }, {});
+ expect(matches).to.have.property('green');
+ expect(matches.green).to.have.property('run');
+ expect(matches).to.have.property('red');
+ expect(matches.red).to.have.property('run');
+ });
+
+ it('should take a single menu item object', function () {
+ const { controller } = init();
+ const newItem = { key: 'green', template: 'Green means go' };
+
+ expect(controller.menuItems).to.have.length(2);
+ controller.addItems(newItem);
+ expect(controller.menuItems).to.have.length(3);
+
+ // check that the items were added
+ var match = controller.menuItems.filter((item) => {
+ return item.key === 'green';
+ });
+ expect(match[0]).to.have.property('run');
+ });
+ });
+
});
});
diff --git a/src/ui/public/kbn_top_nav/kbn_top_nav.html b/src/ui/public/kbn_top_nav/kbn_top_nav.html
new file mode 100644
index 0000000000000..5bfc1cfaf7ae1
--- /dev/null
+++ b/src/ui/public/kbn_top_nav/kbn_top_nav.html
@@ -0,0 +1,21 @@
+