Update navigation to accordian-style menu
- New navigation provides intuitive structure for showing relationship
between sections and pages
- Menu keeps an open state, which allows easy clicking to sibling pages
- Ability to preview all page sections w/o hover over blocking page content
- Allows user to see where they are within navigation at all times
Tested: Opened each page and confirmed new navigation worked, clicked through
to all pages successfully.
Change-Id: Ie10dc95d8e15ee9bf89a3bec9ff231c0a7065ed9
Signed-off-by: Kathy Pine <kathryn.elainex.pine@intel.com>
diff --git a/app/common/directives/app-navigation.html b/app/common/directives/app-navigation.html
index 435980a..41441e2 100644
--- a/app/common/directives/app-navigation.html
+++ b/app/common/directives/app-navigation.html
@@ -1,97 +1,119 @@
<nav class="nav__wrapper">
<ul id="nav__top-level" ng-style="navStyle">
<li>
- <a class="btn-overview" ng-class="{opened: firstLevel == 'overview'}" href="#/overview/server" ng-click="change('overview')">
+ <button ng-click="change('overview')">
<icon class="nav-icon" file="icon-overview.svg" aria-hidden="true"></icon>
- Server overview
- </a>
- </li>
- <li>
- <button class="btn-health" ng-class="{opened: firstLevel == 'server-health'}" ng-click="change('server-health')">
- <icon class="nav-icon" file="icon-health.svg" aria-hidden="true"></icon>
- Server health
+ <span class="nav-link">Overview</span>
</button>
- <ul class="nav__second-level btn-health" ng-style="navStyle" ng-class="{opened: (showSubMenu && firstLevel == 'server-health')}">
- <li ng-class="{'active': (path == '/server-health/event-log')}">
- <a href="#/server-health/event-log" ng-click="closeSubnav()" tabindex="{{(showSubMenu && firstLevel == 'server-health') ? 0 : -1}}">Event log</a>
+ </li>
+ <li ng-class="{opened: showHealthMenu}">
+ <button class="btn-health" ng-click="change('server-health')">
+ <icon class="nav-icon" file="icon-health.svg" aria-hidden="true"></icon>
+ <span class="nav-link">Health</span>
+ </button>
+ <ul class="nav__second-level btn-health" ng-style="navStyle" ng-class="{opened: (showHealthMenu)}">
+ <li ng-class="{'active': (path == '/server-health/sys-log')}">
+ <a href="#/server-health/sys-log" tabindex="{{(showHealthMenu) ? 0 : -1}}">
+ <span>Event log</span>
+ </a>
</li>
<li ng-class="{'active': (path == '/server-health/inventory-overview' || path == '/server-health/inventory')}">
- <a href="#/server-health/inventory-overview" ng-click="closeSubnav()" tabindex="{{(showSubMenu && firstLevel == 'server-health') ? 0 : -1}}">Hardware status</a>
+ <a href="#/server-health/inventory-overview" tabindex="{{(showHealthMenu) ? 0 : -1}}">
+ <span>Hardware status</span>
+ </a>
</li>
<li ng-class="{'active': (path == '/server-health/sensors-overview' || path == '/server-health/sensors')}">
- <a href="#/server-health/sensors-overview" ng-click="closeSubnav()" tabindex="{{(showSubMenu && firstLevel == 'server-health') ? 0 : -1}}">Sensors</a>
- </li>
- <li ng-class="{'active': (path == '/server-health/sys-log')}" ng-show="!dataService.configJson.redfishEventLogDisabled">
- <a href="#/server-health/sys-log" ng-click="closeSubnav()" tabindex="{{(showSubMenu && firstLevel == 'server-health') ? 0 : -1}}">System logs</a>
+ <a href="#/server-health/sensors-overview" tabindex="{{(showHealthMenu) ? 0 : -1}}">
+ <span>Sensors</span>
+ </a>
</li>
</ul>
</li>
- <li>
- <button class="btn-control" ng-class="{opened: firstLevel == 'server-control'}" ng-click="change('server-control')">
- <icon class="nav-icon nav-icon__control" file="icon-control.svg" aria-hidden="true"></icon>
- Server control
+ <li ng-class="{opened: showControlMenu}">
+ <button ng-click="change('server-control')">
+ <icon class="nav-icon" file="icon-control.svg" aria-hidden="true"></icon>
+ <span class="nav-link">Control</span>
</button>
- <ul class="nav__second-level btn-control" ng-style="navStyle" ng-class="{opened: (showSubMenu && firstLevel == 'server-control')}">
+ <ul class="nav__second-level btn-control" ng-class="{opened: (showControlMenu)}">
<li ng-class="{'active': (path == '/server-control' || path == '/server-control/power-operations')}">
- <a href="#/server-control/power-operations" ng-click="closeSubnav()" tabindex="{{(showSubMenu && firstLevel == 'server-control') ? 0 : -1}}">Server power operations</a>
+ <a href="#/server-control/power-operations" tabindex="{{(showControlMenu) ? 0 : -1}}">
+ <span>Server power operations</span>
+ </a>
</li>
<li ng-class="{'active': (path == '/server-control/power-usage')}">
- <a href="#/server-control/power-usage" ng-click="closeSubnav()" tabindex="{{(showSubMenu && firstLevel == 'server-control') ? 0 : -1}}">Manage power usage</a>
+ <a href="#/server-control/power-usage" tabindex="{{(showControlMenu) ? 0 : -1}}">
+ <span>Manage power usage</span>
+ </a>
</li>
<li ng-class="{'active': (path == '/server-control/server-led')}">
- <a href="#/server-control/server-led" ng-click="closeSubnav()" tabindex="{{(showSubMenu && firstLevel == 'server-control') ? 0 : -1}}">Server LED</a>
+ <a href="#/server-control/server-led" tabindex="{{(showControlMenu) ? 0 : -1}}">
+ <span>Server LED</span>
+ </a>
</li>
<li ng-class="{'active': (path == '/server-control/bmc-reboot')}">
- <a href="#/server-control/bmc-reboot" ng-click="closeSubnav()" tabindex="{{(showSubMenu && firstLevel == 'server-control') ? 0 : -1}}">Reboot BMC</a>
+ <a href="#/server-control/bmc-reboot" tabindex="{{(showControlMenu) ? 0 : -1}}">
+ <span>Reboot BMC</span>
+ </a>
</li>
<li ng-class="{'active': (path == '/server-control/remote-console')}">
- <a href="#/server-control/remote-console" ng-click="closeSubnav()" tabindex="{{(showSubMenu && firstLevel == 'server-control') ? 0 : -1}}">Serial over LAN console</a>
+ <a href="#/server-control/remote-console" tabindex="{{(showControlMenu) ? 0 : -1}}">
+ <span>Serial over LAN console</span>
+ </a>
</li>
<li ng-class="{'active': (path == '/server-control/kvm')}">
- <a href="#/server-control/kvm" ng-click="closeSubnav()" tabindex="{{(showSubMenu && firstLevel == 'server-control') ? 0 : -1}}">KVM</a>
+ <a href="#/server-control/kvm" tabindex="{{(showControlMenu) ? 0 : -1}}">
+ <span>KVM</span>
+ </a>
</li>
- <li ng-class="{'active': (path == '/server-control/virtual-media')}">
- <a href="#/server-control/virtual-media" ng-click="closeSubnav()"
- tabindex="{{(showSubMenu && firstLevel == 'server-control') ? 0 : -1}}">Virtual Media</a>
+ <li ng-class="{'active': (path == '/configuration' || path == '/configuration/virtual-media')}">
+ <a href="#/server-control/virtual-media" tabindex="{{(showControlMenu) ? 0 : -1}}">
+ <span>Virtual Media</span>
+ </a>
</li>
</ul>
</li>
- <li>
- <button class="btn-config" ng-class="{opened: firstLevel == 'configuration'}" ng-click="change('configuration')">
+ <li ng-class="{opened: showConfigMenu}">
+ <button ng-click="change('configuration')">
<icon class="nav-icon" file="icon-config.svg" aria-hidden="true"></icon>
- Server configuration
+ <span class="nav-link">Configuration</span>
</button>
- <ul class="nav__second-level btn-firmware" ng-style="navStyle" ng-class="{opened: (showSubMenu && firstLevel == 'configuration')}">
+ <ul class="nav__second-level btn-firmware" ng-class="{opened: (showConfigMenu)}">
<li ng-class="{'active': (path == '/configuration' || path == '/configuration/network')}">
- <a href="#/configuration/network" ng-click="closeSubnav()" tabindex="{{(showSubMenu && firstLevel == 'configuration') ? 0 : -1}}">Network settings</a>
+ <a href="#/configuration/network" tabindex="{{(showConfigMenu) ? 0 : -1}}"><span>Network
+ settings</span></a>
</li>
<li ng-class="{'active': (path == '/configuration' || path == '/configuration/snmp')}">
- <a href="#/configuration/snmp" ng-click="closeSubnav()" tabindex="{{(showSubMenu && firstLevel == 'configuration') ? 0 : -1}}">SNMP settings</a>
+ <a href="#/configuration/snmp" tabindex="{{(showConfigMenu) ? 0 : -1}}"><span>SNMP
+ settings</span></a>
</li>
<li ng-class="{'active': (path == '/configuration' || path == '/configuration/firmware')}">
- <a href="#/configuration/firmware" ng-click="closeSubnav()" tabindex="{{(showSubMenu && firstLevel == 'configuration') ? 0 : -1}}">Firmware</a>
+ <a href="#/configuration/firmware" tabindex="{{(showConfigMenu) ? 0 : -1}}"><span>Firmware</span></a>
</li>
<li ng-class="{'active': (path == '/configuration' || path == '/configuration/date-time')}">
- <a href="#/configuration/date-time" ng-click="closeSubnav()" tabindex="{{(showSubMenu && firstLevel == 'configuration') ? 0 : -1}}">Date and time settings</a>
+ <a href="#/configuration/date-time" tabindex="{{(showConfigMenu) ? 0 : -1}}"><span>Date and
+ time
+ settings</span></a>
</li>
</ul>
</li>
- <li>
- <button class="btn-access-control" ng-class="{opened: firstLevel == 'access-control'}" ng-click="change('access-control')">
- <icon class="nav-icon nav-icon__key" file="icon-key.svg" aria-hidden="true"></icon>
- Access control
+ <li ng-class="{opened: showAccessMenu}">
+ <button ng-click="change('access-control')">
+ <icon class="nav-icon" file="icon-user.svg" aria-hidden="true"></icon>
+ <span class="nav-link">Access</span>
</button>
- <ul class="nav__second-level btn-access-control" ng-style="navStyle" ng-class="{opened: (showSubMenu && firstLevel == 'access-control')}">
+ <ul class="nav__second-level btn-users" ng-style="navStyle" ng-class="{opened: (showAccessMenu)}">
<li ng-class="{'active': (path == '/access-control' || path == '/access-control/ldap')}">
- <a href="#/access-control/ldap" ng-click="closeSubnav()" tabindex="{{(showSubMenu && firstLevel == 'configuration') ? 0 : -1}}">LDAP</a>
+ <a href="#/access-control/ldap" tabindex="{{ (showAccessMenu) ? 0 : -1}}"><span>LDAP</span></a>
</li>
<li ng-class="{'active': (path == '/access-control' || path == '/access-control/local-users')}">
- <a href="#/access-control/local-users" ng-click="closeSubnav()" tabindex="{{ (showSubMenu && firstLevel == 'access-control') ? 0 : -1}}">Local users</a>
+ <a href="#/access-control/local-users" tabindex="{{ (showAccessMenu) ? 0 : -1}}"><span>Local
+ users</span></a>
</li>
<li ng-class="{'active': (path == '/access-control' || path == '/access-control/ssl-certificates')}">
- <a href="#/access-control/ssl-certificates" ng-click="closeSubnav()" tabindex="{{(showSubMenu && firstLevel == 'configuration') ? 0 : -1}}">SSL certificates</a>
+ <a href="#/access-control/ssl-certificates" tabindex="{{ (showAccessMenu) ? 0 : -1}}"><span>SSL
+ certificates</span></a>
</li>
</ul>
</li>
</ul>
-</nav>
+</nav>
\ No newline at end of file
diff --git a/app/common/directives/app-navigation.js b/app/common/directives/app-navigation.js
index baa8c8b..a2ced03 100644
--- a/app/common/directives/app-navigation.js
+++ b/app/common/directives/app-navigation.js
@@ -10,18 +10,30 @@
'controller': [
'$scope', '$location', 'dataService',
function($scope, $location, dataService) {
+ $scope.showHealthMenu = false;
+ $scope.showControlMenu = false;
+ $scope.showConfigMenu = false;
+ $scope.showAccessMenu = false;
$scope.dataService = dataService;
- $scope.showSubMenu = false;
+
$scope.change = function(firstLevel) {
- if (firstLevel != $scope.firstLevel) {
- $scope.firstLevel = firstLevel;
- $scope.showSubMenu = true;
- } else {
- $scope.showSubMenu = !$scope.showSubMenu;
- }
- };
- $scope.closeSubnav = function() {
- $scope.showSubMenu = false;
+ switch (firstLevel) {
+ case 'server-health':
+ $scope.showHealthMenu = !$scope.showHealthMenu;
+ break;
+ case 'server-control':
+ $scope.showControlMenu = !$scope.showControlMenu;
+ break;
+ case 'configuration':
+ $scope.showConfigMenu = !$scope.showConfigMenu;
+ break;
+ case 'access-control':
+ $scope.showAccessMenu = !$scope.showAccessMenu;
+ break;
+ case 'overview':
+ $location.url('/overview/server');
+ break;
+ };
};
$scope.$watch('path', function() {
var urlRoot = $location.path().split('/')[1];
@@ -30,22 +42,15 @@
} else {
$scope.firstLevel = 'overview';
}
- $scope.showSubMenu = false;
+ $scope.showSubMenu = true;
});
$scope.$watch('showNavigation', function() {
- var paddingTop = 0;
var urlRoot = $location.path().split('/')[1];
if (urlRoot != '') {
$scope.firstLevel = urlRoot;
} else {
$scope.firstLevel = 'overview';
}
-
- if ($scope.showNavigation) {
- paddingTop = document.getElementById('header').offsetHeight;
- }
- dataService.bodyStyle = {'padding-top': paddingTop + 'px'};
- $scope.navStyle = {'top': paddingTop + 'px'};
});
}
],
@@ -56,11 +61,11 @@
if (scope.showSubMenu) {
scope.$apply(function() {
- scope.showSubMenu = false;
+ scope.showSubMenu = true;
});
}
});
}
};
});
-})(window.angular);
+})(window.angular);
\ No newline at end of file