Commit e5970e83 by bergquist

feat(dashlist): list last x viewed dashboards

closes #3896
parent 83662b51
...@@ -16,4 +16,5 @@ define([ ...@@ -16,4 +16,5 @@ define([
'./graphiteImportCtrl', './graphiteImportCtrl',
'./dynamicDashboardSrv', './dynamicDashboardSrv',
'./importCtrl', './importCtrl',
'./impressions',
], function () {}); ], function () {});
...@@ -5,8 +5,9 @@ define([ ...@@ -5,8 +5,9 @@ define([
'jquery', 'jquery',
'app/core/utils/kbn', 'app/core/utils/kbn',
'app/core/utils/datemath', 'app/core/utils/datemath',
'./impressions',
], ],
function (angular, moment, _, $, kbn, dateMath) { function (angular, moment, _, $, kbn, dateMath, impressions) {
'use strict'; 'use strict';
var module = angular.module('grafana.services'); var module = angular.module('grafana.services');
...@@ -24,19 +25,27 @@ function (angular, moment, _, $, kbn, dateMath) { ...@@ -24,19 +25,27 @@ function (angular, moment, _, $, kbn, dateMath) {
}; };
this.loadDashboard = function(type, slug) { this.loadDashboard = function(type, slug) {
if (type === 'script') { var promise;
return this._loadScriptedDashboard(slug);
}
if (type === 'snapshot') { if (type === 'script') {
return backendSrv.get('/api/snapshots/' + $routeParams.slug).catch(function() { promise = this._loadScriptedDashboard(slug);
} else if (type === 'snapshot') {
promise = backendSrv.get('/api/snapshots/' + $routeParams.slug).catch(function() {
return {meta:{isSnapshot: true, canSave: false, canEdit: false}, dashboard: {title: 'Snapshot not found'}}; return {meta:{isSnapshot: true, canSave: false, canEdit: false}, dashboard: {title: 'Snapshot not found'}};
}); });
} else {
promise = backendSrv.getDashboard($routeParams.type, $routeParams.slug)
.catch(function() {
return self._dashboardLoadFailed("Not found");
});
} }
return backendSrv.getDashboard($routeParams.type, $routeParams.slug).catch(function() { promise.then(function(result) {
return self._dashboardLoadFailed("Not found"); impressions.addImpression(slug);
return result;
}); });
return promise;
}; };
this._loadScriptedDashboard = function(file) { this._loadScriptedDashboard = function(file) {
......
define([
'./impressions2'
], function(impressions) {
'use strict';
// backward compatability hack;
return impressions.impressions;
});
///<reference path="../../headers/common.d.ts" />
import store from 'app/core/store';
import _ from 'lodash';
export class Impressions {
constructor() {}
addImpression(slug) {
var impressions = [];
if (store.exists("dashboard_impressions")) {
impressions = JSON.parse(store.get("dashboard_impressions"));
if (!_.isArray(impressions)) {
impressions = [];
}
}
var exists = impressions.indexOf(slug);
if (exists >= 0) {
impressions.splice(exists, 1);
}
impressions.unshift(slug);
if (impressions.length > 20) {
impressions.shift();
}
store.set("dashboard_impressions", JSON.stringify(impressions));
}
getImpressions() {
var k = store.get("dashboard_impressions");
return JSON.parse(k);
}
}
var impressions = new Impressions();
export {
impressions
};
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
{{dash.title}} {{dash.title}}
</span> </span>
<span class="dashlist-star"> <span class="dashlist-star">
<i class="fa" ng-class="{'fa-star': dash.isStarred, 'fa-star-o': !dash.isStarred}"></i> <i class="fa" ng-class="{'fa-star': dash.isStarred, 'fa-star-o': dash.isStarred === false}"></i>
</span> </span>
</a> </a>
</div> </div>
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
import _ from 'lodash'; import _ from 'lodash';
import config from 'app/core/config'; import config from 'app/core/config';
import {PanelCtrl} from 'app/plugins/sdk'; import {PanelCtrl} from 'app/plugins/sdk';
import {impressions} from 'app/features/dashboard/impressions2';
// Set and populate defaults // Set and populate defaults
var panelDefaults = { var panelDefaults = {
...@@ -31,7 +32,7 @@ class DashListCtrl extends PanelCtrl { ...@@ -31,7 +32,7 @@ class DashListCtrl extends PanelCtrl {
initEditMode() { initEditMode() {
super.initEditMode(); super.initEditMode();
this.modes = ['starred', 'search']; this.modes = ['starred', 'search', 'last viewed'];
this.icon = "fa fa-star"; this.icon = "fa fa-star";
this.addEditorTab('Options', () => { this.addEditorTab('Options', () => {
return {templateUrl: 'public/app/plugins/panel/dashlist/editor.html'}; return {templateUrl: 'public/app/plugins/panel/dashlist/editor.html'};
...@@ -41,6 +42,19 @@ class DashListCtrl extends PanelCtrl { ...@@ -41,6 +42,19 @@ class DashListCtrl extends PanelCtrl {
refresh() { refresh() {
var params: any = {limit: this.panel.limit}; var params: any = {limit: this.panel.limit};
if (this.panel.mode === 'last viewed') {
var dashListNames = _.first(impressions.getImpressions(), this.panel.limit).map((dashboard) => {
return {
title: dashboard,
uri: 'db/' + dashboard
};
});
this.dashList = dashListNames;
this.renderingCompleted();
return;
}
if (this.panel.mode === 'starred') { if (this.panel.mode === 'starred') {
params.starred = "true"; params.starred = "true";
} else { } else {
......
...@@ -47,11 +47,11 @@ ...@@ -47,11 +47,11 @@
{ {
"id": 3, "id": 3,
"limit": 10, "limit": 10,
"mode": "search", "mode": "last viewed",
"query": "", "query": "",
"span": 6, "span": 6,
"tags": [], "tags": [],
"title": "Dashboards", "title": "Last 10 viewed dashboards",
"type": "dashlist" "type": "dashlist"
} }
], ],
......
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