Pollen-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
May 2010
- 2 participants
- 39 discussions
Author: fdesbois
Date: 2010-05-19 14:59:57 +0200 (Wed, 19 May 2010)
New Revision: 3001
Url: http://chorem.org/repositories/revision/pollen/3001
Log:
Create models to simplify lists managment in PollForm
Added:
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/ParticipantListModel.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/ParticipantsListener.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/PollFormModel.java
Modified:
trunk/pollen-business/src/main/java/org/chorem/pollen/PollenBusinessException.java
trunk/pollen-business/src/main/java/org/chorem/pollen/entity/FavoriteListImpl.java
trunk/pollen-business/src/main/java/org/chorem/pollen/entity/ParticipantHelper.java
trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollAccountImpl.java
trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServicePollImpl.java
trunk/pollen-business/src/main/resources/i18n/pollen-business-en_GB.properties
trunk/pollen-business/src/main/resources/i18n/pollen-business-fr_FR.properties
trunk/pollen-business/src/main/xmi/pollen.zargo
trunk/pollen-ui/pom.xml
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/SubForm.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/PollForm.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenManager.java
trunk/pollen-ui/src/main/webapp/poll/PollForm.tml
trunk/pom.xml
Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/PollenBusinessException.java
===================================================================
--- trunk/pollen-business/src/main/java/org/chorem/pollen/PollenBusinessException.java 2010-05-18 17:09:12 UTC (rev 3000)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/PollenBusinessException.java 2010-05-19 12:59:57 UTC (rev 3001)
@@ -1,24 +1,24 @@
+package org.chorem.pollen;
-package org.chorem.pollen;
import static org.nuiton.i18n.I18n.n_;
/**
* PollenBusinessException
- *
+ * <p/>
* Created: 24 févr. 2010
*
* @author fdesbois
* @version $Revision$
- *
- * Mise a jour: $Date$
- * par : $Author$
+ * <p/>
+ * Mise a jour: $Date$
+ * par : $Author$
*/
public class PollenBusinessException extends Exception {
private static final long serialVersionUID = 1L;
protected PollenExceptionType type;
-
+
protected Object[] args;
public PollenBusinessException(PollenExceptionType type, Object... args) {
@@ -28,42 +28,48 @@
}
public PollenBusinessException(Throwable exception,
- PollenExceptionType type, Object... args) {
+ PollenExceptionType type, Object... args) {
super(type.getMessage(), exception);
this.args = args;
this.type = type;
}
public enum PollenExceptionType {
- /** Exception when poll is not found in data **/
+
+ /** Exception when poll is not found in data * */
POLL_NOT_EXIST(n_("pollen.exception.poll_not_exist")),
- /** Exception when user login exists in data **/
+ /** Exception when user login exists in data * */
USER_LOGIN_EXIST(n_("pollen.exception.user_login_exist")),
- /** Exception when user email exists in data **/
+ /** Exception when user email exists in data * */
USER_EMAIL_EXIST(n_("pollen.exception.user_email_exist")),
- /** Exception when user is not found in data **/
+ /** Exception when user is not found in data * */
USER_NOT_EXIST(n_("pollen.exception.user_not_exist")),
- /** Exception when password is not valid for some user **/
+ /** Exception when password is not valid for some user * */
USER_WRONG_PASSWORD(n_("pollen.exception.user_wrong_password")),
- /** Exception when stmp server is not available **/
+ /** Exception when stmp server is not available * */
SMTP_NOT_AVAILABLE(n_("pollen.exception.smtp_not_available")),
- /** Exception when favorite list name is already defined for user **/
+ /** Exception when favorite list name is already defined for user * */
FAVORITE_LIST_NAME_EXIST(
n_("pollen.exception.favorite_list_name_exist")),
/**
- * Exception when participant name ($2) and email ($3) are
- * already defined for the current list ($1).
- **/
+ * Exception when participant name ($2) and email ($3) are already
+ * defined for the current list ($1).
+ */
PARTICIPANT_EXIST(n_("pollen.exception.participant_exist")),
-
+
/**
* Exception when favorite participant name ($2) with no email is
* already defined for the current list ($1).
- **/
+ */
PARTICIPANT_EXIST_WITHOUT_EMAIL(
n_("pollen.exception.participant_exist_without_email")),
- /** Exception when poll already exist at creation **/
- POLL_EXIST(n_("pollen.exception.poll_exist"));
+ /** Exception when poll already exist at creation * */
+ POLL_EXIST(n_("pollen.exception.poll_exist")),
+ /**
+ * Exception when doubloons ($2) are found when adding participants in a
+ * list ($1).
+ */
+ PARTICIPANT_DOUBLOONS(n_("pollen.exception.participant_doubloons"));
private String message;
Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/entity/FavoriteListImpl.java
===================================================================
--- trunk/pollen-business/src/main/java/org/chorem/pollen/entity/FavoriteListImpl.java 2010-05-18 17:09:12 UTC (rev 3000)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/entity/FavoriteListImpl.java 2010-05-19 12:59:57 UTC (rev 3001)
@@ -13,7 +13,7 @@
*/
public class FavoriteListImpl extends FavoriteListAbstract {
- @Override
+ @Override
public Collection<Participant> getParticipants() {
Collection<Participant> results = new ArrayList<Participant>();
for (FavoriteParticipant account : getFavoriteParticipant()) {
@@ -26,23 +26,26 @@
public void setParticipants(Collection<Participant> participants)
throws PollenBusinessException {
setFavoriteParticipant(new ArrayList<FavoriteParticipant>());
- for (Participant participant : participants) {
- addParticipant(participant);
- }
+ ParticipantHelper.setParticipants(this, participants);
}
- protected void addParticipant(Participant participant)
- throws PollenBusinessException {
+ @Override
+ public String addParticipant(Participant participant) {
String name = participant.getName();
String email = participant.getEmail();
-
- ParticipantHelper.checkParticipantExist(this, name, email);
+ String error =
+ ParticipantHelper.checkParticipantExist(this, name, email);
+ if (error != null) {
+ return error;
+ }
+
FavoriteParticipant favorite = new FavoriteParticipantImpl();
favorite.setName(participant.getName());
favorite.setEmail(participant.getEmail());
favorite.setWeight(participant.getWeight());
favorite.setFavoriteList(this);
addFavoriteParticipant(favorite);
+ return null;
}
}
Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/entity/ParticipantHelper.java
===================================================================
--- trunk/pollen-business/src/main/java/org/chorem/pollen/entity/ParticipantHelper.java 2010-05-18 17:09:12 UTC (rev 3000)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/entity/ParticipantHelper.java 2010-05-19 12:59:57 UTC (rev 3001)
@@ -1,7 +1,11 @@
package org.chorem.pollen.entity;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.chorem.pollen.PollenBusinessException;
+import java.util.Collection;
+
/**
* Helper classes for common Participant manipulations.
*
@@ -12,6 +16,8 @@
*/
public class ParticipantHelper {
+ private static final Log log = LogFactory.getLog(ParticipantHelper.class);
+
/**
* Check the existence of participant from a {@code list}. The existence is
* tested on {@code name} and {@code email}. The {@code email} can be null.
@@ -19,12 +25,11 @@
* @param list ParticipantList which contains a list of Participant
* @param name Name of the participant to check
* @param email Email of the participant to check
- * @throws PollenBusinessException if name and email correspond to an
- * existing participant in the list.
+ * @return an error code if participant already exist : simply the
+ * concatenation of name and email.
*/
- public static void checkParticipantExist(
- ParticipantList list, String name, String email)
- throws PollenBusinessException {
+ public static String checkParticipantExist(
+ ParticipantList list, String name, String email) {
for (Participant participant : list.getParticipants()) {
boolean emailNull = (email == null && participant.getEmail() == null);
boolean emailCheck = emailNull ||
@@ -32,16 +37,48 @@
if (name != null && name.equals(participant.getName()) && emailCheck) {
if (emailNull) {
- throw new PollenBusinessException(
- PollenBusinessException.PollenExceptionType.PARTICIPANT_EXIST_WITHOUT_EMAIL,
- list.getName(), name);
+ return name;
} else {
- throw new PollenBusinessException(
- PollenBusinessException.PollenExceptionType.PARTICIPANT_EXIST,
- list.getName(), name, email);
+ return name + " (" + email + ")";
}
}
}
+ return null;
}
+ /**
+ * Set the {@code participants} in the {@code list}. Doubloons can be found
+ * during adding process. An exception will be thrown in case of doubloons.
+ *
+ * @param list where participants will be added
+ * @param participants to add to the list
+ * @throws PollenBusinessException for doubloons case
+ */
+ public static void setParticipants(ParticipantList list,
+ Collection<Participant> participants)
+ throws PollenBusinessException {
+ if (log.isDebugEnabled()) {
+ log.debug("Set participants for list : " + list.getName());
+ }
+ StringBuilder doubloons = new StringBuilder();
+ String separator = ", ";
+ for (Participant participant : participants) {
+ // Add the participant to the list
+ String doubloon = list.addParticipant(participant);
+ // Check error doubloon
+ if (doubloon != null) {
+ doubloons.append(separator).append(doubloon);
+ } else if (log.isDebugEnabled()) {
+ log.debug("Participant added : " + participant.getName() +
+ " _ " + participant.getEmail());
+ }
+ }
+ // If doubloons are found, throw an exception
+ if (!doubloons.toString().isEmpty()) {
+ throw new PollenBusinessException(
+ PollenBusinessException.PollenExceptionType.PARTICIPANT_DOUBLOONS,
+ list.getName(), doubloons.substring(separator.length()));
+ }
+ }
+
}
Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollAccountImpl.java
===================================================================
--- trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollAccountImpl.java 2010-05-18 17:09:12 UTC (rev 3000)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollAccountImpl.java 2010-05-19 12:59:57 UTC (rev 3001)
@@ -1,6 +1,7 @@
package org.chorem.pollen.entity;
-import org.chorem.pollen.PollenBinderHelper;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.chorem.pollen.PollenBusinessException;
import java.util.ArrayList;
@@ -14,6 +15,8 @@
*/
public class PollAccountImpl extends PollAccountAbstract {
+ private static final Log log = LogFactory.getLog(PollAccountImpl.class);
+
@Override
public Collection<Participant> getParticipants() {
// for a simple account, will return null
@@ -25,34 +28,37 @@
for (PollAccount account : getChild()) {
results.add(account);
}
- }
+ }
return results;
}
@Override
public void setParticipants(Collection<Participant> participants)
throws PollenBusinessException {
- if (!list) {
+ if (!list) {
throw new UnsupportedOperationException(
"Unable to set participants from a child account");
}
setChild(new ArrayList<PollAccount>());
- for (Participant participant : participants) {
- addParticipant(participant);
- }
+ ParticipantHelper.setParticipants(this, participants);
}
- protected void addParticipant(Participant participant)
- throws PollenBusinessException {
+ @Override
+ public String addParticipant(Participant participant) {
String name = participant.getName();
String email = participant.getEmail();
- ParticipantHelper.checkParticipantExist(this, name, email);
+ String error =
+ ParticipantHelper.checkParticipantExist(this, name, email);
+ if (error != null) {
+ return error;
+ }
PollAccount account = new PollAccountImpl();
account.setName(name);
account.setEmail(email);
account.setWeight(participant.getWeight());
addChild(account);
+ return null;
}
}
Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServicePollImpl.java
===================================================================
--- trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServicePollImpl.java 2010-05-18 17:09:12 UTC (rev 3000)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServicePollImpl.java 2010-05-19 12:59:57 UTC (rev 3001)
@@ -1,10 +1,5 @@
-
package org.chorem.pollen.service;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
import org.apache.commons.collections.CollectionUtils;
import org.chorem.pollen.PollenBinderHelper;
import org.chorem.pollen.PollenBusinessException;
@@ -26,18 +21,21 @@
import org.chorem.pollen.entity.UserAccount;
import org.nuiton.topia.TopiaContext;
import org.nuiton.topia.TopiaException;
-import org.nuiton.topia.persistence.util.TopiaEntityBinder;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
/**
* ServicePoll
- *
+ * <p/>
* Created: 23 mars 2010
*
* @author fdesbois
* @version $Revision$
- *
- * Mise a jour: $Date$
- * par : $Author$
+ * <p/>
+ * Mise a jour: $Date$
+ * par : $Author$
*/
public class ServicePollImpl extends ServicePollAbstract {
@@ -54,7 +52,7 @@
@Override
protected void treateError(TopiaContext transaction, Exception eee,
- String message, Object... args) throws PollenException {
+ String message, Object... args) throws PollenException {
context.treateError(transaction, eee, message, args);
}
@@ -88,11 +86,11 @@
}
@Override
- protected void executeCreatePoll(TopiaContext transaction,
- List<Object> errorArgs, Poll poll, Collection<ParticipantList> lists)
+ protected void executeCreatePoll(TopiaContext transaction,
+ List<Object> errorArgs, Poll poll, Collection<ParticipantList> lists)
throws TopiaException,
- IllegalArgumentException,
- PollenBusinessException {
+ IllegalArgumentException,
+ PollenBusinessException {
errorArgs.add(poll.getTitle());
errorArgs.add(poll.getUid());
@@ -178,7 +176,7 @@
}
// Create accounts only on first participant list
results = createPersonAccounts(accountDAO,
- lists.iterator().next());
+ lists.iterator().next());
break;
case GROUP:
if (CollectionUtils.isEmpty(lists)) {
@@ -189,7 +187,7 @@
for (ParticipantList list : lists) {
// Create the accountList
PollAccount accountList = accountDAO.create(
- context.createPollenUrlId());
+ context.createPollenUrlId());
accountList.setList(true);
accountList.setName(list.getName());
@@ -206,7 +204,7 @@
}
protected List<PollAccount> createPersonAccounts(PollAccountDAO dao,
- ParticipantList list)
+ ParticipantList list)
throws TopiaException {
List<PollAccount> results = new ArrayList<PollAccount>();
@@ -234,7 +232,7 @@
for (Choice choice : source) {
Choice newChoice = dao.create();
PollenBinderHelper.getSimpleTopiaBinder(Choice.class).
- copy(choice, newChoice);
+ copy(choice, newChoice);
results.add(newChoice);
}
return results;
@@ -242,7 +240,7 @@
@Override
protected void executeUpdatePoll(TopiaContext transaction,
- Poll poll) throws TopiaException {
+ Poll poll) throws TopiaException {
throw new UnsupportedOperationException("Not supported yet.");
}
@@ -266,19 +264,19 @@
@Override
protected void executeCreateUpdateVote(TopiaContext transaction,
- PollAccount person) throws TopiaException {
+ PollAccount person) throws TopiaException {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
- protected void executeDeleteVote(TopiaContext transaction, Poll poll,
- PollAccount person) throws TopiaException {
+ protected void executeDeleteVote(TopiaContext transaction, Poll poll,
+ PollAccount person) throws TopiaException {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
- protected Poll executeGetPollForUpdate(TopiaContext transaction,
- String pollUId) throws PollenBusinessException, TopiaException {
+ protected Poll executeGetPollForUpdate(TopiaContext transaction,
+ String pollUId) throws PollenBusinessException, TopiaException {
throw new UnsupportedOperationException("Not supported yet.");
}
@@ -296,33 +294,33 @@
@Override
protected List<Poll> executeGetPollsByUser(TopiaContext transaction,
- UserAccount user) throws TopiaException {
+ UserAccount user) throws TopiaException {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
protected List<Comment> executeGetComments(TopiaContext transaction,
- Poll poll, int startIndex, int endIndex)
+ Poll poll, int startIndex, int endIndex)
throws TopiaException {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
protected List<PollAccount> executeGetVotes(TopiaContext transaction,
- Poll poll, int startIndex, int endIndex)
+ Poll poll, int startIndex, int endIndex)
throws TopiaException {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
- protected Poll executeGetPollForResults(TopiaContext transaction,
- String pollUId) throws PollenBusinessException, TopiaException {
+ protected Poll executeGetPollForResults(TopiaContext transaction,
+ String pollUId) throws PollenBusinessException, TopiaException {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
- protected Poll executeGetPollForVote(TopiaContext transaction,
- String pollUId) throws PollenBusinessException, TopiaException {
+ protected Poll executeGetPollForVote(TopiaContext transaction,
+ String pollUId) throws PollenBusinessException, TopiaException {
throw new UnsupportedOperationException("Not supported yet.");
}
@@ -337,6 +335,7 @@
@Override
protected Participant executeGetNewPollParticipant() {
PollAccount participant = new PollAccountImpl();
+ participant.setWeight(1.);
return participant;
}
Modified: trunk/pollen-business/src/main/resources/i18n/pollen-business-en_GB.properties
===================================================================
--- trunk/pollen-business/src/main/resources/i18n/pollen-business-en_GB.properties 2010-05-18 17:09:12 UTC (rev 3000)
+++ trunk/pollen-business/src/main/resources/i18n/pollen-business-en_GB.properties 2010-05-19 12:59:57 UTC (rev 3001)
@@ -81,6 +81,7 @@
pollen.exception.favorite_participant_exist=
pollen.exception.favorite_participant_exist_without_email=
pollen.exception.load_configuration=
+pollen.exception.participant_doubloons=
pollen.exception.participant_exist=
pollen.exception.participant_exist_without_email=
pollen.exception.poll_exist=
Modified: trunk/pollen-business/src/main/resources/i18n/pollen-business-fr_FR.properties
===================================================================
--- trunk/pollen-business/src/main/resources/i18n/pollen-business-fr_FR.properties 2010-05-18 17:09:12 UTC (rev 3000)
+++ trunk/pollen-business/src/main/resources/i18n/pollen-business-fr_FR.properties 2010-05-19 12:59:57 UTC (rev 3001)
@@ -78,6 +78,7 @@
pollen.error.serviceVote.hasAlreadyVoted=
pollen.exception.favorite_list_name_exist=La liste %1$s existe d\u00E9j\u00E0 pour l'utilisateur %2$s
pollen.exception.load_configuration=La configuration n'a pas \u00E9t\u00E9 charg\u00E9e correctement \! Veuillez v\u00E9rifier le d\u00E9marrage de l'application.
+pollen.exception.participant_doubloons=Les doublons de la liste %1$s ont \u00E9t\u00E9 ignor\u00E9s \: %2$s
pollen.exception.participant_exist=La liste %1$s contient d\u00E9j\u00E0 un votant nomm\u00E9 %2$s avec un email %3$s
pollen.exception.participant_exist_without_email=La liste %1$s contient d\u00E9j\u00E0 un votant nomm\u00E9 %2$s avec aucun email
pollen.exception.poll_exist=
Modified: trunk/pollen-business/src/main/xmi/pollen.zargo
===================================================================
(Binary files differ)
Modified: trunk/pollen-ui/pom.xml
===================================================================
--- trunk/pollen-ui/pom.xml 2010-05-18 17:09:12 UTC (rev 3000)
+++ trunk/pollen-ui/pom.xml 2010-05-19 12:59:57 UTC (rev 3001)
@@ -1,201 +1,209 @@
<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
+ <modelVersion>4.0.0</modelVersion>
- <!-- ************************************************************* -->
- <!-- *** POM Relationships *************************************** -->
- <!-- ************************************************************* -->
+ <!-- ************************************************************* -->
+ <!-- *** POM Relationships *************************************** -->
+ <!-- ************************************************************* -->
- <parent>
- <groupId>org.chorem</groupId>
- <artifactId>pollen</artifactId>
- <version>2.0-SNAPSHOT</version>
- </parent>
+ <parent>
+ <groupId>org.chorem</groupId>
+ <artifactId>pollen</artifactId>
+ <version>2.0-SNAPSHOT</version>
+ </parent>
- <groupId>org.chorem.pollen</groupId>
- <artifactId>pollen-ui</artifactId>
+ <groupId>org.chorem.pollen</groupId>
+ <artifactId>pollen-ui</artifactId>
- <dependencies>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>pollen-business</artifactId>
- <version>${project.version}</version>
- </dependency>
- <dependency>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.tapestry</groupId>
- <artifactId>tapestry-core</artifactId>
- </dependency>
- <dependency>
- <groupId>org.nuiton.web</groupId>
- <artifactId>nuiton-tapestry-extra</artifactId>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.tapestry</groupId>
- <artifactId>tapestry-upload</artifactId>
- </dependency>
- <dependency>
- <groupId>org.chenillekit</groupId>
- <artifactId>chenillekit-tapestry</artifactId>
- </dependency>
- <dependency>
- <groupId>jfree</groupId>
- <artifactId>jfreechart</artifactId>
- </dependency>
- <dependency>
- <groupId>javassist</groupId>
- <artifactId>javassist</artifactId>
- </dependency>
- <dependency>
- <groupId>net.sf.opencsv</groupId>
- <artifactId>opencsv</artifactId>
- </dependency>
- <dependency>
- <groupId>rome</groupId>
- <artifactId>rome</artifactId>
- </dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- </dependency>
- <dependency>
- <groupId>org.nuiton</groupId>
- <artifactId>nuiton-utils</artifactId>
- </dependency>
- <dependency>
- <groupId>org.jvnet.hudson.winstone</groupId>
- <artifactId>winstone</artifactId>
- <scope>provided</scope>
- </dependency>
- </dependencies>
+ <dependencies>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>pollen-business</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-collections</groupId>
+ <artifactId>commons-collections</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tapestry</groupId>
+ <artifactId>tapestry-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.nuiton.web</groupId>
+ <artifactId>nuiton-tapestry-extra</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tapestry</groupId>
+ <artifactId>tapestry-upload</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.chenillekit</groupId>
+ <artifactId>chenillekit-tapestry</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>jfree</groupId>
+ <artifactId>jfreechart</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>javassist</groupId>
+ <artifactId>javassist</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>net.sf.opencsv</groupId>
+ <artifactId>opencsv</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>rome</groupId>
+ <artifactId>rome</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.nuiton</groupId>
+ <artifactId>nuiton-utils</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.jvnet.hudson.winstone</groupId>
+ <artifactId>winstone</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ </dependencies>
- <!-- ************************************************************* -->
- <!-- *** Project Information ************************************* -->
- <!-- ************************************************************* -->
+ <!-- ************************************************************* -->
+ <!-- *** Project Information ************************************* -->
+ <!-- ************************************************************* -->
- <name>Pollen :: Web Interface</name>
- <description>Interface Web Tapestry pour Pollen</description>
+ <name>Pollen :: Web Interface</name>
+ <description>Interface Web Tapestry pour Pollen</description>
- <!-- ************************************************************* -->
- <!-- *** Build Settings ****************************************** -->
- <!-- ************************************************************* -->
+ <!-- ************************************************************* -->
+ <!-- *** Build Settings ****************************************** -->
+ <!-- ************************************************************* -->
- <packaging>war</packaging>
+ <packaging>war</packaging>
- <properties>
- <redmine.releaseFiles>target/${project.build.finalName}.war</redmine.releaseFiles>
+ <properties>
+ <redmine.releaseFiles>target/${project.build.finalName}.war
+ </redmine.releaseFiles>
- <i18n.collectOutputName>app</i18n.collectOutputName>
- <i18n.bundleOutputName>app</i18n.bundleOutputName>
- </properties>
+ <i18n.collectOutputName>app</i18n.collectOutputName>
+ <i18n.bundleOutputName>app</i18n.bundleOutputName>
+ </properties>
- <reporting>
- <!-- Adds a report detailing the components, mixins and base classes defined by this module. -->
- <!-- <plugins>
- <plugin>
- <groupId>org.apache.tapestry</groupId>
- <artifactId>tapestry-component-report</artifactId>
- <version>${tapestry.version}</version>
- <configuration>
- <rootPackage>org.chorem.pollen.ui</rootPackage>
- </configuration>
- </plugin>
- </plugins> -->
- </reporting>
+ <reporting>
+ <!-- Adds a report detailing the components, mixins and base classes defined by this module. -->
+ <!-- <plugins>
+ <plugin>
+ <groupId>org.apache.tapestry</groupId>
+ <artifactId>tapestry-component-report</artifactId>
+ <version>${tapestry.version}</version>
+ <configuration>
+ <rootPackage>org.chorem.pollen.ui</rootPackage>
+ </configuration>
+ </plugin>
+ </plugins> -->
+ </reporting>
- <build>
- <!-- call result war : pollen-xxx.war -->
- <finalName>pollen-${project.version}</finalName>
+ <build>
+ <!-- call result war : pollen-xxx.war -->
+ <finalName>pollen-${project.version}</finalName>
- <!-- Add main class into war to make it executable -->
- <plugins>
+ <!-- Add main class into war to make it executable -->
+ <plugins>
- <plugin>
- <groupId>org.nuiton.i18n</groupId>
- <artifactId>maven-i18n-plugin</artifactId>
- <executions>
- <execution>
- <goals>
- <goal>tapestry-bundle</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
-
- <plugin>
- <artifactId>maven-war-plugin</artifactId>
- <configuration>
- <archive>
- <manifest>
- <mainClass>org.nuiton.util.war.WinstoneLauncher</mainClass>
- </manifest>
- </archive>
- <overlays>
- <overlay>
- <groupId>org.nuiton</groupId>
- <artifactId>nuiton-utils</artifactId>
- <type>jar</type>
- <includes>
- <include>**/war/Winstone*</include>
- </includes>
- </overlay>
- <overlay>
- <groupId>org.jvnet.hudson.winstone</groupId>
- <artifactId>winstone</artifactId>
- <type>jar</type>
- </overlay>
- </overlays>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.mortbay.jetty</groupId>
- <artifactId>jetty-maven-plugin</artifactId>
- <configuration>
- <connectors>
- <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">
- <port>8888</port>
- </connector>
- </connectors>
- </configuration>
- </plugin>
- </plugins>
- </build>
+ <plugin>
+ <groupId>org.nuiton.i18n</groupId>
+ <artifactId>maven-i18n-plugin</artifactId>
+ <executions>
+ <execution>
+ <goals>
+ <goal>tapestry-bundle</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
- <!--<repositories>
+ <plugin>
+ <artifactId>maven-war-plugin</artifactId>
+ <configuration>
+ <archive>
+ <manifest>
+ <mainClass>org.nuiton.util.war.WinstoneLauncher</mainClass>
+ </manifest>
+ </archive>
+ <overlays>
+ <overlay>
+ <groupId>org.nuiton</groupId>
+ <artifactId>nuiton-utils</artifactId>
+ <type>jar</type>
+ <includes>
+ <include>**/war/Winstone*</include>
+ </includes>
+ </overlay>
+ <overlay>
+ <groupId>org.jvnet.hudson.winstone</groupId>
+ <artifactId>winstone</artifactId>
+ <type>jar</type>
+ </overlay>
+ </overlays>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>jetty-maven-plugin</artifactId>
+ <configuration>
+ <connectors>
+ <connector
+ implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">
+ <port>8888</port>
+ </connector>
+ </connectors>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
- chenillekit Repository
- <repository>
- <id>chenillekit</id>
- <url>http://www.chenillekit.org/mvnrepo/release</url>
- <snapshots>
- <enabled>false</enabled>
- </snapshots>
- </repository>
+ <!--<repositories>
- Maven Java.net Repository
- <repository>
- <id>maven2-repository.dev.java.net</id>
- <name>Java.net Repository for Maven</name>
- <url>http://download.java.net/maven/2/</url>
- <layout>default</layout>
- </repository>
- </repositories>-->
+ chenillekit Repository
+ <repository>
+ <id>chenillekit</id>
+ <url>http://www.chenillekit.org/mvnrepo/release</url>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ </repository>
+
+ Maven Java.net Repository
+ <repository>
+ <id>maven2-repository.dev.java.net</id>
+ <name>Java.net Repository for Maven</name>
+ <url>http://download.java.net/maven/2/</url>
+ <layout>default</layout>
+ </repository>
+ </repositories>-->
</project>
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/SubForm.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/SubForm.java 2010-05-18 17:09:12 UTC (rev 3000)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/SubForm.java 2010-05-19 12:59:57 UTC (rev 3001)
@@ -3,6 +3,7 @@
import org.apache.tapestry5.Block;
import org.apache.tapestry5.annotations.Parameter;
import org.apache.tapestry5.ioc.annotations.Inject;
+import org.slf4j.Logger;
/**
* Created: 14 mai 2010
@@ -16,12 +17,18 @@
private boolean visible;
@Inject
+ private Logger logger;
+
+ @Inject
private Block formBlock;
@Inject
private Block noFormBlock;
public Block getActiveBlock() {
+ if (logger.isDebugEnabled()) {
+ logger.debug("form already visible : " + visible);
+ }
if (visible) {
return noFormBlock;
}
Added: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/ParticipantListModel.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/ParticipantListModel.java (rev 0)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/ParticipantListModel.java 2010-05-19 12:59:57 UTC (rev 3001)
@@ -0,0 +1,160 @@
+package org.chorem.pollen.ui.data;
+
+import org.apache.tapestry5.ValueEncoder;
+import org.chorem.pollen.PollenBusinessException;
+import org.chorem.pollen.entity.Participant;
+import org.chorem.pollen.entity.ParticipantList;
+import org.chorem.pollen.service.ServicePoll;
+import org.chorem.pollen.ui.services.PollenManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * Created: 18 mai 2010
+ *
+ * @author fdesbois <fdesbois(a)codelutin.com>
+ * @version $Id$
+ */
+public class ParticipantListModel implements ValueEncoder<Participant> {
+
+ private static final Logger logger =
+ LoggerFactory.getLogger(ParticipantListModel.class);
+
+ protected ServicePoll service;
+
+ protected PollenManager manager;
+
+ protected ParticipantList list;
+
+ protected ParticipantMap participants;
+
+ public ParticipantListModel(ServicePoll service, PollenManager manager) {
+ this.service = service;
+ this.manager = manager;
+ participants = new ParticipantMap();
+ }
+
+ public Participant addNewParticipant() {
+ Participant newParticipant = service.getNewPollParticipant();
+ String id = manager.createPollenId();
+ participants.put(id, newParticipant);
+ return newParticipant;
+ }
+
+ public void removeParticipant(Participant participant) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Remove participant : " + participant);
+ }
+ participants.remove(participant);
+ }
+
+ public Collection<Participant> getParticipants() {
+ return participants.values();
+ }
+
+ public void setList(ParticipantList participantList) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Set current list : " + participantList.getName());
+ }
+ list = participantList;
+ participants.clear();
+ for (Participant participant : participantList.getParticipants()) {
+ String id = participant.getId() != null ? participant.getId() :
+ manager.createPollenId();
+ if (logger.isTraceEnabled()) {
+ logger.trace("Push participant : " +
+ participant.getName() +
+ " (" + participant.getEmail() + ")" +
+ " ID = " + id);
+ }
+ participants.put(id, participant);
+ }
+ }
+
+ public ParticipantList getList() {
+ return list;
+ }
+
+ public void reset() {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Reset current list");
+ }
+ list = null;
+ participants.clear();
+ }
+
+ public void persistParticipants() throws PollenBusinessException {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Save current list : " + list.getName());
+ }
+ list.setParticipants(getParticipants());
+ }
+
+ @Override
+ public String toClient(Participant value) {
+ String key = participants.getKey(value);
+ if (logger.isTraceEnabled()) {
+ logger.trace("toClient key = " + key);
+ }
+ return key;
+ }
+
+ @Override
+ public Participant toValue(String key) {
+ Participant value = participants.getValue(key);
+ if (logger.isTraceEnabled()) {
+ logger.trace("toValue from : " + key + " = " + value.getName() +
+ " (" + value.getEmail() + ")");
+ }
+ return value;
+ }
+
+ /**
+ * Participant map is a BidiMap ordered on values inserted using a {@link
+ * LinkedHashMap}.
+ */
+ protected class ParticipantMap {
+
+ protected Map<String, Participant> participants;
+
+ protected Map<Participant, String> keys;
+
+ public ParticipantMap() {
+ participants = new LinkedHashMap<String, Participant>();
+ keys = new HashMap<Participant, String>();
+ }
+
+ public void put(String id, Participant participant) {
+ participants.put(id, participant);
+ keys.put(participant, id);
+ }
+
+ public String getKey(Participant participant) {
+ return keys.get(participant);
+ }
+
+ public Participant getValue(String id) {
+ return participants.get(id);
+ }
+
+ public void clear() {
+ keys.clear();
+ participants.clear();
+ }
+
+ public void remove(Participant participant) {
+ String id = keys.remove(participant);
+ participants.remove(id);
+ }
+
+ public Collection<Participant> values() {
+ return participants.values();
+ }
+
+ }
+}
Property changes on: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/ParticipantListModel.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/ParticipantsListener.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/ParticipantsListener.java (rev 0)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/ParticipantsListener.java 2010-05-19 12:59:57 UTC (rev 3001)
@@ -0,0 +1,24 @@
+package org.chorem.pollen.ui.data;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+
+/**
+ * Created: 18 mai 2010
+ *
+ * @author fdesbois <fdesbois(a)codelutin.com>
+ * @version $Id$
+ */
+public class ParticipantsListener implements PropertyChangeListener {
+
+ protected boolean changed;
+
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ changed = true;
+ }
+
+ public boolean hasChanged() {
+ return changed;
+ }
+}
Property changes on: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/ParticipantsListener.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/PollFormModel.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/PollFormModel.java (rev 0)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/PollFormModel.java 2010-05-19 12:59:57 UTC (rev 3001)
@@ -0,0 +1,241 @@
+package org.chorem.pollen.ui.data;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.tapestry5.ValueEncoder;
+import org.chorem.pollen.PollenBusinessException;
+import org.chorem.pollen.common.PollType;
+import org.chorem.pollen.entity.ParticipantList;
+import org.chorem.pollen.entity.Poll;
+import org.chorem.pollen.service.ServicePoll;
+import org.chorem.pollen.ui.pages.poll.PollForm;
+import org.chorem.pollen.ui.services.PollenManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * Model for PollForm page. Contains the current {@code poll} and its
+ * participant {@code lists}. Use {@link ParticipantListModel} to manage current
+ * edited list for restricted or group Poll. Implement a {@link ValueEncoder} to
+ * manage ParticipantList client conversion in PollForm page.
+ * <p/>
+ * Created: 18 mai 2010
+ *
+ * @author fdesbois <fdesbois(a)codelutin.com>
+ * @version $Id$
+ * @see PollForm
+ * @see ValueEncoder
+ */
+public class PollFormModel implements ValueEncoder<ParticipantList> {
+
+ private static final Logger logger =
+ LoggerFactory.getLogger(PollFormModel.class);
+
+ /** Default listName for Restricted Poll */
+ private static final String DEFAULT_LIST_NAME = "LIST";
+
+ /** Service to manage poll */
+ protected ServicePoll service;
+
+ /** Current poll in edition */
+ protected Poll poll;
+
+ /** Current lists in edition */
+ protected Map<String, ParticipantList> lists;
+
+ /** Current listModel that contains current edited list and its participants */
+ protected ParticipantListModel listModel;
+
+ /**
+ * Constructor of PollFormModel. Initialize with edited {@code poll}. Need
+ * services {@code servicePoll} and {@code manager} to manage the {@code
+ * poll}.
+ *
+ * @param poll Current poll in edition
+ * @param servicePoll ServicePoll to manage poll
+ * @param manager PollenManager to manage ids
+ */
+ public PollFormModel(Poll poll,
+ ServicePoll servicePoll,
+ PollenManager manager) {
+ this.poll = poll;
+ this.service = servicePoll;
+ lists = new LinkedHashMap<String, ParticipantList>();
+ this.listModel = new ParticipantListModel(service, manager);
+ }
+
+ /**
+ * Change the poll type to {@code type}. The lists managment will depends on
+ * poll type. For a {@link PollType#RESTRICTED} poll, a new list will be
+ * automatically added and set for current usage. For a {@link
+ * PollType#GROUP} poll, the listModel is simply reset.
+ *
+ * @param type PollType to change
+ */
+ public void setPollType(PollType type) {
+ lists.clear();
+ if (type.isRestricted()) {
+ addNewList(DEFAULT_LIST_NAME);
+ // Set automatically the current list to the unique one
+ listModel.setList(lists.get(DEFAULT_LIST_NAME));
+ } else if (type.isGroup()) {
+ listModel.reset();
+ }
+ poll.setPollType(type);
+ }
+
+ /**
+ * Retrieve a collection of {@link ParticipantList} of current lists.
+ *
+ * @return a Collection<ParticipantList>
+ */
+ public Collection<ParticipantList> getLists() {
+ return lists.values();
+ }
+
+ /**
+ * Add a new list to the poll using the {@code listName}. The list will not
+ * be added if the {@code listName} is empty or if a list with this {@code
+ * listName} already exists.
+ *
+ * @param listName for the new list to add
+ * @return true if the list has been added, false otherwise
+ * @see #addList(ParticipantList)
+ */
+ public boolean addNewList(String listName) {
+ boolean result = false;
+ if (StringUtils.isNotEmpty(listName)) {
+ ParticipantList newList = service.getNewPollList();
+ newList.setName(listName);
+ return addList(newList);
+ }
+ return result;
+ }
+
+ /**
+ * Add a {@code list} to the poll. The {@code list} will not be added if its
+ * name already reference an exising list.
+ *
+ * @param list ParticipantList to add
+ * @return true if the list has been added, false otherwise
+ */
+ public boolean addList(ParticipantList list) {
+ boolean result = false;
+ if (list != null) {
+ String listName = list.getName();
+ if (!lists.containsKey(listName)) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Add list : " + listName);
+ }
+ lists.put(listName, list);
+ result = true;
+ } else if (logger.isDebugEnabled()) {
+ logger.debug("Refuse adding list : " + listName);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Give the current {@link ParticipantListModel} that references the list
+ * currently edited.
+ *
+ * @return the current listModel
+ */
+ public ParticipantListModel getListModel() {
+ return listModel;
+ }
+
+ /**
+ * Set the current list using its {@code listName}. The previous current
+ * list will be automatically saved. If error occurs during save, the
+ * previous list will be refresh (no list change will be done).
+ *
+ * @param listName name of the list to set (empty name will be ignored)
+ * @throws PollenBusinessException for saving error (doubloons)
+ * @see #saveCurrentList()
+ */
+ public void setCurrentList(String listName) throws PollenBusinessException {
+ if (StringUtils.isNotEmpty(listName)) {
+ ParticipantList list = getCurrentList();
+ try {
+ // Save previous list if not null
+ if (list != null) {
+ saveCurrentList();
+ }
+ // Change list
+ list = lists.get(listName);
+ } finally {
+ // Previous list will be keeped if error occurs during save.
+ // Apply change in listModel
+ listModel.setList(list);
+ }
+ }
+ }
+
+ /**
+ * Get the current list.
+ *
+ * @return the current list in edition.
+ */
+ public ParticipantList getCurrentList() {
+ return listModel.getList();
+ }
+
+ /** Remove the current list. */
+ public void removeCurrentList() {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Remove list : " + listModel.getList().getName());
+ }
+
+ getLists().remove(listModel.getList());
+ listModel.reset();
+ }
+
+ /**
+ * Save the current participants from current list.
+ *
+ * @throws PollenBusinessException for saving errors (doubloons)
+ * @see ParticipantListModel#persistParticipants()
+ */
+ public void saveCurrentList() throws PollenBusinessException {
+ listModel.persistParticipants();
+ }
+
+ public void create() throws PollenBusinessException {
+ service.createPoll(poll, getLists());
+ }
+
+ /**
+ * ValueEncoder toClient is used to convert {@code value} to the list name.
+ *
+ * @param value ParticipantList to convert toClient
+ * @return the list name as a unique key for the list
+ * @see ValueEncoder#toClient(Object)
+ */
+ @Override
+ public String toClient(ParticipantList value) {
+ return value.getName();
+ }
+
+ /**
+ * ValueEncoder toClient is used to convert {@code clientValue} key to the
+ * list object.
+ *
+ * @param clientValue List name of the ParticipantList to retrieve.
+ * @return the ParticipantList corresponding to its name in argument
+ * @see ValueEncoder#toValue(String)
+ */
+ @Override
+ public ParticipantList toValue(String clientValue) {
+ for (ParticipantList curr : lists.values()) {
+ if (clientValue.equals(curr.getName())) {
+ return curr;
+ }
+ }
+ return null;
+ }
+}
Property changes on: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/PollFormModel.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/PollForm.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/PollForm.java 2010-05-18 17:09:12 UTC (rev 3000)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/PollForm.java 2010-05-19 12:59:57 UTC (rev 3001)
@@ -1,11 +1,8 @@
package org.chorem.pollen.ui.pages.poll;
import org.apache.commons.lang.StringUtils;
-import org.apache.tapestry5.Block;
import org.apache.tapestry5.ComponentResources;
-import org.apache.tapestry5.Field;
import org.apache.tapestry5.RenderSupport;
-import org.apache.tapestry5.ValueEncoder;
import org.apache.tapestry5.annotations.Environmental;
import org.apache.tapestry5.annotations.IncludeJavaScriptLibrary;
import org.apache.tapestry5.annotations.IncludeStylesheet;
@@ -13,7 +10,6 @@
import org.apache.tapestry5.annotations.Log;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
-import org.apache.tapestry5.corelib.components.AjaxFormLoop;
import org.apache.tapestry5.corelib.components.Form;
import org.apache.tapestry5.corelib.components.Zone;
import org.apache.tapestry5.ioc.Messages;
@@ -24,7 +20,6 @@
import org.chorem.pollen.entity.Participant;
import org.chorem.pollen.entity.ParticipantList;
import org.chorem.pollen.entity.Poll;
-import org.chorem.pollen.entity.PollAccountImpl;
import org.chorem.pollen.entity.PreventRule;
import org.chorem.pollen.entity.PreventRuleImpl;
import org.chorem.pollen.mail.PreventRuleManager;
@@ -32,23 +27,16 @@
import org.chorem.pollen.ui.base.AbstractPollenPage;
import org.chorem.pollen.ui.components.Border;
import org.chorem.pollen.ui.data.AddressBar;
-import org.chorem.pollen.ui.data.GenericEncoder;
-import org.chorem.pollen.ui.data.ParticipantsListener;
+import org.chorem.pollen.ui.data.ParticipantListModel;
+import org.chorem.pollen.ui.data.PollFormModel;
import org.chorem.pollen.ui.services.PollenManager;
import org.nuiton.web.tapestry5.components.FeedBack;
import org.slf4j.Logger;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
/**
* PollForm : Creation and Modification.
@@ -70,11 +58,8 @@
* <p/>
* Created: 2 mars 2010
*
- * @author fdesbois
- * @version $Revision$
- * <p/>
- * Mise a jour: $Date$
- * par : $Author$
+ * @author fdesbois <fdesbois(a)codelutin.com>
+ * @version $Id$
*/
@IncludeStylesheet("context:css/poll.css")
@IncludeJavaScriptLibrary({"context:js/pollForm.js", "context:js/jquery-1.4.2.min.js"})
@@ -123,6 +108,8 @@
poll = null;
initMainInfos();
initOptions();
+ model = null;
+ listsFeedback.clearErrors();
}
/**
@@ -225,7 +212,7 @@
}
}
- /** ************************* MAIN INFOS ********************************* */
+ /** *********************** MAIN INFOS ********************************* */
@InjectComponent
private Form mainForm;
@@ -410,22 +397,25 @@
return getPoll().getPollType().isFree();
}
- /** *********************** LISTS *****************************************/
+ /** ********************* LISTS **************************************** */
@Persist
- private Map<String, ParticipantList> lists;
+ private PollFormModel model;
+// @Persist
+// private Map<String, ParticipantList> lists;
+
@Property
private ParticipantList list;
// @Persist
// private String listSelectedName;
- @Persist
- private ParticipantList listSelected;
+// @Persist
+// private ParticipantList listSelected;
+//
+// private Map<String, Participant> selectedParticipants;
- private Map<String, Participant> selectedParticipants;
-
@Property
private Participant participant;
@@ -444,30 +434,47 @@
@InjectComponent
private FeedBack listsFeedback;
- private ParticipantsListener listSelectedListener;
+ private boolean editLists;
- public Map<String, ParticipantList> getLists() {
- if (lists == null) {
- lists = new LinkedHashMap<String, ParticipantList>();
- if (getPoll().getPollType().isRestricted()) {
- lists.put("LIST", servicePoll.getNewPollList());
+ /** DATA ** */
+
+ public PollFormModel getModel() {
+ if (model == null) {
+ if (log.isDebugEnabled()) {
+ log.debug("-------- NEW MODEL --------");
}
+ model = new PollFormModel(getPoll(), servicePoll, manager);
}
- return lists;
+ return model;
}
+ public ParticipantListModel getListModel() {
+ return getModel().getListModel();
+ }
+
+ public Collection<ParticipantList> getLists() {
+ return getModel().getLists();
+ }
+
+ public ParticipantList getListSelected() {
+ ParticipantList result = getModel().getCurrentList();
+ if (log.isDebugEnabled() && result != null) {
+ log.debug("List selected : " + result.getName());
+ }
+ return result;
+ }
+
+ /** PollType change ** */
+
@Log
Object onChangeFromPollType(String value) {
PollType type = PollType.valueOf(value);
- getPoll().setPollType(type);
+ getModel().setPollType(type);
if (type.isRestrictedOrGroup()) {
listsFeedback.addInfo("Edition en cours d'une liste restreinte. " +
"Attention un changement de type de restriction provoquera" +
" une remise à zéro de la/les liste(s) en cours d'édition.");
}
- // Clean persist data for lists : careful, will reset unsaved data
- lists = null;
- listSelected = null;
return refreshListZone();
}
@@ -476,249 +483,81 @@
return getPoll().getPollType().isRestrictedOrGroup();
}
- public ParticipantList getListSelected() {
- if (listSelected == null && getPoll().getPollType().isRestricted()) {
- listSelected = getLists().get("LIST");
-// if (listSelected == null) {
-// listSelected = servicePoll.getNewPollList();
-// getLists().put("LIST", listSelected);
-// if (log.isDebugEnabled()) {
-// log.debug("Instantiate list for restricted poll");
-// }
-// }
- }
-// else if (StringUtils.isNotEmpty(listSelectedName)) {
-// listSelected = getLists().get(listSelectedName);
-// }
- if (log.isDebugEnabled() && listSelected != null) {
- log.debug("List selected : " + listSelected.getName());
- }
- return listSelected;
- }
+ /** GROUPS MANAGMENT ** */
public String getStyleSelected() {
return isCurrentListSelected() ? " selected" : "";
}
public boolean isCurrentListSelected() {
- return listSelected != null &&
- list.getName().equals(listSelected.getName());
+ return getListSelected() != null &&
+ list.getName().equals(getListSelected().getName());
}
@Log
void onSelectedFromAddList() {
- formActivate = true;
- if (StringUtils.isNotEmpty(listName) &&
- !getLists().containsKey(listName)) {
- if (log.isDebugEnabled()) {
- log.debug("Add list : " + listName);
- }
- ParticipantList list = servicePoll.getNewPollList();
- list.setName(listName);
- getLists().put(listName, list);
- listSelected = list;
- } else {
- if (log.isDebugEnabled()) {
- log.debug("Refuse adding list : " + listName);
- }
-// listSelected = null;
-// listsFeedback.addError("Impossible d'ajouter une liste avec un nom vide");
- }
+ // Set flag for editing lists
+ setEditListsFlag();
+ // Add new list in model
+ getModel().addNewList(listName);
+ // Set the new list as selected one
+ setSelectedList(listName);
// Reset form field before refresh form
listName = null;
- if (log.isDebugEnabled() && listSelected != null) {
- log.debug("Selected list : " + listSelected.getName());
- }
}
@Log
void onSelectedFromEditList(String listName) {
- formActivate = true;
- listSelected = getLists().get(listName);
- if (log.isDebugEnabled() && listSelected != null) {
- log.debug("List selected : " + listSelected.getName());
- }
+ // Set flag for editing lists
+ setEditListsFlag();
+ // Set the selected list
+ setSelectedList(listName);
}
- public Map<String, Participant> getSelectedParticipants() {
- if (selectedParticipants == null) {
- if (log.isDebugEnabled() && listSelected != null) {
- log.debug("Retrieve participants from list");
- }
- selectedParticipants = new LinkedHashMap<String, Participant>();
- for (Participant participant : listSelected.getParticipants()) {
- String id = manager.createPollenUrlId();
- selectedParticipants.put(id, participant);
- }
- }
- return selectedParticipants;
- }
-
- @Log
- Object onActionFromRemoveList() {
- if (log.isDebugEnabled()) {
- log.debug("Remove list : " + listSelected.getName());
- }
- getLists().remove(listSelected.getName());
- if (log.isDebugEnabled()) {
- for (ParticipantList list : getLists().values()) {
- log.debug("Existing lists : " + list.getName());
- }
- }
- listSelected = null;
- return refreshListZone();
- }
-
- @Log
- void onSelectedFromSaveList(String listName) {
+ protected void setSelectedList(String listName) {
+ // Change current list, will save the previous current one
+ // Errors can appear during saving previous participants.
try {
- listSelected.setParticipants(selectedParticipants.values());
+ getModel().setCurrentList(listName);
} catch (PollenBusinessException eee) {
String message = manager.getErrorMessage(eee, messages, logger);
listsFeedback.addError(message);
}
}
-
-// @Log
-// void onSelectedFromRemoveList(String listName) {
-// if (formActivate) {
-// if (log.isWarnEnabled()) {
-// log.warn("Strange submit behavior... Escape remove.");
-// }
-// return;
-// }
-// formActivate = true;
-// if (log.isDebugEnabled()) {
-// log.debug("Remove list : " + listName);
-// }
-// getLists().remove(listName);
-// if (log.isDebugEnabled()) {
-// for (ParticipantList list : getLists().values()) {
-// log.debug("Existing lists : " + list.getName());
-// }
-// }
-// if (listSelected != null && listSelected.getName().equals(listName)) {
-// listSelected = null;
-// }
-// }
- public ValueEncoder<ParticipantList> getListEncoder() {
- final Collection<ParticipantList> lists = getLists().values();
- ValueEncoder<ParticipantList> encoder =
- new ValueEncoder<ParticipantList>() {
-
- @Override
- public String toClient(ParticipantList participant) {
- return participant.getName();
- }
-
- @Override
- public ParticipantList toValue(String s) {
- for (ParticipantList curr : lists) {
- if (s.equals(curr.getName())) {
- return curr;
- }
- }
- return null;
- }
- };
- return encoder;
+ @Log
+ Object onActionFromRemoveList() {
+ getModel().removeCurrentList();
+ return refreshListZone();
}
+ /** PARTICIPANTS FOR LIST ** */
+
Object onAddRowFromParticipants() {
- Participant newParticipant = servicePoll.getNewPollParticipant();
- //selectedParticipants.add(newParticipant);
-// try {
-// listSelected.addParticipant(newParticipant);
-// } catch (PollenBusinessException eee) {
-// String message = manager.getErrorMessage(eee, messages, logger);
-// listsFeedback.addError(message);
-// }
- return newParticipant;
+ return getListModel().addNewParticipant();
}
void onRemoveRowFromParticipants(Participant participant) {
-// if (log.isDebugEnabled()) {
-// for (Participant p : listSelected.getParticipants()) {
-// log.debug("Before Existing participants : " +
-// p.getName() + "_" + p.getEmail());
-// }
-// }
-//// boolean isRemoved =
-//// listSelected.getParticipants().remove(participant);
-//// listSelected.removeParticipant(participant);
-// if (log.isDebugEnabled()) {
-// log.debug("Participant removed : " + participant.getName());
-// }
-// if (log.isDebugEnabled()) {
-// for (Participant p : listSelected.getParticipants()) {
-// log.debug("Existing participants : " +
-// p.getName() + "_" + p.getEmail());
-// }
-// }
+ getListModel().removeParticipant(participant);
}
- public ValueEncoder<Participant> getParticipantEncoder() {
- ValueEncoder<Participant> encoder = new ValueEncoder<Participant>() {
-
- @Override
- public String toClient(Participant participant) {
-// String key = getParticipantKey(participant);
- if (log.isDebugEnabled()) {
- log.debug("Participant to find : " + participant);
- }
- for (Map.Entry<String, Participant> entry :
- getSelectedParticipants().entrySet()) {
- if (logger.isDebugEnabled()) {
- logger.debug("Selected participant entry : " +
- "key = " + entry.getKey() + " -> " +
- "value = " + entry.getValue());
- }
- if (entry.getValue() == participant) {
- if (logger.isDebugEnabled()) {
- logger.debug("toClient : key = " + entry.getKey());
- }
- return entry.getKey();
- }
- }
- return null;
- }
-
- @Override
- public Participant toValue(String s) {
-// for (Participant curr : getSelectedParticipants()) {
-// String key = getParticipantKey(curr);
-// if (s.equals(key)) {
-// if (logger.isDebugEnabled()) {
-// logger.debug("toValue from : " + s);
-// }
-// return curr;
-// }
-// }
- Participant participant = getSelectedParticipants().get(s);
- if (logger.isDebugEnabled()) {
- logger.debug("toValue : key = " + s + " -> " + participant);
- }
- return participant;
- }
- };
- return encoder;
- }
-
protected Object refreshListZone() {
formActivate = false;
return listsZone.getBody();
}
+ protected void setEditListsFlag() {
+ formActivate = true;
+ editLists = true;
+ }
+
@Log
Object onSuccess() {
+// if (!editLists) {
+// saveCurrentList();
+// }
return mainZone;
}
- // TODO-FD2010-05-18 : Put this in ParticipantHelper in business
- public String getParticipantKey(Participant participant) {
- return participant.getName() + "_" + participant.getEmail();
- }
-
}
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenManager.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenManager.java 2010-05-18 17:09:12 UTC (rev 3000)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenManager.java 2010-05-19 12:59:57 UTC (rev 3001)
@@ -21,10 +21,6 @@
package org.chorem.pollen.ui.services;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.Map;
-import java.util.Properties;
import org.apache.tapestry5.ioc.Messages;
import org.apache.tapestry5.ioc.services.RegistryShutdownListener;
import org.apache.tapestry5.ioc.services.SymbolProvider;
@@ -36,26 +32,31 @@
import org.nuiton.util.ApplicationConfig;
import org.slf4j.Logger;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.Map;
+import java.util.Properties;
+
/**
* WaoManager
- *
+ * <p/>
* Created: 24 nov. 2009
*
* @author fdesbois
* @version $Revision$
- *
- * Mise a jour: $Date$
- * par : $Author$
+ * <p/>
+ * Mise a jour: $Date$
+ * par : $Author$
*/
public class PollenManager implements Runnable,
- RegistryShutdownListener,
- SymbolProvider {
+ RegistryShutdownListener,
+ SymbolProvider {
// private static final Logger logger =
// LoggerFactory.getLogger(PollenManager.class);
private final Map<String, String> propertiesMap =
- new CaseInsensitiveMap<String>();
+ new CaseInsensitiveMap<String>();
private PollenContext context;
@@ -74,16 +75,14 @@
this.serviceUser = serviceUser;
}
- /**
- * Called to start the application.
- */
+ /** Called to start the application. */
@Override
public void run() {
context.start(serviceUser);
// Copy properties to propertiesMap (insentitive) for SymbolProvider
Properties properties = getConfiguration().getOptions();
for (Object key : properties.keySet()) {
- propertiesMap.put((String)key,
+ propertiesMap.put((String) key,
properties.getProperty((String) key));
}
}
@@ -93,9 +92,7 @@
return propertiesMap.get(key);
}
- /**
- * Called to stop the application
- */
+ /** Called to stop the application */
@Override
public void registryDidShutdown() {
context.stop();
@@ -122,12 +119,12 @@
return context.getCurrentDate();
}
- public String createPollenUrlId() {
+ public String createPollenId() {
return context.createPollenUrlId();
}
public String getErrorMessage(PollenBusinessException eee,
- Messages messages, Logger logger) {
+ Messages messages, Logger logger) {
if (logger.isDebugEnabled()) {
logger.debug("ERROR from business : " + eee.getMessage() +
" _ args = " + Arrays.toString(eee.getArgs()));
Modified: trunk/pollen-ui/src/main/webapp/poll/PollForm.tml
===================================================================
--- trunk/pollen-ui/src/main/webapp/poll/PollForm.tml 2010-05-18 17:09:12 UTC (rev 3000)
+++ trunk/pollen-ui/src/main/webapp/poll/PollForm.tml 2010-05-19 12:59:57 UTC (rev 3001)
@@ -1,6 +1,9 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html t:type="border" t:addressBar="addressBar" t:pageLogo="literal:Creation" t:pageBodyId="p-pollForm" t:pageTitle="prop:pageTitle"
- xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html t:type="border" t:addressBar="addressBar" t:pageLogo="literal:Creation"
+ t:pageBodyId="p-pollForm" t:pageTitle="prop:pageTitle"
+ xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd"
+ xmlns:p="tapestry:parameter">
<h1 class="titlePoll">
<t:if t:test="createMode">
@@ -10,303 +13,417 @@
</h1>
<t:zone t:id="mainZone" t:update="show">
- <form t:type="form" t:id="mainForm" t:zone="mainZone" action="post">
- <t:errors/>
- <!-- MAIN INFOS -->
- <div id="p-pollForm-mainInfos">
- <fieldset>
- <legend>
- <img class="form-toggle" src="${asset:context:img/1uparrow.png}" /> ${message:legend-mainInfos}
- </legend>
- <div class="form-block">
- <p>
- <span><label t:type="label" t:for="title"/>:</span>
- <input type="text" t:type="textfield" class="title" t:id="title" value="poll.title" t:validate="required"/>
- </p>
- <p>
- <span><label t:type="label" t:for="creatorName"/>:</span>
- <input type="text" t:type="textfield" t:id="creatorName" value="poll.creator.name" t:validate="required,minlength=2"/>
- <label t:type="label" t:for="email"/>:
- <input type="text" t:type="textfield" class="email" t:id="email" value="poll.creator.email" t:validate="regexp"/>
- </p>
- <p>
- <span><label t:type="label" t:for="description"/>: </span>
- <textarea t:type="textarea" cols="80" rows="2" t:id="description" t:value="poll.description">${poll.description}</textarea>
- </p>
- <p>
- <!-- FIXME : validate by regexp doesn't work : seems to be caused by dateTimeField component -->
- <span><label t:type="label" t:for="beginDate"/>: </span>
- <input t:type="ck/dateTimeField" t:id="beginDate" value="poll.beginDate" t:validate="regexp"
- t:datePattern="message:date-pattern" t:timePicker="true" t:timePickerAdjacent="true"/>
- <!-- FIXME : validate by regexp doesn't work : seems to be caused by dateTimeField component -->
- <label t:type="label" t:for="endDate"/>:
- <input t:type="ck/dateTimeField" t:id="endDate" value="poll.endDate" t:validate="regexp"
- t:datePattern="message:date-pattern" t:timePicker="true" t:timePickerAdjacent="true"/>
- <label t:type="label" t:for="voteCountingType"/>:
- <select t:type="select" t:id="voteCountingType" t:value="poll.voteCountingType" t:validate="required">
- <option></option>
- </select>
- <span t:type="ck/Tooltip" title="${message:help}" t:value="${message:voteCounting-help}" t:effect="appear">
- <img src="${asset:context:img/help.png}" alt="${message:help}"/>
+<form t:type="form" t:id="mainForm" t:zone="mainZone" action="post">
+<t:errors />
+<!-- MAIN INFOS -->
+<div id="p-pollForm-mainInfos">
+ <fieldset>
+ <legend>
+ <img class="form-toggle" src="${asset:context:img/1uparrow.png}" /> ${message:legend-mainInfos}
+ </legend>
+ <div class="form-block">
+ <p>
+ <span><label t:type="label" t:for="title" />:</span>
+ <input type="text" t:type="textfield" class="title" t:id="title"
+ value="poll.title" t:validate="required" />
+ </p>
+
+ <p>
+ <span><label t:type="label" t:for="creatorName" />:</span>
+ <input type="text" t:type="textfield" t:id="creatorName"
+ value="poll.creator.name"
+ t:validate="required,minlength=2" />
+ <label t:type="label" t:for="email" />:
+ <input type="text" t:type="textfield" class="email" t:id="email"
+ value="poll.creator.email" t:validate="regexp" />
+ </p>
+
+ <p>
+ <span><label t:type="label" t:for="description" />: </span>
+ <textarea t:type="textarea" cols="80" rows="2"
+ t:id="description" t:value="poll.description">${poll.description}</textarea>
+ </p>
+
+ <p>
+ <!-- FIXME : validate by regexp doesn't work : seems to be caused by dateTimeField component -->
+ <span><label t:type="label" t:for="beginDate" />: </span>
+ <input t:type="ck/dateTimeField" t:id="beginDate"
+ value="poll.beginDate" t:validate="regexp"
+ t:datePattern="message:date-pattern" t:timePicker="true"
+ t:timePickerAdjacent="true" />
+ <!-- FIXME : validate by regexp doesn't work : seems to be caused by dateTimeField component -->
+ <label t:type="label" t:for="endDate" />:
+ <input t:type="ck/dateTimeField" t:id="endDate"
+ value="poll.endDate" t:validate="regexp"
+ t:datePattern="message:date-pattern" t:timePicker="true"
+ t:timePickerAdjacent="true" />
+ <label t:type="label" t:for="voteCountingType" />:
+ <select t:type="select" t:id="voteCountingType"
+ t:value="poll.voteCountingType" t:validate="required">
+ <option></option>
+ </select>
+ <span t:type="ck/Tooltip" title="${message:help}"
+ t:value="${message:voteCounting-help}"
+ t:effect="appear">
+ <img src="${asset:context:img/help.png}"
+ alt="${message:help}" />
</span>
- </p>
- </div>
- </fieldset>
+ </p>
</div>
- <!-- OPTIONS -->
- <div id="p-pollForm-options">
- <fieldset>
- <legend>
- <!--<input t:type="checkbox" t:id="advancedOptions" t:mixins="triggerfragment" t:fragment="optionsFragment"/>-->
- <!--<label t:type="label" t:for="advancedOptions"/>-->
- <img class="form-toggle" src="${asset:context:img/1downarrow.png}" /> ${message:legend-options}
- </legend>
- <div class="form-block clearfix" style="display:none;">
- <!--<t:formFragment t:id="optionsFragment" visible="advancedOptions">-->
- <!-- LEFT COLUMN -->
- <div class="left-column fleft">
- <p>
- <input t:type="checkbox" t:id="anonymous" value="poll.anonymous" />
- <label t:type="label" t:for="anonymous"/>
- <span t:type="ck/Tooltip" title="message:help" t:value="message:anonymous-help" t:effect="appear">
- <img src="${asset:context:img/help.png}" alt="message:help"/>
+ </fieldset>
+</div>
+<!-- OPTIONS -->
+<div id="p-pollForm-options">
+ <fieldset>
+ <legend>
+ <!--<input t:type="checkbox" t:id="advancedOptions" t:mixins="triggerfragment" t:fragment="optionsFragment"/>-->
+ <!--<label t:type="label" t:for="advancedOptions"/>-->
+ <img class="form-toggle"
+ src="${asset:context:img/1downarrow.png}" /> ${message:legend-options}
+ </legend>
+ <div class="form-block clearfix" style="display:none;">
+ <!--<t:formFragment t:id="optionsFragment" visible="advancedOptions">-->
+ <!-- LEFT COLUMN -->
+ <div class="left-column fleft">
+ <p>
+ <input t:type="checkbox" t:id="anonymous"
+ value="poll.anonymous" />
+ <label t:type="label" t:for="anonymous" />
+ <span t:type="ck/Tooltip" title="message:help"
+ t:value="message:anonymous-help"
+ t:effect="appear">
+ <img src="${asset:context:img/help.png}"
+ alt="message:help" />
</span>
- </p>
- <p>
- <input t:type="checkbox" t:id="continuousResults" value="poll.continuousResults"/>
- <label t:type="label" t:for="continuousResults"/>
- <span t:type="ck/Tooltip" title="message:help" t:value="message:continuousResults-help" t:effect="appear">
- <img src="${asset:context:img/help.png}" alt="message:help"/>
+ </p>
+
+ <p>
+ <input t:type="checkbox" t:id="continuousResults"
+ value="poll.continuousResults" />
+ <label t:type="label" t:for="continuousResults" />
+ <span t:type="ck/Tooltip" title="message:help"
+ t:value="message:continuousResults-help"
+ t:effect="appear">
+ <img src="${asset:context:img/help.png}"
+ alt="message:help" />
</span>
- </p>
- <p>
- <input t:type="checkbox" t:id="choiceAddAllowed" value="poll.choiceAddAllowed"
- t:mixins="triggerfragment" t:fragment="choiceDateFragment"/>
- <label t:type="label" t:for="choiceAddAllowed"/>
- <span t:type="ck/Tooltip" title="message:help" t:value="message:choiceAddAllowed-help}" t:effect="appear">
- <img src="${asset:context:img/help.png}" alt="message:help"/>
+ </p>
+
+ <p>
+ <input t:type="checkbox" t:id="choiceAddAllowed"
+ value="poll.choiceAddAllowed"
+ t:mixins="triggerfragment"
+ t:fragment="choiceDateFragment" />
+ <label t:type="label" t:for="choiceAddAllowed" />
+ <span t:type="ck/Tooltip" title="message:help"
+ t:value="message:choiceAddAllowed-help}"
+ t:effect="appear">
+ <img src="${asset:context:img/help.png}"
+ alt="message:help" />
</span>
- </p>
- <p>
- <t:formFragment t:id="choiceDateFragment" t:visible="poll.choiceAddAllowed">
- <label t:type="label" t:for="beginChoiceDate"/>
- <input t:type="ck/dateTimeField" t:id="beginChoiceDate" value="poll.beginChoiceDate" t:validate="regexp"
- t:datePattern="message:date-pattern" t:timePicker="true" t:timePickerAdjacent="true"/>
- <br/>
- <label t:type="label" t:for="endChoiceDate"/>
- <input t:type="ck/dateTimeField" t:id="endChoiceDate" value="poll.endChoiceDate" t:validate="regexp"
- t:datePattern="message:date-pattern" t:timePicker="true" t:timePickerAdjacent="true"/>
- </t:formFragment>
- </p>
- <p>
- <input t:type="checkbox" t:id="sendNotification" value="hasNotification"
- disabled="notificationDisabled" t:mixins="triggerfragment" t:fragment="notificationFragment"/>
- <label t:type="label" t:for="sendNotification"/>
- <span t:type="ck/Tooltip" title="message:help" t:value="message:sendNotification-help" t:effect="appear">
- <img src="${asset:context:img/help.png}" alt="message:help"/>
+ </p>
+
+ <p>
+ <t:formFragment t:id="choiceDateFragment"
+ t:visible="poll.choiceAddAllowed">
+ <label t:type="label" t:for="beginChoiceDate" />
+ <input t:type="ck/dateTimeField" t:id="beginChoiceDate"
+ value="poll.beginChoiceDate" t:validate="regexp"
+ t:datePattern="message:date-pattern"
+ t:timePicker="true"
+ t:timePickerAdjacent="true" />
+ <br />
+ <label t:type="label" t:for="endChoiceDate" />
+ <input t:type="ck/dateTimeField" t:id="endChoiceDate"
+ value="poll.endChoiceDate" t:validate="regexp"
+ t:datePattern="message:date-pattern"
+ t:timePicker="true"
+ t:timePickerAdjacent="true" />
+ </t:formFragment>
+ </p>
+ <p>
+ <input t:type="checkbox" t:id="sendNotification"
+ value="hasNotification"
+ disabled="notificationDisabled"
+ t:mixins="triggerfragment"
+ t:fragment="notificationFragment" />
+ <label t:type="label" t:for="sendNotification" />
+ <span t:type="ck/Tooltip" title="message:help"
+ t:value="message:sendNotification-help"
+ t:effect="appear">
+ <img src="${asset:context:img/help.png}"
+ alt="message:help" />
</span>
- </p>
- <p>
- <t:formFragment id="notificationHidden" t:id="notificationFragment" t:visible="hasNotification">
- <label t:type="label" t:for="notification"/>
- <input t:type="textfield" t:id="notification" value="notification.sensibility" t:size="3" t:validate="min=0"/>
- ${message:notification-label2}
- </t:formFragment>
- </p>
- </div>
- <!-- RIGHT COLUMN -->
- <div class="fleft">
- <p>
- <input t:type="checkbox" t:id="anonymousVoteAllowed" value="poll.anonymousVoteAllowed" disabled="anonymousVoteAllowedDisabled"/>
- <label t:type="label" t:for="anonymousVoteAllowed"/>
- <span t:type="ck/Tooltip" title="message:help" t:value="message:anonymousVoteAllowed-help" t:effect="appear">
- <img src="${asset:context:img/help.png}" alt="message:help"/>
+ </p>
+
+ <p>
+ <t:formFragment id="notificationHidden"
+ t:id="notificationFragment"
+ t:visible="hasNotification">
+ <label t:type="label" t:for="notification" />
+ <input t:type="textfield" t:id="notification"
+ value="notification.sensibility" t:size="3"
+ t:validate="min=0" />
+ ${message:notification-label2}
+ </t:formFragment>
+ </p>
+ </div>
+ <!-- RIGHT COLUMN -->
+ <div class="fleft">
+ <p>
+ <input t:type="checkbox" t:id="anonymousVoteAllowed"
+ value="poll.anonymousVoteAllowed"
+ disabled="anonymousVoteAllowedDisabled" />
+ <label t:type="label" t:for="anonymousVoteAllowed" />
+ <span t:type="ck/Tooltip" title="message:help"
+ t:value="message:anonymousVoteAllowed-help"
+ t:effect="appear">
+ <img src="${asset:context:img/help.png}"
+ alt="message:help" />
</span>
- </p>
- <p>
- <input t:type="checkbox" t:id="publicResults" value="poll.publicResults" disabled="publicResultsDisabled"/>
- <label t:type="label" t:for="publicResults"/>
- <span t:type="ck/Tooltip" title="message:help" t:value="message:publicResults-help" t:effect="appear">
- <img src="${asset:context:img/help.png}" alt="message:help"/>
+ </p>
+
+ <p>
+ <input t:type="checkbox" t:id="publicResults"
+ value="poll.publicResults"
+ disabled="publicResultsDisabled" />
+ <label t:type="label" t:for="publicResults" />
+ <span t:type="ck/Tooltip" title="message:help"
+ t:value="message:publicResults-help"
+ t:effect="appear">
+ <img src="${asset:context:img/help.png}"
+ alt="message:help" />
</span>
- </p>
- <p>
- <input t:type="checkbox" t:id="choiceNb" value="hasChoiceNb" disabled="choiceNbDisabled"
- t:mixins="triggerFragment" t:fragment="choiceNbFragment"/>
- <label t:type="label" t:for="choiceNb"/>
- <span t:type="ck/Tooltip" title="message:help" t:value="message:choiceNb-help" t:effect="appear">
- <img src="${asset:context:img/help.png}" alt="message:help"/>
+ </p>
+
+ <p>
+ <input t:type="checkbox" t:id="choiceNb" value="hasChoiceNb"
+ disabled="choiceNbDisabled"
+ t:mixins="triggerFragment"
+ t:fragment="choiceNbFragment" />
+ <label t:type="label" t:for="choiceNb" />
+ <span t:type="ck/Tooltip" title="message:help"
+ t:value="message:choiceNb-help"
+ t:effect="appear">
+ <img src="${asset:context:img/help.png}"
+ alt="message:help" />
</span>
- </p>
- <p>
- <t:formFragment id="choiceNbHidden" t:id="choiceNbFragment" t:visible="hasChoiceNb">
- <label t:type="label" t:for="maxChoiceNb"/>
- <input t:type="textfield" t:id="maxChoiceNb" t:value="poll.maxChoiceNb" t:size="1" t:validate="min=0"/>
- </t:formFragment>
- </p>
- <p>
- <input t:type="checkbox" t:id="sendReminder" t:value="hasReminder" disabled="reminderDisabled"
- t:mixins="triggerfragment" t:fragment="reminderFragment"/>
- <label t:type="label" t:for="sendReminder"/>
- <span t:type="ck/Tooltip" title="message:help" t:value="message:sendReminder-help" t:effect="appear">
- <img src="${asset:context:img/help.png}" alt="message:help"/>
+ </p>
+
+ <p>
+ <t:formFragment id="choiceNbHidden" t:id="choiceNbFragment"
+ t:visible="hasChoiceNb">
+ <label t:type="label" t:for="maxChoiceNb" />
+ <input t:type="textfield" t:id="maxChoiceNb"
+ t:value="poll.maxChoiceNb" t:size="1"
+ t:validate="min=0" />
+ </t:formFragment>
+ </p>
+ <p>
+ <input t:type="checkbox" t:id="sendReminder"
+ t:value="hasReminder" disabled="reminderDisabled"
+ t:mixins="triggerfragment"
+ t:fragment="reminderFragment" />
+ <label t:type="label" t:for="sendReminder" />
+ <span t:type="ck/Tooltip" title="message:help"
+ t:value="message:sendReminder-help"
+ t:effect="appear">
+ <img src="${asset:context:img/help.png}"
+ alt="message:help" />
</span>
- </p>
- <p>
- <t:formFragment id="reminderHidden" t:id="reminderFragment" t:visible="hasReminder">
- <input t:type="textfield" t:id="reminder" t:value="reminder.sensibility" t:size="1" t:validate="min=0"/>
- <label t:type="label" t:for="reminder"/>
- </t:formFragment>
- </p>
- </div>
- <!--</t:formFragment>-->
- </div>
- </fieldset>
+ </p>
+
+ <p>
+ <t:formFragment id="reminderHidden" t:id="reminderFragment"
+ t:visible="hasReminder">
+ <input t:type="textfield" t:id="reminder"
+ t:value="reminder.sensibility" t:size="1"
+ t:validate="min=0" />
+ <label t:type="label" t:for="reminder" />
+ </t:formFragment>
+ </p>
+ </div>
+ <!--</t:formFragment>-->
</div>
- <!-- CHOICES -->
- <!--<div id="p-pollForm-choices">-->
- <!--<fieldset>-->
- <!--<legend>-->
- <!--<label t:type="label" t:for="choiceType" />: -->
- <!--<select t:type="select" t:id="choiceType" t:value="poll.choiceType" t:validate="required">-->
- <!--<option></option>-->
- <!--</select> -->
- <!--<input type="image" t:type="submit" class="ico refresh" t:id="refreshChoices" value="Refresh choices" title="${message:refreshChoices-button}"/>-->
- <!--</legend>-->
- <!--<div t:type="loop" t:source="choices" t:value="choice" t:volatile="true" class="clearfix">-->
- <!--<div class="fleft choiceName">-->
- <!--<t:delegate t:to="choiceTypeBlock" />-->
- <!--<t:block t:id="choiceText">-->
- <!--<label t:type="label" t:for="choiceTextField" />: -->
- <!--<input type="text" class="nameField" t:type="textfield" t:id="choiceTextField" value="choice.text" />-->
- <!--</t:block>-->
- <!--<t:block t:id="choiceDate">-->
- <!--<label t:type="label" t:for="choiceDateField" />: -->
- <!--<input t:type="ck/dateTimeField" t:id="choiceDateField" value="choice.date" t:validate="regexp"-->
- <!--t:datePattern="message:date-pattern" t:timePicker="true" t:timePickerAdjacent="true"/>-->
- <!--</t:block>-->
- <!--<t:block t:id="choiceImage">-->
- <!--<label t:type="label" t:for="choiceImageField" />: -->
- <!--<input type="file" class="nameField" t:type="upload" t:id="choiceImageField" value="choice.image" t:validate="regexp" />-->
- <!--</t:block>-->
- <!--<t:block t:id="choiceDisplay">-->
- <!--${choice.name}-->
- <!--</t:block>-->
- <!-- -->
- <!--<t:label t:for="choiceDescription" />: -->
- <!--</div>-->
- <!--<div class="fleft">-->
- <!--<t:textarea cols="34" rows="1" t:id="choiceDescription" t:value="choice.description" />-->
- <!--</div>-->
- <!--</div>-->
- <!--</fieldset>-->
- <!--</div>-->
- <!-- LISTS -->
- <div id="p-pollForm-lists">
- <fieldset>
- <legend>
- <label t:type="label" t:for="pollType" />:
- <select t:type="select" class="list-select" t:id="pollType" t:value="poll.pollType" t:validate="required"
- t:mixins="nuiton/zoneUpdater" t:event="change" t:zone="p-pollForm-lists-zone"/>
- <span t:type="ck/Tooltip" title="message:help" t:value="message:pollType-help" t:effect="appear">
- <img src="${asset:context:img/help.png}" alt="message:help" />
+ </fieldset>
+</div>
+<!-- CHOICES -->
+<!--<div id="p-pollForm-choices">-->
+<!--<fieldset>-->
+<!--<legend>-->
+<!--<label t:type="label" t:for="choiceType" />: -->
+<!--<select t:type="select" t:id="choiceType" t:value="poll.choiceType" t:validate="required">-->
+<!--<option></option>-->
+<!--</select> -->
+<!--<input type="image" t:type="submit" class="ico refresh" t:id="refreshChoices" value="Refresh choices" title="${message:refreshChoices-button}"/>-->
+<!--</legend>-->
+<!--<div t:type="loop" t:source="choices" t:value="choice" t:volatile="true" class="clearfix">-->
+<!--<div class="fleft choiceName">-->
+<!--<t:delegate t:to="choiceTypeBlock" />-->
+<!--<t:block t:id="choiceText">-->
+<!--<label t:type="label" t:for="choiceTextField" />: -->
+<!--<input type="text" class="nameField" t:type="textfield" t:id="choiceTextField" value="choice.text" />-->
+<!--</t:block>-->
+<!--<t:block t:id="choiceDate">-->
+<!--<label t:type="label" t:for="choiceDateField" />: -->
+<!--<input t:type="ck/dateTimeField" t:id="choiceDateField" value="choice.date" t:validate="regexp"-->
+<!--t:datePattern="message:date-pattern" t:timePicker="true" t:timePickerAdjacent="true"/>-->
+<!--</t:block>-->
+<!--<t:block t:id="choiceImage">-->
+<!--<label t:type="label" t:for="choiceImageField" />: -->
+<!--<input type="file" class="nameField" t:type="upload" t:id="choiceImageField" value="choice.image" t:validate="regexp" />-->
+<!--</t:block>-->
+<!--<t:block t:id="choiceDisplay">-->
+<!--${choice.name}-->
+<!--</t:block>-->
+<!-- -->
+<!--<t:label t:for="choiceDescription" />: -->
+<!--</div>-->
+<!--<div class="fleft">-->
+<!--<t:textarea cols="34" rows="1" t:id="choiceDescription" t:value="choice.description" />-->
+<!--</div>-->
+<!--</div>-->
+<!--</fieldset>-->
+<!--</div>-->
+<!-- LISTS -->
+<div id="p-pollForm-lists">
+ <fieldset>
+ <legend>
+ <label t:type="label" t:for="pollType" />:
+ <select t:type="select" class="list-select" t:id="pollType"
+ t:value="poll.pollType" t:validate="required"
+ t:mixins="nuiton/zoneUpdater" t:event="change"
+ t:zone="p-pollForm-lists-zone" />
+ <span t:type="ck/Tooltip" title="message:help"
+ t:value="message:pollType-help" t:effect="appear">
+ <img src="${asset:context:img/help.png}"
+ alt="message:help" />
</span>
- </legend>
- <div t:type="zone" id="p-pollForm-lists-zone" t:id="listsZone" class="form-block" t:update="show">
- <t:if t:test="canDisplayLists()">
- <t:nuiton.feedback t:id="listsFeedback" /><br />
- <t:subForm t:visible="formActivate">
- <t:if t:test="poll.pollType.group">
- <p>
- <label t:type="label" t:for="listName" />:
- <input t:type="textfield" t:id="listName" value="listName" />
- <input t:type="submit" t:id="addList" value="ADD" />
- <!--<a t:type="actionlink" t:id="addList" t:zone="p-pollForm-lists-zone">-->
- <!--ADD-->
- <!--</a>-->
- </p>
- <p class="center">
- <t:loop t:source="lists.values()" t:value="list" t:encoder="listEncoder">
- <input class="list-edition${styleSelected}" t:type="nuiton/submitContext" t:context="list.name" t:id="editList" value="${list.name}" />
- <!--<span t:type="any" t:mixins="nuiton/confirm">-->
- <!--<input t:type="nuiton/submitContext" t:id="removeList" t:image="context:img/delete.png" t:context="list.name" value="${message:delete}" />-->
- <!--</span>-->
- <t:if t:test="currentListSelected">
- <input t:type="submit" t:id="saveList" t:image="context:img/save.png" t:zone="p-pollForm-lists-zone" />
- <a t:type="actionlink" t:id="removeList" t:zone="p-pollForm-lists-zone">
- <span t:type="any" t:mixins="nuiton/confirm">
- <img src="${asset:context:img/delete.png}" alt="${message:delete}" />
+ </legend>
+ <div t:type="zone" id="p-pollForm-lists-zone" t:id="listsZone"
+ class="form-block" t:update="show">
+ <t:if t:test="canDisplayLists()">
+ <t:nuiton.feedback t:id="listsFeedback" />
+ <br />
+ <t:subForm t:visible="formActivate">
+ <t:if t:test="poll.pollType.group">
+ <p>
+ <label t:type="label" t:for="listName" />:
+ <input t:type="textfield" t:id="listName"
+ value="listName" />
+ <input t:type="submit" t:id="addList" value="ADD" />
+ <!--<a t:type="actionlink" t:id="addList" t:zone="p-pollForm-lists-zone">-->
+ <!--ADD-->
+ <!--</a>-->
+ </p>
+
+ <p class="center">
+ <t:loop t:source="lists" t:value="list"
+ t:encoder="model">
+ <input class="list-edition${styleSelected}"
+ t:type="nuiton/submitContext"
+ t:context="list.name" t:id="editList"
+ value="${list.name}" />
+ <!--<span t:type="any" t:mixins="nuiton/confirm">-->
+ <!--<input t:type="nuiton/submitContext" t:id="removeList" t:image="context:img/delete.png" t:context="list.name" value="${message:delete}" />-->
+ <!--</span>-->
+ <t:if t:test="currentListSelected">
+ <!--<input t:type="submit" t:id="saveList" t:image="context:img/save.png" />-->
+ <a t:type="actionlink" t:id="removeList"
+ t:zone="p-pollForm-lists-zone">
+ <span t:type="any"
+ t:mixins="nuiton/confirm">
+ <img src="${asset:context:img/delete.png}"
+ alt="${message:delete}" />
</span>
- </a>
- </t:if>
- </t:loop>
- </p>
- </t:if>
- <t:if t:test="listSelected">
- <div class="t-data-grid">
- <table class="t-data-grid">
- <thead>
- <tr>
- <th>${message:pollen.ui.participant.name-label}</th>
- <th>${message:pollen.ui.participant.email-label}</th>
- <th>${message:pollen.ui.participant.weight-label}</th>
- <th></th>
- </tr>
- </thead>
- <tbody>
- <tr t:type="ajaxformloop" t:id="participants" source="selectedParticipants.values()" value="participant" t:encoder="participantEncoder">
- <td>
- <t:textfield t:id="participantName" value="participant.name" size="20" t:validate="required"/>
- </td>
- <td>
- <t:textfield t:id="participantEmail" value="participant.email" size="25" t:validate="email"/>
- </td>
- <td>
- <t:textfield t:id="participantWeight" value="participant.weight" size="1"/>
- </td>
- <td>
- <t:removerowlink>
- <img src="${asset:context:img/delete.png}" alt="${message:delete}"/>
- </t:removerowlink>
- </td>
- <p:addRow>
- <td colspan="4" class="center">
- <t:addrowlink>${message:pollen.ui.participant.add}</t:addrowlink>
- </td>
- </p:addRow>
- </tr>
- </tbody>
- </table>
- </div>
- </t:if>
- </t:subForm>
+ </a>
+ </t:if>
+ </t:loop>
+ </p>
</t:if>
- <!--<t:delegate t:to="listsBlock" />-->
- <!--<t:block t:id="listsForm">-->
- <!--<form t:type="form" action="tapestry">-->
- <!--<t:delegate t:to="listsFields" />-->
- <!--</form>-->
- <!--</t:block>-->
- <!--<t:block t:id="listsFields">-->
- <!--<t:if t:test="poll.pollType.group">-->
- <!--<p>-->
- <!--<label t:type="label" t:for="listName" />: -->
- <!--<input t:type="textfield" t:id="listName" value="listName"/> -->
- <!--<input t:type="submit" t:id="addList" value="ADD"/>-->
- <!--</p>-->
- <!--<p>-->
- <!--<t:loop t:source="lists.values()" t:value="list" t:volatile="true">-->
- <!--${list.name} -->
- <!--</t:loop>-->
- <!--</p>-->
- <!--<p:else>-->
- <!--COOL-->
- <!--</p:else>-->
- <!--</t:if>-->
- <!--</t:block> -->
- </div>
- </fieldset>
+ <t:if t:test="listSelected">
+ <div class="t-data-grid">
+ <table class="t-data-grid">
+ <thead>
+ <tr>
+ <th>
+ ${message:pollen.ui.participant.name-label}
+ </th>
+ <th>
+ ${message:pollen.ui.participant.email-label}
+ </th>
+ <th>
+ ${message:pollen.ui.participant.weight-label}
+ </th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr t:type="ajaxformloop" t:id="participants"
+ source="listModel.participants"
+ value="participant" t:encoder="listModel">
+ <td>
+ <t:textfield t:id="participantName"
+ value="participant.name"
+ size="20"
+ t:validate="required" />
+ </td>
+ <td>
+ <t:textfield t:id="participantEmail"
+ value="participant.email"
+ size="25" />
+ </td>
+ <td>
+ <t:textfield t:id="participantWeight"
+ value="participant.weight"
+ size="1" />
+ </td>
+ <td>
+ <t:removerowlink>
+ <img src="${asset:context:img/delete.png}"
+ alt="${message:delete}" />
+ </t:removerowlink>
+ </td>
+ <p:addRow>
+ <td colspan="4" class="center">
+ <t:addrowlink>
+ ${message:pollen.ui.participant.add}
+ </t:addrowlink>
+ </td>
+ </p:addRow>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </t:if>
+ </t:subForm>
+ </t:if>
+ <!--<t:delegate t:to="listsBlock" />-->
+ <!--<t:block t:id="listsForm">-->
+ <!--<form t:type="form" action="tapestry">-->
+ <!--<t:delegate t:to="listsFields" />-->
+ <!--</form>-->
+ <!--</t:block>-->
+ <!--<t:block t:id="listsFields">-->
+ <!--<t:if t:test="poll.pollType.group">-->
+ <!--<p>-->
+ <!--<label t:type="label" t:for="listName" />: -->
+ <!--<input t:type="textfield" t:id="listName" value="listName"/> -->
+ <!--<input t:type="submit" t:id="addList" value="ADD"/>-->
+ <!--</p>-->
+ <!--<p>-->
+ <!--<t:loop t:source="lists.values()" t:value="list" t:volatile="true">-->
+ <!--${list.name} -->
+ <!--</t:loop>-->
+ <!--</p>-->
+ <!--<p:else>-->
+ <!--COOL-->
+ <!--</p:else>-->
+ <!--</t:if>-->
+ <!--</t:block> -->
</div>
- </form>
+ </fieldset>
+</div>
+</form>
</t:zone>
</html>
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2010-05-18 17:09:12 UTC (rev 3000)
+++ trunk/pom.xml 2010-05-19 12:59:57 UTC (rev 3001)
@@ -1,483 +1,491 @@
<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
+ <modelVersion>4.0.0</modelVersion>
- <!-- ************************************************************* -->
- <!-- *** POM Relationships *************************************** -->
- <!-- ************************************************************* -->
+ <!-- ************************************************************* -->
+ <!-- *** POM Relationships *************************************** -->
+ <!-- ************************************************************* -->
- <parent>
- <groupId>org.nuiton</groupId>
- <artifactId>mavenpom4redmine</artifactId>
- <version>2.1.3</version>
- </parent>
+ <parent>
+ <groupId>org.nuiton</groupId>
+ <artifactId>mavenpom4redmine</artifactId>
+ <version>2.1.3</version>
+ </parent>
- <groupId>org.chorem</groupId>
- <artifactId>pollen</artifactId>
- <version>2.0-SNAPSHOT</version>
+ <groupId>org.chorem</groupId>
+ <artifactId>pollen</artifactId>
+ <version>2.0-SNAPSHOT</version>
- <modules>
- <module>pollen-ui</module>
- <module>pollen-business</module>
- <module>pollen-votecounting</module>
- </modules>
+ <modules>
+ <module>pollen-ui</module>
+ <module>pollen-business</module>
+ <module>pollen-votecounting</module>
+ </modules>
- <dependencyManagement>
- <dependencies>
+ <dependencyManagement>
+ <dependencies>
- <dependency>
- <groupId>commons-lang</groupId>
- <artifactId>commons-lang</artifactId>
- <version>2.4</version>
- </dependency>
- <dependency>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- <version>1.1.1</version>
- </dependency>
- <dependency>
- <groupId>org.apache.commons</groupId>
- <artifactId>commons-email</artifactId>
- <version>1.2</version>
- </dependency>
- <dependency>
- <groupId>commons-io</groupId>
- <artifactId>commons-io</artifactId>
- <version>1.4</version>
- </dependency>
-<!-- <dependency>
- <groupId>org.chorem</groupId>
- <artifactId>chorem-commons</artifactId>
- <version>${chorem-commons.version}</version>
- </dependency>-->
- <dependency>
- <groupId>org.nuiton</groupId>
- <artifactId>nuiton-utils</artifactId>
- <version>${nuiton-utils.version}</version>
- </dependency>
- <dependency>
- <groupId>org.nuiton.eugene</groupId>
- <artifactId>eugene</artifactId>
- <version>${eugene.version}</version>
- </dependency>
- <dependency>
- <groupId>org.nuiton.topia</groupId>
- <artifactId>topia-persistence</artifactId>
- <version>${topia.version}</version>
- </dependency>
- <dependency>
- <groupId>org.nuiton.topia</groupId>
- <artifactId>topia-service-migration</artifactId>
- <version>${topia.version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.tapestry</groupId>
- <artifactId>tapestry-core</artifactId>
- <version>${tapestry.version}</version>
- <scope>compile</scope>
- <exclusions>
- <exclusion>
- <groupId>jboss</groupId>
- <artifactId>javassist</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.nuiton.web</groupId>
- <artifactId>nuiton-tapestry-extra</artifactId>
- <version>${nuiton-web.version}</version>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- <version>1.5.10</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- <version>1.5.10</version>
- <scope>runtime</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.tapestry</groupId>
- <artifactId>tapestry-upload</artifactId>
- <version>${tapestry.version}</version>
- </dependency>
- <dependency>
- <groupId>org.chenillekit</groupId>
- <artifactId>chenillekit-tapestry</artifactId>
- <version>1.0.0</version>
- <exclusions>
- <exclusion>
- <groupId>jboss</groupId>
- <artifactId>javassist</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.jdom</groupId>
- <artifactId>jdom</artifactId>
- <version>1.1</version>
- </dependency>
- <dependency>
- <groupId>jfree</groupId>
- <artifactId>jfreechart</artifactId>
- <version>1.0.12</version>
- </dependency>
- <dependency>
- <groupId>javassist</groupId>
- <artifactId>javassist</artifactId>
- <version>3.8.0.GA</version>
- </dependency>
- <dependency>
- <groupId>net.sf.opencsv</groupId>
- <artifactId>opencsv</artifactId>
- <version>2.0.1</version>
- </dependency>
- <dependency>
- <groupId>rome</groupId>
- <artifactId>rome</artifactId>
- <version>0.9</version>
- </dependency>
- <dependency>
- <groupId>com.h2database</groupId>
- <artifactId>h2</artifactId>
- <version>1.2.131</version>
- </dependency>
- <dependency>
- <groupId>postgresql</groupId>
- <artifactId>postgresql</artifactId>
- <version>8.4-701.jdbc4</version>
- </dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <version>2.5</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.7</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.jvnet.hudson.winstone</groupId>
- <artifactId>winstone</artifactId>
- <version>0.9.10-hudson-16</version>
- </dependency>
- </dependencies>
- </dependencyManagement>
+ <dependency>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ <version>2.4</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ <version>1.1.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-email</artifactId>
+ <version>1.2</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-collections</groupId>
+ <artifactId>commons-collections</artifactId>
+ <version>3.2.1</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.4</version>
+ </dependency>
+ <!-- <dependency>
+ <groupId>org.chorem</groupId>
+ <artifactId>chorem-commons</artifactId>
+ <version>${chorem-commons.version}</version>
+ </dependency>-->
+ <dependency>
+ <groupId>org.nuiton</groupId>
+ <artifactId>nuiton-utils</artifactId>
+ <version>${nuiton-utils.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.nuiton.eugene</groupId>
+ <artifactId>eugene</artifactId>
+ <version>${eugene.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.nuiton.topia</groupId>
+ <artifactId>topia-persistence</artifactId>
+ <version>${topia.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.nuiton.topia</groupId>
+ <artifactId>topia-service-migration</artifactId>
+ <version>${topia.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tapestry</groupId>
+ <artifactId>tapestry-core</artifactId>
+ <version>${tapestry.version}</version>
+ <scope>compile</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>jboss</groupId>
+ <artifactId>javassist</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.nuiton.web</groupId>
+ <artifactId>nuiton-tapestry-extra</artifactId>
+ <version>${nuiton-web.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <version>1.5.10</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ <version>1.5.10</version>
+ <scope>runtime</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.tapestry</groupId>
+ <artifactId>tapestry-upload</artifactId>
+ <version>${tapestry.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.chenillekit</groupId>
+ <artifactId>chenillekit-tapestry</artifactId>
+ <version>1.0.0</version>
+ <exclusions>
+ <exclusion>
+ <groupId>jboss</groupId>
+ <artifactId>javassist</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.jdom</groupId>
+ <artifactId>jdom</artifactId>
+ <version>1.1</version>
+ </dependency>
+ <dependency>
+ <groupId>jfree</groupId>
+ <artifactId>jfreechart</artifactId>
+ <version>1.0.12</version>
+ </dependency>
+ <dependency>
+ <groupId>javassist</groupId>
+ <artifactId>javassist</artifactId>
+ <version>3.8.0.GA</version>
+ </dependency>
+ <dependency>
+ <groupId>net.sf.opencsv</groupId>
+ <artifactId>opencsv</artifactId>
+ <version>2.0.1</version>
+ </dependency>
+ <dependency>
+ <groupId>rome</groupId>
+ <artifactId>rome</artifactId>
+ <version>0.9</version>
+ </dependency>
+ <dependency>
+ <groupId>com.h2database</groupId>
+ <artifactId>h2</artifactId>
+ <version>1.2.131</version>
+ </dependency>
+ <dependency>
+ <groupId>postgresql</groupId>
+ <artifactId>postgresql</artifactId>
+ <version>8.4-701.jdbc4</version>
+ </dependency>
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ <version>2.5</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.7</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.jvnet.hudson.winstone</groupId>
+ <artifactId>winstone</artifactId>
+ <version>0.9.10-hudson-16</version>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
- <!-- ************************************************************* -->
- <!-- *** Project Information ************************************* -->
- <!-- ************************************************************* -->
+ <!-- ************************************************************* -->
+ <!-- *** Project Information ************************************* -->
+ <!-- ************************************************************* -->
- <name>Pollen</name>
- <description>Application de vote Pollen</description>
- <inceptionYear>2009</inceptionYear>
- <url>http://maven-site.chorem.org/pollen/</url>
+ <name>Pollen</name>
+ <description>Application de vote Pollen</description>
+ <inceptionYear>2009</inceptionYear>
+ <url>http://maven-site.chorem.org/pollen/</url>
- <licenses>
- <license>
- <name>General Public License (GPL)</name>
- <url>${maven.license.file}</url>
- <distribution>local</distribution>
- </license>
- </licenses>
+ <licenses>
+ <license>
+ <name>General Public License (GPL)</name>
+ <url>${maven.license.file}</url>
+ <distribution>local</distribution>
+ </license>
+ </licenses>
- <!-- Developpers, contributors... -->
- <developers>
- <developer>
- <id>fdesbois</id>
- <name>Florian DESBOIS</name>
- <email>florian.desbois(a)gmail.com</email>
- <organization>ALMA - Code Lutin</organization>
- <organizationUrl>http:/alma.univ-nantes.fr</organizationUrl>
- <timezone>+1</timezone>
- <roles>
- <role>Chef de Projet</role>
- <role>Analyste</role>
- <role>Développeur</role>
- </roles>
- </developer>
- <developer>
- <id>enema</id>
- <name>Erwan NEMA</name>
- <email>nemawan(a)hotmail.com</email>
- <organization>ALMA - Code Lutin</organization>
- <organizationUrl>http:/alma.univ-nantes.fr</organizationUrl>
- <timezone>+1</timezone>
- <roles>
- <role>Chef de Projet</role>
- <role>Analyste</role>
- <role>Développeur</role>
- </roles>
- </developer>
- <developer>
- <id>kmorin</id>
- <name>Kevin MORIN</name>
- <email>km(a)kevinmorin.net</email>
- <organization>ALMA - Code Lutin</organization>
- <organizationUrl>http:/alma.univ-nantes.fr</organizationUrl>
- <timezone>+1</timezone>
- <roles>
- <role>Architecte</role>
- <role>Développeur</role>
- </roles>
- </developer>
- <developer>
- <id>tpoulit</id>
- <name>Thierry POULIT-POUBLAT</name>
- <email>tpoulit(a)gmail.com</email>
- <organization>ALMA - Code Lutin</organization>
- <organizationUrl>http:/alma.univ-nantes.fr</organizationUrl>
- <timezone>+1</timezone>
- <roles>
- <role>Analyste</role>
- <role>Développeur</role>
- </roles>
- </developer>
- <developer>
- <id>aboukhary</id>
- <name>Abdelmajid BOUKHARY</name>
- <email>benouna66(a)gmail.com</email>
- <organization>ALMA - Code Lutin</organization>
- <organizationUrl>http:/alma.univ-nantes.fr</organizationUrl>
- <timezone>+1</timezone>
- <roles>
- <role>Analyste</role>
- <role>Développeur</role>
- </roles>
- </developer>
- <developer>
- <id>tcicognagni</id>
- <name>Thomas CICOGNANI</name>
- <email>zhykos(a)gmail.com</email>
- <organization>ALMA - Code Lutin</organization>
- <organizationUrl>http:/alma.univ-nantes.fr</organizationUrl>
- <timezone>+1</timezone>
- <roles>
- <role>Architecte</role>
- <role>Développeur</role>
- </roles>
- </developer>
- <developer>
- <id>aeddahbi</id>
- <name>Amine EDDAHBI</name>
- <email>eddahbi(a)gmail.com</email>
- <organization>ALMA - Code Lutin</organization>
- <organizationUrl>http:/alma.univ-nantes.fr</organizationUrl>
- <timezone>+1</timezone>
- <roles>
- <role>Architecte</role>
- <role>Développeur</role>
- </roles>
- </developer>
- <developer>
- <id>nrannou</id>
- <name>Nolwenn RANNOU</name>
- <email>rannou(a)codelutin.com</email>
- <organization>Code Lutin</organization>
- <organizationUrl>http://www.codelutin.com/</organizationUrl>
- <timezone>+1</timezone>
- <roles>
- <role>Concepteur</role>
- <role>Développeur</role>
- </roles>
- </developer>
- <developer>
- <id>tchemit</id>
- <name>Tony Chemit</name>
- <email>chemit(a)codelutin.com</email>
- <organization>CodeLutin</organization>
- <timezone>+2</timezone>
- <roles>
- <role>Développeur</role>
- </roles>
- </developer>
- </developers>
+ <!-- Developpers, contributors... -->
+ <developers>
+ <developer>
+ <id>fdesbois</id>
+ <name>Florian DESBOIS</name>
+ <email>florian.desbois(a)gmail.com</email>
+ <organization>ALMA - Code Lutin</organization>
+ <organizationUrl>http:/alma.univ-nantes.fr</organizationUrl>
+ <timezone>+1</timezone>
+ <roles>
+ <role>Chef de Projet</role>
+ <role>Analyste</role>
+ <role>Développeur</role>
+ </roles>
+ </developer>
+ <developer>
+ <id>enema</id>
+ <name>Erwan NEMA</name>
+ <email>nemawan(a)hotmail.com</email>
+ <organization>ALMA - Code Lutin</organization>
+ <organizationUrl>http:/alma.univ-nantes.fr</organizationUrl>
+ <timezone>+1</timezone>
+ <roles>
+ <role>Chef de Projet</role>
+ <role>Analyste</role>
+ <role>Développeur</role>
+ </roles>
+ </developer>
+ <developer>
+ <id>kmorin</id>
+ <name>Kevin MORIN</name>
+ <email>km(a)kevinmorin.net</email>
+ <organization>ALMA - Code Lutin</organization>
+ <organizationUrl>http:/alma.univ-nantes.fr</organizationUrl>
+ <timezone>+1</timezone>
+ <roles>
+ <role>Architecte</role>
+ <role>Développeur</role>
+ </roles>
+ </developer>
+ <developer>
+ <id>tpoulit</id>
+ <name>Thierry POULIT-POUBLAT</name>
+ <email>tpoulit(a)gmail.com</email>
+ <organization>ALMA - Code Lutin</organization>
+ <organizationUrl>http:/alma.univ-nantes.fr</organizationUrl>
+ <timezone>+1</timezone>
+ <roles>
+ <role>Analyste</role>
+ <role>Développeur</role>
+ </roles>
+ </developer>
+ <developer>
+ <id>aboukhary</id>
+ <name>Abdelmajid BOUKHARY</name>
+ <email>benouna66(a)gmail.com</email>
+ <organization>ALMA - Code Lutin</organization>
+ <organizationUrl>http:/alma.univ-nantes.fr</organizationUrl>
+ <timezone>+1</timezone>
+ <roles>
+ <role>Analyste</role>
+ <role>Développeur</role>
+ </roles>
+ </developer>
+ <developer>
+ <id>tcicognagni</id>
+ <name>Thomas CICOGNANI</name>
+ <email>zhykos(a)gmail.com</email>
+ <organization>ALMA - Code Lutin</organization>
+ <organizationUrl>http:/alma.univ-nantes.fr</organizationUrl>
+ <timezone>+1</timezone>
+ <roles>
+ <role>Architecte</role>
+ <role>Développeur</role>
+ </roles>
+ </developer>
+ <developer>
+ <id>aeddahbi</id>
+ <name>Amine EDDAHBI</name>
+ <email>eddahbi(a)gmail.com</email>
+ <organization>ALMA - Code Lutin</organization>
+ <organizationUrl>http:/alma.univ-nantes.fr</organizationUrl>
+ <timezone>+1</timezone>
+ <roles>
+ <role>Architecte</role>
+ <role>Développeur</role>
+ </roles>
+ </developer>
+ <developer>
+ <id>nrannou</id>
+ <name>Nolwenn RANNOU</name>
+ <email>rannou(a)codelutin.com</email>
+ <organization>Code Lutin</organization>
+ <organizationUrl>http://www.codelutin.com/</organizationUrl>
+ <timezone>+1</timezone>
+ <roles>
+ <role>Concepteur</role>
+ <role>Développeur</role>
+ </roles>
+ </developer>
+ <developer>
+ <id>tchemit</id>
+ <name>Tony Chemit</name>
+ <email>chemit(a)codelutin.com</email>
+ <organization>CodeLutin</organization>
+ <timezone>+2</timezone>
+ <roles>
+ <role>Développeur</role>
+ </roles>
+ </developer>
+ </developers>
- <!-- ************************************************************* -->
- <!-- *** Build Settings ****************************************** -->
- <!-- ************************************************************* -->
+ <!-- ************************************************************* -->
+ <!-- *** Build Settings ****************************************** -->
+ <!-- ************************************************************* -->
- <packaging>pom</packaging>
+ <packaging>pom</packaging>
- <properties>
+ <properties>
- <!-- redmine configuration -->
- <platform>chorem.org</platform>
- <projectId>pollen</projectId>
+ <!-- redmine configuration -->
+ <platform>chorem.org</platform>
+ <projectId>pollen</projectId>
- <!-- customized versions -->
- <!--javadoc.version>2.4</javadoc.version-->
- <topia.version>2.4-SNAPSHOT</topia.version>
- <eugene.version>2.0.2-SNAPSHOT</eugene.version>
- <i18n.version>1.2.2</i18n.version>
- <tapestry.version>5.1.0.5</tapestry.version>
- <nuiton-web.version>0.1-SNAPSHOT</nuiton-web.version>
- <nuiton-utils.version>1.3.1-SNAPSHOT</nuiton-utils.version>
- <processor.version>1.0.2</processor.version>
+ <!-- customized versions -->
+ <!--javadoc.version>2.4</javadoc.version-->
+ <topia.version>2.4-SNAPSHOT</topia.version>
+ <eugene.version>2.0.2-SNAPSHOT</eugene.version>
+ <i18n.version>1.2.2</i18n.version>
+ <tapestry.version>5.1.0.5</tapestry.version>
+ <nuiton-web.version>0.1-SNAPSHOT</nuiton-web.version>
+ <nuiton-utils.version>1.3.1-SNAPSHOT</nuiton-utils.version>
+ <processor.version>1.0.2</processor.version>
- <!--Multilanguage maven-site -->
- <siteLocales>en,fr</siteLocales>
+ <!--Multilanguage maven-site -->
+ <siteLocales>en,fr</siteLocales>
- <!-- license to use -->
- <license.licenseName>gpl_v3</license.licenseName>
+ <!-- license to use -->
+ <license.licenseName>gpl_v3</license.licenseName>
- </properties>
+ </properties>
- <build>
+ <build>
- <pluginManagement>
- <plugins>
+ <pluginManagement>
+ <plugins>
- <plugin>
- <artifactId>maven-site-plugin</artifactId>
- <dependencies>
- <dependency>
- <groupId>org.nuiton.jrst</groupId>
- <artifactId>doxia-module-jrst</artifactId>
- <version>${jrst.version}</version>
- </dependency>
- </dependencies>
- </plugin>
+ <plugin>
+ <artifactId>maven-site-plugin</artifactId>
+ <dependencies>
+ <dependency>
+ <groupId>org.nuiton.jrst</groupId>
+ <artifactId>doxia-module-jrst</artifactId>
+ <version>${jrst.version}</version>
+ </dependency>
+ </dependencies>
+ </plugin>
- <plugin>
- <groupId>org.mortbay.jetty</groupId>
- <artifactId>jetty-maven-plugin</artifactId>
- <version>7.0.1.v20091125</version>
- </plugin>
- <!-- EUGene plugin for entities generation -->
- <plugin>
- <groupId>org.nuiton.eugene</groupId>
- <artifactId>maven-eugene-plugin</artifactId>
- <version>${eugene.version}</version>
- <configuration>
- <inputs>zargo</inputs>
- <resolver>org.nuiton.util.FasterCachedResourceResolver</resolver>
- </configuration>
- <dependencies>
- <dependency>
- <groupId>org.nuiton.topia</groupId>
- <artifactId>topia-persistence</artifactId>
- <version>${topia.version}</version>
- </dependency>
- </dependencies>
- </plugin>
- <plugin>
- <groupId>org.nuiton.i18n</groupId>
- <artifactId>maven-i18n-plugin</artifactId>
- <version>${i18n.version}</version>
- </plugin>
- </plugins>
- </pluginManagement>
+ <plugin>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>jetty-maven-plugin</artifactId>
+ <version>7.0.1.v20091125</version>
+ </plugin>
+ <!-- EUGene plugin for entities generation -->
+ <plugin>
+ <groupId>org.nuiton.eugene</groupId>
+ <artifactId>maven-eugene-plugin</artifactId>
+ <version>${eugene.version}</version>
+ <configuration>
+ <inputs>zargo</inputs>
+ <resolver>org.nuiton.util.FasterCachedResourceResolver</resolver>
+ </configuration>
+ <dependencies>
+ <dependency>
+ <groupId>org.nuiton.topia</groupId>
+ <artifactId>topia-persistence</artifactId>
+ <version>${topia.version}</version>
+ </dependency>
+ </dependencies>
+ </plugin>
+ <plugin>
+ <groupId>org.nuiton.i18n</groupId>
+ <artifactId>maven-i18n-plugin</artifactId>
+ <version>${i18n.version}</version>
+ </plugin>
+ </plugins>
+ </pluginManagement>
- <resources>
- <resource>
- <directory>src/main/resources</directory>
- <filtering>true</filtering>
- </resource>
- </resources>
- </build>
+ <resources>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>true</filtering>
+ </resource>
+ </resources>
+ </build>
- <!-- ************************************************************* -->
- <!-- *** Build Environment ************************************** -->
- <!-- ************************************************************* -->
+ <!-- ************************************************************* -->
+ <!-- *** Build Environment ************************************** -->
+ <!-- ************************************************************* -->
- <scm>
- <connection>scm:svn:http://svn.chorem.org/svn/pollen/trunk</connection>
- <developerConnection>scm:svn:http://svn.chorem.org/svn/pollen/trunk</developerConnection>
- <url>http://www.chorem.org/repositories/browse/pollen/trunk</url>
- </scm>
+ <scm>
+ <connection>scm:svn:http://svn.chorem.org/svn/pollen/trunk</connection>
+ <developerConnection>scm:svn:http://svn.chorem.org/svn/pollen/trunk
+ </developerConnection>
+ <url>http://www.chorem.org/repositories/browse/pollen/trunk</url>
+ </scm>
- <repositories>
+ <repositories>
- <!-- chenillekit Repository -->
- <!--repository>
- <id>chenillekit</id>
- <url>http://www.chenillekit.org/mvnrepo/release</url>
- <snapshots>
- <enabled>false</enabled>
- </snapshots>
- </repository-->
+ <!-- chenillekit Repository -->
+ <!--repository>
+ <id>chenillekit</id>
+ <url>http://www.chenillekit.org/mvnrepo/release</url>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ </repository-->
- <!-- Maven Java.net Repository -->
- <!--repository>
- <id>maven2-repository.dev.java.net</id>
- <name>Java.net Repository for Maven</name>
- <url>http://download.java.net/maven/2/</url>
- <layout>default</layout>
- </repository-->
+ <!-- Maven Java.net Repository -->
+ <!--repository>
+ <id>maven2-repository.dev.java.net</id>
+ <name>Java.net Repository for Maven</name>
+ <url>http://download.java.net/maven/2/</url>
+ <layout>default</layout>
+ </repository-->
- <!-- depot des releases nuiton -->
+ <!-- depot des releases nuiton -->
- <repository>
- <id>nuiton.release</id>
- <name>NuitonReleaseRepository</name>
- <url>http://maven.nuiton.org/release</url>
- <snapshots>
- <enabled>false</enabled>
- </snapshots>
- <releases>
- <enabled>true</enabled>
- <checksumPolicy>warn</checksumPolicy>
- </releases>
- </repository>
+ <repository>
+ <id>nuiton.release</id>
+ <name>NuitonReleaseRepository</name>
+ <url>http://maven.nuiton.org/release</url>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ <releases>
+ <enabled>true</enabled>
+ <checksumPolicy>warn</checksumPolicy>
+ </releases>
+ </repository>
- <!-- depot des snapshots nuiton -->
+ <!-- depot des snapshots nuiton -->
- <repository>
- <id>nuiton.snapshot</id>
- <name>NuitonSnapshotRepository</name>
- <url>http://maven.nuiton.org/snapshot</url>
- <snapshots>
- <enabled>true</enabled>
- <checksumPolicy>fail</checksumPolicy>
- </snapshots>
- <releases>
- <enabled>false</enabled>
- </releases>
- </repository>
+ <repository>
+ <id>nuiton.snapshot</id>
+ <name>NuitonSnapshotRepository</name>
+ <url>http://maven.nuiton.org/snapshot</url>
+ <snapshots>
+ <enabled>true</enabled>
+ <checksumPolicy>fail</checksumPolicy>
+ </snapshots>
+ <releases>
+ <enabled>false</enabled>
+ </releases>
+ </repository>
- </repositories>
+ </repositories>
- <pluginRepositories>
+ <pluginRepositories>
- <!-- depot des releases nuiton -->
+ <!-- depot des releases nuiton -->
- <pluginRepository>
+ <pluginRepository>
- <id>nuiton.release</id>
- <name>NuitonReleaseRepository</name>
- <url>http://maven.nuiton.org/release</url>
- <snapshots>
- <enabled>false</enabled>
- </snapshots>
- <releases>
- <enabled>true</enabled>
- <checksumPolicy>warn</checksumPolicy>
- </releases>
- </pluginRepository>
+ <id>nuiton.release</id>
+ <name>NuitonReleaseRepository</name>
+ <url>http://maven.nuiton.org/release</url>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ <releases>
+ <enabled>true</enabled>
+ <checksumPolicy>warn</checksumPolicy>
+ </releases>
+ </pluginRepository>
- <!-- depot des snapshots nuiton -->
+ <!-- depot des snapshots nuiton -->
- <pluginRepository>
- <id>nuiton.snapshot</id>
- <name>NuitonSnapshotRepository</name>
- <url>http://maven.nuiton.org/snapshot</url>
- <snapshots>
- <enabled>true</enabled>
- <checksumPolicy>fail</checksumPolicy>
- </snapshots>
- <releases>
- <enabled>false</enabled>
- </releases>
- </pluginRepository>
+ <pluginRepository>
+ <id>nuiton.snapshot</id>
+ <name>NuitonSnapshotRepository</name>
+ <url>http://maven.nuiton.org/snapshot</url>
+ <snapshots>
+ <enabled>true</enabled>
+ <checksumPolicy>fail</checksumPolicy>
+ </snapshots>
+ <releases>
+ <enabled>false</enabled>
+ </releases>
+ </pluginRepository>
- </pluginRepositories>
+ </pluginRepositories>
</project>
1
0
18 May '10
Author: fdesbois
Date: 2010-05-18 19:09:12 +0200 (Tue, 18 May 2010)
New Revision: 3000
Url: http://chorem.org/repositories/revision/pollen/3000
Log:
continue form managment with list...
Added:
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/GenericEncoder.java
Removed:
trunk/pollen-ui/src/main/webapp/poll/PollCreation.tml.orig
Modified:
trunk/pollen-business/src/main/java/org/chorem/pollen/entity/FavoriteListImpl.java
trunk/pollen-business/src/main/java/org/chorem/pollen/entity/ParticipantHelper.java
trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollAccountImpl.java
trunk/pollen-business/src/main/xmi/pollen.zargo
trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServicePollImplTest.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/PollForm.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenManager.java
trunk/pollen-ui/src/main/resources/i18n/pollen-ui-fr_FR.properties
trunk/pollen-ui/src/main/webapp/css/poll.css
trunk/pollen-ui/src/main/webapp/js/pollForm.js
trunk/pollen-ui/src/main/webapp/poll/PollForm.tml
Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/entity/FavoriteListImpl.java
===================================================================
--- trunk/pollen-business/src/main/java/org/chorem/pollen/entity/FavoriteListImpl.java 2010-05-14 15:12:25 UTC (rev 2999)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/entity/FavoriteListImpl.java 2010-05-18 17:09:12 UTC (rev 3000)
@@ -23,7 +23,16 @@
}
@Override
- public void addParticipant(Participant participant) throws PollenBusinessException {
+ public void setParticipants(Collection<Participant> participants)
+ throws PollenBusinessException {
+ setFavoriteParticipant(new ArrayList<FavoriteParticipant>());
+ for (Participant participant : participants) {
+ addParticipant(participant);
+ }
+ }
+
+ protected void addParticipant(Participant participant)
+ throws PollenBusinessException {
String name = participant.getName();
String email = participant.getEmail();
@@ -36,8 +45,4 @@
favorite.setFavoriteList(this);
addFavoriteParticipant(favorite);
}
-
- @Override
- public void removeParticipant(Participant participant) {
- }
}
Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/entity/ParticipantHelper.java
===================================================================
--- trunk/pollen-business/src/main/java/org/chorem/pollen/entity/ParticipantHelper.java 2010-05-14 15:12:25 UTC (rev 2999)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/entity/ParticipantHelper.java 2010-05-18 17:09:12 UTC (rev 3000)
@@ -14,7 +14,7 @@
/**
* Check the existence of participant from a {@code list}. The existence is
- * tested on {@code name} and {@code email}. The {@code email} an be null.
+ * tested on {@code name} and {@code email}. The {@code email} can be null.
*
* @param list ParticipantList which contains a list of Participant
* @param name Name of the participant to check
@@ -30,7 +30,7 @@
boolean emailCheck = emailNull ||
(email != null && email.equals(participant.getEmail()));
- if (name.equals(participant.getName()) && emailCheck) {
+ if (name != null && name.equals(participant.getName()) && emailCheck) {
if (emailNull) {
throw new PollenBusinessException(
PollenBusinessException.PollenExceptionType.PARTICIPANT_EXIST_WITHOUT_EMAIL,
Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollAccountImpl.java
===================================================================
--- trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollAccountImpl.java 2010-05-14 15:12:25 UTC (rev 2999)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollAccountImpl.java 2010-05-18 17:09:12 UTC (rev 3000)
@@ -30,11 +30,20 @@
}
@Override
- public void addParticipant(Participant participant) throws PollenBusinessException {
- if (!list) {
+ public void setParticipants(Collection<Participant> participants)
+ throws PollenBusinessException {
+ if (!list) {
throw new UnsupportedOperationException(
- "Unable to add a participant from a child account");
+ "Unable to set participants from a child account");
}
+ setChild(new ArrayList<PollAccount>());
+ for (Participant participant : participants) {
+ addParticipant(participant);
+ }
+ }
+
+ protected void addParticipant(Participant participant)
+ throws PollenBusinessException {
String name = participant.getName();
String email = participant.getEmail();
@@ -46,8 +55,4 @@
account.setWeight(participant.getWeight());
addChild(account);
}
-
- @Override
- public void removeParticipant(Participant participant) {
- }
}
Modified: trunk/pollen-business/src/main/xmi/pollen.zargo
===================================================================
(Binary files differ)
Modified: trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServicePollImplTest.java
===================================================================
--- trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServicePollImplTest.java 2010-05-14 15:12:25 UTC (rev 2999)
+++ trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServicePollImplTest.java 2010-05-18 17:09:12 UTC (rev 3000)
@@ -69,14 +69,16 @@
list1.setName("List1");
list1.setList(true);
+ Collection<Participant> participants = new ArrayList<Participant>();
Participant participant1_1 = new PollAccountImpl();
participant1_1.setName("participant1_1");
participant1_1.setEmail("email1_1(a)domain.org");
- list1.addParticipant(participant1_1);
+ participants.add(participant1_1);
Participant participant1_2 = new PollAccountImpl();
participant1_2.setName("participant1_2");
- list1.addParticipant(participant1_2);
+ participants.add(participant1_2);
+ list1.setParticipants(participants);
// Second list : existing list from user favorites
list2 = createFavoriteList("list2", user);
@@ -283,17 +285,19 @@
ParticipantList list = servicePoll.getNewPollList();
lists.add(list);
+ Collection<Participant> participants = new ArrayList<Participant>();
Participant participant1 = servicePoll.getNewPollParticipant();
participant1.setName("participant1");
participant1.setEmail("email1");
participant1.setWeight(1.);
- list.addParticipant(participant1);
+ participants.add(participant1);
Participant participant2 = servicePoll.getNewPollParticipant();
participant2.setName("participant2");
participant2.setEmail(null);
participant2.setWeight(1.);
- list.addParticipant(participant2);
+ participants.add(participant2);
+ list.setParticipants(participants);
/** EXEC METHOD **/
servicePoll.createPoll(poll, lists);
Added: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/GenericEncoder.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/GenericEncoder.java (rev 0)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/GenericEncoder.java 2010-05-18 17:09:12 UTC (rev 3000)
@@ -0,0 +1,37 @@
+package org.chorem.pollen.ui.data;
+
+import org.apache.tapestry5.ValueEncoder;
+import org.chorem.pollen.entity.Participant;
+
+import java.util.Collection;
+
+/**
+ * Created: 17 mai 2010
+ *
+ * @author fdesbois <fdesbois(a)codelutin.com>
+ * @version $Id$
+ */
+public class GenericEncoder<T> implements ValueEncoder<T> {
+
+ protected Iterable<T> dataSource;
+
+ public GenericEncoder(Iterable<T> dataSource) {
+ this.dataSource = dataSource;
+ }
+
+ @Override
+ public String toClient(T object) {
+ return object == null ? null : object.toString();
+ }
+
+ @Override
+ public T toValue(String s) {
+ for (T curr : dataSource) {
+ if (curr.toString().equals(s)) {
+ return curr;
+ }
+ }
+ return null;
+ }
+
+}
Property changes on: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/GenericEncoder.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/PollForm.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/PollForm.java 2010-05-14 15:12:25 UTC (rev 2999)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/PollForm.java 2010-05-18 17:09:12 UTC (rev 3000)
@@ -3,7 +3,9 @@
import org.apache.commons.lang.StringUtils;
import org.apache.tapestry5.Block;
import org.apache.tapestry5.ComponentResources;
+import org.apache.tapestry5.Field;
import org.apache.tapestry5.RenderSupport;
+import org.apache.tapestry5.ValueEncoder;
import org.apache.tapestry5.annotations.Environmental;
import org.apache.tapestry5.annotations.IncludeJavaScriptLibrary;
import org.apache.tapestry5.annotations.IncludeStylesheet;
@@ -11,6 +13,7 @@
import org.apache.tapestry5.annotations.Log;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
+import org.apache.tapestry5.corelib.components.AjaxFormLoop;
import org.apache.tapestry5.corelib.components.Form;
import org.apache.tapestry5.corelib.components.Zone;
import org.apache.tapestry5.ioc.Messages;
@@ -29,12 +32,22 @@
import org.chorem.pollen.ui.base.AbstractPollenPage;
import org.chorem.pollen.ui.components.Border;
import org.chorem.pollen.ui.data.AddressBar;
+import org.chorem.pollen.ui.data.GenericEncoder;
+import org.chorem.pollen.ui.data.ParticipantsListener;
+import org.chorem.pollen.ui.services.PollenManager;
+import org.nuiton.web.tapestry5.components.FeedBack;
import org.slf4j.Logger;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
+import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
import java.util.Map;
/**
@@ -73,6 +86,9 @@
@InjectComponent
private Zone mainZone;
+ @Inject
+ private Logger logger;
+
@Override
public Border getBorder() {
return border;
@@ -87,6 +103,9 @@
@Inject
private ServicePoll servicePoll;
+ @Inject
+ private PollenManager manager;
+
private String pollUID;
@Persist
@@ -113,7 +132,7 @@
* @return poll existing or a new one
* @throws PollenBusinessException
*/
- public Poll getPoll() throws PollenBusinessException {
+ public Poll getPoll() {
if (poll == null) {
if (StringUtils.isNotEmpty(pollUID)) {
if (log.isDebugEnabled()) {
@@ -137,8 +156,8 @@
* @return true if it's the create mode, false otherwise
* @throws PollenBusinessException
*/
- public boolean isCreateMode() throws PollenBusinessException {
- return StringUtils.isEmpty(getPoll().getTopiaId());
+ public boolean isCreateMode() {
+ return StringUtils.isEmpty(getPoll().getId());
}
/**
@@ -147,7 +166,7 @@
* @return the page title depends on create or update mode.
* @throws PollenBusinessException
*/
- public String getPageTitle() throws PollenBusinessException {
+ public String getPageTitle() {
String title = "";
if (isCreateMode()) {
title = messages.get("pageTitle-create");
@@ -163,7 +182,7 @@
* @return the address bar.
* @throws PollenBusinessException
*/
- public AddressBar getAddressBar() throws PollenBusinessException {
+ public AddressBar getAddressBar() {
return AddressBar.newBar().appendCurrent(getPageTitle());
}
@@ -325,7 +344,7 @@
hasReminder = false;
}
- public boolean isChoiceNbDisabled() throws PollenBusinessException {
+ public boolean isChoiceNbDisabled() {
// voteCounting not set to NORMAL
return !getPoll().getVoteCountingType().isNormal();
}
@@ -386,22 +405,30 @@
* @return true if the poll has a FREE pollType
* @throws PollenBusinessException
*/
- public boolean isReminderDisabled() throws PollenBusinessException {
+ public boolean isReminderDisabled() {
// pollType is FREE
return getPoll().getPollType().isFree();
}
- /** *********************** LISTS **************************************** */
+ /** *********************** LISTS *****************************************/
@Persist
- private Map<String, ParticipantList> lists; // for GROUP
+ private Map<String, ParticipantList> lists;
@Property
private ParticipantList list;
+// @Persist
+// private String listSelectedName;
+
@Persist
- private Map<String, Participant> participants; // for RESTRICTED
+ private ParticipantList listSelected;
+ private Map<String, Participant> selectedParticipants;
+
+ @Property
+ private Participant participant;
+
@InjectComponent
private Zone listsZone;
@@ -412,70 +439,286 @@
private ComponentResources resources;
@Property
- private boolean flag;
+ private boolean formActivate;
-// @Inject
-// private Block listsForm;
-//
-// @Inject
-// @Property
-// private Block listsFields;
+ @InjectComponent
+ private FeedBack listsFeedback;
+ private ParticipantsListener listSelectedListener;
+
public Map<String, ParticipantList> getLists() {
if (lists == null) {
- lists = new HashMap<String, ParticipantList>();
+ lists = new LinkedHashMap<String, ParticipantList>();
+ if (getPoll().getPollType().isRestricted()) {
+ lists.put("LIST", servicePoll.getNewPollList());
+ }
}
return lists;
}
- public Map<String, Participant> getParticipants() {
- if (participants == null) {
- participants = new HashMap<String, Participant>();
+ @Log
+ Object onChangeFromPollType(String value) {
+ PollType type = PollType.valueOf(value);
+ getPoll().setPollType(type);
+ if (type.isRestrictedOrGroup()) {
+ listsFeedback.addInfo("Edition en cours d'une liste restreinte. " +
+ "Attention un changement de type de restriction provoquera" +
+ " une remise à zéro de la/les liste(s) en cours d'édition.");
}
- return participants;
+ // Clean persist data for lists : careful, will reset unsaved data
+ lists = null;
+ listSelected = null;
+ return refreshListZone();
}
@Log
- public boolean canDisplayLists() throws PollenBusinessException {
+ public boolean canDisplayLists() {
return getPoll().getPollType().isRestrictedOrGroup();
}
+ public ParticipantList getListSelected() {
+ if (listSelected == null && getPoll().getPollType().isRestricted()) {
+ listSelected = getLists().get("LIST");
+// if (listSelected == null) {
+// listSelected = servicePoll.getNewPollList();
+// getLists().put("LIST", listSelected);
+// if (log.isDebugEnabled()) {
+// log.debug("Instantiate list for restricted poll");
+// }
+// }
+ }
+// else if (StringUtils.isNotEmpty(listSelectedName)) {
+// listSelected = getLists().get(listSelectedName);
+// }
+ if (log.isDebugEnabled() && listSelected != null) {
+ log.debug("List selected : " + listSelected.getName());
+ }
+ return listSelected;
+ }
+
+ public String getStyleSelected() {
+ return isCurrentListSelected() ? " selected" : "";
+ }
+
+ public boolean isCurrentListSelected() {
+ return listSelected != null &&
+ list.getName().equals(listSelected.getName());
+ }
+
@Log
- Object onChangeFromPollType(String value) throws PollenBusinessException {
- getPoll().setPollType(PollType.valueOf(value));
- flag = false;
- return listsZone.getBody();
+ void onSelectedFromAddList() {
+ formActivate = true;
+ if (StringUtils.isNotEmpty(listName) &&
+ !getLists().containsKey(listName)) {
+ if (log.isDebugEnabled()) {
+ log.debug("Add list : " + listName);
+ }
+ ParticipantList list = servicePoll.getNewPollList();
+ list.setName(listName);
+ getLists().put(listName, list);
+ listSelected = list;
+ } else {
+ if (log.isDebugEnabled()) {
+ log.debug("Refuse adding list : " + listName);
+ }
+// listSelected = null;
+// listsFeedback.addError("Impossible d'ajouter une liste avec un nom vide");
+ }
+ // Reset form field before refresh form
+ listName = null;
+ if (log.isDebugEnabled() && listSelected != null) {
+ log.debug("Selected list : " + listSelected.getName());
+ }
}
+ @Log
+ void onSelectedFromEditList(String listName) {
+ formActivate = true;
+ listSelected = getLists().get(listName);
+ if (log.isDebugEnabled() && listSelected != null) {
+ log.debug("List selected : " + listSelected.getName());
+ }
+ }
+
+ public Map<String, Participant> getSelectedParticipants() {
+ if (selectedParticipants == null) {
+ if (log.isDebugEnabled() && listSelected != null) {
+ log.debug("Retrieve participants from list");
+ }
+ selectedParticipants = new LinkedHashMap<String, Participant>();
+ for (Participant participant : listSelected.getParticipants()) {
+ String id = manager.createPollenUrlId();
+ selectedParticipants.put(id, participant);
+ }
+ }
+ return selectedParticipants;
+ }
+
+ @Log
+ Object onActionFromRemoveList() {
+ if (log.isDebugEnabled()) {
+ log.debug("Remove list : " + listSelected.getName());
+ }
+ getLists().remove(listSelected.getName());
+ if (log.isDebugEnabled()) {
+ for (ParticipantList list : getLists().values()) {
+ log.debug("Existing lists : " + list.getName());
+ }
+ }
+ listSelected = null;
+ return refreshListZone();
+ }
+
+ @Log
+ void onSelectedFromSaveList(String listName) {
+ try {
+ listSelected.setParticipants(selectedParticipants.values());
+ } catch (PollenBusinessException eee) {
+ String message = manager.getErrorMessage(eee, messages, logger);
+ listsFeedback.addError(message);
+ }
+ }
+
// @Log
-// public Block getListsBlock() throws PollenBusinessException {
-// if (canDisplayLists()) {
-// if (flag) {
-// return listsFields;
+// void onSelectedFromRemoveList(String listName) {
+// if (formActivate) {
+// if (log.isWarnEnabled()) {
+// log.warn("Strange submit behavior... Escape remove.");
// }
-// return listsForm;
+// return;
// }
-// return null;
+// formActivate = true;
+// if (log.isDebugEnabled()) {
+// log.debug("Remove list : " + listName);
+// }
+// getLists().remove(listName);
+// if (log.isDebugEnabled()) {
+// for (ParticipantList list : getLists().values()) {
+// log.debug("Existing lists : " + list.getName());
+// }
+// }
+// if (listSelected != null && listSelected.getName().equals(listName)) {
+// listSelected = null;
+// }
// }
- @Log
- void onSelectedFromAddList() {
- flag = true;
- addList(listName);
+ public ValueEncoder<ParticipantList> getListEncoder() {
+ final Collection<ParticipantList> lists = getLists().values();
+ ValueEncoder<ParticipantList> encoder =
+ new ValueEncoder<ParticipantList>() {
+
+ @Override
+ public String toClient(ParticipantList participant) {
+ return participant.getName();
+ }
+
+ @Override
+ public ParticipantList toValue(String s) {
+ for (ParticipantList curr : lists) {
+ if (s.equals(curr.getName())) {
+ return curr;
+ }
+ }
+ return null;
+ }
+ };
+ return encoder;
}
- protected void addList(String name) {
- if (!getLists().containsKey(name)) {
- ParticipantList list = new PollAccountImpl();
- list.setName(name);
- getLists().put(name, list);
- }
+ Object onAddRowFromParticipants() {
+ Participant newParticipant = servicePoll.getNewPollParticipant();
+ //selectedParticipants.add(newParticipant);
+// try {
+// listSelected.addParticipant(newParticipant);
+// } catch (PollenBusinessException eee) {
+// String message = manager.getErrorMessage(eee, messages, logger);
+// listsFeedback.addError(message);
+// }
+ return newParticipant;
}
+ void onRemoveRowFromParticipants(Participant participant) {
+// if (log.isDebugEnabled()) {
+// for (Participant p : listSelected.getParticipants()) {
+// log.debug("Before Existing participants : " +
+// p.getName() + "_" + p.getEmail());
+// }
+// }
+//// boolean isRemoved =
+//// listSelected.getParticipants().remove(participant);
+//// listSelected.removeParticipant(participant);
+// if (log.isDebugEnabled()) {
+// log.debug("Participant removed : " + participant.getName());
+// }
+// if (log.isDebugEnabled()) {
+// for (Participant p : listSelected.getParticipants()) {
+// log.debug("Existing participants : " +
+// p.getName() + "_" + p.getEmail());
+// }
+// }
+ }
+
+ public ValueEncoder<Participant> getParticipantEncoder() {
+ ValueEncoder<Participant> encoder = new ValueEncoder<Participant>() {
+
+ @Override
+ public String toClient(Participant participant) {
+// String key = getParticipantKey(participant);
+ if (log.isDebugEnabled()) {
+ log.debug("Participant to find : " + participant);
+ }
+ for (Map.Entry<String, Participant> entry :
+ getSelectedParticipants().entrySet()) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Selected participant entry : " +
+ "key = " + entry.getKey() + " -> " +
+ "value = " + entry.getValue());
+ }
+ if (entry.getValue() == participant) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("toClient : key = " + entry.getKey());
+ }
+ return entry.getKey();
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public Participant toValue(String s) {
+// for (Participant curr : getSelectedParticipants()) {
+// String key = getParticipantKey(curr);
+// if (s.equals(key)) {
+// if (logger.isDebugEnabled()) {
+// logger.debug("toValue from : " + s);
+// }
+// return curr;
+// }
+// }
+ Participant participant = getSelectedParticipants().get(s);
+ if (logger.isDebugEnabled()) {
+ logger.debug("toValue : key = " + s + " -> " + participant);
+ }
+ return participant;
+ }
+ };
+ return encoder;
+ }
+
+ protected Object refreshListZone() {
+ formActivate = false;
+ return listsZone.getBody();
+ }
+
@Log
- Object onSuccess() throws PollenBusinessException {
+ Object onSuccess() {
return mainZone;
}
+ // TODO-FD2010-05-18 : Put this in ParticipantHelper in business
+ public String getParticipantKey(Participant participant) {
+ return participant.getName() + "_" + participant.getEmail();
+ }
+
}
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenManager.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenManager.java 2010-05-14 15:12:25 UTC (rev 2999)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenManager.java 2010-05-18 17:09:12 UTC (rev 3000)
@@ -122,6 +122,10 @@
return context.getCurrentDate();
}
+ public String createPollenUrlId() {
+ return context.createPollenUrlId();
+ }
+
public String getErrorMessage(PollenBusinessException eee,
Messages messages, Logger logger) {
if (logger.isDebugEnabled()) {
Modified: trunk/pollen-ui/src/main/resources/i18n/pollen-ui-fr_FR.properties
===================================================================
--- trunk/pollen-ui/src/main/resources/i18n/pollen-ui-fr_FR.properties 2010-05-14 15:12:25 UTC (rev 2999)
+++ trunk/pollen-ui/src/main/resources/i18n/pollen-ui-fr_FR.properties 2010-05-18 17:09:12 UTC (rev 3000)
@@ -3,53 +3,58 @@
pollen.page.UserLists.title=Vos listes de votants
############################ EMAIL #############################################
-pollen.email.userRegister.subject=[Pollen] Confirmation de cr\u00E9ation du compte %s
-pollen.email.userRegister.content=Bienvenue %1$s. Vous venez de cr\u00E9er un compte sur l'application de sondage en ligne Pollen.\n\nIdentifiant : %2$s\nMot de passe : %3$s\n\nVous pouvez d\u00E8s maintenant g\u00E9rer vos sondages en vous identifiant sur le site : \n%4$s
+pollen.email.userRegister.subject=[Pollen] Confirmation de cr\u00e9ation du compte %s
+pollen.email.userRegister.content=Bienvenue %1$s. Vous venez de cr\u00e9er un compte sur l'application de sondage en ligne Pollen.\n\nIdentifiant : %2$s\nMot de passe : %3$s\n\nVous pouvez d\u00e8s maintenant g\u00e9rer vos sondages en vous identifiant sur le site : \n%4$s
############################ GLOBAL ############################################
pollen.ui.tooltip.help=Aide
pollen.ui.button.add=Ajouter
-pollen.ui.button.create=Cr\u00E9er
+pollen.ui.button.create=Cr\u00e9er
pollen.ui.button.ok=Ok
############################ USER ##############################################
-pollen.ui.user.register.autoConnection=Vous \u00EAtes maintenant connect\u00E9 avec l'identifiant %1$s.
-pollen.ui.user.register.sendEmail=Un email vous a \u00E9t\u00E9 envoy\u00E9 \u00E0 l'adresse %1$s.
+pollen.ui.user.register.autoConnection=Vous \u00eates maintenant connect\u00e9 avec l'identifiant %1$s.
+pollen.ui.user.register.sendEmail=Un email vous a \u00e9t\u00e9 envoy\u00e9 \u00e0 l'adresse %1$s.
pollen.ui.user.validate.passwords=Les deux mots de passe ne correspondent pas.
-pollen.ui.user.update.success=Modification enregistr\u00E9e avec succ\u00E8s.
-pollen.ui.user.display.notConnected=Vous devez vous connecter pour acc\u00E9der \u00E0 la page %1$s.
-pollen.ui.user.display.notAllowed=Vous n'avez pas les droits n\u00E9cessaires pour acc\u00E9der \u00E0 la page %1$s.
-pollen.ui.user.create.title=Cr\u00E9er un nouvel utilisateur
-pollen.ui.user.create.passwordGenerated=Le mot de passe du nouvel utilisateur a \u00E9t\u00E9 g\u00E9n\u00E9r\u00E9.
-pollen.ui.user.create.passwordSameAsLogin=Le mot de passe du nouvel utilisateur est le m\u00EAme que son identifiant.
-pollen.ui.user.create.passwordHelp=Si vous pr\u00E9cisez un email, un mot de passe sera g\u00E9n\u00E9r\u00E9 et envoy\u00E9 \u00E0 l'utilisateur. Sinon le mot de passe sera identique au login.
-pollen.ui.user.create.sendEmail=Un email a \u00E9t\u00E9 envoy\u00E9 au nouvel utilisateur %1$s \u00E0 l'adresse %2$s.
-pollen.ui.user.create.emailFailedShowPassword=Le mot de passe g\u00E9n\u00E9r\u00E9 est le suivant : %1$s
-pollen.ui.user.create.success=L'utilisateur %1$s a \u00E9t\u00E9 cr\u00E9\u00E9 avec succ\u00E8s.
+pollen.ui.user.update.success=Modification enregistr\u00e9e avec succ\u00e8s.
+pollen.ui.user.display.notConnected=Vous devez vous connecter pour acc\u00e9der \u00e0 la page %1$s.
+pollen.ui.user.display.notAllowed=Vous n'avez pas les droits n\u00e9cessaires pour acc\u00e9der \u00e0 la page %1$s.
+pollen.ui.user.create.title=Cr\u00e9er un nouvel utilisateur
+pollen.ui.user.create.passwordGenerated=Le mot de passe du nouvel utilisateur a \u00e9t\u00e9 g\u00e9n\u00e9r\u00e9.
+pollen.ui.user.create.passwordSameAsLogin=Le mot de passe du nouvel utilisateur est le m\u00eame que son identifiant.
+pollen.ui.user.create.passwordHelp=Si vous pr\u00e9cisez un email, un mot de passe sera g\u00e9n\u00e9r\u00e9 et envoy\u00e9 \u00e0 l'utilisateur. Sinon le mot de passe sera identique au login.
+pollen.ui.user.create.sendEmail=Un email a \u00e9t\u00e9 envoy\u00e9 au nouvel utilisateur %1$s \u00e0 l'adresse %2$s.
+pollen.ui.user.create.emailFailedShowPassword=Le mot de passe g\u00e9n\u00e9r\u00e9 est le suivant : %1$s
+pollen.ui.user.create.success=L'utilisateur %1$s a \u00e9t\u00e9 cr\u00e9\u00e9 avec succ\u00e8s.
pollen.ui.user.nbUsers=%1$d utilisateurs existants
pollen.ui.user.update.edit=Modifier cet utilisateur
pollen.ui.user.update.save=Enregistrer les modifications
pollen.ui.user.update.cancel=Annuler les changements
pollen.ui.user.delete=Supprimer cet utilisateur
-pollen.ui.user.delete.confirmMessage=Etes-vous s\u00FBr de vouloir d\u00E9finitivement supprimer cet utilisateur ?
-pollen.ui.list.create.title=Cr\u00E9er une nouvelle liste
-pollen.ui.list.create.success=La liste %1$s a \u00E9t\u00E9 cr\u00E9\u00E9e avec succ\u00E8s.
-pollen.ui.list.create.weightHelp=Ce chiffre correspond au poids du vote de la personne, c'est \u00E0 dire le nombre de voix que poss\u00E8de la personne dans le sondage.
+pollen.ui.user.delete.confirmMessage=Etes-vous s\u00fbr de vouloir d\u00e9finitivement supprimer cet utilisateur ?
+############################ USER ##############################################
+pollen.ui.list.create.title=Cr\u00e9er une nouvelle liste
+pollen.ui.list.create.success=La liste %1$s a \u00e9t\u00e9 cr\u00e9\u00e9e avec succ\u00e8s.
+pollen.ui.list.create.weightHelp=Ce chiffre correspond au poids du vote de la personne, c'est \u00e0 dire le nombre de voix que poss\u00e8de la personne dans le sondage.
pollen.ui.list.delete=Supprimer la liste %1$s
-pollen.ui.list.delete.confirmMessage=Etes-vous s\u00FBr de vouloir d\u00E9finitivement supprimer cette liste et l'int\u00E9gralit\u00E9 de ses votants ?
-pollen.ui.list.delete.success=La liste et son contenu ont \u00E9t\u00E9 supprim\u00E9 avec succ\u00E8s.
-pollen.ui.list.notSelected=Aucune liste s\u00E9lectionn\u00E9e
+pollen.ui.list.delete.confirmMessage=Etes-vous s\u00fbr de vouloir d\u00e9finitivement supprimer cette liste et l'int\u00e9gralit\u00e9 de ses votants ?
+pollen.ui.list.delete.success=La liste et son contenu ont \u00e9t\u00e9 supprim\u00e9 avec succ\u00e8s.
+pollen.ui.list.notSelected=Aucune liste s\u00e9lectionn\u00e9e
pollen.ui.list.emptyList=Liste vide. Ajoutez des votants en saisissant leur nom et email.
pollen.ui.list.nbParticipants=%1$d votants contenus dans cette liste
-pollen.ui.list.update.addParticipant=Ajouter un nouveau votant \u00E0 la liste
-pollen.ui.list.update.addParticipant.success=Le votant %1$s a \u00E9t\u00E9 ajout\u00E9 \u00E0 la liste.
+pollen.ui.list.update.addParticipant=Ajouter un nouveau votant \u00e0 la liste
+pollen.ui.list.update.addParticipant.success=Le votant %1$s a \u00e9t\u00e9 ajout\u00e9 \u00e0 la liste.
pollen.ui.list.update.cancelEdition=Annuler les changements
pollen.ui.list.update.saveParticipant=Enregistrer les modifications
-pollen.ui.list.update.saveParticipant.success=Modification enregistr\u00E9e avec succ\u00E8s.
+pollen.ui.list.update.saveParticipant.success=Modification enregistr\u00e9e avec succ\u00e8s.
pollen.ui.list.update.updateParticipant=Modifier ce votant
pollen.ui.list.update.removeParticipant=Supprimer ce votant
-pollen.ui.list.update.removeParticipant.confirmMessage=Etes-vous s\u00FBr de vouloir supprimer %1$s de la liste ?
-pollen.ui.list.update.removeParticipant.success=Le votant a \u00E9t\u00E9 supprim\u00E9 avec succ\u00E8s.
+pollen.ui.list.update.removeParticipant.confirmMessage=Etes-vous s\u00fbr de vouloir supprimer %1$s de la liste ?
+pollen.ui.list.update.removeParticipant.success=Le votant a \u00e9t\u00e9 supprim\u00e9 avec succ\u00e8s.
+pollen.ui.participant.name-label=Nom
+pollen.ui.participant.email-label=Email
+pollen.ui.participant.weight-label=Poids
+pollen.ui.participant.add=Nouveau participant
# OLD LOGIN_COMPONENT
connectionLegend=Connexion
@@ -61,7 +66,7 @@
loginFailed=Mauvais identifiant ou mot de passe.
# FORM:: user
-firstName-label=Pr\u00E9nom
+firstName-label=Pr\u00e9nom
lastName-label=Nom
login-label=Identifiant
email-label=Email
@@ -77,14 +82,14 @@
editEmail-regexp-message=Adresse email invalide.
############################ CHOICE ############################################
-pollen.ui.choice.delete.confirm=Etes-vous s\u00FBr de vouloir d\u00E9finitivement supprimer ce choix ?
+pollen.ui.choice.delete.confirm=Etes-vous s\u00fbr de vouloir d\u00e9finitivement supprimer ce choix ?
pollen.ui.choice.delete.title=Supprimer ce choix
-pollen.ui.vote.noVote=Aucune personne n'a encore particip\u00E9 au sondage
+pollen.ui.vote.noVote=Aucune personne n'a encore particip\u00e9 au sondage
pollen.ui.vote.noPager=%1$d votes existants
pollen.ui.choice.datePattern=dd/MM/yyyy HH:mm
pollen.ui.choice.add.title=Ajout d'un choix
pollen.ui.choice.add.submit=Ajouter
-pollen.ui.error.upload=Une erreur s'est produite lors du transfert des fichiers. La taille maximale autoris\u00E9e est de %1$s par fichier et %2$s au total.
+pollen.ui.error.upload=Une erreur s'est produite lors du transfert des fichiers. La taille maximale autoris\u00e9e est de %1$s par fichier et %2$s au total.
# Tapestry messages for VoteForPoll.tml
# FORM:: addChoice
@@ -93,42 +98,42 @@
addChoice-choiceText-required-message=Vous devez saisir un choix.
choiceDate-label=Date et heure
addChoice-choiceDate-regexp=\\d{2}\/\\d{2}\/\\d{4}( \\d{2}\\:\\d{2})?
-addChoice-choiceDate-regexp-message=La date de d\u00E9but doit-\u00EAtre au format 31/12/2000 23:59.
+addChoice-choiceDate-regexp-message=La date de d\u00e9but doit-\u00eatre au format 31/12/2000 23:59.
addChoice-choiceDate-required-message=Vous devez saisir un choix.
choiceImage-label=Image
addChoice-choiceImage-regexp=\\.(jpe?g|gif|png|JPE?G|GIF|PNG)$
-addChoice-choiceImage-regexp-message=L'image doit-\u00EAtre au format JPG, GIF ou PNG.
+addChoice-choiceImage-regexp-message=L'image doit-\u00eatre au format JPG, GIF ou PNG.
addChoice-choiceImage-required-message=Vous devez saisir un choix.
# Poll creation emails
-#creatorEmail_subject=[Pollen] Cr\u00E9ation d'un sondage (%s)
-#creatorEmail_msg=Vous venez de cr\u00E9er le sondage "%s".\nVous pouvez y acc\u00E9der en suivant les liens ci-dessous.\n\nPage de vote : \n%s\nPage de modification : \n%s
+#creatorEmail_subject=[Pollen] Cr\u00e9ation d'un sondage (%s)
+#creatorEmail_msg=Vous venez de cr\u00e9er le sondage "%s".\nVous pouvez y acc\u00e9der en suivant les liens ci-dessous.\n\nPage de vote : \n%s\nPage de modification : \n%s
#votingEmail_subject=[Pollen] Invitation au vote (%s)
-#votingEmail_msg=Un nouveau sondage a \u00E9t\u00E9 cr\u00E9\u00E9 : "%s".\nVous pouvez y participer avec l'identifiant %s \u00E0 l'adresse suivante : \n%s
+#votingEmail_msg=Un nouveau sondage a \u00e9t\u00e9 cr\u00e9\u00e9 : "%s".\nVous pouvez y participer avec l'identifiant %s \u00e0 l'adresse suivante : \n%s
# Notification emails
#voteEmail_subject=[Pollen] Notification de vote (%s)
-#voteEmail_msg=Un vote vient d'\u00EAtre enregistr\u00E9 pour le sondage "%s". Ce sondage compte d\u00E9sormais %d votes.\nVous pouvez acc\u00E9der \u00E0 ce sondage en suivant les liens ci-dessous.\n\nPage de vote : \n%s\nPage de modification : \n%s
+#voteEmail_msg=Un vote vient d'\u00eatre enregistr\u00e9 pour le sondage "%s". Ce sondage compte d\u00e9sormais %d votes.\nVous pouvez acc\u00e9der \u00e0 ce sondage en suivant les liens ci-dessous.\n\nPage de vote : \n%s\nPage de modification : \n%s
# Reminder emails
#reminderEmail_subject=[Pollen] Rappel (%s)
-#reminderEmail_msg=Vous n'avez pas encore vot\u00E9 pour le sondage "%s".\nVous pouvez encore y participer avec l'identifiant %s \u00E0 l'adresse suivante : \n%s
+#reminderEmail_msg=Vous n'avez pas encore vot\u00e9 pour le sondage "%s".\nVous pouvez encore y participer avec l'identifiant %s \u00e0 l'adresse suivante : \n%s
# Poll feed
#pollFeed_title=Pollen : %s
#pollFeed_desc=%s
-#pollFeed_createTitle=Sondage cr\u00E9\u00E9 par %s
+#pollFeed_createTitle=Sondage cr\u00e9\u00e9 par %s
#pollFeed_createContent=
#pollFeed_voteTitle=Nouveau vote de %s
-#pollFeed_voteContent=\u00C9tat du sondage : %s
+#pollFeed_voteContent=\u00c9tat du sondage : %s
#pollFeed_choiceTitle=Nouveau choix : %s
#pollFeed_choiceContent=%s
#pollFeed_commentTitle=Nouveau commentaire de %s
#pollFeed_commentContent=%s
# Actions
-#create=Cr\u00E9er
+#create=Cr\u00e9er
#edit=Modifier
#delete=Supprimer
#add=Ajouter
Modified: trunk/pollen-ui/src/main/webapp/css/poll.css
===================================================================
--- trunk/pollen-ui/src/main/webapp/css/poll.css 2010-05-14 15:12:25 UTC (rev 2999)
+++ trunk/pollen-ui/src/main/webapp/css/poll.css 2010-05-18 17:09:12 UTC (rev 3000)
@@ -70,3 +70,108 @@
float: left;
}
+/* FOR LISTS */
+TABLE.t-data-grid {
+ width: 500px;
+ margin: auto;
+}
+
+TABLE.t-data-grid THEAD TR {
+ background-color: #98dae4;
+ color: #727A7E;
+}
+
+INPUT.list-edition {
+ border: 0;
+ background-color: transparent;
+ cursor: pointer;
+}
+
+INPUT.selected {
+ color: #32B5C9;
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+/*DIV.t-data-grid {
+ font-family: Arial, Helvetica, sans-serif;
+ margin-top:20px;
+ margin-bottom:20px;
+}
+
+DIV.t-data-grid-pager {
+ margin: 8px 0px;
+}
+
+DIV.t-data-grid-pager A, DIV.t-data-grid-pager SPAN.current {
+ text-decoration: none;
+ padding: 2px 5px;
+ font-size: 14px;
+ margin-right: 5px;
+}
+
+DIV.t-data-grid-pager A {
+ background-color: #fc0;
+ border: 1px solid #aab;
+ color: #fff;
+}
+
+DIV.t-data-grid-pager A:hover {
+ border: 1px solid #000;
+ color: #000;
+}
+
+DIV.t-data-grid-pager SPAN.current {
+ color: #fff;
+ border: 1px solid #fc0;
+ background-color: #000;
+}
+
+TABLE.t-data-grid {
+ border-collapse: collapse;
+ border-left: 1px solid #aab;
+ border-top: 1px solid #aab;
+ background-color: #fff;
+ font-size: 14px;
+ margin: auto;
+ text-align: center;
+}
+
+TABLE.t-data-grid THEAD {
+ border-top: 1px solid #aab; / For Firefox /
+}
+
+TABLE.t-data-grid THEAD TR {
+ color: #fff;
+ background-color: #fc0;
+}
+
+TABLE.t-data-grid THEAD TR a {
+ color: #fff;
+ background-color: #fc0;
+}
+
+TABLE.t-data-grid THEAD TR TH {
+ text-align: left;
+ padding: 2px 3px;
+ white-space: nowrap;
+ border-right: 1px solid #aab;
+ border-bottom: 1px solid #aab;
+ background-color:#fc0;
+}
+
+TABLE.t-data-grid TBODY TR {
+ background-color: #fff;
+}
+
+TABLE.t-data-grid TBODY TR.odd {
+ background-color: #ffb;
+}
+
+TABLE.t-data-grid TBODY TR TD {
+ border-right: 1px solid #aab;
+ border-bottom: 1px solid #aab;
+ padding: 2px 5px;
+}
+*/
+
Modified: trunk/pollen-ui/src/main/webapp/js/pollForm.js
===================================================================
--- trunk/pollen-ui/src/main/webapp/js/pollForm.js 2010-05-14 15:12:25 UTC (rev 2999)
+++ trunk/pollen-ui/src/main/webapp/js/pollForm.js 2010-05-18 17:09:12 UTC (rev 3000)
@@ -37,6 +37,8 @@
this.contextPath = contextPath;
+// this.form.observe('submit', this.disableEnterSubmit.bindAsEventListener(this));
+
// this.contextBlockVisible = ['true', 'false'];
// this.contextBlockId = ['mainInfos', 'options'];
//
@@ -99,6 +101,13 @@
// }
// },
+// disableEnterSubmit: function(event) {
+// if (event.keyCode != Event.KEY_RETURN) {
+// Tapestry.debug('disable enter');
+// event.stop();
+// }
+// },
+
/*
* Action when voteCounting select change. This change affects choiceNb
* checkbox : choiceNb is only available if voteCounting is 'NORMAL'.
Deleted: trunk/pollen-ui/src/main/webapp/poll/PollCreation.tml.orig
===================================================================
--- trunk/pollen-ui/src/main/webapp/poll/PollCreation.tml.orig 2010-05-14 15:12:25 UTC (rev 2999)
+++ trunk/pollen-ui/src/main/webapp/poll/PollCreation.tml.orig 2010-05-18 17:09:12 UTC (rev 3000)
@@ -1,301 +0,0 @@
-
-<t:border t:address="address" t:pageLogo="literal:Creation"
- xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter">
-
- <t:feedback t:id="feedback"/>
- <h1 class="titleCreation">${message:title-new}</h1>
- <t:zone t:id="pollCreationZone" show="show" update="show">
- <t:form t:id="pollCreationForm" t:zone="pollCreationZone">
-
- <!-- Étape POLL -->
- <t:formfragment visible="inPoll">
- <div id="pollCreationFormDiv">
- <t:errors/>
- <fieldset>
- <legend>${stepLegend}</legend>
- <div>
- <t:label for="votingId" />
- <t:textfield t:id="votingId" t:value="poll.creatorName" t:validate="required,minlength=2"/>
- </div>
- <div>
- <t:label for="email" />
- <t:textfield t:id="email" t:value="poll.creatorEmail" t:validate="regexp" />
- </div>
- <br />
- <div>
- <t:label for="title" />
- <t:textfield t:id="title" t:value="poll.title" t:validate="required" />
- </div>
- <div>
- <t:label for="description" />
- <t:textarea cols="23" t:id="description" t:value="poll.description"/>
- </div>
- <div>
- <t:label for="beginDate" />
- <input t:type="ck/dateTimeField" t:id="beginDate" value="poll.beginDate" t:validate="regexp"
- t:datePattern="${message:DTF-pattern}" t:timePicker="true" t:timePickerAdjacent="true"/>
- </div>
- <div>
- <t:label for="endDate" />
- <input t:type="ck/dateTimeField" t:id="endDate" value="poll.endDate" t:validate="regexp"
- t:datePattern="${message:DTF-pattern}" t:timePicker="true" t:timePickerAdjacent="true"/>
- </div>
- <div>
- <t:label for="pollType" />
- <t:select t:id="pollType" t:value="poll.pollType" t:validate="required"></t:select>
- <span t:type="ck/Tooltip" title="${message:help}" value="${message:pollType-help}" effect="appear">
- <img src="${asset:context:img/help.png}" alt="${message:help}"/>
- </span>
- </div>
- <div>
- <t:label for="voteCounting" />
- <t:select t:id="voteCounting" t:value="poll.voteCounting" t:validate="required"></t:select>
- <span t:type="ck/Tooltip" title="${message:help}" value="${message:voteCounting-help}" effect="appear">
- <img src="${asset:context:img/help.png}" alt="${message:help}"/>
- </span>
- </div>
- </fieldset>
- <div class="buttons">
- <t:submit t:value="${message:next-button}" t:zone="pollCreationZone" />
- </div>
- </div>
- </t:formfragment>
-
- <!-- Étape OPTIONS -->
- <t:formfragment visible="inOptions">
- <div id="optionsCreationFormDiv">
- <t:errors/>
- <FieldSet>
- <legend>${stepLegend}</legend>
- <div>
- <t:checkbox t:id="anonymous" t:value="poll.anonymous" onChange="cbDisable(this, this.form.anonymousVoteAllowed)" />
- <t:label for="anonymous" />
- <span t:type="ck/Tooltip" title="${message:help}" value="${message:anonymous-help}" effect="appear">
- <img src="${asset:context:img/help.png}" alt="${message:help}"/>
- </span>
- </div>
- <div>
- <t:checkbox t:id="anonymousVoteAllowed" t:value="poll.anonymousVoteAllowed" />
- <t:label for="anonymousVoteAllowed" />
- <span t:type="ck/Tooltip" title="${message:help}" value="${message:anonymousVoteAllowed-help}" effect="appear">
- <img src="${asset:context:img/help.png}" alt="${message:help}"/>
- </span>
- </div>
- <div>
- <t:checkbox t:id="continuousResults" t:value="poll.continuousResults" onChange="cbDisable(this, this.form.publicResults)" />
- <t:label for="continuousResults" />
- <span t:type="ck/Tooltip" title="${message:help}" value="${message:continuousResults-help}" effect="appear">
- <img src="${asset:context:img/help.png}" alt="${message:help}"/>
- </span>
- </div>
- <div>
- <t:checkbox t:id="publicResults" t:value="poll.publicResults" />
- <t:label for="publicResults" />
- <span t:type="ck/Tooltip" title="${message:help}" value="${message:publicResults-help}" effect="appear">
- <img src="${asset:context:img/help.png}" alt="${message:help}"/>
- </span>
- </div>
- <div>
- <t:checkbox t:id="addChoiceAllowed" t:value="poll.choiceAddAllowed" onChange="$('choiceDateDiv').toggle()" />
- <t:label for="addChoiceAllowed" />
- <span t:type="ck/Tooltip" title="${message:help}" value="${message:addChoiceAllowed-help}" effect="appear">
- <img src="${asset:context:img/help.png}" alt="${message:help}"/>
- </span>
- <br/>
- <span id="choiceDateDiv" style="${choiceDateDisplay}">
- <t:label for="beginChoiceDate" />
- <input t:type="ck/dateTimeField" t:id="beginChoiceDate" value="poll.beginChoiceDate" t:validate="regexp"
- t:datePattern="${message:DTF-pattern}" t:timePicker="true" t:timePickerAdjacent="true"/>
- <br />
- <t:label for="endChoiceDate" />
- <input t:type="ck/dateTimeField" t:id="endChoiceDate" value="poll.endChoiceDate" t:validate="regexp"
- t:datePattern="${message:DTF-pattern}" t:timePicker="true" t:timePickerAdjacent="true"/>
- </span>
- </div>
- <t:if test="normalVoteCounting">
- <div>
- <t:checkbox t:id="choiceNb" value="choiceNbCheckBox" onChange="$('choiceNbDiv').toggle()"/>
- <t:label for="choiceNb" />
- <span t:type="ck/Tooltip" title="${message:help}" value="${message:choiceNb-help}" effect="appear">
- <img src="${asset:context:img/help.png}" alt="${message:help}"/>
- </span>
- <br/>
- <span id="choiceNbDiv" style="${choiceNbDisplay}">
- <t:label for="maxChoiceNb" />
- <t:TextField t:id="maxChoiceNb" t:value="poll.maxChoiceNb" t:size="1" t:validate="min=0"/>
- </span>
- </div>
- </t:if>
- <t:if test="poll.creatorEmail">
- <div>
- <t:checkbox t:id="sendNotification" t:value="notificationCheckBox" onChange="$('notificationDiv').toggle()"/>
- <t:label for="sendNotification" />
- <span t:type="ck/Tooltip" title="${message:help}" value="${message:sendNotification-help}" effect="appear">
- <img src="${asset:context:img/help.png}" alt="${message:help}"/>
- </span>
- <br/>
- <span id="notificationDiv" style="${notificationDisplay}">
- <t:label for="notification" />
- <t:TextField t:id="notification" t:value="notificationPreventRule.sensibility" t:size="3" t:validate="min=0"/>
- ${message:notification-label2}
- </span>
- </div>
- </t:if>
- <t:unless test="freePoll">
- <div>
- <t:checkbox t:id="sendReminder" t:value="reminderCheckBox" onChange="$('reminderDiv').toggle()"/>
- <t:label for="sendReminder" />
- <span t:type="ck/Tooltip" title="${message:help}" value="${message:sendReminder-help}" effect="appear">
- <img src="${asset:context:img/help.png}" alt="${message:help}"/>
- </span>
- <br/>
- <span id="reminderDiv" style="${reminderDisplay}">
- <t:TextField t:id="reminder" t:value="reminderPreventRule.sensibility" t:size="1" t:validate="min=0"/>
- <t:label for="reminder" />
- </span>
- </div>
- </t:unless>
- </FieldSet>
- <div class="buttons">
- <t:eventLink t:event="previous" t:zone="pollCreationZone" style="text-decoration: none;">
- <input type="button" value="${message:prev-button}" />
- </t:eventLink>
- <t:submit t:value="${message:next-button}" t:zone="pollCreationZone" />
- </div>
- </div>
- </t:formfragment>
-
- <!-- Étape LISTS -->
- <t:formfragment visible="inLists">
- <div id="listsCreationFormDiv">
- <t:if test="personListsExists">
- <div>
- <t:label for="listSelect" />:
- <t:select t:id="listSelect" t:model="personLists" t:encoder="personLists" t:value="personList"
- t:mixins="ck/onEvent" t:event="change" t:onCompleteCallback="literal:onCompleteZoneUpdate"></t:select>
- <span t:type="ck/Tooltip" title="${message:help}" value="${message:listSelect-help}" effect="appear">
- <img src="${asset:context:img/help.png}" alt="${message:help}"/>
- </span>
- </div>
- </t:if>
- <t:errors/>
- <fieldset>
- <legend>${stepLegend}</legend>
- <div t:type="loop" t:source="votingLists" t:value="votingList" t:volatile="true" class="${currentListClass}">
- <div t:type="if" test="groupPoll" class="groupTitleDiv">
- <t:if test="severalGroups">
- <span class="cmd">
- <t:submit t:id="editGroup" t:value="${message:edit}" t:context="${votingListIndex}" t:defer="false" t:class="editGroupSubmit"/>
- <t:submit t:id="deleteGroup" t:value="${message:delete}" t:context="${votingListIndex}" t:defer="false" t:class="deleteGroupSubmit"/>
- </span>
- </t:if>
- ${message:group-label} ${votingListNumber} >>
- <t:label for="groupName" />
- <t:textfield t:id="groupName" t:value="votingList.name" validate="required" />
- -
- <t:label for="groupWeight" />
- <t:textfield t:id="groupWeight" t:value="votingList.weight" t:size="1" validate="required,min=1" />
- </div>
- <div t:type="loop" t:source="votingList.pollAccountDTOs" t:value="votingListPerson" t:volatile="true">
- <t:label for="personName" />
- <t:textfield t:id="personName" t:value="votingListPerson.votingId" />
- -
- <t:label for="personEmail" />
- <t:textfield t:id="personEmail" t:value="votingListPerson.email" validate="regexp" />
- -
- <t:label for="personWeight" />
- <t:textfield t:id="personWeight" t:value="votingListPerson.weight" t:size="1" validate="required,min=1" />
- </div>
- <t:submit t:id="addPerson" t:value="${message:addPerson}" t:context="${votingListIndex}" t:defer="false"/>
- </div>
- </fieldset>
- <div class="buttons">
- <t:eventLink t:event="previous" t:zone="pollCreationZone" style="text-decoration: none;">
- <input type="button" value="${message:prev-button}" />
- </t:eventLink>
- <t:if test="groupPoll">
- <t:submit t:id="addGroup" t:value="${message:addGroup}" />
- </t:if>
- <t:submit t:value="${message:next-button}" t:zone="pollCreationZone" />
- </div>
- </div>
- </t:formfragment>
-
- </t:form>
-
-
- <!-- Étape CHOICES - Formulaire différent car t:upload ne fonctionne pas en ajax -->
- <t:if test="inChoices">
- <t:FeedContextLink t:id="feedContext" />
- <t:form t:id="choicesCreationForm">
- <div id="choicesCreationFormDiv">
- <t:unless test="numberVoteCounting">
- <div>
- <t:label for="choiceType" />:
- <t:select t:id="choiceType" t:value="poll.choiceType" t:validate="required"
- t:mixins="ck/OnEvent" event="change" onCompleteCallback="onCompleteZoneUpdate">
- </t:select>
- </div>
- </t:unless>
- <t:errors/>
- <fieldset>
- <legend>${stepLegend}</legend>
- <t:formfragment t:id="textChoiceFragment" visible="isTextChoices()">
- <div t:type="loop" t:source="choices" t:value="choice" t:volatile="true">
- <div class="fleft choiceName">
- <t:label for="textName" />
- <t:textfield class="nameField" t:id="textName" t:value="choice.name" />
- -
- <t:label for="textDesc" />
- </div>
- <div class="fleft">
- <t:textarea cols="30" t:id="textDesc" t:value="choice.description" />
- </div>
- <div class="clr" />
- </div>
- </t:formfragment>
- <t:formfragment t:id="dateChoiceFragment" visible="isDateChoices()">
- <div t:type="loop" t:source="dateTypeChoices" t:value="dateTypeChoice" t:volatile="true">
- <div class="fleft choiceName">
- <t:label for="dateDTF" />
- <input t:type="ck/dateTimeField" t:id="dateDTF" value="dateTypeChoice.date" t:validate="regexp"
- t:datePattern="${message:DTF-pattern}" t:timePicker="true" t:timePickerAdjacent="true"/>
- -
- <t:label for="dateDesc" />
- </div>
- <div class="fleft">
- <t:textarea cols="35" t:id="dateDesc" t:value="dateTypeChoice.description" />
- </div>
- <div class="clr" />
- </div>
- </t:formfragment>
- <t:formfragment t:id="imgChoiceFragment" visible="isImgChoices()">
- <t:ImageContextLink t:id="imgContext" t:dir="poll.pollId" />
- <div t:type="loop" t:source="imgTypeChoices" t:value="imgTypeChoice" t:volatile="true">
- <div class="fleft choiceName">
- <t:label for="imgFile" />
- <input class="nameField" t:type="upload" t:id="imgFile" t:value="imgTypeChoice.img" t:validate="regexp" />
- -
- <t:label for="imgDesc" />
- </div>
- <div class="fleft">
- <t:textarea cols="30" t:id="imgDesc" t:value="imgTypeChoice.description" />
- </div>
- <div class="clr" />
- </div>
- </t:formfragment>
- </fieldset>
- <div class="buttons">
- <t:eventLink t:event="previous" t:zone="pollCreationZone" style="text-decoration: none;">
- <input type="button" value="${message:prev-button}" />
- </t:eventLink>
- <t:submit t:id="addChoice" t:value="${message:addChoice}" />
- <t:submit t:value="${message:submit}" />
- </div>
- </div>
- </t:form>
- </t:if>
-
-
- </t:zone>
-</t:border>
\ No newline at end of file
Modified: trunk/pollen-ui/src/main/webapp/poll/PollForm.tml
===================================================================
--- trunk/pollen-ui/src/main/webapp/poll/PollForm.tml 2010-05-14 15:12:25 UTC (rev 2999)
+++ trunk/pollen-ui/src/main/webapp/poll/PollForm.tml 2010-05-18 17:09:12 UTC (rev 3000)
@@ -212,23 +212,72 @@
<img src="${asset:context:img/help.png}" alt="message:help" />
</span>
</legend>
- <div t:type="zone" id="p-pollForm-lists-zone" t:id="listsZone" class="form-block">
+ <div t:type="zone" id="p-pollForm-lists-zone" t:id="listsZone" class="form-block" t:update="show">
<t:if t:test="canDisplayLists()">
- <t:subForm t:visible="flag">
+ <t:nuiton.feedback t:id="listsFeedback" /><br />
+ <t:subForm t:visible="formActivate">
<t:if t:test="poll.pollType.group">
<p>
<label t:type="label" t:for="listName" />:
- <input t:type="textfield" t:id="listName" value="listName"/>
- <input t:type="submit" t:id="addList" value="ADD"/>
+ <input t:type="textfield" t:id="listName" value="listName" />
+ <input t:type="submit" t:id="addList" value="ADD" />
+ <!--<a t:type="actionlink" t:id="addList" t:zone="p-pollForm-lists-zone">-->
+ <!--ADD-->
+ <!--</a>-->
</p>
- <p>
- <t:loop t:source="lists.values()" t:value="list" t:volatile="true">
- ${list.name}
+ <p class="center">
+ <t:loop t:source="lists.values()" t:value="list" t:encoder="listEncoder">
+ <input class="list-edition${styleSelected}" t:type="nuiton/submitContext" t:context="list.name" t:id="editList" value="${list.name}" />
+ <!--<span t:type="any" t:mixins="nuiton/confirm">-->
+ <!--<input t:type="nuiton/submitContext" t:id="removeList" t:image="context:img/delete.png" t:context="list.name" value="${message:delete}" />-->
+ <!--</span>-->
+ <t:if t:test="currentListSelected">
+ <input t:type="submit" t:id="saveList" t:image="context:img/save.png" t:zone="p-pollForm-lists-zone" />
+ <a t:type="actionlink" t:id="removeList" t:zone="p-pollForm-lists-zone">
+ <span t:type="any" t:mixins="nuiton/confirm">
+ <img src="${asset:context:img/delete.png}" alt="${message:delete}" />
+ </span>
+ </a>
+ </t:if>
</t:loop>
</p>
- <p:else>
- COOL
- </p:else>
+ </t:if>
+ <t:if t:test="listSelected">
+ <div class="t-data-grid">
+ <table class="t-data-grid">
+ <thead>
+ <tr>
+ <th>${message:pollen.ui.participant.name-label}</th>
+ <th>${message:pollen.ui.participant.email-label}</th>
+ <th>${message:pollen.ui.participant.weight-label}</th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr t:type="ajaxformloop" t:id="participants" source="selectedParticipants.values()" value="participant" t:encoder="participantEncoder">
+ <td>
+ <t:textfield t:id="participantName" value="participant.name" size="20" t:validate="required"/>
+ </td>
+ <td>
+ <t:textfield t:id="participantEmail" value="participant.email" size="25" t:validate="email"/>
+ </td>
+ <td>
+ <t:textfield t:id="participantWeight" value="participant.weight" size="1"/>
+ </td>
+ <td>
+ <t:removerowlink>
+ <img src="${asset:context:img/delete.png}" alt="${message:delete}"/>
+ </t:removerowlink>
+ </td>
+ <p:addRow>
+ <td colspan="4" class="center">
+ <t:addrowlink>${message:pollen.ui.participant.add}</t:addrowlink>
+ </td>
+ </p:addRow>
+ </tr>
+ </tbody>
+ </table>
+ </div>
</t:if>
</t:subForm>
</t:if>
1
0
r2999 - in trunk/pollen-ui/src/main: java/org/chorem/pollen/ui/components java/org/chorem/pollen/ui/pages/poll resources/org/chorem/pollen/ui/components webapp/poll
by fdesbois@users.chorem.org 14 May '10
by fdesbois@users.chorem.org 14 May '10
14 May '10
Author: fdesbois
Date: 2010-05-14 17:12:25 +0200 (Fri, 14 May 2010)
New Revision: 2999
Url: http://chorem.org/repositories/revision/pollen/2999
Log:
Create component subForm to refresh zone inside a form.
Added:
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/SubForm.java
trunk/pollen-ui/src/main/resources/org/chorem/pollen/ui/components/SubForm.tml
Modified:
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/PollForm.java
trunk/pollen-ui/src/main/webapp/poll/PollForm.tml
Added: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/SubForm.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/SubForm.java (rev 0)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/SubForm.java 2010-05-14 15:12:25 UTC (rev 2999)
@@ -0,0 +1,30 @@
+package org.chorem.pollen.ui.components;
+
+import org.apache.tapestry5.Block;
+import org.apache.tapestry5.annotations.Parameter;
+import org.apache.tapestry5.ioc.annotations.Inject;
+
+/**
+ * Created: 14 mai 2010
+ *
+ * @author fdesbois <fdesbois(a)codelutin.com>
+ * @version $Id$
+ */
+public class SubForm {
+
+ @Parameter
+ private boolean visible;
+
+ @Inject
+ private Block formBlock;
+
+ @Inject
+ private Block noFormBlock;
+
+ public Block getActiveBlock() {
+ if (visible) {
+ return noFormBlock;
+ }
+ return formBlock;
+ }
+}
Property changes on: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/SubForm.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/PollForm.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/PollForm.java 2010-05-14 14:23:00 UTC (rev 2998)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/PollForm.java 2010-05-14 15:12:25 UTC (rev 2999)
@@ -411,15 +411,16 @@
@Inject
private ComponentResources resources;
+ @Property
private boolean flag;
- @Inject
- private Block listsForm;
+// @Inject
+// private Block listsForm;
+//
+// @Inject
+// @Property
+// private Block listsFields;
- @Inject
- @Property
- private Block listsFields;
-
public Map<String, ParticipantList> getLists() {
if (lists == null) {
lists = new HashMap<String, ParticipantList>();
@@ -446,16 +447,16 @@
return listsZone.getBody();
}
- @Log
- public Block getListsBlock() throws PollenBusinessException {
- if (canDisplayLists()) {
- if (flag) {
- return listsFields;
- }
- return listsForm;
- }
- return null;
- }
+// @Log
+// public Block getListsBlock() throws PollenBusinessException {
+// if (canDisplayLists()) {
+// if (flag) {
+// return listsFields;
+// }
+// return listsForm;
+// }
+// return null;
+// }
@Log
void onSelectedFromAddList() {
Added: trunk/pollen-ui/src/main/resources/org/chorem/pollen/ui/components/SubForm.tml
===================================================================
--- trunk/pollen-ui/src/main/resources/org/chorem/pollen/ui/components/SubForm.tml (rev 0)
+++ trunk/pollen-ui/src/main/resources/org/chorem/pollen/ui/components/SubForm.tml 2010-05-14 15:12:25 UTC (rev 2999)
@@ -0,0 +1,14 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter">
+
+ <t:delegate t:to="activeBlock" />
+ <t:block t:id="formBlock">
+ <form t:type="form" action="tapestry">
+ <t:body />
+ </form>
+ </t:block>
+ <t:block t:id="noFormBlock">
+ <t:body />
+ </t:block>
+
+</html>
\ No newline at end of file
Property changes on: trunk/pollen-ui/src/main/resources/org/chorem/pollen/ui/components/SubForm.tml
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Modified: trunk/pollen-ui/src/main/webapp/poll/PollForm.tml
===================================================================
--- trunk/pollen-ui/src/main/webapp/poll/PollForm.tml 2010-05-14 14:23:00 UTC (rev 2998)
+++ trunk/pollen-ui/src/main/webapp/poll/PollForm.tml 2010-05-14 15:12:25 UTC (rev 2999)
@@ -213,29 +213,48 @@
</span>
</legend>
<div t:type="zone" id="p-pollForm-lists-zone" t:id="listsZone" class="form-block">
- <t:delegate t:to="listsBlock" />
- <t:block t:id="listsForm">
- <form t:type="form" action="tapestry">
- <t:delegate t:to="listsFields" />
- </form>
- </t:block>
- <t:block t:id="listsFields">
- <t:if t:test="poll.pollType.group">
- <p>
- <label t:type="label" t:for="listName" />:
- <input t:type="textfield" t:id="listName" value="listName"/>
- <input t:type="submit" t:id="addList" value="ADD"/>
- </p>
- <p>
- <t:loop t:source="lists.values()" t:value="list" t:volatile="true">
- ${list.name}
- </t:loop>
- </p>
- <p:else>
- COOL
- </p:else>
- </t:if>
- </t:block>
+ <t:if t:test="canDisplayLists()">
+ <t:subForm t:visible="flag">
+ <t:if t:test="poll.pollType.group">
+ <p>
+ <label t:type="label" t:for="listName" />:
+ <input t:type="textfield" t:id="listName" value="listName"/>
+ <input t:type="submit" t:id="addList" value="ADD"/>
+ </p>
+ <p>
+ <t:loop t:source="lists.values()" t:value="list" t:volatile="true">
+ ${list.name}
+ </t:loop>
+ </p>
+ <p:else>
+ COOL
+ </p:else>
+ </t:if>
+ </t:subForm>
+ </t:if>
+ <!--<t:delegate t:to="listsBlock" />-->
+ <!--<t:block t:id="listsForm">-->
+ <!--<form t:type="form" action="tapestry">-->
+ <!--<t:delegate t:to="listsFields" />-->
+ <!--</form>-->
+ <!--</t:block>-->
+ <!--<t:block t:id="listsFields">-->
+ <!--<t:if t:test="poll.pollType.group">-->
+ <!--<p>-->
+ <!--<label t:type="label" t:for="listName" />: -->
+ <!--<input t:type="textfield" t:id="listName" value="listName"/> -->
+ <!--<input t:type="submit" t:id="addList" value="ADD"/>-->
+ <!--</p>-->
+ <!--<p>-->
+ <!--<t:loop t:source="lists.values()" t:value="list" t:volatile="true">-->
+ <!--${list.name} -->
+ <!--</t:loop>-->
+ <!--</p>-->
+ <!--<p:else>-->
+ <!--COOL-->
+ <!--</p:else>-->
+ <!--</t:if>-->
+ <!--</t:block> -->
</div>
</fieldset>
</div>
1
0
Author: fdesbois
Date: 2010-05-14 16:23:00 +0200 (Fri, 14 May 2010)
New Revision: 2998
Url: http://chorem.org/repositories/revision/pollen/2998
Log:
Use last nuiton-utils snapshot, not 1.3 but 1.3.1 !! Evol on binder is not on good version on redmine.
Modified:
trunk/pom.xml
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2010-05-14 14:10:54 UTC (rev 2997)
+++ trunk/pom.xml 2010-05-14 14:23:00 UTC (rev 2998)
@@ -319,7 +319,7 @@
<i18n.version>1.2.2</i18n.version>
<tapestry.version>5.1.0.5</tapestry.version>
<nuiton-web.version>0.1-SNAPSHOT</nuiton-web.version>
- <nuiton-utils.version>1.3</nuiton-utils.version>
+ <nuiton-utils.version>1.3.1-SNAPSHOT</nuiton-utils.version>
<processor.version>1.0.2</processor.version>
<!--Multilanguage maven-site -->
1
0
Author: fdesbois
Date: 2010-05-14 16:10:54 +0200 (Fri, 14 May 2010)
New Revision: 2997
Url: http://chorem.org/repositories/revision/pollen/2997
Log:
Use last nuiton-utils release
Modified:
trunk/pom.xml
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2010-05-14 12:06:15 UTC (rev 2996)
+++ trunk/pom.xml 2010-05-14 14:10:54 UTC (rev 2997)
@@ -319,7 +319,7 @@
<i18n.version>1.2.2</i18n.version>
<tapestry.version>5.1.0.5</tapestry.version>
<nuiton-web.version>0.1-SNAPSHOT</nuiton-web.version>
- <nuiton-utils.version>1.3-SNAPSHOT</nuiton-utils.version>
+ <nuiton-utils.version>1.3</nuiton-utils.version>
<processor.version>1.0.2</processor.version>
<!--Multilanguage maven-site -->
1
0
r2996 - in trunk/pollen-business/src: main/java/org/chorem/pollen main/java/org/chorem/pollen/entity main/java/org/chorem/pollen/service main/resources/i18n main/xmi test/java/org/chorem/pollen test/java/org/chorem/pollen/service test/java/org/chorem/pollen/test
by fdesbois@users.chorem.org 14 May '10
by fdesbois@users.chorem.org 14 May '10
14 May '10
Author: fdesbois
Date: 2010-05-14 14:06:15 +0200 (Fri, 14 May 2010)
New Revision: 2996
Url: http://chorem.org/repositories/revision/pollen/2996
Log:
- Use rule in tests to execute start with methodName
- Add tests for createPoll : unit and integration tests
- Add some methods for instantiation
Added:
trunk/pollen-business/src/main/java/org/chorem/pollen/entity/ParticipantHelper.java
trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServicePollImplTest.java
trunk/pollen-business/src/test/java/org/chorem/pollen/test/
trunk/pollen-business/src/test/java/org/chorem/pollen/test/AbstractServiceTest.java
trunk/pollen-business/src/test/java/org/chorem/pollen/test/TestData.java
Removed:
trunk/pollen-business/src/test/java/org/chorem/pollen/business/
Modified:
trunk/pollen-business/src/main/java/org/chorem/pollen/PollenBusinessException.java
trunk/pollen-business/src/main/java/org/chorem/pollen/entity/FavoriteListImpl.java
trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollAccountImpl.java
trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollImpl.java
trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceFavoriteImpl.java
trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServicePollImpl.java
trunk/pollen-business/src/main/resources/i18n/pollen-business-en_GB.properties
trunk/pollen-business/src/main/resources/i18n/pollen-business-fr_FR.properties
trunk/pollen-business/src/main/xmi/pollen.properties
trunk/pollen-business/src/main/xmi/pollen.zargo
trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServiceFavoriteImplTest.java
trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServiceUserImplTest.java
Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/PollenBusinessException.java
===================================================================
--- trunk/pollen-business/src/main/java/org/chorem/pollen/PollenBusinessException.java 2010-05-12 21:11:26 UTC (rev 2995)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/PollenBusinessException.java 2010-05-14 12:06:15 UTC (rev 2996)
@@ -51,17 +51,19 @@
FAVORITE_LIST_NAME_EXIST(
n_("pollen.exception.favorite_list_name_exist")),
/**
- * Exception when favorite participant name ($2) and email ($3) are
+ * Exception when participant name ($2) and email ($3) are
* already defined for the current list ($1).
**/
- FAVORITE_PARTICIPANT_EXIST(
- n_("pollen.exception.favorite_participant_exist")),
+ PARTICIPANT_EXIST(n_("pollen.exception.participant_exist")),
+
/**
* Exception when favorite participant name ($2) with no email is
* already defined for the current list ($1).
**/
- FAVORITE_PARTICIPANT_EXIST_WITHOUT_EMAIL(
- n_("pollen.exception.favorite_participant_exist_without_email"));
+ PARTICIPANT_EXIST_WITHOUT_EMAIL(
+ n_("pollen.exception.participant_exist_without_email")),
+ /** Exception when poll already exist at creation **/
+ POLL_EXIST(n_("pollen.exception.poll_exist"));
private String message;
Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/entity/FavoriteListImpl.java
===================================================================
--- trunk/pollen-business/src/main/java/org/chorem/pollen/entity/FavoriteListImpl.java 2010-05-12 21:11:26 UTC (rev 2995)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/entity/FavoriteListImpl.java 2010-05-14 12:06:15 UTC (rev 2996)
@@ -1,5 +1,7 @@
package org.chorem.pollen.entity;
+import org.chorem.pollen.PollenBusinessException;
+
import java.util.ArrayList;
import java.util.Collection;
@@ -21,7 +23,18 @@
}
@Override
- public void addParticipant(Participant participant) {
+ public void addParticipant(Participant participant) throws PollenBusinessException {
+ String name = participant.getName();
+ String email = participant.getEmail();
+
+ ParticipantHelper.checkParticipantExist(this, name, email);
+
+ FavoriteParticipant favorite = new FavoriteParticipantImpl();
+ favorite.setName(participant.getName());
+ favorite.setEmail(participant.getEmail());
+ favorite.setWeight(participant.getWeight());
+ favorite.setFavoriteList(this);
+ addFavoriteParticipant(favorite);
}
@Override
Added: trunk/pollen-business/src/main/java/org/chorem/pollen/entity/ParticipantHelper.java
===================================================================
--- trunk/pollen-business/src/main/java/org/chorem/pollen/entity/ParticipantHelper.java (rev 0)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/entity/ParticipantHelper.java 2010-05-14 12:06:15 UTC (rev 2996)
@@ -0,0 +1,47 @@
+package org.chorem.pollen.entity;
+
+import org.chorem.pollen.PollenBusinessException;
+
+/**
+ * Helper classes for common Participant manipulations.
+ *
+ * @author fdesbois <fdesbois(a)codelutin.com>
+ * @version $Id$
+ * @see Participant
+ * @see ParticipantList
+ */
+public class ParticipantHelper {
+
+ /**
+ * Check the existence of participant from a {@code list}. The existence is
+ * tested on {@code name} and {@code email}. The {@code email} an be null.
+ *
+ * @param list ParticipantList which contains a list of Participant
+ * @param name Name of the participant to check
+ * @param email Email of the participant to check
+ * @throws PollenBusinessException if name and email correspond to an
+ * existing participant in the list.
+ */
+ public static void checkParticipantExist(
+ ParticipantList list, String name, String email)
+ throws PollenBusinessException {
+ for (Participant participant : list.getParticipants()) {
+ boolean emailNull = (email == null && participant.getEmail() == null);
+ boolean emailCheck = emailNull ||
+ (email != null && email.equals(participant.getEmail()));
+
+ if (name.equals(participant.getName()) && emailCheck) {
+ if (emailNull) {
+ throw new PollenBusinessException(
+ PollenBusinessException.PollenExceptionType.PARTICIPANT_EXIST_WITHOUT_EMAIL,
+ list.getName(), name);
+ } else {
+ throw new PollenBusinessException(
+ PollenBusinessException.PollenExceptionType.PARTICIPANT_EXIST,
+ list.getName(), name, email);
+ }
+ }
+ }
+ }
+
+}
Property changes on: trunk/pollen-business/src/main/java/org/chorem/pollen/entity/ParticipantHelper.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollAccountImpl.java
===================================================================
--- trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollAccountImpl.java 2010-05-12 21:11:26 UTC (rev 2995)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollAccountImpl.java 2010-05-14 12:06:15 UTC (rev 2996)
@@ -1,5 +1,8 @@
package org.chorem.pollen.entity;
+import org.chorem.pollen.PollenBinderHelper;
+import org.chorem.pollen.PollenBusinessException;
+
import java.util.ArrayList;
import java.util.Collection;
@@ -18,14 +21,30 @@
return null;
}
Collection<Participant> results = new ArrayList<Participant>();
- for (PollAccount account : getChild()) {
- results.add(account);
- }
+ if (getChild() != null) {
+ for (PollAccount account : getChild()) {
+ results.add(account);
+ }
+ }
return results;
}
@Override
- public void addParticipant(Participant participant) {
+ public void addParticipant(Participant participant) throws PollenBusinessException {
+ if (!list) {
+ throw new UnsupportedOperationException(
+ "Unable to add a participant from a child account");
+ }
+ String name = participant.getName();
+ String email = participant.getEmail();
+
+ ParticipantHelper.checkParticipantExist(this, name, email);
+
+ PollAccount account = new PollAccountImpl();
+ account.setName(name);
+ account.setEmail(email);
+ account.setWeight(participant.getWeight());
+ addChild(account);
}
@Override
Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollImpl.java
===================================================================
--- trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollImpl.java 2010-05-12 21:11:26 UTC (rev 2995)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollImpl.java 2010-05-14 12:06:15 UTC (rev 2996)
@@ -70,4 +70,14 @@
setVoteCounting(voteCountingType.ordinal());
}
+ @Override
+ public Choice addNewChoice(String name, String description) {
+ // check exist
+ Choice choice = new ChoiceImpl();
+ choice.setName(name);
+ choice.setDescription(description);
+ choice.setChoiceType(getChoiceType());
+ addChoice(choice);
+ return choice;
+ }
}
Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceFavoriteImpl.java
===================================================================
--- trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceFavoriteImpl.java 2010-05-12 21:11:26 UTC (rev 2995)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceFavoriteImpl.java 2010-05-14 12:06:15 UTC (rev 2996)
@@ -142,12 +142,12 @@
// The error type (message) depends on email nullity
if (participant.getEmail() == null) {
throw new PollenBusinessException(
- PollenExceptionType.FAVORITE_PARTICIPANT_EXIST_WITHOUT_EMAIL,
+ PollenExceptionType.PARTICIPANT_EXIST_WITHOUT_EMAIL,
list.getName(),
participant.getName());
} else {
throw new PollenBusinessException(
- PollenExceptionType.FAVORITE_PARTICIPANT_EXIST,
+ PollenExceptionType.PARTICIPANT_EXIST,
list.getName(),
participant.getName(),
participant.getEmail());
Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServicePollImpl.java
===================================================================
--- trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServicePollImpl.java 2010-05-12 21:11:26 UTC (rev 2995)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServicePollImpl.java 2010-05-14 12:06:15 UTC (rev 2996)
@@ -76,6 +76,9 @@
creator.setUserAccount(user);
}
poll.setCreator(creator);
+ // Generate Uid to have a unique poll. Will avoid multi-submit, existing
+ // poll will be check by its uid.
+ poll.setUid(context.createPollenUrlId());
return poll;
}
@@ -87,23 +90,37 @@
@Override
protected void executeCreatePoll(TopiaContext transaction,
List<Object> errorArgs, Poll poll, Collection<ParticipantList> lists)
- throws TopiaException, IllegalArgumentException {
+ throws TopiaException,
+ IllegalArgumentException,
+ PollenBusinessException {
errorArgs.add(poll.getTitle());
errorArgs.add(poll.getUid());
PollDAO dao = PollenDAOHelper.getPollDAO(transaction);
+ if (dao.existByNaturalId(poll.getUid())) {
+ throw new PollenBusinessException(
+ PollenBusinessException.PollenExceptionType.POLL_EXIST);
+ }
+
// Create newPoll and copy simple properties from poll source
Poll newPoll = createBasicPoll(transaction, poll);
- // Create accounts depends on pollType and lists argument
- List<PollAccount> accounts = createPollAccounts(transaction,
- newPoll.getPollType(), lists);
+ // Create accounts only for non free poll
+ if (!newPoll.getPollType().isFree()) {
+ // Create accounts depends on pollType and lists argument
+ List<PollAccount> accounts = createPollAccounts(transaction,
+ newPoll.getPollType(), lists);
+ newPoll.setPollAccount(accounts);
+ }
+
// Create newPoll choices
List<Choice> choices = createPollChoices(transaction, poll.getChoice());
+ newPoll.setChoice(choices);
+
dao.update(newPoll);
transaction.commitTransaction();
@@ -117,8 +134,10 @@
PollenDAOHelper.getPollAccountDAO(transaction);
// Create newPoll and copy simple properties from poll source
- Poll newPoll = dao.create(context.createPollenUrlId());
+ Poll newPoll = dao.create(source.getUid());
+ // Copy all properties instead of Uid (already set at creation),
+ // Closed (not used in this case) and Creator (managed separately)
PollenBinderHelper.getSimpleTopiaBinder(Poll.class).
copyExcluding(source, newPoll,
Poll.UID,
@@ -132,8 +151,9 @@
copy(source.getCreator(), creator,
PollAccount.NAME,
PollAccount.EMAIL,
- PollAccount.WEIGHT,
- PollAccount.ADMIN);
+// PollAccount.WEIGHT,
+ PollAccount.ADMIN,
+ PollAccount.USER_ACCOUNT);
accountDAO.update(creator);
newPoll.setCreator(creator);
@@ -178,7 +198,7 @@
createPersonAccounts(accountDAO, list);
accountList.setChild(accounts);
- // Add the accountList to the newPoll
+ // Add the accountList to the results
results.add(accountList);
}
}
@@ -306,4 +326,18 @@
throw new UnsupportedOperationException("Not supported yet.");
}
+ @Override
+ protected ParticipantList executeGetNewPollList() {
+ PollAccount list = new PollAccountImpl();
+ list.setList(true);
+ list.setChild(new ArrayList<PollAccount>());
+ return list;
+ }
+
+ @Override
+ protected Participant executeGetNewPollParticipant() {
+ PollAccount participant = new PollAccountImpl();
+ return participant;
+ }
+
}
Modified: trunk/pollen-business/src/main/resources/i18n/pollen-business-en_GB.properties
===================================================================
--- trunk/pollen-business/src/main/resources/i18n/pollen-business-en_GB.properties 2010-05-12 21:11:26 UTC (rev 2995)
+++ trunk/pollen-business/src/main/resources/i18n/pollen-business-en_GB.properties 2010-05-14 12:06:15 UTC (rev 2996)
@@ -33,6 +33,8 @@
pollen.error.servicePoll.getAllPolls=
pollen.error.servicePoll.getComments=
pollen.error.servicePoll.getNewPoll=
+pollen.error.servicePoll.getNewPollList=
+pollen.error.servicePoll.getNewPollParticipant=
pollen.error.servicePoll.getPoll=
pollen.error.servicePoll.getPollForResults=
pollen.error.servicePoll.getPollForUpdate=
@@ -79,6 +81,9 @@
pollen.exception.favorite_participant_exist=
pollen.exception.favorite_participant_exist_without_email=
pollen.exception.load_configuration=
+pollen.exception.participant_exist=
+pollen.exception.participant_exist_without_email=
+pollen.exception.poll_exist=
pollen.exception.poll_not_exist=No such poll exists. Please make sure that you are using the correct link and copy it completely into your browser's address field.
pollen.exception.smtp_not_available=
pollen.exception.user_email_exist=
Modified: trunk/pollen-business/src/main/resources/i18n/pollen-business-fr_FR.properties
===================================================================
--- trunk/pollen-business/src/main/resources/i18n/pollen-business-fr_FR.properties 2010-05-12 21:11:26 UTC (rev 2995)
+++ trunk/pollen-business/src/main/resources/i18n/pollen-business-fr_FR.properties 2010-05-14 12:06:15 UTC (rev 2996)
@@ -32,6 +32,8 @@
pollen.error.servicePoll.getAllPolls=
pollen.error.servicePoll.getComments=
pollen.error.servicePoll.getNewPoll=
+pollen.error.servicePoll.getNewPollList=
+pollen.error.servicePoll.getNewPollParticipant=
pollen.error.servicePoll.getPoll=
pollen.error.servicePoll.getPollForResults=
pollen.error.servicePoll.getPollForUpdate=
@@ -75,9 +77,10 @@
pollen.error.serviceVote.getVotesByPoll=
pollen.error.serviceVote.hasAlreadyVoted=
pollen.exception.favorite_list_name_exist=La liste %1$s existe d\u00E9j\u00E0 pour l'utilisateur %2$s
-pollen.exception.favorite_participant_exist=La liste %1$s contient d\u00E9j\u00E0 un utilisateur nomm\u00E9 %2$s avec un email %3$s
-pollen.exception.favorite_participant_exist_without_email=La liste %1$s contient d\u00E9j\u00E0 un utilisateur nomm\u00E9 %2$s avec aucun email
pollen.exception.load_configuration=La configuration n'a pas \u00E9t\u00E9 charg\u00E9e correctement \! Veuillez v\u00E9rifier le d\u00E9marrage de l'application.
+pollen.exception.participant_exist=La liste %1$s contient d\u00E9j\u00E0 un votant nomm\u00E9 %2$s avec un email %3$s
+pollen.exception.participant_exist_without_email=La liste %1$s contient d\u00E9j\u00E0 un votant nomm\u00E9 %2$s avec aucun email
+pollen.exception.poll_exist=
pollen.exception.poll_not_exist=Il n'y a pas de sondage \u00E0 cette adresse. Veuillez verifier que vous utilisez le lien correcte et copiez-le compl\u00E8tement dans le champ d'adresse de votre navigateur.
pollen.exception.smtp_not_available=Impossible d'envoyer un email \u00E0 %1$s. Serveur smtp indisponible pour l'envoi d'email, veuillez contacter un administrateur.
pollen.exception.user_email_exist=Un utilisateur est d\u00E9j\u00E0 enregistr\u00E9 avec cet email.
Modified: trunk/pollen-business/src/main/xmi/pollen.properties
===================================================================
--- trunk/pollen-business/src/main/xmi/pollen.properties 2010-05-12 21:11:26 UTC (rev 2995)
+++ trunk/pollen-business/src/main/xmi/pollen.properties 2010-05-14 12:06:15 UTC (rev 2996)
@@ -1,4 +1,4 @@
-# Pr\u00E9cise l'ent\u00EAte de l'ensemble des fichiers g\u00E9n\u00E9r\u00E9s
+# Pr\u00e9cise l'ent\u00eate de l'ensemble des fichiers g\u00e9n\u00e9r\u00e9s
model.tagvalue.copyright=/* *##%\n Copyright (C) 2009 Pollen\n *##%*/
#model.tagvalue.dbSchema=Pollen
model.tagvalue.java.lang.String=text
@@ -17,3 +17,6 @@
org.chorem.pollen.entity.FavoriteParticipant.attribute.name.tagvalue.naturalId=true
org.chorem.pollen.entity.FavoriteParticipant.attribute.email.tagvalue.naturalId=true
org.chorem.pollen.entity.FavoriteParticipant.attribute.email.tagvalue.notNull=false
+
+org.chorem.pollen.entity.Poll.attribute.uid.tagvalue.naturalId=true
+org.chorem.pollen.entity.Poll.attribute.creator.tagvalue.lazy=false
Modified: trunk/pollen-business/src/main/xmi/pollen.zargo
===================================================================
(Binary files differ)
Modified: trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServiceFavoriteImplTest.java
===================================================================
--- trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServiceFavoriteImplTest.java 2010-05-12 21:11:26 UTC (rev 2995)
+++ trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServiceFavoriteImplTest.java 2010-05-14 12:06:15 UTC (rev 2996)
@@ -6,7 +6,7 @@
import org.chorem.pollen.PollenBusinessException;
import org.chorem.pollen.PollenBusinessException.PollenExceptionType;
import org.chorem.pollen.PollenDAOHelper;
-import org.chorem.pollen.business.AbstractServiceTest;
+import org.chorem.pollen.test.AbstractServiceTest;
import org.chorem.pollen.entity.FavoriteList;
import org.chorem.pollen.entity.FavoriteParticipant;
import org.chorem.pollen.entity.FavoriteParticipantDAO;
@@ -27,9 +27,13 @@
private static final Log log = LogFactory.getLog(ServiceUserImplTest.class);
+ @Override
+ protected void init() throws Exception {
+ }
+
@Test
public void testCreateFavoriteParticipant() throws Exception {
- start("testCreateFavoriteParticipant");
+ //start("testCreateFavoriteParticipant");
UserAccount user = createUser(false);
@@ -56,7 +60,7 @@
try {
getServiceFavorite().createFavoriteParticipant(participant);
} catch (PollenBusinessException eee) {
- Assert.assertEquals(PollenExceptionType.FAVORITE_PARTICIPANT_EXIST,
+ Assert.assertEquals(PollenExceptionType.PARTICIPANT_EXIST,
eee.getType());
}
@@ -89,7 +93,7 @@
@Test
public void testUpdateFavoriteParticipant() throws Exception {
- start("testUpdateFavoriteParticipant");
+ //start("testUpdateFavoriteParticipant");
/** PREPARE DATA **/
UserAccount user = createUser(false);
@@ -105,5 +109,4 @@
getServiceFavorite().updateFavoriteParticipant(participant);
}
-
}
Added: trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServicePollImplTest.java
===================================================================
--- trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServicePollImplTest.java (rev 0)
+++ trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServicePollImplTest.java 2010-05-14 12:06:15 UTC (rev 2996)
@@ -0,0 +1,324 @@
+package org.chorem.pollen.service;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.chorem.pollen.PollenDAOHelper;
+import org.chorem.pollen.test.AbstractServiceTest;
+import org.chorem.pollen.common.ChoiceType;
+import org.chorem.pollen.common.PollType;
+import org.chorem.pollen.entity.FavoriteList;
+import org.chorem.pollen.entity.Participant;
+import org.chorem.pollen.entity.ParticipantList;
+import org.chorem.pollen.entity.Poll;
+import org.chorem.pollen.entity.PollAccount;
+import org.chorem.pollen.entity.PollAccountImpl;
+import org.chorem.pollen.entity.PollDAO;
+import org.chorem.pollen.entity.PollImpl;
+import org.chorem.pollen.entity.UserAccount;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.nuiton.topia.TopiaContext;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Created: 14 mai 2010
+ *
+ * @author fdesbois <fdesbois(a)codelutin.com>
+ * @version $Id$
+ */
+public class ServicePollImplTest extends AbstractServiceTest {
+
+ private static final Log log = LogFactory.getLog(ServicePollImplTest.class);
+
+ private UserAccount user;
+
+ private PollAccount creator;
+
+ private PollAccount list1;
+
+ private FavoriteList list2;
+
+ private Poll poll;
+
+ //@Before
+ public void init() throws Exception {
+ // Initialize service and default user
+ getServicePoll();
+ user = createUser(false);
+
+ // Poll creator
+ creator = new PollAccountImpl();
+ creator.setName(user.getDisplayName());
+ creator.setEmail(user.getEmail());
+ creator.setUserAccount(user);
+ creator.setAdmin(true);
+
+ // Poll
+ poll = new PollImpl();
+ poll.setCreator(creator);
+ poll.setTitle("Poll");
+ poll.setUid(context.createPollenUrlId());
+
+ // Participant Lists
+ // First list : new list specific for poll restriction
+ list1 = new PollAccountImpl();
+ list1.setName("List1");
+ list1.setList(true);
+
+ Participant participant1_1 = new PollAccountImpl();
+ participant1_1.setName("participant1_1");
+ participant1_1.setEmail("email1_1(a)domain.org");
+ list1.addParticipant(participant1_1);
+
+ Participant participant1_2 = new PollAccountImpl();
+ participant1_2.setName("participant1_2");
+ list1.addParticipant(participant1_2);
+
+ // Second list : existing list from user favorites
+ list2 = createFavoriteList("list2", user);
+ Participant participant2_1 = createFavoriteParticipant(
+ "participant2_1", "email2_1(a)domain.org", list2);
+ Participant participant2_2 = createFavoriteParticipant(
+ "participant2_2", "email2_2(a)domain.org", list2);
+ Participant participant2_3 = createFavoriteParticipant(
+ "participant2_3", null, list2);
+
+ list2 = findFavoriteList(list2.getId(), FavoriteList.FAVORITE_PARTICIPANT);
+ }
+
+ @Test
+ public void testInternalCreateBasicPoll() throws Exception {
+ //start("testInternalCreateBasicPoll");
+
+ /** PREPARE DATA **/
+ // done in init() method
+
+ /** EXEC METHOD **/
+
+ log.info("test 1 : create poll with creator from existing user");
+
+ TopiaContext transaction = beginTransaction();
+ Poll newPoll = null;
+ try {
+ newPoll = servicePoll.createBasicPoll(transaction, poll);
+ Assert.assertNotNull(newPoll);
+ Assert.assertNotNull(newPoll.getId());
+ Assert.assertNotNull(newPoll.getUid());
+ Assert.assertEquals("Poll", newPoll.getTitle());
+
+ PollAccount newCreatorAccount = newPoll.getCreator();
+ Assert.assertNotNull(newCreatorAccount);
+ Assert.assertNotNull(newCreatorAccount.getUid());
+ Assert.assertEquals(user, newCreatorAccount.getUserAccount());
+ Assert.assertTrue(newCreatorAccount.getAdmin());
+
+ // Will save the poll and its creator
+ transaction.commitTransaction();
+
+ } finally {
+ transaction.closeContext();
+ }
+
+ // Verification
+ transaction = beginTransaction();
+ try {
+ PollDAO dao = PollenDAOHelper.getPollDAO(transaction);
+
+ Poll pollFound = dao.findById(newPoll.getId());
+ Assert.assertNotNull(pollFound);
+ Assert.assertNotNull(pollFound.getCreator());
+ Assert.assertEquals(user, pollFound.getCreator().getUserAccount());
+
+ } finally {
+ transaction.closeContext();
+ }
+
+ log.info("test 2 : create poll with new creator");
+ poll.getCreator().setUserAccount(null);
+
+ transaction = beginTransaction();
+ newPoll = null;
+ try {
+ newPoll = servicePoll.createBasicPoll(transaction, poll);
+ PollAccount newCreatorAccount = newPoll.getCreator();
+ Assert.assertNull(newCreatorAccount.getUserAccount());
+ } finally {
+ transaction.closeContext();
+ }
+ }
+
+ @Test
+ public void testInternalCreatePollAccounts() throws Exception {
+ //start("testInternalCreatePollAccounts");
+
+ /** PREPARE DATA **/
+ // list initializations in init() method
+
+ Collection<ParticipantList> lists = new ArrayList<ParticipantList>();
+ // First list : new list specific for poll restriction
+ lists.add(list1);
+ // Second list : existing list from user favorites
+ lists.add(list2);
+
+ /** EXEC METHOD **/
+
+ log.info("test 1 : createPollAccounts from one new list : RESTRICTED");
+
+
+ TopiaContext transaction = beginTransaction();
+ try {
+ // Only the first list of the collection will be considered : list1
+ // Create only person accounts
+ List<PollAccount> accounts = servicePoll.createPollAccounts(
+ transaction, PollType.RESTRICTED, lists);
+
+ Assert.assertEquals(2, accounts.size());
+ for (PollAccount account : accounts) {
+ Assert.assertFalse(account.getList());
+ Assert.assertNotNull(account.getId());
+ Assert.assertNotNull(account.getUid());
+ // No link with user
+ Assert.assertNull(account.getUserAccount());
+ }
+
+ } finally {
+ transaction.closeContext();
+ }
+
+ log.info("test 2 : createPollAccounts from two lists : GROUP." +
+ " One of the list is an existing favorite one");
+
+ transaction = beginTransaction();
+ try {
+ // Create only list accounts
+ List<PollAccount> accounts = servicePoll.createPollAccounts(
+ transaction, PollType.GROUP, lists);
+
+ Assert.assertEquals(2, accounts.size());
+ for (PollAccount account : accounts) {
+ Assert.assertTrue(account.getList());
+ Assert.assertNotNull(account.getId());
+ Assert.assertNotNull(account.getUid());
+ Assert.assertNotNull(account.getName());
+ // No link with user
+ Assert.assertNull(account.getUserAccount());
+ // Check on list1
+ if (account.getName().equals(list1.getName())) {
+ Assert.assertEquals(2, account.getChild().size());
+ // Check on list2
+ } else if (account.getName().equals(list2.getName())) {
+ Assert.assertEquals(3, account.getChild().size());
+ // Child are person accounts
+ for (PollAccount person : account.getChild()) {
+ Assert.assertFalse(person.getList());
+ Assert.assertNotNull(person.getId());
+ Assert.assertNotNull(person.getUid());
+ // No link with user
+ Assert.assertNull(person.getUserAccount());
+ }
+ }
+ }
+
+ } finally {
+ transaction.closeContext();
+ }
+ }
+
+ @Test
+ public void integrationCreatePollFree() throws Exception {
+ /** PREPARE DATA **/
+ user = null;
+ poll = servicePoll.getNewPoll(user);
+ poll.getCreator().setName("homer");
+ poll.setPollType(PollType.FREE);
+ poll.setChoiceType(ChoiceType.TEXT);
+ poll.addNewChoice("choice1", null);
+ poll.addNewChoice("choice2", "desc2");
+ poll.addNewChoice("choice3", "desc3");
+
+ /** EXEC METHOD **/
+ servicePoll.createPoll(poll, null);
+
+ /** VERIFICATION RESULT **/
+ TopiaContext transaction = beginTransaction();
+ try {
+ // No accounts + type = FREE + 3 TEXT choices
+ PollDAO dao = PollenDAOHelper.getPollDAO(transaction);
+ Assert.assertTrue(dao.existByNaturalId(poll.getUid()));
+ Poll pollFound = dao.findByNaturalId(poll.getUid());
+
+ // Check pollType and accounts
+ Assert.assertEquals(PollType.FREE, pollFound.getPollType());
+ Assert.assertEquals(0, pollFound.getPollAccount().size());
+
+ // Check choices
+ Assert.assertEquals(ChoiceType.TEXT, pollFound.getChoiceType());
+ Assert.assertEquals(3, pollFound.getChoice().size());
+
+ // Check creator
+ Assert.assertNotNull(pollFound.getCreator());
+ Assert.assertNull(pollFound.getCreator().getUserAccount());
+ Assert.assertNotNull(pollFound.getCreator().getName());
+
+ } finally {
+ transaction.closeContext();
+ }
+ }
+
+ @Test
+ public void integrationCreatePollRestrictedFromNewList() throws Exception {
+ /** PREPARE DATA **/
+ poll = servicePoll.getNewPoll(user);
+ poll.setPollType(PollType.RESTRICTED);
+ poll.setChoiceType(ChoiceType.DATE);
+ poll.addNewChoice("date1", null);
+ poll.addNewChoice("date2", "desc2");
+ poll.addNewChoice("date3", "desc3");
+
+ Collection<ParticipantList> lists = new ArrayList<ParticipantList>();
+ ParticipantList list = servicePoll.getNewPollList();
+ lists.add(list);
+
+ Participant participant1 = servicePoll.getNewPollParticipant();
+ participant1.setName("participant1");
+ participant1.setEmail("email1");
+ participant1.setWeight(1.);
+ list.addParticipant(participant1);
+
+ Participant participant2 = servicePoll.getNewPollParticipant();
+ participant2.setName("participant2");
+ participant2.setEmail(null);
+ participant2.setWeight(1.);
+ list.addParticipant(participant2);
+
+ /** EXEC METHOD **/
+ servicePoll.createPoll(poll, lists);
+
+ /** VERIFICATION RESULT **/
+ TopiaContext transaction = beginTransaction();
+ try {
+ // Two person accounts + type = RESTRICTED + 3 DATE choices
+ PollDAO dao = PollenDAOHelper.getPollDAO(transaction);
+ Assert.assertTrue(dao.existByNaturalId(poll.getUid()));
+ Poll pollFound = dao.findByNaturalId(poll.getUid());
+
+ // Check pollType and accounts
+ Assert.assertEquals(PollType.RESTRICTED, pollFound.getPollType());
+ Assert.assertEquals(2, pollFound.getPollAccount().size());
+
+ // Check choices
+ Assert.assertEquals(ChoiceType.DATE, pollFound.getChoiceType());
+ Assert.assertEquals(3, pollFound.getChoice().size());
+
+ // Check creator
+ Assert.assertEquals(user, pollFound.getCreator().getUserAccount());
+
+ } finally {
+ transaction.closeContext();
+ }
+ }
+}
Property changes on: trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServicePollImplTest.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Modified: trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServiceUserImplTest.java
===================================================================
--- trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServiceUserImplTest.java 2010-05-12 21:11:26 UTC (rev 2995)
+++ trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServiceUserImplTest.java 2010-05-14 12:06:15 UTC (rev 2996)
@@ -7,18 +7,13 @@
import org.chorem.pollen.PollenBusinessException.PollenExceptionType;
import org.chorem.pollen.PollenDAOHelper;
import org.chorem.pollen.PollenException;
-import org.chorem.pollen.business.AbstractServiceTest;
-import org.chorem.pollen.business.TestData;
-import org.chorem.pollen.entity.FavoriteList;
-import org.chorem.pollen.entity.FavoriteParticipant;
-import org.chorem.pollen.entity.FavoriteParticipantDAO;
+import org.chorem.pollen.test.AbstractServiceTest;
import org.chorem.pollen.entity.UserAccount;
import org.chorem.pollen.entity.UserAccountDAO;
import org.chorem.pollen.entity.UserAccountImpl;
import org.junit.Assert;
import org.junit.Test;
import org.nuiton.topia.TopiaContext;
-import org.nuiton.topia.framework.TopiaQuery;
/**
*
@@ -27,10 +22,14 @@
public class ServiceUserImplTest extends AbstractServiceTest {
private static final Log log = LogFactory.getLog(ServiceUserImplTest.class);
+
+ @Override
+ protected void init() throws Exception {
+ }
@Test
public void testCopyUserAccount() throws Exception {
- start("testManageNewPassword");
+ //start("testManageNewPassword");
UserAccount user = getServiceUser().getNewUser();
user.setLogin("homer");
@@ -53,7 +52,7 @@
@Test
public void testCheckPassword() throws Exception {
- start("testCheckPassword");
+ //start("testCheckPassword");
UserAccount user = getServiceUser().getNewUser();
user.setLogin("homer");
@@ -87,7 +86,7 @@
*/
@Test
public void testExecuteConnect() throws Exception {
- start("testExecuteConnect");
+ //start("testExecuteConnect");
// The password is wouhou and login is homer
UserAccount user = createUser(false);
@@ -121,7 +120,7 @@
*/
@Test
public void testExecuteGetNewUser() throws Exception {
- start("testGetNewUser");
+ //start("testGetNewUser");
UserAccount user = getServiceUser().getNewUser();
Assert.assertNotNull(user);
@@ -133,7 +132,7 @@
*/
@Test
public void testExecuteCreateUser() throws Exception {
- start("testCreateUser");
+ //start("testCreateUser");
UserAccount user = getServiceUser().getNewUser();
user.setLogin("hsimpson");
@@ -190,7 +189,7 @@
*/
@Test
public void testExecuteUpdateUser() throws Exception {
- start("testUpdateUser");
+ //start("testUpdateUser");
UserAccount user1 = getServiceUser().getNewUser();
user1.setLogin("hsimpson");
@@ -242,7 +241,7 @@
*/
@Test
public void testExecuteDeleteUser() throws Exception {
- start("testUpdateUser");
+ //start("testUpdateUser");
try {
getServiceUser().deleteUser("test");
Copied: trunk/pollen-business/src/test/java/org/chorem/pollen/test/AbstractServiceTest.java (from rev 2992, trunk/pollen-business/src/test/java/org/chorem/pollen/business/AbstractServiceTest.java)
===================================================================
--- trunk/pollen-business/src/test/java/org/chorem/pollen/test/AbstractServiceTest.java (rev 0)
+++ trunk/pollen-business/src/test/java/org/chorem/pollen/test/AbstractServiceTest.java 2010-05-14 12:06:15 UTC (rev 2996)
@@ -0,0 +1,246 @@
+package org.chorem.pollen.test;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.Properties;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.chorem.pollen.PollenBusinessException;
+import org.chorem.pollen.PollenContext;
+import org.chorem.pollen.PollenContextImpl;
+import org.chorem.pollen.PollenDAOHelper;
+import org.chorem.pollen.entity.FavoriteList;
+import org.chorem.pollen.entity.FavoriteListDAO;
+import org.chorem.pollen.entity.FavoriteParticipant;
+import org.chorem.pollen.entity.FavoriteParticipantDAO;
+import org.chorem.pollen.entity.UserAccount;
+import org.chorem.pollen.entity.UserAccountDAO;
+import org.chorem.pollen.service.ServiceFavoriteImpl;
+import org.chorem.pollen.service.ServicePollImpl;
+import org.chorem.pollen.service.ServiceUserImpl;
+import org.junit.After;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.rules.TestName;
+import org.junit.runners.model.FrameworkMethod;
+import org.nuiton.topia.TopiaContext;
+import org.nuiton.topia.TopiaException;
+import org.nuiton.topia.framework.TopiaQuery;
+import org.nuiton.topia.persistence.TopiaEntity;
+import org.nuiton.util.ApplicationConfig;
+
+/**
+ * TestManager
+ *
+ * Created: 24 févr. 2010
+ *
+ * @author fdesbois
+ * @version $Revision$
+ *
+ * Mise a jour: $Date$
+ * par : $Author$
+ */
+@Ignore
+public abstract class AbstractServiceTest {
+
+ private static final Log log = LogFactory.getLog(AbstractServiceTest.class);
+
+ protected PollenContext context;
+
+ protected ServiceUserImpl serviceUser;
+
+ protected ServiceFavoriteImpl serviceFavorite;
+
+ protected ServicePollImpl servicePoll;
+
+ @Rule
+ public TestName rule = new TestName() {
+
+ @Override
+ public void starting(FrameworkMethod method) {
+ super.starting(method);
+ try {
+ getTest().start(getMethodName());
+ getTest().init();
+ } catch (Exception eee) {
+ log.error(eee.getClass().getSimpleName(), eee);
+ }
+ }
+
+ public AbstractServiceTest getTest() {
+ return AbstractServiceTest.this;
+ }
+ };
+
+ protected abstract void init() throws Exception;
+
+ public void start(String dbname) throws IOException {
+ log.info("## START ## : " + dbname);
+
+ InputStream input = AbstractServiceTest.class.
+ getResourceAsStream("/PollenTest.properties");
+
+ Properties options = new Properties();
+ options.load(input);
+
+ ApplicationConfig config = new ApplicationConfig();
+ config.setOptions(options);
+ config.setOption(
+ "hibernate.connection.url",
+ "jdbc:h2:file:target/surefire-data/" + dbname
+ );
+
+ getContext().loadConfiguration(config);
+ getContext().start(getServiceUser());
+
+ // Set currentDate to 23/02/2010 for tests
+ Calendar calendar = new GregorianCalendar(2010, 1, 23, 0, 0, 0);
+ ((PollenContextImpl)getContext()).setCurrentDate(calendar.getTime());
+ }
+
+ @After
+ public void stop() throws IOException {
+ getContext().stop();
+ context = null;
+ serviceUser = null;
+ servicePoll = null;
+ serviceFavorite = null;
+ }
+
+ public PollenContext getContext() {
+ if (context == null) {
+ context = new PollenContextImpl();
+ }
+ return context;
+ }
+
+ public ServiceUserImpl getServiceUser() {
+ if (serviceUser == null) {
+ serviceUser = new ServiceUserImpl();
+ serviceUser.setContext(getContext());
+ }
+ return serviceUser;
+ }
+
+ public ServiceFavoriteImpl getServiceFavorite() {
+ if (serviceFavorite == null) {
+ serviceFavorite = new ServiceFavoriteImpl();
+ serviceFavorite.setContext(getContext());
+ }
+ return serviceFavorite;
+ }
+
+ public ServicePollImpl getServicePoll() {
+ if (servicePoll == null) {
+ servicePoll = new ServicePollImpl();
+ servicePoll.setContext(getContext());
+ }
+ return servicePoll;
+ }
+
+ public TopiaContext beginTransaction() throws TopiaException {
+ return getContext().beginTransaction();
+ }
+
+// public ServiceEmailImpl getServiceEmail() {
+// ServiceEmailImpl instance = new ServiceEmailImpl();
+// instance.setContext(getContext());
+// return instance;
+// }
+//
+// public ServicePollImpl getServicePoll() {
+// ServicePollImpl instance = new ServicePollImpl();
+// instance.setContext(getContext());
+// return instance;
+// }
+
+ /**
+ * Create a user :<br />
+ * <ul>
+ * <li>login : homer</li>
+ * <li>email : homer(a)simpson.us</li>
+ * <li>password : wouhou</li>
+ * </ul>
+ * You can decide if this user is an admin using {@code admin} argument.
+ *
+ * @param admin flag to create the user as an admin
+ * @return the new UserAccount created
+ * @throws TopiaException
+ * @throws PollenBusinessException
+ */
+ public UserAccount createUser(boolean admin)
+ throws TopiaException, PollenBusinessException {
+
+ UserAccount user = getServiceUser().getNewUser();
+ user.setLogin("homer");
+ user.setEmail("homer(a)simpson.us");
+ user.setNewPassword("wouhou");
+ user.setAdmin(admin);
+
+ getServiceUser().createUser(user);
+
+ TopiaContext transaction = getContext().beginTransaction();
+ try {
+ UserAccountDAO dao =
+ PollenDAOHelper.getUserAccountDAO(transaction);
+
+ UserAccount findUser = dao.findByLogin(user.getLogin());
+ return findUser;
+ } finally {
+ transaction.closeContext();
+ }
+ }
+
+ public FavoriteList createFavoriteList(String name, UserAccount user)
+ throws TopiaException {
+
+ TopiaContext transaction = beginTransaction();
+ try {
+ FavoriteListDAO dao =
+ PollenDAOHelper.getFavoriteListDAO(transaction);
+
+ FavoriteList list = dao.create(name, user);
+ transaction.commitTransaction();
+ return list;
+ } finally {
+ transaction.closeContext();
+ }
+ }
+
+ public FavoriteParticipant createFavoriteParticipant(String name,
+ String email, FavoriteList list) throws TopiaException {
+ TopiaContext transaction = beginTransaction();
+ try {
+ FavoriteParticipantDAO dao =
+ PollenDAOHelper.getFavoriteParticipantDAO(transaction);
+
+ FavoriteParticipant participant = dao.create(name, email, list);
+ transaction.commitTransaction();
+ return participant;
+ } finally {
+ transaction.closeContext();
+ }
+ }
+
+ public FavoriteList findFavoriteList(String id, String... propertiesLoad)
+ throws TopiaException {
+ TopiaContext transaction = beginTransaction();
+ try {
+ FavoriteListDAO dao =
+ PollenDAOHelper.getFavoriteListDAO(transaction);
+
+ TopiaQuery query = dao.createQuery().
+ add(TopiaEntity.ID, id).
+ addLoad(propertiesLoad);
+
+ FavoriteList result = dao.findByQuery(query);
+
+ return result;
+ } finally {
+ transaction.closeContext();
+ }
+ }
+
+}
Property changes on: trunk/pollen-business/src/test/java/org/chorem/pollen/test/AbstractServiceTest.java
___________________________________________________________________
Added: svn:keywords
+ "Author Date Id Revision HeadURL"
Added: svn:mergeinfo
+
Copied: trunk/pollen-business/src/test/java/org/chorem/pollen/test/TestData.java (from rev 2992, trunk/pollen-business/src/test/java/org/chorem/pollen/business/TestData.java)
===================================================================
--- trunk/pollen-business/src/test/java/org/chorem/pollen/test/TestData.java (rev 0)
+++ trunk/pollen-business/src/test/java/org/chorem/pollen/test/TestData.java 2010-05-14 12:06:15 UTC (rev 2996)
@@ -0,0 +1,40 @@
+package org.chorem.pollen.test;
+
+import org.nuiton.topia.TopiaContext;
+
+/**
+ * TestData
+ *
+ * Created: 24 févr. 2010
+ *
+ * @author fdesbois
+ * @version $Revision$
+ *
+ * Mise a jour: $Date$
+ * par : $Author$
+ */
+public abstract class TestData {
+
+ protected TopiaContext transaction;
+
+ public void execute() throws Exception {
+ transaction = null;
+ try {
+ //transaction = beginTransaction();
+
+ test();
+
+ } catch (Exception eee) {
+ if (transaction != null) {
+ transaction.rollbackTransaction();
+ }
+ throw eee;
+ } finally {
+ if (transaction != null) {
+ transaction.closeContext();
+ }
+ }
+ }
+
+ protected abstract void test() throws Exception;
+}
Property changes on: trunk/pollen-business/src/test/java/org/chorem/pollen/test/TestData.java
___________________________________________________________________
Added: svn:keywords
+ "Author Date Id Revision HeadURL"
1
0
r2995 - in trunk: . pollen-business/src/main/java/org/chorem/pollen/entity pollen-business/src/main/java/org/chorem/pollen/service pollen-business/src/main/xmi
by fdesbois@users.chorem.org 12 May '10
by fdesbois@users.chorem.org 12 May '10
12 May '10
Author: fdesbois
Date: 2010-05-12 23:11:26 +0200 (Wed, 12 May 2010)
New Revision: 2995
Url: http://chorem.org/repositories/revision/pollen/2995
Log:
- Implementation of createPoll method
- Use of nuiton-utils 1.3 snapshot
Added:
trunk/pollen-business/src/main/java/org/chorem/pollen/entity/FavoriteListImpl.java
trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollAccountImpl.java
Removed:
trunk/pollen-business/src/main/java/org/chorem/pollen/entity/FavoriteParticipantImpl.java
Modified:
trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServicePollImpl.java
trunk/pollen-business/src/main/xmi/pollen.zargo
trunk/pom.xml
Added: trunk/pollen-business/src/main/java/org/chorem/pollen/entity/FavoriteListImpl.java
===================================================================
--- trunk/pollen-business/src/main/java/org/chorem/pollen/entity/FavoriteListImpl.java (rev 0)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/entity/FavoriteListImpl.java 2010-05-12 21:11:26 UTC (rev 2995)
@@ -0,0 +1,30 @@
+package org.chorem.pollen.entity;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * Created: 12 mai 2010
+ *
+ * @author fdesbois <fdesbois(a)codelutin.com>
+ * @version $Id$
+ */
+public class FavoriteListImpl extends FavoriteListAbstract {
+
+ @Override
+ public Collection<Participant> getParticipants() {
+ Collection<Participant> results = new ArrayList<Participant>();
+ for (FavoriteParticipant account : getFavoriteParticipant()) {
+ results.add(account);
+ }
+ return results;
+ }
+
+ @Override
+ public void addParticipant(Participant participant) {
+ }
+
+ @Override
+ public void removeParticipant(Participant participant) {
+ }
+}
Property changes on: trunk/pollen-business/src/main/java/org/chorem/pollen/entity/FavoriteListImpl.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Deleted: trunk/pollen-business/src/main/java/org/chorem/pollen/entity/FavoriteParticipantImpl.java
===================================================================
--- trunk/pollen-business/src/main/java/org/chorem/pollen/entity/FavoriteParticipantImpl.java 2010-05-12 17:42:29 UTC (rev 2994)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/entity/FavoriteParticipantImpl.java 2010-05-12 21:11:26 UTC (rev 2995)
@@ -1,24 +0,0 @@
-
-package org.chorem.pollen.entity;
-
-/**
- * FavoriteParticipantImpl
- *
- * Created: 28 avr. 2010
- *
- * @author fdesbois
- * @version $Revision$
- *
- * Mise a jour: $Date$
- * par : $Author$
- */
-public class FavoriteParticipantImpl extends FavoriteParticipantAbstract {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- public String getId() {
- return getTopiaId();
- }
-
-}
Added: trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollAccountImpl.java
===================================================================
--- trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollAccountImpl.java (rev 0)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollAccountImpl.java 2010-05-12 21:11:26 UTC (rev 2995)
@@ -0,0 +1,34 @@
+package org.chorem.pollen.entity;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * Created: 12 mai 2010
+ *
+ * @author fdesbois <fdesbois(a)codelutin.com>
+ * @version $Id$
+ */
+public class PollAccountImpl extends PollAccountAbstract {
+
+ @Override
+ public Collection<Participant> getParticipants() {
+ // for a simple account, will return null
+ if (!list) {
+ return null;
+ }
+ Collection<Participant> results = new ArrayList<Participant>();
+ for (PollAccount account : getChild()) {
+ results.add(account);
+ }
+ return results;
+ }
+
+ @Override
+ public void addParticipant(Participant participant) {
+ }
+
+ @Override
+ public void removeParticipant(Participant participant) {
+ }
+}
Property changes on: trunk/pollen-business/src/main/java/org/chorem/pollen/entity/PollAccountImpl.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServicePollImpl.java
===================================================================
--- trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServicePollImpl.java 2010-05-12 17:42:29 UTC (rev 2994)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServicePollImpl.java 2010-05-12 21:11:26 UTC (rev 2995)
@@ -1,20 +1,32 @@
package org.chorem.pollen.service;
+import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.chorem.pollen.PollenBinderHelper;
import org.chorem.pollen.PollenBusinessException;
import org.chorem.pollen.PollenContext;
import org.chorem.pollen.PollenDAOHelper;
import org.chorem.pollen.PollenException;
+import org.chorem.pollen.common.PollType;
import org.chorem.pollen.entity.Choice;
+import org.chorem.pollen.entity.ChoiceDAO;
import org.chorem.pollen.entity.Comment;
+import org.chorem.pollen.entity.Participant;
+import org.chorem.pollen.entity.ParticipantList;
import org.chorem.pollen.entity.Poll;
import org.chorem.pollen.entity.PollAccount;
+import org.chorem.pollen.entity.PollAccountDAO;
import org.chorem.pollen.entity.PollAccountImpl;
+import org.chorem.pollen.entity.PollDAO;
import org.chorem.pollen.entity.PollImpl;
import org.chorem.pollen.entity.UserAccount;
import org.nuiton.topia.TopiaContext;
import org.nuiton.topia.TopiaException;
+import org.nuiton.topia.persistence.util.TopiaEntityBinder;
/**
* ServicePoll
@@ -74,19 +86,140 @@
@Override
protected void executeCreatePoll(TopiaContext transaction,
- List<Object> errorArgs, Poll poll) throws TopiaException {
+ List<Object> errorArgs, Poll poll, Collection<ParticipantList> lists)
+ throws TopiaException, IllegalArgumentException {
errorArgs.add(poll.getTitle());
errorArgs.add(poll.getUid());
- PollenDAOHelper.getPollDAO(transaction).create(poll);
+ PollDAO dao = PollenDAOHelper.getPollDAO(transaction);
- // need to create uid for both poll and creator
- // need to create creator (name, email, user, admin)
+ // Create newPoll and copy simple properties from poll source
+ Poll newPoll = createBasicPoll(transaction, poll);
+ // Create accounts depends on pollType and lists argument
+ List<PollAccount> accounts = createPollAccounts(transaction,
+ newPoll.getPollType(), lists);
+
+ // Create newPoll choices
+ List<Choice> choices = createPollChoices(transaction, poll.getChoice());
+
+ dao.update(newPoll);
+
transaction.commitTransaction();
}
+ protected Poll createBasicPoll(TopiaContext transaction, Poll source)
+ throws TopiaException {
+ PollDAO dao = PollenDAOHelper.getPollDAO(transaction);
+
+ PollAccountDAO accountDAO =
+ PollenDAOHelper.getPollAccountDAO(transaction);
+
+ // Create newPoll and copy simple properties from poll source
+ Poll newPoll = dao.create(context.createPollenUrlId());
+
+ PollenBinderHelper.getSimpleTopiaBinder(Poll.class).
+ copyExcluding(source, newPoll,
+ Poll.UID,
+ Poll.CLOSED,
+ Poll.CREATOR);
+
+ // Create creator and set him to the poll
+ PollAccount creator = accountDAO.create(context.createPollenUrlId());
+
+ PollenBinderHelper.getSimpleTopiaBinder(PollAccount.class).
+ copy(source.getCreator(), creator,
+ PollAccount.NAME,
+ PollAccount.EMAIL,
+ PollAccount.WEIGHT,
+ PollAccount.ADMIN);
+ accountDAO.update(creator);
+
+ newPoll.setCreator(creator);
+ return newPoll;
+ }
+
+ protected List<PollAccount> createPollAccounts(TopiaContext transaction,
+ PollType type,
+ Collection<ParticipantList> lists)
+ throws TopiaException, IllegalArgumentException {
+
+ List<PollAccount> results = new ArrayList<PollAccount>();
+
+ PollAccountDAO accountDAO =
+ PollenDAOHelper.getPollAccountDAO(transaction);
+
+ switch (type) {
+ case RESTRICTED:
+ if (CollectionUtils.isEmpty(lists)) {
+ throw new IllegalArgumentException("lists can't be empty" +
+ " for restricted poll");
+ }
+ // Create accounts only on first participant list
+ results = createPersonAccounts(accountDAO,
+ lists.iterator().next());
+ break;
+ case GROUP:
+ if (CollectionUtils.isEmpty(lists)) {
+ throw new IllegalArgumentException("lists can't be empty" +
+ " for group poll");
+ }
+
+ for (ParticipantList list : lists) {
+ // Create the accountList
+ PollAccount accountList = accountDAO.create(
+ context.createPollenUrlId());
+ accountList.setList(true);
+ accountList.setName(list.getName());
+
+ // Create account children
+ List<PollAccount> accounts =
+ createPersonAccounts(accountDAO, list);
+ accountList.setChild(accounts);
+
+ // Add the accountList to the newPoll
+ results.add(accountList);
+ }
+ }
+ return results;
+ }
+
+ protected List<PollAccount> createPersonAccounts(PollAccountDAO dao,
+ ParticipantList list)
+ throws TopiaException {
+
+ List<PollAccount> results = new ArrayList<PollAccount>();
+
+ for (Participant participant : list.getParticipants()) {
+ String accountUid = context.createPollenUrlId();
+ PollAccount account = dao.create(accountUid);
+ account.setName(participant.getName());
+ account.setEmail(participant.getEmail());
+ account.setWeight(participant.getWeight());
+ dao.update(account);
+ results.add(account);
+ }
+ return results;
+ }
+
+ protected List<Choice> createPollChoices(TopiaContext transaction,
+ List<Choice> source)
+ throws TopiaException {
+
+ ChoiceDAO dao = PollenDAOHelper.getChoiceDAO(transaction);
+
+ List<Choice> results = new ArrayList<Choice>();
+
+ for (Choice choice : source) {
+ Choice newChoice = dao.create();
+ PollenBinderHelper.getSimpleTopiaBinder(Choice.class).
+ copy(choice, newChoice);
+ results.add(newChoice);
+ }
+ return results;
+ }
+
@Override
protected void executeUpdatePoll(TopiaContext transaction,
Poll poll) throws TopiaException {
Modified: trunk/pollen-business/src/main/xmi/pollen.zargo
===================================================================
(Binary files differ)
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2010-05-12 17:42:29 UTC (rev 2994)
+++ trunk/pom.xml 2010-05-12 21:11:26 UTC (rev 2995)
@@ -319,7 +319,7 @@
<i18n.version>1.2.2</i18n.version>
<tapestry.version>5.1.0.5</tapestry.version>
<nuiton-web.version>0.1-SNAPSHOT</nuiton-web.version>
- <nuiton-utils.version>1.2.2</nuiton-utils.version>
+ <nuiton-utils.version>1.3-SNAPSHOT</nuiton-utils.version>
<processor.version>1.0.2</processor.version>
<!--Multilanguage maven-site -->
1
0
r2994 - in trunk/pollen-ui/src/main: java/org/chorem/pollen/ui/pages/poll resources/org/chorem/pollen/ui/components resources/org/chorem/pollen/ui/pages/poll webapp/js webapp/poll
by fdesbois@users.chorem.org 12 May '10
by fdesbois@users.chorem.org 12 May '10
12 May '10
Author: fdesbois
Date: 2010-05-12 19:42:29 +0200 (Wed, 12 May 2010)
New Revision: 2994
Url: http://chorem.org/repositories/revision/pollen/2994
Log:
Some test for refresh zone inside a form, needed for list managment
Removed:
trunk/pollen-ui/src/main/webapp/js/jquery.test.js
Modified:
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/PollForm.java
trunk/pollen-ui/src/main/resources/org/chorem/pollen/ui/components/UserListsUpdate.tml
trunk/pollen-ui/src/main/resources/org/chorem/pollen/ui/pages/poll/PollForm_fr.properties
trunk/pollen-ui/src/main/webapp/js/pollForm.js
trunk/pollen-ui/src/main/webapp/poll/PollForm.tml
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/PollForm.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/PollForm.java 2010-05-11 15:34:24 UTC (rev 2993)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/PollForm.java 2010-05-12 17:42:29 UTC (rev 2994)
@@ -1,13 +1,8 @@
-
package org.chorem.pollen.ui.pages.poll;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.tapestry5.Block;
+import org.apache.tapestry5.ComponentResources;
import org.apache.tapestry5.RenderSupport;
import org.apache.tapestry5.annotations.Environmental;
import org.apache.tapestry5.annotations.IncludeJavaScriptLibrary;
@@ -17,14 +12,16 @@
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.corelib.components.Form;
-import org.apache.tapestry5.corelib.components.FormFragment;
+import org.apache.tapestry5.corelib.components.Zone;
import org.apache.tapestry5.ioc.Messages;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.chorem.pollen.PollenBusinessException;
import org.chorem.pollen.common.PollType;
import org.chorem.pollen.common.VoteCountingType;
-import org.chorem.pollen.entity.Choice;
+import org.chorem.pollen.entity.Participant;
+import org.chorem.pollen.entity.ParticipantList;
import org.chorem.pollen.entity.Poll;
+import org.chorem.pollen.entity.PollAccountImpl;
import org.chorem.pollen.entity.PreventRule;
import org.chorem.pollen.entity.PreventRuleImpl;
import org.chorem.pollen.mail.PreventRuleManager;
@@ -32,18 +29,24 @@
import org.chorem.pollen.ui.base.AbstractPollenPage;
import org.chorem.pollen.ui.components.Border;
import org.chorem.pollen.ui.data.AddressBar;
-import org.chorem.pollen.ui.data.ChoiceField;
import org.slf4j.Logger;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
/**
* PollForm : Creation and Modification.
- *
+ * <p/>
* For modification, the poll is getting from using pollUID set in url
* (activate/passivate context).
- *
+ * <p/>
* This page is mostly dynamic, so all fields in the form used zoneUpdate mixin
- * to refresh the form zone if necessary (for selects or some checkbox options).
- *
+ * to refresh the form zone if necessary (for selects or some checkbox
+ * options).
+ * <p/>
* This page is composed of three parts :
* <pre>
* - Main informations : title, creator, begin and end dates, types, ...
@@ -51,22 +54,25 @@
* - Choices of the poll (depends on type : DATE, IMAGE, TEXT).
* - Lists/Groups for pollType different from FREE.
* </pre>
- *
+ * <p/>
* Created: 2 mars 2010
*
* @author fdesbois
* @version $Revision$
- *
- * Mise a jour: $Date$
- * par : $Author$
+ * <p/>
+ * Mise a jour: $Date$
+ * par : $Author$
*/
@IncludeStylesheet("context:css/poll.css")
-@IncludeJavaScriptLibrary({"context:js/pollForm.js", "context:js/jquery-1.4.2.min.js", "jquery.test.js"})
+@IncludeJavaScriptLibrary({"context:js/pollForm.js", "context:js/jquery-1.4.2.min.js"})
public class PollForm extends AbstractPollenPage {
@InjectComponent
private Border border;
+ @InjectComponent
+ private Zone mainZone;
+
@Override
public Border getBorder() {
return border;
@@ -74,7 +80,7 @@
@Inject
private Logger log;
-
+
@Inject
private Messages messages;
@@ -101,8 +107,8 @@
}
/**
- * Get the main poll used in the form. The existing poll is loaded if
- * the pollUID exist.
+ * Get the main poll used in the form. The existing poll is loaded if the
+ * pollUID exist.
*
* @return poll existing or a new one
* @throws PollenBusinessException
@@ -139,7 +145,7 @@
* Page title for border component.
*
* @return the page title depends on create or update mode.
- * @throws PollenBusinessException
+ * @throws PollenBusinessException
*/
public String getPageTitle() throws PollenBusinessException {
String title = "";
@@ -155,7 +161,7 @@
* AddressBar for border component.
*
* @return the address bar.
- * @throws PollenBusinessException
+ * @throws PollenBusinessException
*/
public AddressBar getAddressBar() throws PollenBusinessException {
return AddressBar.newBar().appendCurrent(getPageTitle());
@@ -176,29 +182,31 @@
@Environmental
private RenderSupport renderSupport;
- @InjectComponent
- private FormFragment optionsFragment;
+// @InjectComponent
+// private FormFragment optionsFragment;
/**
- * Action when rendering form. A script is added to manage form interactions
+ * Action when rendering form. A script is added to manage form
+ * interactions
*/
@Log
void onPrepareForRender() {
String formId = mainForm.getClientId();
if (log.isDebugEnabled()) {
log.debug("form id : " + formId);
- log.debug("options fragment id : " + optionsFragment.getClientId());
+// log.debug("options fragment id : " + optionsFragment.getClientId());
}
if (formId != null) {
// Script for form interactions : see "webapp/js/pollForm.js"
- renderSupport.addScript("new PollForm('%s', '%s', '%s');",
- formId,
- VoteCountingType.NORMAL,
- PollType.FREE);
+ renderSupport.addScript("new PollForm('%s', '%s', '%s', '%s');",
+ formId,
+ VoteCountingType.NORMAL,
+ PollType.FREE,
+ getUrl());
}
}
- /**************************** MAIN INFOS **********************************/
+ /** ************************* MAIN INFOS ********************************* */
@InjectComponent
private Form mainForm;
@@ -213,87 +221,87 @@
/************************** CHOIX *****************************************/
- @Property
- private ChoiceField choice;
+// @Property
+// private ChoiceField choice;
+//
+// private List<ChoiceField> choices;
+//
+// @Inject
+// private Block choiceText;
+//
+// @Inject
+// private Block choiceDate;
+//
+// @Inject
+// private Block choiceImage;
+//
+// private boolean refresh;
+//
+// /**
+// * Get choices from poll if it exists or initialized 4 choices with the
+// * default type : TEXT.
+// *
+// * @return a list of ChoiceDTO
+// */
+// public List<ChoiceField> getChoices() throws PollenBusinessException {
+// if (choices == null) {
+// choices = new ArrayList<ChoiceField>();
+// if (isCreateMode()) {
+// // Initialized to choice TEXT type
+// for (int i = 0; i < 4; i++) {
+// choices.add(ChoiceField.getChoiceText());
+// }
+// } else {
+// for (Choice current : getPoll().getChoice()) {
+// choices.add(new ChoiceField(getPoll(), current));
+// }
+// }
+// }
+// return choices;
+// }
+//
+// public Block getChoiceTypeBlock() {
+// switch(poll.getChoiceType()) {
+// case DATE:
+// return choiceDate;
+// case IMAGE:
+// return choiceImage;
+// default:
+// return choiceText;
+// }
+// }
+//
+// void onSelectedFromRefreshOptions() {
+// refresh = true;
+// }
+//
+// // TEMP
+// @Log
+// Object onSuccessFromMainForm() {
+// if (!refresh) {
+//
+// }
+// return mainForm;
+// }
- private List<ChoiceField> choices;
-
- @Inject
- private Block choiceText;
-
- @Inject
- private Block choiceDate;
-
- @Inject
- private Block choiceImage;
-
- private boolean refresh;
-
- /**
- * Get choices from poll if it exists or initialized 4 choices with the
- * default type : TEXT.
- *
- * @return a list of ChoiceDTO
- */
- public List<ChoiceField> getChoices() throws PollenBusinessException {
- if (choices == null) {
- choices = new ArrayList<ChoiceField>();
- if (isCreateMode()) {
- // Initialized to choice TEXT type
- for (int i = 0; i < 4; i++) {
- choices.add(ChoiceField.getChoiceText());
- }
- } else {
- for (Choice current : getPoll().getChoice()) {
- choices.add(new ChoiceField(getPoll(), current));
- }
- }
- }
- return choices;
- }
-
- public Block getChoiceTypeBlock() {
- switch(poll.getChoiceType()) {
- case DATE:
- return choiceDate;
- case IMAGE:
- return choiceImage;
- default:
- return choiceText;
- }
- }
-
- void onSelectedFromRefreshOptions() {
- refresh = true;
- }
-
- // TEMP
- @Log
- Object onSuccessFromMainForm() {
- if (!refresh) {
-
- }
- return mainForm;
- }
-
/************************** OPTIONS ***************************************/
- /** Synchronization with anonymous and anonymousVoteAllowed options **/
+ /** Synchronization with anonymous and anonymousVoteAllowed options * */
@Property
@Persist
private boolean anonymousVoteAllowedDisabled;
- /** Synchronization with continuousResults and publicResults options **/
+ /** Synchronization with continuousResults and publicResults options * */
@Property
@Persist
private boolean publicResultsDisabled;
- /** ChoiceNb option **/
+ /** ChoiceNb option * */
@Property
@Persist
private boolean hasChoiceNb;
- /** Notification option **/
+ /** Notification option * */
@Property
@Persist
private boolean hasNotification;
@@ -301,7 +309,7 @@
@Persist
private PreventRule notification;
- /** Reminder option **/
+ /** Reminder option * */
@Property
@Persist
private boolean hasReminder;
@@ -346,7 +354,7 @@
* Condition to enable or not the notification option.
*
* @return true if the mail is not defined
- * @throws PollenBusinessException
+ * @throws PollenBusinessException
*/
public boolean isNotificationDisabled() throws PollenBusinessException {
// no email defined
@@ -383,5 +391,90 @@
return getPoll().getPollType().isFree();
}
-
+ /** *********************** LISTS **************************************** */
+
+ @Persist
+ private Map<String, ParticipantList> lists; // for GROUP
+
+ @Property
+ private ParticipantList list;
+
+ @Persist
+ private Map<String, Participant> participants; // for RESTRICTED
+
+ @InjectComponent
+ private Zone listsZone;
+
+ @Property
+ private String listName;
+
+ @Inject
+ private ComponentResources resources;
+
+ private boolean flag;
+
+ @Inject
+ private Block listsForm;
+
+ @Inject
+ @Property
+ private Block listsFields;
+
+ public Map<String, ParticipantList> getLists() {
+ if (lists == null) {
+ lists = new HashMap<String, ParticipantList>();
+ }
+ return lists;
+ }
+
+ public Map<String, Participant> getParticipants() {
+ if (participants == null) {
+ participants = new HashMap<String, Participant>();
+ }
+ return participants;
+ }
+
+ @Log
+ public boolean canDisplayLists() throws PollenBusinessException {
+ return getPoll().getPollType().isRestrictedOrGroup();
+ }
+
+ @Log
+ Object onChangeFromPollType(String value) throws PollenBusinessException {
+ getPoll().setPollType(PollType.valueOf(value));
+ flag = false;
+ return listsZone.getBody();
+ }
+
+ @Log
+ public Block getListsBlock() throws PollenBusinessException {
+ if (canDisplayLists()) {
+ if (flag) {
+ return listsFields;
+ }
+ return listsForm;
+ }
+ return null;
+ }
+
+ @Log
+ void onSelectedFromAddList() {
+ flag = true;
+ addList(listName);
+ }
+
+ protected void addList(String name) {
+ if (!getLists().containsKey(name)) {
+ ParticipantList list = new PollAccountImpl();
+ list.setName(name);
+ getLists().put(name, list);
+ }
+ }
+
+ @Log
+ Object onSuccess() throws PollenBusinessException {
+ return mainZone;
+ }
+
+
}
Modified: trunk/pollen-ui/src/main/resources/org/chorem/pollen/ui/components/UserListsUpdate.tml
===================================================================
--- trunk/pollen-ui/src/main/resources/org/chorem/pollen/ui/components/UserListsUpdate.tml 2010-05-11 15:34:24 UTC (rev 2993)
+++ trunk/pollen-ui/src/main/resources/org/chorem/pollen/ui/components/UserListsUpdate.tml 2010-05-12 17:42:29 UTC (rev 2994)
@@ -80,31 +80,7 @@
<input t:type="submit" value="${message:pollen.ui.button.add}" title="${message:pollen.ui.list.update.addParticipant}"/>
</div>
</fieldset>
- <!--<table class="t-data-grid">
- <tr>
- <td class="votingId">
- <input t:type="textfield" t:id="name" t:value="newParticipant.name" t:validate="required" size="10"/>
- </td>
- <td class="email">
- <input t:type="textfield" t:id="email" t:value="newParticipant.email" t:validate="regexp" size="15"/>
- </td>
- <td class="weight">
- <input t:type="textfield" t:id="weight" t:value="newParticipant.weight" size="5"/>
- </td>
- <td class="functions">
- <input t:type="submit" value="${message:pollen.ui.button.add}" title="${message:pollen.ui.list.update.addParticipant}"/>
- </td>
- </tr>
- </table>-->
</form>
-
- <!-- Delete the favoriteListSelected -->
- <!-- <p>
- <a t:type="actionlink" t:id="deleteList">
- <img src="${asset:context:img/delete.png}" alt="Delete"/>${message:deleteList}
- </a>
- </p>-->
-
</div>
<p:else>
Modified: trunk/pollen-ui/src/main/resources/org/chorem/pollen/ui/pages/poll/PollForm_fr.properties
===================================================================
--- trunk/pollen-ui/src/main/resources/org/chorem/pollen/ui/pages/poll/PollForm_fr.properties 2010-05-11 15:34:24 UTC (rev 2993)
+++ trunk/pollen-ui/src/main/resources/org/chorem/pollen/ui/pages/poll/PollForm_fr.properties 2010-05-12 17:42:29 UTC (rev 2994)
@@ -1,4 +1,4 @@
-pageTitle-create=Cr\u00E9ation d'un nouveau sondage
+pageTitle-create=Cr\u00e9ation d'un nouveau sondage
mainTitle-create=Nouveau sondage
pageTitle-update=Modification du sondage %s
@@ -15,18 +15,18 @@
title-label=Titre *
title-required-message=Vous devez fournir un titre pour le sondage.
description-label=Description
-beginDate-label=D\u00E9but
+beginDate-label=D\u00e9but
beginDate-regexp=\\d{2}\/\\d{2}\/\\d{4}( \\d{2}\\:\\d{2})?
-beginDate-regexp-message=La date de d\u00E9but doit-\u00EAtre au format 31/12/2000 23:59.
-beginDate-validate=La date de d\u00E9but doit-\u00EAtre post\u00E9rieure \u00E0 la date actuelle.
+beginDate-regexp-message=La date de d\u00e9but doit-\u00eatre au format 31/12/2000 23:59.
+beginDate-validate=La date de d\u00e9but doit-\u00eatre post\u00e9rieure \u00e0 la date actuelle.
endDate-label=Fin
endDate-regexp=\\d{2}\/\\d{2}\/\\d{4}( \\d{2}\\:\\d{2})?
-endDate-regexp-message=La date de fin doit-\u00EAtre au format 31/12/2000 23:59.
-endDate-validate=La date de fin doit-\u00EAtre post\u00E9rieure \u00E0 la date de d\u00E9but.
+endDate-regexp-message=La date de fin doit-\u00eatre au format 31/12/2000 23:59.
+endDate-validate=La date de fin doit-\u00eatre post\u00e9rieure \u00e0 la date de d\u00e9but.
pollType-label=Restriction des votants
-pollType-help=<strong>Aucune</strong> : accessible \u00E0 tout le monde<br/><strong>Liste simple</strong> : accessible uniquement \u00E0 une liste de votants<br/><strong>Par groupes</strong> : accessible \u00E0 plusieurs listes de votants
-VoteCountingType-label=D\u00E9pouillement
-VoteCountingType-help=<strong>Normal</strong> : s\u00E9lection de 1 ou n choix parmis les choix possibles<br/><strong>Pourcentage</strong> : attribution d\'un pourcentage \u00E0 chaque choix<br/><strong>Condorcet</strong> : classement des choix par ordre de pr\u00E9f\u00E9rence<br/><strong>Nombre</strong> : R\u00E9ponse libre. Fait la somme et la moyenne des nombres.
+pollType-help=<strong>Aucune</strong> : accessible \u00e0 tout le monde<br/><strong>Liste simple</strong> : accessible uniquement \u00e0 une liste de votants<br/><strong>Par groupes</strong> : accessible \u00e0 plusieurs listes de votants
+VoteCountingType-label=D\u00e9pouillement
+VoteCountingType-help=<strong>Normal</strong> : s\u00e9lection de 1 ou n choix parmis les choix possibles<br/><strong>Pourcentage</strong> : attribution d\'un pourcentage \u00e0 chaque choix<br/><strong>Condorcet</strong> : classement des choix par ordre de pr\u00e9f\u00e9rence<br/><strong>Nombre</strong> : R\u00e9ponse libre. Fait la somme et la moyenne des nombres.
# Labels for enums
PollType.FREE=Aucune
@@ -41,52 +41,53 @@
ChoiceType.IMAGE=Image
# Options
-advancedOptions-label=Options avanc\u00E9es
+legend-options=Options
+advancedOptions-label=Options avanc\u00e9es
anonymous-label=Sondage anonyme
anonymous-help=Les votants ainsi que leurs votes sont anonymes
anonymousVoteAllowed-label=Autoriser le vote anonyme
-anonymousVoteAllowed-help=Les votants peuvent \u00EAtre anonymes
-continuousResults-label=R\u00E9sultats continus
-continuousResults-help=Les r\u00E9sultats du sondage sont affich\u00E9s en continu au moment du vote
-publicResults-label=R\u00E9sultats publics
-publicResults-help=Les r\u00E9sultats du sondage sont consultables par tout le monde
+anonymousVoteAllowed-help=Les votants peuvent \u00eatre anonymes
+continuousResults-label=R\u00e9sultats continus
+continuousResults-help=Les r\u00e9sultats du sondage sont affich\u00e9s en continu au moment du vote
+publicResults-label=R\u00e9sultats publics
+publicResults-help=Les r\u00e9sultats du sondage sont consultables par tout le monde
choiceAddAllowed-label=Autoriser l'ajout de choix
choiceAddAllowed-help=Il est possible d\'ajouter des choix au sondage.
-beginChoiceDate-label=Date de d\u00E9but
+beginChoiceDate-label=Date de d\u00e9but
beginChoiceDate-regexp=\\d{2}\/\\d{2}\/\\d{4}( \\d{2}\\:\\d{2})?
-beginChoiceDate-regexp-message=La date de d\u00E9but doit-\u00EAtre au format 31/12/2000 23:59.
-beginChoiceDate-validate=La date d'ajout de choix doit-\u00EAtre ant\u00E9rieure \u00E0 la date de d\u00E9but du sondage.
+beginChoiceDate-regexp-message=La date de d\u00e9but doit-\u00eatre au format 31/12/2000 23:59.
+beginChoiceDate-validate=La date d'ajout de choix doit-\u00eatre ant\u00e9rieure \u00e0 la date de d\u00e9but du sondage.
endChoiceDate-label=Date de fin
endChoiceDate-regexp=\\d{2}\/\\d{2}\/\\d{4}( \\d{2}\\:\\d{2})?
-endChoiceDate-regexp-message=La date de fin doit-\u00EAtre au format 31/12/2000 23:59.
-endChoiceDate-validate=La date de fin d'ajout de choix doit-\u00EAtre post\u00E9rieure \u00E0 la date de d\u00E9but.
+endChoiceDate-regexp-message=La date de fin doit-\u00eatre au format 31/12/2000 23:59.
+endChoiceDate-validate=La date de fin d'ajout de choix doit-\u00eatre post\u00e9rieure \u00e0 la date de d\u00e9but.
choiceNb-label=Limiter le nombre de choix par vote
-choiceNb-help=Le nombre de choix que l\'utilisateur peut s\u00E9lectionner est limit\u00E9. Option disponible uniquement pour un d\u00E9pouillement simple.
+choiceNb-help=Le nombre de choix que l\'utilisateur peut s\u00e9lectionner est limit\u00e9. Option disponible uniquement pour un d\u00e9pouillement simple.
maxChoiceNb-label=Limite
-maxChoiceNb-min-message=La valeur doit-\u00EAtre sup\u00E9rieure \u00E0 0.
+maxChoiceNb-min-message=La valeur doit-\u00eatre sup\u00e9rieure \u00e0 0.
sendNotification-label=Recevoir des emails de notification
-sendNotification-help=Un email vous est envoy\u00E9 tous les N votes pour vous permettre de suivre l'avanc\u00E9e du sondage. Vous devez pr\u00E9ciser votre email pour acc\u00E9der \u00E0 cette option.
+sendNotification-help=Un email vous est envoy\u00e9 tous les N votes pour vous permettre de suivre l'avanc\u00e9e du sondage. Vous devez pr\u00e9ciser votre email pour acc\u00e9der \u00e0 cette option.
notification-label=Tous les
notification-label2=votes
-notification-min-message=La valeur doit-\u00EAtre sup\u00E9rieure \u00E0 0.
+notification-min-message=La valeur doit-\u00eatre sup\u00e9rieure \u00e0 0.
sendReminder-label=Envoyer des emails de rappel
-sendReminder-help=Un email de rappel est envoy\u00E9 aux votants qui n\'ont pas encore vot\u00E9 N heures avant la fin du sondage. Option disponible uniquement pour un sondage restreint ou par groupes.
+sendReminder-help=Un email de rappel est envoy\u00e9 aux votants qui n\'ont pas encore vot\u00e9 N heures avant la fin du sondage. Option disponible uniquement pour un sondage restreint ou par groupes.
reminder-label=heures avant la fin
-reminder-min-message=La valeur doit-\u00EAtre sup\u00E9rieure \u00E0 0.
+reminder-min-message=La valeur doit-\u00eatre sup\u00e9rieure \u00e0 0.
#choices
choiceType-label=Choix de type
choiceTextField-label=Choix
choiceImageField-label=Image
choiceImageField-regexp=\\.(jpe?g|gif|png|JPE?G|GIF|PNG)$
-choiceImageField-regexp-message=L'image doit-\u00EAtre au format JPG, GIF ou PNG.
+choiceImageField-regexp-message=L'image doit-\u00eatre au format JPG, GIF ou PNG.
choiceDateField-label=Date et heure
choiceDateField-regexp=\\d{2}\/\\d{2}\/\\d{4}( \\d{2}\\:\\d{2})?
-choiceDateField-regexp-message=La date doit-\u00EAtre au format 31/12/2000 23:59.
+choiceDateField-regexp-message=La date doit-\u00eatre au format 31/12/2000 23:59.
choiceDescription-label=Description
-refreshChoices-button=Rafra\u00EEchir les champs en fonction du type s\u00E9lectionn\u00E9
+refreshChoices-button=Rafra\u00eechir les champs en fonction du type s\u00e9lectionn\u00e9
addChoice=Ajouter un choix
noChoice-validate=Vous devez saisir au moins un choix.
-choice-validate=Les choix doivent \u00EAtre uniques.
-uploadError=Une erreur s'est produite lors du transfert des fichiers. La taille maximale autoris\u00E9e est de %s par fichier et %s au total.
\ No newline at end of file
+choice-validate=Les choix doivent \u00eatre uniques.
+uploadError=Une erreur s'est produite lors du transfert des fichiers. La taille maximale autoris\u00e9e est de %s par fichier et %s au total.
\ No newline at end of file
Deleted: trunk/pollen-ui/src/main/webapp/js/jquery.test.js
===================================================================
--- trunk/pollen-ui/src/main/webapp/js/jquery.test.js 2010-05-11 15:34:24 UTC (rev 2993)
+++ trunk/pollen-ui/src/main/webapp/js/jquery.test.js 2010-05-12 17:42:29 UTC (rev 2994)
@@ -1,12 +0,0 @@
-$J('#clicker').click(function() {
- alert('clicked !');
-});
-
-alert('after');
-
-$J('#p-pollForm-mainInfos a.toggleAction').click(function() {
- alert('click');
- $('#p-pollForm-mainInfos div.body').slideToggle('slow', function() {
- alert('cool');
- });
-});
\ No newline at end of file
Modified: trunk/pollen-ui/src/main/webapp/js/pollForm.js
===================================================================
--- trunk/pollen-ui/src/main/webapp/js/pollForm.js 2010-05-11 15:34:24 UTC (rev 2993)
+++ trunk/pollen-ui/src/main/webapp/js/pollForm.js 2010-05-12 17:42:29 UTC (rev 2994)
@@ -2,7 +2,7 @@
PollForm.prototype = {
- initialize: function(formId, voteCountingNormal, pollTypeFree) {
+ initialize: function(formId, voteCountingNormal, pollTypeFree, contextPath) {
// Tapestry.debug('Form id : ' + formId);
@@ -35,6 +35,41 @@
this.reminder = this.form.sendReminder;
this.reminderFragmentId = 'reminderHidden';
+ this.contextPath = contextPath;
+
+// this.contextBlockVisible = ['true', 'false'];
+// this.contextBlockId = ['mainInfos', 'options'];
+//
+// $J('#p-pollForm-mainInfos img.p-pollForm-toggle').click(this.executeToggleBlock(0));
+
+ var mainInfosActionImage = '#p-pollForm-mainInfos img.form-toggle';
+ var mainInfosVisible = true;
+ var mainInfosBlockPath = '#p-pollForm-mainInfos div.form-block';
+ $J(mainInfosActionImage).click(function() {
+ $J(mainInfosBlockPath).slideToggle('slow', function() {
+ mainInfosVisible = !mainInfosVisible;
+ if (mainInfosVisible) {
+ $J(mainInfosActionImage).attr('src', contextPath + '/img/1uparrow.png');
+ } else {
+ $J(mainInfosActionImage).attr('src', contextPath + '/img/1downarrow.png');
+ }
+ });
+ });
+
+ var optionsActionImage = '#p-pollForm-options img.form-toggle';
+ var optionsVisible = false;
+ var optionsBlockPath = '#p-pollForm-options div.form-block';
+ $J(optionsActionImage).click(function() {
+ $J(optionsBlockPath).slideToggle('slow', function() {
+ optionsVisible = !optionsVisible;
+ if (optionsVisible) {
+ $J(optionsActionImage).attr('src', contextPath + '/img/1uparrow.png');
+ } else {
+ $J(optionsActionImage).attr('src', contextPath + '/img/1downarrow.png');
+ }
+ });
+ });
+
this.voteCounting.observe('change', this.updateFromVoteCounting.bindAsEventListener(this));
this.pollType.observe('change', this.updateFromPollType.bindAsEventListener(this));
this.email.observe('blur', this.updateFromEmail.bindAsEventListener(this));
@@ -42,6 +77,28 @@
this.continuousResults.observe('change', this.updateFromContinuousResults.bindAsEventListener(this));
},
+// executeToggleBlock: function(index) {
+// var context = '#p-pollForm-' + this.contextBlockId[index];
+//
+// alert('context toggle : ' + this.contextBlockId);
+//
+// $J(context + ' div.p-pollForm-block').slideToggle('slow',
+// this.refreshToggleImage(index, context));
+// },
+//
+// refreshToggleImage: function(index, context) {
+// alert('context visible : ' + this.contextBlockVisible);
+//
+// var actionImage = $J(context + ' img.p-pollForm-toggle');
+//
+// this.contextBlockVisible[index] = !this.contextBlockVisible[index];
+// if (this.contextBlockVisible[index]) {
+// actionImage.attr('src', this.contextPath + '/img/1uparrow.png');
+// } else {
+// actionImage.attr('src', this.contextPath + '/img/1downarrow.png');
+// }
+// },
+
/*
* Action when voteCounting select change. This change affects choiceNb
* checkbox : choiceNb is only available if voteCounting is 'NORMAL'.
Modified: trunk/pollen-ui/src/main/webapp/poll/PollForm.tml
===================================================================
--- trunk/pollen-ui/src/main/webapp/poll/PollForm.tml 2010-05-11 15:34:24 UTC (rev 2993)
+++ trunk/pollen-ui/src/main/webapp/poll/PollForm.tml 2010-05-12 17:42:29 UTC (rev 2994)
@@ -16,103 +16,53 @@
<div id="p-pollForm-mainInfos">
<fieldset>
<legend>
- ${message:legend-mainInfos}
+ <img class="form-toggle" src="${asset:context:img/1uparrow.png}" /> ${message:legend-mainInfos}
</legend>
- <p>
- <span><label t:type="label" t:for="title"/>:</span>
- <input type="text" t:type="textfield" class="title" t:id="title" value="poll.title" t:validate="required"/>
- </p>
- <p>
- <span><label t:type="label" t:for="creatorName"/>:</span>
- <input type="text" t:type="textfield" t:id="creatorName" value="poll.creator.name" t:validate="required,minlength=2"/>
- <label t:type="label" t:for="email"/>:
- <input type="text" t:type="textfield" class="email" t:id="email" value="poll.creator.email" t:validate="regexp"/>
- </p>
- <p>
- <span><label t:type="label" t:for="description"/>: </span>
- <textarea t:type="textarea" cols="80" rows="2" t:id="description" t:value="poll.description">${poll.description}</textarea>
- </p>
- <p>
- <!-- FIXME : validate by regexp doesn't work : seems to be caused by dateTimeField component -->
- <span><label t:type="label" t:for="beginDate"/>: </span>
- <input t:type="ck/dateTimeField" t:id="beginDate" value="poll.beginDate" t:validate="regexp"
- t:datePattern="message:date-pattern" t:timePicker="true" t:timePickerAdjacent="true"/>
- <!-- FIXME : validate by regexp doesn't work : seems to be caused by dateTimeField component -->
- <label t:type="label" t:for="endDate"/>:
- <input t:type="ck/dateTimeField" t:id="endDate" value="poll.endDate" t:validate="regexp"
- t:datePattern="message:date-pattern" t:timePicker="true" t:timePickerAdjacent="true"/>
- <label t:type="label" t:for="voteCountingType"/>:
- <select t:type="select" t:id="voteCountingType" t:value="poll.voteCountingType" t:validate="required">
- <option></option>
- </select>
- <span t:type="ck/Tooltip" title="${message:help}" t:value="${message:voteCounting-help}" t:effect="appear">
- <img src="${asset:context:img/help.png}" alt="${message:help}"/>
- </span>
- </p>
- </fieldset>
- </div>
- <!-- CHOICES -->
- <div id="p-pollForm-choices">
- <fieldset>
- <legend>
- <label t:type="label" t:for="choiceType" />:
- <select t:type="select" t:id="choiceType" t:value="poll.choiceType" t:validate="required">
- <option></option>
- </select>
- <input type="image" t:type="submit" class="ico refresh" t:id="refreshChoices" value="Refresh choices" title="${message:refreshChoices-button}"/>
- </legend>
- <div t:type="loop" t:source="choices" t:value="choice" t:volatile="true" class="clearfix">
- <div class="fleft choiceName">
- <t:delegate t:to="choiceTypeBlock" />
- <t:block t:id="choiceText">
- <label t:type="label" t:for="choiceTextField" />:
- <input type="text" class="nameField" t:type="textfield" t:id="choiceTextField" value="choice.text" />
- </t:block>
- <t:block t:id="choiceDate">
- <label t:type="label" t:for="choiceDateField" />:
- <input t:type="ck/dateTimeField" t:id="choiceDateField" value="choice.date" t:validate="regexp"
- t:datePattern="message:date-pattern" t:timePicker="true" t:timePickerAdjacent="true"/>
- </t:block>
- <t:block t:id="choiceImage">
- <label t:type="label" t:for="choiceImageField" />:
- <input type="file" class="nameField" t:type="upload" t:id="choiceImageField" value="choice.image" t:validate="regexp" />
- </t:block>
- <t:block t:id="choiceDisplay">
- ${choice.name}
- </t:block>
-
- <t:label t:for="choiceDescription" />:
- </div>
- <div class="fleft">
- <t:textarea cols="34" rows="1" t:id="choiceDescription" t:value="choice.description" />
- </div>
+ <div class="form-block">
+ <p>
+ <span><label t:type="label" t:for="title"/>:</span>
+ <input type="text" t:type="textfield" class="title" t:id="title" value="poll.title" t:validate="required"/>
+ </p>
+ <p>
+ <span><label t:type="label" t:for="creatorName"/>:</span>
+ <input type="text" t:type="textfield" t:id="creatorName" value="poll.creator.name" t:validate="required,minlength=2"/>
+ <label t:type="label" t:for="email"/>:
+ <input type="text" t:type="textfield" class="email" t:id="email" value="poll.creator.email" t:validate="regexp"/>
+ </p>
+ <p>
+ <span><label t:type="label" t:for="description"/>: </span>
+ <textarea t:type="textarea" cols="80" rows="2" t:id="description" t:value="poll.description">${poll.description}</textarea>
+ </p>
+ <p>
+ <!-- FIXME : validate by regexp doesn't work : seems to be caused by dateTimeField component -->
+ <span><label t:type="label" t:for="beginDate"/>: </span>
+ <input t:type="ck/dateTimeField" t:id="beginDate" value="poll.beginDate" t:validate="regexp"
+ t:datePattern="message:date-pattern" t:timePicker="true" t:timePickerAdjacent="true"/>
+ <!-- FIXME : validate by regexp doesn't work : seems to be caused by dateTimeField component -->
+ <label t:type="label" t:for="endDate"/>:
+ <input t:type="ck/dateTimeField" t:id="endDate" value="poll.endDate" t:validate="regexp"
+ t:datePattern="message:date-pattern" t:timePicker="true" t:timePickerAdjacent="true"/>
+ <label t:type="label" t:for="voteCountingType"/>:
+ <select t:type="select" t:id="voteCountingType" t:value="poll.voteCountingType" t:validate="required">
+ <option></option>
+ </select>
+ <span t:type="ck/Tooltip" title="${message:help}" t:value="${message:voteCounting-help}" t:effect="appear">
+ <img src="${asset:context:img/help.png}" alt="${message:help}"/>
+ </span>
+ </p>
</div>
</fieldset>
</div>
- <!-- LISTS -->
- <div id="p-pollForm-lists">
- <fieldset>
- <legend>
- <label t:type="label" t:for="pollType"/>:
- <select t:type="select" t:id="pollType" t:value="poll.pollType" t:validate="required">
- <option></option>
- </select>
- <span t:type="ck/Tooltip" title="message:help" t:value="message:pollType-help"
- t:effect="appear">
- <img src="${asset:context:img/help.png}" alt="message:help"/>
- </span>
- </legend>
- </fieldset>
- </div>
<!-- OPTIONS -->
<div id="p-pollForm-options">
<fieldset>
<legend>
- <input t:type="checkbox" t:id="advancedOptions" t:mixins="triggerfragment" t:fragment="optionsFragment"/>
- <label t:type="label" t:for="advancedOptions"/>
+ <!--<input t:type="checkbox" t:id="advancedOptions" t:mixins="triggerfragment" t:fragment="optionsFragment"/>-->
+ <!--<label t:type="label" t:for="advancedOptions"/>-->
+ <img class="form-toggle" src="${asset:context:img/1downarrow.png}" /> ${message:legend-options}
</legend>
- <div class="clearfix">
- <t:formFragment t:id="optionsFragment" visible="advancedOptions">
+ <div class="form-block clearfix" style="display:none;">
+ <!--<t:formFragment t:id="optionsFragment" visible="advancedOptions">-->
<!-- LEFT COLUMN -->
<div class="left-column fleft">
<p>
@@ -209,10 +159,86 @@
</t:formFragment>
</p>
</div>
- </t:formFragment>
+ <!--</t:formFragment>-->
</div>
</fieldset>
</div>
+ <!-- CHOICES -->
+ <!--<div id="p-pollForm-choices">-->
+ <!--<fieldset>-->
+ <!--<legend>-->
+ <!--<label t:type="label" t:for="choiceType" />: -->
+ <!--<select t:type="select" t:id="choiceType" t:value="poll.choiceType" t:validate="required">-->
+ <!--<option></option>-->
+ <!--</select> -->
+ <!--<input type="image" t:type="submit" class="ico refresh" t:id="refreshChoices" value="Refresh choices" title="${message:refreshChoices-button}"/>-->
+ <!--</legend>-->
+ <!--<div t:type="loop" t:source="choices" t:value="choice" t:volatile="true" class="clearfix">-->
+ <!--<div class="fleft choiceName">-->
+ <!--<t:delegate t:to="choiceTypeBlock" />-->
+ <!--<t:block t:id="choiceText">-->
+ <!--<label t:type="label" t:for="choiceTextField" />: -->
+ <!--<input type="text" class="nameField" t:type="textfield" t:id="choiceTextField" value="choice.text" />-->
+ <!--</t:block>-->
+ <!--<t:block t:id="choiceDate">-->
+ <!--<label t:type="label" t:for="choiceDateField" />: -->
+ <!--<input t:type="ck/dateTimeField" t:id="choiceDateField" value="choice.date" t:validate="regexp"-->
+ <!--t:datePattern="message:date-pattern" t:timePicker="true" t:timePickerAdjacent="true"/>-->
+ <!--</t:block>-->
+ <!--<t:block t:id="choiceImage">-->
+ <!--<label t:type="label" t:for="choiceImageField" />: -->
+ <!--<input type="file" class="nameField" t:type="upload" t:id="choiceImageField" value="choice.image" t:validate="regexp" />-->
+ <!--</t:block>-->
+ <!--<t:block t:id="choiceDisplay">-->
+ <!--${choice.name}-->
+ <!--</t:block>-->
+ <!-- -->
+ <!--<t:label t:for="choiceDescription" />: -->
+ <!--</div>-->
+ <!--<div class="fleft">-->
+ <!--<t:textarea cols="34" rows="1" t:id="choiceDescription" t:value="choice.description" />-->
+ <!--</div>-->
+ <!--</div>-->
+ <!--</fieldset>-->
+ <!--</div>-->
+ <!-- LISTS -->
+ <div id="p-pollForm-lists">
+ <fieldset>
+ <legend>
+ <label t:type="label" t:for="pollType" />:
+ <select t:type="select" class="list-select" t:id="pollType" t:value="poll.pollType" t:validate="required"
+ t:mixins="nuiton/zoneUpdater" t:event="change" t:zone="p-pollForm-lists-zone"/>
+ <span t:type="ck/Tooltip" title="message:help" t:value="message:pollType-help" t:effect="appear">
+ <img src="${asset:context:img/help.png}" alt="message:help" />
+ </span>
+ </legend>
+ <div t:type="zone" id="p-pollForm-lists-zone" t:id="listsZone" class="form-block">
+ <t:delegate t:to="listsBlock" />
+ <t:block t:id="listsForm">
+ <form t:type="form" action="tapestry">
+ <t:delegate t:to="listsFields" />
+ </form>
+ </t:block>
+ <t:block t:id="listsFields">
+ <t:if t:test="poll.pollType.group">
+ <p>
+ <label t:type="label" t:for="listName" />:
+ <input t:type="textfield" t:id="listName" value="listName"/>
+ <input t:type="submit" t:id="addList" value="ADD"/>
+ </p>
+ <p>
+ <t:loop t:source="lists.values()" t:value="list" t:volatile="true">
+ ${list.name}
+ </t:loop>
+ </p>
+ <p:else>
+ COOL
+ </p:else>
+ </t:if>
+ </t:block>
+ </div>
+ </fieldset>
+ </div>
</form>
</t:zone>
</html>
1
0
r2993 - in trunk/pollen-ui/src/main: java/org/chorem/pollen/ui/pages/poll webapp/img webapp/js webapp/poll
by fdesbois@users.chorem.org 11 May '10
by fdesbois@users.chorem.org 11 May '10
11 May '10
Author: fdesbois
Date: 2010-05-11 17:34:24 +0200 (Tue, 11 May 2010)
New Revision: 2993
Url: http://chorem.org/repositories/revision/pollen/2993
Log:
Test JQuery integration + clean tml for idea validations
Added:
trunk/pollen-ui/src/main/webapp/img/1downarrow.png
trunk/pollen-ui/src/main/webapp/img/1uparrow.png
trunk/pollen-ui/src/main/webapp/js/jquery-1.4.2.min.js
trunk/pollen-ui/src/main/webapp/js/jquery.test.js
Modified:
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/PollForm.java
trunk/pollen-ui/src/main/webapp/poll/PollForm.tml
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/PollForm.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/PollForm.java 2010-05-10 13:30:05 UTC (rev 2992)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/PollForm.java 2010-05-11 15:34:24 UTC (rev 2993)
@@ -61,7 +61,7 @@
* par : $Author$
*/
@IncludeStylesheet("context:css/poll.css")
-@IncludeJavaScriptLibrary("context:js/pollForm.js")
+@IncludeJavaScriptLibrary({"context:js/pollForm.js", "context:js/jquery-1.4.2.min.js", "jquery.test.js"})
public class PollForm extends AbstractPollenPage {
@InjectComponent
Added: trunk/pollen-ui/src/main/webapp/img/1downarrow.png
===================================================================
(Binary files differ)
Property changes on: trunk/pollen-ui/src/main/webapp/img/1downarrow.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/pollen-ui/src/main/webapp/img/1uparrow.png
===================================================================
(Binary files differ)
Property changes on: trunk/pollen-ui/src/main/webapp/img/1uparrow.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/pollen-ui/src/main/webapp/js/jquery-1.4.2.min.js
===================================================================
--- trunk/pollen-ui/src/main/webapp/js/jquery-1.4.2.min.js (rev 0)
+++ trunk/pollen-ui/src/main/webapp/js/jquery-1.4.2.min.js 2010-05-11 15:34:24 UTC (rev 2993)
@@ -0,0 +1,158 @@
+/*!
+ * jQuery JavaScript Library v1.4.2
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Sat Feb 13 22:33:48 2010 -0500
+ */
+(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
+e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
+j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
+"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
+true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
+Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
+(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
+a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
+"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
+function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
+c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
+L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
+"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
+a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
+d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
+a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
+!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
+true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
+parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
+false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
+s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
+applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
+else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
+a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
+w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
+cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
+i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
+" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
+this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
+e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
+c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
+a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
+function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
+k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
+C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
+null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
+e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
+f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
+if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
+d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
+"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
+a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
+isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
+{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
+if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
+e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
+"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
+d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
+!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
+toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
+u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),
+function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
+if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
+t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
+g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
+for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
+1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
+CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
+relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
+l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
+h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
+CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
+g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
+text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
+setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
+h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
+m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
+"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
+h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
+!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
+h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
+q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
+if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
+(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
+function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
+gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
+c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
+{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
+"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
+d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
+a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
+1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
+a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
+c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
+wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
+prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
+this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
+return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
+""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
+this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
+u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
+1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
+return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
+""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
+c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
+c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
+function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
+Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
+"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
+a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
+a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
+"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
+serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
+function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
+global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
+e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
+"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
+false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
+false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
+c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
+d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
+g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
+1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
+"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
+if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
+this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
+"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
+animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
+j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
+this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
+"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
+c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
+this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
+this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
+e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
+c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
+function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
+this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
+k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
+f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
+a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
+c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
+d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
+f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
+"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
+e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
+/*
+ * Must run in noConflict mode!
+ */
+var $J = jQuery.noConflict();
Added: trunk/pollen-ui/src/main/webapp/js/jquery.test.js
===================================================================
--- trunk/pollen-ui/src/main/webapp/js/jquery.test.js (rev 0)
+++ trunk/pollen-ui/src/main/webapp/js/jquery.test.js 2010-05-11 15:34:24 UTC (rev 2993)
@@ -0,0 +1,12 @@
+$J('#clicker').click(function() {
+ alert('clicked !');
+});
+
+alert('after');
+
+$J('#p-pollForm-mainInfos a.toggleAction').click(function() {
+ alert('click');
+ $('#p-pollForm-mainInfos div.body').slideToggle('slow', function() {
+ alert('cool');
+ });
+});
\ No newline at end of file
Modified: trunk/pollen-ui/src/main/webapp/poll/PollForm.tml
===================================================================
--- trunk/pollen-ui/src/main/webapp/poll/PollForm.tml 2010-05-10 13:30:05 UTC (rev 2992)
+++ trunk/pollen-ui/src/main/webapp/poll/PollForm.tml 2010-05-11 15:34:24 UTC (rev 2993)
@@ -1,5 +1,5 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<t:border t:addressBar="addressBar" t:pageLogo="literal:Creation" t:pageBodyId="p-pollForm" t:pageTitle="prop:pageTitle"
+<html t:type="border" t:addressBar="addressBar" t:pageLogo="literal:Creation" t:pageBodyId="p-pollForm" t:pageTitle="prop:pageTitle"
xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter">
<h1 class="titlePoll">
@@ -19,29 +19,29 @@
${message:legend-mainInfos}
</legend>
<p>
- <span><label t:type="label" for="title"/>:</span>
+ <span><label t:type="label" t:for="title"/>:</span>
<input type="text" t:type="textfield" class="title" t:id="title" value="poll.title" t:validate="required"/>
</p>
<p>
- <span><label t:type="label" for="creatorName"/>:</span>
+ <span><label t:type="label" t:for="creatorName"/>:</span>
<input type="text" t:type="textfield" t:id="creatorName" value="poll.creator.name" t:validate="required,minlength=2"/>
- <label t:type="label" for="email"/>:
+ <label t:type="label" t:for="email"/>:
<input type="text" t:type="textfield" class="email" t:id="email" value="poll.creator.email" t:validate="regexp"/>
</p>
<p>
- <span><label t:type="label" for="description"/>: </span>
+ <span><label t:type="label" t:for="description"/>: </span>
<textarea t:type="textarea" cols="80" rows="2" t:id="description" t:value="poll.description">${poll.description}</textarea>
</p>
<p>
<!-- FIXME : validate by regexp doesn't work : seems to be caused by dateTimeField component -->
- <span><label t:type="label" for="beginDate"/>: </span>
+ <span><label t:type="label" t:for="beginDate"/>: </span>
<input t:type="ck/dateTimeField" t:id="beginDate" value="poll.beginDate" t:validate="regexp"
t:datePattern="message:date-pattern" t:timePicker="true" t:timePickerAdjacent="true"/>
<!-- FIXME : validate by regexp doesn't work : seems to be caused by dateTimeField component -->
- <label t:type="label" for="endDate"/>:
+ <label t:type="label" t:for="endDate"/>:
<input t:type="ck/dateTimeField" t:id="endDate" value="poll.endDate" t:validate="regexp"
t:datePattern="message:date-pattern" t:timePicker="true" t:timePickerAdjacent="true"/>
- <label t:type="label" for="voteCountingType"/>:
+ <label t:type="label" t:for="voteCountingType"/>:
<select t:type="select" t:id="voteCountingType" t:value="poll.voteCountingType" t:validate="required">
<option></option>
</select>
@@ -55,7 +55,7 @@
<div id="p-pollForm-choices">
<fieldset>
<legend>
- <label t:type="label" for="choiceType" />:
+ <label t:type="label" t:for="choiceType" />:
<select t:type="select" t:id="choiceType" t:value="poll.choiceType" t:validate="required">
<option></option>
</select>
@@ -65,23 +65,23 @@
<div class="fleft choiceName">
<t:delegate t:to="choiceTypeBlock" />
<t:block t:id="choiceText">
- <label t:type="label" for="choiceTextField" />:
+ <label t:type="label" t:for="choiceTextField" />:
<input type="text" class="nameField" t:type="textfield" t:id="choiceTextField" value="choice.text" />
</t:block>
<t:block t:id="choiceDate">
- <label t:type="label" for="choiceDateField" />:
+ <label t:type="label" t:for="choiceDateField" />:
<input t:type="ck/dateTimeField" t:id="choiceDateField" value="choice.date" t:validate="regexp"
t:datePattern="message:date-pattern" t:timePicker="true" t:timePickerAdjacent="true"/>
</t:block>
<t:block t:id="choiceImage">
- <label t:type="label" for="choiceImageField" />:
+ <label t:type="label" t:for="choiceImageField" />:
<input type="file" class="nameField" t:type="upload" t:id="choiceImageField" value="choice.image" t:validate="regexp" />
</t:block>
<t:block t:id="choiceDisplay">
${choice.name}
</t:block>
- <t:label for="choiceDescription" />:
+ <t:label t:for="choiceDescription" />:
</div>
<div class="fleft">
<t:textarea cols="34" rows="1" t:id="choiceDescription" t:value="choice.description" />
@@ -93,7 +93,7 @@
<div id="p-pollForm-lists">
<fieldset>
<legend>
- <label t:type="label" for="pollType"/>:
+ <label t:type="label" t:for="pollType"/>:
<select t:type="select" t:id="pollType" t:value="poll.pollType" t:validate="required">
<option></option>
</select>
@@ -109,7 +109,7 @@
<fieldset>
<legend>
<input t:type="checkbox" t:id="advancedOptions" t:mixins="triggerfragment" t:fragment="optionsFragment"/>
- <label t:type="label" for="advancedOptions"/>
+ <label t:type="label" t:for="advancedOptions"/>
</legend>
<div class="clearfix">
<t:formFragment t:id="optionsFragment" visible="advancedOptions">
@@ -117,14 +117,14 @@
<div class="left-column fleft">
<p>
<input t:type="checkbox" t:id="anonymous" value="poll.anonymous" />
- <label t:type="label" for="anonymous"/>
+ <label t:type="label" t:for="anonymous"/>
<span t:type="ck/Tooltip" title="message:help" t:value="message:anonymous-help" t:effect="appear">
<img src="${asset:context:img/help.png}" alt="message:help"/>
</span>
</p>
<p>
<input t:type="checkbox" t:id="continuousResults" value="poll.continuousResults"/>
- <label t:type="label" for="continuousResults"/>
+ <label t:type="label" t:for="continuousResults"/>
<span t:type="ck/Tooltip" title="message:help" t:value="message:continuousResults-help" t:effect="appear">
<img src="${asset:context:img/help.png}" alt="message:help"/>
</span>
@@ -132,18 +132,18 @@
<p>
<input t:type="checkbox" t:id="choiceAddAllowed" value="poll.choiceAddAllowed"
t:mixins="triggerfragment" t:fragment="choiceDateFragment"/>
- <label t:type="label" for="choiceAddAllowed"/>
+ <label t:type="label" t:for="choiceAddAllowed"/>
<span t:type="ck/Tooltip" title="message:help" t:value="message:choiceAddAllowed-help}" t:effect="appear">
<img src="${asset:context:img/help.png}" alt="message:help"/>
</span>
</p>
<p>
<t:formFragment t:id="choiceDateFragment" t:visible="poll.choiceAddAllowed">
- <label t:type="label" for="beginChoiceDate"/>
+ <label t:type="label" t:for="beginChoiceDate"/>
<input t:type="ck/dateTimeField" t:id="beginChoiceDate" value="poll.beginChoiceDate" t:validate="regexp"
t:datePattern="message:date-pattern" t:timePicker="true" t:timePickerAdjacent="true"/>
<br/>
- <label t:type="label" for="endChoiceDate"/>
+ <label t:type="label" t:for="endChoiceDate"/>
<input t:type="ck/dateTimeField" t:id="endChoiceDate" value="poll.endChoiceDate" t:validate="regexp"
t:datePattern="message:date-pattern" t:timePicker="true" t:timePickerAdjacent="true"/>
</t:formFragment>
@@ -151,14 +151,14 @@
<p>
<input t:type="checkbox" t:id="sendNotification" value="hasNotification"
disabled="notificationDisabled" t:mixins="triggerfragment" t:fragment="notificationFragment"/>
- <label t:type="label" for="sendNotification"/>
+ <label t:type="label" t:for="sendNotification"/>
<span t:type="ck/Tooltip" title="message:help" t:value="message:sendNotification-help" t:effect="appear">
<img src="${asset:context:img/help.png}" alt="message:help"/>
</span>
</p>
<p>
<t:formFragment id="notificationHidden" t:id="notificationFragment" t:visible="hasNotification">
- <label t:type="label" for="notification"/>
+ <label t:type="label" t:for="notification"/>
<input t:type="textfield" t:id="notification" value="notification.sensibility" t:size="3" t:validate="min=0"/>
${message:notification-label2}
</t:formFragment>
@@ -168,14 +168,14 @@
<div class="fleft">
<p>
<input t:type="checkbox" t:id="anonymousVoteAllowed" value="poll.anonymousVoteAllowed" disabled="anonymousVoteAllowedDisabled"/>
- <label t:type="label" for="anonymousVoteAllowed"/>
+ <label t:type="label" t:for="anonymousVoteAllowed"/>
<span t:type="ck/Tooltip" title="message:help" t:value="message:anonymousVoteAllowed-help" t:effect="appear">
<img src="${asset:context:img/help.png}" alt="message:help"/>
</span>
</p>
<p>
<input t:type="checkbox" t:id="publicResults" value="poll.publicResults" disabled="publicResultsDisabled"/>
- <label t:type="label" for="publicResults"/>
+ <label t:type="label" t:for="publicResults"/>
<span t:type="ck/Tooltip" title="message:help" t:value="message:publicResults-help" t:effect="appear">
<img src="${asset:context:img/help.png}" alt="message:help"/>
</span>
@@ -183,21 +183,21 @@
<p>
<input t:type="checkbox" t:id="choiceNb" value="hasChoiceNb" disabled="choiceNbDisabled"
t:mixins="triggerFragment" t:fragment="choiceNbFragment"/>
- <label t:type="label" for="choiceNb"/>
+ <label t:type="label" t:for="choiceNb"/>
<span t:type="ck/Tooltip" title="message:help" t:value="message:choiceNb-help" t:effect="appear">
<img src="${asset:context:img/help.png}" alt="message:help"/>
</span>
</p>
<p>
<t:formFragment id="choiceNbHidden" t:id="choiceNbFragment" t:visible="hasChoiceNb">
- <label t:type="label" for="maxChoiceNb"/>
+ <label t:type="label" t:for="maxChoiceNb"/>
<input t:type="textfield" t:id="maxChoiceNb" t:value="poll.maxChoiceNb" t:size="1" t:validate="min=0"/>
</t:formFragment>
</p>
<p>
<input t:type="checkbox" t:id="sendReminder" t:value="hasReminder" disabled="reminderDisabled"
t:mixins="triggerfragment" t:fragment="reminderFragment"/>
- <label t:type="label" for="sendReminder"/>
+ <label t:type="label" t:for="sendReminder"/>
<span t:type="ck/Tooltip" title="message:help" t:value="message:sendReminder-help" t:effect="appear">
<img src="${asset:context:img/help.png}" alt="message:help"/>
</span>
@@ -205,7 +205,7 @@
<p>
<t:formFragment id="reminderHidden" t:id="reminderFragment" t:visible="hasReminder">
<input t:type="textfield" t:id="reminder" t:value="reminder.sensibility" t:size="1" t:validate="min=0"/>
- <label t:type="label" for="reminder"/>
+ <label t:type="label" t:for="reminder"/>
</t:formFragment>
</p>
</div>
@@ -215,4 +215,4 @@
</div>
</form>
</t:zone>
-</t:border>
+</html>
1
0
10 May '10
Author: echatellier
Date: 2010-05-10 15:30:05 +0200 (Mon, 10 May 2010)
New Revision: 2992
Url: http://chorem.org/repositories/revision/pollen/2992
Log:
Ajout d'un script vachement compliqu?\195?\169 pour g?\195?\169n?\195?\169rer une liste de votants.
Added:
trunk/pollen-business/src/test/resources/largemaillist.sh
Added: trunk/pollen-business/src/test/resources/largemaillist.sh
===================================================================
--- trunk/pollen-business/src/test/resources/largemaillist.sh (rev 0)
+++ trunk/pollen-business/src/test/resources/largemaillist.sh 2010-05-10 13:30:05 UTC (rev 2992)
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+for i in `seq 0 3000`; do echo "\"Test $i\",\"toto+pollen+$i(a)domain.com\",1" >> test3000.csv; done
1
0