Commit 113509a4 by Torkel Ödegaard

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

parents 839c675c 854c360d
......@@ -14,6 +14,41 @@ export function exportSeriesListToCsv(seriesList) {
saveSaveBlob(text, 'grafana_data_export.csv');
};
export function exportSeriesListToCsvColumns(seriesList) {
var text = 'Time;';
// add header
_.each(seriesList, function(series) {
text += series.alias + ';';
});
text = text.substring(0,text.length-1);
text += '\n';
// process data
var dataArr = [[]];
var sIndex = 1;
_.each(seriesList, function(series) {
var cIndex = 0;
dataArr.push([]);
_.each(series.datapoints, function(dp) {
dataArr[0][cIndex] = new Date(dp[1]).toISOString();
dataArr[sIndex][cIndex] = dp[0];
cIndex++;
});
sIndex++;
});
// make text
for (var i = 0; i < dataArr[0].length; i++) {
text += dataArr[0][i] + ';';
for (var j = 1; j < dataArr.length; j++) {
text += dataArr[j][i] + ';';
}
text = text.substring(0,text.length-1);
text += '\n';
}
saveSaveBlob(text, 'grafana_data_export.csv');
};
export function exportTableDataToCsv(table) {
var text = '';
// add header
......
......@@ -16,4 +16,5 @@ define([
'./graphiteImportCtrl',
'./dynamicDashboardSrv',
'./importCtrl',
'./impressionStore',
], function () {});
......@@ -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) {
......
///<reference path="../../headers/common.d.ts" />
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
};
......@@ -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/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 {
......
......@@ -125,7 +125,8 @@ class GraphCtrl extends MetricsPanelCtrl {
getExtendedMenu() {
var menu = super.getExtendedMenu();
menu.push({text: 'Export CSV', click: 'ctrl.exportCsv()'});
menu.push({text: 'Export CSV (series as rows)', click: 'ctrl.exportCsv()'});
menu.push({text: 'Export CSV (series as columns)', click: 'ctrl.exportCsvColumns()'});
menu.push({text: 'Toggle legend', click: 'ctrl.toggleLegend()'});
return menu;
}
......@@ -295,6 +296,10 @@ class GraphCtrl extends MetricsPanelCtrl {
exportCsv() {
fileExport.exportSeriesListToCsv(this.seriesList);
}
exportCsvColumns() {
fileExport.exportSeriesListToCsvColumns(this.seriesList);
}
}
export {GraphCtrl, GraphCtrl as PanelCtrl}
......@@ -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