Browse Source

ux: more nav work

Torkel Ödegaard 8 years ago
parent
commit
7f0f0eb617

+ 7 - 6
pkg/api/index.go

@@ -99,8 +99,8 @@ func setIndexViewData(c *middleware.Context) (*dtos.IndexViewData, error) {
 
 
 	dashboardChildNavs := []*dtos.NavLink{
 	dashboardChildNavs := []*dtos.NavLink{
 		{Text: "Home", Url: setting.AppSubUrl + "/", Icon: "fa fa-fw fa-home"},
 		{Text: "Home", Url: setting.AppSubUrl + "/", Icon: "fa fa-fw fa-home"},
-		{Text: "Playlists", Url: setting.AppSubUrl + "/playlists", Icon: "fa fa-fw fa-film"},
-		{Text: "Snapshots", Url: setting.AppSubUrl + "/dashboard/snapshots", Icon: "icon-gf icon-gf-snapshot"},
+		{Text: "Playlists", Id: "playlists", Url: setting.AppSubUrl + "/playlists", Icon: "fa fa-fw fa-film"},
+		{Text: "Snapshots", Id: "snapshots", Url: setting.AppSubUrl + "/dashboard/snapshots", Icon: "icon-gf icon-gf-snapshot"},
 	}
 	}
 
 
 	data.NavTree = append(data.NavTree, &dtos.NavLink{
 	data.NavTree = append(data.NavTree, &dtos.NavLink{
@@ -249,10 +249,11 @@ func setIndexViewData(c *middleware.Context) (*dtos.IndexViewData, error) {
 				Icon: "fa fa-fw fa-shield",
 				Icon: "fa fa-fw fa-shield",
 				Url:  setting.AppSubUrl + "/admin",
 				Url:  setting.AppSubUrl + "/admin",
 				Children: []*dtos.NavLink{
 				Children: []*dtos.NavLink{
-					{Text: "Global Users", Url: setting.AppSubUrl + "/admin/users"},
-					{Text: "Global Orgs", Url: setting.AppSubUrl + "/admin/orgs"},
-					{Text: "Server Settings", Url: setting.AppSubUrl + "/admin/settings"},
-					{Text: "Server Stats", Url: setting.AppSubUrl + "/admin/stats"},
+					{Text: "Global Users", Id: "global-users", Url: setting.AppSubUrl + "/admin/users"},
+					{Text: "Global Orgs", Id: "global-orgs", Url: setting.AppSubUrl + "/admin/orgs"},
+					{Text: "Server Settings", Id: "server-settings", Url: setting.AppSubUrl + "/admin/settings"},
+					{Text: "Server Stats", Id: "server-stats", Url: setting.AppSubUrl + "/admin/stats"},
+					{Text: "Style Guide", Id: "styleguide", Url: setting.AppSubUrl + "/admin/styleguide"},
 				},
 				},
 			})
 			})
 		}
 		}

+ 42 - 0
public/app/core/components/gf_page.ts

@@ -0,0 +1,42 @@
+///<reference path="../../headers/common.d.ts" />
+
+import coreModule from 'app/core/core_module';
+
+const template = `
+<div class="scroll-canvas">
+  <navbar model="model"></navbar>
+   <div class="page-container">
+		<div class="page-header">
+      <h1>
+         <i class="{{::model.node.icon}}" ng-if="::model.node.icon"></i>
+         <img ng-src="{{::model.node.img}}" ng-if="::model.node.img"></i>
+         {{::model.node.text}}
+       </h1>
+
+      <div class="page-header__actions" ng-transclude="header"></div>
+		</div>
+
+    <div class="page-body" ng-transclude="body">
+    </div>
+  </div>
+</div>
+`;
+
+export function gfPageDirective() {
+  return {
+    restrict: 'E',
+    template: template,
+    scope: {
+      "model": "=",
+    },
+    transclude: {
+      'header': '?gfPageHeader',
+      'body': 'gfPageBody',
+    },
+    link: function(scope, elem, attrs) {
+      console.log(scope);
+    }
+  };
+}
+
+coreModule.directive('gfPage', gfPageDirective);

+ 2 - 0
public/app/core/core.ts

