diff --git a/awx/ui/client/legacy-styles/forms.less b/awx/ui/client/legacy-styles/forms.less
index e04e43860d..2301445ce9 100644
--- a/awx/ui/client/legacy-styles/forms.less
+++ b/awx/ui/client/legacy-styles/forms.less
@@ -433,6 +433,10 @@ input[type='radio']:checked:before {
outline:none;
}
+.Form-inputLabelContainer {
+ width: 100%;
+ display: block !important;
+}
.Form-inputLabel{
text-transform: uppercase;
color: @default-interface-txt;
@@ -443,6 +447,16 @@ input[type='radio']:checked:before {
.noselect;
}
+.Form-labelAction {
+ text-transform: uppercase;
+ font-weight: normal;
+ font-size: 0.8em;
+ padding-left:5px;
+ float: right;
+ margin-top: 3px;
+ .noselect;
+}
+
.Form-buttons{
height: 30px;
display: flex;
diff --git a/awx/ui/client/src/forms/JobTemplates.js b/awx/ui/client/src/forms/JobTemplates.js
index ad8d8c50f1..7a9065af2b 100644
--- a/awx/ui/client/src/forms/JobTemplates.js
+++ b/awx/ui/client/src/forms/JobTemplates.js
@@ -81,6 +81,11 @@ export default
},
project: {
label: 'Project',
+ labelAction: {
+ label: 'RESET',
+ ngClick: 'resetProjectToDefault()',
+ 'class': "{{!(job_type.value === 'scan' && project_name !== 'Default') ? 'hidden' : ''}}",
+ },
type: 'lookup',
sourceModel: 'project',
sourceField: 'name',
@@ -99,6 +104,7 @@ export default
label: 'Playbook',
type:'select',
ngOptions: 'book for book in playbook_options track by book',
+ ngDisabled: "job_type.value === 'scan' && project_name === 'Default'",
id: 'playbook-select',
awRequiredWhen: {
reqExpression: "playbookrequired",
@@ -110,12 +116,6 @@ export default
dataPlacement: 'right',
dataContainer: "body",
},
- default_scan: {
- type: 'custom',
- column: 1,
- ngShow: 'job_type.value === "scan" && project_name !== "Default"',
- control: 'Reset to default project and playbook'
- },
credential: {
label: 'Machine Credential',
type: 'lookup',
diff --git a/awx/ui/client/src/helpers/JobTemplates.js b/awx/ui/client/src/helpers/JobTemplates.js
index 90317a41a8..80242ccecd 100644
--- a/awx/ui/client/src/helpers/JobTemplates.js
+++ b/awx/ui/client/src/helpers/JobTemplates.js
@@ -177,7 +177,7 @@ angular.module('JobTemplatesHelper', ['Utilities'])
});
- if(scope.project === "" && scope.playbook === ""){
+ if (scope.project === "" && scope.playbook === "") {
scope.toggleScanInfo();
}
diff --git a/awx/ui/client/src/job-templates/add/job-templates-add.controller.js b/awx/ui/client/src/job-templates/add/job-templates-add.controller.js
index 12c1609bbb..5977313ac4 100644
--- a/awx/ui/client/src/job-templates/add/job-templates-add.controller.js
+++ b/awx/ui/client/src/job-templates/add/job-templates-add.controller.js
@@ -197,12 +197,20 @@
});
});
+ function sync_playbook_select2() {
+ CreateSelect2({
+ element:'#playbook-select',
+ multiple: false
+ });
+ }
+
// Update playbook select whenever project value changes
selectPlaybook = function (oldValue, newValue) {
var url;
if($scope.job_type.value === 'scan' && $scope.project_name === "Default"){
$scope.playbook_options = ['Default'];
$scope.playbook = 'Default';
+ sync_playbook_select2();
Wait('stop');
}
else if (oldValue !== newValue) {
@@ -217,6 +225,7 @@
opts.push(data[i]);
}
$scope.playbook_options = opts;
+ sync_playbook_select2();
Wait('stop');
})
.error(function (data, status) {
@@ -227,32 +236,37 @@
}
};
- $scope.jobTypeChange = function(){
- if($scope.job_type){
- if($scope.job_type.value === 'scan'){
- // If the job_type is 'scan' then we don't want the user to be
- // able to prompt for job type or inventory
- $scope.ask_job_type_on_launch = false;
- $scope.ask_inventory_on_launch = false;
- $scope.toggleScanInfo();
- }
- else if($scope.project_name === "Default"){
- $scope.project_name = null;
- $scope.playbook_options = [];
- // $scope.playbook = 'null';
- $scope.job_templates_form.playbook.$setPristine();
- }
- }
+ let last_non_scan_project_name = null;
+ let last_non_scan_playbook = "";
+ let last_non_scan_playbook_options = [];
+ $scope.jobTypeChange = function() {
+ if ($scope.job_type) {
+ if ($scope.job_type.value === 'scan') {
+ if ($scope.project_name !== "Default") {
+ last_non_scan_project_name = $scope.project_name;
+ last_non_scan_playbook = $scope.playbook;
+ last_non_scan_playbook_options = $scope.playbook_options;
+ }
+ // If the job_type is 'scan' then we don't want the user to be
+ // able to prompt for job type or inventory
+ $scope.ask_job_type_on_launch = false;
+ $scope.ask_inventory_on_launch = false;
+ $scope.resetProjectToDefault();
+ }
+ else if ($scope.project_name === "Default") {
+ $scope.project_name = last_non_scan_project_name;
+ $scope.playbook_options = last_non_scan_playbook_options;
+ $scope.playbook = last_non_scan_playbook;
+ $scope.job_templates_form.playbook.$setPristine();
+ }
+ }
+ sync_playbook_select2();
};
- $scope.toggleScanInfo = function() {
+ $scope.resetProjectToDefault = function() {
$scope.project_name = 'Default';
- if($scope.project === null){
- selectPlaybook();
- }
- else {
- $scope.project = null;
- }
+ $scope.project = null;
+ selectPlaybook('force_load');
};
// Detect and alert user to potential SCM status issues
diff --git a/awx/ui/client/src/job-templates/edit/job-templates-edit.controller.js b/awx/ui/client/src/job-templates/edit/job-templates-edit.controller.js
index bb05453c5d..89c9425a2e 100644
--- a/awx/ui/client/src/job-templates/edit/job-templates-edit.controller.js
+++ b/awx/ui/client/src/job-templates/edit/job-templates-edit.controller.js
@@ -76,6 +76,13 @@ export default
$scope.playbook = null;
generator.reset();
+ function sync_playbook_select2() {
+ CreateSelect2({
+ element:'#playbook-select',
+ multiple: false
+ });
+ }
+
getPlaybooks = function (project) {
var url;
if ($scope.playbook) {
@@ -85,6 +92,7 @@ export default
if($scope.job_type.value === 'scan' && $scope.project_name === "Default"){
$scope.playbook_options = ['Default'];
$scope.playbook = 'Default';
+ sync_playbook_select2();
Wait('stop');
}
else if (!Empty(project)) {
@@ -93,14 +101,14 @@ export default
Rest.setUrl(url);
Rest.get()
.success(function (data) {
- var i;
$scope.playbook_options = [];
- for (i = 0; i < data.length; i++) {
+ for (var i = 0; i < data.length; i++) {
$scope.playbook_options.push(data[i]);
if (data[i] === $scope.playbook) {
$scope.job_templates_form.playbook.$setValidity('required', true);
}
}
+ sync_playbook_select2();
if ($scope.playbook) {
$scope.$emit('jobTemplateLoadFinished');
} else {
@@ -122,23 +130,31 @@ export default
}
};
- $scope.jobTypeChange = function(){
- if($scope.job_type){
- if($scope.job_type.value === 'scan'){
- // If the job_type is 'scan' then we don't want the user to be
- // able to prompt for job type or inventory
- $scope.ask_job_type_on_launch = false;
- $scope.ask_inventory_on_launch = false;
- $scope.toggleScanInfo();
- }
- else if($scope.project_name === "Default"){
- $scope.project_name = null;
- $scope.playbook_options = [];
- // $scope.playbook = 'null';
- $scope.job_templates_form.playbook.$setPristine();
- }
-
- }
+ let last_non_scan_project_name = null;
+ let last_non_scan_playbook = "";
+ let last_non_scan_playbook_options = [];
+ $scope.jobTypeChange = function() {
+ if ($scope.job_type) {
+ if ($scope.job_type.value === 'scan') {
+ if ($scope.project_name !== "Default") {
+ last_non_scan_project_name = $scope.project_name;
+ last_non_scan_playbook = $scope.playbook;
+ last_non_scan_playbook_options = $scope.playbook_options;
+ }
+ // If the job_type is 'scan' then we don't want the user to be
+ // able to prompt for job type or inventory
+ $scope.ask_job_type_on_launch = false;
+ $scope.ask_inventory_on_launch = false;
+ $scope.resetProjectToDefault();
+ }
+ else if ($scope.project_name === "Default") {
+ $scope.project_name = last_non_scan_project_name;
+ $scope.playbook_options = last_non_scan_playbook_options;
+ $scope.playbook = last_non_scan_playbook;
+ $scope.job_templates_form.playbook.$setPristine();
+ }
+ }
+ sync_playbook_select2();
};
$scope.toggleNotification = function(event, notifier_id, column) {
@@ -159,14 +175,10 @@ export default
});
};
- $scope.toggleScanInfo = function() {
+ $scope.resetProjectToDefault = function() {
$scope.project_name = 'Default';
- if($scope.project === null){
- getPlaybooks();
- }
- else {
- $scope.project = null;
- }
+ $scope.project = null;
+ getPlaybooks();
};
// Detect and alert user to potential SCM status issues
diff --git a/awx/ui/client/src/shared/form-generator.js b/awx/ui/client/src/shared/form-generator.js
index c75bfd7afb..9a3ca9d395 100644
--- a/awx/ui/client/src/shared/form-generator.js
+++ b/awx/ui/client/src/shared/form-generator.js
@@ -714,13 +714,10 @@ angular.module('FormGenerator', [GeneratorHelpers.name, 'Utilities', listGenerat
function label() {
var html = '';
if (field.label || field.labelBind) {
- html += "\n";
}
return html;
diff --git a/awx/ui/client/src/standard-out/log/standard-out-log.controller.js b/awx/ui/client/src/standard-out/log/standard-out-log.controller.js
index 62fc00aee6..8973a515aa 100644
--- a/awx/ui/client/src/standard-out/log/standard-out-log.controller.js
+++ b/awx/ui/client/src/standard-out/log/standard-out-log.controller.js
@@ -8,7 +8,6 @@ export default ['$log', '$rootScope', '$scope', '$state', '$stateParams', 'Proce
function ($log, $rootScope, $scope, $state, $stateParams, ProcessErrors, Rest, Wait) {
var api_complete = false,
- stdout_url,
current_range,
loaded_sections = [],
event_queue = 0,