This is an automated email from the git hooks/post-receive script. New commit to branch feature/882-angular in repository chorem. See http://git.chorem.org/chorem.git commit abacf7db1aa21d2a75413ec193a01e02abea47df Author: kootox <jean.couteau@gmail.com> Date: Wed Mar 4 12:20:57 2015 +0100 refs #882 : Working companies CRUD, but parasite refreshs to be dealt with --- .../webmotion/actions/crm/CompaniesAction.java | 34 +++++- .../chorem/webmotion/actions/crm/CompanyDTO.java | 8 ++ chorem-webmotion/src/main/resources/mapping | 6 + .../main/webapp/WEB-INF/jsp/crm/angularTest.html | 88 +-------------- .../jsp/crm/partials/companyCreateCard.html | 43 ++++++++ .../WEB-INF/jsp/crm/partials/companyEditCard.html | 46 ++++++++ .../WEB-INF/jsp/crm/partials/companyInfoCard.html | 29 +++++ .../WEB-INF/jsp/crm/partials/companyPanel.html | 13 +++ .../jsp/crm/partials/contactDetailsListCard.html | 29 +++++ chorem-webmotion/src/main/webapp/js/crm.js | 122 +++++++++++++++++---- 10 files changed, 314 insertions(+), 104 deletions(-) diff --git a/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/crm/CompaniesAction.java b/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/crm/CompaniesAction.java index 3ff8f91..59bdaed 100644 --- a/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/crm/CompaniesAction.java +++ b/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/crm/CompaniesAction.java @@ -2,6 +2,7 @@ package org.chorem.webmotion.actions.crm; import org.chorem.ChoremClient; import org.chorem.entities.Company; +import org.chorem.entities.CompanyImpl; import org.debux.webmotion.server.WebMotionController; import org.debux.webmotion.server.render.Render; import org.nuiton.wikitty.query.WikittyQuery; @@ -20,7 +21,8 @@ public class CompaniesAction extends WebMotionController { //recuperation des contact details WikittyQuery companiesQuery = new WikittyQueryMaker().and() .exteq(Company.EXT_COMPANY) - .end().setLimit(WikittyQuery.MAX); + .end().setLimit(WikittyQuery.MAX) + .addSortAscending(Company.ELEMENT_FIELD_COMPANY_NAME); WikittyQueryResult<Company> companies = client.findAllByQuery(Company.class, @@ -35,4 +37,34 @@ public class CompaniesAction extends WebMotionController { return renderJSON(companyDTOs); } + public Render getCompany(ChoremClient client, String id) { + Company company = client.restore(Company.class, id); + CompanyDTO companyDTO = new CompanyDTO(company); + + return renderJSON(companyDTO); + } + + public Render updateCompany(ChoremClient client, String id, CompanyDTO companyDTO) { + Company company = client.restore(Company.class, id); + company.setName(companyDTO.getName()); + company.setType(companyDTO.getType()); + client.store(company); + + return renderSuccess(); + } + + public Render createCompany(ChoremClient client, CompanyDTO companyDTO) { + Company company = new CompanyImpl(); + company.setName(companyDTO.getName()); + company.setType(companyDTO.getType()); + client.store(company); + return renderJSON(company.getWikittyId()); + } + + public Render deleteCompany(ChoremClient client, String id) { + client.delete(id); + + return renderSuccess(); + } + } diff --git a/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/crm/CompanyDTO.java b/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/crm/CompanyDTO.java index 7e57379..f10acdc 100644 --- a/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/crm/CompanyDTO.java +++ b/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/crm/CompanyDTO.java @@ -13,6 +13,14 @@ public class CompanyDTO { protected String type; + public CompanyDTO () { + } + + public CompanyDTO(String name, String type) { + this.name = name; + this.type = type; + } + public CompanyDTO (Company company) { this.name = company.getName(); this.type = company.getType(); diff --git a/chorem-webmotion/src/main/resources/mapping b/chorem-webmotion/src/main/resources/mapping index 0fd0413..a6c90d5 100644 --- a/chorem-webmotion/src/main/resources/mapping +++ b/chorem-webmotion/src/main/resources/mapping @@ -96,7 +96,13 @@ GET /* DecoratorFilter.decorate * /crm/export action:crm.ExportAction.exportContactBase GET /crm/companies.html view:crm/angularTest.html GET /crm/companies action:crm.CompaniesAction.listCompanies +GET /crm/companies/{id} action:crm.CompaniesAction.getCompany +POST /crm/companies/{id} action:crm.CompaniesAction.updateCompany +PUT /crm/companies/add action:crm.CompaniesAction.createCompany + +DELETE /crm/companies/{id} action:crm.CompaniesAction.deleteCompany GET /crm/companies/{id}/contactDetails action:crm.ContactDetailsAction.listContactDetails +GET /crm/partials/{page} view:crm/partials/{page} GET /rest/project/projects?page={page}&count={count} action:project.ProjectsAction.findAllProjects page=1,count=10 GET /project/projects view:projects/projects.jsp diff --git a/chorem-webmotion/src/main/webapp/WEB-INF/jsp/crm/angularTest.html b/chorem-webmotion/src/main/webapp/WEB-INF/jsp/crm/angularTest.html index 5624d4a..daec9fe 100644 --- a/chorem-webmotion/src/main/webapp/WEB-INF/jsp/crm/angularTest.html +++ b/chorem-webmotion/src/main/webapp/WEB-INF/jsp/crm/angularTest.html @@ -7,6 +7,7 @@ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script> + <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular-route.js"></script> <script src="/chorem/js/crm.js"></script> <link href="https://cdnjs.cloudflare.com/ajax/libs/bootcards/1.1.0/css/bootcards-desktop..." rel="stylesheet"> <link href="https://netdna.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet" /> @@ -30,7 +31,7 @@ </div> </div> <div class="col-xs-3"> - <a class="btn btn-primary btn-block" href="#"> + <a class="btn btn-primary btn-block" href="#/companies/add"> <i class="fa fa-plus"></i> <span>Add</span> </a> @@ -40,8 +41,8 @@ </div> <div class="list-group"> - <a class="list-group-item" href="#" - ng-repeat="company in filteredCompanies | orderBy:'name' " + <a class="list-group-item" href="#/companies/{{company.wikittyId}}" + ng-repeat="company in filteredCompanies" ng-class="{'active':isCompanySelected(company)}" ng-click="setCompanySelected(company)"> <i class="fa fa-3x fa-building-o pull-left"></i> @@ -59,87 +60,8 @@ </div> - <div class="col-sm-6 bootcards-cards" id="listDetails" ng-controller="CompanyDetailsController"> - <!-- company info card --> - <div id="companyCard"> - - <div class="panel panel-default"> - <div class="panel-heading clearfix"> - <h3 class="panel-title pull-left">Détails de la société</h3> - <div class="btn-group pull-right visible-xs"> - <a class="btn btn-primary" href="#" - data-toggle="modal" - data-target="#editModal"> - <i class="fa fa-pencil"></i> - <span>Edit</span> - </a> - </div> - <a class="btn btn-primary pull-right hidden-xs" href="#" - data-toggle="modal" - data-target="#editModal"> - <i class="fa fa-pencil"></i> - <span>Edit</span> - </a> - </div> - <div class="list-group"> - <div class="list-group-item"> - <i class="fa fa-2x fa-building-o pull-left"></i> - <label>Nom</label> - <h4 class="list-group-item-heading">{{company.name}}</h4> - </div> - <div class="list-group-item"> - <label>Type</label> - <h4 class="list-group-item-heading">{{company.type}}</h4> - </div> - </div> - <div class="panel-footer"> - <small class="pull-left"> </small> - </div> - </div> - - </div> - - <!-- contact details card --> - <div id="contactDetailsListCard"> - - <div class="panel panel-default"> - <div class="panel-heading clearfix"> - <h3 class="panel-title pull-left">Moyens de contact</h3> - <div class="btn-group pull-right visible-xs"> - <a class="btn btn-primary" href="#" - data-toggle="modal" - data-target="#editModal"> - <i class="fa fa-pencil"></i> - <span>Edit</span> - </a> - </div> - <a class="btn btn-primary pull-right hidden-xs" href="#" - data-toggle="modal" - data-target="#editModal"> - <i class="fa fa-pencil"></i> - <span>Edit</span> - </a> - </div> - <div class="list-group"> - <div class="list-group-item" - ng-repeat="contact in contactDetails"> - <label>{{contact.type}} - {{contact.name}}</label> - <h4 class="list-group-item-heading">{{contact.value}}</h4> - </div> - </div> - <div class="panel-footer"> - <small class="pull-left"> </small> - </div> - </div> - </div> - - <!-- notes card --> - <div id="notesListCard"> - <%@include file="cards/notesListCard.jsp" %> - </div> + <div class="col-sm-6 bootcards-cards" id="listDetails" ng-view> - <!--employees card --> - <%@include file="cards/employeesListCard.jsp" %> </div> </div> diff --git a/chorem-webmotion/src/main/webapp/WEB-INF/jsp/crm/partials/companyCreateCard.html b/chorem-webmotion/src/main/webapp/WEB-INF/jsp/crm/partials/companyCreateCard.html new file mode 100644 index 0000000..f384092 --- /dev/null +++ b/chorem-webmotion/src/main/webapp/WEB-INF/jsp/crm/partials/companyCreateCard.html @@ -0,0 +1,43 @@ +<div class="panel panel-default"> + + <div class="panel-heading clearfix"> + <h3 class="panel-title pull-left">Créer une entreprise</h3> + <div class="btn-group pull-right"> + <button class="btn btn-danger" ng-click="cancel()"> + <i class="fa fa-times"></i> + Annuler + </button> + <button class="btn btn-success" ng-click="saveCompany()"> + <i class="fa fa-check"></i> + Sauver + </button> + </div> + </div> + + <div class="modal-body"> + <form class="form-horizontal"> + <div class="form-group"> + <label class="col-xs-3 control-label">Nom</label> + <div class="col-xs-9"> + <input type="text" class="form-control" ng-model="company.name"> + </div> + </div> + + <div class="form-group"> + <label class="col-xs-3 control-label">Type</label> + <div class="col-xs-9"> + <input type="text" class="form-control" ng-model="company.type"> + </div> + </div> + + </form> + </div> + + <div class="modal-footer"> + + </div> + + <div class="panel-footer"> + + </div> +</div> \ No newline at end of file diff --git a/chorem-webmotion/src/main/webapp/WEB-INF/jsp/crm/partials/companyEditCard.html b/chorem-webmotion/src/main/webapp/WEB-INF/jsp/crm/partials/companyEditCard.html new file mode 100644 index 0000000..74ff087 --- /dev/null +++ b/chorem-webmotion/src/main/webapp/WEB-INF/jsp/crm/partials/companyEditCard.html @@ -0,0 +1,46 @@ +<div class="panel panel-default"> + + <div class="panel-heading clearfix"> + <h3 class="panel-title pull-left">Éditer une entreprise</h3> + <div class="btn-group pull-right"> + <button class="btn btn-danger" ng-click="cancel()"> + <i class="fa fa-times"></i> + Annuler + </button> + <button class="btn btn-success" ng-click="saveCompany()"> + <i class="fa fa-check"></i> + Sauver + </button> + </div> + </div> + + <div class="modal-body"> + <form class="form-horizontal"> + <div class="form-group"> + <label class="col-xs-3 control-label">Nom</label> + <div class="col-xs-9"> + <input type="text" class="form-control" ng-model="company.name"> + </div> + </div> + + <div class="form-group"> + <label class="col-xs-3 control-label">Type</label> + <div class="col-xs-9"> + <input type="text" class="form-control" ng-model="company.type"> + </div> + </div> + + </form> + </div> + + <div class="modal-footer"> + <button class="btn btn-danger btn-block" ng-click="deleteCompany()"> + <i class="fa fa-trash-o"></i> + Supprimer la société + </button> + </div> + + <div class="panel-footer"> + + </div> +</div> \ No newline at end of file diff --git a/chorem-webmotion/src/main/webapp/WEB-INF/jsp/crm/partials/companyInfoCard.html b/chorem-webmotion/src/main/webapp/WEB-INF/jsp/crm/partials/companyInfoCard.html new file mode 100644 index 0000000..e6bc455 --- /dev/null +++ b/chorem-webmotion/src/main/webapp/WEB-INF/jsp/crm/partials/companyInfoCard.html @@ -0,0 +1,29 @@ +<div class="panel panel-default"> + <div class="panel-heading clearfix"> + <h3 class="panel-title pull-left">Détails de la société</h3> + <div class="btn-group pull-right visible-xs"> + <a class="btn btn-primary" href="#/companies/{{company.wikittyId}}/edit"> + <i class="fa fa-pencil"></i> + <span>Edit</span> + </a> + </div> + <a class="btn btn-primary pull-right hidden-xs" href="#/companies/{{company.wikittyId}}/edit"> + <i class="fa fa-pencil"></i> + <span>Edit</span> + </a> + </div> + <div class="list-group"> + <div class="list-group-item"> + <i class="fa fa-2x fa-building-o pull-left"></i> + <label>Nom</label> + <h4 class="list-group-item-heading">{{company.name}}</h4> + </div> + <div class="list-group-item"> + <label>Type</label> + <h4 class="list-group-item-heading">{{company.type}}</h4> + </div> + </div> + <div class="panel-footer"> + <small class="pull-left"> </small> + </div> +</div> \ No newline at end of file diff --git a/chorem-webmotion/src/main/webapp/WEB-INF/jsp/crm/partials/companyPanel.html b/chorem-webmotion/src/main/webapp/WEB-INF/jsp/crm/partials/companyPanel.html new file mode 100644 index 0000000..86a1f7e --- /dev/null +++ b/chorem-webmotion/src/main/webapp/WEB-INF/jsp/crm/partials/companyPanel.html @@ -0,0 +1,13 @@ +<!-- company info card --> +<ng-include src="'partials/companyInfoCard.html'"></ng-include> + +<!-- contact details card --> +<ng-include src="'partials/contactDetailsListCard.html'"></ng-include> + +<!-- notes card --> +<div id="notesListCard"> + <%@include file="cards/notesListCard.jsp" %> +</div> + +<!--employees card --> +<%@include file="cards/employeesListCard.jsp" %> \ No newline at end of file diff --git a/chorem-webmotion/src/main/webapp/WEB-INF/jsp/crm/partials/contactDetailsListCard.html b/chorem-webmotion/src/main/webapp/WEB-INF/jsp/crm/partials/contactDetailsListCard.html new file mode 100644 index 0000000..39b54b9 --- /dev/null +++ b/chorem-webmotion/src/main/webapp/WEB-INF/jsp/crm/partials/contactDetailsListCard.html @@ -0,0 +1,29 @@ +<div class="panel panel-default"> + <div class="panel-heading clearfix"> + <h3 class="panel-title pull-left">Moyens de contact</h3> + <div class="btn-group pull-right visible-xs"> + <a class="btn btn-primary" href="#" + data-toggle="modal" + data-target="#editModal"> + <i class="fa fa-pencil"></i> + <span>Edit</span> + </a> + </div> + <a class="btn btn-primary pull-right hidden-xs" href="#" + data-toggle="modal" + data-target="#editModal"> + <i class="fa fa-pencil"></i> + <span>Edit</span> + </a> + </div> + <div class="list-group"> + <div class="list-group-item" + ng-repeat="contact in contactDetails"> + <label>{{contact.type}} - {{contact.name}}</label> + <h4 class="list-group-item-heading">{{contact.value}}</h4> + </div> + </div> + <div class="panel-footer"> + <small class="pull-left"> </small> + </div> +</div> \ No newline at end of file diff --git a/chorem-webmotion/src/main/webapp/js/crm.js b/chorem-webmotion/src/main/webapp/js/crm.js index 95cb0ae..041252d 100644 --- a/chorem-webmotion/src/main/webapp/js/crm.js +++ b/chorem-webmotion/src/main/webapp/js/crm.js @@ -1,25 +1,41 @@ -var crmTest = angular.module('crmTest', []); +var crmTest = angular.module('crmTest', ['ngRoute']); -crmTest.factory('sharedService', function($rootScope){ - var sharedService = {}; +crmTest.config(['$routeProvider', + function($routeProvider){ + $routeProvider. - sharedService.company = ''; + when('/companies', { + templateUrl:'partials/companyPanel.html', + controller:'CompanyDetailController'}). - sharedService.broadcastCompanySelected = function (company) { - this.company = company; - $rootScope.$broadcast('companySelected'); - } + when('/companies/add', { + templateUrl:'partials/companyCreateCard.html', + controller:'CompanyCreateController'}). - return sharedService; + when('/companies/:companyId', { + templateUrl:'partials/companyPanel.html', + controller:'CompanyDetailController'}). -}); + when('/companies/:companyId/edit', { + templateUrl:'partials/companyEditCard.html', + controller:'CompanyEditController'}); + }]); -crmTest.controller('CompanyListController', function ($scope, $http, sharedService) { +crmTest.controller('CompanyListController', function ($scope, $http, $location, $route, $routeParams) { $http.get('companies').success(function(data){ $scope.companies = data; - $scope.companySelected=$scope.companies[0]; - sharedService.broadcastCompanySelected($scope.companySelected); + if ($routeParams.companyId){ + //company selected + //$scope.companySelected=$scope.companies[0]; + $location.path('companies/'+$routeParams.companyId); + $route.reload(); + } else { + $scope.companySelected=$scope.companies[0]; + $location.path('companies/'+$scope.companySelected.wikittyId); + $route.reload(); + } + $scope.updateList(); }); @@ -33,7 +49,6 @@ crmTest.controller('CompanyListController', function ($scope, $http, sharedServi $scope.setCompanySelected=function(selectedCompany){ $scope.companySelected = selectedCompany; - sharedService.broadcastCompanySelected(selectedCompany); }; $scope.isCompanySelected=function(selectedCompany){ @@ -52,21 +67,88 @@ crmTest.controller('CompanyListController', function ($scope, $http, sharedServi }); -crmTest.controller('CompanyDetailsController', function ($scope, $http, sharedService){ - $scope.company = ''; +crmTest.controller('CompanyDetailController', function ($scope, $http, $routeParams){ - $scope.contactDetails = ''; + //get back id from params + $scope.companyId = $routeParams.companyId; - $scope.$on('companySelected', function(){ - $scope.company=sharedService.company; + //get company data + $http.get('companies/'+$scope.companyId).success(function(data){ + $scope.company = data; $scope.updateContactDetails(); }); +//init values with empty data for no angular marking + $scope.company = ''; + $scope.contactDetails = ''; + + //get back contact details for the company $scope.updateContactDetails=function(){ - $http.get('companies/'+$scope.company.wikittyId+"/contactDetails").success(function(data){ + $http.get('companies/'+$scope.companyId+"/contactDetails").success(function(data){ $scope.contactDetails = data; }); + }; + +}); + +crmTest.controller('CompanyEditController', function ($scope, $http, $routeParams, $location, $route) { + + //get back id from params + $scope.companyId = $routeParams.companyId; + //get company data + $http.get('companies/'+$scope.companyId).success(function(data){ + $scope.company = data; + }); + + $scope.saveCompany = function(){ + + $http({ + method : 'POST', + url : 'companies/'+$scope.companyId, + data : $.param($scope.company), // pass in data as strings + headers : { 'Content-Type': 'application/x-www-form-urlencoded' } // set the headers so angular passing info as form data (not request payload) + }) + .success(function(data) { + $location.path('companies/'+$scope.companyId); + $route.reload(); + }); }; + $scope.cancel = function(){ + $location.path('companies/'+$scope.companyId); + $route.reload(); + } + + $scope.deleteCompany = function(){ + if(confirm('Are you sure you want to delete?')){ + $http.delete('companies/'+$scope.companyId).success(function(data){ + $location.path('companies'); + $route.reload(); + }); + } + } + +}); + +crmTest.controller('CompanyCreateController', function ($scope, $http, $location, $route) { + + $scope.saveCompany = function(){ + $http({ + method : 'PUT', + url : 'companies/add', + data : $.param($scope.company), // pass in data as strings + headers : { 'Content-Type': 'application/x-www-form-urlencoded' } // set the headers so angular passing info as form data (not request payload) + }) + .success(function(data) { + $location.path('companies/'+data); + $route.reload(); + }); + }; + + $scope.cancel = function(){ + $location.path('companies/'); + $route.reload(); + } + }); \ No newline at end of file -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.