mirror of
https://github.com/ansible/awx.git
synced 2026-05-21 15:57:52 -02:30
Add radio button support to form-generator. Created permission list and permission add form. Form is currently accessible from User tab.
This commit is contained in:
@@ -45,6 +45,7 @@ angular.module('ansible', [
|
|||||||
'JobTemplateHelper',
|
'JobTemplateHelper',
|
||||||
'ProjectsListDefinition',
|
'ProjectsListDefinition',
|
||||||
'ProjectFormDefinition',
|
'ProjectFormDefinition',
|
||||||
|
'PermissionFormDefinition',
|
||||||
'JobsListDefinition',
|
'JobsListDefinition',
|
||||||
'JobFormDefinition',
|
'JobFormDefinition',
|
||||||
'JobEventsListDefinition',
|
'JobEventsListDefinition',
|
||||||
@@ -171,8 +172,11 @@ angular.module('ansible', [
|
|||||||
when('/users/:user_id', { templateUrl: urlPrefix + 'partials/users.html',
|
when('/users/:user_id', { templateUrl: urlPrefix + 'partials/users.html',
|
||||||
controller: UsersEdit }).
|
controller: UsersEdit }).
|
||||||
|
|
||||||
when('/users/:user_id/credentials', { templateUrl: urlPrefix + 'partials/teams.html',
|
when('/users/:user_id/credentials', { templateUrl: urlPrefix + 'partials/users.html',
|
||||||
controller: CredentialsList }).
|
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',
|
when('/users/:user_id/credentials/add', { templateUrl: urlPrefix + 'partials/teams.html',
|
||||||
controller: CredentialsAdd }).
|
controller: CredentialsAdd }).
|
||||||
|
|||||||
72
awx/ui/static/js/controllers/Permissions.js
Normal file
72
awx/ui/static/js/controllers/Permissions.js
Normal file
@@ -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'
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
@@ -319,7 +319,12 @@ function UsersEdit ($scope, $rootScope, $compile, $location, $log, $routeParams,
|
|||||||
// Related set: Add button
|
// Related set: Add button
|
||||||
scope.add = function(set) {
|
scope.add = function(set) {
|
||||||
$rootScope.flashMessage = null;
|
$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
|
// Related set: Edit button
|
||||||
|
|||||||
103
awx/ui/static/js/forms/Permissions.js
Normal file
103
awx/ui/static/js/forms/Permissions.js
Normal file
@@ -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 <button> tags
|
||||||
|
save: {
|
||||||
|
label: 'Save',
|
||||||
|
icon: 'icon-ok',
|
||||||
|
"class": 'btn-success',
|
||||||
|
ngClick: 'formSave()', //$scope.function to call on click, optional
|
||||||
|
ngDisabled: true //Disable when $pristine or $invalid, optional
|
||||||
|
},
|
||||||
|
reset: {
|
||||||
|
ngClick: 'formReset()',
|
||||||
|
label: 'Reset',
|
||||||
|
icon: 'icon-remove',
|
||||||
|
ngDisabled: true //Disabled when $pristine
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
related: { //related colletions (and maybe items?)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}); // Form
|
||||||
@@ -94,6 +94,7 @@ angular.module('UserFormDefinition', [])
|
|||||||
},
|
},
|
||||||
|
|
||||||
related: { //related colletions (and maybe items?)
|
related: { //related colletions (and maybe items?)
|
||||||
|
|
||||||
credentials: {
|
credentials: {
|
||||||
type: 'collection',
|
type: 'collection',
|
||||||
title: 'Credentials',
|
title: 'Credentials',
|
||||||
@@ -135,6 +136,53 @@ angular.module('UserFormDefinition', [])
|
|||||||
awToolTip: 'Delete the credential'
|
awToolTip: 'Delete the credential'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
permissions: {
|
||||||
|
type: 'collection',
|
||||||
|
title: 'Permissions',
|
||||||
|
iterator: 'permission',
|
||||||
|
open: false,
|
||||||
|
|
||||||
|
actions: {
|
||||||
|
add: {
|
||||||
|
ngClick: "add('permissions')",
|
||||||
|
icon: 'icon-plus',
|
||||||
|
label: 'Add',
|
||||||
|
awToolTip: 'Add a permission for this user'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
fields: {
|
||||||
|
name: {
|
||||||
|
key: true,
|
||||||
|
label: 'Name'
|
||||||
|
},
|
||||||
|
project: {
|
||||||
|
label: 'Project'
|
||||||
|
},
|
||||||
|
inventory: {
|
||||||
|
label: 'Inventory'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
fieldActions: {
|
||||||
|
edit: {
|
||||||
|
label: 'Edit',
|
||||||
|
ngClick: "edit('permissions', \{\{ permission.id \}\}, '\{\{ permission.name \}\}')",
|
||||||
|
icon: 'icon-edit',
|
||||||
|
"class": 'btn-success',
|
||||||
|
awToolTip: 'Edit the permission'
|
||||||
|
},
|
||||||
|
|
||||||
|
"delete": {
|
||||||
|
label: 'Delete',
|
||||||
|
ngClick: "delete('permissions', \{\{ permission.id \}\}, '\{\{ permission.name \}\}', 'permissions')",
|
||||||
|
icon: 'icon-remove',
|
||||||
|
"class": 'btn-danger',
|
||||||
|
awToolTip: 'Delete the permission'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,8 @@ angular.module('InventoriesListDefinition', [])
|
|||||||
ngClick: 'viewJobs(\{\{ inventory.id \}\})',
|
ngClick: 'viewJobs(\{\{ inventory.id \}\})',
|
||||||
searchField: 'has_active_failures',
|
searchField: 'has_active_failures',
|
||||||
searchType: 'boolean',
|
searchType: 'boolean',
|
||||||
searchOptions: [{ name: "No", value: 0 }, { name: "Yes", value: 1 }]
|
searchOptions: [{ name: "No", value: 0 }, { name: "Yes", value: 1 }],
|
||||||
|
excludeModal: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -368,6 +368,38 @@ angular.module('FormGenerator', ['GeneratorHelpers'])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//radio
|
||||||
|
if (field.type == 'radio') {
|
||||||
|
if ( (! field.readonly) || (field.readonly && options.mode == 'edit') ) {
|
||||||
|
html += "<div class=\"control-group\" "
|
||||||
|
html += (field.ngShow) ? this.attr(field,'ngShow') : "";
|
||||||
|
html += ">\n";
|
||||||
|
html += "<label class=\"control-label\" for=\"" + fld + '">';
|
||||||
|
if (field.awPopOver) {
|
||||||
|
html += "<a href=\"\" " + this.attr(field,'awPopOver');
|
||||||
|
html += (field.dataTitle) ? this.attr(field, 'dataTitle') : "";
|
||||||
|
html += (field.dataPlacement) ? this.attr(field, 'dataPlacement') : "";
|
||||||
|
html += "><i class=\"icon-info-sign\"></i></a> ";
|
||||||
|
}
|
||||||
|
html += field.label + '</label>' + "\n";
|
||||||
|
html += "<div class=\"controls\">\n";
|
||||||
|
for (var i=0; i < field.options.length; i++) {
|
||||||
|
html += "<label class=\"radio inline\">";
|
||||||
|
html += "<input type=\"radio\" ";
|
||||||
|
html += "name=\"" + fld + "\" ";
|
||||||
|
html += "ng-model=\"" + fld + "\" ";
|
||||||
|
html += (field.ngChange) ? this.attr(field,'ngChange') : "";
|
||||||
|
html += "value=\"" + field.options[i].value + "\" ";
|
||||||
|
html += (field.readonly) ? "readonly " : "";
|
||||||
|
html += " /> " + field.options[i].label + "\n";
|
||||||
|
html += "</label>\n";
|
||||||
|
}
|
||||||
|
html += "<span class=\"error api-error\" ng-bind=\"" + fld + "_api_error\"></span>\n";
|
||||||
|
html += "</div>\n";
|
||||||
|
html += "</div>\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (field.type == 'hidden') {
|
if (field.type == 'hidden') {
|
||||||
if ( (options.mode == 'edit' && field.includeOnEdit) ||
|
if ( (options.mode == 'edit' && field.includeOnEdit) ||
|
||||||
(options.mode == 'add' && field.includeOnAdd) ) {
|
(options.mode == 'add' && field.includeOnAdd) ) {
|
||||||
|
|||||||
@@ -153,7 +153,8 @@ angular.module('ListGenerator', ['GeneratorHelpers'])
|
|||||||
html += "<th>#</th>\n";
|
html += "<th>#</th>\n";
|
||||||
}
|
}
|
||||||
for (var fld in list.fields) {
|
for (var fld in list.fields) {
|
||||||
if (list.fields[fld].searchOnly == undefined || list.fields[fld].searchOnly == false) {
|
if ( (list.fields[fld].searchOnly == undefined || list.fields[fld].searchOnly == false) &&
|
||||||
|
!(options.mode == 'lookup' && list.fields[fld].excludeModal !== undefined && list.fields[fld].excludeModal == true) ) {
|
||||||
html += "<th class=\"list-header\" id=\"";
|
html += "<th class=\"list-header\" id=\"";
|
||||||
html += (list.fields[fld].id) ? list.fields[fld].id : fld + "-header";
|
html += (list.fields[fld].id) ? list.fields[fld].id : fld + "-header";
|
||||||
html += "\"";
|
html += "\"";
|
||||||
@@ -201,7 +202,8 @@ angular.module('ListGenerator', ['GeneratorHelpers'])
|
|||||||
base = base.replace(/^\//,'');
|
base = base.replace(/^\//,'');
|
||||||
for (fld in list.fields) {
|
for (fld in list.fields) {
|
||||||
cnt++;
|
cnt++;
|
||||||
if (list.fields[fld].searchOnly == undefined || list.fields[fld].searchOnly == false) {
|
if ( (list.fields[fld].searchOnly == undefined || list.fields[fld].searchOnly == false) &&
|
||||||
|
!(options.mode == 'lookup' && list.fields[fld].excludeModal !== undefined && list.fields[fld].excludeModal == true) ) {
|
||||||
html += Column({ list: list, fld: fld, options: options, base: base });
|
html += Column({ list: list, fld: fld, options: options, base: base });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,6 +37,7 @@
|
|||||||
<script src="{{ STATIC_URL }}js/controllers/Jobs.js"></script>
|
<script src="{{ STATIC_URL }}js/controllers/Jobs.js"></script>
|
||||||
<script src="{{ STATIC_URL }}js/controllers/JobEvents.js"></script>
|
<script src="{{ STATIC_URL }}js/controllers/JobEvents.js"></script>
|
||||||
<script src="{{ STATIC_URL }}js/controllers/JobHosts.js"></script>
|
<script src="{{ STATIC_URL }}js/controllers/JobHosts.js"></script>
|
||||||
|
<script src="{{ STATIC_URL }}js/controllers/Permissions.js"></script>
|
||||||
<script src="{{ STATIC_URL }}js/forms/Users.js"></script>
|
<script src="{{ STATIC_URL }}js/forms/Users.js"></script>
|
||||||
<script src="{{ STATIC_URL }}js/forms/Organizations.js"></script>
|
<script src="{{ STATIC_URL }}js/forms/Organizations.js"></script>
|
||||||
<script src="{{ STATIC_URL }}js/forms/Inventories.js"></script>
|
<script src="{{ STATIC_URL }}js/forms/Inventories.js"></script>
|
||||||
@@ -48,6 +49,7 @@
|
|||||||
<script src="{{ STATIC_URL }}js/forms/Jobs.js"></script>
|
<script src="{{ STATIC_URL }}js/forms/Jobs.js"></script>
|
||||||
<script src="{{ STATIC_URL }}js/forms/JobEvents.js"></script>
|
<script src="{{ STATIC_URL }}js/forms/JobEvents.js"></script>
|
||||||
<script src="{{ STATIC_URL }}js/forms/Projects.js"></script>
|
<script src="{{ STATIC_URL }}js/forms/Projects.js"></script>
|
||||||
|
<script src="{{ STATIC_URL }}js/forms/Permissions.js"></script>
|
||||||
<script src="{{ STATIC_URL }}js/lists/Users.js"></script>
|
<script src="{{ STATIC_URL }}js/lists/Users.js"></script>
|
||||||
<script src="{{ STATIC_URL }}js/lists/Organizations.js"></script>
|
<script src="{{ STATIC_URL }}js/lists/Organizations.js"></script>
|
||||||
<script src="{{ STATIC_URL }}js/lists/Admins.js"></script>
|
<script src="{{ STATIC_URL }}js/lists/Admins.js"></script>
|
||||||
|
|||||||
Reference in New Issue
Block a user