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:
chouseknecht 2013-06-24 23:26:53 -04:00
parent 13b8b68449
commit 7943134168
9 changed files with 275 additions and 6 deletions

View File

@ -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 }).

View 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'
];

View File

@ -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

View 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

View File

@ -94,6 +94,7 @@ angular.module('UserFormDefinition', [])
},
related: { //related colletions (and maybe items?)
credentials: {
type: 'collection',
title: 'Credentials',
@ -135,6 +136,53 @@ angular.module('UserFormDefinition', [])
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'
}
}
},

View File

@ -42,7 +42,8 @@ angular.module('InventoriesListDefinition', [])
ngClick: 'viewJobs(\{\{ inventory.id \}\})',
searchField: 'has_active_failures',
searchType: 'boolean',
searchOptions: [{ name: "No", value: 0 }, { name: "Yes", value: 1 }]
searchOptions: [{ name: "No", value: 0 }, { name: "Yes", value: 1 }],
excludeModal: true
}
},

View File

@ -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 ( (options.mode == 'edit' && field.includeOnEdit) ||
(options.mode == 'add' && field.includeOnAdd) ) {

View File

@ -153,7 +153,8 @@ angular.module('ListGenerator', ['GeneratorHelpers'])
html += "<th>#</th>\n";
}
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 += (list.fields[fld].id) ? list.fields[fld].id : fld + "-header";
html += "\"";
@ -201,7 +202,8 @@ angular.module('ListGenerator', ['GeneratorHelpers'])
base = base.replace(/^\//,'');
for (fld in list.fields) {
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 });
}
}

View File

@ -37,6 +37,7 @@
<script src="{{ STATIC_URL }}js/controllers/Jobs.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/Permissions.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/Inventories.js"></script>
@ -48,6 +49,7 @@
<script src="{{ STATIC_URL }}js/forms/Jobs.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/Permissions.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/Admins.js"></script>