diff --git a/awx/ui/client/lib/components/layout/layout.directive.js b/awx/ui/client/lib/components/layout/layout.directive.js
index f853c5bb19..c6fddc51e4 100644
--- a/awx/ui/client/lib/components/layout/layout.directive.js
+++ b/awx/ui/client/lib/components/layout/layout.directive.js
@@ -1,6 +1,6 @@
const templateUrl = require('~components/layout/layout.partial.html');
-function AtLayoutController ($scope, strings, $transitions) {
+function AtLayoutController ($scope, $http, strings, ProcessErrors, $transitions) {
const vm = this || {};
$transitions.onSuccess({}, (transition) => {
@@ -9,10 +9,14 @@ function AtLayoutController ($scope, strings, $transitions) {
$scope.$watch('$root.current_user', (val) => {
vm.isLoggedIn = val && val.username;
- if (val) {
+ if (!_.isEmpty(val)) {
vm.isSuperUser = $scope.$root.user_is_superuser || $scope.$root.user_is_system_auditor;
vm.currentUsername = val.username;
vm.currentUserId = val.id;
+
+ if (!vm.isSuperUser) {
+ checkOrgAdmin();
+ }
}
});
@@ -32,9 +36,27 @@ function AtLayoutController ($scope, strings, $transitions) {
return strings.get(string);
}
};
+
+ function checkOrgAdmin () {
+ const usersPath = `/api/v2/users/${vm.currentUserId}/admin_of_organizations/`;
+ $http.get(usersPath)
+ .then(({ data }) => {
+ if (data.count > 0) {
+ vm.isOrgAdmin = true;
+ } else {
+ vm.isOrgAdmin = false;
+ }
+ })
+ .catch(({ data, status }) => {
+ ProcessErrors(null, data, status, null, {
+ hdr: strings.get('error.HEADER'),
+ msg: strings.get('error.CALL', { path: usersPath, action: 'GET', status })
+ });
+ });
+ }
}
-AtLayoutController.$inject = ['$scope', 'ComponentsStrings', '$transitions'];
+AtLayoutController.$inject = ['$scope', '$http', 'ComponentsStrings', 'ProcessErrors', '$transitions'];
function atLayout () {
return {
diff --git a/awx/ui/client/lib/components/layout/layout.partial.html b/awx/ui/client/lib/components/layout/layout.partial.html
index ada6b2f1ea..4714a23172 100644
--- a/awx/ui/client/lib/components/layout/layout.partial.html
+++ b/awx/ui/client/lib/components/layout/layout.partial.html
@@ -85,7 +85,7 @@
system-admin-only="true">
+ ng-show="$parent.layoutVm.isSuperUser || $parent.layoutVm.isOrgAdmin">
diff --git a/awx/ui/test/unit/components/layout.unit.js b/awx/ui/test/unit/components/layout.unit.js
index 3b2140385e..76ecf0dcd6 100644
--- a/awx/ui/test/unit/components/layout.unit.js
+++ b/awx/ui/test/unit/components/layout.unit.js
@@ -1,6 +1,7 @@
describe('Components | Layout', () => {
let $compile;
let $rootScope;
+ let $httpBackend;
let element;
let scope;
@@ -10,11 +11,14 @@ describe('Components | Layout', () => {
angular.mock.module('ui.router');
angular.mock.module('at.lib.services');
angular.mock.module('at.lib.components');
+ angular.mock.module('Utilities');
+ angular.mock.module('ngCookies');
});
- beforeEach(angular.mock.inject((_$compile_, _$rootScope_) => {
+ beforeEach(angular.mock.inject((_$compile_, _$rootScope_, _$httpBackend_) => {
$compile = _$compile_;
$rootScope = _$rootScope_;
+ $httpBackend = _$httpBackend_;
scope = $rootScope.$new();
element = angular.element('');
@@ -26,7 +30,15 @@ describe('Components | Layout', () => {
let controller;
beforeEach(() => {
+ const mockResponse = {
+ data: {
+ count: 3
+ }
+ };
+
controller = element.controller('atLayout');
+ $httpBackend.when('GET', /admin_of_organizations/)
+ .respond(mockResponse);
});
xit('$scope.$on($stateChangeSuccess) should assign toState name to currentState', () => {
diff --git a/awx/ui/test/unit/components/side-nav-item.unit.js b/awx/ui/test/unit/components/side-nav-item.unit.js
index 0aa0bb63ef..e0deffa245 100644
--- a/awx/ui/test/unit/components/side-nav-item.unit.js
+++ b/awx/ui/test/unit/components/side-nav-item.unit.js
@@ -10,6 +10,8 @@ describe('Components | Side Nav Item', () => {
angular.mock.module('ui.router');
angular.mock.module('at.lib.services');
angular.mock.module('at.lib.components');
+ angular.mock.module('Utilities');
+ angular.mock.module('ngCookies');
});
beforeEach(angular.mock.inject((_$compile_, _$rootScope_) => {
diff --git a/awx/ui/test/unit/components/side-nav.unit.js b/awx/ui/test/unit/components/side-nav.unit.js
index e39da6075e..e460528a2e 100644
--- a/awx/ui/test/unit/components/side-nav.unit.js
+++ b/awx/ui/test/unit/components/side-nav.unit.js
@@ -15,6 +15,8 @@ describe('Components | Side Nav', () => {
angular.mock.module('at.lib.components', ($provide) => {
$provide.value('$window', windowMock);
});
+ angular.mock.module('Utilities');
+ angular.mock.module('ngCookies');
});
beforeEach(angular.mock.inject((_$compile_, _$rootScope_) => {