mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
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.
This commit is contained in:
parent
f1e1da39e3
commit
53d11d50fc
@ -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) {
|
|||||||
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 {
|
|||||||
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) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
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 {
|
|||||||
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 {
|
|||||||
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 {
|
|||||||
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 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
|||||||
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) {
|
|||||||
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) {
|
|||||||
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) {
|
|||||||
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 @@
|
|||||||
<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 {
|
|||||||
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 {
|
|||||||
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 @@
|
|||||||
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user