mirror of
				https://github.com/grafana/grafana.git
				synced 2025-02-25 18:55:37 -06:00 
			
		
		
		
	WIP: dashboard search by folder + toggle for list or tree mode
This commit is contained in:
		| @@ -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) | ||||
|   | ||||
| @@ -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 { | ||||
|   | ||||
| @@ -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 | ||||
| } | ||||
|   | ||||
| @@ -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 | ||||
| 	} | ||||
|  | ||||
| 	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) | ||||
| 	if query.Mode == "tree" { | ||||
| 		res, err = appendDashboardFolders(res) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	convertToDashboardFolders(query) | ||||
| 	makeQueryResult(query, res) | ||||
|  | ||||
| 	return err | ||||
| 	if query.Mode == "tree" { | ||||
| 		convertToDashboardFolders(query) | ||||
| 	} | ||||
|  | ||||
| 	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 | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user