[pollen] branch develop updated (ba28395 -> aa2f89f)
This is an automated email from the git hooks/post-receive script. New change to branch develop in repository pollen. See http://git.chorem.org/pollen.git from ba28395 update angular version to 1.2.21 new ae7b9d2 UI check the maxChoiceNumber for limitdVote in pollType Normal new aa2f89f Server verify the limitedVote if nbChoice < maxChoiceNumber The 2 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit aa2f89f8de73c2af3fa2806f1f78309ab1b8da1f Author: Adrien Garandel <a.garandel@dralagen.fr> Date: Tue Aug 12 15:20:06 2014 +0200 Server verify the limitedVote if nbChoice < maxChoiceNumber commit ae7b9d2bf3e5f3978dc4b36c2facd12f505a6d56 Author: Adrien Garandel <a.garandel@dralagen.fr> Date: Tue Aug 12 12:10:59 2014 +0200 UI check the maxChoiceNumber for limitdVote in pollType Normal Summary of changes: .../services/service/VoteCountingService.java | 21 ++-- .../pollen/services/service/VoteService.java | 16 ++- .../i18n/pollen-services_en_GB.properties | 1 + .../i18n/pollen-services_fr_FR.properties | 3 +- pollen-ui-angular/src/main/webapp/i18n/en.js | 1 + pollen-ui-angular/src/main/webapp/i18n/fr.js | 1 + .../src/main/webapp/js/controllers/pollCtrl.js | 120 ++++++++++++++------- .../src/main/webapp/partials/poll-info.html | 4 + .../src/main/webapp/partials/poll-settings.html | 2 +- .../pollen/votecounting/CondorcetVoteCounting.java | 2 +- 10 files changed, 119 insertions(+), 52 deletions(-) -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository pollen. See http://git.chorem.org/pollen.git commit ae7b9d2bf3e5f3978dc4b36c2facd12f505a6d56 Author: Adrien Garandel <a.garandel@dralagen.fr> Date: Tue Aug 12 12:10:59 2014 +0200 UI check the maxChoiceNumber for limitdVote in pollType Normal --- pollen-ui-angular/src/main/webapp/i18n/en.js | 1 + pollen-ui-angular/src/main/webapp/i18n/fr.js | 1 + .../src/main/webapp/js/controllers/pollCtrl.js | 99 ++++++++++++++-------- .../src/main/webapp/partials/poll-info.html | 4 + 4 files changed, 70 insertions(+), 35 deletions(-) diff --git a/pollen-ui-angular/src/main/webapp/i18n/en.js b/pollen-ui-angular/src/main/webapp/i18n/en.js index 78fd1e5..d7ebbaa 100644 --- a/pollen-ui-angular/src/main/webapp/i18n/en.js +++ b/pollen-ui-angular/src/main/webapp/i18n/en.js @@ -125,6 +125,7 @@ var translateEN = { 'poll.info.addChoiceAllowed.waring' : 'The period for adding choice and vote overlays', 'poll.info.addChoiceAllowed.waring.help' : 'Votes may can\'t be representative of reality', 'poll.info.vote.noViewChoice' : 'This choice does not exist in the vote', +'poll.info.limitedChoice' : 'This poll has limited the number of choices at {{nb}} choice(s)', 'poll.error.noResource' : 'No resource has send', 'poll.error.listEmpty' : 'No poll find', diff --git a/pollen-ui-angular/src/main/webapp/i18n/fr.js b/pollen-ui-angular/src/main/webapp/i18n/fr.js index c6670dd..6238511 100644 --- a/pollen-ui-angular/src/main/webapp/i18n/fr.js +++ b/pollen-ui-angular/src/main/webapp/i18n/fr.js @@ -125,6 +125,7 @@ var translateFR = { 'poll.info.addChoiceAllowed.waring' : 'La période d\'ajout de choix et de vote se superpose', 'poll.info.addChoiceAllowed.waring.help' : 'Les votes peuvent ne pas être représentatif de la réalité.', 'poll.info.vote.noViewChoice' : 'Ce choix n\'existait pas lors du vote', +'poll.info.limitedChoice' : 'Le nombre de choix est limité à {{nb}} choix', 'poll.error.noResource' : 'Aucune ressource a envoyer', 'poll.error.listEmpty' : 'Aucun sondage trouvé', diff --git a/pollen-ui-angular/src/main/webapp/js/controllers/pollCtrl.js b/pollen-ui-angular/src/main/webapp/js/controllers/pollCtrl.js index 29d2336..d557d2a 100644 --- a/pollen-ui-angular/src/main/webapp/js/controllers/pollCtrl.js +++ b/pollen-ui-angular/src/main/webapp/js/controllers/pollCtrl.js @@ -140,6 +140,7 @@ angular.module('pollControllers', ['ngRoute', 'pollenServices', 'pascalprecht.tr pollDeferred.promise.then(function () { setVoteCountingType(); + $scope.data.poll.limitedVote = $scope.data.poll.maxChoiceNumber > 0; }); pollDeferred.promise.then(function () { @@ -236,7 +237,7 @@ angular.module('pollControllers', ['ngRoute', 'pollenServices', 'pascalprecht.tr if (angular.isDate(choice.choiceValue)) { choice.choiceValue = choice.choiceValue.getTime(); } - else { + else if (!angular.isNumber(choice.choiceValue)) { choice.choiceValue = null; } } @@ -778,8 +779,8 @@ angular.module('pollControllers', ['ngRoute', 'pollenServices', 'pascalprecht.tr var poll = angular.copy($scope.data.poll); poll.choice = angular.copy($scope.data.choices); - angular.forEach(poll.choice, function(choice) { - choice = $scope.preSendChoice(choice); + angular.forEach(poll.choice, function(choice, key) { + poll.choice[key] = $scope.preSendChoice(choice); }); if (angular.isDate(poll.beginDate)) { @@ -796,6 +797,10 @@ angular.module('pollControllers', ['ngRoute', 'pollenServices', 'pascalprecht.tr poll.endChoiceDate = poll.endChoiceDate.getTime(); } + if (! poll.limitedVote) { + poll.maxChoiceNumber = 0; + } + Poll.add(poll, function (data) { $rootScope.$broadcast('newInfo', $filter('translate')('poll.created.printLink', {url: @@ -936,7 +941,7 @@ angular.module('pollControllers', ['ngRoute', 'pollenServices', 'pascalprecht.tr } var vl = {group: voterList.group, members:[]}; - angular.forEach(voterList.members, function(member, key) { + angular.forEach(voterList.members, function(member) { if (!$scope.memberIsEmpty(member)) { vl.members.push(member); } @@ -1027,7 +1032,7 @@ angular.module('pollControllers', ['ngRoute', 'pollenServices', 'pascalprecht.tr }).then( function () { var confirmDelete = confirm(confirmMessage); if (confirmDelete == true) { - PollVoterList.remove({pollId:$routeParams.pollId, permission:$scope.globalVariables.pollToken, voterListId:voterList.group.id}, function (data) { + PollVoterList.remove({pollId:$routeParams.pollId, permission:$scope.globalVariables.pollToken, voterListId:voterList.group.id}, function () { var index = $scope.data.voterList.indexOf(voterList); $scope.data.voterList.splice(index, 1); if ($scope.data.voterList.length == 0 && $scope.data.poll.pollType == 'RESTRICTED') { @@ -1075,10 +1080,10 @@ angular.module('pollControllers', ['ngRoute', 'pollenServices', 'pascalprecht.tr initVoterList(); PollChoice.query({pollId:$routeParams.pollId, permission:$scope.globalVariables.pollToken}).$promise.then(function (choices) { - $scope.data.choices = choices; - angular.forEach(choices, function (ch) { - ch = $scope.postReceiveChoice(ch); + angular.forEach(choices, function (ch, key) { + choices[key] = $scope.postReceiveChoice(ch); }); + $scope.data.choices = choices; $scope.data.vote = {}; $scope.data.vote.choice = angular.copy($scope.data.choices); }); @@ -1152,8 +1157,8 @@ angular.module('pollControllers', ['ngRoute', 'pollenServices', 'pascalprecht.tr } var pollChoicePromise = PollChoice.query({pollId:$routeParams.pollId}, function (choices) { - angular.forEach(choices, function (ch) { - ch = $scope.postReceiveChoice(ch); + angular.forEach(choices, function (ch, key) { + choices[key] = $scope.postReceiveChoice(ch); }); $scope.data.choices = choices; @@ -1335,18 +1340,24 @@ angular.module('pollControllers', ['ngRoute', 'pollenServices', 'pascalprecht.tr }; $scope.toggleVoteValue = function (choice, onEdit, event) { - if (onEdit) { - if ($scope.voteCountingIsBoolean()) { - if (choice.voteValue == null) { - choice.voteValue = true; - } - else { - choice.voteValue = !choice.voteValue; - } - if (angular.isDefined(event)) { - event.stopPropagation(); + if (onEdit && $scope.voteCountingIsBoolean()) { + if (choice.voteValue == false && $scope.data.poll.maxChoiceNumber > 0) { + // compte number of choice + var myVote = $.grep($scope.data.votants, function(e) { return e.id == oldVote.id; }); + myVote = myVote[0]; + var nbChoice = 0; + angular.forEach(myVote.choice, function (ch) { + if (ch.voteValue) { + nbChoice++; + } + }); + if (nbChoice < $scope.data.poll.maxChoiceNumber) { + toggleValue(choice,event); } } + else { + toggleValue(choice, event); + } } }; @@ -1372,17 +1383,33 @@ angular.module('pollControllers', ['ngRoute', 'pollenServices', 'pascalprecht.tr $scope.toggleValue = function (choice, event) { if ($scope.voteCountingIsBoolean()) { - if (choice.voteValue == null) { - choice.voteValue = true; - } - else { - choice.voteValue = !choice.voteValue; - } - if (angular.isDefined(event)) { - event.stopPropagation(); + if (choice.voteValue == false && $scope.data.poll.maxChoiceNumber > 0) { + var nbChoice = 0; + angular.forEach($scope.data.vote.choice, function (ch) { + if (ch.voteValue) { + nbChoice++; + } + }); + if (nbChoice < $scope.data.poll.maxChoiceNumber) { + toggleValue(choice,event); + } + } else { + toggleValue(choice, event); } } - } + }; + + var toggleValue = function (choice, event) { + if (choice.voteValue == null) { + choice.voteValue = true; + } + else { + choice.voteValue = !choice.voteValue; + } + if (angular.isDefined(event)) { + event.stopPropagation(); + } + }; }]) @@ -1590,8 +1617,8 @@ angular.module('pollControllers', ['ngRoute', 'pollenServices', 'pascalprecht.tr var choicesDeferred = $q.defer(); PollChoice.query({pollId:$routeParams.pollId}, function (choices) { $scope.data.choices = choices; - angular.forEach(choices, function (choice) { - choice = $scope.postReceiveChoice(choice); + angular.forEach(choices, function (choice, key) { + choices[key] = $scope.postReceiveChoice(choice); }); choicesDeferred.resolve('choices load'); }); @@ -1742,11 +1769,13 @@ angular.module('pollControllers', ['ngRoute', 'pollenServices', 'pascalprecht.tr // check the global right $scope.globalVariables.hasAllRight = true; for (var pollIndex in $scope.data.polls) { - var poll = $scope.data.polls[pollIndex]; + if ($scope.data.polls.hasOwnProperty(pollIndex)) { + var poll = $scope.data.polls[pollIndex]; - if (angular.isUndefined(poll.permission)) { - $scope.globalVariables.hasAllRight = false; - break; + if (angular.isUndefined(poll.permission)) { + $scope.globalVariables.hasAllRight = false; + break; + } } } diff --git a/pollen-ui-angular/src/main/webapp/partials/poll-info.html b/pollen-ui-angular/src/main/webapp/partials/poll-info.html index 377d2f0..62f4ad3 100644 --- a/pollen-ui-angular/src/main/webapp/partials/poll-info.html +++ b/pollen-ui-angular/src/main/webapp/partials/poll-info.html @@ -30,4 +30,8 @@ <p> {{ 'poll.info.addChoiceAllowed.waring.help' | translate }} </p> +</div> + +<div ng-if="data.poll.limitedVote"> + <h4>{{ 'poll.info.limitedChoice' | translate:{'nb':data.poll.maxChoiceNumber} }}</h4> </div> \ No newline at end of file -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository pollen. See http://git.chorem.org/pollen.git commit aa2f89f8de73c2af3fa2806f1f78309ab1b8da1f Author: Adrien Garandel <a.garandel@dralagen.fr> Date: Tue Aug 12 15:20:06 2014 +0200 Server verify the limitedVote if nbChoice < maxChoiceNumber --- .../services/service/VoteCountingService.java | 21 ++++++++++++--------- .../chorem/pollen/services/service/VoteService.java | 16 +++++++++++++++- .../resources/i18n/pollen-services_en_GB.properties | 1 + .../resources/i18n/pollen-services_fr_FR.properties | 3 ++- .../src/main/webapp/js/controllers/pollCtrl.js | 21 +++++++++++++++++---- .../src/main/webapp/partials/poll-settings.html | 2 +- .../pollen/votecounting/CondorcetVoteCounting.java | 2 +- 7 files changed, 49 insertions(+), 17 deletions(-) diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteCountingService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteCountingService.java index e469da1..9ecddb2 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteCountingService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteCountingService.java @@ -259,18 +259,21 @@ public class VoteCountingService extends PollenServiceSupport { Double total = null; for(VoteToChoiceBean choice: vote.getChoice()) { - if (choice.getVoteValue() != null) { - if (total == null) { - total = 0.0; - } - total += choice.getVoteValue(); + if (voteCounting.isVoteValueNull(choice.getVoteValue())) { + continue; + } - check(errors, - "voteValue[" + choice.getChoiceId().getReducedId() + "]", - voteCounting.isVoteValueValid(choice.getVoteValue()), - l(getLocale(), "pollen.error.vote.voteValue.invalid")); + if (total == null) { + total = 0.0; } + + total += choice.getVoteValue(); + + check(errors, + "voteValue[" + choice.getChoiceId().getReducedId() + "]", + voteCounting.isVoteValueValid(choice.getVoteValue()), + l(getLocale(), "pollen.error.vote.voteValue.invalid")); } check(errors, diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java index 97910a1..367b9c6 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/VoteService.java @@ -31,6 +31,7 @@ import org.chorem.pollen.services.bean.PollenEntityRef; import org.chorem.pollen.services.bean.VoteBean; import org.chorem.pollen.services.bean.VoteToChoiceBean; import org.chorem.pollen.services.service.security.PermissionVerb; +import org.chorem.pollen.votecounting.VoteCounting; import java.util.*; @@ -212,9 +213,22 @@ public class VoteService extends PollenServiceSupport { } - ErrorMap valueErrors = getVoteCountingService().voteIsValid(vote, getVoteCountingService().getVoteCounting(poll)); + VoteCounting voteCounting = getVoteCountingService().getVoteCounting(poll); + + ErrorMap valueErrors = getVoteCountingService().voteIsValid(vote, voteCounting); valueErrors.copyTo(errors, "vote."); + if (poll.getMaxChoiceNumber() > 0) { + int nbChoice = 0; + for ( VoteToChoiceBean voteToChoice : vote.getChoice() ) { + if ( voteCounting.isChoiceInVote(voteToChoice.getVoteValue()) ) { + nbChoice++; + } + } + + check(errors, "vote.limitedVote", nbChoice <= poll.getMaxChoiceNumber(), l(getLocale(), "pollen.error.vote.limitedVote.overflow")); + } + //TODO Finish validation } return errors; diff --git a/pollen-services/src/main/resources/i18n/pollen-services_en_GB.properties b/pollen-services/src/main/resources/i18n/pollen-services_en_GB.properties index a1cfeb7..d308101 100644 --- a/pollen-services/src/main/resources/i18n/pollen-services_en_GB.properties +++ b/pollen-services/src/main/resources/i18n/pollen-services_en_GB.properties @@ -52,6 +52,7 @@ pollen.error.user.mailExist=email already exists pollen.error.user.mailInvalid=email is not valid pollen.error.user.passwordEmpty=password can not be empty pollen.error.user.passwordInvalid=password is not valid +pollen.error.vote.limitedVote.overflow=Too many choices pollen.error.vote.poll.isClosed=poll is closed, you can't vote pollen.error.vote.poll.notStarted=poll is not started pollen.error.vote.totalVote.invalid=Total vote value is invalid diff --git a/pollen-services/src/main/resources/i18n/pollen-services_fr_FR.properties b/pollen-services/src/main/resources/i18n/pollen-services_fr_FR.properties index f72b463..5d2c9c8 100644 --- a/pollen-services/src/main/resources/i18n/pollen-services_fr_FR.properties +++ b/pollen-services/src/main/resources/i18n/pollen-services_fr_FR.properties @@ -51,9 +51,10 @@ pollen.error.user.mailExist=Courriel existe déjà pollen.error.user.mailInvalid=Courriel est invalide pollen.error.user.passwordEmpty=Mot de passe ne peut pas être vide pollen.error.user.passwordInvalid=Mot de passe est invalide +pollen.error.vote.limitedVote.overflow=Le nombre de choix maximal atteind pollen.error.vote.poll.isClosed=Le sondage est clos, vous pouvez voter pollen.error.vote.poll.notStarted=les votes n'ont pas commencé -pollen.error.vote.totalVote.invalid=le total des valuers est invalide +pollen.error.vote.totalVote.invalid=le total des valeurs est invalide pollen.error.vote.voteValue.invalid=la valeur est invalid pollen.error.vote.voterName.alreadyExist=le nom existe déjà pollen.error.vote.voterName.mandatory=le nom est obligatoire diff --git a/pollen-ui-angular/src/main/webapp/js/controllers/pollCtrl.js b/pollen-ui-angular/src/main/webapp/js/controllers/pollCtrl.js index d557d2a..ccc01c5 100644 --- a/pollen-ui-angular/src/main/webapp/js/controllers/pollCtrl.js +++ b/pollen-ui-angular/src/main/webapp/js/controllers/pollCtrl.js @@ -1259,14 +1259,18 @@ angular.module('pollControllers', ['ngRoute', 'pollenServices', 'pascalprecht.tr $location.url(redirect); }, function (error) { - if (angular.isDefined(error.data["voter.name"])) { + if (error.data.hasOwnProperty("voter.name")) { $scope.data.vote.restError = { voterName : error.data["voter.name"]}; } - if (angular.isDefined(error.data["vote.totalVoteValue"])) { + if (error.data.hasOwnProperty("vote.totalVoteValue")) { $rootScope.$broadcast('newError', error.data["vote.totalVoteValue"][0]); } + if (error.data.hasOwnProperty("vote.limitedVote")) { + $rootScope.$broadcast('newError', error.data["vote.limitedVote"][0]); + } + angular.forEach($scope.data.vote.choice, function (choice) { if (angular.isDefined(error.data["vote.voteValue["+choice.choiceId+"]"])) { choice.restError = error.data["vote.voteValue["+choice.choiceId+"]"]; @@ -1335,8 +1339,17 @@ angular.module('pollControllers', ['ngRoute', 'pollenServices', 'pascalprecht.tr $rootScope.$broadcast('newSuccess', 'vote.added'); $location.url('/poll/vote/'+$routeParams.pollId+'/'+ data.permission); }, function (error) { - $scope.data.vote.restError = { voterName : error.data["voter.name"]}; - }) + if (error.data.hasOwnProperty("vote.totalVoteValue")) { + $rootScope.$broadcast('newError', error.data["vote.totalVoteValue"][0]); + } + + if (error.data.hasOwnProperty("vote.limitedVote")) { + $rootScope.$broadcast('newError', error.data["vote.limitedVote"][0]); + } + if (error.data.hasOwnProperty("voter.name")) { + $scope.data.vote.restError = { voterName: error.data["voter.name"]}; + } + }); }; $scope.toggleVoteValue = function (choice, onEdit, event) { diff --git a/pollen-ui-angular/src/main/webapp/partials/poll-settings.html b/pollen-ui-angular/src/main/webapp/partials/poll-settings.html index 789cecf..7bd7a89 100644 --- a/pollen-ui-angular/src/main/webapp/partials/poll-settings.html +++ b/pollen-ui-angular/src/main/webapp/partials/poll-settings.html @@ -181,7 +181,7 @@ {{ 'poll.config.label.limitedVote' | translate }} </label> <div class="col-sm-6"> - <input type="checkbox" id="formLimitedVote" ng-model="data.poll.limitedVote" auto-save="autoSavePoll()" /> + <input type="number" min="0" step="1" id="formLimitedVote" ng-model="data.poll.limitedVote" auto-save="autoSavePoll()" /> </div> <div class="col-sm-2"></div> </div> diff --git a/pollen-votecounting-condorcet/src/main/java/org/chorem/pollen/votecounting/CondorcetVoteCounting.java b/pollen-votecounting-condorcet/src/main/java/org/chorem/pollen/votecounting/CondorcetVoteCounting.java index e9af235..bf67f49 100644 --- a/pollen-votecounting-condorcet/src/main/java/org/chorem/pollen/votecounting/CondorcetVoteCounting.java +++ b/pollen-votecounting-condorcet/src/main/java/org/chorem/pollen/votecounting/CondorcetVoteCounting.java @@ -75,7 +75,7 @@ public class CondorcetVoteCounting extends AbstractVoteCounting<CondorcetVoteCou @Override public boolean isChoiceInVote(Double voteValue) { - return voteValue != null && voteValue > 0 && voteValue < 100; + return voteValue != null && voteValue > 0; } @Override -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.
participants (1)
-
chorem.org scm