Author: tchemit Date: 2012-07-31 22:43:25 +0200 (Tue, 31 Jul 2012) New Revision: 3582 Url: http://chorem.org/repositories/revision/pollen/3582 Log: fixes #716: Restricted and public in same time fixes #717: Restricted and authentication user Modified: trunk/pollen-persistence/src/main/java/org/chorem/pollen/business/persistence/PollAccountDAOImpl.java trunk/pollen-services/src/main/java/org/chorem/pollen/services/impl/SecurityService.java trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/json/GetCreatedPolls.java trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/json/GetInvitedPolls.java trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/json/GetParticipatedPolls.java trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/AbstractVoteAction.java trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/SummaryPoll.java trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/VoteForPoll.java trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/security/PollResultAccessRequired.java trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/security/PollVoteAccessRequired.java trunk/pollen-ui-struts2/src/main/resources/i18n/pollen-ui-struts2_en_GB.properties trunk/pollen-ui-struts2/src/main/resources/i18n/pollen-ui-struts2_fr_FR.properties trunk/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/poll/summary.jsp trunk/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/pollListHelper.jsp trunk/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/user/createdList.jsp trunk/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/user/invitedList.jsp trunk/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/user/participatedList.jsp Modified: trunk/pollen-persistence/src/main/java/org/chorem/pollen/business/persistence/PollAccountDAOImpl.java =================================================================== --- trunk/pollen-persistence/src/main/java/org/chorem/pollen/business/persistence/PollAccountDAOImpl.java 2012-07-31 19:43:13 UTC (rev 3581) +++ trunk/pollen-persistence/src/main/java/org/chorem/pollen/business/persistence/PollAccountDAOImpl.java 2012-07-31 20:43:25 UTC (rev 3582) @@ -47,6 +47,22 @@ return result; } + public E getRestrictedPollAccount(String pollId, + UserAccount userAccount) throws TopiaException { + + Preconditions.checkNotNull(pollId); + Preconditions.checkNotNull(userAccount); + + TopiaQuery query = new TopiaQuery(PersonToList.class, "p"). + addFrom(Poll.class, "poll"). + setSelect("p." + PersonToList.PROPERTY_POLL_ACCOUNT). + addWhere("poll." + Poll.PROPERTY_POLL_ID, TopiaQuery.Op.EQ, pollId). + addWhere("p." + PersonToList.PROPERTY_POLL_ACCOUNT + "." + PollAccount.PROPERTY_EMAIL, TopiaQuery.Op.EQ, userAccount.getEmail()). + addInElements("p", "poll." + Poll.PROPERTY_VOTING_LIST + "." + VotingList.PROPERTY_POLL_ACCOUNT_PERSON_TO_LIST); + E result = findByQuery(query); + return result; + } + public List<E> getFavoriteListUsers(PersonList favoriteList, TopiaFilterPagerUtil.FilterPagerBean pager) throws TopiaException { Modified: trunk/pollen-services/src/main/java/org/chorem/pollen/services/impl/SecurityService.java =================================================================== --- trunk/pollen-services/src/main/java/org/chorem/pollen/services/impl/SecurityService.java 2012-07-31 19:43:13 UTC (rev 3581) +++ trunk/pollen-services/src/main/java/org/chorem/pollen/services/impl/SecurityService.java 2012-07-31 20:43:25 UTC (rev 3582) @@ -206,16 +206,44 @@ return null; } + public String isCanAccessResult(Poll poll) { + + // check now poll results can be displayed + + boolean publicResults = poll.isPublicResults(); + boolean continuousResults = poll.isContinuousResults(); + + if (!continuousResults && !poll.isClosed()) { + + // results are not continuous and poll is not closed + return n_("pollen.security.error.poll.not.closed.and.results.not.continuous"); + } + + if (!publicResults) { + + // poll results are private, only poll admin can see results + return n_("pollen.security.error.poll.result.private.and.access.not.granted"); + } + + return null; + } public String isCanAccessVote(Poll poll, String accountId, AccountIdRole accountIdRole) { if (AccountIdRole.CREATOR == accountIdRole) { - // poll admin can alwyas access vote page + // poll admin can always access vote page return null; } + if (poll.isPublicResults()) { + + // with public results, everybody can access to vote page (but + // can not vote for a non free poll) + return null; + } + boolean pollIsFree = PollType.FREE == poll.getPollType(); if (pollIsFree && poll.getCreator().getAccountId().equals(accountId)) { @@ -233,7 +261,8 @@ public boolean isCanVote(Poll poll, String accountId, - AccountIdRole accountIdRole) { + AccountIdRole accountIdRole, + UserAccount userAccount) { Date now = serviceContext.getCurrentTime(); @@ -253,6 +282,21 @@ if (!pollIsFree && AccountIdRole.RESTRICTED_VOTER != accountIdRole) { // on none free poll, only restricted user can vote + + if (userAccount != null) { + + // try to find restricted user by user account + PollAccountDAO dao = getDAO(PollAccount.class); + + boolean restrictPollAccountId = isRestrictPollAccountId(dao, poll.getPollId(), userAccount); + + if (restrictPollAccountId) { + + // ok admin is also restricted user of this poll + return true; + } + + } return false; } @@ -419,6 +463,20 @@ } } + private boolean isRestrictPollAccountId(PollAccountDAO dao, String pollId, UserAccount userAccount) { + try { + + PollAccount result = + dao.getRestrictedPollAccount(pollId, userAccount); + + return result != null; + + } catch (TopiaException e) { + throw new PollenTechnicalException( + "Could not check pollAccount existence from poll '" + + pollId + "' and account '" + userAccount.getEmail() + "'", e); + } + } // /** // * Vote is allowed if {@code poll} is running and {@code pollAccount} is // * defined in the {@code poll} restricted list if it's not a {@link PollType#FREE} Modified: trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/json/GetCreatedPolls.java =================================================================== --- trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/json/GetCreatedPolls.java 2012-07-31 19:43:13 UTC (rev 3581) +++ trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/json/GetCreatedPolls.java 2012-07-31 20:43:25 UTC (rev 3582) @@ -26,10 +26,12 @@ import org.chorem.pollen.business.persistence.Poll; import org.chorem.pollen.entities.PollenBinderHelper; import org.chorem.pollen.services.impl.PollService; +import org.chorem.pollen.services.impl.SecurityService; import org.nuiton.util.beans.Binder; import java.util.List; import java.util.Map; +import java.util.Set; /** * Obtain created polls to put in grid for the connected user. @@ -84,12 +86,40 @@ Map<String, Object> map = pollService.pollToMap(poll, binder); -// map.put("voteId", poll.getPollId()); + map.put("voteId", poll.getPollId()); + map.put("resultId", poll.getPollId()); map.put("adminId", poll.getAdminId()); - map.put("functions", Sets.newHashSet("summary")); + map.put("functions", getPollFunctions(poll)); polls[index++] = map; } return SUCCESS; } + protected Set<String> getPollFunctions(Poll poll) { + Set<String> result = Sets.newHashSet(); + + SecurityService securityService = getSecurityService(); + + String canAccessResult = + securityService.isCanAccessResult(poll); + + if (canAccessResult == null) { + + // only if results are public + result.add("result"); + } else { + result.add("noresult"); + } + + boolean canVote = securityService.isCanVote(poll, null, null, getPollenUserAccount()); + if (canVote) { + result.add("vote"); + } else { + result.add("novote"); + } + + result.add("summary"); + return result; + } + } Modified: trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/json/GetInvitedPolls.java =================================================================== --- trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/json/GetInvitedPolls.java 2012-07-31 19:43:13 UTC (rev 3581) +++ trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/json/GetInvitedPolls.java 2012-07-31 20:43:25 UTC (rev 3582) @@ -29,6 +29,7 @@ import org.chorem.pollen.business.persistence.PollAccount; import org.chorem.pollen.entities.PollenBinderHelper; import org.chorem.pollen.services.impl.PollService; +import org.chorem.pollen.services.impl.SecurityService; import org.nuiton.util.beans.Binder; import java.util.List; @@ -94,6 +95,7 @@ map.put("voteId", pollUri.getUri()); map.put("resultId", pollUri.getUri()); + map.put("adminId", poll.getAdminId()); Set<String> functions = getPollFunctions(poll); map.put("functions", functions); @@ -105,11 +107,29 @@ protected Set<String> getPollFunctions(Poll poll) { Set<String> result = Sets.newHashSet(); result.add("vote"); - if (poll.isPublicResults()) { + SecurityService securityService = getSecurityService(); + + String canAccessResult = + securityService.isCanAccessResult(poll); + + if (canAccessResult == null) { + // only if results are public result.add("result"); + } else { + result.add("noresult"); } +// if (poll.isPublicResults()) { +// +// // only if results are public +// result.add("result"); +// } + boolean canAdminResult = securityService.isPollCreator( + poll, null, getPollenUserAccount()); + if (canAdminResult) { + result.add("summary"); + } return result; } } Modified: trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/json/GetParticipatedPolls.java =================================================================== --- trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/json/GetParticipatedPolls.java 2012-07-31 19:43:13 UTC (rev 3581) +++ trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/json/GetParticipatedPolls.java 2012-07-31 20:43:25 UTC (rev 3582) @@ -30,6 +30,7 @@ import org.chorem.pollen.common.PollType; import org.chorem.pollen.entities.PollenBinderHelper; import org.chorem.pollen.services.impl.PollService; +import org.chorem.pollen.services.impl.SecurityService; import org.nuiton.util.beans.Binder; import java.util.List; @@ -101,6 +102,7 @@ ? pollUri.getPollId() : pollUri.getUri(); map.put("resultId", resultId); + map.put("adminId", poll.getAdminId()); Set<String> functions = getPollFunctions(poll); map.put("functions", functions); @@ -112,11 +114,23 @@ private Set<String> getPollFunctions(Poll poll) { Set<String> result = Sets.newHashSet(); result.add("vote"); - if (poll.isPublicResults()) { + SecurityService securityService = getSecurityService(); + + String canAccessResult = + securityService.isCanAccessResult(poll); + + if (canAccessResult == null) { + // only if results are public result.add("result"); } + + boolean canAdminResult = securityService.isPollCreator( + poll, null, getPollenUserAccount()); + if (canAdminResult) { + result.add("summary"); + } return result; } } Modified: trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/AbstractVoteAction.java =================================================================== --- trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/AbstractVoteAction.java 2012-07-31 19:43:13 UTC (rev 3581) +++ trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/AbstractVoteAction.java 2012-07-31 20:43:25 UTC (rev 3582) @@ -477,7 +477,8 @@ } voteAllowed = getSecurityService().isCanVote(poll, accountId, - accountIdRole); + accountIdRole, + getPollenUserAccount()); } // is can display result link ? Modified: trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/SummaryPoll.java =================================================================== --- trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/SummaryPoll.java 2012-07-31 19:43:13 UTC (rev 3581) +++ trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/SummaryPoll.java 2012-07-31 20:43:25 UTC (rev 3582) @@ -88,6 +88,17 @@ return url.getUrl(); } + public String getShowVoteUrl() { + PollUrl url = getPollUrlService().getPollVoteUrl(poll); + if (poll.getPollType() == PollType.FREE) { + + // can removed accountId only for free poll + //FIXME Should found out in ohter case the accountId (if exists for the connected id) if no accountId is given + getSecurityService().removeAccountIdWhenConnected(url, getPollenUserAccount()); + } + return url.getUrl(); + } + public String getModerateUrl() { PollUrl url = getPollUrlService().getPollModerateUrl(poll); getSecurityService().removeAccountIdWhenConnected(url, getPollenUserAccount()); @@ -122,6 +133,10 @@ return getSecurityService().isCanClosePoll(poll, accountIdRole); } + public boolean isCanShowVote() { + return poll.isPublicResults() && !isCanVote(); + } + public boolean isCanShowResult() { String errorMessage = getSecurityService().isCanAccessResult( poll, accountIdRole); @@ -131,11 +146,17 @@ public boolean isCanVote() { String accountId = getAccountId(); if (accountIdRole == SecurityService.AccountIdRole.CREATOR) { - accountId = null; + + if (poll.getPollType() != PollType.FREE) { + + } else { + accountId = null; + } } return getSecurityService().isCanVote(poll, accountId, - accountIdRole); + accountIdRole, + getPollenUserAccount()); } @Override Modified: trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/VoteForPoll.java =================================================================== --- trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/VoteForPoll.java 2012-07-31 19:43:13 UTC (rev 3581) +++ trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/poll/VoteForPoll.java 2012-07-31 20:43:25 UTC (rev 3582) @@ -66,10 +66,13 @@ addFlashWarning(_("pollen.information.pollNotStarted")); } else if (isPollFinished()) { addFlashWarning(_("pollen.information.pollFinished")); + } else if (!isVoteAllowed()) { + addFlashWarning(_("pollen.information.pollCanNotVote")); } if (isPollChoiceRunning()) { addFlashMessage(_("pollen.information.pollChoiceRunning")); } + } @Override Modified: trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/security/PollResultAccessRequired.java =================================================================== --- trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/security/PollResultAccessRequired.java 2012-07-31 19:43:13 UTC (rev 3581) +++ trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/security/PollResultAccessRequired.java 2012-07-31 20:43:25 UTC (rev 3582) @@ -76,7 +76,6 @@ response, mappedValue); - boolean withAccountId = pollUri.isAccountIdNotBlank(); if (withAccountId) { Modified: trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/security/PollVoteAccessRequired.java =================================================================== --- trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/security/PollVoteAccessRequired.java 2012-07-31 19:43:13 UTC (rev 3581) +++ trunk/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/security/PollVoteAccessRequired.java 2012-07-31 20:43:25 UTC (rev 3582) @@ -60,7 +60,7 @@ serviceContext.newService(SecurityService.class); // get sane poll - final Poll poll = getPollIdSane(pollUri, serviceContext, request); + Poll poll = getPollIdSane(pollUri, serviceContext, request); boolean isAccessAllowed = poll != null; Modified: trunk/pollen-ui-struts2/src/main/resources/i18n/pollen-ui-struts2_en_GB.properties =================================================================== --- trunk/pollen-ui-struts2/src/main/resources/i18n/pollen-ui-struts2_en_GB.properties 2012-07-31 19:43:13 UTC (rev 3581) +++ trunk/pollen-ui-struts2/src/main/resources/i18n/pollen-ui-struts2_en_GB.properties 2012-07-31 20:43:25 UTC (rev 3582) @@ -59,6 +59,7 @@ pollen.action.pollVotingListEdit=Edit that voting list pollen.action.register=Register pollen.action.send=Send +pollen.action.showVoteAction.help=Share this link with people who can't vote but still can see votes pollen.action.summaryPoll=Goto administration page of the poll pollen.action.validate=Submit pollen.action.voteAction.help=Share this link with people to vote @@ -280,6 +281,7 @@ pollen.information.pollAccount.removedFromFavoriteList=Member '<strong>%s</strong>' removed from favorite list. pollen.information.pollAccount.updated=Your account was updated. pollen.information.pollAccount.updatedTofavoriteList=Member '<strong>%s</strong>' updated in favorite list. +pollen.information.pollCanNotVote=You are not authorize to vote, but still can you can access to votes (public results poll) pollen.information.pollChoiceRunning=Adding choices is allowed. pollen.information.pollClosed=This poll is closed. You can not vote anymore. pollen.information.pollFinished=This poll is finished. You can not vote anymore. @@ -302,6 +304,7 @@ pollen.label.pollModerateVotePage=Moderate your poll pollen.label.pollRegisterPage=If you are a logged user, you can find these links on the page pollen.label.pollResultPage=Count votes +pollen.label.pollShowVotePage=See vote on your poll pollen.label.pollVotePage=Vote on your poll pollen.legend.attachPoll=Attach an anonymous poll to your user account pollen.legend.login=Login Modified: trunk/pollen-ui-struts2/src/main/resources/i18n/pollen-ui-struts2_fr_FR.properties =================================================================== --- trunk/pollen-ui-struts2/src/main/resources/i18n/pollen-ui-struts2_fr_FR.properties 2012-07-31 19:43:13 UTC (rev 3581) +++ trunk/pollen-ui-struts2/src/main/resources/i18n/pollen-ui-struts2_fr_FR.properties 2012-07-31 20:43:25 UTC (rev 3582) @@ -59,6 +59,7 @@ pollen.action.pollVotingListEdit=Editer ce groupe de votants pollen.action.register=S'enregistrer pollen.action.send=Envoyer +pollen.action.showVoteAction.help=Partager ce lien avec ceuw qui ne peuvent voter mais peuvent quand même voir les votes pollen.action.summaryPoll=Aller sur la page d'administration du sondage pollen.action.validate=Valider pollen.action.voteAction.help=Partager ce lien avec ceux que vous voulez voir voter @@ -281,6 +282,7 @@ pollen.information.pollAccount.removedFromFavoriteList=Le membre '<strong>%s</strong>' a été supprimé de la liste des favoris. pollen.information.pollAccount.updated=Votre compte a bien été mis à jour. pollen.information.pollAccount.updatedTofavoriteList=Le membre '<strong>%s</strong>' a été mise à jour dans la liste des favoris. +pollen.information.pollCanNotVote=Vous n'êtes pas autorisé à voter, mais vous pouvez cependant accéder au votes (sondage à resultats publics) pollen.information.pollChoiceRunning=L'ajout de choix est possible. pollen.information.pollClosed=Ce sondage est clos. Vous ne pouvez plus voter. pollen.information.pollFinished=Ce sondage est terminé. Vous ne pouvez plus voter. @@ -303,6 +305,7 @@ pollen.label.pollModerateVotePage=Modérer le sondage pollen.label.pollRegisterPage=Si vous êtes un utilisateur identifié, vous pouvez retrouver ces liens dans la page pollen.label.pollResultPage=Dépouiller le sondage +pollen.label.pollShowVotePage=Voir les votes pollen.label.pollVotePage=Voter pollen.legend.attachPoll=Attacher un sondage anonyme à votre compte pollen.legend.login=Login Modified: trunk/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/poll/summary.jsp =================================================================== --- trunk/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/poll/summary.jsp 2012-07-31 19:43:13 UTC (rev 3581) +++ trunk/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/poll/summary.jsp 2012-07-31 20:43:25 UTC (rev 3582) @@ -106,6 +106,19 @@ </span> </div> </s:if> +<s:elseif test="canShowVote"> + <div class="ui-widget-content-green ui-corner-all"> + <img src="<s:url value='/img/vote.png'/>" class="imgAction" + alt="<s:text name='pollen.action.showVoteAction.help'/>" + title="<s:text name='pollen.action.showVoteAction.help'/>"/> + <s:a href="%{showVoteUrl}"> + <strong><s:text name="pollen.label.pollShowVotePage"/></strong> + </s:a> + <span class="fright url" id='showVoteUrl'> + <s:property value="%{showVoteUrl}"/> + </span> + </div> +</s:elseif> <%--Show Results--%> <s:if test="canShowResult"> Modified: trunk/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/pollListHelper.jsp =================================================================== --- trunk/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/pollListHelper.jsp 2012-07-31 19:43:13 UTC (rev 3581) +++ trunk/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/pollListHelper.jsp 2012-07-31 20:43:25 UTC (rev 3582) @@ -85,15 +85,18 @@ if (cellvalue.indexOf('novote') > -1) { result += "<image src='${blankImg}'>"; } - if (cellvalue.indexOf('summary') > -1) { - result += formatLink("${summaryUrl}" + adminId, "${summaryImg}", "Moderate", "${summaryTitle}") - } if (cellvalue.indexOf('moderate') > -1) { result += formatLink("${voteUrl}" + moderateId, "${moderateImg}", "Moderate", "${moderateTitle}") } if (cellvalue.indexOf('result') > -1) { result += formatLink("${resultUrl}" + resultId, "${resultImg}", "Result", "${resultTitle}") } + if (cellvalue.indexOf('noresult') > -1) { + result += "<image src='${blankImg}'>"; + } + if (cellvalue.indexOf('summary') > -1) { + result += formatLink("${summaryUrl}" + adminId, "${summaryImg}", "Moderate", "${summaryTitle}") + } if (cellvalue.indexOf('edit') > -1) { result += formatLink("${editUrl}" + adminId, "${editImg}", "Edit", "${editTitle}") } Modified: trunk/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/user/createdList.jsp =================================================================== --- trunk/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/user/createdList.jsp 2012-07-31 19:43:13 UTC (rev 3581) +++ trunk/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/user/createdList.jsp 2012-07-31 20:43:25 UTC (rev 3582) @@ -75,7 +75,7 @@ title='%{getText("pollen.common.beginDate")}'/> <sjg:gridColumn name="endDate" title='%{getText("pollen.common.endDate")}'/> <sjg:gridColumn name="functions" title='%{getText("pollen.common.functions")}' - formatter="pollFunctions" width="65" sortable="false"/> + formatter="pollFunctions" width="75" sortable="false"/> </sjg:grid> <br/> Modified: trunk/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/user/invitedList.jsp =================================================================== --- trunk/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/user/invitedList.jsp 2012-07-31 19:43:13 UTC (rev 3581) +++ trunk/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/user/invitedList.jsp 2012-07-31 20:43:25 UTC (rev 3582) @@ -59,5 +59,5 @@ title='%{getText("pollen.common.beginDate")}'/> <sjg:gridColumn name="endDate" title='%{getText("pollen.common.endDate")}'/> <sjg:gridColumn name="functions" title='%{getText("pollen.common.functions")}' - formatter="pollFunctions" width="55" sortable="false"/> + formatter="pollFunctions" width="75" sortable="false"/> </sjg:grid> Modified: trunk/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/user/participatedList.jsp =================================================================== --- trunk/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/user/participatedList.jsp 2012-07-31 19:43:13 UTC (rev 3581) +++ trunk/pollen-ui-struts2/src/main/webapp/WEB-INF/jsp/user/participatedList.jsp 2012-07-31 20:43:25 UTC (rev 3582) @@ -59,5 +59,5 @@ title='%{getText("pollen.common.beginDate")}'/> <sjg:gridColumn name="endDate" title='%{getText("pollen.common.endDate")}'/> <sjg:gridColumn name="functions" title='%{getText("pollen.common.functions")}' - formatter="pollFunctions" width="55" sortable="false"/> + formatter="pollFunctions" width="75" sortable="false"/> </sjg:grid>