diff --git a/awx/ui/client/src/helpers/PaginationHelpers.js b/awx/ui/client/src/helpers/PaginationHelpers.js index 652e17c7f2..d2019af8fc 100644 --- a/awx/ui/client/src/helpers/PaginationHelpers.js +++ b/awx/ui/client/src/helpers/PaginationHelpers.js @@ -147,6 +147,7 @@ export default new_url += (scope[iterator + 'SearchParams']) ? '&' + scope[iterator + 'SearchParams'] + '&page_size=' + scope[iterator + '_page_size'] : '&page_size=' + scope[iterator + 'PageSize']; Wait('start'); + scope.getNewPage = true; Refresh({ scope: scope, set: set, iterator: iterator, url: new_url }); }; diff --git a/awx/ui/client/src/helpers/refresh.js b/awx/ui/client/src/helpers/refresh.js index 23a1f905e5..0a15cf1b71 100644 --- a/awx/ui/client/src/helpers/refresh.js +++ b/awx/ui/client/src/helpers/refresh.js @@ -24,47 +24,67 @@ export default angular.module('RefreshHelper', ['RestServices', 'Utilities', 'PaginationHelpers']) - .factory('Refresh', ['ProcessErrors', 'Rest', 'Wait', 'Empty', 'PageRangeSetup', - function (ProcessErrors, Rest, Wait, Empty, PageRangeSetup) { - return function (params) { + .factory('Refresh', ['$location', 'ProcessErrors', 'Rest', 'Wait', 'Empty', 'PageRangeSetup', 'pagination', function ($location, ProcessErrors, Rest, Wait, Empty, PageRangeSetup, pagination) { + return function (params) { - var scope = params.scope, - set = params.set, - iterator = params.iterator, - url = params.url, - deferWaitStop = params.deferWaitStop; + var scope = params.scope, + set = params.set, + iterator = params.iterator, + deferWaitStop = params.deferWaitStop; - scope.current_url = url; - Rest.setUrl(url); - Rest.get() - .success(function (data) { - var i, modifier; - PageRangeSetup({ - scope: scope, - count: data.count, - next: data.next, - previous: data.previous, - iterator: iterator - }); - for (i = 1; i <= 3; i++) { - modifier = (i === 1) ? '' : i; - scope[iterator + 'HoldInput' + modifier] = false; - } - scope[set] = data.results; - scope[iterator + 'Loading'] = false; - scope[iterator + 'HidePaginator'] = false; - if (!deferWaitStop) { - Wait('stop'); - } - scope.$emit('PostRefresh', set); - }) - .error(function (data, status) { - scope[iterator + 'HoldInput'] = false; - ProcessErrors(scope, data, status, null, { - hdr: 'Error!', - msg: 'Failed to retrieve ' + set + '. GET returned status: ' + status - }); + var getPage = function(url) { + scope.current_url = url; + + Rest.setUrl(url); + Rest.get() + .success(function (data) { + var i, modifier; + PageRangeSetup({ + scope: scope, + count: data.count, + next: data.next, + previous: data.previous, + iterator: iterator }); - }; + for (i = 1; i <= 3; i++) { + modifier = (i === 1) ? '' : i; + scope[iterator + 'HoldInput' + modifier] = false; + } + scope[set] = data.results; + scope[iterator + 'Loading'] = false; + scope[iterator + 'HidePaginator'] = false; + if (!deferWaitStop) { + Wait('stop'); + } + scope.$emit('PostRefresh', set); + }) + .error(function (data, status) { + scope[iterator + 'HoldInput'] = false; + ProcessErrors(scope, data, status, null, { + hdr: 'Error!', + msg: 'Failed to retrieve ' + set + '. GET returned status: ' + status + }); + }); + }; + + // if you're editing an object, make sure you're on the right + // page to display the element you are editing + if ($location.$$url.split("/")[1] === params.set && $location.$$url.split("/")[2] && !scope.getNewPage) { + var id = $location.$$url.split("/")[2]; + var restUrl = params.url.split("?")[0]; + var pageSize = scope[iterator + '_page_size']; + pagination.getInitialPageForList(id, restUrl, pageSize) + .then(function (currentPage) { + scope[iterator + '_page'] = currentPage; + params.url = params.url + "&page=" + currentPage; + getPage(params.url); + + }); + } else { + getPage(params.url); } - ]); + }; + + + } +]); diff --git a/awx/ui/client/src/shared/main.js b/awx/ui/client/src/shared/main.js index 8996a1bca1..99f8019e21 100644 --- a/awx/ui/client/src/shared/main.js +++ b/awx/ui/client/src/shared/main.js @@ -5,6 +5,7 @@ *************************************************/ import listGenerator from './list-generator/main'; +import pagination from './pagination/main'; import title from './title.directive'; import lodashAsPromised from './lodash-as-promised'; import stringFilters from './string-filters/main'; @@ -14,6 +15,7 @@ import stateExtender from './stateExtender.provider'; export default angular.module('shared', [ listGenerator.name, + pagination.name, stringFilters.name, 'ui.router' ]) diff --git a/awx/ui/client/src/shared/pagination/main.js b/awx/ui/client/src/shared/pagination/main.js new file mode 100644 index 0000000000..088bb0e399 --- /dev/null +++ b/awx/ui/client/src/shared/pagination/main.js @@ -0,0 +1,11 @@ +/************************************************* + * Copyright (c) 2015 Ansible, Inc. + * + * All Rights Reserved + *************************************************/ + +import pagination from './pagination.service'; + +export default + angular.module('pagination', []) + .factory('pagination', pagination); diff --git a/awx/ui/client/src/shared/pagination/pagination.service.js b/awx/ui/client/src/shared/pagination/pagination.service.js new file mode 100644 index 0000000000..f18d7890e9 --- /dev/null +++ b/awx/ui/client/src/shared/pagination/pagination.service.js @@ -0,0 +1,26 @@ +/************************************************* + * Copyright (c) 2015 Ansible, Inc. + * + * All Rights Reserved + *************************************************/ + +export default ['$q', '$http', function($q, $http) { + return { + getInitialPageForList: function(id, url, pageSize) { + // get the name of the object + return $http.get(url + "?id=" + id) + .then(function (data) { + var name = data.data.results[0].name; + // get how many results are less than or equal to + // the name + return $http.get(url + "?name__lte=" + name) + .then(function (data) { + // divide by the page size to get what + // page the data should be on + var count = data.data.count; + return Math.ceil(count/pageSize); + }); + }); + } + }; +}];