r3247 - in branches/pollen-1.2.6-struts2: pollen-persistence/src/main/java/org/chorem/pollen/business/persistence pollen-persistence/src/main/xmi pollen-services/src/main/java/org/chorem/pollen/services/impl pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/security pollen-ui-struts2/src/main/resources/i18n pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/poll pollen-ui-struts2/src/main/webapp/js
Author: fdesbois Date: 2012-04-11 16:23:26 +0200 (Wed, 11 Apr 2012) New Revision: 3247 Url: http://chorem.org/repositories/revision/pollen/3247 Log: - manage preventRules (problem with vote email and manage update case) - manage voteStarted case that disabled some part of the poll form Modified: branches/pollen-1.2.6-struts2/pollen-persistence/src/main/java/org/chorem/pollen/business/persistence/PollImpl.java branches/pollen-1.2.6-struts2/pollen-persistence/src/main/xmi/pollen.zargo branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/EmailService.java branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollService.java branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/PreventRuleService.java branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/VoteService.java branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/AbstractPollForm.java branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/AbstractVoteAction.java branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/LoadPoll.java branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/SavePoll.java branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/VoteForPoll.java branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/security/PollAccessRequired.java branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/resources/i18n/pollen-ui-struts2_en_GB.properties branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/resources/i18n/pollen-ui-struts2_fr_FR.properties branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/poll/PersonToList.jsp branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/poll/VotingList.jsp branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/poll/create.jsp branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/poll/createPoll_choices.jsp branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/poll/resume.jsp branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/webapp/js/createPoll.js Modified: branches/pollen-1.2.6-struts2/pollen-persistence/src/main/java/org/chorem/pollen/business/persistence/PollImpl.java =================================================================== --- branches/pollen-1.2.6-struts2/pollen-persistence/src/main/java/org/chorem/pollen/business/persistence/PollImpl.java 2012-04-11 14:23:09 UTC (rev 3246) +++ branches/pollen-1.2.6-struts2/pollen-persistence/src/main/java/org/chorem/pollen/business/persistence/PollImpl.java 2012-04-11 14:23:26 UTC (rev 3247) @@ -139,10 +139,13 @@ public boolean isAddChoiceFinished(Date currentDate) { return !choiceAddAllowed || (endChoiceDate != null && endChoiceDate.after(currentDate)); } - + + @Override public PreventRule getPreventRuleByScope(String scope) { Preconditions.checkNotNull(scope); + for (PreventRule value : getPreventRule()) { + if (scope.equals(value.getScope())) { return value; } @@ -150,4 +153,46 @@ return null; } + @Override + public PersonToList getPersonToListByVote(Vote vote) { + Preconditions.checkNotNull(vote); + + PersonToList result; + for (VotingList votingList : getVotingList()) { + + result = votingList.getPollAccountPersonToList(vote.getPollAccount()); + + if (result != null) { + return result; + } + } + return null; + } + + @Override + public List<PollAccount> getPollAccounts(boolean withNoVote) { + + List<PollAccount> result = Lists.newLinkedList(); + + for (VotingList votingList : getVotingList()) { + + for (PersonToList personToList : + votingList.getPollAccountPersonToList()) { + + // ignore those with existing vote + if (withNoVote && personToList.isHasVoted()) { + continue; + } + + result.add(personToList.getPollAccount()); +// +// if (!withNoVote || !personToList.isHasVoted()) { +// +// result.add(personToList.getPollAccount()); +// } + } + } + return result; + } + } //PollImpl Modified: branches/pollen-1.2.6-struts2/pollen-persistence/src/main/xmi/pollen.zargo =================================================================== (Binary files differ) Modified: branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/EmailService.java =================================================================== --- branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/EmailService.java 2012-04-11 14:23:09 UTC (rev 3246) +++ branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/EmailService.java 2012-04-11 14:23:26 UTC (rev 3247) @@ -33,11 +33,9 @@ import org.apache.commons.mail.SimpleEmail; import org.chorem.pollen.PollenConfiguration; import org.chorem.pollen.PollenTechnicalException; -import org.chorem.pollen.business.persistence.PersonToList; import org.chorem.pollen.business.persistence.Poll; import org.chorem.pollen.business.persistence.PollAccount; import org.chorem.pollen.business.persistence.UserAccount; -import org.chorem.pollen.business.persistence.VotingList; import org.chorem.pollen.common.PollType; import org.chorem.pollen.services.PollenServiceSupport; import org.nuiton.util.StringUtil; @@ -88,10 +86,12 @@ if (StringUtils.isNotEmpty(poll.getCreator().getEmail())) { - String subject = l_(locale, "pollen.email.creatorEmail.subject", + int nbVotes = poll.sizeVote(); + + String subject = l_(locale, "pollen.email.voteEmail.subject", pollTitle); - String content = l_(locale, "pollen.email.creatorEmail.content", - pollTitle, voteURL, modifURL); + String content = l_(locale, "pollen.email.voteEmail.content", + pollTitle, nbVotes, voteURL, modifURL); PollEmail pollEmail = createPollEmail( poll.getCreator().getEmail(), subject, content); @@ -131,8 +131,7 @@ } // Mails à tous les votants - List<PollAccount> votingPollAccounts = - getVotingPollAccounts(poll, false); + List<PollAccount> votingPollAccounts = poll.getPollAccounts(false); if (CollectionUtils.isNotEmpty(votingPollAccounts)) { String subject = l_(locale, "pollen.email.votingEmail.subject", @@ -170,7 +169,7 @@ String pollTitle = poll.getTitle(); // Mails aux votants qui n'ont toujours pas voté - List<PollAccount> votingPollAccounts = getVotingPollAccounts(poll, true); + List<PollAccount> votingPollAccounts = poll.getPollAccounts(true); if (CollectionUtils.isNotEmpty(votingPollAccounts)) { String subject = l_(locale, "pollen.email.reminderEmail.subject", @@ -195,34 +194,6 @@ } } - //TODO Move this to Poll - protected List<PollAccount> getVotingPollAccounts(Poll poll, - boolean keepOnlyIfNotHasVoted) { - List<PollAccount> result = Lists.newLinkedList(); - - if (!poll.isVotingListEmpty()) { - - for (VotingList votingList : poll.getVotingList()) { - - if (!votingList.isPollAccountPersonToListEmpty()) { - - for (PersonToList personToList : - votingList.getPollAccountPersonToList()) { - - if (!keepOnlyIfNotHasVoted || !personToList.isHasVoted()) { - - PollAccount account = personToList.getPollAccount(); - result.add(account); - } - - - } - } - } - } - return result; - } - protected void sendEmail(Iterable<PollEmail> pollEmails) { //TODO tchemit If two much mails then use SendEmail thread... Modified: branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollService.java =================================================================== --- branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollService.java 2012-04-11 14:23:09 UTC (rev 3246) +++ branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/PollService.java 2012-04-11 14:23:26 UTC (rev 3247) @@ -228,6 +228,9 @@ preventRuleLoaded, preventRuleEditable, !clone); result.addPreventRule(preventRuleEditable); } + + // Load votes to have the correct size used to check if vote is started + result.setVote(source.getVote()); return result; } @@ -352,7 +355,16 @@ public String getPollVoteUrl(Poll poll) { URL applicationUrl = serviceContext.getApplicationURL(); StringBuilder url = new StringBuilder(applicationUrl.toString()); - url.append("/poll/votefor/").append(poll.getPollId()); + url.append("/poll/votefor/"); + + if (PollType.FREE == poll.getPollType()) { + url.append(poll.getPollId()); + + } else { + // Restricted poll is secure, the creator could access to it when + // using the adminId + url.append(poll.getAdminId()); + } return url.toString(); } @@ -865,8 +877,21 @@ Vote voteToAdd = getEntityById(Vote.class, voteId); pollToUpdate.addVote(voteToAdd); + + // Update hasVoted flag for RESTRICTED/GROUP poll + if (PollType.FREE != poll.getPollType()) { + PersonToList personToList = pollToUpdate.getPersonToListByVote(voteToAdd); + personToList.setHasVoted(true); + } + commitTransaction("Can't add the vote [" + voteId + "] to the poll [" + pollId + "]"); + + // Send notification if necessary + PreventRuleService preventRuleService = newService(PreventRuleService.class); + String pollVoteUrl = getPollVoteUrl(pollToUpdate); + String modifUrl = getPollEditUrl(pollToUpdate); + preventRuleService.onVoteAdded(poll, pollVoteUrl, modifUrl); } public PersonToList getNewPersonToList(PollAccount pollAccount) { @@ -943,19 +968,19 @@ PreventRuleDAO preventRuleDAO = getDAO(PreventRule.class); - PreventRule preventRuleLoaded; - if (preventRule.getTopiaId() == null) { + // For the moment only one rule by scope + PreventRule preventRuleLoaded = poll.getPreventRuleByScope(preventRule.getScope()); + + if (preventRuleLoaded == null) { preventRuleLoaded = create(preventRuleDAO); poll.addPreventRule(preventRuleLoaded); + preventRuleLoaded.setScope(preventRule.getScope()); + preventRuleLoaded.setActive(true); + } - } else { - preventRuleLoaded = poll.getPreventRuleByTopiaId(preventRule.getTopiaId()); - } - preventRuleLoaded.setActive(preventRule.isActive()); preventRuleLoaded.setMethod(preventRule.getMethod()); preventRuleLoaded.setOneTime(preventRule.isOneTime()); preventRuleLoaded.setRepeated(preventRule.isRepeated()); - preventRuleLoaded.setScope(preventRule.getScope()); preventRuleLoaded.setSensibility(preventRule.getSensibility()); } Modified: branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/PreventRuleService.java =================================================================== --- branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/PreventRuleService.java 2012-04-11 14:23:09 UTC (rev 3246) +++ branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/PreventRuleService.java 2012-04-11 14:23:26 UTC (rev 3247) @@ -39,13 +39,17 @@ * @since 1.2.6 */ public class PreventRuleService extends PollenServiceSupport { + + public static final String SCOPE_VOTE = "vote"; + + public static final String SCOPE_REMINDER = "rappel"; /** Logger. */ private static final Log log = LogFactory.getLog(PreventRuleService.class); public PreventRule createAddVotePreventRule() { PreventRule rule = newInstance(getDAO(PreventRule.class)); - rule.setScope("vote"); + rule.setScope(SCOPE_VOTE); rule.setSensibility(1); rule.setRepeated(true); return rule; @@ -53,7 +57,7 @@ public PreventRule createRemindPreventRule(int sensibility) { PreventRule rule = newInstance(getDAO(PreventRule.class)); - rule.setScope("rappel"); + rule.setScope(SCOPE_REMINDER); rule.setSensibility(sensibility); rule.setRepeated(false); return rule; @@ -110,7 +114,7 @@ // send to creator a email to say hey a new vote was added! - if (execute("vote", preventRule, 1)) { + if (execute(SCOPE_VOTE, preventRule, 1)) { // ok can execute this task @@ -131,7 +135,7 @@ // send to all voting a email to say hey we need to vote - if (execute("rappel", preventRule, timeValue)) { + if (execute(SCOPE_REMINDER, preventRule, timeValue)) { // ok can execute this task Modified: branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/VoteService.java =================================================================== --- branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/VoteService.java 2012-04-11 14:23:09 UTC (rev 3246) +++ branches/pollen-1.2.6-struts2/pollen-services/src/main/java/org/chorem/pollen/services/impl/VoteService.java 2012-04-11 14:23:26 UTC (rev 3247) @@ -315,12 +315,21 @@ delete(voteToChoiceDao, voteToChoice); } - // Delete vote PollAccount if the Poll is free and account is not the creator - Poll poll = entityToDelete.getPoll(); - PollAccount voteAccount = entityToDelete.getPollAccount(); - if (PollType.FREE.equals(poll.getPollType()) && !voteAccount.equals(poll.getCreator())) { - PollAccountDAO accountDAO = getDAO(PollAccount.class); - delete(accountDAO, voteAccount); + Poll poll = entityToDelete.getPoll(); + + if (PollType.FREE == poll.getPollType()) { + + // Delete vote PollAccount if the Poll is free and account is not the creator + PollAccount voteAccount = entityToDelete.getPollAccount(); + if (!voteAccount.equals(poll.getCreator())) { + PollAccountDAO accountDAO = getDAO(PollAccount.class); + delete(accountDAO, voteAccount); + } + + // Update pollAccount hasVoted flag + } else { + PersonToList personToList = poll.getPersonToListByVote(entityToDelete); + personToList.setHasVoted(false); } poll.removeVote(entityToDelete); Modified: branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/AbstractPollForm.java =================================================================== --- branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/AbstractPollForm.java 2012-04-11 14:23:09 UTC (rev 3246) +++ branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/AbstractPollForm.java 2012-04-11 14:23:26 UTC (rev 3247) @@ -228,6 +228,18 @@ public boolean isVoteStarted() { return isEdit() && poll.sizeVote() > 0; } + +// public boolean isPersonEditable(PersonToList personToList) { +// boolean result; +// // If vote is started, the person is editable if he hasn't vote yet +// if (isVoteStarted()) { +// result = !personToList.isHasVoted(); +// +// } else { +// result = true; +// } +// return result; +// } public boolean isCreatorUserAccountDefined() { PollAccount creator = poll.getCreator(); Modified: branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/AbstractVoteAction.java =================================================================== --- branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/AbstractVoteAction.java 2012-04-11 14:23:09 UTC (rev 3246) +++ branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/AbstractVoteAction.java 2012-04-11 14:23:26 UTC (rev 3247) @@ -286,7 +286,9 @@ votes = poll.getVote(); // Current vote - vote = getVoteService().getVoteEditable(poll, pollAccount); + if (isVoteAllowed()) { + vote = getVoteService().getVoteEditable(poll, pollAccount); + } loadPollResults(); loadPollComments(); Modified: branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/LoadPoll.java =================================================================== --- branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/LoadPoll.java 2012-04-11 14:23:09 UTC (rev 3246) +++ branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/LoadPoll.java 2012-04-11 14:23:26 UTC (rev 3247) @@ -25,8 +25,10 @@ import org.chorem.pollen.bean.PollUri; import org.chorem.pollen.business.persistence.Choice; +import org.chorem.pollen.business.persistence.PreventRule; import org.chorem.pollen.business.persistence.UserAccount; import org.chorem.pollen.business.persistence.VotingList; +import org.chorem.pollen.services.impl.PreventRuleService; import java.util.List; @@ -72,6 +74,27 @@ pollVotingLists, !isVoteStarted()); + if (poll.getMaxChoiceNb() > 0) { + setLimitChoice(true); + } + + PreventRule reminder = poll.getPreventRuleByScope( + PreventRuleService.SCOPE_REMINDER); + if (reminder != null) { + setReminder(true); + setReminderHourCountdown(reminder.getSensibility()); + } + + PreventRule notification = poll.getPreventRuleByScope( + PreventRuleService.SCOPE_VOTE); + if (notification != null) { + setNotification(true); + } + + if (isVoteStarted()) { + addActionMessage(_("pollen.information.poll.form.voteStarted")); + } + return SUCCESS; } Modified: branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/SavePoll.java =================================================================== --- branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/SavePoll.java 2012-04-11 14:23:09 UTC (rev 3246) +++ branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/SavePoll.java 2012-04-11 14:23:26 UTC (rev 3247) @@ -49,7 +49,6 @@ import org.chorem.pollen.business.persistence.VotingListImpl; import org.chorem.pollen.common.ChoiceType; import org.chorem.pollen.common.PollType; -import org.chorem.pollen.services.impl.PollService; import org.chorem.pollen.services.impl.PreventRuleService; import org.chorem.pollen.ui.actions.FileUploadAware; import org.nuiton.util.StringUtil; @@ -120,6 +119,20 @@ */ private Map<Integer, VotingList> votingLists; + /** + * This message is used in {@code resume.jsp} to display text before vote + * page url. For a restricted poll, the message is different because the + * url contains the creator accountId. + * + * @return the message to display to explain vote page url depends on + * {@code pollType}. + */ + public String getMessagePollVotePage() { + String result = isFreePoll() ? _("pollen.label.pollVotePage") : + _("pollen.label.pollVotePage.restricted"); + return result; + } + @Override public void prepare() throws Exception { @@ -140,55 +153,67 @@ poll = getPollService().getPollEditable(pollUid, userAccount, false); - // Retrieve choiceType from parameters, the poll object will be updated after prepare - String choiceTypeParam = getNonEmptyParameterValue("poll.choiceType"); - ChoiceType pollChoiceType = ChoiceType.valueOf(choiceTypeParam); - poll.setChoiceType(pollChoiceType); - - // build poll choices - - switch (pollChoiceType) { - - case TEXT: - choices = buildTextChoices(); - break; - case DATE: - choices = buildDateChoices(); - break; - case IMAGE: - choices = buildImageChoices(); - break; + // If vote is started, prepare choices and votingLists is useless + // because they can't be updated. + if (!isVoteStarted()) { + + // Retrieve choiceType from parameters, the poll object will be updated after prepare + String choiceTypeParam = getNonEmptyParameterValue("poll.choiceType"); + ChoiceType pollChoiceType = ChoiceType.valueOf(choiceTypeParam); + poll.setChoiceType(pollChoiceType); + + // build poll choices + + switch (pollChoiceType) { + + case TEXT: + choices = buildTextChoices(); + break; + case DATE: + choices = buildDateChoices(); + break; + case IMAGE: + choices = buildImageChoices(); + break; + } + + PollType pollType; + String pollTypeParam = getNonEmptyParameterValue("poll.pollType"); + if (pollTypeParam == null) { + pollType = poll.getPollType(); + + } else { + pollType = PollType.valueOf(pollTypeParam); + } + + switch (pollType) { + + case FREE: + + // empty voting list + votingLists = Maps.newTreeMap(); + break; + case RESTRICTED: + + // restricted voting list + votingLists = buildVotingLists(pollType); + break; + case GROUP: + + // group voting lists + votingLists = buildVotingLists(pollType); + break; + } } - - String pollTypeParam = getNonEmptyParameterValue("poll.pollType"); - PollType pollType = PollType.valueOf(pollTypeParam); - poll.setPollType(pollType); - - switch (pollType) { - - case FREE: - - // empty voting list - votingLists = Maps.newTreeMap(); - break; - case RESTRICTED: - - // restricted voting list - votingLists = buildVotingLists(pollType); - break; - case GROUP: - - // group voting lists - votingLists = buildVotingLists(pollType); - break; - } } @Override public String input() { - Collection<Choice> pollChoices = choices.values(); - Collection<VotingList> pollVotingLists = votingLists.values(); + Collection<Choice> pollChoices = + isVoteStarted() ? poll.getChoice() : choices.values(); + Collection<VotingList> pollVotingLists = + isVoteStarted() ? poll.getVotingList() : votingLists.values(); loadChoicesAndvotingLists(poll, pollChoices, @@ -201,60 +226,10 @@ @Override public void validate() { - informationsError = false; + informationsError = validateInformations(); - // poll must have a title - if (StringUtils.isEmpty(poll.getTitle())) { - addFieldError("poll.title", _("pollen.error.poll.required.title")); - } + optionsError = validateOptions(); - // validate choices - - if (MapUtils.isEmpty(choices)) { - - // poll must have at least one choice - addFieldError("poll.choices", - _("pollen.error.poll.required.one.choice")); - } else { - - ChoiceType choiceType = poll.getChoiceType(); - int inputChoicesSize = choices.size(); - Set<Object> choiceValues = - Sets.newHashSet(ChoiceHelper.toValues(choices.values(), - choiceType)); - - if (inputChoicesSize > choiceValues.size()) { - addFieldError( - "poll.choices", - _("pollen.error.poll.detected.duplicate.choice.name")); - } - } - - optionsError = false; - - // validate security stuff - - if (isFreePoll()) { - - // nothing to validate - - } else { - - Set<String> groups = Sets.newHashSet(); - Set<String> voters = Sets.newHashSet(); - Set<String> emails = Sets.newHashSet(); - - for (Map.Entry<Integer, VotingList> entry : votingLists.entrySet()) { - optionsError |= validateVotingList(entry.getKey(), - entry.getValue(), - groups, - voters, - emails); - } - } - - informationsError = hasFieldErrors(); - if (!informationsError && optionsError) { // trick to force to go back to form @@ -266,28 +241,31 @@ @InputConfig(methodName = "input") public String execute() throws Exception { - // Clear previous collections to save those from the form - poll.clearChoice(); - poll.clearPreventRule(); - poll.clearVotingList(); + // Save choices and votingLists only if vote is not started + if (!isVoteStarted()) { - Map<Integer, Choice> orderedChoices = choices; + // Clear previous collections to save those from the form + poll.clearChoice(); + poll.clearVotingList(); - for (Integer index : orderedChoices.keySet()) { - Choice choice = orderedChoices.get(index); - poll.addChoice(choice); - } + Map<Integer, Choice> orderedChoices = choices; - if (!isFreePoll()) { + for (Integer index : orderedChoices.keySet()) { + Choice choice = orderedChoices.get(index); + poll.addChoice(choice); + } - for (Integer index : votingLists.keySet()) { - VotingList votingList = votingLists.get(index); - poll.addVotingList(votingList); + if (!isFreePoll()) { + + for (Integer index : votingLists.keySet()) { + VotingList votingList = votingLists.get(index); + poll.addVotingList(votingList); + } } } + + poll.clearPreventRule(); - PollService service = getPollService(); - PreventRuleService preventRuleService = newService(PreventRuleService.class); if (isNotification()) { @@ -310,11 +288,11 @@ } if (isEdit()) { - service.updatePoll(poll); + getPollService().updatePoll(poll); addActionMessage(_("pollen.information.poll.updated")); } else { - service.createPoll(poll); + getPollService().createPoll(poll); addActionMessage(_("pollen.information.poll.created")); } @@ -384,6 +362,82 @@ return result; } + protected boolean validateInformations() { + + // -- Title : required -- // + if (StringUtils.isBlank(poll.getTitle())) { + addFieldError("poll.title", _("pollen.error.poll.required.title")); + } + + if (isVoteStarted()) { + + // no validation on choices if vote is started + + } else { + + // -- Choice -- // + + if (MapUtils.isEmpty(choices)) { + + // poll must have at least one choice + addFieldError("poll.choices", + _("pollen.error.poll.required.one.choice")); + } else { + + ChoiceType choiceType = poll.getChoiceType(); + int inputChoicesSize = choices.size(); + Set<Object> choiceValues = + Sets.newHashSet(ChoiceHelper.toValues(choices.values(), + choiceType)); + + if (inputChoicesSize > choiceValues.size()) { + addFieldError( + "poll.choices", + _("pollen.error.poll.detected.duplicate.choice.name")); + } + } + } + + boolean result = hasFieldErrors(); + + return result; + } + + protected boolean validateOptions() { + + boolean result = false; + + if (isVoteStarted()) { + + // no validation on votingLists if vote is started + + } else { + + // -- VotingList -- // + + if (isFreePoll()) { + + // nothing to validate + + } else { + + Set<String> groups = Sets.newHashSet(); + Set<String> voters = Sets.newHashSet(); + Set<String> emails = Sets.newHashSet(); + + for (Map.Entry<Integer, VotingList> entry : votingLists.entrySet()) { + result |= validateVotingList(entry.getKey(), + entry.getValue(), + groups, + voters, + emails); + } + } + } + + return result; + } + protected boolean validateVotingList(int votingListNumber, VotingList votingList, Set<String> groups, Modified: branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/VoteForPoll.java =================================================================== --- branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/VoteForPoll.java 2012-04-11 14:23:09 UTC (rev 3246) +++ branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/VoteForPoll.java 2012-04-11 14:23:26 UTC (rev 3247) @@ -33,6 +33,7 @@ import org.chorem.pollen.business.persistence.PollAccount; import org.chorem.pollen.business.persistence.Vote; import org.chorem.pollen.business.persistence.VoteToChoice; +import org.chorem.pollen.common.PollType; /** * Votes to a poll. @@ -83,6 +84,7 @@ for (VoteToChoice voteToChoice : vote.getChoiceVoteToChoice()) { Integer value = voteToChoice.getVoteValue(); + // XXX-fdesbois-2012-04-11 : for a VoteCountingType#NUMBER the difference between 0 and null value could be important if (value != null && value != 0) { nbVotes++; totalValues += value; @@ -121,8 +123,8 @@ clearMessages(); - // Display updateUrl if user is not logged - if (!isUserLoggued()) { + // For free Poll, display the update Url (useless if user is logged) + if (PollType.FREE == getPoll().getPollType() && !isUserLoggued()) { String pollId = getPoll().getPollId(); String accountId = getPollAccount().getAccountId(); Modified: branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/security/PollAccessRequired.java =================================================================== --- branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/security/PollAccessRequired.java 2012-04-11 14:23:09 UTC (rev 3246) +++ branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/security/PollAccessRequired.java 2012-04-11 14:23:26 UTC (rev 3247) @@ -41,8 +41,11 @@ protected final AdminUserRequired adminFilter; + protected final PollCreatorRequired pollCreatorFilter; + public PollAccessRequired() { adminFilter = new AdminUserRequired(); + pollCreatorFilter = new PollCreatorRequired(); } @Override @@ -57,6 +60,11 @@ // user is connected ans admin, so isAccessAllowed = true; + } else if (pollCreatorFilter.isAccessAllowed(request, response, mappedValue)) { + + // user is connected ans admin, so + isAccessAllowed = true; + } else { PollUri pollUri = getPollUri(request); Modified: branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/resources/i18n/pollen-ui-struts2_en_GB.properties =================================================================== --- branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/resources/i18n/pollen-ui-struts2_en_GB.properties 2012-04-11 14:23:09 UTC (rev 3246) +++ branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/resources/i18n/pollen-ui-struts2_en_GB.properties 2012-04-11 14:23:26 UTC (rev 3247) @@ -191,6 +191,7 @@ pollen.information.irreversible.operation=Be ware, this operation is irreversible. pollen.information.need.login=You must be logged to access this page. Please fill the form below. pollen.information.poll.created=Poll created +pollen.information.poll.form.voteStarted=Votes are started, some options can't be updated. pollen.information.poll.updated=Poll modified pollen.information.pollAccount.addedTofavoriteList=Member '%s was added to favorite list. pollen.information.pollAccount.removedFromFavoriteList=Member %s was removed from favorite list. @@ -209,6 +210,7 @@ pollen.label.pollEditPage=The link below leads to the page to modify your poll. Save it to be able to modify your poll later if you need it or to close it \: pollen.label.pollRegisterPage=If you are a logged user, you can find these links on the page pollen.label.pollVotePage=The link below leads to the page to vote for your poll. Save it and send it to the people that you want to vote \: +pollen.label.pollVotePage.restricted= pollen.legend.login=Login pollen.legend.select.favoriteList.to.add=Sélectionner la liste de favoris à ajouter pollen.legend.select.personList.to.create.votingList=Sélectionner la liste des votant à importer dans le nouveau groupe Modified: branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/resources/i18n/pollen-ui-struts2_fr_FR.properties =================================================================== --- branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/resources/i18n/pollen-ui-struts2_fr_FR.properties 2012-04-11 14:23:09 UTC (rev 3246) +++ branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/resources/i18n/pollen-ui-struts2_fr_FR.properties 2012-04-11 14:23:26 UTC (rev 3247) @@ -199,6 +199,7 @@ pollen.information.irreversible.operation=Attention, Cette opération est irréversible. pollen.information.need.login=Vous devez être identifié pour pouvoir accéder à cette page. Veuillez remplir le formulaire ci-dessous. pollen.information.poll.created=Sondage créé +pollen.information.poll.form.voteStarted=Les votes ont commencé, certaines options ne sont pas modifiables. pollen.information.poll.updated=Sondage mise à jour pollen.information.pollAccount.addedTofavoriteList=Le membre %s a été ajoutée à la liste des favoris. pollen.information.pollAccount.removedFromFavoriteList=Le membre %s a été supprimé de la liste des favoris. @@ -217,6 +218,7 @@ pollen.label.pollEditPage=Le lien ci-dessous mène à la page de modification du sondage. Enregistrez-le pour pouvoir modifier votre sondage au besoin ou le clore \: pollen.label.pollRegisterPage=Si vous êtes un utilisateur identifié, vous pouvez retrouver ces liens dans la page pollen.label.pollVotePage=Le lien ci-dessous mène à la page de vote. Enregistrez-le et envoyez-le à ceux que vous voulez voir voter \: +pollen.label.pollVotePage.restricted=Le lien ci-dessous mène à la page de vote. Cet accès n'est valable que pour vous en tant que créateur du sondage \: pollen.legend.login=Login pollen.legend.select.favoriteList.to.add=Sélectionner la liste de favoris à ajouter pollen.legend.select.personList.to.create.votingList=Sélectionner la liste des votant à importer dans le nouveau groupe Modified: branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/poll/PersonToList.jsp =================================================================== --- branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/poll/PersonToList.jsp 2012-04-11 14:23:09 UTC (rev 3246) +++ branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/poll/PersonToList.jsp 2012-04-11 14:23:26 UTC (rev 3247) @@ -40,24 +40,29 @@ value=''/> <s:textfield cssClass="nameField" id='%{#personPrefix}.votingId' key="%{#personPrefix}.votingId" label='' theme="simple" - value="%{#personToList.pollAccount.votingId}"/> + value="%{#personToList.pollAccount.votingId}" + disabled="%{voteStarted}"/> - <s:label for="%{#personPrefix}.email" key="pollen.common.email" theme="simple"/> <s:textfield cols="30" id="%{#personPrefix}.email" key="%{#personPrefix}.email" label='' theme="simple" size="30" - value="%{#personToList.pollAccount.email}"/> + value="%{#personToList.pollAccount.email}" + disabled="%{voteStarted}"/> - <s:label for="%{#personPrefix}.weight" key="pollen.common.weight" theme="simple"/> <s:textfield id="%{#personPrefix}.weight" key="%{#personPrefix}.weight" size="1" - label='' theme="simple" value="%{#personToList.weight}"/> + label='' theme="simple" value="%{#personToList.weight}" + disabled="%{voteStarted}"/> </div> - <div class="fright"> - <s:a href='#' onclick="return deletePersonToList('%{#personPrefix}')"> - <image alt='<s:property value="%{#deletePersonTitle}"/>' - title='<s:property value="%{#deletePersonTitle}"/>' - src="<s:url value='/img/delete.png'/>"></image> - </s:a> - </div> + <s:if test="!voteStarted"> + <div class="fright"> + <s:a href='#' onclick="return deletePersonToList('%{#personPrefix}')"> + <image alt='<s:property value="%{#deletePersonTitle}"/>' + title='<s:property value="%{#deletePersonTitle}"/>' + src="<s:url value='/img/delete.png'/>"></image> + </s:a> + </div> + </s:if> <div class="cleanBoth"></div> </s:div> \ No newline at end of file Modified: branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/poll/VotingList.jsp =================================================================== --- branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/poll/VotingList.jsp 2012-04-11 14:23:09 UTC (rev 3246) +++ branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/poll/VotingList.jsp 2012-04-11 14:23:26 UTC (rev 3247) @@ -125,12 +125,14 @@ <s:submit id='%{#prefix}_addPersonToList' name='%{#prefix}_addPersonToList' key="pollen.action.addPersonToList" theme="simple" - onclick='return addNewPersonToList("%{votingListType}","%{#prefix}PersonToList","%{votingListNumber}");'/> + onclick='return addNewPersonToList("%{votingListType}","%{#prefix}PersonToList","%{votingListNumber}");' + disabled="%{voteStarted}"/> <s:if test="userLoggued"> <s:submit id='%{#prefix}_addPersonToList' theme="simple" name='%{#prefix}_addPersonToList' key="pollen.action.addPersonListFromVotingList" - onclick='return selectPersonListToAddToVotingList("%{votingListNumber}");'/> + onclick='return selectPersonListToAddToVotingList("%{votingListNumber}");' + disabled="%{voteStarted}"/> </s:if> </div> </fieldset> Modified: branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/poll/create.jsp =================================================================== --- branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/poll/create.jsp 2012-04-11 14:23:09 UTC (rev 3246) +++ branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/poll/create.jsp 2012-04-11 14:23:26 UTC (rev 3247) @@ -47,6 +47,9 @@ selectPersonListToAddToVotingListUrl:'<s:url action="selectPersonListToAddToVotingList" namespace="/poll"/>', selectPersonListToCreateNewVotingListUrl:'<s:url action="selectPersonListToCreateNewVotingList" namespace="/poll"/>', + choiceAddAllowed:'<s:property value="%{poll.choiceAddAllowed}"/>', + limitChoice:'<s:property value="%{limitChoice}"/>', + reminder:'<s:property value="%{reminder}"/>', voteCountingType:'<s:property value="%{poll.voteCountingType.name()}"/>', choiceType:'<s:property value="%{poll.choiceType.name()}"/>', pollType:'<s:property value="%{poll.pollType.name()}"/>' @@ -134,17 +137,20 @@ <div id='addChoiceAddAllowedPanel' class="hidden"> <sj:datepicker key="poll.beginChoiceDate" label="%{getText('pollen.common.beginChoiceDate')}" - displayFormat="dd/mm/yy"/> + displayFormat="dd/mm/yy" timepicker="true" + disabled="%{voteStarted}"/> <sj:datepicker key="poll.endChoiceDate" label="%{getText('pollen.common.endChoiceDate')}" - displayFormat="dd/mm/yy"/> + displayFormat="dd/mm/yy" timepicker="true" + disabled="%{voteStarted}"/> </div> <s:checkbox key="limitChoice" label="%{getText('pollen.common.pollOption.limitChoice')}" disabled="%{voteStarted}"/> <div id='maxChoiceNbPanel' class="hidden"> <s:textfield key="poll.maxChoiceNb" - label="%{getText('pollen.common.pollOption.maxChoiceNb')}"/> + label="%{getText('pollen.common.pollOption.maxChoiceNb')}" + disabled="%{voteStarted}"/> </div> <s:checkbox key="notification" label="%{getText('pollen.common.pollOption.notification')}"/> @@ -162,8 +168,10 @@ <sj:datepicker key="poll.beginDate" displayFormat="dd/mm/yy" label="%{getText('pollen.common.beginDate')}" + timepicker="true" disabled="%{voteStarted}"/> <sj:datepicker key="poll.endDate" displayFormat="dd/mm/yy" + timepicker="true" label="%{getText('pollen.common.endDate')}"/> </fieldset> Modified: branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/poll/createPoll_choices.jsp =================================================================== --- branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/poll/createPoll_choices.jsp 2012-04-11 14:23:09 UTC (rev 3246) +++ branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/poll/createPoll_choices.jsp 2012-04-11 14:23:26 UTC (rev 3247) @@ -45,35 +45,39 @@ <s:label for="%{#prefix}.name" id="choicesTEXT_label_%{#choiceNumber}" theme="simple" value=''/> <s:textfield cssClass="nameField" id='%{#prefix}.name' key="%{#prefix}.name" - label='' theme="simple" value="%{#choice.name}"/> + label='' theme="simple" value="%{#choice.name}" + disabled="%{voteStarted}"/> - <s:label for="%{#prefix}.description" key="pollen.common.description" theme="simple"/> <%--/div> <div class="fleft"--%> <s:textarea cols="30" id="%{#prefix}.description" label='' theme="simple" - key="%{#prefix}.description" value="%{#choice.description}"/> + key="%{#prefix}.description" value="%{#choice.description}" + disabled="%{voteStarted}"/> </div> - <div class="fright"> - <s:a href='#' onclick="return deleteChoice('choicesTEXT_%{#choiceNumber}')"> - <image alt='<s:property value="deleteTitle"/>' - title='<s:property value="deleteTitle"/>' - src="<s:url value='/img/delete.png'/>"></image> - </s:a> - <%--s:a id='choicesTEXT_down_%{choiceNumber}' - cssClass="hidden" href='#' - onclick="return downChoice('choicesTEXT_%{choiceNumber}')"> - <image alt='<s:property value="downTitle"/>' - title='<s:property value="downTitle"/>' - src="<s:url value='/img/1downarrow.png'/>"></image> + <s:if test="!voteStarted"> + <div class="fright"> + <s:a href='#' onclick="return deleteChoice('choicesTEXT_%{#choiceNumber}')"> + <image alt='<s:property value="deleteTitle"/>' + title='<s:property value="deleteTitle"/>' + src="<s:url value='/img/delete.png'/>"></image> </s:a> - <s:a id='choicesTEXT_up_%{choiceNumber}' href='#' cssClass="hidden" - onclick="return upChoice('choicesTEXT_%{choiceNumber}')"> - <image alt='<s:property value="upTitle"/>' - title='<s:property value="upTitle"/>' - src="<s:url value='/img/1uparrow.png'/>"></image> - </s:a--%> - </div> + <%--s:a id='choicesTEXT_down_%{choiceNumber}' + cssClass="hidden" href='#' + onclick="return downChoice('choicesTEXT_%{choiceNumber}')"> + <image alt='<s:property value="downTitle"/>' + title='<s:property value="downTitle"/>' + src="<s:url value='/img/1downarrow.png'/>"></image> + </s:a> + <s:a id='choicesTEXT_up_%{choiceNumber}' href='#' cssClass="hidden" + onclick="return upChoice('choicesTEXT_%{choiceNumber}')"> + <image alt='<s:property value="upTitle"/>' + title='<s:property value="upTitle"/>' + src="<s:url value='/img/1uparrow.png'/>"></image> + </s:a--%> + </div> + </s:if> <div class="cleanBoth"></div> </div> </s:iterator> @@ -90,7 +94,8 @@ theme="simple" value=''/> <sj:datepicker id='%{#prefix}.name' key="%{#prefix}.name" changeMonth="true" changeYear="true" labelSeparator="" theme="simple" label="" - timepicker="true" value="%{choice.date}" displayFormat="dd/mm/yy"/> + timepicker="true" value="%{choice.date}" displayFormat="dd/mm/yy" + disabled="%{voteStarted}"/> - <s:label for="%{#prefix}.description" key="pollen.common.description" theme="simple"/> @@ -98,28 +103,31 @@ <div class="fleft"> <s:textarea cols="30" id="%{#prefix}.description" key="%{#prefix}.description" label='' theme="simple" - value="%{choice.description}"/> + value="%{choice.description}" + disabled="%{voteStarted}"/> </div> - <div class="fright"> - <s:a href='#' onclick="return deleteChoice('choicesDATE_%{choiceNumber}')"> - <image alt='<s:property value="deleteTitle"/>' - title='<s:property value="deleteTitle"/>' - src="<s:url value='/img/delete.png'/>"></image> - </s:a> - <%--s:a id='choicesDATE_down_%{choiceNumber}' - cssClass="hidden" href='#' - onclick="return downChoice('choicesDATE_%{choiceNumber}')"> - <image alt='<s:property value="downTitle"/>' - title='<s:property value="downTitle"/>' - src="<s:url value='/img/1downarrow.png'/>"></image> + <s:if test="!voteStarted"> + <div class="fright"> + <s:a href='#' onclick="return deleteChoice('choicesDATE_%{choiceNumber}')"> + <image alt='<s:property value="deleteTitle"/>' + title='<s:property value="deleteTitle"/>' + src="<s:url value='/img/delete.png'/>"></image> </s:a> - <s:a id='choicesDATE_up_%{choiceNumber}' href='#' cssClass="hidden" - onclick="return upChoice('choicesDATE_%{choiceNumber}')"> - <image alt='<s:property value="upTitle"/>' - title='<s:property value="upTitle"/>' - src="<s:url value='/img/1uparrow.png'/>"></image> - </s:a--%> - </div> + <%--s:a id='choicesDATE_down_%{choiceNumber}' + cssClass="hidden" href='#' + onclick="return downChoice('choicesDATE_%{choiceNumber}')"> + <image alt='<s:property value="downTitle"/>' + title='<s:property value="downTitle"/>' + src="<s:url value='/img/1downarrow.png'/>"></image> + </s:a> + <s:a id='choicesDATE_up_%{choiceNumber}' href='#' cssClass="hidden" + onclick="return upChoice('choicesDATE_%{choiceNumber}')"> + <image alt='<s:property value="upTitle"/>' + title='<s:property value="upTitle"/>' + src="<s:url value='/img/1uparrow.png'/>"></image> + </s:a--%> + </div> + </s:if> <div class="cleanBoth"></div> </div> </s:iterator> @@ -147,7 +155,8 @@ </s:if> <s:else> <%--New image--%> - <s:file key='%{#prefix2}' label='' theme="simple" cssClass="nameField"/> + <s:file key='%{#prefix2}' label='' theme="simple" cssClass="nameField" + disabled="%{voteStarted}"/> </s:else> - <s:label for="%{#prefix}.description" key="pollen.common.description" @@ -155,28 +164,31 @@ </div> <div class="fleft"> <s:textarea cols="30" id="%{#prefix}.description" label='' theme="simple" - key="%{#prefix}.description" value="%{choice.description}"/> + key="%{#prefix}.description" value="%{choice.description}" + disabled="%{voteStarted}"/> </div> - <div class="fright"> - <s:a href='#' onclick="return deleteChoice('choicesIMAGE_%{choiceNumber}')"> - <image alt='<s:property value="deleteTitle"/>' - title='<s:property value="deleteTitle"/>' - src="<s:url value='/img/delete.png'/>"></image> - </s:a> - <%--s:a id='choicesIMAGE_down_%{choiceNumber}' - cssClass="hidden" href='#' - onclick="return downChoice('choicesIMAGE_%{choiceNumber}')"> - <image alt='<s:property value="downTitle"/>' - title='<s:property value="downTitle"/>' - src="<s:url value='/img/1downarrow.png'/>"></image> + <s:if test="!voteStarted"> + <div class="fright"> + <s:a href='#' onclick="return deleteChoice('choicesIMAGE_%{choiceNumber}')"> + <image alt='<s:property value="deleteTitle"/>' + title='<s:property value="deleteTitle"/>' + src="<s:url value='/img/delete.png'/>"></image> </s:a> - <s:a id='choicesIMAGE_up_%{choiceNumber}' href='#' cssClass="hidden" - onclick="return upChoice('choicesIMAGE_%{choiceNumber}')"> - <image alt='<s:property value="upTitle"/>' - title='<s:property value="upTitle"/>' - src="<s:url value='/img/1uparrow.png'/>"></image> - </s:a--%> - </div> + <%--s:a id='choicesIMAGE_down_%{choiceNumber}' + cssClass="hidden" href='#' + onclick="return downChoice('choicesIMAGE_%{choiceNumber}')"> + <image alt='<s:property value="downTitle"/>' + title='<s:property value="downTitle"/>' + src="<s:url value='/img/1downarrow.png'/>"></image> + </s:a> + <s:a id='choicesIMAGE_up_%{choiceNumber}' href='#' cssClass="hidden" + onclick="return upChoice('choicesIMAGE_%{choiceNumber}')"> + <image alt='<s:property value="upTitle"/>' + title='<s:property value="upTitle"/>' + src="<s:url value='/img/1uparrow.png'/>"></image> + </s:a--%> + </div> + </s:if> <div class="cleanBoth"></div> </div> Modified: branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/poll/resume.jsp =================================================================== --- branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/poll/resume.jsp 2012-04-11 14:23:09 UTC (rev 3246) +++ branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/poll/resume.jsp 2012-04-11 14:23:26 UTC (rev 3247) @@ -32,7 +32,7 @@ <img src="<s:url value='/img/vote.png'/>" alt="<s:text name='pollen.common.voteAction'/>" style="margin-right: 18px;"/> - <s:text name='pollen.label.pollVotePage'/> + <s:property value="%{messagePollVotePage}"/> <br/> <s:set name="voteUrl" value="%{pollVoteUrl}"/> <s:a href="%{voteUrl}" cssStyle="margin-left:50px;"> Modified: branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/webapp/js/createPoll.js =================================================================== --- branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/webapp/js/createPoll.js 2012-04-11 14:23:09 UTC (rev 3246) +++ branches/pollen-1.2.6-struts2/pollen-ui-struts2/src/main/webapp/js/createPoll.js 2012-04-11 14:23:26 UTC (rev 3247) @@ -508,6 +508,30 @@ jQuery(document).ready(function () { + function changeChoiceAddAllowed(val) { + if (val) { + $('#addChoiceAddAllowedPanel').show(); + } else { + $('#addChoiceAddAllowedPanel').hide(); + } + } + + function changeLimitChoice(val) { + if (val) { + $('#maxChoiceNbPanel').show(); + } else { + $('#maxChoiceNbPanel').hide(); + } + } + + function changeReminder(val) { + if (val) { + $('#reminderPanel').show(); + } else { + $('#reminderPanel').hide(); + } + } + function changePollType(type) { $('.pollType').addClass('hidden'); @@ -528,31 +552,16 @@ $('[name="poll.choiceType"][value="' + type + '"]').attr('checked', 'checked'); } - $('[name="poll.choiceAddAllowed"]').change(function () { - var val = $(this).prop('checked'); - if (val) { - $('#addChoiceAddAllowedPanel').show(); - } else { - $('#addChoiceAddAllowedPanel').hide(); - } + $('[name="poll.choiceAddAllowed"]').change(function() { + changeChoiceAddAllowed($(this).prop('checked')); }); $('[name="limitChoice"]').change(function () { - var val = $(this).prop('checked'); - if (val) { - $('#maxChoiceNbPanel').show(); - } else { - $('#maxChoiceNbPanel').hide(); - } + changeLimitChoice($(this).prop('checked')); }); $('[name="reminder"]').change(function () { - var val = $(this).prop('checked'); - if (val) { - $('#reminderPanel').show(); - } else { - $('#reminderPanel').hide(); - } + changeReminder($(this).prop('checked')); }); $('[name="poll.anonymous"]').change(function () { @@ -583,9 +592,11 @@ prepareVotingLists('votingListRESTRICTED'); prepareVotingLists('votingListGROUP'); + changeChoiceAddAllowed(datas['choiceAddAllowed'] == 'true'); + changeLimitChoice(datas['limitChoice'] == 'true'); + changeReminder(datas['reminder'] == 'true'); + changeChoiceType(datas['choiceType']); - changePollType(datas['pollType']); - }); \ No newline at end of file
participants (1)
-
fdesbois@users.chorem.org