Author: ymartel Date: 2014-02-07 17:19:35 +0100 (Fri, 07 Feb 2014) New Revision: 400 Url: http://chorem.org/projects/chorem/repository/revisions/400 Log: add a page with paginated table for project list Added: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/PaginatedResult.java trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/ProjectsAction.java trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/projects/ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/projects/editProject.html trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/projects/projects.jsp trunk/chorem-webmotion/src/main/webapp/js/projectPagination.js Modified: trunk/chorem-webmotion/src/main/resources/mapping Added: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/PaginatedResult.java =================================================================== --- trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/PaginatedResult.java (rev 0) +++ trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/PaginatedResult.java 2014-02-07 16:19:35 UTC (rev 400) @@ -0,0 +1,74 @@ +package org.chorem.webmotion; + +import java.io.Serializable; +import java.util.Iterator; +import java.util.List; + +/** + * @author ymartel <martel@codelutin.com> + */ +public class PaginatedResult<E> implements Iterable<E>, Serializable { + + protected List<E> elements; + protected int currentPage; + protected int count; + protected int nbPages; + protected int total; + + public PaginatedResult(List<E> elements, int currentPage, int count, int total) { + this.elements = elements; + this.currentPage = currentPage; + this.count = count; + this.total = total; + this.nbPages = total == 0 ? 1 : (int) Math.ceil((double) total / (double) count); + } + + @Override + public Iterator<E> iterator() { + if (this.elements == null) { + return null; + } else { + return elements.iterator(); + } + } + + public List<E> getElements() { + return elements; + } + + public void setElements(List<E> elements) { + this.elements = elements; + } + + public int getCurrentPage() { + return currentPage; + } + + public void setCurrentPage(int currentPage) { + this.currentPage = currentPage; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public int getNbPages() { + return nbPages; + } + + public void setNbPages(int nbPages) { + this.nbPages = nbPages; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } +} Added: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/ProjectsAction.java =================================================================== --- trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/ProjectsAction.java (rev 0) +++ trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/project/ProjectsAction.java 2014-02-07 16:19:35 UTC (rev 400) @@ -0,0 +1,66 @@ +package org.chorem.webmotion.actions.project; + +import org.chorem.ChoremClient; +import org.chorem.entities.Project; +import org.chorem.webmotion.PaginatedResult; +import org.debux.webmotion.server.WebMotionController; +import org.nuiton.wikitty.entities.ElementField; +import org.nuiton.wikitty.query.WikittyQuery; +import org.nuiton.wikitty.query.WikittyQueryMaker; +import org.nuiton.wikitty.query.WikittyQueryResult; + +import java.util.ArrayList; +import java.util.Map; + +/** + * @author ymartel <martel@codelutin.com> + */ +public class ProjectsAction extends WebMotionController { + + /** + * Rend le graphe des devis envoyés par mois + * + * @param client + * @return + */ + public PaginatedResult findAllProjects(ChoremClient client, int page, int count, String orderBy, Map<String, String> sorting) { + + //Ventes de l'année + WikittyQuery totalProducts = new WikittyQueryMaker() + .select().count(Project.ELEMENT_FIELD_PROJECT_NAME).where().and() + .exteq(Project.EXT_PROJECT) + .end(); + + Integer nbProjects = client.findByQuery(Integer.class, totalProducts); + + PaginatedResult<Project> paginatedResult; + if (nbProjects > 0) { + + ElementField orderElement; + if (Project.FIELD_PROJECT_DESCRIPTION.equals(orderBy)) { + orderElement = Project.ELEMENT_FIELD_PROJECT_DESCRIPTION; + } else { + // by default, order by + orderElement = Project.ELEMENT_FIELD_PROJECT_NAME; + } + + WikittyQuery projectsQuery = new WikittyQueryMaker() + .where().and() + .exteq(Project.EXT_PROJECT) + .end() + .setOffset((page - 1) * count) + .setLimit(page * count) + .addSortAscending(orderElement); + + WikittyQueryResult<Project> projects = client.findAllByQuery(Project.class, projectsQuery); + + paginatedResult = new PaginatedResult<Project>(projects.getAll(), page, count, nbProjects); + + } else { + paginatedResult = new PaginatedResult<Project>(new ArrayList<Project>(), 1, count, 0); + } + + return paginatedResult; + } + +} Modified: trunk/chorem-webmotion/src/main/resources/mapping =================================================================== --- trunk/chorem-webmotion/src/main/resources/mapping 2014-02-06 16:17:01 UTC (rev 399) +++ trunk/chorem-webmotion/src/main/resources/mapping 2014-02-07 16:19:35 UTC (rev 400) @@ -3,6 +3,7 @@ package.filters=org.chorem.webmotion.filters package.actions=org.chorem.webmotion.actions server.listener.class=org.chorem.webmotion.injector.InjectorListener +default.render=org.debux.webmotion.server.render.DefaultRender [filters] * /* ChoremClientFilter.inject @@ -13,6 +14,7 @@ * /sales/funnel/partial/* DecoratorFilter.decorate wmDecoratorNo=true * /crm/export DecoratorFilter.decorate wmDecoratorNo=true * /project/json/* DecoratorFilter.decorate wmDecoratorNo=true +* /project/editProject.html DecoratorFilter.decorate wmDecoratorNo=true * /hr/employeeEdit/json/* DecoratorFilter.decorate wmDecoratorNo=true * /ascii/* DecoratorFilter.decorate wmDecoratorNo=true * /rest/* DecoratorFilter.decorate wmDecoratorNo=true @@ -92,6 +94,10 @@ * /crm/quotation/edit/{id} action:crm.QuotationAction.edit * /crm/export action:crm.ExportAction.exportContactBase +GET /project/json/projects?page={page}&count={count} action:project.ProjectsAction.findAllProjects page=1,count=10 +GET /project/projects.html view:projects/projects.jsp +GET /project/editProject.html view:projects/editProject.html + # # Wikitty Rest API # Added: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/projects/editProject.html =================================================================== --- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/projects/editProject.html (rev 0) +++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/projects/editProject.html 2014-02-07 16:19:35 UTC (rev 400) @@ -0,0 +1,13 @@ +<table class="noborder"> + <tr> + <td>Name:</td> + <td><input type="text" name="name" class="w100" value="{{project.wikitty.target.fieldValue['Project.name']}}"></td> + <td>Description: </td> + <td><input type="text" name="description" class="w180" value="{{project.wikitty.target.fieldValue['Project.description']}}"></td> + <td> + <input type="hidden" name="id" value="{{project.wikitty.target.id}}"> + <input type="button" value=" save " onclick="alert('Save :)')"> + </td> + <td><input type="button" value=" cancel" ng-click="setEditId(-1)"></td> + </tr> +</table> \ No newline at end of file Added: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/projects/projects.jsp =================================================================== --- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/projects/projects.jsp (rev 0) +++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/projects/projects.jsp 2014-02-07 16:19:35 UTC (rev 400) @@ -0,0 +1,37 @@ +<%@page contentType="text/html" pageEncoding="UTF-8"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="f" %> +<%@ taglib uri="/WEB-INF/wikitty.tld" prefix="w"%> + +<head> + <script data-require="angular-resource@1.2.0-rc.3" data-semver="1.2.0-rc.3" src="<c:url value='http://code.angularjs.org/1.2.0-rc.3/angular-resource.js'/>"></script> + <script data-require="ng-table@*" data-semver="0.3.0" src="<c:url value='http://bazalt-cms.com/assets/ng-table/0.3.0/ng-table.js'/>"></script> + <link data-require="ng-table@*" data-semver="0.3.0" rel="stylesheet" href="<c:url value='http://bazalt-cms.com/assets/ng-table/0.3.0/ng-table.css'/>" /> + <link data-require="bootstrap-css@*" data-semver="3.0.0" rel="stylesheet" href="<c:url value='http://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css'/>" /> + <script type="text/javascript" src="<c:url value='/js/projectPagination.js'/>"></script> +</head> + +<div ng-app="projectList" ng-controller="PageCtrl"> + + <div loading-container="tableParams.settings().$loading"> + <table ng-table="tableParams" show-filter="true" class="table"> + <tbody ng-repeat="project in projects"> + <tr id="tr{{project.wikitty.target.id}}" ng-class-odd="'odd'" ng-class-even="'even'"> + <td data-title="'Name'" sortable="name"> + {{project.wikitty.target.fieldValue["Project.name"]}} + {{loading}} + </td> + <td data-title="'Description'" sortable="description"> + {{project.wikitty.target.fieldValue['Project.description']}} + </td> + <td class="rowTd" ><input type=button id="editRowBtn{{project.wikitty.target.id}}" value="edit" + ng-click="setEditId(project.wikitty.target.id)"></td> + </tr> + <tr ng-show="editId===project.wikitty.target.id" ng-if="editId===project.wikitty.target.id"> + <td colspan="7" ng-include src="'editProject.html'">pouet</td> + </tr> + </tbody> + </table> + </div> + +</div> \ No newline at end of file Added: trunk/chorem-webmotion/src/main/webapp/js/projectPagination.js =================================================================== --- trunk/chorem-webmotion/src/main/webapp/js/projectPagination.js (rev 0) +++ trunk/chorem-webmotion/src/main/webapp/js/projectPagination.js 2014-02-07 16:19:35 UTC (rev 400) @@ -0,0 +1,55 @@ +angular.module('projectList', ['ngTable', 'ngResource']) +.controller('PageCtrl', + function($scope, $timeout, $resource, ngTableParams) { + + var Api = $resource('json/projects'); + + $scope.tableParams = new ngTableParams({ + page: 1, // show first page + count: 10, + sorting: { + name: 'asc' // initial sorting + } + }, { + total: 0, // length of data + getData: function($defer, params) { + + var orderedData = params.orderBy(); + + // ajax request to api + Api.get(params.url(), function(data) { + $timeout(function() { + // update table params + params.total(data.total); + // set new data + console.log(data); + $scope.projects = data.elements; + $defer.resolve(data); + }, 500); + }); + } + }); + + $scope.editId = -1; + + $scope.setEditId = function(pid) { + $scope.editId = pid; + } + +}); + +angular.module('projectList') +.directive('loadingContainer', function () { + return { + restrict: 'A', + scope: false, + link: function(scope, element, attrs) { + var loadingLayer = angular.element('<div class="loading"></div>'); + element.append(loadingLayer); + element.addClass('loading-container'); + scope.$watch(attrs.loadingContainer, function(value) { + loadingLayer.toggleClass('ng-hide', !value); + }); + } + }; +}); \ No newline at end of file