diff --git a/awx/ui/static/js/controllers/Admins.js b/awx/ui/static/js/controllers/Admins.js
index 223551f601..798db73940 100644
--- a/awx/ui/static/js/controllers/Admins.js
+++ b/awx/ui/static/js/controllers/Admins.js
@@ -3,33 +3,49 @@
*
*
* Admins.js
- *
+ *
* Controller functions for ading Admins to an Organization.
*
*/
'use strict';
-function AdminsList ($scope, $rootScope, $location, $log, $routeParams, Rest,
- Alert, AdminList, GenerateList, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit,
- 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
+function AdminsList($scope, $rootScope, $location, $log, $routeParams, Rest,
+ Alert, AdminList, GenerateList, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit,
+ ReturnToCaller, GetBasePath, SelectionInit) {
- var url = GetBasePath('organizations') + $routeParams.organization_id + '/admins/';
- SelectionInit({ scope: scope, list: list, url: url, returnToCaller: 1 });
+ var list = AdminList,
+ 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);
LoadBreadCrumbs();
}
-AdminsList.$inject = [ '$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'AdminList', 'GenerateList',
- 'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'GetBasePath', 'SelectionInit'];
-
+AdminsList.$inject = ['$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'AdminList', 'GenerateList',
+ 'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'GetBasePath', 'SelectionInit'
+];
\ No newline at end of file
diff --git a/awx/ui/static/js/controllers/Authentication.js b/awx/ui/static/js/controllers/Authentication.js
index ca102a4fbf..2ee4bd7f6b 100644
--- a/awx/ui/static/js/controllers/Authentication.js
+++ b/awx/ui/static/js/controllers/Authentication.js
@@ -8,139 +8,145 @@
*
*/
+ /* globals console:false */
+
'use strict';
-function Authenticate($cookieStore, $window, $scope, $rootScope, $location, Authorization, ToggleClass, Alert, Wait,
- Timer, Empty)
-{
- var setLoginFocus = function() {
- $('#login-username').focus();
- };
+function Authenticate($cookieStore, $window, $scope, $rootScope, $location, Authorization, ToggleClass, Alert, Wait,
+ Timer, Empty) {
+
+ var setLoginFocus, lastPath, sessionExpired, scope;
- var sessionExpired = (Empty($rootScope.sessionExpired)) ? $cookieStore.get('sessionExpired') : $rootScope.sessionExpired;
-
- var lastPath = function() {
- return (Empty($rootScope.lastPath)) ? $cookieStore.get('lastPath') : $rootScope.lastPath;
- }
+ setLoginFocus = function () {
+ $('#login-username').focus();
+ };
- if ($AnsibleConfig.debug_mode && console) {
- console.log('User session expired: ' + sessionExpired);
- console.log('Last URL: ' + lastPath());
- }
-
- // Hide any lingering modal dialogs
- $('.modal[aria-hidden=false]').each( function() {
- if ($(this).attr('id') !== 'login-modal') {
- $(this).modal('hide');
- }
- });
+ sessionExpired = (Empty($rootScope.sessionExpired)) ? $cookieStore.get('sessionExpired') : $rootScope.sessionExpired;
- // Just in case, make sure the wait widget is not active
- Wait('stop');
-
- // Display the login dialog
- $('#login-modal').modal({ show: true, keyboard: false, backdrop: 'static' });
-
- // Set focus to username field
- $('#login-modal').on('shown.bs.modal', function() {
- setLoginFocus();
- });
+ lastPath = function () {
+ return (Empty($rootScope.lastPath)) ? $cookieStore.get('lastPath') : $rootScope.lastPath;
+ };
- var scope = angular.element(document.getElementById('login-modal')).scope();
-
- // Reset the login form
- scope['login_username'] = null;
- scope['login_password'] = null;
- scope['loginForm']['login_username'].$setPristine();
- scope['loginForm']['login_password'].$setPristine();
+ if ($AnsibleConfig.debug_mode && console) {
+ console.log('User session expired: ' + sessionExpired);
+ console.log('Last URL: ' + lastPath());
+ }
- if ($location.path() == '/logout') {
- //if logout request, clear AuthToken and user session data
- Authorization.logout();
- }
-
- $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().
+ // Hide any lingering modal dialogs
+ $('.modal[aria-hidden=false]').each(function () {
+ if ($(this).attr('id') !== 'login-modal') {
+ $(this).modal('hide');
+ }
+ });
- $('#login-password').bind('keypress', function(e) {
- var code = (e.keyCode ? e.keyCode : e.which);
- if (code == 13) {
- $('#login-button').click();
- }
- });
-
- scope.reset = function() {
- $('#login-form input').each( function(index) { $(this).val(''); });
- };
+ // Just in case, make sure the wait widget is not active
+ Wait('stop');
- // Call the API to get an auth token
- scope.systemLogin = function(username, password) {
- $('.api-error').empty();
- var token;
- if (username == null || username == undefined || username == '' ||
- password == null || password == undefined || password == '' ) {
- Alert('Error!', 'Please provide a username and password before attempting to login.', 'alert-danger', setLoginFocus);
- }
- else {
- Wait('start');
- Authorization.retrieveToken(username, password)
- .success( function(data, status, headers, config) {
- $('#login-modal').modal('hide');
- token = data.token;
- Authorization.setToken(data.token, data.expires);
- $rootScope.sessionTimer = Timer.init();
- // Get all the profile/access info regarding the logged in user
- Authorization.getUser()
- .success(function(data, status, headers, config) {
- Authorization.setUserInfo(data);
- $rootScope['user_is_superuser'] = data.results[0].is_superuser;
- Authorization.getLicense()
- .success(function(data, status, headers, config) {
- Authorization.setLicense(data['license_info']);
- if (lastPath()) {
- // Go back to most recent navigation path
- $location.path(lastPath());
- }
- else {
- $location.url('/home?login=true');
- }
- })
- .error(function(data, status, headers, config) {
- Wait('stop');
- Alert('Error', 'Failed to access user information. GET returned status: ' + status, 'alert-danger', setLoginFocus);
- });
- })
- .error( function(data, status, headers, config) {
- Wait('stop');
- Alert('Error', 'Failed to access license information. GET returned status: ' + status, 'alert-danger', setLoginFocus);
- });
- })
- .error( function(data, status, headers, config) {
- Wait('stop');
- if ( data.non_field_errors && data.non_field_errors.length == 0 ) {
- // show field specific errors returned by the API
- for (var key in data) {
- scope[key + 'Error'] = data[key][0];
+ // Display the login dialog
+ $('#login-modal').modal({
+ show: true,
+ keyboard: false,
+ backdrop: 'static'
+ });
+
+ // Set focus to username field
+ $('#login-modal').on('shown.bs.modal', function () {
+ setLoginFocus();
+ });
+
+ scope = angular.element(document.getElementById('login-modal')).scope();
+
+ // Reset the login form
+ scope.login_username = null;
+ scope.login_password = null;
+ scope.loginForm.login_username.$setPristine();
+ scope.loginForm.login_password.$setPristine();
+
+ if ($location.path() === '/logout') {
+ //if logout request, clear AuthToken and user session data
+ Authorization.logout();
+ }
+
+ $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().
+
+ $('#login-password').bind('keypress', function (e) {
+ var code = (e.keyCode ? e.keyCode : e.which);
+ if (code === 13) {
+ $('#login-button').click();
+ }
+ });
+
+ scope.reset = function () {
+ $('#login-form input').each(function () {
+ $(this).val('');
+ });
+ };
+
+ // Call the API to get an auth token
+ scope.systemLogin = function (username, password) {
+ $('.api-error').empty();
+ var token;
+ if (Empty(username) || Empty(password)) {
+ Alert('Error!', 'Please provide a username and password before attempting to login.', 'alert-danger', setLoginFocus);
+ } else {
+ Wait('start');
+ Authorization.retrieveToken(username, password)
+ .success(function (data, status) {
+ $('#login-modal').modal('hide');
+ token = data.token;
+ Authorization.setToken(data.token, data.expires);
+ $rootScope.sessionTimer = Timer.init();
+ // Get all the profile/access info regarding the logged in user
+ Authorization.getUser()
+ .success(function (data) {
+ Authorization.setUserInfo(data);
+ $rootScope.user_is_superuser = data.results[0].is_superuser;
+ Authorization.getLicense()
+ .success(function (data) {
+ Authorization.setLicense(data.license_info);
+ if (lastPath()) {
+ // Go back to most recent navigation path
+ $location.path(lastPath());
+ } else {
+ $location.url('/home?login=true');
+ }
+ })
+ .error(function () {
+ Wait('stop');
+ Alert('Error', 'Failed to access user information. GET returned status: ' + status, 'alert-danger', setLoginFocus);
+ });
+ })
+ .error(function (data, status) {
+ Wait('stop');
+ Alert('Error', 'Failed to access license information. GET returned status: ' + status, 'alert-danger', setLoginFocus);
+ });
+ })
+ .error(function (data, status) {
+ var hdr, msg, key;
+ Wait('stop');
+ if (data.non_field_errors && data.non_field_errors.length === 0) {
+ // show field specific errors returned by the API
+ for (key in data) {
+ scope[key + 'Error'] = data[key][0];
+ }
+ } else {
+ if (data.non_field_errors && data.non_field_errors.length > 0) {
+ hdr = 'Error';
+ msg = data.non_field_errors[0];
+ } else {
+ hdr = 'Error';
+ msg = 'The login attempt failed with a status of: ' + status;
+ }
+ scope.reset();
+ Alert(hdr, msg, 'alert-danger', setLoginFocus);
}
- }
- else {
- var hdr, msg;
- if ( data.non_field_errors && data.non_field_errors.length > 0 ) {
- hdr = 'Error';
- msg = data.non_field_errors[0];
- }
- else {
- hdr = 'Error';
- msg = 'The login attempt failed with a status of: ' + status;
- }
- scope.reset();
- Alert(hdr, msg, 'alert-danger', setLoginFocus);
- }
- });
- }
- }
+ });
+ }
+ };
}
Authenticate.$inject = ['$cookieStore', '$window', '$scope', '$rootScope', '$location', 'Authorization', 'ToggleClass', 'Alert', 'Wait',
- 'Timer', 'Empty'];
+ 'Timer', 'Empty'
+];
diff --git a/awx/ui/static/js/controllers/Credentials.js b/awx/ui/static/js/controllers/Credentials.js
index a8bbedc751..ef4a636035 100644
--- a/awx/ui/static/js/controllers/Credentials.js
+++ b/awx/ui/static/js/controllers/Credentials.js
@@ -3,72 +3,80 @@
*
*
* Credentials.js
- *
+ *
* Controller functions for the Credential model.
*
*/
-
'use strict';
-function CredentialsList ($scope, $rootScope, $location, $log, $routeParams, Rest, Alert, CredentialList,
- GenerateList, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit, ReturnToCaller,
- ClearScope, ProcessErrors, GetBasePath, SelectionInit, GetChoices, Wait, Stream)
-{
- ClearScope('htmlTemplate'); //Garbage collection. Don't leave behind any listeners/watchers from the prior
- //scope.
+function CredentialsList($scope, $rootScope, $location, $log, $routeParams, Rest, Alert, CredentialList,
+ GenerateList, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit, ReturnToCaller,
+ ClearScope, ProcessErrors, GetBasePath, SelectionInit, GetChoices, Wait, Stream) {
+
+ ClearScope('htmlTemplate');
+
Wait('start');
- var list = CredentialList;
- var defaultUrl = GetBasePath('credentials');
- var view = GenerateList;
- var base = $location.path().replace(/^\//,'').split('/')[0];
- var 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
+ var list = CredentialList,
+ defaultUrl = GetBasePath('credentials'),
+ view = GenerateList,
+ base = $location.path().replace(/^\//, '').split('/')[0],
+ mode = (base === 'credentials') ? 'edit' : 'select', // if base path 'credentials', we're here to add/edit
+ scope = view.inject(list, { mode: mode }),
+ url;
+
scope.selected = [];
scope.credentialLoading = true;
-
- var url = GetBasePath(base);
- url += (base == 'users') ? $routeParams.user_id + '/credentials/' : $routeParams.team_id + '/credentials/';
- SelectionInit({ scope: scope, list: list, url: url, returnToCaller: 1 });
-
+ url = GetBasePath(base) + ( (base === 'users') ? $routeParams.user_id + '/credentials/' : $routeParams.team_id + '/credentials/' );
+
+ SelectionInit({
+ scope: scope,
+ list: list,
+ url: url,
+ returnToCaller: 1
+ });
+
if (scope.removePostRefresh) {
- scope.removePostRefresh();
+ scope.removePostRefresh();
}
- scope.removePostRefresh = scope.$on('PostRefresh', function() {
+ scope.removePostRefresh = scope.$on('PostRefresh', function () {
// Cleanup after a delete
+ var i, j;
+
Wait('stop');
$('#prompt-modal').off();
list.fields.kind.searchOptions = scope.credential_kind_options;
-
+
// Translate the kind value
- for(var i=0; i < scope.credentials.length; i++) {
- /*
- if (scope.credentials[i].summary_fields.user) {
- scope.credentials[i].user_username = scope.credentials[i].summary_fields.user.username;
- }
- 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;
- }
- }
+ for (i = 0; i < scope.credentials.length; i++) {
+ for (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;
+ }
+ }
}
- });
+ });
if (scope.removeChoicesReady) {
- scope.removeChoicesReady();
+ scope.removeChoicesReady();
}
- scope.removeChoicesReady = scope.$on('choicesReadyCredential', function() {
- SearchInit({ scope: scope, set: 'credentials', list: list, url: defaultUrl });
- PaginateInit({ scope: scope, list: list, url: defaultUrl });
- scope.search(list.iterator);
+ scope.removeChoicesReady = scope.$on('choicesReadyCredential', function () {
+ SearchInit({
+ scope: scope,
+ set: 'credentials',
+ list: list,
+ url: defaultUrl
});
+ PaginateInit({
+ scope: scope,
+ list: list,
+ url: defaultUrl
+ });
+ scope.search(list.iterator);
+ });
// Load the list of options for Kind
GetChoices({
@@ -77,434 +85,499 @@ function CredentialsList ($scope, $rootScope, $location, $log, $routeParams, Res
field: 'kind',
variable: 'credential_kind_options',
callback: 'choicesReadyCredential'
- });
+ });
LoadBreadCrumbs();
- scope.showActivity = function() { Stream({ scope: scope }); }
-
- scope.addCredential = function() {
- $location.path($location.path() + '/add');
- }
+ scope.showActivity = function () {
+ Stream({
+ scope: scope
+ });
+ };
- scope.editCredential = function(id) {
- $location.path($location.path() + '/' + id);
- }
-
- scope.deleteCredential = function(id, name) {
-
- var action = function() {
- $('#prompt-modal').on('hidden.bs.modal', function(){ Wait('start'); });
- $('#prompt-modal').modal('hide');
- var url = defaultUrl + id + '/';
- Rest.setUrl(url);
- Rest.destroy()
- .success( function(data, status, headers, config) {
- scope.search(list.iterator);
- })
- .error( function(data, status, headers, config) {
- Wait('stop');
- ProcessErrors(scope, data, status, null,
- { hdr: 'Error!', msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status });
- });
- };
+ scope.addCredential = function () {
+ $location.path($location.path() + '/add');
+ };
- Prompt({ hdr: 'Delete',
- body: 'Are you sure you want to delete ' + name + '?',
- action: action
+ scope.editCredential = function (id) {
+ $location.path($location.path() + '/' + id);
+ };
+
+ scope.deleteCredential = function (id, name) {
+
+ var action = function () {
+ $('#prompt-modal').on('hidden.bs.modal', function () {
+ Wait('start');
+ });
+ $('#prompt-modal').modal('hide');
+ var url = defaultUrl + id + '/';
+ Rest.setUrl(url);
+ Rest.destroy()
+ .success(function (data, status, headers, config) {
+ scope.search(list.iterator);
+ })
+ .error(function (data, status, headers, config) {
+ Wait('stop');
+ ProcessErrors(scope, data, status, null, {
+ hdr: 'Error!',
+ msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status
+ });
});
- }
+ };
+
+ Prompt({
+ hdr: 'Delete',
+ body: 'Are you sure you want to delete ' + name + '?',
+ action: action
+ });
+ };
}
-CredentialsList.$inject = [ '$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'CredentialList', 'GenerateList',
- 'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'ClearScope', 'ProcessErrors',
- 'GetBasePath', 'SelectionInit', 'GetChoices', 'Wait', 'Stream' ];
+CredentialsList.$inject = ['$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'CredentialList', 'GenerateList',
+ 'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'ClearScope', 'ProcessErrors',
+ 'GetBasePath', 'SelectionInit', 'GetChoices', 'Wait', 'Stream'
+];
-function CredentialsAdd ($scope, $rootScope, $compile, $location, $log, $routeParams, CredentialForm,
- GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ReturnToCaller, ClearScope,
- GenerateList, SearchInit, PaginateInit, LookUpInit, UserList, TeamList, GetBasePath,
- GetChoices, Empty, KindChange, OwnerChange, FormSave, DebugForm)
-{
- ClearScope('tree-form');
- ClearScope('htmlTemplate'); //Garbage collection. Don't leave behind any listeners/watchers from the prior
- //scope.
+function CredentialsAdd($scope, $rootScope, $compile, $location, $log, $routeParams, CredentialForm,
+ GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ReturnToCaller, ClearScope,
+ GenerateList, SearchInit, PaginateInit, LookUpInit, UserList, TeamList, GetBasePath,
+ GetChoices, Empty, KindChange, OwnerChange, FormSave, DebugForm) {
+ ClearScope('tree-form');
+ ClearScope('htmlTemplate'); //Garbage collection. Don't leave behind any listeners/watchers from the prior
+ //scope.
- // Inject dynamic view
- var defaultUrl = GetBasePath('credentials');
- var form = CredentialForm;
- var generator = GenerateForm;
- var scope = generator.inject(form, {mode: 'add', related: false});
- var base = $location.path().replace(/^\//,'').split('/')[0];
- var defaultUrl = GetBasePath('credentials');
- generator.reset();
- LoadBreadCrumbs();
+ // Inject dynamic view
+ var form = CredentialForm,
+ generator = GenerateForm,
+ scope = generator.inject(form, { mode: 'add', related: false }),
+ base = $location.path().replace(/^\//, '').split('/')[0],
+ defaultUrl = GetBasePath('credentials'),
+ url;
+
+ generator.reset();
+ LoadBreadCrumbs();
- // Load the list of options for Kind
- GetChoices({
+ // Load the list of options for Kind
+ GetChoices({
scope: scope,
url: defaultUrl,
field: 'kind',
variable: 'credential_kind_options'
+ });
+
+ LookUpInit({
+ scope: scope,
+ form: form,
+ current_item: (!Empty($routeParams.user_id)) ? $routeParams.user_id : null,
+ list: UserList,
+ field: 'user'
+ });
+
+ LookUpInit({
+ scope: scope,
+ form: form,
+ current_item: (!Empty($routeParams.team_id)) ? $routeParams.team_id : null,
+ list: TeamList,
+ field: 'team'
+ });
+
+ if (!Empty($routeParams.user_id)) {
+ // Get the username based on incoming route
+ scope.owner = 'user';
+ scope.user = $routeParams.user_id;
+ OwnerChange({
+ scope: scope
+ });
+ url = GetBasePath('users') + $routeParams.user_id + '/';
+ Rest.setUrl(url);
+ Rest.get()
+ .success(function (data, status, headers, config) {
+ scope.user_username = data.username;
+ })
+ .error(function (data, status, headers, config) {
+ ProcessErrors(scope, data, status, null, { hdr: 'Error!', msg: 'Failed to retrieve user. GET status: ' + status
+ });
+ });
+ } else if (!Empty($routeParams.team_id)) {
+ // Get the username based on incoming route
+ scope.owner = 'team';
+ scope.team = $routeParams.team_id;
+ OwnerChange({
+ scope: scope
+ });
+ url = GetBasePath('teams') + $routeParams.team_id + '/';
+ Rest.setUrl(url);
+ Rest.get()
+ .success(function (data, status, headers, config) {
+ scope.team_name = data.name;
+ })
+ .error(function (data, status, headers, config) {
+ ProcessErrors(scope, data, status, null, { hdr: 'Error!', msg: 'Failed to retrieve team. GET status: ' + status
+ });
+ });
+ } else {
+ // default type of owner to a user
+ scope.owner = 'user';
+ OwnerChange({
+ scope: scope
+ });
+ }
+
+ // Handle Kind change
+ scope.kindChange = function () {
+ KindChange({
+ scope: scope,
+ form: form,
+ reset: true
+ });
+ };
+
+ // Save
+ scope.formSave = function () {
+ generator.clearApiErrors();
+ FormSave({
+ scope: scope,
+ mode: 'add'
+ });
+ };
+
+ // Handle Owner change
+ scope.ownerChange = function () {
+ OwnerChange({
+ scope: scope
+ });
+ };
+
+ // Reset defaults
+ scope.formReset = function () {
+ generator.reset();
+ //DebugForm({ form: CredentialForm, scope: scope });
+ };
+
+ // Password change
+ scope.clearPWConfirm = function (fld) {
+ // If password value changes, make sure password_confirm must be re-entered
+ scope[fld] = '';
+ scope[form.name + '_form'][fld].$setValidity('awpassmatch', false);
+ };
+
+ // Respond to 'Ask at runtime?' checkbox
+ scope.ask = function (fld, associated) {
+ if (scope[fld + '_ask']) {
+ scope[fld] = 'ASK';
+ scope[associated] = '';
+ scope[form.name + '_form'][associated].$setValidity('awpassmatch', true);
+ } else {
+ scope[fld] = '';
+ scope[associated] = '';
+ scope[form.name + '_form'][associated].$setValidity('awpassmatch', true);
+ }
+ };
+
+ // Click clear button
+ scope.clear = function (fld, associated) {
+ scope[fld] = '';
+ scope[associated] = '';
+ scope[form.name + '_form'][associated].$setValidity('awpassmatch', true);
+ scope[form.name + '_form'].$setDirty();
+ };
+
+}
+
+CredentialsAdd.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'CredentialForm', 'GenerateForm',
+ 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ReturnToCaller', 'ClearScope', 'GenerateList',
+ 'SearchInit', 'PaginateInit', 'LookUpInit', 'UserList', 'TeamList', 'GetBasePath', 'GetChoices', 'Empty',
+ 'KindChange', 'OwnerChange', 'FormSave', 'DebugForm'
+];
+
+
+function CredentialsEdit($scope, $rootScope, $compile, $location, $log, $routeParams, CredentialForm,
+ GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, RelatedSearchInit,
+ RelatedPaginateInit, ReturnToCaller, ClearScope, Prompt, GetBasePath, GetChoices,
+ KindChange, UserList, TeamList, LookUpInit, Empty, OwnerChange, FormSave, Stream,
+ Wait
+) {
+
+ ClearScope('htmlTemplate');
+
+ 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;
+
+ generator.reset();
+ scope.id = id;
+
+ function setAskCheckboxes() {
+ var fld, i;
+ 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'
+ $("#" + fld + "-clear-btn").attr("disabled", "disabled");
+ scope[fld + '_ask'] = true;
+ } else {
+ scope[fld + '_ask'] = false;
+ $("#" + fld + "-clear-btn").removeAttr("disabled");
+ }
+ master[fld + '_ask'] = scope[fld + '_ask'];
+ }
+
+ // Set kind field to the correct option
+ for (i = 0; i < scope.credential_kind_options.length; i++) {
+ if (scope.kind === scope.credential_kind_options[i].value) {
+ scope.kind = scope.credential_kind_options[i];
+ break;
+ }
+ }
+ }
+
+ if (scope.removeCredentialLoaded) {
+ scope.removeCredentialLoaded();
+ }
+ scope.removeCredentialLoaded = scope.$on('credentialLoaded', function () {
+ LookUpInit({
+ scope: scope,
+ form: form,
+ current_item: (!Empty($scope.user_id)) ? scope.user_id : null,
+ list: UserList,
+ field: 'user'
});
- LookUpInit({
- scope: scope,
- form: form,
- current_item: (!Empty($routeParams.user_id)) ? $routeParams.user_id : null,
- list: UserList,
- field: 'user'
- });
+ LookUpInit({
+ scope: scope,
+ form: form,
+ current_item: (!Empty($scope.team_id)) ? scope.team_id : null,
+ list: TeamList,
+ field: 'team'
+ });
- LookUpInit({
- scope: scope,
- form: form,
- current_item: (!Empty($routeParams.team_id)) ? $routeParams.team_id : null,
- list: TeamList,
- field: 'team'
- });
+ setAskCheckboxes();
+ KindChange({
+ scope: scope,
+ form: form,
+ reset: false
+ });
+ OwnerChange({
+ scope: scope
+ });
+ Wait('stop');
+ });
- if (!Empty($routeParams.user_id)) {
- // Get the username based on incoming route
- scope['owner'] = 'user';
- scope['user'] = $routeParams.user_id;
- OwnerChange({ scope: scope });
- var url = GetBasePath('users') + $routeParams.user_id + '/';
- Rest.setUrl(url);
- Rest.get()
- .success( function(data, status, headers, config) {
- scope['user_username'] = data.username;
- })
- .error( function(data, status, headers, config) {
- ProcessErrors(scope, data, status, null,
- { hdr: 'Error!', msg: 'Failed to retrieve user. GET status: ' + status });
- });
- }
- else if (!Empty($routeParams.team_id)) {
- // Get the username based on incoming route
- scope['owner'] = 'team';
- scope['team'] = $routeParams.team_id;
- OwnerChange({ scope: scope });
- var url = GetBasePath('teams') + $routeParams.team_id + '/';
- Rest.setUrl(url);
- Rest.get()
- .success( function(data, status, headers, config) {
- scope['team_name'] = data.name;
- })
- .error( function(data, status, headers, config) {
- ProcessErrors(scope, data, status, null,
- { hdr: 'Error!', msg: 'Failed to retrieve team. GET status: ' + status });
- });
- }
- else {
- // default type of owner to a user
- scope['owner'] = 'user';
- OwnerChange({ scope: scope });
- }
-
- // Handle Kind change
- scope.kindChange = function () {
- KindChange({ scope: scope, form: form, reset: true });
- }
-
- // Save
- scope.formSave = function() { generator.clearApiErrors(); FormSave({ scope: scope, mode: 'add' }) };
-
- // Handle Owner change
- scope.ownerChange = function() {
- OwnerChange({ scope: scope });
- }
-
- // Reset defaults
- scope.formReset = function() {
- generator.reset();
- //DebugForm({ form: CredentialForm, scope: scope });
- };
-
- // Password change
- scope.clearPWConfirm = function(fld) {
- // If password value changes, make sure password_confirm must be re-entered
- scope[fld] = '';
- scope[form.name + '_form'][fld].$setValidity('awpassmatch', false);
- }
-
- // Respond to 'Ask at runtime?' checkbox
- scope.ask = function(fld, associated) {
- if (scope[fld + '_ask']) {
- scope[fld] = 'ASK';
- scope[associated] = '';
- scope[form.name + '_form'][associated].$setValidity('awpassmatch', true);
- }
- else {
- scope[fld] = '';
- scope[associated] = '';
- scope[form.name + '_form'][associated].$setValidity('awpassmatch', true);
- }
- }
-
- // Click clear button
- scope.clear = function(fld, associated) {
- scope[fld] = '';
- scope[associated] = '';
- scope[form.name + '_form'][associated].$setValidity('awpassmatch', true);
- scope[form.name + '_form'].$setDirty();
- }
-
-}
-
-CredentialsAdd.$inject = [ '$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'CredentialForm', 'GenerateForm',
- 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ReturnToCaller', 'ClearScope', 'GenerateList',
- 'SearchInit', 'PaginateInit', 'LookUpInit', 'UserList', 'TeamList', 'GetBasePath', 'GetChoices', 'Empty',
- 'KindChange', 'OwnerChange', 'FormSave', 'DebugForm'];
-
-
-function CredentialsEdit ($scope, $rootScope, $compile, $location, $log, $routeParams, CredentialForm,
- GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, RelatedSearchInit,
- RelatedPaginateInit, ReturnToCaller, ClearScope, Prompt, GetBasePath, GetChoices,
- KindChange, UserList, TeamList, LookUpInit, Empty, OwnerChange, FormSave, Stream,
- Wait
- )
-{
- ClearScope('tree-form');
- ClearScope('htmlTemplate'); //Garbage collection. Don't leave behind any listeners/watchers from the prior
- //scope.
-
- var defaultUrl=GetBasePath('credentials');
- var generator = GenerateForm;
- var form = CredentialForm;
- var scope = generator.inject(form, {mode: 'edit', related: true});
- generator.reset();
- var base = $location.path().replace(/^\//,'').split('/')[0];
- var defaultUrl = GetBasePath('credentials');
-
- var master = {};
- var id = $routeParams.credential_id;
- scope['id'] = id;
-
- var relatedSets = {};
-
- function setAskCheckboxes() {
- for (var fld in form.fields) {
- if (form.fields[fld].type == 'password' && scope[fld] == 'ASK') {
- // turn on 'ask' checkbox for password fields with value of 'ASK'
- $("#" + fld + "-clear-btn").attr("disabled","disabled");
- scope[fld + '_ask'] = true;
- }
- else {
- scope[fld + '_ask'] = false;
- $("#" + fld + "-clear-btn").removeAttr("disabled");
- }
- master[fld + '_ask'] = scope[fld + '_ask'];
- }
-
- // Set kind field to the correct option
- for (var i=0; i < scope['credential_kind_options'].length; i++) {
- if (scope['kind'] == scope['credential_kind_options'][i].value) {
- scope['kind'] = scope['credential_kind_options'][i];
- break;
- }
- }
- }
-
- if (scope.removeCredentialLoaded) {
- scope.removeCredentialLoaded();
- }
- scope.removeCredentialLoaded = scope.$on('credentialLoaded', function() {
- LookUpInit({
- scope: scope,
- form: form,
- current_item: (!Empty($scope['user_id'])) ? scope['user_id'] : null,
- list: UserList,
- field: 'user'
- });
-
- LookUpInit({
- scope: scope,
- form: form,
- current_item: (!Empty($scope['team_id'])) ? scope['team_id'] : null,
- list: TeamList,
- field: 'team'
- });
-
- setAskCheckboxes();
- KindChange({ scope: scope, form: form, reset: false });
- OwnerChange({ scope: scope });
- Wait('stop');
- });
-
- if (scope.removeChoicesReady) {
- scope.removeChoicesReady();
- }
- scope.removeChoicesReady = scope.$on('choicesReadyCredential', function() {
- // Retrieve detail record and prepopulate the form
- Rest.setUrl(defaultUrl + ':id/');
- Rest.get({ params: {id: id} })
- .success( function(data, status, headers, config) {
- LoadBreadCrumbs({ path: '/credentials/' + id, title: data.name });
- for (var fld in form.fields) {
- if (data[fld] !== null && data[fld] !== undefined) {
- scope[fld] = data[fld];
- master[fld] = scope[fld];
- }
- if (form.fields[fld].type == 'lookup' && data.summary_fields[form.fields[fld].sourceModel]) {
- scope[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] =
- scope[form.fields[fld].sourceModel + '_' + form.fields[fld].sourceField];
- }
- }
-
- if (!Empty(scope['user'])) {
- scope['owner'] = 'user';
- }
- else {
- scope['owner'] = 'team';
- }
- master['owner'] = scope['owner'];
-
- for (var i=0; i < scope.credential_kind_options.length; i++) {
- if (scope.credential_kind_options[i].value == data.kind) {
- scope.kind = scope.credential_kind_options[i];
- break;
- }
- }
- master['kind'] = scope['kind'];
-
- switch (data.kind) {
- case 'aws':
- scope['access_key'] = data.username;
- scope['secret_key'] = data.password;
- master['access_key'] = scope['access_key'];
- master['secret_key'] = scope['secret_key'];
- break;
- case 'ssh':
- scope['ssh_password'] = data.password;
- master['ssh_password'] = scope['ssh_password'];
- break;
- case 'rax':
- scope['api_key'] = data['password'];
- master['api_key'] = scope['api_key'];
- break;
- }
-
- scope.$emit('credentialLoaded');
- })
- .error( function(data, status, headers, config) {
- ProcessErrors(scope, data, status, form,
- { hdr: 'Error!', msg: 'Failed to retrieve Credential: ' + $routeParams.id + '. GET status: ' + status });
- });
- });
-
- Wait('start');
-
- GetChoices({
- scope: scope,
- url: defaultUrl,
- field: 'kind',
- variable: 'credential_kind_options',
- callback: 'choicesReadyCredential'
- });
-
- scope.showActivity = function() { Stream({ scope: scope }); }
-
- // Save changes to the parent
- scope.formSave = function() { generator.clearApiErrors(); FormSave({ scope: scope, mode: 'edit' }) };
-
- // Handle Owner change
- scope.ownerChange = function() {
- OwnerChange({ scope: scope });
- }
-
- // Handle Kind change
- scope.kindChange = function () {
- KindChange({ scope: scope, form: form, reset: true });
- }
-
- // Cancel
- scope.formReset = function() {
- generator.reset();
- for (var fld in master) {
- scope[fld] = master[fld];
- }
- setAskCheckboxes();
- KindChange({ scope: scope, form: form, reset: false });
- OwnerChange({ scope: scope });
- };
-
- // Related set: Add button
- scope.add = function(set) {
- $rootScope.flashMessage = null;
- $location.path('/' + base + '/' + $routeParams.id + '/' + set + '/add');
- };
-
- // Related set: Edit button
- scope.edit = function(set, id, name) {
- $rootScope.flashMessage = null;
- $location.path('/' + base + '/' + $routeParams.id + '/' + set + '/' + id);
- };
-
- // Related set: Delete button
- scope['delete'] = function(set, itm_id, name, title) {
- $rootScope.flashMessage = null;
-
- var action = function() {
- var url = defaultUrl + id + '/' + set + '/';
- Rest.setUrl(url);
- Rest.post({ id: itm_id, disassociate: 1 })
- .success( function(data, status, headers, config) {
- $('#prompt-modal').modal('hide');
- scope.search(form.related[set].iterator);
- })
- .error( function(data, status, headers, config) {
- $('#prompt-modal').modal('hide');
- ProcessErrors(scope, data, status, null,
- { hdr: 'Error!', msg: 'Call to ' + url + ' failed. POST returned status: ' + status });
- });
- };
-
- Prompt({ hdr: 'Delete',
- body: 'Are you sure you want to remove ' + name + ' from ' + scope.name + ' ' + title + '?',
- action: action
+ if (scope.removeChoicesReady) {
+ scope.removeChoicesReady();
+ }
+ scope.removeChoicesReady = scope.$on('choicesReadyCredential', function () {
+ // Retrieve detail record and prepopulate the form
+ Rest.setUrl(defaultUrl + ':id/');
+ Rest.get({
+ params: {
+ id: id
+ }
+ })
+ .success(function (data) {
+
+ var i, fld;
+
+ LoadBreadCrumbs({
+ path: '/credentials/' + id,
+ title: data.name
});
-
- }
- // Password change
- scope.clearPWConfirm = function(fld) {
- // If password value changes, make sure password_confirm must be re-entered
- scope[fld] = '';
- scope[form.name + '_form'][fld].$setValidity('awpassmatch', false);
- }
-
- // Respond to 'Ask at runtime?' checkbox
- scope.ask = function(fld, associated) {
- if (scope[fld + '_ask']) {
- $("#" + fld + "-clear-btn").attr("disabled","disabled");
- scope[fld] = 'ASK';
- scope[associated] = '';
- scope[form.name + '_form'][associated].$setValidity('awpassmatch', true);
- }
- else {
- $("#" + fld + "-clear-btn").removeAttr("disabled");
- scope[fld] = '';
- scope[associated] = '';
- scope[form.name + '_form'][associated].$setValidity('awpassmatch', true);
- }
- }
+ for (fld in form.fields) {
+ if (data[fld] !== null && data[fld] !== undefined) {
+ scope[fld] = data[fld];
+ master[fld] = scope[fld];
+ }
+ if (form.fields[fld].type === 'lookup' && data.summary_fields[form.fields[fld].sourceModel]) {
+ scope[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] =
+ scope[form.fields[fld].sourceModel + '_' + form.fields[fld].sourceField];
+ }
+ }
- scope.clear = function(fld, associated) {
- scope[fld] = '';
- scope[associated] = '';
- scope[form.name + '_form'][associated].$setValidity('awpassmatch', true);
- scope[form.name + '_form'].$setDirty();
- }
+ if (!Empty(scope.user)) {
+ scope.owner = 'user';
+ } else {
+ scope.owner = 'team';
+ }
+ master.owner = scope.owner;
+
+ for (i = 0; i < scope.credential_kind_options.length; i++) {
+ if (scope.credential_kind_options[i].value === data.kind) {
+ scope.kind = scope.credential_kind_options[i];
+ break;
+ }
+ }
+ master.kind = scope.kind;
+
+ switch (data.kind) {
+ case 'aws':
+ scope.access_key = data.username;
+ scope.secret_key = data.password;
+ master.access_key = scope.access_key;
+ master.secret_key = scope.secret_key;
+ break;
+ case 'ssh':
+ scope.ssh_password = data.password;
+ master.ssh_password = scope.ssh_password;
+ break;
+ case 'rax':
+ scope.api_key = data.password;
+ master.api_key = scope.api_key;
+ break;
+ }
+
+ scope.$emit('credentialLoaded');
+ })
+ .error(function (data, status) {
+ ProcessErrors(scope, data, status, form, {
+ hdr: 'Error!',
+ msg: 'Failed to retrieve Credential: ' + $routeParams.id + '. GET status: ' + status
+ });
+ });
+ });
+
+ Wait('start');
+
+ GetChoices({
+ scope: scope,
+ url: defaultUrl,
+ field: 'kind',
+ variable: 'credential_kind_options',
+ callback: 'choicesReadyCredential'
+ });
+
+ scope.showActivity = function () {
+ Stream({
+ scope: scope
+ });
+ };
+
+ // Save changes to the parent
+ scope.formSave = function () {
+ generator.clearApiErrors();
+ FormSave({
+ scope: scope,
+ mode: 'edit'
+ });
+ };
+
+ // Handle Owner change
+ scope.ownerChange = function () {
+ OwnerChange({
+ scope: scope
+ });
+ };
+
+ // Handle Kind change
+ scope.kindChange = function () {
+ KindChange({
+ scope: scope,
+ form: form,
+ reset: true
+ });
+ };
+
+ // Cancel
+ scope.formReset = function () {
+ generator.reset();
+ for (var fld in master) {
+ scope[fld] = master[fld];
+ }
+ setAskCheckboxes();
+ KindChange({
+ scope: scope,
+ form: form,
+ reset: false
+ });
+ OwnerChange({
+ scope: scope
+ });
+ };
+
+ // Related set: Add button
+ scope.add = function (set) {
+ $rootScope.flashMessage = null;
+ $location.path('/' + base + '/' + $routeParams.id + '/' + set + '/add');
+ };
+
+ // Related set: Edit button
+ scope.edit = function (set, id) {
+ $rootScope.flashMessage = null;
+ $location.path('/' + base + '/' + $routeParams.id + '/' + set + '/' + id);
+ };
+
+ // Related set: Delete button
+ scope['delete'] = function (set, itm_id, name, title) {
+ $rootScope.flashMessage = null;
+
+ var action = function () {
+ var url = defaultUrl + id + '/' + set + '/';
+ Rest.setUrl(url);
+ Rest.post({
+ id: itm_id,
+ disassociate: 1
+ })
+ .success(function () {
+ $('#prompt-modal').modal('hide');
+ scope.search(form.related[set].iterator);
+ })
+ .error(function (data, status) {
+ $('#prompt-modal').modal('hide');
+ ProcessErrors(scope, data, status, null, {
+ hdr: 'Error!',
+ msg: 'Call to ' + url + ' failed. POST returned status: ' + status
+ });
+ });
+ };
+
+ Prompt({
+ hdr: 'Delete',
+ body: 'Are you sure you want to remove ' + name + ' from ' + scope.name + ' ' + title + '?',
+ action: action
+ });
+
+ };
+
+ // Password change
+ scope.clearPWConfirm = function (fld) {
+ // If password value changes, make sure password_confirm must be re-entered
+ scope[fld] = '';
+ scope[form.name + '_form'][fld].$setValidity('awpassmatch', false);
+ };
+
+ // Respond to 'Ask at runtime?' checkbox
+ scope.ask = function (fld, associated) {
+ if (scope[fld + '_ask']) {
+ $("#" + fld + "-clear-btn").attr("disabled", "disabled");
+ scope[fld] = 'ASK';
+ scope[associated] = '';
+ scope[form.name + '_form'][associated].$setValidity('awpassmatch', true);
+ } else {
+ $("#" + fld + "-clear-btn").removeAttr("disabled");
+ scope[fld] = '';
+ scope[associated] = '';
+ scope[form.name + '_form'][associated].$setValidity('awpassmatch', true);
+ }
+ };
+
+ scope.clear = function (fld, associated) {
+ scope[fld] = '';
+ scope[associated] = '';
+ scope[form.name + '_form'][associated].$setValidity('awpassmatch', true);
+ scope[form.name + '_form'].$setDirty();
+ };
}
-CredentialsEdit.$inject = [ '$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'CredentialForm',
- 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'RelatedSearchInit',
- 'RelatedPaginateInit', 'ReturnToCaller', 'ClearScope', 'Prompt', 'GetBasePath', 'GetChoices',
- 'KindChange', 'UserList', 'TeamList', 'LookUpInit', 'Empty', 'OwnerChange', 'FormSave', 'Stream',
- 'Wait'];
-
+CredentialsEdit.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'CredentialForm',
+ 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'RelatedSearchInit', 'RelatedPaginateInit',
+ 'ReturnToCaller', 'ClearScope', 'Prompt', 'GetBasePath', 'GetChoices', 'KindChange', 'UserList', 'TeamList', 'LookUpInit',
+ 'Empty', 'OwnerChange', 'FormSave', 'Stream', 'Wait'
+];
\ No newline at end of file
diff --git a/awx/ui/static/js/controllers/Home.js b/awx/ui/static/js/controllers/Home.js
index 2851d17631..66b97e22ab 100644
--- a/awx/ui/static/js/controllers/Home.js
+++ b/awx/ui/static/js/controllers/Home.js
@@ -3,43 +3,55 @@
*
*
* Home.js
- *
+ *
* Controller functions for Home tab
*
*/
'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('home'); //Garbage collection. Don't leave behind any listeners/watchers from the prior
- //scope.
-
+
+ ClearScope('home');
+
+ var buttons, html, e, waitCount, loadedCount;
+
// 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.
- var buttons = {
+ buttons = {
refresh: {
mode: 'all',
awToolTip: "Refresh the page",
ngClick: "refresh()"
- },
+ },
stream: {
ngClick: "showActivity()",
awToolTip: "View Activity Stream",
mode: 'all'
- }
- };
- var html = Button({ btn: buttons.refresh, action: 'refresh', toolbar: true });
- html += Button({ btn: buttons.stream, action: 'stream', toolbar: true });
- var e = angular.element(document.getElementById('home-list-actions'));
+ }
+ };
+
+ html = Button({
+ 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);
$compile(e)($scope);
- var waitCount = 4;
- var loadedCount = 0;
-
- if (!$routeParams['login']) {
+ waitCount = 4;
+ loadedCount = 0;
+
+ if (!$routeParams.login) {
// If we're not logging in, start the Wait widget. Otherwise, it's already running.
Wait('start');
}
@@ -47,297 +59,366 @@ function Home ($scope, $compile, $routeParams, $rootScope, $location, Wait, Obje
if ($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
- loadedCount++;
- if ( loadedCount == waitCount ) {
+ loadedCount++;
+ if (loadedCount === waitCount) {
Wait('stop');
}
- });
+ });
if ($scope.removeDashboardReady) {
$scope.removeDashboardReady();
}
- $scope.removeDashboardReady = $scope.$on('dashboardReady', function(e, data) {
- JobStatus({ scope: $scope, target: 'container1', dashboard: data});
- InventorySyncStatus({ scope: $scope, target: 'container2', dashboard: data});
- SCMSyncStatus({ scope: $scope, target: 'container4', dashboard: data});
- ObjectCount({ scope: $scope, target: 'container3', dashboard: data});
+ $scope.removeDashboardReady = $scope.$on('dashboardReady', function (e, data) {
+ JobStatus({
+ scope: $scope,
+ target: 'container1',
+ dashboard: data
});
-
- $scope.showActivity = function() { Stream({ scope: $scope }); }
+ InventorySyncStatus({
+ scope: $scope,
+ target: 'container2',
+ dashboard: data
+ });
+ SCMSyncStatus({
+ scope: $scope,
+ target: 'container4',
+ dashboard: data
+ });
+ ObjectCount({
+ scope: $scope,
+ target: 'container3',
+ dashboard: data
+ });
+ });
- $scope.refresh = function() {
+ $scope.showActivity = function () {
+ Stream({
+ scope: $scope
+ });
+ };
+
+ $scope.refresh = function () {
Wait('start');
loadedCount = 0;
Rest.setUrl(GetBasePath('dashboard'));
Rest.get()
- .success( function(data, status, headers, config) {
+ .success(function (data) {
$scope.$emit('dashboardReady', data);
})
- .error ( function(data, status, headers, config) {
+ .error(function (data, status) {
Wait('stop');
- ProcessErrors($scope, data, status, null,
- { hdr: 'Error!', msg: 'Failed to get dashboard: ' + status });
- })
- }
-
+ ProcessErrors($scope, data, status, null, { hdr: 'Error!', msg: 'Failed to get dashboard: ' + status });
+ });
+ };
+
$scope.refresh();
-
- }
-Home.$inject=['$scope', '$compile', '$routeParams', '$rootScope', '$location', 'Wait', 'ObjectCount', 'JobStatus', 'InventorySyncStatus',
- 'SCMSyncStatus', 'ClearScope', 'Stream', 'Rest', 'GetBasePath', 'ProcessErrors', 'Button'];
+}
+
+Home.$inject = ['$scope', '$compile', '$routeParams', '$rootScope', '$location', 'Wait', 'ObjectCount', 'JobStatus', 'InventorySyncStatus',
+ '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,
Alert, Rest, Empty, InventoryUpdate, Find) {
- ClearScope('htmlTemplate'); //Garbage collection. Don't leave behind any listeners/watchers from the prior
- //scope.
+ ClearScope('htmlTemplate'); //Garbage collection. Don't leave behind any listeners/watchers from the prior
+ //scope.
- var generator = GenerateList;
- var list = HomeGroupList;
- var defaultUrl=GetBasePath('groups');
-
- var scope = generator.inject(list, { mode: 'edit' });
- var base = $location.path().replace(/^\//,'').split('/')[0];
+ var generator = GenerateList,
+ list = HomeGroupList,
+ defaultUrl = GetBasePath('groups'),
+ scope = generator.inject(list, { mode: 'edit' }),
+ opt;
if (scope.removePostRefresh) {
scope.removePostRefresh();
}
- scope.removePostRefresh = scope.$on('PostRefresh', function() {
- var hosts_status, update_status, last_update, stat;
- for (var i=0; i < scope.home_groups.length; i++) {
-
- scope['home_groups'][i]['inventory_name'] = scope['home_groups'][i]['summary_fields']['inventory']['name'];
+ scope.removePostRefresh = scope.$on('PostRefresh', function () {
+ var i, hosts_status, stat;
+ for (i = 0; i < scope.home_groups.length; i++) {
- stat = GetSyncStatusMsg({
+ scope.home_groups[i].inventory_name = scope.home_groups[i].summary_fields.inventory.name;
+
+ stat = GetSyncStatusMsg({
status: scope.home_groups[i].summary_fields.inventory_source.status
- }); // from helpers/Groups.js
-
+ }); // from helpers/Groups.js
+
hosts_status = GetHostsStatusMsg({
active_failures: scope.home_groups[i].hosts_with_active_failures,
total_hosts: scope.home_groups[i].total_hosts,
inventory_id: scope.home_groups[i].inventory,
group_id: scope.home_groups[i].id
- });
-
- scope['home_groups'][i].status_class = stat['class'],
- scope['home_groups'][i].status_tooltip = stat['tooltip'],
- scope['home_groups'][i].launch_tooltip = stat['launch_tip'],
- scope['home_groups'][i].launch_class = stat['launch_class'],
- scope['home_groups'][i].hosts_status_tip = hosts_status['tooltip'],
- scope['home_groups'][i].show_failures = hosts_status['failures'],
- scope['home_groups'][i].hosts_status_class = hosts_status['class'],
-
-
+ });
+
+ scope.home_groups[i].status_class = stat['class'];
+ scope.home_groups[i].status_tooltip = stat.tooltip;
+ scope.home_groups[i].launch_tooltip = stat.launch_tip;
+ scope.home_groups[i].launch_class = stat.launch_class;
+ scope.home_groups[i].hosts_status_tip = hosts_status.tooltip;
+ scope.home_groups[i].show_failures = hosts_status.failures;
+ 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].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;
-
}
- });
+ });
- SearchInit({ scope: scope, set: 'home_groups', list: list, url: defaultUrl });
- PaginateInit({ scope: scope, list: list, url: defaultUrl });
+ SearchInit({
+ scope: scope,
+ set: 'home_groups',
+ list: list,
+ url: defaultUrl
+ });
+ PaginateInit({
+ scope: scope,
+ list: list,
+ url: defaultUrl
+ });
// Process search params
- if ($routeParams['name']) {
+ if ($routeParams.name) {
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 + 'SearchFieldLabel'] = list.fields['name'].label;
+ scope[list.iterator + 'SearchFieldLabel'] = list.fields.name.label;
scope[list.iterator + 'SearchSelectValue'] = null;
}
- if ($routeParams['id']) {
+ if ($routeParams.id) {
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 + 'SearchFieldLabel'] = list.fields['id'].label;
+ scope[list.iterator + 'SearchFieldLabel'] = list.fields.id.label;
scope[list.iterator + 'SearchSelectValue'] = null;
}
- if ($routeParams['has_active_failures']) {
+ if ($routeParams.has_active_failures) {
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 + 'SearchFieldLabel'] = list.fields['has_active_failures'].label;
- scope[list.iterator + 'SearchSelectValue'] = ($routeParams['has_active_failures'] == 'true') ? { value: 1 } : { value: 0 };
+ scope[list.iterator + 'SearchFieldLabel'] = list.fields.has_active_failures.label;
+ 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 + 'SelectShow'] = true;
- scope[list.iterator + 'SearchSelectOpts'] = list.fields['status'].searchOptions;
- scope[list.iterator + 'SearchFieldLabel'] = list.fields['status'].label.replace(/\
/g,' ');
- for (var opt in list.fields['status'].searchOptions) {
- if (list.fields['status'].searchOptions[opt].value == $routeParams['status']) {
- scope[list.iterator + 'SearchSelectValue'] = list.fields['status'].searchOptions[opt];
- break;
- }
+ scope[list.iterator + 'SearchSelectOpts'] = list.fields.status.searchOptions;
+ scope[list.iterator + 'SearchFieldLabel'] = list.fields.status.label.replace(/
/g, ' ');
+ for (opt in list.fields.status.searchOptions) {
+ if (list.fields.status.searchOptions[opt].value === $routeParams.status) {
+ scope[list.iterator + 'SearchSelectValue'] = list.fields.status.searchOptions[opt];
+ break;
+ }
}
}
- if ($routeParams['source']) {
+ if ($routeParams.source) {
scope[list.iterator + 'SearchField'] = 'source';
scope[list.iterator + 'SelectShow'] = true;
- scope[list.iterator + 'SearchSelectOpts'] = list.fields['source'].searchOptions;
- scope[list.iterator + 'SearchFieldLabel'] = list.fields['source'].label.replace(/\
/g,' ');
- for (var opt in list.fields['source'].searchOptions) {
- if (list.fields['source'].searchOptions[opt].value == $routeParams['source']) {
- scope[list.iterator + 'SearchSelectValue'] = list.fields['source'].searchOptions[opt];
- break;
- }
+ scope[list.iterator + 'SearchSelectOpts'] = list.fields.source.searchOptions;
+ scope[list.iterator + 'SearchFieldLabel'] = list.fields.source.label.replace(/
/g, ' ');
+ for (opt in list.fields.source.searchOptions) {
+ if (list.fields.source.searchOptions[opt].value === $routeParams.source) {
+ scope[list.iterator + 'SearchSelectValue'] = list.fields.source.searchOptions[opt];
+ break;
+ }
}
- if ($routeParams['status']) {
- scope[list.iterator + 'ExtraParms'] = '&inventory_source__status__icontains=' + $routeParams['status'];
+ if ($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 + '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 + '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);
-
- LoadBreadCrumbs();
-
- scope.showActivity = function() { Stream({ scope: scope }); }
- scope.editGroup = function(group_id, inventory_id) {
- GroupsEdit({ scope: scope, group_id: group_id, inventory_id: inventory_id, groups_reload: false });
- }
-
- scope.viewUpdateStatus = function(id) {
+ scope.search(list.iterator);
+
+ LoadBreadCrumbs();
+
+ scope.showActivity = function () {
+ Stream({
+ scope: scope
+ });
+ };
+
+ scope.editGroup = function (group_id, inventory_id) {
+ GroupsEdit({
+ scope: scope,
+ group_id: group_id,
+ inventory_id: inventory_id,
+ groups_reload: false
+ });
+ };
+
+ scope.viewUpdateStatus = function (id) {
scope.groups = scope.home_groups;
- ViewUpdateStatus({ scope: scope, tree_id: id })
- };
+ ViewUpdateStatus({
+ scope: scope,
+ tree_id: id
+ });
+ };
// Launch inventory sync
- scope.updateGroup = function(id) {
- var group = Find({ list: scope.home_groups, key: 'id', val: id});
+ scope.updateGroup = function (id) {
+ var group = Find({ list: scope.home_groups, key: 'id', val: id });
if (group) {
if (Empty(group.source)) {
// 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 ' +
- scope.home_groups[i].name + '. Use the Refresh button to monitor the status.', 'alert-info');
- }
- else {
+ group.name + '. Use the Refresh button to monitor the status.', 'alert-info');
+ } else {
Wait('start');
Rest.setUrl(group.related.inventory_source);
Rest.get()
- .success( function(data, status, headers, config) {
+ .success(function (data) {
InventoryUpdate({
- scope: scope,
+ scope: scope,
url: data.related.update,
- group_name: data.summary_fields.group.name,
+ group_name: data.summary_fields.group.name,
group_source: data.source,
tree_id: group.id,
group_id: group.id
- });
- })
- .error( function(data, status, headers, config) {
- ProcessErrors(scope, data, status, form,
- { hdr: 'Error!', msg: 'Failed to retrieve inventory source: ' + group.related.inventory_source +
- ' POST returned status: ' + status });
});
+ })
+ .error(function (data, status) {
+ ProcessErrors(scope, data, status, null, { hdr: 'Error!',
+ msg: 'Failed to retrieve inventory source: ' + group.related.inventory_source + ' 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',
'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) {
- ClearScope('htmlTemplate'); //Garbage collection. Don't leave behind any listeners/watchers from the prior
- //scope.
+ ClearScope('htmlTemplate'); //Garbage collection. Don't leave behind any listeners/watchers from the prior
+ //scope.
- var generator = GenerateList;
- var list = HomeHostList;
- var defaultUrl=GetBasePath('hosts');
-
- var scope = generator.inject(list, { mode: 'edit' });
- var base = $location.path().replace(/^\//,'').split('/')[0];
+ var generator = GenerateList,
+ list = HomeHostList,
+ defaultUrl = GetBasePath('hosts'),
+ scope = generator.inject(list, { mode: 'edit' });
if (scope.removePostRefresh) {
- scope.removePostRefresh();
+ scope.removePostRefresh();
}
- scope.removePostRefresh = scope.$on('PostRefresh', function() {
- for (var i=0; i < scope.hosts.length; i++) {
- scope['hosts'][i]['inventory_name'] = scope['hosts'][i]['summary_fields']['inventory']['name'];
+ scope.removePostRefresh = scope.$on('PostRefresh', function () {
+ for (var i = 0; i < scope.hosts.length; i++) {
+ scope.hosts[i].inventory_name = scope.hosts[i].summary_fields.inventory.name;
//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
+ });
+ PaginateInit({
+ scope: scope,
+ list: list,
+ url: defaultUrl
+ });
- SearchInit({ scope: scope, set: 'hosts', list: list, url: defaultUrl });
- PaginateInit({ scope: scope, list: list, url: defaultUrl });
-
// Process search params
- if ($routeParams['name']) {
+ if ($routeParams.name) {
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 + '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 + 'SearchValue'] = $routeParams['id'];
+ scope[HomeHostList.iterator + 'SearchValue'] = $routeParams.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;
}
- if ($routeParams['has_active_failures']) {
+ if ($routeParams.has_active_failures) {
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 + 'SearchFieldLabel'] = HomeHostList.fields['has_active_failures'].label;
- scope[HomeHostList.iterator + 'SearchSelectValue'] = ($routeParams['has_active_failures'] == 'true') ? { value: 1 } : { value: 0 };
+ scope[HomeHostList.iterator + 'SearchFieldLabel'] = HomeHostList.fields.has_active_failures.label;
+ scope[HomeHostList.iterator + 'SearchSelectValue'] = ($routeParams.has_active_failures === 'true') ? { value: 1 } : { value: 0 };
}
-
+
scope.search(list.iterator);
-
+
LoadBreadCrumbs();
-
- scope.showActivity = function() { Stream({ scope: scope }); }
- scope.toggle_host_enabled = function(id, sources) { ToggleHostEnabled({ host_id: id, external_source: sources, scope: scope }); }
+ scope.showActivity = function () {
+ Stream({
+ scope: scope
+ });
+ };
- scope.editHost = function(host_id, host_name) {
- var host = Find({ list: scope.hosts, key: 'id', val: host_id });
+ scope.toggle_host_enabled = function (id, sources) {
+ ToggleHostEnabled({
+ host_id: id,
+ external_source: sources,
+ scope: scope
+ });
+ };
+
+ scope.editHost = function (host_id) {
+ var host = Find({
+ list: scope.hosts,
+ key: 'id',
+ val: host_id
+ });
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) {
- ShowJobSummary({ job_id: job_id });
- }
+ scope.showJobSummary = function (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',
'Find', 'ShowJobSummary'
- ];
+];
\ No newline at end of file
diff --git a/awx/ui/static/js/controllers/Inventories.js b/awx/ui/static/js/controllers/Inventories.js
index 64de7d27ac..35cf1f183e 100644
--- a/awx/ui/static/js/controllers/Inventories.js
+++ b/awx/ui/static/js/controllers/Inventories.js
@@ -3,61 +3,78 @@
*
*
* Inventories.js
- *
+ *
* Controller functions for the Inventory model.
*
*/
-
+
'use strict';
-function InventoriesList ($scope, $rootScope, $location, $log, $routeParams, Rest, Alert, InventoryList,
- GenerateList, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit, ReturnToCaller,
- ClearScope, ProcessErrors, GetBasePath, Wait, Stream, EditInventoryProperties)
-{
- ClearScope('htmlTemplate'); //Garbage collection. Don't leave behind any listeners/watchers from the prior
- //scope.
- var list = InventoryList;
- var defaultUrl = GetBasePath('inventory');
- var view = GenerateList;
- var paths = $location.path().replace(/^\//,'').split('/');
- var mode = (paths[0] == 'inventories') ? 'edit' : 'select'; // if base path 'users', we're here to add/edit users
- var scope = view.inject(InventoryList, { mode: mode }); // Inject our view
+function InventoriesList($scope, $rootScope, $location, $log, $routeParams, Rest, Alert, InventoryList,
+ GenerateList, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit, ReturnToCaller, ClearScope, ProcessErrors,
+ GetBasePath, Wait, Stream, EditInventoryProperties) {
+ ClearScope('htmlTemplate');
+
+ var list = InventoryList,
+ defaultUrl = GetBasePath('inventory'),
+ view = GenerateList,
+ paths = $location.path().replace(/^\//, '').split('/'),
+ mode = (paths[0] === 'inventories') ? 'edit' : 'select', // if base path 'users', we're here to add/edit users
+ scope = view.inject(InventoryList, { mode: mode });
+
$rootScope.flashMessage = null;
- SearchInit({ scope: scope, set: 'inventories', list: list, url: defaultUrl });
- PaginateInit({ scope: scope, list: list, url: defaultUrl });
-
- if ($routeParams['name']) {
+ SearchInit({
+ scope: scope,
+ set: 'inventories',
+ list: list,
+ url: defaultUrl
+ });
+ PaginateInit({
+ scope: scope,
+ list: list,
+ url: defaultUrl
+ });
+
+ if ($routeParams.name) {
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 + 'SearchFieldLabel'] = InventoryList.fields['name'].label;
+ scope[InventoryList.iterator + 'SearchFieldLabel'] = InventoryList.fields.name.label;
scope[InventoryList.iterator + 'SearchSelectValue'] = null;
}
- if ($routeParams['has_active_failures']) {
+ if ($routeParams.has_active_failures) {
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 + 'SearchFieldLabel'] = InventoryList.fields['has_active_failures'].label;
- scope[InventoryList.iterator + 'SearchSelectValue'] = ($routeParams['has_active_failures'] == 'true') ? { value: 1 } : { value: 0 };
+ scope[InventoryList.iterator + 'SearchFieldLabel'] = InventoryList.fields.has_active_failures.label;
+ 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 + 'SearchValue'] = $routeParams['has_inventory_sources'];
+ scope[InventoryList.iterator + 'SearchValue'] = $routeParams.has_inventory_sources;
scope[InventoryList.iterator + 'SearchField'] = 'has_inventory_sources';
- 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 + 'SearchFieldLabel'] = InventoryList.fields.has_inventory_sources.label;
+ 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
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 + 'SearchFieldLabel'] = InventoryList.fields['inventory_sources_with_failures'].label;
+ scope[InventoryList.iterator + 'SearchFieldLabel'] = InventoryList.fields.inventory_sources_with_failures.label;
scope[InventoryList.iterator + 'SearchType'] = 'gtzero';
}
@@ -66,282 +83,300 @@ function InventoriesList ($scope, $rootScope, $location, $log, $routeParams, Res
LoadBreadCrumbs();
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
Wait('stop');
$('#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
//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) {
- 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].failed_hosts_link = '/#/inventories/' + scope.inventories[i].id + '/';
- scope.inventories[i].failed_hosts_class = 'true';
- }
- else {
- if (scope.inventories[i].total_hosts == 0) {
- // no hosts
- 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_class = 'na';
- }
- else {
- // many hosts with 0 failures
- 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].failed_hosts_link = '/#/inventories/' + scope.inventories[i].id + '/';
- scope.inventories[i].failed_hosts_class = 'false';
- }
+ 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].failed_hosts_link = '/#/inventories/' + scope.inventories[i].id + '/';
+ scope.inventories[i].failed_hosts_class = 'true';
+ } else {
+ if (scope.inventories[i].total_hosts === 0) {
+ // no hosts
+ 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_class = 'na';
+ } else {
+ // many hosts with 0 failures
+ 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].failed_hosts_link = '/#/inventories/' + scope.inventories[i].id + '/';
+ scope.inventories[i].failed_hosts_class = 'false';
+ }
}
// Set values for Status column
- 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) {
- scope.inventories[i].status_tip = scope.inventories[i].inventory_sources_with_failures + ' cloud ' +
- ( (scope.inventories[i].inventory_sources_with_failures == 1) ? 'source' : 'sources' ) +
- ' with failures. Click to view details.';
- scope.inventories[i].status_link = '/#/inventories/' + scope.inventories[i].id + '/';
- scope.inventories[i].status_class = 'failed';
- }
- else {
- if (scope.inventories[i].total_inventory_sources == 0) {
- // no groups are reporting a source
- 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_class = 'na';
- }
- else {
- // many hosts with 0 failures
- scope.inventories[i].status_tip = scope.inventories[i].total_inventory_sources +
- ' cloud ' + ( (scope.inventories[i].total_inventory_sources > 1) ? 'sources' : 'source' ) +
- ' with no failures. Click to view details.';
- scope.inventories[i].status_link = '/#/inventories/' + scope.inventories[i].id + '/';
- scope.inventories[i].status_class = 'successful';
- }
+ scope.inventories[i].status_tip = scope.inventories[i].inventory_sources_with_failures + ' cloud ' +
+ ((scope.inventories[i].inventory_sources_with_failures === 1) ? 'source' : 'sources') +
+ ' with failures. Click to view details.';
+ scope.inventories[i].status_link = '/#/inventories/' + scope.inventories[i].id + '/';
+ scope.inventories[i].status_class = 'failed';
+ } else {
+ if (scope.inventories[i].total_inventory_sources === 0) {
+ // no groups are reporting a source
+ 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_class = 'na';
+ } else {
+ // many hosts with 0 failures
+ scope.inventories[i].status_tip = scope.inventories[i].total_inventory_sources +
+ ' cloud ' + ((scope.inventories[i].total_inventory_sources > 1) ? 'sources' : 'source') +
+ ' with no failures. Click to view details.';
+ scope.inventories[i].status_link = '/#/inventories/' + scope.inventories[i].id + '/';
+ scope.inventories[i].status_class = 'successful';
+ }
}
}
- });
+ });
if (scope.removeRefreshInventories) {
scope.removeRefreshInventories();
}
- scope.removeRefreshInventories = scope.$on('RefreshInventories', function() {
+ scope.removeRefreshInventories = scope.$on('RefreshInventories', function () {
// Reflect changes after inventory properties edit completes
scope.search(list.iterator);
+ });
+
+ scope.showActivity = function () {
+ Stream({
+ scope: scope
});
-
- scope.showActivity = function() { Stream({ scope: scope }); }
+ };
- scope.editInventoryProperties = function(inventory_id) {
- EditInventoryProperties({ scope: scope, inventory_id: inventory_id });
- }
+ scope.editInventoryProperties = function (inventory_id) {
+ EditInventoryProperties({
+ scope: scope,
+ inventory_id: inventory_id
+ });
+ };
- scope.addInventory = function() {
+ scope.addInventory = function () {
$location.path($location.path() + '/add');
- }
+ };
- scope.editInventory = function(id) {
+ scope.editInventory = function (id) {
$location.path($location.path() + '/' + id);
- }
-
- scope.deleteInventory = function(id, name) {
-
- var action = function() {
+ };
+
+ scope.deleteInventory = function (id, name) {
+
+ var action = function () {
var url = defaultUrl + id + '/';
- $('#prompt-modal').on('hidden.bs.modal', function() {
+ $('#prompt-modal').on('hidden.bs.modal', function () {
Wait('start');
- });
+ });
$('#prompt-modal').modal('hide');
Rest.setUrl(url);
Rest.destroy()
- .success( function(data, status, headers, config) {
- scope.search(list.iterator);
- })
- .error( function(data, status, headers, config) {
+ .success(function () {
+ scope.search(list.iterator);
+ })
+ .error(function (data, status) {
Wait('stop');
- ProcessErrors(scope, data, status, null,
- { hdr: 'Error!', msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status });
- });
- };
+ ProcessErrors(scope, data, status, null, {
+ hdr: 'Error!',
+ msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status
+ });
+ });
+ };
- Prompt({ hdr: 'Delete',
- body: 'Are you sure you want to delete ' + name + '?',
- action: action
- });
- }
-
- scope.lookupOrganization = function(organization_id) {
+ Prompt({
+ hdr: 'Delete',
+ body: 'Are you sure you want to delete ' + name + '?',
+ action: action
+ });
+ };
+
+ scope.lookupOrganization = function (organization_id) {
Rest.setUrl(GetBasePath('organizations') + organization_id + '/');
Rest.get()
- .success( function(data, status, headers, config) {
+ .success(function (data) {
return data.name;
- });
- }
+ });
+ };
- // Failed jobs link. Go to the jobs tabs, find all jobs for the inventory and sort by status
- scope.viewJobs = function(id) {
+ // Failed jobs link. Go to the jobs tabs, find all jobs for the inventory and sort by status
+ scope.viewJobs = function (id) {
$location.url('/jobs/?inventory__int=' + id);
- }
+ };
- scope.viewFailedJobs = function(id) {
+ scope.viewFailedJobs = function (id) {
$location.url('/jobs/?inventory__int=' + id + '&status=failed');
+ };
+}
+
+InventoriesList.$inject = ['$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'InventoryList', 'GenerateList',
+ 'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'ClearScope', 'ProcessErrors',
+ 'GetBasePath', 'Wait', 'Stream', 'EditInventoryProperties'
+];
+
+
+function InventoriesAdd($scope, $rootScope, $compile, $location, $log, $routeParams, InventoryForm,
+ GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ReturnToCaller, ClearScope,
+ GenerateList, OrganizationList, SearchInit, PaginateInit, LookUpInit, GetBasePath,
+ ParseTypeChange, Wait) {
+ ClearScope('htmlTemplate'); //Garbage collection. Don't leave behind any listeners/watchers from the prior
+ //scope.
+
+ // Inject dynamic view
+ var defaultUrl = GetBasePath('inventory'),
+ form = InventoryForm,
+ generator = GenerateForm,
+ scope;
+
+ form.well = true;
+ form.formLabelSize = null;
+ form.formFieldSize = null;
+
+ scope = generator.inject(form, {
+ mode: 'add',
+ related: false
+ });
+ scope.inventoryParseType = 'yaml';
+
+ generator.reset();
+ LoadBreadCrumbs();
+ ParseTypeChange(scope, 'inventory_variables', 'inventoryParseType');
+
+ LookUpInit({
+ scope: scope,
+ form: form,
+ current_item: ($routeParams.organization_id) ? $routeParams.organization_id : null,
+ list: OrganizationList,
+ field: 'organization'
+ });
+
+ // Save
+ scope.formSave = function () {
+ generator.clearApiErrors();
+ Wait('start');
+ try {
+ var fld, json_data, data;
+
+ // Make sure we have valid variable data
+ if (scope.inventoryParseType === 'json') {
+ json_data = JSON.parse(scope.inventory_variables); //make sure JSON parses
+ } else {
+ json_data = jsyaml.load(scope.inventory_variables); //parse yaml
+ }
+
+ // Make sure our JSON is actually an object
+ if (typeof json_data !== 'object') {
+ throw "failed to return an object!";
+ }
+
+ data = {};
+ for (fld in form.fields) {
+ if (fld !== 'inventory_variables') {
+ if (form.fields[fld].realName) {
+ data[form.fields[fld].realName] = scope[fld];
+ } else {
+ data[fld] = scope[fld];
+ }
+ }
+ }
+
+ Rest.setUrl(defaultUrl);
+ Rest.post(data)
+ .success(function (data) {
+ var inventory_id = data.id;
+ if (scope.inventory_variables) {
+ Rest.setUrl(data.related.variable_data);
+ Rest.put(json_data)
+ .success(function () {
+ Wait('stop');
+ $location.path('/inventories/' + inventory_id + '/');
+ })
+ .error(function (data, status) {
+ Wait('stop');
+ ProcessErrors(scope, data, status, null, { hdr: 'Error!',
+ msg: 'Failed to add inventory varaibles. PUT returned status: ' + status
+ });
+ });
+ } else {
+ Wait('stop');
+ $location.path('/inventories/' + inventory_id + '/');
+ }
+ })
+ .error(function (data, status) {
+ Wait('stop');
+ ProcessErrors(scope, data, status, form, {
+ hdr: 'Error!',
+ msg: 'Failed to add new inventory. Post returned status: ' + status
+ });
+ });
+ } catch (err) {
+ Wait('stop');
+ Alert("Error", "Error parsing inventory variables. Parser returned: " + err);
}
+
+ };
+
+ // Reset
+ scope.formReset = function () {
+ // Defaults
+ generator.reset();
+ };
}
-InventoriesList.$inject = [ '$scope', '$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'InventoryList', 'GenerateList',
- 'LoadBreadCrumbs', 'Prompt', 'SearchInit', 'PaginateInit', 'ReturnToCaller', 'ClearScope', 'ProcessErrors',
- 'GetBasePath', 'Wait', 'Stream', 'EditInventoryProperties'];
-
-
-function InventoriesAdd ($scope, $rootScope, $compile, $location, $log, $routeParams, InventoryForm,
- GenerateForm, Rest, Alert, ProcessErrors, LoadBreadCrumbs, ReturnToCaller, ClearScope,
- GenerateList, OrganizationList, SearchInit, PaginateInit, LookUpInit, GetBasePath,
- ParseTypeChange, Wait)
-{
- ClearScope('htmlTemplate'); //Garbage collection. Don't leave behind any listeners/watchers from the prior
- //scope.
-
- // Inject dynamic view
- var defaultUrl = GetBasePath('inventory');
- var form = InventoryForm;
- var generator = GenerateForm;
-
- form.well = true,
- form.formLabelSize = null;
- form.formFieldSize = null;
-
- var scope = generator.inject(form, {mode: 'add', related: false});
- scope.inventoryParseType = 'yaml';
-
- generator.reset();
- LoadBreadCrumbs();
- ParseTypeChange(scope,'inventory_variables', 'inventoryParseType');
-
- LookUpInit({
- scope: scope,
- form: form,
- current_item: ($routeParams.organization_id) ? $routeParams.organization_id : null,
- list: OrganizationList,
- field: 'organization'
- });
-
- // Save
- scope.formSave = function() {
- generator.clearApiErrors();
- Wait('start');
- try {
- // Make sure we have valid variable data
- if (scope.inventoryParseType == 'json') {
- var json_data = JSON.parse(scope.inventory_variables); //make sure JSON parses
- }
- else {
- var json_data = jsyaml.load(scope.inventory_variables); //parse yaml
- }
-
- // Make sure our JSON is actually an object
- if (typeof json_data !== 'object') {
- throw "failed to return an object!";
- }
-
- var data = {}
- for (var fld in form.fields) {
- if (fld != 'inventory_variables') {
- if (form.fields[fld].realName) {
- data[form.fields[fld].realName] = scope[fld];
- }
- else {
- data[fld] = scope[fld];
- }
- }
- }
-
- Rest.setUrl(defaultUrl);
- Rest.post(data)
- .success( function(data, status, headers, config) {
- var inventory_id = data.id;
- if (scope.inventory_variables) {
- Rest.setUrl(data.related.variable_data);
- Rest.put(json_data)
- .success( function(data, status, headers, config) {
- Wait('stop');
- $location.path('/inventories/' + inventory_id + '/');
- })
- .error( function(data, status, headers, config) {
- Wait('stop');
- ProcessErrors(scope, data, status, form,
- { hdr: 'Error!', msg: 'Failed to add inventory varaibles. PUT returned status: ' + status });
- });
- }
- else {
- Wait('stop');
- $location.path('/inventories/' + inventory_id + '/');
- }
- })
- .error( function(data, status, headers, config) {
- Wait('stop');
- ProcessErrors(scope, data, status, form,
- { hdr: 'Error!', msg: 'Failed to add new inventory. Post returned status: ' + status });
- });
- }
- catch(err) {
- Wait('stop');
- Alert("Error", "Error parsing inventory variables. Parser returned: " + err);
- }
-
- };
-
- // Reset
- scope.formReset = function() {
- // Defaults
- generator.reset();
- };
-}
-
-InventoriesAdd.$inject = [ '$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'InventoryForm', 'GenerateForm',
- 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ReturnToCaller', 'ClearScope', 'GenerateList',
- 'OrganizationList', 'SearchInit', 'PaginateInit', 'LookUpInit', 'GetBasePath', 'ParseTypeChange', 'Wait'
- ];
+InventoriesAdd.$inject = ['$scope', '$rootScope', '$compile', '$location', '$log', '$routeParams', 'InventoryForm', 'GenerateForm',
+ 'Rest', 'Alert', 'ProcessErrors', 'LoadBreadCrumbs', 'ReturnToCaller', 'ClearScope', 'GenerateList',
+ 'OrganizationList', 'SearchInit', 'PaginateInit', 'LookUpInit', 'GetBasePath', 'ParseTypeChange', 'Wait'
+];
-function InventoriesEdit ($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)
-{
- ClearScope('htmlTemplate'); //Garbage collection. Don't leave behind any listeners/watchers from the prior
- //scope.
+function InventoriesEdit($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) {
+ ClearScope('htmlTemplate'); //Garbage collection. Don't leave behind any listeners/watchers from the prior
+ //scope.
+
+ var generator = GenerateList,
+ list = InventoryGroups;
- var generator = GenerateList;
- var list = InventoryGroups;
- var base = $location.path().replace(/^\//,'').split('/')[0];
-
$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
if ($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
- var e = angular.element(document.getElementById('breadcrumbs'));
+ var e, inventoryAutoHelp;
+ e = angular.element(document.getElementById('breadcrumbs'));
e.html(Breadcrumbs({ list: list, mode: 'edit' }));
$compile(e)($scope);
-
+
// 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.inventory_name = inventory_name;
@@ -352,235 +387,324 @@ function InventoriesEdit ($scope, $location, $routeParams, $compile, GenerateLis
$scope.groups[0].selected_class = 'selected';
$scope.groups[0].active_class = 'active-row';
$scope.selected_group_name = $scope.groups[0].name;
- }
- else {
+ } else {
$scope.selected_tree_id = null;
$scope.selected_group_id = null;
- }
+ }
// Add hosts view
$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
- setTimeout(function() {
+ setTimeout(function () {
// Hack to keep group name from slipping to a new line
- $('#groups_table .name-column').each( function() {
- var td_width = $(this).width();
- var level_width = $(this).find('.level').width();
- var level_padding = parseInt($(this).find('.level').css('padding-left').replace(/px/,''));
- var level = level_width + level_padding;
- var pct = ( 100 - Math.ceil((level / td_width)*100) ) + '%';
- $(this).find('.group-name').css({ width: pct });
+ $('#groups_table .name-column').each(function () {
+ var td_width, level_width, level_padding, level, pct;
+ td_width = $(this).width();
+ level_width = $(this).find('.level').width();
+ level_padding = parseInt($(this).find('.level').css('padding-left').replace(/px/, ''));
+ level = level_width + level_padding;
+ pct = (100 - Math.ceil((level / td_width) * 100)) + '%';
+ $(this).find('.group-name').css({
+ width: pct
});
+ });
ApplyEllipsis('#groups_table .group-name a');
ApplyEllipsis('#hosts_table .host-name a');
- }, 2500); //give the window time to display
+ }, 2500); //give the window time to display
WatchInventoryWindowResize();
-
- var inventoryAutoHelp = Store('inventoryAutoHelp');
+
+ inventoryAutoHelp = Store('inventoryAutoHelp');
if (inventoryAutoHelp !== 'off' && $scope.autoShowGroupHelp) {
- $scope.showGroupHelp({ autoShow: true });
+ $scope.showGroupHelp({
+ autoShow: true
+ });
}
- });
-
+ });
+
// Called after tree data is reloaded on refresh button click.
if ($scope.removeGroupTreeRefreshed) {
$scope.removeGroupTreeRefreshed();
}
- $scope.removeGroupTreeRefreshed = $scope.$on('GroupTreeRefreshed', function(e, inventory_name, groups) {
+ $scope.removeGroupTreeRefreshed = $scope.$on('GroupTreeRefreshed', function () {
// 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.
$scope.showHosts($scope.selected_tree_id, $scope.selected_group_id, false);
- });
-
+ });
+
// Group was deleted. Now we need to refresh the group view.
if ($scope.removeGroupDeleteCompleted) {
$scope.removeGroupDeleteCompleted();
}
- $scope.removeGroupDeleteCompleted = $scope.$on('GroupDeleteCompleted', function(e) {
+ $scope.removeGroupDeleteCompleted = $scope.$on('GroupDeleteCompleted', function () {
$scope.selected_tree_id = 1;
$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
if ($scope.removeCopMoveGroup) {
$scope.removeCopyMoveGroup();
}
- $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 });
+ $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
});
+ });
// Respond to a host drag-n-drop
if ($scope.removeCopMoveHost) {
$scope.removeCopyMoveHost();
}
- $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 });
+ $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
});
+ });
- $scope.showHosts = function(tree_id, group_id, show_failures) {
+ $scope.showHosts = function (tree_id, group_id, show_failures) {
// Clicked on group
if (tree_id !== null) {
Wait('start');
- $scope.selected_tree_id = tree_id;
+ $scope.selected_tree_id = tree_id;
$scope.selected_group_id = group_id;
$scope.hosts = [];
- $scope.show_failures = show_failures; // turn on failed hosts filter in hosts view
- for (var i=0; i < $scope.groups.length; i++) {
- if ($scope.groups[i].id == tree_id) {
+ $scope.show_failures = show_failures; // turn on failed hosts filter in hosts view
+ for (var i = 0; i < $scope.groups.length; i++) {
+ if ($scope.groups[i].id === tree_id) {
$scope.groups[i].selected_class = 'selected';
$scope.groups[i].active_class = 'active-row';
$scope.selected_group_name = $scope.groups[i].name;
- }
- else {
+ } else {
$scope.groups[i].selected_class = '';
$scope.groups[i].active_class = '';
}
}
- HostsReload({ scope: $scope, group_id: group_id, tree_id: tree_id, inventory_id: $scope.inventory_id });
- }
- else {
+ HostsReload({
+ scope: $scope,
+ group_id: group_id,
+ tree_id: tree_id,
+ inventory_id: $scope.inventory_id
+ });
+ } else {
Wait('stop');
}
- }
+ };
- $scope.createGroup = function() {
- GroupsAdd({ scope: $scope, inventory_id: $scope.inventory_id, group_id: $scope.selected_group_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 });
- }
+ $scope.createGroup = function () {
+ GroupsAdd({
+ scope: $scope,
+ inventory_id: $scope.inventory_id,
+ group_id: $scope.selected_group_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
+ });
+ };
// Launch inventory sync
- $scope.updateGroup = function(id) {
- var group = Find({ list: $scope.groups, key: 'id', val: id});
+ $scope.updateGroup = function (id) {
+ var group = Find({ list: $scope.groups, key: 'id', val: id });
if (group) {
if (Empty(group.source)) {
// 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 ' +
- $scope.groups[i].name + '. Use the Refresh button to monitor the status.', 'alert-info');
- }
- else {
+ group.name + '. Use the Refresh button to monitor the status.', 'alert-info');
+ } else {
Wait('start');
Rest.setUrl(group.related.inventory_source);
Rest.get()
- .success( function(data, status, headers, config) {
+ .success(function (data) {
InventoryUpdate({
- scope: $scope,
+ scope: $scope,
url: data.related.update,
- group_name: data.summary_fields.group.name,
+ group_name: data.summary_fields.group.name,
group_source: data.source,
tree_id: group.id,
group_id: group.group_id
- });
- })
- .error( function(data, status, headers, config) {
- Wait('stop');
- ProcessErrors(scope, data, status, form,
- { hdr: 'Error!', msg: 'Failed to retrieve inventory source: ' + group.related.inventory_source +
- ' POST returned status: ' + status });
});
+ })
+ .error(function (data, status) {
+ Wait('stop');
+ ProcessErrors($scope, data, status, null, { hdr: 'Error!', msg: 'Failed to retrieve inventory source: ' +
+ group.related.inventory_source + ' POST returned status: ' + status });
+ });
}
- }
}
+ };
- $scope.cancelUpdate = function(tree_id) {
- GroupsCancelUpdate({ scope: $scope, tree_id: tree_id });
- }
-
- $scope.toggle = function(tree_id) {
+ $scope.cancelUpdate = function (tree_id) {
+ GroupsCancelUpdate({
+ scope: $scope,
+ tree_id: tree_id
+ });
+ };
+
+ $scope.toggle = function (tree_id) {
// 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
if (tree_id) {
$scope.selected_tree_id = tree_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) {
- ViewUpdateStatus({ scope: $scope, tree_id: tree_id, group_id: group_id });
- }
+ $scope.viewUpdateStatus = function (tree_id, group_id) {
+ ViewUpdateStatus({
+ scope: $scope,
+ tree_id: tree_id,
+ group_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 });
- }
+ $scope.deleteGroup = function (tree_id, group_id) {
+ GroupsDelete({
+ scope: $scope,
+ tree_id: tree_id,
+ group_id: group_id,
+ inventory_id: $scope.inventory_id
+ });
+ };
- $scope.createHost = function() {
- HostsCreate({ scope: $scope });
- }
-
- $scope.editInventoryProperties = function() {
- EditInventoryProperties({ scope: $scope, inventory_id: $scope.inventory_id });
- }
+ $scope.createHost = function () {
+ HostsCreate({
+ scope: $scope
+ });
+ };
- $scope.editHost = function(host_id) {
- HostsEdit({ scope: $scope, host_id: host_id, inventory_id: $scope.inventory_id });
- }
+ $scope.editInventoryProperties = function () {
+ EditInventoryProperties({
+ scope: $scope,
+ inventory_id: $scope.inventory_id
+ });
+ };
- $scope.deleteHost = function(host_id, host_name) {
- HostsDelete({ scope: $scope, host_id: host_id, host_name: host_name });
- }
+ $scope.editHost = function (host_id) {
+ HostsEdit({
+ scope: $scope,
+ host_id: host_id,
+ inventory_id: $scope.inventory_id
+ });
+ };
- $scope.toggleHostEnabled = function(host_id, external_source) {
- ToggleHostEnabled({ scope: $scope, host_id: host_id, external_source: external_source });
- }
+ $scope.deleteHost = function (host_id, host_name) {
+ HostsDelete({
+ scope: $scope,
+ host_id: host_id,
+ host_name: host_name
+ });
+ };
- $scope.showGroupActivity = function() {
+ $scope.toggleHostEnabled = function (host_id, external_source) {
+ ToggleHostEnabled({
+ scope: $scope,
+ host_id: host_id,
+ external_source: external_source
+ });
+ };
+
+ $scope.showGroupActivity = function () {
var url, title, group;
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;
title = 'Showing all activities for group ' + group.name;
- }
- else {
+ } else {
title = 'Showing all activities for all ' + $scope.inventory_name + ' groups';
url = GetBasePath('activity_stream') + '?group__inventory__id=' + $scope.inventory_id;
}
- Stream({ scope: $scope, inventory_name: $scope.inventory_name, url: url, title: title });
- }
-
- $scope.showHostActivity = function() {
+ Stream({
+ scope: $scope,
+ inventory_name: $scope.inventory_name,
+ url: url,
+ title: title
+ });
+ };
+
+ $scope.showHostActivity = function () {
var url, title;
title = 'Showing all activities for all ' + $scope.inventory_name + ' hosts';
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) {
- ShowJobSummary({ job_id: job_id });
- }
+ $scope.showJobSummary = function (job_id) {
+ ShowJobSummary({
+ job_id: job_id
+ });
+ };
- $scope.showGroupHelp = function(params) {
- var opts = { defn: InventoryGroupsHelp };
+ $scope.showGroupHelp = function (params) {
+ var opts = {
+ defn: InventoryGroupsHelp
+ };
if (params) {
opts.autoShow = params.autoShow || false;
}
HelpDialog(opts);
- }
+ };
//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'
+];
\ No newline at end of file
diff --git a/awx/ui/static/js/controllers/JobEvents.js b/awx/ui/static/js/controllers/JobEvents.js
index 735fe2eaee..7c9406dd0d 100644
--- a/awx/ui/static/js/controllers/JobEvents.js
+++ b/awx/ui/static/js/controllers/JobEvents.js
@@ -3,180 +3,168 @@
*
*
* JobEvents.js
- *
+ *
* Controller functions for the Job Events model.
*
*/
'use strict';
-function JobEventsList ($filter, $scope, $rootScope, $location, $log, $routeParams, Rest, Alert, JobEventList,
- GenerateList, LoadBreadCrumbs, Prompt, SearchInit, PaginateInit, ReturnToCaller,
- ClearScope, ProcessErrors, GetBasePath, LookUpInit, ToggleChildren,
- FormatDate, EventView, Refresh, Wait)
-{
+function JobEventsList($filter, $scope, $rootScope, $location, $log, $routeParams, Rest, Alert, JobEventList, GenerateList,
+ LoadBreadCrumbs, Prompt, SearchInit, PaginateInit, ReturnToCaller, ClearScope, ProcessErrors, GetBasePath, LookUpInit, ToggleChildren,
+ FormatDate, EventView, Refresh, Wait) {
+
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();
-
- 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;
$rootScope.flashMessage = null;
scope.selected = [];
- scope.expand = true; //on load, automatically expand all nodes
+ scope.expand = true; //on load, automatically expand all nodes
+
+ scope.parentNode = 'parent-event'; // used in ngClass to dynamically set row level class and control
+ scope.childNode = 'child-event'; // link color and cursor
- scope.parentNode = 'parent-event'; // used in ngClass to dynamically set row level class and control
- scope.childNode = 'child-event'; // link color and cursor
-
if (scope.removeSetHostLinks) {
- scope.removeSetHostLinks();
+ scope.removeSetHostLinks();
}
- scope.removeSetHostLinks = scope.$on('SetHostLinks', function(e, inventory_id) {
- for (var i=0; i < scope.jobevents.length; i++) {
+ scope.removeSetHostLinks = scope.$on('SetHostLinks', function (e, inventory_id) {
+ for (var i = 0; i < scope.jobevents.length; i++) {
if (scope.jobevents[i].summary_fields.host) {
- scope.jobevents[i].hostLink = "/#/inventories/" + inventory_id + "/hosts/?name=" +
- escape(scope.jobevents[i].summary_fields.host.name);
+ scope.jobevents[i].hostLink = "/#/inventories/" + inventory_id + "/hosts/?name=" +
+ encodeURI(scope.jobevents[i].summary_fields.host.name);
}
}
- });
+ });
function formatJSON(eventData) {
//turn JSON event data into an html form
- var html = '';
- if (eventData['res']) {
- var n, rows;
- var found = false;
- if (typeof eventData.res == 'string') {
- n = eventData['res'].match(/\n/g);
- rows = (n) ? n.length : 1;
- rows = (rows > 10) ? 10 : rows;
- found = true;
- html += "