Ran all controller files through jsbeautifier.org and applied jsHint.

This commit is contained in:
Chris Houseknecht
2014-02-07 15:33:07 -05:00
parent 8c88ee5663
commit f891c30ebb
14 changed files with 4659 additions and 4056 deletions

View File

@@ -10,26 +10,42 @@
'use strict'; 'use strict';
function AdminsList ($scope, $rootScope, $location, $log, $routeParams, Rest, function AdminsList($scope, $rootScope, $location, $log, $routeParams, Rest,
Alert, AdminList, GenerateList, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit, Alert, AdminList, GenerateList, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit,
ReturnToCaller,GetBasePath, SelectionInit) ReturnToCaller, GetBasePath, SelectionInit) {
{
var list = AdminList;
var defaultUrl = GetBasePath('organizations') + $routeParams.organization_id + '/users/' ;
var view = GenerateList;
var mode = 'select';
var scope = view.inject(AdminList, { mode: mode }); // Inject our view
var url = GetBasePath('organizations') + $routeParams.organization_id + '/admins/'; var list = AdminList,
SelectionInit({ scope: scope, list: list, url: url, returnToCaller: 1 }); defaultUrl = GetBasePath('organizations') + $routeParams.organization_id + '/users/',
view = GenerateList,
mode = 'select',
scope = view.inject(AdminList, { mode: mode }),
url = GetBasePath('organizations') + $routeParams.organization_id + '/admins/';
SelectionInit({
scope: scope,
list: list,
url: url,
returnToCaller: 1
});
SearchInit({
scope: scope,
set: 'admins',
list: list,
url: defaultUrl
});
PaginateInit({
scope: scope,
list: list,
url: defaultUrl
});
SearchInit({ scope: scope, set: 'admins', list: list, url: defaultUrl });
PaginateInit({ scope: scope, list: list, url: defaultUrl });
scope.search(list.iterator); scope.search(list.iterator);
LoadBreadCrumbs(); LoadBreadCrumbs();
} }
AdminsList.$inject = [ '$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'AdminList', 'GenerateList', AdminsList.$inject = ['$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'AdminList', 'GenerateList',
'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'GetBasePath', 'SelectionInit']; 'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'GetBasePath', 'SelectionInit'
];

View File

