Latest UI changes. Related-set key fields now link to the edit/detail page. Job detail page disables correctly. Fixed jobs related set on Job Templates detail page.

This commit is contained in:
chouseknecht
2013-05-23 01:07:15 -04:00
parent 3b91d68130
commit bdbfcd4b85
12 changed files with 85 additions and 33 deletions

View File

@@ -306,4 +306,3 @@
} }
/* End Jobs Page */ /* End Jobs Page */

View File

@@ -19,8 +19,8 @@ function CredentialsList ($scope, $rootScope, $location, $log, $routeParams, Res
var list = CredentialList; var list = CredentialList;
var defaultUrl = GetBasePath('credentials'); var defaultUrl = GetBasePath('credentials');
var view = GenerateList; var view = GenerateList;
var paths = $location.path().replace(/^\//,'').split('/'); var base = $location.path().replace(/^\//,'').split('/')[0];
var mode = (paths[0] == 'credentials') ? 'edit' : 'select'; // if base path 'credentials', we're here to add/edit var mode = (base == 'credentials') ? 'edit' : 'select'; // if base path 'credentials', we're here to add/edit
var scope = view.inject(CredentialList, { mode: mode }); // Inject our view var scope = view.inject(CredentialList, { mode: mode }); // Inject our view
scope.selected = []; scope.selected = [];
@@ -62,8 +62,9 @@ function CredentialsList ($scope, $rootScope, $location, $log, $routeParams, Res
} }
scope.finishSelection = function() { scope.finishSelection = function() {
Rest.setUrl(GetBasePath('base') + $location.path() + '/'); // We're assuming the path matches the api path. var url = GetBasePath(base);
// Will this always be true?? url += (base == 'users') ? $routeParams.user_id + '/credentials/' : $routeParams.team_id + '/credentials/';
Rest.setUrl(url);
scope.queue = []; scope.queue = [];
scope.$on('callFinished', function() { scope.$on('callFinished', function() {
@@ -77,13 +78,6 @@ function CredentialsList ($scope, $rootScope, $location, $log, $routeParams, Res
for (var i=0; i < scope.queue.length; i++) { for (var i=0; i < scope.queue.length; i++) {
if (scope.queue[i].result == 'error') { if (scope.queue[i].result == 'error') {
errors++; errors++;
// there is no way to know which user raised the error. no data comes
// back from the api call.
// $('td.username-column').each(function(index) {
// if ($(this).text() == scope.queue[i].username) {
// $(this).addClass("error");
// }
// });
} }
} }
if (errors > 0) { if (errors > 0) {

View File

@@ -25,6 +25,21 @@ function GroupsList ($scope, $rootScope, $location, $log, $routeParams, Rest,
var scope = view.inject(GroupList, { mode: 'select' }); // Inject our view var scope = view.inject(GroupList, { mode: 'select' }); // Inject our view
scope.selected = []; scope.selected = [];
if (scope.PostRefreshRemove) {
scope.PostRefreshRemove();
}
scope.PostRefresRemove = scope.$on('PostRefresh', function() {
if ($routeParams.group_id) {
// Remove the current group from the list of available groups, thus
// preventing a group from being added to itself
for (var i=0; i < scope.groups.length; i++) {
if (scope.groups[i].id == $routeParams.group_id) {
scope.groups.splice(i,1);
}
}
}
});
SearchInit({ scope: scope, set: 'groups', list: list, url: defaultUrl }); SearchInit({ scope: scope, set: 'groups', list: list, url: defaultUrl });
PaginateInit({ scope: scope, list: list, url: defaultUrl }); PaginateInit({ scope: scope, list: list, url: defaultUrl });
scope.search(list.iterator); scope.search(list.iterator);

View File

@@ -12,12 +12,12 @@
function InventoriesList ($scope, $rootScope, $location, $log, $routeParams, Rest, Alert, InventoryList, function InventoriesList ($scope, $rootScope, $location, $log, $routeParams, Rest, Alert, InventoryList,
GenerateList, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit, ReturnToCaller, GenerateList, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit, ReturnToCaller,
ClearScope, ProcessErrors) ClearScope, ProcessErrors, GetBasePath)
{ {
ClearScope('htmlTemplate'); //Garbage collection. Don't leave behind any listeners/watchers from the prior ClearScope('htmlTemplate'); //Garbage collection. Don't leave behind any listeners/watchers from the prior
//scope. //scope.
var list = InventoryList; var list = InventoryList;
var defaultUrl = '/api/v1/inventories/'; var defaultUrl = GetBasePath('inventory');
var view = GenerateList; var view = GenerateList;
var paths = $location.path().replace(/^\//,'').split('/'); var paths = $location.path().replace(/^\//,'').split('/');
var mode = (paths[0] == 'inventories') ? 'edit' : 'select'; // if base path 'users', we're here to add/edit users var mode = (paths[0] == 'inventories') ? 'edit' : 'select'; // if base path 'users', we're here to add/edit users
@@ -141,7 +141,8 @@ function InventoriesList ($scope, $rootScope, $location, $log, $routeParams, Res
} }
InventoriesList.$inject = [ '$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'InventoryList', 'GenerateList', InventoriesList.$inject = [ '$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'InventoryList', 'GenerateList',
'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'ClearScope', 'ProcessErrors' ]; 'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'ClearScope', 'ProcessErrors',
'GetBasePath' ];
function InventoriesAdd ($scope, $rootScope, $compile, $location, $log, $routeParams, InventoryForm, function InventoriesAdd ($scope, $rootScope, $compile, $location, $log, $routeParams, InventoryForm,

View File

@@ -512,7 +512,7 @@ function JobTemplatesEdit ($scope, $rootScope, $compile, $location, $log, $route
// Related set: Edit button // Related set: Edit button
scope.edit = function(set, id, name) { scope.edit = function(set, id, name) {
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
$location.path('/' + base + '/' + $routeParams.id + '/' + set + '/' + id); $location.path('/' + set + '/' + id);
}; };
// Related set: Delete button // Related set: Delete button

View File

@@ -220,6 +220,12 @@ function JobsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams,
} }
} }
if (data.status != 'new') {
$('input[type="text"], textarea').attr('readonly','readonly');
$('select').prop('disabled', 'disabled');
$('.lookup-btn').prop('disabled', 'disabled');
}
scope.url = data.url; scope.url = data.url;
var related = data.related; var related = data.related;
for (var set in form.related) { for (var set in form.related) {

View File

@@ -13,6 +13,7 @@ angular.module('JobTemplateFormDefinition', [])
addTitle: 'Create Job Templates', //Legend in add mode addTitle: 'Create Job Templates', //Legend in add mode
editTitle: '{{ name }}', //Legend in edit mode editTitle: '{{ name }}', //Legend in edit mode
name: 'job_templates', name: 'job_templates',
twoColumns: true,
well: true, well: true,
fields: { fields: {
@@ -20,13 +21,15 @@ angular.module('JobTemplateFormDefinition', [])
label: 'Name', label: 'Name',
type: 'text', type: 'text',
addRequired: true, addRequired: true,
editRequired: true editRequired: true,
column: 1
}, },
description: { description: {
label: 'Description', label: 'Description',
type: 'text', type: 'text',
addRequired: false, addRequired: false,
editRequired: false editRequired: false,
column: 1
}, },
job_type: { job_type: {
label: 'Job Type', label: 'Job Type',
@@ -34,7 +37,8 @@ angular.module('JobTemplateFormDefinition', [])
ngOptions: 'type.label for type in job_type_options', ngOptions: 'type.label for type in job_type_options',
default: 'run', default: 'run',
addRequired: true, addRequired: true,
editRequired: true editRequired: true,
column: 1
}, },
inventory: { inventory: {
label: 'Inventory', label: 'Inventory',
@@ -43,7 +47,8 @@ angular.module('JobTemplateFormDefinition', [])
sourceField: 'name', sourceField: 'name',
addRequired: true, addRequired: true,
editRequired: true, editRequired: true,
ngClick: 'lookUpInventory()' ngClick: 'lookUpInventory()',
column: 1
}, },
project: { project: {
label: 'Project', label: 'Project',
@@ -53,6 +58,7 @@ angular.module('JobTemplateFormDefinition', [])
addRequired: true, addRequired: true,
editRequired: true, editRequired: true,
ngClick: 'lookUpProject()', ngClick: 'lookUpProject()',
column: 1
}, },
playbook: { playbook: {
label: 'Playbook', label: 'Playbook',
@@ -60,7 +66,8 @@ angular.module('JobTemplateFormDefinition', [])
ngOptions: 'book for book in playbook_options', ngOptions: 'book for book in playbook_options',
id: 'playbook-select', id: 'playbook-select',
addRequired: true, addRequired: true,
editRequired: true editRequired: true,
column: 1
}, },
credential: { credential: {
label: 'Credential', label: 'Credential',
@@ -69,7 +76,8 @@ angular.module('JobTemplateFormDefinition', [])
sourceField: 'name', sourceField: 'name',
ngClick: 'lookUpCredential()', ngClick: 'lookUpCredential()',
addRequired: false, addRequired: false,
editRequired: false editRequired: false,
column: 1
}, },
forks: { forks: {
label: 'Forks', label: 'Forks',
@@ -79,13 +87,15 @@ angular.module('JobTemplateFormDefinition', [])
max: 100, max: 100,
default: 0, default: 0,
addRequired: false, addRequired: false,
editRequired: false editRequired: false,
column: 2
}, },
limit: { limit: {
label: 'Limit', label: 'Limit',
type: 'text', type: 'text',
addRequired: false, addRequired: false,
editRequired: false editRequired: false,
column: 2
}, },
verbosity: { verbosity: {
label: 'Verbosity', label: 'Verbosity',
@@ -95,15 +105,17 @@ angular.module('JobTemplateFormDefinition', [])
min: 0, min: 0,
max: 3, max: 3,
addRequired: false, addRequired: false,
editRequired: false editRequired: false,
column: 2
}, },
extra_vars: { extra_vars: {
label: 'Extra Variables', label: 'Extra Variables',
type: 'textarea', type: 'textarea',
rows: 6, rows: 6,
class: 'span4', class: 'span12',
addRequired: false, addRequired: false,
editRequired: false editRequired: false,
column: 2
} }
}, },

View File

@@ -15,7 +15,6 @@ angular.module('JobFormDefinition', [])
name: 'jobs', name: 'jobs',
well: true, well: true,
twoColumns: true, twoColumns: true,
allowReadonly: true,
fields: { fields: {
name: { name: {
@@ -113,7 +112,7 @@ angular.module('JobFormDefinition', [])
label: 'Extra Variables', label: 'Extra Variables',
type: 'textarea', type: 'textarea',
rows: 6, rows: 6,
class: 'span5', class: 'span12',
addRequired: false, addRequired: false,
editRequired: false, editRequired: false,
column: 2 column: 2

View File

@@ -93,6 +93,7 @@ angular.module('OrganizationFormDefinition', [])
title: 'Administrators', title: 'Administrators',
iterator: 'admin', // Singular form of name (e.g. thing) iterator: 'admin', // Singular form of name (e.g. thing)
open: false, // Open accordion on load? open: false, // Open accordion on load?
base: '/users',
actions: { // Actions displayed top right of list actions: { // Actions displayed top right of list
add: { add: {
ngClick: "add('admins')", ngClick: "add('admins')",

View File

@@ -89,6 +89,7 @@ angular.module('UserFormDefinition', [])
title: 'Admin of Organizations', title: 'Admin of Organizations',
iterator: 'adminof', // Singular form of name (e.g. thing) iterator: 'adminof', // Singular form of name (e.g. thing)
open: false, // Open accordion on load? open: false, // Open accordion on load?
base: '/organizations',
fields: { fields: {
name: { name: {

View File

@@ -34,6 +34,8 @@ angular.module('RelatedSearchHelper', ['RestServices', 'Utilities','RefreshRelat
} }
scope[form.related[set].iterator + 'SearchType'] = 'contains'; scope[form.related[set].iterator + 'SearchType'] = 'contains';
scope[form.related[set].iterator + 'SearchTypeLabel'] = 'Contains'; scope[form.related[set].iterator + 'SearchTypeLabel'] = 'Contains';
scope[form.related[set].iterator + 'SelectShow'] = false;
scope[form.related[set].iterator + 'HideSearchType'] = false;
} }
// Functions to handle search widget changes // Functions to handle search widget changes

View File

@@ -365,7 +365,7 @@ angular.module('FormGenerator', ['GeneratorHelpers'])
html += "<label class=\"control-label\" for=\"" + fld + '">' + field.label + '</label>' + "\n"; html += "<label class=\"control-label\" for=\"" + fld + '">' + field.label + '</label>' + "\n";
html += "<div class=\"controls\">\n"; html += "<div class=\"controls\">\n";
html += "<div class=\"input-prepend\">\n"; html += "<div class=\"input-prepend\">\n";
html += "<button class=\"btn\" " + this.attr(field,'ngClick') + "><i class=\"icon-search\"></i></button>\n"; html += "<button class=\"lookup-btn btn\" " + this.attr(field,'ngClick') + "><i class=\"icon-search\"></i></button>\n";
html += "<input class=\"input-medium\" type=\"text\" "; html += "<input class=\"input-medium\" type=\"text\" ";
html += "ng-model=\"" + field.sourceModel + '_' + field.sourceField + "\" "; html += "ng-model=\"" + field.sourceModel + '_' + field.sourceField + "\" ";
html += "name=\"" + field.sourceModel + '_' + field.sourceField + "\" "; html += "name=\"" + field.sourceModel + '_' + field.sourceField + "\" ";
@@ -470,6 +470,7 @@ angular.module('FormGenerator', ['GeneratorHelpers'])
//buttons //buttons
if (!this.modal) { if (!this.modal) {
if (this.has('buttons')) { if (this.has('buttons')) {
html += (this.form.twoColumns) ? "<hr />" : "";
html += "<div class=\"control-group\">\n"; html += "<div class=\"control-group\">\n";
html += "<div class=\"controls buttons\">\n"; html += "<div class=\"controls buttons\">\n";
} }
@@ -477,7 +478,8 @@ angular.module('FormGenerator', ['GeneratorHelpers'])
var button = this.form.buttons[btn]; var button = this.form.buttons[btn];
//button //button
html += "<button "; html += "<button ";
html += "class=\"btn btn-small"; html += "class=\"btn";
html += (this.form.twoColumns) ? "" : " btn-small";
html += (button.class) ? " " + button.class : ""; html += (button.class) ? " " + button.class : "";
html += "\" "; html += "\" ";
if (button.ngClick) { if (button.ngClick) {
@@ -641,9 +643,29 @@ angular.module('FormGenerator', ['GeneratorHelpers'])
html += "<td>{{ $index + (" + form.related[itm].iterator + "Page * " + html += "<td>{{ $index + (" + form.related[itm].iterator + "Page * " +
form.related[itm].iterator + "PageSize) + 1 }}.</td>\n"; form.related[itm].iterator + "PageSize) + 1 }}.</td>\n";
var cnt = 1; var cnt = 1;
var rfield;
var base = (form.related[itm].base) ? form.related[itm].base : itm;
base = base.replace(/^\//,'');
for (var fld in form.related[itm].fields) { for (var fld in form.related[itm].fields) {
cnt++; cnt++;
html += "<td>{{ " + form.related[itm].iterator + "." + fld + " }}</td>\n"; rfield = form.related[itm].fields[fld];
html += "<td>";
if ((rfield.key || rfield.link || rfield.linkTo || rfield.ngClick )) {
if (rfield.linkTo) {
html += "<a href=\"#" + rfield.linkTo + "\">";
}
else if (rfield.ngClick) {
html += "<a href=\"\"" + this.attr(rfield, 'ngClick') + "\">";
}
else {
html += "<a href=\"#/" + base + "/{{" + form.related[itm].iterator + ".id }}\">";
}
}
html += "{{ " + form.related[itm].iterator + "." + fld + " }}";
if ((rfield.key || rfield.link || rfield.linkTo || rfield.ngClick )) {
html += "</a>";
}
html += "</td>\n";
} }
// Row level actions // Row level actions