diff --git a/awx/ui/static/js/helpers/EventViewer.js b/awx/ui/static/js/helpers/EventViewer.js index b2882204dc..8a4405e1c8 100644 --- a/awx/ui/static/js/helpers/EventViewer.js +++ b/awx/ui/static/js/helpers/EventViewer.js @@ -273,7 +273,8 @@ angular.module('EventViewerHelper', ['ModalDialog', 'Utilities', 'EventsViewerFo }; }]) - .factory('GetEvent', ['Wait', 'Rest', 'ProcessErrors', function(Wait, Rest, ProcessErrors) { + .factory('GetEvent', ['Wait', 'Rest', 'ProcessErrors', + function(Wait, Rest, ProcessErrors) { return function(params) { var url = params.url, scope = params.scope, @@ -295,70 +296,79 @@ angular.module('EventViewerHelper', ['ModalDialog', 'Utilities', 'EventsViewerFo Rest.setUrl(url); Rest.get() .success( function(data) { - scope.next_event_set = data.next; - scope.prev_event_set = data.previous; - data.results.forEach(function(event) { - var msg, key, event_data = {}; - if (event.event_data.res) { - if (typeof event.event_data.res !== 'object') { - // turn event_data.res into an object - msg = event.event_data.res; - event.event_data.res = {}; - event.event_data.res.msg = msg; - } - for (key in event.event_data) { - if (key !== "res") { - event.event_data.res[key] = event.event_data[key]; - } - } - if (event.event_data.res.ansible_facts) { - // don't show fact gathering results - event.event_data.res.task = "Gathering Facts"; - delete event.event_data.res.ansible_facts; - } - event.event_data.res.status = getStatus(event); - event_data = event.event_data.res; - } - else { - event.event_data.status = getStatus(event); - event_data = event.event_data; - } - // convert results to stdout - if (event_data.results && typeof event_data.results === "object" && Array.isArray(event_data.results)) { - event_data.stdout = ""; - event_data.results.forEach(function(row) { - event_data.stdout += row + "\n"; - }); - delete event_data.results; - } - if (event_data.invocation) { - for (key in event_data.invocation) { - event_data[key] = event_data.invocation[key]; - } - delete event_data.invocation; - } - event_data.play = event.play; - if (event.task) { - event_data.task = event.task; - } - event_data.created = event.created; - event_data.role = event.role; - event_data.host_id = event.host; - event_data.host_name = event.host_name; - if (event_data.host) { - delete event_data.host; - } - event_data.id = event.id; - event_data.parent = event.parent; - event_data.event = (event.event_display) ? event.event_display : event.event; - results.push(event_data); - }); - if (show_event) { - scope.$emit('ShowNextEvent', results, show_event); + + if(jQuery.isEmptyObject(data)) { + Wait('stop'); + ProcessErrors(scope, data, status, null, { hdr: 'Error!', + msg: 'Failed to get event ' + url + '. ' }); + } else { - scope.$emit('EventReady', results); - } + scope.next_event_set = data.next; + scope.prev_event_set = data.previous; + data.results.forEach(function(event) { + var msg, key, event_data = {}; + if (event.event_data.res) { + if (typeof event.event_data.res !== 'object') { + // turn event_data.res into an object + msg = event.event_data.res; + event.event_data.res = {}; + event.event_data.res.msg = msg; + } + for (key in event.event_data) { + if (key !== "res") { + event.event_data.res[key] = event.event_data[key]; + } + } + if (event.event_data.res.ansible_facts) { + // don't show fact gathering results + event.event_data.res.task = "Gathering Facts"; + delete event.event_data.res.ansible_facts; + } + event.event_data.res.status = getStatus(event); + event_data = event.event_data.res; + } + else { + event.event_data.status = getStatus(event); + event_data = event.event_data; + } + // convert results to stdout + if (event_data.results && typeof event_data.results === "object" && Array.isArray(event_data.results)) { + event_data.stdout = ""; + event_data.results.forEach(function(row) { + event_data.stdout += row + "\n"; + }); + delete event_data.results; + } + if (event_data.invocation) { + for (key in event_data.invocation) { + event_data[key] = event_data.invocation[key]; + } + delete event_data.invocation; + } + event_data.play = event.play; + if (event.task) { + event_data.task = event.task; + } + event_data.created = event.created; + event_data.role = event.role; + event_data.host_id = event.host; + event_data.host_name = event.host_name; + if (event_data.host) { + delete event_data.host; + } + event_data.id = event.id; + event_data.parent = event.parent; + event_data.event = (event.event_display) ? event.event_display : event.event; + results.push(event_data); + }); + if (show_event) { + scope.$emit('ShowNextEvent', results, show_event); + } + else { + scope.$emit('EventReady', results); + } + } //else statement }) .error(function(data, status) { ProcessErrors(scope, data, status, null, { hdr: 'Error!', diff --git a/awx/ui/static/js/helpers/JobSubmission.js b/awx/ui/static/js/helpers/JobSubmission.js index c274029cf9..98045da00f 100644 --- a/awx/ui/static/js/helpers/JobSubmission.js +++ b/awx/ui/static/js/helpers/JobSubmission.js @@ -517,11 +517,9 @@ function($location, Wait, GetBasePath, LookUpInit, JobTemplateForm, CredentialLi if(question.type === 'integer'){ min = (!Empty(question.min)) ? Number(question.min) : ""; max = (!Empty(question.max)) ? Number(question.max) : "" ; - html+=''+ - '
A value is required!
'+ - '
'+ - '
This is not valid integer!
'+ + html+=''+ + '
A value is required!
'+ + '
This is not valid integer!
'+ '
The value must be in range {{'+min+'}} to {{'+max+'}}!
'; } @@ -530,10 +528,9 @@ function($location, Wait, GetBasePath, LookUpInit, JobTemplateForm, CredentialLi min = (!Empty(question.min)) ? question.min : ""; max = (!Empty(question.max)) ? question.max : "" ; defaultValue = (!Empty(question.default)) ? question.default : (!Empty(question.default_float)) ? question.default_float : "" ; - html+=''+ + html+=''+ '
This is not valid float!
'+ '
The value must be in range {{'+min+'}} to {{'+max+'}}!
'; - // '
A value is required!
'; } html+=''; if(question.index === scope.survey_questions.length-1){ diff --git a/awx/ui/static/lib/ansible/directives.js b/awx/ui/static/lib/ansible/directives.js index a62a1d3367..a67e4ce039 100644 --- a/awx/ui/static/lib/ansible/directives.js +++ b/awx/ui/static/lib/ansible/directives.js @@ -148,6 +148,7 @@ angular.module('AWDirectives', ['RestServices', 'Utilities', 'AuthService', 'Job return { restrict: 'A', require: 'ngModel', + // scope: true, link: function (scope, elem, attr, ctrl) { scope.$watch(attr.ngMin, function () { ctrl.$setViewValue(ctrl.$viewValue); @@ -162,7 +163,6 @@ angular.module('AWDirectives', ['RestServices', 'Utilities', 'AuthService', 'Job return value; } }; - ctrl.$parsers.push(minValidator); ctrl.$formatters.push(minValidator); } @@ -173,6 +173,7 @@ angular.module('AWDirectives', ['RestServices', 'Utilities', 'AuthService', 'Job return { restrict: 'A', require: 'ngModel', + // scope: true, link: function (scope, elem, attr, ctrl) { scope.$watch(attr.ngMax, function () { ctrl.$setViewValue(ctrl.$viewValue); @@ -187,7 +188,6 @@ angular.module('AWDirectives', ['RestServices', 'Utilities', 'AuthService', 'Job return value; } }; - ctrl.$parsers.push(maxValidator); ctrl.$formatters.push(maxValidator); } @@ -196,14 +196,19 @@ angular.module('AWDirectives', ['RestServices', 'Utilities', 'AuthService', 'Job .directive('smartFloat', function() { - var FLOAT_REGEXP = /^\-?\d+((\.|\,)\d+)?$/; + var FLOAT_REGEXP_1 = /^\$?\d+(.\d{3})*(\,\d*)?$/, //Numbers like: 1.123,56 + FLOAT_REGEXP_2 = /^\$?\d+(,\d{3})*(\.\d*)?$/; //Numbers like: 1,123.56 return { + restrict: 'A', require: 'ngModel', - link: function(scope, elm, attrs, ctrl) { - ctrl.$parsers.unshift(function(viewValue) { - if (FLOAT_REGEXP.test(viewValue)) { + link: function (scope, elm, attrs, ctrl) { + ctrl.$parsers.unshift(function (viewValue) { + if (FLOAT_REGEXP_1.test(Number(viewValue))) { ctrl.$setValidity('float', true); - return parseFloat(viewValue.replace(',', '.')); + return parseFloat(viewValue.replace('.', '').replace(',', '.')); + } else if (FLOAT_REGEXP_2.test(Number(viewValue))) { + ctrl.$setValidity('float', true); + return parseFloat(viewValue.replace(',', '')); } else { ctrl.$setValidity('float', false); return undefined; @@ -211,6 +216,21 @@ angular.module('AWDirectives', ['RestServices', 'Utilities', 'AuthService', 'Job }); } }; + // var FLOAT_REGEXP = /^\-?\d+((\.|\,)\d+)?$/; + // return { + // require: 'ngModel', + // link: function(scope, elm, attrs, ctrl) { + // ctrl.$parsers.unshift(function(viewValue) { + // if (FLOAT_REGEXP.test(viewValue)) { + // ctrl.$setValidity('float', true); + // return parseFloat(viewValue.replace(',', '.')); + // } else { + // ctrl.$setValidity('float', false); + // return undefined; + // } + // }); + // } + // }; }) // integer Validate that input is of type integer. Taken from Angular developer @@ -221,6 +241,7 @@ angular.module('AWDirectives', ['RestServices', 'Utilities', 'AuthService', 'Job // override/interfere with this directive. .directive('integer', function() { return { + restrict: 'A', require: 'ngModel', link: function(scope, elm, attrs, ctrl) { ctrl.$parsers.unshift(function(viewValue) {