diff --git a/public/app/features/dashboard/all.js b/public/app/features/dashboard/all.js
index 073ca2ae1d9..d5cc13b4270 100644
--- a/public/app/features/dashboard/all.js
+++ b/public/app/features/dashboard/all.js
@@ -16,4 +16,5 @@ define([
'./graphiteImportCtrl',
'./dynamicDashboardSrv',
'./importCtrl',
+ './impressionStore',
], function () {});
diff --git a/public/app/features/dashboard/dashboardLoaderSrv.js b/public/app/features/dashboard/dashboardLoaderSrv.js
index f578a9d1075..f975c47800f 100644
--- a/public/app/features/dashboard/dashboardLoaderSrv.js
+++ b/public/app/features/dashboard/dashboardLoaderSrv.js
@@ -5,8 +5,9 @@ define([
'jquery',
'app/core/utils/kbn',
'app/core/utils/datemath',
+ './impressionStore',
],
-function (angular, moment, _, $, kbn, dateMath) {
+function (angular, moment, _, $, kbn, dateMath, impressionStore) {
'use strict';
var module = angular.module('grafana.services');
@@ -24,19 +25,27 @@ function (angular, moment, _, $, kbn, dateMath) {
};
this.loadDashboard = function(type, slug) {
- if (type === 'script') {
- return this._loadScriptedDashboard(slug);
- }
+ var promise;
- if (type === 'snapshot') {
- return backendSrv.get('/api/snapshots/' + $routeParams.slug).catch(function() {
+ if (type === 'script') {
+ 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'}};
});
+ } else {
+ promise = backendSrv.getDashboard($routeParams.type, $routeParams.slug)
+ .catch(function() {
+ return self._dashboardLoadFailed("Not found");
+ });
}
- return backendSrv.getDashboard($routeParams.type, $routeParams.slug).catch(function() {
- return self._dashboardLoadFailed("Not found");
+ promise.then(function(result) {
+ impressionStore.impressions.addDashboardImpression(slug);
+ return result;
});
+
+ return promise;
};
this._loadScriptedDashboard = function(file) {
diff --git a/public/app/features/dashboard/impressionStore.ts b/public/app/features/dashboard/impressionStore.ts
new file mode 100644
index 00000000000..61be1131cb6
--- /dev/null
+++ b/public/app/features/dashboard/impressionStore.ts
@@ -0,0 +1,41 @@
+///
+
+import store from 'app/core/store';
+import _ from 'lodash';
+
+export class ImpressionsStore {
+ constructor() {}
+
+ addDashboardImpression(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));
+ }
+
+ getDashboardOpened() {
+ var k = store.get("dashboard_impressions");
+ return JSON.parse(k);
+ }
+}
+
+var impressions = new ImpressionsStore();
+
+export {
+ impressions
+};
diff --git a/public/app/plugins/panel/dashlist/module.html b/public/app/plugins/panel/dashlist/module.html
index 455291409d5..79952d0032c 100644
--- a/public/app/plugins/panel/dashlist/module.html
+++ b/public/app/plugins/panel/dashlist/module.html
@@ -5,7 +5,7 @@
{{dash.title}}
-
+
diff --git a/public/app/plugins/panel/dashlist/module.ts b/public/app/plugins/panel/dashlist/module.ts
index a1c72434b38..fd0e905d923 100644
--- a/public/app/plugins/panel/dashlist/module.ts
+++ b/public/app/plugins/panel/dashlist/module.ts
@@ -3,6 +3,7 @@
import _ from 'lodash';
import config from 'app/core/config';
import {PanelCtrl} from 'app/plugins/sdk';
+import {impressions} from 'app/features/dashboard/impressionStore';
// Set and populate defaults
var panelDefaults = {
@@ -31,7 +32,7 @@ class DashListCtrl extends PanelCtrl {
initEditMode() {
super.initEditMode();
- this.modes = ['starred', 'search'];
+ this.modes = ['starred', 'search', 'last viewed'];
this.icon = "fa fa-star";
this.addEditorTab('Options', () => {
return {templateUrl: 'public/app/plugins/panel/dashlist/editor.html'};
@@ -41,6 +42,19 @@ class DashListCtrl extends PanelCtrl {
refresh() {
var params: any = {limit: this.panel.limit};
+ if (this.panel.mode === 'last viewed') {
+ var dashListNames = _.first(impressions.getDashboardOpened(), this.panel.limit).map((dashboard) => {
+ return {
+ title: dashboard,
+ uri: 'db/' + dashboard
+ };
+ });
+
+ this.dashList = dashListNames;
+ this.renderingCompleted();
+ return;
+ }
+
if (this.panel.mode === 'starred') {
params.starred = "true";
} else {
diff --git a/public/dashboards/home.json b/public/dashboards/home.json
index e05a882ef57..d54e276db5c 100644
--- a/public/dashboards/home.json
+++ b/public/dashboards/home.json
@@ -47,11 +47,11 @@
{
"id": 3,
"limit": 10,
- "mode": "search",
+ "mode": "last viewed",
"query": "",
"span": 6,
"tags": [],
- "title": "Dashboards",
+ "title": "Last 10 viewed dashboards",
"type": "dashlist"
}
],