From e1138dc2619266c43cca9bd36aae6accf14541e9 Mon Sep 17 00:00:00 2001 From: John Mitchell Date: Fri, 14 Aug 2015 18:23:09 -0400 Subject: [PATCH 1/7] Reimplemented permissions as a module and pull of permissions label text from the api --- awx/ui/client/src/app.js | 74 +--- awx/ui/client/src/controllers/Permissions.js | 409 ------------------ awx/ui/client/src/controllers/Teams.js | 24 +- awx/ui/client/src/controllers/Users.js | 22 +- awx/ui/client/src/forms.js | 2 - awx/ui/client/src/forms/Permissions.js | 159 ------- awx/ui/client/src/forms/Teams.js | 3 +- awx/ui/client/src/helpers.js | 2 - awx/ui/client/src/helpers/Permissions.js | 79 ---- awx/ui/client/src/lists.js | 2 - awx/ui/client/src/permissions/main.js | 24 + .../src/permissions/permissions-add/main.js | 21 + .../permissions-add.controller.js | 151 +++++++ .../permissions-team-add.route.js | 19 + .../permissions-user-add.route.js | 19 + .../permissions-category-change.factory.js | 74 ++++ .../src/permissions/permissions-edit/main.js | 21 + .../permissions-edit.controller.js | 178 ++++++++ .../permissions-team-edit.route.js | 19 + .../permissions-user-edit.route.js | 19 + .../src/permissions/permissions-form.js | 158 +++++++ .../permissions/permissions-labels.factory.js | 46 ++ .../permissions-list.js} | 10 +- .../src/permissions/permissions-list/main.js | 21 + .../permissions-list.controller.js | 116 +++++ .../permissions-team-list.route.js | 19 + .../permissions-user-list.route.js | 19 + .../permissions/team-permissions.partial.html | 18 + .../permissions/user-permissions.partial.html | 18 + 29 files changed, 1009 insertions(+), 737 deletions(-) delete mode 100644 awx/ui/client/src/controllers/Permissions.js delete mode 100644 awx/ui/client/src/forms/Permissions.js delete mode 100644 awx/ui/client/src/helpers/Permissions.js create mode 100644 awx/ui/client/src/permissions/main.js create mode 100644 awx/ui/client/src/permissions/permissions-add/main.js create mode 100644 awx/ui/client/src/permissions/permissions-add/permissions-add.controller.js create mode 100644 awx/ui/client/src/permissions/permissions-add/permissions-team-add.route.js create mode 100644 awx/ui/client/src/permissions/permissions-add/permissions-user-add.route.js create mode 100644 awx/ui/client/src/permissions/permissions-category-change.factory.js create mode 100644 awx/ui/client/src/permissions/permissions-edit/main.js create mode 100644 awx/ui/client/src/permissions/permissions-edit/permissions-edit.controller.js create mode 100644 awx/ui/client/src/permissions/permissions-edit/permissions-team-edit.route.js create mode 100644 awx/ui/client/src/permissions/permissions-edit/permissions-user-edit.route.js create mode 100644 awx/ui/client/src/permissions/permissions-form.js create mode 100644 awx/ui/client/src/permissions/permissions-labels.factory.js rename awx/ui/client/src/{lists/Permissions.js => permissions/permissions-list.js} (95%) create mode 100644 awx/ui/client/src/permissions/permissions-list/main.js create mode 100644 awx/ui/client/src/permissions/permissions-list/permissions-list.controller.js create mode 100644 awx/ui/client/src/permissions/permissions-list/permissions-team-list.route.js create mode 100644 awx/ui/client/src/permissions/permissions-list/permissions-user-list.route.js create mode 100644 awx/ui/client/src/permissions/team-permissions.partial.html create mode 100644 awx/ui/client/src/permissions/user-permissions.partial.html diff --git a/awx/ui/client/src/app.js b/awx/ui/client/src/app.js index 362e89770a..d5fc78bfb2 100644 --- a/awx/ui/client/src/app.js +++ b/awx/ui/client/src/app.js @@ -30,6 +30,7 @@ import {JobsListController} from './controllers/Jobs'; import {PortalController} from './controllers/Portal'; import systemTracking from './system-tracking/main'; import inventoryScripts from './inventory-scripts/main'; +import permissions from './permissions/main'; import managementJobs from './management-jobs/main'; import routeExtensions from './shared/route-extensions/main'; import breadcrumbs from './shared/breadcrumbs/main'; @@ -55,7 +56,6 @@ import {AdhocCtrl} from './controllers/Adhoc'; import {AdminsList} from './controllers/Admins'; import {UsersList, UsersAdd, UsersEdit} from './controllers/Users'; import {TeamsList, TeamsAdd, TeamsEdit} from './controllers/Teams'; -import {PermissionsAdd, PermissionsList, PermissionsEdit} from './controllers/Permissions'; import './shared/RestServices'; import './shared/api-loader'; import './shared/form-generator'; @@ -86,6 +86,7 @@ var tower = angular.module('Tower', [ breadcrumbs.name, systemTracking.name, inventoryScripts.name, + permissions.name, managementJobs.name, setupMenu.name, mainMenu.name, @@ -140,9 +141,6 @@ var tower = angular.module('Tower', [ 'ProjectFormDefinition', 'ProjectStatusDefinition', 'ProjectsHelper', - 'PermissionFormDefinition', - 'PermissionListDefinition', - 'PermissionsHelper', 'CompletedJobsDefinition', 'AllJobsDefinition', 'JobFormDefinition', @@ -591,39 +589,6 @@ var tower = angular.module('Tower', [ } }). - when('/teams/:team_id/permissions/add', { - name: 'teamPermissionAdd', - templateUrl: urlPrefix + 'partials/teams.html', - controller: PermissionsAdd, - resolve: { - features: ['FeaturesService', function(FeaturesService) { - return FeaturesService.get(); - }] - } - }). - - when('/teams/:team_id/permissions', { - name: 'teamPermissions', - templateUrl: urlPrefix + 'partials/teams.html', - controller: PermissionsList, - resolve: { - features: ['FeaturesService', function(FeaturesService) { - return FeaturesService.get(); - }] - } - }). - - when('/teams/:team_id/permissions/:permission_id', { - name: 'teamPermissionEdit', - templateUrl: urlPrefix + 'partials/teams.html', - controller: PermissionsEdit, - resolve: { - features: ['FeaturesService', function(FeaturesService) { - return FeaturesService.get(); - }] - } - }). - when('/teams/:team_id/users', { name: 'teamUsers', templateUrl: urlPrefix + 'partials/teams.html', @@ -789,39 +754,6 @@ var tower = angular.module('Tower', [ } }). - when('/users/:user_id/permissions/add', { - name: 'userPermissionAdd', - templateUrl: urlPrefix + 'partials/users.html', - controller: PermissionsAdd, - resolve: { - features: ['FeaturesService', function(FeaturesService) { - return FeaturesService.get(); - }] - } - }). - - when('/users/:user_id/permissions', { - name: 'userPermissions', - templateUrl: urlPrefix + 'partials/users.html', - controller: PermissionsList, - resolve: { - features: ['FeaturesService', function(FeaturesService) { - return FeaturesService.get(); - }] - } - }). - - when('/users/:user_id/permissions/:permission_id', { - name: 'userPermissionEdit', - templateUrl: urlPrefix + 'partials/users.html', - controller: PermissionsEdit, - resolve: { - features: ['FeaturesService', function(FeaturesService) { - return FeaturesService.get(); - }] - } - }). - when('/users/:user_id/credentials/add', { name: 'userCredentialAdd', templateUrl: urlPrefix + 'partials/teams.html', @@ -896,7 +828,7 @@ var tower = angular.module('Tower', [ }] } }). - + when('/license', { name: 'license', templateUrl: urlPrefix + 'partials/license.html', diff --git a/awx/ui/client/src/controllers/Permissions.js b/awx/ui/client/src/controllers/Permissions.js deleted file mode 100644 index 82c05cdff0..0000000000 --- a/awx/ui/client/src/controllers/Permissions.js +++ /dev/null @@ -1,409 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - -/** - * @ngdoc function - * @name controllers.function:Permissions - * @description This controller's for permissions -*/ - - -export function PermissionsList($scope, $rootScope, $location, $log, $routeParams, Rest, Alert, PermissionList, - GenerateList, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit, ReturnToCaller, ClearScope, ProcessErrors, - GetBasePath, CheckAccess, Wait) { - - ClearScope(); - - var list = PermissionList, - base = $location.path().replace(/^\//, '').split('/')[0], - defaultUrl = GetBasePath(base), - generator = GenerateList; - - generator.inject(list, { mode: 'edit', scope: $scope, breadCrumbs: true }); - defaultUrl += ($routeParams.user_id !== undefined) ? $routeParams.user_id : $routeParams.team_id; - defaultUrl += '/permissions/'; - - $scope.selected = []; - - CheckAccess({ - scope: $scope - }); - - if ($scope.removePostRefresh) { - $scope.removePostRefresh(); - } - $scope.removePostRefresh = $scope.$on('PostRefresh', function () { - // Cleanup after a delete - Wait('stop'); - $('#prompt-modal').modal('hide'); - }); - - SearchInit({ - scope: $scope, - set: 'permissions', - list: list, - url: defaultUrl - }); - PaginateInit({ - scope: $scope, - list: list, - url: defaultUrl - }); - $scope.search(list.iterator); - - LoadBreadCrumbs(); - - $scope.addPermission = function () { - if ($scope.PermissionAddAllowed) { - $location.path($location.path() + '/add'); - } - }; - - // if the permission includes adhoc (and is not admin), display that - $scope.getPermissionText = function () { - if (this.permission.permission_type !== "admin" && this.permission.run_ad_hoc_commands) { - return this.permission.permission_type + " + run commands"; - } else { - return this.permission.permission_type; - } - }; - - $scope.editPermission = function (id) { - $location.path($location.path() + '/' + id); - }; - - $scope.deletePermission = function (id, name) { - var action = function () { - $('#prompt-modal').modal('hide'); - Wait('start'); - var url = GetBasePath('base') + 'permissions/' + id + '/'; - Rest.setUrl(url); - Rest.destroy() - .success(function () { - $scope.search(list.iterator); - }) - .error(function (data, status) { - Wait('stop'); - ProcessErrors($scope, data, status, null, { hdr: 'Error!', - msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status }); - }); - }; - - if ($scope.PermissionAddAllowed) { - Prompt({ - hdr: 'Delete', - body: 'Are you sure you want to delete ' + name + '?', - action: action - }); - } - }; -} - -PermissionsList.$inject = ['$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'PermissionList', - 'generateList', 'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', - 'ClearScope', 'ProcessErrors', 'GetBasePath', 'CheckAccess', 'Wait' -]; - - -export function PermissionsAdd($scope, $rootScope, $compile, $location, $log, $routeParams, PermissionsForm, - GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ClearScope, - GetBasePath, ReturnToCaller, InventoryList, ProjectList, LookUpInit, CheckAccess, - Wait, PermissionCategoryChange) { - - ClearScope(); - - // Inject dynamic view - var form = PermissionsForm, - generator = GenerateForm, - id = ($routeParams.user_id !== undefined) ? $routeParams.user_id : $routeParams.team_id, - base = $location.path().replace(/^\//, '').split('/')[0], - master = {}; - - generator.inject(form, { mode: 'add', related: false, scope: $scope }); - CheckAccess({ scope: $scope }); - generator.reset(); - LoadBreadCrumbs(); - - $scope.inventoryrequired = true; - $scope.projectrequired = false; - $scope.category = 'Inventory'; - master.category = 'Inventory'; - master.inventoryrequired = true; - master.projectrequired = false; - $scope.run_ad_hoc_commands = false; - - LookUpInit({ - scope: $scope, - form: form, - current_item: null, - list: InventoryList, - field: 'inventory', - input_type: 'radio' - }); - - LookUpInit({ - scope: $scope, - form: form, - current_item: null, - list: ProjectList, - field: 'project', - input_type: 'radio' - }); - - $scope.$watch("category", function(val) { - if (val === 'Deploy') { - $scope.projectrequired = true; - LookUpInit({ - scope: $scope, - form: form, - current_item: null, - list: ProjectList, - field: 'project', - input_type: 'radio' - }); - } else { - $scope.projectrequired = false; - } - }); - - $scope.changeAdhocCommandCheckbox = function () { - if ($scope.category === 'Deploy') { - $scope.run_ad_hoc_command = false; - } else { - if ($scope.permission_type === 'admin') { - $scope.run_ad_hoc_commands = true; - $("#permission_run_ad_hoc_commands_chbox").attr("disabled", true); - } else { - if (!$scope.run_ad_hoc_commands) { - $scope.run_ad_hoc_commands = false; - } - $("#permission_run_ad_hoc_commands_chbox").attr("disabled", false); - } - } - }; - - // Save - $scope.formSave = function () { - var fld, url, data = {}; - generator.clearApiErrors(); - Wait('start'); - if ($scope.PermissionAddAllowed) { - data = {}; - for (fld in form.fields) { - data[fld] = $scope[fld]; - } - // job template (or deploy) based permissions do not have the run - // ad hoc commands parameter - if (data.category === "Deploy") { - data.run_ad_hoc_commands = false; - } else { - delete data.project; - } - - url = (base === 'teams') ? GetBasePath('teams') + id + '/permissions/' : GetBasePath('users') + id + '/permissions/'; - Rest.setUrl(url); - Rest.post(data) - .success(function () { - Wait('stop'); - ReturnToCaller(1); - }) - .error(function (data, status) { - Wait('stop'); - ProcessErrors($scope, data, status, PermissionsForm, { hdr: 'Error!', - msg: 'Failed to create new permission. Post returned status: ' + status }); - }); - } else { - Alert('Access Denied', 'You do not have access to create new permission objects. Please contact a system administrator.', - 'alert-danger'); - } - }; - - // Cancel - $scope.formReset = function () { - $rootScope.flashMessage = null; - generator.reset(); - for (var fld in master) { - $scope[fld] = master[fld]; - } - $scope.selectCategory(); - }; - - $scope.selectCategory = function () { - PermissionCategoryChange({ scope: $scope, reset: true }); - }; - - - $scope.selectCategory(); - -} - -PermissionsAdd.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'PermissionsForm', - 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ClearScope', 'GetBasePath', 'ReturnToCaller', - 'InventoryList', 'ProjectList', 'LookUpInit', 'CheckAccess', 'Wait', 'PermissionCategoryChange' -]; - - -export function PermissionsEdit($scope, $rootScope, $compile, $location, $log, $routeParams, PermissionsForm, - GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ReturnToCaller, ClearScope, Prompt, GetBasePath, - InventoryList, ProjectList, LookUpInit, CheckAccess, Wait, PermissionCategoryChange) { - - ClearScope(); - - var generator = GenerateForm, - form = PermissionsForm, - base_id = ($routeParams.user_id !== undefined) ? $routeParams.user_id : $routeParams.team_id, - id = $routeParams.permission_id, - defaultUrl = GetBasePath('base') + 'permissions/' + id + '/', - master = {}; - - $scope.changeAdhocCommandCheckbox = function () { - if ($scope.category === 'Deploy') { - $scope.run_ad_hoc_command = false; - } else { - if ($scope.permission_type === 'admin') { - $scope.run_ad_hoc_commands = true; - $("#permission_run_ad_hoc_commands_chbox").attr("disabled", true); - } else { - if (!$scope.run_ad_hoc_commands) { - $scope.run_ad_hoc_commands = false; - } - $("#permission_run_ad_hoc_commands_chbox").attr("disabled", false); - } - } - }; - - generator.inject(form, { mode: 'edit', related: true, scope: $scope }); - generator.reset(); - - $scope.selectCategory = function (resetIn) { - var reset = (resetIn === false) ? false : true; - PermissionCategoryChange({ scope: $scope, reset: reset }); - }; - if ($scope.removeFillForm) { - $scope.removeFillForm(); - } - $scope.removeFillForm = $scope.$on('FillForm', function () { - // Retrieve detail record and prepopulate the form - Wait('start'); - Rest.setUrl(defaultUrl); - Rest.get() - .success(function (data) { - var fld, sourceModel, sourceField; - LoadBreadCrumbs({ path: '/users/' + base_id + '/permissions/' + id, title: data.name }); - for (fld in form.fields) { - if (data[fld]) { - if (form.fields[fld].sourceModel) { - sourceModel = form.fields[fld].sourceModel; - sourceField = form.fields[fld].sourceField; - $scope[sourceModel + '_' + sourceField] = data.summary_fields[sourceModel][sourceField]; - master[sourceModel + '_' + sourceField] = data.summary_fields[sourceModel][sourceField]; - } - $scope[fld] = data[fld]; - master[fld] = $scope[fld]; - } - } - - $scope.category = 'Deploy'; - if (data.permission_type !== 'run' && data.permission_type !== 'check' && data.permission_type !== 'create') { - $scope.category = 'Inventory'; - } - master.category = $scope.category; - $scope.selectCategory(false); //call without resetting $scope.category value - - LookUpInit({ - scope: $scope, - form: form, - current_item: data.inventory, - list: InventoryList, - field: 'inventory', - input_type: "radio" - }); - - LookUpInit({ - scope: $scope, - form: form, - current_item: data.project, - list: ProjectList, - field: 'project', - input_type: 'radio' - }); - - $scope.changeAdhocCommandCheckbox(); - - if (!$scope.PermissionAddAllowed) { - // If not a privileged user, disable access - $('form[name="permission_form"]').find('select, input, button').each(function () { - if ($(this).is('input') || $(this).is('select')) { - $(this).attr('readonly', 'readonly'); - } - if ($(this).is('input[type="checkbox"]') || - $(this).is('input[type="radio"]') || - $(this).is('button')) { - $(this).attr('disabled', 'disabled'); - } - }); - } - Wait('stop'); - }) - .error(function (data, status) { - ProcessErrors($scope, data, status, form, { hdr: 'Error!', - msg: 'Failed to retrieve Permission: ' + id + '. GET status: ' + status }); - }); - }); - - CheckAccess({ - scope: $scope, - callback: 'FillForm' - }); - - // Save changes to the parent - $scope.formSave = function () { - var fld, data = {}; - generator.clearApiErrors(); - Wait('start'); - for (fld in form.fields) { - data[fld] = $scope[fld]; - } - // job template (or deploy) based permissions do not have the run - // ad hoc commands parameter - if (data.category === "Deploy") { - data.run_ad_hoc_commands = false; - } else { - delete data.project; - } - - Rest.setUrl(defaultUrl); - if($scope.category === "Inventory"){ - delete data.project; - } - Rest.put(data) - .success(function () { - Wait('stop'); - ReturnToCaller(1); - }) - .error(function (data, status) { - ProcessErrors($scope, data, status, form, { hdr: 'Error!', msg: 'Failed to update Permission: ' + - $routeParams.id + '. PUT status: ' + status }); - }); - }; - - - // Cancel - $scope.formReset = function () { - generator.reset(); - for (var fld in master) { - $scope[fld] = master[fld]; - } - $scope.selectCategory(false); - }; - -} - -PermissionsEdit.$inject = ['$scope', '$rootScope', '$compile', '$location', - '$log', '$routeParams', 'PermissionsForm', 'GenerateForm', 'Rest', 'Alert', - 'ProcessErrors', 'LoadBreadCrumbs', 'ReturnToCaller', 'ClearScope', 'Prompt', - 'GetBasePath', 'InventoryList', 'ProjectList', 'LookUpInit', 'CheckAccess', - 'Wait', 'PermissionCategoryChange']; diff --git a/awx/ui/client/src/controllers/Teams.js b/awx/ui/client/src/controllers/Teams.js index cd60103dbe..910b1bbec2 100644 --- a/awx/ui/client/src/controllers/Teams.js +++ b/awx/ui/client/src/controllers/Teams.js @@ -176,7 +176,7 @@ TeamsAdd.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$r export function TeamsEdit($scope, $rootScope, $compile, $location, $log, $routeParams, TeamForm, GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, RelatedSearchInit, RelatedPaginateInit, ReturnToCaller, ClearScope, LookUpInit, Prompt, GetBasePath, CheckAccess, - OrganizationList, Wait, Stream) { + OrganizationList, Wait, Stream, permissionsLabel) { ClearScope(); @@ -188,6 +188,17 @@ export function TeamsEdit($scope, $rootScope, $compile, $location, $log, $routeP id = $routeParams.team_id, relatedSets = {}; + $scope.permission_label = {}; + + permissionsLabel({ + scope: $scope, + url: 'api/v1/' + base + '/' + id + '/permissions/' + }).then(function(choices) { + _.map(choices, function(n, key) { + $scope.permission_label[key] = n; + }); + }); + $scope.team_id = id; generator.inject(form, { mode: 'edit', related: true, scope: $scope }); @@ -277,6 +288,15 @@ export function TeamsEdit($scope, $rootScope, $compile, $location, $log, $routeP '. GET status: ' + status }); }); + $scope.getPermissionText = function () { + if (this.permission.permission_type !== "admin" && this.permission.run_ad_hoc_commands) { + return $scope.permission_label[this.permission.permission_type] + + " and " + $scope.permission_label.adhoc; + } else { + return $scope.permission_label[this.permission.permission_type]; + } + }; + $scope.showActivity = function () { Stream({ scope: $scope }); }; @@ -392,5 +412,5 @@ export function TeamsEdit($scope, $rootScope, $compile, $location, $log, $routeP TeamsEdit.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'TeamForm', 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'RelatedSearchInit', 'RelatedPaginateInit', - 'ReturnToCaller', 'ClearScope', 'LookUpInit', 'Prompt', 'GetBasePath', 'CheckAccess', 'OrganizationList', 'Wait', 'Stream' + 'ReturnToCaller', 'ClearScope', 'LookUpInit', 'Prompt', 'GetBasePath', 'CheckAccess', 'OrganizationList', 'Wait', 'Stream', 'permissionsLabel' ]; diff --git a/awx/ui/client/src/controllers/Users.js b/awx/ui/client/src/controllers/Users.js index b2b9794378..ca0c2141e7 100644 --- a/awx/ui/client/src/controllers/Users.js +++ b/awx/ui/client/src/controllers/Users.js @@ -208,7 +208,7 @@ UsersAdd.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$r export function UsersEdit($scope, $rootScope, $compile, $location, $log, $routeParams, UserForm, GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, RelatedSearchInit, RelatedPaginateInit, ReturnToCaller, ClearScope, GetBasePath, - Prompt, CheckAccess, ResetForm, Wait, Stream) { + Prompt, CheckAccess, ResetForm, Wait, Stream, permissionsLabel) { ClearScope(); @@ -220,10 +220,22 @@ export function UsersEdit($scope, $rootScope, $compile, $location, $log, $routeP id = $routeParams.user_id, relatedSets = {}; + $scope.permission_label = {}; + + permissionsLabel({ + scope: $scope, + url: 'api/v1/' + base + '/' + id + '/permissions/' + }).then(function(choices) { + _.map(choices, function(n, key) { + $scope.permission_label[key] = n; + }); + }); + if ($scope.removeFormReady) { $scope.removeFormReady(); } $scope.removeFormReady = $scope.$on('formReady', function () { + generator.inject(form, { mode: 'edit', related: true, scope: $scope }); generator.reset(); @@ -293,12 +305,12 @@ export function UsersEdit($scope, $rootScope, $compile, $location, $log, $routeP $routeParams.id + '. GET status: ' + status }); }); - // if the permission includes adhoc (and is not admin), display that $scope.getPermissionText = function () { if (this.permission.permission_type !== "admin" && this.permission.run_ad_hoc_commands) { - return this.permission.permission_type + " + run commands"; + return $scope.permission_label[this.permission.permission_type] + + " and " + $scope.permission_label.adhoc; } else { - return this.permission.permission_type; + return $scope.permission_label[this.permission.permission_type]; } }; @@ -489,5 +501,5 @@ export function UsersEdit($scope, $rootScope, $compile, $location, $log, $routeP UsersEdit.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'UserForm', 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'RelatedSearchInit', 'RelatedPaginateInit', 'ReturnToCaller', 'ClearScope', - 'GetBasePath', 'Prompt', 'CheckAccess', 'ResetForm', 'Wait', 'Stream' + 'GetBasePath', 'Prompt', 'CheckAccess', 'ResetForm', 'Wait', 'Stream', 'permissionsLabel' ]; diff --git a/awx/ui/client/src/forms.js b/awx/ui/client/src/forms.js index 5ac8de52d0..3bd8170ee7 100644 --- a/awx/ui/client/src/forms.js +++ b/awx/ui/client/src/forms.js @@ -23,7 +23,6 @@ import LicenseUpdate from "./forms/LicenseUpdate"; import LogViewerOptions from "./forms/LogViewerOptions"; import LogViewerStatus from "./forms/LogViewerStatus"; import Organizations from "./forms/Organizations"; -import Permissions from "./forms/Permissions"; import ProjectStatus from "./forms/ProjectStatus"; import Projects from "./forms/Projects"; import Source from "./forms/Source"; @@ -51,7 +50,6 @@ export LogViewerOptions, LogViewerStatus, Organizations, - Permissions, ProjectStatus, Projects, Source, diff --git a/awx/ui/client/src/forms/Permissions.js b/awx/ui/client/src/forms/Permissions.js deleted file mode 100644 index 3072366981..0000000000 --- a/awx/ui/client/src/forms/Permissions.js +++ /dev/null @@ -1,159 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - /** - * @ngdoc function - * @name forms.function:Permissions - * @description This form is for adding/editing persmissions -*/ - -export default - angular.module('PermissionFormDefinition', []) - .value('PermissionsForm', { - - addTitle: 'Add Permission', //Title in add mode - editTitle: '{{ name }}', //Title in edit mode - name: 'permission', //entity or model name in singular form - well: true, //Wrap the form with TB well - forceListeners: true, - - stream: { - 'class': "btn-primary btn-xs activity-btn", - ngClick: "showActivity()", - awToolTip: "View Activity Stream", - awFeature: 'activity_streams', - dataPlacement: "top", - icon: "icon-comments-alt", - mode: 'edit', - iconSize: 'large' - }, - - fields: { - category: { - label: 'Permission Type', - labelClass: 'prepend-asterisk', - type: 'radio_group', - options: [{ - label: 'Inventory', - value: 'Inventory', - selected: true - }, { - label: 'Job Template', - value: 'Deploy' - }], - ngChange: 'selectCategory()' - }, - name: { - label: 'Name', - type: 'text', - addRequired: true, - editRequired: true, - capitalize: false - }, - description: { - label: 'Description', - type: 'text', - addRequired: false, - editRequired: false - }, - user: { - label: 'User', - type: 'hidden' - }, - team: { - label: 'Team', - type: 'hidden' - }, - project: { - label: 'Project', - type: 'lookup', - sourceModel: 'project', - sourceField: 'name', - ngShow: "category == 'Deploy'", - ngClick: 'lookUpProject()', - awRequiredWhen: { - variable: "projectrequired", - init: "false" - } - }, - inventory: { - label: 'Inventory', - type: 'lookup', - sourceModel: 'inventory', - sourceField: 'name', - ngClick: 'lookUpInventory()', - awRequiredWhen: { - variable: "inventoryrequired", - init: "true" - } - }, - permission_type: { - label: 'Permission', - labelClass: 'prepend-asterisk', - type: 'radio_group', - class: 'squeeze', - ngChange: 'changeAdhocCommandCheckbox()', - options: [{ - label: 'Read', - value: 'read', - ngShow: "category == 'Inventory'" - }, { - label: 'Write', - value: 'write', - ngShow: "category == 'Inventory'" - }, { - label: 'Admin', - value: 'admin', - ngShow: "category == 'Inventory'" - }, { - label: 'Create', - value: 'create', - ngShow: "category == 'Deploy'" - }, { - label: 'Run', - value: 'run', - ngShow: "category == 'Deploy'" - }, { - label: 'Check', - value: 'check', - ngShow: "category == 'Deploy'" - }], - // hack: attach helpCollapse here if the permissions - // category is deploy - helpCollapse: [{ - hdr: 'Permission', - ngBind: 'permissionTypeHelp', - ngHide: "category == 'Inventory'" - }] - }, - run_ad_hoc_commands: { - label: 'Execute commands', - type: 'checkbox', - // hack: attach helpCollapse here if the permissions - // category is inventory - helpCollapse: [{ - hdr: 'Permission', - ngBind: 'permissionTypeHelp' - }], - ngShow: "category == 'Inventory'", - associated: 'permission_type' - }, - }, - - buttons: { - save: { - ngClick: 'formSave()', - ngDisabled: true - }, - reset: { - ngClick: 'formReset()', - ngDisabled: true - } - }, - - related: { } - - }); // Form diff --git a/awx/ui/client/src/forms/Teams.js b/awx/ui/client/src/forms/Teams.js index 7da930b9db..b2bc999dd5 100644 --- a/awx/ui/client/src/forms/Teams.js +++ b/awx/ui/client/src/forms/Teams.js @@ -156,7 +156,8 @@ export default ngBind: 'permission.summary_fields.project.name' }, permission_type: { - label: 'Permission' + label: 'Permission', + ngBind: 'getPermissionText()' } }, diff --git a/awx/ui/client/src/helpers.js b/awx/ui/client/src/helpers.js index be783b45a9..e5477a186c 100644 --- a/awx/ui/client/src/helpers.js +++ b/awx/ui/client/src/helpers.js @@ -26,7 +26,6 @@ import LogViewer from "./helpers/LogViewer"; import Lookup from "./helpers/Lookup"; import PaginationHelpers from "./helpers/PaginationHelpers"; import Parse from "./helpers/Parse"; -import Permissions from "./helpers/Permissions"; import ProjectPath from "./helpers/ProjectPath"; import Projects from "./helpers/Projects"; import Schedules from "./helpers/Schedules"; @@ -64,7 +63,6 @@ export Lookup, PaginationHelpers, Parse, - Permissions, ProjectPath, Projects, Schedules, diff --git a/awx/ui/client/src/helpers/Permissions.js b/awx/ui/client/src/helpers/Permissions.js deleted file mode 100644 index 565b755b0a..0000000000 --- a/awx/ui/client/src/helpers/Permissions.js +++ /dev/null @@ -1,79 +0,0 @@ -/************************************************* - * Copyright (c) 2015 Ansible, Inc. - * - * All Rights Reserved - *************************************************/ - - /** - * @ngdoc function - * @name helpers.function:Permissions - * @description - * Functions shared amongst Permission related controllers - * - */ - -export default - angular.module('PermissionsHelper', []) - - // Handle category change event - .factory('PermissionCategoryChange', ['$sce', - function ($sce) { - return function (params) { - var scope = params.scope, - reset = params.reset, - html; - - if (scope.category === 'Inventory') { - scope.projectrequired = false; - html = "
\n" + - "
Read
\n" + - "
Only allow the user or team to view the inventory." + - "
\n" + - "
Write
\n" + - "
Allow the user or team to modify hosts and groups " + - "contained in the inventory, add new hosts and groups" + - ", and perform inventory sync operations.\n" + - "
Admin
\n" + - "
Allow the user or team full access to the " + - "inventory. This includes reading, writing, deletion " + - "of the inventory, inventory sync operations, and " + - "the ability to execute commands on the inventory." + - "
\n" + - "
Execute commands
\n" + - "
Allow the user to execute commands on the " + - "inventory.
\n" + - "
\n"; - scope.permissionTypeHelp = $sce.trustAsHtml(html); - } else { - scope.projectrequired = true; - html = "
\n" + - "
Create
\n" + - "
Allow the user or team to create job templates. " + - "This implies that they have the Run and Check " + - "permissions.
\n" + - "
Run
\n" + - "
Allow the user or team to run a job template from " + - "the project against the inventory. In Run mode " + - "modules will " + - "be executed, and changes to the inventory will occur." + - "
\n" + - "
Check
\n" + - "
Only allow the user or team to run the project " + - "against the inventory as a dry-run operation. In " + - "Check mode, module operations " + - "will only be simulated. No changes will occur." + - "
\n" + - "
\n"; - scope.permissionTypeHelp = $sce.trustAsHtml(html); - } - - if (reset) { - if (scope.category === "Inventory") { - scope.permission_type = "read"; - } else { - scope.permission_type = "run"; - } - } - }; - } - ]); diff --git a/awx/ui/client/src/lists.js b/awx/ui/client/src/lists.js index ecef643812..da4aa67f7b 100644 --- a/awx/ui/client/src/lists.js +++ b/awx/ui/client/src/lists.js @@ -21,7 +21,6 @@ import JobHosts from "./lists/JobHosts"; import JobTemplates from "./lists/JobTemplates"; import Jobs from "./lists/Jobs"; import Organizations from "./lists/Organizations"; -import Permissions from "./lists/Permissions"; import PortalJobTemplates from "./lists/PortalJobTemplates"; import PortalJobs from "./lists/PortalJobs"; import Projects from "./lists/Projects"; @@ -50,7 +49,6 @@ export JobTemplates, Jobs, Organizations, - Permissions, PortalJobTemplates, PortalJobs, Projects, diff --git a/awx/ui/client/src/permissions/main.js b/awx/ui/client/src/permissions/main.js new file mode 100644 index 0000000000..24cac3b898 --- /dev/null +++ b/awx/ui/client/src/permissions/main.js @@ -0,0 +1,24 @@ +/************************************************* + * Copyright (c) 2015 Ansible, Inc. + * + * All Rights Reserved + *************************************************/ + +import permissionsList from './permissions-list/main'; +import permissionsAdd from './permissions-add/main'; +import permissionsEdit from './permissions-edit/main'; +import list from './permissions-list'; +import form from './permissions-form'; +import permissionsCategoryChange from './permissions-category-change.factory'; +import permissionsLabel from './permissions-labels.factory'; + +export default + angular.module('permissions', [ + permissionsList.name, + permissionsAdd.name, + permissionsEdit.name + ]) + .factory('permissionsList', list) + .factory('permissionsForm', form) + .factory('permissionsCategoryChange', permissionsCategoryChange) + .factory('permissionsLabel', permissionsLabel); diff --git a/awx/ui/client/src/permissions/permissions-add/main.js b/awx/ui/client/src/permissions/permissions-add/main.js new file mode 100644 index 0000000000..3ddff82526 --- /dev/null +++ b/awx/ui/client/src/permissions/permissions-add/main.js @@ -0,0 +1,21 @@ +/************************************************* + * Copyright (c) 2015 Ansible, Inc. + * + * All Rights Reserved + *************************************************/ + +import userRoute from './permissions-user-add.route'; +import teamRoute from './permissions-team-add.route'; +import controller from './permissions-add.controller'; + +export default + angular.module('permissionsAdd', []) + .controller('addController', controller) + .config(['$routeProvider', function($routeProvider) { + var url = userRoute.route; + delete userRoute.route; + $routeProvider.when(url, userRoute); + url = teamRoute.route; + delete teamRoute.route; + $routeProvider.when(url, teamRoute); + }]); diff --git a/awx/ui/client/src/permissions/permissions-add/permissions-add.controller.js b/awx/ui/client/src/permissions/permissions-add/permissions-add.controller.js new file mode 100644 index 0000000000..7bc075357d --- /dev/null +++ b/awx/ui/client/src/permissions/permissions-add/permissions-add.controller.js @@ -0,0 +1,151 @@ +/************************************************* + * Copyright (c) 2015 Ansible, Inc. + * + * All Rights Reserved + *************************************************/ + +/** + * @ngdoc function + * @name controllers.function:Permissions + * @description This controller for permissions add +*/ +export default + ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'permissionsForm', 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ClearScope', 'GetBasePath', 'ReturnToCaller', 'InventoryList', 'ProjectList', 'LookUpInit', 'CheckAccess', 'Wait', 'permissionsCategoryChange', 'permissionsLabel', + function($scope, $rootScope, $compile, $location, $log, $routeParams, permissionsForm, GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ClearScope, GetBasePath, ReturnToCaller, InventoryList, ProjectList, LookUpInit, CheckAccess, Wait, permissionsCategoryChange, permissionsLabel) { + + ClearScope(); + + // Inject dynamic view + var form = permissionsForm, + generator = GenerateForm, + id = ($routeParams.user_id !== undefined) ? $routeParams.user_id : $routeParams.team_id, + base = $location.path().replace(/^\//, '').split('/')[0], + master = {}; + + permissionsLabel({ + scope: $scope, + url: 'api/v1/' + base + '/' + id + '/permissions/' + }).then(function(choices) { + _.map(choices, function(n, key) { + $scope.permission_label[key] = n; + }); + }); + + generator.inject(form, { mode: 'add', related: false, scope: $scope }); + CheckAccess({ scope: $scope }); + generator.reset(); + LoadBreadCrumbs(); + + $scope.inventoryrequired = true; + $scope.projectrequired = false; + $scope.category = 'Inventory'; + master.category = 'Inventory'; + master.inventoryrequired = true; + master.projectrequired = false; + $scope.run_ad_hoc_commands = false; + $scope.permission_label = {}; + + LookUpInit({ + scope: $scope, + form: form, + current_item: null, + list: InventoryList, + field: 'inventory', + input_type: 'radio' + }); + + LookUpInit({ + scope: $scope, + form: form, + current_item: null, + list: ProjectList, + field: 'project', + input_type: 'radio' + }); + + $scope.$watch("category", function(val) { + if (val === 'Deploy') { + $scope.projectrequired = true; + LookUpInit({ + scope: $scope, + form: form, + current_item: null, + list: ProjectList, + field: 'project', + input_type: 'radio' + }); + } else { + $scope.projectrequired = false; + } + }); + + $scope.changeAdhocCommandCheckbox = function () { + if ($scope.category === 'Deploy') { + $scope.run_ad_hoc_command = false; + } else { + if ($scope.permission_type === 'admin') { + $scope.run_ad_hoc_commands = true; + $("#permission_run_ad_hoc_commands_chbox").attr("disabled", true); + } else { + if (!$scope.run_ad_hoc_commands) { + $scope.run_ad_hoc_commands = false; + } + $("#permission_run_ad_hoc_commands_chbox").attr("disabled", false); + } + } + }; + + // Save + $scope.formSave = function () { + var fld, url, data = {}; + generator.clearApiErrors(); + Wait('start'); + if ($scope.PermissionAddAllowed) { + data = {}; + for (fld in form.fields) { + data[fld] = $scope[fld]; + } + // job template (or deploy) based permissions do not have the run + // ad hoc commands parameter + if (data.category === "Deploy") { + data.run_ad_hoc_commands = false; + } else { + delete data.project; + } + + url = (base === 'teams') ? GetBasePath('teams') + id + '/permissions/' : GetBasePath('users') + id + '/permissions/'; + Rest.setUrl(url); + Rest.post(data) + .success(function () { + Wait('stop'); + ReturnToCaller(1); + }) + .error(function (data, status) { + Wait('stop'); + ProcessErrors($scope, data, status, permissionsForm, { hdr: 'Error!', + msg: 'Failed to create new permission. Post returned status: ' + status }); + }); + } else { + Alert('Access Denied', 'You do not have access to create new permission objects. Please contact a system administrator.', + 'alert-danger'); + } + }; + + // Cancel + $scope.formReset = function () { + $rootScope.flashMessage = null; + generator.reset(); + for (var fld in master) { + $scope[fld] = master[fld]; + } + $scope.selectCategory(); + }; + + $scope.selectCategory = function () { + permissionsCategoryChange({ scope: $scope, reset: true }); + }; + + + $scope.selectCategory(); + + }]; diff --git a/awx/ui/client/src/permissions/permissions-add/permissions-team-add.route.js b/awx/ui/client/src/permissions/permissions-add/permissions-team-add.route.js new file mode 100644 index 0000000000..a2729cc329 --- /dev/null +++ b/awx/ui/client/src/permissions/permissions-add/permissions-team-add.route.js @@ -0,0 +1,19 @@ +/************************************************* + * Copyright (c) 2015 Ansible, Inc. + * + * All Rights Reserved + *************************************************/ + +import {templateUrl} from '../../shared/template-url/template-url.factory'; + +export default { + name: 'teamPermissionsAdd', + route: '/teams/:team_id/permissions/add', + templateUrl: templateUrl('permissions/team-permissions'), + controller: 'addController', + resolve: { + features: ['FeaturesService', function(FeaturesService) { + return FeaturesService.get(); + }] + } +}; diff --git a/awx/ui/client/src/permissions/permissions-add/permissions-user-add.route.js b/awx/ui/client/src/permissions/permissions-add/permissions-user-add.route.js new file mode 100644 index 0000000000..b67d866a7e --- /dev/null +++ b/awx/ui/client/src/permissions/permissions-add/permissions-user-add.route.js @@ -0,0 +1,19 @@ +/************************************************* + * Copyright (c) 2015 Ansible, Inc. + * + * All Rights Reserved + *************************************************/ + +import {templateUrl} from '../../shared/template-url/template-url.factory'; + +export default { + name: 'userPermissionsAdd', + route: '/users/:user_id/permissions/add', + templateUrl: templateUrl('permissions/user-permissions'), + controller: 'addController', + resolve: { + features: ['FeaturesService', function(FeaturesService) { + return FeaturesService.get(); + }] + } +}; diff --git a/awx/ui/client/src/permissions/permissions-category-change.factory.js b/awx/ui/client/src/permissions/permissions-category-change.factory.js new file mode 100644 index 0000000000..0de5c7f2ea --- /dev/null +++ b/awx/ui/client/src/permissions/permissions-category-change.factory.js @@ -0,0 +1,74 @@ +/************************************************* + * Copyright (c) 2015 Ansible, Inc. + * + * All Rights Reserved + *************************************************/ + + /** + * @ngdoc function + * @name helpers.function:Permissions + * @description + * Functions shared amongst Permission related controllers + * + */ + + export default + ['$sce', function($sce) { + return function (params) { + var scope = params.scope, + reset = params.reset, + html; + + if (scope.category === 'Inventory') { + scope.projectrequired = false; + html = "
\n" + + "
Read Inventory
\n" + + "
Only allow the user or team to view the inventory." + + "
\n" + + "
Edit Inventory
\n" + + "
Allow the user or team to modify hosts and groups " + + "contained in the inventory, add new hosts and groups" + + ", and perform inventory sync operations.\n" + + "
Administrate Inventory
\n" + + "
Allow the user or team full access to the " + + "inventory. This includes reading, writing, deletion " + + "of the inventory, inventory sync operations, and " + + "the ability to execute commands on the inventory." + + "
\n" + + "
Execute Commands
\n" + + "
Allow the user to execute commands on the " + + "inventory.
\n" + + "
\n"; + scope.permissionTypeHelp = $sce.trustAsHtml(html); + } else { + scope.projectrequired = true; + html = "
\n" + + "
Create a Job Template
\n" + + "
Allow the user or team to create job templates. " + + "This implies that they have the Run and Check " + + "permissions.
\n" + + "
Deploy To Inventory
\n" + + "
Allow the user or team to run a job template from " + + "the project against the inventory. In Run mode " + + "modules will " + + "be executed, and changes to the inventory will occur." + + "
\n" + + "
Deploy to Inventory (Dry Run)
\n" + + "
Only allow the user or team to run the project " + + "against the inventory as a dry-run operation. In " + + "Check mode, module operations " + + "will only be simulated. No changes will occur." + + "
\n" + + "
\n"; + scope.permissionTypeHelp = $sce.trustAsHtml(html); + } + + if (reset) { + if (scope.category === "Inventory") { + scope.permission_type = "read"; + } else { + scope.permission_type = "run"; + } + } + }; + }]; diff --git a/awx/ui/client/src/permissions/permissions-edit/main.js b/awx/ui/client/src/permissions/permissions-edit/main.js new file mode 100644 index 0000000000..cc5d838070 --- /dev/null +++ b/awx/ui/client/src/permissions/permissions-edit/main.js @@ -0,0 +1,21 @@ +/************************************************* + * Copyright (c) 2015 Ansible, Inc. + * + * All Rights Reserved + *************************************************/ + +import userRoute from './permissions-user-edit.route'; +import teamRoute from './permissions-team-edit.route'; +import controller from './permissions-edit.controller'; + +export default + angular.module('permissionsEdit', []) + .controller('editController', controller) + .config(['$routeProvider', function($routeProvider) { + var url = userRoute.route; + delete userRoute.route; + $routeProvider.when(url, userRoute); + url = teamRoute.route; + delete teamRoute.route; + $routeProvider.when(url, teamRoute); + }]); diff --git a/awx/ui/client/src/permissions/permissions-edit/permissions-edit.controller.js b/awx/ui/client/src/permissions/permissions-edit/permissions-edit.controller.js new file mode 100644 index 0000000000..b0a9b0dd08 --- /dev/null +++ b/awx/ui/client/src/permissions/permissions-edit/permissions-edit.controller.js @@ -0,0 +1,178 @@ +/************************************************* + * Copyright (c) 2015 Ansible, Inc. + * + * All Rights Reserved + *************************************************/ + +/** + * @ngdoc function + * @name controllers.function:Permissions + * @description This controller for permissions edit +*/ +export default + ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'permissionsForm', 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ReturnToCaller', 'ClearScope', 'Prompt', 'GetBasePath', 'InventoryList', 'ProjectList', 'LookUpInit', 'CheckAccess', 'Wait', 'permissionsCategoryChange', 'permissionsLabel', + function($scope, $rootScope, $compile, $location, $log, $routeParams, permissionsForm, GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ReturnToCaller, ClearScope, Prompt, GetBasePath, InventoryList, ProjectList, LookUpInit, CheckAccess, Wait, permissionsCategoryChange, permissionsLabel) { + + ClearScope(); + + var generator = GenerateForm, + form = permissionsForm, + base_id = ($routeParams.user_id !== undefined) ? $routeParams.user_id : $routeParams.team_id, + id = $routeParams.permission_id, + defaultUrl = GetBasePath('base') + 'permissions/' + id + '/', + base = $location.path().replace(/^\//, '').split('/')[0], + master = {}; + + $scope.permission_label = {}; + + permissionsLabel({ + scope: $scope, + url: 'api/v1/' + base + '/' + base_id + '/permissions/' + }).then(function(choices) { + _.map(choices, function(n, key) { + $scope.permission_label[key] = n; + }); + }); + + $scope.changeAdhocCommandCheckbox = function () { + if ($scope.category === 'Deploy') { + $scope.run_ad_hoc_command = false; + } else { + if ($scope.permission_type === 'admin') { + $scope.run_ad_hoc_commands = true; + $("#permission_run_ad_hoc_commands_chbox").attr("disabled", true); + } else { + if (!$scope.run_ad_hoc_commands) { + $scope.run_ad_hoc_commands = false; + } + $("#permission_run_ad_hoc_commands_chbox").attr("disabled", false); + } + } + }; + + generator.inject(form, { mode: 'edit', related: true, scope: $scope }); + generator.reset(); + + $scope.selectCategory = function (resetIn) { + var reset = (resetIn === false) ? false : true; + permissionsCategoryChange({ scope: $scope, reset: reset }); + }; + if ($scope.removeFillForm) { + $scope.removeFillForm(); + } + $scope.removeFillForm = $scope.$on('FillForm', function () { + // Retrieve detail record and prepopulate the form + Wait('start'); + Rest.setUrl(defaultUrl); + Rest.get() + .success(function (data) { + var fld, sourceModel, sourceField; + LoadBreadCrumbs({ path: '/users/' + base_id + '/permissions/' + id, title: data.name }); + for (fld in form.fields) { + if (data[fld]) { + if (form.fields[fld].sourceModel) { + sourceModel = form.fields[fld].sourceModel; + sourceField = form.fields[fld].sourceField; + $scope[sourceModel + '_' + sourceField] = data.summary_fields[sourceModel][sourceField]; + master[sourceModel + '_' + sourceField] = data.summary_fields[sourceModel][sourceField]; + } + $scope[fld] = data[fld]; + master[fld] = $scope[fld]; + } + } + + $scope.category = 'Deploy'; + if (data.permission_type !== 'run' && data.permission_type !== 'check' && data.permission_type !== 'create') { + $scope.category = 'Inventory'; + } + master.category = $scope.category; + $scope.selectCategory(false); //call without resetting $scope.category value + + LookUpInit({ + scope: $scope, + form: form, + current_item: data.inventory, + list: InventoryList, + field: 'inventory', + input_type: "radio" + }); + + LookUpInit({ + scope: $scope, + form: form, + current_item: data.project, + list: ProjectList, + field: 'project', + input_type: 'radio' + }); + + $scope.changeAdhocCommandCheckbox(); + + if (!$scope.PermissionAddAllowed) { + // If not a privileged user, disable access + $('form[name="permission_form"]').find('select, input, button').each(function () { + if ($(this).is('input') || $(this).is('select')) { + $(this).attr('readonly', 'readonly'); + } + if ($(this).is('input[type="checkbox"]') || + $(this).is('input[type="radio"]') || + $(this).is('button')) { + $(this).attr('disabled', 'disabled'); + } + }); + } + Wait('stop'); + }) + .error(function (data, status) { + ProcessErrors($scope, data, status, form, { hdr: 'Error!', + msg: 'Failed to retrieve Permission: ' + id + '. GET status: ' + status }); + }); + }); + + CheckAccess({ + scope: $scope, + callback: 'FillForm' + }); + + // Save changes to the parent + $scope.formSave = function () { + var fld, data = {}; + generator.clearApiErrors(); + Wait('start'); + for (fld in form.fields) { + data[fld] = $scope[fld]; + } + // job template (or deploy) based permissions do not have the run + // ad hoc commands parameter + if (data.category === "Deploy") { + data.run_ad_hoc_commands = false; + } else { + delete data.project; + } + + Rest.setUrl(defaultUrl); + if($scope.category === "Inventory"){ + delete data.project; + } + Rest.put(data) + .success(function () { + Wait('stop'); + ReturnToCaller(1); + }) + .error(function (data, status) { + ProcessErrors($scope, data, status, form, { hdr: 'Error!', msg: 'Failed to update Permission: ' + + $routeParams.id + '. PUT status: ' + status }); + }); + }; + + + // Cancel + $scope.formReset = function () { + generator.reset(); + for (var fld in master) { + $scope[fld] = master[fld]; + } + $scope.selectCategory(false); + }; + + }]; diff --git a/awx/ui/client/src/permissions/permissions-edit/permissions-team-edit.route.js b/awx/ui/client/src/permissions/permissions-edit/permissions-team-edit.route.js new file mode 100644 index 0000000000..818d2c8d56 --- /dev/null +++ b/awx/ui/client/src/permissions/permissions-edit/permissions-team-edit.route.js @@ -0,0 +1,19 @@ +/************************************************* + * Copyright (c) 2015 Ansible, Inc. + * + * All Rights Reserved + *************************************************/ + +import {templateUrl} from '../../shared/template-url/template-url.factory'; + +export default { + name: 'teamPermissionsEdit', + route: '/teams/:team_id/permissions/edit', + templateUrl: templateUrl('permissions/team-permissions'), + controller: 'editController', + resolve: { + features: ['FeaturesService', function(FeaturesService) { + return FeaturesService.get(); + }] + } +}; diff --git a/awx/ui/client/src/permissions/permissions-edit/permissions-user-edit.route.js b/awx/ui/client/src/permissions/permissions-edit/permissions-user-edit.route.js new file mode 100644 index 0000000000..c0431a2a1d --- /dev/null +++ b/awx/ui/client/src/permissions/permissions-edit/permissions-user-edit.route.js @@ -0,0 +1,19 @@ +/************************************************* + * Copyright (c) 2015 Ansible, Inc. + * + * All Rights Reserved + *************************************************/ + +import {templateUrl} from '../../shared/template-url/template-url.factory'; + +export default { + name: 'userPermissionsEdit', + route: '/users/:user_id/permissions/:permission_id', + templateUrl: templateUrl('permissions/user-permissions'), + controller: 'editController', + resolve: { + features: ['FeaturesService', function(FeaturesService) { + return FeaturesService.get(); + }] + } +}; diff --git a/awx/ui/client/src/permissions/permissions-form.js b/awx/ui/client/src/permissions/permissions-form.js new file mode 100644 index 0000000000..de97aa01ad --- /dev/null +++ b/awx/ui/client/src/permissions/permissions-form.js @@ -0,0 +1,158 @@ +/************************************************* + * Copyright (c) 2015 Ansible, Inc. + * + * All Rights Reserved + *************************************************/ + + /** + * @ngdoc function + * @name forms.function:Permissions + * @description This form is for adding/editing persmissions +*/ + +export default function() { + return { + addTitle: 'Add Permission', //Title in add mode + editTitle: '{{ name }}', //Title in edit mode + name: 'permission', //entity or model name in singular form + well: true, //Wrap the form with TB well + forceListeners: true, + + stream: { + 'class': "btn-primary btn-xs activity-btn", + ngClick: "showActivity()", + awToolTip: "View Activity Stream", + awFeature: 'activity_streams', + dataPlacement: "top", + icon: "icon-comments-alt", + mode: 'edit', + iconSize: 'large' + }, + + fields: { + category: { + label: 'Permission Type', + labelClass: 'prepend-asterisk', + type: 'radio_group', + options: [{ + label: 'Inventory', + value: 'Inventory', + selected: true + }, { + label: 'Job Template', + value: 'Deploy' + }], + ngChange: 'selectCategory()' + }, + name: { + label: 'Name', + type: 'text', + addRequired: true, + editRequired: true, + capitalize: false + }, + description: { + label: 'Description', + type: 'text', + addRequired: false, + editRequired: false + }, + user: { + label: 'User', + type: 'hidden' + }, + team: { + label: 'Team', + type: 'hidden' + }, + project: { + label: 'Project', + type: 'lookup', + sourceModel: 'project', + sourceField: 'name', + ngShow: "category == 'Deploy'", + ngClick: 'lookUpProject()', + awRequiredWhen: { + variable: "projectrequired", + init: "false" + } + }, + inventory: { + label: 'Inventory', + type: 'lookup', + sourceModel: 'inventory', + sourceField: 'name', + ngClick: 'lookUpInventory()', + awRequiredWhen: { + variable: "inventoryrequired", + init: "true" + } + }, + permission_type: { + label: 'Permission', + labelClass: 'prepend-asterisk', + type: 'radio_group', + class: 'squeeze', + ngChange: 'changeAdhocCommandCheckbox()', + options: [{ + label: '{{ permission_label.read }}', + value: 'read', + ngShow: "category == 'Inventory'" + }, { + label: '{{ permission_label.write }}', + value: 'write', + ngShow: "category == 'Inventory'" + }, { + label: '{{ permission_label.admin }}', + value: 'admin', + ngShow: "category == 'Inventory'" + }, { + label: '{{ permission_label.create }}', + value: 'create', + ngShow: "category == 'Deploy'" + }, { + label: '{{ permission_label.run }}', + value: 'run', + ngShow: "category == 'Deploy'" + }, { + label: '{{ permission_label.check }}', + value: 'check', + ngShow: "category == 'Deploy'" + }], + // hack: attach helpCollapse here if the permissions + // category is deploy + helpCollapse: [{ + hdr: 'Permission', + ngBind: 'permissionTypeHelp', + ngHide: "category == 'Inventory'" + }] + }, + run_ad_hoc_commands: { + label: '{{ permission_label.adhoc }}', + type: 'checkbox', + // hack: attach helpCollapse here if the permissions + // category is inventory + helpCollapse: [{ + hdr: 'Permission', + ngBind: 'permissionTypeHelp' + }], + ngShow: "category == 'Inventory'", + associated: 'permission_type' + }, + }, + + buttons: { + save: { + ngClick: 'formSave()', + ngDisabled: true + }, + reset: { + ngClick: 'formReset()', + ngDisabled: true + } + }, + + related: { } + + }; +} diff --git a/awx/ui/client/src/permissions/permissions-labels.factory.js b/awx/ui/client/src/permissions/permissions-labels.factory.js new file mode 100644 index 0000000000..98bce85aea --- /dev/null +++ b/awx/ui/client/src/permissions/permissions-labels.factory.js @@ -0,0 +1,46 @@ +/************************************************* + * Copyright (c) 2015 Ansible, Inc. + * + * All Rights Reserved + *************************************************/ + + /** + * @ngdoc function + * @name helpers.function:Permissions + * @description + * Gets permission type labels from the API and sets them as the permissions labels on the relevant radio buttons + * + */ + + export default + ['Rest', 'ProcessErrors', function(Rest, ProcessErrors) { + return function (params) { + var scope = params.scope, + url = params.url; + + // Auto populate the field if there is only one result + Rest.setUrl(url); + return Rest.options() + .then(function (data) { + data = data.data; + var choices = data.actions.GET.permission_type.choices; + + // convert the choices from the API from the format + // [["read", "Read Inventory"], ...] to + // {read: "Read Inventory", ...} + choices = choices.reduce(function(obj, kvp) { + obj[kvp[0]] = kvp[1]; + return obj; + }, {}); + + // manually add the adhoc label to the choices object + choices['adhoc'] = data.actions.GET.run_ad_hoc_commands.label; + + return choices; + }) + .catch(function (data, status) { + ProcessErrors(scope, data, status, null, { hdr: 'Error!', + msg: 'Failed to get permission type labels. Options requrest returned status: ' + status }); + }); + }; + }]; diff --git a/awx/ui/client/src/lists/Permissions.js b/awx/ui/client/src/permissions/permissions-list.js similarity index 95% rename from awx/ui/client/src/lists/Permissions.js rename to awx/ui/client/src/permissions/permissions-list.js index 9938c6fdc7..28a058ea0e 100644 --- a/awx/ui/client/src/lists/Permissions.js +++ b/awx/ui/client/src/permissions/permissions-list.js @@ -3,11 +3,10 @@ * * All Rights Reserved *************************************************/ - -export default - angular.module('PermissionListDefinition', []) - .value('PermissionList', { + + export default function() { + return { name: 'permissions', iterator: 'permission', @@ -77,4 +76,5 @@ export default dataPlacement: 'top' } } - }); + }; +} diff --git a/awx/ui/client/src/permissions/permissions-list/main.js b/awx/ui/client/src/permissions/permissions-list/main.js new file mode 100644 index 0000000000..bd29db4966 --- /dev/null +++ b/awx/ui/client/src/permissions/permissions-list/main.js @@ -0,0 +1,21 @@ +/************************************************* + * Copyright (c) 2015 Ansible, Inc. + * + * All Rights Reserved + *************************************************/ + +import userRoute from './permissions-user-list.route'; +import teamRoute from './permissions-team-list.route'; +import controller from './permissions-list.controller'; + +export default + angular.module('permissionsList', []) + .controller('permissionsListController', controller) + .config(['$routeProvider', function($routeProvider) { + var url = userRoute.route; + delete userRoute.route; + $routeProvider.when(url, userRoute); + url = teamRoute.route; + delete teamRoute.route; + $routeProvider.when(url, teamRoute); + }]); diff --git a/awx/ui/client/src/permissions/permissions-list/permissions-list.controller.js b/awx/ui/client/src/permissions/permissions-list/permissions-list.controller.js new file mode 100644 index 0000000000..a3249f18a9 --- /dev/null +++ b/awx/ui/client/src/permissions/permissions-list/permissions-list.controller.js @@ -0,0 +1,116 @@ +/************************************************* + * Copyright (c) 2015 Ansible, Inc. + * + * All Rights Reserved + *************************************************/ + +/** + * @ngdoc function + * @name controllers.function:Permissions + * @description This controller for permissions list +*/ + + +export default + ['$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'permissionsList', 'generateList', 'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'ClearScope', 'ProcessErrors', 'GetBasePath', 'CheckAccess', 'Wait', 'permissionsLabel', + function ($scope, $rootScope, $location, $log, $routeParams, Rest, Alert, permissionsList, GenerateList, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit, ReturnToCaller, ClearScope, ProcessErrors, GetBasePath, CheckAccess, Wait, permissionsLabel) { + + ClearScope(); + + var list = permissionsList, + base = $location.path().replace(/^\//, '').split('/')[0], + base_id = ($routeParams.user_id !== undefined) ? $routeParams.user_id : $routeParams.team_id, + defaultUrl = GetBasePath(base), + generator = GenerateList; + + $scope.permission_label = {}; + + permissionsLabel({ + scope: $scope, + url: 'api/v1/' + base + '/' + base_id + '/permissions/' + }).then(function(choices) { + _.map(choices, function(n, key) { + $scope.permission_label[key] = n; + }); + }); + + generator.inject(list, { mode: 'edit', scope: $scope, breadCrumbs: true }); + defaultUrl += ($routeParams.user_id !== undefined) ? $routeParams.user_id : $routeParams.team_id; + defaultUrl += '/permissions/'; + + $scope.selected = []; + + CheckAccess({ + scope: $scope + }); + + if ($scope.removePostRefresh) { + $scope.removePostRefresh(); + } + $scope.removePostRefresh = $scope.$on('PostRefresh', function () { + // Cleanup after a delete + Wait('stop'); + $('#prompt-modal').modal('hide'); + }); + + SearchInit({ + scope: $scope, + set: 'permissions', + list: list, + url: defaultUrl + }); + PaginateInit({ + scope: $scope, + list: list, + url: defaultUrl + }); + $scope.search(list.iterator); + + LoadBreadCrumbs(); + + $scope.addPermission = function () { + if ($scope.PermissionAddAllowed) { + $location.path($location.path() + '/add'); + } + }; + + // if the permission includes adhoc (and is not admin), display that + $scope.getPermissionText = function () { + if (this.permission.permission_type !== "admin" && this.permission.run_ad_hoc_commands) { + return $scope.permission_label[this.permission.permission_type] + + " and " + $scope.permission_label.adhoc; + } else { + return $scope.permission_label[this.permission.permission_type]; + } + }; + + $scope.editPermission = function (id) { + $location.path($location.path() + '/' + id); + }; + + $scope.deletePermission = function (id, name) { + var action = function () { + $('#prompt-modal').modal('hide'); + Wait('start'); + var url = GetBasePath('base') + 'permissions/' + id + '/'; + Rest.setUrl(url); + Rest.destroy() + .success(function () { + $scope.search(list.iterator); + }) + .error(function (data, status) { + Wait('stop'); + ProcessErrors($scope, data, status, null, { hdr: 'Error!', + msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status }); + }); + }; + + if ($scope.PermissionAddAllowed) { + Prompt({ + hdr: 'Delete', + body: 'Are you sure you want to delete ' + name + '?', + action: action + }); + } + }; + }]; diff --git a/awx/ui/client/src/permissions/permissions-list/permissions-team-list.route.js b/awx/ui/client/src/permissions/permissions-list/permissions-team-list.route.js new file mode 100644 index 0000000000..cbe4527b5f --- /dev/null +++ b/awx/ui/client/src/permissions/permissions-list/permissions-team-list.route.js @@ -0,0 +1,19 @@ +/************************************************* + * Copyright (c) 2015 Ansible, Inc. + * + * All Rights Reserved + *************************************************/ + +import {templateUrl} from '../../shared/template-url/template-url.factory'; + +export default { + name: 'teamPermissionsList', + route: '/teams/:team_id/permissions', + templateUrl: templateUrl('permissions/team-permissions'), + controller: 'permissionsListController', + resolve: { + features: ['FeaturesService', function(FeaturesService) { + return FeaturesService.get(); + }] + } +}; diff --git a/awx/ui/client/src/permissions/permissions-list/permissions-user-list.route.js b/awx/ui/client/src/permissions/permissions-list/permissions-user-list.route.js new file mode 100644 index 0000000000..ac73c54451 --- /dev/null +++ b/awx/ui/client/src/permissions/permissions-list/permissions-user-list.route.js @@ -0,0 +1,19 @@ +/************************************************* + * Copyright (c) 2015 Ansible, Inc. + * + * All Rights Reserved + *************************************************/ + +import {templateUrl} from '../../shared/template-url/template-url.factory'; + +export default { + name: 'userPermissionsList', + route: '/users/:user_id/permissions', + templateUrl: templateUrl('permissions/user-permissions'), + controller: 'permissionsListController', + resolve: { + features: ['FeaturesService', function(FeaturesService) { + return FeaturesService.get(); + }] + } +}; diff --git a/awx/ui/client/src/permissions/team-permissions.partial.html b/awx/ui/client/src/permissions/team-permissions.partial.html new file mode 100644 index 0000000000..e8c4dad50b --- /dev/null +++ b/awx/ui/client/src/permissions/team-permissions.partial.html @@ -0,0 +1,18 @@ + + + + + + + + + +
+
+
diff --git a/awx/ui/client/src/permissions/user-permissions.partial.html b/awx/ui/client/src/permissions/user-permissions.partial.html new file mode 100644 index 0000000000..271a15d748 --- /dev/null +++ b/awx/ui/client/src/permissions/user-permissions.partial.html @@ -0,0 +1,18 @@ + + + + + + + + + +
+
+
From 0bb15abd65a71c4e2d1bc3a35db58e03563d6904 Mon Sep 17 00:00:00 2001 From: John Mitchell Date: Wed, 19 Aug 2015 09:52:47 -0400 Subject: [PATCH 2/7] fixed permission search on relevant lists --- awx/ui/client/src/forms/Teams.js | 12 +++++++++++- awx/ui/client/src/forms/Users.js | 12 +++++++++++- awx/ui/client/src/permissions/permissions-list.js | 12 +++++++++++- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/awx/ui/client/src/forms/Teams.js b/awx/ui/client/src/forms/Teams.js index b2bc999dd5..73aa5358c0 100644 --- a/awx/ui/client/src/forms/Teams.js +++ b/awx/ui/client/src/forms/Teams.js @@ -157,7 +157,17 @@ export default }, permission_type: { label: 'Permission', - ngBind: 'getPermissionText()' + ngBind: 'getPermissionText()', + searchType: 'select', + searchOptions: [ + { name: "Read Inventory", value: "read" }, + { name: "Edit Inventory", value: "write" }, + { name: "Administrate Inventory", value: "admin" }, + { name: "Deploy to Inventory", value: "run" }, + { name: "Deploy to Inventory (Dry Run)", value: "check" }, + { name: "Scan an Inventory", value: "scan" }, + { name: "Create a Job Template", value: "create" } + ] } }, diff --git a/awx/ui/client/src/forms/Users.js b/awx/ui/client/src/forms/Users.js index 1f7ff32694..79a58fd0c3 100644 --- a/awx/ui/client/src/forms/Users.js +++ b/awx/ui/client/src/forms/Users.js @@ -212,7 +212,17 @@ export default }, permission_type: { label: 'Permission', - ngBind: 'getPermissionText()' + ngBind: 'getPermissionText()', + searchType: 'select', + searchOptions: [ + { name: "Read Inventory", value: "read" }, + { name: "Edit Inventory", value: "write" }, + { name: "Administrate Inventory", value: "admin" }, + { name: "Deploy to Inventory", value: "run" }, + { name: "Deploy to Inventory (Dry Run)", value: "check" }, + { name: "Scan an Inventory", value: "scan" }, + { name: "Create a Job Template", value: "create" } + ] } }, diff --git a/awx/ui/client/src/permissions/permissions-list.js b/awx/ui/client/src/permissions/permissions-list.js index 28a058ea0e..cd92a5f0f1 100644 --- a/awx/ui/client/src/permissions/permissions-list.js +++ b/awx/ui/client/src/permissions/permissions-list.js @@ -37,7 +37,17 @@ }, permission_type: { label: 'Permission', - ngBind: 'getPermissionText()' + ngBind: 'getPermissionText()', + searchType: 'select', + searchOptions: [ + { name: "Read Inventory", value: "read" }, + { name: "Edit Inventory", value: "write" }, + { name: "Administrate Inventory", value: "admin" }, + { name: "Deploy to Inventory", value: "run" }, + { name: "Deploy to Inventory (Dry Run)", value: "check" }, + { name: "Scan an Inventory", value: "scan" }, + { name: "Create a Job Template", value: "create" } + ] } }, From 5f2cfa1bfaef99ec4d5980d776ec0447aec89a3f Mon Sep 17 00:00:00 2001 From: John Mitchell Date: Wed, 19 Aug 2015 09:54:42 -0400 Subject: [PATCH 3/7] fixed route for permissions edit on teams edit --- .../permissions/permissions-edit/permissions-team-edit.route.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/awx/ui/client/src/permissions/permissions-edit/permissions-team-edit.route.js b/awx/ui/client/src/permissions/permissions-edit/permissions-team-edit.route.js index 818d2c8d56..e82d7f544d 100644 --- a/awx/ui/client/src/permissions/permissions-edit/permissions-team-edit.route.js +++ b/awx/ui/client/src/permissions/permissions-edit/permissions-team-edit.route.js @@ -8,7 +8,7 @@ import {templateUrl} from '../../shared/template-url/template-url.factory'; export default { name: 'teamPermissionsEdit', - route: '/teams/:team_id/permissions/edit', + route: '/teams/:team_id/permissions/:permission_id', templateUrl: templateUrl('permissions/team-permissions'), controller: 'editController', resolve: { From d1b7b3a553ce74b34c696f9ec11e12e9b0fcd2ce Mon Sep 17 00:00:00 2001 From: John Mitchell Date: Wed, 19 Aug 2015 21:39:05 -0400 Subject: [PATCH 4/7] reinstituted modularization to be more inline with the inventory scripts management jobs --- .../add.controller.js} | 0 .../{permissions-add => add}/main.js | 6 ++-- .../team-add.route.js} | 2 +- .../user-add.route.js} | 2 +- .../edit.controller.js} | 0 .../{permissions-edit => edit}/main.js | 6 ++-- .../team-edit.route.js} | 2 +- .../user-edit.route.js} | 2 +- .../list.controller.js} | 0 .../{permissions-list => list}/main.js | 6 ++-- .../team-list.route.js} | 2 +- .../user-list.route.js} | 2 +- awx/ui/client/src/permissions/main.js | 22 +++++++++----- .../category-change.factory.js} | 0 .../get-choices.factory.js} | 13 ++------ .../permissions/shared/get-labels.factory.js | 26 ++++++++++++++++ .../shared/get-search-select.factory.js | 30 +++++++++++++++++++ .../permissions.form.js} | 0 .../permissions.list.js} | 0 .../team-permissions.partial.html | 0 .../user-permissions.partial.html | 0 21 files changed, 88 insertions(+), 33 deletions(-) rename awx/ui/client/src/permissions/{permissions-add/permissions-add.controller.js => add/add.controller.js} (100%) rename awx/ui/client/src/permissions/{permissions-add => add}/main.js (78%) rename awx/ui/client/src/permissions/{permissions-add/permissions-team-add.route.js => add/team-add.route.js} (88%) rename awx/ui/client/src/permissions/{permissions-add/permissions-user-add.route.js => add/user-add.route.js} (88%) rename awx/ui/client/src/permissions/{permissions-edit/permissions-edit.controller.js => edit/edit.controller.js} (100%) rename awx/ui/client/src/permissions/{permissions-edit => edit}/main.js (78%) rename awx/ui/client/src/permissions/{permissions-edit/permissions-team-edit.route.js => edit/team-edit.route.js} (88%) rename awx/ui/client/src/permissions/{permissions-edit/permissions-user-edit.route.js => edit/user-edit.route.js} (88%) rename awx/ui/client/src/permissions/{permissions-list/permissions-list.controller.js => list/list.controller.js} (100%) rename awx/ui/client/src/permissions/{permissions-list => list}/main.js (78%) rename awx/ui/client/src/permissions/{permissions-list/permissions-team-list.route.js => list/team-list.route.js} (88%) rename awx/ui/client/src/permissions/{permissions-list/permissions-user-list.route.js => list/user-list.route.js} (88%) rename awx/ui/client/src/permissions/{permissions-category-change.factory.js => shared/category-change.factory.js} (100%) rename awx/ui/client/src/permissions/{permissions-labels.factory.js => shared/get-choices.factory.js} (73%) create mode 100644 awx/ui/client/src/permissions/shared/get-labels.factory.js create mode 100644 awx/ui/client/src/permissions/shared/get-search-select.factory.js rename awx/ui/client/src/permissions/{permissions-form.js => shared/permissions.form.js} (100%) rename awx/ui/client/src/permissions/{permissions-list.js => shared/permissions.list.js} (100%) rename awx/ui/client/src/permissions/{ => shared}/team-permissions.partial.html (100%) rename awx/ui/client/src/permissions/{ => shared}/user-permissions.partial.html (100%) diff --git a/awx/ui/client/src/permissions/permissions-add/permissions-add.controller.js b/awx/ui/client/src/permissions/add/add.controller.js similarity index 100% rename from awx/ui/client/src/permissions/permissions-add/permissions-add.controller.js rename to awx/ui/client/src/permissions/add/add.controller.js diff --git a/awx/ui/client/src/permissions/permissions-add/main.js b/awx/ui/client/src/permissions/add/main.js similarity index 78% rename from awx/ui/client/src/permissions/permissions-add/main.js rename to awx/ui/client/src/permissions/add/main.js index 3ddff82526..ad86ab1801 100644 --- a/awx/ui/client/src/permissions/permissions-add/main.js +++ b/awx/ui/client/src/permissions/add/main.js @@ -4,9 +4,9 @@ * All Rights Reserved *************************************************/ -import userRoute from './permissions-user-add.route'; -import teamRoute from './permissions-team-add.route'; -import controller from './permissions-add.controller'; +import userRoute from './user-add.route'; +import teamRoute from './team-add.route'; +import controller from './add.controller'; export default angular.module('permissionsAdd', []) diff --git a/awx/ui/client/src/permissions/permissions-add/permissions-team-add.route.js b/awx/ui/client/src/permissions/add/team-add.route.js similarity index 88% rename from awx/ui/client/src/permissions/permissions-add/permissions-team-add.route.js rename to awx/ui/client/src/permissions/add/team-add.route.js index a2729cc329..706d273f79 100644 --- a/awx/ui/client/src/permissions/permissions-add/permissions-team-add.route.js +++ b/awx/ui/client/src/permissions/add/team-add.route.js @@ -9,7 +9,7 @@ import {templateUrl} from '../../shared/template-url/template-url.factory'; export default { name: 'teamPermissionsAdd', route: '/teams/:team_id/permissions/add', - templateUrl: templateUrl('permissions/team-permissions'), + templateUrl: templateUrl('permissions/shared/team-permissions'), controller: 'addController', resolve: { features: ['FeaturesService', function(FeaturesService) { diff --git a/awx/ui/client/src/permissions/permissions-add/permissions-user-add.route.js b/awx/ui/client/src/permissions/add/user-add.route.js similarity index 88% rename from awx/ui/client/src/permissions/permissions-add/permissions-user-add.route.js rename to awx/ui/client/src/permissions/add/user-add.route.js index b67d866a7e..877be6c20c 100644 --- a/awx/ui/client/src/permissions/permissions-add/permissions-user-add.route.js +++ b/awx/ui/client/src/permissions/add/user-add.route.js @@ -9,7 +9,7 @@ import {templateUrl} from '../../shared/template-url/template-url.factory'; export default { name: 'userPermissionsAdd', route: '/users/:user_id/permissions/add', - templateUrl: templateUrl('permissions/user-permissions'), + templateUrl: templateUrl('permissions/shared/user-permissions'), controller: 'addController', resolve: { features: ['FeaturesService', function(FeaturesService) { diff --git a/awx/ui/client/src/permissions/permissions-edit/permissions-edit.controller.js b/awx/ui/client/src/permissions/edit/edit.controller.js similarity index 100% rename from awx/ui/client/src/permissions/permissions-edit/permissions-edit.controller.js rename to awx/ui/client/src/permissions/edit/edit.controller.js diff --git a/awx/ui/client/src/permissions/permissions-edit/main.js b/awx/ui/client/src/permissions/edit/main.js similarity index 78% rename from awx/ui/client/src/permissions/permissions-edit/main.js rename to awx/ui/client/src/permissions/edit/main.js index cc5d838070..9f36428267 100644 --- a/awx/ui/client/src/permissions/permissions-edit/main.js +++ b/awx/ui/client/src/permissions/edit/main.js @@ -4,9 +4,9 @@ * All Rights Reserved *************************************************/ -import userRoute from './permissions-user-edit.route'; -import teamRoute from './permissions-team-edit.route'; -import controller from './permissions-edit.controller'; +import userRoute from './user-edit.route'; +import teamRoute from './team-edit.route'; +import controller from './edit.controller'; export default angular.module('permissionsEdit', []) diff --git a/awx/ui/client/src/permissions/permissions-edit/permissions-team-edit.route.js b/awx/ui/client/src/permissions/edit/team-edit.route.js similarity index 88% rename from awx/ui/client/src/permissions/permissions-edit/permissions-team-edit.route.js rename to awx/ui/client/src/permissions/edit/team-edit.route.js index e82d7f544d..9b3582fcdd 100644 --- a/awx/ui/client/src/permissions/permissions-edit/permissions-team-edit.route.js +++ b/awx/ui/client/src/permissions/edit/team-edit.route.js @@ -9,7 +9,7 @@ import {templateUrl} from '../../shared/template-url/template-url.factory'; export default { name: 'teamPermissionsEdit', route: '/teams/:team_id/permissions/:permission_id', - templateUrl: templateUrl('permissions/team-permissions'), + templateUrl: templateUrl('permissions/shared/team-permissions'), controller: 'editController', resolve: { features: ['FeaturesService', function(FeaturesService) { diff --git a/awx/ui/client/src/permissions/permissions-edit/permissions-user-edit.route.js b/awx/ui/client/src/permissions/edit/user-edit.route.js similarity index 88% rename from awx/ui/client/src/permissions/permissions-edit/permissions-user-edit.route.js rename to awx/ui/client/src/permissions/edit/user-edit.route.js index c0431a2a1d..fac38923f7 100644 --- a/awx/ui/client/src/permissions/permissions-edit/permissions-user-edit.route.js +++ b/awx/ui/client/src/permissions/edit/user-edit.route.js @@ -9,7 +9,7 @@ import {templateUrl} from '../../shared/template-url/template-url.factory'; export default { name: 'userPermissionsEdit', route: '/users/:user_id/permissions/:permission_id', - templateUrl: templateUrl('permissions/user-permissions'), + templateUrl: templateUrl('permissions/shared/user-permissions'), controller: 'editController', resolve: { features: ['FeaturesService', function(FeaturesService) { diff --git a/awx/ui/client/src/permissions/permissions-list/permissions-list.controller.js b/awx/ui/client/src/permissions/list/list.controller.js similarity index 100% rename from awx/ui/client/src/permissions/permissions-list/permissions-list.controller.js rename to awx/ui/client/src/permissions/list/list.controller.js diff --git a/awx/ui/client/src/permissions/permissions-list/main.js b/awx/ui/client/src/permissions/list/main.js similarity index 78% rename from awx/ui/client/src/permissions/permissions-list/main.js rename to awx/ui/client/src/permissions/list/main.js index bd29db4966..beed341e5b 100644 --- a/awx/ui/client/src/permissions/permissions-list/main.js +++ b/awx/ui/client/src/permissions/list/main.js @@ -4,9 +4,9 @@ * All Rights Reserved *************************************************/ -import userRoute from './permissions-user-list.route'; -import teamRoute from './permissions-team-list.route'; -import controller from './permissions-list.controller'; +import userRoute from './user-list.route'; +import teamRoute from './team-list.route'; +import controller from './list.controller'; export default angular.module('permissionsList', []) diff --git a/awx/ui/client/src/permissions/permissions-list/permissions-team-list.route.js b/awx/ui/client/src/permissions/list/team-list.route.js similarity index 88% rename from awx/ui/client/src/permissions/permissions-list/permissions-team-list.route.js rename to awx/ui/client/src/permissions/list/team-list.route.js index cbe4527b5f..bd93ebf2e5 100644 --- a/awx/ui/client/src/permissions/permissions-list/permissions-team-list.route.js +++ b/awx/ui/client/src/permissions/list/team-list.route.js @@ -9,7 +9,7 @@ import {templateUrl} from '../../shared/template-url/template-url.factory'; export default { name: 'teamPermissionsList', route: '/teams/:team_id/permissions', - templateUrl: templateUrl('permissions/team-permissions'), + templateUrl: templateUrl('permissions/shared/team-permissions'), controller: 'permissionsListController', resolve: { features: ['FeaturesService', function(FeaturesService) { diff --git a/awx/ui/client/src/permissions/permissions-list/permissions-user-list.route.js b/awx/ui/client/src/permissions/list/user-list.route.js similarity index 88% rename from awx/ui/client/src/permissions/permissions-list/permissions-user-list.route.js rename to awx/ui/client/src/permissions/list/user-list.route.js index ac73c54451..586b000d69 100644 --- a/awx/ui/client/src/permissions/permissions-list/permissions-user-list.route.js +++ b/awx/ui/client/src/permissions/list/user-list.route.js @@ -9,7 +9,7 @@ import {templateUrl} from '../../shared/template-url/template-url.factory'; export default { name: 'userPermissionsList', route: '/users/:user_id/permissions', - templateUrl: templateUrl('permissions/user-permissions'), + templateUrl: templateUrl('permissions/shared/user-permissions'), controller: 'permissionsListController', resolve: { features: ['FeaturesService', function(FeaturesService) { diff --git a/awx/ui/client/src/permissions/main.js b/awx/ui/client/src/permissions/main.js index 24cac3b898..fef273cfa6 100644 --- a/awx/ui/client/src/permissions/main.js +++ b/awx/ui/client/src/permissions/main.js @@ -4,13 +4,17 @@ * All Rights Reserved *************************************************/ -import permissionsList from './permissions-list/main'; -import permissionsAdd from './permissions-add/main'; -import permissionsEdit from './permissions-edit/main'; -import list from './permissions-list'; -import form from './permissions-form'; -import permissionsCategoryChange from './permissions-category-change.factory'; -import permissionsLabel from './permissions-labels.factory'; +import permissionsList from './list/main'; +import permissionsAdd from './add/main'; +import permissionsEdit from './edit/main'; + +import list from './shared/permissions.list'; +import form from './shared/permissions.form'; + +import permissionsCategoryChange from './shared/category-change.factory'; +import permissionsChoices from './shared/get-choices.factory'; +import permissionsLabel from './shared/get-labels.factory'; +import permissionsSearchSelect from './shared/get-search-select.factory'; export default angular.module('permissions', [ @@ -21,4 +25,6 @@ export default .factory('permissionsList', list) .factory('permissionsForm', form) .factory('permissionsCategoryChange', permissionsCategoryChange) - .factory('permissionsLabel', permissionsLabel); + .factory('permissionsChoices', permissionsChoices) + .factory('permissionsLabel', permissionsLabel) + .factory('permissionsSearchSelect', permissionsSearchSelect); diff --git a/awx/ui/client/src/permissions/permissions-category-change.factory.js b/awx/ui/client/src/permissions/shared/category-change.factory.js similarity index 100% rename from awx/ui/client/src/permissions/permissions-category-change.factory.js rename to awx/ui/client/src/permissions/shared/category-change.factory.js diff --git a/awx/ui/client/src/permissions/permissions-labels.factory.js b/awx/ui/client/src/permissions/shared/get-choices.factory.js similarity index 73% rename from awx/ui/client/src/permissions/permissions-labels.factory.js rename to awx/ui/client/src/permissions/shared/get-choices.factory.js index 98bce85aea..57e14433f4 100644 --- a/awx/ui/client/src/permissions/permissions-labels.factory.js +++ b/awx/ui/client/src/permissions/shared/get-choices.factory.js @@ -24,17 +24,10 @@ .then(function (data) { data = data.data; var choices = data.actions.GET.permission_type.choices; - - // convert the choices from the API from the format - // [["read", "Read Inventory"], ...] to - // {read: "Read Inventory", ...} - choices = choices.reduce(function(obj, kvp) { - obj[kvp[0]] = kvp[1]; - return obj; - }, {}); - + // manually add the adhoc label to the choices object - choices['adhoc'] = data.actions.GET.run_ad_hoc_commands.label; + choices.push(["adhoc", + data.actions.GET.run_ad_hoc_commands.label]); return choices; }) diff --git a/awx/ui/client/src/permissions/shared/get-labels.factory.js b/awx/ui/client/src/permissions/shared/get-labels.factory.js new file mode 100644 index 0000000000..2b20ca70bb --- /dev/null +++ b/awx/ui/client/src/permissions/shared/get-labels.factory.js @@ -0,0 +1,26 @@ +/************************************************* + * Copyright (c) 2015 Ansible, Inc. + * + * All Rights Reserved + *************************************************/ + + /** + * @ngdoc function + * @name helpers.function:Permissions + * @description + * Gets permission type labels from the API and sets them as the permissions labels on the relevant radio buttons + * + */ + + export default + [function() { + return function (params) { + // convert the choices from the API from the format + // [["read", "Read Inventory"], ...] to + // {read: "Read Inventory", ...} + return params.choices.reduce(function(obj, kvp) { + obj[kvp[0]] = kvp[1]; + return obj; + }, {}); + }; + }]; diff --git a/awx/ui/client/src/permissions/shared/get-search-select.factory.js b/awx/ui/client/src/permissions/shared/get-search-select.factory.js new file mode 100644 index 0000000000..ca2e459c14 --- /dev/null +++ b/awx/ui/client/src/permissions/shared/get-search-select.factory.js @@ -0,0 +1,30 @@ +/************************************************* + * Copyright (c) 2015 Ansible, Inc. + * + * All Rights Reserved + *************************************************/ + + /** + * @ngdoc function + * @name helpers.function:Permissions + * @description + * Gets permission type labels from the API and sets them as the permissions labels on the relevant radio buttons + * + */ + + export default + [function() { + return function (params) { + // convert the choices from the API from the format + // [["read", "Read Inventory"], ...] to + // {name: "read", value: "Read Inventory", ...} + return params.choices.reduce(function(obj, kvp) { + // for now, remove adhoc from those choices + if (kvp[0] !== adhoc) { + return {name: kvp[0], value: kvp[1]}; + } else { + return null; + } + }, {}); + }; + }]; diff --git a/awx/ui/client/src/permissions/permissions-form.js b/awx/ui/client/src/permissions/shared/permissions.form.js similarity index 100% rename from awx/ui/client/src/permissions/permissions-form.js rename to awx/ui/client/src/permissions/shared/permissions.form.js diff --git a/awx/ui/client/src/permissions/permissions-list.js b/awx/ui/client/src/permissions/shared/permissions.list.js similarity index 100% rename from awx/ui/client/src/permissions/permissions-list.js rename to awx/ui/client/src/permissions/shared/permissions.list.js diff --git a/awx/ui/client/src/permissions/team-permissions.partial.html b/awx/ui/client/src/permissions/shared/team-permissions.partial.html similarity index 100% rename from awx/ui/client/src/permissions/team-permissions.partial.html rename to awx/ui/client/src/permissions/shared/team-permissions.partial.html diff --git a/awx/ui/client/src/permissions/user-permissions.partial.html b/awx/ui/client/src/permissions/shared/user-permissions.partial.html similarity index 100% rename from awx/ui/client/src/permissions/user-permissions.partial.html rename to awx/ui/client/src/permissions/shared/user-permissions.partial.html From 9705a90d4307d9889a07d4af1e3aa2ed1ba803b4 Mon Sep 17 00:00:00 2001 From: John Mitchell Date: Thu, 20 Aug 2015 11:35:37 -0400 Subject: [PATCH 5/7] make search dropdowns in accordions work --- awx/ui/client/legacy-styles/ansible-ui.less | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/awx/ui/client/legacy-styles/ansible-ui.less b/awx/ui/client/legacy-styles/ansible-ui.less index b341f2d21e..e95b178fe7 100644 --- a/awx/ui/client/legacy-styles/ansible-ui.less +++ b/awx/ui/client/legacy-styles/ansible-ui.less @@ -2026,3 +2026,7 @@ tr td button i { margin-bottom: 15px; } } + +button.dropdown-toggle { + z-index: 1; +} From c67a9031cacd7407c32cd492ddaacf7e3a3a8757 Mon Sep 17 00:00:00 2001 From: John Mitchell Date: Thu, 20 Aug 2015 11:37:00 -0400 Subject: [PATCH 6/7] revamp services for pulling in the search options --- awx/ui/client/src/controllers/Teams.js | 33 +++++++++++++++---- awx/ui/client/src/controllers/Users.js | 32 ++++++++++++++---- awx/ui/client/src/forms/Teams.js | 11 +------ awx/ui/client/src/forms/Users.js | 11 +------ .../src/permissions/add/add.controller.js | 14 +++++--- .../src/permissions/edit/edit.controller.js | 14 +++++--- .../src/permissions/list/list.controller.js | 30 ++++++++++++++--- .../shared/get-search-select.factory.js | 15 ++++----- .../permissions/shared/permissions.list.js | 11 +------ 9 files changed, 106 insertions(+), 65 deletions(-) diff --git a/awx/ui/client/src/controllers/Teams.js b/awx/ui/client/src/controllers/Teams.js index 910b1bbec2..ab5dc9298f 100644 --- a/awx/ui/client/src/controllers/Teams.js +++ b/awx/ui/client/src/controllers/Teams.js @@ -176,7 +176,7 @@ TeamsAdd.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$r export function TeamsEdit($scope, $rootScope, $compile, $location, $log, $routeParams, TeamForm, GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, RelatedSearchInit, RelatedPaginateInit, ReturnToCaller, ClearScope, LookUpInit, Prompt, GetBasePath, CheckAccess, - OrganizationList, Wait, Stream, permissionsLabel) { + OrganizationList, Wait, Stream, permissionsChoices, permissionsLabel, permissionsSearchSelect) { ClearScope(); @@ -188,12 +188,22 @@ export function TeamsEdit($scope, $rootScope, $compile, $location, $log, $routeP id = $routeParams.team_id, relatedSets = {}; - $scope.permission_label = {}; + $scope.permission_label = {}; + $scope.permission_search_select = []; - permissionsLabel({ + // return a promise from the options request with the permission type choices (including adhoc) as a param + var permissionsChoice = permissionsChoices({ scope: $scope, url: 'api/v1/' + base + '/' + id + '/permissions/' - }).then(function(choices) { + }); + + // manipulate the choices from the options request to be set on + // scope and be usable by the list form + permissionsChoice.then(function (choices) { + choices = + permissionsLabel({ + choices: choices + }); _.map(choices, function(n, key) { $scope.permission_label[key] = n; }); @@ -201,8 +211,17 @@ export function TeamsEdit($scope, $rootScope, $compile, $location, $log, $routeP $scope.team_id = id; - generator.inject(form, { mode: 'edit', related: true, scope: $scope }); - generator.reset(); + // manipulate the choices from the options request to be usable + // by the search option for permission_type, you can't inject the + // list until this is done! + permissionsChoice.then(function (choices) { + form.related.permissions.fields.permission_type.searchOptions = + permissionsSearchSelect({ + choices: choices + }); + generator.inject(form, { mode: 'edit', related: true, scope: $scope }); + generator.reset(); + }); $scope.PermissionAddAllowed = false; @@ -412,5 +431,5 @@ export function TeamsEdit($scope, $rootScope, $compile, $location, $log, $routeP TeamsEdit.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'TeamForm', 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'RelatedSearchInit', 'RelatedPaginateInit', - 'ReturnToCaller', 'ClearScope', 'LookUpInit', 'Prompt', 'GetBasePath', 'CheckAccess', 'OrganizationList', 'Wait', 'Stream', 'permissionsLabel' + 'ReturnToCaller', 'ClearScope', 'LookUpInit', 'Prompt', 'GetBasePath', 'CheckAccess', 'OrganizationList', 'Wait', 'Stream', 'permissionsChoices', 'permissionsLabel', 'permissionsSearchSelect' ]; diff --git a/awx/ui/client/src/controllers/Users.js b/awx/ui/client/src/controllers/Users.js index ca0c2141e7..2a37115a16 100644 --- a/awx/ui/client/src/controllers/Users.js +++ b/awx/ui/client/src/controllers/Users.js @@ -208,7 +208,7 @@ UsersAdd.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$r export function UsersEdit($scope, $rootScope, $compile, $location, $log, $routeParams, UserForm, GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, RelatedSearchInit, RelatedPaginateInit, ReturnToCaller, ClearScope, GetBasePath, - Prompt, CheckAccess, ResetForm, Wait, Stream, permissionsLabel) { + Prompt, CheckAccess, ResetForm, Wait, Stream, permissionsChoices, permissionsLabel, permissionsSearchSelect) { ClearScope(); @@ -221,11 +221,21 @@ export function UsersEdit($scope, $rootScope, $compile, $location, $log, $routeP relatedSets = {}; $scope.permission_label = {}; + $scope.permission_search_select = []; - permissionsLabel({ + // return a promise from the options request with the permission type choices (including adhoc) as a param + var permissionsChoice = permissionsChoices({ scope: $scope, url: 'api/v1/' + base + '/' + id + '/permissions/' - }).then(function(choices) { + }); + + // manipulate the choices from the options request to be set on + // scope and be usable by the list form + permissionsChoice.then(function (choices) { + choices = + permissionsLabel({ + choices: choices + }); _.map(choices, function(n, key) { $scope.permission_label[key] = n; }); @@ -235,9 +245,17 @@ export function UsersEdit($scope, $rootScope, $compile, $location, $log, $routeP $scope.removeFormReady(); } $scope.removeFormReady = $scope.$on('formReady', function () { - - generator.inject(form, { mode: 'edit', related: true, scope: $scope }); - generator.reset(); + // manipulate the choices from the options request to be usable + // by the search option for permission_type, you can't inject the + // list until this is done! + permissionsChoice.then(function (choices) { + form.related.permissions.fields.permission_type.searchOptions = + permissionsSearchSelect({ + choices: choices + }); + generator.inject(form, { mode: 'edit', related: true, scope: $scope }); + generator.reset(); + }); if ($scope.removePostRefresh) { $scope.removePostRefresh(); @@ -501,5 +519,5 @@ export function UsersEdit($scope, $rootScope, $compile, $location, $log, $routeP UsersEdit.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'UserForm', 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'RelatedSearchInit', 'RelatedPaginateInit', 'ReturnToCaller', 'ClearScope', - 'GetBasePath', 'Prompt', 'CheckAccess', 'ResetForm', 'Wait', 'Stream', 'permissionsLabel' + 'GetBasePath', 'Prompt', 'CheckAccess', 'ResetForm', 'Wait', 'Stream', 'permissionsChoices', 'permissionsLabel', 'permissionsSearchSelect' ]; diff --git a/awx/ui/client/src/forms/Teams.js b/awx/ui/client/src/forms/Teams.js index 73aa5358c0..195f783ede 100644 --- a/awx/ui/client/src/forms/Teams.js +++ b/awx/ui/client/src/forms/Teams.js @@ -158,16 +158,7 @@ export default permission_type: { label: 'Permission', ngBind: 'getPermissionText()', - searchType: 'select', - searchOptions: [ - { name: "Read Inventory", value: "read" }, - { name: "Edit Inventory", value: "write" }, - { name: "Administrate Inventory", value: "admin" }, - { name: "Deploy to Inventory", value: "run" }, - { name: "Deploy to Inventory (Dry Run)", value: "check" }, - { name: "Scan an Inventory", value: "scan" }, - { name: "Create a Job Template", value: "create" } - ] + searchType: 'select' } }, diff --git a/awx/ui/client/src/forms/Users.js b/awx/ui/client/src/forms/Users.js index 79a58fd0c3..1f2ebef3aa 100644 --- a/awx/ui/client/src/forms/Users.js +++ b/awx/ui/client/src/forms/Users.js @@ -213,16 +213,7 @@ export default permission_type: { label: 'Permission', ngBind: 'getPermissionText()', - searchType: 'select', - searchOptions: [ - { name: "Read Inventory", value: "read" }, - { name: "Edit Inventory", value: "write" }, - { name: "Administrate Inventory", value: "admin" }, - { name: "Deploy to Inventory", value: "run" }, - { name: "Deploy to Inventory (Dry Run)", value: "check" }, - { name: "Scan an Inventory", value: "scan" }, - { name: "Create a Job Template", value: "create" } - ] + searchType: 'select' } }, diff --git a/awx/ui/client/src/permissions/add/add.controller.js b/awx/ui/client/src/permissions/add/add.controller.js index 7bc075357d..0dad88f9db 100644 --- a/awx/ui/client/src/permissions/add/add.controller.js +++ b/awx/ui/client/src/permissions/add/add.controller.js @@ -10,8 +10,8 @@ * @description This controller for permissions add */ export default - ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'permissionsForm', 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ClearScope', 'GetBasePath', 'ReturnToCaller', 'InventoryList', 'ProjectList', 'LookUpInit', 'CheckAccess', 'Wait', 'permissionsCategoryChange', 'permissionsLabel', - function($scope, $rootScope, $compile, $location, $log, $routeParams, permissionsForm, GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ClearScope, GetBasePath, ReturnToCaller, InventoryList, ProjectList, LookUpInit, CheckAccess, Wait, permissionsCategoryChange, permissionsLabel) { + ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'permissionsForm', 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ClearScope', 'GetBasePath', 'ReturnToCaller', 'InventoryList', 'ProjectList', 'LookUpInit', 'CheckAccess', 'Wait', 'permissionsCategoryChange', 'permissionsChoices', 'permissionsLabel', + function($scope, $rootScope, $compile, $location, $log, $routeParams, permissionsForm, GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ClearScope, GetBasePath, ReturnToCaller, InventoryList, ProjectList, LookUpInit, CheckAccess, Wait, permissionsCategoryChange, permissionsChoices, permissionsLabel) { ClearScope(); @@ -22,10 +22,16 @@ export default base = $location.path().replace(/^\//, '').split('/')[0], master = {}; - permissionsLabel({ + var permissionsChoice = permissionsChoices({ scope: $scope, url: 'api/v1/' + base + '/' + id + '/permissions/' - }).then(function(choices) { + }); + + permissionsChoice.then(function (choices) { + return permissionsLabel({ + choices: choices + }); + }).then(function (choices) { _.map(choices, function(n, key) { $scope.permission_label[key] = n; }); diff --git a/awx/ui/client/src/permissions/edit/edit.controller.js b/awx/ui/client/src/permissions/edit/edit.controller.js index b0a9b0dd08..1b1c6a552b 100644 --- a/awx/ui/client/src/permissions/edit/edit.controller.js +++ b/awx/ui/client/src/permissions/edit/edit.controller.js @@ -10,8 +10,8 @@ * @description This controller for permissions edit */ export default - ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'permissionsForm', 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ReturnToCaller', 'ClearScope', 'Prompt', 'GetBasePath', 'InventoryList', 'ProjectList', 'LookUpInit', 'CheckAccess', 'Wait', 'permissionsCategoryChange', 'permissionsLabel', - function($scope, $rootScope, $compile, $location, $log, $routeParams, permissionsForm, GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ReturnToCaller, ClearScope, Prompt, GetBasePath, InventoryList, ProjectList, LookUpInit, CheckAccess, Wait, permissionsCategoryChange, permissionsLabel) { + ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'permissionsForm', 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ReturnToCaller', 'ClearScope', 'Prompt', 'GetBasePath', 'InventoryList', 'ProjectList', 'LookUpInit', 'CheckAccess', 'Wait', 'permissionsCategoryChange', 'permissionsChoices', 'permissionsLabel', + function($scope, $rootScope, $compile, $location, $log, $routeParams, permissionsForm, GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ReturnToCaller, ClearScope, Prompt, GetBasePath, InventoryList, ProjectList, LookUpInit, CheckAccess, Wait, permissionsCategoryChange, permissionsChoices, permissionsLabel) { ClearScope(); @@ -25,10 +25,16 @@ export default $scope.permission_label = {}; - permissionsLabel({ + var permissionsChoice = permissionsChoices({ scope: $scope, url: 'api/v1/' + base + '/' + base_id + '/permissions/' - }).then(function(choices) { + }); + + permissionsChoice.then(function (choices) { + return permissionsLabel({ + choices: choices + }); + }).then(function (choices) { _.map(choices, function(n, key) { $scope.permission_label[key] = n; }); diff --git a/awx/ui/client/src/permissions/list/list.controller.js b/awx/ui/client/src/permissions/list/list.controller.js index a3249f18a9..4e9ea4c716 100644 --- a/awx/ui/client/src/permissions/list/list.controller.js +++ b/awx/ui/client/src/permissions/list/list.controller.js @@ -12,8 +12,8 @@ export default - ['$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'permissionsList', 'generateList', 'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'ClearScope', 'ProcessErrors', 'GetBasePath', 'CheckAccess', 'Wait', 'permissionsLabel', - function ($scope, $rootScope, $location, $log, $routeParams, Rest, Alert, permissionsList, GenerateList, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit, ReturnToCaller, ClearScope, ProcessErrors, GetBasePath, CheckAccess, Wait, permissionsLabel) { + ['$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'permissionsList', 'generateList', 'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'ClearScope', 'ProcessErrors', 'GetBasePath', 'CheckAccess', 'Wait', 'permissionsChoices', 'permissionsLabel', 'permissionsSearchSelect', + function ($scope, $rootScope, $location, $log, $routeParams, Rest, Alert, permissionsList, GenerateList, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit, ReturnToCaller, ClearScope, ProcessErrors, GetBasePath, CheckAccess, Wait, permissionsChoices, permissionsLabel, permissionsSearchSelect) { ClearScope(); @@ -24,17 +24,37 @@ export default generator = GenerateList; $scope.permission_label = {}; + $scope.permission_search_select = []; - permissionsLabel({ + // return a promise from the options request with the permission type choices (including adhoc) as a param + var permissionsChoice = permissionsChoices({ scope: $scope, url: 'api/v1/' + base + '/' + base_id + '/permissions/' - }).then(function(choices) { + }); + + // manipulate the choices from the options request to be set on + // scope and be usable by the list form + permissionsChoice.then(function (choices) { + choices = + permissionsLabel({ + choices: choices + }); _.map(choices, function(n, key) { $scope.permission_label[key] = n; }); }); - generator.inject(list, { mode: 'edit', scope: $scope, breadCrumbs: true }); + // manipulate the choices from the options request to be usable + // by the search option for permission_type, you can't inject the + // list until this is done! + permissionsChoice.then(function (choices) { + list.fields.permission_type.searchOptions = + permissionsSearchSelect({ + choices: choices + }); + generator.inject(list, { mode: 'edit', scope: $scope, breadCrumbs: true }); + }); + defaultUrl += ($routeParams.user_id !== undefined) ? $routeParams.user_id : $routeParams.team_id; defaultUrl += '/permissions/'; diff --git a/awx/ui/client/src/permissions/shared/get-search-select.factory.js b/awx/ui/client/src/permissions/shared/get-search-select.factory.js index ca2e459c14..110663cd7b 100644 --- a/awx/ui/client/src/permissions/shared/get-search-select.factory.js +++ b/awx/ui/client/src/permissions/shared/get-search-select.factory.js @@ -17,14 +17,13 @@ return function (params) { // convert the choices from the API from the format // [["read", "Read Inventory"], ...] to - // {name: "read", value: "Read Inventory", ...} - return params.choices.reduce(function(obj, kvp) { - // for now, remove adhoc from those choices - if (kvp[0] !== adhoc) { - return {name: kvp[0], value: kvp[1]}; - } else { - return null; + // [{name: "read", value: "Read Inventory"}, ...] + return params.choices.filter(function (kvp) { + return (kvp[0] !== "adhoc"); + }).map(function (kvp) { + if (kvp[0] !== "adhoc") { + return {name: kvp[1], value: kvp[0]}; } - }, {}); + }); }; }]; diff --git a/awx/ui/client/src/permissions/shared/permissions.list.js b/awx/ui/client/src/permissions/shared/permissions.list.js index cd92a5f0f1..f9c50c7818 100644 --- a/awx/ui/client/src/permissions/shared/permissions.list.js +++ b/awx/ui/client/src/permissions/shared/permissions.list.js @@ -38,16 +38,7 @@ permission_type: { label: 'Permission', ngBind: 'getPermissionText()', - searchType: 'select', - searchOptions: [ - { name: "Read Inventory", value: "read" }, - { name: "Edit Inventory", value: "write" }, - { name: "Administrate Inventory", value: "admin" }, - { name: "Deploy to Inventory", value: "run" }, - { name: "Deploy to Inventory (Dry Run)", value: "check" }, - { name: "Scan an Inventory", value: "scan" }, - { name: "Create a Job Template", value: "create" } - ] + searchType: 'select' } }, From 711c74285863fa07044389ede9ecdc08f8d117bf Mon Sep 17 00:00:00 2001 From: John Mitchell Date: Thu, 20 Aug 2015 20:09:00 -0400 Subject: [PATCH 7/7] make permission edit controller name more descriptive and clear search button clickable --- awx/ui/client/legacy-styles/ansible-ui.less | 3 ++- awx/ui/client/src/permissions/edit/main.js | 2 +- awx/ui/client/src/permissions/edit/team-edit.route.js | 2 +- awx/ui/client/src/permissions/edit/user-edit.route.js | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/awx/ui/client/legacy-styles/ansible-ui.less b/awx/ui/client/legacy-styles/ansible-ui.less index e95b178fe7..2dfc7682e6 100644 --- a/awx/ui/client/legacy-styles/ansible-ui.less +++ b/awx/ui/client/legacy-styles/ansible-ui.less @@ -2027,6 +2027,7 @@ tr td button i { } } -button.dropdown-toggle { +button.dropdown-toggle, +.input-group-btn { z-index: 1; } diff --git a/awx/ui/client/src/permissions/edit/main.js b/awx/ui/client/src/permissions/edit/main.js index 9f36428267..08e4aa2b85 100644 --- a/awx/ui/client/src/permissions/edit/main.js +++ b/awx/ui/client/src/permissions/edit/main.js @@ -10,7 +10,7 @@ import controller from './edit.controller'; export default angular.module('permissionsEdit', []) - .controller('editController', controller) + .controller('permissionsEditController', controller) .config(['$routeProvider', function($routeProvider) { var url = userRoute.route; delete userRoute.route; diff --git a/awx/ui/client/src/permissions/edit/team-edit.route.js b/awx/ui/client/src/permissions/edit/team-edit.route.js index 9b3582fcdd..8122b7fcf5 100644 --- a/awx/ui/client/src/permissions/edit/team-edit.route.js +++ b/awx/ui/client/src/permissions/edit/team-edit.route.js @@ -10,7 +10,7 @@ export default { name: 'teamPermissionsEdit', route: '/teams/:team_id/permissions/:permission_id', templateUrl: templateUrl('permissions/shared/team-permissions'), - controller: 'editController', + controller: 'permissionsEditController', resolve: { features: ['FeaturesService', function(FeaturesService) { return FeaturesService.get(); diff --git a/awx/ui/client/src/permissions/edit/user-edit.route.js b/awx/ui/client/src/permissions/edit/user-edit.route.js index fac38923f7..3d42d5827e 100644 --- a/awx/ui/client/src/permissions/edit/user-edit.route.js +++ b/awx/ui/client/src/permissions/edit/user-edit.route.js @@ -10,7 +10,7 @@ export default { name: 'userPermissionsEdit', route: '/users/:user_id/permissions/:permission_id', templateUrl: templateUrl('permissions/shared/user-permissions'), - controller: 'editController', + controller: 'permissionsEditController', resolve: { features: ['FeaturesService', function(FeaturesService) { return FeaturesService.get();