This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository coselmar. See http://git.codelutin.com/coselmar.git commit 3fc3cfd9b2d8647ef4caa1887d0412441e185bf6 Author: Yannick Martel <martel@©odelutin.com> Date: Wed Feb 3 12:06:24 2016 +0100 Add pagination on projects list --- .../persistence/entity/QuestionTopiaDao.java | 94 ++++++++++++--------- .../coselmar/services/v1/QuestionsWebService.java | 96 ++++++++++++++++++---- coselmar-rest/src/main/resources/mapping | 1 + .../src/main/webapp/js/coselmar-controllers.js | 30 +++++-- .../main/webapp/js/coselmar-questions-services.js | 21 +++++ .../src/main/webapp/views/questions/questions.html | 7 +- 6 files changed, 187 insertions(+), 62 deletions(-) diff --git a/coselmar-persistence/src/main/java/fr/ifremer/coselmar/persistence/entity/QuestionTopiaDao.java b/coselmar-persistence/src/main/java/fr/ifremer/coselmar/persistence/entity/QuestionTopiaDao.java index fec507d..0074d88 100644 --- a/coselmar-persistence/src/main/java/fr/ifremer/coselmar/persistence/entity/QuestionTopiaDao.java +++ b/coselmar-persistence/src/main/java/fr/ifremer/coselmar/persistence/entity/QuestionTopiaDao.java @@ -33,40 +33,45 @@ import fr.ifremer.coselmar.persistence.DaoUtils; import org.apache.commons.lang3.StringUtils; import org.nuiton.topia.persistence.TopiaQueryBuilderAddCriteriaOrRunQueryStep; import org.nuiton.util.pagination.PaginationParameter; +import org.nuiton.util.pagination.PaginationResult; public class QuestionTopiaDao extends AbstractQuestionTopiaDao<Question> { - public List<Question> findForExpert(CoselmarUser expert, QuestionSearchExample questionSearchExample, PaginationParameter page) { + public PaginationResult<Question> findForExpert(CoselmarUser expert, QuestionSearchExample questionSearchExample, PaginationParameter page) { - StringBuilder hqlBuilder = new StringBuilder("SELECT Q FROM " + Question.class.getName() + " Q " + StringBuilder hqlWithoutSelectBuilder = new StringBuilder(" FROM " + Question.class.getName() + " Q " + " INNER JOIN Q." + Question.PROPERTY_PARTICIPANTS + " CUG "); Map<String, Object> args = new HashMap<>(); String publicCondition = DaoUtils.getQueryForAttributeEquals("Q", Question.PROPERTY_PRIVACY, args, Privacy.PUBLIC, ""); - hqlBuilder.append(" WHERE ( (" + publicCondition + " ) "); + hqlWithoutSelectBuilder.append(" WHERE ( (" + publicCondition + " ) "); String privateCondition = DaoUtils.getQueryForAttributeEquals("Q", Question.PROPERTY_PRIVACY, args, Privacy.PRIVATE, ""); - hqlBuilder.append(" OR (" + privateCondition); + hqlWithoutSelectBuilder.append(" OR (" + privateCondition); String participantCondition = DaoUtils.andAttributeContains("CUG", CoselmarUserGroup.PROPERTY_MEMBERS, args, expert); - hqlBuilder.append(participantCondition); + hqlWithoutSelectBuilder.append(participantCondition); String clientCondition = DaoUtils.andAttributeContains("Q", Question.PROPERTY_CLIENTS, args, expert); - hqlBuilder.append(clientCondition + ") )"); + hqlWithoutSelectBuilder.append(clientCondition + ") )"); String finerHql = refineSearch(questionSearchExample, "Q", args); - hqlBuilder.append(" AND (" + finerHql + ")" ); + hqlWithoutSelectBuilder.append(" AND (" + finerHql + ")" ); + StringBuilder hqlBuilder = new StringBuilder("SELECT Q ").append(hqlWithoutSelectBuilder); - List<Question> questions; + PaginationResult<Question> questions; if (page != null) { - questions = forHql(hqlBuilder.toString(), args).find(page); + long count = findUnique("SELECT count(Q." + Question.PROPERTY_TOPIA_ID + " ) " + hqlWithoutSelectBuilder.toString(), args); + List<Question> questionList = forHql(hqlBuilder.toString(), args).find(page); + questions = PaginationResult.of(questionList, count, page); } else { - questions = forHql(hqlBuilder.toString(), args).findAll(); + List<Question> allQuestions = forHql(hqlBuilder.toString(), args).findAll(); + questions = PaginationResult.of(allQuestions, allQuestions.size(), PaginationParameter.of(0, -1)); } return questions; @@ -99,98 +104,113 @@ public class QuestionTopiaDao extends AbstractQuestionTopiaDao<Question> { return questions; } - public List<Question> findForExpert(CoselmarUser expert, List<String> topiaIds, PaginationParameter page) { + public PaginationResult<Question> findForExpert(CoselmarUser expert, List<String> topiaIds, PaginationParameter page) { - StringBuilder hqlBuilder = new StringBuilder("SELECT Q FROM " + Question.class.getName() + " Q " + StringBuilder hqlWithoutSelectBuilder = new StringBuilder(" FROM " + Question.class.getName() + " Q " + " INNER JOIN Q." + Question.PROPERTY_PARTICIPANTS + " CUG "); Map<String, Object> args = new HashMap<>(); String publicCondition = DaoUtils.getQueryForAttributeEquals("Q", Question.PROPERTY_PRIVACY, args, Privacy.PUBLIC, ""); - hqlBuilder.append(" WHERE ( (" + publicCondition + " ) "); + hqlWithoutSelectBuilder.append(" WHERE ( (" + publicCondition + " ) "); String privateCondition = DaoUtils.getQueryForAttributeEquals("Q", Question.PROPERTY_PRIVACY, args, Privacy.PRIVATE, ""); - hqlBuilder.append(" OR (" + privateCondition + " AND ( 0 = 1 "); + hqlWithoutSelectBuilder.append(" OR (" + privateCondition + " AND ( 0 = 1 "); String participantCondition = DaoUtils.orAttributeContains("CUG", CoselmarUserGroup.PROPERTY_MEMBERS, args, expert); - hqlBuilder.append(participantCondition); + hqlWithoutSelectBuilder.append(participantCondition); String clientCondition = DaoUtils.orAttributeContains("Q", Question.PROPERTY_CLIENTS, args, expert); - hqlBuilder.append(clientCondition + ") ) )"); + hqlWithoutSelectBuilder.append(clientCondition + ") ) )"); String topiaIdsCondition = DaoUtils.andAttributeIn("Q", Question.PROPERTY_TOPIA_ID, args, topiaIds); - hqlBuilder.append(topiaIdsCondition); + hqlWithoutSelectBuilder.append(topiaIdsCondition); + StringBuilder hqlBuilder = new StringBuilder("SELECT Q ").append(hqlWithoutSelectBuilder); - List<Question> questions; + PaginationResult<Question> questions; if (page != null) { - questions = forHql(hqlBuilder.toString(), args).find(page); + long count = findUnique("SELECT count(Q." + Question.PROPERTY_TOPIA_ID + " ) " + hqlWithoutSelectBuilder.toString(), args); + List<Question> questionList = forHql(hqlBuilder.toString(), args).find(page); + questions = PaginationResult.of(questionList, count, page); } else { - questions = forHql(hqlBuilder.toString(), args).findAll(); + List<Question> allQuestions = forHql(hqlBuilder.toString(), args).findAll(); + questions = PaginationResult.of(allQuestions, allQuestions.size(), PaginationParameter.of(0, -1)); } return questions; } - public List<Question> findForClient(CoselmarUser client, QuestionSearchExample searchExample, PaginationParameter page) { + public PaginationResult<Question> findForClient(CoselmarUser client, QuestionSearchExample searchExample, PaginationParameter page) { - StringBuilder hqlBuilder = new StringBuilder("SELECT Q FROM " + Question.class.getName() + " Q "); + StringBuilder hqlWithoutSelectBuilder = new StringBuilder(" FROM " + Question.class.getName() + " Q "); Map<String, Object> args = new HashMap<>(); String clientCondition = DaoUtils.andAttributeContains("Q", Question.PROPERTY_CLIENTS, args, client); - hqlBuilder.append(" WHERE 1=1 " + clientCondition + " "); + hqlWithoutSelectBuilder.append(" WHERE 1=1 " + clientCondition + " "); if (searchExample != null) { String finerHql = refineSearch(searchExample, "Q", args); - hqlBuilder.append(" AND (" + finerHql + ")" ); + hqlWithoutSelectBuilder.append(" AND (" + finerHql + ")" ); } - List<Question> questions; + StringBuilder hqlBuilder = new StringBuilder("SELECT Q ").append(hqlWithoutSelectBuilder); + + PaginationResult<Question> questions; if (page != null) { - questions = forHql(hqlBuilder.toString(), args).find(page); + long count = findUnique("SELECT count(Q." + Question.PROPERTY_TOPIA_ID + " ) " + hqlWithoutSelectBuilder.toString(), args); + List<Question> questionList = forHql(hqlBuilder.toString(), args).find(page); + questions = PaginationResult.of(questionList, count, page); } else { - questions = forHql(hqlBuilder.toString(), args).findAll(); + List<Question> allQuestions = forHql(hqlBuilder.toString(), args).findAll(); + questions = PaginationResult.of(allQuestions, allQuestions.size(), PaginationParameter.of(0, -1)); } return questions; } - public List<Question> findForClient(CoselmarUser client, List<String> topiaIds, PaginationParameter page) { + public PaginationResult<Question> findForClient(CoselmarUser client, List<String> topiaIds, PaginationParameter page) { TopiaQueryBuilderAddCriteriaOrRunQueryStep<Question> queryBuilder = forTopiaIdIn(topiaIds); queryBuilder.addContains(Question.PROPERTY_CLIENTS, client); - List<Question> questions; + PaginationResult<Question> questions; if (page != null) { - questions = queryBuilder.find(page); + questions = queryBuilder.findPage(page); } else { - questions = queryBuilder.findAll(); + List<Question> allQuestions = queryBuilder.findAll(); + questions = PaginationResult.of(allQuestions, allQuestions.size(), PaginationParameter.of(0, -1)); } return questions; } - public List<Question> findWithSearchExample(QuestionSearchExample searchExample, PaginationParameter page) { + public PaginationResult<Question> findWithSearchExample(QuestionSearchExample searchExample, PaginationParameter page) { - StringBuilder hqlBuilder = new StringBuilder("SELECT Q FROM " + Question.class.getName() + " Q "); + StringBuilder hqlWithoutSelectBuilder = new StringBuilder(" FROM " + Question.class.getName() + " Q "); Map<String, Object> args = new HashMap<>(); if (searchExample != null) { String finerHql = refineSearch(searchExample, "Q", args); - hqlBuilder.append(" WHERE (" + finerHql + ")" ); + hqlWithoutSelectBuilder.append(" WHERE (" + finerHql + ")" ); } - List<Question> questions; + StringBuilder hqlBuilder = new StringBuilder("SELECT Q ").append(hqlWithoutSelectBuilder); + + PaginationResult<Question> questions; if (page != null) { - questions = forHql(hqlBuilder.toString(), args).find(page); + long count = findUnique("SELECT count(Q." + Question.PROPERTY_TOPIA_ID + " ) " + hqlWithoutSelectBuilder.toString(), args); + List<Question> questionList = forHql(hqlBuilder.toString(), args).find(page); + questions = PaginationResult.of(questionList, count, page); } else { - questions = forHql(hqlBuilder.toString(), args).findAll(); + List<Question> allQuestions = forHql(hqlWithoutSelectBuilder.toString(), args).findAll(); + questions = PaginationResult.of(allQuestions, allQuestions.size(), PaginationParameter.of(0, -1)); } return questions; diff --git a/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/QuestionsWebService.java b/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/QuestionsWebService.java index f5a7ca0..7a8eaab 100644 --- a/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/QuestionsWebService.java +++ b/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/QuestionsWebService.java @@ -75,6 +75,7 @@ import org.nuiton.topia.persistence.TopiaIdFactory; import org.nuiton.topia.persistence.TopiaNoResultException; import org.nuiton.util.DateUtil; import org.nuiton.util.pagination.PaginationParameter; +import org.nuiton.util.pagination.PaginationResult; /** * @author ymartel <martel@codelutin.com> @@ -288,6 +289,27 @@ public class QuestionsWebService extends CoselmarWebServiceSupport { return result; } + public PaginationResult<QuestionBean> getPaginatedQuestions(QuestionSearchBean searchOption) throws InvalidCredentialException, UnauthorizedException { + + // Check authentication + String authorization = getContext().getHeader("Authorization"); + CoselmarUser currentUser = checkUserAuthentication(authorization); + + PaginationResult<Question> paginatedQuestions; + + if (searchOption != null) { + paginatedQuestions = getPaginatedFilteredQuestions(currentUser, searchOption); + + } else { + List<Question> allQuestions = getAllQuestions(currentUser); + paginatedQuestions = PaginationResult.of(allQuestions, allQuestions.size(), PaginationParameter.of(0, -1)); + } + + PaginationResult<QuestionBean> result = convert(currentUser, paginatedQuestions); + + return result; + } + public List<QuestionBean> getPublicQuestions() throws InvalidCredentialException, UnauthorizedException { // No authentication needed, just filter to get last 5 public questions @@ -301,11 +323,11 @@ public class QuestionsWebService extends CoselmarWebServiceSupport { PaginationParameter paginationParameter = PaginationParameter.of(0, 5, Question.PROPERTY_SUBMISSION_DATE, true); - List<Question> questionList = getQuestionDao().findWithSearchExample(searchOption, paginationParameter); + PaginationResult<Question> questionList = getQuestionDao().findWithSearchExample(searchOption, paginationParameter); - List<QuestionBean> result = new ArrayList<>(questionList.size()); + List<QuestionBean> result = new ArrayList<>(questionList.getElements().size()); - for (Question question : questionList) { + for (Question question : questionList.getElements()) { TopiaIdFactory topiaIdFactory = getPersistenceContext().getTopiaIdFactory(); QuestionBean questionBean = BeanEntityConverter.toLightBean(topiaIdFactory, question); @@ -1193,9 +1215,34 @@ public class QuestionsWebService extends CoselmarWebServiceSupport { * * @return list of all question user is authorized to access. * @throws UnauthorizedException + * + * @deprecated use {@link #getPaginatedFilteredQuestions(CoselmarUser, QuestionSearchBean)} */ protected List<Question> getAllFilteredQuestions(CoselmarUser currentUser, QuestionSearchBean searchBean) throws UnauthorizedException { + PaginationResult<Question> paginatedFilteredQuestions = getPaginatedFilteredQuestions(currentUser, searchBean); + return paginatedFilteredQuestions.getElements(); + } + + /** + * Methods that retrieve questions matching search filter (based on an example + * or/and fullText search) also depending of current user role permission : + * <ul> + * <li>{@code ADMIN} and {@code SUPERVISOR} can access to all questions ;</li> + * <li>{@code MEMBER} can only access to all public questions (so, if filter is on private, it has no result) ;</li> + * <li>{@code EXPERT} can access to all private questions where he is participant or client and all public questions ;</li> + * <li>{@code CLIENT} can access to all questions where he is client.</li> + * </ul> + * The result is paginated, and only the elements of asking page are returned. + * + * @param currentUser : current user that make request + * @param searchBean : bean containing search param to filter result + * + * @return {@link PaginationResult} of questions user is authorized to access. + * @throws UnauthorizedException + */ + protected PaginationResult<Question> getPaginatedFilteredQuestions(CoselmarUser currentUser, QuestionSearchBean searchBean) throws UnauthorizedException { + QuestionsIndexationService questionsIndexationService = getServicesContext().newService(QuestionsIndexationService.class); //Try to retrieve corresponding questionIds from the index if searchBean given @@ -1216,7 +1263,7 @@ public class QuestionsWebService extends CoselmarWebServiceSupport { } - List<Question> questionList; + PaginationResult<Question> paginatedQuestions; String currentUserRole = currentUser.getRole().name(); @@ -1288,11 +1335,11 @@ public class QuestionsWebService extends CoselmarWebServiceSupport { || StringUtils.equalsIgnoreCase(CoselmarUserRole.SUPERVISOR.name(), currentUserRole)) { if (fromIndexQuestionIds != null && !fromIndexQuestionIds.isEmpty()) { - questionList = getQuestionDao().forTopiaIdIn(fromIndexQuestionIds).find(paginationParameter); + paginatedQuestions = getQuestionDao().forTopiaIdIn(fromIndexQuestionIds).findPage(paginationParameter); // classical search with DAO } else { - questionList = getQuestionDao().findWithSearchExample(searchExample, paginationParameter); + paginatedQuestions = getQuestionDao().findWithSearchExample(searchExample, paginationParameter); } @@ -1301,35 +1348,35 @@ public class QuestionsWebService extends CoselmarWebServiceSupport { if (StringUtils.equals(searchBean.getPrivacy(), Privacy.PRIVATE.name())) { // Asking for private question ? directly no result ! - questionList = new ArrayList<>(0); + paginatedQuestions = PaginationResult.of(new ArrayList<Question>(0), 0, PaginationParameter.of(0, -1)); } else { if (fromIndexQuestionIds != null && !fromIndexQuestionIds.isEmpty()) { - questionList = getQuestionDao().forTopiaIdIn(fromIndexQuestionIds).find(paginationParameter); + paginatedQuestions = getQuestionDao().forTopiaIdIn(fromIndexQuestionIds).findPage(paginationParameter); // classical search with DAO } else { - questionList = getQuestionDao().findWithSearchExample(searchExample, paginationParameter); + paginatedQuestions = getQuestionDao().findWithSearchExample(searchExample, paginationParameter); } } // Expert : access to all public question and private question if he is participant or client } else if (StringUtils.equalsIgnoreCase(CoselmarUserRole.EXPERT.name(), currentUserRole)) { if (fromIndexQuestionIds != null && !fromIndexQuestionIds.isEmpty()) { - questionList = getQuestionDao().findForExpert(currentUser, fromIndexQuestionIds, paginationParameter); + paginatedQuestions = getQuestionDao().findForExpert(currentUser, fromIndexQuestionIds, paginationParameter); } else { - questionList = getQuestionDao().findForExpert(currentUser, searchExample, paginationParameter); + paginatedQuestions = getQuestionDao().findForExpert(currentUser, searchExample, paginationParameter); } // Client : access to question he is client } else if (StringUtils.equalsIgnoreCase(CoselmarUserRole.CLIENT.name(), currentUserRole)) { if (fromIndexQuestionIds != null && !fromIndexQuestionIds.isEmpty()) { - questionList = getQuestionDao().findForClient(currentUser, fromIndexQuestionIds, paginationParameter); + paginatedQuestions = getQuestionDao().findForClient(currentUser, fromIndexQuestionIds, paginationParameter); } else { - questionList = getQuestionDao().findForClient(currentUser, searchExample, paginationParameter); + paginatedQuestions = getQuestionDao().findForClient(currentUser, searchExample, paginationParameter); } } else { @@ -1339,7 +1386,7 @@ public class QuestionsWebService extends CoselmarWebServiceSupport { } throw new UnauthorizedException(message); } - return questionList; + return paginatedQuestions; } protected List<String> getQuestionsFullId(List<String> questionShortIds) { @@ -1374,6 +1421,27 @@ public class QuestionsWebService extends CoselmarWebServiceSupport { return questions; } + protected PaginationResult<QuestionBean> convert(CoselmarUser currentUser, PaginationResult<Question> paginatedQuestions) { + List<QuestionBean> questions = new ArrayList<>(paginatedQuestions.getElements().size()); + + for (Question question : paginatedQuestions.getElements()) { + TopiaIdFactory topiaIdFactory = getPersistenceContext().getTopiaIdFactory(); + + QuestionBean questionBean; + if (RESTRICTED_ACCESS_USERS.contains(currentUser.getRole().name())) { + questionBean = BeanEntityConverter.toLightBean(topiaIdFactory, question); + + } else { + questionBean = BeanEntityConverter.toBean(topiaIdFactory, question); + } + + questions.add(questionBean); + } + + PaginationResult paginatedQuestionBeans = PaginationResult.of(questions, paginatedQuestions.getCount(), paginatedQuestions.getCurrentPage()); + return paginatedQuestionBeans; + } + protected List<QuestionTreeNode> buildAncestorsTree(String questionId, int depth) { // Depth = 0 : it is the end of the tree ! if (depth == 0) { diff --git a/coselmar-rest/src/main/resources/mapping b/coselmar-rest/src/main/resources/mapping index f7d274b..5c97dc1 100644 --- a/coselmar-rest/src/main/resources/mapping +++ b/coselmar-rest/src/main/resources/mapping @@ -57,6 +57,7 @@ GET /v1/users/{userId}/projects QuestionsWebService.getUserQuest # Questions Api GET /v1/questions QuestionsWebService.getQuestions +GET /v2/questions QuestionsWebService.getPaginatedQuestions GET /v1/questions/public QuestionsWebService.getPublicQuestions GET /v1/questions/themes QuestionsWebService.getThemes GET /v1/questions/types QuestionsWebService.getTypes diff --git a/coselmar-ui/src/main/webapp/js/coselmar-controllers.js b/coselmar-ui/src/main/webapp/js/coselmar-controllers.js index 39dd801..cd105f8 100644 --- a/coselmar-ui/src/main/webapp/js/coselmar-controllers.js +++ b/coselmar-ui/src/main/webapp/js/coselmar-controllers.js @@ -997,7 +997,7 @@ coselmarControllers.controller("QuestionsCtrl", ['$scope', '$route', '$routePara function($scope, $route, $routeParams, $location, questionsService, notify, errorService){ $scope.$emit('dataLoading'); - $scope.searchOptions = { 'privacy' : '', 'status' : '', 'fullTextSearch' : []}; + $scope.searchOptions = { 'privacy' : '', 'status' : '', 'fullTextSearch' : [], page: 0, limit: 25}; var advancedSearch = $routeParams.advancedSearch; if (advancedSearch) { @@ -1006,18 +1006,19 @@ coselmarControllers.controller("QuestionsCtrl", ['$scope', '$route', '$routePara $scope.advanced = false; } - questionsService.getQuestions($scope.searchOptions, function(questions) { + questionsService.getPaginatedQuestions($scope.searchOptions, function(paginatedQuestions) { // success : just get the questions - $scope.questions = questions; - + $scope.paginationData = paginatedQuestions; + $scope.$broadcast('pageLoaded', $scope.paginationData.currentPage, paginatedQuestions.count) }, errorService.defaultFailOnCall, function() { $scope.$emit('dataLoaded'); }); $scope.searchQuestions = function() { $scope.$emit('dataLoading'); - questionsService.getQuestions($scope.searchOptions, function(questions) { - $scope.questions = questions; + questionsService.getPaginatedQuestions($scope.searchOptions, function(paginatedQuestions) { + $scope.paginationData = paginatedQuestions; + $scope.$broadcast('pageLoaded', $scope.paginationData.currentPage, paginatedQuestions.count) }, errorService.defaultFailOnCall, function() { $scope.$emit('dataLoaded'); }); @@ -1054,8 +1055,9 @@ coselmarControllers.controller("QuestionsCtrl", ['$scope', '$route', '$routePara $scope.searchOptions.deadlineBeforeDate = $scope.searchOptions.deadlineBeforeDate.getTime(); } - questionsService.getQuestions($scope.searchOptions, function(questions){ - $scope.questions = questions; + questionsService.getPaginatedQuestions($scope.searchOptions, function(paginatedQuestions) { + $scope.paginationData = paginatedQuestions; + $scope.$broadcast('pageLoaded', $scope.paginationData.currentPage, paginatedQuestions.count) }, errorService.defaultFailOnCall, function() { $scope.$emit('dataLoaded'); }); @@ -1112,6 +1114,18 @@ coselmarControllers.controller("QuestionsCtrl", ['$scope', '$route', '$routePara return localStorage.getItem('coselmar-jwt'); }; + // Notification de changement dans le module de pagination + $scope.$on('loadPage', function(event, pageNumber, pageSize) { + $scope.searchOptions.page = pageNumber; + $scope.searchOptions.limit = pageSize; + questionsService.getPaginatedQuestions($scope.searchOptions, function(paginatedQuestions) { + $scope.paginationData = paginatedQuestions; + }, errorService.defaultFailOnCall, function() { + $scope.$broadcast('pageLoaded', $scope.paginationData.currentPage, $scope.paginationData.count); + $scope.$emit('dataLoaded'); + }); + }); + }]); // Controller for Question View diff --git a/coselmar-ui/src/main/webapp/js/coselmar-questions-services.js b/coselmar-ui/src/main/webapp/js/coselmar-questions-services.js index 7c6701d..f0d0de1 100644 --- a/coselmar-ui/src/main/webapp/js/coselmar-questions-services.js +++ b/coselmar-ui/src/main/webapp/js/coselmar-questions-services.js @@ -31,6 +31,7 @@ function Question(resource, http, config){ this.resource = resource; var baseURL = config.BASE_URL + "v1/questions"; + var baseV2URL = config.BASE_URL + "v2/questions"; var exportURL = config.BASE_URL + "v1/export/questions"; var usersURL = config.BASE_URL + "v1/users"; @@ -79,6 +80,26 @@ function Question(resource, http, config){ questionResource.query().$promise.then(successFunction, failFunction).finally(finallyFunction); }; + this.getPaginatedQuestions = function(searchOptions, successFunction, failFunction, finallyFunction) { + + if (searchOptions.privacy + && searchOptions.privacy.toUpperCase() != "PRIVATE" + && searchOptions.privacy.toUpperCase() != "PUBLIC" ) { + + searchOptions.privacy = undefined; + } + + if (searchOptions.status && searchOptions.status.toUpperCase() != "IN_PROGRESS" + && searchOptions.status.toUpperCase() != "CLOSED" + && searchOptions.status.toUpperCase() != "ADJOURNED") { + + searchOptions.status = undefined; + } + + var questionResource = resource(baseV2URL, {'searchOption' : searchOptions}); + questionResource.get().$promise.then(successFunction, failFunction).finally(finallyFunction); + }; + this.exportSearchResult = function(searchOptions, successFunction, failFunction) { if (searchOptions.privacy diff --git a/coselmar-ui/src/main/webapp/views/questions/questions.html b/coselmar-ui/src/main/webapp/views/questions/questions.html index 70e7d43..71b4e9c 100644 --- a/coselmar-ui/src/main/webapp/views/questions/questions.html +++ b/coselmar-ui/src/main/webapp/views/questions/questions.html @@ -47,7 +47,7 @@ </tr> </thead> <tbody> - <tr ng-repeat="question in questions" > + <tr ng-repeat="question in paginationData.elements" > <td ng-if="context.currentUser.role != 'MEMBER'"> <span class="status-{{question.status|lowercase}}" title="{{question.status | translate}}"></span> <a href="#/questions/{{question.id}}" class="paddingLeft10" tooltip-placement="bottom" uib-tooltip="{{question.summary | limitTo: 250 }}">{{question.title}}</a> @@ -92,8 +92,9 @@ </tbody> </table> </div> - <p ng-if="questions && questions.length == 0" translate="common.search.noResult" class="info"/> - <div ng-if="questions && questions.length > 0" > + <pagination-tool></pagination-tool> + <p ng-if="!paginationData || !paginationData.elements || paginationData.elements.length == 0" translate="common.search.noResult" class="info"/> + <div ng-if="paginationData && paginationData.elements && paginationData.elements.length > 0" > <form action="{{getExportQuestionsUrl()}}" method="post" target="_blank"> <input type="hidden" name="searchOption" value="{{searchOptions}}" /> <input type="hidden" name="token" value="{{getToken()}}" /> -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.