From 1c52a9e0a63d78ef8c482d164acc28a7a57a41c3 Mon Sep 17 00:00:00 2001 From: kunw Date: Wed, 12 Oct 2016 12:37:15 +0800 Subject: [PATCH 1/3] update for loading partial projects with pagination of UI. --- .../details/retrieve-projects.directive.js | 78 ++++++++++++------- views/project.htm | 2 +- 2 files changed, 50 insertions(+), 30 deletions(-) diff --git a/static/resources/js/components/details/retrieve-projects.directive.js b/static/resources/js/components/details/retrieve-projects.directive.js index c740e154c..3d7c82930 100644 --- a/static/resources/js/components/details/retrieve-projects.directive.js +++ b/static/resources/js/components/details/retrieve-projects.directive.js @@ -35,9 +35,10 @@ var DEFAULT_PAGE = 1; var DEFAULT_PAGE_SIZE = 15; - vm.page = Number(getParameterByName('page', $location.absUrl()) || DEFAULT_PAGE); - vm.pageSize = Number(getParameterByName('page_size', $location.absUrl()) || DEFAULT_PAGE_SIZE); + vm.page = DEFAULT_PAGE; + vm.pageSize = DEFAULT_PAGE_SIZE; + vm.projects = []; vm.retrieve = retrieve; vm.filterInput = ''; vm.selectItem = selectItem; @@ -45,12 +46,15 @@ function retrieve() { ListProjectService(vm.projectName, vm.isPublic, vm.page, vm.pageSize) - .success(getProjectSuccess) - .error(getProjectFailed); + .then(getProjectSuccess, getProjectFailed); + } - - vm.retrieve(); + $scope.$watch('vm.page', function(current) { + if(current) { + vm.retrieve(); + } + }); $scope.$watch('vm.isPublic', function(current) { vm.projectType = vm.isPublic === 0 ? 'my_project_count' : 'public_project_count'; @@ -62,33 +66,49 @@ } }); - function getProjectSuccess(data, status) { - vm.projects = data || []; - if(vm.projects.length == 0 && vm.isPublic === 0){ - $window.location.href = '/project'; + function getProjectSuccess(response) { + + var partialProjects = response.data || []; + for(var i in partialProjects) { + vm.projects.push(partialProjects[i]); } - - if(getParameterByName('project_id', $location.absUrl())){ - for(var i in vm.projects) { - var project = vm.projects[i]; - if(project['project_id'] == getParameterByName('project_id', $location.absUrl())) { - vm.selectedProject = project; - break; - } - } + + var link = response.headers("Link") || ''; + var pattern = /^<\/api\/projects\?is_public=(\d+)&page\=(\d+)&page_size=(\d+)\&project_name=>; rel=\"(\w+)\"$/; + var groups = pattern.exec(link); + + if(groups && groups[4] === 'next') { + vm.isPublic = parseInt(groups[1]); + vm.page = parseInt(groups[2]); + vm.pageSize = parseInt(groups[3]); + } else { + + if(vm.projects.length == 0 && vm.isPublic === 0){ + $window.location.href = '/project'; + } + + if(getParameterByName('project_id', $location.absUrl())){ + for(var i in vm.projects) { + var project = vm.projects[i]; + if(project['project_id'] == getParameterByName('project_id', $location.absUrl())) { + vm.selectedProject = project; + break; + } + } + } + + $location.search('project_id', vm.selectedProject.project_id); + vm.checkProjectMember(vm.selectedProject.project_id); + + vm.resultCount = vm.projects.length; + + $scope.$watch('vm.filterInput', function(current, origin) { + vm.resultCount = $filter('name')(vm.projects, vm.filterInput, 'name').length; + }); } - - $location.search('project_id', vm.selectedProject.project_id); - vm.checkProjectMember(vm.selectedProject.project_id); - - vm.resultCount = vm.projects.length; - - $scope.$watch('vm.filterInput', function(current, origin) { - vm.resultCount = $filter('name')(vm.projects, vm.filterInput, 'name').length; - }); } - function getProjectFailed(data) { + function getProjectFailed(response) { $scope.$emit('modalTitle', $filter('tr')('error')); $scope.$emit('modalMessage', $filter('tr')('failed_to_get_project')); $scope.$emit('raiseError', true); diff --git a/views/project.htm b/views/project.htm index 15ad745b6..f56c5b0fd 100644 --- a/views/project.htm +++ b/views/project.htm @@ -59,7 +59,7 @@

// 'no_projects_add_new_project' | tr //

- //p.name// + //p.name// //p.repo_count// //vm.getProjectRole(p.current_user_role_id) | tr// //p.creation_time | dateL : 'YYYY-MM-DD HH:mm:ss'// From cc2893ea9d95786a8d3b8e247959bfd92e2b2f34 Mon Sep 17 00:00:00 2001 From: kunw Date: Wed, 12 Oct 2016 14:59:40 +0800 Subject: [PATCH 2/3] Updates for matching page number in link, remove default page size for retrieving project on UI. --- .../details/retrieve-projects.directive.js | 42 +++++++++++++------ .../services/project/services.list-project.js | 10 ++--- 2 files changed, 33 insertions(+), 19 deletions(-) diff --git a/static/resources/js/components/details/retrieve-projects.directive.js b/static/resources/js/components/details/retrieve-projects.directive.js index 3d7c82930..3d5641b11 100644 --- a/static/resources/js/components/details/retrieve-projects.directive.js +++ b/static/resources/js/components/details/retrieve-projects.directive.js @@ -33,11 +33,9 @@ vm.isPublic = Number(getParameterByName('is_public', $location.absUrl())); var DEFAULT_PAGE = 1; - var DEFAULT_PAGE_SIZE = 15; - + vm.page = DEFAULT_PAGE; - vm.pageSize = DEFAULT_PAGE_SIZE; - + vm.projects = []; vm.retrieve = retrieve; vm.filterInput = ''; @@ -45,9 +43,8 @@ vm.checkProjectMember = checkProjectMember; function retrieve() { - ListProjectService(vm.projectName, vm.isPublic, vm.page, vm.pageSize) + ListProjectService(vm.projectName, vm.isPublic, vm.page) .then(getProjectSuccess, getProjectFailed); - } $scope.$watch('vm.page', function(current) { @@ -66,6 +63,29 @@ } }); + function parseNextLink(link) { + if(link === '') { + return false; + } + + var parts = link.split(","); + for(var i in parts) { + var groups = /^\<(.*)\>;\srel=\"(\w+)\"$/.exec($.trim(parts[i])); + if(groups && groups.length > 2){ + var url = groups[1]; + var rel = groups[2]; + if(rel === 'next') { + return { + 'page': getParameterByName('page', url), + 'rel' : rel + }; + } + } + } + return false; + } + + function getProjectSuccess(response) { var partialProjects = response.data || []; @@ -73,14 +93,10 @@ vm.projects.push(partialProjects[i]); } - var link = response.headers("Link") || ''; - var pattern = /^<\/api\/projects\?is_public=(\d+)&page\=(\d+)&page_size=(\d+)\&project_name=>; rel=\"(\w+)\"$/; - var groups = pattern.exec(link); + var nextLink = parseNextLink(response.headers("Link") || ''); - if(groups && groups[4] === 'next') { - vm.isPublic = parseInt(groups[1]); - vm.page = parseInt(groups[2]); - vm.pageSize = parseInt(groups[3]); + if(nextLink) { + vm.page = parseInt(nextLink.page); } else { if(vm.projects.length == 0 && vm.isPublic === 0){ diff --git a/static/resources/js/services/project/services.list-project.js b/static/resources/js/services/project/services.list-project.js index c2cc39b64..d59d3dd2d 100644 --- a/static/resources/js/services/project/services.list-project.js +++ b/static/resources/js/services/project/services.list-project.js @@ -27,15 +27,13 @@ function ListProject(projectName, isPublic, page, pageSize) { $log.info('list project projectName:' + projectName, ', isPublic:' + isPublic); - var urlParams = ''; - if(angular.isDefined(page, pageSize)) { - urlParams = '?page=' + page + '&page_size=' + pageSize; - } return $http - .get('/api/projects' + urlParams, { + .get('/api/projects', { 'params' : { 'is_public': isPublic, - 'project_name': projectName + 'project_name': projectName, + 'page': page, + 'page_size': pageSize } }); From 5543f395871a478c77cf5d5202c9466da1f7050c Mon Sep 17 00:00:00 2001 From: kunw Date: Thu, 13 Oct 2016 15:39:50 +0800 Subject: [PATCH 3/3] updates project item link. --- views/project.htm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/project.htm b/views/project.htm index f56c5b0fd..f037baa1f 100644 --- a/views/project.htm +++ b/views/project.htm @@ -59,7 +59,7 @@

// 'no_projects_add_new_project' | tr //

- //p.name// + //p.name// //p.repo_count// //vm.getProjectRole(p.current_user_role_id) | tr// //p.creation_time | dateL : 'YYYY-MM-DD HH:mm:ss'//