Commit e73e7aea by Torkel Ödegaard

Merge branch 'master' of github.com:grafana/grafana

parents a72d7329 0f546a46
...@@ -4,6 +4,7 @@ import ( ...@@ -4,6 +4,7 @@ import (
"github.com/grafana/grafana/pkg/bus" "github.com/grafana/grafana/pkg/bus"
"github.com/grafana/grafana/pkg/middleware" "github.com/grafana/grafana/pkg/middleware"
"github.com/grafana/grafana/pkg/services/search" "github.com/grafana/grafana/pkg/services/search"
"strconv"
) )
func Search(c *middleware.Context) { func Search(c *middleware.Context) {
...@@ -16,13 +17,22 @@ func Search(c *middleware.Context) { ...@@ -16,13 +17,22 @@ func Search(c *middleware.Context) {
limit = 1000 limit = 1000
} }
dbids := make([]int, 0)
for _, id := range c.QueryStrings("dashboardIds") {
dashboardId, err := strconv.Atoi(id)
if err == nil {
dbids = append(dbids, dashboardId)
}
}
searchQuery := search.Query{ searchQuery := search.Query{
Title: query, Title: query,
Tags: tags, Tags: tags,
UserId: c.UserId, UserId: c.UserId,
Limit: limit, Limit: limit,
IsStarred: starred == "true", IsStarred: starred == "true",
OrgId: c.OrgId, OrgId: c.OrgId,
DashboardIds: dbids,
} }
err := bus.Dispatch(&searchQuery) err := bus.Dispatch(&searchQuery)
......
...@@ -39,10 +39,11 @@ func searchHandler(query *Query) error { ...@@ -39,10 +39,11 @@ func searchHandler(query *Query) error {
hits := make(HitList, 0) hits := make(HitList, 0)
dashQuery := FindPersistedDashboardsQuery{ dashQuery := FindPersistedDashboardsQuery{
Title: query.Title, Title: query.Title,
UserId: query.UserId, UserId: query.UserId,
IsStarred: query.IsStarred, IsStarred: query.IsStarred,
OrgId: query.OrgId, OrgId: query.OrgId,
DashboardIds: query.DashboardIds,
} }
if err := bus.Dispatch(&dashQuery); err != nil { if err := bus.Dispatch(&dashQuery); err != nil {
......
...@@ -25,21 +25,23 @@ func (s HitList) Swap(i, j int) { s[i], s[j] = s[j], s[i] } ...@@ -25,21 +25,23 @@ func (s HitList) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
func (s HitList) Less(i, j int) bool { return s[i].Title < s[j].Title } func (s HitList) Less(i, j int) bool { return s[i].Title < s[j].Title }
type Query struct { type Query struct {
Title string Title string
Tags []string Tags []string
OrgId int64 OrgId int64
UserId int64 UserId int64
Limit int Limit int
IsStarred bool IsStarred bool
DashboardIds []int
Result HitList Result HitList
} }
type FindPersistedDashboardsQuery struct { type FindPersistedDashboardsQuery struct {
Title string Title string
OrgId int64 OrgId int64
UserId int64 UserId int64
IsStarred bool IsStarred bool
DashboardIds []int
Result HitList Result HitList
} }
...@@ -146,6 +146,19 @@ func SearchDashboards(query *search.FindPersistedDashboardsQuery) error { ...@@ -146,6 +146,19 @@ func SearchDashboards(query *search.FindPersistedDashboardsQuery) error {
params = append(params, query.UserId) params = append(params, query.UserId)
} }
if len(query.DashboardIds) > 0 {
sql.WriteString(" AND (")
for i, dashboardId := range query.DashboardIds {
if i != 0 {
sql.WriteString("OR")
}
sql.WriteString(" dashboard.id = ?")
params = append(params, dashboardId)
}
sql.WriteString(")")
}
if len(query.Title) > 0 { if len(query.Title) > 0 {
sql.WriteString(" AND dashboard.title " + dialect.LikeStr() + " ?") sql.WriteString(" AND dashboard.title " + dialect.LikeStr() + " ?")
params = append(params, "%"+query.Title+"%") params = append(params, "%"+query.Title+"%")
......
...@@ -32,6 +32,8 @@ func TestDashboardDataAccess(t *testing.T) { ...@@ -32,6 +32,8 @@ func TestDashboardDataAccess(t *testing.T) {
Convey("Given saved dashboard", func() { Convey("Given saved dashboard", func() {
savedDash := insertTestDashboard("test dash 23", 1, "prod", "webapp") savedDash := insertTestDashboard("test dash 23", 1, "prod", "webapp")
insertTestDashboard("test dash 45", 1, "prod")
insertTestDashboard("test dash 67", 1, "prod", "webapp")
Convey("Should return dashboard model", func() { Convey("Should return dashboard model", func() {
So(savedDash.Title, ShouldEqual, "test dash 23") So(savedDash.Title, ShouldEqual, "test dash 23")
...@@ -87,7 +89,7 @@ func TestDashboardDataAccess(t *testing.T) { ...@@ -87,7 +89,7 @@ func TestDashboardDataAccess(t *testing.T) {
Convey("Should be able to search for dashboard", func() { Convey("Should be able to search for dashboard", func() {
query := search.FindPersistedDashboardsQuery{ query := search.FindPersistedDashboardsQuery{
Title: "test", Title: "test dash 23",
OrgId: 1, OrgId: 1,
} }
...@@ -99,6 +101,37 @@ func TestDashboardDataAccess(t *testing.T) { ...@@ -99,6 +101,37 @@ func TestDashboardDataAccess(t *testing.T) {
So(len(hit.Tags), ShouldEqual, 2) So(len(hit.Tags), ShouldEqual, 2)
}) })
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{1, 2},
OrgId: 1,
}
err := SearchDashboards(&query)
So(err, ShouldBeNil)
So(len(query.Result), ShouldEqual, 2)
hit := query.Result[0]
So(len(hit.Tags), ShouldEqual, 2)
hit2 := query.Result[1]
So(len(hit2.Tags), ShouldEqual, 1)
})
Convey("DashboardIds that does not exists should not cause errors", func() {
query := search.FindPersistedDashboardsQuery{
DashboardIds: []int{1000},
OrgId: 1,
}
err := SearchDashboards(&query)
So(err, ShouldBeNil)
So(len(query.Result), ShouldEqual, 0)
})
})
Convey("Should not be able to save dashboard with same name", func() { Convey("Should not be able to save dashboard with same name", func() {
cmd := m.SaveDashboardCommand{ cmd := m.SaveDashboardCommand{
OrgId: 1, OrgId: 1,
......
...@@ -8,7 +8,7 @@ define([ ...@@ -8,7 +8,7 @@ define([
'./impression_store', './impression_store',
'app/core/config', 'app/core/config',
], ],
function (angular, moment, _, $, kbn, dateMath, impressionStore, config) { function (angular, moment, _, $, kbn, dateMath, impressionStore) {
'use strict'; 'use strict';
var module = angular.module('grafana.services'); var module = angular.module('grafana.services');
...@@ -48,12 +48,7 @@ function (angular, moment, _, $, kbn, dateMath, impressionStore, config) { ...@@ -48,12 +48,7 @@ function (angular, moment, _, $, kbn, dateMath, impressionStore, config) {
promise.then(function(result) { promise.then(function(result) {
if (result.meta.dashboardNotFound !== true) { if (result.meta.dashboardNotFound !== true) {
impressionStore.impressions.addDashboardImpression({ impressionStore.impressions.addDashboardImpression(result.dashboard.id);
type: type,
slug: slug,
title: result.dashboard.title,
orgId: config.bootData.user.orgId
});
} }
return result; return result;
......
...@@ -6,7 +6,7 @@ import _ from 'lodash'; ...@@ -6,7 +6,7 @@ import _ from 'lodash';
export class ImpressionsStore { export class ImpressionsStore {
constructor() {} constructor() {}
addDashboardImpression(impression) { addDashboardImpression(dashboardId) {
var impressions = []; var impressions = [];
if (store.exists("dashboard_impressions")) { if (store.exists("dashboard_impressions")) {
impressions = JSON.parse(store.get("dashboard_impressions")); impressions = JSON.parse(store.get("dashboard_impressions"));
...@@ -16,18 +16,13 @@ export class ImpressionsStore { ...@@ -16,18 +16,13 @@ export class ImpressionsStore {
} }
impressions = impressions.filter((imp) => { impressions = impressions.filter((imp) => {
return impression.slug !== imp.slug; return dashboardId !== imp;
}); });
impressions.unshift({ impressions.unshift(dashboardId);
title: impression.title,
slug: impression.slug,
orgId: impression.orgId,
type: impression.type
});
if (impressions.length > 20) { if (impressions.length > 50) {
impressions.shift(); impressions.pop();
} }
store.set("dashboard_impressions", JSON.stringify(impressions)); store.set("dashboard_impressions", JSON.stringify(impressions));
} }
......
...@@ -43,22 +43,21 @@ class DashListCtrl extends PanelCtrl { ...@@ -43,22 +43,21 @@ class DashListCtrl extends PanelCtrl {
var params: any = {limit: this.panel.limit}; var params: any = {limit: this.panel.limit};
if (this.panel.mode === 'recently viewed') { if (this.panel.mode === 'recently viewed') {
var dashboardIds = impressions.getDashboardOpened();
var dashListNames = impressions.getDashboardOpened().filter((imp) => { return this.backendSrv.search({
return imp.orgId === config.bootData.user.orgId; dashboardIds: impressions.getDashboardOpened(),
}); limit: this.panel.limit
}).then(result => {
dashListNames = _.first(dashListNames, params.limit).map((dashboard) => {
return {
title: dashboard.title,
uri: dashboard.type + '/' + dashboard.slug
};
});
this.dashList = dashboardIds.map(orderId => {
return _.find(result, dashboard => {
return dashboard.id === orderId;
});
});
this.dashList = dashListNames; this.renderingCompleted();
this.renderingCompleted(); });
return;
} }
if (this.panel.mode === 'starred') { if (this.panel.mode === 'starred') {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment