diff --git a/public/app/core/components/search/search.html b/public/app/core/components/search/search.html index 3b0d9c003dd..c458aa51906 100644 --- a/public/app/core/components/search/search.html +++ b/public/app/core/components/search/search.html @@ -24,7 +24,9 @@
No dashboards matching your query were found.
+ on-tag-selected="ctrl.filterByTag($tag)" + on-folder-expanding="ctrl.folderExpanding()" + on-folder-expanded="ctrl.folderExpanded($folder)" /> diff --git a/public/app/core/components/search/search.ts b/public/app/core/components/search/search.ts index 08d050c81bf..ffbec30cc0a 100644 --- a/public/app/core/components/search/search.ts +++ b/public/app/core/components/search/search.ts @@ -102,6 +102,11 @@ export class SearchCtrl { } } + if (direction === 0) { + this.selectedIndex = -1; + return; + } + const max = flattenedResult.length; let newIndex = this.selectedIndex + direction; this.selectedIndex = ((newIndex %= max) < 0) ? newIndex + max : newIndex; @@ -182,6 +187,10 @@ export class SearchCtrl { this.searchDashboards(); } + folderExpanding() { + this.moveSelection(0); + } + private getFlattenedResultForNavigation() { let folderIndex = 0; diff --git a/public/app/core/components/search/search_results.jest.ts b/public/app/core/components/search/search_results.jest.ts index fc661dc8472..514eff21dab 100644 --- a/public/app/core/components/search/search_results.jest.ts +++ b/public/app/core/components/search/search_results.jest.ts @@ -55,21 +55,43 @@ describe('SearchResultsCtrl', () => { }); }); - describe('when toggle a folder', () => { - let folderToggled = false; - let folder = { - toggle: () => { - folderToggled = true; - } - }; + describe('when toggle a collapsed folder', () => { + let folderExpanded = false; beforeEach(() => { ctrl = new SearchResultsCtrl({}); + ctrl.onFolderExpanding = () => { folderExpanded = true; }; + + let folder = { + expanded: false, + toggle: () => {} + }; + ctrl.toggleFolderExpand(folder); }); - it('should trigger folder toggle callback', () => { - expect(folderToggled).toBeTruthy(); + it('should trigger folder expanding callback', () => { + expect(folderExpanded).toBeTruthy(); + }); + }); + + describe('when toggle an expanded folder', () => { + let folderExpanded = false; + + beforeEach(() => { + ctrl = new SearchResultsCtrl({}); + ctrl.onFolderExpanding = () => { folderExpanded = true; }; + + let folder = { + expanded: true, + toggle: () => {} + }; + + ctrl.toggleFolderExpand(folder); + }); + + it('should not trigger folder expanding callback', () => { + expect(folderExpanded).toBeFalsy(); }); }); }); diff --git a/public/app/core/components/search/search_results.ts b/public/app/core/components/search/search_results.ts index 0757a53a517..02b6c9f355b 100644 --- a/public/app/core/components/search/search_results.ts +++ b/public/app/core/components/search/search_results.ts @@ -5,6 +5,7 @@ export class SearchResultsCtrl { results: any; onSelectionChanged: any; onTagSelected: any; + onFolderExpanding: any; /** @ngInject */ constructor(private $location) { @@ -13,6 +14,10 @@ export class SearchResultsCtrl { toggleFolderExpand(section) { if (section.toggle) { + if (!section.expanded && this.onFolderExpanding) { + this.onFolderExpanding(); + } + section.toggle(section); } } @@ -62,7 +67,8 @@ export function searchResultsDirective() { editable: '@', results: '=', onSelectionChanged: '&', - onTagSelected: '&' + onTagSelected: '&', + onFolderExpanding: '&' }, }; } diff --git a/public/app/core/services/search_srv.ts b/public/app/core/services/search_srv.ts index 38aeea47b79..52f008e1812 100644 --- a/public/app/core/services/search_srv.ts +++ b/public/app/core/services/search_srv.ts @@ -51,7 +51,7 @@ export class SearchSrv { store.set('search.sections.recent', this.recentIsOpen); if (!section.expanded || section.items.length) { - return; + return Promise.resolve(); } return this.queryForRecentDashboards().then(result => { @@ -62,6 +62,7 @@ export class SearchSrv { private toggleStarred(section) { this.starredIsOpen = section.expanded = !section.expanded; store.set('search.sections.starred', this.starredIsOpen); + return Promise.resolve(); } private getStarred(sections) { @@ -189,7 +190,7 @@ export class SearchSrv { section.icon = section.expanded ? 'fa fa-folder-open' : 'fa fa-folder'; if (section.items.length) { - return; + return Promise.resolve(); } let query = {