@@ -52,6 +52,7 @@ import {NavModelSrv, NavModel} from './nav_model_srv';
 import {userPicker} from './components/user_picker';
 import {userPicker} from './components/user_picker';
 import {userGroupPicker} from './components/user_group_picker';
 import {userGroupPicker} from './components/user_group_picker';
 import {geminiScrollbar} from './components/scroll/scroll';
 import {geminiScrollbar} from './components/scroll/scroll';
+import {gfPageDirective} from './components/gf_page';
 
 
 export {
 export {
   arrayJoin,
   arrayJoin,
@@ -83,4 +84,5 @@ export {
   userPicker,
   userPicker,
   userGroupPicker,
   userGroupPicker,
   geminiScrollbar,
   geminiScrollbar,
+  gfPageDirective
 };
 };

+ 3 - 4
public/app/features/admin/admin.ts

@@ -10,7 +10,7 @@ class AdminSettingsCtrl {
 
 
   /** @ngInject **/
   /** @ngInject **/
   constructor($scope, backendSrv, navModelSrv) {
   constructor($scope, backendSrv, navModelSrv) {
-    this.navModel = navModelSrv.getAdminNav();
+    this.navModel = navModelSrv.getNav('cfg', 'admin', 'server-settings');
 
 
     backendSrv.get('/api/admin/settings').then(function(settings) {
     backendSrv.get('/api/admin/settings').then(function(settings) {
       $scope.settings = settings;
       $scope.settings = settings;
@@ -34,7 +34,7 @@ export class AdminStatsCtrl {
 
 
   /** @ngInject */
   /** @ngInject */
   constructor(backendSrv: any, navModelSrv) {
   constructor(backendSrv: any, navModelSrv) {
-    this.navModel = navModelSrv.getAdminNav();
+    this.navModel = navModelSrv.getNav('cfg', 'admin', 'server-stats');
 
 
     backendSrv.get('/api/admin/stats').then(stats => {
     backendSrv.get('/api/admin/stats').then(stats => {
       this.stats = stats;
       this.stats = stats;
@@ -42,8 +42,7 @@ export class AdminStatsCtrl {
   }
   }
 }
 }
 
 
-export class ConfigurationHomeCtrl {
-  navModel: any;
+export class ConfigurationHomeCtrl { navModel: any;
 
 
   /** @ngInject */
   /** @ngInject */
   constructor(private $scope, private backendSrv, private navModelSrv) {
   constructor(private $scope, private backendSrv, private navModelSrv) {

+ 1 - 1
public/app/features/admin/adminEditOrgCtrl.js

@@ -9,7 +9,7 @@ function (angular) {
   module.controller('AdminEditOrgCtrl', function($scope, $routeParams, backendSrv, $location, navModelSrv) {
   module.controller('AdminEditOrgCtrl', function($scope, $routeParams, backendSrv, $location, navModelSrv) {
 
 
     $scope.init = function() {
     $scope.init = function() {
-      $scope.navModel = navModelSrv.getAdminNav();
+      $scope.navModel = navModelSrv.getNav('cfg', 'admin', 'global-orgs');
 
 
       if ($routeParams.id) {
       if ($routeParams.id) {
         $scope.getOrg($routeParams.id);
         $scope.getOrg($routeParams.id);

+ 1 - 1
public/app/features/admin/adminEditUserCtrl.js

@@ -11,7 +11,7 @@ function (angular, _) {
     $scope.user = {};
     $scope.user = {};
     $scope.newOrg = { name: '', role: 'Editor' };
     $scope.newOrg = { name: '', role: 'Editor' };
     $scope.permissions = {};
     $scope.permissions = {};
-    $scope.navModel = navModelSrv.getAdminNav();
+    $scope.navModel = navModelSrv.getNav('cfg', 'admin', 'global-users');
 
 
     $scope.init = function() {
     $scope.init = function() {
       if ($routeParams.id) {
       if ($routeParams.id) {

+ 1 - 1
public/app/features/admin/adminListOrgsCtrl.js

@@ -9,7 +9,7 @@ function (angular) {
   module.controller('AdminListOrgsCtrl', function($scope, backendSrv, navModelSrv) {
   module.controller('AdminListOrgsCtrl', function($scope, backendSrv, navModelSrv) {
 
 
     $scope.init = function() {
     $scope.init = function() {
-      $scope.navModel = navModelSrv.getAdminNav();
+      $scope.navModel = navModelSrv.getNav('cfg', 'admin', 'global-orgs');
       $scope.getOrgs();
       $scope.getOrgs();
     };
     };
 
 

+ 1 - 1
public/app/features/admin/admin_list_users_ctrl.ts

@@ -12,7 +12,7 @@ export default class AdminListUsersCtrl {
 
 
   /** @ngInject */
   /** @ngInject */
   constructor(private $scope, private backendSrv, private navModelSrv) {
   constructor(private $scope, private backendSrv, private navModelSrv) {
-    this.navModel = navModelSrv.getAdminNav();
+    this.navModel = navModelSrv.getNav('cfg', 'admin', 'global-users');
     this.query = '';
     this.query = '';
     this.getUsers();
     this.getUsers();
   }
   }

+ 26 - 22
public/app/features/admin/partials/admin_home.html

@@ -2,30 +2,34 @@
 
 
 <div class="page-container">
 <div class="page-container">
 	<div class="page-header">
 	<div class="page-header">
-		<h1>
-			Server Administration
-		</h1>
+		<page-h1 model="ctrl.navModel"></page-h1>
 	</div>
 	</div>
 
 
-	<a class="btn btn-inverse" href="admin/users">
-		Manage Users
-	</a>
-
-	<a class="btn btn-inverse" href="admin/orgs">
-		Manage Organizations
-	</a>
-
-	<a class="btn btn-inverse" href="admin/settings">
-		View Server Settings
-	</a>
-
-	<a class="btn btn-inverse" href="admin/stats">
-		View Server Stats
-	</a>
-
-	<a class="btn btn-inverse" href="styleguide">
-	  Style guide
-	</a>
+	<section class="card-section card-list-layout-grid">
+		<ol class="card-list" >
+			<li class="card-item-wrapper" ng-repeat="navItem in ctrl.navModel.node.children">
+				<a class="card-item" ng-href="{{::navItem.url}}">
+					<div class="card-item-header">
+						<div class="card-item-type">
+						</div>
+					</div>
+					<div class="card-item-body">
+						<figure class="card-item-figure">
+							<i class="{{navItem.icon}}"></i>
+						</figure>
+						<div class="card-item-details">
+							<div class="card-item-name">
+								{{navItem.text}}
+							</div>
+							<div class="card-item-sub-name">
+								{{navItem.description}}
+							</div>
+						</div>
+					</div>
+				</a>
+			</li>
+		</ol>
+	</section>
 
 
 </div>
 </div>
 
 

+ 2 - 6
public/app/features/admin/partials/configuration_home.html

@@ -1,12 +1,8 @@
-<navbar model="ctrl.navModel"></navbar>
-
 <div class="scroll-canvas">
 <div class="scroll-canvas">
+  <navbar model="ctrl.navModel"></navbar>
 	<div class="page-container">
 	<div class="page-container">
 		<div class="page-header">
 		<div class="page-header">
-			<h1>
-				<i class="fa fa-fw fa-cogs"></i>
-				<span>Configuration</span>
-			</h1>
+      <page-h1 model="ctrl.navModel"></page-h1>
 		</div>
 		</div>
 
 
 		<section class="card-section card-list-layout-grid">
 		<section class="card-section card-list-layout-grid">

+ 1 - 2
public/app/features/playlist/partials/playlist.html

@@ -2,8 +2,7 @@
 
 
 <div class="page-container" ng-form="playlistEditForm">
 <div class="page-container" ng-form="playlistEditForm">
 	<div class="page-header">
 	<div class="page-header">
-		<h1 ng-show="ctrl.isNew()">New Playlist</h1>
-		<h1 ng-show="!ctrl.isNew()">Edit Playlist</h1>
+		<page-h1 model="ctrl.navModel"></page-h1>
 	</div>
 	</div>
 
 
 	<p class="playlist-description">A playlist rotates through a pre-selected list of Dashboards. A Playlist can be a great way to build situational awareness, or just show off your metrics to your team or visitors.</p>
 	<p class="playlist-description">A playlist rotates through a pre-selected list of Dashboards. A Playlist can be a great way to build situational awareness, or just show off your metrics to your team or visitors.</p>

+ 2 - 2
public/app/features/playlist/partials/playlists.html

@@ -2,7 +2,7 @@
 
 
 <div class="page-container">
 <div class="page-container">
   <div class="page-header">
   <div class="page-header">
-    <h1>Saved playlists</h1>
+		<page-h1 model="ctrl.navModel"></page-h1>
     <a class="btn btn-success pull-right" href="playlists/create">
     <a class="btn btn-success pull-right" href="playlists/create">
       <i class="fa fa-plus"></i>
       <i class="fa fa-plus"></i>
       New Playlist
       New Playlist
@@ -13,7 +13,7 @@
     <thead>
     <thead>
       <th><strong>Name</strong></th>
       <th><strong>Name</strong></th>
       <th><strong>Start url</strong></th>
       <th><strong>Start url</strong></th>
-      <th style="width: 68px"></th>
+      <th style="width: 78px"></th>
       <th style="width: 78px"></th>
       <th style="width: 78px"></th>
       <th style="width: 25px"></th>
       <th style="width: 25px"></th>
     </thead>
     </thead>

+ 6 - 2
public/app/features/playlist/playlist_edit_ctrl.ts

@@ -27,19 +27,23 @@ export class PlaylistEditCtrl {
     private $route,
     private $route,
     private navModelSrv
     private navModelSrv
   ) {
   ) {
-
-    this.navModel = navModelSrv.getPlaylistsNav(0);
+    this.navModel = navModelSrv.getNav('dashboards', 'playlists');
 
 
     if ($route.current.params.id) {
     if ($route.current.params.id) {
       var playlistId = $route.current.params.id;
       var playlistId = $route.current.params.id;
 
 
       backendSrv.get('/api/playlists/' + playlistId).then(result => {
       backendSrv.get('/api/playlists/' + playlistId).then(result => {
         this.playlist = result;
         this.playlist = result;
+        this.navModel.node = {text: result.name, icon: this.navModel.node.icon};
+        this.navModel.breadcrumbs.push(this.navModel.node);
       });
       });
 
 
       backendSrv.get('/api/playlists/' + playlistId + '/items').then(result => {
       backendSrv.get('/api/playlists/' + playlistId + '/items').then(result => {
         this.playlistItems = result;
         this.playlistItems = result;
       });
       });
+    }  else {
+      this.navModel.node = {text: "New playlist", icon: this.navModel.node.icon};
+      this.navModel.breadcrumbs.push(this.navModel.node);
     }
     }
   }
   }
 
 

+ 1 - 1
public/app/features/playlist/playlists_ctrl.ts

@@ -10,7 +10,7 @@ export class PlaylistsCtrl {
 
 
   /** @ngInject */
   /** @ngInject */
   constructor(private $scope, private $location, private backendSrv, private navModelSrv) {
   constructor(private $scope, private $location, private backendSrv, private navModelSrv) {
-    this.navModel = navModelSrv.getPlaylistsNav(0);
+    this.navModel = navModelSrv.getNav('dashboards', 'playlists');
 
 
     backendSrv.get('/api/playlists').then(result => {
     backendSrv.get('/api/playlists').then(result => {
       this.playlists = result;
       this.playlists = result;

+ 1 - 2
public/app/features/plugins/partials/ds_edit.html

@@ -1,6 +1,5 @@
-<navbar model="ctrl.navModel"></navbar>
-
 <div class="scroll-canvas">
 <div class="scroll-canvas">
+  <navbar model="ctrl.navModel"></navbar>
 	<div class="page-container">
 	<div class="page-container">
 		<div class="page-header">
 		<div class="page-header">
 			<page-h1 model="ctrl.navModel"></page-h1>
 			<page-h1 model="ctrl.navModel"></page-h1>

+ 3 - 3
public/app/features/plugins/partials/ds_list.html

@@ -1,7 +1,6 @@
-<navbar model="ctrl.navModel"></navbar>
-
 <div class="scroll-canvas">
 <div class="scroll-canvas">
-	<div class="page-container">
+  <navbar model="ctrl.navModel"></navbar>
+  <div class="page-container">
 		<div class="page-header">
 		<div class="page-header">
 			<page-h1 model="ctrl.navModel"></page-h1>
 			<page-h1 model="ctrl.navModel"></page-h1>
 
 
@@ -48,3 +47,4 @@
 		</div>
 		</div>
 	</div>
 	</div>
 </div>
 </div>
+

+ 3 - 6
public/app/features/snapshot/partials/snapshots.html

@@ -2,20 +2,17 @@
 
 
 <div class="page-container">
 <div class="page-container">
   <div class="page-header">
   <div class="page-header">
-    <h1>Available snapshots</h1>
+		<page-h1 model="ctrl.navModel"></page-h1>
   </div>
   </div>
 
 
-
    <table class="filter-table" style="margin-top: 20px">
    <table class="filter-table" style="margin-top: 20px">
     <thead>
     <thead>
       <th><strong>Name</strong></th>
       <th><strong>Name</strong></th>
       <th><strong>Snapshot url</strong></th>
       <th><strong>Snapshot url</strong></th>
       <th style="width: 70px"></th>
       <th style="width: 70px"></th>
       <th style="width: 25px"></th>
       <th style="width: 25px"></th>
-
-   </thead>
-
-    <tr ng-repeat="snapshot in ctrl.snapshots">
+		</thead>
+		<tr ng-repeat="snapshot in ctrl.snapshots">
       <td>
       <td>
 				<a href="dashboard/snapshot/{{snapshot.key}}">{{snapshot.name}}</a>
 				<a href="dashboard/snapshot/{{snapshot.key}}">{{snapshot.name}}</a>
       </td>
       </td>

+ 2 - 10
public/app/features/snapshot/snapshot_ctrl.ts

@@ -8,16 +8,8 @@ export class SnapshotsCtrl {
   snapshots: any;
   snapshots: any;
 
 
   /** @ngInject */
   /** @ngInject */
-  constructor(private $rootScope, private backendSrv) {
-    this.navModel = {
-      section: {
-        title: 'Snapshots',
-        icon:  'icon-gf icon-gf-snapshot',
-        url: 'dashboard/snapshots',
-      },
-      menu: [],
-    };
-
+  constructor(private $rootScope, private backendSrv, navModelSrv) {
+    this.navModel = navModelSrv.getNav('dashboards', 'snapshots');
     this.backendSrv.get('/api/dashboard/snapshots').then(result => {
     this.backendSrv.get('/api/dashboard/snapshots').then(result => {
       this.snapshots = result;
       this.snapshots = result;
     });
     });

+ 1 - 1
public/app/features/styleguide/styleguide.html

@@ -2,7 +2,7 @@
 
 
 <div class="page-container">
 <div class="page-container">
 	<div class="page-header">
 	<div class="page-header">
-		<h1>Style Guide</h1>
+    <page-h1 model="ctrl.navModel"></page-h1>
 
 
 		<a class="btn btn-success" ng-click="ctrl.switchTheme()">
 		<a class="btn btn-success" ng-click="ctrl.switchTheme()">
 			<i class="fa fa-random"></i>
 			<i class="fa fa-random"></i>

+ 1 - 1
public/app/features/styleguide/styleguide.ts

@@ -16,7 +16,7 @@ class StyleGuideCtrl {
 
 
   /** @ngInject **/
   /** @ngInject **/
   constructor(private $http, private $routeParams, private $location, private backendSrv, navModelSrv) {
   constructor(private $http, private $routeParams, private $location, private backendSrv, navModelSrv) {
-    this.navModel = navModelSrv.getAdminNav();
+    this.navModel = navModelSrv.getNav('cfg', 'admin', 'styleguide');
     this.theme = config.bootData.user.lightTheme ? 'light': 'dark';
     this.theme = config.bootData.user.lightTheme ? 'light': 'dark';
     this.page = {};
     this.page = {};
 
 

+ 1 - 1
public/sass/components/_cards.scss

@@ -144,7 +144,7 @@
 
 
   .card-item-wrapper {
   .card-item-wrapper {
     width: 100%;
     width: 100%;
-    padding: 0 1.5rem 1.5rem 0rem;
+    padding: 0 1rem 1rem 0rem;
   }
   }
 
 
   .card-item-wrapper--clickable {
   .card-item-wrapper--clickable {

+ 5 - 1
public/sass/layout/_page.scss

@@ -25,8 +25,12 @@
 .scroll-canvas {
 .scroll-canvas {
   position: absolute;
   position: absolute;
   width: 100%;
   width: 100%;
-  height: calc(100% - 54px);
   overflow: auto;
   overflow: auto;
+  height: 100%;
+
+  &.dashboard-container {
+    height: calc(100% - 54px);
+  }
 }
 }
 
 
 .page-body {
 .page-body {