Adds pagination to Users admin section.
Project: http://git-wip-us.apache.org/repos/asf/rave/repo Commit: http://git-wip-us.apache.org/repos/asf/rave/commit/b2278703 Tree: http://git-wip-us.apache.org/repos/asf/rave/tree/b2278703 Diff: http://git-wip-us.apache.org/repos/asf/rave/diff/b2278703 Branch: refs/heads/angular Commit: b2278703ca8cca616ebc7c24793e42bf389be487 Parents: 9d95b06 Author: Jmeas <[email protected]> Authored: Fri Aug 15 16:30:37 2014 -0400 Committer: Jmeas <[email protected]> Committed: Fri Aug 15 16:34:00 2014 -0400 ---------------------------------------------------------------------- rave-portal-ng/mock-api/core.js | 31 ++++- .../mock-api/database/import-data/users.js | 128 +++++++++++++++++++ rave-portal-ng/mock-api/modules/users/get.js | 52 +++++++- .../subapps/admin/users/controllers/users.js | 28 ++-- .../src/subapps/admin/users/routes.js | 8 +- .../subapps/admin/users/templates/users.html | 26 ++-- 6 files changed, 245 insertions(+), 28 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/rave/blob/b2278703/rave-portal-ng/mock-api/core.js ---------------------------------------------------------------------- diff --git a/rave-portal-ng/mock-api/core.js b/rave-portal-ng/mock-api/core.js index 59672fa..780c32d 100644 --- a/rave-portal-ng/mock-api/core.js +++ b/rave-portal-ng/mock-api/core.js @@ -54,6 +54,34 @@ define(function(require) { $httpBackend.whenJSONP(matchAllRegex).passThrough(); } + function parseQueryString(str) { + str = str.split('?')[1]; + if(typeof str !== 'string' || str.length === 0) { + return {}; + } + var s = str.split('&'); + var sLength = s.length; + var bit, query = {}, first, second; + for (var i = 0; i < sLength; i++) { + bit = s[i].split('='); + first = decodeURIComponent(bit[0]); + if(first.length === 0) { + continue; + } + second = decodeURIComponent(bit[1]); + if(typeof query[first] === 'undefined') { + query[first] = second; + } + else if(query[first] instanceof Array) { + query[first].push(second); + } + else { + query[first] = [query[first], second]; + } + } + return query; + } + function buildApiScope(method, url, data, headers) { function requestHasToken() { @@ -88,7 +116,8 @@ define(function(require) { return { requestHasToken: requestHasToken(), userIsAuthenticated: ((getCurrentUserFromToken() !== false) ? true : false), - currentUser: getCurrentUserFromToken() + currentUser: getCurrentUserFromToken(), + parseQueryString: parseQueryString }; } http://git-wip-us.apache.org/repos/asf/rave/blob/b2278703/rave-portal-ng/mock-api/database/import-data/users.js ---------------------------------------------------------------------- diff --git a/rave-portal-ng/mock-api/database/import-data/users.js b/rave-portal-ng/mock-api/database/import-data/users.js index 8a5bbbb..86b6620 100644 --- a/rave-portal-ng/mock-api/database/import-data/users.js +++ b/rave-portal-ng/mock-api/database/import-data/users.js @@ -98,5 +98,133 @@ define(function(require) { 'expired': false, 'authorities': ['ROLE_USER'] }, + { + 'username': 'john.doe', + 'password': 'john.doe', + 'email': '[email protected]', + 'openIdUrl': '', + 'firstName': 'John', + 'lastName': 'Doe', + 'nameSeenByOthers': 'John', + 'relationshipStatus': 'Single', + 'description': 'Rave test user.', + 'sessionToken': '', + 'locked': false, + 'enabled': true, + 'expired': false, + 'authorities': ['ROLE_USER'] + }, + { + 'username': 'four.col', + 'password': 'four.col', + 'email': '[email protected]', + 'openIdUrl': '', + 'firstName': 'Four', + 'lastName': 'Col', + 'nameSeenByOthers': 'Four', + 'relationshipStatus': 'Single', + 'description': 'Rave test user.', + 'sessionToken': '', + 'locked': false, + 'enabled': true, + 'expired': false, + 'authorities': ['ROLE_USER'] + }, + { + 'username': 'fourwn.col', + 'password': 'fourwn.col', + 'email': '[email protected]', + 'openIdUrl': '', + 'firstName': 'Fourwn', + 'lastName': 'Col', + 'nameSeenByOthers': 'Fourwn', + 'relationshipStatus': 'Single', + 'description': 'Rave test user.', + 'sessionToken': '', + 'locked': false, + 'enabled': true, + 'expired': false, + 'authorities': ['ROLE_USER'] + }, + { + 'username': 'threewn.col', + 'password': 'threewn.col', + 'email': '[email protected]', + 'openIdUrl': '', + 'firstName': 'Threewn', + 'lastName': 'Col', + 'nameSeenByOthers': 'Threewn', + 'relationshipStatus': 'Single', + 'description': 'Rave test user.', + 'sessionToken': '', + 'locked': false, + 'enabled': true, + 'expired': false, + 'authorities': ['ROLE_USER'] + }, + { + 'username': 'three.col', + 'password': 'three.col', + 'email': '[email protected]', + 'openIdUrl': '', + 'firstName': 'Three', + 'lastName': 'Col', + 'nameSeenByOthers': 'Three', + 'relationshipStatus': 'Single', + 'description': 'Rave test user.', + 'sessionToken': '', + 'locked': false, + 'enabled': true, + 'expired': false, + 'authorities': ['ROLE_USER'] + }, + { + 'username': 'twown.col', + 'password': 'twown.col', + 'email': '[email protected]', + 'openIdUrl': '', + 'firstName': 'Twown', + 'lastName': 'Col', + 'nameSeenByOthers': 'Twown', + 'relationshipStatus': 'Single', + 'description': 'Rave test user.', + 'sessionToken': '', + 'locked': false, + 'enabled': true, + 'expired': false, + 'authorities': ['ROLE_USER'] + }, + { + 'username': 'george.doe', + 'password': 'george.doe', + 'email': '[email protected]', + 'openIdUrl': '', + 'firstName': 'George', + 'lastName': 'Doe', + 'nameSeenByOthers': 'George', + 'relationshipStatus': 'Single', + 'description': 'Rave test user.', + 'sessionToken': '', + 'locked': false, + 'enabled': true, + 'expired': false, + 'authorities': ['ROLE_USER'] + }, + { + 'username': 'rave2011.myopenid.com', + 'password': '', + 'email': '[email protected]', + 'openIdUrl': 'http://rave2011.myopenid.com/', + 'firstName': 'Rave', + 'lastName': '2011', + 'nameSeenByOthers': 'George', + 'relationshipStatus': 'Single', + 'description': 'Rave test user.', + 'sessionToken': '', + 'locked': false, + 'enabled': true, + 'expired': false, + 'authorities': ['ROLE_USER'] + }, ]; }); http://git-wip-us.apache.org/repos/asf/rave/blob/b2278703/rave-portal-ng/mock-api/modules/users/get.js ---------------------------------------------------------------------- diff --git a/rave-portal-ng/mock-api/modules/users/get.js b/rave-portal-ng/mock-api/modules/users/get.js index 4e52226..4bc65bb 100644 --- a/rave-portal-ng/mock-api/modules/users/get.js +++ b/rave-portal-ng/mock-api/modules/users/get.js @@ -19,7 +19,15 @@ define(function(require) { 'email' ]; - function getUsers() { + function getPageSize() { + var prefs = api.db.query('preferences'); + // return prefs; + var pageSize = _.findWhere(prefs, {key: 'pageSize'}); + return pageSize.value; + } + + function getUsers(params) { + var rawUsers = api.db.query('users'); var filteredUsers = []; @@ -27,7 +35,36 @@ define(function(require) { filteredUsers.push(_.pick(rawUser, userKeys)); }); - return filteredUsers; + var page = params.page || 1; + var pageSize = getPageSize(); + + // The first index to start from + var startIndex = (page - 1) * pageSize; + + // The naive end index. We may have overshot this. + var endIndex = page * pageSize; + + // Truncate our end index if it's too long. Slice only goes UP TO + // this index, which is why we don't use (length - 1) + if (endIndex > filteredUsers.length) { + endIndex = filteredUsers.length; + } + + var results = filteredUsers.slice(startIndex, endIndex); + + var returnObj = {}; + + returnObj.data = results; + returnObj.metadata = { + pageSize: pageSize, + page: page, + start: startIndex+1, + end: endIndex, + pageCount: Math.ceil(filteredUsers.length / pageSize), + totalUsers: filteredUsers.length + }; + + return returnObj; } function processRequest(method, url, data, headers) { @@ -39,7 +76,16 @@ define(function(require) { return [401, 'Invalid token']; } - return [200, getUsers()]; + var params = this.parseQueryString(url); + + var usersData = getUsers(params); + + var object = { + data: usersData.data, + metadata: usersData.metadata + }; + + return [200, object]; } api.register('/users', 'get', processRequest); http://git-wip-us.apache.org/repos/asf/rave/blob/b2278703/rave-portal-ng/src/subapps/admin/users/controllers/users.js ---------------------------------------------------------------------- diff --git a/rave-portal-ng/src/subapps/admin/users/controllers/users.js b/rave-portal-ng/src/subapps/admin/users/controllers/users.js index 7e7b0aa..2125847 100644 --- a/rave-portal-ng/src/subapps/admin/users/controllers/users.js +++ b/rave-portal-ng/src/subapps/admin/users/controllers/users.js @@ -5,31 +5,39 @@ */ define(function(require) { - return ['$scope', '$stateParams', 'pagination', 'usersList', - function($scope, $stateParams, pagination, usersList) { + return ['$scope', '$stateParams', 'pagination', 'usersList', '$rootScope', + function($scope, $stateParams, pagination, usersList, $rootScope) { $scope.currentPage = +$stateParams.page || 0; - // How many items to show per page - $scope.itemsPerPage = 10; + usersList.$promise.then(function() { + $scope.users = usersList.data; - $scope.users = usersList; + var usersMeta = usersList.metadata; - // Our total number of users. - $scope.totalUsers = 1000; + // Coerce each piece of metadata to a number. + _.each(usersMeta, function(val, key) { + usersMeta[key] = +val; + }); - // The generated pageCount. - $scope.pageCount = Math.ceil($scope.totalUsers / $scope.itemsPerPage); + $scope.usersMeta = usersMeta; + }); // Our paginationPages $scope.paginationPages = pagination.paginationPages; $scope.prevPageDisabled = function() { + if (!$scope.currentPage) { + return 'disabled'; + } return $scope.currentPage === 1 ? 'disabled' : ''; }; $scope.nextPageDisabled = function() { - return $scope.currentPage === $scope.pageCount ? 'disabled' : ''; + if (!$scope.usersMeta) { + return 'disabled'; + } + return $scope.currentPage === $scope.usersMeta.pageCount ? 'disabled' : ''; }; }]; }); http://git-wip-us.apache.org/repos/asf/rave/blob/b2278703/rave-portal-ng/src/subapps/admin/users/routes.js ---------------------------------------------------------------------- diff --git a/rave-portal-ng/src/subapps/admin/users/routes.js b/rave-portal-ng/src/subapps/admin/users/routes.js index 592144d..ba04fac 100644 --- a/rave-portal-ng/src/subapps/admin/users/routes.js +++ b/rave-portal-ng/src/subapps/admin/users/routes.js @@ -21,9 +21,11 @@ define(function(require) { authenticate: true, controller: usersCtrl, resolve: { - usersList: ['usersResource', - function(usersResource) { - return usersResource.query(); + usersList: ['usersResource', '$stateParams', + function(usersResource, $stateParams) { + return usersResource.get({ + page: $stateParams.page + }); }] } }) http://git-wip-us.apache.org/repos/asf/rave/blob/b2278703/rave-portal-ng/src/subapps/admin/users/templates/users.html ---------------------------------------------------------------------- diff --git a/rave-portal-ng/src/subapps/admin/users/templates/users.html b/rave-portal-ng/src/subapps/admin/users/templates/users.html index 9628338..cc88cc3 100644 --- a/rave-portal-ng/src/subapps/admin/users/templates/users.html +++ b/rave-portal-ng/src/subapps/admin/users/templates/users.html @@ -1,18 +1,20 @@ <article ui-view> <h2> - Showing {{ firstItem() }} - {{ lastItem() }} of {{ users.length }} results + Showing {{ usersMeta.start }} - {{ usersMeta.end }} of {{ usersMeta.totalUsers }} results </h2> <div class="searchHeading paginationHeading"> <div class="pagination"> <ul> - <li ng-class="prevPageDisabled()"> - <a ui-sref="portal.admin.users({page:currentPage-1})"><</a> + <li ng-switch on="prevPageDisabled()" ng-class="prevPageDisabled()"> + <a ng-switch-when="disabled"><</a> + <a ng-switch-default ui-sref="portal.admin.users({page:usersMeta.page-1})"><</a> </li> - <li ng-repeat="n in paginationPages(currentPage, pageCount)" ng-class="{ active: n == currentPage }"> + <li ng-repeat="n in paginationPages(usersMeta.page, usersMeta.pageCount)" ng-class="{ active: n == usersMeta.page }"> <a ui-sref="portal.admin.users({page:n})">{{ n }}</a> </li> - <li ng-class="nextPageDisabled()"> - <a ui-sref="portal.admin.users({page:currentPage+1})">></a> + <li ng-switch on="nextPageDisabled()" ng-class="nextPageDisabled()"> + <a ng-switch-when="disabled">></a> + <a ng-switch-default ui-sref="portal.admin.users({page:usersMeta.page+1})">></a> </li> </ul> </div> @@ -47,14 +49,16 @@ </table> <div class="pagination"> <ul> - <li ng-class="prevPageDisabled()"> - <a ui-sref="portal.admin.users({page:currentPage-1})"><</a> + <li ng-switch on="prevPageDisabled()" ng-class="prevPageDisabled()"> + <a ng-switch-when="disabled"><</a> + <a ng-switch-default ui-sref="portal.admin.users({page:usersMeta.page-1})"><</a> </li> - <li ng-repeat="n in paginationPages(currentPage, pageCount)" ng-class="{ active: n == currentPage }"> + <li ng-repeat="n in paginationPages(usersMeta.page, usersMeta.pageCount)" ng-class="{ active: n == usersMeta.page }"> <a ui-sref="portal.admin.users({page:n})">{{ n }}</a> </li> - <li ng-class="nextPageDisabled()"> - <a ui-sref="portal.admin.users({page:currentPage+1})">></a> + <li ng-switch on="nextPageDisabled()" ng-class="nextPageDisabled()"> + <a ng-switch-when="disabled">></a> + <a ng-switch-default ui-sref="portal.admin.users({page:usersMeta.page+1})">></a> </li> </ul> </article>
