Commit 53d11d50 by Daniel Lee

WIP: remove browse mode for dashboard search

Dashboard folders included in all searches. If a dashboard matches
a search and has a parent folder then the parent folder is appended
to the search result. A hierarchy is then returned in the result
with child dashboards under their parent folders.
parent f1e1da39
...@@ -14,7 +14,6 @@ func Search(c *middleware.Context) { ...@@ -14,7 +14,6 @@ func Search(c *middleware.Context) {
tags := c.QueryStrings("tag") tags := c.QueryStrings("tag")
starred := c.Query("starred") starred := c.Query("starred")
limit := c.QueryInt("limit") limit := c.QueryInt("limit")
browseMode := c.Query("browseMode")
if limit == 0 { if limit == 0 {
limit = 1000 limit = 1000
...@@ -36,7 +35,6 @@ func Search(c *middleware.Context) { ...@@ -36,7 +35,6 @@ func Search(c *middleware.Context) {
IsStarred: starred == "true", IsStarred: starred == "true",
OrgId: c.OrgId, OrgId: c.OrgId,
DashboardIds: dbids, DashboardIds: dbids,
BrowseMode: browseMode == "true",
} }
err := bus.Dispatch(&searchQuery) err := bus.Dispatch(&searchQuery)
......
...@@ -45,7 +45,6 @@ func searchHandler(query *Query) error { ...@@ -45,7 +45,6 @@ func searchHandler(query *Query) error {
IsStarred: query.IsStarred, IsStarred: query.IsStarred,
OrgId: query.OrgId, OrgId: query.OrgId,
DashboardIds: query.DashboardIds, DashboardIds: query.DashboardIds,
BrowseMode: query.BrowseMode,
} }
if err := bus.Dispatch(&dashQuery); err != nil { if err := bus.Dispatch(&dashQuery); err != nil {
......
...@@ -68,17 +68,5 @@ func TestSearch(t *testing.T) { ...@@ -68,17 +68,5 @@ func TestSearch(t *testing.T) {
}) })
}) })
Convey("That returns result in browse mode", func() {
query.BrowseMode = true
err := searchHandler(&query)
So(err, ShouldBeNil)
Convey("should return correct results", func() {
So(query.Result[0].Title, ShouldEqual, "FOLDER")
So(len(query.Result[0].Dashboards), ShouldEqual, 1)
})
})
}) })
} }
...@@ -47,7 +47,6 @@ type Query struct { ...@@ -47,7 +47,6 @@ type Query struct {
Limit int Limit int
IsStarred bool IsStarred bool
DashboardIds []int DashboardIds []int
BrowseMode bool
Result HitList Result HitList
} }
...@@ -58,7 +57,6 @@ type FindPersistedDashboardsQuery struct { ...@@ -58,7 +57,6 @@ type FindPersistedDashboardsQuery struct {
UserId int64 UserId int64
IsStarred bool IsStarred bool
DashboardIds []int DashboardIds []int
BrowseMode bool
Result HitList Result HitList
} }
...@@ -218,6 +218,11 @@ func SearchDashboards(query *search.FindPersistedDashboardsQuery) error { ...@@ -218,6 +218,11 @@ func SearchDashboards(query *search.FindPersistedDashboardsQuery) error {
return err return err
} }
res, err = appendDashboardFolders(res)
if err != nil {
return err
}
query.Result = make([]*search.Hit, 0) query.Result = make([]*search.Hit, 0)
hits := make(map[int64]*search.Hit) hits := make(map[int64]*search.Hit)
...@@ -240,13 +245,40 @@ func SearchDashboards(query *search.FindPersistedDashboardsQuery) error { ...@@ -240,13 +245,40 @@ func SearchDashboards(query *search.FindPersistedDashboardsQuery) error {
} }
} }
if query.BrowseMode { convertToDashboardFolders(query)
convertToDashboardFolders(query)
}
return err return err
} }
// appends parent folders for any hits to the search result
func appendDashboardFolders(res []DashboardSearchProjection) ([]DashboardSearchProjection, error) {
var dashboardFolderIds []int64
for _, item := range res {
if item.ParentId > 0 {
dashboardFolderIds = append(dashboardFolderIds, item.ParentId)
}
}
if len(dashboardFolderIds) > 0 {
folderQuery := &m.GetDashboardsQuery{DashboardIds: dashboardFolderIds}
err := GetDashboards(folderQuery)
if err != nil {
return nil, err
}
for _, folder := range folderQuery.Result {
res = append(res, DashboardSearchProjection{
Id: folder.Id,
IsFolder: true,
Slug: folder.Slug,
Title: folder.Title,
})
}
}
return res, nil
}
func getHitType(item DashboardSearchProjection) search.HitType { func getHitType(item DashboardSearchProjection) search.HitType {
var hitType search.HitType var hitType search.HitType
if item.IsFolder { if item.IsFolder {
......
...@@ -114,7 +114,7 @@ func TestDashboardDataAccess(t *testing.T) { ...@@ -114,7 +114,7 @@ func TestDashboardDataAccess(t *testing.T) {
So(err, ShouldNotBeNil) So(err, ShouldNotBeNil)
}) })
Convey("Should be able to search for dashboard", func() { Convey("Should be able to search for dashboard and return in folder hierarchy", func() {
query := search.FindPersistedDashboardsQuery{ query := search.FindPersistedDashboardsQuery{
Title: "test dash 23", Title: "test dash 23",
OrgId: 1, OrgId: 1,
...@@ -124,10 +124,12 @@ func TestDashboardDataAccess(t *testing.T) { ...@@ -124,10 +124,12 @@ func TestDashboardDataAccess(t *testing.T) {
So(err, ShouldBeNil) So(err, ShouldBeNil)
So(len(query.Result), ShouldEqual, 1) So(len(query.Result), ShouldEqual, 1)
hit := query.Result[0] hit := query.Result[0].Dashboards[0]
So(len(hit.Tags), ShouldEqual, 2) So(len(hit.Tags), ShouldEqual, 2)
So(hit.Type, ShouldEqual, search.DashHitDB) So(hit.Type, ShouldEqual, search.DashHitDB)
So(hit.ParentId, ShouldBeGreaterThan, 0) So(hit.ParentId, ShouldBeGreaterThan, 0)
}) })
Convey("Should be able to search for dashboard folder", func() { Convey("Should be able to search for dashboard folder", func() {
...@@ -144,23 +146,6 @@ func TestDashboardDataAccess(t *testing.T) { ...@@ -144,23 +146,6 @@ func TestDashboardDataAccess(t *testing.T) {
So(hit.Type, ShouldEqual, search.DashHitFolder) So(hit.Type, ShouldEqual, search.DashHitFolder)
}) })
Convey("Should be able to browse dashboard folders", func() {
query := search.FindPersistedDashboardsQuery{
OrgId: 1,
BrowseMode: true,
}
err := SearchDashboards(&query)
So(err, ShouldBeNil)
So(len(query.Result), ShouldEqual, 2)
hit := query.Result[0]
So(hit.Type, ShouldEqual, search.DashHitFolder)
So(len(hit.Dashboards), ShouldEqual, 2)
So(hit.Dashboards[0].Title, ShouldEqual, "test dash 23")
})
Convey("Should be able to search for dashboard by dashboard ids", func() { Convey("Should be able to search for dashboard by dashboard ids", func() {
Convey("should be able to find two dashboards by id", func() { Convey("should be able to find two dashboards by id", func() {
query := search.FindPersistedDashboardsQuery{ query := search.FindPersistedDashboardsQuery{
...@@ -171,12 +156,12 @@ func TestDashboardDataAccess(t *testing.T) { ...@@ -171,12 +156,12 @@ func TestDashboardDataAccess(t *testing.T) {
err := SearchDashboards(&query) err := SearchDashboards(&query)
So(err, ShouldBeNil) So(err, ShouldBeNil)
So(len(query.Result), ShouldEqual, 2) So(len(query.Result[0].Dashboards), ShouldEqual, 2)
hit := query.Result[0] hit := query.Result[0].Dashboards[0]
So(len(hit.Tags), ShouldEqual, 2) So(len(hit.Tags), ShouldEqual, 2)
hit2 := query.Result[1] hit2 := query.Result[0].Dashboards[1]
So(len(hit2.Tags), ShouldEqual, 1) So(len(hit2.Tags), ShouldEqual, 1)
}) })
......
...@@ -57,7 +57,7 @@ ...@@ -57,7 +57,7 @@
<h6 ng-hide="ctrl.results.length">No dashboards matching your query were found.</h6> <h6 ng-hide="ctrl.results.length">No dashboards matching your query were found.</h6>
<div bindonce ng-repeat="row in ctrl.results"> <div bindonce ng-repeat="row in ctrl.results">
<a class="search-item pointer search-item-{{row.type}} search-results-{{ctrl.searchMode}}-mode" <a class="search-item pointer search-item-{{row.type}}"
ng-class="{'selected': $index == ctrl.selectedIndex}" ng-href="{{row.url}}"> ng-class="{'selected': $index == ctrl.selectedIndex}" ng-href="{{row.url}}">
<span class="search-result-tags"> <span class="search-result-tags">
......
...@@ -20,7 +20,6 @@ export class SearchCtrl { ...@@ -20,7 +20,6 @@ export class SearchCtrl {
ignoreClose: any; ignoreClose: any;
// triggers fade animation class // triggers fade animation class
openCompleted: boolean; openCompleted: boolean;
searchMode = 'browse';
/** @ngInject */ /** @ngInject */
constructor(private $scope, private $location, private $timeout, private backendSrv, private contextSrv, private $rootScope) { constructor(private $scope, private $location, private $timeout, private backendSrv, private contextSrv, private $rootScope) {
...@@ -105,9 +104,6 @@ export class SearchCtrl { ...@@ -105,9 +104,6 @@ export class SearchCtrl {
this.currentSearchId = this.currentSearchId + 1; this.currentSearchId = this.currentSearchId + 1;
var localSearchId = this.currentSearchId; var localSearchId = this.currentSearchId;
this.query.browseMode = this.queryHasNoFilters();
this.searchMode = this.queryHasNoFilters() ? 'browse': 'search';
return this.backendSrv.search(this.query).then((results) => { return this.backendSrv.search(this.query).then((results) => {
if (localSearchId < this.currentSearchId) { return; } if (localSearchId < this.currentSearchId) { return; }
......
...@@ -146,14 +146,10 @@ ...@@ -146,14 +146,10 @@
content: "\f015"; content: "\f015";
} }
.search-item-dash-folder.search-results-browse-mode > .search-result-link > .search-result-icon::before { .search-item-dash-folder > .search-result-link > .search-result-icon::before {
content: "\f07c"; content: "\f07c";
} }
.search-item-dash-folder.search-results-search-mode > .search-result-link > .search-result-icon::before {
content: "\f07b";
}
.search-button-row { .search-button-row {
padding: $spacer*2; padding: $spacer*2;
display: flex; display: flex;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment