diff --git a/awx/ui/static/js/app.js b/awx/ui/static/js/app.js index fd4ee13e85..6871bd943a 100644 --- a/awx/ui/static/js/app.js +++ b/awx/ui/static/js/app.js @@ -45,6 +45,7 @@ angular.module('ansible', [ 'JobTemplateHelper', 'ProjectsListDefinition', 'ProjectFormDefinition', + 'PermissionFormDefinition', 'JobsListDefinition', 'JobFormDefinition', 'JobEventsListDefinition', @@ -171,8 +172,11 @@ angular.module('ansible', [ when('/users/:user_id', { templateUrl: urlPrefix + 'partials/users.html', controller: UsersEdit }). - when('/users/:user_id/credentials', { templateUrl: urlPrefix + 'partials/teams.html', - controller: CredentialsList }). + when('/users/:user_id/credentials', { templateUrl: urlPrefix + 'partials/users.html', + controller: CredentialsList }). + + when('/users/:user_id/permissions/add', { templateUrl: urlPrefix + 'partials/users.html', + controller: PermissionsAdd }). when('/users/:user_id/credentials/add', { templateUrl: urlPrefix + 'partials/teams.html', controller: CredentialsAdd }). diff --git a/awx/ui/static/js/controllers/Permissions.js b/awx/ui/static/js/controllers/Permissions.js new file mode 100644 index 0000000000..8056420ec4 --- /dev/null +++ b/awx/ui/static/js/controllers/Permissions.js @@ -0,0 +1,72 @@ +function PermissionsAdd ($scope, $rootScope, $compile, $location, $log, $routeParams, PermissionsForm, + GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ClearScope, + GetBasePath, ReturnToCaller, InventoryList, ProjectList, LookUpInit) +{ + ClearScope('htmlTemplate'); //Garbage collection. Don't leave behind any listeners/watchers from the prior + //scope. + + // Inject dynamic view + var form = PermissionsForm; + var generator = GenerateForm; + var id = $routeParams.user_id; + var base = $location.path().replace(/^\//,'').split('/')[0]; + var defaultUrl = GetBasePath(base) + id + '/permissions'; + var scope = generator.inject(form, {mode: 'add', related: false}); + var master = {}; + + generator.reset(); + LoadBreadCrumbs(); + + scope.category = 'i'; + master.category = 'i'; + + LookUpInit({ + scope: scope, + form: form, + current_item: null, + list: InventoryList, + field: 'inventory' + }); + + LookUpInit({ + scope: scope, + form: form, + current_item: null, + list: ProjectList, + field: 'project' + }); + + // Save + scope.formSave = function() { + var data = {}; + for (var fld in form.fields) { + data[fld] = scope[fld]; + } + var url = (base == 'teams') ? GetBasePath('teams') + id + '/permissions/' : GetBasePath('users') + id + '/permissions/'; + Rest.setUrl(url); + Rest.post(data) + .success( function(data, status, headers, config) { + ReturnToCaller(1); + }) + .error( function(data, status, headers, config) { + ProcessErrors(scope, data, status, ProjectsForm, + { hdr: 'Error!', msg: 'Failed to create new permission. Post returned status: ' + status }); + }); + }; + + // Cancel + scope.formReset = function() { + $rootScope.flashMessage = null; + generator.reset(); + for (var fld in master) { + scope[fld] = master[fld]; + } + }; +} + +ProjectsAdd.$inject = [ '$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'PermissionForm', + 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ClearScope', 'GetBasePath', + 'ReturnToCaller', 'InventoryList', 'ProjectList', 'LookUpInit' + ]; + + diff --git a/awx/ui/static/js/controllers/Users.js b/awx/ui/static/js/controllers/Users.js index 00e882898c..d91eb0b096 100644 --- a/awx/ui/static/js/controllers/Users.js +++ b/awx/ui/static/js/controllers/Users.js @@ -319,7 +319,12 @@ function UsersEdit ($scope, $rootScope, $compile, $location, $log, $routeParams, // Related set: Add button scope.add = function(set) { $rootScope.flashMessage = null; - $location.path('/' + base + '/' + $routeParams.user_id + '/' + set); + if (set == 'permissions') { + $location.path('/' + base + '/' + $routeParams.user_id + '/' + set + '/add'); + } + else { + $location.path('/' + base + '/' + $routeParams.user_id + '/' + set); + } }; // Related set: Edit button diff --git a/awx/ui/static/js/forms/Permissions.js b/awx/ui/static/js/forms/Permissions.js new file mode 100644 index 0000000000..87150761c6 --- /dev/null +++ b/awx/ui/static/js/forms/Permissions.js @@ -0,0 +1,103 @@ +/********************************************* + * Copyright (c) 2013 AnsibleWorks, Inc. + * + * Permissions.js + * + * Form definition for Projects model + * + * + */ +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/ + + fields: { + category: { + label: 'Permission Type', + type: 'radio', + options: [{ label: 'Inventory', value: 'i' }, { label: 'Deployment', value: 'd'}], + ngChange: 'selectCategory()' + }, + name: { + label: 'Name', + type: 'text', + addRequired: true, + editRequired: true, + capitalize: true + }, + 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 == 'd'", + ngClick: 'lookUpProject()', + }, + inventory: { + label: 'Inventory', + type: 'lookup', + sourceModel: 'inventory', + sourceField: 'name', + ngClick: 'lookUpInventory()', + }, + inventory_permission_type: { + label: 'Permission', + type: 'radio', + ngShow: "category == 'i'", + options: [ + {label: 'Admin', value: 'PERM_INVENTORY_ADMIN'}, + {label: 'Read', value: 'PERM_INVENTORY_READ'}, + {label: 'Write', value: 'PERM_INVENTORY_WRITE'} + ] + }, + deployment_permission_type: { + label: 'Permission', + type: 'radio', + ngShow: "category == 'd'", + options: [ + {label: 'Deploy', value: 'PERM_INVENTORY_DEPLOY'}, + {label: 'Check', value: 'PERM_INVENTORY_CHECK'} + ] + } + }, + + buttons: { //for now always generates