From d743faf33e31b612196bcc7fdbc9bf23e07a57b2 Mon Sep 17 00:00:00 2001 From: Marliana Lara Date: Mon, 5 Feb 2018 15:48:38 -0500 Subject: [PATCH] Fix UI bugs related to instance groups views * Fix bug where capacity_adjustment sets to "1.00" when instance is toggled * Hookup websockets for instance group jobs and instance jobs * Add Wait spinner to Capacity_Adjuster, Instance association modal, and Instance group delete * Add updateDataset event listener to update instance and instanceGroups list after smartSearch query --- .../capacity-adjuster.directive.js | 18 ++++++++-- .../instance-jobs/instance-jobs.controller.js | 19 +++++++++-- .../instances/instance-modal.controller.js | 9 +++-- .../instances/instances-list.partial.html | 4 +-- .../instances/instances.controller.js | 17 ++++++++-- .../jobs/jobs-list.partial.html | 7 ++-- .../instance-groups/jobs/jobs.controller.js | 22 +++++++++--- .../list/instance-groups-list.controller.js | 34 ++++++++++++++----- awx/ui/client/src/instance-groups/main.js | 14 ++++++++ 9 files changed, 112 insertions(+), 32 deletions(-) diff --git a/awx/ui/client/src/instance-groups/capacity-adjuster/capacity-adjuster.directive.js b/awx/ui/client/src/instance-groups/capacity-adjuster/capacity-adjuster.directive.js index cc7d634b88..5600502578 100644 --- a/awx/ui/client/src/instance-groups/capacity-adjuster/capacity-adjuster.directive.js +++ b/awx/ui/client/src/instance-groups/capacity-adjuster/capacity-adjuster.directive.js @@ -1,4 +1,4 @@ -function CapacityAdjuster (templateUrl) { +function CapacityAdjuster (templateUrl, ProcessErrors, Wait) { return { scope: { state: '=' @@ -23,6 +23,7 @@ function CapacityAdjuster (templateUrl) { const vm = this || {}; vm.slide = (state) => { + Wait('start'); const data = { "capacity_adjustment": `${state.capacity_adjustment}` }; @@ -31,7 +32,16 @@ function CapacityAdjuster (templateUrl) { url: state.url, data }; - $http(req); + $http(req) + .catch(({data, status}) => { + ProcessErrors(data, status, null, { + hdr: 'Error!', + msg: 'Call failed. Return status: ' + status + }); + }) + .finally(() => { + Wait('stop'); + }); }; }, controllerAs: 'vm' @@ -39,7 +49,9 @@ function CapacityAdjuster (templateUrl) { } CapacityAdjuster.$inject = [ - 'templateUrl' + 'templateUrl', + 'ProcessErrors', + 'Wait' ]; export default CapacityAdjuster; \ No newline at end of file diff --git a/awx/ui/client/src/instance-groups/instances/instance-jobs/instance-jobs.controller.js b/awx/ui/client/src/instance-groups/instances/instance-jobs/instance-jobs.controller.js index a5a050a8c4..492c256e1d 100644 --- a/awx/ui/client/src/instance-groups/instances/instance-jobs/instance-jobs.controller.js +++ b/awx/ui/client/src/instance-groups/instances/instance-jobs/instance-jobs.controller.js @@ -1,7 +1,8 @@ -function InstanceJobsController ($scope, $filter, $state, model, strings, jobStrings) { +function InstanceJobsController ($scope, $filter, $state, model, strings, jobStrings, Instance) { const vm = this || {}; - const { instance } = model; + let { instance } = model; + const instance_id = instance.get('id'); init(); @@ -62,6 +63,17 @@ function InstanceJobsController ($scope, $filter, $state, model, strings, jobStr } }; + $scope.$on('ws-jobs', () => { + new Instance(['get', 'options'], [instance_id, instance_id]) + .then((data) => { + return data.extend('get', 'jobs', {params: {page_size: "10", order_by: "-finished"}}); + }) + .then((data) => { + instance = data; + init(); + }); + }); + } InstanceJobsController.$inject = [ @@ -70,7 +82,8 @@ InstanceJobsController.$inject = [ '$state', 'resolvedModels', 'InstanceGroupsStrings', - 'JobStrings' + 'JobStrings', + 'InstanceModel' ]; export default InstanceJobsController; \ No newline at end of file diff --git a/awx/ui/client/src/instance-groups/instances/instance-modal.controller.js b/awx/ui/client/src/instance-groups/instances/instance-modal.controller.js index 09d80f47f7..4d492c65b8 100644 --- a/awx/ui/client/src/instance-groups/instances/instance-modal.controller.js +++ b/awx/ui/client/src/instance-groups/instances/instance-modal.controller.js @@ -1,4 +1,4 @@ -function InstanceModalController ($scope, $state, models, strings, ProcessErrors) { +function InstanceModalController ($scope, $state, models, strings, ProcessErrors, Wait) { const { instance, instanceGroup } = models; const vm = this || {}; @@ -39,6 +39,7 @@ function InstanceModalController ($scope, $state, models, strings, ProcessErrors }, true); vm.submit = () => { + Wait('start'); const associate = vm.selectedRows .map(instance => ({id: instance.id})); const disassociate = vm.deselectedRows @@ -60,6 +61,9 @@ function InstanceModalController ($scope, $state, models, strings, ProcessErrors hdr: 'Error!', msg: 'Call failed. Return status: ' + status }); + }) + .finally(() => { + Wait('stop'); }); }; @@ -73,7 +77,8 @@ InstanceModalController.$inject = [ '$state', 'resolvedModels', 'InstanceGroupsStrings', - 'ProcessErrors' + 'ProcessErrors', + 'Wait' ]; export default InstanceModalController; diff --git a/awx/ui/client/src/instance-groups/instances/instances-list.partial.html b/awx/ui/client/src/instance-groups/instances/instances-list.partial.html index 93bcb005b3..a75448dc22 100644 --- a/awx/ui/client/src/instance-groups/instances/instances-list.partial.html +++ b/awx/ui/client/src/instance-groups/instances/instances-list.partial.html @@ -14,10 +14,10 @@ diff --git a/awx/ui/client/src/instance-groups/instances/instances.controller.js b/awx/ui/client/src/instance-groups/instances/instances.controller.js index 5fc70fee6a..26d6ef3e71 100644 --- a/awx/ui/client/src/instance-groups/instances/instances.controller.js +++ b/awx/ui/client/src/instance-groups/instances/instances.controller.js @@ -10,15 +10,25 @@ function InstancesController ($scope, $state, $http, models, Instance, strings, function init() { $scope.list = { + name: 'instances', iterator: 'instance', - name: 'instances' + basePath: `/api/v2/instance_groups/${vm.instance_group_id}/instances/` }; + $scope.collection = { - basepath: 'instances', - iterator: 'instance' + iterator: 'instance', + basePath: `/api/v2/instance_groups/${vm.instance_group_id}/instances/` }; + $scope[`${$scope.list.iterator}_dataset`] = Dataset.data; $scope[$scope.list.name] = $scope[`${$scope.list.iterator}_dataset`].results; + $scope.instances = vm.instances; + + $scope.$on('updateDataset', function(e, dataset) { + $scope[`${$scope.list.iterator}_dataset`] = dataset; + $scope[$scope.list.name] = dataset.results; + vm.instances = dataset.results; + }); } vm.tab = { @@ -42,6 +52,7 @@ function InstancesController ($scope, $state, $http, models, Instance, strings, instance.enabled = !instance.enabled; const data = { + "capacity_adjustment": instance.capacity_adjustment, "enabled": instance.enabled }; diff --git a/awx/ui/client/src/instance-groups/jobs/jobs-list.partial.html b/awx/ui/client/src/instance-groups/jobs/jobs-list.partial.html index d0d8dd236b..8fdea7b2da 100644 --- a/awx/ui/client/src/instance-groups/jobs/jobs-list.partial.html +++ b/awx/ui/client/src/instance-groups/jobs/jobs-list.partial.html @@ -27,11 +27,8 @@ ng-class="{'at-Row--active': (job.id === vm.activeId)}" job-id="{{ job.id }}">
- - - - - + +
diff --git a/awx/ui/client/src/instance-groups/jobs/jobs.controller.js b/awx/ui/client/src/instance-groups/jobs/jobs.controller.js index b62d3e502c..0b54a962b8 100644 --- a/awx/ui/client/src/instance-groups/jobs/jobs.controller.js +++ b/awx/ui/client/src/instance-groups/jobs/jobs.controller.js @@ -1,12 +1,12 @@ -function InstanceGroupJobsController ($scope, $filter, $state, model, strings, jobStrings) { +function InstanceGroupJobsController ($scope, $filter, $state, model, strings, jobStrings, InstanceGroup) { const vm = this || {}; - const { instanceGroup } = model; + let { instanceGroup } = model; + const instance_group_id = instanceGroup.get('id'); init(); function init(){ - const instance_group_id = instanceGroup.get('id'); vm.strings = strings; vm.jobStrings = jobStrings; vm.queryset = { page_size: '10', order_by: '-finished', instance_group_id: instance_group_id }; @@ -72,8 +72,19 @@ function InstanceGroupJobsController ($scope, $filter, $state, model, strings, j goTojobResults('workflowResults'); break; } - }; + + $scope.$on('ws-jobs', () => { + new InstanceGroup(['get', 'options'], [instance_group_id, instance_group_id]) + .then((instance_group) => { + return instance_group.extend('get', 'jobs', {params: {page_size: "10", order_by: "-finished"}}); + }) + .then((instance_group) => { + instanceGroup = instance_group; + init(); + }); + }); + } InstanceGroupJobsController.$inject = [ @@ -82,7 +93,8 @@ InstanceGroupJobsController.$inject = [ '$state', 'resolvedModels', 'InstanceGroupsStrings', - 'JobStrings' + 'JobStrings', + 'InstanceGroupModel' ]; export default InstanceGroupJobsController; \ No newline at end of file diff --git a/awx/ui/client/src/instance-groups/list/instance-groups-list.controller.js b/awx/ui/client/src/instance-groups/list/instance-groups-list.controller.js index 9a57a23a23..1660b0b0da 100644 --- a/awx/ui/client/src/instance-groups/list/instance-groups-list.controller.js +++ b/awx/ui/client/src/instance-groups/list/instance-groups-list.controller.js @@ -1,27 +1,40 @@ -export default ['$scope', 'InstanceGroupList', 'resolvedModels', 'Dataset', '$state', 'ComponentsStrings', 'ProcessErrors', - function($scope, InstanceGroupList, resolvedModels, Dataset, $state, strings, ProcessErrors) { - const list = InstanceGroupList; +export default ['$scope', 'resolvedModels', 'Dataset', '$state', 'ComponentsStrings', 'ProcessErrors', 'Wait', + function($scope, resolvedModels, Dataset, $state, strings, ProcessErrors, Wait) { const vm = this; const { instanceGroup } = resolvedModels; vm.strings = strings; + $scope.selection = {}; init(); function init(){ - $scope.list = list; - $scope[`${list.iterator}_dataset`] = Dataset.data; - $scope[list.name] = $scope[`${list.iterator}_dataset`].results; - $scope.instanceGroupCount = Dataset.data.count; - } + $scope.list = { + iterator: 'instance_group', + name: 'instance_groups' + }; - $scope.selection = {}; + $scope.collection = { + basePath: 'instance_groups', + iterator: 'instance_group' + }; + + $scope[`${$scope.list.iterator}_dataset`] = Dataset.data; + $scope[$scope.list.name] = $scope[`${$scope.list.iterator}_dataset`].results; + $scope.instanceGroupCount = Dataset.data.count; + + $scope.$on('updateDataset', function(e, dataset) { + $scope[`${$scope.list.iterator}_dataset`] = dataset; + $scope[$scope.list.name] = dataset.results; + }); + } $scope.$watch('$state.params.instance_group_id', () => { vm.activeId = parseInt($state.params.instance_group_id); }); vm.delete = () => { + Wait('start'); let deletables = $scope.selection; deletables = Object.keys(deletables).filter((n) => deletables[n]); @@ -33,6 +46,9 @@ export default ['$scope', 'InstanceGroupList', 'resolvedModels', 'Dataset', '$st hdr: 'Error!', msg: 'Call failed. Return status: ' + status }); + }) + .finally(() => { + Wait('stop'); }); }); }; diff --git a/awx/ui/client/src/instance-groups/main.js b/awx/ui/client/src/instance-groups/main.js index 1578656bde..f241df97cb 100644 --- a/awx/ui/client/src/instance-groups/main.js +++ b/awx/ui/client/src/instance-groups/main.js @@ -278,6 +278,13 @@ function InstanceGroupsRun ($stateExtender, strings, ComponentsStrings) { dynamic: true }, }, + data: { + socket: { + "groups": { + "jobs": ["status_changed"], + } + } + }, resolvedModels: InstanceGroupsResolve }); @@ -297,6 +304,13 @@ function InstanceGroupsRun ($stateExtender, strings, ComponentsStrings) { dynamic: true } }, + data: { + socket: { + "groups": { + "jobs": ["status_changed"], + } + } + }, views: { 'jobs@instanceGroups': { templateUrl: JobsTemplate,