mirror of
https://github.com/grafana/grafana.git
synced 2025-09-21 23:05:07 +08:00
working on dashboard search
This commit is contained in:
@ -15,7 +15,6 @@ func Search(c *middleware.Context) {
|
|||||||
starred := c.Query("starred")
|
starred := c.Query("starred")
|
||||||
limit := c.QueryInt("limit")
|
limit := c.QueryInt("limit")
|
||||||
dashboardType := c.Query("type")
|
dashboardType := c.Query("type")
|
||||||
folderId := c.QueryInt64("folderId")
|
|
||||||
|
|
||||||
if limit == 0 {
|
if limit == 0 {
|
||||||
limit = 1000
|
limit = 1000
|
||||||
@ -29,6 +28,14 @@ func Search(c *middleware.Context) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
folderIds := make([]int64, 0)
|
||||||
|
for _, id := range c.QueryStrings("folderIds") {
|
||||||
|
folderId, err := strconv.ParseInt(id, 10, 64)
|
||||||
|
if err == nil {
|
||||||
|
folderIds = append(folderIds, folderId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
searchQuery := search.Query{
|
searchQuery := search.Query{
|
||||||
Title: query,
|
Title: query,
|
||||||
Tags: tags,
|
Tags: tags,
|
||||||
@ -38,7 +45,7 @@ func Search(c *middleware.Context) {
|
|||||||
OrgId: c.OrgId,
|
OrgId: c.OrgId,
|
||||||
DashboardIds: dbids,
|
DashboardIds: dbids,
|
||||||
Type: dashboardType,
|
Type: dashboardType,
|
||||||
FolderId: folderId,
|
FolderIds: folderIds,
|
||||||
}
|
}
|
||||||
|
|
||||||
err := bus.Dispatch(&searchQuery)
|
err := bus.Dispatch(&searchQuery)
|
||||||
|
@ -18,7 +18,7 @@ func searchHandler(query *Query) error {
|
|||||||
IsStarred: query.IsStarred,
|
IsStarred: query.IsStarred,
|
||||||
DashboardIds: query.DashboardIds,
|
DashboardIds: query.DashboardIds,
|
||||||
Type: query.Type,
|
Type: query.Type,
|
||||||
FolderId: query.FolderId,
|
FolderIds: query.FolderIds,
|
||||||
Tags: query.Tags,
|
Tags: query.Tags,
|
||||||
Limit: query.Limit,
|
Limit: query.Limit,
|
||||||
}
|
}
|
||||||
|
@ -48,22 +48,21 @@ type Query struct {
|
|||||||
IsStarred bool
|
IsStarred bool
|
||||||
Type string
|
Type string
|
||||||
DashboardIds []int64
|
DashboardIds []int64
|
||||||
FolderId int64
|
FolderIds []int64
|
||||||
|
|
||||||
Result HitList
|
Result HitList
|
||||||
}
|
}
|
||||||
|
|
||||||
type FindPersistedDashboardsQuery struct {
|
type FindPersistedDashboardsQuery struct {
|
||||||
Title string
|
Title string
|
||||||
OrgId int64
|
OrgId int64
|
||||||
SignedInUser *models.SignedInUser
|
SignedInUser *models.SignedInUser
|
||||||
IsStarred bool
|
IsStarred bool
|
||||||
DashboardIds []int64
|
DashboardIds []int64
|
||||||
Type string
|
Type string
|
||||||
FolderId int64
|
FolderIds []int64
|
||||||
Tags []string
|
Tags []string
|
||||||
ExpandedFolders []int64
|
Limit int
|
||||||
Limit int
|
|
||||||
|
|
||||||
Result HitList
|
Result HitList
|
||||||
}
|
}
|
||||||
|
@ -207,12 +207,8 @@ func findDashboards(query *search.FindPersistedDashboardsQuery) ([]DashboardSear
|
|||||||
sb.WithType(query.Type)
|
sb.WithType(query.Type)
|
||||||
}
|
}
|
||||||
|
|
||||||
if query.FolderId > 0 {
|
if len(query.FolderIds) > 0 {
|
||||||
sb.WithFolderId(query.FolderId)
|
sb.WithFolderIds(query.FolderIds)
|
||||||
}
|
|
||||||
|
|
||||||
if len(query.ExpandedFolders) > 0 {
|
|
||||||
sb.WithExpandedFolders(query.ExpandedFolders)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var res []DashboardSearchProjection
|
var res []DashboardSearchProjection
|
||||||
|
@ -384,7 +384,7 @@ func TestDashboardDataAccess(t *testing.T) {
|
|||||||
|
|
||||||
Convey("and one folder is expanded, the other collapsed", func() {
|
Convey("and one folder is expanded, the other collapsed", func() {
|
||||||
Convey("should return dashboards in root and expanded folder", func() {
|
Convey("should return dashboards in root and expanded folder", func() {
|
||||||
query := &search.FindPersistedDashboardsQuery{ExpandedFolders: []int64{folder1.Id}, SignedInUser: &m.SignedInUser{UserId: currentUser.Id, OrgId: 1}, OrgId: 1}
|
query := &search.FindPersistedDashboardsQuery{FolderIds: []int64{folder1.Id}, SignedInUser: &m.SignedInUser{UserId: currentUser.Id, OrgId: 1}, OrgId: 1}
|
||||||
err := SearchDashboards(query)
|
err := SearchDashboards(query)
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
So(len(query.Result), ShouldEqual, 4)
|
So(len(query.Result), ShouldEqual, 4)
|
||||||
|
@ -139,7 +139,7 @@ func addDashboardMigration(mg *Migrator) {
|
|||||||
|
|
||||||
// add column to store folder_id for dashboard folder structure
|
// add column to store folder_id for dashboard folder structure
|
||||||
mg.AddMigration("Add column folder_id in dashboard", NewAddColumnMigration(dashboardV2, &Column{
|
mg.AddMigration("Add column folder_id in dashboard", NewAddColumnMigration(dashboardV2, &Column{
|
||||||
Name: "folder_id", Type: DB_BigInt, Nullable: true,
|
Name: "folder_id", Type: DB_BigInt, Nullable: false, Default: "0",
|
||||||
}))
|
}))
|
||||||
|
|
||||||
mg.AddMigration("Add column isFolder in dashboard", NewAddColumnMigration(dashboardV2, &Column{
|
mg.AddMigration("Add column isFolder in dashboard", NewAddColumnMigration(dashboardV2, &Column{
|
||||||
|
@ -17,8 +17,7 @@ type SearchBuilder struct {
|
|||||||
whereTitle string
|
whereTitle string
|
||||||
whereTypeFolder bool
|
whereTypeFolder bool
|
||||||
whereTypeDash bool
|
whereTypeDash bool
|
||||||
whereFolderId int64
|
whereFolderIds []int64
|
||||||
expandedFolders []int64
|
|
||||||
sql bytes.Buffer
|
sql bytes.Buffer
|
||||||
params []interface{}
|
params []interface{}
|
||||||
}
|
}
|
||||||
@ -72,14 +71,8 @@ func (sb *SearchBuilder) WithType(queryType string) *SearchBuilder {
|
|||||||
return sb
|
return sb
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sb *SearchBuilder) WithFolderId(folderId int64) *SearchBuilder {
|
func (sb *SearchBuilder) WithFolderIds(folderIds []int64) *SearchBuilder {
|
||||||
sb.whereFolderId = folderId
|
sb.whereFolderIds = folderIds
|
||||||
|
|
||||||
return sb
|
|
||||||
}
|
|
||||||
|
|
||||||
func (sb *SearchBuilder) WithExpandedFolders(expandedFolders []int64) *SearchBuilder {
|
|
||||||
sb.expandedFolders = expandedFolders
|
|
||||||
return sb
|
return sb
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -212,17 +205,10 @@ func (sb *SearchBuilder) buildSearchWhereClause() {
|
|||||||
sb.sql.WriteString(" AND dashboard.is_folder = 0")
|
sb.sql.WriteString(" AND dashboard.is_folder = 0")
|
||||||
}
|
}
|
||||||
|
|
||||||
if sb.whereFolderId > 0 {
|
if len(sb.whereFolderIds) > 0 {
|
||||||
sb.sql.WriteString(" AND dashboard.folder_id = ?")
|
sb.sql.WriteString(` AND dashboard.folder_id IN (?` + strings.Repeat(",?", len(sb.whereFolderIds)-1) + `) `)
|
||||||
sb.params = append(sb.params, sb.whereFolderId)
|
for _, id := range sb.whereFolderIds {
|
||||||
}
|
sb.params = append(sb.params, id)
|
||||||
|
|
||||||
if len(sb.expandedFolders) > 0 {
|
|
||||||
sb.sql.WriteString(` AND (dashboard.folder_id IN (?` + strings.Repeat(",?", len(sb.expandedFolders)-1) + `) `)
|
|
||||||
sb.sql.WriteString(` OR dashboard.folder_id IS NULL OR dashboard.folder_id = 0)`)
|
|
||||||
|
|
||||||
for _, ef := range sb.expandedFolders {
|
|
||||||
sb.params = append(sb.params, ef)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@ export class SearchCtrl {
|
|||||||
this.giveSearchFocus = 0;
|
this.giveSearchFocus = 0;
|
||||||
this.selectedIndex = -1;
|
this.selectedIndex = -1;
|
||||||
this.results = [];
|
this.results = [];
|
||||||
this.query = { query: '', tag: [], starred: false, mode: 'tree' };
|
this.query = { query: '', tag: [], starred: false };
|
||||||
this.currentSearchId = 0;
|
this.currentSearchId = 0;
|
||||||
this.ignoreClose = true;
|
this.ignoreClose = true;
|
||||||
|
|
||||||
|
@ -7,8 +7,12 @@ export class SearchSrv {
|
|||||||
constructor(private backendSrv) {
|
constructor(private backendSrv) {
|
||||||
}
|
}
|
||||||
|
|
||||||
search(query) {
|
search(options) {
|
||||||
return this.backendSrv.search(query).then(results => {
|
if (!options.query) {
|
||||||
|
options.folderIds = [0];
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.backendSrv.search(options).then(results => {
|
||||||
|
|
||||||
let sections: any = {};
|
let sections: any = {};
|
||||||
|
|
||||||
@ -34,22 +38,30 @@ export class SearchSrv {
|
|||||||
|
|
||||||
// create folder index
|
// create folder index
|
||||||
for (let hit of results) {
|
for (let hit of results) {
|
||||||
let section = sections[hit.folderId];
|
if (hit.type === 'dash-folder') {
|
||||||
if (!section) {
|
sections[hit.id] = {
|
||||||
section = {
|
id: hit.id,
|
||||||
id: hit.folderId,
|
title: hit.title,
|
||||||
title: hit.folderTitle,
|
|
||||||
items: [],
|
items: [],
|
||||||
icon: 'fa fa-folder-open'
|
icon: 'fa fa-folder-open',
|
||||||
|
score: _.keys(sections).length,
|
||||||
};
|
};
|
||||||
// handle root
|
|
||||||
if (!hit.folderId) {
|
|
||||||
section.title = "Dashboards";
|
|
||||||
section.icon = "fa fa-circle-o";
|
|
||||||
}
|
|
||||||
sections[hit.folderId] = section;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sections[0] = {
|
||||||
|
id: 0,
|
||||||
|
title: 'Root',
|
||||||
|
items: [],
|
||||||
|
icon: 'fa fa-folder-open',
|
||||||
|
score: _.keys(sections).length,
|
||||||
|
};
|
||||||
|
|
||||||
|
for (let hit of results) {
|
||||||
|
if (hit.type === 'dash-folder') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let section = sections[hit.folderId || 0];
|
||||||
hit.url = 'dashboard/' + hit.uri;
|
hit.url = 'dashboard/' + hit.uri;
|
||||||
section.items.push(hit);
|
section.items.push(hit);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user