@@ -8,20 +8,24 @@
* *
*/ */
/* globals console:false */
'use strict'; 'use strict';
function Authenticate($cookieStore, $window, $scope, $rootScope, $location, Authorization, ToggleClass, Alert, Wait, function Authenticate($cookieStore, $window, $scope, $rootScope, $location, Authorization, ToggleClass, Alert, Wait,
Timer, Empty) Timer, Empty) {
{
var setLoginFocus = function() { var setLoginFocus, lastPath, sessionExpired, scope;
setLoginFocus = function () {
$('#login-username').focus(); $('#login-username').focus();
}; };
var sessionExpired = (Empty($rootScope.sessionExpired)) ? $cookieStore.get('sessionExpired') : $rootScope.sessionExpired; sessionExpired = (Empty($rootScope.sessionExpired)) ? $cookieStore.get('sessionExpired') : $rootScope.sessionExpired;
var lastPath = function() { lastPath = function () {
return (Empty($rootScope.lastPath)) ? $cookieStore.get('lastPath') : $rootScope.lastPath; return (Empty($rootScope.lastPath)) ? $cookieStore.get('lastPath') : $rootScope.lastPath;
} };
if ($AnsibleConfig.debug_mode && console) { if ($AnsibleConfig.debug_mode && console) {
console.log('User session expired: ' + sessionExpired); console.log('User session expired: ' + sessionExpired);
@@ -29,7 +33,7 @@ function Authenticate($cookieStore, $window, $scope, $rootScope, $location, Auth
} }
// Hide any lingering modal dialogs // Hide any lingering modal dialogs
$('.modal[aria-hidden=false]').each( function() { $('.modal[aria-hidden=false]').each(function () {
if ($(this).attr('id') !== 'login-modal') { if ($(this).attr('id') !== 'login-modal') {
$(this).modal('hide'); $(this).modal('hide');
} }
@@ -39,22 +43,26 @@ function Authenticate($cookieStore, $window, $scope, $rootScope, $location, Auth
Wait('stop'); Wait('stop');
// Display the login dialog // Display the login dialog
$('#login-modal').modal({ show: true, keyboard: false, backdrop: 'static' }); $('#login-modal').modal({
show: true,
keyboard: false,
backdrop: 'static'
});
// Set focus to username field // Set focus to username field
$('#login-modal').on('shown.bs.modal', function() { $('#login-modal').on('shown.bs.modal', function () {
setLoginFocus(); setLoginFocus();
}); });
var scope = angular.element(document.getElementById('login-modal')).scope(); scope = angular.element(document.getElementById('login-modal')).scope();
// Reset the login form // Reset the login form
scope['login_username'] = null; scope.login_username = null;
scope['login_password'] = null; scope.login_password = null;
scope['loginForm']['login_username'].$setPristine(); scope.loginForm.login_username.$setPristine();
scope['loginForm']['login_password'].$setPristine(); scope.loginForm.login_password.$setPristine();
if ($location.path() == '/logout') { if ($location.path() === '/logout') {
//if logout request, clear AuthToken and user session data //if logout request, clear AuthToken and user session data
Authorization.logout(); Authorization.logout();
} }
@@ -62,74 +70,71 @@ function Authenticate($cookieStore, $window, $scope, $rootScope, $location, Auth
$rootScope.userLoggedIn = false; //hide the logout link. if you got here, you're logged out. $rootScope.userLoggedIn = false; //hide the logout link. if you got here, you're logged out.
$cookieStore.put('userLoggedIn', false); //gets set back to true by Authorization.setToken(). $cookieStore.put('userLoggedIn', false); //gets set back to true by Authorization.setToken().
$('#login-password').bind('keypress', function(e) { $('#login-password').bind('keypress', function (e) {
var code = (e.keyCode ? e.keyCode : e.which); var code = (e.keyCode ? e.keyCode : e.which);
if (code == 13) { if (code === 13) {
$('#login-button').click(); $('#login-button').click();
} }
}); });
scope.reset = function() { scope.reset = function () {
$('#login-form input').each( function(index) { $(this).val(''); }); $('#login-form input').each(function () {
$(this).val('');
});
}; };
// Call the API to get an auth token // Call the API to get an auth token
scope.systemLogin = function(username, password) { scope.systemLogin = function (username, password) {
$('.api-error').empty(); $('.api-error').empty();
var token; var token;
if (username == null || username == undefined || username == '' || if (Empty(username) || Empty(password)) {
password == null || password == undefined || password == '' ) {
Alert('Error!', 'Please provide a username and password before attempting to login.', 'alert-danger', setLoginFocus); Alert('Error!', 'Please provide a username and password before attempting to login.', 'alert-danger', setLoginFocus);
} } else {
else {
Wait('start'); Wait('start');
Authorization.retrieveToken(username, password) Authorization.retrieveToken(username, password)
.success( function(data, status, headers, config) { .success(function (data, status) {
$('#login-modal').modal('hide'); $('#login-modal').modal('hide');
token = data.token; token = data.token;
Authorization.setToken(data.token, data.expires); Authorization.setToken(data.token, data.expires);
$rootScope.sessionTimer = Timer.init(); $rootScope.sessionTimer = Timer.init();
// Get all the profile/access info regarding the logged in user // Get all the profile/access info regarding the logged in user
Authorization.getUser() Authorization.getUser()
.success(function(data, status, headers, config) { .success(function (data) {
Authorization.setUserInfo(data); Authorization.setUserInfo(data);
$rootScope['user_is_superuser'] = data.results[0].is_superuser; $rootScope.user_is_superuser = data.results[0].is_superuser;
Authorization.getLicense() Authorization.getLicense()
.success(function(data, status, headers, config) { .success(function (data) {
Authorization.setLicense(data['license_info']); Authorization.setLicense(data.license_info);
if (lastPath()) { if (lastPath()) {
// Go back to most recent navigation path // Go back to most recent navigation path
$location.path(lastPath()); $location.path(lastPath());
} } else {
else {
$location.url('/home?login=true'); $location.url('/home?login=true');
} }
}) })
.error(function(data, status, headers, config) { .error(function () {
Wait('stop'); Wait('stop');
Alert('Error', 'Failed to access user information. GET returned status: ' + status, 'alert-danger', setLoginFocus); Alert('Error', 'Failed to access user information. GET returned status: ' + status, 'alert-danger', setLoginFocus);
}); });
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
Wait('stop'); Wait('stop');
Alert('Error', 'Failed to access license information. GET returned status: ' + status, 'alert-danger', setLoginFocus); Alert('Error', 'Failed to access license information. GET returned status: ' + status, 'alert-danger', setLoginFocus);
}); });
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
var hdr, msg, key;
Wait('stop'); Wait('stop');
if ( data.non_field_errors && data.non_field_errors.length == 0 ) { if (data.non_field_errors && data.non_field_errors.length === 0) {
// show field specific errors returned by the API // show field specific errors returned by the API
for (var key in data) { for (key in data) {
scope[key + 'Error'] = data[key][0]; scope[key + 'Error'] = data[key][0];
} }
} } else {
else { if (data.non_field_errors && data.non_field_errors.length > 0) {
var hdr, msg;
if ( data.non_field_errors && data.non_field_errors.length > 0 ) {
hdr = 'Error'; hdr = 'Error';
msg = data.non_field_errors[0]; msg = data.non_field_errors[0];
} } else {
else {
hdr = 'Error'; hdr = 'Error';
msg = 'The login attempt failed with a status of: ' + status; msg = 'The login attempt failed with a status of: ' + status;
} }
@@ -138,9 +143,10 @@ function Authenticate($cookieStore, $window, $scope, $rootScope, $location, Auth
} }
}); });
} }
} };
} }
Authenticate.$inject = ['$cookieStore', '$window', '$scope', '$rootScope', '$location', 'Authorization', 'ToggleClass', 'Alert', 'Wait', Authenticate.$inject = ['$cookieStore', '$window', '$scope', '$rootScope', '$location', 'Authorization', 'ToggleClass', 'Alert', 'Wait',
'Timer', 'Empty']; 'Timer', 'Empty'
];

View File

@@ -7,54 +7,53 @@
* Controller functions for the Credential model. * Controller functions for the Credential model.
* *
*/ */
'use strict'; 'use strict';
function CredentialsList ($scope, $rootScope, $location, $log, $routeParams, Rest, Alert, CredentialList, function CredentialsList($scope, $rootScope, $location, $log, $routeParams, Rest, Alert, CredentialList,
GenerateList, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit, ReturnToCaller, GenerateList, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit, ReturnToCaller,
ClearScope, ProcessErrors, GetBasePath, SelectionInit, GetChoices, Wait, Stream) ClearScope, ProcessErrors, GetBasePath, SelectionInit, GetChoices, Wait, Stream) {
{
ClearScope('htmlTemplate'); //Garbage collection. Don't leave behind any listeners/watchers from the prior ClearScope('htmlTemplate');
//scope.
Wait('start'); Wait('start');
var list = CredentialList; var list = CredentialList,
var defaultUrl = GetBasePath('credentials'); defaultUrl = GetBasePath('credentials'),
var view = GenerateList; view = GenerateList,
var base = $location.path().replace(/^\//,'').split('/')[0]; base = $location.path().replace(/^\//, '').split('/')[0],
var mode = (base == 'credentials') ? 'edit' : 'select'; // if base path 'credentials', we're here to add/edit mode = (base === 'credentials') ? 'edit' : 'select', // if base path 'credentials', we're here to add/edit
var scope = view.inject(list, { mode: mode }); // Inject our view scope = view.inject(list, { mode: mode }),
url;
scope.selected = []; scope.selected = [];
scope.credentialLoading = true; scope.credentialLoading = true;
var url = GetBasePath(base); url = GetBasePath(base) + ( (base === 'users') ? $routeParams.user_id + '/credentials/' : $routeParams.team_id + '/credentials/' );
url += (base == 'users') ? $routeParams.user_id + '/credentials/' : $routeParams.team_id + '/credentials/';
SelectionInit({ scope: scope, list: list, url: url, returnToCaller: 1 }); SelectionInit({
scope: scope,
list: list,
url: url,
returnToCaller: 1
});
if (scope.removePostRefresh) { if (scope.removePostRefresh) {
scope.removePostRefresh(); scope.removePostRefresh();
} }
scope.removePostRefresh = scope.$on('PostRefresh', function() { scope.removePostRefresh = scope.$on('PostRefresh', function () {
// Cleanup after a delete // Cleanup after a delete
var i, j;
Wait('stop'); Wait('stop');
$('#prompt-modal').off(); $('#prompt-modal').off();
list.fields.kind.searchOptions = scope.credential_kind_options; list.fields.kind.searchOptions = scope.credential_kind_options;
// Translate the kind value // Translate the kind value
for(var i=0; i < scope.credentials.length; i++) { for (i = 0; i < scope.credentials.length; i++) {
/* for (j = 0; j < scope.credential_kind_options.length; j++) {
if (scope.credentials[i].summary_fields.user) { if (scope.credential_kind_options[j].value === scope.credentials[i].kind) {
scope.credentials[i].user_username = scope.credentials[i].summary_fields.user.username; scope.credentials[i].kind = scope.credential_kind_options[j].label;
}
if (scope.credentials[i].summary_fields.team) {
scope.credentials[i].team_name = scope.credentials[i].summary_fields.team.name;
}
*/
for (var j=0; j < scope.credential_kind_options.length; j++) {
if (scope.credential_kind_options[j].value == scope.credentials[i].kind) {
scope.credentials[i].kind = scope.credential_kind_options[j].label
break; break;
} }
} }
@@ -64,9 +63,18 @@ function CredentialsList ($scope, $rootScope, $location, $log, $routeParams, Res
if (scope.removeChoicesReady) { if (scope.removeChoicesReady) {
scope.removeChoicesReady(); scope.removeChoicesReady();
} }
scope.removeChoicesReady = scope.$on('choicesReadyCredential', function() { scope.removeChoicesReady = scope.$on('choicesReadyCredential', function () {
SearchInit({ scope: scope, set: 'credentials', list: list, url: defaultUrl }); SearchInit({
PaginateInit({ scope: scope, list: list, url: defaultUrl }); scope: scope,
set: 'credentials',
list: list,
url: defaultUrl
});
PaginateInit({
scope: scope,
list: list,
url: defaultUrl
});
scope.search(list.iterator); scope.search(list.iterator);
}); });
@@ -82,62 +90,72 @@ function CredentialsList ($scope, $rootScope, $location, $log, $routeParams, Res
LoadBreadCrumbs(); LoadBreadCrumbs();
scope.showActivity = function() { Stream({ scope: scope }); } scope.showActivity = function () {
Stream({
scope: scope
});
};
scope.addCredential = function() { scope.addCredential = function () {
$location.path($location.path() + '/add'); $location.path($location.path() + '/add');
} };
scope.editCredential = function(id) { scope.editCredential = function (id) {
$location.path($location.path() + '/' + id); $location.path($location.path() + '/' + id);
} };
scope.deleteCredential = function(id, name) { scope.deleteCredential = function (id, name) {
var action = function() { var action = function () {
$('#prompt-modal').on('hidden.bs.modal', function(){ Wait('start'); }); $('#prompt-modal').on('hidden.bs.modal', function () {
Wait('start');
});
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
var url = defaultUrl + id + '/'; var url = defaultUrl + id + '/';
Rest.setUrl(url); Rest.setUrl(url);
Rest.destroy() Rest.destroy()
.success( function(data, status, headers, config) { .success(function (data, status, headers, config) {
scope.search(list.iterator); scope.search(list.iterator);
}) })
.error( function(data, status, headers, config) { .error(function (data, status, headers, config) {
Wait('stop'); Wait('stop');
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, {
{ hdr: 'Error!', msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status }); hdr: 'Error!',
msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status
});
}); });
}; };
Prompt({ hdr: 'Delete', Prompt({
hdr: 'Delete',
body: 'Are you sure you want to delete ' + name + '?', body: 'Are you sure you want to delete ' + name + '?',
action: action action: action
}); });
} };
} }
CredentialsList.$inject = [ '$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'CredentialList', 'GenerateList', CredentialsList.$inject = ['$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'CredentialList', 'GenerateList',
'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'ClearScope', 'ProcessErrors', 'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'ClearScope', 'ProcessErrors',
'GetBasePath', 'SelectionInit', 'GetChoices', 'Wait', 'Stream' ]; 'GetBasePath', 'SelectionInit', 'GetChoices', 'Wait', 'Stream'
];
function CredentialsAdd ($scope, $rootScope, $compile, $location, $log, $routeParams, CredentialForm, function CredentialsAdd($scope, $rootScope, $compile, $location, $log, $routeParams, CredentialForm,
GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ReturnToCaller, ClearScope, GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ReturnToCaller, ClearScope,
GenerateList, SearchInit, PaginateInit, LookUpInit, UserList, TeamList, GetBasePath, GenerateList, SearchInit, PaginateInit, LookUpInit, UserList, TeamList, GetBasePath,
GetChoices, Empty, KindChange, OwnerChange, FormSave, DebugForm) GetChoices, Empty, KindChange, OwnerChange, FormSave, DebugForm) {
{
ClearScope('tree-form'); ClearScope('tree-form');
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.
// Inject dynamic view // Inject dynamic view
var defaultUrl = GetBasePath('credentials'); var form = CredentialForm,
var form = CredentialForm; generator = GenerateForm,
var generator = GenerateForm; scope = generator.inject(form, { mode: 'add', related: false }),
var scope = generator.inject(form, {mode: 'add', related: false}); base = $location.path().replace(/^\//, '').split('/')[0],
var base = $location.path().replace(/^\//,'').split('/')[0]; defaultUrl = GetBasePath('credentials'),
var defaultUrl = GetBasePath('credentials'); url;
generator.reset(); generator.reset();
LoadBreadCrumbs(); LoadBreadCrumbs();
@@ -167,131 +185,142 @@ function CredentialsAdd ($scope, $rootScope, $compile, $location, $log, $routePa
if (!Empty($routeParams.user_id)) { if (!Empty($routeParams.user_id)) {
// Get the username based on incoming route // Get the username based on incoming route
scope['owner'] = 'user'; scope.owner = 'user';
scope['user'] = $routeParams.user_id; scope.user = $routeParams.user_id;
OwnerChange({ scope: scope }); OwnerChange({
var url = GetBasePath('users') + $routeParams.user_id + '/'; scope: scope
});
url = GetBasePath('users') + $routeParams.user_id + '/';
Rest.setUrl(url); Rest.setUrl(url);
Rest.get() Rest.get()
.success( function(data, status, headers, config) { .success(function (data, status, headers, config) {
scope['user_username'] = data.username; scope.user_username = data.username;
}) })
.error( function(data, status, headers, config) { .error(function (data, status, headers, config) {
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, { hdr: 'Error!', msg: 'Failed to retrieve user. GET status: ' + status
{ hdr: 'Error!', msg: 'Failed to retrieve user. GET status: ' + status });
}); });
} });
else if (!Empty($routeParams.team_id)) { } else if (!Empty($routeParams.team_id)) {
// Get the username based on incoming route // Get the username based on incoming route
scope['owner'] = 'team'; scope.owner = 'team';
scope['team'] = $routeParams.team_id; scope.team = $routeParams.team_id;
OwnerChange({ scope: scope }); OwnerChange({
var url = GetBasePath('teams') + $routeParams.team_id + '/'; scope: scope
});
url = GetBasePath('teams') + $routeParams.team_id + '/';
Rest.setUrl(url); Rest.setUrl(url);
Rest.get() Rest.get()
.success( function(data, status, headers, config) { .success(function (data, status, headers, config) {
scope['team_name'] = data.name; scope.team_name = data.name;
}) })
.error( function(data, status, headers, config) { .error(function (data, status, headers, config) {
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, { hdr: 'Error!', msg: 'Failed to retrieve team. GET status: ' + status
{ hdr: 'Error!', msg: 'Failed to retrieve team. GET status: ' + status });
}); });
} });
else { } else {
// default type of owner to a user // default type of owner to a user
scope['owner'] = 'user'; scope.owner = 'user';
OwnerChange({ scope: scope }); OwnerChange({
scope: scope
});
} }
// Handle Kind change // Handle Kind change
scope.kindChange = function () { scope.kindChange = function () {
KindChange({ scope: scope, form: form, reset: true }); KindChange({
} scope: scope,
form: form,
reset: true
});
};
// Save // Save
scope.formSave = function() { generator.clearApiErrors(); FormSave({ scope: scope, mode: 'add' }) }; scope.formSave = function () {
generator.clearApiErrors();
FormSave({
scope: scope,
mode: 'add'
});
};
// Handle Owner change // Handle Owner change
scope.ownerChange = function() { scope.ownerChange = function () {
OwnerChange({ scope: scope }); OwnerChange({
} scope: scope
});
};
// Reset defaults // Reset defaults
scope.formReset = function() { scope.formReset = function () {
generator.reset(); generator.reset();
//DebugForm({ form: CredentialForm, scope: scope }); //DebugForm({ form: CredentialForm, scope: scope });
}; };
// Password change // Password change
scope.clearPWConfirm = function(fld) { scope.clearPWConfirm = function (fld) {
// If password value changes, make sure password_confirm must be re-entered // If password value changes, make sure password_confirm must be re-entered
scope[fld] = ''; scope[fld] = '';
scope[form.name + '_form'][fld].$setValidity('awpassmatch', false); scope[form.name + '_form'][fld].$setValidity('awpassmatch', false);
} };
// Respond to 'Ask at runtime?' checkbox // Respond to 'Ask at runtime?' checkbox
scope.ask = function(fld, associated) { scope.ask = function (fld, associated) {
if (scope[fld + '_ask']) { if (scope[fld + '_ask']) {
scope[fld] = 'ASK'; scope[fld] = 'ASK';
scope[associated] = ''; scope[associated] = '';
scope[form.name + '_form'][associated].$setValidity('awpassmatch', true); scope[form.name + '_form'][associated].$setValidity('awpassmatch', true);
} } else {
else {
scope[fld] = ''; scope[fld] = '';
scope[associated] = ''; scope[associated] = '';
scope[form.name + '_form'][associated].$setValidity('awpassmatch', true); scope[form.name + '_form'][associated].$setValidity('awpassmatch', true);
} }
} };
// Click clear button // Click clear button
scope.clear = function(fld, associated) { scope.clear = function (fld, associated) {
scope[fld] = ''; scope[fld] = '';
scope[associated] = ''; scope[associated] = '';
scope[form.name + '_form'][associated].$setValidity('awpassmatch', true); scope[form.name + '_form'][associated].$setValidity('awpassmatch', true);
scope[form.name + '_form'].$setDirty(); scope[form.name + '_form'].$setDirty();
} };
} }
CredentialsAdd.$inject = [ '$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'CredentialForm', 'GenerateForm', CredentialsAdd.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'CredentialForm', 'GenerateForm',
'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ReturnToCaller', 'ClearScope', 'GenerateList', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ReturnToCaller', 'ClearScope', 'GenerateList',
'SearchInit', 'PaginateInit', 'LookUpInit', 'UserList', 'TeamList', 'GetBasePath', 'GetChoices', 'Empty', 'SearchInit', 'PaginateInit', 'LookUpInit', 'UserList', 'TeamList', 'GetBasePath', 'GetChoices', 'Empty',
'KindChange', 'OwnerChange', 'FormSave', 'DebugForm']; 'KindChange', 'OwnerChange', 'FormSave', 'DebugForm'
];
function CredentialsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams, CredentialForm, function CredentialsEdit($scope, $rootScope, $compile, $location, $log, $routeParams, CredentialForm,
GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, RelatedSearchInit, GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, RelatedSearchInit,
RelatedPaginateInit, ReturnToCaller, ClearScope, Prompt, GetBasePath, GetChoices, RelatedPaginateInit, ReturnToCaller, ClearScope, Prompt, GetBasePath, GetChoices,
KindChange, UserList, TeamList, LookUpInit, Empty, OwnerChange, FormSave, Stream, KindChange, UserList, TeamList, LookUpInit, Empty, OwnerChange, FormSave, Stream,
Wait Wait
) ) {
{
ClearScope('tree-form'); ClearScope('htmlTemplate');
ClearScope('htmlTemplate'); //Garbage collection. Don't leave behind any listeners/watchers from the prior
//scope. var defaultUrl = GetBasePath('credentials'),
generator = GenerateForm,
form = CredentialForm,
scope = generator.inject(form, { mode: 'edit', related: true }),
base = $location.path().replace(/^\//, '').split('/')[0],
master = {},
id = $routeParams.credential_id;
var defaultUrl=GetBasePath('credentials');
var generator = GenerateForm;
var form = CredentialForm;
var scope = generator.inject(form, {mode: 'edit', related: true});
generator.reset(); generator.reset();
var base = $location.path().replace(/^\//,'').split('/')[0]; scope.id = id;
var defaultUrl = GetBasePath('credentials');
var master = {};
var id = $routeParams.credential_id;
scope['id'] = id;
var relatedSets = {};
function setAskCheckboxes() { function setAskCheckboxes() {
for (var fld in form.fields) { var fld, i;
if (form.fields[fld].type == 'password' && scope[fld] == 'ASK') { for (fld in form.fields) {
if (form.fields[fld].type === 'password' && scope[fld] === 'ASK') {
// turn on 'ask' checkbox for password fields with value of 'ASK' // turn on 'ask' checkbox for password fields with value of 'ASK'
$("#" + fld + "-clear-btn").attr("disabled","disabled"); $("#" + fld + "-clear-btn").attr("disabled", "disabled");
scope[fld + '_ask'] = true; scope[fld + '_ask'] = true;
} } else {
else {
scope[fld + '_ask'] = false; scope[fld + '_ask'] = false;
$("#" + fld + "-clear-btn").removeAttr("disabled"); $("#" + fld + "-clear-btn").removeAttr("disabled");
} }
@@ -299,9 +328,9 @@ function CredentialsEdit ($scope, $rootScope, $compile, $location, $log, $routeP
} }
// Set kind field to the correct option // Set kind field to the correct option
for (var i=0; i < scope['credential_kind_options'].length; i++) { for (i = 0; i < scope.credential_kind_options.length; i++) {
if (scope['kind'] == scope['credential_kind_options'][i].value) { if (scope.kind === scope.credential_kind_options[i].value) {
scope['kind'] = scope['credential_kind_options'][i]; scope.kind = scope.credential_kind_options[i];
break; break;
} }
} }
@@ -310,11 +339,11 @@ function CredentialsEdit ($scope, $rootScope, $compile, $location, $log, $routeP
if (scope.removeCredentialLoaded) { if (scope.removeCredentialLoaded) {
scope.removeCredentialLoaded(); scope.removeCredentialLoaded();
} }
scope.removeCredentialLoaded = scope.$on('credentialLoaded', function() { scope.removeCredentialLoaded = scope.$on('credentialLoaded', function () {
LookUpInit({ LookUpInit({
scope: scope, scope: scope,
form: form, form: form,
current_item: (!Empty($scope['user_id'])) ? scope['user_id'] : null, current_item: (!Empty($scope.user_id)) ? scope.user_id : null,
list: UserList, list: UserList,
field: 'user' field: 'user'
}); });
@@ -322,32 +351,49 @@ function CredentialsEdit ($scope, $rootScope, $compile, $location, $log, $routeP
LookUpInit({ LookUpInit({
scope: scope, scope: scope,
form: form, form: form,
current_item: (!Empty($scope['team_id'])) ? scope['team_id'] : null, current_item: (!Empty($scope.team_id)) ? scope.team_id : null,
list: TeamList, list: TeamList,
field: 'team' field: 'team'
}); });
setAskCheckboxes(); setAskCheckboxes();
KindChange({ scope: scope, form: form, reset: false }); KindChange({
OwnerChange({ scope: scope }); scope: scope,
form: form,
reset: false
});
OwnerChange({
scope: scope
});
Wait('stop'); Wait('stop');
}); });
if (scope.removeChoicesReady) { if (scope.removeChoicesReady) {
scope.removeChoicesReady(); scope.removeChoicesReady();
} }
scope.removeChoicesReady = scope.$on('choicesReadyCredential', function() { scope.removeChoicesReady = scope.$on('choicesReadyCredential', function () {
// Retrieve detail record and prepopulate the form // Retrieve detail record and prepopulate the form
Rest.setUrl(defaultUrl + ':id/'); Rest.setUrl(defaultUrl + ':id/');
Rest.get({ params: {id: id} }) Rest.get({
.success( function(data, status, headers, config) { params: {
LoadBreadCrumbs({ path: '/credentials/' + id, title: data.name }); id: id
for (var fld in form.fields) { }
})
.success(function (data) {
var i, fld;
LoadBreadCrumbs({
path: '/credentials/' + id,
title: data.name
});
for (fld in form.fields) {
if (data[fld] !== null && data[fld] !== undefined) { if (data[fld] !== null && data[fld] !== undefined) {
scope[fld] = data[fld]; scope[fld] = data[fld];
master[fld] = scope[fld]; master[fld] = scope[fld];
} }
if (form.fields[fld].type == 'lookup' && data.summary_fields[form.fields[fld].sourceModel]) { if (form.fields[fld].type === 'lookup' && data.summary_fields[form.fields[fld].sourceModel]) {
scope[form.fields[fld].sourceModel + '_' + form.fields[fld].sourceField] = scope[form.fields[fld].sourceModel + '_' + form.fields[fld].sourceField] =
data.summary_fields[form.fields[fld].sourceModel][form.fields[fld].sourceField]; data.summary_fields[form.fields[fld].sourceModel][form.fields[fld].sourceField];
master[form.fields[fld].sourceModel + '_' + form.fields[fld].sourceField] = master[form.fields[fld].sourceModel + '_' + form.fields[fld].sourceField] =
@@ -355,44 +401,45 @@ function CredentialsEdit ($scope, $rootScope, $compile, $location, $log, $routeP
} }
} }
if (!Empty(scope['user'])) { if (!Empty(scope.user)) {
scope['owner'] = 'user'; scope.owner = 'user';
} else {
scope.owner = 'team';
} }
else { master.owner = scope.owner;
scope['owner'] = 'team';
}
master['owner'] = scope['owner'];
for (var i=0; i < scope.credential_kind_options.length; i++) { for (i = 0; i < scope.credential_kind_options.length; i++) {
if (scope.credential_kind_options[i].value == data.kind) { if (scope.credential_kind_options[i].value === data.kind) {
scope.kind = scope.credential_kind_options[i]; scope.kind = scope.credential_kind_options[i];
break; break;
} }
} }
master['kind'] = scope['kind']; master.kind = scope.kind;
switch (data.kind) { switch (data.kind) {
case 'aws': case 'aws':
scope['access_key'] = data.username; scope.access_key = data.username;
scope['secret_key'] = data.password; scope.secret_key = data.password;
master['access_key'] = scope['access_key']; master.access_key = scope.access_key;
master['secret_key'] = scope['secret_key']; master.secret_key = scope.secret_key;
break; break;
case 'ssh': case 'ssh':
scope['ssh_password'] = data.password; scope.ssh_password = data.password;
master['ssh_password'] = scope['ssh_password']; master.ssh_password = scope.ssh_password;
break; break;
case 'rax': case 'rax':
scope['api_key'] = data['password']; scope.api_key = data.password;
master['api_key'] = scope['api_key']; master.api_key = scope.api_key;
break; break;
} }
scope.$emit('credentialLoaded'); scope.$emit('credentialLoaded');
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
ProcessErrors(scope, data, status, form, ProcessErrors(scope, data, status, form, {
{ hdr: 'Error!', msg: 'Failed to retrieve Credential: ' + $routeParams.id + '. GET status: ' + status }); hdr: 'Error!',
msg: 'Failed to retrieve Credential: ' + $routeParams.id + '. GET status: ' + status
});
}); });
}); });
@@ -406,105 +453,131 @@ function CredentialsEdit ($scope, $rootScope, $compile, $location, $log, $routeP
callback: 'choicesReadyCredential' callback: 'choicesReadyCredential'
}); });
scope.showActivity = function() { Stream({ scope: scope }); } scope.showActivity = function () {
Stream({
scope: scope
});
};
// Save changes to the parent // Save changes to the parent
scope.formSave = function() { generator.clearApiErrors(); FormSave({ scope: scope, mode: 'edit' }) }; scope.formSave = function () {
generator.clearApiErrors();
FormSave({
scope: scope,
mode: 'edit'
});
};
// Handle Owner change // Handle Owner change
scope.ownerChange = function() { scope.ownerChange = function () {
OwnerChange({ scope: scope }); OwnerChange({
} scope: scope
});
};
// Handle Kind change // Handle Kind change
scope.kindChange = function () { scope.kindChange = function () {
KindChange({ scope: scope, form: form, reset: true }); KindChange({
} scope: scope,
form: form,
reset: true
});
};
// Cancel // Cancel
scope.formReset = function() { scope.formReset = function () {
generator.reset(); generator.reset();
for (var fld in master) { for (var fld in master) {
scope[fld] = master[fld]; scope[fld] = master[fld];
} }
setAskCheckboxes(); setAskCheckboxes();
KindChange({ scope: scope, form: form, reset: false }); KindChange({
OwnerChange({ scope: scope }); scope: scope,
form: form,
reset: false
});
OwnerChange({
scope: scope
});
}; };
// 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.id + '/' + set + '/add'); $location.path('/' + base + '/' + $routeParams.id + '/' + set + '/add');
}; };
// Related set: Edit button // Related set: Edit button
scope.edit = function(set, id, name) { scope.edit = function (set, id) {
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
$location.path('/' + base + '/' + $routeParams.id + '/' + set + '/' + id); $location.path('/' + base + '/' + $routeParams.id + '/' + set + '/' + id);
}; };
// Related set: Delete button // Related set: Delete button
scope['delete'] = function(set, itm_id, name, title) { scope['delete'] = function (set, itm_id, name, title) {
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
var action = function() { var action = function () {
var url = defaultUrl + id + '/' + set + '/'; var url = defaultUrl + id + '/' + set + '/';
Rest.setUrl(url); Rest.setUrl(url);
Rest.post({ id: itm_id, disassociate: 1 }) Rest.post({
.success( function(data, status, headers, config) { id: itm_id,
disassociate: 1
})
.success(function () {
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
scope.search(form.related[set].iterator); scope.search(form.related[set].iterator);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, {
{ hdr: 'Error!', msg: 'Call to ' + url + ' failed. POST returned status: ' + status }); hdr: 'Error!',
msg: 'Call to ' + url + ' failed. POST returned status: ' + status
});
}); });
}; };
Prompt({ hdr: 'Delete', Prompt({
hdr: 'Delete',
body: 'Are you sure you want to remove ' + name + ' from ' + scope.name + ' ' + title + '?', body: 'Are you sure you want to remove ' + name + ' from ' + scope.name + ' ' + title + '?',
action: action action: action
}); });
} };
// Password change // Password change
scope.clearPWConfirm = function(fld) { scope.clearPWConfirm = function (fld) {
// If password value changes, make sure password_confirm must be re-entered // If password value changes, make sure password_confirm must be re-entered
scope[fld] = ''; scope[fld] = '';
scope[form.name + '_form'][fld].$setValidity('awpassmatch', false); scope[form.name + '_form'][fld].$setValidity('awpassmatch', false);
} };
// Respond to 'Ask at runtime?' checkbox // Respond to 'Ask at runtime?' checkbox
scope.ask = function(fld, associated) { scope.ask = function (fld, associated) {
if (scope[fld + '_ask']) { if (scope[fld + '_ask']) {
$("#" + fld + "-clear-btn").attr("disabled","disabled"); $("#" + fld + "-clear-btn").attr("disabled", "disabled");
scope[fld] = 'ASK'; scope[fld] = 'ASK';
scope[associated] = ''; scope[associated] = '';
scope[form.name + '_form'][associated].$setValidity('awpassmatch', true); scope[form.name + '_form'][associated].$setValidity('awpassmatch', true);
} } else {
else {
$("#" + fld + "-clear-btn").removeAttr("disabled"); $("#" + fld + "-clear-btn").removeAttr("disabled");
scope[fld] = ''; scope[fld] = '';
scope[associated] = ''; scope[associated] = '';
scope[form.name + '_form'][associated].$setValidity('awpassmatch', true); scope[form.name + '_form'][associated].$setValidity('awpassmatch', true);
} }
} };
scope.clear = function(fld, associated) { scope.clear = function (fld, associated) {
scope[fld] = ''; scope[fld] = '';
scope[associated] = ''; scope[associated] = '';
scope[form.name + '_form'][associated].$setValidity('awpassmatch', true); scope[form.name + '_form'][associated].$setValidity('awpassmatch', true);
scope[form.name + '_form'].$setDirty(); scope[form.name + '_form'].$setDirty();
} };
} }
CredentialsEdit.$inject = [ '$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'CredentialForm', CredentialsEdit.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'CredentialForm',
'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'RelatedSearchInit', 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'RelatedSearchInit', 'RelatedPaginateInit',
'RelatedPaginateInit', 'ReturnToCaller', 'ClearScope', 'Prompt', 'GetBasePath', 'GetChoices', 'ReturnToCaller', 'ClearScope', 'Prompt', 'GetBasePath', 'GetChoices', 'KindChange', 'UserList', 'TeamList', 'LookUpInit',
'KindChange', 'UserList', 'TeamList', 'LookUpInit', 'Empty', 'OwnerChange', 'FormSave', 'Stream', 'Empty', 'OwnerChange', 'FormSave', 'Stream', 'Wait'
'Wait']; ];

View File

@@ -10,15 +10,16 @@
'use strict'; 'use strict';
function Home ($scope, $compile, $routeParams, $rootScope, $location, Wait, ObjectCount, JobStatus, InventorySyncStatus, SCMSyncStatus, function Home($scope, $compile, $routeParams, $rootScope, $location, Wait, ObjectCount, JobStatus, InventorySyncStatus, SCMSyncStatus,
ClearScope, Stream, Rest, GetBasePath, ProcessErrors, Button) { ClearScope, Stream, Rest, GetBasePath, ProcessErrors, Button) {
ClearScope('home'); //Garbage collection. Don't leave behind any listeners/watchers from the prior ClearScope('home');
//scope.
var buttons, html, e, waitCount, loadedCount;
// Add buttons to the top of the Home page. We're using lib/ansible/generator_helpers.js-> Buttons() // Add buttons to the top of the Home page. We're using lib/ansible/generator_helpers.js-> Buttons()
// to build buttons dynamically and insure all styling and icons match the rest of the application. // to build buttons dynamically and insure all styling and icons match the rest of the application.
var buttons = { buttons = {
refresh: { refresh: {
mode: 'all', mode: 'all',
awToolTip: "Refresh the page", awToolTip: "Refresh the page",
@@ -30,16 +31,27 @@ function Home ($scope, $compile, $routeParams, $rootScope, $location, Wait, Obje
mode: 'all' mode: 'all'
} }
}; };
var html = Button({ btn: buttons.refresh, action: 'refresh', toolbar: true });
html += Button({ btn: buttons.stream, action: 'stream', toolbar: true }); html = Button({
var e = angular.element(document.getElementById('home-list-actions')); btn: buttons.refresh,
action: 'refresh',
toolbar: true
});
html += Button({
btn: buttons.stream,
action: 'stream',
toolbar: true
});
e = angular.element(document.getElementById('home-list-actions'));
e.html(html); e.html(html);
$compile(e)($scope); $compile(e)($scope);
var waitCount = 4; waitCount = 4;
var loadedCount = 0; loadedCount = 0;
if (!$routeParams['login']) { if (!$routeParams.login) {
// If we're not logging in, start the Wait widget. Otherwise, it's already running. // If we're not logging in, start the Wait widget. Otherwise, it's already running.
Wait('start'); Wait('start');
} }
@@ -47,10 +59,10 @@ function Home ($scope, $compile, $routeParams, $rootScope, $location, Wait, Obje
if ($scope.removeWidgetLoaded) { if ($scope.removeWidgetLoaded) {
$scope.removeWidgetLoaded(); $scope.removeWidgetLoaded();
} }
$scope.removeWidgetLoaded = $scope.$on('WidgetLoaded', function() { $scope.removeWidgetLoaded = $scope.$on('WidgetLoaded', function () {
// Once all the widgets report back 'loaded', turn off Wait widget // Once all the widgets report back 'loaded', turn off Wait widget
loadedCount++; loadedCount++;
if ( loadedCount == waitCount ) { if (loadedCount === waitCount) {
Wait('stop'); Wait('stop');
} }
}); });
@@ -58,60 +70,79 @@ function Home ($scope, $compile, $routeParams, $rootScope, $location, Wait, Obje
if ($scope.removeDashboardReady) { if ($scope.removeDashboardReady) {
$scope.removeDashboardReady(); $scope.removeDashboardReady();
} }
$scope.removeDashboardReady = $scope.$on('dashboardReady', function(e, data) { $scope.removeDashboardReady = $scope.$on('dashboardReady', function (e, data) {
JobStatus({ scope: $scope, target: 'container1', dashboard: data}); JobStatus({
InventorySyncStatus({ scope: $scope, target: 'container2', dashboard: data}); scope: $scope,
SCMSyncStatus({ scope: $scope, target: 'container4', dashboard: data}); target: 'container1',
ObjectCount({ scope: $scope, target: 'container3', dashboard: data}); dashboard: data
});
InventorySyncStatus({
scope: $scope,
target: 'container2',
dashboard: data
});
SCMSyncStatus({
scope: $scope,
target: 'container4',
dashboard: data
});
ObjectCount({
scope: $scope,
target: 'container3',
dashboard: data
});
}); });
$scope.showActivity = function() { Stream({ scope: $scope }); } $scope.showActivity = function () {
Stream({
scope: $scope
});
};
$scope.refresh = function() { $scope.refresh = function () {
Wait('start'); Wait('start');
loadedCount = 0; loadedCount = 0;
Rest.setUrl(GetBasePath('dashboard')); Rest.setUrl(GetBasePath('dashboard'));
Rest.get() Rest.get()
.success( function(data, status, headers, config) { .success(function (data) {
$scope.$emit('dashboardReady', data); $scope.$emit('dashboardReady', data);
}) })
.error ( function(data, status, headers, config) { .error(function (data, status) {
Wait('stop'); Wait('stop');
ProcessErrors($scope, data, status, null, ProcessErrors($scope, data, status, null, { hdr: 'Error!', msg: 'Failed to get dashboard: ' + status });
{ hdr: 'Error!', msg: 'Failed to get dashboard: ' + status }); });
}) };
}
$scope.refresh(); $scope.refresh();
} }
Home.$inject=['$scope', '$compile', '$routeParams', '$rootScope', '$location', 'Wait', 'ObjectCount', 'JobStatus', 'InventorySyncStatus', Home.$inject = ['$scope', '$compile', '$routeParams', '$rootScope', '$location', 'Wait', 'ObjectCount', 'JobStatus', 'InventorySyncStatus',
'SCMSyncStatus', 'ClearScope', 'Stream', 'Rest', 'GetBasePath', 'ProcessErrors', 'Button']; 'SCMSyncStatus', 'ClearScope', 'Stream', 'Rest', 'GetBasePath', 'ProcessErrors', 'Button'
];
function HomeGroups ($location, $routeParams, HomeGroupList, GenerateList, ProcessErrors, LoadBreadCrumbs, ReturnToCaller, ClearScope, function HomeGroups($location, $routeParams, HomeGroupList, GenerateList, ProcessErrors, LoadBreadCrumbs, ReturnToCaller, ClearScope,
GetBasePath, SearchInit, PaginateInit, FormatDate, GetHostsStatusMsg, GetSyncStatusMsg, ViewUpdateStatus, Stream, GroupsEdit, Wait, GetBasePath, SearchInit, PaginateInit, FormatDate, GetHostsStatusMsg, GetSyncStatusMsg, ViewUpdateStatus, Stream, GroupsEdit, Wait,
Alert, Rest, Empty, InventoryUpdate, Find) { Alert, Rest, Empty, InventoryUpdate, Find) {
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 generator = GenerateList; var generator = GenerateList,
var list = HomeGroupList; list = HomeGroupList,
var defaultUrl=GetBasePath('groups'); defaultUrl = GetBasePath('groups'),
scope = generator.inject(list, { mode: 'edit' }),
var scope = generator.inject(list, { mode: 'edit' }); opt;
var base = $location.path().replace(/^\//,'').split('/')[0];
if (scope.removePostRefresh) { if (scope.removePostRefresh) {
scope.removePostRefresh(); scope.removePostRefresh();
} }
scope.removePostRefresh = scope.$on('PostRefresh', function() { scope.removePostRefresh = scope.$on('PostRefresh', function () {
var hosts_status, update_status, last_update, stat; var i, hosts_status, stat;
for (var i=0; i < scope.home_groups.length; i++) { for (i = 0; i < scope.home_groups.length; i++) {
scope['home_groups'][i]['inventory_name'] = scope['home_groups'][i]['summary_fields']['inventory']['name']; scope.home_groups[i].inventory_name = scope.home_groups[i].summary_fields.inventory.name;
stat = GetSyncStatusMsg({ stat = GetSyncStatusMsg({
status: scope.home_groups[i].summary_fields.inventory_source.status status: scope.home_groups[i].summary_fields.inventory_source.status
@@ -124,119 +155,135 @@ function HomeGroups ($location, $routeParams, HomeGroupList, GenerateList, Proce
group_id: scope.home_groups[i].id group_id: scope.home_groups[i].id
}); });
scope['home_groups'][i].status_class = stat['class'], scope.home_groups[i].status_class = stat['class'];
scope['home_groups'][i].status_tooltip = stat['tooltip'], scope.home_groups[i].status_tooltip = stat.tooltip;
scope['home_groups'][i].launch_tooltip = stat['launch_tip'], scope.home_groups[i].launch_tooltip = stat.launch_tip;
scope['home_groups'][i].launch_class = stat['launch_class'], scope.home_groups[i].launch_class = stat.launch_class;
scope['home_groups'][i].hosts_status_tip = hosts_status['tooltip'], scope.home_groups[i].hosts_status_tip = hosts_status.tooltip;
scope['home_groups'][i].show_failures = hosts_status['failures'], scope.home_groups[i].show_failures = hosts_status.failures;
scope['home_groups'][i].hosts_status_class = hosts_status['class'], scope.home_groups[i].hosts_status_class = hosts_status['class'];
scope.home_groups[i].status = scope.home_groups[i].summary_fields.inventory_source.status; scope.home_groups[i].status = scope.home_groups[i].summary_fields.inventory_source.status;
scope.home_groups[i].source = (scope.home_groups[i].summary_fields.inventory_source) ? scope.home_groups[i].source = (scope.home_groups[i].summary_fields.inventory_source) ?
scope.home_groups[i].summary_fields.inventory_source.source : null; scope.home_groups[i].summary_fields.inventory_source.source : null;
} }
}); });
SearchInit({ scope: scope, set: 'home_groups', list: list, url: defaultUrl }); SearchInit({
PaginateInit({ scope: scope, list: list, url: defaultUrl }); scope: scope,
set: 'home_groups',
list: list,
url: defaultUrl
});
PaginateInit({
scope: scope,
list: list,
url: defaultUrl
});
// Process search params // Process search params
if ($routeParams['name']) { if ($routeParams.name) {
scope[list.iterator + 'InputDisable'] = false; scope[list.iterator + 'InputDisable'] = false;
scope[list.iterator + 'SearchValue'] = $routeParams['name']; scope[list.iterator + 'SearchValue'] = $routeParams.name;
scope[list.iterator + 'SearchField'] = 'name'; scope[list.iterator + 'SearchField'] = 'name';
scope[list.iterator + 'SearchFieldLabel'] = list.fields['name'].label; scope[list.iterator + 'SearchFieldLabel'] = list.fields.name.label;
scope[list.iterator + 'SearchSelectValue'] = null; scope[list.iterator + 'SearchSelectValue'] = null;
} }
if ($routeParams['id']) { if ($routeParams.id) {
scope[list.iterator + 'InputDisable'] = false; scope[list.iterator + 'InputDisable'] = false;
scope[list.iterator + 'SearchValue'] = $routeParams['id']; scope[list.iterator + 'SearchValue'] = $routeParams.id;
scope[list.iterator + 'SearchField'] = 'id'; scope[list.iterator + 'SearchField'] = 'id';
scope[list.iterator + 'SearchFieldLabel'] = list.fields['id'].label; scope[list.iterator + 'SearchFieldLabel'] = list.fields.id.label;
scope[list.iterator + 'SearchSelectValue'] = null; scope[list.iterator + 'SearchSelectValue'] = null;
} }
if ($routeParams['has_active_failures']) { if ($routeParams.has_active_failures) {
scope[list.iterator + 'InputDisable'] = true; scope[list.iterator + 'InputDisable'] = true;
scope[list.iterator + 'SearchValue'] = $routeParams['has_active_failures']; scope[list.iterator + 'SearchValue'] = $routeParams.has_active_failures;
scope[list.iterator + 'SearchField'] = 'has_active_failures'; scope[list.iterator + 'SearchField'] = 'has_active_failures';
scope[list.iterator + 'SearchFieldLabel'] = list.fields['has_active_failures'].label; scope[list.iterator + 'SearchFieldLabel'] = list.fields.has_active_failures.label;
scope[list.iterator + 'SearchSelectValue'] = ($routeParams['has_active_failures'] == 'true') ? { value: 1 } : { value: 0 }; scope[list.iterator + 'SearchSelectValue'] = ($routeParams.has_active_failures === 'true') ? { value: 1 } : { value: 0 };
} }
if ($routeParams['status'] && !$routeParams['source']) { if ($routeParams.status && !$routeParams.source) {
scope[list.iterator + 'SearchField'] = 'status'; scope[list.iterator + 'SearchField'] = 'status';
scope[list.iterator + 'SelectShow'] = true; scope[list.iterator + 'SelectShow'] = true;
scope[list.iterator + 'SearchSelectOpts'] = list.fields['status'].searchOptions; scope[list.iterator + 'SearchSelectOpts'] = list.fields.status.searchOptions;
scope[list.iterator + 'SearchFieldLabel'] = list.fields['status'].label.replace(/\<br\>/g,' '); scope[list.iterator + 'SearchFieldLabel'] = list.fields.status.label.replace(/<br\>/g, ' ');
for (var opt in list.fields['status'].searchOptions) { for (opt in list.fields.status.searchOptions) {
if (list.fields['status'].searchOptions[opt].value == $routeParams['status']) { if (list.fields.status.searchOptions[opt].value === $routeParams.status) {
scope[list.iterator + 'SearchSelectValue'] = list.fields['status'].searchOptions[opt]; scope[list.iterator + 'SearchSelectValue'] = list.fields.status.searchOptions[opt];
break; break;
} }
} }
} }
if ($routeParams['source']) { if ($routeParams.source) {
scope[list.iterator + 'SearchField'] = 'source'; scope[list.iterator + 'SearchField'] = 'source';
scope[list.iterator + 'SelectShow'] = true; scope[list.iterator + 'SelectShow'] = true;
scope[list.iterator + 'SearchSelectOpts'] = list.fields['source'].searchOptions; scope[list.iterator + 'SearchSelectOpts'] = list.fields.source.searchOptions;
scope[list.iterator + 'SearchFieldLabel'] = list.fields['source'].label.replace(/\<br\>/g,' '); scope[list.iterator + 'SearchFieldLabel'] = list.fields.source.label.replace(/<br\>/g, ' ');
for (var opt in list.fields['source'].searchOptions) { for (opt in list.fields.source.searchOptions) {
if (list.fields['source'].searchOptions[opt].value == $routeParams['source']) { if (list.fields.source.searchOptions[opt].value === $routeParams.source) {
scope[list.iterator + 'SearchSelectValue'] = list.fields['source'].searchOptions[opt]; scope[list.iterator + 'SearchSelectValue'] = list.fields.source.searchOptions[opt];
break; break;
} }
} }
if ($routeParams['status']) { if ($routeParams.status) {
scope[list.iterator + 'ExtraParms'] = '&inventory_source__status__icontains=' + $routeParams['status']; scope[list.iterator + 'ExtraParms'] = '&inventory_source__status__icontains=' + $routeParams.status;
} }
} }
if ($routeParams['has_external_source']) { if ($routeParams.has_external_source) {
scope[list.iterator + 'SearchField'] = 'has_external_source'; scope[list.iterator + 'SearchField'] = 'has_external_source';
scope[list.iterator + 'SearchValue'] = list.fields['has_external_source'].searchValue; scope[list.iterator + 'SearchValue'] = list.fields.has_external_source.searchValue;
scope[list.iterator + 'InputDisable'] = true; scope[list.iterator + 'InputDisable'] = true;
scope[list.iterator + 'SearchType'] = 'in'; scope[list.iterator + 'SearchType'] = 'in';
scope[list.iterator + 'SearchFieldLabel'] = list.fields['has_external_source'].label; scope[list.iterator + 'SearchFieldLabel'] = list.fields.has_external_source.label;
} }
scope.search(list.iterator); scope.search(list.iterator);
LoadBreadCrumbs(); LoadBreadCrumbs();
scope.showActivity = function() { Stream({ scope: scope }); } scope.showActivity = function () {
Stream({
scope: scope
});
};
scope.editGroup = function(group_id, inventory_id) { scope.editGroup = function (group_id, inventory_id) {
GroupsEdit({ scope: scope, group_id: group_id, inventory_id: inventory_id, groups_reload: false }); GroupsEdit({
} scope: scope,
group_id: group_id,
inventory_id: inventory_id,
groups_reload: false
});
};
scope.viewUpdateStatus = function(id) { scope.viewUpdateStatus = function (id) {
scope.groups = scope.home_groups; scope.groups = scope.home_groups;
ViewUpdateStatus({ scope: scope, tree_id: id }) ViewUpdateStatus({
scope: scope,
tree_id: id
});
}; };
// Launch inventory sync // Launch inventory sync
scope.updateGroup = function(id) { scope.updateGroup = function (id) {
var group = Find({ list: scope.home_groups, key: 'id', val: id}); var group = Find({ list: scope.home_groups, key: 'id', val: id });
if (group) { if (group) {
if (Empty(group.source)) { if (Empty(group.source)) {
// if no source, do nothing. // if no source, do nothing.
} } else if (group.status === 'updating') {
else if (group.status == 'updating') {
Alert('Update in Progress', 'The inventory update process is currently running for group <em>' + Alert('Update in Progress', 'The inventory update process is currently running for group <em>' +
scope.home_groups[i].name + '</em>. Use the Refresh button to monitor the status.', 'alert-info'); group.name + '</em>. Use the Refresh button to monitor the status.', 'alert-info');
} } else {
else {
Wait('start'); Wait('start');
Rest.setUrl(group.related.inventory_source); Rest.setUrl(group.related.inventory_source);
Rest.get() Rest.get()
.success( function(data, status, headers, config) { .success(function (data) {
InventoryUpdate({ InventoryUpdate({
scope: scope, scope: scope,
url: data.related.update, url: data.related.update,
@@ -246,98 +293,132 @@ function HomeGroups ($location, $routeParams, HomeGroupList, GenerateList, Proce
group_id: group.id group_id: group.id
}); });
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
ProcessErrors(scope, data, status, form, ProcessErrors(scope, data, status, null, { hdr: 'Error!',
{ hdr: 'Error!', msg: 'Failed to retrieve inventory source: ' + group.related.inventory_source + msg: 'Failed to retrieve inventory source: ' + group.related.inventory_source + ' POST returned status: ' + status
' POST returned status: ' + status }); });
}); });
} }
} }
} };
scope.refresh = function() { scope.search(list.iterator, null, false, true); } scope.refresh = function () {
scope.search(list.iterator, null, false, true);
};
} }
HomeGroups.$inject = [ '$location', '$routeParams', 'HomeGroupList', 'GenerateList', 'ProcessErrors', 'LoadBreadCrumbs', 'ReturnToCaller', HomeGroups.$inject = ['$location', '$routeParams', 'HomeGroupList', 'GenerateList', 'ProcessErrors', 'LoadBreadCrumbs', 'ReturnToCaller',
'ClearScope', 'GetBasePath', 'SearchInit', 'PaginateInit', 'FormatDate', 'GetHostsStatusMsg', 'GetSyncStatusMsg', 'ViewUpdateStatus', 'ClearScope', 'GetBasePath', 'SearchInit', 'PaginateInit', 'FormatDate', 'GetHostsStatusMsg', 'GetSyncStatusMsg', 'ViewUpdateStatus',
'Stream', 'GroupsEdit', 'Wait', 'Alert', 'Rest', 'Empty', 'InventoryUpdate', 'Find' 'Stream', 'GroupsEdit', 'Wait', 'Alert', 'Rest', 'Empty', 'InventoryUpdate', 'Find'
]; ];
function HomeHosts ($location, $routeParams, HomeHostList, GenerateList, ProcessErrors, LoadBreadCrumbs, ReturnToCaller, ClearScope, function HomeHosts($location, $routeParams, HomeHostList, GenerateList, ProcessErrors, LoadBreadCrumbs, ReturnToCaller, ClearScope,
GetBasePath, SearchInit, PaginateInit, FormatDate, SetStatus, ToggleHostEnabled, HostsEdit, Stream, Find, ShowJobSummary) { GetBasePath, SearchInit, PaginateInit, FormatDate, SetStatus, ToggleHostEnabled, HostsEdit, Stream, Find, ShowJobSummary) {
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 generator = GenerateList; var generator = GenerateList,
var list = HomeHostList; list = HomeHostList,
var defaultUrl=GetBasePath('hosts'); defaultUrl = GetBasePath('hosts'),
scope = generator.inject(list, { mode: 'edit' });
var scope = generator.inject(list, { mode: 'edit' });
var base = $location.path().replace(/^\//,'').split('/')[0];
if (scope.removePostRefresh) { if (scope.removePostRefresh) {
scope.removePostRefresh(); scope.removePostRefresh();
} }
scope.removePostRefresh = scope.$on('PostRefresh', function() { scope.removePostRefresh = scope.$on('PostRefresh', function () {
for (var i=0; i < scope.hosts.length; i++) { for (var i = 0; i < scope.hosts.length; i++) {
scope['hosts'][i]['inventory_name'] = scope['hosts'][i]['summary_fields']['inventory']['name']; scope.hosts[i].inventory_name = scope.hosts[i].summary_fields.inventory.name;
//SetHostStatus(scope['hosts'][i]); //SetHostStatus(scope['hosts'][i]);
SetStatus({ scope: scope, host: scope['hosts'][i] }); SetStatus({
scope: scope,
host: scope.hosts[i]
});
} }
}); });
SearchInit({ scope: scope, set: 'hosts', list: list, url: defaultUrl }); SearchInit({
PaginateInit({ scope: scope, list: list, url: defaultUrl }); scope: scope,
set: 'hosts',
list: list,
url: defaultUrl
});
PaginateInit({
scope: scope,
list: list,
url: defaultUrl
});
// Process search params // Process search params
if ($routeParams['name']) { if ($routeParams.name) {
scope[HomeHostList.iterator + 'InputDisable'] = false; scope[HomeHostList.iterator + 'InputDisable'] = false;
scope[HomeHostList.iterator + 'SearchValue'] = $routeParams['name']; scope[HomeHostList.iterator + 'SearchValue'] = $routeParams.name;
scope[HomeHostList.iterator + 'SearchField'] = 'name'; scope[HomeHostList.iterator + 'SearchField'] = 'name';
scope[HomeHostList.iterator + 'SearchFieldLabel'] = list.fields['name'].label; scope[HomeHostList.iterator + 'SearchFieldLabel'] = list.fields.name.label;
} }
if ($routeParams['id']) { if ($routeParams.id) {
scope[HomeHostList.iterator + 'InputDisable'] = false; scope[HomeHostList.iterator + 'InputDisable'] = false;
scope[HomeHostList.iterator + 'SearchValue'] = $routeParams['id']; scope[HomeHostList.iterator + 'SearchValue'] = $routeParams.id;
scope[HomeHostList.iterator + 'SearchField'] = 'id'; scope[HomeHostList.iterator + 'SearchField'] = 'id';
scope[HomeHostList.iterator + 'SearchFieldLabel'] = list.fields['id'].label; scope[HomeHostList.iterator + 'SearchFieldLabel'] = list.fields.id.label;
scope[HomeHostList.iterator + 'SearchSelectValue'] = null; scope[HomeHostList.iterator + 'SearchSelectValue'] = null;
} }
if ($routeParams['has_active_failures']) { if ($routeParams.has_active_failures) {
scope[HomeHostList.iterator + 'InputDisable'] = true; scope[HomeHostList.iterator + 'InputDisable'] = true;
scope[HomeHostList.iterator + 'SearchValue'] = $routeParams['has_active_failures']; scope[HomeHostList.iterator + 'SearchValue'] = $routeParams.has_active_failures;
scope[HomeHostList.iterator + 'SearchField'] = 'has_active_failures'; scope[HomeHostList.iterator + 'SearchField'] = 'has_active_failures';
scope[HomeHostList.iterator + 'SearchFieldLabel'] = HomeHostList.fields['has_active_failures'].label; scope[HomeHostList.iterator + 'SearchFieldLabel'] = HomeHostList.fields.has_active_failures.label;
scope[HomeHostList.iterator + 'SearchSelectValue'] = ($routeParams['has_active_failures'] == 'true') ? { value: 1 } : { value: 0 }; scope[HomeHostList.iterator + 'SearchSelectValue'] = ($routeParams.has_active_failures === 'true') ? { value: 1 } : { value: 0 };
} }
scope.search(list.iterator); scope.search(list.iterator);
LoadBreadCrumbs(); LoadBreadCrumbs();
scope.showActivity = function() { Stream({ scope: scope }); } scope.showActivity = function () {
Stream({
scope: scope
});
};
scope.toggle_host_enabled = function(id, sources) { ToggleHostEnabled({ host_id: id, external_source: sources, scope: scope }); } scope.toggle_host_enabled = function (id, sources) {
ToggleHostEnabled({
host_id: id,
external_source: sources,
scope: scope
});
};
scope.editHost = function(host_id, host_name) { scope.editHost = function (host_id) {
var host = Find({ list: scope.hosts, key: 'id', val: host_id }); var host = Find({
list: scope.hosts,
key: 'id',
val: host_id
});
if (host) { if (host) {
HostsEdit({ scope: scope, host_id: host_id, inventory_id: host.inventory, group_id: null, hostsReload: false }); HostsEdit({
} scope: scope,
host_id: host_id,
inventory_id: host.inventory,
group_id: null,
hostsReload: false
});
} }
};
scope.showJobSummary = function(job_id) { scope.showJobSummary = function (job_id) {
ShowJobSummary({ job_id: job_id }); ShowJobSummary({
} job_id: job_id
});
};
} }
HomeHosts.$inject = [ '$location', '$routeParams', 'HomeHostList', 'GenerateList', 'ProcessErrors', 'LoadBreadCrumbs', 'ReturnToCaller', HomeHosts.$inject = ['$location', '$routeParams', 'HomeHostList', 'GenerateList', 'ProcessErrors', 'LoadBreadCrumbs', 'ReturnToCaller',
'ClearScope', 'GetBasePath', 'SearchInit', 'PaginateInit', 'FormatDate', 'SetStatus', 'ToggleHostEnabled', 'HostsEdit', 'Stream', 'ClearScope', 'GetBasePath', 'SearchInit', 'PaginateInit', 'FormatDate', 'SetStatus', 'ToggleHostEnabled', 'HostsEdit', 'Stream',
'Find', 'ShowJobSummary' 'Find', 'ShowJobSummary'
]; ];

View File

@@ -10,54 +10,71 @@
'use strict'; 'use strict';
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, Wait, Stream, EditInventoryProperties) GetBasePath, Wait, Stream, EditInventoryProperties) {
{
ClearScope('htmlTemplate'); //Garbage collection. Don't leave behind any listeners/watchers from the prior ClearScope('htmlTemplate');
//scope.
var list = InventoryList; var list = InventoryList,
var defaultUrl = GetBasePath('inventory'); defaultUrl = GetBasePath('inventory'),
var view = GenerateList; view = GenerateList,
var paths = $location.path().replace(/^\//,'').split('/'); paths = $location.path().replace(/^\//, '').split('/'),
var mode = (paths[0] == 'inventories') ? 'edit' : 'select'; // if base path 'users', we're here to add/edit users mode = (paths[0] === 'inventories') ? 'edit' : 'select', // if base path 'users', we're here to add/edit users
var scope = view.inject(InventoryList, { mode: mode }); // Inject our view scope = view.inject(InventoryList, { mode: mode });
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
SearchInit({ scope: scope, set: 'inventories', list: list, url: defaultUrl }); SearchInit({
PaginateInit({ scope: scope, list: list, url: defaultUrl }); scope: scope,
set: 'inventories',
list: list,
url: defaultUrl
});
PaginateInit({
scope: scope,
list: list,
url: defaultUrl
});
if ($routeParams['name']) { if ($routeParams.name) {
scope[InventoryList.iterator + 'InputDisable'] = false; scope[InventoryList.iterator + 'InputDisable'] = false;
scope[InventoryList.iterator + 'SearchValue'] = $routeParams['name']; scope[InventoryList.iterator + 'SearchValue'] = $routeParams.name;
scope[InventoryList.iterator + 'SearchField'] = 'name'; scope[InventoryList.iterator + 'SearchField'] = 'name';
scope[InventoryList.iterator + 'SearchFieldLabel'] = InventoryList.fields['name'].label; scope[InventoryList.iterator + 'SearchFieldLabel'] = InventoryList.fields.name.label;
scope[InventoryList.iterator + 'SearchSelectValue'] = null; scope[InventoryList.iterator + 'SearchSelectValue'] = null;
} }
if ($routeParams['has_active_failures']) { if ($routeParams.has_active_failures) {
scope[InventoryList.iterator + 'InputDisable'] = true; scope[InventoryList.iterator + 'InputDisable'] = true;
scope[InventoryList.iterator + 'SearchValue'] = $routeParams['has_active_failures']; scope[InventoryList.iterator + 'SearchValue'] = $routeParams.has_active_failures;
scope[InventoryList.iterator + 'SearchField'] = 'has_active_failures'; scope[InventoryList.iterator + 'SearchField'] = 'has_active_failures';
scope[InventoryList.iterator + 'SearchFieldLabel'] = InventoryList.fields['has_active_failures'].label; scope[InventoryList.iterator + 'SearchFieldLabel'] = InventoryList.fields.has_active_failures.label;
scope[InventoryList.iterator + 'SearchSelectValue'] = ($routeParams['has_active_failures'] == 'true') ? { value: 1 } : { value: 0 }; scope[InventoryList.iterator + 'SearchSelectValue'] = ($routeParams.has_active_failures === 'true') ? {
value: 1
} : {
value: 0
};
} }
if ($routeParams['has_inventory_sources']) { if ($routeParams.has_inventory_sources) {
scope[InventoryList.iterator + 'InputDisable'] = true; scope[InventoryList.iterator + 'InputDisable'] = true;
scope[InventoryList.iterator + 'SearchValue'] = $routeParams['has_inventory_sources']; scope[InventoryList.iterator + 'SearchValue'] = $routeParams.has_inventory_sources;
scope[InventoryList.iterator + 'SearchField'] = 'has_inventory_sources'; scope[InventoryList.iterator + 'SearchField'] = 'has_inventory_sources';
scope[InventoryList.iterator + 'SearchFieldLabel'] = InventoryList.fields['has_inventory_sources'].label; scope[InventoryList.iterator + 'SearchFieldLabel'] = InventoryList.fields.has_inventory_sources.label;
scope[InventoryList.iterator + 'SearchSelectValue'] = ($routeParams['has_inventory_sources'] == 'true') ? { value: 1 } : { value: 0 }; scope[InventoryList.iterator + 'SearchSelectValue'] = ($routeParams.has_inventory_sources === 'true') ? {
value: 1
} : {
value: 0
};
} }
if ($routeParams['inventory_sources_with_failures']) { if ($routeParams.inventory_sources_with_failures) {
// pass a value of true, however this field actually contains an integer value // pass a value of true, however this field actually contains an integer value
scope[InventoryList.iterator + 'InputDisable'] = true; scope[InventoryList.iterator + 'InputDisable'] = true;
scope[InventoryList.iterator + 'SearchValue'] = $routeParams['inventory_sources_with_failures']; scope[InventoryList.iterator + 'SearchValue'] = $routeParams.inventory_sources_with_failures;
scope[InventoryList.iterator + 'SearchField'] = 'inventory_sources_with_failures'; scope[InventoryList.iterator + 'SearchField'] = 'inventory_sources_with_failures';
scope[InventoryList.iterator + 'SearchFieldLabel'] = InventoryList.fields['inventory_sources_with_failures'].label; scope[InventoryList.iterator + 'SearchFieldLabel'] = InventoryList.fields.inventory_sources_with_failures.label;
scope[InventoryList.iterator + 'SearchType'] = 'gtzero'; scope[InventoryList.iterator + 'SearchType'] = 'gtzero';
} }
@@ -68,33 +85,31 @@ function InventoriesList ($scope, $rootScope, $location, $log, $routeParams, Res
if (scope.removePostRefresh) { if (scope.removePostRefresh) {
scope.removePostRefresh(); scope.removePostRefresh();
} }
scope.removePostRefresh = scope.$on('PostRefresh', function() { scope.removePostRefresh = scope.$on('PostRefresh', function () {
//If we got here by deleting an inventory, stop the spinner and cleanup events //If we got here by deleting an inventory, stop the spinner and cleanup events
Wait('stop'); Wait('stop');
$('#prompt-modal').off(); $('#prompt-modal').off();
for (var i=0; i < scope.inventories.length; i++) { for (var i = 0; i < scope.inventories.length; i++) {
// Set values for Failed Hosts column // Set values for Failed Hosts column
//scope.inventories[i].failed_hosts = scope.inventories[i].hosts_with_active_failures + ' / ' + scope.inventories[i].total_hosts; //scope.inventories[i].failed_hosts = scope.inventories[i].hosts_with_active_failures + ' / ' + scope.inventories[i].total_hosts;
if (scope.inventories[i].hosts_with_active_failures > 0) { if (scope.inventories[i].hosts_with_active_failures > 0) {
scope.inventories[i].failed_hosts_tip = scope.inventories[i].hosts_with_active_failures + scope.inventories[i].failed_hosts_tip = scope.inventories[i].hosts_with_active_failures +
( (scope.inventories[i].hosts_with_active_failures == 1) ? ' host' : ' hosts' ) + ' with job failures. Click to view details.'; ((scope.inventories[i].hosts_with_active_failures === 1) ? ' host' : ' hosts') + ' with job failures. Click to view details.';
scope.inventories[i].failed_hosts_link = '/#/inventories/' + scope.inventories[i].id + '/'; scope.inventories[i].failed_hosts_link = '/#/inventories/' + scope.inventories[i].id + '/';
scope.inventories[i].failed_hosts_class = 'true'; scope.inventories[i].failed_hosts_class = 'true';
} } else {
else { if (scope.inventories[i].total_hosts === 0) {
if (scope.inventories[i].total_hosts == 0) {
// no hosts // no hosts
scope.inventories[i].failed_hosts_tip = "No hosts defined. Click to add."; scope.inventories[i].failed_hosts_tip = "No hosts defined. Click to add.";
scope.inventories[i].failed_hosts_link = '/#/inventories/' + scope.inventories[i].id + '/'; scope.inventories[i].failed_hosts_link = '/#/inventories/' + scope.inventories[i].id + '/';
scope.inventories[i].failed_hosts_class = 'na'; scope.inventories[i].failed_hosts_class = 'na';
} } else {
else {
// many hosts with 0 failures // many hosts with 0 failures
scope.inventories[i].failed_hosts_tip = scope.inventories[i].total_hosts + scope.inventories[i].failed_hosts_tip = scope.inventories[i].total_hosts +
( (scope.inventories[i].total_hosts > 1) ? ' hosts' : ' host' ) + " with no job failures. Click to view details."; ((scope.inventories[i].total_hosts > 1) ? ' hosts' : ' host') + " with no job failures. Click to view details.";
scope.inventories[i].failed_hosts_link = '/#/inventories/' + scope.inventories[i].id + '/'; scope.inventories[i].failed_hosts_link = '/#/inventories/' + scope.inventories[i].id + '/';
scope.inventories[i].failed_hosts_class = 'false'; scope.inventories[i].failed_hosts_class = 'false';
} }
@@ -104,22 +119,20 @@ function InventoriesList ($scope, $rootScope, $location, $log, $routeParams, Res
scope.inventories[i].status = scope.inventories[i].inventory_sources_with_failures + ' / ' + scope.inventories[i].total_inventory_sources; scope.inventories[i].status = scope.inventories[i].inventory_sources_with_failures + ' / ' + scope.inventories[i].total_inventory_sources;
if (scope.inventories[i].inventory_sources_with_failures > 0) { if (scope.inventories[i].inventory_sources_with_failures > 0) {
scope.inventories[i].status_tip = scope.inventories[i].inventory_sources_with_failures + ' cloud ' + scope.inventories[i].status_tip = scope.inventories[i].inventory_sources_with_failures + ' cloud ' +
( (scope.inventories[i].inventory_sources_with_failures == 1) ? 'source' : 'sources' ) + ((scope.inventories[i].inventory_sources_with_failures === 1) ? 'source' : 'sources') +
' with failures. Click to view details.'; ' with failures. Click to view details.';
scope.inventories[i].status_link = '/#/inventories/' + scope.inventories[i].id + '/'; scope.inventories[i].status_link = '/#/inventories/' + scope.inventories[i].id + '/';
scope.inventories[i].status_class = 'failed'; scope.inventories[i].status_class = 'failed';
} } else {
else { if (scope.inventories[i].total_inventory_sources === 0) {
if (scope.inventories[i].total_inventory_sources == 0) {
// no groups are reporting a source // no groups are reporting a source
scope.inventories[i].status_tip = "Not synced with a cloud source. Click to edit."; scope.inventories[i].status_tip = "Not synced with a cloud source. Click to edit.";
scope.inventories[i].status_link = '/#/inventories/' + scope.inventories[i].id + '/'; scope.inventories[i].status_link = '/#/inventories/' + scope.inventories[i].id + '/';
scope.inventories[i].status_class = 'na'; scope.inventories[i].status_class = 'na';
} } else {
else {
// many hosts with 0 failures // many hosts with 0 failures
scope.inventories[i].status_tip = scope.inventories[i].total_inventory_sources + scope.inventories[i].status_tip = scope.inventories[i].total_inventory_sources +
' cloud ' + ( (scope.inventories[i].total_inventory_sources > 1) ? 'sources' : 'source' ) + ' cloud ' + ((scope.inventories[i].total_inventory_sources > 1) ? 'sources' : 'source') +
' with no failures. Click to view details.'; ' with no failures. Click to view details.';
scope.inventories[i].status_link = '/#/inventories/' + scope.inventories[i].id + '/'; scope.inventories[i].status_link = '/#/inventories/' + scope.inventories[i].id + '/';
scope.inventories[i].status_class = 'successful'; scope.inventories[i].status_class = 'successful';
@@ -132,98 +145,112 @@ function InventoriesList ($scope, $rootScope, $location, $log, $routeParams, Res
if (scope.removeRefreshInventories) { if (scope.removeRefreshInventories) {
scope.removeRefreshInventories(); scope.removeRefreshInventories();
} }
scope.removeRefreshInventories = scope.$on('RefreshInventories', function() { scope.removeRefreshInventories = scope.$on('RefreshInventories', function () {
// Reflect changes after inventory properties edit completes // Reflect changes after inventory properties edit completes
scope.search(list.iterator); scope.search(list.iterator);
}); });
scope.showActivity = function() { Stream({ scope: scope }); } scope.showActivity = function () {
Stream({
scope: scope
});
};
scope.editInventoryProperties = function(inventory_id) { scope.editInventoryProperties = function (inventory_id) {
EditInventoryProperties({ scope: scope, inventory_id: inventory_id }); EditInventoryProperties({
} scope: scope,
inventory_id: inventory_id
});
};
scope.addInventory = function() { scope.addInventory = function () {
$location.path($location.path() + '/add'); $location.path($location.path() + '/add');
} };
scope.editInventory = function(id) { scope.editInventory = function (id) {
$location.path($location.path() + '/' + id); $location.path($location.path() + '/' + id);
} };
scope.deleteInventory = function(id, name) { scope.deleteInventory = function (id, name) {
var action = function() { var action = function () {
var url = defaultUrl + id + '/'; var url = defaultUrl + id + '/';
$('#prompt-modal').on('hidden.bs.modal', function() { $('#prompt-modal').on('hidden.bs.modal', function () {
Wait('start'); Wait('start');
}); });
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
Rest.setUrl(url); Rest.setUrl(url);
Rest.destroy() Rest.destroy()
.success( function(data, status, headers, config) { .success(function () {
scope.search(list.iterator); scope.search(list.iterator);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
Wait('stop'); Wait('stop');
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, {
{ hdr: 'Error!', msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status }); hdr: 'Error!',
msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status
});
}); });
}; };
Prompt({ hdr: 'Delete', Prompt({
hdr: 'Delete',
body: 'Are you sure you want to delete ' + name + '?', body: 'Are you sure you want to delete ' + name + '?',
action: action action: action
}); });
} };
scope.lookupOrganization = function(organization_id) { scope.lookupOrganization = function (organization_id) {
Rest.setUrl(GetBasePath('organizations') + organization_id + '/'); Rest.setUrl(GetBasePath('organizations') + organization_id + '/');
Rest.get() Rest.get()
.success( function(data, status, headers, config) { .success(function (data) {
return data.name; return data.name;
}); });
} };
// Failed jobs link. Go to the jobs tabs, find all jobs for the inventory and sort by status // Failed jobs link. Go to the jobs tabs, find all jobs for the inventory and sort by status
scope.viewJobs = function(id) { scope.viewJobs = function (id) {
$location.url('/jobs/?inventory__int=' + id); $location.url('/jobs/?inventory__int=' + id);
} };
scope.viewFailedJobs = function(id) { scope.viewFailedJobs = function (id) {
$location.url('/jobs/?inventory__int=' + id + '&status=failed'); $location.url('/jobs/?inventory__int=' + id + '&status=failed');
} };
} }
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', 'Wait', 'Stream', 'EditInventoryProperties']; 'GetBasePath', 'Wait', 'Stream', 'EditInventoryProperties'
];
function InventoriesAdd ($scope, $rootScope, $compile, $location, $log, $routeParams, InventoryForm, function InventoriesAdd($scope, $rootScope, $compile, $location, $log, $routeParams, InventoryForm,
GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ReturnToCaller, ClearScope, GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ReturnToCaller, ClearScope,
GenerateList, OrganizationList, SearchInit, PaginateInit, LookUpInit, GetBasePath, GenerateList, OrganizationList, SearchInit, PaginateInit, LookUpInit, GetBasePath,
ParseTypeChange, Wait) ParseTypeChange, Wait) {
{
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.
// Inject dynamic view // Inject dynamic view
var defaultUrl = GetBasePath('inventory'); var defaultUrl = GetBasePath('inventory'),
var form = InventoryForm; form = InventoryForm,
var generator = GenerateForm; generator = GenerateForm,
scope;
form.well = true, form.well = true;
form.formLabelSize = null; form.formLabelSize = null;
form.formFieldSize = null; form.formFieldSize = null;
var scope = generator.inject(form, {mode: 'add', related: false}); scope = generator.inject(form, {
mode: 'add',
related: false
});
scope.inventoryParseType = 'yaml'; scope.inventoryParseType = 'yaml';
generator.reset(); generator.reset();
LoadBreadCrumbs(); LoadBreadCrumbs();
ParseTypeChange(scope,'inventory_variables', 'inventoryParseType'); ParseTypeChange(scope, 'inventory_variables', 'inventoryParseType');
LookUpInit({ LookUpInit({
scope: scope, scope: scope,
@@ -234,16 +261,17 @@ function InventoriesAdd ($scope, $rootScope, $compile, $location, $log, $routePa
}); });
// Save // Save
scope.formSave = function() { scope.formSave = function () {
generator.clearApiErrors(); generator.clearApiErrors();
Wait('start'); Wait('start');
try { try {
var fld, json_data, data;
// Make sure we have valid variable data // Make sure we have valid variable data
if (scope.inventoryParseType == 'json') { if (scope.inventoryParseType === 'json') {
var json_data = JSON.parse(scope.inventory_variables); //make sure JSON parses json_data = JSON.parse(scope.inventory_variables); //make sure JSON parses
} } else {
else { json_data = jsyaml.load(scope.inventory_variables); //parse yaml
var json_data = jsyaml.load(scope.inventory_variables); //parse yaml
} }
// Make sure our JSON is actually an object // Make sure our JSON is actually an object
@@ -251,13 +279,12 @@ function InventoriesAdd ($scope, $rootScope, $compile, $location, $log, $routePa
throw "failed to return an object!"; throw "failed to return an object!";
} }
var data = {} data = {};
for (var fld in form.fields) { for (fld in form.fields) {
if (fld != 'inventory_variables') { if (fld !== 'inventory_variables') {
if (form.fields[fld].realName) { if (form.fields[fld].realName) {
data[form.fields[fld].realName] = scope[fld]; data[form.fields[fld].realName] = scope[fld];
} } else {
else {
data[fld] = scope[fld]; data[fld] = scope[fld];
} }
} }
@@ -265,33 +292,34 @@ function InventoriesAdd ($scope, $rootScope, $compile, $location, $log, $routePa
Rest.setUrl(defaultUrl); Rest.setUrl(defaultUrl);
Rest.post(data) Rest.post(data)
.success( function(data, status, headers, config) { .success(function (data) {
var inventory_id = data.id; var inventory_id = data.id;
if (scope.inventory_variables) { if (scope.inventory_variables) {
Rest.setUrl(data.related.variable_data); Rest.setUrl(data.related.variable_data);
Rest.put(json_data) Rest.put(json_data)
.success( function(data, status, headers, config) { .success(function () {
Wait('stop'); Wait('stop');
$location.path('/inventories/' + inventory_id + '/'); $location.path('/inventories/' + inventory_id + '/');
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
Wait('stop'); Wait('stop');
ProcessErrors(scope, data, status, form, ProcessErrors(scope, data, status, null, { hdr: 'Error!',
{ hdr: 'Error!', msg: 'Failed to add inventory varaibles. PUT returned status: ' + status }); msg: 'Failed to add inventory varaibles. PUT returned status: ' + status
}); });
} });
else { } else {
Wait('stop'); Wait('stop');
$location.path('/inventories/' + inventory_id + '/'); $location.path('/inventories/' + inventory_id + '/');
} }
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
Wait('stop'); Wait('stop');
ProcessErrors(scope, data, status, form, ProcessErrors(scope, data, status, form, {
{ hdr: 'Error!', msg: 'Failed to add new inventory. Post returned status: ' + status }); hdr: 'Error!',
msg: 'Failed to add new inventory. Post returned status: ' + status
}); });
} });
catch(err) { } catch (err) {
Wait('stop'); Wait('stop');
Alert("Error", "Error parsing inventory variables. Parser returned: " + err); Alert("Error", "Error parsing inventory variables. Parser returned: " + err);
} }
@@ -299,49 +327,56 @@ function InventoriesAdd ($scope, $rootScope, $compile, $location, $log, $routePa
}; };
// Reset // Reset
scope.formReset = function() { scope.formReset = function () {
// Defaults // Defaults
generator.reset(); generator.reset();
}; };
} }
InventoriesAdd.$inject = [ '$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'InventoryForm', 'GenerateForm', InventoriesAdd.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'InventoryForm', 'GenerateForm',
'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ReturnToCaller', 'ClearScope', 'GenerateList', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ReturnToCaller', 'ClearScope', 'GenerateList',
'OrganizationList', 'SearchInit', 'PaginateInit', 'LookUpInit', 'GetBasePath', 'ParseTypeChange', 'Wait' 'OrganizationList', 'SearchInit', 'PaginateInit', 'LookUpInit', 'GetBasePath', 'ParseTypeChange', 'Wait'
]; ];
function InventoriesEdit ($scope, $location, $routeParams, $compile, GenerateList, ClearScope, InventoryGroups, InventoryHosts, BuildTree, Wait, function InventoriesEdit($scope, $location, $routeParams, $compile, GenerateList, ClearScope, InventoryGroups, InventoryHosts, BuildTree, Wait,
GetSyncStatusMsg, InjectHosts, HostsReload, GroupsAdd, GroupsEdit, GroupsDelete, Breadcrumbs, LoadBreadCrumbs, Empty, GetSyncStatusMsg, InjectHosts, HostsReload, GroupsAdd, GroupsEdit, GroupsDelete, Breadcrumbs, LoadBreadCrumbs, Empty,
Rest, ProcessErrors, InventoryUpdate, Alert, ToggleChildren, ViewUpdateStatus, GroupsCancelUpdate, Find, Rest, ProcessErrors, InventoryUpdate, Alert, ToggleChildren, ViewUpdateStatus, GroupsCancelUpdate, Find,
HostsCreate, EditInventoryProperties, HostsEdit, HostsDelete, ToggleHostEnabled, CopyMoveGroup, CopyMoveHost, HostsCreate, EditInventoryProperties, HostsEdit, HostsDelete, ToggleHostEnabled, CopyMoveGroup, CopyMoveHost,
Stream, GetBasePath, ShowJobSummary, ApplyEllipsis, WatchInventoryWindowResize, HelpDialog, InventoryGroupsHelp, Stream, GetBasePath, ShowJobSummary, ApplyEllipsis, WatchInventoryWindowResize, HelpDialog, InventoryGroupsHelp,
Store) Store) {
{
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 generator = GenerateList; var generator = GenerateList,
var list = InventoryGroups; list = InventoryGroups;
var base = $location.path().replace(/^\//,'').split('/')[0];
$scope.inventory_id = $routeParams.inventory_id; $scope.inventory_id = $routeParams.inventory_id;
LoadBreadCrumbs({ path: $location.path(), title: '{{ inventory_name }}' }); LoadBreadCrumbs({
path: $location.path(),
title: '{{ inventory_name }}'
});
// After the tree data loads for the first time, generate the groups and hosts lists // After the tree data loads for the first time, generate the groups and hosts lists
if ($scope.removeGroupTreeLoaded) { if ($scope.removeGroupTreeLoaded) {
$scope.removeGroupTreeLoaded(); $scope.removeGroupTreeLoaded();
} }
$scope.removeGroupTreeLoaded = $scope.$on('GroupTreeLoaded', function(e, inventory_name, groups) { $scope.removeGroupTreeLoaded = $scope.$on('GroupTreeLoaded', function (event, inventory_name, groups) {
// Add breadcrumbs // Add breadcrumbs
var e = angular.element(document.getElementById('breadcrumbs')); var e, inventoryAutoHelp;
e = angular.element(document.getElementById('breadcrumbs'));
e.html(Breadcrumbs({ list: list, mode: 'edit' })); e.html(Breadcrumbs({ list: list, mode: 'edit' }));
$compile(e)($scope); $compile(e)($scope);
// Add groups view // Add groups view
generator.inject(list, { mode: 'edit', id: 'groups-container', breadCrumbs: false, searchSize: 'col-lg-5 col-md-5 col-sm-5' }); generator.inject(list, {
mode: 'edit',
id: 'groups-container',
breadCrumbs: false,
searchSize: 'col-lg-5 col-md-5 col-sm-5'
});
$scope.groups = groups; $scope.groups = groups;
$scope.inventory_name = inventory_name; $scope.inventory_name = inventory_name;
@@ -352,35 +387,44 @@ function InventoriesEdit ($scope, $location, $routeParams, $compile, GenerateLis
$scope.groups[0].selected_class = 'selected'; $scope.groups[0].selected_class = 'selected';
$scope.groups[0].active_class = 'active-row'; $scope.groups[0].active_class = 'active-row';
$scope.selected_group_name = $scope.groups[0].name; $scope.selected_group_name = $scope.groups[0].name;
} } else {
else {
$scope.selected_tree_id = null; $scope.selected_tree_id = null;
$scope.selected_group_id = null; $scope.selected_group_id = null;
} }
// Add hosts view // Add hosts view
$scope.show_failures = false; $scope.show_failures = false;
InjectHosts({ scope: $scope, inventory_id: $scope.inventory_id, tree_id: $scope.selected_tree_id, group_id: $scope.selected_group_id }); InjectHosts({
scope: $scope,
inventory_id: $scope.inventory_id,
tree_id: $scope.selected_tree_id,
group_id: $scope.selected_group_id
});
// As the window shrinks and expands, apply ellipsis // As the window shrinks and expands, apply ellipsis
setTimeout(function() { setTimeout(function () {
// Hack to keep group name from slipping to a new line // Hack to keep group name from slipping to a new line
$('#groups_table .name-column').each( function() { $('#groups_table .name-column').each(function () {
var td_width = $(this).width(); var td_width, level_width, level_padding, level, pct;
var level_width = $(this).find('.level').width(); td_width = $(this).width();
var level_padding = parseInt($(this).find('.level').css('padding-left').replace(/px/,'')); level_width = $(this).find('.level').width();
var level = level_width + level_padding; level_padding = parseInt($(this).find('.level').css('padding-left').replace(/px/, ''));
var pct = ( 100 - Math.ceil((level / td_width)*100) ) + '%'; level = level_width + level_padding;
$(this).find('.group-name').css({ width: pct }); pct = (100 - Math.ceil((level / td_width) * 100)) + '%';
$(this).find('.group-name').css({
width: pct
});
}); });
ApplyEllipsis('#groups_table .group-name a'); ApplyEllipsis('#groups_table .group-name a');
ApplyEllipsis('#hosts_table .host-name a'); ApplyEllipsis('#hosts_table .host-name a');
}, 2500); //give the window time to display }, 2500); //give the window time to display
WatchInventoryWindowResize(); WatchInventoryWindowResize();
var inventoryAutoHelp = Store('inventoryAutoHelp'); inventoryAutoHelp = Store('inventoryAutoHelp');
if (inventoryAutoHelp !== 'off' && $scope.autoShowGroupHelp) { if (inventoryAutoHelp !== 'off' && $scope.autoShowGroupHelp) {
$scope.showGroupHelp({ autoShow: true }); $scope.showGroupHelp({
autoShow: true
});
} }
}); });
@@ -390,9 +434,11 @@ function InventoriesEdit ($scope, $location, $routeParams, $compile, GenerateLis
if ($scope.removeGroupTreeRefreshed) { if ($scope.removeGroupTreeRefreshed) {
$scope.removeGroupTreeRefreshed(); $scope.removeGroupTreeRefreshed();
} }
$scope.removeGroupTreeRefreshed = $scope.$on('GroupTreeRefreshed', function(e, inventory_name, groups) { $scope.removeGroupTreeRefreshed = $scope.$on('GroupTreeRefreshed', function () {
// Reapply ellipsis to groups // Reapply ellipsis to groups
setTimeout(function() { ApplyEllipsis('#groups_table .group-name a'); }, 2500); setTimeout(function () {
ApplyEllipsis('#groups_table .group-name a');
}, 2500);
// Reselect the preveiously selected group node, causing host view to refresh. // Reselect the preveiously selected group node, causing host view to refresh.
$scope.showHosts($scope.selected_tree_id, $scope.selected_group_id, false); $scope.showHosts($scope.selected_tree_id, $scope.selected_group_id, false);
}); });
@@ -401,29 +447,41 @@ function InventoriesEdit ($scope, $location, $routeParams, $compile, GenerateLis
if ($scope.removeGroupDeleteCompleted) { if ($scope.removeGroupDeleteCompleted) {
$scope.removeGroupDeleteCompleted(); $scope.removeGroupDeleteCompleted();
} }
$scope.removeGroupDeleteCompleted = $scope.$on('GroupDeleteCompleted', function(e) { $scope.removeGroupDeleteCompleted = $scope.$on('GroupDeleteCompleted', function () {
$scope.selected_tree_id = 1; $scope.selected_tree_id = 1;
$scope.selected_group_id = null; $scope.selected_group_id = null;
BuildTree({ scope: $scope, inventory_id: $scope.inventory_id, refresh: true }); BuildTree({
scope: $scope,
inventory_id: $scope.inventory_id,
refresh: true
});
}); });
// Respond to a group drag-n-drop // Respond to a group drag-n-drop
if ($scope.removeCopMoveGroup) { if ($scope.removeCopMoveGroup) {
$scope.removeCopyMoveGroup(); $scope.removeCopyMoveGroup();
} }
$scope.removeCopyMoveGroup = $scope.$on('CopyMoveGroup', function(e, inbound_tree_id, target_tree_id) { $scope.removeCopyMoveGroup = $scope.$on('CopyMoveGroup', function (e, inbound_tree_id, target_tree_id) {
CopyMoveGroup({ scope: $scope, target_tree_id: target_tree_id, inbound_tree_id: inbound_tree_id }); CopyMoveGroup({
scope: $scope,
target_tree_id: target_tree_id,
inbound_tree_id: inbound_tree_id
});
}); });
// Respond to a host drag-n-drop // Respond to a host drag-n-drop
if ($scope.removeCopMoveHost) { if ($scope.removeCopMoveHost) {
$scope.removeCopyMoveHost(); $scope.removeCopyMoveHost();
} }
$scope.removeCopyMoveHost = $scope.$on('CopyMoveHost', function(e, target_tree_id, host_id) { $scope.removeCopyMoveHost = $scope.$on('CopyMoveHost', function (e, target_tree_id, host_id) {
CopyMoveHost({ scope: $scope, target_tree_id: target_tree_id, host_id: host_id }); CopyMoveHost({
scope: $scope,
target_tree_id: target_tree_id,
host_id: host_id
});
}); });
$scope.showHosts = function(tree_id, group_id, show_failures) { $scope.showHosts = function (tree_id, group_id, show_failures) {
// Clicked on group // Clicked on group
if (tree_id !== null) { if (tree_id !== null) {
Wait('start'); Wait('start');
@@ -431,48 +489,59 @@ function InventoriesEdit ($scope, $location, $routeParams, $compile, GenerateLis
$scope.selected_group_id = group_id; $scope.selected_group_id = group_id;
$scope.hosts = []; $scope.hosts = [];
$scope.show_failures = show_failures; // turn on failed hosts filter in hosts view $scope.show_failures = show_failures; // turn on failed hosts filter in hosts view
for (var i=0; i < $scope.groups.length; i++) { for (var i = 0; i < $scope.groups.length; i++) {
if ($scope.groups[i].id == tree_id) { if ($scope.groups[i].id === tree_id) {
$scope.groups[i].selected_class = 'selected'; $scope.groups[i].selected_class = 'selected';
$scope.groups[i].active_class = 'active-row'; $scope.groups[i].active_class = 'active-row';
$scope.selected_group_name = $scope.groups[i].name; $scope.selected_group_name = $scope.groups[i].name;
} } else {
else {
$scope.groups[i].selected_class = ''; $scope.groups[i].selected_class = '';
$scope.groups[i].active_class = ''; $scope.groups[i].active_class = '';
} }
} }
HostsReload({ scope: $scope, group_id: group_id, tree_id: tree_id, inventory_id: $scope.inventory_id }); HostsReload({
} scope: $scope,
else { group_id: group_id,
tree_id: tree_id,
inventory_id: $scope.inventory_id
});
} else {
Wait('stop'); Wait('stop');
} }
} };
$scope.createGroup = function() { $scope.createGroup = function () {
GroupsAdd({ scope: $scope, inventory_id: $scope.inventory_id, group_id: $scope.selected_group_id }); GroupsAdd({
} scope: $scope,
inventory_id: $scope.inventory_id,
group_id: $scope.selected_group_id
});
};
$scope.editGroup = function(group_id, tree_id) { $scope.editGroup = function (group_id, tree_id) {
GroupsEdit({ scope: $scope, inventory_id: $scope.inventory_id, group_id: group_id, tree_id: tree_id, groups_reload: true }); GroupsEdit({
} scope: $scope,
inventory_id: $scope.inventory_id,
group_id: group_id,
tree_id: tree_id,
groups_reload: true
});
};
// Launch inventory sync // Launch inventory sync
$scope.updateGroup = function(id) { $scope.updateGroup = function (id) {
var group = Find({ list: $scope.groups, key: 'id', val: id}); var group = Find({ list: $scope.groups, key: 'id', val: id });
if (group) { if (group) {
if (Empty(group.source)) { if (Empty(group.source)) {
// if no source, do nothing. // if no source, do nothing.
} } else if (group.status === 'updating') {
else if (group.status == 'updating') {
Alert('Update in Progress', 'The inventory update process is currently running for group <em>' + Alert('Update in Progress', 'The inventory update process is currently running for group <em>' +
$scope.groups[i].name + '</em>. Use the Refresh button to monitor the status.', 'alert-info'); group.name + '</em>. Use the Refresh button to monitor the status.', 'alert-info');
} } else {
else {
Wait('start'); Wait('start');
Rest.setUrl(group.related.inventory_source); Rest.setUrl(group.related.inventory_source);
Rest.get() Rest.get()
.success( function(data, status, headers, config) { .success(function (data) {
InventoryUpdate({ InventoryUpdate({
scope: $scope, scope: $scope,
url: data.related.update, url: data.related.update,
@@ -482,105 +551,160 @@ function InventoriesEdit ($scope, $location, $routeParams, $compile, GenerateLis
group_id: group.group_id group_id: group.group_id
}); });
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
Wait('stop'); Wait('stop');
ProcessErrors(scope, data, status, form, ProcessErrors($scope, data, status, null, { hdr: 'Error!', msg: 'Failed to retrieve inventory source: ' +
{ hdr: 'Error!', msg: 'Failed to retrieve inventory source: ' + group.related.inventory_source + group.related.inventory_source + ' POST returned status: ' + status });
' POST returned status: ' + status });
}); });
} }
} }
} };
$scope.cancelUpdate = function(tree_id) { $scope.cancelUpdate = function (tree_id) {
GroupsCancelUpdate({ scope: $scope, tree_id: tree_id }); GroupsCancelUpdate({
} scope: $scope,
tree_id: tree_id
});
};
$scope.toggle = function(tree_id) { $scope.toggle = function (tree_id) {
// Expand/collapse nodes // Expand/collapse nodes
ToggleChildren({ scope: $scope, list: list, id: tree_id }); ToggleChildren({
} scope: $scope,
list: list,
id: tree_id
});
};
$scope.refreshGroups = function(tree_id, group_id) { $scope.refreshGroups = function (tree_id, group_id) {
// Refresh the tree data when refresh button cicked // Refresh the tree data when refresh button cicked
if (tree_id) { if (tree_id) {
$scope.selected_tree_id = tree_id; $scope.selected_tree_id = tree_id;
$scope.selected_group_id = group_id; $scope.selected_group_id = group_id;
} }
BuildTree({ scope: $scope, inventory_id: $scope.inventory_id, refresh: true }); BuildTree({
} scope: $scope,
inventory_id: $scope.inventory_id,
refresh: true
});
};
$scope.viewUpdateStatus = function(tree_id, group_id) { $scope.viewUpdateStatus = function (tree_id, group_id) {
ViewUpdateStatus({ scope: $scope, tree_id: tree_id, group_id: group_id }); ViewUpdateStatus({
} scope: $scope,
tree_id: tree_id,
group_id: group_id
});
};
$scope.deleteGroup = function(tree_id, group_id) { $scope.deleteGroup = function (tree_id, group_id) {
GroupsDelete({ scope: $scope, tree_id: tree_id, group_id: group_id, inventory_id: $scope.inventory_id }); GroupsDelete({
} scope: $scope,
tree_id: tree_id,
group_id: group_id,
inventory_id: $scope.inventory_id
});
};
$scope.createHost = function() { $scope.createHost = function () {
HostsCreate({ scope: $scope }); HostsCreate({
} scope: $scope
});
};
$scope.editInventoryProperties = function() { $scope.editInventoryProperties = function () {
EditInventoryProperties({ scope: $scope, inventory_id: $scope.inventory_id }); EditInventoryProperties({
} scope: $scope,
inventory_id: $scope.inventory_id
});
};
$scope.editHost = function(host_id) { $scope.editHost = function (host_id) {
HostsEdit({ scope: $scope, host_id: host_id, inventory_id: $scope.inventory_id }); HostsEdit({
} scope: $scope,
host_id: host_id,
inventory_id: $scope.inventory_id
});
};
$scope.deleteHost = function(host_id, host_name) { $scope.deleteHost = function (host_id, host_name) {
HostsDelete({ scope: $scope, host_id: host_id, host_name: host_name }); HostsDelete({
} scope: $scope,
host_id: host_id,
host_name: host_name
});
};
$scope.toggleHostEnabled = function(host_id, external_source) { $scope.toggleHostEnabled = function (host_id, external_source) {
ToggleHostEnabled({ scope: $scope, host_id: host_id, external_source: external_source }); ToggleHostEnabled({
} scope: $scope,
host_id: host_id,
external_source: external_source
});
};
$scope.showGroupActivity = function() { $scope.showGroupActivity = function () {
var url, title, group; var url, title, group;
if ($scope.selected_group_id) { if ($scope.selected_group_id) {
group = Find({ list: $scope.groups, key: 'id', val: $scope.selected_tree_id }); group = Find({
list: $scope.groups,
key: 'id',
val: $scope.selected_tree_id
});
url = GetBasePath('activity_stream') + '?group__id=' + $scope.selected_group_id; url = GetBasePath('activity_stream') + '?group__id=' + $scope.selected_group_id;
title = 'Showing all activities for group ' + group.name; title = 'Showing all activities for group ' + group.name;
} } else {
else {
title = 'Showing all activities for all ' + $scope.inventory_name + ' groups'; title = 'Showing all activities for all ' + $scope.inventory_name + ' groups';
url = GetBasePath('activity_stream') + '?group__inventory__id=' + $scope.inventory_id; url = GetBasePath('activity_stream') + '?group__inventory__id=' + $scope.inventory_id;
} }
Stream({ scope: $scope, inventory_name: $scope.inventory_name, url: url, title: title }); Stream({
} scope: $scope,
inventory_name: $scope.inventory_name,
url: url,
title: title
});
};
$scope.showHostActivity = function() { $scope.showHostActivity = function () {
var url, title; var url, title;
title = 'Showing all activities for all ' + $scope.inventory_name + ' hosts'; title = 'Showing all activities for all ' + $scope.inventory_name + ' hosts';
url = GetBasePath('activity_stream') + '?host__inventory__id=' + $scope.inventory_id; url = GetBasePath('activity_stream') + '?host__inventory__id=' + $scope.inventory_id;
Stream({ scope: $scope, inventory_name: $scope.inventory_name, url: url, title: title }); Stream({
} scope: $scope,
inventory_name: $scope.inventory_name,
url: url,
title: title
});
};
$scope.showJobSummary = function(job_id) { $scope.showJobSummary = function (job_id) {
ShowJobSummary({ job_id: job_id }); ShowJobSummary({
} job_id: job_id
});
};
$scope.showGroupHelp = function(params) { $scope.showGroupHelp = function (params) {
var opts = { defn: InventoryGroupsHelp }; var opts = {
defn: InventoryGroupsHelp
};
if (params) { if (params) {
opts.autoShow = params.autoShow || false; opts.autoShow = params.autoShow || false;
} }
HelpDialog(opts); HelpDialog(opts);
} };
//Load tree data for the first time //Load tree data for the first time
BuildTree({ scope: $scope, inventory_id: $scope.inventory_id, refresh: false }); BuildTree({
scope: $scope,
inventory_id: $scope.inventory_id,
refresh: false
});
} }
InventoriesEdit.$inject = [ '$scope', '$location', '$routeParams', '$compile', 'GenerateList', 'ClearScope', 'InventoryGroups', 'InventoryHosts',
'BuildTree', 'Wait', 'GetSyncStatusMsg', 'InjectHosts', 'HostsReload', 'GroupsAdd', 'GroupsEdit', 'GroupsDelete',
'Breadcrumbs', 'LoadBreadCrumbs', 'Empty', 'Rest', 'ProcessErrors', 'InventoryUpdate', 'Alert', 'ToggleChildren',
'ViewUpdateStatus', 'GroupsCancelUpdate', 'Find', 'HostsCreate', 'EditInventoryProperties', 'HostsEdit',
'HostsDelete', 'ToggleHostEnabled', 'CopyMoveGroup', 'CopyMoveHost', 'Stream', 'GetBasePath', 'ShowJobSummary',
'ApplyEllipsis', 'WatchInventoryWindowResize', 'HelpDialog', 'InventoryGroupsHelp', 'Store'
];
InventoriesEdit.$inject = ['$scope', '$location', '$routeParams', '$compile', 'GenerateList', 'ClearScope', 'InventoryGroups', 'InventoryHosts',
'BuildTree', 'Wait', 'GetSyncStatusMsg', 'InjectHosts', 'HostsReload', 'GroupsAdd', 'GroupsEdit', 'GroupsDelete', 'Breadcrumbs',
'LoadBreadCrumbs', 'Empty', 'Rest', 'ProcessErrors', 'InventoryUpdate', 'Alert', 'ToggleChildren', 'ViewUpdateStatus', 'GroupsCancelUpdate',
'Find', 'HostsCreate', 'EditInventoryProperties', 'HostsEdit', 'HostsDelete', 'ToggleHostEnabled', 'CopyMoveGroup', 'CopyMoveHost',
'Stream', 'GetBasePath', 'ShowJobSummary', 'ApplyEllipsis', 'WatchInventoryWindowResize', 'HelpDialog', 'InventoryGroupsHelp', 'Store'
];

View File

@@ -10,21 +10,19 @@
'use strict'; 'use strict';
function JobEventsList ($filter, $scope, $rootScope, $location, $log, $routeParams, Rest, Alert, JobEventList, function JobEventsList($filter, $scope, $rootScope, $location, $log, $routeParams, Rest, Alert, JobEventList, GenerateList,
GenerateList, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit, ReturnToCaller, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit, ReturnToCaller, ClearScope, ProcessErrors, GetBasePath, LookUpInit, ToggleChildren,
ClearScope, ProcessErrors, GetBasePath, LookUpInit, ToggleChildren, FormatDate, EventView, Refresh, Wait) {
FormatDate, EventView, Refresh, Wait)
{
ClearScope('htmlTemplate'); ClearScope('htmlTemplate');
var list = JobEventList;
var list = JobEventList,
defaultUrl = GetBasePath('jobs') + $routeParams.id + '/job_events/', //?parent__isnull=1';
view = GenerateList,
scope = view.inject(list, { mode: 'edit' }),
page;
list.base = $location.path(); list.base = $location.path();
var defaultUrl = GetBasePath('jobs') + $routeParams.id + '/job_events/'; //?parent__isnull=1';
var view = GenerateList;
var base = $location.path().replace(/^\//,'').split('/')[0];
var scope = view.inject(list, { mode: 'edit' });
scope.job_id = $routeParams.id; scope.job_id = $routeParams.id;
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
scope.selected = []; scope.selected = [];
@@ -36,23 +34,25 @@ function JobEventsList ($filter, $scope, $rootScope, $location, $log, $routePara
if (scope.removeSetHostLinks) { if (scope.removeSetHostLinks) {
scope.removeSetHostLinks(); scope.removeSetHostLinks();
} }
scope.removeSetHostLinks = scope.$on('SetHostLinks', function(e, inventory_id) { scope.removeSetHostLinks = scope.$on('SetHostLinks', function (e, inventory_id) {
for (var i=0; i < scope.jobevents.length; i++) { for (var i = 0; i < scope.jobevents.length; i++) {
if (scope.jobevents[i].summary_fields.host) { if (scope.jobevents[i].summary_fields.host) {
scope.jobevents[i].hostLink = "/#/inventories/" + inventory_id + "/hosts/?name=" + scope.jobevents[i].hostLink = "/#/inventories/" + inventory_id + "/hosts/?name=" +
escape(scope.jobevents[i].summary_fields.host.name); encodeURI(scope.jobevents[i].summary_fields.host.name);
} }
} }
}); });
function formatJSON(eventData) { function formatJSON(eventData) {
//turn JSON event data into an html form //turn JSON event data into an html form
var html = '';
if (eventData['res']) { var i, n, rows, fld, txt,
var n, rows; html = '',
var found = false; found = false;
if (typeof eventData.res == 'string') {
n = eventData['res'].match(/\n/g); if (eventData.res) {
if (typeof eventData.res === 'string') {
n = eventData.res.match(/\n/g);
rows = (n) ? n.length : 1; rows = (n) ? n.length : 1;
rows = (rows > 10) ? 10 : rows; rows = (rows > 10) ? 10 : rows;
found = true; found = true;
@@ -60,14 +60,13 @@ function JobEventsList ($filter, $scope, $rootScope, $location, $log, $routePara
html += "<label>Traceback:</label>\n"; html += "<label>Traceback:</label>\n";
html += "<textarea readonly class=\"form-control nowrap\" rows=\"" + rows + "\">" + eventData.res + "</textarea>\n"; html += "<textarea readonly class=\"form-control nowrap\" rows=\"" + rows + "\">" + eventData.res + "</textarea>\n";
html += "</div>\n"; html += "</div>\n";
} } else {
else { for (fld in eventData.res) {
for (var fld in eventData.res) { if ((fld === 'msg' || fld === 'stdout' || fld === 'stderr') &&
if ( (fld == 'msg' || fld == 'stdout' || fld == 'stderr') && (eventData.res[fld] !== null && eventData.res[fld] !== '')) {
(eventData.res[fld] !== null && eventData.res[fld] !== '') ) {
html += "<div class=\"form-group\">\n"; html += "<div class=\"form-group\">\n";
html += "<label>"; html += "<label>";
switch(fld) { switch (fld) {
case 'msg': case 'msg':
case 'stdout': case 'stdout':
html += 'Output:'; html += 'Output:';
@@ -77,17 +76,17 @@ function JobEventsList ($filter, $scope, $rootScope, $location, $log, $routePara
break; break;
} }
html += "</label>\n"; html += "</label>\n";
n = eventData['res'][fld].match(/\n/g); n = eventData.res[fld].match(/\n/g);
rows = (n) ? n.length : 1; rows = (n) ? n.length : 1;
rows = (rows > 10) ? 10 : rows; rows = (rows > 10) ? 10 : rows;
html += "<textarea readonly class=\"form-control nowrap\" rows=\"" + rows + "\">" + eventData.res[fld] + "</textarea>\n"; html += "<textarea readonly class=\"form-control nowrap\" rows=\"" + rows + "\">" + eventData.res[fld] + "</textarea>\n";
html += "</div>\n"; html += "</div>\n";
found = true; found = true;
} }
if ( fld == "results" && Array.isArray(eventData.res[fld]) && eventData.res[fld].length > 0 ) { if (fld === "results" && Array.isArray(eventData.res[fld]) && eventData.res[fld].length > 0) {
//html += "<textarea readonly class=" //html += "<textarea readonly class="
var txt = ''; txt = '';
for (var i=0; i < eventData.res[fld].length; i++) { for (i = 0; i < eventData.res[fld].length; i++) {
txt += eventData.res[fld][i]; txt += eventData.res[fld][i];
} }
n = txt.match(/\n/g); n = txt.match(/\n/g);
@@ -101,7 +100,7 @@ function JobEventsList ($filter, $scope, $rootScope, $location, $log, $routePara
found = true; found = true;
} }
} }
if (fld == "rc" && eventData.res[fld] != '') { if (fld === "rc" && eventData.res[fld] !== '') {
html += "<div class=\"form-group\">\n"; html += "<div class=\"form-group\">\n";
html += "<label>Return Code:</label>\n"; html += "<label>Return Code:</label>\n";
html += "<input type=\"text\" class=\"form-control nowrap mono-space\" value=\"" + eventData.res[fld] + "\" readonly >\n"; html += "<input type=\"text\" class=\"form-control nowrap mono-space\" value=\"" + eventData.res[fld] + "\" readonly >\n";
@@ -112,11 +111,10 @@ function JobEventsList ($filter, $scope, $rootScope, $location, $log, $routePara
} }
html = (found) ? "<form class=\"event-form\">\n" + html + "</form>\n" : ''; html = (found) ? "<form class=\"event-form\">\n" + html + "</form>\n" : '';
} }
if (eventData['host']) { if (eventData.hosts) {
html = "<span class=\"event-detail-host visible-sm\">" + eventData['host'] + "</span>\n" + html; html = "<span class=\"event-detail-host visible-sm\">" + eventData.host + "</span>\n" + html;
} } else {
else { html = (html === '') ? null : html;
html = (html == '' ) ? null : html;
} }
return html; return html;
} }
@@ -124,57 +122,47 @@ function JobEventsList ($filter, $scope, $rootScope, $location, $log, $routePara
if (scope.removePostRefresh) { if (scope.removePostRefresh) {
scope.removePostRefresh(); scope.removePostRefresh();
} }
scope.removePostRefresh = scope.$on('PostRefresh', function() { scope.removePostRefresh = scope.$on('PostRefresh', function () {
// Initialize the parent levels // Initialize the parent levels
var set = scope[list.name]; var set = scope[list.name], i;
var cDate; for (i = 0; i < set.length; i++) {
for (var i=0; i < set.length; i++) { set[i].event_display = set[i].event_display.replace(/^\u00a0*/g, '');
set[i].event_display = set[i].event_display.replace(/^\u00a0*/g,''); if (set[i].event_level < 3) {
if (set[i].event_level < 3 ) { set[i].ngclick = "toggleChildren(" + set[i].id + ", \"" + set[i].related.children + "\")";
set[i]['ngclick'] = "toggleChildren(" + set[i].id + ", \"" + set[i].related.children + "\")"; set[i].ngicon = 'fa fa-minus-square-o node-toggle';
set[i]['ngicon'] = 'fa fa-minus-square-o node-toggle';
set[i]['class'] = 'parentNode'; set[i]['class'] = 'parentNode';
} } else {
else { set[i].ngicon = 'fa fa-square-o node-no-toggle';
set[i]['ngicon'] = 'fa fa-square-o node-no-toggle';
set[i]['class'] = 'childNode'; set[i]['class'] = 'childNode';
set[i]['event_detail'] = formatJSON(set[i].event_data); set[i].event_detail = formatJSON(set[i].event_data);
} }
set[i]['show'] = true; set[i].show = true;
set[i]['spaces'] = set[i].event_level * 24; set[i].spaces = set[i].event_level * 24;
if (scope.jobevents[i].failed) { if (scope.jobevents[i].failed) {
scope.jobevents[i].status = 'error'; scope.jobevents[i].status = 'error';
if (i == set.length - 1) { if (i === set.length - 1) {
scope.jobevents[i].statusBadgeToolTip = "A failure occurred durring one or more playbook tasks."; scope.jobevents[i].statusBadgeToolTip = "A failure occurred durring one or more playbook tasks.";
} } else if (set[i].event_level < 3) {
else if (set[i].event_level < 3) {
scope.jobevents[i].statusBadgeToolTip = "A failure occurred within the children of this event."; scope.jobevents[i].statusBadgeToolTip = "A failure occurred within the children of this event.";
} } else {
else {
scope.jobevents[i].statusBadgeToolTip = "A failure occurred. Click to view details"; scope.jobevents[i].statusBadgeToolTip = "A failure occurred. Click to view details";
} }
} } else if (scope.jobevents[i].changed) {
else if (scope.jobevents[i].changed) {
scope.jobevents[i].status = 'changed'; scope.jobevents[i].status = 'changed';
if (i == set.length - 1) { if (i === set.length - 1) {
scope.jobevents[i].statusBadgeToolTip = "A change was completed durring one or more playbook tasks."; scope.jobevents[i].statusBadgeToolTip = "A change was completed durring one or more playbook tasks.";
} } else if (set[i].event_level < 3) {
else if (set[i].event_level < 3) {
scope.jobevents[i].statusBadgeToolTip = "A change was completed by one or more children of this event."; scope.jobevents[i].statusBadgeToolTip = "A change was completed by one or more children of this event.";
} } else {
else {
scope.jobevents[i].statusBadgeToolTip = "A change was completed. Click to view details"; scope.jobevents[i].statusBadgeToolTip = "A change was completed. Click to view details";
} }
} } else {
else {
scope.jobevents[i].status = 'success'; scope.jobevents[i].status = 'success';
if (i == set.length - 1) { if (i === set.length - 1) {
scope.jobevents[i].statusBadgeToolTip = "All playbook tasks completed successfully."; scope.jobevents[i].statusBadgeToolTip = "All playbook tasks completed successfully.";
} } else if (set[i].event_level < 3) {
else if (set[i].event_level < 3) {
scope.jobevents[i].statusBadgeToolTip = "All the children of this event completed successfully."; scope.jobevents[i].statusBadgeToolTip = "All the children of this event completed successfully.";
} } else {
else {
scope.jobevents[i].statusBadgeToolTip = "No errors occurred. Click to view details"; scope.jobevents[i].statusBadgeToolTip = "No errors occurred. Click to view details";
} }
} }
@@ -187,101 +175,119 @@ function JobEventsList ($filter, $scope, $rootScope, $location, $log, $routePara
// from job in the event that there are no job event records // from job in the event that there are no job event records
Rest.setUrl(GetBasePath('jobs') + scope.job_id); Rest.setUrl(GetBasePath('jobs') + scope.job_id);
Rest.get() Rest.get()
.success( function(data, status, headers, config) { .success(function (data) {
scope.job_status = data.status; scope.job_status = data.status;
scope.job_name = data.summary_fields.job_template.name; scope.job_name = data.summary_fields.job_template.name;
LoadBreadCrumbs({ path: '/jobs/' + scope.job_id, title: scope.job_id + ' - ' + data.summary_fields.job_template.name }); LoadBreadCrumbs({
path: '/jobs/' + scope.job_id,
title: scope.job_id + ' - ' + data.summary_fields.job_template.name
});
scope.$emit('SetHostLinks', data.inventory); scope.$emit('SetHostLinks', data.inventory);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, {
{ hdr: 'Error!', msg: 'Failed to get job status for job: ' + scope.job_id + '. GET status: ' + status }); hdr: 'Error!',
msg: 'Failed to get job status for job: ' + scope.job_id + '. GET status: ' + status
});
}); });
}); });
SearchInit({ scope: scope, set: 'jobevents', list: list, url: defaultUrl }); SearchInit({
scope: scope,
set: 'jobevents',
list: list,
url: defaultUrl
});
var page = ($routeParams.page) ? parseInt($routeParams.page) - 1 : null; page = ($routeParams.page) ? parseInt($routeParams.page,10) - 1 : null;
PaginateInit({ scope: scope, list: list, url: defaultUrl, page: page }); PaginateInit({
scope: scope,
list: list,
url: defaultUrl,
page: page
});
// Called from Inventories tab, host failed events link: // Called from Inventories tab, host failed events link:
if ($routeParams.host) { if ($routeParams.host) {
scope[list.iterator + 'SearchField'] = 'host'; scope[list.iterator + 'SearchField'] = 'host';
scope[list.iterator + 'SearchValue'] = $routeParams.host; scope[list.iterator + 'SearchValue'] = $routeParams.host;
scope[list.iterator + 'SearchFieldLabel'] = list.fields['host'].label; scope[list.iterator + 'SearchFieldLabel'] = list.fields.host.label;
} }
scope.search(list.iterator, $routeParams.page); scope.search(list.iterator, $routeParams.page);
scope.toggleChildren = function(id, children) { scope.toggleChildren = function (id, children) {
ToggleChildren({ ToggleChildren({
scope: scope, scope: scope,
list: list, list: list,
id: id, id: id,
children: children children: children
}); });
} };
scope.viewJobEvent = function(id) { scope.viewJobEvent = function (id) {
EventView({ event_id: id }); EventView({
} event_id: id
});
};
scope.refresh = function() { scope.refresh = function () {
scope['jobSearchSpin'] = true; scope.jobSearchSpin = true;
scope['jobLoading'] = true; scope.jobLoading = true;
Wait('start'); Wait('start');
Refresh({ scope: scope, set: 'jobevents', iterator: 'jobevent', url: scope['current_url'] }); Refresh({
} scope: scope,
set: 'jobevents',
iterator: 'jobevent',
url: scope.current_url
});
};
} }
JobEventsList.$inject = [ '$filter', '$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'JobEventList', JobEventsList.$inject = ['$filter', '$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'JobEventList',
'GenerateList', 'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'ClearScope', 'GenerateList', 'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'ClearScope',
'ProcessErrors','GetBasePath', 'LookUpInit', 'ToggleChildren', 'FormatDate', 'EventView', 'Refresh', 'Wait' 'ProcessErrors', 'GetBasePath', 'LookUpInit', 'ToggleChildren', 'FormatDate', 'EventView', 'Refresh', 'Wait'
]; ];
function JobEventsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams, JobEventForm, GenerateForm, function JobEventsEdit($scope, $rootScope, $compile, $location, $log, $routeParams, JobEventForm, GenerateForm,
Rest, Alert, ProcessErrors, LoadBreadCrumbs, ClearScope, GetBasePath, FormatDate, EventView, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ClearScope, GetBasePath, FormatDate, EventView,
Wait) Wait) {
{
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.
// Inject dynamic view // Inject dynamic view
var form = JobEventForm; var form = JobEventForm,
var generator = GenerateForm; generator = GenerateForm,
var scope = GenerateForm.inject(form, {mode: 'edit', related: true}); scope = GenerateForm.inject(form, { mode: 'edit', related: true }),
generator.reset(); defaultUrl = GetBasePath('base') + 'job_events/' + $routeParams.event_id + '/';
var defaultUrl = GetBasePath('base') + 'job_events/' + $routeParams.event_id + '/'; generator.reset();
var base = $location.path().replace(/^\//,'').split('/')[0];
// Retrieve detail record and prepopulate the form // Retrieve detail record and prepopulate the form
Wait('start'); Wait('start');
Rest.setUrl(defaultUrl); Rest.setUrl(defaultUrl);
Rest.get() Rest.get()
.success( function(data, status, headers, config) { .success(function (data) {
scope['event_display'] = data['event_display'].replace(/^\u00a0*/g,''); var cDate, fld, n, rows;
LoadBreadCrumbs({ path: '/jobs/' + $routeParams.job_id + '/job_events/' + $routeParams.event_id, scope.event_display = data.event_display.replace(/^\u00a0*/g, '');
title: scope['event_display'] }); LoadBreadCrumbs({ path: '/jobs/' + $routeParams.job_id + '/job_events/' + $routeParams.event_id, title: scope.event_display });
for (var fld in form.fields) { for (fld in form.fields) {
switch(fld) { switch (fld) {
case 'status': case 'status':
if (data['failed']) { if (data.failed) {
scope['status'] = 'error'; scope.status = 'error';
} } else if (data.changed) {
else if (data['changed']) { scope.status = 'changed';
scope['status'] = 'changed'; } else {
} scope.status = 'success';
else {
scope['status'] = 'success';
} }
break; break;
case 'created': case 'created':
var cDate = new Date(data['created']); cDate = new Date(data.created);
scope['created'] = FormatDate(cDate); scope.created = FormatDate(cDate);
break; break;
case 'host': case 'host':
if (data['summary_fields'] && data['summary_fields']['host']) { if (data.summary_fields && data.summary_fields.host) {
scope['host'] = data['summary_fields']['host']['name']; scope.host = data.summary_fields.host.name;
} }
break; break;
case 'id': case 'id':
@@ -291,8 +297,8 @@ function JobEventsEdit ($scope, $rootScope, $compile, $location, $log, $routePar
break; break;
case 'start': case 'start':
case 'end': case 'end':
if (data['event_data'] && data['event_data']['res'] && data['event_data']['res'][fld] !== undefined) { if (data.event_data && data.event_data.res && data.event_data.res[fld] !== undefined) {
var cDate = new Date(data['event_data']['res'][fld]); cDate = new Date(data.event_data.res[fld]);
scope[fld] = FormatDate(cDate); scope[fld] = FormatDate(cDate);
} }
break; break;
@@ -301,46 +307,48 @@ function JobEventsEdit ($scope, $rootScope, $compile, $location, $log, $routePar
case 'stderr': case 'stderr':
case 'delta': case 'delta':
case 'rc': case 'rc':
if (data['event_data'] && data['event_data']['res'] && data['event_data']['res'][fld] !== undefined) { if (data.event_data && data.event_data.res && data.event_data.res[fld] !== undefined) {
scope[fld] = data['event_data']['res'][fld]; scope[fld] = data.event_data.res[fld];
if (form.fields[fld].type == 'textarea') { if (form.fields[fld].type === 'textarea') {
var n = data['event_data']['res'][fld].match(/\n/g); n = data.event_data.res[fld].match(/\n/g);
var rows = (n) ? n.length : 1; rows = (n) ? n.length : 1;
rows = (rows > 15) ? 5 : rows; rows = (rows > 15) ? 5 : rows;
$('textarea[name="' + fld + '"]').attr('rows',rows); $('textarea[name="' + fld + '"]').attr('rows', rows);
} }
} }
break; break;
case 'module_name': case 'module_name':
case 'module_args': case 'module_args':
if (data['event_data']['res'] && data['event_data']['res']['invocation']) { if (data.event_data.res && data.event_data.res.invocation) {
scope[fld] = data['event_data']['res']['invocation'][fld]; scope[fld] = data.event_data.res.invocation.fld;
} }
break; break;
} }
} }
Wait('stop'); Wait('stop');
}) })
.error( function(data, status, headers, config) { .error(function (data) {
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, { hdr: 'Error!', msg: 'Failed to retrieve host: ' + $routeParams.event_id +
{ hdr: 'Error!', msg: 'Failed to retrieve host: ' + $routeParams.event_id + '. GET status: ' + status }); '. GET status: ' + status });
}); });
scope.navigateBack = function() { scope.navigateBack = function () {
var url = '/jobs/' + $routeParams.job_id + '/job_events'; var url = '/jobs/' + $routeParams.job_id + '/job_events';
if ($routeParams.page) { if ($routeParams.page) {
url += '?page=' + $routeParams.page; url += '?page=' + $routeParams.page;
} }
$location.url(url); $location.url(url);
} };
scope.rawView = function() { scope.rawView = function () {
EventView({"event_id": scope.id }); EventView({
} "event_id": scope.id
});
};
} }
JobEventsEdit.$inject = [ '$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'JobEventForm', JobEventsEdit.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'JobEventForm',
'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ClearScope', 'GetBasePath', 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ClearScope', 'GetBasePath', 'FormatDate',
'FormatDate', 'EventView', 'Wait' 'EventView', 'Wait'
]; ];

View File

@@ -10,35 +10,32 @@
'use strict'; 'use strict';
function JobHostSummaryList ($scope, $rootScope, $location, $log, $routeParams, Rest, Alert, JobHostList, function JobHostSummaryList($scope, $rootScope, $location, $log, $routeParams, Rest, Alert, JobHostList, GenerateList,
GenerateList, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit, ReturnToCaller, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit, ReturnToCaller, ClearScope, ProcessErrors, GetBasePath, Refresh,
ClearScope, ProcessErrors, GetBasePath, Refresh, JobStatusToolTip, Wait) JobStatusToolTip, Wait) {
{
ClearScope('htmlTemplate'); ClearScope('htmlTemplate');
var list = JobHostList;
var base = $location.path().replace(/^\//,'').split('/')[0]; var list = JobHostList,
var defaultUrl = GetBasePath(base) + $routeParams.id + '/job_host_summaries/'; base = $location.path().replace(/^\//, '').split('/')[0],
var inventory_id; defaultUrl = GetBasePath(base) + $routeParams.id + '/job_host_summaries/',
view = GenerateList,
scope = view.inject(list, { mode: 'edit' });
// When viewing all summaries for a particular host, show job ID, otherwise row ID. // When viewing all summaries for a particular host, show job ID, otherwise row ID.
if (base == 'hosts') { if (base === 'hosts') {
list.index = false; list.index = false;
} } else {
else {
list.index = true; list.index = true;
} }
var view = GenerateList;
var scope = view.inject(list, { mode: 'edit' });
scope.selected = []; scope.selected = [];
// control enable/disable/show of job specific view elements // control enable/disable/show of job specific view elements
if (base == 'hosts') { if (base === 'hosts') {
scope.job_id = null; scope.job_id = null;
scope.host_id = $routeParams.id; scope.host_id = $routeParams.id;
} } else {
else {
scope.job_id = $routeParams.id; scope.job_id = $routeParams.id;
scope.host_id = null; scope.host_id = null;
} }
@@ -46,10 +43,10 @@ function JobHostSummaryList ($scope, $rootScope, $location, $log, $routeParams,
if (scope.RemoveSetHostLink) { if (scope.RemoveSetHostLink) {
scope.RemoveSetHostLink(); scope.RemoveSetHostLink();
} }
scope.RemoveSetHostLink = scope.$on('setHostLink', function(e, inventory_id) { scope.RemoveSetHostLink = scope.$on('setHostLink', function (e, inventory_id) {
for (var i=0; i < scope.jobhosts.length; i++) { for (var i = 0; i < scope.jobhosts.length; i++) {
scope.jobhosts[i].hostLinkTo = '/#/inventories/' + inventory_id + '/?host_name=' + scope.jobhosts[i].hostLinkTo = '/#/inventories/' + inventory_id + '/?host_name=' +
escape(scope.jobhosts[i].summary_fields.host.name); encodeURI(scope.jobhosts[i].summary_fields.host.name);
} }
}); });
@@ -57,91 +54,114 @@ function JobHostSummaryList ($scope, $rootScope, $location, $log, $routeParams,
if (scope.removePostRefresh) { if (scope.removePostRefresh) {
scope.removePostRefresh(); scope.removePostRefresh();
} }
scope.removePostRefresh = scope.$on('PostRefresh', function() { scope.removePostRefresh = scope.$on('PostRefresh', function () {
// Set status, tooltips, badget icons, etc. // Set status, tooltips, badget icons, etc.
for( var i=0; i < scope.jobhosts.length; i++) { for (var i = 0; i < scope.jobhosts.length; i++) {
scope.jobhosts[i].host_name = scope.jobhosts[i].summary_fields.host.name; scope.jobhosts[i].host_name = scope.jobhosts[i].summary_fields.host.name;
scope.jobhosts[i].status = (scope.jobhosts[i].failed) ? 'failed' : 'success'; scope.jobhosts[i].status = (scope.jobhosts[i].failed) ? 'failed' : 'success';
scope.jobhosts[i].statusBadgeToolTip = JobStatusToolTip(scope.jobhosts[i].status) + scope.jobhosts[i].statusBadgeToolTip = JobStatusToolTip(scope.jobhosts[i].status) +
" Click to view details."; " Click to view details.";
scope.jobhosts[i].statusLinkTo = '/#/jobs/' + scope.jobhosts[i].job + '/job_events/?host=' + scope.jobhosts[i].statusLinkTo = '/#/jobs/' + scope.jobhosts[i].job + '/job_events/?host=' +
escape(scope.jobhosts[i].summary_fields.host.name); encodeURI(scope.jobhosts[i].summary_fields.host.name);
} }
if (scope.job_id !== null && scope.job_id !== undefined && scope.job_id !== '') { if (scope.job_id !== null && scope.job_id !== undefined && scope.job_id !== '') {
// need job_status so we can show/hide refresh button // need job_status so we can show/hide refresh button
Rest.setUrl(GetBasePath('jobs') + scope.job_id); Rest.setUrl(GetBasePath('jobs') + scope.job_id);
Rest.get() Rest.get()
.success( function(data, status, headers, config) { .success(function (data) {
LoadBreadCrumbs({ path: '/jobs/' + data.id, title: data.id + ' - ' + LoadBreadCrumbs({
data.summary_fields.job_template.name }); path: '/jobs/' + data.id,
title: data.id + ' - ' +
data.summary_fields.job_template.name
});
scope.job_status = data.status; scope.job_status = data.status;
if (!(data.status == 'pending' || data.status == 'waiting' || data.status == 'running')) { if (!(data.status === 'pending' || data.status === 'waiting' || data.status === 'running')) {
if ($rootScope.timer) { if ($rootScope.timer) {
clearInterval($rootScope.timer); clearInterval($rootScope.timer);
} }
} }
scope.$emit('setHostLink', data.inventory); scope.$emit('setHostLink', data.inventory);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, {
{ hdr: 'Error!', msg: 'Failed to get job status for job: ' + scope.job_id + '. GET status: ' + status }); hdr: 'Error!',
msg: 'Failed to get job status for job: ' + scope.job_id + '. GET status: ' + status
}); });
} });
else { } else {
// Make the host name appear in breadcrumbs // Make the host name appear in breadcrumbs
LoadBreadCrumbs({ path: '/hosts/' + scope['host_id'], LoadBreadCrumbs({
title: ( (scope.jobhosts.length > 0) ? scope.jobhosts[0].summary_fields.host.name : 'Host' ) }); path: '/hosts/' + scope.host_id,
if ($routeParams['inventory']) { title: ((scope.jobhosts.length > 0) ? scope.jobhosts[0].summary_fields.host.name : 'Host')
scope.$emit('setHostLink', $routeParams['inventory']); });
if ($routeParams.inventory) {
scope.$emit('setHostLink', $routeParams.inventory);
} }
} }
}); });
SearchInit({ scope: scope, set: 'jobhosts', list: list, url: defaultUrl }); SearchInit({
PaginateInit({ scope: scope, list: list, url: defaultUrl }); scope: scope,
set: 'jobhosts',
list: list,
url: defaultUrl
});
PaginateInit({
scope: scope,
list: list,
url: defaultUrl
});
// Called from Inventories tab, host failed events link: // Called from Inventories tab, host failed events link:
if ($routeParams['host_name']) { if ($routeParams.host_name) {
scope[list.iterator + 'SearchField'] = 'host'; scope[list.iterator + 'SearchField'] = 'host';
scope[list.iterator + 'SearchValue'] = $routeParams['host_name']; scope[list.iterator + 'SearchValue'] = $routeParams.host_name;
scope[list.iterator + 'SearchFieldLabel'] = list.fields['host'].label; scope[list.iterator + 'SearchFieldLabel'] = list.fields.host.label;
} }
scope.search(list.iterator); scope.search(list.iterator);
scope.showEvents = function(host_name, last_job) { scope.showEvents = function (host_name, last_job) {
// When click on !Failed Events link, redirect to latest job/job_events for the host // When click on !Failed Events link, redirect to latest job/job_events for the host
Rest.setUrl(last_job); Rest.setUrl(last_job);
Rest.get() Rest.get()
.success( function(data, status, headers, config) { .success(function (data) {
LoadBreadCrumbs({ path: '/jobs/' + data.id, title: data.name }); LoadBreadCrumbs({
$location.url('/jobs/' + data.id + '/job_events/?host=' + escape(host_name)); path: '/jobs/' + data.id,
title: data.name
});
$location.url('/jobs/' + data.id + '/job_events/?host=' + encodeURI(host_name));
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
ProcessErrors(scope, data, status, form, ProcessErrors(scope, data, status, null, { hdr: 'Error!', msg: 'Failed to lookup last job: ' + last_job +
{ hdr: 'Error!', msg: 'Failed to lookup last job: ' + last_job + '. GET status: ' + status }); '. GET status: ' + status });
});
};
scope.showJob = function (id) {
$location.path('/jobs/' + id);
};
scope.refresh = function () {
if (scope.host_id === null) {
scope.jobSearchSpin = true;
scope.jobLoading = true;
Wait('start');
Refresh({
scope: scope,
set: 'jobhosts',
iterator: 'jobhost',
url: scope.current_url
}); });
} }
};
scope.showJob = function(id) {
$location.path('/jobs/' + id);
}
scope.refresh = function() {
if (scope.host_id == null) {
scope['jobSearchSpin'] = true;
scope['jobLoading'] = true;
Wait('start');
Refresh({ scope: scope, set: 'jobhosts', iterator: 'jobhost', url: scope['current_url'] });
}
}
} }
JobHostSummaryList.$inject = [ '$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'JobHostList', JobHostSummaryList.$inject = ['$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'JobHostList',
'GenerateList', 'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'ClearScope', 'GenerateList', 'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'ClearScope',
'ProcessErrors', 'GetBasePath', 'Refresh', 'JobStatusToolTip', 'Wait' 'ProcessErrors', 'GetBasePath', 'Refresh', 'JobStatusToolTip', 'Wait'
]; ];

View File

@@ -7,114 +7,138 @@
* Controller functions for the Job Template model. * Controller functions for the Job Template model.
* *
*/ */
'use strict'; 'use strict';
function JobTemplatesList ($scope, $rootScope, $location, $log, $routeParams, Rest, Alert, JobTemplateList, function JobTemplatesList($scope, $rootScope, $location, $log, $routeParams, Rest, Alert, JobTemplateList,
GenerateList, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit, ReturnToCaller, GenerateList, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit, ReturnToCaller,
ClearScope, ProcessErrors, GetBasePath, PromptPasswords, JobTemplateForm, CredentialList, ClearScope, ProcessErrors, GetBasePath, PromptPasswords, JobTemplateForm, CredentialList,
LookUpInit, SubmitJob, Wait, Stream) LookUpInit, SubmitJob, Wait, Stream) {
{
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 = JobTemplateList; var list = JobTemplateList,
var defaultUrl = GetBasePath('job_templates'); defaultUrl = GetBasePath('job_templates'),
var view = GenerateList; view = GenerateList,
var base = $location.path().replace(/^\//,'').split('/')[0]; base = $location.path().replace(/^\//, '').split('/')[0],
var mode = (base == 'job_templates') ? 'edit' : 'select'; mode = (base === 'job_templates') ? 'edit' : 'select',
var scope = view.inject(list, { mode: mode }); scope = view.inject(list, { mode: mode });
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
if (scope.removePostRefresh) { if (scope.removePostRefresh) {
scope.removePostRefresh(); scope.removePostRefresh();
} }
scope.removePostRefresh = scope.$on('PostRefresh', function() { scope.removePostRefresh = scope.$on('PostRefresh', function () {
// Cleanup after a delete // Cleanup after a delete
Wait('stop'); Wait('stop');
$('#prompt-modal').off(); $('#prompt-modal').off();
}); });
SearchInit({ scope: scope, set: 'job_templates', list: list, url: defaultUrl }); SearchInit({
PaginateInit({ scope: scope, list: list, url: defaultUrl }); scope: scope,
set: 'job_templates',
list: list,
url: defaultUrl
});
PaginateInit({
scope: scope,
list: list,
url: defaultUrl
});
// Called from Inventories tab, host failed events link: // Called from Inventories tab, host failed events link:
if ($routeParams['name']) { if ($routeParams.name) {
scope[list.iterator + 'SearchField'] = 'name'; scope[list.iterator + 'SearchField'] = 'name';
scope[list.iterator + 'SearchValue'] = $routeParams['name']; scope[list.iterator + 'SearchValue'] = $routeParams.name;
scope[list.iterator + 'SearchFieldLabel'] = list.fields['name'].label; scope[list.iterator + 'SearchFieldLabel'] = list.fields.name.label;
} }
scope.search(list.iterator); scope.search(list.iterator);
LoadBreadCrumbs(); LoadBreadCrumbs();
scope.showActivity = function() { Stream({ scope: scope }); } scope.showActivity = function () {
Stream({
scope: scope
});
};
scope.addJobTemplate = function() { scope.addJobTemplate = function () {
$location.path($location.path() + '/add'); $location.path($location.path() + '/add');
} };
scope.editJobTemplate = function(id) { scope.editJobTemplate = function (id) {
$location.path($location.path() + '/' + id); $location.path($location.path() + '/' + id);
} };
scope.deleteJobTemplate = function(id, name) { scope.deleteJobTemplate = function (id, name) {
var action = function() { var action = function () {
$('#prompt-modal').on('hidden.bs.modal', function(){ Wait('start'); }); $('#prompt-modal').on('hidden.bs.modal', function () {
Wait('start');
});
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
var url = defaultUrl + id + '/'; var url = defaultUrl + id + '/';
Rest.setUrl(url); Rest.setUrl(url);
Rest.destroy() Rest.destroy()
.success( function(data, status, headers, config) { .success(function () {
scope.search(list.iterator); scope.search(list.iterator);
}) })
.error( function(data, status, headers, config) { .error(function (data) {
Wait('stop'); Wait('stop');
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, {
{ hdr: 'Error!', msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status }); hdr: 'Error!',
msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status
});
}); });
}; };
Prompt({ hdr: 'Delete', Prompt({
hdr: 'Delete',
body: 'Are you sure you want to delete ' + name + '?', body: 'Are you sure you want to delete ' + name + '?',
action: action action: action
}); });
} };
scope.submitJob = function(id) { scope.submitJob = function (id) {
SubmitJob({ scope: scope, id: id }); SubmitJob({ scope: scope, id: id });
} };
} }
JobTemplatesList.$inject = [ '$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'JobTemplateList', JobTemplatesList.$inject = ['$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'JobTemplateList',
'GenerateList', 'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'ClearScope', 'GenerateList', 'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'ClearScope',
'ProcessErrors','GetBasePath', 'PromptPasswords', 'JobTemplateForm', 'CredentialList', 'LookUpInit', 'ProcessErrors', 'GetBasePath', 'PromptPasswords', 'JobTemplateForm', 'CredentialList', 'LookUpInit',
'SubmitJob', 'Wait', 'Stream' 'SubmitJob', 'Wait', 'Stream'
]; ];
function JobTemplatesAdd ($scope, $rootScope, $compile, $location, $log, $routeParams, JobTemplateForm, function JobTemplatesAdd($scope, $rootScope, $compile, $location, $log, $routeParams, JobTemplateForm,
GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ReturnToCaller, ClearScope, GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ReturnToCaller, ClearScope,
GetBasePath, InventoryList, CredentialList, ProjectList, LookUpInit, GetBasePath, InventoryList, CredentialList, ProjectList, LookUpInit,
md5Setup, ParseTypeChange, Wait, Empty) md5Setup, ParseTypeChange, Wait, Empty) {
{
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.
// Inject dynamic view // Inject dynamic view
var defaultUrl = GetBasePath('job_templates'); var defaultUrl = GetBasePath('job_templates'),
var form = JobTemplateForm; form = JobTemplateForm,
var generator = GenerateForm; generator = GenerateForm,
var scope = generator.inject(form, {mode: 'add', related: false}); scope = generator.inject(form, { mode: 'add', related: false }),
var master = {}; master = {},
CloudCredentialList = {},
selectPlaybook, checkSCMStatus;
scope.parseType = 'yaml'; scope.parseType = 'yaml';
ParseTypeChange(scope); ParseTypeChange(scope);
scope.job_type_options = [{ value: 'run', label: 'Run' }, { value: 'check', label: 'Check' }]; scope.job_type_options = [
{ value: 'run', label: 'Run' },
{ value: 'check', label: 'Check' }
];
scope.verbosity_options = [ scope.verbosity_options = [
{ value: '0', label: 'Default' }, { value: '0', label: 'Default' },
{ value: '1', label: 'Verbose' }, { value: '1', label: 'Verbose' },
{ value: '3', label: 'Debug' }]; { value: '3', label: 'Debug' }
];
scope.playbook_options = []; scope.playbook_options = [];
scope.allow_callbacks = 'false'; scope.allow_callbacks = 'false';
@@ -138,10 +162,9 @@ function JobTemplatesAdd ($scope, $rootScope, $compile, $location, $log, $routeP
// Clone the CredentialList object for use with cloud_credential. Cloning // Clone the CredentialList object for use with cloud_credential. Cloning
// and changing properties to avoid collision. // and changing properties to avoid collision.
var CloudCredentialList = {};
jQuery.extend(true, CloudCredentialList, CredentialList); jQuery.extend(true, CloudCredentialList, CredentialList);
CloudCredentialList.name = 'cloudcredentials', CloudCredentialList.name = 'cloudcredentials';
CloudCredentialList.iterator = 'cloudcredential', CloudCredentialList.iterator = 'cloudcredential';
LookUpInit({ LookUpInit({
url: GetBasePath('credentials') + '?cloud=true', url: GetBasePath('credentials') + '?cloud=true',
@@ -164,37 +187,40 @@ function JobTemplatesAdd ($scope, $rootScope, $compile, $location, $log, $routeP
}); });
// Update playbook select whenever project value changes // Update playbook select whenever project value changes
var selectPlaybook = function(oldValue, newValue) { selectPlaybook = function (oldValue, newValue) {
if (oldValue != newValue) { var url;
if (oldValue !== newValue) {
if (scope.project) { if (scope.project) {
Wait('start'); Wait('start');
var url = GetBasePath('projects') + scope.project + '/playbooks/'; url = GetBasePath('projects') + scope.project + '/playbooks/';
Rest.setUrl(url); Rest.setUrl(url);
Rest.get() Rest.get()
.success( function(data, status, headers, config) { .success(function (data) {
var opts = []; var i, opts = [];
for (var i=0; i < data.length; i++) { for (i = 0; i < data.length; i++) {
opts.push(data[i]); opts.push(data[i]);
} }
scope.playbook_options = opts; scope.playbook_options = opts;
Wait('stop'); Wait('stop');
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
ProcessErrors(scope, data, status, form, ProcessErrors(scope, data, status, form, {
{ hdr: 'Error!', msg: 'Failed to get playbook list for ' + url +'. GET returned status: ' + status }); hdr: 'Error!',
msg: 'Failed to get playbook list for ' + url + '. GET returned status: ' + status
});
}); });
} }
} }
}; };
// Detect and alert user to potential SCM status issues // Detect and alert user to potential SCM status issues
var checkSCMStatus = function(oldValue, newValue) { checkSCMStatus = function (oldValue, newValue) {
if (oldValue !== newValue && !Empty(scope.project)) { if (oldValue !== newValue && !Empty(scope.project)) {
Rest.setUrl(GetBasePath('projects') + scope.project + '/'); Rest.setUrl(GetBasePath('projects') + scope.project + '/');
Rest.get() Rest.get()
.success( function(data, status, headers, config) { .success(function (data) {
var msg; var msg;
switch(data.status) { switch (data.status) {
case 'failed': case 'failed':
msg = "The selected project has a <em>failed</em> status. Review the project's SCM settings" + msg = "The selected project has a <em>failed</em> status. Review the project's SCM settings" +
" and run an update before adding it to a template."; " and run an update before adding it to a template.";
@@ -213,18 +239,20 @@ function JobTemplatesAdd ($scope, $rootScope, $compile, $location, $log, $routeP
Alert('Waning', msg, 'alert-info'); Alert('Waning', msg, 'alert-info');
} }
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
ProcessErrors(scope, data, status, form, ProcessErrors(scope, data, status, form, {
{ hdr: 'Error!', msg: 'Failed to get project ' + scope.project +'. GET returned status: ' + status }); hdr: 'Error!',
msg: 'Failed to get project ' + scope.project + '. GET returned status: ' + status
});
}); });
} }
} };
// Register a watcher on project_name // Register a watcher on project_name
if (scope.selectPlaybookUnregister) { if (scope.selectPlaybookUnregister) {
scope.selectPlaybookUnregister(); scope.selectPlaybookUnregister();
} }
scope.selectPlaybookUnregister = scope.$watch('project_name', function(oldval, newval) { scope.selectPlaybookUnregister = scope.$watch('project_name', function (oldval, newval) {
selectPlaybook(oldval, newval); selectPlaybook(oldval, newval);
checkSCMStatus(oldval, newval); checkSCMStatus(oldval, newval);
}); });
@@ -238,17 +266,16 @@ function JobTemplatesAdd ($scope, $rootScope, $compile, $location, $log, $routeP
}); });
// Save // Save
scope.formSave = function() { scope.formSave = function () {
generator.clearApiErrors(); generator.clearApiErrors();
Wait('start'); Wait('start');
var data = {} var data = {}, json_data, fld;
try { try {
// Make sure we have valid variable data // Make sure we have valid variable data
if (scope.parseType == 'json') { if (scope.parseType === 'json') {
var json_data = JSON.parse(scope.variables); //make sure JSON parses json_data = JSON.parse(scope.variables); //make sure JSON parses
} } else {
else { json_data = jsyaml.load(scope.variables); //parse yaml
var json_data = jsyaml.load(scope.variables); //parse yaml
} }
// Make sure our JSON is actually an object // Make sure our JSON is actually an object
@@ -256,44 +283,47 @@ function JobTemplatesAdd ($scope, $rootScope, $compile, $location, $log, $routeP
throw "failed to return an object!"; throw "failed to return an object!";
} }
for (var fld in form.fields) { for (fld in form.fields) {
if (form.fields[fld].type == 'select' && fld != 'playbook') { if (form.fields[fld].type === 'select' && fld !== 'playbook') {
data[fld] = scope[fld].value; data[fld] = scope[fld].value;
} } else {
else { if (fld !== 'variables') {
if (fld != 'variables') {
data[fld] = scope[fld]; data[fld] = scope[fld];
} }
} }
} }
data.extra_vars = JSON.stringify(json_data, undefined, '\t'); data.extra_vars = JSON.stringify(json_data, undefined, '\t');
if (data.extra_vars == "null" || data.extra_vars == null) { if (Empty(data.extra_vars)) {
data.extra_vars = ""; data.extra_vars = "";
} }
Rest.setUrl(defaultUrl); Rest.setUrl(defaultUrl);
Rest.post(data) Rest.post(data)
.success( function(data, status, headers, config) { .success(function () {
Wait('stop'); Wait('stop');
var base = $location.path().replace(/^\//,'').split('/')[0]; var base = $location.path().replace(/^\//, '').split('/')[0];
(base == 'job_templates') ? ReturnToCaller() : ReturnToCaller(1); if (base === 'job_templates') {
ReturnToCaller();
}
ReturnToCaller(1);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
Wait('stop'); Wait('stop');
ProcessErrors(scope, data, status, form, ProcessErrors(scope, data, status, form, {
{ hdr: 'Error!', msg: 'Failed to add new job template. POST returned status: ' + status }); hdr: 'Error!',
msg: 'Failed to add new job template. POST returned status: ' + status
});
}); });
} } catch (err) {
catch(err) {
Wait('stop'); Wait('stop');
Alert("Error", "Error parsing extra variables. Parser returned: " + err); Alert("Error", "Error parsing extra variables. Parser returned: " + err);
} }
}; };
// Reset // Reset
scope.formReset = function() { scope.formReset = function () {
// Defaults // Defaults
generator.reset(); generator.reset();
//$('#forks-slider').slider("option", "value", scope.forks); //$('#forks-slider').slider("option", "value", scope.forks);
@@ -303,84 +333,89 @@ function JobTemplatesAdd ($scope, $rootScope, $compile, $location, $log, $routeP
}; };
} }
JobTemplatesAdd.$inject = [ '$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'JobTemplateForm', JobTemplatesAdd.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'JobTemplateForm',
'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ReturnToCaller', 'ClearScope', 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ReturnToCaller', 'ClearScope',
'GetBasePath', 'InventoryList', 'CredentialList', 'ProjectList', 'LookUpInit', 'GetBasePath', 'InventoryList', 'CredentialList', 'ProjectList', 'LookUpInit',
'md5Setup', 'ParseTypeChange', 'Wait', 'Empty' ]; 'md5Setup', 'ParseTypeChange', 'Wait', 'Empty'
];
function JobTemplatesEdit ($scope, $rootScope, $compile, $location, $log, $routeParams, JobTemplateForm, function JobTemplatesEdit($scope, $rootScope, $compile, $location, $log, $routeParams, JobTemplateForm, GenerateForm, Rest,
GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, RelatedSearchInit, Alert, ProcessErrors, LoadBreadCrumbs, RelatedSearchInit, RelatedPaginateInit, ReturnToCaller, ClearScope, InventoryList,
RelatedPaginateInit, ReturnToCaller, ClearScope, InventoryList, CredentialList, CredentialList, ProjectList, LookUpInit, PromptPasswords, GetBasePath, md5Setup, ParseTypeChange, JobStatusToolTip, FormatDate,
ProjectList, LookUpInit, PromptPasswords, GetBasePath, md5Setup, ParseTypeChange, Wait, Stream, Empty, Prompt) {
JobStatusToolTip, FormatDate, Wait, Stream, Empty)
{
ClearScope('htmlTemplate'); //Garbage collection. Don't leave behind any listeners/watchers from the prior
//scope.
var defaultUrl= GetBasePath('job_templates'); ClearScope('htmlTemplate');
var generator = GenerateForm;
var form = JobTemplateForm; var defaultUrl = GetBasePath('job_templates'),
var scope = generator.inject(form, {mode: 'edit', related: true}); generator = GenerateForm,
var loadingFinishedCount = 0; form = JobTemplateForm,
scope = generator.inject(form, { mode: 'edit', related: true }),
loadingFinishedCount = 0,
base = $location.path().replace(/^\//, '').split('/')[0],
master = {},
id = $routeParams.id,
relatedSets = {},
checkSCMStatus, getPlaybooks;
scope.parseType = 'yaml'; scope.parseType = 'yaml';
ParseTypeChange(scope); ParseTypeChange(scope);
// Our job type options // Our job type options
scope.job_type_options = [{ value: 'run', label: 'Run' }, { value: 'check', label: 'Check' }]; scope.job_type_options = [
{ value: 'run', label: 'Run' },
{ value: 'check', label: 'Check' }
];
scope.verbosity_options = [ scope.verbosity_options = [
{ value: '0', label: 'Default' }, { value: '0', label: 'Default' },
{ value: '1', label: 'Verbose' }, { value: '1', label: 'Verbose' },
{ value: '3', label: 'Debug' }]; { value: '3', label: 'Debug' }
];
scope.playbook_options = null; scope.playbook_options = null;
scope.playbook = null; scope.playbook = null;
generator.reset(); generator.reset();
var base = $location.path().replace(/^\//,'').split('/')[0]; getPlaybooks = function (project) {
var master = {}; var url;
var id = $routeParams.id; if (!Empty(project)) {
var relatedSets = {}; url = GetBasePath('projects') + project + '/playbooks/';
function getPlaybooks(project) {
if (project !== null && project !== '' && project !== undefined) {
var url = GetBasePath('projects') + project + '/playbooks/';
Wait('start'); Wait('start');
Rest.setUrl(url); Rest.setUrl(url);
Rest.get() Rest.get()
.success( function(data, status, headers, config) { .success(function (data) {
var i;
scope.playbook_options = []; scope.playbook_options = [];
for (var i=0; i < data.length; i++) { for (i = 0; i < data.length; i++) {
scope.playbook_options.push(data[i]); scope.playbook_options.push(data[i]);
if (data[i] == scope.playbook) { if (data[i] === scope.playbook) {
scope['job_templates_form']['playbook'].$setValidity('required',true); scope.job_templates_form.playbook.$setValidity('required', true);
} }
} }
if (scope.playbook) { if (scope.playbook) {
scope.$emit('jobTemplateLoadFinished'); scope.$emit('jobTemplateLoadFinished');
} } else {
else {
Wait('stop'); Wait('stop');
} }
}) })
.error( function(data, status, headers, config) { .error(function () {
Wait('stop'); Wait('stop');
Alert('Missing Playbooks', 'Unable to retrieve the list of playbooks for this project. Choose a different ' + Alert('Missing Playbooks', 'Unable to retrieve the list of playbooks for this project. Choose a different ' +
' project or make the playbooks available on the file system.', 'alert-info'); ' project or make the playbooks available on the file system.', 'alert-info');
}); });
} }
} };
// Detect and alert user to potential SCM status issues // Detect and alert user to potential SCM status issues
var checkSCMStatus = function() { checkSCMStatus = function () {
if (!Empty(scope.project)) { if (!Empty(scope.project)) {
Wait('start'); Wait('start');
Rest.setUrl(GetBasePath('projects') + scope.project + '/'); Rest.setUrl(GetBasePath('projects') + scope.project + '/');
Rest.get() Rest.get()
.success( function(data, status, headers, config) { .success(function (data) {
var msg; var msg;
switch(data.status) { switch (data.status) {
case 'failed': case 'failed':
msg = "The selected project has a <em>failed</em> status. Review the project's SCM settings" + msg = "The selected project has a <em>failed</em> status. Review the project's SCM settings" +
" and run an update before adding it to a template."; " and run an update before adding it to a template.";
@@ -400,19 +435,19 @@ function JobTemplatesEdit ($scope, $rootScope, $compile, $location, $log, $route
Alert('Waning', msg, 'alert-info'); Alert('Waning', msg, 'alert-info');
} }
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
ProcessErrors(scope, data, status, form, ProcessErrors(scope, data, status, form, { hdr: 'Error!', msg: 'Failed to get project ' + scope.project +
{ hdr: 'Error!', msg: 'Failed to get project ' + scope.project +'. GET returned status: ' + status }); '. GET returned status: ' + status });
}); });
} }
} };
// Register a watcher on project_name. Refresh the playbook list on change. // Register a watcher on project_name. Refresh the playbook list on change.
if (scope.watchProjectUnregister) { if (scope.watchProjectUnregister) {
scope.watchProjectUnregister(); scope.watchProjectUnregister();
} }
scope.watchProjectUnregister = scope.$watch('project_name', function(oldValue, newValue) { scope.watchProjectUnregister = scope.$watch('project_name', function (oldValue, newValue) {
if (oldValue !== newValue && newValue !== '' && newValue !== null && newValue !== undefined) { if (oldValue !== newValue && newValue !== '' && newValue !== null && newValue !== undefined) {
scope.playbook = null; scope.playbook = null;
getPlaybooks(scope.project); getPlaybooks(scope.project);
@@ -424,7 +459,7 @@ function JobTemplatesEdit ($scope, $rootScope, $compile, $location, $log, $route
if (scope.removeJobTemplateLoadFinished) { if (scope.removeJobTemplateLoadFinished) {
scope.removeJobTemplateLoadFinished(); scope.removeJobTemplateLoadFinished();
} }
scope.removeJobTemplateLoadFinished = scope.$on('jobTemplateLoadFinished', function() { scope.removeJobTemplateLoadFinished = scope.$on('jobTemplateLoadFinished', function () {
loadingFinishedCount++; loadingFinishedCount++;
if (loadingFinishedCount >= 2) { if (loadingFinishedCount >= 2) {
// The initial template load finished. Now load related jobs, which // The initial template load finished. Now load related jobs, which
@@ -440,17 +475,17 @@ function JobTemplatesEdit ($scope, $rootScope, $compile, $location, $log, $route
if (scope.removeRelatedJobs) { if (scope.removeRelatedJobs) {
scope.removeRelatedJobs(); scope.removeRelatedJobs();
} }
scope.removeRelatedJobs = scope.$on('relatedjobs', function() { scope.removeRelatedJobs = scope.$on('relatedjobs', function () {
if (scope['jobs'] && scope['jobs'].length) { var i, cDate;
var cDate; if (scope.jobs && scope.jobs.length) {
for (var i=0; i < scope['jobs'].length; i++) { for (i = 0; i < scope.jobs.length; i++) {
// Convert created date to local time zone // Convert created date to local time zone
cDate = new Date(scope['jobs'][i].created); cDate = new Date(scope.jobs[i].created);
scope['jobs'][i].created = FormatDate(cDate); scope.jobs[i].created = FormatDate(cDate);
// Set tooltip and link // Set tooltip and link
scope['jobs'][i].statusBadgeToolTip = JobStatusToolTip(scope['jobs'][i].status) + scope.jobs[i].statusBadgeToolTip = JobStatusToolTip(scope.jobs[i].status) +
" Click to view status details."; " Click to view status details.";
scope['jobs'][i].statusLinkTo = '/#/jobs/' + scope['jobs'][i].id; scope.jobs[i].statusLinkTo = '/#/jobs/' + scope.jobs[i].id;
} }
} }
}); });
@@ -458,20 +493,20 @@ function JobTemplatesEdit ($scope, $rootScope, $compile, $location, $log, $route
if (scope.cloudCredentialReadyRemove) { if (scope.cloudCredentialReadyRemove) {
scope.cloudCredentialReadyRemove(); scope.cloudCredentialReadyRemove();
} }
scope.cloudCredentialReadyRemove = scope.$on('cloudCredentialReady', function(e, name) { scope.cloudCredentialReadyRemove = scope.$on('cloudCredentialReady', function (e, name) {
scope['cloud_credential_name'] = name; var CloudCredentialList = {};
master['cloud_credential_name'] = name; scope.cloud_credential_name = name;
master.cloud_credential_name = name;
// Clone the CredentialList object for use with cloud_credential. Cloning // Clone the CredentialList object for use with cloud_credential. Cloning
// and changing properties to avoid collision. // and changing properties to avoid collision.
var CloudCredentialList = {};
jQuery.extend(true, CloudCredentialList, CredentialList); jQuery.extend(true, CloudCredentialList, CredentialList);
CloudCredentialList.name = 'cloudcredentials', CloudCredentialList.name = 'cloudcredentials';
CloudCredentialList.iterator = 'cloudcredential', CloudCredentialList.iterator = 'cloudcredential';
LookUpInit({ LookUpInit({
url: GetBasePath('credentials') + '?cloud=true', url: GetBasePath('credentials') + '?cloud=true',
scope: scope, scope: scope,
form: form, form: form,
current_item: scope['cloud_credential'], current_item: scope.cloud_credential,
list: CloudCredentialList, list: CloudCredentialList,
field: 'cloud_credential', field: 'cloud_credential',
hdr: 'Select Cloud Credential' hdr: 'Select Cloud Credential'
@@ -484,11 +519,11 @@ function JobTemplatesEdit ($scope, $rootScope, $compile, $location, $log, $route
if (scope.jobTemplateLoadedRemove) { if (scope.jobTemplateLoadedRemove) {
scope.jobTemplateLoadedRemove(); scope.jobTemplateLoadedRemove();
} }
scope.jobTemplateLoadedRemove = scope.$on('jobTemplateLoaded', function(e, related_cloud_credential) { scope.jobTemplateLoadedRemove = scope.$on('jobTemplateLoaded', function (e, related_cloud_credential) {
var dft;
getPlaybooks(scope.project); getPlaybooks(scope.project);
var dft = (scope['host_config_key'] === "" || scope['host_config_key'] === null) ? 'false' : 'true'; dft = (scope.host_config_key === "" || scope.host_config_key === null) ? 'false' : 'true';
md5Setup({ md5Setup({
scope: scope, scope: scope,
master: master, master: master,
@@ -499,15 +534,14 @@ function JobTemplatesEdit ($scope, $rootScope, $compile, $location, $log, $route
if (related_cloud_credential) { if (related_cloud_credential) {
Rest.setUrl(related_cloud_credential); Rest.setUrl(related_cloud_credential);
Rest.get() Rest.get()
.success( function(data, status, headers, config) { .success(function (data) {
scope.$emit('cloudCredentialReady', data.name); scope.$emit('cloudCredentialReady', data.name);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, {hdr: 'Error!',
{ hdr: 'Error!', msg: 'Failed to related cloud credential. GET returned status: ' + status }); msg: 'Failed to related cloud credential. GET returned status: ' + status });
}); });
} } else {
else {
// No existing cloud credential // No existing cloud credential
scope.$emit('cloudCredentialReady', null); scope.$emit('cloudCredentialReady', null);
} }
@@ -516,41 +550,39 @@ function JobTemplatesEdit ($scope, $rootScope, $compile, $location, $log, $route
Wait('start'); Wait('start');
// Retrieve detail record and prepopulate the form // Retrieve detail record and prepopulate the form
Rest.setUrl(defaultUrl + ':id/'); Rest.setUrl(defaultUrl + ':id/');
Rest.get({ params: {id: id} }) Rest.get({ params: { id: id } })
.success( function(data, status, headers, config) { .success(function (data) {
var fld, i, json_obj, related, set;
LoadBreadCrumbs({ path: '/job_templates/' + id, title: data.name }); LoadBreadCrumbs({ path: '/job_templates/' + id, title: data.name });
for (var fld in form.fields) { for (fld in form.fields) {
if (fld != 'variables' && data[fld] !== null && data[fld] !== undefined) { if (fld !== 'variables' && data[fld] !== null && data[fld] !== undefined) {
if (form.fields[fld].type == 'select') { if (form.fields[fld].type === 'select') {
if (scope[fld + '_options'] && scope[fld + '_options'].length > 0) { if (scope[fld + '_options'] && scope[fld + '_options'].length > 0) {
for (var i=0; i < scope[fld + '_options'].length; i++) { for (i = 0; i < scope[fld + '_options'].length; i++) {
if (data[fld] == scope[fld + '_options'][i].value) { if (data[fld] === scope[fld + '_options'][i].value) {
scope[fld] = scope[fld + '_options'][i]; scope[fld] = scope[fld + '_options'][i];
} }
} }
} } else {
else {
scope[fld] = data[fld]; scope[fld] = data[fld];
} }
} } else {
else {
scope[fld] = data[fld]; scope[fld] = data[fld];
} }
master[fld] = scope[fld]; master[fld] = scope[fld];
} }
if (fld == 'variables') { if (fld === 'variables') {
// Parse extra_vars, converting to YAML. // Parse extra_vars, converting to YAML.
if ($.isEmptyObject(data.extra_vars) || data.extra_vars == "\{\}" || data.extra_vars == "null" if ($.isEmptyObject(data.extra_vars) || data.extra_vars === "{}" || data.extra_vars === "null" ||
|| data.extra_vars == "" || data.extra_vars == null) { data.extra_vars === "" || data.extra_vars === null) {
scope.variables = "---"; scope.variables = "---";
} } else {
else { json_obj = JSON.parse(data.extra_vars);
var json_obj = JSON.parse(data.extra_vars);
scope.variables = jsyaml.safeDump(json_obj); scope.variables = jsyaml.safeDump(json_obj);
} }
master.variables = scope.variables; master.variables = scope.variables;
} }
if (form.fields[fld].type == 'lookup' && data.summary_fields[form.fields[fld].sourceModel]) { if (form.fields[fld].type === 'lookup' && data.summary_fields[form.fields[fld].sourceModel]) {
scope[form.fields[fld].sourceModel + '_' + form.fields[fld].sourceField] = scope[form.fields[fld].sourceModel + '_' + form.fields[fld].sourceField] =
data.summary_fields[form.fields[fld].sourceModel][form.fields[fld].sourceField]; data.summary_fields[form.fields[fld].sourceModel][form.fields[fld].sourceField];
master[form.fields[fld].sourceModel + '_' + form.fields[fld].sourceField] = master[form.fields[fld].sourceModel + '_' + form.fields[fld].sourceField] =
@@ -559,15 +591,18 @@ function JobTemplatesEdit ($scope, $rootScope, $compile, $location, $log, $route
} }
scope.url = data.url; scope.url = data.url;
var related = data.related; related = data.related;
for (var set in form.related) { for (set in form.related) {
if (related[set]) { if (related[set]) {
relatedSets[set] = { url: related[set], iterator: form.related[set].iterator }; relatedSets[set] = {
url: related[set],
iterator: form.related[set].iterator
};
} }
} }
scope['callback_url'] = data.related['callback']; scope.callback_url = data.related.callback;
master['callback_url'] = scope['callback_url']; master.callback_url = scope.callback_url;
LookUpInit({ LookUpInit({
scope: scope, scope: scope,
@@ -596,27 +631,35 @@ function JobTemplatesEdit ($scope, $rootScope, $compile, $location, $log, $route
}); });
// Initialize related search functions. Doing it here to make sure relatedSets object is populated. // Initialize related search functions. Doing it here to make sure relatedSets object is populated.
RelatedSearchInit({ scope: scope, form: form, relatedSets: relatedSets }); RelatedSearchInit({
RelatedPaginateInit({ scope: scope, relatedSets: relatedSets }); scope: scope,
form: form,
relatedSets: relatedSets
});
RelatedPaginateInit({
scope: scope,
relatedSets: relatedSets
});
scope.$emit('jobTemplateLoaded', data.related.cloud_credential); scope.$emit('jobTemplateLoaded', data.related.cloud_credential);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
ProcessErrors(scope, data, status, form, ProcessErrors(scope, data, status, form, {
{ hdr: 'Error!', msg: 'Failed to retrieve job template: ' + $routeParams.id + '. GET status: ' + status }); hdr: 'Error!',
msg: 'Failed to retrieve job template: ' + $routeParams.id + '. GET status: ' + status
});
}); });
// Save changes to the parent // Save changes to the parent
scope.formSave = function() { scope.formSave = function () {
generator.clearApiErrors(); generator.clearApiErrors();
Wait('start'); Wait('start');
var data = {} var data = {}, json_data, fld;
try { try {
// Make sure we have valid variable data // Make sure we have valid variable data
if (scope.parseType == 'json') { if (scope.parseType === 'json') {
var json_data = JSON.parse(scope.variables); //make sure JSON parses json_data = JSON.parse(scope.variables); //make sure JSON parses
} } else {
else { json_data = jsyaml.load(scope.variables); //parse yaml
var json_data = jsyaml.load(scope.variables); //parse yaml
} }
// Make sure our JSON is actually an object // Make sure our JSON is actually an object
@@ -624,45 +667,52 @@ function JobTemplatesEdit ($scope, $rootScope, $compile, $location, $log, $route
throw "failed to return an object!"; throw "failed to return an object!";
} }
for (var fld in form.fields) { for (fld in form.fields) {
if (form.fields[fld].type == 'select' && fld != 'playbook') { if (form.fields[fld].type === 'select' && fld !== 'playbook') {
data[fld] = scope[fld].value; data[fld] = scope[fld].value;
} } else {
else { if (fld !== 'variables' && fld !== 'callback_url') {
if (fld != 'variables' && fld != 'callback_url') {
data[fld] = scope[fld]; data[fld] = scope[fld];
} }
} }
} }
data.extra_vars = JSON.stringify(json_data, undefined, '\t'); data.extra_vars = JSON.stringify(json_data, undefined, '\t');
if (data.extra_vars == "null" || data.extra_vars == null) { if (data.extra_vars === "null" || data.extra_vars === null) {
data.extra_vars = ""; data.extra_vars = "";
} }
Rest.setUrl(defaultUrl + id + '/'); Rest.setUrl(defaultUrl + id + '/');
Rest.put(data) Rest.put(data)
.success( function(data, status, headers, config) { .success(function () {
Wait('stop'); Wait('stop');
var base = $location.path().replace(/^\//,'').split('/')[0]; var base = $location.path().replace(/^\//, '').split('/')[0];
(base == 'job_templates') ? ReturnToCaller() : ReturnToCaller(1); if (base === 'job_templates') {
ReturnToCaller();
}
ReturnToCaller(1);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
ProcessErrors(scope, data, status, form, ProcessErrors(scope, data, status, form, {
{ hdr: 'Error!', msg: 'Failed to update job template. PUT returned status: ' + status }); hdr: 'Error!',
msg: 'Failed to update job template. PUT returned status: ' + status
});
}); });
} } catch (err) {
catch(err) {
Wait('stop'); Wait('stop');
Alert("Error", "Error parsing extra variables. Parser returned: " + err); Alert("Error", "Error parsing extra variables. Parser returned: " + err);
} }
}; };
scope.showActivity = function() { Stream({ scope: scope }); } scope.showActivity = function () {
Stream({
scope: scope
});
};
// Cancel // Cancel
scope.formReset = function() { scope.formReset = function () {
generator.reset(); generator.reset();
for (var fld in master) { for (var fld in master) {
scope[fld] = master[fld]; scope[fld] = master[fld];
@@ -672,47 +722,52 @@ function JobTemplatesEdit ($scope, $rootScope, $compile, $location, $log, $route
}; };
// 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.id + '/' + set); $location.path('/' + base + '/' + $routeParams.id + '/' + set);
}; };
// Related set: Edit button // Related set: Edit button
scope.edit = function(set, id, name) { scope.edit = function (set, id) {
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
$location.path('/' + set + '/' + id); $location.path('/' + set + '/' + id);
}; };
// Related set: Delete button // Related set: Delete button
scope['delete'] = function(set, itm_id, name, title) { scope['delete'] = function (set, itm_id, name, title) {
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
var action = function() { var action = function () {
var url = defaultUrl + id + '/' + set + '/'; var url = defaultUrl + id + '/' + set + '/';
Rest.setUrl(url); Rest.setUrl(url);
Rest.post({ id: itm_id, disassociate: 1 }) Rest.post({
.success( function(data, status, headers, config) { id: itm_id,
disassociate: 1
})
.success(function () {
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
scope.search(form.related[set].iterator); scope.search(form.related[set].iterator);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, {
{ hdr: 'Error!', msg: 'Call to ' + url + ' failed. POST returned status: ' + status }); hdr: 'Error!',
msg: 'Call to ' + url + ' failed. POST returned status: ' + status
});
}); });
}; };
Prompt({ hdr: 'Delete', Prompt({
hdr: 'Delete',
body: 'Are you sure you want to remove ' + name + ' from ' + scope.name + ' ' + title + '?', body: 'Are you sure you want to remove ' + name + ' from ' + scope.name + ' ' + title + '?',
action: action action: action
}); });
} };
} }
JobTemplatesEdit.$inject = [ '$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'JobTemplateForm', JobTemplatesEdit.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'JobTemplateForm',
'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'RelatedSearchInit', 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'RelatedSearchInit', 'RelatedPaginateInit',
'RelatedPaginateInit', 'ReturnToCaller', 'ClearScope', 'InventoryList', 'CredentialList', 'ReturnToCaller', 'ClearScope', 'InventoryList', 'CredentialList', 'ProjectList', 'LookUpInit', 'PromptPasswords',
'ProjectList', 'LookUpInit', 'PromptPasswords', 'GetBasePath', 'md5Setup', 'ParseTypeChange', 'GetBasePath', 'md5Setup', 'ParseTypeChange', 'JobStatusToolTip', 'FormatDate', 'Wait', 'Stream', 'Empty', 'Prompt'
'JobStatusToolTip', 'FormatDate', 'Wait', 'Stream', 'Empty' ];
];

View File

@@ -7,12 +7,10 @@
* Controller functions for the Job model. * Controller functions for the Job model.
* *
*/ */
/* global jsyaml:false */ /* global jsyaml:false */
'use strict'; 'use strict';
function JobsListCtrl ($scope, $rootScope, $location, $log, $routeParams, Rest, Alert, JobList, GenerateList, LoadBreadCrumbs, Prompt, function JobsListCtrl($scope, $rootScope, $location, $log, $routeParams, Rest, Alert, JobList, GenerateList, LoadBreadCrumbs, Prompt,
SearchInit, PaginateInit, ReturnToCaller, ClearScope, ProcessErrors, GetBasePath, LookUpInit, SubmitJob, FormatDate, Refresh, SearchInit, PaginateInit, ReturnToCaller, ClearScope, ProcessErrors, GetBasePath, LookUpInit, SubmitJob, FormatDate, Refresh,
JobStatusToolTip, Empty, Wait) { JobStatusToolTip, Empty, Wait) {
@@ -30,15 +28,15 @@ function JobsListCtrl ($scope, $rootScope, $location, $log, $routeParams, Rest,
if (scope.removePostRefresh) { if (scope.removePostRefresh) {
scope.removePostRefresh(); scope.removePostRefresh();
} }
scope.removePostRefresh = scope.$on('PostRefresh', function() { scope.removePostRefresh = scope.$on('PostRefresh', function () {
var i,cDate; var i, cDate;
$("tr.success").each(function() { $("tr.success").each(function () {
// Make sure no rows have a green background // Make sure no rows have a green background
var ngc = $(this).attr('ng-class'); var ngc = $(this).attr('ng-class');
scope[ngc] = ""; scope[ngc] = "";
}); });
if (scope.jobs && scope.jobs.length) { if (scope.jobs && scope.jobs.length) {
for (i=0; i < scope.jobs.length; i++) { for (i = 0; i < scope.jobs.length; i++) {
// Convert created date to local time zone // Convert created date to local time zone
cDate = new Date(scope.jobs[i].created); cDate = new Date(scope.jobs[i].created);
scope.jobs[i].created = FormatDate(cDate); scope.jobs[i].created = FormatDate(cDate);
@@ -53,13 +51,21 @@ function JobsListCtrl ($scope, $rootScope, $location, $log, $routeParams, Rest,
if ($routeParams.job_host_summaries__host) { if ($routeParams.job_host_summaries__host) {
defaultUrl += '?job_host_summaries__host=' + $routeParams.job_host_summaries__host; defaultUrl += '?job_host_summaries__host=' + $routeParams.job_host_summaries__host;
} } else if ($routeParams.inventory__int && $routeParams.status) {
else if ($routeParams.inventory__int && $routeParams.status) {
defaultUrl += '?inventory__int=' + $routeParams.inventory__int + '&status=' + defaultUrl += '?inventory__int=' + $routeParams.inventory__int + '&status=' +
$routeParams.status; $routeParams.status;
} }
SearchInit({ scope: scope, set: 'jobs', list: list, url: defaultUrl }); SearchInit({
PaginateInit({ scope: scope, list: list, url: defaultUrl }); scope: scope,
set: 'jobs',
list: list,
url: defaultUrl
});
PaginateInit({
scope: scope,
list: list,
url: defaultUrl
});
// Called from Inventories page, failed jobs link. Find jobs for selected inventory. // Called from Inventories page, failed jobs link. Find jobs for selected inventory.
if ($routeParams.inventory__int) { if ($routeParams.inventory__int) {
@@ -76,7 +82,7 @@ function JobsListCtrl ($scope, $rootScope, $location, $log, $routeParams, Rest,
scope[list.iterator + 'SearchField'] = 'status'; scope[list.iterator + 'SearchField'] = 'status';
scope[list.iterator + 'SelectShow'] = true; scope[list.iterator + 'SelectShow'] = true;
scope[list.iterator + 'SearchSelectOpts'] = list.fields.status.searchOptions; scope[list.iterator + 'SearchSelectOpts'] = list.fields.status.searchOptions;
scope[list.iterator + 'SearchFieldLabel'] = list.fields.status.label.replace(/<br>/g,' '); scope[list.iterator + 'SearchFieldLabel'] = list.fields.status.label.replace(/<br>/g, ' ');
for (opt in list.fields.status.searchOptions) { for (opt in list.fields.status.searchOptions) {
if (list.fields.status.searchOptions[opt].value === $routeParams.status) { if (list.fields.status.searchOptions[opt].value === $routeParams.status) {
scope[list.iterator + 'SearchSelectValue'] = list.fields.status.searchOptions[opt]; scope[list.iterator + 'SearchSelectValue'] = list.fields.status.searchOptions[opt];
@@ -89,33 +95,47 @@ function JobsListCtrl ($scope, $rootScope, $location, $log, $routeParams, Rest,
LoadBreadCrumbs(); LoadBreadCrumbs();
scope.refresh = function() { scope.refresh = function () {
Wait('start'); Wait('start');
scope.jobLoading = false; scope.jobLoading = false;
Refresh({ scope: scope, set: 'jobs', iterator: 'job', url: scope.current_url }); Refresh({
scope: scope,
set: 'jobs',
iterator: 'job',
url: scope.current_url
});
}; };
scope.refreshJob = scope.refresh; scope.refreshJob = scope.refresh;
scope.editJob = function(id, name) { scope.editJob = function (id, name) {
LoadBreadCrumbs({ path: '/jobs/' + id, title: id + ' - ' + name }); LoadBreadCrumbs({
path: '/jobs/' + id,
title: id + ' - ' + name
});
$location.path($location.path() + '/' + id); $location.path($location.path() + '/' + id);
}; };
scope.viewEvents = function(id, name) { scope.viewEvents = function (id, name) {
LoadBreadCrumbs({ path: '/jobs/' + id, title: id + ' - ' + name }); LoadBreadCrumbs({
path: '/jobs/' + id,
title: id + ' - ' + name
});
$location.path($location.path() + '/' + id + '/job_events'); $location.path($location.path() + '/' + id + '/job_events');
}; };
scope.viewSummary = function(id, name) { scope.viewSummary = function (id, name) {
LoadBreadCrumbs({ path: '/jobs/' + id, title: id + ' - ' + name }); LoadBreadCrumbs({
path: '/jobs/' + id,
title: id + ' - ' + name
});
$location.path($location.path() + '/' + id + '/job_host_summaries'); $location.path($location.path() + '/' + id + '/job_host_summaries');
}; };
scope.deleteJob = function(id) { scope.deleteJob = function (id) {
Rest.setUrl(defaultUrl + id + '/'); Rest.setUrl(defaultUrl + id + '/');
Rest.get() Rest.get()
.success( function(data) { .success(function (data) {
var action, url, action_label, hdr; var action, url, action_label, hdr;
@@ -123,37 +143,35 @@ function JobsListCtrl ($scope, $rootScope, $location, $log, $routeParams, Rest,
url = data.related.cancel; url = data.related.cancel;
action_label = 'cancel'; action_label = 'cancel';
hdr = 'Cancel Job'; hdr = 'Cancel Job';
} } else {
else {
url = defaultUrl + id + '/'; url = defaultUrl + id + '/';
action_label = 'delete'; action_label = 'delete';
hdr = 'Delete Job'; hdr = 'Delete Job';
} }
action = function() { action = function () {
Rest.setUrl(url); Rest.setUrl(url);
if (action_label === 'cancel') { if (action_label === 'cancel') {
Rest.post() Rest.post()
.success( function() { .success(function () {
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
scope.search(list.iterator); scope.search(list.iterator);
}) })
.error( function(data, status) { .error(function (data, status) {
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, { hdr: 'Error!', msg: 'Call to ' + url +
{ hdr: 'Error!', msg: 'Call to ' + url + ' failed. POST returned status: ' + status }); ' failed. POST returned status: ' + status });
}); });
} } else {
else {
Rest.destroy() Rest.destroy()
.success( function() { .success(function () {
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
scope.search(list.iterator); scope.search(list.iterator);
}) })
.error( function(data, status) { .error(function (data, status) {
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, { hdr: 'Error!', msg: 'Call to ' + url +
{ hdr: 'Error!', msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status }); ' failed. DELETE returned status: ' + status });
}); });
} }
}; };
@@ -164,35 +182,41 @@ function JobsListCtrl ($scope, $rootScope, $location, $log, $routeParams, Rest,
action: action action: action
}); });
}) })
.error( function(data, status) { .error(function (data, status) {
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, { hdr: 'Error!', msg: 'Failed to get job details. GET returned status: ' + status });
{ hdr: 'Error!', msg: 'Failed to get job details. GET returned status: ' + status });
}); });
}; };
scope.submitJob = function(id, template) { scope.submitJob = function (id, template) {
SubmitJob({ scope: scope, id: id, template: template }); SubmitJob({
scope: scope,
id: id,
template: template
});
}; };
} }
JobsListCtrl.$inject = [ '$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'JobList', JobsListCtrl.$inject = ['$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'JobList',
'GenerateList', 'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'ClearScope', 'GenerateList', 'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'ClearScope',
'ProcessErrors','GetBasePath', 'LookUpInit', 'SubmitJob', 'FormatDate', 'Refresh', 'JobStatusToolTip', 'ProcessErrors', 'GetBasePath', 'LookUpInit', 'SubmitJob', 'FormatDate', 'Refresh', 'JobStatusToolTip',
'Empty', 'Wait' 'Empty', 'Wait'
]; ];
function JobsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams, JobForm, GenerateForm, Rest, Alert, ProcessErrors, function JobsEdit($scope, $rootScope, $compile, $location, $log, $routeParams, JobForm, GenerateForm, Rest, Alert, ProcessErrors,
LoadBreadCrumbs, RelatedSearchInit,RelatedPaginateInit, ReturnToCaller, ClearScope, InventoryList, CredentialList, LoadBreadCrumbs, RelatedSearchInit, RelatedPaginateInit, ReturnToCaller, ClearScope, InventoryList, CredentialList,
ProjectList, LookUpInit, PromptPasswords, GetBasePath, md5Setup, FormatDate, JobStatusToolTip, Wait) { ProjectList, LookUpInit, PromptPasswords, GetBasePath, md5Setup, FormatDate, JobStatusToolTip, Wait) {
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 defaultUrl= GetBasePath('jobs'), var defaultUrl = GetBasePath('jobs'),
generator = GenerateForm, generator = GenerateForm,
form = JobForm, form = JobForm,
scope = generator.inject(form, {mode: 'edit', related: true}), scope = generator.inject(form, {
mode: 'edit',
related: true
}),
master = {}, master = {},
id = $routeParams.id, id = $routeParams.id,
relatedSets = {}, relatedSets = {},
@@ -209,18 +233,17 @@ function JobsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams,
var url = GetBasePath('projects') + project + '/playbooks/'; var url = GetBasePath('projects') + project + '/playbooks/';
Rest.setUrl(url); Rest.setUrl(url);
Rest.get() Rest.get()
.success( function(data) { .success(function (data) {
scope.playbook_options = []; scope.playbook_options = [];
for (var i=0; i < data.length; i++) { for (var i = 0; i < data.length; i++) {
scope.playbook_options.push(data[i]); scope.playbook_options.push(data[i]);
} }
scope.$emit('jobTemplateLoadFinished'); scope.$emit('jobTemplateLoadFinished');
}) })
.error( function() { .error(function () {
scope.$emit('jobTemplateLoadFinished'); scope.$emit('jobTemplateLoadFinished');
}); });
} } else {
else {
scope.$emit('jobTemplateLoadFinished'); scope.$emit('jobTemplateLoadFinished');
} }
} }
@@ -230,7 +253,7 @@ function JobsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams,
if (scope.jobLoadedRemove) { if (scope.jobLoadedRemove) {
scope.jobLoadedRemove(); scope.jobLoadedRemove();
} }
scope.jobLoadedRemove = scope.$on('jobLoaded', function(e, related_cloud_credential) { scope.jobLoadedRemove = scope.$on('jobLoaded', function (e, related_cloud_credential) {
getPlaybooks(scope.project); getPlaybooks(scope.project);
@@ -238,15 +261,15 @@ function JobsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams,
$('#forks-slider').slider("option", "value", scope.forks); $('#forks-slider').slider("option", "value", scope.forks);
$('#forks-slider').slider("disable"); $('#forks-slider').slider("disable");
$('input[type="checkbox"]').attr('disabled','disabled'); $('input[type="checkbox"]').attr('disabled', 'disabled');
$('input[type="radio"]').attr('disabled','disabled'); $('input[type="radio"]').attr('disabled', 'disabled');
$('#host_config_key-gen-btn').attr('disabled','disabled'); $('#host_config_key-gen-btn').attr('disabled', 'disabled');
$('textarea').attr('readonly','readonly'); $('textarea').attr('readonly', 'readonly');
// Get job template and display/hide host callback fields // Get job template and display/hide host callback fields
Rest.setUrl(scope.template_url); Rest.setUrl(scope.template_url);
Rest.get() Rest.get()
.success( function(data) { .success(function (data) {
var dft = (data.host_config_key) ? 'true' : 'false'; var dft = (data.host_config_key) ? 'true' : 'false';
scope.host_config_key = data.host_config_key; scope.host_config_key = data.host_config_key;
md5Setup({ md5Setup({
@@ -258,7 +281,7 @@ function JobsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams,
scope.callback_url = (data.related) ? data.related.callback : '<< Job template not found >>'; scope.callback_url = (data.related) ? data.related.callback : '<< Job template not found >>';
scope.$emit('jobTemplateLoadFinished'); scope.$emit('jobTemplateLoadFinished');
}) })
.error( function() { .error(function () {
Wait('stop'); Wait('stop');
scope.callback_url = '<< Job template not found >>'; scope.callback_url = '<< Job template not found >>';
}); });
@@ -267,16 +290,17 @@ function JobsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams,
//Get the name of the cloud credential //Get the name of the cloud credential
Rest.setUrl(related_cloud_credential); Rest.setUrl(related_cloud_credential);
Rest.get() Rest.get()
.success( function(data) { .success(function (data) {
scope.cloud_credential_name = data.name; scope.cloud_credential_name = data.name;
scope.$emit('jobTemplateLoadFinished'); scope.$emit('jobTemplateLoadFinished');
}) })
.error( function(data, status) { .error(function (data, status) {
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, {
{ hdr: 'Error!', msg: 'Failed to related cloud credential. GET returned status: ' + status }); hdr: 'Error!',
msg: 'Failed to related cloud credential. GET returned status: ' + status
}); });
} });
else { } else {
scope.$emit('jobTemplateLoadFinished'); scope.$emit('jobTemplateLoadFinished');
} }
}); });
@@ -285,7 +309,7 @@ function JobsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams,
if (scope.removeJobTemplateLoadFinished) { if (scope.removeJobTemplateLoadFinished) {
scope.removeJobTemplateLoadFinished(); scope.removeJobTemplateLoadFinished();
} }
scope.removeJobTemplateLoadFinished = scope.$on('jobTemplateLoadFinished', function() { scope.removeJobTemplateLoadFinished = scope.$on('jobTemplateLoadFinished', function () {
loadingFinishedCount++; loadingFinishedCount++;
if (loadingFinishedCount >= 3) { if (loadingFinishedCount >= 3) {
// The initial template load finished. Now load related jobs, which // The initial template load finished. Now load related jobs, which
@@ -295,16 +319,27 @@ function JobsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams,
}); });
// Our job type options // Our job type options
scope.job_type_options = [{ value: 'run', label: 'Run' }, { value: 'check', label: 'Check' }]; scope.job_type_options = [{
scope.verbosity_options = [ value: 'run',
{ value: '0', label: 'Default' }, label: 'Run'
{ value: '1', label: 'Verbose' }, }, {
{ value: '3', label: 'Debug' } value: 'check',
]; label: 'Check'
}];
scope.verbosity_options = [{
value: '0',
label: 'Default'
}, {
value: '1',
label: 'Verbose'
}, {
value: '3',
label: 'Debug'
}];
scope.playbook_options = null; scope.playbook_options = null;
scope.playbook = null; scope.playbook = null;
function calcRows (content) { function calcRows(content) {
var n = content.match(/\n/g), var n = content.match(/\n/g),
rows = (n) ? n.length : 1; rows = (n) ? n.length : 1;
return (rows > 15) ? 15 : rows; return (rows > 15) ? 15 : rows;
@@ -313,8 +348,8 @@ function JobsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams,
// Retrieve detail record and prepopulate the form // Retrieve detail record and prepopulate the form
Wait('start'); Wait('start');
Rest.setUrl(defaultUrl + ':id/'); Rest.setUrl(defaultUrl + ':id/');
Rest.get({ params: {id: id} }) Rest.get({ params: { id: id } })
.success( function(data) { .success(function (data) {
//LoadBreadCrumbs({ path: '/jobs/' + id, title: data.id + ' - ' + data.summary_fields.job_template.name }); //LoadBreadCrumbs({ path: '/jobs/' + id, title: data.id + ' - ' + data.summary_fields.job_template.name });
var i, cDate, fld, json_obj, related, set; var i, cDate, fld, json_obj, related, set;
LoadBreadCrumbs(); LoadBreadCrumbs();
@@ -322,18 +357,16 @@ function JobsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams,
if (fld !== 'variables' && data[fld] !== null && data[fld] !== undefined) { if (fld !== 'variables' && data[fld] !== null && data[fld] !== undefined) {
if (form.fields[fld].type === 'select') { if (form.fields[fld].type === 'select') {
if (scope[fld + '_options'] && scope[fld + '_options'].length > 0) { if (scope[fld + '_options'] && scope[fld + '_options'].length > 0) {
for (i=0; i < scope[fld + '_options'].length; i++) { for (i = 0; i < scope[fld + '_options'].length; i++) {
if (data[fld] === scope[fld + '_options'][i].value) { if (data[fld] === scope[fld + '_options'][i].value) {
scope[fld] = scope[fld + '_options'][i]; scope[fld] = scope[fld + '_options'][i];
} }
} }
} } else {
else {
scope[fld] = data[fld]; scope[fld] = data[fld];
} }
} }
} } else {
else {
scope[fld] = data[fld]; scope[fld] = data[fld];
} }
master[fld] = scope[fld]; master[fld] = scope[fld];
@@ -347,8 +380,7 @@ function JobsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams,
if ($.isEmptyObject(data.extra_vars) || data.extra_vars === "{}" || data.extra_vars === "null" || if ($.isEmptyObject(data.extra_vars) || data.extra_vars === "{}" || data.extra_vars === "null" ||
data.extra_vars === "" || data.extra_vars === null) { data.extra_vars === "" || data.extra_vars === null) {
scope.variables = "---"; scope.variables = "---";
} } else {
else {
json_obj = JSON.parse(data.extra_vars); json_obj = JSON.parse(data.extra_vars);
scope.variables = jsyaml.safeDump(json_obj); scope.variables = jsyaml.safeDump(json_obj);
} }
@@ -367,8 +399,7 @@ function JobsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams,
// Convert created date to local time zone // Convert created date to local time zone
cDate = new Date(data.created); cDate = new Date(data.created);
scope.created = FormatDate(cDate); scope.created = FormatDate(cDate);
} } else {
else {
scope[fld] = data[fld]; scope[fld] = data[fld];
} }
} }
@@ -376,7 +407,7 @@ function JobsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams,
scope.statusToolTip = JobStatusToolTip(data.status); scope.statusToolTip = JobStatusToolTip(data.status);
$('form[name="jobs_form"] input[type="text"], form[name="jobs_form"] jobs_form textarea').attr('readonly','readonly'); $('form[name="jobs_form"] input[type="text"], form[name="jobs_form"] jobs_form textarea').attr('readonly', 'readonly');
$('form[name="jobs_form"] select').prop('disabled', 'disabled'); $('form[name="jobs_form"] select').prop('disabled', 'disabled');
$('form[name="jobs_form"] .lookup-btn').prop('disabled', 'disabled'); $('form[name="jobs_form"] .lookup-btn').prop('disabled', 'disabled');
$('form[name="jobs_form"] .buttons, form[name="jobs_form"] hr').hide(); $('form[name="jobs_form"] .buttons, form[name="jobs_form"] hr').hide();
@@ -385,7 +416,10 @@ function JobsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams,
related = data.related; related = data.related;
for (set in form.related) { for (set in form.related) {
if (related[set]) { if (related[set]) {
relatedSets[set] = { url: related[set], iterator: form.related[set].iterator }; relatedSets[set] = {
url: related[set],
iterator: form.related[set].iterator
};
} }
} }
@@ -418,21 +452,30 @@ function JobsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams,
}); });
// Initialize related search functions. Doing it here to make sure relatedSets object is populated. // Initialize related search functions. Doing it here to make sure relatedSets object is populated.
RelatedSearchInit({ scope: scope, form: form, relatedSets: relatedSets }); RelatedSearchInit({
RelatedPaginateInit({ scope: scope, relatedSets: relatedSets }); scope: scope,
form: form,
relatedSets: relatedSets
});
RelatedPaginateInit({
scope: scope,
relatedSets: relatedSets
});
scope.template_url = data.related.job_template; scope.template_url = data.related.job_template;
scope.$emit('jobLoaded', data.related.cloud_credential); scope.$emit('jobLoaded', data.related.cloud_credential);
}) })
.error( function(data, status) { .error(function (data, status) {
ProcessErrors(scope, data, status, form, ProcessErrors(scope, data, status, form, {
{ hdr: 'Error!', msg: 'Failed to retrieve job: ' + $routeParams.id + '. GET status: ' + status }); hdr: 'Error!',
msg: 'Failed to retrieve job: ' + $routeParams.id + '. GET status: ' + status
});
}); });
scope.refresh = function() { scope.refresh = function () {
Wait('start'); Wait('start');
Rest.setUrl(defaultUrl + id + '/'); Rest.setUrl(defaultUrl + id + '/');
Rest.get() Rest.get()
.success( function(data) { .success(function (data) {
scope.status = data.status; scope.status = data.status;
scope.result_stdout = data.result_stdout; scope.result_stdout = data.result_stdout;
scope.result_traceback = data.result_traceback; scope.result_traceback = data.result_traceback;
@@ -440,25 +483,26 @@ function JobsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams,
scope.traceback_rows = calcRows(scope.result_traceback); scope.traceback_rows = calcRows(scope.result_traceback);
Wait('stop'); Wait('stop');
}) })
.error( function(data, status) { .error(function (data, status) {
Wait('stop'); Wait('stop');
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, {
{ hdr: 'Error!', msg: 'Attempt to load job failed. GET returned status: ' + status }); hdr: 'Error!',
msg: 'Attempt to load job failed. GET returned status: ' + status
});
}); });
}; };
scope.jobSummary = function() { scope.jobSummary = function () {
$location.path('/jobs/' + id + '/job_host_summaries'); $location.path('/jobs/' + id + '/job_host_summaries');
}; };
scope.jobEvents = function() { scope.jobEvents = function () {
$location.path('/jobs/' + id + '/job_events'); $location.path('/jobs/' + id + '/job_events');
}; };
} }
JobsEdit.$inject = [ '$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'JobForm', JobsEdit.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'JobForm',
'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'RelatedSearchInit', 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'RelatedSearchInit', 'RelatedPaginateInit',
'RelatedPaginateInit', 'ReturnToCaller', 'ClearScope', 'InventoryList', 'CredentialList', 'ReturnToCaller', 'ClearScope', 'InventoryList', 'CredentialList', 'ProjectList', 'LookUpInit', 'PromptPasswords',
'ProjectList', 'LookUpInit', 'PromptPasswords', 'GetBasePath', 'md5Setup', 'FormatDate', 'GetBasePath', 'md5Setup', 'FormatDate', 'JobStatusToolTip', 'Wait'
'JobStatusToolTip', 'Wait' ];
];

View File

@@ -10,159 +10,184 @@
'use strict'; 'use strict';
function OrganizationsList ($routeParams, $scope, $rootScope, $location, $log, Rest, Alert, LoadBreadCrumbs, Prompt, function OrganizationsList($routeParams, $scope, $rootScope, $location, $log, Rest, Alert, LoadBreadCrumbs, Prompt,
GenerateList, OrganizationList, SearchInit, PaginateInit, ClearScope, ProcessErrors, GenerateList, OrganizationList, SearchInit, PaginateInit, ClearScope, ProcessErrors, GetBasePath, SelectionInit, Wait, Stream) {
GetBasePath, SelectionInit, Wait, Stream)
{ ClearScope('htmlTemplate');
ClearScope('htmlTemplate'); //Garbage collection. Don't leave behind any listeners/watchers from the prior
//scope. var list = OrganizationList,
generate = GenerateList,
paths = $location.path().replace(/^\//, '').split('/'),
mode = (paths[0] === 'organizations') ? 'edit' : 'select', // if base path 'users', we're here to add/edit users
scope = generate.inject(OrganizationList, { mode: mode }),
defaultUrl = GetBasePath('organizations'),
url;
var list = OrganizationList;
var generate = GenerateList;
var paths = $location.path().replace(/^\//,'').split('/');
var mode = (paths[0] == 'organizations') ? 'edit' : 'select'; // if base path 'users', we're here to add/edit users
var scope = generate.inject(OrganizationList, { mode: mode }); // Inject our view
var defaultUrl = GetBasePath('organizations');
var iterator = list.iterator;
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
LoadBreadCrumbs(); LoadBreadCrumbs();
var url = GetBasePath('projects') + $routeParams.project_id + '/organizations/'; url = GetBasePath('projects') + $routeParams.project_id + '/organizations/';
SelectionInit({ scope: scope, list: list, url: url, returnToCaller: 1 }); SelectionInit({
scope: scope,
list: list,
url: url,
returnToCaller: 1
});
if (scope.removePostRefresh) { if (scope.removePostRefresh) {
scope.removePostRefresh(); scope.removePostRefresh();
} }
scope.removePostRefresh = scope.$on('PostRefresh', function() { scope.removePostRefresh = scope.$on('PostRefresh', function () {
// Cleanup after a delete // Cleanup after a delete
Wait('stop'); Wait('stop');
$('#prompt-modal').off(); $('#prompt-modal').off();
}); });
// Initialize search and paginate pieces and load data // Initialize search and paginate pieces and load data
SearchInit({ scope: scope, set: list.name, list: list, url: defaultUrl }); SearchInit({
PaginateInit({ scope: scope, list: list, url: defaultUrl }); scope: scope,
set: list.name,
list: list,
url: defaultUrl
});
PaginateInit({
scope: scope,
list: list,
url: defaultUrl
});
scope.search(list.iterator); scope.search(list.iterator);
scope.showActivity = function() { Stream({ scope: scope }); } scope.showActivity = function () {
Stream({
scope: scope
});
};
scope.addOrganization = function() { scope.addOrganization = function () {
$location.path($location.path() + '/add'); $location.path($location.path() + '/add');
} };
scope.editOrganization = function(id) { scope.editOrganization = function (id) {
$location.path($location.path() + '/' + id); $location.path($location.path() + '/' + id);
} };
scope.deleteOrganization = function(id, name) { scope.deleteOrganization = function (id, name) {
var action = function() { var action = function () {
$('#prompt-modal').on('hidden.bs.modal', function(){ Wait('start'); }); $('#prompt-modal').on('hidden.bs.modal', function () {
Wait('start');
});
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
var url = defaultUrl + id + '/'; var url = defaultUrl + id + '/';
Rest.setUrl(url); Rest.setUrl(url);
Rest.destroy() Rest.destroy()
.success( function(data, status, headers, config) { .success(function () {
scope.search(list.iterator); scope.search(list.iterator);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
Wait('stop'); Wait('stop');
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, {
{ hdr: 'Error!', msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status }); hdr: 'Error!',
msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status
});
}); });
}; };
Prompt({ hdr: 'Delete', Prompt({
hdr: 'Delete',
body: 'Are you sure you want to delete ' + name + '?', body: 'Are you sure you want to delete ' + name + '?',
action: action action: action
}); });
} };
} }
OrganizationsList.$inject=[ '$routeParams', '$scope', '$rootScope', '$location', '$log', 'Rest', 'Alert', 'LoadBreadCrumbs', 'Prompt', OrganizationsList.$inject = ['$routeParams', '$scope', '$rootScope', '$location', '$log', 'Rest', 'Alert', 'LoadBreadCrumbs', 'Prompt',
'GenerateList', 'OrganizationList', 'SearchInit', 'PaginateInit', 'ClearScope', 'ProcessErrors', 'GenerateList', 'OrganizationList', 'SearchInit', 'PaginateInit', 'ClearScope', 'ProcessErrors',
'GetBasePath', 'SelectionInit', 'Wait', 'Stream']; 'GetBasePath', 'SelectionInit', 'Wait', 'Stream'
];
function OrganizationsAdd ($scope, $rootScope, $compile, $location, $log, $routeParams, OrganizationForm, function OrganizationsAdd($scope, $rootScope, $compile, $location, $log, $routeParams, OrganizationForm,
GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ClearScope, GetBasePath, GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ClearScope, GetBasePath,
ReturnToCaller, Wait) ReturnToCaller, Wait) {
{
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.
// Inject dynamic view // Inject dynamic view
var generator = GenerateForm; var generator = GenerateForm,
var form = OrganizationForm; form = OrganizationForm,
var scope = generator.inject(form, {mode: 'add', related: false}); scope = generator.inject(form, { mode: 'add', related: false }),
var base = $location.path().replace(/^\//,'').split('/')[0]; base = $location.path().replace(/^\//, '').split('/')[0];
var defaultUrl = GetBasePath('organizations');
generator.reset(); generator.reset();
LoadBreadCrumbs(); LoadBreadCrumbs();
// Save // Save
scope.formSave = function() { scope.formSave = function () {
generator.clearApiErrors(); generator.clearApiErrors();
Wait('start'); Wait('start');
var url = GetBasePath(base); var url = GetBasePath(base);
url += (base != 'organizations') ? $routeParams['project_id'] + '/organizations/' : ''; url += (base !== 'organizations') ? $routeParams.project_id + '/organizations/' : '';
Rest.setUrl(url); Rest.setUrl(url);
Rest.post({ name: $scope.name, Rest.post({
description: $scope.description }) name: $scope.name,
.success( function(data, status, headers, config) { description: $scope.description
})
.success(function (data) {
Wait('stop'); Wait('stop');
if (base == 'organizations') { if (base === 'organizations') {
$rootScope.flashMessage = "New organization successfully created!"; $rootScope.flashMessage = "New organization successfully created!";
$location.path('/organizations/' + data.id); $location.path('/organizations/' + data.id);
} } else {
else {
ReturnToCaller(1); ReturnToCaller(1);
} }
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
ProcessErrors(scope, data, status, form, ProcessErrors(scope, data, status, form, {
{ hdr: 'Error!', msg: 'Failed to add new organization. Post returned status: ' + status }); hdr: 'Error!',
msg: 'Failed to add new organization. Post returned status: ' + status
});
}); });
}; };
// Cancel // Cancel
scope.formReset = function() { scope.formReset = function () {
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
generator.reset(); generator.reset();
}; };
} }
OrganizationsAdd.$inject = [ '$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'OrganizationForm', OrganizationsAdd.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'OrganizationForm',
'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ClearScope', 'GetBasePath', 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ClearScope', 'GetBasePath',
'ReturnToCaller', 'Wait']; 'ReturnToCaller', 'Wait'
];
function OrganizationsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams, OrganizationForm, function OrganizationsEdit($scope, $rootScope, $compile, $location, $log, $routeParams, OrganizationForm,
GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, RelatedSearchInit, GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, RelatedSearchInit,
RelatedPaginateInit, Prompt, ClearScope, GetBasePath, Wait, Stream) RelatedPaginateInit, Prompt, ClearScope, GetBasePath, Wait, Stream) {
{
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.
// Inject dynamic view // Inject dynamic view
var form = OrganizationForm; var form = OrganizationForm,
var generator = GenerateForm; generator = GenerateForm,
var scope = GenerateForm.inject(form, {mode: 'edit', related: true}); scope = GenerateForm.inject(form, { mode: 'edit', related: true }),
generator.reset(); defaultUrl = GetBasePath('organizations'),
base = $location.path().replace(/^\//, '').split('/')[0],
master = {},
id = $routeParams.organization_id,
relatedSets = {};
var defaultUrl = GetBasePath('organizations'); generator.reset();
var base = $location.path().replace(/^\//,'').split('/')[0];
var master = {};
var id = $routeParams.organization_id;
var relatedSets = {};
// After the Organization is loaded, retrieve each related set // After the Organization is loaded, retrieve each related set
if (scope.organizationLoadedRemove) { if (scope.organizationLoadedRemove) {
scope.organizationLoadedRemove(); scope.organizationLoadedRemove();
} }
scope.organizationLoadedRemove = scope.$on('organizationLoaded', function() { scope.organizationLoadedRemove = scope.$on('organizationLoaded', function () {
for (var set in relatedSets) { for (var set in relatedSets) {
scope.search(relatedSets[set].iterator); scope.search(relatedSets[set].iterator);
} }
@@ -173,57 +198,76 @@ function OrganizationsEdit ($scope, $rootScope, $compile, $location, $log, $rout
Wait('start'); Wait('start');
Rest.setUrl(defaultUrl + id + '/'); Rest.setUrl(defaultUrl + id + '/');
Rest.get() Rest.get()
.success( function(data, status, headers, config) { .success(function (data) {
var fld, related, set;
LoadBreadCrumbs({ path: '/organizations/' + id, title: data.name }); LoadBreadCrumbs({ path: '/organizations/' + id, title: data.name });
for (var fld in form.fields) { for (fld in form.fields) {
if (data[fld]) { if (data[fld]) {
scope[fld] = data[fld]; scope[fld] = data[fld];
master[fld] = data[fld]; master[fld] = data[fld];
} }
} }
var related = data.related; related = data.related;
for (var set in form.related) { for (set in form.related) {
if (related[set]) { if (related[set]) {
relatedSets[set] = { url: related[set], iterator: form.related[set].iterator }; relatedSets[set] = {
url: related[set],
iterator: form.related[set].iterator
};
} }
} }
// Initialize related search functions. Doing it here to make sure relatedSets object is populated. // Initialize related search functions. Doing it here to make sure relatedSets object is populated.
RelatedSearchInit({ scope: scope, form: form, relatedSets: relatedSets }); RelatedSearchInit({
RelatedPaginateInit({ scope: scope, relatedSets: relatedSets }); scope: scope,
form: form,
relatedSets: relatedSets
});
RelatedPaginateInit({
scope: scope,
relatedSets: relatedSets
});
scope.$emit('organizationLoaded'); scope.$emit('organizationLoaded');
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
ProcessErrors(scope, data, status, form, ProcessErrors(scope, data, status, form, {
{ hdr: 'Error!', msg: 'Failed to retrieve organization: ' + $routeParams.id + '. GET status: ' + status }); hdr: 'Error!',
msg: 'Failed to retrieve organization: ' + $routeParams.id + '. GET status: ' + status
});
}); });
// Save changes to the parent // Save changes to the parent
scope.formSave = function() { scope.formSave = function () {
var fld, params = {};
generator.clearApiErrors(); generator.clearApiErrors();
Wait('start'); Wait('start');
var params = {}; for (fld in form.fields) {
for (var fld in form.fields) {
params[fld] = scope[fld]; params[fld] = scope[fld];
} }
Rest.setUrl(defaultUrl + id + '/'); Rest.setUrl(defaultUrl + id + '/');
Rest.put(params) Rest.put(params)
.success( function(data, status, headers, config) { .success(function () {
Wait('stop'); Wait('stop');
master = params; master = params;
$rootScope.flashMessage = "Your changes were successfully saved!"; $rootScope.flashMessage = "Your changes were successfully saved!";
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
Wait('stop'); Wait('stop');
ProcessErrors(scope, data, status, OrganizationForm, ProcessErrors(scope, data, status, OrganizationForm, {
{ hdr: 'Error!', msg: 'Failed to update organization: ' + id + '. PUT status: ' + status }); hdr: 'Error!',
msg: 'Failed to update organization: ' + id + '. PUT status: ' + status
});
}); });
}; };
scope.showActivity = function() { Stream({ scope: scope }); } scope.showActivity = function () {
Stream({
scope: scope
});
};
// Reset the form // Reset the form
scope.formReset = function() { scope.formReset = function () {
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
generator.reset(); generator.reset();
for (var fld in master) { for (var fld in master) {
@@ -232,47 +276,54 @@ function OrganizationsEdit ($scope, $rootScope, $compile, $location, $log, $rout
}; };
// 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.organization_id + '/' + set); $location.path('/' + base + '/' + $routeParams.organization_id + '/' + set);
}; };
// Related set: Edit button // Related set: Edit button
scope.edit = function(set, id, name) { scope.edit = function (set, id) {
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
$location.path('/' + set + '/' + id); $location.path('/' + set + '/' + id);
}; };
// Related set: Delete button // Related set: Delete button
scope['delete'] = function(set, itm_id, name, title) { scope['delete'] = function (set, itm_id, name, title) {
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
var action = function() { var action = function () {
Wait('start'); Wait('start');
var url = defaultUrl + $routeParams.organization_id + '/' + set + '/'; var url = defaultUrl + $routeParams.organization_id + '/' + set + '/';
Rest.setUrl(url); Rest.setUrl(url);
Rest.post({ id: itm_id, disassociate: 1 }) Rest.post({
.success( function(data, status, headers, config) { id: itm_id,
disassociate: 1
})
.success(function () {
Wait('stop'); Wait('stop');
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
scope.search(form.related[set].iterator); scope.search(form.related[set].iterator);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
Wait('stop'); Wait('stop');
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, {
{ hdr: 'Error!', msg: 'Call to ' + url + ' failed. POST returned status: ' + status }); hdr: 'Error!',
msg: 'Call to ' + url + ' failed. POST returned status: ' + status
});
}); });
}; };
Prompt({ hdr: 'Delete', Prompt({
hdr: 'Delete',
body: 'Are you sure you want to remove ' + name + ' from ' + scope.name + ' ' + title + '?', body: 'Are you sure you want to remove ' + name + ' from ' + scope.name + ' ' + title + '?',
action: action action: action
}); });
} };
} }
OrganizationsEdit.$inject = [ '$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'OrganizationForm', OrganizationsEdit.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'OrganizationForm',
'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'RelatedSearchInit', 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'RelatedSearchInit',
'RelatedPaginateInit', 'Prompt', 'ClearScope', 'GetBasePath', 'Wait', 'Stream']; 'RelatedPaginateInit', 'Prompt', 'ClearScope', 'GetBasePath', 'Wait', 'Stream'
];

View File

@@ -10,104 +10,120 @@
'use strict'; 'use strict';
function PermissionsList ($scope, $rootScope, $location, $log, $routeParams, Rest, Alert, PermissionList, function PermissionsList($scope, $rootScope, $location, $log, $routeParams, Rest, Alert, PermissionList,
GenerateList, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit, ReturnToCaller, GenerateList, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit, ReturnToCaller, ClearScope, ProcessErrors,
ClearScope, ProcessErrors, GetBasePath, CheckAccess, Wait) GetBasePath, CheckAccess, Wait) {
{
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 = PermissionList; var list = PermissionList,
var base = $location.path().replace(/^\//,'').split('/')[0]; base = $location.path().replace(/^\//, '').split('/')[0],
var defaultUrl = GetBasePath(base); defaultUrl = GetBasePath(base),
defaultUrl += ($routeParams['user_id'] !== undefined) ? $routeParams['user_id'] : $routeParams['team_id']; view = GenerateList,
scope = view.inject(list, { mode: 'edit' }); // Inject our view
defaultUrl += ($routeParams.user_id !== undefined) ? $routeParams.user_id : $routeParams.team_id;
defaultUrl += '/permissions/'; defaultUrl += '/permissions/';
var view = GenerateList;
var scope = view.inject(list, { mode: 'edit' }); // Inject our view
scope.selected = []; scope.selected = [];
CheckAccess({ scope: scope }); CheckAccess({
scope: scope
});
if (scope.removePostRefresh) { if (scope.removePostRefresh) {
scope.removePostRefresh(); scope.removePostRefresh();
} }
scope.removePostRefresh = scope.$on('PostRefresh', function() { scope.removePostRefresh = scope.$on('PostRefresh', function () {
// Cleanup after a delete // Cleanup after a delete
Wait('stop'); Wait('stop');
$('#prompt-modal').off(); $('#prompt-modal').off();
}); });
SearchInit({ scope: scope, set: 'permissions', list: list, url: defaultUrl }); SearchInit({
PaginateInit({ scope: scope, list: list, url: defaultUrl }); scope: scope,
set: 'permissions',
list: list,
url: defaultUrl
});
PaginateInit({
scope: scope,
list: list,
url: defaultUrl
});
scope.search(list.iterator); scope.search(list.iterator);
LoadBreadCrumbs(); LoadBreadCrumbs();
scope.addPermission = function() { scope.addPermission = function () {
if (scope.PermissionAddAllowed) { if (scope.PermissionAddAllowed) {
$location.path($location.path() + '/add'); $location.path($location.path() + '/add');
} }
} };
scope.editPermission = function(id) { scope.editPermission = function (id) {
$location.path($location.path() + '/' + id); $location.path($location.path() + '/' + id);
} };
scope.deletePermission = function(id, name) { scope.deletePermission = function (id, name) {
var action = function() { var action = function () {
$('#prompt-modal').on('hidden.bs.modal', function(){ Wait('start'); }); $('#prompt-modal').on('hidden.bs.modal', function () {
Wait('start');
});
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
var url = GetBasePath('base') + 'permissions/' + id + '/'; var url = GetBasePath('base') + 'permissions/' + id + '/';
Rest.setUrl(url); Rest.setUrl(url);
Rest.destroy() Rest.destroy()
.success( function(data, status, headers, config) { .success(function () {
scope.search(list.iterator); scope.search(list.iterator);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
Wait('stop'); Wait('stop');
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, {
{ hdr: 'Error!', msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status }); hdr: 'Error!',
msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status
});
}); });
}; };
if (scope.PermissionAddAllowed) { if (scope.PermissionAddAllowed) {
Prompt({ hdr: 'Delete', Prompt({
hdr: 'Delete',
body: 'Are you sure you want to delete ' + name + '?', body: 'Are you sure you want to delete ' + name + '?',
action: action action: action
}); });
} }
} };
} }
PermissionsList.$inject = [ '$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'PermissionList', PermissionsList.$inject = ['$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'PermissionList',
'GenerateList', 'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'GenerateList', 'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller',
'ClearScope', 'ProcessErrors', 'GetBasePath', 'CheckAccess', 'Wait' 'ClearScope', 'ProcessErrors', 'GetBasePath', 'CheckAccess', 'Wait'
]; ];
function PermissionsAdd ($scope, $rootScope, $compile, $location, $log, $routeParams, PermissionsForm, function PermissionsAdd($scope, $rootScope, $compile, $location, $log, $routeParams, PermissionsForm,
GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ClearScope, GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ClearScope,
GetBasePath, ReturnToCaller, InventoryList, ProjectList, LookUpInit, CheckAccess, GetBasePath, ReturnToCaller, InventoryList, ProjectList, LookUpInit, CheckAccess,
Wait, PermissionCategoryChange) Wait, PermissionCategoryChange) {
{
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.
// Inject dynamic view // Inject dynamic view
var form = PermissionsForm; var form = PermissionsForm,
var generator = GenerateForm; generator = GenerateForm,
var id = ($routeParams.user_id !== undefined) ? $routeParams.user_id : $routeParams.team_id; id = ($routeParams.user_id !== undefined) ? $routeParams.user_id : $routeParams.team_id,
var base = $location.path().replace(/^\//,'').split('/')[0]; base = $location.path().replace(/^\//, '').split('/')[0],
var defaultUrl = GetBasePath(base) + id + '/permissions'; scope = generator.inject(form, { mode: 'add', related: false }),
var scope = generator.inject(form, {mode: 'add', related: false}); master = {};
var master = {};
CheckAccess({ scope: scope }) CheckAccess({ scope: scope });
generator.reset(); generator.reset();
LoadBreadCrumbs(); LoadBreadCrumbs();
scope['inventoryrequired'] = true; scope.inventoryrequired = true;
scope['projectrequired'] = false; scope.projectrequired = false;
scope.category = 'Inventory'; scope.category = 'Inventory';
master.category = 'Inventory'; master.category = 'Inventory';
master.inventoryrequired = true; master.inventoryrequired = true;
@@ -130,34 +146,37 @@ function PermissionsAdd ($scope, $rootScope, $compile, $location, $log, $routePa
}); });
// Save // Save
scope.formSave = function() { scope.formSave = function () {
var fld, url, data = {};
generator.clearApiErrors(); generator.clearApiErrors();
Wait('start'); Wait('start');
if (scope.PermissionAddAllowed) { if (scope.PermissionAddAllowed) {
var data = {}; data = {};
for (var fld in form.fields) { for (fld in form.fields) {
data[fld] = scope[fld]; data[fld] = scope[fld];
} }
var url = (base == 'teams') ? GetBasePath('teams') + id + '/permissions/' : GetBasePath('users') + id + '/permissions/'; url = (base === 'teams') ? GetBasePath('teams') + id + '/permissions/' : GetBasePath('users') + id + '/permissions/';
Rest.setUrl(url); Rest.setUrl(url);
Rest.post(data) Rest.post(data)
.success( function(data, status, headers, config) { .success(function () {
Wait('stop'); Wait('stop');
ReturnToCaller(1); ReturnToCaller(1);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
Wait('stop'); Wait('stop');
ProcessErrors(scope, data, status, PermissionsForm, ProcessErrors(scope, data, status, PermissionsForm, {
{ hdr: 'Error!', msg: 'Failed to create new permission. Post returned status: ' + status }); hdr: 'Error!',
msg: 'Failed to create new permission. Post returned status: ' + status
}); });
} });
else { } else {
Alert('Access Denied', 'You do not have access to create new permission objects. Please contact a system administrator.', 'alert-danger'); Alert('Access Denied', 'You do not have access to create new permission objects. Please contact a system administrator.',
'alert-danger');
} }
}; };
// Cancel // Cancel
scope.formReset = function() { scope.formReset = function () {
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
generator.reset(); generator.reset();
for (var fld in master) { for (var fld in master) {
@@ -166,59 +185,63 @@ function PermissionsAdd ($scope, $rootScope, $compile, $location, $log, $routePa
scope.selectCategory(); scope.selectCategory();
}; };
scope.selectCategory = function() { PermissionCategoryChange({ scope: scope, reset: true }); }; scope.selectCategory = function () {
PermissionCategoryChange({
scope: scope,
reset: true
});
};
scope.selectCategory(); scope.selectCategory();
} }
PermissionsAdd.$inject = [ '$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'PermissionsForm', PermissionsAdd.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'PermissionsForm',
'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ClearScope', 'GetBasePath', 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ClearScope', 'GetBasePath', 'ReturnToCaller',
'ReturnToCaller', 'InventoryList', 'ProjectList', 'LookUpInit', 'CheckAccess', 'Wait', 'InventoryList', 'ProjectList', 'LookUpInit', 'CheckAccess', 'Wait', 'PermissionCategoryChange'
'PermissionCategoryChange' ];
];
function PermissionsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams, PermissionsForm, function PermissionsEdit($scope, $rootScope, $compile, $location, $log, $routeParams, PermissionsForm,
GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ReturnToCaller, GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ReturnToCaller,
ClearScope, Prompt, GetBasePath, InventoryList, ProjectList, LookUpInit, CheckAccess, ClearScope, Prompt, GetBasePath, InventoryList, ProjectList, LookUpInit, CheckAccess,
Wait, PermissionCategoryChange) Wait, PermissionCategoryChange) {
{
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 generator = GenerateForm; var generator = GenerateForm,
var form = PermissionsForm; form = PermissionsForm,
var scope = generator.inject(form, {mode: 'edit', related: true}); scope = generator.inject(form, { mode: 'edit', related: true }),
var base_id = ($routeParams.user_id !== undefined) ? $routeParams.user_id : $routeParams.team_id; base_id = ($routeParams.user_id !== undefined) ? $routeParams.user_id : $routeParams.team_id,
var base = $location.path().replace(/^\//,'').split('/')[0]; id = $routeParams.permission_id,
var id = $routeParams.permission_id; defaultUrl = GetBasePath('base') + 'permissions/' + id + '/',
var defaultUrl = GetBasePath('base') + 'permissions/' + id + '/'; master = {};
generator.reset(); generator.reset();
var master = {};
var relatedSets = {};
CheckAccess({ scope: scope }); CheckAccess({
scope: scope
});
scope.selectCategory = function(resetIn) { scope.selectCategory = function (resetIn) {
var reset = (resetIn == false) ? false : true; var reset = (resetIn === false) ? false : true;
PermissionCategoryChange({ scope: scope, reset: reset }); } PermissionCategoryChange({ scope: scope, reset: reset });
};
// Retrieve detail record and prepopulate the form // Retrieve detail record and prepopulate the form
Wait('start'); Wait('start');
Rest.setUrl(defaultUrl); Rest.setUrl(defaultUrl);
Rest.get() Rest.get()
.success( function(data, status, headers, config) { .success(function (data) {
var fld, sourceModel, sourceField;
LoadBreadCrumbs({ path: '/users/' + base_id + '/permissions/' + id, title: data.name }); LoadBreadCrumbs({ path: '/users/' + base_id + '/permissions/' + id, title: data.name });
for (fld in form.fields) {
for (var fld in form.fields) {
if (data[fld]) { if (data[fld]) {
if (form.fields[fld].sourceModel) { if (form.fields[fld].sourceModel) {
var sourceModel = form.fields[fld].sourceModel; sourceModel = form.fields[fld].sourceModel;
var sourceField = form.fields[fld].sourceField; sourceField = form.fields[fld].sourceField;
scope[sourceModel + '_' + sourceField] = data.summary_fields[sourceModel][sourceField]; scope[sourceModel + '_' + sourceField] = data.summary_fields[sourceModel][sourceField];
master[sourceModel + '_' + sourceField] = data.summary_fields[sourceModel][sourceField]; master[sourceModel + '_' + sourceField] = data.summary_fields[sourceModel][sourceField];
} }
@@ -228,10 +251,10 @@ function PermissionsEdit ($scope, $rootScope, $compile, $location, $log, $routeP
} }
scope.category = 'Deploy'; scope.category = 'Deploy';
if (data['permission_type'] != 'run' && data['permission_type'] != 'check' ) { if (data.permission_type !== 'run' && data.permission_type !== 'check') {
scope.category = 'Inventory'; scope.category = 'Inventory';
} }
master['category'] = scope.category; master.category = scope.category;
scope.selectCategory(false); //call without resetting scope.category value scope.selectCategory(false); //call without resetting scope.category value
LookUpInit({ LookUpInit({
@@ -252,49 +275,49 @@ function PermissionsEdit ($scope, $rootScope, $compile, $location, $log, $routeP
if (!scope.PermissionAddAllowed) { if (!scope.PermissionAddAllowed) {
// If not a privileged user, disable access // If not a privileged user, disable access
$('form[name="permission_form"]').find('select, input, button').each(function(index){ $('form[name="permission_form"]').find('select, input, button').each(function () {
if ($(this).is('input') || $(this).is('select')) { if ($(this).is('input') || $(this).is('select')) {
$(this).attr('readonly','readonly'); $(this).attr('readonly', 'readonly');
} }
if ( $(this).is('input[type="checkbox"]') || if ($(this).is('input[type="checkbox"]') ||
$(this).is('input[type="radio"]') || $(this).is('input[type="radio"]') ||
$(this).is('button') ) { $(this).is('button')) {
$(this).attr('disabled','disabled'); $(this).attr('disabled', 'disabled');
} }
}); });
} }
Wait('stop'); Wait('stop');
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
ProcessErrors(scope, data, status, form, ProcessErrors(scope, data, status, form, { hdr: 'Error!',
{ hdr: 'Error!', msg: 'Failed to retrieve Permission: ' + id + '. GET status: ' + status }); msg: 'Failed to retrieve Permission: ' + id + '. GET status: ' + status });
}); });
// Save changes to the parent // Save changes to the parent
scope.formSave = function() { scope.formSave = function () {
var fld, data = {};
generator.clearApiErrors(); generator.clearApiErrors();
Wait('start'); Wait('start');
var data = {} for (fld in form.fields) {
for (var fld in form.fields) {
data[fld] = scope[fld]; data[fld] = scope[fld];
} }
Rest.setUrl(defaultUrl); Rest.setUrl(defaultUrl);
Rest.put(data) Rest.put(data)
.success( function(data, status, headers, config) { .success(function () {
Wait('stop'); Wait('stop');
ReturnToCaller(1); ReturnToCaller(1);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
Wait('stop'); Wait('stop');
ProcessErrors(scope, data, status, form, ProcessErrors(scope, data, status, form, { hdr: 'Error!', msg: 'Failed to update Permission: ' +
{ hdr: 'Error!', msg: 'Failed to update Permission: ' + $routeParams.id + '. PUT status: ' + status }); $routeParams.id + '. PUT status: ' + status });
}); });
}; };
// Cancel // Cancel
scope.formReset = function() { scope.formReset = function () {
generator.reset(); generator.reset();
for (var fld in master) { for (var fld in master) {
scope[fld] = master[fld]; scope[fld] = master[fld];
@@ -304,9 +327,7 @@ function PermissionsEdit ($scope, $rootScope, $compile, $location, $log, $routeP
} }
PermissionsEdit.$inject = [ '$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'PermissionsForm', PermissionsEdit.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'PermissionsForm',
'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ReturnToCaller', 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ReturnToCaller', 'ClearScope', 'Prompt', 'GetBasePath',
'ClearScope', 'Prompt', 'GetBasePath', 'InventoryList', 'ProjectList', 'LookUpInit', 'CheckAccess', 'InventoryList', 'ProjectList', 'LookUpInit', 'CheckAccess', 'Wait', 'PermissionCategoryChange'
'Wait', 'PermissionCategoryChange' ];
];

View File

@@ -10,45 +10,50 @@
'use strict'; 'use strict';
function ProjectsList ($scope, $rootScope, $location, $log, $routeParams, Rest, Alert, ProjectList, function ProjectsList ($scope, $rootScope, $location, $log, $routeParams, Rest, Alert, ProjectList, GenerateList, LoadBreadCrumbs,
GenerateList, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit, ReturnToCaller, Prompt, SearchInit, PaginateInit, ReturnToCaller, ClearScope, ProcessErrors, GetBasePath, SelectionInit, ProjectUpdate,
ClearScope, ProcessErrors, GetBasePath, SelectionInit, ProjectUpdate, ProjectStatus, ProjectStatus, FormatDate, Refresh, Wait, Stream, GetChoices, Empty) {
FormatDate, Refresh, Wait, Stream, GetChoices)
{
ClearScope('htmlTemplate'); ClearScope('htmlTemplate');
Wait('start'); Wait('start');
var list = ProjectList; var list = ProjectList,
var defaultUrl = GetBasePath('projects'); defaultUrl = GetBasePath('projects'),
var view = GenerateList; view = GenerateList,
var base = $location.path().replace(/^\//,'').split('/')[0]; base = $location.path().replace(/^\//, '').split('/')[0],
var mode = (base == 'projects') ? 'edit' : 'select'; mode = (base === 'projects') ? 'edit' : 'select',
var scope = view.inject(list, { mode: mode }); scope = view.inject(list, { mode: mode }),
url = (base === 'teams') ? GetBasePath('teams') + $routeParams.team_id + '/projects/' : defaultUrl,
choiceCount = 0;
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
scope.projectLoading = true; scope.projectLoading = true;
var url = (base == 'teams') ? GetBasePath('teams') + $routeParams.team_id + '/projects/' : defaultUrl; if (mode === 'select') {
SelectionInit({
if (mode == 'select') { scope: scope,
SelectionInit({ scope: scope, list: list, url: url, returnToCaller: 1 }); list: list,
url: url,
returnToCaller: 1
});
} }
if (scope.removePostRefresh) { if (scope.removePostRefresh) {
scope.removePostRefresh(); scope.removePostRefresh();
} }
scope.removePostRefresh = scope.$on('PostRefresh', function() { scope.removePostRefresh = scope.$on('PostRefresh', function () {
// Cleanup after a delete // Cleanup after a delete
var j, i;
Wait('stop'); Wait('stop');
$('#prompt-modal').off(); $('#prompt-modal').off();
if (scope.projects) { if (scope.projects) {
for (var i=0; i < scope.projects.length; i++) { for (i = 0; i < scope.projects.length; i++) {
if (scope.projects[i].status == 'ok') { if (scope.projects[i].status === 'ok') {
scope.projects[i].status = 'n/a'; scope.projects[i].status = 'n/a';
} }
switch(scope.projects[i].status) { switch (scope.projects[i].status) {
case 'n/a': case 'n/a':
scope.projects[i].badge = 'none'; scope.projects[i].badge = 'none';
break; break;
@@ -66,14 +71,13 @@ function ProjectsList ($scope, $rootScope, $location, $log, $routeParams, Rest,
scope.projects[i].last_updated = (scope.projects[i].last_updated !== null) ? scope.projects[i].last_updated = (scope.projects[i].last_updated !== null) ?
FormatDate(new Date(scope.projects[i].last_updated)) : null; FormatDate(new Date(scope.projects[i].last_updated)) : null;
for (var j=0; j < scope.project_scm_type_options.length; j++) { for (j = 0; j < scope.project_scm_type_options.length; j++) {
if (scope.project_scm_type_options[j].value == scope.projects[i].scm_type) { if (scope.project_scm_type_options[j].value === scope.projects[i].scm_type) {
scope.projects[i].scm_type = scope.project_scm_type_options[j].label scope.projects[i].scm_type = scope.project_scm_type_options[j].label;
if (scope.projects[i].scm_type == 'Manual') { if (scope.projects[i].scm_type === 'Manual') {
scope.projects[i].scm_update_tooltip = 'Manaul projects do not require an SCM update'; scope.projects[i].scm_update_tooltip = 'Manaul projects do not require an SCM update';
scope.projects[i].scm_type_class = 'btn-disabled'; scope.projects[i].scm_type_class = 'btn-disabled';
} } else {
else {
scope.projects[i].scm_update_tooltip = "Start an SCM update"; scope.projects[i].scm_update_tooltip = "Start an SCM update";
scope.projects[i].scm_type_class = ""; scope.projects[i].scm_type_class = "";
} }
@@ -87,40 +91,49 @@ function ProjectsList ($scope, $rootScope, $location, $log, $routeParams, Rest,
if (scope.removeChoicesHere) { if (scope.removeChoicesHere) {
scope.removeChoicesHere(); scope.removeChoicesHere();
} }
scope.removeChoicesHere = scope.$on('choicesCompleteProject', function() { scope.removeChoicesHere = scope.$on('choicesCompleteProject', function () {
var opt;
list.fields.scm_type.searchOptions = scope.project_scm_type_options; list.fields.scm_type.searchOptions = scope.project_scm_type_options;
list.fields.status.searchOptions = scope.project_status_options; list.fields.status.searchOptions = scope.project_status_options;
if ($routeParams['scm_type'] && $routeParams['status']) { if ($routeParams.scm_type && $routeParams.status) {
// Request coming from home page. User wants all errors for an scm_type // Request coming from home page. User wants all errors for an scm_type
defaultUrl += '?status=' + $routeParams['status']; defaultUrl += '?status=' + $routeParams.status;
} }
SearchInit({ scope: scope, set: 'projects', list: list, url: defaultUrl }); SearchInit({
PaginateInit({ scope: scope, list: list, url: defaultUrl }); scope: scope,
set: 'projects',
list: list,
url: defaultUrl
});
PaginateInit({
scope: scope,
list: list,
url: defaultUrl
});
if ($routeParams['scm_type']) { if ($routeParams.scm_type) {
scope[list.iterator + 'SearchField'] = 'scm_type'; scope[list.iterator + 'SearchField'] = 'scm_type';
scope[list.iterator + 'SelectShow'] = true; scope[list.iterator + 'SelectShow'] = true;
scope[list.iterator + 'SearchSelectOpts'] = list.fields['scm_type'].searchOptions; scope[list.iterator + 'SearchSelectOpts'] = list.fields.scm_type.searchOptions;
scope[list.iterator + 'SearchFieldLabel'] = list.fields['scm_type'].label.replace(/\<br\>/g,' '); scope[list.iterator + 'SearchFieldLabel'] = list.fields.scm_type.label.replace(/<br\>/g, ' ');
for (var opt in list.fields['scm_type'].searchOptions) { for (opt in list.fields.scm_type.searchOptions) {
if (list.fields['scm_type'].searchOptions[opt].value == $routeParams['scm_type']) { if (list.fields.scm_type.searchOptions[opt].value === $routeParams.scm_type) {
scope[list.iterator + 'SearchSelectValue'] = list.fields['scm_type'].searchOptions[opt]; scope[list.iterator + 'SearchSelectValue'] = list.fields.scm_type.searchOptions[opt];
break; break;
} }
} }
} } else if ($routeParams.status) {
else if ($routeParams['status']) { scope[list.iterator + 'SearchValue'] = $routeParams.status;
scope[list.iterator + 'SearchValue'] = $routeParams['status'];
scope[list.iterator + 'SearchField'] = 'status'; scope[list.iterator + 'SearchField'] = 'status';
scope[list.iterator + 'SelectShow'] = true; scope[list.iterator + 'SelectShow'] = true;
scope[list.iterator + 'SearchFieldLabel'] = list.fields['status'].label; scope[list.iterator + 'SearchFieldLabel'] = list.fields.status.label;
scope[list.iterator + 'SearchSelectOpts'] = list.fields['status'].searchOptions; scope[list.iterator + 'SearchSelectOpts'] = list.fields.status.searchOptions;
for (var opt in list.fields['status'].searchOptions) { for (opt in list.fields.status.searchOptions) {
if (list.fields['status'].searchOptions[opt].value == $routeParams['status']) { if (list.fields.status.searchOptions[opt].value === $routeParams.status) {
scope[list.iterator + 'SearchSelectValue'] = list.fields['status'].searchOptions[opt]; scope[list.iterator + 'SearchSelectValue'] = list.fields.status.searchOptions[opt];
break; break;
} }
} }
@@ -128,14 +141,12 @@ function ProjectsList ($scope, $rootScope, $location, $log, $routeParams, Rest,
scope.search(list.iterator); scope.search(list.iterator);
}); });
var choiceCount = 0;
if (scope.removeChoicesReady) { if (scope.removeChoicesReady) {
scope.removeChoicesReady(); scope.removeChoicesReady();
} }
scope.removeChoicesReady = scope.$on('choicesReadyProject', function() { scope.removeChoicesReady = scope.$on('choicesReadyProject', function () {
choiceCount++; choiceCount++;
if (choiceCount == 2) { if (choiceCount === 2) {
scope.$emit('choicesCompleteProject'); scope.$emit('choicesCompleteProject');
} }
}); });
@@ -160,22 +171,24 @@ function ProjectsList ($scope, $rootScope, $location, $log, $routeParams, Rest,
LoadBreadCrumbs(); LoadBreadCrumbs();
scope.showActivity = function() { Stream({ scope: scope }); } scope.showActivity = function () {
Stream({ scope: scope });
};
scope.addProject = function() { scope.addProject = function () {
$location.path($location.path() + '/add'); $location.path($location.path() + '/add');
} };
scope.editProject = function(id) { scope.editProject = function (id) {
$location.path($location.path() + '/' + id); $location.path($location.path() + '/' + id);
} };
scope.showSCMStatus = function(id) { scope.showSCMStatus = function (id) {
// Refresh the project list // Refresh the project list
var statusCheckRemove = scope.$on('PostRefresh', function() { var i, statusCheckRemove = scope.$on('PostRefresh', function () {
var project; var project;
for (var i=0; i < scope.projects.length; i++) { for (i= 0; i < scope.projects.length; i++) {
if (scope.projects[i].id == id) { if (scope.projects[i].id === id) {
project = scope.projects[i]; project = scope.projects[i];
break; break;
} }
@@ -183,18 +196,21 @@ function ProjectsList ($scope, $rootScope, $location, $log, $routeParams, Rest,
if (project.scm_type !== null) { if (project.scm_type !== null) {
if (project.related.current_update) { if (project.related.current_update) {
Wait('start'); Wait('start');
ProjectStatus({ project_id: id, last_update: project.related.current_update }); ProjectStatus({
} project_id: id,
else if (project.related.last_update) { last_update: project.related.current_update
});
} else if (project.related.last_update) {
Wait('start'); Wait('start');
ProjectStatus({ project_id: id, last_update: project.related.last_update }); ProjectStatus({
} project_id: id,
else { last_update: project.related.last_update
});
} else {
Alert('No Updates Available', 'There is no SCM update information available for this project. An update has not yet been ' + Alert('No Updates Available', 'There is no SCM update information available for this project. An update has not yet been ' +
' completed. If you have not already done so, start an update for this project.', 'alert-info'); ' completed. If you have not already done so, start an update for this project.', 'alert-info');
} }
} } else {
else {
Alert('Missing SCM Configuration', 'The selected project is not configured for SCM. You must first edit the project, provide SCM settings, ' + Alert('Missing SCM Configuration', 'The selected project is not configured for SCM. You must first edit the project, provide SCM settings, ' +
'and then run an update.', 'alert-info'); 'and then run an update.', 'alert-info');
} }
@@ -203,77 +219,78 @@ function ProjectsList ($scope, $rootScope, $location, $log, $routeParams, Rest,
// Refresh the project list so we're looking at the latest data // Refresh the project list so we're looking at the latest data
scope.search(list.iterator, null, false, true); scope.search(list.iterator, null, false, true);
} };
scope.deleteProject = function(id, name) { scope.deleteProject = function (id, name) {
var action = function() { var action = function () {
$('#prompt-modal').on('hiden.bs.modal', function(){ Wait('start'); }); $('#prompt-modal').on('hiden.bs.modal', function () {
Wait('start');
});
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
var url = defaultUrl + id + '/'; var url = defaultUrl + id + '/';
Rest.setUrl(url); Rest.setUrl(url);
Rest.destroy() Rest.destroy()
.success( function(data, status, headers, config) { .success(function () {
scope.search(list.iterator); scope.search(list.iterator);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
Wait('stop'); Wait('stop');
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, {
{ hdr: 'Error!', msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status }); hdr: 'Error!',
msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status
});
}); });
}; };
Prompt({ hdr: 'Delete', Prompt({
hdr: 'Delete',
body: 'Are you sure you want to delete ' + name + '?', body: 'Are you sure you want to delete ' + name + '?',
action: action action: action
}); });
} };
if (scope.removeCancelUpdate) { if (scope.removeCancelUpdate) {
scope.removeCancelUpdate(); scope.removeCancelUpdate();
} }
scope.removeCancelUpdate = scope.$on('Cancel_Update', function(e, url) { scope.removeCancelUpdate = scope.$on('Cancel_Update', function (e, url) {
// Cancel the project update process // Cancel the project update process
Rest.setUrl(url) Rest.setUrl(url);
Rest.post() Rest.post()
.success( function(data, status, headers, config) { .success(function () {
Alert('SCM Update Cancel', 'Your request to cancel the update was submitted to the task maanger.', 'alert-info'); Alert('SCM Update Cancel', 'Your request to cancel the update was submitted to the task maanger.', 'alert-info');
scope.refresh(); scope.refresh();
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, { hdr: 'Error!', msg: 'Call to ' + url + ' failed. POST status: ' + status });
{ hdr: 'Error!', msg: 'Call to ' + url + ' failed. POST status: ' + status });
}); });
}); });
if (scope.removeCheckCancel) { if (scope.removeCheckCancel) {
scope.removeCheckCancel(); scope.removeCheckCancel();
} }
scope.removeCheckCancel = scope.$on('Check_Cancel', function(e, data) { scope.removeCheckCancel = scope.$on('Check_Cancel', function (e, data) {
// Check that we 'can' cancel the update // Check that we 'can' cancel the update
var url = data.related.cancel; var url = data.related.cancel;
Rest.setUrl(url); Rest.setUrl(url);
Rest.get() Rest.get()
.success( function(data, status, headers, config) { .success(function (data) {
if (data.can_cancel) { if (data.can_cancel) {
scope.$emit('Cancel_Update', url); scope.$emit('Cancel_Update', url);
} } else {
else { Alert('Cancel Not Allowed', 'Either you do not have access or the SCM update process completed. ' +
Alert('Cancel Not Allowed', 'Either you do not have access or the SCM update process completed. Click the <em>Refresh</em> button to' + 'Click the <em>Refresh</em> button to view the latest status.', 'alert-info');
' view the latest status.', 'alert-info');
} }
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, { hdr: 'Error!', msg: 'Call to ' + url + ' failed. GET status: ' + status });
{ hdr: 'Error!', msg: 'Call to ' + url + ' failed. GET status: ' + status });
}); });
}); });
scope.cancelUpdate = function(id, name) { scope.cancelUpdate = function (id, name) {
// Start the cancel process // Start the cancel process
var project; var i, project, found = false;
var found = false; for (i = 0; i < scope.projects.length; i++) {
for (var i=0; i < scope.projects.length; i++) { if (scope.projects[i].id === id) {
if (scope.projects[i].id == id) {
project = scope.projects[i]; project = scope.projects[i];
found = true; found = true;
break; break;
@@ -282,86 +299,96 @@ function ProjectsList ($scope, $rootScope, $location, $log, $routeParams, Rest,
if (found && project.related.current_update) { if (found && project.related.current_update) {
Rest.setUrl(project.related.current_update); Rest.setUrl(project.related.current_update);
Rest.get() Rest.get()
.success( function(data, status, headers, config) { .success(function (data) {
scope.$emit('Check_Cancel', data); scope.$emit('Check_Cancel', data);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, {
{ hdr: 'Error!', msg: 'Call to ' + project.related.current_update + ' failed. GET status: ' + status }); hdr: 'Error!',
msg: 'Call to ' + project.related.current_update + ' failed. GET status: ' + status
}); });
} });
else { } else {
Alert('Update Not Found', 'An SCM update does not appear to be running for project: ' + name + '. Click the <em>Refresh</em> ' + Alert('Update Not Found', 'An SCM update does not appear to be running for project: ' + name + '. Click the <em>Refresh</em> ' +
'button to view the latet status.', 'alert-info'); 'button to view the latet status.', 'alert-info');
} }
} };
scope.refresh = function() { scope.refresh = function () {
Wait('start'); Wait('start');
scope['projectLoading'] = false; scope.projectLoading = false;
Refresh({ scope: scope, set: 'projects', iterator: 'project', url: scope['current_url'] }); Refresh({
} scope: scope,
set: 'projects',
iterator: 'project',
url: scope.current_url
});
};
scope.SCMUpdate = function(project_id) { scope.SCMUpdate = function (project_id) {
for (var i=0; i < scope.projects.length; i++) { var i;
if (scope.projects[i].id == project_id) { for (i = 0; i < scope.projects.length; i++) {
if (scope.projects[i].scm_type == "Manual" || scope.projects[i].scm_type == "" || scope.projects[i].scm_type == null ) { if (scope.projects[i].id === project_id) {
if (scope.projects[i].scm_type === "Manual" || Empty(scope.projects[i].scm_type)) {
// Do not respond. Button appears greyed out as if it is disabled. Not disabled though, because we need mouse over event // Do not respond. Button appears greyed out as if it is disabled. Not disabled though, because we need mouse over event
// to work. So user can click, but we just won't do anything. // to work. So user can click, but we just won't do anything.
//Alert('Missing SCM Setup', 'Before running an SCM update, edit the project and provide the SCM access information.', 'alert-info'); //Alert('Missing SCM Setup', 'Before running an SCM update, edit the project and provide the SCM access information.', 'alert-info');
break; break;
} } else if (scope.projects[i].status === 'updating') {
else if (scope.projects[i].status == 'updating') {
Alert('Update in Progress', 'The SCM update process is running. Use the Refresh button to monitor the status.', 'alert-info'); Alert('Update in Progress', 'The SCM update process is running. Use the Refresh button to monitor the status.', 'alert-info');
} } else {
else { ProjectUpdate({
ProjectUpdate({ scope: scope, project_id: project_id }); scope: scope,
} project_id: project_id
});
} }
} }
} }
};
} }
ProjectsList.$inject = [ '$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'ProjectList', 'GenerateList', ProjectsList.$inject = ['$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'ProjectList', 'GenerateList',
'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'ClearScope', 'ProcessErrors', 'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'ClearScope', 'ProcessErrors', 'GetBasePath',
'GetBasePath', 'SelectionInit', 'ProjectUpdate', 'ProjectStatus', 'FormatDate', 'Refresh', 'Wait', 'Stream', 'SelectionInit', 'ProjectUpdate', 'ProjectStatus', 'FormatDate', 'Refresh', 'Wait', 'Stream', 'GetChoices', 'Empty'
'GetChoices' ]; ];
function ProjectsAdd ($scope, $rootScope, $compile, $location, $log, $routeParams, ProjectsForm, function ProjectsAdd($scope, $rootScope, $compile, $location, $log, $routeParams, ProjectsForm,
GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ClearScope, GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ClearScope,
GetBasePath, ReturnToCaller, GetProjectPath, LookUpInit, OrganizationList, GetBasePath, ReturnToCaller, GetProjectPath, LookUpInit, OrganizationList,
CredentialList, GetChoices, DebugForm, Wait) CredentialList, GetChoices, DebugForm, Wait) {
{
ClearScope('tree-form'); ClearScope('tree-form');
ClearScope('htmlTemplate'); ClearScope('htmlTemplate');
// Inject dynamic view // Inject dynamic view
var form = ProjectsForm; var form = ProjectsForm,
var generator = GenerateForm; generator = GenerateForm,
var base = $location.path().replace(/^\//,'').split('/')[0]; base = $location.path().replace(/^\//, '').split('/')[0],
var defaultUrl = GetBasePath('projects'); defaultUrl = GetBasePath('projects'),
var scope = generator.inject(form, {mode: 'add', related: false}); scope = generator.inject(form, { mode: 'add', related: false }),
var id = $routeParams.id; master = {};
var master = {};
generator.reset(); generator.reset();
LoadBreadCrumbs(); LoadBreadCrumbs();
GetProjectPath({ scope: scope, master: master }); GetProjectPath({
scope: scope,
master: master
});
if (scope.removeChoicesReady) { if (scope.removeChoicesReady) {
scope.removeChoicesReady(); scope.removeChoicesReady();
} }
scope.removeChoicesReady = scope.$on('choicesReady', function() { scope.removeChoicesReady = scope.$on('choicesReady', function () {
for (var i=0; i < scope.scm_type_options.length; i++) { var i;
if (scope.scm_type_options[i].value == '') { for (i = 0; i < scope.scm_type_options.length; i++) {
scope['scm_type'] = scope.scm_type_options[i]; if (scope.scm_type_options[i].value === '') {
scope.scm_type = scope.scm_type_options[i];
break; break;
} }
} }
scope.scmRequired = false; scope.scmRequired = false;
master['scm_type'] = scope['scm_type']; master.scm_type = scope.scm_type;
}); });
// Load the list of options for Kind // Load the list of options for Kind
@@ -389,16 +416,16 @@ function ProjectsAdd ($scope, $rootScope, $compile, $location, $log, $routeParam
}); });
// Save // Save
scope.formSave = function() { scope.formSave = function () {
var i, fld, url, data={};
generator.clearApiErrors(); generator.clearApiErrors();
var data = {}; data = {};
for (var fld in form.fields) { for (fld in form.fields) {
if (form.fields[fld].type == 'checkbox_group') { if (form.fields[fld].type === 'checkbox_group') {
for (var i=0; i < form.fields[fld].fields.length; i++) { for (i = 0; i < form.fields[fld].fields.length; i++) {
data[form.fields[fld].fields[i].name] = scope[form.fields[fld].fields[i].name]; data[form.fields[fld].fields[i].name] = scope[form.fields[fld].fields[i].name];
} }
} } else {
else {
if (form.fields[fld].type !== 'alertblock') { if (form.fields[fld].type !== 'alertblock') {
data[fld] = scope[fld]; data[fld] = scope[fld];
} }
@@ -407,85 +434,91 @@ function ProjectsAdd ($scope, $rootScope, $compile, $location, $log, $routeParam
data.scm_type = scope.scm_type.value; data.scm_type = scope.scm_type.value;
if (scope.scm_type.value !== '') { if (scope.scm_type.value !== '') {
delete data.local_path; delete data.local_path;
} } else {
else {
data.local_path = scope.local_path.value; data.local_path = scope.local_path.value;
} }
var url = (base == 'teams') ? GetBasePath('teams') + $routeParams.team_id + '/projects/' : defaultUrl; url = (base === 'teams') ? GetBasePath('teams') + $routeParams.team_id + '/projects/' : defaultUrl;
Wait('start'); Wait('start');
Rest.setUrl(url); Rest.setUrl(url);
Rest.post(data) Rest.post(data)
.success( function(data, status, headers, config) { .success(function (data) {
var id = data.id; var id = data.id,
var url = GetBasePath('projects') + id + '/organizations/'; url = GetBasePath('projects') + id + '/organizations/',
var org = { id: scope.organization }; org = { id: scope.organization };
Rest.setUrl(url); Rest.setUrl(url);
Rest.post(org) Rest.post(org)
.success( function(data, status, headers, config) { .success(function () {
Wait('stop'); Wait('stop');
$rootScope.flashMessage = "New project successfully created!"; $rootScope.flashMessage = "New project successfully created!";
(base == 'projects') ? ReturnToCaller() : ReturnToCaller(1); if (base === 'projects') {
ReturnToCaller();
}
ReturnToCaller(1);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
Wait('stop'); Wait('stop');
ProcessErrors(scope, data, status, ProjectsForm, ProcessErrors(scope, data, status, ProjectsForm, {
{ hdr: 'Error!', msg: 'Failed to add organization to project. POST returned status: ' + status }); hdr: 'Error!',
msg: 'Failed to add organization to project. POST returned status: ' + status
});
}); });
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
Wait('stop'); Wait('stop');
ProcessErrors(scope, data, status, ProjectsForm, ProcessErrors(scope, data, status, ProjectsForm, {
{ hdr: 'Error!', msg: 'Failed to create new project. POST returned status: ' + status }); hdr: 'Error!',
msg: 'Failed to create new project. POST returned status: ' + status
});
}); });
}; };
scope.scmChange = function() { scope.scmChange = function () {
// When an scm_type is set, path is not required // When an scm_type is set, path is not required
if (scope.scm_type) { if (scope.scm_type) {
scope.pathRequired = (scope.scm_type.value == '') ? true : false; scope.pathRequired = (scope.scm_type.value === '') ? true : false;
scope.scmRequired = (scope.scm_type.value !== '') ? true : false; scope.scmRequired = (scope.scm_type.value !== '') ? true : false;
scope.scmBranchLabel = (scope.scm_type.value == 'svn') ? 'Revision #' : 'SCM Branch'; scope.scmBranchLabel = (scope.scm_type.value === 'svn') ? 'Revision #' : 'SCM Branch';
}
} }
};
// Cancel // Cancel
scope.formReset = function() { scope.formReset = function () {
var fld;
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
generator.reset(); generator.reset();
for (var fld in master) { for (fld in master) {
scope[fld] = master[fld]; scope.fld = master.fld;
} }
scope.scmChange(); scope.scmChange();
}; };
} }
ProjectsAdd.$inject = [ '$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'ProjectsForm', ProjectsAdd.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'ProjectsForm',
'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ClearScope', 'GetBasePath', 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ClearScope', 'GetBasePath',
'ReturnToCaller', 'GetProjectPath', 'LookUpInit', 'OrganizationList', 'CredentialList', 'GetChoices', 'ReturnToCaller', 'GetProjectPath', 'LookUpInit', 'OrganizationList', 'CredentialList', 'GetChoices',
'DebugForm', 'Wait' 'DebugForm', 'Wait'
]; ];
function ProjectsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams, ProjectsForm, function ProjectsEdit($scope, $rootScope, $compile, $location, $log, $routeParams, ProjectsForm,
GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, RelatedSearchInit, GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, RelatedSearchInit, RelatedPaginateInit, Prompt,
RelatedPaginateInit, Prompt, ClearScope, GetBasePath, ReturnToCaller, GetProjectPath, ClearScope, GetBasePath, ReturnToCaller, GetProjectPath, Authorization, CredentialList, LookUpInit, GetChoices,
Authorization, CredentialList, LookUpInit, GetChoices, Empty, DebugForm, Wait, Stream) Empty, DebugForm, Wait, Stream) {
{
ClearScope('tree-form');
ClearScope('htmlTemplate'); ClearScope('htmlTemplate');
// Inject dynamic view // Inject dynamic view
var form = ProjectsForm; var form = ProjectsForm,
var generator = GenerateForm; generator = GenerateForm,
var scope = generator.inject(form, {mode: 'edit', related: true}); scope = generator.inject(form, { mode: 'edit', related: true }),
generator.reset(); defaultUrl = GetBasePath('projects') + $routeParams.id + '/',
base = $location.path().replace(/^\//, '').split('/')[0],
master = {},
id = $routeParams.id,
relatedSets = {};
var defaultUrl = GetBasePath('projects') + $routeParams.id + '/'; generator.reset();
var base = $location.path().replace(/^\//,'').split('/')[0];
var master = {};
var id = $routeParams.id;
var relatedSets = {};
scope.project_local_paths = []; scope.project_local_paths = [];
scope.base_dir = ''; scope.base_dir = '';
@@ -494,19 +527,22 @@ function ProjectsEdit ($scope, $rootScope, $compile, $location, $log, $routePara
if (scope.projectLoadedRemove) { if (scope.projectLoadedRemove) {
scope.projectLoadedRemove(); scope.projectLoadedRemove();
} }
scope.projectLoadedRemove = scope.$on('projectLoaded', function() { scope.projectLoadedRemove = scope.$on('projectLoaded', function () {
for (var set in relatedSets) { var set, opts=[];
for (set in relatedSets) {
scope.search(relatedSets[set].iterator); scope.search(relatedSets[set].iterator);
} }
if (Authorization.getUserInfo('is_superuser') == true) { if (Authorization.getUserInfo('is_superuser') === true) {
GetProjectPath({ scope: scope, master: master }); GetProjectPath({ scope: scope, master: master });
} } else {
else { opts.push({
var opts = []; label: scope.local_path,
opts.push({ label: scope['local_path'], value: scope['local_path'] }); value: scope.local_path
});
scope.project_local_paths = opts; scope.project_local_paths = opts;
scope.local_path = scope['project_local_paths'][0]; scope.local_path = scope.project_local_paths[0];
scope.base_dir = 'You do not have access to view this property'; scope.base_dir = 'You do not have access to view this property';
} }
@@ -518,29 +554,29 @@ function ProjectsEdit ($scope, $rootScope, $compile, $location, $log, $routePara
field: 'credential' field: 'credential'
}); });
scope.pathRequired = (scope.scm_type.value == '') ? true : false; scope.pathRequired = (scope.scm_type.value === '') ? true : false;
scope.scmRequired = (scope.scm_type.value !== '') ? true : false; scope.scmRequired = (scope.scm_type.value !== '') ? true : false;
scope.scmBranchLabel = (scope.scm_type.value == 'svn') ? 'Revision #' : 'SCM Branch'; scope.scmBranchLabel = (scope.scm_type.value === 'svn') ? 'Revision #' : 'SCM Branch';
Wait('stop'); Wait('stop');
}); });
if (scope.removeChoicesReady) { if (scope.removeChoicesReady) {
scope.removeChoicesReady(); scope.removeChoicesReady();
} }
scope.removeChoicesReady = scope.$on('choicesReady', function() { scope.removeChoicesReady = scope.$on('choicesReady', function () {
// Retrieve detail record and prepopulate the form // Retrieve detail record and prepopulate the form
Rest.setUrl(defaultUrl); Rest.setUrl(defaultUrl);
Rest.get({ params: {id: id} }) Rest.get({ params: { id: id } })
.success( function(data, status, headers, config) { .success(function (data) {
var related, set, fld, i;
LoadBreadCrumbs({ path: '/projects/' + id, title: data.name }); LoadBreadCrumbs({ path: '/projects/' + id, title: data.name });
for (var fld in form.fields) { for (fld in form.fields) {
if (form.fields[fld].type == 'checkbox_group') { if (form.fields[fld].type === 'checkbox_group') {
for (var i=0; i < form.fields[fld].fields.length; i++) { for (i = 0; i < form.fields[fld].fields.length; i++) {
scope[form.fields[fld].fields[i].name] = data[form.fields[fld].fields[i].name]; scope[form.fields[fld].fields[i].name] = data[form.fields[fld].fields[i].name];
master[form.fields[fld].fields[i].name] = data[form.fields[fld].fields[i].name]; master[form.fields[fld].fields[i].name] = data[form.fields[fld].fields[i].name];
} }
} } else {
else {
if (data[fld]) { if (data[fld]) {
scope[fld] = data[fld]; scope[fld] = data[fld];
master[fld] = data[fld]; master[fld] = data[fld];
@@ -554,17 +590,20 @@ function ProjectsEdit ($scope, $rootScope, $compile, $location, $log, $routePara
data.summary_fields[form.fields[fld].sourceModel][form.fields[fld].sourceField]; data.summary_fields[form.fields[fld].sourceModel][form.fields[fld].sourceField];
} }
} }
var related = data.related; related = data.related;
for (var set in form.related) { for (set in form.related) {
if (related[set]) { if (related[set]) {
relatedSets[set] = { url: related[set], iterator: form.related[set].iterator }; relatedSets[set] = {
url: related[set],
iterator: form.related[set].iterator
};
} }
} }
data.scm_type = (Empty(data.scm_type)) ? '' : data.scm_type; data.scm_type = (Empty(data.scm_type)) ? '' : data.scm_type;
for (var i=0; i < scope.scm_type_options.length; i++) { for (i = 0; i < scope.scm_type_options.length; i++) {
if (scope.scm_type_options[i].value == data.scm_type) { if (scope.scm_type_options[i].value === data.scm_type) {
scope.scm_type = scope.scm_type_options[i]; scope.scm_type = scope.scm_type_options[i];
break; break;
} }
@@ -573,23 +612,31 @@ function ProjectsEdit ($scope, $rootScope, $compile, $location, $log, $routePara
if (scope.scm_type.value !== '') { if (scope.scm_type.value !== '') {
scope.pathRequired = false; scope.pathRequired = false;
scope.scmRequired = true; scope.scmRequired = true;
} } else {
else {
scope.pathRequired = true; scope.pathRequired = true;
scope.scmRequired = false; scope.scmRequired = false;
} }
master['scm_type'] = scope['scm_type']; master.scm_type = scope.scm_type;
scope.scmBranchLabel = (scope.scm_type.value == 'svn') ? 'Revision #' : 'SCM Branch'; scope.scmBranchLabel = (scope.scm_type.value === 'svn') ? 'Revision #' : 'SCM Branch';
// Initialize related search functions. Doing it here to make sure relatedSets object is populated. // Initialize related search functions. Doing it here to make sure relatedSets object is populated.
RelatedSearchInit({ scope: scope, form: form, relatedSets: relatedSets }); RelatedSearchInit({
RelatedPaginateInit({ scope: scope, relatedSets: relatedSets }); scope: scope,
form: form,
relatedSets: relatedSets
});
RelatedPaginateInit({
scope: scope,
relatedSets: relatedSets
});
scope.$emit('projectLoaded'); scope.$emit('projectLoaded');
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
ProcessErrors(scope, data, status, form, ProcessErrors(scope, data, status, form, {
{ hdr: 'Error!', msg: 'Failed to retrieve project: ' + id + '. GET status: ' + status }); hdr: 'Error!',
msg: 'Failed to retrieve project: ' + id + '. GET status: ' + status
});
}); });
}); });
@@ -605,18 +652,18 @@ function ProjectsEdit ($scope, $rootScope, $compile, $location, $log, $routePara
// Save changes to the parent // Save changes to the parent
scope.formSave = function() { scope.formSave = function () {
var fld, i, params;
generator.clearApiErrors(); generator.clearApiErrors();
Wait('start'); Wait('start');
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
var params = {}; params = {};
for (var fld in form.fields) { for (fld in form.fields) {
if (form.fields[fld].type == 'checkbox_group') { if (form.fields[fld].type === 'checkbox_group') {
for (var i=0; i < form.fields[fld].fields.length; i++) { for (i = 0; i < form.fields[fld].fields.length; i++) {
params[form.fields[fld].fields[i].name] = scope[form.fields[fld].fields[i].name]; params[form.fields[fld].fields[i].name] = scope[form.fields[fld].fields[i].name];
} }
} } else {
else {
if (form.fields[fld].type !== 'alertblock') { if (form.fields[fld].type !== 'alertblock') {
params[fld] = scope[fld]; params[fld] = scope[fld];
} }
@@ -626,85 +673,85 @@ function ProjectsEdit ($scope, $rootScope, $compile, $location, $log, $routePara
params.scm_type = scope.scm_type.value; params.scm_type = scope.scm_type.value;
if (scope.scm_type.value !== '') { if (scope.scm_type.value !== '') {
delete params.local_path; delete params.local_path;
} } else {
else {
params.local_path = scope.local_path.value; params.local_path = scope.local_path.value;
} }
Rest.setUrl(defaultUrl); Rest.setUrl(defaultUrl);
Rest.put(params) Rest.put(params)
.success( function(data, status, headers, config) { .success(function() {
Wait('stop'); Wait('stop');
ReturnToCaller(); ReturnToCaller();
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
Wait('stop'); Wait('stop');
ProcessErrors(scope, data, status, form, ProcessErrors(scope, data, status, form, { hdr: 'Error!', msg: 'Failed to update project: ' + id + '. PUT status: ' + status });
{ hdr: 'Error!', msg: 'Failed to update project: ' + id + '. PUT status: ' + status });
}); });
}; };
scope.showActivity = function() { Stream({ scope: scope }); } scope.showActivity = function () {
Stream({
scope: scope
});
};
// 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.id + '/' + set); $location.path('/' + base + '/' + $routeParams.id + '/' + set);
}; };
// Related set: Edit button // Related set: Edit button
scope.edit = function(set, id, name) { scope.edit = function (set, id) {
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
$location.path('/' + set + '/' + id); $location.path('/' + set + '/' + id);
}; };
// Related set: Delete button // Related set: Delete button
scope['delete'] = function(set, itm_id, name, title) { scope['delete'] = function (set, itm_id, name, title) {
var action = function() { var action = function () {
var url = GetBasePath('projects') + id + '/' + set + '/'; var url = GetBasePath('projects') + id + '/' + set + '/';
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
Rest.setUrl(url); Rest.setUrl(url);
Rest.post({ id: itm_id, disassociate: 1 }) Rest.post({ id: itm_id, disassociate: 1 })
.success( function(data, status, headers, config) { .success(function () {
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
scope.search(form.related[set].iterator); scope.search(form.related[set].iterator);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, { hdr: 'Error!', msg: 'Call to ' + url + ' failed. POST returned status: ' + status });
{ hdr: 'Error!', msg: 'Call to ' + url + ' failed. POST returned status: ' + status });
}); });
}; };
Prompt({ hdr: 'Delete', Prompt({
hdr: 'Delete',
body: 'Are you sure you want to remove ' + name + ' from ' + scope.name + ' ' + title + '?', body: 'Are you sure you want to remove ' + name + ' from ' + scope.name + ' ' + title + '?',
action: action action: action
}); });
} };
scope.scmChange = function() { scope.scmChange = function () {
if (scope.scm_type) { if (scope.scm_type) {
scope.pathRequired = (scope.scm_type.value == '') ? true : false; scope.pathRequired = (scope.scm_type.value === '') ? true : false;
scope.scmRequired = (scope.scm_type.value !== '') ? true : false; scope.scmRequired = (scope.scm_type.value !== '') ? true : false;
scope.scmBranchLabel = (scope.scm_type.value == 'svn') ? 'Revision #' : 'SCM Branch'; scope.scmBranchLabel = (scope.scm_type.value === 'svn') ? 'Revision #' : 'SCM Branch';
}
} }
};
// Reset the form // Reset the form
scope.formReset = function() { scope.formReset = function () {
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
generator.reset(); generator.reset();
for (var fld in master) { for (var fld in master) {
scope[fld] = master[fld]; scope[fld] = master[fld];
} }
scope.scmChange(); scope.scmChange();
//DebugForm({ scope: scope, form: form });
}; };
} }
ProjectsEdit.$inject = [ '$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'ProjectsForm', ProjectsEdit.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'ProjectsForm', 'GenerateForm',
'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'RelatedSearchInit', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'RelatedSearchInit', 'RelatedPaginateInit', 'Prompt', 'ClearScope',
'RelatedPaginateInit', 'Prompt', 'ClearScope', 'GetBasePath', 'ReturnToCaller', 'GetBasePath', 'ReturnToCaller', 'GetProjectPath', 'Authorization', 'CredentialList', 'LookUpInit', 'GetChoices', 'Empty',
'GetProjectPath', 'Authorization', 'CredentialList', 'LookUpInit', 'GetChoices', 'Empty',
'DebugForm', 'Wait', 'Stream' 'DebugForm', 'Wait', 'Stream'
]; ];

View File

@@ -10,106 +10,120 @@
'use strict'; 'use strict';
function TeamsList ($scope, $rootScope, $location, $log, $routeParams, Rest, Alert, TeamList, function TeamsList($scope, $rootScope, $location, $log, $routeParams, Rest, Alert, TeamList, GenerateList, LoadBreadCrumbs,
GenerateList, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit, ReturnToCaller, Prompt, SearchInit, PaginateInit, ReturnToCaller, ClearScope, ProcessErrors, SetTeamListeners, GetBasePath, SelectionInit, Wait,
ClearScope, ProcessErrors, SetTeamListeners, GetBasePath, SelectionInit, Wait, Stream) Stream) {
{
ClearScope('htmlTemplate'); //Garbage collection. Don't leave behind any listeners/watchers from the prior ClearScope('htmlTemplate');
//scope.
var list = TeamList; var list = TeamList,
var defaultUrl = GetBasePath('teams'); defaultUrl = GetBasePath('teams'),
var view = GenerateList; view = GenerateList,
var paths = $location.path().replace(/^\//,'').split('/'); paths = $location.path().replace(/^\//, '').split('/'),
var mode = (paths[0] == 'teams') ? 'edit' : 'select'; // if base path 'teams', we're here to add/edit teams mode = (paths[0] === 'teams') ? 'edit' : 'select', // if base path 'teams', we're here to add/edit teams
var scope = view.inject(list, { mode: mode }); // Inject our view scope = view.inject(list, { mode: mode }),
url;
scope.selected = []; scope.selected = [];
var url = GetBasePath('base') + $location.path() + '/'; url = GetBasePath('base') + $location.path() + '/';
SelectionInit({ scope: scope, list: list, url: url, returnToCaller: 1 }); SelectionInit({
scope: scope,
list: list,
url: url,
returnToCaller: 1
});
if (scope.removePostRefresh) { if (scope.removePostRefresh) {
scope.removePostRefresh(); scope.removePostRefresh();
} }
scope.removePostRefresh = scope.$on('PostRefresh', function() { scope.removePostRefresh = scope.$on('PostRefresh', function () {
// After a refresh, populate the organization name on each row // After a refresh, populate the organization name on each row
var i;
if (scope.teams) { if (scope.teams) {
for ( var i=0; i < scope.teams.length; i++) { for (i = 0; i < scope.teams.length; i++) {
scope.teams[i].organization_name = scope.teams[i].summary_fields.organization.name; scope.teams[i].organization_name = scope.teams[i].summary_fields.organization.name;
} }
} }
}); });
SearchInit({ scope: scope, set: 'teams', list: list, url: defaultUrl }); SearchInit({
PaginateInit({ scope: scope, list: list, url: defaultUrl }); scope: scope,
set: 'teams',
list: list,
url: defaultUrl
});
PaginateInit({
scope: scope,
list: list,
url: defaultUrl
});
scope.search(list.iterator); scope.search(list.iterator);
LoadBreadCrumbs(); LoadBreadCrumbs();
scope.showActivity = function() { Stream({ scope: scope }); } scope.showActivity = function () {
Stream({
scope: scope
});
};
scope.addTeam = function() { scope.addTeam = function () {
$location.path($location.path() + '/add'); $location.path($location.path() + '/add');
} };
scope.editTeam = function(id) { scope.editTeam = function (id) {
$location.path($location.path() + '/' + id); $location.path($location.path() + '/' + id);
} };
scope.deleteTeam = function(id, name) { scope.deleteTeam = function (id, name) {
var action = function() { var action = function () {
Wait('start'); Wait('start');
var url = defaultUrl + id + '/'; var url = defaultUrl + id + '/';
Rest.setUrl(url); Rest.setUrl(url);
Rest.destroy() Rest.destroy()
.success( function(data, status, headers, config) { .success(function () {
Wait('stop'); Wait('stop');
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
scope.search(list.iterator); scope.search(list.iterator);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
Wait('stop'); Wait('stop');
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, {
{ hdr: 'Error!', msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status }); hdr: 'Error!',
msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status
});
}); });
}; };
Prompt({ hdr: 'Delete', Prompt({
hdr: 'Delete',
body: 'Are you sure you want to delete ' + name + '?', body: 'Are you sure you want to delete ' + name + '?',
action: action action: action
}); });
} };
/*
scope.lookupOrganization = function(organization_id) {
Rest.setUrl(GetBasePath('organizations') + organization_id + '/');
Rest.get()
.success( function(data, status, headers, config) {
return data.name;
});
}
*/
} }
TeamsList.$inject = [ '$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'TeamList', 'GenerateList', TeamsList.$inject = ['$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'TeamList', 'GenerateList',
'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'ClearScope', 'ProcessErrors', 'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'ClearScope', 'ProcessErrors',
'SetTeamListeners', 'GetBasePath', 'SelectionInit', 'Wait', 'Stream' ]; 'SetTeamListeners', 'GetBasePath', 'SelectionInit', 'Wait', 'Stream'
];
function TeamsAdd ($scope, $rootScope, $compile, $location, $log, $routeParams, TeamForm, GenerateForm, function TeamsAdd($scope, $rootScope, $compile, $location, $log, $routeParams, TeamForm, GenerateForm,
Rest, Alert, ProcessErrors, LoadBreadCrumbs, ReturnToCaller, ClearScope, GenerateList, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ReturnToCaller, ClearScope, GenerateList,
OrganizationList, SearchInit, PaginateInit, GetBasePath, LookUpInit, Wait) OrganizationList, SearchInit, PaginateInit, GetBasePath, LookUpInit, Wait) {
{
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.
// Inject dynamic view // Inject dynamic view
var defaultUrl = GetBasePath('teams'); var defaultUrl = GetBasePath('teams'),
var form = TeamForm; form = TeamForm,
var generator = GenerateForm; generator = GenerateForm,
var scope = generator.inject(form, {mode: 'add', related: false}); scope = generator.inject(form, { mode: 'add', related: false });
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
generator.reset(); generator.reset();
LoadBreadCrumbs(); LoadBreadCrumbs();
@@ -123,57 +137,58 @@ function TeamsAdd ($scope, $rootScope, $compile, $location, $log, $routeParams,
}); });
// Save // Save
scope.formSave = function() { scope.formSave = function () {
var fld, data;
generator.clearApiErrors(); generator.clearApiErrors();
Wait('start'); Wait('start');
Rest.setUrl(defaultUrl); Rest.setUrl(defaultUrl);
var data = {} data = {};
for (var fld in form.fields) { for (fld in form.fields) {
data[fld] = scope[fld]; data[fld] = scope[fld];
} }
Rest.post(data) Rest.post(data)
.success( function(data, status, headers, config) { .success(function (data) {
Wait('stop'); Wait('stop');
$rootScope.flashMessage = "New team successfully created!"; $rootScope.flashMessage = "New team successfully created!";
$location.path('/teams/' + data.id); $location.path('/teams/' + data.id);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
Wait('stop'); Wait('stop');
ProcessErrors(scope, data, status, form, ProcessErrors(scope, data, status, form, { hdr: 'Error!', msg: 'Failed to add new team. Post returned status: ' +
{ hdr: 'Error!', msg: 'Failed to add new team. Post returned status: ' + status }); status });
}); });
}; };
// Reset // Reset
scope.formReset = function() { scope.formReset = function () {
// Defaults // Defaults
generator.reset(); generator.reset();
}; };
} }
TeamsAdd.$inject = [ '$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'TeamForm', 'GenerateForm', TeamsAdd.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'TeamForm', 'GenerateForm',
'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ReturnToCaller', 'ClearScope', 'GenerateList', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ReturnToCaller', 'ClearScope', 'GenerateList',
'OrganizationList', 'SearchInit', 'PaginateInit', 'GetBasePath', 'LookUpInit', 'Wait']; 'OrganizationList', 'SearchInit', 'PaginateInit', 'GetBasePath', 'LookUpInit', 'Wait'
];
function TeamsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams, TeamForm, function TeamsEdit($scope, $rootScope, $compile, $location, $log, $routeParams, TeamForm,
GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, RelatedSearchInit, GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, RelatedSearchInit,
RelatedPaginateInit, ReturnToCaller, ClearScope, LookUpInit, Prompt, RelatedPaginateInit, ReturnToCaller, ClearScope, LookUpInit, Prompt,
GetBasePath, CheckAccess, OrganizationList, Wait, Stream) GetBasePath, CheckAccess, OrganizationList, Wait, Stream) {
{
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 defaultUrl=GetBasePath('teams'); var defaultUrl = GetBasePath('teams'),
var generator = GenerateForm; generator = GenerateForm,
var form = TeamForm; form = TeamForm,
var scope = generator.inject(form, {mode: 'edit', related: true}); scope = generator.inject(form, { mode: 'edit', related: true }),
generator.reset(); base = $location.path().replace(/^\//, '').split('/')[0],
master = {},
id = $routeParams.team_id,
relatedSets = {};
var base = $location.path().replace(/^\//,'').split('/')[0]; generator.reset();
var master = {};
var id = $routeParams.team_id;
var relatedSets = {};
scope.PermissionAddAllowed = false; scope.PermissionAddAllowed = false;
@@ -181,18 +196,18 @@ function TeamsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams,
if (scope.teamLoadedRemove) { if (scope.teamLoadedRemove) {
scope.teamLoadedRemove(); scope.teamLoadedRemove();
} }
scope.teamLoadedRemove = scope.$on('teamLoaded', function() { scope.teamLoadedRemove = scope.$on('teamLoaded', function () {
CheckAccess({ scope: scope }); CheckAccess({ scope: scope });
Rest.setUrl(scope['organization_url']); Rest.setUrl(scope.organization_url);
Rest.get() Rest.get()
.success( function(data, status, headers, config) { .success(function (data) {
scope['organization_name'] = data.name; scope.organization_name = data.name;
master['organization_name'] = data.name; master.organization_name = data.name;
Wait('stop'); Wait('stop');
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, { hdr: 'Error!', msg: 'Failed to retrieve organization: ' +
{ hdr: 'Error!', msg: 'Failed to retrieve organization: ' + scope.orgnization_url + '. GET status: ' + status }); scope.orgnization_url + '. GET status: ' + status });
}); });
for (var set in relatedSets) { for (var set in relatedSets) {
scope.search(relatedSets[set].iterator); scope.search(relatedSets[set].iterator);
@@ -202,68 +217,90 @@ function TeamsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams,
// Retrieve detail record and prepopulate the form // Retrieve detail record and prepopulate the form
Wait('start'); Wait('start');
Rest.setUrl(defaultUrl + ':id/'); Rest.setUrl(defaultUrl + ':id/');
Rest.get({ params: {id: id} }) Rest.get({
.success( function(data, status, headers, config) { params: {
id: id
}
})
.success(function (data) {
var fld, related, set;
LoadBreadCrumbs({ path: '/teams/' + id, title: data.name }); LoadBreadCrumbs({ path: '/teams/' + id, title: data.name });
for (var fld in form.fields) { for (fld in form.fields) {
if (data[fld]) { if (data[fld]) {
scope[fld] = data[fld]; scope[fld] = data[fld];
master[fld] = scope[fld]; master[fld] = scope[fld];
} }
} }
var related = data.related; related = data.related;
for (var set in form.related) { for (set in form.related) {
if (related[set]) { if (related[set]) {
relatedSets[set] = { url: related[set], iterator: form.related[set].iterator }; relatedSets[set] = {
url: related[set],
iterator: form.related[set].iterator
};
} }
} }
// Initialize related search functions. Doing it here to make sure relatedSets object is populated. // Initialize related search functions. Doing it here to make sure relatedSets object is populated.
RelatedSearchInit({ scope: scope, form: form, relatedSets: relatedSets }); RelatedSearchInit({
RelatedPaginateInit({ scope: scope, relatedSets: relatedSets }); scope: scope,
form: form,
relatedSets: relatedSets
});
RelatedPaginateInit({
scope: scope,
relatedSets: relatedSets
});
LookUpInit({ LookUpInit({
scope: scope, scope: scope,
form: form, form: form,
current_item: data['organization'], current_item: data.organization,
list: OrganizationList, list: OrganizationList,
field: 'organization' field: 'organization'
}); });
scope['organization_url'] = data.related.organization; scope.organization_url = data.related.organization;
scope.$emit('teamLoaded'); scope.$emit('teamLoaded');
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
ProcessErrors(scope, data, status, form, ProcessErrors(scope, data, status, form, { hdr: 'Error!', msg: 'Failed to retrieve team: ' + $routeParams.team_id +
{ hdr: 'Error!', msg: 'Failed to retrieve team: ' + $routeParams.team_id + '. GET status: ' + status }); '. GET status: ' + status });
}); });
scope.showActivity = function() { Stream({ scope: scope }); } scope.showActivity = function () {
Stream({
scope: scope
});
};
// Save changes to the parent // Save changes to the parent
scope.formSave = function() { scope.formSave = function () {
var data = {}, fld;
generator.clearApiErrors(); generator.clearApiErrors();
Wait('start'); Wait('start');
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
Rest.setUrl(defaultUrl + $routeParams.team_id +'/'); Rest.setUrl(defaultUrl + $routeParams.team_id + '/');
var data = {} for (fld in form.fields) {
for (var fld in form.fields) {
data[fld] = scope[fld]; data[fld] = scope[fld];
} }
Rest.put(data) Rest.put(data)
.success( function(data, status, headers, config) { .success(function () {
Wait('stop'); Wait('stop');
var base = $location.path().replace(/^\//,'').split('/')[0]; var base = $location.path().replace(/^\//, '').split('/')[0];
(base == 'teams') ? ReturnToCaller() : ReturnToCaller(1); if (base === 'teams') {
ReturnToCaller();
}
ReturnToCaller(1);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
Wait('stop'); Wait('stop');
ProcessErrors(scope, data, status, form, ProcessErrors(scope, data, status, form, { hdr: 'Error!',
{ hdr: 'Error!', msg: 'Failed to update team: ' + $routeParams.team_id + '. PUT status: ' + status }); msg: 'Failed to update team: ' + $routeParams.team_id + '. PUT status: ' + status });
}); });
}; };
// Cancel // Cancel
scope.formReset = function() { scope.formReset = function () {
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
generator.reset(); generator.reset();
for (var fld in master) { for (var fld in master) {
@@ -272,84 +309,77 @@ function TeamsEdit ($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;
if (set == 'permissions') { if (set === 'permissions') {
if (scope.PermissionAddAllowed) { if (scope.PermissionAddAllowed) {
$location.path('/' + base + '/' + $routeParams.team_id + '/' + set + '/add'); $location.path('/' + base + '/' + $routeParams.team_id + '/' + set + '/add');
} } else {
else {
Alert('Access Denied', 'You do not have access to this function. Please contact your system administrator.'); Alert('Access Denied', 'You do not have access to this function. Please contact your system administrator.');
} }
} } else {
else {
$location.path('/' + base + '/' + $routeParams.team_id + '/' + set); $location.path('/' + base + '/' + $routeParams.team_id + '/' + set);
} }
}; };
// Related set: Edit button // Related set: Edit button
scope.edit = function(set, id, name) { scope.edit = function (set, id) {
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
if (set == 'permissions') { if (set === 'permissions') {
$location.path('/' + base + '/' + $routeParams.team_id + '/' + set + '/' + id); $location.path('/' + base + '/' + $routeParams.team_id + '/' + set + '/' + id);
} } else {
else {
$location.path('/' + set + '/' + id); $location.path('/' + set + '/' + id);
} }
}; };
// Related set: Delete button // Related set: Delete button
scope['delete'] = function(set, itm_id, name, title) { scope['delete'] = function (set, itm_id, name, title) {
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
var action = function() { var action = function () {
var url; var url;
if (set == 'permissions') { if (set === 'permissions') {
if (scope.PermissionAddAllowed) { if (scope.PermissionAddAllowed) {
url = GetBasePath('base') + 'permissions/' + itm_id + '/'; url = GetBasePath('base') + 'permissions/' + itm_id + '/';
Rest.setUrl(url); Rest.setUrl(url);
Rest.destroy() Rest.destroy()
.success( function(data, status, headers, config) { .success(function () {
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
scope.search(form.related[set].iterator); scope.search(form.related[set].iterator);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, { hdr: 'Error!', msg: 'Call to ' + url +
{ hdr: 'Error!', msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status }); ' failed. DELETE returned status: ' + status });
}); });
} } else {
else {
Alert('Access Denied', 'You do not have access to this function. Please contact your system administrator.'); Alert('Access Denied', 'You do not have access to this function. Please contact your system administrator.');
} }
} } else {
else { url = defaultUrl + $routeParams.team_id + '/' + set + '/';
var url = defaultUrl + $routeParams.team_id + '/' + set + '/';
Rest.setUrl(url); Rest.setUrl(url);
Rest.post({ id: itm_id, disassociate: 1 }) Rest.post({ id: itm_id, disassociate: 1 })
.success( function(data, status, headers, config) { .success(function () {
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
scope.search(form.related[set].iterator); scope.search(form.related[set].iterator);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, { hdr: 'Error!', msg: 'Call to ' + url +
{ hdr: 'Error!', msg: 'Call to ' + url + ' failed. POST returned status: ' + status }); ' failed. POST returned status: ' + status });
}); });
} }
}; };
Prompt({ hdr: 'Delete', Prompt({
hdr: 'Delete',
body: 'Are you sure you want to remove ' + name + ' from ' + scope.name + ' ' + title + '?', body: 'Are you sure you want to remove ' + name + ' from ' + scope.name + ' ' + title + '?',
action: action action: action
}); });
} };
} }
TeamsEdit.$inject = [ '$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'TeamForm', TeamsEdit.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'TeamForm',
'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'RelatedSearchInit', 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'RelatedSearchInit', 'RelatedPaginateInit',
'RelatedPaginateInit', 'ReturnToCaller', 'ClearScope', 'LookUpInit', 'Prompt', 'ReturnToCaller', 'ClearScope', 'LookUpInit', 'Prompt', 'GetBasePath', 'CheckAccess', 'OrganizationList', 'Wait', 'Stream'
'GetBasePath', 'CheckAccess', 'OrganizationList', 'Wait', 'Stream' ];
];

View File

@@ -7,97 +7,116 @@
* Controller functions for User model. * Controller functions for User model.
* *
*/ */
'use strict'; 'use strict';
function UsersList ($scope, $rootScope, $location, $log, $routeParams, Rest, Alert, UserList, function UsersList($scope, $rootScope, $location, $log, $routeParams, Rest, Alert, UserList, GenerateList, LoadBreadCrumbs,
GenerateList, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit, ReturnToCaller, Prompt, SearchInit, PaginateInit, ReturnToCaller, ClearScope, ProcessErrors, GetBasePath, SelectionInit, Wait, Stream) {
ClearScope, ProcessErrors, GetBasePath, SelectionInit, Wait, Stream)
{ ClearScope('htmlTemplate');
ClearScope('htmlTemplate'); //Garbage collection. Don't leave behind any listeners/watchers from the prior
//scope. var list = UserList,
defaultUrl = GetBasePath('users'),
view = GenerateList,
base = $location.path().replace(/^\//, '').split('/')[0],
mode = (base === 'users') ? 'edit' : 'select', // if base path 'users', we're here to add/edit users
scope = view.inject(UserList, { mode: mode }),
url = (base === 'organizations') ? GetBasePath('organizations') + $routeParams.organization_id + '/users/' :
GetBasePath('teams') + $routeParams.team_id + '/users/';
var list = UserList;
var defaultUrl = GetBasePath('users');
var view = GenerateList;
var base = $location.path().replace(/^\//,'').split('/')[0];
var mode = (base == 'users') ? 'edit' : 'select'; // if base path 'users', we're here to add/edit users
var scope = view.inject(UserList, { mode: mode }); // Inject our view
scope.selected = []; scope.selected = [];
var url = (base == 'organizations') ? GetBasePath('organizations') + $routeParams.organization_id + '/users/' : SelectionInit({
GetBasePath('teams') + $routeParams.team_id + '/users/'; scope: scope,
SelectionInit({ scope: scope, list: list, url: url, returnToCaller: 1 }); list: list,
url: url,
returnToCaller: 1
});
if (scope.removePostRefresh) { if (scope.removePostRefresh) {
scope.removePostRefresh(); scope.removePostRefresh();
} }
scope.removePostRefresh = scope.$on('PostRefresh', function() { scope.removePostRefresh = scope.$on('PostRefresh', function () {
// Cleanup after a delete // Cleanup after a delete
Wait('stop'); Wait('stop');
$('#prompt-modal').off(); $('#prompt-modal').off();
}); });
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
SearchInit({ scope: scope, set: 'users', list: list, url: defaultUrl }); SearchInit({
PaginateInit({ scope: scope, list: list, url: defaultUrl }); scope: scope,
set: 'users',
list: list,
url: defaultUrl
});
PaginateInit({
scope: scope,
list: list,
url: defaultUrl
});
scope.search(list.iterator); scope.search(list.iterator);
LoadBreadCrumbs(); LoadBreadCrumbs();
scope.showActivity = function() { Stream({ scope: scope }); } scope.showActivity = function () {
Stream({
scope: scope
});
};
scope.addUser = function() { scope.addUser = function () {
$location.path($location.path() + '/add'); $location.path($location.path() + '/add');
} };
scope.editUser = function(id) { scope.editUser = function (id) {
$location.path($location.path() + '/' + id); $location.path($location.path() + '/' + id);
} };
scope.deleteUser = function(id, name) { scope.deleteUser = function (id, name) {
var action = function() { var action = function () {
$('#prompt-modal').on('hidden.bs.modal', function(){ Wait('start'); }); $('#prompt-modal').on('hidden.bs.modal', function () {
Wait('start');
});
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
var url = defaultUrl + id + '/'; var url = defaultUrl + id + '/';
Rest.setUrl(url); Rest.setUrl(url);
Rest.destroy() Rest.destroy()
.success( function(data, status, headers, config) { .success(function () {
scope.search(list.iterator); scope.search(list.iterator);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
Wait('stop'); Wait('stop');
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, { hdr: 'Error!', msg: 'Call to ' + url + ' failed. DELETE returned status: ' +
{ hdr: 'Error!', msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status }); status });
}); });
}; };
Prompt({ hdr: 'Delete', Prompt({
hdr: 'Delete',
body: 'Are you sure you want to delete ' + name + '?', body: 'Are you sure you want to delete ' + name + '?',
action: action action: action
}); });
} };
} }
UsersList.$inject = [ '$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'UserList', 'GenerateList', UsersList.$inject = ['$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'UserList', 'GenerateList',
'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'ClearScope', 'ProcessErrors', 'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'ClearScope', 'ProcessErrors', 'GetBasePath',
'GetBasePath', 'SelectionInit', 'Wait', 'Stream']; 'SelectionInit', 'Wait', 'Stream'
];
function UsersAdd ($scope, $rootScope, $compile, $location, $log, $routeParams, UserForm, function UsersAdd($scope, $rootScope, $compile, $location, $log, $routeParams, UserForm, GenerateForm, Rest, Alert, ProcessErrors,
GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ReturnToCaller, ClearScope, LoadBreadCrumbs, ReturnToCaller, ClearScope, GetBasePath, LookUpInit, OrganizationList, ResetForm, Wait) {
GetBasePath, LookUpInit, OrganizationList, ResetForm, Wait)
{ ClearScope('htmlTemplate');
ClearScope('htmlTemplate'); //Garbage collection. Don't leave behind any listeners/watchers from the prior
//scope.
// Inject dynamic view // Inject dynamic view
var defaultUrl = GetBasePath('organizations'); var defaultUrl = GetBasePath('organizations'),
var form = UserForm; form = UserForm,
generator = GenerateForm,
scope = generator.inject(form, { mode: 'add', related: false });
ResetForm(); ResetForm();
var generator = GenerateForm;
var scope = generator.inject(form, {mode: 'add', related: false});
scope.ldap_user = false; scope.ldap_user = false;
scope.not_ldap_user = !scope.ldap_user; scope.not_ldap_user = !scope.ldap_user;
@@ -121,96 +140,91 @@ function UsersAdd ($scope, $rootScope, $compile, $location, $log, $routeParams,
scope.organization = $routeParams.organization_id; scope.organization = $routeParams.organization_id;
Rest.setUrl(GetBasePath('organizations') + $routeParams.organization_id + '/'); Rest.setUrl(GetBasePath('organizations') + $routeParams.organization_id + '/');
Rest.get() Rest.get()
.success( function(data, status, headers, config) { .success(function (data) {
scope['organization_name'] = data.name; scope.organization_name = data.name;
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
ProcessErrors(scope, data, status, form, ProcessErrors(scope, data, status, form, {
{ hdr: 'Error!', msg: 'Failed to lookup Organization: ' + data.id + '. GET returned status: ' + status }); hdr: 'Error!',
msg: 'Failed to lookup Organization: ' + data.id + '. GET returned status: ' + status
});
}); });
} }
// Save // Save
scope.formSave = function() { scope.formSave = function () {
generator.clearApiErrors(); generator.clearApiErrors();
var fld, data = {};
if (scope.organization !== undefined && scope.organization !== null && scope.organization !== '') { if (scope.organization !== undefined && scope.organization !== null && scope.organization !== '') {
Rest.setUrl(defaultUrl + scope.organization + '/users/'); Rest.setUrl(defaultUrl + scope.organization + '/users/');
var data = {} for (fld in form.fields) {
for (var fld in form.fields) {
if (form.fields[fld].realName) { if (form.fields[fld].realName) {
data[form.fields[fld].realName] = scope[fld]; data[form.fields[fld].realName] = scope[fld];
} } else {
else {
data[fld] = scope[fld]; data[fld] = scope[fld];
} }
} }
data.is_superuser = data.is_superuser || false;
data.is_superuser = (data.is_superuser == null || data.is_superuser == undefined || data.is_superuser == '') ? false :
data.is_superuser;
Wait('start'); Wait('start');
Rest.post(data) Rest.post(data)
.success( function(data, status, headers, config) { .success(function (data) {
var base = $location.path().replace(/^\//,'').split('/')[0]; var base = $location.path().replace(/^\//, '').split('/')[0];
if (base == 'users') { if (base === 'users') {
$rootScope.flashMessage = 'New user successfully created!'; $rootScope.flashMessage = 'New user successfully created!';
$location.path('/users/' + data.id); $location.path('/users/' + data.id);
} }
else {
ReturnToCaller(1); ReturnToCaller(1);
}
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
Wait('stop'); Wait('stop');
ProcessErrors(scope, data, status, form, ProcessErrors(scope, data, status, form, { hdr: 'Error!', msg: 'Failed to add new user. POST returned status: ' + status });
{ hdr: 'Error!', msg: 'Failed to add new user. POST returned status: ' + status });
}); });
} } else {
else {
scope.organization_name_api_error = 'A value is required'; scope.organization_name_api_error = 'A value is required';
} }
}; };
// Cancel // Cancel
scope.formReset = function() { scope.formReset = function () {
// Defaults // Defaults
generator.reset(); generator.reset();
scope.ldap_user = false; scope.ldap_user = false;
}; };
// Password change // Password change
scope.clearPWConfirm = function(fld) { scope.clearPWConfirm = function (fld) {
// If password value changes, make sure password_confirm must be re-entered // If password value changes, make sure password_confirm must be re-entered
scope[fld] = ''; scope[fld] = '';
scope[form.name + '_form'][fld].$setValidity('awpassmatch', false); scope[form.name + '_form'][fld].$setValidity('awpassmatch', false);
} };
} }
UsersAdd.$inject = [ '$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'UserForm', 'GenerateForm', UsersAdd.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'UserForm', 'GenerateForm',
'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ReturnToCaller', 'ClearScope', 'GetBasePath', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ReturnToCaller', 'ClearScope', 'GetBasePath',
'LookUpInit', 'OrganizationList', 'ResetForm', 'Wait' ]; 'LookUpInit', 'OrganizationList', 'ResetForm', 'Wait'
];
function UsersEdit ($scope, $rootScope, $compile, $location, $log, $routeParams, UserForm, function UsersEdit($scope, $rootScope, $compile, $location, $log, $routeParams, UserForm,
GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, RelatedSearchInit, GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, RelatedSearchInit,
RelatedPaginateInit, ReturnToCaller, ClearScope, GetBasePath, Prompt, CheckAccess, RelatedPaginateInit, ReturnToCaller, ClearScope, GetBasePath, Prompt, CheckAccess,
ResetForm, Wait, Stream) ResetForm, Wait, Stream) {
{
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 defaultUrl=GetBasePath('users'); var defaultUrl = GetBasePath('users'),
var generator = GenerateForm; generator = GenerateForm,
var form = UserForm; form = UserForm,
var base = $location.path().replace(/^\//,'').split('/')[0]; base = $location.path().replace(/^\//, '').split('/')[0],
var master = {}; master = {},
var id = $routeParams.user_id; id = $routeParams.user_id,
var relatedSets = {}; relatedSets = {};
if ($scope.removeFormReady) { if ($scope.removeFormReady) {
$scope.removeFormReady(); $scope.removeFormReady();
} }
$scope.removeFormReady = $scope.$on('formReady', function() { $scope.removeFormReady = $scope.$on('formReady', function () {
var scope = generator.inject(form, {mode: 'edit', related: true}); var scope = generator.inject(form, { mode: 'edit', related: true });
generator.reset(); generator.reset();
if (scope.removePostRefresh) { if (scope.removePostRefresh) {
@@ -223,34 +237,39 @@ function UsersEdit ($scope, $rootScope, $compile, $location, $log, $routeParams,
if (scope.removeUserLoaded) { if (scope.removeUserLoaded) {
scope.removeUserLoaded(); scope.removeUserLoaded();
} }
scope.removeUserLoaded = scope.$on('userLoaded', function() { scope.removeUserLoaded = scope.$on('userLoaded', function () {
for (var set in relatedSets) { for (var set in relatedSets) {
scope.search(relatedSets[set].iterator); scope.search(relatedSets[set].iterator);
} }
CheckAccess({ scope: scope }); //Does the user have access to add/edit Permissions? CheckAccess({
scope: scope
}); //Does the user have access to add/edit Permissions?
Wait('stop'); Wait('stop');
}); });
// Retrieve detail record and prepopulate the form // Retrieve detail record and prepopulate the form
Rest.setUrl(defaultUrl + ':id/'); Rest.setUrl(defaultUrl + ':id/');
Rest.get({ params: {id: id} }) Rest.get({ params: { id: id } })
.success( function(data, status, headers, config) { .success(function (data) {
LoadBreadCrumbs({ path: '/users/' + id, title: data.username }); LoadBreadCrumbs({ path: '/users/' + id, title: data.username });
for (var fld in form.fields) { var fld, related, set;
for (fld in form.fields) {
if (data[fld]) { if (data[fld]) {
if (fld == 'is_superuser') { if (fld === 'is_superuser') {
scope[fld] = (data[fld] == 'true' || data[fld] == true) ? 'true' : 'false'; scope[fld] = (data[fld] === 'true' || data[fld] === true) ? 'true' : 'false';
} } else {
else {
scope[fld] = data[fld]; scope[fld] = data[fld];
} }
master[fld] = scope[fld]; master[fld] = scope[fld];
} }
} }
var related = data.related; related = data.related;
for (var set in form.related) { for (set in form.related) {
if (related[set]) { if (related[set]) {
relatedSets[set] = { url: related[set], iterator: form.related[set].iterator }; relatedSets[set] = {
url: related[set],
iterator: form.related[set].iterator
};
} }
} }
@@ -259,142 +278,154 @@ function UsersEdit ($scope, $rootScope, $compile, $location, $log, $routeParams,
master.ldap_user = scope.ldap_user; master.ldap_user = scope.ldap_user;
// Initialize related search functions. Doing it here to make sure relatedSets object is populated. // Initialize related search functions. Doing it here to make sure relatedSets object is populated.
RelatedSearchInit({ scope: scope, form: form, relatedSets: relatedSets }); RelatedSearchInit({
RelatedPaginateInit({ scope: scope, relatedSets: relatedSets }); scope: scope,
form: form,
relatedSets: relatedSets
});
RelatedPaginateInit({
scope: scope,
relatedSets: relatedSets
});
scope.$emit('userLoaded'); scope.$emit('userLoaded');
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
ProcessErrors(scope, data, status, form, ProcessErrors(scope, data, status, null, { hdr: 'Error!', msg: 'Failed to retrieve user: ' +
{ hdr: 'Error!', msg: 'Failed to retrieve user: ' + $routeParams.id + '. GET status: ' + status }); $routeParams.id + '. GET status: ' + status });
}); });
// Save changes to the parent // Save changes to the parent
scope.formSave = function() { scope.formSave = function () {
var data = {}, fld;
generator.clearApiErrors(); generator.clearApiErrors();
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
Rest.setUrl(defaultUrl + id + '/'); Rest.setUrl(defaultUrl + id + '/');
var data = {} for (fld in form.fields) {
for (var fld in form.fields) {
if (form.fields[fld].realName) { if (form.fields[fld].realName) {
data[form.fields[fld].realName] = scope[fld]; data[form.fields[fld].realName] = scope[fld];
} } else {
else {
data[fld] = scope[fld]; data[fld] = scope[fld];
} }
} }
data.is_superuser = (data.is_superuser == null || data.is_superuser == undefined || data.is_superuser == '') ? false : data.is_superuser = data.is_superuser || false;
data.is_superuser;
Wait('start'); Wait('start');
Rest.put(data) Rest.put(data)
.success( function(data, status, headers, config) { .success(function () {
Wait('stop'); Wait('stop');
var base = $location.path().replace(/^\//,'').split('/')[0]; var base = $location.path().replace(/^\//, '').split('/')[0];
(base == 'users') ? ReturnToCaller() : ReturnToCaller(1); if (base === 'users') {
ReturnToCaller();
}
ReturnToCaller(1);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
Wait('stop'); Wait('stop');
ProcessErrors(scope, data, status, form, ProcessErrors(scope, data, status, form, { hdr: 'Error!', msg: 'Failed to update users: ' + $routeParams.id +
{ hdr: 'Error!', msg: 'Failed to update users: ' + $routeParams.id + '. PUT status: ' + status }); '. PUT status: ' + status });
}); });
}; };
scope.showActivity = function() { Stream({ scope: scope }); } scope.showActivity = function () {
Stream({
scope: scope
});
};
// Cancel // Cancel
scope.formReset = function() { scope.formReset = function () {
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
generator.reset(); generator.reset();
for (var fld in master) { for (var fld in master) {
scope[fld] = master[fld]; scope[fld] = master[fld];
} }
scope['password_confirm'] = scope['password']; scope.password_confirm = scope.password;
}; };
// Password change // Password change
scope.clearPWConfirm = function(fld) { scope.clearPWConfirm = function (fld) {
// If password value changes, make sure password_confirm must be re-entered // If password value changes, make sure password_confirm must be re-entered
scope[fld] = ''; scope[fld] = '';
scope[form.name + '_form'][fld].$setValidity('awpassmatch', false); scope[form.name + '_form'][fld].$setValidity('awpassmatch', false);
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
} };
// Related set: Add button // Related set: Add button
scope.add = function(set) { scope.add = function (set) {
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
if (set == 'permissions') { if (set === 'permissions') {
if (scope.PermissionAddAllowed) { if (scope.PermissionAddAllowed) {
$location.path('/' + base + '/' + $routeParams.user_id + '/' + set + '/add'); $location.path('/' + base + '/' + $routeParams.user_id + '/' + set + '/add');
} } else {
else {
Alert('Access Denied', 'You do not have access to this function. Please contact your system administrator.'); Alert('Access Denied', 'You do not have access to this function. Please contact your system administrator.');
} }
} } else {
else {
$location.path('/' + base + '/' + $routeParams.user_id + '/' + set); $location.path('/' + base + '/' + $routeParams.user_id + '/' + set);
} }
}; };
// Related set: Edit button // Related set: Edit button
scope.edit = function(set, id, name) { scope.edit = function (set, id) {
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
if (set == 'permissions') { if (set === 'permissions') {
$location.path('/users/' + $routeParams.user_id + '/permissions/' + id); $location.path('/users/' + $routeParams.user_id + '/permissions/' + id);
} } else {
else {
$location.path('/' + set + '/' + id); $location.path('/' + set + '/' + id);
} }
}; };
// Related set: Delete button // Related set: Delete button
scope['delete'] = function(set, itm_id, name, title) { scope['delete'] = function (set, itm_id, name, title) {
$rootScope.flashMessage = null; $rootScope.flashMessage = null;
var action = function() { var action = function () {
var url; var url;
if (set == 'permissions') { if (set === 'permissions') {
if (scope.PermissionAddAllowed) { if (scope.PermissionAddAllowed) {
url = GetBasePath('base') + 'permissions/' + itm_id + '/'; url = GetBasePath('base') + 'permissions/' + itm_id + '/';
Rest.setUrl(url); Rest.setUrl(url);
Rest.destroy() Rest.destroy()
.success( function(data, status, headers, config) { .success(function () {
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
scope.search(form.related[set].iterator); scope.search(form.related[set].iterator);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, { hdr: 'Error!',
{ hdr: 'Error!', msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status }); msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status });
}); });
} } else {
else {
Alert('Access Denied', 'You do not have access to this function. Please contact your system administrator.'); Alert('Access Denied', 'You do not have access to this function. Please contact your system administrator.');
} }
} } else {
else {
url = defaultUrl + $routeParams.user_id + '/' + set + '/'; url = defaultUrl + $routeParams.user_id + '/' + set + '/';
Rest.setUrl(url); Rest.setUrl(url);
Rest.post({ id: itm_id, disassociate: 1 }) Rest.post({
.success( function(data, status, headers, config) { id: itm_id,
disassociate: 1
})
.success(function () {
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
scope.search(form.related[set].iterator); scope.search(form.related[set].iterator);
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
$('#prompt-modal').modal('hide'); $('#prompt-modal').modal('hide');
ProcessErrors(scope, data, status, null, ProcessErrors(scope, data, status, null, {
{ hdr: 'Error!', msg: 'Call to ' + url + ' failed. POST returned status: ' + status }); hdr: 'Error!',
msg: 'Call to ' + url + ' failed. POST returned status: ' + status
});
}); });
} }
} };
Prompt({ hdr: 'Delete', Prompt({
hdr: 'Delete',
body: 'Are you sure you want to remove ' + name + ' from ' + scope.username + ' ' + title + '?', body: 'Are you sure you want to remove ' + name + ' from ' + scope.username + ' ' + title + '?',
action: action action: action
}); });
} };
}); // $scope.$on }); // $scope.$on
// Put form back to its original state // Put form back to its original state
@@ -404,18 +435,18 @@ function UsersEdit ($scope, $rootScope, $compile, $location, $log, $routeParams,
if ($scope.removeModifyForm) { if ($scope.removeModifyForm) {
$scope.removeModifyForm(); $scope.removeModifyForm();
} }
$scope.removeModifyForm = $scope.$on('modifyForm', function() { $scope.removeModifyForm = $scope.$on('modifyForm', function () {
// Modify form based on LDAP settings // Modify form based on LDAP settings
Rest.setUrl(GetBasePath('config')); Rest.setUrl(GetBasePath('config'));
Rest.get() Rest.get()
.success( function(data, status, headers, config) { .success(function (data) {
if (data['user_ldap_fields']) { var i, fld;
var fld; if (data.user_ldap_fields) {
for (var i=0; i < data['user_ldap_fields'].length; i++) { for (i = 0; i < data.user_ldap_fields.length; i++) {
fld = data['user_ldap_fields'][i]; fld = data.user_ldap_fields[i];
if (form.fields[fld]) { if (form.fields[fld]) {
form.fields[fld]['readonly'] = true; form.fields[fld].readonly = true;
form.fields[fld]['editRequired'] = false; form.fields[fld].editRequired = false;
if (form.fields[fld].awRequiredWhen) { if (form.fields[fld].awRequiredWhen) {
delete form.fields[fld].awRequiredWhen; delete form.fields[fld].awRequiredWhen;
} }
@@ -424,32 +455,28 @@ function UsersEdit ($scope, $rootScope, $compile, $location, $log, $routeParams,
} }
$scope.$emit('formReady'); $scope.$emit('formReady');
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
ProcessErrors($scope, data, status, null, ProcessErrors($scope, data, status, null, { hdr: 'Error!', msg: 'Failed to retrieve application config. GET status: ' + status });
{ hdr: 'Error!', msg: 'Failed to retrieve application config. GET status: ' + status });
}); });
}); });
Wait('start'); Wait('start');
Rest.setUrl(defaultUrl + id + '/'); Rest.setUrl(defaultUrl + id + '/');
Rest.get() Rest.get()
.success( function(data, status, headers, config) { .success(function (data) {
if (data.ldap_dn !== null && data.ldap_dn !== undefined && data.ldap_dn !== '') { if (data.ldap_dn !== null && data.ldap_dn !== undefined && data.ldap_dn !== '') {
//this is an LDAP user //this is an LDAP user
$scope.$emit('modifyForm'); $scope.$emit('modifyForm');
} } else {
else {
$scope.$emit('formReady'); $scope.$emit('formReady');
} }
}) })
.error( function(data, status, headers, config) { .error(function (data, status) {
ProcessErrors($scope, data, status, null, ProcessErrors($scope, data, status, null, { hdr: 'Error!', msg: 'Failed to retrieve user: ' + id + '. GET status: ' + status });
{ hdr: 'Error!', msg: 'Failed to retrieve user: ' + id + '. GET status: ' + status });
}); });
} }
UsersEdit.$inject = [ '$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'UserForm', UsersEdit.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'UserForm', 'GenerateForm',
'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'RelatedSearchInit', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'RelatedSearchInit', 'RelatedPaginateInit', 'ReturnToCaller', 'ClearScope',
'RelatedPaginateInit', 'ReturnToCaller', 'ClearScope', 'GetBasePath', 'Prompt', 'CheckAccess', 'GetBasePath', 'Prompt', 'CheckAccess', 'ResetForm', 'Wait', 'Stream'
'ResetForm', 'Wait', 'Stream']; ];