瀏覽代碼

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.
Daniel Lee 8 年之前
父節點
當前提交
53d11d50fc

+ 0 - 2
pkg/api/search.go

@@ -14,7 +14,6 @@ func Search(c *middleware.Context) {
 	tags := c.QueryStrings("tag")
 	starred := c.Query("starred")
 	limit := c.QueryInt("limit")
-	browseMode := c.Query("browseMode")
 
 	if limit == 0 {
 		limit = 1000
@@ -36,7 +35,6 @@ func Search(c *middleware.Context) {
 		IsStarred:    starred == "true",
 		OrgId:        c.OrgId,
 		DashboardIds: dbids,
-		BrowseMode:   browseMode == "true",
 	}
 
 	err := bus.Dispatch(&searchQuery)

+ 0 - 1
pkg/services/search/handlers.go

@@ -45,7 +45,6 @@ func searchHandler(query *Query) error {
 		IsStarred:    query.IsStarred,
 		OrgId:        query.OrgId,
 		DashboardIds: query.DashboardIds,
-		BrowseMode:   query.BrowseMode,
 	}
 
 	if err := bus.Dispatch(&dashQuery); err != nil {

+ 0 - 12
pkg/services/search/handlers_test.go

@@ -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)
-			})
-
-		})
 	})
 }

+ 0 - 2
pkg/services/search/models.go

@@ -47,7 +47,6 @@ type Query struct {
 	Limit        int
 	IsStarred    bool
 	DashboardIds []int
-	BrowseMode   bool
 
 	Result HitList
 }
@@ -58,7 +57,6 @@ type FindPersistedDashboardsQuery struct {
 	UserId       int64
 	IsStarred    bool
 	DashboardIds []int
-	BrowseMode   bool
 
 	Result HitList
 }

+ 35 - 3
pkg/services/sqlstore/dashboard.go

@@ -218,6 +218,11 @@ func SearchDashboards(query *search.FindPersistedDashboardsQuery) error {
 		return err
 	}
 
+	res, err = appendDashboardFolders(res)
+	if err != nil {
+		return err
+	}
+
 	query.Result = make([]*search.Hit, 0)
 	hits := make(map[int64]*search.Hit)
 
@@ -240,13 +245,40 @@ func SearchDashboards(query *search.FindPersistedDashboardsQuery) error {
 		}
 	}
 
-	if query.BrowseMode {
-		convertToDashboardFolders(query)
-	}
+	convertToDashboardFolders(query)
 
 	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 {
 	var hitType search.HitType
 	if item.IsFolder {

+ 7 - 22
pkg/services/sqlstore/dashboard_test.go

@@ -114,7 +114,7 @@ func TestDashboardDataAccess(t *testing.T) {
 				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{
 					Title: "test dash 23",
 					OrgId: 1,
@@ -124,10 +124,12 @@ func TestDashboardDataAccess(t *testing.T) {
 				So(err, ShouldBeNil)
 
 				So(len(query.Result), ShouldEqual, 1)
-				hit := query.Result[0]
+				hit := query.Result[0].Dashboards[0]
+
 				So(len(hit.Tags), ShouldEqual, 2)
 				So(hit.Type, ShouldEqual, search.DashHitDB)
 				So(hit.ParentId, ShouldBeGreaterThan, 0)
+
 			})
 
 			Convey("Should be able to search for dashboard folder", func() {
@@ -144,23 +146,6 @@ func TestDashboardDataAccess(t *testing.T) {
 				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 find two dashboards by id", func() {
 					query := search.FindPersistedDashboardsQuery{
@@ -171,12 +156,12 @@ func TestDashboardDataAccess(t *testing.T) {
 					err := SearchDashboards(&query)
 					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)
 
-					hit2 := query.Result[1]
+					hit2 := query.Result[0].Dashboards[1]
 					So(len(hit2.Tags), ShouldEqual, 1)
 				})
 

+ 1 - 1
public/app/core/components/search/search.html

@@ -57,7 +57,7 @@
 			<h6 ng-hide="ctrl.results.length">No dashboards matching your query were found.</h6>
 
     <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}}">
 
         <span class="search-result-tags">

+ 0 - 4
public/app/core/components/search/search.ts

@@ -20,7 +20,6 @@ export class SearchCtrl {
   ignoreClose: any;
   // triggers fade animation class
   openCompleted: boolean;
-  searchMode = 'browse';
 
   /** @ngInject */
   constructor(private $scope, private $location, private $timeout, private backendSrv, private contextSrv, private $rootScope) {
@@ -105,9 +104,6 @@ export class SearchCtrl {
     this.currentSearchId = this.currentSearchId + 1;
     var localSearchId = this.currentSearchId;
 
-    this.query.browseMode = this.queryHasNoFilters();
-    this.searchMode = this.queryHasNoFilters() ? 'browse': 'search';
-
     return this.backendSrv.search(this.query).then((results) => {
       if (localSearchId < this.currentSearchId) { return; }
 

+ 1 - 5
public/sass/components/_search.scss

@@ -146,14 +146,10 @@
   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";
 }
 
-.search-item-dash-folder.search-results-search-mode > .search-result-link > .search-result-icon::before {
-  content: "\f07b";
-}
-
 .search-button-row {
   padding: $spacer*2;
   display: flex;