Commit e5970e83 by bergquist

feat(dashlist): list last x viewed dashboards

closes #3896
parent 83662b51
......@@ -16,4 +16,5 @@ define([
'./graphiteImportCtrl',
'./dynamicDashboardSrv',
'./importCtrl',
'./impressions',
], function () {});
......@@ -5,8 +5,9 @@ define([
'jquery',
'app/core/utils/kbn',
'app/core/utils/datemath',
'./impressions',
],
function (angular, moment, _, $, kbn, dateMath) {
function (angular, moment, _, $, kbn, dateMath, impressions) {
'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) {
impressions.addImpression(slug);
return result;
});
return promise;
};
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 @@
{{dash.title}}
</span>
<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>
</a>
</div>
......
......@@ -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/impressions2';
// 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.getImpressions(), 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 {
......
......@@ -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"
}
],
......
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