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_) => {