grafana 266 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. commit 34ab1e529b499af836631f8076c2c4df02be5860
  2. Author: Torkel Ödegaard <torkel.odegaard@gmail.com>
  3. Date: Sat Aug 16 21:54:05 2014 +0200
  4. Lots of work on the side menu
  5. diff --git a/src/app/controllers/p_grafanaCtrl.js b/src/app/controllers/p_grafanaCtrl.js
  6. index 2793eabaf..e9484d76d 100644
  7. --- a/src/app/controllers/p_grafanaCtrl.js
  8. +++ b/src/app/controllers/p_grafanaCtrl.js
  9. @@ -3,8 +3,9 @@ define([
  10. 'config',
  11. 'lodash',
  12. 'jquery',
  13. + 'store',
  14. ],
  15. -function (angular, config, _, $) {
  16. +function (angular, config, _, $, store) {
  17. "use strict";
  18. var module = angular.module('grafana.controllers');
  19. @@ -12,30 +13,37 @@ function (angular, config, _, $) {
  20. module.controller('GrafanaCtrl', function($scope, alertSrv, grafanaVersion, $rootScope) {
  21. $scope.grafanaVersion = grafanaVersion[0] === '@' ? 'master' : grafanaVersion;
  22. - $scope.consoleEnabled = (window.localStorage && window.localStorage.grafanaConsole === 'true');
  23. + $scope.consoleEnabled = store.getBool('grafanaConsole');
  24. + $scope.showProSideMenu = store.getBool('grafanaProSideMenu');
  25. - $rootScope.profilingEnabled = (window.localStorage && window.localStorage.profilingEnabled === 'true');
  26. + $rootScope.profilingEnabled = store.getBool('profilingEnabled');
  27. $rootScope.performance = { loadStart: new Date().getTime() };
  28. $scope.init = function() {
  29. $scope._ = _;
  30. - if ($rootScope.profilingEnabled) {
  31. - $scope.initProfiling();
  32. - }
  33. +
  34. + if ($rootScope.profilingEnabled) { $scope.initProfiling(); }
  35. $scope.dashAlerts = alertSrv;
  36. - $scope.grafana = {
  37. - style: 'dark'
  38. - };
  39. + $scope.grafana = { style: 'dark' };
  40. +
  41. + $scope.onAppEvent('logged-out', function() {
  42. + $scope.showProSideMenu = false;
  43. + });
  44. +
  45. + $scope.onAppEvent('logged-in', function() {
  46. + $scope.showProSideMenu = store.getBool('grafanaProSideMenu');
  47. + });
  48. };
  49. $scope.toggleProSideMenu = function() {
  50. $scope.showProSideMenu = !$scope.showProSideMenu;
  51. + store.set('grafanaProSideMenu', $scope.showProSideMenu);
  52. };
  53. $scope.toggleConsole = function() {
  54. $scope.consoleEnabled = !$scope.consoleEnabled;
  55. - window.localStorage.grafanaConsole = $scope.consoleEnabled ? 'true' : 'false';
  56. + store.set('grafanaConsole', $scope.consoleEnabled);
  57. };
  58. $rootScope.onAppEvent = function(name, callback) {
  59. diff --git a/src/app/controllers/p_loginCtrl.js b/src/app/controllers/p_loginCtrl.js
  60. index 1c729a843..793cd3578 100644
  61. --- a/src/app/controllers/p_loginCtrl.js
  62. +++ b/src/app/controllers/p_loginCtrl.js
  63. @@ -6,27 +6,48 @@ function (angular) {
  64. var module = angular.module('grafana.controllers');
  65. - module.controller('LoginCtrl', function($scope, $http, $location) {
  66. + module.controller('LoginCtrl', function($scope, $http, $location, $routeParams, alertSrv) {
  67. $scope.loginModel = {};
  68. + $scope.init = function() {
  69. + if ($routeParams.logout) {
  70. + $scope.logout();
  71. + }
  72. + };
  73. +
  74. + $scope.logout = function() {
  75. + $http.post('/logout').then(function() {
  76. +
  77. + alertSrv.set('Logged out!', '', 'success', 3000);
  78. + $scope.emitAppEvent('logged-out');
  79. +
  80. + }, function() {
  81. + alertSrv.set('Logout failed:', 'Unexpected error', 'error', 3000);
  82. + });
  83. + };
  84. +
  85. $scope.login = function() {
  86. delete $scope.loginError;
  87. +
  88. if (!$scope.loginForm.$valid) {
  89. return;
  90. }
  91. $http.post('/login', $scope.loginModel).then(function() {
  92. + $scope.emitAppEvent('logged-in');
  93. $location.path('/');
  94. }, function(err) {
  95. if (err.status === 401) {
  96. $scope.loginError = "Username or password is incorrect";
  97. }
  98. else {
  99. - $scope.loginErro = "Unexpected error";
  100. + $scope.loginError = "Unexpected error";
  101. }
  102. });
  103. };
  104. + $scope.init();
  105. +
  106. });
  107. });
  108. diff --git a/src/app/partials/dashboard.html b/src/app/partials/dashboard.html
  109. index 1593501ad..acfd80518 100644
  110. --- a/src/app/partials/dashboard.html
  111. +++ b/src/app/partials/dashboard.html
  112. @@ -1,6 +1,6 @@
  113. <div ng-controller="DashboardCtrl" body-class ng-class="{'dashboard-fullscreen': dashboardViewState.fullscreen}">
  114. - <div ng-include="'app/partials/p_dashboard_topnav.html'">
  115. + <div ng-include="'app/partials/pro/dashboard_topnav.html'">
  116. </div>
  117. <div class="submenu-controls">
  118. diff --git a/src/app/partials/pro/admin_datasources.html b/src/app/partials/pro/admin_datasources.html
  119. new file mode 100644
  120. index 000000000..10276b5a1
  121. --- /dev/null
  122. +++ b/src/app/partials/pro/admin_datasources.html
  123. @@ -0,0 +1,14 @@
  124. +<div class="navbar navbar-static-top">
  125. + <div class="navbar-inner">
  126. + <div class="container-fluid">
  127. + <span class="brand">
  128. + <a ng-click="toggleProSideMenu()">
  129. + <img src="img/small.png">
  130. + </a>
  131. + Admin / Data sources
  132. + </span>
  133. + </div>
  134. + </div>
  135. +</div>
  136. +
  137. +
  138. diff --git a/src/app/partials/p_dashboard_topnav.html b/src/app/partials/pro/dashboard_topnav.html
  139. similarity index 97%
  140. rename from src/app/partials/p_dashboard_topnav.html
  141. rename to src/app/partials/pro/dashboard_topnav.html
  142. index d24812160..fdd0cba10 100644
  143. --- a/src/app/partials/p_dashboard_topnav.html
  144. +++ b/src/app/partials/pro/dashboard_topnav.html
  145. @@ -3,7 +3,7 @@
  146. <div class="container-fluid">
  147. <span class="brand">
  148. <a ng-click="toggleProSideMenu()">
  149. - <img src="img/small.png" bs-tooltip="'Grafana'" data-placement="bottom">
  150. + <img src="img/small.png">
  151. </a>
  152. {{dashboard.title}}
  153. </span>
  154. diff --git a/src/app/partials/p_login.html b/src/app/partials/pro/login.html
  155. similarity index 99%
  156. rename from src/app/partials/p_login.html
  157. rename to src/app/partials/pro/login.html
  158. index 0f75a687c..92f1c4e89 100644
  159. --- a/src/app/partials/p_login.html
  160. +++ b/src/app/partials/pro/login.html
  161. @@ -2,6 +2,7 @@
  162. <div class="container">
  163. <div class="login-box">
  164. +
  165. <div class="login-box-logo">
  166. <img src="/img/logo_transparent_200x75.png">
  167. </div>
  168. diff --git a/src/app/partials/pro/sidemenu.html b/src/app/partials/pro/sidemenu.html
  169. new file mode 100644
  170. index 000000000..fa309e9c3
  171. --- /dev/null
  172. +++ b/src/app/partials/pro/sidemenu.html
  173. @@ -0,0 +1,45 @@
  174. +<div class="navbar navbar-static-top">
  175. + <div class="navbar-inner">
  176. + <div class="container-fluid">
  177. + <span class="brand">
  178. + <i class="icon-gears" style=""></i>
  179. + <span style="color: white; padding-left: 4px;">Grafana</span>
  180. + <ul class="nav" ng-controller='DashboardNavCtrl' ng-init="init()">
  181. + </span>
  182. + </ul>
  183. + </div>
  184. + </div>
  185. +</div>
  186. +
  187. +<section class="pro-sidemenu-items">
  188. + <a class="pro-sidemenu-link pro-side-menu-user" href="/login?logout">
  189. + <img src="https://secure.gravatar.com/avatar/c8656e8972626f01e1703681d5e55f92?s=90&default=blank">
  190. + logout
  191. + </a>
  192. + <a class="pro-sidemenu-link" href="/dashboard/db/home">
  193. + <i class="icon-th-large"></i>
  194. + Dashboards
  195. + </a>
  196. + <a class="pro-sidemenu-link" href="/charts">
  197. + <i class="icon-signal"></i>
  198. + Graphs
  199. + </a>
  200. + <a class="pro-sidemenu-link" href="/charts">
  201. + <i class="icon-bolt" style="padding-right: 23px"></i>
  202. + Alerts
  203. + </a>
  204. + <a class="pro-sidemenu-link" href="/admin/datasources">
  205. + <i class="icon-sitemap"></i>
  206. + Data sources
  207. + </a>
  208. + <a class="pro-sidemenu-link" href="/admin">
  209. + <i class="icon-tasks"></i>
  210. + Global options
  211. + </a>
  212. + <a class="pro-sidemenu-link" href="/admin">
  213. + <i class="icon-user"></i>
  214. + User accounts
  215. + </a>
  216. +</section>
  217. +
  218. +</div>
  219. diff --git a/src/app/routes/p_admin.js b/src/app/routes/p_admin.js
  220. new file mode 100644
  221. index 000000000..75bf5b272
  222. --- /dev/null
  223. +++ b/src/app/routes/p_admin.js
  224. @@ -0,0 +1,21 @@
  225. +define([
  226. + 'angular',
  227. +],
  228. +function (angular) {
  229. + "use strict";
  230. +
  231. + var module = angular.module('grafana.routes');
  232. +
  233. + module.config(function($routeProvider) {
  234. + $routeProvider
  235. + .when('/admin/datasources', {
  236. + templateUrl: 'app/partials/pro/admin_datasources.html',
  237. + controller : 'AdminCtrl',
  238. + });
  239. + });
  240. +
  241. + module.controller('AdminCtrl', function() {
  242. +
  243. + });
  244. +
  245. +});
  246. diff --git a/src/app/routes/p_all.js b/src/app/routes/p_all.js
  247. index 24b097152..185563c15 100644
  248. --- a/src/app/routes/p_all.js
  249. +++ b/src/app/routes/p_all.js
  250. @@ -1,5 +1,7 @@
  251. define([
  252. './p_dashboard',
  253. './p_solo-panel',
  254. + './p_admin',
  255. + './p_login',
  256. ],
  257. function () {});
  258. diff --git a/src/app/routes/p_dashboard.js b/src/app/routes/p_dashboard.js
  259. index 7bf16f51c..08c729c2a 100644
  260. --- a/src/app/routes/p_dashboard.js
  261. +++ b/src/app/routes/p_dashboard.js
  262. @@ -1,6 +1,5 @@
  263. define([
  264. 'angular',
  265. - 'controllers/p_loginCtrl'
  266. ],
  267. function (angular) {
  268. "use strict";
  269. @@ -23,10 +22,6 @@ function (angular) {
  270. templateUrl: '/app/partials/dashboard.html',
  271. controller : 'DashFromDBProvider',
  272. reloadOnSearch: false,
  273. - })
  274. - .when('/login', {
  275. - templateUrl: '/app/partials/p_login.html',
  276. - controller : 'LoginCtrl',
  277. });
  278. });
  279. diff --git a/src/app/routes/p_login.js b/src/app/routes/p_login.js
  280. new file mode 100644
  281. index 000000000..127c4d47f
  282. --- /dev/null
  283. +++ b/src/app/routes/p_login.js
  284. @@ -0,0 +1,59 @@
  285. +define([
  286. + 'angular',
  287. +],
  288. +function (angular) {
  289. + "use strict";
  290. +
  291. + var module = angular.module('grafana.routes');
  292. +
  293. + module.config(function($routeProvider) {
  294. + $routeProvider
  295. + .when('/login', {
  296. + templateUrl: 'app/partials/pro/login.html',
  297. + controller : 'LoginCtrl',
  298. + });
  299. + });
  300. +
  301. + module.controller('LoginCtrl', function($scope, $http, $location, $routeParams, alertSrv) {
  302. + $scope.loginModel = {};
  303. +
  304. + $scope.init = function() {
  305. + if ($routeParams.logout) {
  306. + $scope.logout();
  307. + }
  308. + };
  309. +
  310. + $scope.logout = function() {
  311. + $http.post('/logout').then(function() {
  312. + alertSrv.set('Logged out!', '', 'success', 3000);
  313. + $scope.emitAppEvent('logged-out');
  314. + }, function() {
  315. + alertSrv.set('Logout failed:', 'Unexpected error', 'error', 3000);
  316. + });
  317. + };
  318. +
  319. + $scope.login = function() {
  320. + delete $scope.loginError;
  321. +
  322. + if (!$scope.loginForm.$valid) {
  323. + return;
  324. + }
  325. +
  326. + $http.post('/login', $scope.loginModel).then(function() {
  327. + $scope.emitAppEvent('logged-in');
  328. + $location.path('/');
  329. + }, function(err) {
  330. + if (err.status === 401) {
  331. + $scope.loginError = "Username or password is incorrect";
  332. + }
  333. + else {
  334. + $scope.loginError = "Unexpected error";
  335. + }
  336. + });
  337. + };
  338. +
  339. + $scope.init();
  340. +
  341. + });
  342. +
  343. +});
  344. diff --git a/src/css/less/p_pro.less b/src/css/less/p_pro.less
  345. index f50658e3f..029d312d4 100644
  346. --- a/src/css/less/p_pro.less
  347. +++ b/src/css/less/p_pro.less
  348. @@ -9,12 +9,17 @@
  349. top: 0;
  350. left: 0;
  351. width: 200px;
  352. - background: @grafanaPanelBackground;
  353. + background: @bodyBackground;
  354. border-right: 2px solid black;
  355. min-height: 100%;
  356. z-index: 101;
  357. }
  358. + .dashboard-notice {
  359. + margin-left: 200px;
  360. + width: auto;
  361. + }
  362. +
  363. .pro-main-view {
  364. padding-left: 200px;
  365. }
  366. @@ -24,6 +29,33 @@
  367. }
  368. }
  369. +.pro-sidemenu-items {
  370. +}
  371. +
  372. +.pro-sidemenu-link {
  373. + font-size: 1.0rem;
  374. + padding: 14px 10px 14px 20px;
  375. + display: block;
  376. + background: @grafanaPanelBackground;
  377. + color: @grayLight;
  378. + i {
  379. + padding-right: 15px;
  380. + }
  381. + border-bottom: 1px solid black;
  382. +}
  383. +
  384. +.pro-sidemenu-link:first-child {
  385. + // border-top: 1px solid black;
  386. +}
  387. +
  388. +.pro-side-menu-user {
  389. + padding-left: 5px;
  390. + img {
  391. + width: 49px;
  392. + padding-right: 10px;
  393. + }
  394. +}
  395. +
  396. .login-box {
  397. width: 700px;
  398. margin: 100px auto 0 auto;