diff --git a/awx/ui/client/lib/components/tabs/tab.directive.js b/awx/ui/client/lib/components/tabs/tab.directive.js index 4c7eea3785..85dc5f4d2c 100644 --- a/awx/ui/client/lib/components/tabs/tab.directive.js +++ b/awx/ui/client/lib/components/tabs/tab.directive.js @@ -20,16 +20,18 @@ function AtTabController ($state) { group.register(scope); }; - vm.go = () => { + vm.handleClick = () => { if (scope.state._disabled || scope.state._active) { return; } - if (scope.state._go) { $state.go(scope.state._go, scope.state._params, { reload: true }); - } else { - group.clearActive(); - scope.state._active = true; + return; + } + group.clearActive(); + scope.state._active = true; + if (scope.state._onClickActivate) { + scope.state._onClickActivate(); } }; } diff --git a/awx/ui/client/lib/components/tabs/tab.partial.html b/awx/ui/client/lib/components/tabs/tab.partial.html index eb007feb01..5b77e02841 100644 --- a/awx/ui/client/lib/components/tabs/tab.partial.html +++ b/awx/ui/client/lib/components/tabs/tab.partial.html @@ -2,6 +2,6 @@ ng-attr-disabled="{{ state._disabled || undefined }}" ng-class="{ 'at-Tab--active': state._active, 'at-Tab--disabled': state._disabled }" ng-hide="{{ state._hide }}" - ng-click="state._go && vm.go();"> + ng-click="vm.handleClick();"> diff --git a/awx/ui/client/src/templates/prompt/prompt.controller.js b/awx/ui/client/src/templates/prompt/prompt.controller.js index 5aeff6e63b..cf92af6258 100644 --- a/awx/ui/client/src/templates/prompt/prompt.controller.js +++ b/awx/ui/client/src/templates/prompt/prompt.controller.js @@ -189,6 +189,36 @@ export default [ 'ProcessErrors', 'CredentialTypeModel', 'TemplatesStrings', '$f modal.show($filter('sanitize')(vm.promptDataClone.templateName)); vm.promptData.triggerModalOpen = false; + vm._savedPromptData = { + 1: _.cloneDeep(vm.promptDataClone) + }; + Object.keys(vm.steps).forEach(step => { + if (!vm.steps[step].tab) { + return; + } + vm.steps[step].tab._onClickActivate = () => { + if (vm._savedPromptData[vm.steps[step].tab.order]) { + vm.promptDataClone = vm._savedPromptData[vm.steps[step].tab.order]; + } + Object.keys(vm.steps).forEach(tabStep => { + if (!vm.steps[tabStep].tab) { + return; + } + if (vm.steps[tabStep].tab.order < vm.steps[step].tab.order) { + vm.steps[tabStep].tab._disabled = false; + vm.steps[tabStep].tab._active = false; + } else if (vm.steps[tabStep].tab.order === vm.steps[step].tab.order) { + vm.steps[tabStep].tab._disabled = false; + vm.steps[tabStep].tab._active = true; + } else { + vm.steps[tabStep].tab._disabled = true; + vm.steps[tabStep].tab._active = false; + } + }); + scope.$broadcast('promptTabChange', { step }); + }; + }); + modal.onClose = () => { scope.$emit('launchModalOpen', false); }; @@ -214,19 +244,39 @@ export default [ 'ProcessErrors', 'CredentialTypeModel', 'TemplatesStrings', '$f return; } } + + let nextStep; Object.keys(vm.steps).forEach(step => { - if(vm.steps[step].tab) { - if(vm.steps[step].tab.order === currentTab.order) { - vm.steps[step].tab._active = false; - vm.steps[step].tab._disabled = true; - } else if(vm.steps[step].tab.order === currentTab.order + 1) { - activeTab = currentTab; - vm.steps[step].tab._active = true; - vm.steps[step].tab._disabled = false; - scope.$broadcast('promptTabChange', { step }); - } + if (!vm.steps[step].tab) { + return; + } + if (vm.steps[step].tab.order === currentTab.order + 1) { + nextStep = step; } }); + + if (!nextStep) { + return; + } + + // Save the current promptData state in case we need to revert + vm._savedPromptData[currentTab.order] = _.cloneDeep(vm.promptDataClone); + Object.keys(vm.steps).forEach(tabStep => { + if (!vm.steps[tabStep].tab) { + return; + } + if (vm.steps[tabStep].tab.order < vm.steps[nextStep].tab.order) { + vm.steps[tabStep].tab._disabled = false; + vm.steps[tabStep].tab._active = false; + } else if (vm.steps[tabStep].tab.order === vm.steps[nextStep].tab.order) { + vm.steps[tabStep].tab._disabled = false; + vm.steps[tabStep].tab._active = true; + } else { + vm.steps[tabStep].tab._disabled = true; + vm.steps[tabStep].tab._active = false; + } + }); + scope.$broadcast('promptTabChange', { step: nextStep }); }; vm.keypress = (event) => { diff --git a/awx/ui/client/src/templates/prompt/prompt.partial.html b/awx/ui/client/src/templates/prompt/prompt.partial.html index 6bd2a123af..217ddddf94 100644 --- a/awx/ui/client/src/templates/prompt/prompt.partial.html +++ b/awx/ui/client/src/templates/prompt/prompt.partial.html @@ -22,7 +22,7 @@ read-only-prompts="vm.readOnlyPrompts"> -
+