01/11: refs #882 : Initiate CRM using bootcards and angular. Working nice on easy stuff.
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 e0f1a75ecab7601c6e35b02d15d0424fc11b4974 Author: kootox <jean.couteau@gmail.com> Date: Tue Mar 3 11:19:00 2015 +0100 refs #882 : Initiate CRM using bootcards and angular. Working nice on easy stuff. --- .../webmotion/actions/crm/CompaniesAction.java | 38 ++++ .../chorem/webmotion/actions/crm/CompanyDTO.java | 45 +++++ .../actions/crm/ContactDetailsAction.java | 38 ++++ .../webmotion/actions/crm/ContactDetailsDTO.java | 54 ++++++ chorem-webmotion/src/main/resources/mapping | 4 + .../main/webapp/WEB-INF/jsp/crm/angularTest.html | 192 +++++++++++++++++++++ chorem-webmotion/src/main/webapp/js/crm.js | 72 ++++++++ 7 files changed, 443 insertions(+) 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 new file mode 100644 index 0000000..3ff8f91 --- /dev/null +++ b/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/crm/CompaniesAction.java @@ -0,0 +1,38 @@ +package org.chorem.webmotion.actions.crm; + +import org.chorem.ChoremClient; +import org.chorem.entities.Company; +import org.debux.webmotion.server.WebMotionController; +import org.debux.webmotion.server.render.Render; +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.List; + +/** + * Created by couteau on 02/03/15. + */ +public class CompaniesAction extends WebMotionController { + + public Render listCompanies(ChoremClient client) { + //recuperation des contact details + WikittyQuery companiesQuery = new WikittyQueryMaker().and() + .exteq(Company.EXT_COMPANY) + .end().setLimit(WikittyQuery.MAX); + + WikittyQueryResult<Company> companies = + client.findAllByQuery(Company.class, + companiesQuery); + + List<CompanyDTO> companyDTOs = new ArrayList<>(); + + for (Company company:companies.getAll()){ + companyDTOs.add(new CompanyDTO(company)); + } + + return renderJSON(companyDTOs); + } + +} 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 new file mode 100644 index 0000000..7e57379 --- /dev/null +++ b/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/crm/CompanyDTO.java @@ -0,0 +1,45 @@ +package org.chorem.webmotion.actions.crm; + +import org.chorem.entities.Company; + +/** + * Created by couteau on 02/03/15. + */ +public class CompanyDTO { + + protected String name; + + protected String wikittyId; + + protected String type; + + public CompanyDTO (Company company) { + this.name = company.getName(); + this.type = company.getType(); + this.wikittyId = company.getWikittyId(); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getWikittyId() { + return wikittyId; + } + + public void setWikittyId(String wikittyId) { + this.wikittyId = wikittyId; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} diff --git a/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/crm/ContactDetailsAction.java b/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/crm/ContactDetailsAction.java new file mode 100644 index 0000000..ae52c43 --- /dev/null +++ b/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/crm/ContactDetailsAction.java @@ -0,0 +1,38 @@ +package org.chorem.webmotion.actions.crm; + +import org.chorem.ChoremClient; +import org.chorem.entities.ContactDetails; +import org.debux.webmotion.server.WebMotionController; +import org.debux.webmotion.server.render.Render; +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.List; + +/** + * Created by couteau on 02/03/15. + */ +public class ContactDetailsAction extends WebMotionController { + + public Render listContactDetails(ChoremClient client, String id) { + //recuperation des contact details + WikittyQuery contactDetailsQuery = new WikittyQueryMaker().and() + .exteq(ContactDetails.EXT_CONTACTDETAILS) + .eq(ContactDetails.FQ_FIELD_CONTACTDETAILS_TARGET, id) + .end().setLimit(WikittyQuery.MAX); + + WikittyQueryResult<ContactDetails> contacts = + client.findAllByQuery(ContactDetails.class, + contactDetailsQuery); + + List<ContactDetailsDTO> contactDTOs = new ArrayList<>(); + + for (ContactDetails contact:contacts.getAll()){ + contactDTOs.add(new ContactDetailsDTO(contact)); + } + + return renderJSON(contactDTOs); + } +} diff --git a/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/crm/ContactDetailsDTO.java b/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/crm/ContactDetailsDTO.java new file mode 100644 index 0000000..1ad09eb --- /dev/null +++ b/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/crm/ContactDetailsDTO.java @@ -0,0 +1,54 @@ +package org.chorem.webmotion.actions.crm; + +import org.chorem.entities.ContactDetails; + +/** + * Created by couteau on 02/03/15. + */ +public class ContactDetailsDTO { + protected String name; + protected String type; + protected String value; + protected String target; + protected String wikittyId; + + public ContactDetailsDTO(ContactDetails contact) { + this.name = contact.getName(); + this.value = contact.getValue(); + this.type = contact.getType(); + this.target = contact.getTarget(); + this.wikittyId = contact.getWikittyId(); + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getTarget() { + return target; + } + + public void setTarget(String target) { + this.target = target; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/chorem-webmotion/src/main/resources/mapping b/chorem-webmotion/src/main/resources/mapping index e1bf470..0fd0413 100644 --- a/chorem-webmotion/src/main/resources/mapping +++ b/chorem-webmotion/src/main/resources/mapping @@ -18,6 +18,7 @@ default.render=org.debux.webmotion.server.render.DefaultRender * /hr/employeeEdit/json/* DecoratorFilter.decorate wmDecoratorNo=true * /ascii/* DecoratorFilter.decorate wmDecoratorNo=true * /rest/* DecoratorFilter.decorate wmDecoratorNo=true +* /crm/* DecoratorFilter.decorate wmDecoratorNo=true GET /* DecoratorFilter.decorate * /* AuthenticationFilter.check ##### @@ -93,6 +94,9 @@ GET /* DecoratorFilter.decorate * /crm/account/{id} action:crm.AccountAction.view * /crm/quotation/edit/{id} action:crm.QuotationAction.edit * /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}/contactDetails action:crm.ContactDetailsAction.listContactDetails 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 new file mode 100644 index 0000000..5624d4a --- /dev/null +++ b/chorem-webmotion/src/main/webapp/WEB-INF/jsp/crm/angularTest.html @@ -0,0 +1,192 @@ +<!DOCTYPE html> +<html lang="en" ng-app="crmTest"> + +<head> + <meta charset="utf-8"> + <title>CRM Bootcards Angular test</title> + <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="/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" /> + <script src="https://code.jquery.com/jquery-2.1.3.min.js"></script> +</head> + +<body> + +<div class="container bootcards-container" id="main"> + <div class="row"> + <div class="col-sm-6 bootcards-list" id="list" ng-controller="CompanyListController"> + <div class="panel panel-default"> + <div class="panel-body"> + <div class="search-form"> + <div class="row"> + <div class="col-xs-9"> + <div class="form-group"> + <input type="text" class="form-control" placeholder="Search Companies..." + ng-model="search" ng-change="updateList()"> + <i class="fa fa-search"></i> + </div> + </div> + <div class="col-xs-3"> + <a class="btn btn-primary btn-block" href="#"> + <i class="fa fa-plus"></i> + <span>Add</span> + </a> + </div> + </div> + </div> + </div> + + <div class="list-group"> + <a class="list-group-item" href="#" + ng-repeat="company in filteredCompanies | orderBy:'name' " + ng-class="{'active':isCompanySelected(company)}" + ng-click="setCompanySelected(company)"> + <i class="fa fa-3x fa-building-o pull-left"></i> + <h4 class="list-group-item-heading">{{company.name}}</h4> + <p class="list-group-item-text">{{company.type}} </p> + </a> + + </div> + + <div class="panel-footer"> + <small class="pull-left"> </small> + </div> + + </div> + + </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> + + <!--employees card --> + <%@include file="cards/employeesListCard.jsp" %> + </div> + + </div> + +</div> + +<!-- Load the required JavaScript libraries --> + +<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script> +<script src="//cdnjs.cloudflare.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js"></script> + +<!-- Bootcards JS file --> +<script src="https://cdnjs.cloudflare.com/ajax/libs/bootcards/1.1.0/js/bootcards.js"></script> + +<!--modals--> +<div class="modal fade" id="editModal" tabindex="-1" role="dialog" aria-labelledby="editModal" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"></div> + </div> +</div> + +<div class="modal fade" id="docsModal" tabindex="-1" role="dialog" aria-labelledby="docsModal" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"></div> + </div> +</div> + +<script type="text/javascript"> + /* + * Initialize Bootcards. + * + * Parameters: + * - offCanvasBackdrop (boolean): show a backdrop when the offcanvas is shown + * - offCanvasHideOnMainClick (boolean): hide the offcanvas menu on clicking outside the off canvas + * - enableTabletPortraitMode (boolean): enable single pane mode for tablets in portraitmode + * - disableRubberBanding (boolean): disable the iOS rubber banding effect + * - disableBreakoutSelector (boolean) : for iOS apps that are added to the home screen: + jQuery selector to target links for which a fix should be added to not + allow those links to break out of fullscreen mode. + */ + + bootcards.init( { + offCanvasBackdrop : true, + offCanvasHideOnMainClick : true, + enableTabletPortraitMode : true, + disableRubberBanding : true + }); + </script> + +</body> diff --git a/chorem-webmotion/src/main/webapp/js/crm.js b/chorem-webmotion/src/main/webapp/js/crm.js new file mode 100644 index 0000000..95cb0ae --- /dev/null +++ b/chorem-webmotion/src/main/webapp/js/crm.js @@ -0,0 +1,72 @@ +var crmTest = angular.module('crmTest', []); + +crmTest.factory('sharedService', function($rootScope){ + var sharedService = {}; + + sharedService.company = ''; + + sharedService.broadcastCompanySelected = function (company) { + this.company = company; + $rootScope.$broadcast('companySelected'); + } + + return sharedService; + +}); + +crmTest.controller('CompanyListController', function ($scope, $http, sharedService) { + + $http.get('companies').success(function(data){ + $scope.companies = data; + $scope.companySelected=$scope.companies[0]; + sharedService.broadcastCompanySelected($scope.companySelected); + $scope.updateList(); + }); + + $scope.companies = ''; + + $scope.filteredCompanies = $scope.companies; + + $scope.search=""; + + $scope.companySelected=$scope.companies[0]; + + $scope.setCompanySelected=function(selectedCompany){ + $scope.companySelected = selectedCompany; + sharedService.broadcastCompanySelected(selectedCompany); + }; + + $scope.isCompanySelected=function(selectedCompany){ + return selectedCompany===$scope.companySelected; + }; + + $scope.updateList=function(){ + $scope.filteredCompanies=[]; + for (var index in $scope.companies) { + var company = $scope.companies[index]; + if (company.name.indexOf($scope.search)>-1){ + $scope.filteredCompanies.push(company); + } + } + } + +}); + +crmTest.controller('CompanyDetailsController', function ($scope, $http, sharedService){ + $scope.company = ''; + + $scope.contactDetails = ''; + + $scope.$on('companySelected', function(){ + $scope.company=sharedService.company; + $scope.updateContactDetails(); + }); + + $scope.updateContactDetails=function(){ + $http.get('companies/'+$scope.company.wikittyId+"/contactDetails").success(function(data){ + $scope.contactDetails = data; + }); + + }; + +}); \ No newline at end of file -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.
participants (1)
-
chorem.org scm