diff --git a/client/app/services/custom-button/custom-button.component.js b/client/app/services/custom-button/custom-button.component.js index bb51eea64..5ca55c84e 100644 --- a/client/app/services/custom-button/custom-button.component.js +++ b/client/app/services/custom-button/custom-button.component.js @@ -27,10 +27,14 @@ function CustomButtonController ($state, EventNotifications, CollectionsApi, RBA function invokeCustomAction (button) { if (button.resource_action && button.resource_action.dialog_id) { - $state.go('services.custom_button_details', { + const options = { button: button, serviceId: vm.serviceId - }) + } + if (vm.vmId) { + options.vmId = vm.vmId + } + $state.go('services.custom_button_details', options) } else if (vm.vmId) { const data = {action: button.name} CollectionsApi.post('vms', vm.vmId, {}, data) diff --git a/client/app/states/services/custom_button_details/custom_button_details.state.js b/client/app/states/services/custom_button_details/custom_button_details.state.js index bec60a794..263161e77 100644 --- a/client/app/states/services/custom_button_details/custom_button_details.state.js +++ b/client/app/states/services/custom_button_details/custom_button_details.state.js @@ -12,13 +12,16 @@ function getStates () { templateUrl, controller: StateController, controllerAs: 'vm', - title: __('Service Custom Button Details'), + title: __('Custom Button Details'), params: { button: { value: null }, serviceId: { value: null + }, + vmId: { + value: null } }, resolve: { @@ -51,6 +54,7 @@ function StateController ($state, $stateParams, dialog, service, CollectionsApi, vm.dialogs = dialog.content vm.service = service vm.serviceId = $stateParams.serviceId + vm.vmId = $stateParams.vmId || null vm.button = $stateParams.button vm.submitCustomButton = submitCustomButton vm.submitButtonEnabled = false @@ -69,19 +73,31 @@ function StateController ($state, $stateParams, dialog, service, CollectionsApi, } function submitCustomButton () { - const buttonClass = vm.button.applies_to_class.toLowerCase() - const collection = buttonClass === 'servicetemplate' ? 'services' : buttonClass === 'vm' ? 'vms' : null + let collection = 'services' + let itemId = vm.serviceId + + if (vm.vmId) { + collection = 'vms' + itemId = vm.vmId + } CollectionsApi.post( collection, - $stateParams.serviceId, + itemId, {}, angular.toJson({action: $stateParams.button.name, resource: vm.dialogData}) ).then(submitSuccess, submitFailure) function submitSuccess (result) { EventNotifications.success(result.message) - $state.go('services.details', {serviceId: $stateParams.serviceId}) + let stateName = 'services.details' + let parameters = {serviceId: vm.serviceId} + + if (vm.vmId) { + stateName = 'services.resource-details' + parameters = {serviceId: vm.serviceId, vmId: vm.vmId} + } + $state.go(stateName, parameters) } function submitFailure (result) { diff --git a/client/app/states/services/custom_button_details/custom_button_details.state.spec.js b/client/app/states/services/custom_button_details/custom_button_details.state.spec.js index 70498305a..f9bc95e91 100644 --- a/client/app/states/services/custom_button_details/custom_button_details.state.spec.js +++ b/client/app/states/services/custom_button_details/custom_button_details.state.spec.js @@ -122,4 +122,80 @@ describe('services.custom_button_details', function() { }); }); }); + + describe('Custom button actions for a VM', () => { + let collectionsApiSpy; + let controller; + let notificationsErrorSpy; + let notificationsSuccessSpy; + let refreshSingleFieldSpy; + const dialogFields = [{ + name: 'dialogField1', + default_value: '1' + }, { + name: 'dialogField2', + default_value: '2' + }]; + const dialog = { + dialog_tabs: [{ + dialog_groups: [{ + dialog_fields: dialogFields + }] + }] + }; + const button = { + name: 'buttonName', + applies_to_id: 456, + applies_to_class: 'vm' + }; + + beforeEach(function () { + bard.inject('$controller', '$log', '$state', '$stateParams', '$rootScope', 'CollectionsApi', 'Notifications', 'DialogFieldRefresh'); + + refreshSingleFieldSpy = sinon.stub(DialogFieldRefresh, 'refreshDialogField'); + + controller = $controller($state.get('services.custom_button_details').controller, { + dialog: { content: [dialog], id: 213 }, + service: {}, + $stateParams: { + dialogId: 213, + button: button, + serviceId: 123, + vmId: 456, + serviceTemplateCatalogId: 321 + } + }); + const dialogData = { + "validations": { + "isValid": true + }, + "data": { + "dialogField1": 1, + "dialogField2": 2 + } + }; + controller.setDialogData(dialogData); + }); + it('POSTs to the vms API', () => { + const successResponse = { + message: 'Great Success!' + }; + + collectionsApiSpy = sinon.stub(CollectionsApi, 'post').returns(Promise.resolve(successResponse)); + notificationsSuccessSpy = sinon.spy(Notifications, 'success'); + + controller.submitCustomButton(); + expect(collectionsApiSpy).to.have.been.calledWith( + 'vms', + 456, + {}, + '{"action":"buttonName","resource":{"dialogField1":1,"dialogField2":2}}' + ); + }); + it('goes to the resource details', function(done) { + controller.submitCustomButton(); + done(); + expect($state.is('services.resource-details')).to.be.true; + }); + }) });