diff --git a/awx/ui/client/src/configuration/configuration.controller.js b/awx/ui/client/src/configuration/configuration.controller.js index a915601cba..51bc404fdd 100644 --- a/awx/ui/client/src/configuration/configuration.controller.js +++ b/awx/ui/client/src/configuration/configuration.controller.js @@ -86,7 +86,7 @@ export default [ // does a string.split(', ') w/ an extra space // behind the comma. if(key === "AD_HOC_COMMANDS"){ - $scope[key] = data[key].toString(); + $scope[key] = data[key]; } else if (key === "AUTH_LDAP_USER_SEARCH" || key === "AUTH_LDAP_GROUP_SEARCH") { $scope[key] = JSON.stringify(data[key]); } else { @@ -382,7 +382,7 @@ export default [ } else if($scope[key][0] && $scope[key][0].value !== undefined) { if(multiselectDropdowns.indexOf(key) !== -1) { // Handle AD_HOC_COMMANDS - payload[key] = ConfigurationUtils.listToArray(_.map($scope[key], 'value').join(',')); + payload[key] = $scope[`${key}_values`]; } else { payload[key] = _.map($scope[key], 'value').join(','); } diff --git a/awx/ui/client/src/configuration/jobs-form/configuration-jobs.controller.js b/awx/ui/client/src/configuration/jobs-form/configuration-jobs.controller.js index b70e3d71f9..df6f8f28af 100644 --- a/awx/ui/client/src/configuration/jobs-form/configuration-jobs.controller.js +++ b/awx/ui/client/src/configuration/jobs-form/configuration-jobs.controller.js @@ -79,9 +79,6 @@ export default [ noPanel: true }); - // Flag to avoid re-rendering and breaking Select2 dropdowns on tab switching - var dropdownRendered = false; - function initializeCodeInput () { let name = 'AWX_TASK_ENV'; @@ -95,35 +92,33 @@ export default [ $scope.parseTypeChange('parseType', name); } - function populateAdhocCommand(flag){ - $scope.$parent.AD_HOC_COMMANDS = $scope.$parent.AD_HOC_COMMANDS.toString(); - var ad_hoc_commands = $scope.$parent.AD_HOC_COMMANDS.split(','); - $scope.$parent.AD_HOC_COMMANDS = _.map(ad_hoc_commands, function(item){ - let option = _.find($scope.$parent.AD_HOC_COMMANDS_options, { value: item }); - if(!option){ - option = { - name: item, - value: item, - label: item - }; - $scope.$parent.AD_HOC_COMMANDS_options.push(option); - } - return option; + function loadAdHocCommands () { + $scope.$parent.AD_HOC_COMMANDS_values = $scope.$parent.AD_HOC_COMMANDS.map(value => value); + $scope.$parent.AD_HOC_COMMANDS = $scope.$parent.AD_HOC_COMMANDS.map(value => ({ + value, + name: value, + label: value + })); + + $scope.$parent.AD_HOC_COMMANDS_options = $scope.$parent.AD_HOC_COMMANDS.map(tag => tag); + + CreateSelect2({ + element: '#configuration_jobs_template_AD_HOC_COMMANDS', + multiple: true, + addNew: true, + placeholder: i18n._('Select commands') }); + } - if(flag !== undefined){ - dropdownRendered = flag; - } + function revertAdHocCommands (defaults) { + $scope.$parent.AD_HOC_COMMANDS = defaults.map(value => ({ + value, + name: value, + label: value + })); - if(!dropdownRendered) { - dropdownRendered = true; - CreateSelect2({ - element: '#configuration_jobs_template_AD_HOC_COMMANDS', - multiple: true, - addNew: true, - placeholder: i18n._('Select commands') - }); - } + $scope.$parent.AD_HOC_COMMANDS_options = $scope.$parent.AD_HOC_COMMANDS.map(tag => tag); + $scope.$parent.AD_HOC_COMMANDS_values = $scope.$parent.AD_HOC_COMMANDS.map(tag => tag.value); } // Fix for bug where adding selected opts causes form to be $dirty and triggering modal @@ -132,10 +127,26 @@ export default [ $scope.$parent.configuration_jobs_template_form.$setPristine(); }, 1000); - $scope.$on('AD_HOC_COMMANDS_populated', function(e, data, flag) { - populateAdhocCommand(flag); + + // Managing the state of select2's tags since the behavior is unpredictable otherwise. + let commandsElement = $('#configuration_jobs_template_AD_HOC_COMMANDS'); + + commandsElement.on('select2:select', event => { + let command = event.params.data.text; + let commands = $scope.$parent.AD_HOC_COMMANDS_values; + + commands.push(command); }); + commandsElement.on('select2:unselect', event => { + let command = event.params.data.text; + let commands = $scope.$parent.AD_HOC_COMMANDS_values; + + $scope.$parent.AD_HOC_COMMANDS_values = commands.filter(value => value !== command); + }); + + $scope.$on('AD_HOC_COMMANDS_reverted', (e, defaults) => revertAdHocCommands(defaults)); + /* * Controllers for each tab are initialized when configuration is opened. A listener * on the URL itself is necessary to determine which tab is active. If a non-active @@ -174,7 +185,7 @@ export default [ codeInputInitialized = true; } - populateAdhocCommand(false); + loadAdHocCommands(); }); } ];