浏览代码

WIP: dashboard search by folder + toggle for list or tree mode

Daniel Lee 8 年之前
父节点
当前提交
c602afb9c6

+ 8 - 0
pkg/api/search.go

@@ -15,11 +15,17 @@ func Search(c *middleware.Context) {
 	starred := c.Query("starred")
 	limit := c.QueryInt("limit")
 	dashboardType := c.Query("type")
+	folderId := c.QueryInt64("folderId")
+	mode := c.Query("mode")
 
 	if limit == 0 {
 		limit = 1000
 	}
 
+	if mode == "" {
+		mode = "list"
+	}
+
 	dbids := make([]int, 0)
 	for _, id := range c.QueryStrings("dashboardIds") {
 		dashboardId, err := strconv.Atoi(id)
@@ -37,6 +43,8 @@ func Search(c *middleware.Context) {
 		OrgId:        c.OrgId,
 		DashboardIds: dbids,
 		Type:         dashboardType,
+		FolderId:     folderId,
+		Mode:         mode,
 	}
 
 	err := bus.Dispatch(&searchQuery)

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

@@ -46,6 +46,8 @@ func searchHandler(query *Query) error {
 		OrgId:        query.OrgId,
 		DashboardIds: query.DashboardIds,
 		Type:         query.Type,
+		ParentId:     query.FolderId,
+		Mode:         query.Mode,
 	}
 
 	if err := bus.Dispatch(&dashQuery); err != nil {

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

@@ -48,6 +48,8 @@ type Query struct {
 	IsStarred    bool
 	Type         string
 	DashboardIds []int
+	FolderId     int64
+	Mode         string
 
 	Result HitList
 }
@@ -59,6 +61,8 @@ type FindPersistedDashboardsQuery struct {
 	IsStarred    bool
 	DashboardIds []int
 	Type         string
+	ParentId     int64
+	Mode         string
 
 	Result HitList
 }

+ 40 - 26
pkg/services/sqlstore/dashboard.go

@@ -25,7 +25,7 @@ func init() {
 func SaveDashboard(cmd *m.SaveDashboardCommand) error {
 	return inTransaction(func(sess *DBSession) error {
 		dash := cmd.GetDashboardModel()
-		fmt.Printf("ParentId: %v", dash.ParentId)
+
 		// try get existing dashboard
 		var existing, sameTitle m.Dashboard
 
@@ -209,9 +209,15 @@ func findDashboards(query *search.FindPersistedDashboardsQuery) ([]DashboardSear
 		sql.WriteString(" AND dashboard.is_folder = 0")
 	}
 
+	if query.ParentId > 0 {
+		sql.WriteString(" AND dashboard.parent_id = ?")
+		params = append(params, query.ParentId)
+	}
+
 	sql.WriteString(fmt.Sprintf(" ORDER BY dashboard.title ASC LIMIT 1000"))
 
 	var res []DashboardSearchProjection
+
 	err := x.Sql(sql.String(), params...).Find(&res)
 	if err != nil {
 		return nil, err
@@ -226,36 +232,20 @@ func SearchDashboards(query *search.FindPersistedDashboardsQuery) error {
 		return err
 	}
 
-	res, err = appendDashboardFolders(res)
-	if err != nil {
-		return err
+	if query.Mode == "tree" {
+		res, err = appendDashboardFolders(res)
+		if err != nil {
+			return err
+		}
 	}
 
-	query.Result = make([]*search.Hit, 0)
-	hits := make(map[int64]*search.Hit)
+	makeQueryResult(query, res)
 
-	for _, item := range res {
-		hit, exists := hits[item.Id]
-		if !exists {
-			hit = &search.Hit{
-				Id:       item.Id,
-				Title:    item.Title,
-				Uri:      "db/" + item.Slug,
-				Type:     getHitType(item),
-				ParentId: item.ParentId,
-				Tags:     []string{},
-			}
-			query.Result = append(query.Result, hit)
-			hits[item.Id] = hit
-		}
-		if len(item.Term) > 0 {
-			hit.Tags = append(hit.Tags, item.Term)
-		}
+	if query.Mode == "tree" {
+		convertToDashboardFolders(query)
 	}
 
-	convertToDashboardFolders(query)
-
-	return err
+	return nil
 }
 
 // appends parent folders for any hits to the search result
@@ -298,6 +288,30 @@ func getHitType(item DashboardSearchProjection) search.HitType {
 	return hitType
 }
 
+func makeQueryResult(query *search.FindPersistedDashboardsQuery, res []DashboardSearchProjection) {
+	query.Result = make([]*search.Hit, 0)
+	hits := make(map[int64]*search.Hit)
+
+	for _, item := range res {
+		hit, exists := hits[item.Id]
+		if !exists {
+			hit = &search.Hit{
+				Id:       item.Id,
+				Title:    item.Title,
+				Uri:      "db/" + item.Slug,
+				Type:     getHitType(item),
+				ParentId: item.ParentId,
+				Tags:     []string{},
+			}
+			query.Result = append(query.Result, hit)
+			hits[item.Id] = hit
+		}
+		if len(item.Term) > 0 {
+			hit.Tags = append(hit.Tags, item.Term)
+		}
+	}
+}
+
 func convertToDashboardFolders(query *search.FindPersistedDashboardsQuery) error {
 	root := make(map[int64]*search.Hit)
 	var keys []int64

+ 16 - 0
pkg/services/sqlstore/dashboard_test.go

@@ -118,6 +118,7 @@ func TestDashboardDataAccess(t *testing.T) {
 				query := search.FindPersistedDashboardsQuery{
 					Title: "test dash 23",
 					OrgId: 1,
+					Mode:  "tree",
 				}
 
 				err := SearchDashboards(&query)
@@ -146,11 +147,26 @@ func TestDashboardDataAccess(t *testing.T) {
 				So(hit.Type, ShouldEqual, search.DashHitFolder)
 			})
 
+			Convey("Should be able to search for a dashboard folder's children", func() {
+				query := search.FindPersistedDashboardsQuery{
+					OrgId:    1,
+					ParentId: savedFolder.Id,
+				}
+
+				err := SearchDashboards(&query)
+				So(err, ShouldBeNil)
+
+				So(len(query.Result), ShouldEqual, 2)
+				hit := query.Result[0]
+				So(hit.Id, ShouldEqual, savedDash.Id)
+			})
+
 			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{
 						DashboardIds: []int{2, 3},
 						OrgId:        1,
+						Mode:         "tree",
 					}
 
 					err := SearchDashboards(&query)