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
- 3196 discussions
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
r2991 - in trunk/pollen-business/src: main/java/org/chorem/pollen main/java/org/chorem/pollen/bean main/java/org/chorem/pollen/service test/java/org/chorem/pollen
by fdesbois@users.chorem.org 10 May '10
by fdesbois@users.chorem.org 10 May '10
10 May '10
Author: fdesbois
Date: 2010-05-10 15:22:24 +0200 (Mon, 10 May 2010)
New Revision: 2991
Url: http://chorem.org/repositories/revision/pollen/2991
Log:
Changes from ToPIA-2.4 : use exist methods to test existence + rename getTopiaId() in getId()
Modified:
trunk/pollen-business/src/main/java/org/chorem/pollen/EntityQueryProperty.java
trunk/pollen-business/src/main/java/org/chorem/pollen/bean/Filter.java
trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceFavoriteImpl.java
trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceUserImpl.java
trunk/pollen-business/src/test/java/org/chorem/pollen/TopiaQueryBuilderTest.java
Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/EntityQueryProperty.java
===================================================================
--- trunk/pollen-business/src/main/java/org/chorem/pollen/EntityQueryProperty.java 2010-05-06 17:24:53 UTC (rev 2990)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/EntityQueryProperty.java 2010-05-10 13:22:24 UTC (rev 2991)
@@ -144,7 +144,7 @@
* @return the property name to use in a TopiaQuery
*/
public String namePropertyId() {
- return nameProperty(TopiaEntity.TOPIA_ID);
+ return nameProperty(TopiaEntity.ID);
}
/**
@@ -153,7 +153,7 @@
* @return the property name to use in a TopiaQuery
*/
public String namePropertyCreateDate() {
- return nameProperty(TopiaEntity.TOPIA_CREATE_DATE);
+ return nameProperty(TopiaEntity.CREATE_DATE);
}
/**
Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/bean/Filter.java
===================================================================
--- trunk/pollen-business/src/main/java/org/chorem/pollen/bean/Filter.java 2010-05-06 17:24:53 UTC (rev 2990)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/bean/Filter.java 2010-05-10 13:22:24 UTC (rev 2991)
@@ -113,7 +113,7 @@
*/
public void setReference(TopiaEntity entity) {
String oldReferenceId = this.referenceId;
- this.referenceId = entity.getTopiaId();
+ this.referenceId = entity.getId();
propertyChangeSupport.firePropertyChange(PROP_REFERENCE_ID,
oldReferenceId, referenceId);
}
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-06 17:24:53 UTC (rev 2990)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceFavoriteImpl.java 2010-05-10 13:22:24 UTC (rev 2991)
@@ -74,21 +74,18 @@
// check favoriteList name exist for user
UserAccount user = list.getUserAccount();
- int count = dao.createQuery().
- add(FavoriteList.USER_ACCOUNT, user).
- add(FavoriteList.NAME, list.getName()).
- executeCount();
+// int count = dao.createQuery().
+// add(FavoriteList.USER_ACCOUNT, user).
+// add(FavoriteList.NAME, list.getName()).
+// executeCount();
// existing list found
- if (count > 0) {
+ if (dao.existByNaturalId(list.getName(), user)) {
throw new PollenBusinessException(
PollenExceptionType.FAVORITE_LIST_NAME_EXIST,
list.getName(), user.getDisplayName());
}
- FavoriteList newList = dao.create(
- FavoriteList.USER_ACCOUNT, list.getUserAccount(),
- FavoriteList.NAME, list.getName());
-// list.setTopiaId(newList.getTopiaId());
+ dao.create(list.getName(), list.getUserAccount());
transaction.commitTransaction();
}
@@ -98,7 +95,7 @@
FavoriteList list) throws TopiaException {
FavoriteListDAO dao = PollenDAOHelper.getFavoriteListDAO(transaction);
- FavoriteList listLoaded = dao.findByTopiaId(list.getTopiaId());
+ FavoriteList listLoaded = dao.findById(list.getId());
dao.delete(listLoaded);
transaction.commitTransaction();
@@ -136,13 +133,12 @@
add(FavoriteParticipant.EMAIL, participant.getEmail());
// Check only on entities different from the one in argument
- if (StringUtils.isNotEmpty(participant.getTopiaId())) {
- query.add(TopiaEntity.TOPIA_ID, Op.NEQ, participant.getTopiaId());
+ if (StringUtils.isNotEmpty(participant.getId())) {
+ query.add(TopiaEntity.ID, Op.NEQ, participant.getId());
}
- int count = query.executeCount();
// existing participant found
- if (count > 0) {
+ if (dao.existByQuery(query)) {
// The error type (message) depends on email nullity
if (participant.getEmail() == null) {
throw new PollenBusinessException(
@@ -181,8 +177,8 @@
// Create newParticipant with naturalId
FavoriteParticipant newParticipant =
dao.create(participant.getName(),
- participant.getEmail(),
- participant.getFavoriteList());
+ participant.getEmail(),
+ participant.getFavoriteList());
// Set other field
newParticipant.setWeight(participant.getWeight());
@@ -197,7 +193,7 @@
FavoriteParticipantDAO dao =
PollenDAOHelper.getFavoriteParticipantDAO(transaction);
- FavoriteParticipant participantLoaded = dao.findByTopiaId(id);
+ FavoriteParticipant participantLoaded = dao.findById(id);
dao.delete(participantLoaded);
@@ -215,7 +211,7 @@
checkFavoriteParticipant(dao, participant);
FavoriteParticipant participantLoaded =
- dao.findByTopiaId(participant.getTopiaId());
+ dao.findById(participant.getId());
// Set all fields except favoriteList that can't be changed
participantLoaded.setName(participant.getName());
@@ -234,7 +230,7 @@
FavoriteParticipantDAO dao =
PollenDAOHelper.getFavoriteParticipantDAO(transaction);
- FavoriteParticipant result = dao.findByTopiaId(id);
+ FavoriteParticipant result = dao.findById(id);
// Load parent list
result.getFavoriteList();
Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceUserImpl.java
===================================================================
--- trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceUserImpl.java 2010-05-06 17:24:53 UTC (rev 2990)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceUserImpl.java 2010-05-10 13:22:24 UTC (rev 2991)
@@ -105,12 +105,13 @@
*/
protected void checkPassword(UserAccountDAO dao, String login,
String password) throws TopiaException, PollenBusinessException {
- int count = dao.createQuery().
- add(UserAccount.LOGIN, login).
- add(UserAccount.PASSWORD, password).
- executeCount();
+// int count = dao.createQuery().
+// add(UserAccount.LOGIN, login).
+// add(UserAccount.PASSWORD, password).
+// executeCount();
// no user found
- if (count == 0) {
+ if (!dao.existByProperties(UserAccount.LOGIN, login,
+ UserAccount.PASSWORD, password)) {
throw new PollenBusinessException(
PollenExceptionType.USER_WRONG_PASSWORD, login);
}
@@ -126,11 +127,11 @@
*/
protected void checkLoginNotExist(UserAccountDAO dao, String login)
throws PollenBusinessException, TopiaException {
- int count = dao.createQuery().
- add(UserAccount.LOGIN, login).
- executeCount();
+// int count = dao.createQuery().
+// add(UserAccount.LOGIN, login).
+// executeCount();
// existing user found
- if (count > 0) {
+ if (dao.existByNaturalId(login)) {
throw new PollenBusinessException(
PollenExceptionType.USER_LOGIN_EXIST);
}
@@ -155,10 +156,10 @@
if (query == null) {
query = dao.createQuery();
}
- int count = query.add(UserAccount.EMAIL, StringUtils.lowerCase(email)).
- executeCount();
+ query.add(UserAccount.EMAIL, StringUtils.lowerCase(email));
+
// existing user found
- if (count > 0) {
+ if (dao.existByQuery(query)) {
throw new PollenBusinessException(
PollenExceptionType.USER_EMAIL_EXIST);
}
@@ -239,6 +240,7 @@
// In case of email change, check if an other user has not already
// the new email
+ // FIXME-fdesbois-20100510 : replace by using id directly
TopiaQuery query = dao.createQuery().
add(UserAccount.LOGIN, Op.NEQ, user.getLogin());
checkEmailNotExist(dao, user.getEmail(), query);
Modified: trunk/pollen-business/src/test/java/org/chorem/pollen/TopiaQueryBuilderTest.java
===================================================================
--- trunk/pollen-business/src/test/java/org/chorem/pollen/TopiaQueryBuilderTest.java 2010-05-06 17:24:53 UTC (rev 2990)
+++ trunk/pollen-business/src/test/java/org/chorem/pollen/TopiaQueryBuilderTest.java 2010-05-10 13:22:24 UTC (rev 2991)
@@ -53,7 +53,7 @@
Assert.assertEquals(builder.getQuery().fullQuery(),
"FROM " + UserAccount.class.getName() +
- " ORDER BY " + TopiaEntity.TOPIA_CREATE_DATE + " DESC");
+ " ORDER BY " + TopiaEntity.CREATE_DATE + " DESC");
}
@@ -98,7 +98,7 @@
"SELECT P FROM " + FavoriteParticipant.class.getName() + " P, "
+ FavoriteList.class.getName() + " L" +
" WHERE P IN elements (L." + FavoriteList.FAVORITE_PARTICIPANT +
- ") ORDER BY P." + TopiaEntity.TOPIA_CREATE_DATE + " DESC");
+ ") ORDER BY P." + TopiaEntity.CREATE_DATE + " DESC");
log.info("test3 : orderBy name and email desc");
String orderBy = FavoriteParticipant.NAME + ", " + FavoriteParticipant.EMAIL + " desc";
1
0
r2990 - trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components
by fdesbois@users.chorem.org 06 May '10
by fdesbois@users.chorem.org 06 May '10
06 May '10
Author: fdesbois
Date: 2010-05-06 19:24:53 +0200 (Thu, 06 May 2010)
New Revision: 2990
Url: http://chorem.org/repositories/revision/pollen/2990
Log:
missing javadoc on return parameter
Modified:
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsUpdate.java
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsUpdate.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsUpdate.java 2010-05-06 17:22:56 UTC (rev 2989)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsUpdate.java 2010-05-06 17:24:53 UTC (rev 2990)
@@ -82,7 +82,7 @@
* of the component, i.e. all FavoriteParticipants need to be part of the
* FavoriteList source.
*
- * @return
+ * @return the DataSource that contains participants.
*/
public FavoriteParticipantDataSource getParticipants() {
if (participants == null) {
1
0
r2989 - in trunk/pollen-ui/src/main/java/org/chorem/pollen/ui: data services
by fdesbois@users.chorem.org 06 May '10
by fdesbois@users.chorem.org 06 May '10
06 May '10
Author: fdesbois
Date: 2010-05-06 19:22:56 +0200 (Thu, 06 May 2010)
New Revision: 2989
Url: http://chorem.org/repositories/revision/pollen/2989
Log:
Evo #191 : add javadoc on Authentication service.
Modified:
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/PollenRequiresAuthentication.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenAuthentication.java
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/PollenRequiresAuthentication.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/PollenRequiresAuthentication.java 2010-05-06 17:03:11 UTC (rev 2988)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/PollenRequiresAuthentication.java 2010-05-06 17:22:56 UTC (rev 2989)
@@ -8,20 +8,20 @@
import java.lang.annotation.Target;
import org.chorem.pollen.ui.services.PollenAuthenticationFilter;
import org.chorem.pollen.ui.base.AbstractPollenPage;
-import org.nuiton.web.tapestry5.services.ServiceAuthentication;
+import org.chorem.pollen.ui.services.PollenAuthentication;
/**
* This annotation is used on pages and components that need authentication
- * to be rendered. The ServiceAuthentication is used to check authorizations
- * on each page from {@link AbstractPollenPage}. This service is called from
- * a Filter {@link PollenAuthenticationFilter} registered in Tapestry registry
- * that intercept event on component and page render.
+ * to be rendered. The {@link PollenAuthentication} service is used to check
+ * authorizations on each page from {@link AbstractPollenPage}. This service is
+ * called from a Filter {@link PollenAuthenticationFilter} registered in
+ * Tapestry registry that intercept event on component and page render.
*
* Created: 3 mai 2010
*
* @author fdesbois <fdesbois(a)codelutin.com>
* @version $Id$
- * @see ServiceAuthentication
+ * @see PollenAuthentication
* @see PollenAuthenticationFilter
*/
@Target( { ElementType.TYPE })
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenAuthentication.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenAuthentication.java 2010-05-06 17:03:11 UTC (rev 2988)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenAuthentication.java 2010-05-06 17:22:56 UTC (rev 2989)
@@ -1,19 +1,28 @@
package org.chorem.pollen.ui.services;
+import org.apache.tapestry5.annotations.SessionState;
import org.apache.tapestry5.services.ApplicationStateManager;
import org.chorem.pollen.entity.UserAccount;
import org.chorem.pollen.entity.UserAccountImpl;
import org.chorem.pollen.ui.data.PollenRequiresAuthentication;
+import org.chorem.pollen.ui.pages.admin.AdminUsers;
import org.nuiton.web.tapestry5.services.ServiceAuthenticationImpl;
/**
- * ServiceAuthenticationImpl
+ * Service to manage user connected and also check his authorizations to
+ * display Pollen pages depends on {@link PollenRequiresAuthentication}
+ * annotation over each page. This service used {@link ApplicationStateManager}
+ * service of Tapestry to store and retrieve connected user. This user
+ * can also be retrieve in pages using {@link SessionState} annotation on
+ * property of type {@link UserAccount}.
*
* Created: 4 mai 2010
*
- * @author fdesbois
- * $Id$
+ * @author fdesbois <fdesbois(a)codelutin.com>
+ * @version $Id$
+ * @see ServiceAuthenticationImpl
+ * @see PollenRequiresAuthentication
*/
public class PollenAuthentication extends
ServiceAuthenticationImpl<UserAccount, PollenRequiresAuthentication> {
@@ -23,6 +32,15 @@
PollenRequiresAuthentication.class);
}
+ /**
+ * Check authorizations of {@code user} for the {@code annotation} from
+ * current page to render. The {@code annotation} contains constraint
+ * on admin user for some specific pages as {@link AdminUsers}.
+ *
+ * @param user connected user to check for authorizations.
+ * @param annotation PollenRequiresAuthentication of the page to test
+ * @return true if user is allowed to render the page, false otherwise
+ */
@Override
protected boolean checkAuthorizations(UserAccount user,
PollenRequiresAuthentication annotation) {
@@ -30,6 +48,13 @@
return user.getAdmin() || !annotation.adminOnly();
}
+ /**
+ * Instanciate a new UserAccount for ApplicationStateManager contribution
+ * in AppModule.
+ *
+ * @return a new instance of UserAccount.
+ * @see AppModule#contributeApplicationStateManager(MappedConfiguration, ServiceAuthentication)
+ */
@Override
public UserAccount getNewUserInstance() {
return new UserAccountImpl();
1
0
r2988 - in trunk/pollen-ui/src/main: java/org/chorem/pollen/ui/components java/org/chorem/pollen/ui/data java/org/chorem/pollen/ui/pages java/org/chorem/pollen/ui/pages/user java/org/chorem/pollen/ui/services resources/i18n webapp
by fdesbois@users.chorem.org 06 May '10
by fdesbois@users.chorem.org 06 May '10
06 May '10
Author: fdesbois
Date: 2010-05-06 19:03:11 +0200 (Thu, 06 May 2010)
New Revision: 2988
Url: http://chorem.org/repositories/revision/pollen/2988
Log:
- Evo #190 : javadoc and missing i18n messages
- Connexion page is renamed in Connection
Added:
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/Connection.java
trunk/pollen-ui/src/main/webapp/Connection.tml
Removed:
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/Connexion.java
trunk/pollen-ui/src/main/webapp/Connexion.tml
Modified:
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsCreate.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsUpdate.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/PollenRequiresAuthentication.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserLists.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenAuthenticationFilter.java
trunk/pollen-ui/src/main/resources/i18n/pollen-ui-fr_FR.properties
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsCreate.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsCreate.java 2010-05-06 10:35:53 UTC (rev 2987)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsCreate.java 2010-05-06 17:03:11 UTC (rev 2988)
@@ -17,11 +17,12 @@
import org.slf4j.Logger;
/**
- * UserListsCreate
+ * Component to create a new FavoriteList using the {@code createList} form.
*
* Created: 27 avr. 2010
*
- * @author fdesbois
+ * @author fdesbois <fdesbois(a)codelutin.com>
+ * @version $Id$
*/
public class UserListsCreate {
@@ -53,10 +54,21 @@
@InjectComponent
private Form createList;
+ /**
+ * SETUP_RENDER :: Handler method called when the component is rendered.
+ * Will clean errors from {@code createList} form.
+ */
void setupRender() {
createList.clearErrors();
}
+ /**
+ * ON_PREPARE :: Handler method for both prepareRender and prepareSubmit
+ * events of {@code createList} form. Will instantiate a new instance
+ * of FavoriteList using {@code serviceFavorite} and user connected.
+ *
+ * @see ServiceFavorite#getNewFavoriteList(UserAccount)
+ */
void onPrepareFromCreateList() {
if (newFavoriteList == null) {
if (logger.isDebugEnabled()) {
@@ -67,6 +79,14 @@
}
}
+ /**
+ * ON_VALIDATE_FORM :: Handler method for validateForm event of the
+ * {@code createList} form. The {@code newFavoriteList} will be created
+ * using {@code serviceFavorite}. Errors from service will be recorded
+ * into the {@code createList} form.
+ *
+ * @see ServiceFavorite#createFavoriteParticipant(FavoriteParticipant)
+ */
void onValidateFormFromCreateList() {
try {
serviceFavorite.createFavoriteList(newFavoriteList);
@@ -85,12 +105,21 @@
}
}
+ /**
+ * ON_SUCCESS :: Handler method for success event of the {@code createList}
+ * form. Will display a success message and refresh the {@code page}
+ * container.
+ */
Object onSuccessFromCreateList() {
page.addInfo(messages.format("pollen.ui.list.create.success",
newFavoriteList.getName()));
return page;
}
+ /**
+ * ON_FAILURE :: Handler method for failure event of the {@code createList}
+ * form. Will refresh the form (included in a zone} to display errors.
+ */
Object onFailureFromCreateList() {
return createList;
}
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsUpdate.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsUpdate.java 2010-05-06 10:35:53 UTC (rev 2987)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsUpdate.java 2010-05-06 17:03:11 UTC (rev 2988)
@@ -1,7 +1,6 @@
package org.chorem.pollen.ui.components;
-import org.apache.commons.lang.StringUtils;
import org.apache.tapestry5.annotations.InjectComponent;
import org.apache.tapestry5.annotations.Log;
import org.apache.tapestry5.annotations.Parameter;
@@ -22,15 +21,17 @@
import org.slf4j.Logger;
/**
- * UserListsUpdate
+ * Component to manage FavoriteParticipant in a FavoriteList as {@code source}.
+ * The {@code participants} are displayed in an editable Grid surrounded by an
+ * unique Zone {@code updateZone}. Two forms are used, one to add a new
+ * participant in the Grid and one to edit a participant directly in the grid.
+ * Each action will return the {@code updateZone} to refresh data loaded by
+ * {@link #getParticipants()} method.
*
* Created: 27 avr. 2010
*
- * @author fdesbois
- * @version $Revision$
- *
- * Mise a jour: $Date$
- * par : $Author$
+ * @author fdesbois <fdesbois(a)codelutin.com>
+ * @version $Id$s
*/
public class UserListsUpdate {
@@ -108,7 +109,7 @@
* call prepareForSubmit
* load size of participants dataSource
* load participants data
- * load participantEdited to push form data
+ * load participantEdited to push form data (hidden fields in first)
* call selected on submit button
* call validateForm
* call success or failure
@@ -165,16 +166,17 @@
}
/**
- * ON_ACTION :: Handler method for action on deletedAccount actionLink.
- * The selected login from the Grid will be used to delete the user.
+ * ON_ACTION :: Handler method for action on removeParticipant actionLink.
+ * The selected id from the Grid will be used to delete the participant.
*
- * @param login used to delete the user
+ * @param id used to delete the participant
* @return the updateZone content to refresh
- * @see ServiceUser#deleteUser(String)
+ * @see ServiceFavorite#deleteFavoriteParticipant(String)
*/
Object onActionFromRemoveParticipant(String id) {
serviceFavorite.deleteFavoriteParticipant(id);
- participantsFeedback.addInfo("Suppression OK");
+ participantsFeedback.addInfo(
+ messages.get("pollen.ui.list.update.removeParticipant.success"));
return updateZone;
}
@@ -204,10 +206,11 @@
/**
* ON_VALIDATE_FORM :: Handler method for validateForm event of the
- * usersForm. The accountEdited will be updated using serviceUser. Errors
- * from service will be recorded into the usersForm.
+ * participantsForm. The participantEdited will be updated using
+ * serviceFavorite. Errors from service will be recorded into the
+ * participantsForm.
*
- * @see ServiceUser#updateUser(UserAccount, boolean)
+ * @see ServiceFavorite#updateFavoriteParticipant(FavoriteParticipant)
*/
@Log
void onValidateFormFromParticipantsForm() {
@@ -224,29 +227,34 @@
/**
* ON_SUCCESS :: Handler method for success event of the participantsForm.
- * Refresh the page to display a success message.
- *
- * @return the page container.
+ * Clean form data (participantEdited) and display a success message.
+ * {@link #onSubmitFromParticipantsForm()} will be called after it to
+ * refresh the updateZone.
*/
- Object onSuccessFromParticipantsForm() {
- participantsFeedback.addInfo("Modification OK");
+ void onSuccessFromParticipantsForm() {
+ participantsFeedback.addInfo(
+ messages.get("pollen.ui.list.update.saveParticipant.success"));
// Clean form data before refresh zone
cleanFormData();
- return updateZone;
}
+ /**
+ * Clean the form content, i.e. the favorite participant in edition and
+ * its id.
+ */
protected void cleanFormData() {
participantEditedId = null;
participantEdited = null;
}
/**
- * ON_FAILURE :: Handler method for failure event of the participantsForm.
- * Will display errors and keep participantEdited in edition.
+ * ON_SUBMIT :: Handler method for submit event called after succes or
+ * failure of the participantsForm. Will refresh the updateZone to display
+ * errors or Grid updated.
*
* @return the updateZone to refresh
*/
- Object onFailureFromParticipantsForm() {
+ Object onSubmitFromParticipantsForm() {
return updateZone;
}
@@ -258,6 +266,13 @@
@InjectComponent
private Form addParticipant;
+ /**
+ * ON_PREPARE :: Handler method for both prepareSubmit and prepareRender
+ * events of the participantsForm. Will instantiate a new
+ * FavoriteParticipant to render or saved with form data.
+ *
+ * @see ServiceFavorite#getNewFavoriteParticipant(FavoriteList)
+ */
void onPrepareFromAddParticipant() {
if (newParticipant == null) {
newParticipant =
@@ -265,6 +280,14 @@
}
}
+ /**
+ * ON_VALIDATE_FORM :: Handler method for validateForm event of the
+ * addParticipant form. The newParticipant will be created using
+ * serviceFavorite. Errors from service will be recorded into the
+ * addParticipant form.
+ *
+ * @see ServiceFavorite#createFavoriteParticipant(FavoriteParticipant)
+ */
void onValidateFormFromAddParticipant() {
if (logger.isDebugEnabled()) {
logger.debug("FavoriteList selected : " + source);
@@ -277,8 +300,25 @@
}
}
+ /**
+ * ON_SUCCESS :: Handler method for success event of the addParticipant form.
+ * Will display a success message. {@link #onSubmitFromAddParticipant()}
+ * will be called after it to refresh the updateZone.
+ */
+ void onSuccessFromAddParticipant() {
+ participantsFeedback.addInfo(
+ messages.format("pollen.ui.list.update.addParticipant.success",
+ newParticipant.getName()));
+ }
+
+ /**
+ * ON_SUBMIT :: Handler method for submit event called after succes or
+ * failure of the addParticipant form. Will refresh the updateZone to
+ * display errors or Grid updated.
+ *
+ * @return the updateZone to refresh
+ */
Object onSubmitFromAddParticipant() {
- participantsFeedback.addInfo("Ajout OK");
return updateZone;
}
}
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/PollenRequiresAuthentication.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/PollenRequiresAuthentication.java 2010-05-06 10:35:53 UTC (rev 2987)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/PollenRequiresAuthentication.java 2010-05-06 17:03:11 UTC (rev 2988)
@@ -6,15 +6,23 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
+import org.chorem.pollen.ui.services.PollenAuthenticationFilter;
+import org.chorem.pollen.ui.base.AbstractPollenPage;
+import org.nuiton.web.tapestry5.services.ServiceAuthentication;
/**
* This annotation is used on pages and components that need authentication
- * to be rendered.
+ * to be rendered. The ServiceAuthentication is used to check authorizations
+ * on each page from {@link AbstractPollenPage}. This service is called from
+ * a Filter {@link PollenAuthenticationFilter} registered in Tapestry registry
+ * that intercept event on component and page render.
*
* Created: 3 mai 2010
*
- * @author fdesbois
- * $Id$
+ * @author fdesbois <fdesbois(a)codelutin.com>
+ * @version $Id$
+ * @see ServiceAuthentication
+ * @see PollenAuthenticationFilter
*/
@Target( { ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
Copied: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/Connection.java (from rev 2985, trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/Connexion.java)
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/Connection.java (rev 0)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/Connection.java 2010-05-06 17:03:11 UTC (rev 2988)
@@ -0,0 +1,127 @@
+
+package org.chorem.pollen.ui.pages;
+
+import org.apache.tapestry5.annotations.InjectComponent;
+import org.apache.tapestry5.annotations.Log;
+import org.apache.tapestry5.annotations.Property;
+import org.apache.tapestry5.corelib.components.Form;
+import org.apache.tapestry5.ioc.Messages;
+import org.apache.tapestry5.ioc.annotations.Inject;
+import org.apache.tapestry5.services.PageRenderLinkSource;
+import org.chorem.pollen.PollenBusinessException;
+import org.chorem.pollen.entity.UserAccount;
+import org.chorem.pollen.service.ServiceUser;
+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.services.PollenManager;
+import org.nuiton.web.tapestry5.services.ServiceAuthentication;
+import org.slf4j.Logger;
+
+/**
+ * Connexion
+ *
+ * Created: 4 mai 2010
+ *
+ * @author fdesbois
+ * $Id$
+ */
+public class Connection extends AbstractPollenPage {
+
+ @InjectComponent
+ private Border border;
+
+ @Override
+ public Border getBorder() {
+ return border;
+ }
+
+ public AddressBar getAddressBar() {
+ return AddressBar.newBar();
+ }
+
+ @InjectComponent
+ private Form loginForm;
+
+ /**
+ * Champ login du formulaire d'identification
+ */
+ @Property
+ private String connectionLogin;
+
+ /**
+ * Champ password du formulaire d'identification
+ */
+ @Property
+ private String connectionPassword;
+
+ /** Injection des services */
+ @Inject
+ private Logger logger;
+
+ @Inject
+ private Messages messages;
+
+ @Inject
+ private ServiceAuthentication<UserAccount> serviceAuthentication;
+
+ @Inject
+ private ServiceUser serviceUser;
+
+ @Inject
+ private PollenManager manager;
+
+ @Inject
+ private PageRenderLinkSource pageRender;
+
+ private String pageName;
+
+ void onActivate(String pageName) {
+ this.pageName = pageName;
+ }
+
+ String onPassivate() {
+ return pageName;
+ }
+
+ void setupRender() {
+ addError(messages.format("pollen.ui.user.display.notConnected",
+ pageName));
+ }
+
+ void onValidateFormFromLoginForm() {
+ UserAccount current;
+ try {
+ current = serviceUser.connect(connectionLogin, connectionPassword);
+ if (current != null) {
+ serviceAuthentication.setUserConnected(current);
+ } else {
+ loginForm.recordError(messages.get("loginFailed"));
+ }
+ } catch (PollenBusinessException eee) {
+ // TODO two different errors, on password or on login
+ //addError(messages.get("loginFailed"));
+ String message = manager.getErrorMessage(eee, messages, logger);
+ loginForm.recordError(message);
+ }
+ }
+
+ /**
+ * Methode appelée lorsque l'utilisateur s'identifie
+ *
+ * @return la zone à mettre à jour
+ */
+ @Log
+ Object onSuccessFromLoginForm() {
+ if (pageName == null) {
+ pageName = "index";
+ }
+ return pageRender.createPageRenderLink(pageName);
+ }
+
+ @Log
+ void onFailureFromLoginForm() {
+
+ }
+
+}
Property changes on: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/Connection.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:mergeinfo
+
Deleted: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/Connexion.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/Connexion.java 2010-05-06 10:35:53 UTC (rev 2987)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/Connexion.java 2010-05-06 17:03:11 UTC (rev 2988)
@@ -1,127 +0,0 @@
-
-package org.chorem.pollen.ui.pages;
-
-import org.apache.tapestry5.annotations.InjectComponent;
-import org.apache.tapestry5.annotations.Log;
-import org.apache.tapestry5.annotations.Property;
-import org.apache.tapestry5.corelib.components.Form;
-import org.apache.tapestry5.ioc.Messages;
-import org.apache.tapestry5.ioc.annotations.Inject;
-import org.apache.tapestry5.services.PageRenderLinkSource;
-import org.chorem.pollen.PollenBusinessException;
-import org.chorem.pollen.entity.UserAccount;
-import org.chorem.pollen.service.ServiceUser;
-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.services.PollenManager;
-import org.nuiton.web.tapestry5.services.ServiceAuthentication;
-import org.slf4j.Logger;
-
-/**
- * Connexion
- *
- * Created: 4 mai 2010
- *
- * @author fdesbois
- * $Id$
- */
-public class Connexion extends AbstractPollenPage {
-
- @InjectComponent
- private Border border;
-
- @Override
- public Border getBorder() {
- return border;
- }
-
- public AddressBar getAddressBar() {
- return AddressBar.newBar();
- }
-
- @InjectComponent
- private Form loginForm;
-
- /**
- * Champ login du formulaire d'identification
- */
- @Property
- private String connectionLogin;
-
- /**
- * Champ password du formulaire d'identification
- */
- @Property
- private String connectionPassword;
-
- /** Injection des services */
- @Inject
- private Logger logger;
-
- @Inject
- private Messages messages;
-
- @Inject
- private ServiceAuthentication<UserAccount> serviceAuthentication;
-
- @Inject
- private ServiceUser serviceUser;
-
- @Inject
- private PollenManager manager;
-
- @Inject
- private PageRenderLinkSource pageRender;
-
- private String pageName;
-
- void onActivate(String pageName) {
- this.pageName = pageName;
- }
-
- String onPassivate() {
- return pageName;
- }
-
- void setupRender() {
- addError(messages.format("pollen.ui.user.display.notConnected",
- pageName));
- }
-
- void onValidateFormFromLoginForm() {
- UserAccount current;
- try {
- current = serviceUser.connect(connectionLogin, connectionPassword);
- if (current != null) {
- serviceAuthentication.setUserConnected(current);
- } else {
- loginForm.recordError(messages.get("loginFailed"));
- }
- } catch (PollenBusinessException eee) {
- // TODO two different errors, on password or on login
- //addError(messages.get("loginFailed"));
- String message = manager.getErrorMessage(eee, messages, logger);
- loginForm.recordError(message);
- }
- }
-
- /**
- * Methode appelée lorsque l'utilisateur s'identifie
- *
- * @return la zone à mettre à jour
- */
- @Log
- Object onSuccessFromLoginForm() {
- if (pageName == null) {
- pageName = "index";
- }
- return pageRender.createPageRenderLink(pageName);
- }
-
- @Log
- void onFailureFromLoginForm() {
-
- }
-
-}
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserLists.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserLists.java 2010-05-06 10:35:53 UTC (rev 2987)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserLists.java 2010-05-06 17:03:11 UTC (rev 2988)
@@ -10,7 +10,6 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. ##%*/
@@ -24,20 +23,28 @@
import org.apache.tapestry5.annotations.Parameter;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
+import org.apache.tapestry5.ioc.Messages;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.services.PropertyAccess;
import org.chorem.pollen.entity.FavoriteList;
import org.chorem.pollen.service.ServiceFavorite;
import org.chorem.pollen.ui.base.AbstractPollenPage;
import org.chorem.pollen.ui.components.Border;
+import org.chorem.pollen.ui.components.UserListsCreate;
+import org.chorem.pollen.ui.components.UserListsUpdate;
import org.chorem.pollen.ui.data.AddressBar;
import org.chorem.pollen.ui.data.GenericSelectModel;
import org.chorem.pollen.ui.data.PollenRequiresAuthentication;
/**
- * Classe de la page d'affichage des listes de votants favorites de
- * l'utilisateur. Si l'utilisateur n'est pas identifié, on lui demande d'abord
- * de s'identifier via un formulaire.
+ * Page to manage favorite lists of the connected user only (managed thanks to
+ * {@link PollenRequiresAuthentication} annotation). This page use two main
+ * components, {@link UserListsCreate} to create a FavoriteList (from import
+ * csv, ldap or an empty one) and {@link UserListsUpdate} to manage content
+ * of the FavoriteList. This page will provide {@code favoriteListSelected}
+ * from a form with only a SelectModel loaded by {@link #getFavoriteLists()}
+ * with {@link #getFavoriteListModel()} as model. The delete action is also
+ * manage by the page using {@code serviceFavorite}.
*
* @author rannou
* @author fdesbois <fdesbois(a)codelutin.com>
@@ -47,6 +54,9 @@
@IncludeStylesheet("context:css/users.css")
public class UserLists extends AbstractPollenPage {
+ /************************** PAGE CONFIGURATION ****************************/
+
+ /** Border layout **/
@InjectComponent
private Border border;
@@ -61,23 +71,44 @@
@Property
private String title;
+ /**
+ * AddressBar for {@code border} component.
+ *
+ * @return a new AddressBar for the page.
+ */
public AddressBar getAddressBar() {
return AddressBar.newBar().appendCurrent(title);
}
+ /** Services injected **/
@Inject
private ServiceFavorite serviceFavorite;
@Inject
private PropertyAccess propertyAccess;
+ @Inject
+ private Messages messages;
+
+ /************************** SELECT FAVORITE LIST **************************/
+
private List<FavoriteList> favoriteLists;
private GenericSelectModel<FavoriteList> favoriteListModel;
+ /**
+ * Main property favoriteListSelected is keeped in Session and was
+ * used as parameter for UserListsUpdate component.
+ **/
@Persist
@Property
private FavoriteList favoriteListSelected;
+ /**
+ * Getter for SelectModel used to display select and bind entries with the
+ * FavoriteLists loaded by {@link #getFavoriteLists()}.
+ *
+ * @return a GenericSelectModel which contains Favorite lists loaded.
+ */
public GenericSelectModel<FavoriteList> getFavoriteListModel() {
if (favoriteListModel == null) {
favoriteListModel =
@@ -90,6 +121,12 @@
return favoriteListModel;
}
+ /**
+ * Getter to load data for FavoriteLists from connected user.
+ *
+ * @return a list of FavoriteList.
+ * @see ServiceFavorite#getFavoriteLists(UserAccount)
+ */
public List<FavoriteList> getFavoriteLists() {
if (favoriteLists == null) {
favoriteLists = serviceFavorite.getFavoriteLists(getUserConnected());
@@ -97,14 +134,31 @@
return favoriteLists;
}
+ /************************** SELECT FAVORITE LIST **************************/
+
+ /**
+ * Used to verify if the {@code favoriteListSelected} is set and ready
+ * to be deleted using {@code deleteList} actionLink.
+ *
+ * @return true if the {@code favoriteListSelected} is not null.
+ */
public boolean canDeleteList() {
return favoriteListSelected != null;
}
+ /**
+ * ON_ACTION :: Handler method for action on {@code deleteList} actionLink.
+ * Check is done using {@link #canDeleteList()}, then the
+ * {@code serviceFavorite} is called to execute the delete on
+ * {@code favoriteListSelected}.
+ *
+ * @see ServiceFavorite#deleteFavoriteList(FavoriteList)
+ */
void onActionFromDeleteList() {
if (canDeleteList()) {
serviceFavorite.deleteFavoriteList(favoriteListSelected);
- addInfo("Suppression OK");
+ addInfo(
+ messages.get("pollen.ui.list.delete.success"));
}
}
}
\ No newline at end of file
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenAuthenticationFilter.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenAuthenticationFilter.java 2010-05-06 10:35:53 UTC (rev 2987)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenAuthenticationFilter.java 2010-05-06 17:03:11 UTC (rev 2988)
@@ -1,27 +1,42 @@
package org.chorem.pollen.ui.services;
+import org.apache.tapestry5.services.ComponentRequestFilter;
import org.apache.tapestry5.services.ComponentSource;
import org.apache.tapestry5.services.PageRenderLinkSource;
import org.apache.tapestry5.services.Response;
import org.chorem.pollen.entity.UserAccount;
import org.chorem.pollen.ui.data.PollenRequiresAuthentication;
-import org.chorem.pollen.ui.pages.Connexion;
+import org.chorem.pollen.ui.pages.Connection;
import org.chorem.pollen.ui.pages.ErrorPage;
import org.nuiton.web.tapestry5.services.AbstractAuthenticationFilter;
import org.nuiton.web.tapestry5.services.ServiceAuthentication;
/**
- * AuthenticationFilter
+ * AuthenticationFilter extends {@link AbstractAuthenticationFilter} that
+ * implents {@link ComponentRequestFilter} to provide behavior on each
+ * component and page rander. This is used for security managment and need
+ * the annotation {@link PollenAuthenticationFilter} to be put on pages that
+ * need authorization to be displayed.
*
* Created: 4 mai 2010
*
* @author fdesbois
- * $Id$
+ * @version $Id$
+ * @see AbstractAuthenticationFilter
*/
public class PollenAuthenticationFilter extends
AbstractAuthenticationFilter<UserAccount, PollenRequiresAuthentication>{
+ /**
+ * Constructor to intialize super class.
+ *
+ * @param renderLinkSource
+ * @param componentSource
+ * @param response
+ * @param serviceAuthentication
+ * @see AbstractAuthenticationFilter#AbstractAuthenticationFilter(PageRenderLinkSource, ComponentSource, Response, ServiceAuthentication, Class)
+ */
public PollenAuthenticationFilter(PageRenderLinkSource renderLinkSource,
ComponentSource componentSource, Response response,
ServiceAuthentication<UserAccount> serviceAuthentication) {
@@ -29,11 +44,22 @@
serviceAuthentication, PollenRequiresAuthentication.class);
}
+ /**
+ * Define which page Class is called to redict user after authorization
+ * problem. For a NOT_CONNECTED type, this will redirect to
+ * {@link Connection} page, and for a NOT_ALLOWED type, this will be redirect
+ * to {@link ErrorPage}. Note that both pages have in context the pageFrom
+ * called when filter intercept it.
+ *
+ * @param redirectType used to define which page will be redirected
+ * @return the page to redirect to
+ * @see AbstractAuthenticationFilter#redirectUnauthorizedUser(String)
+ */
@Override
protected Class<?> getRedirectPage(AuthenticationRedirect redirectType) {
switch (redirectType) {
case NOT_CONNECTED:
- return Connexion.class;
+ return Connection.class;
case NOT_ALLOWED:
return ErrorPage.class;
}
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-06 10:35:53 UTC (rev 2987)
+++ trunk/pollen-ui/src/main/resources/i18n/pollen-ui-fr_FR.properties 2010-05-06 17:03:11 UTC (rev 2988)
@@ -35,17 +35,21 @@
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.update.addParticipant=Ajouter un nouveau votant \u00E0 la liste
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.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.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.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.
# OLD LOGIN_COMPONENT
connectionLegend=Connexion
Copied: trunk/pollen-ui/src/main/webapp/Connection.tml (from rev 2983, trunk/pollen-ui/src/main/webapp/Connexion.tml)
===================================================================
--- trunk/pollen-ui/src/main/webapp/Connection.tml (rev 0)
+++ trunk/pollen-ui/src/main/webapp/Connection.tml 2010-05-06 17:03:11 UTC (rev 2988)
@@ -0,0 +1,23 @@
+<!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:Index"
+ xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter">
+
+ <t:form t:id="loginForm">
+ <fieldset>
+ <legend>${message:connectionLegend}</legend>
+ <t:errors />
+ <div>
+ <t:label for="connectionLogin" />
+ <input t:type="TextField" t:id="connectionLogin" validate="required" />
+ </div>
+ <div>
+ <t:label for="connectionPassword" />
+ <input t:type="PasswordField" t:id="connectionPassword" validate="required" />
+ </div>
+ <div class="buttons">
+ <input t:id="submitLoginCompForm" t:type="Submit" t:value="${message:loginSubmit}" />
+ </div>
+ </fieldset>
+ </t:form>
+
+</t:border>
\ No newline at end of file
Property changes on: trunk/pollen-ui/src/main/webapp/Connection.tml
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:mergeinfo
+
Deleted: trunk/pollen-ui/src/main/webapp/Connexion.tml
===================================================================
--- trunk/pollen-ui/src/main/webapp/Connexion.tml 2010-05-06 10:35:53 UTC (rev 2987)
+++ trunk/pollen-ui/src/main/webapp/Connexion.tml 2010-05-06 17:03:11 UTC (rev 2988)
@@ -1,23 +0,0 @@
-<!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:Index"
- xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter">
-
- <t:form t:id="loginForm">
- <fieldset>
- <legend>${message:connectionLegend}</legend>
- <t:errors />
- <div>
- <t:label for="connectionLogin" />
- <input t:type="TextField" t:id="connectionLogin" validate="required" />
- </div>
- <div>
- <t:label for="connectionPassword" />
- <input t:type="PasswordField" t:id="connectionPassword" validate="required" />
- </div>
- <div class="buttons">
- <input t:id="submitLoginCompForm" t:type="Submit" t:value="${message:loginSubmit}" />
- </div>
- </fieldset>
- </t:form>
-
-</t:border>
\ No newline at end of file
1
0
Author: fdesbois
Date: 2010-05-06 12:35:53 +0200 (Thu, 06 May 2010)
New Revision: 2987
Url: http://chorem.org/repositories/revision/pollen/2987
Log:
Evo #190 : Finish UserLists page with favoriteList and participant managment. (todo : i18n messages + javadoc)
Added:
trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceFavoriteImpl.java
trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServiceFavoriteImplTest.java
trunk/pollen-ui/src/main/webapp/css/users.css
Removed:
trunk/pollen-ui/src/main/webapp/css/lists.css
Modified:
trunk/pollen-business/src/main/java/org/chorem/pollen/PollenBusinessException.java
trunk/pollen-business/src/main/java/org/chorem/pollen/TopiaQueryBuilder.java
trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceUserImpl.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/business/AbstractServiceTest.java
trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServiceUserImplTest.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsCreate.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsUpdate.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/FavoriteParticipantDataSource.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserLists.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserProfile.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/AppModule.java
trunk/pollen-ui/src/main/resources/i18n/pollen-ui-fr_FR.properties
trunk/pollen-ui/src/main/resources/org/chorem/pollen/ui/components/Border.tml
trunk/pollen-ui/src/main/resources/org/chorem/pollen/ui/components/UserListsCreate.tml
trunk/pollen-ui/src/main/resources/org/chorem/pollen/ui/components/UserListsUpdate.tml
trunk/pollen-ui/src/main/webapp/admin/AdminUsers.tml
trunk/pollen-ui/src/main/webapp/css/common.css
trunk/pollen-ui/src/main/webapp/css/main.css
trunk/pollen-ui/src/main/webapp/user/UserLists.tml
trunk/pollen-ui/src/main/webapp/user/UserProfile.tml
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-04 16:24:31 UTC (rev 2986)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/PollenBusinessException.java 2010-05-06 10:35:53 UTC (rev 2987)
@@ -49,7 +49,19 @@
SMTP_NOT_AVAILABLE(n_("pollen.exception.smtp_not_available")),
/** Exception when favorite list name is already defined for user **/
FAVORITE_LIST_NAME_EXIST(
- n_("pollen.exception.favorite_list_name_exist"));
+ n_("pollen.exception.favorite_list_name_exist")),
+ /**
+ * Exception when favorite participant name ($2) and email ($3) are
+ * already defined for the current list ($1).
+ **/
+ FAVORITE_PARTICIPANT_EXIST(
+ n_("pollen.exception.favorite_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"));
private String message;
Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/TopiaQueryBuilder.java
===================================================================
--- trunk/pollen-business/src/main/java/org/chorem/pollen/TopiaQueryBuilder.java 2010-05-04 16:24:31 UTC (rev 2986)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/TopiaQueryBuilder.java 2010-05-06 10:35:53 UTC (rev 2987)
@@ -4,6 +4,8 @@
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.chorem.pollen.bean.Filter;
import org.nuiton.topia.framework.TopiaQuery;
import org.nuiton.topia.persistence.TopiaDAO;
@@ -28,6 +30,8 @@
*/
public class TopiaQueryBuilder {
+ private static final Log log = LogFactory.getLog(TopiaQueryBuilder.class);
+
protected TopiaQuery query;
public TopiaQueryBuilder() {
@@ -138,6 +142,14 @@
String orderBy = filter.getOrderBy();
String referenceId = filter.getReferenceId();
+ if (log.isDebugEnabled()) {
+ log.debug("Filter added to the query : " +
+ "startIndex = " + startIndex +
+ " _ endIndex = " + endIndex +
+ " _ orderBy = " + orderBy +
+ " _ referenceId = " + referenceId);
+ }
+
// Add limits. Only startIndex do nothing.
// startIndex + endIndex provides the limit
if (filter.getStartIndex() != null && endIndex != null) {
Added: trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceFavoriteImpl.java
===================================================================
--- trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceFavoriteImpl.java (rev 0)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceFavoriteImpl.java 2010-05-06 10:35:53 UTC (rev 2987)
@@ -0,0 +1,280 @@
+package org.chorem.pollen.service;
+
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.chorem.pollen.PollenBusinessException;
+import org.chorem.pollen.PollenBusinessException.PollenExceptionType;
+import org.chorem.pollen.PollenContext;
+import org.chorem.pollen.PollenDAOHelper;
+import org.chorem.pollen.PollenException;
+import org.chorem.pollen.PollenQueryBuilder;
+import org.chorem.pollen.bean.Filter;
+import org.chorem.pollen.entity.FavoriteList;
+import org.chorem.pollen.entity.FavoriteListDAO;
+import org.chorem.pollen.entity.FavoriteListImpl;
+import org.chorem.pollen.entity.FavoriteParticipant;
+import org.chorem.pollen.entity.FavoriteParticipantDAO;
+import org.chorem.pollen.entity.FavoriteParticipantImpl;
+import org.chorem.pollen.entity.UserAccount;
+import org.nuiton.topia.TopiaContext;
+import org.nuiton.topia.TopiaException;
+import org.nuiton.topia.framework.TopiaQuery;
+import org.nuiton.topia.framework.TopiaQuery.Op;
+import org.nuiton.topia.persistence.TopiaEntity;
+
+/**
+ * ServiceFavorite
+ *
+ * Created: 5 mai 2010
+ *
+ * @author fdesbois
+ * $Id$
+ */
+public class ServiceFavoriteImpl extends ServiceFavoriteAbstract {
+
+ private Log log = LogFactory.getLog(ServiceUserImpl.class);
+ private static final String BINDER_CONTEXT_FAVORITE_LIST = "favoriteList";
+ private PollenContext context;
+
+ public void setContext(PollenContext context) {
+ this.context = context;
+ }
+
+ @Override
+ protected TopiaContext beginTransaction() throws TopiaException {
+ return context.beginTransaction();
+ }
+
+ @Override
+ protected void treateError(TopiaContext transaction, Exception eee,
+ String message, Object... args) throws PollenException {
+ context.treateError(transaction, eee, message, args);
+ }
+
+ @Override
+ protected void closeTransaction(TopiaContext transaction) {
+ context.closeTransaction(transaction);
+ }
+
+ @Override
+ protected FavoriteList executeGetNewFavoriteList(UserAccount user) {
+ FavoriteList result = new FavoriteListImpl();
+ result.setUserAccount(user);
+ return result;
+ }
+
+ @Override
+ protected void executeCreateFavoriteList(TopiaContext transaction,
+ FavoriteList list) throws TopiaException, PollenBusinessException {
+
+ FavoriteListDAO dao = PollenDAOHelper.getFavoriteListDAO(transaction);
+
+ // check favoriteList name exist for user
+ UserAccount user = list.getUserAccount();
+ int count = dao.createQuery().
+ add(FavoriteList.USER_ACCOUNT, user).
+ add(FavoriteList.NAME, list.getName()).
+ executeCount();
+ // existing list found
+ if (count > 0) {
+ throw new PollenBusinessException(
+ PollenExceptionType.FAVORITE_LIST_NAME_EXIST,
+ list.getName(), user.getDisplayName());
+ }
+
+ FavoriteList newList = dao.create(
+ FavoriteList.USER_ACCOUNT, list.getUserAccount(),
+ FavoriteList.NAME, list.getName());
+// list.setTopiaId(newList.getTopiaId());
+
+ transaction.commitTransaction();
+ }
+
+ @Override
+ protected void executeDeleteFavoriteList(TopiaContext transaction,
+ FavoriteList list) throws TopiaException {
+ FavoriteListDAO dao = PollenDAOHelper.getFavoriteListDAO(transaction);
+
+ FavoriteList listLoaded = dao.findByTopiaId(list.getTopiaId());
+ dao.delete(listLoaded);
+
+ transaction.commitTransaction();
+ }
+
+ @Override
+ protected List<FavoriteList> executeGetFavoriteLists(
+ TopiaContext transaction, UserAccount user) throws TopiaException {
+
+ FavoriteListDAO dao = PollenDAOHelper.getFavoriteListDAO(transaction);
+
+ List<FavoriteList> results = dao.findAllByUserAccount(user);
+
+ return results;
+ }
+
+ /**
+ * Check if the {@code participant} doesn't already exists with same
+ * email, name and favoriteList.
+ *
+ * @param dao used to verify the existing participant
+ * @param participant FavoriteParticipant to check
+ * @throws PollenBusinessException if FavoriteParticipant already exists
+ * @throws TopiaException for technical errors from ToPIA
+ */
+ protected void checkFavoriteParticipant(FavoriteParticipantDAO dao,
+ FavoriteParticipant participant)
+ throws PollenBusinessException, TopiaException {
+
+ FavoriteList list = participant.getFavoriteList();
+
+ TopiaQuery query = dao.createQuery().
+ add(FavoriteParticipant.FAVORITE_LIST, list).
+ add(FavoriteParticipant.NAME, participant.getName()).
+ add(FavoriteParticipant.EMAIL, participant.getEmail());
+
+ // Check only on entities different from the one in argument
+ if (StringUtils.isNotEmpty(participant.getTopiaId())) {
+ query.add(TopiaEntity.TOPIA_ID, Op.NEQ, participant.getTopiaId());
+ }
+
+ int count = query.executeCount();
+ // existing participant found
+ if (count > 0) {
+ // The error type (message) depends on email nullity
+ if (participant.getEmail() == null) {
+ throw new PollenBusinessException(
+ PollenExceptionType.FAVORITE_PARTICIPANT_EXIST_WITHOUT_EMAIL,
+ list.getName(),
+ participant.getName());
+ } else {
+ throw new PollenBusinessException(
+ PollenExceptionType.FAVORITE_PARTICIPANT_EXIST,
+ list.getName(),
+ participant.getName(),
+ participant.getEmail());
+ }
+ }
+ }
+
+ @Override
+ protected FavoriteParticipant executeGetNewFavoriteParticipant(
+ FavoriteList list) {
+ FavoriteParticipant result = new FavoriteParticipantImpl();
+ result.setFavoriteList(list);
+ result.setWeight(1.);
+ return result;
+ }
+
+ @Override
+ protected void executeCreateFavoriteParticipant(TopiaContext transaction,
+ FavoriteParticipant participant)
+ throws PollenBusinessException, TopiaException {
+
+ FavoriteParticipantDAO dao =
+ PollenDAOHelper.getFavoriteParticipantDAO(transaction);
+
+ checkFavoriteParticipant(dao, participant);
+
+ // Create newParticipant with naturalId
+ FavoriteParticipant newParticipant =
+ dao.create(participant.getName(),
+ participant.getEmail(),
+ participant.getFavoriteList());
+
+ // Set other field
+ newParticipant.setWeight(participant.getWeight());
+
+ transaction.commitTransaction();
+ }
+
+ @Override
+ protected void executeDeleteFavoriteParticipant(TopiaContext transaction,
+ String id) throws TopiaException {
+
+ FavoriteParticipantDAO dao =
+ PollenDAOHelper.getFavoriteParticipantDAO(transaction);
+
+ FavoriteParticipant participantLoaded = dao.findByTopiaId(id);
+
+ dao.delete(participantLoaded);
+
+ transaction.commitTransaction();
+ }
+
+ @Override
+ protected void executeUpdateFavoriteParticipant(TopiaContext transaction,
+ FavoriteParticipant participant)
+ throws TopiaException, PollenBusinessException {
+
+ FavoriteParticipantDAO dao =
+ PollenDAOHelper.getFavoriteParticipantDAO(transaction);
+
+ checkFavoriteParticipant(dao, participant);
+
+ FavoriteParticipant participantLoaded =
+ dao.findByTopiaId(participant.getTopiaId());
+
+ // Set all fields except favoriteList that can't be changed
+ participantLoaded.setName(participant.getName());
+ participantLoaded.setEmail(participant.getEmail());
+ participantLoaded.setWeight(participant.getWeight());
+
+ dao.update(participantLoaded);
+
+ transaction.commitTransaction();
+ }
+
+ @Override
+ protected FavoriteParticipant executeGetFavoriteParticipant(
+ TopiaContext transaction, String id) throws TopiaException {
+
+ FavoriteParticipantDAO dao =
+ PollenDAOHelper.getFavoriteParticipantDAO(transaction);
+
+ FavoriteParticipant result = dao.findByTopiaId(id);
+ // Load parent list
+ result.getFavoriteList();
+
+ return result;
+ }
+
+ @Override
+ protected Map<String, FavoriteParticipant> executeGetFavoriteParticipants(
+ TopiaContext transaction, Filter filter) throws TopiaException {
+
+ PollenQueryBuilder builder = new PollenQueryBuilder();
+
+ TopiaQuery query =
+ builder.createQueryFindFavoriteParticipantsByFavoriteList(filter);
+
+ FavoriteParticipantDAO dao =
+ PollenDAOHelper.getFavoriteParticipantDAO(transaction);
+
+ if (log.isDebugEnabled()) {
+ log.debug("Query : " + query);
+ }
+
+ query.addLoad(FavoriteParticipant.FAVORITE_LIST);
+
+ Map<String, FavoriteParticipant> results =
+ dao.findAllMappedByQuery(query);
+
+ return results;
+ }
+
+ @Override
+ protected int executeGetNbFavoriteParticipants(TopiaContext transaction,
+ Filter filter) throws TopiaException {
+
+ PollenQueryBuilder builder = new PollenQueryBuilder();
+
+ TopiaQuery query =
+ builder.createQueryFindFavoriteParticipantsByFavoriteList(filter);
+
+ int result = query.executeCount(transaction);
+ return result;
+ }
+}
Property changes on: trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceFavoriteImpl.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Modified: trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceUserImpl.java
===================================================================
--- trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceUserImpl.java 2010-05-04 16:24:31 UTC (rev 2986)
+++ trunk/pollen-business/src/main/java/org/chorem/pollen/service/ServiceUserImpl.java 2010-05-06 10:35:53 UTC (rev 2987)
@@ -19,22 +19,18 @@
import org.chorem.pollen.entity.FavoriteParticipant;
import org.chorem.pollen.entity.FavoriteParticipantDAO;
import org.chorem.pollen.entity.FavoriteParticipantImpl;
-import org.chorem.pollen.entity.PollAccount;
-import org.chorem.pollen.EntityQueryProperty;
import org.chorem.pollen.PollenQueryBuilder;
import org.chorem.pollen.TopiaQueryBuilder;
-import org.chorem.pollen.entity.PollAccountDAO;
import org.chorem.pollen.entity.UserAccount;
import org.chorem.pollen.entity.UserAccountDAO;
import org.chorem.pollen.entity.UserAccountImpl;
+import org.nuiton.i18n.I18n;
import org.nuiton.topia.TopiaContext;
import org.nuiton.topia.TopiaException;
import org.nuiton.topia.framework.TopiaQuery;
import org.nuiton.topia.framework.TopiaQuery.Op;
import org.nuiton.topia.persistence.util.TopiaEntityBinder;
import org.nuiton.util.beans.Binder;
-import org.nuiton.util.beans.BinderBuilder;
-import org.nuiton.util.beans.BinderProvider;
/**
* ServiceUserImpl
@@ -51,8 +47,6 @@
private Log log = LogFactory.getLog(ServiceUserImpl.class);
- private static final String BINDER_CONTEXT_FAVORITE_LIST = "favoriteList";
-
private PollenContext context;
public void setContext(PollenContext context) {
@@ -293,152 +287,5 @@
return result;
}
- @Override
- protected FavoriteList executeGetNewFavoriteList(UserAccount user) {
- FavoriteList result = new FavoriteListImpl();
- result.setUserAccount(user);
- return result;
- }
- @Override
- protected void executeCreateFavoriteList(TopiaContext transaction,
- FavoriteList list) throws TopiaException, PollenBusinessException {
-
- FavoriteListDAO dao = PollenDAOHelper.getFavoriteListDAO(transaction);
-
- // check favoriteList name exist for user
- UserAccount user = list.getUserAccount();
- int count = dao.createQuery().
- add(FavoriteList.USER_ACCOUNT, user).
- add(FavoriteList.NAME, list.getName()).
- executeCount();
- // existing list found
- if (count > 0) {
- throw new PollenBusinessException(
- PollenExceptionType.FAVORITE_LIST_NAME_EXIST,
- list.getName(), user.getDisplayName());
- }
-
- FavoriteList newList = dao.create(
- FavoriteList.USER_ACCOUNT, list.getUserAccount(),
- FavoriteList.NAME, list.getName());
-// list.setTopiaId(newList.getTopiaId());
-
- transaction.commitTransaction();
- }
-
- @Override
- protected void executeDeleteFavoriteList(TopiaContext transaction,
- FavoriteList list) throws TopiaException {
- throw new UnsupportedOperationException("Not supported yet.");
- }
-
- @Override
- protected List<FavoriteList> executeGetFavoriteLists(
- TopiaContext transaction, UserAccount user) throws TopiaException {
-
- FavoriteListDAO dao = PollenDAOHelper.getFavoriteListDAO(transaction);
-
- List<FavoriteList> results = dao.findAllByUserAccount(user);
-
- return results;
- }
-
- @Override
- protected FavoriteParticipant executeGetNewFavoriteParticipant(
- TopiaContext transaction, FavoriteList list)
- throws TopiaException {
- FavoriteParticipant result = new FavoriteParticipantImpl();
- result.setFavoriteList(list);
- result.setWeight(1.);
- return result;
- }
-
- @Override
- protected void executeCreateFavoriteParticipant(TopiaContext transaction,
- FavoriteParticipant participant)
- throws PollenBusinessException, TopiaException {
-
- FavoriteParticipantDAO dao =
- PollenDAOHelper.getFavoriteParticipantDAO(transaction);
-
- FavoriteList list = participant.getFavoriteList();
-// int count = dao.createQuery().
-// add(FavoriteParticipant.FAVORITE_LIST, list).
-// add(FavoriteParticipant.NAME, participant.getName()).
-// add(FavoriteParticipant.EMAIL, participant.getEmail()).
-// executeCount();
-// // existing participant found
-// if (count > 0) {
-// throw new PollenBusinessException(
-// PollenExceptionType.FAVORITE_PARTICIPANT_EXIST,
-// list.getName(), list.getName());
-// }
-
- // Create newParticipant with naturalId
- FavoriteParticipant newParticipant =
- dao.create(FavoriteParticipant.FAVORITE_LIST, list,
- FavoriteParticipant.NAME, participant.getName(),
- FavoriteParticipant.EMAIL, participant.getEmail());
-
- // Set other field
- newParticipant.setWeight(participant.getWeight());
-
- // Update input participant with new topiaId
-// participant.setTopiaId(newParticipant.getTopiaId());
-
- transaction.commitTransaction();
- }
-
- @Override
- protected void executeDeleteFavoriteParticipant(TopiaContext transaction,
- FavoriteParticipant participant) {
- throw new UnsupportedOperationException("Not supported yet.");
- }
-
- @Override
- protected void executeUpdateFavoriteParticipant(TopiaContext transaction,
- FavoriteParticipant participant) {
- throw new UnsupportedOperationException("Not supported yet.");
- }
-
- @Override
- protected Map<String, FavoriteParticipant> executeGetFavoriteParticipants(
- TopiaContext transaction, Filter filter) throws TopiaException {
-
- PollenQueryBuilder builder = new PollenQueryBuilder();
-
- TopiaQuery query =
- builder.createQueryFindFavoriteParticipantsByFavoriteList(filter);
-
- FavoriteParticipantDAO dao =
- PollenDAOHelper.getFavoriteParticipantDAO(transaction);
-
- if (log.isDebugEnabled()) {
- log.debug("Query : " + query);
- }
-
- Map<String, FavoriteParticipant> results =
- dao.findAllMappedByQuery(query);
-
- if (log.isDebugEnabled()) {
- log.debug("Results : " + results);
- }
-
- return results;
- }
-
- @Override
- protected int executeGetNbFavoriteParticipants(TopiaContext transaction,
- Filter filter) throws TopiaException {
-
- PollenQueryBuilder builder = new PollenQueryBuilder();
-
- TopiaQuery query =
- builder.createQueryFindFavoriteParticipantsByFavoriteList(filter);
-
- int result = query.executeCount(transaction);
- return result;
- }
-
}
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-04 16:24:31 UTC (rev 2986)
+++ trunk/pollen-business/src/main/resources/i18n/pollen-business-en_GB.properties 2010-05-06 10:35:53 UTC (rev 2987)
@@ -7,6 +7,17 @@
pollen.error.encodePassword=
pollen.error.serviceEmail.getNewEmail=
pollen.error.serviceEmail.sendEmail=
+pollen.error.serviceFavorite.createFavoriteList=
+pollen.error.serviceFavorite.createFavoriteParticipant=
+pollen.error.serviceFavorite.deleteFavoriteList=
+pollen.error.serviceFavorite.deleteFavoriteParticipant=
+pollen.error.serviceFavorite.getFavoriteLists=
+pollen.error.serviceFavorite.getFavoriteParticipant=
+pollen.error.serviceFavorite.getFavoriteParticipants=
+pollen.error.serviceFavorite.getNbFavoriteParticipants=
+pollen.error.serviceFavorite.getNewFavoriteList=
+pollen.error.serviceFavorite.getNewFavoriteParticipant=
+pollen.error.serviceFavorite.updateFavoriteParticipant=
pollen.error.serviceList.createAccountForPersonList=
pollen.error.serviceList.deleteAccountFromPersonList=
pollen.error.serviceMail.sendEmail=
@@ -65,6 +76,8 @@
pollen.error.serviceVote.getVotesByPoll=Unable to load votes from poll with uid \= %1$s
pollen.error.serviceVote.hasAlreadyVoted=Unable test vote existing for account with votingId \= %1$s and poll with uid \= %2$s
pollen.exception.favorite_list_name_exist=
+pollen.exception.favorite_participant_exist=
+pollen.exception.favorite_participant_exist_without_email=
pollen.exception.load_configuration=
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=
@@ -77,3 +90,4 @@
pollen.info.start=Start Pollen
pollen.info.started=Pollen is started \!
pollen.info.stop=Stop Pollen
+pollen.text.empty=
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-04 16:24:31 UTC (rev 2986)
+++ trunk/pollen-business/src/main/resources/i18n/pollen-business-fr_FR.properties 2010-05-06 10:35:53 UTC (rev 2987)
@@ -7,6 +7,17 @@
pollen.error.encodePassword=
pollen.error.serviceEmail.getNewEmail=
pollen.error.serviceEmail.sendEmail=
+pollen.error.serviceFavorite.createFavoriteList=
+pollen.error.serviceFavorite.createFavoriteParticipant=
+pollen.error.serviceFavorite.deleteFavoriteList=
+pollen.error.serviceFavorite.deleteFavoriteParticipant=
+pollen.error.serviceFavorite.getFavoriteLists=
+pollen.error.serviceFavorite.getFavoriteParticipant=
+pollen.error.serviceFavorite.getFavoriteParticipants=
+pollen.error.serviceFavorite.getNbFavoriteParticipants=
+pollen.error.serviceFavorite.getNewFavoriteList=
+pollen.error.serviceFavorite.getNewFavoriteParticipant=
+pollen.error.serviceFavorite.updateFavoriteParticipant=
pollen.error.serviceList.createAccountForPersonList=
pollen.error.serviceList.deleteAccountFromPersonList=
pollen.error.serviceMail.sendEmail=Erreur lors de l'envoi de l'email sur le serveur %1$s\:%2$d pour %3$s de la part de %4$s
@@ -64,6 +75,8 @@
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.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.
Modified: trunk/pollen-business/src/main/xmi/pollen.properties
===================================================================
--- trunk/pollen-business/src/main/xmi/pollen.properties 2010-05-04 16:24:31 UTC (rev 2986)
+++ trunk/pollen-business/src/main/xmi/pollen.properties 2010-05-06 10:35:53 UTC (rev 2987)
@@ -12,7 +12,8 @@
org.chorem.pollen.entity.FavoriteList.attribute.userAccount.tagvalue.naturalId=true
org.chorem.pollen.entity.FavoriteList.attribute.name.tagvalue.naturalId=true
+org.chorem.pollen.entity.FavoriteParticipant.class.tagvalue.naturalIdMutable=true
org.chorem.pollen.entity.FavoriteParticipant.attribute.favoriteList.tagvalue.naturalId=true
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
\ No newline at end of file
+org.chorem.pollen.entity.FavoriteParticipant.attribute.email.tagvalue.notNull=false
Modified: trunk/pollen-business/src/main/xmi/pollen.zargo
===================================================================
(Binary files differ)
Modified: trunk/pollen-business/src/test/java/org/chorem/pollen/business/AbstractServiceTest.java
===================================================================
--- trunk/pollen-business/src/test/java/org/chorem/pollen/business/AbstractServiceTest.java 2010-05-04 16:24:31 UTC (rev 2986)
+++ trunk/pollen-business/src/test/java/org/chorem/pollen/business/AbstractServiceTest.java 2010-05-06 10:35:53 UTC (rev 2987)
@@ -12,8 +12,13 @@
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.ServiceUserImpl;
import org.junit.After;
import org.junit.Ignore;
@@ -41,6 +46,8 @@
protected ServiceUserImpl serviceUser;
+ protected ServiceFavoriteImpl serviceFavorite;
+
public void start(String dbname) throws IOException {
log.info("## START ## : " + dbname);
@@ -87,6 +94,14 @@
return serviceUser;
}
+ public ServiceFavoriteImpl getServiceFavorite() {
+ if (serviceFavorite == null) {
+ serviceFavorite = new ServiceFavoriteImpl();
+ serviceFavorite.setContext(getContext());
+ }
+ return serviceFavorite;
+ }
+
public TopiaContext beginTransaction() throws TopiaException {
return getContext().beginTransaction();
}
@@ -140,4 +155,35 @@
}
}
+ 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();
+ }
+ }
+
}
Added: trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServiceFavoriteImplTest.java
===================================================================
--- trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServiceFavoriteImplTest.java (rev 0)
+++ trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServiceFavoriteImplTest.java 2010-05-06 10:35:53 UTC (rev 2987)
@@ -0,0 +1,109 @@
+
+package org.chorem.pollen.service;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+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.entity.FavoriteList;
+import org.chorem.pollen.entity.FavoriteParticipant;
+import org.chorem.pollen.entity.FavoriteParticipantDAO;
+import org.chorem.pollen.entity.UserAccount;
+import org.junit.Assert;
+import org.junit.Test;
+import org.nuiton.topia.TopiaContext;
+
+/**
+ * ServiceFavoriteImplTest
+ *
+ * Created: 5 mai 2010
+ *
+ * @author fdesbois
+ * $Id$
+ */
+public class ServiceFavoriteImplTest extends AbstractServiceTest {
+
+ private static final Log log = LogFactory.getLog(ServiceUserImplTest.class);
+
+ @Test
+ public void testCreateFavoriteParticipant() throws Exception {
+ start("testCreateFavoriteParticipant");
+
+ UserAccount user = createUser(false);
+
+ final FavoriteList list = createFavoriteList("LIST", user);
+
+ log.info("test 1 : no problem on creation");
+ FavoriteParticipant participant =
+ getServiceFavorite().getNewFavoriteParticipant(list);
+
+ participant.setName("participant");
+ participant.setEmail("email");
+
+ getServiceFavorite().createFavoriteParticipant(participant);
+
+ log.info("test 2 : problem on naturalId : participant already" +
+ " set with same email");
+
+ participant =
+ getServiceFavorite().getNewFavoriteParticipant(list);
+
+ participant.setName("participant");
+ participant.setEmail("email");
+
+ try {
+ getServiceFavorite().createFavoriteParticipant(participant);
+ } catch (PollenBusinessException eee) {
+ Assert.assertEquals(PollenExceptionType.FAVORITE_PARTICIPANT_EXIST,
+ eee.getType());
+ }
+
+ log.info("test 3 : email in naturalId can be null");
+
+ participant =
+ getServiceFavorite().getNewFavoriteParticipant(list);
+
+ participant.setName("participant2");
+ participant.setEmail(null);
+
+ getServiceFavorite().createFavoriteParticipant(participant);
+
+ TopiaContext transaction = beginTransaction();
+ try {
+ FavoriteParticipantDAO dao =
+ PollenDAOHelper.getFavoriteParticipantDAO(transaction);
+ String email = null;
+
+ FavoriteParticipant result = dao.findByProperties(
+ FavoriteParticipant.NAME, "participant2",
+ FavoriteParticipant.EMAIL, email,
+ FavoriteParticipant.FAVORITE_LIST, list);
+
+ Assert.assertNotNull(result);
+ } finally {
+ transaction.closeContext();
+ }
+ }
+
+ @Test
+ public void testUpdateFavoriteParticipant() throws Exception {
+ start("testUpdateFavoriteParticipant");
+
+ /** PREPARE DATA **/
+ UserAccount user = createUser(false);
+
+ FavoriteList list = createFavoriteList("LIST", user);
+ FavoriteParticipant participant =
+ createFavoriteParticipant("participant", null, list);
+
+ /** EXEC METHOD **/
+ log.info("test 1 : update ok : add email");
+ participant.setEmail("email");
+ participant.setWeight(1.);
+
+ getServiceFavorite().updateFavoriteParticipant(participant);
+ }
+
+}
Property changes on: trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServiceFavoriteImplTest.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-04 16:24:31 UTC (rev 2986)
+++ trunk/pollen-business/src/test/java/org/chorem/pollen/service/ServiceUserImplTest.java 2010-05-06 10:35:53 UTC (rev 2987)
@@ -8,12 +8,17 @@
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.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;
/**
*
@@ -42,7 +47,7 @@
log.info("test 2 : Do not encode new password -> newPassword empty");
user.setPassword(expected);
user.setNewPassword(null);
- serviceUser.copyUserAccount(user, destination);
+ getServiceUser().copyUserAccount(user, destination);
Assert.assertEquals(expected, destination.getPassword());
}
@@ -62,11 +67,11 @@
UserAccountDAO dao = PollenDAOHelper.getUserAccountDAO(transaction);
log.info("test 1 : Good password");
- serviceUser.checkPassword(dao, "homer", encodedPassword);
+ getServiceUser().checkPassword(dao, "homer", encodedPassword);
log.info("test 2 : Wrong password");
try {
- serviceUser.checkPassword(dao, "homer", "bad");
+ getServiceUser().checkPassword(dao, "homer", "bad");
} catch (PollenBusinessException eee) {
log.error("Error : " + eee.getMessage());
Assert.assertEquals(PollenExceptionType.USER_WRONG_PASSWORD,
@@ -264,14 +269,4 @@
}
}
- @Test
- public void testCreateFavoriteParticipant() throws Exception {
- start("testCreateFavoriteParticipant");
-
- UserAccount user = createUser(false);
-
- // TODO : test on naturalId and nullity
-
- }
-
}
\ No newline at end of file
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsCreate.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsCreate.java 2010-05-04 16:24:31 UTC (rev 2986)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsCreate.java 2010-05-06 10:35:53 UTC (rev 2987)
@@ -11,7 +11,7 @@
import org.chorem.pollen.PollenBusinessException;
import org.chorem.pollen.PollenBusinessException.PollenExceptionType;
import org.chorem.pollen.entity.FavoriteList;
-import org.chorem.pollen.service.ServiceUser;
+import org.chorem.pollen.service.ServiceFavorite;
import org.chorem.pollen.ui.base.PollenPage;
import org.chorem.pollen.ui.services.PollenManager;
import org.slf4j.Logger;
@@ -40,7 +40,7 @@
private PollenManager manager;
@Inject
- private ServiceUser serviceUser;
+ private ServiceFavorite serviceFavorite;
/** Properties **/
@Property
@@ -63,13 +63,13 @@
logger.debug("User connected : " + page.getUserConnected());
}
newFavoriteList =
- serviceUser.getNewFavoriteList(page.getUserConnected());
+ serviceFavorite.getNewFavoriteList(page.getUserConnected());
}
}
void onValidateFormFromCreateList() {
try {
- serviceUser.createFavoriteList(newFavoriteList);
+ serviceFavorite.createFavoriteList(newFavoriteList);
} catch (PollenBusinessException eee) {
String message = manager.getErrorMessage(eee, messages, logger);
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsUpdate.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsUpdate.java 2010-05-04 16:24:31 UTC (rev 2986)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/UserListsUpdate.java 2010-05-06 10:35:53 UTC (rev 2987)
@@ -1,21 +1,24 @@
package org.chorem.pollen.ui.components;
-import java.util.List;
-import org.apache.tapestry5.ComponentResources;
+import org.apache.commons.lang.StringUtils;
import org.apache.tapestry5.annotations.InjectComponent;
+import org.apache.tapestry5.annotations.Log;
import org.apache.tapestry5.annotations.Parameter;
-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.Zone;
+import org.apache.tapestry5.ioc.Messages;
import org.apache.tapestry5.ioc.annotations.Inject;
+import org.chorem.pollen.PollenBusinessException;
import org.chorem.pollen.bean.Filter;
import org.chorem.pollen.entity.FavoriteList;
import org.chorem.pollen.entity.FavoriteParticipant;
-import org.chorem.pollen.entity.PollAccount;
-import org.chorem.pollen.service.ServiceUser;
+import org.chorem.pollen.service.ServiceFavorite;
import org.chorem.pollen.ui.data.EvenOdd;
import org.chorem.pollen.ui.data.FavoriteParticipantDataSource;
+import org.chorem.pollen.ui.services.PollenManager;
+import org.nuiton.web.tapestry5.components.FeedBack;
import org.slf4j.Logger;
/**
@@ -31,41 +34,34 @@
*/
public class UserListsUpdate {
+ /** Parameters of the component **/
@Parameter(required = true)
- @Property
- private List<PollAccount> source;
+ private FavoriteList source;
+ /** Services injected **/
@Inject
private Logger logger;
@Inject
- private ComponentResources resources;
+ private ServiceFavorite serviceFavorite;
@Inject
- private ServiceUser serviceUser;
+ private PollenManager manager;
- @Persist
- @Property
- private FavoriteList favoriteListSelected;
+ @Inject
+ private Messages messages;
+ /** Main properties for Grid **/
private EvenOdd evenOdd;
- @Persist
private FavoriteParticipantDataSource participants;
@Property
private FavoriteParticipant participant;
- @Property
- private FavoriteParticipant newParticipant;
-
@InjectComponent
private Zone updateZone;
- void setupRender() {
- resources.discardPersistentFieldChanges();
- }
-
public EvenOdd getEvenOdd() {
if (evenOdd == null) {
evenOdd = new EvenOdd();
@@ -74,35 +70,215 @@
}
public boolean canDisplayAccounts() {
- return favoriteListSelected != null;
+ return source != null;
}
+ /**
+ * Load participants data from serviceFavorite in a
+ * {@link FavoriteParticipantDataSource} to manage pagination and order.
+ * The filter added contains data for serviceFavorite (startIndex, endIndex,
+ * orderBy and referenceId). The reference is set to the source FavoriteList
+ * of the component, i.e. all FavoriteParticipants need to be part of the
+ * FavoriteList source.
+ *
+ * @return
+ */
public FavoriteParticipantDataSource getParticipants() {
if (participants == null) {
if (logger.isDebugEnabled()) {
logger.debug("Create DATASOURCE");
}
Filter filter = new Filter();
- filter.setReference(favoriteListSelected);
+ filter.setReference(source);
participants =
- new FavoriteParticipantDataSource(serviceUser, filter);
+ new FavoriteParticipantDataSource(serviceFavorite, filter);
}
return participants;
}
- void onActionFromRemoveParticipant(String UId) {
- // NEED DELETE ACCOUNT FOR LIST
+ /***************************** EDIT PARTICIPANT FORM **********************/
+
+ /**
+ * FORM EVENTS ORDER -> RENDER :
+ * load size of participants dataSource
+ * call prepareForRender
+ * load participants data
+ *
+ * FORM EVENTS ORDER -> SUBMIT :
+ * call prepareForSubmit
+ * load size of participants dataSource
+ * load participants data
+ * load participantEdited to push form data
+ * call selected on submit button
+ * call validateForm
+ * call success or failure
+ * call submit
+ */
+
+ @InjectComponent
+ private Form participantsForm;
+
+ @InjectComponent
+ private FeedBack participantsFeedback;
+
+ private FavoriteParticipant participantEdited;
+
+ @Property
+ private String participantEditedId;
+
+ /**
+ * Test if the edited participant is the current one in the Grid.
+ *
+ * @return true if the participantEdited is defined and correspond to the
+ * current participant in the Grid
+ */
+ public boolean isEditionMode() {
+ // The current participant in the loop is equals to the edited one
+ return participantEditedId != null &&
+ participant.getId().equals(participantEditedId);
}
+ /**
+ * ON_ACTION :: Handler method for action on editParticipant actionLink.
+ * The participantEdited will be set to the participant selected in the Grid
+ * with {@code id}.
+ *
+ * @param id key of the participant from the Grid
+ * @return the updateZone content to refresh
+ */
+ Object onActionFromEditParticipant(String id) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Participant in edition : " + id);
+ }
+ participantEditedId = id;
+ return updateZone.getBody();
+ }
+
+ /**
+ * ON_ACTION :: Handler method for action on cancelEdition actionLink.
+ * Simply refresh the zone will change edition mode.
+ *
+ * @return the updateZone content to refresh
+ */
+ Object onActionFromCancelEdition() {
+ return updateZone.getBody();
+ }
+
+ /**
+ * ON_ACTION :: Handler method for action on deletedAccount actionLink.
+ * The selected login from the Grid will be used to delete the user.
+ *
+ * @param login used to delete the user
+ * @return the updateZone content to refresh
+ * @see ServiceUser#deleteUser(String)
+ */
+ Object onActionFromRemoveParticipant(String id) {
+ serviceFavorite.deleteFavoriteParticipant(id);
+ participantsFeedback.addInfo("Suppression OK");
+ return updateZone;
+ }
+
+ /**
+ * Getter to retrieve participantEdited.
+ * <br \>
+ * The participantEditedId is needed and was provided for render by the
+ * {@link #onActionFromEditParticipant(String)} method and for submit by
+ * the hidden field in the form that keep the id after rendering the form.
+ * The participantEdited is loaded from the participants dataSource that
+ * contains all FavoriteParticipant displayed in the Grid. The submit will
+ * reload the participants dataSource before saving modification on the
+ * FavoriteParticipant edited.
+ *
+ * @return the FavoriteParticipant in edition
+ */
+ public FavoriteParticipant getParticipantEdited() {
+ if (participantEdited == null && participantEditedId != null) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Load from dataSource participantEditedId : " +
+ participantEditedId);
+ }
+ participantEdited = participants.get(participantEditedId);
+ }
+ return participantEdited;
+ }
+
+ /**
+ * ON_VALIDATE_FORM :: Handler method for validateForm event of the
+ * usersForm. The accountEdited will be updated using serviceUser. Errors
+ * from service will be recorded into the usersForm.
+ *
+ * @see ServiceUser#updateUser(UserAccount, boolean)
+ */
+ @Log
+ void onValidateFormFromParticipantsForm() {
+ if (logger.isDebugEnabled()) {
+ logger.debug("participant saved : " + participantEdited);
+ }
+ try {
+ serviceFavorite.updateFavoriteParticipant(participantEdited);
+ } catch (PollenBusinessException eee) {
+ String message = manager.getErrorMessage(eee, messages, logger);
+ participantsForm.recordError(message);
+ }
+ }
+
+ /**
+ * ON_SUCCESS :: Handler method for success event of the participantsForm.
+ * Refresh the page to display a success message.
+ *
+ * @return the page container.
+ */
+ Object onSuccessFromParticipantsForm() {
+ participantsFeedback.addInfo("Modification OK");
+ // Clean form data before refresh zone
+ cleanFormData();
+ return updateZone;
+ }
+
+ protected void cleanFormData() {
+ participantEditedId = null;
+ participantEdited = null;
+ }
+
+ /**
+ * ON_FAILURE :: Handler method for failure event of the participantsForm.
+ * Will display errors and keep participantEdited in edition.
+ *
+ * @return the updateZone to refresh
+ */
+ Object onFailureFromParticipantsForm() {
+ return updateZone;
+ }
+
+ /***************************** NEW PARTICIPANT FORM ***********************/
+
+ @Property
+ private FavoriteParticipant newParticipant;
+
+ @InjectComponent
+ private Form addParticipant;
+
void onPrepareFromAddParticipant() {
if (newParticipant == null) {
newParticipant =
- serviceUser.getNewFavoriteParticipant(favoriteListSelected);
+ serviceFavorite.getNewFavoriteParticipant(source);
}
}
- Object onSuccessFromAddParticipant() {
- serviceUser.createFavoriteParticipant(newParticipant);
- return updateZone.getBody();
+ void onValidateFormFromAddParticipant() {
+ if (logger.isDebugEnabled()) {
+ logger.debug("FavoriteList selected : " + source);
+ }
+ try {
+ serviceFavorite.createFavoriteParticipant(newParticipant);
+ } catch (PollenBusinessException eee) {
+ String message = manager.getErrorMessage(eee, messages, logger);
+ addParticipant.recordError(message);
+ }
}
+
+ Object onSubmitFromAddParticipant() {
+ participantsFeedback.addInfo("Ajout OK");
+ return updateZone;
+ }
}
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/FavoriteParticipantDataSource.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/FavoriteParticipantDataSource.java 2010-05-04 16:24:31 UTC (rev 2986)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/FavoriteParticipantDataSource.java 2010-05-06 10:35:53 UTC (rev 2987)
@@ -6,8 +6,7 @@
import org.chorem.pollen.PollenException;
import org.chorem.pollen.bean.Filter;
import org.chorem.pollen.entity.FavoriteParticipant;
-import org.chorem.pollen.entity.PollAccount;
-import org.chorem.pollen.service.ServiceUser;
+import org.chorem.pollen.service.ServiceFavorite;
import org.nuiton.web.tapestry5.data.AbstractMappedGridDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -29,11 +28,12 @@
private static final Logger logger =
LoggerFactory.getLogger(FavoriteParticipantDataSource.class);
- private ServiceUser service;
+ private ServiceFavorite service;
private Filter filter;
- public FavoriteParticipantDataSource(ServiceUser service, Filter filter) {
+ public FavoriteParticipantDataSource(ServiceFavorite service,
+ Filter filter) {
this.service = service;
this.filter = filter;
}
@@ -53,12 +53,16 @@
@Override
protected int count() throws PollenException {
- return service.getNbFavoriteParticipants(filter);
+ int count = service.getNbFavoriteParticipants(filter);
+ if (logger.isDebugEnabled()) {
+ logger.debug("Nb elements : " + count);
+ }
+ return count;
}
@Override
public Class<?> getRowType() {
- return PollAccount.class;
+ return FavoriteParticipant.class;
}
}
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserLists.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserLists.java 2010-05-04 16:24:31 UTC (rev 2986)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserLists.java 2010-05-06 10:35:53 UTC (rev 2987)
@@ -22,13 +22,16 @@
import org.apache.tapestry5.annotations.IncludeStylesheet;
import org.apache.tapestry5.annotations.InjectComponent;
import org.apache.tapestry5.annotations.Parameter;
+import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.ioc.annotations.Inject;
+import org.apache.tapestry5.ioc.services.PropertyAccess;
import org.chorem.pollen.entity.FavoriteList;
-import org.chorem.pollen.service.ServiceUser;
+import org.chorem.pollen.service.ServiceFavorite;
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.GenericSelectModel;
import org.chorem.pollen.ui.data.PollenRequiresAuthentication;
/**
@@ -41,276 +44,67 @@
* @version $Id$
*/
@PollenRequiresAuthentication
-@IncludeStylesheet("context:css/lists.css")
+@IncludeStylesheet("context:css/users.css")
public class UserLists extends AbstractPollenPage {
@InjectComponent
private Border border;
+ @Override
+ public Border getBorder() {
+ return border;
+ }
+
/** Page title from Messages **/
@Parameter(defaultPrefix = BindingConstants.MESSAGE,
value = "pollen.page.UserLists.title")
@Property
private String title;
+ public AddressBar getAddressBar() {
+ return AddressBar.newBar().appendCurrent(title);
+ }
+
@Inject
- private ServiceUser serviceUser;
+ private ServiceFavorite serviceFavorite;
+ @Inject
+ private PropertyAccess propertyAccess;
+
private List<FavoriteList> favoriteLists;
+ private GenericSelectModel<FavoriteList> favoriteListModel;
- @Override
- public Border getBorder() {
- return border;
+ @Persist
+ @Property
+ private FavoriteList favoriteListSelected;
+
+ public GenericSelectModel<FavoriteList> getFavoriteListModel() {
+ if (favoriteListModel == null) {
+ favoriteListModel =
+ new GenericSelectModel<FavoriteList>(getFavoriteLists(),
+ FavoriteList.class,
+ FavoriteList.NAME,
+ FavoriteList.NAME,
+ propertyAccess);
+ }
+ return favoriteListModel;
}
-
- public AddressBar getAddressBar() {
- return AddressBar.newBar().appendCurrent(title);
- }
public List<FavoriteList> getFavoriteLists() {
if (favoriteLists == null) {
- favoriteLists = serviceUser.getFavoriteLists(getUserConnected());
+ favoriteLists = serviceFavorite.getFavoriteLists(getUserConnected());
}
return favoriteLists;
}
-
-//
-// /**
-// * Liste de favoris sélectionnée.
-// */
-// @Persist
-// @Property
-// private PersonListDTO selectedList;
+ public boolean canDeleteList() {
+ return favoriteListSelected != null;
+ }
-// /**
-// * Nouvelle liste de favoris.
-// */
-// @Property
-// private PersonListDTO newList;
-//
-// /**
-// * Compte courant (pour l'itération des votants de la liste).
-// */
-// @SuppressWarnings("unused")
-// @Property
-// private PollAccountDTO account;
-//
-// /**
-// * Nouveau compte.
-// */
-// @Property
-// private PollAccountDTO newAccount;
-//
-// /**
-// * Fichier CSV contenant une liste de votants.
-// */
-// @Property
-// private UploadedFile accountsFile;
-//
-// /**
-// * URL de recherche LDAP pour une liste de votants.
-// */
-// @Property
-// private String accountsUrl;
-//
-// /**
-// * Zone à rafraîchir.
-// */
-// @InjectComponent
-// private Zone listsZone;
-//
-// /**
-// * Formulaire de création de liste.
-// */
-// @Component
-// private Form createListForm;
-//
-// /**
-// * Formulaire de création de compte.
-// */
-// @Component
-// private Form createAccountForm;
-//
-// /**
-// * Messages.
-// */
-// @Inject
-// private Messages messages;
-//
-// /**
-// * Objet servant à changer la couleur à chaque ligne de la liste.
-// */
-// @SuppressWarnings("unused")
-//
-// @Parameter(defaultPrefix = BindingConstants.MESSAGE, value = "title")
-// @Property
-// private String title;
-//
-// @SuppressWarnings("unused")
-// @Property
-// private AddressBarItem[] address;
-//
-// /**
-// * Sert à créer listModel.
-// */
-// @Inject
-// private BeanModelSource beanModelSource;
-//
-// /**
-// * Sert à passer les messages en paramètre de la création de listModel.
-// */
-// @Inject
-// private ComponentResources componentResources;
-//
-// /**
-// * Modèle pour l'affichage de la liste des favoris.
-// */
-// @SuppressWarnings("unchecked")
-// @Property
-// @Retain
-// private BeanModel listModel;
-//
-// /** Injection des services */
-// @Inject
-// private ServiceList serviceList;
-// @Inject
-// private ServicePollAccount servicePollAccount;
-//
-// /**
-// * Méthode appelée à la création d'une liste.
-// */
-// Object onSuccessFromCreateListForm() {
-//
-// // Contrôle du nom de la liste
-// for (PersonListDTO list : lists) {
-// if (list.getName().equals(newList.getName())) {
-// createListForm.recordError(messages.format("listExists",
-// newList.getName()));
-// return this;
-// }
-// }
-//
-// // Import CVS des comptes
-// if (accountsFile != null) {
-// if (!accountsFile.getContentType().equals("text/csv")) {
-// createListForm.recordError(messages.format("invalidCsv",
-// accountsFile.getFileName()));
-// return this;
-// }
-// List<PollAccountDTO> accounts = CSVAccountUtil
-// .importList(accountsFile);
-// if (accounts.size() == 0) {
-// createListForm.recordError(messages.format("noAccountCsv",
-// accountsFile.getFileName()));
-// return this;
-// }
-// newList.getPollAccounts().addAll(accounts);
-// }
-//
-// // Import LDAP des comptes
-// if (accountsUrl != null) {
-// List<PollAccountDTO> accounts = LDAPAccountUtil
-// .importList(accountsUrl);
-// if (accounts.size() == 0) {
-// createListForm.recordError(messages.format("noAccountLdap",
-// accountsUrl));
-// return this;
-// }
-// newList.getPollAccounts().addAll(accounts);
-// }
-//
-// // Création de la nouvelle liste
-// newList.setUserId(user.getId());
-// newList.setId(serviceList.createPersonList(newList));
-//
-// // Sélection de la liste courante
-// lists = serviceList.findPersonListByUser(user.getId());
-// for (PersonListDTO list : lists) {
-// if (list.getId().equals(newList.getId())) {
-// selectedList = list;
-// }
-// }
-//
-// return this;
-// }
-//
-// /**
-// * Méthode appelée à la suppression d'une liste.
-// */
-// Object onActionFromDeleteList() {
-// if (selectedList != null) {
-// for (PersonListDTO dto : lists) {
-// if (dto.getId().equals(selectedList.getId())) {
-// if (serviceList.deletePersonList(selectedList.getId())) {
-// feedback.addInfo(messages.format("listDeleted",
-// selectedList.getName()));
-// } else {
-// feedback.addError(messages.format("listNotDeleted",
-// selectedList.getName()));
-// }
-// }
-// }
-// }
-// selectedList = null;
-// return this;
-// }
-//
-// /**
-// * Méthode appelée à la création d'un compte.
-// */
-// Object onSuccessFromCreateAccountForm() {
-// // TODO : use onValidateForm method : test return block, may be
-// // a problem between failure and success
-// for (PollAccountDTO dto : selectedList.getPollAccounts()) {
-// if (dto.getVotingId().equals(newAccount.getVotingId())) {
-// createAccountForm.recordError(messages.format("accountExists",
-// newAccount.getVotingId()));
-// }
-// }
-// if (!createAccountForm.getHasErrors()) {
-//// newAccount.setPersonListId(selectedList.getId());
-//// selectedList.getPollAccounts().add(newAccount);
-//// serviceList.updatePersonList(selectedList);
-//// selectedList = serviceList.findPersonListById(selectedList.getId());
-// serviceList.createAccountInPersonList(selectedList, account);
-// }
-// return listsZone.getBody();
-// }
-//
-// /**
-// * Méthode appelée à la suppression d'un compte.
-// */
-// Object onActionFromDeleteAccount(String accountId) {
-//// Iterator<PollAccountDTO> it = selectedList.getPollAccounts()
-//// .iterator();
-//// while (it.hasNext()) {
-//// if (accountId.equals(it.next().getId())) {
-//// it.remove();
-//// }
-//// }
-//// serviceList.updatePersonList(selectedList);
-//// servicePollAccount.deletePollAccount(accountId);
-//// selectedList = serviceList.findPersonListById(selectedList.getId());
-// serviceList.deleteAccountFromPersonList(selectedList, accountId);
-// return listsZone.getBody();
-// }
-//
-// /**
-// * Récupération des exceptions du champs d'upload de fichier.
-// */
-// Object onUploadException(FileUploadException ex) {
-// createListForm.recordError("Upload exception: " + ex.getMessage());
-// return this;
-// }
-//
-// /** Retourne vrai s'il n'existe aucune liste */
-// public boolean isListsNull() {
-// return CollectionUtils.isEmpty(lists);
-// }
-//
-// /** Retourne vrai si la liste sélectionnée est vide */
-// public boolean isSelectedListNull() {
-// return selectedList == null;
-// }
+ void onActionFromDeleteList() {
+ if (canDeleteList()) {
+ serviceFavorite.deleteFavoriteList(favoriteListSelected);
+ addInfo("Suppression OK");
+ }
+ }
}
\ No newline at end of file
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserProfile.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserProfile.java 2010-05-04 16:24:31 UTC (rev 2986)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserProfile.java 2010-05-06 10:35:53 UTC (rev 2987)
@@ -100,7 +100,7 @@
/**
* UserAccount for form edition
*/
- private UserAccount userEditable;
+ private UserAccount user;
@Inject
private Locale currentLocale;
@@ -123,11 +123,11 @@
@Property
private String passwordVerify;
- public UserAccount getUserEditable() {
- if (userEditable == null) {
- userEditable = getUserConnected();
+ public UserAccount getUser() {
+ if (user == null) {
+ user = getUserConnected();
}
- return userEditable;
+ return user;
}
/**
@@ -141,7 +141,7 @@
@Log
void onValidateFormFromAccountForm() {
// Check newPassword that must be equals to passwordVerify
- String newPassword = userEditable.getNewPassword();
+ String newPassword = user.getNewPassword();
if (StringUtils.isNotEmpty(newPassword) &&
!newPassword.equals(passwordVerify)) {
accountForm.recordError(newPasswordField,
@@ -152,12 +152,12 @@
try {
// Update the user
if (logger.isDebugEnabled()) {
- logger.debug("TopiaId : " + userEditable.getTopiaId());
- logger.debug("Login : " + userEditable.getLogin());
- logger.debug("Password : " + userEditable.getPassword());
- logger.debug("NewPassword : " + userEditable.getNewPassword());
+ logger.debug("TopiaId : " + user.getTopiaId());
+ logger.debug("Login : " + user.getLogin());
+// logger.debug("Password : " + user.getPassword());
+// logger.debug("NewPassword : " + user.getNewPassword());
}
- serviceUser.updateUser(userEditable, false);
+ serviceUser.updateUser(user, false);
} catch (PollenBusinessException eee) {
String message = manager.getErrorMessage(eee, messages, logger);
switch (eee.getType()) {
@@ -181,7 +181,7 @@
// Stay in edited mode to show errors
edited = true;
// Reset new password
- userEditable.setNewPassword(null);
+ user.setNewPassword(null);
return accountForm;
}
}
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/AppModule.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/AppModule.java 2010-05-04 16:24:31 UTC (rev 2986)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/AppModule.java 2010-05-06 10:35:53 UTC (rev 2987)
@@ -29,12 +29,13 @@
import org.apache.tapestry5.services.ApplicationStateCreator;
import org.apache.tapestry5.services.ApplicationStateManager;
import org.apache.tapestry5.services.ComponentRequestFilter;
-import org.apache.tapestry5.services.LibraryMapping;
import org.apache.tapestry5.upload.services.UploadSymbols;
import org.chorem.pollen.PollenContextImpl;
import org.chorem.pollen.entity.UserAccount;
import org.chorem.pollen.service.ServiceEmail;
import org.chorem.pollen.service.ServiceEmailImpl;
+import org.chorem.pollen.service.ServiceFavorite;
+import org.chorem.pollen.service.ServiceFavoriteImpl;
import org.chorem.pollen.service.ServicePoll;
import org.chorem.pollen.service.ServicePollImpl;
import org.chorem.pollen.service.ServiceUser;
@@ -74,6 +75,12 @@
return service;
}
+ public static ServiceFavorite buildServiceFavorite(PollenManager manager) {
+ ServiceFavoriteImpl service = new ServiceFavoriteImpl();
+ service.setContext(manager.getContext());
+ return service;
+ }
+
public static ServicePoll buildServicePoll(PollenManager manager) {
ServicePollImpl service = new ServicePollImpl();
service.setContext(manager.getContext());
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-04 16:24:31 UTC (rev 2986)
+++ trunk/pollen-ui/src/main/resources/i18n/pollen-ui-fr_FR.properties 2010-05-06 10:35:53 UTC (rev 2987)
@@ -26,17 +26,26 @@
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.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.update.notSelected=Aucune liste s\u00E9lectionn\u00E9e.
-pollen.ui.list.update.emptyList=Liste vide. Ajoutez des votants en saisissant leur nom et email.
-pollen.ui.list.update.addParticipant=Ajouter un nouvel utilisateur \u00E0 la liste
+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.update.addParticipant=Ajouter un nouveau votant \u00E0 la liste
+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.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.cancelEdition=Annuler les changements
+pollen.ui.list.update.saveParticipant=Enregistrer les modifications
+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 ?
# OLD LOGIN_COMPONENT
connectionLegend=Connexion
@@ -59,6 +68,9 @@
listSelect-label= Liste
listName-label= Nom
name-label= Nom
+weight-label=Poids
+editEmail-regexp=^([a-zA-Z0-9_.+-])+(a)(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$
+editEmail-regexp-message=Adresse email invalide.
############################ CHOICE ############################################
pollen.ui.choice.delete.confirm=Etes-vous s\u00FBr de vouloir d\u00E9finitivement supprimer ce choix ?
Modified: trunk/pollen-ui/src/main/resources/org/chorem/pollen/ui/components/Border.tml
===================================================================
--- trunk/pollen-ui/src/main/resources/org/chorem/pollen/ui/components/Border.tml 2010-05-04 16:24:31 UTC (rev 2986)
+++ trunk/pollen-ui/src/main/resources/org/chorem/pollen/ui/components/Border.tml 2010-05-06 10:35:53 UTC (rev 2987)
@@ -156,9 +156,9 @@
<!-- Contenu -->
<div id="${pageBodyId}" class="content">
<noscript>
- <t:feedback t:id="errorJs" />
+ <div t:type="nuiton/feedback" t:id="errorJs" />
</noscript>
- <t:feedback t:id="borderFeedback" t:autoClear="false"/>
+ <div t:type="nuiton/feedback" t:id="borderFeedback" t:autoClear="false"/>
<t:body />
</div>
</div>
Modified: trunk/pollen-ui/src/main/resources/org/chorem/pollen/ui/components/UserListsCreate.tml
===================================================================
--- trunk/pollen-ui/src/main/resources/org/chorem/pollen/ui/components/UserListsCreate.tml 2010-05-04 16:24:31 UTC (rev 2986)
+++ trunk/pollen-ui/src/main/resources/org/chorem/pollen/ui/components/UserListsCreate.tml 2010-05-06 10:35:53 UTC (rev 2987)
@@ -1,34 +1,32 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<body xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter">
<t:zone t:id="createZone" t:update="show">
- <form t:type="form" t:id="createList" action="tapestry" t:zone="createZone">
- <div id="createListFormDiv">
- <t:errors/>
- <fieldset>
- <legend>${message:pollen.ui.list.create.title}</legend>
- <div>
- <label t:type="label" for="listName" />* :
- <input t:type="textfield" t:id="listName" value="newFavoriteList.name" t:validate="required"/>
- </div>
- <!-- <div>
- <t:label for="accountsFile" />
- <input t:type="upload" t:id="accountsFile" />
- <span t:type="ck/Tooltip" title="${message:help}" value="${message:accountsFile-help}" effect="appear">
- <img src="${asset:context:img/help.png}" alt="${message:help}"/>
- </span>
- </div>
- <div>
- <t:label for="accountsUrl" />
- <t:textfield t:id="accountsUrl" t:value="accountsUrl" />
- <span t:type="ck/Tooltip" title="${message:help}" value="${message:accountsUrl-help}" effect="appear">
- <img src="${asset:context:img/help.png}" alt="${message:help}"/>
- </span>
- </div>-->
- <div class="buttons">
- <input t:type="submit" value="${message:pollen.ui.button.create}"/>
- </div>
- </fieldset>
- </div>
+ <form t:type="form" class="createList" t:id="createList" action="tapestry" t:zone="createZone">
+ <t:errors/>
+ <fieldset class="create">
+ <legend>${message:pollen.ui.list.create.title}</legend>
+ <div>
+ <label t:type="label" for="listName" />* :
+ <input t:type="textfield" t:id="listName" value="newFavoriteList.name" t:validate="required"/>
+ </div>
+ <!-- <div>
+ <t:label for="accountsFile" />
+ <input t:type="upload" t:id="accountsFile" />
+ <span t:type="ck/Tooltip" title="${message:help}" value="${message:accountsFile-help}" effect="appear">
+ <img src="${asset:context:img/help.png}" alt="${message:help}"/>
+ </span>
+ </div>
+ <div>
+ <t:label for="accountsUrl" />
+ <t:textfield t:id="accountsUrl" t:value="accountsUrl" />
+ <span t:type="ck/Tooltip" title="${message:help}" value="${message:accountsUrl-help}" effect="appear">
+ <img src="${asset:context:img/help.png}" alt="${message:help}"/>
+ </span>
+ </div>-->
+ <div class="buttons">
+ <input t:type="submit" value="${message:pollen.ui.button.create}"/>
+ </div>
+ </fieldset>
</form>
</t:zone>
</body>
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-04 16:24:31 UTC (rev 2986)
+++ trunk/pollen-ui/src/main/resources/org/chorem/pollen/ui/components/UserListsUpdate.tml 2010-05-06 10:35:53 UTC (rev 2987)
@@ -1,34 +1,86 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<body xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter">
- <form t:type="form" t:id="selectListForm" action="tapestry">
- <div>
- ${message:listSelect-label}:
- <select t:id="listSelect" t:type="ck/beanSelect" t:list="source" t:value="favoriteListSelected"
- t:labelField="literal:name" t:valueField="literal:name" />
- <input t:type="submit" value="${message:pollen.ui.button.ok}"/>
- </div>
- </form>
-
<t:if test="canDisplayAccounts()">
- <t:zone t:id="updateZone" show="show" update="show">
- <!-- Display all Accounts child of favoriteListSelected -->
- <div t:type="grid" t:source="participants" t:row="participant"
- t:include="name, email, weight" t:add="actions"
- t:rowsPerPage="20" t:rowClass="prop:evenodd.next" t:inPlace="true">
- <p:actionsCell>
- <a t:type="actionlink" t:id="removeParticipant" t:context="participant.id">
- <img src="${asset:context:img/delete.png}" alt="${message:pollen.ui.list.remove}"/>
- </a>
- </p:actionsCell>
- <p:empty>
- ${message:pollen.ui.list.update.emptyList}
- </p:empty>
- </div>
+ <div t:type="zone" class="updateZone" t:id="updateZone" t:update="show">
+ <p class="center">
+ <t:if t:test="participants.availableRows">
+ ${format:pollen.ui.list.nbParticipants=participants.availableRows}
+ <p:else>
+ ${message:pollen.ui.list.emptyList}
+ </p:else>
+ </t:if>
+ </p>
+ <form t:type="form" t:id="participantsForm" action="tapestry" t:zone="updateZone">
+ <t:errors />
+ <p><input t:type="hidden" value="participantEditedId" /></p>
+ <!-- Display all Accounts child of favoriteList -->
+ <div t:type="grid" t:source="participants" t:row="participant"
+ t:include="name, email, weight" t:add="actions"
+ t:rowsPerPage="10" t:rowClass="prop:evenodd.next" t:inPlace="true">
+ <p:nameCell>
+ <t:if t:test="editionMode">
+ <input t:type="textfield" t:id="editName" value="participantEdited.name" t:validate="required" size="10" />
+ <p:else>${participant.name}</p:else>
+ </t:if>
+ </p:nameCell>
+ <p:emailCell>
+ <t:if t:test="editionMode">
+ <input t:type="textfield" t:id="editEmail" value="participantEdited.email" t:validate="regexp" size="15" />
+ <p:else>${participant.email}</p:else>
+ </t:if>
+ </p:emailCell>
+ <p:weightCell>
+ <t:if t:test="editionMode">
+ <input t:type="textfield" t:id="editWeight" value="participantEdited.weight" t:validate="required" size="1" />
+ <p:else>${participant.weight}</p:else>
+ </t:if>
+ </p:weightCell>
+ <p:actionsCell>
+ <t:if t:test="editionMode">
+ <a t:type="actionlink" t:id="cancelEdition" title="${message:pollen.ui.list.update.cancelEdition}" t:zone="updateZone">
+ <img src="${asset:context:img/undo.png}" alt="${message:pollen.ui.list.update.cancelEdition}" />
+ </a>
+ <input t:type="submit" t:id="saveParticipant" t:image="context:img/save.png" value="Save"
+ title="${message:pollen.ui.list.update.saveParticipant}" />
+ <p:else>
+ <a t:type="actionlink" t:id="editParticipant" t:context="participant.id" t:zone="updateZone"
+ title="${message:pollen.ui.list.update.updateParticipant}">
+ <img src="${asset:context:img/editSmall.png}" alt="${message:pollen.ui.list.update.updateParticipant}" />
+ </a>
+ <a t:type="actionlink" t:id="removeParticipant" t:context="participant.id" t:zone="updateZone"
+ title="${message:pollen.ui.list.update.removeParticipant}"
+ t:mixins="nuiton/confirm" t:message="format:pollen.ui.list.update.removeParticipant.confirmMessage=participant.name">
+ <img src="${asset:context:img/delete.png}" alt="${message:pollen.ui.list.update.removeParticipant}" />
+ </a>
+ </p:else>
+ </t:if>
+ </p:actionsCell>
+ <p:empty />
+ </div>
+ </form>
+
+ <div t:type="nuiton/feedback" t:id="participantsFeedback" />
- <!-- Add a new FavoriteParticipant to favoriteListSelected -->
- <form t:type="form" t:id="addParticipant" t:zone="updateZone" action="tapestry">
- <table class="t-data-grid">
+ <!-- Add a new FavoriteParticipant to favoriteList -->
+ <form t:type="form" class="addParticipant" t:id="addParticipant" t:zone="updateZone" action="tapestry">
+ <fieldset class="create">
+ <legend>${message:pollen.ui.list.update.addParticipant}</legend>
+ <t:errors/>
+ <div>
+ <label t:type="label" for="name" />* :
+ <input t:type="textfield" t:id="name" t:value="newParticipant.name" t:validate="required" size="10"/>
+ <label t:type="label" for="email" /> :
+ <input t:type="textfield" t:id="email" t:value="newParticipant.email" t:validate="regexp" size="15"/>
+ <label t:type="label" for="weight" /> :
+ <input t:type="textfield" t:id="weight" t:value="newParticipant.weight" t:validate="required" size="1"/>
+ <span t:type="ck/Tooltip" t:title="message:pollen.ui.tooltip.help" t:value="message:pollen.ui.list.create.weightHelp" t:effect="appear">
+ <img src="${asset:context:img/help.png}" alt="${message:pollen.ui.tooltip.help}"/>
+ </span>
+ <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"/>
@@ -43,8 +95,7 @@
<input t:type="submit" value="${message:pollen.ui.button.add}" title="${message:pollen.ui.list.update.addParticipant}"/>
</td>
</tr>
- </table>
- <t:errors/>
+ </table>-->
</form>
<!-- Delete the favoriteListSelected -->
@@ -54,10 +105,10 @@
</a>
</p>-->
- </t:zone>
+ </div>
<p:else>
- ${message:pollen.ui.list.update.notSelected}
+ <p class="center">${message:pollen.ui.list.notSelected}</p>
</p:else>
</t:if>
</body>
Modified: trunk/pollen-ui/src/main/webapp/admin/AdminUsers.tml
===================================================================
--- trunk/pollen-ui/src/main/webapp/admin/AdminUsers.tml 2010-05-04 16:24:31 UTC (rev 2986)
+++ trunk/pollen-ui/src/main/webapp/admin/AdminUsers.tml 2010-05-06 10:35:53 UTC (rev 2987)
@@ -71,8 +71,8 @@
<input t:type="textfield" t:id="newLogin" value="newUser.login" t:validate="required" />
<label t:type="label" for="newEmail">${message:email-label}</label> :
<input t:type="textfield" t:id="newEmail" value="newUser.email" t:validate="regexp" />
- <span t:type="ck/Tooltip" title="message:pollen.ui.tooltip.help" t:value="message:pollen.ui.user.create.passwordHelp" t:effect="appear">
- <img src="${asset:context:img/help.png}" alt="message:help"/>
+ <span t:type="ck/Tooltip" t:title="message:pollen.ui.tooltip.help" t:value="message:pollen.ui.user.create.passwordHelp" t:effect="appear">
+ <img src="${asset:context:img/help.png}" alt="${message:pollen.ui.tooltip.help}"/>
</span>
<input t:type="submit" value="${message:pollen.ui.button.add}" title="${message:pollen.ui.user.create.title}" />
</p>
Modified: trunk/pollen-ui/src/main/webapp/css/common.css
===================================================================
--- trunk/pollen-ui/src/main/webapp/css/common.css 2010-05-04 16:24:31 UTC (rev 2986)
+++ trunk/pollen-ui/src/main/webapp/css/common.css 2010-05-06 10:35:53 UTC (rev 2987)
@@ -34,31 +34,6 @@
display: block;
}
-/** feedback.css not worked yet in nuiton-tapestry-extra **/
-.fb-error {
- width: 400px;
- margin: auto;
- text-align: center;
- color: #000;
- font-weight: bold;
- padding: 3px;
- border: solid;
- border-color: #f00;
- border-width: 2px;
- margin-bottom: 10px;
-}
-
-.fb-info {
- width: 400px;
- margin: auto;
- text-align: center;
- color: #000;
- padding: 3px;
- border: solid;
- border-color: #000;
- border-width: 2px;
-}
-
.center {
text-align: center;
}
@@ -76,3 +51,7 @@
background: url(../img/save.png) no-repeat center center;
}
+.mbottom5 {
+ margin-bottom: 5px;
+}
+
Deleted: trunk/pollen-ui/src/main/webapp/css/lists.css
===================================================================
--- trunk/pollen-ui/src/main/webapp/css/lists.css 2010-05-04 16:24:31 UTC (rev 2986)
+++ trunk/pollen-ui/src/main/webapp/css/lists.css 2010-05-06 10:35:53 UTC (rev 2987)
@@ -1,122 +0,0 @@
-#listsZone {
- width: 970px;
- margin: auto;
- text-align: center;
- margin-bottom: 40px;
-}
-
-#createListFormDiv {
- width: 450px;
- margin: auto;
-}
-
-#createListFormDiv legend {
- color: #727a7e;
- font-weight: bold;
-}
-
-#createListFormDiv fieldset {
- width: 380px;
- border: 1px solid #aab;
- padding: 15px;
- padding-bottom: 10px;
- margin: auto;
- vertical-align: top;
- text-align: left;
-}
-
-/*#createListFormDiv label {
- display: block;
- width: 80px;
- float: left;
-}*/
-
-#createListForm div {
- margin-bottom: 10px;
-}
-
-.buttons {
- text-align: center;
- margin-top: 20px;
-}
-
-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: #32b5c9;
- 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 #32b5c9;
- 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;
- width: 400px;
-}
-
-TABLE.t-data-grid THEAD {
- border-top: 1px solid #aab; /* For Firefox */
-}
-
-TABLE.t-data-grid THEAD TR {
- color: #fff;
- background-color: #32b5c9;
-}
-
-TABLE.t-data-grid THEAD TR a {
- color: #fff;
- background-color: #32b5c9;
-}
-
-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:#32b5c9;
-}
-
-TABLE.t-data-grid TBODY TR {
- background-color: #fff;
-}
-
-TABLE.t-data-grid TBODY TR.odd {
- background-color: #bce7ed;
-}
-
-TABLE.t-data-grid TBODY TR TD {
- border-right: 1px solid #aab;
- border-bottom: 1px solid #aab;
- padding: 2px 5px;
-}
\ No newline at end of file
Modified: trunk/pollen-ui/src/main/webapp/css/main.css
===================================================================
--- trunk/pollen-ui/src/main/webapp/css/main.css 2010-05-04 16:24:31 UTC (rev 2986)
+++ trunk/pollen-ui/src/main/webapp/css/main.css 2010-05-06 10:35:53 UTC (rev 2987)
@@ -1,13 +1,13 @@
body {
- background-color: #FFF;
- background-repeat: no-repeat;
- background-position: bottom right;
- background-attachment: fixed;
- border: none;
- font-family: "Trebuchet MS", Arial, sans-serif;
- font-size: small;
- width: 1000px;
- margin: auto;
+ background-color: #FFF;
+ background-repeat: no-repeat;
+ background-position: bottom right;
+ background-attachment: fixed;
+ border: none;
+ font-family: "Trebuchet MS", Arial, sans-serif;
+ font-size: small;
+ width: 1000px;
+ margin: auto;
}
#CreationBody {
@@ -23,17 +23,17 @@
}
body a {
- color: #727a7e;
+ color: #727a7e;
}
body a img {
- border: none;
+ border: none;
}
body ul {
- list-style-type: none;
- margin: 0px;
- padding: 0px;
+ list-style-type: none;
+ margin: 0px;
+ padding: 0px;
}
/*Haut de page*/
@@ -62,31 +62,31 @@
}
#po-header-connection {
- float: right;
- vertical-align: top;
- position: relative;
- margin-right: 10px;
- text-align: right;
+ float: right;
+ vertical-align: top;
+ position: relative;
+ margin-right: 10px;
+ text-align: right;
}
#po-header-connection form {
- margin: 0px;
- padding: 0px;
- width: 200px;
+ margin: 0px;
+ padding: 0px;
+ width: 200px;
}
#po-header-connection a,
#po-header-connection span {
- padding: 1px;
- padding-left: 5px;
- padding-right: 5px;
- text-decoration: none;
- cursor: pointer;
+ padding: 1px;
+ padding-left: 5px;
+ padding-right: 5px;
+ text-decoration: none;
+ cursor: pointer;
}
#po-header-connection a:hover,
#po-header-connection span:hover {
- -moz-border-radius: 10px;
+ -moz-border-radius: 10px;
background-color: #000;
color: #fff;
}
@@ -112,80 +112,80 @@
}
#top {
- padding: 7px;
- text-align: left;
- vertical-align: middle;
+ padding: 7px;
+ text-align: left;
+ vertical-align: middle;
}
#top a {
- color: #000;
- text-decoration: none;
+ color: #000;
+ text-decoration: none;
}
#menu {
- display: inline;
+ display: inline;
}
#menu li {
- cursor: pointer;
+ cursor: pointer;
}
#menu li a {
- padding: 1px;
- padding-left: 5px;
- padding-right: 5px;
+ padding: 1px;
+ padding-left: 5px;
+ padding-right: 5px;
}
#menu li a:hover {
- -moz-border-radius: 10px;
- background-color: #000;
- color: #fff;
+ -moz-border-radius: 10px;
+ background-color: #000;
+ color: #fff;
}
.menu_elt {
- display: inline;
- margin-right: 40px;
- position: relative;
+ display: inline;
+ margin-right: 40px;
+ position: relative;
}
/** DROPDOWN MENU **/
.dropdown_menu {
- padding-top: 9px;
- position: absolute;
- z-index: 20;
+ padding-top: 9px;
+ position: absolute;
+ z-index: 20;
}
.dropdown_menu .top_leftIndex {
- height: 16px;
- width: 16px;
- border: none;
- background-image: url("../img/topleft_menuIndex.png");
- background-repeat: no-repeat;
- background-position: left;
- float: left;
+ height: 16px;
+ width: 16px;
+ border: none;
+ background-image: url("../img/topleft_menuIndex.png");
+ background-repeat: no-repeat;
+ background-position: left;
+ float: left;
}
.dropdown_menu .top_rightIndex {
- height: 16px;
- width: 16px;
- border: none;
- background-image: url("../img/topright_menuIndex.png");
- background-repeat: no-repeat;
- background-position: right;
- float: right;
+ height: 16px;
+ width: 16px;
+ border: none;
+ background-image: url("../img/topright_menuIndex.png");
+ background-repeat: no-repeat;
+ background-position: right;
+ float: right;
}
.dropdown_menu .top_middleIndex {
- margin: 15px;
- margin-bottom: 0px;
- margin-top: 0px;
- background-color: #ff0;
- border-top: none;
- -moz-border-radius-bottomright: 15px;
- -moz-border-radius-bottomleft: 15px;
- padding: 10px;
- padding-top: 0px;
- min-width: 140px;
+ margin: 15px;
+ margin-bottom: 0px;
+ margin-top: 0px;
+ background-color: #ff0;
+ border-top: none;
+ -moz-border-radius-bottomright: 15px;
+ -moz-border-radius-bottomleft: 15px;
+ padding: 10px;
+ padding-top: 0px;
+ min-width: 140px;
}
.dropdown_menu .top_leftCreation {
@@ -288,10 +288,10 @@
}
.dropdown_menu li {
- z-index: 25;
- padding: 3px;
- display: block;
- letter-spacing: 0px;
+ z-index: 25;
+ padding: 3px;
+ display: block;
+ letter-spacing: 0px;
}
#menu1 {
@@ -305,29 +305,29 @@
}
#login_menu {
- top: 12px;
- right: -10px;
+ top: 12px;
+ right: -10px;
}
#compte_menu {
- top: 12px;
- right: -25px;
+ top: 12px;
+ right: -25px;
}
HTML>BODY DIV.t-error LI {
- margin-left: 0px;
+ margin-left: 10px;
}
/* Le corps de la page */
#corps {
- text-align: justify;
- color: #000;
- border: none;
- min-height: 300px;
+ text-align: justify;
+ color: #000;
+ border: none;
+ min-height: 300px;
}
#corps h1,h2,h3,h4 {
- text-align: center;
+ text-align: center;
}
#corps .titleIndex {
@@ -353,16 +353,16 @@
}
#corps h2 {
- color: #727a7e;
+ color: #727a7e;
}
#po-header-addressBar {
- padding: 5px;
- margin-left: 350px;
+ padding: 5px;
+ margin-left: 350px;
}
.IndexAddress {
- background-color: #ffffaa;
+ background-color: #ffffaa;
}
.CreationAddress {
@@ -370,7 +370,7 @@
}
.VoteAddress {
- background-color: #b0f580;
+ background-color: #b0f580;
}
.VoteCountingAddress {
@@ -378,20 +378,20 @@
}
.content {
- padding: 15px;
+ padding: 15px;
}
/* Pied de page */
#po-footer {
- padding: 5px;
- font-size: small;
- text-align: center;
- margin-top: 20px;
+ padding: 5px;
+ font-size: small;
+ text-align: center;
+ margin-top: 20px;
}
#po-footer a,
#po-footer span {
- color:#727a7e;
+ color:#727a7e;
}
/** old LoginComponent > Connexion page **/
Added: trunk/pollen-ui/src/main/webapp/css/users.css
===================================================================
--- trunk/pollen-ui/src/main/webapp/css/users.css (rev 0)
+++ trunk/pollen-ui/src/main/webapp/css/users.css 2010-05-06 10:35:53 UTC (rev 2987)
@@ -0,0 +1,176 @@
+/*
+ Document : users
+ Created on : 5 mai 2010, 11:15:04
+ Author : fdesbois
+ Description:
+ Purpose of the stylesheet follows.
+*/
+
+/********************************************/
+/************** UserLists *****************/
+/********************************************/
+#p-userLists DIV.updateZone DIV.fb-info {
+ margin-bottom: 10px;
+}
+
+#p-userLists FIELDSET.create {
+ border: 1px solid #aab;
+ padding: 15px;
+ padding-bottom: 10px;
+ margin: auto;
+ vertical-align: top;
+ text-align: left;
+}
+
+#p-userLists FIELDSET.create LEGEND {
+ color: #727a7e;
+ font-weight: bold;
+}
+
+#p-userLists FORM.participantsForm DIV.t-error {
+ width: 600px;
+ margin: auto;
+}
+
+#p-userLists FORM.addParticipant FIELDSET {
+ width: 580px;
+ margin-bottom: 20px;
+}
+
+#p-userLists FORM.createList FIELDSET {
+ width: 450px;
+}
+
+/*#listsZone {
+ width: 970px;
+ margin: auto;
+ text-align: center;
+ margin-bottom: 40px;
+}*/
+
+.buttons {
+ text-align: center;
+ margin-top: 20px;
+}
+
+/*#createListFormDiv {
+ width: 450px;
+ margin: auto;
+}
+
+#createListFormDiv legend {
+ color: #727a7e;
+ font-weight: bold;
+}
+
+#createListFormDiv fieldset {
+ width: 380px;
+ border: 1px solid #aab;
+ padding: 15px;
+ padding-bottom: 10px;
+ margin: auto;
+ vertical-align: top;
+ text-align: left;
+}
+
+#createListForm div {
+ margin-bottom: 10px;
+}*/
+
+/*#createListFormDiv label {
+ display: block;
+ width: 80px;
+ float: left;
+}*/
+
+DIV.t-data-grid {
+ font-family: Arial, Helvetica, sans-serif;
+ margin-top:20px;
+ margin-bottom:20px;
+}
+
+DIV.t-data-grid-pager {
+ text-align: center;
+}
+
+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: #32b5c9;
+ 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 #32b5c9;
+ 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;
+ width: 500px;
+}
+
+TABLE.t-data-grid THEAD {
+ border-top: 1px solid #aab; /* For Firefox */
+}
+
+TABLE.t-data-grid THEAD TR {
+ color: #fff;
+ background-color: #32b5c9;
+}
+
+TABLE.t-data-grid THEAD TR a {
+ color: #fff;
+ background-color: #32b5c9;
+}
+
+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:#32b5c9;
+}
+
+TABLE.t-data-grid THEAD TR TH.weight {
+ width: 50px;
+}
+
+TABLE.t-data-grid THEAD TR TH.actions {
+ width: 50px;
+}
+
+TABLE.t-data-grid TBODY TR {
+ background-color: #fff;
+}
+
+TABLE.t-data-grid TBODY TR.odd {
+ background-color: #bce7ed;
+}
+
+TABLE.t-data-grid TBODY TR TD {
+ border-right: 1px solid #aab;
+ border-bottom: 1px solid #aab;
+ padding: 2px 5px;
+}
+
+
+
Property changes on: trunk/pollen-ui/src/main/webapp/css/users.css
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Modified: trunk/pollen-ui/src/main/webapp/user/UserLists.tml
===================================================================
--- trunk/pollen-ui/src/main/webapp/user/UserLists.tml 2010-05-04 16:24:31 UTC (rev 2986)
+++ trunk/pollen-ui/src/main/webapp/user/UserLists.tml 2010-05-06 10:35:53 UTC (rev 2987)
@@ -1,15 +1,25 @@
<!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:pageTitle="prop:title"
+<t:border t:addressBar="addressBar" t:pageLogo="literal:Creation" t:pageTitle="prop:title" t:pageBodyId="p-userLists"
xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter">
<h1 class="titleCreation">${title}</h1>
- <div id="listsDiv">
+ <t:if test="favoriteLists">
+ <form t:type="form" t:id="selectFavoriteList" action="tapestry">
+ <div class="center">
+ <label t:type="label" for="listSelect" /> :
+ <select t:type="select" t:id="listSelect" t:model="favoriteListModel" t:encoder="favoriteListModel"
+ t:value="favoriteListSelected" onChange="this.form.submit()" />
+ <t:if t:test="canDeleteList()">
+
+ <a t:type="actionlink" t:id="deleteList" title="${format:pollen.ui.list.delete=favoriteListSelected.name}"
+ t:mixins="nuiton/confirm" t:message="pollen.ui.list.delete.confirmMessage">
+ <img src="${asset:context:img/delete.png}" alt="${format:pollen.ui.list.delete=favoriteListSelected.name}" />
+ </a>
+ </t:if>
+ </div>
+ </form>
+ <t:userListsUpdate t:id="update" t:source="favoriteListSelected" />
+ </t:if>
- <t:if test="favoriteLists">
- <t:userListsUpdate t:source="favoriteLists" />
- </t:if>
-
- <t:userListsCreate />
-
- </div>
+ <t:userListsCreate />
</t:border>
\ No newline at end of file
Modified: trunk/pollen-ui/src/main/webapp/user/UserProfile.tml
===================================================================
--- trunk/pollen-ui/src/main/webapp/user/UserProfile.tml 2010-05-04 16:24:31 UTC (rev 2986)
+++ trunk/pollen-ui/src/main/webapp/user/UserProfile.tml 2010-05-06 10:35:53 UTC (rev 2987)
@@ -1,98 +1,91 @@
<t:border t:addressBar="addressBar" t:pageLogo="literal:Creation"
- xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter">
+ xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter">
<h1 class="titleCreation">${message:title}</h1>
- <t:if test="userExists">
-
- <t:zone t:id="accountZone" show="show" update="show">
- <t:form t:id="accountForm" zone="accountZone">
- <div id="myAccountFormDiv">
- <div id="myAccountError">
- <t:errors />
- </div>
- <FieldSet>
- <legend>${message:connectionInfoLegend}</legend>
- <div>
- <label>${message:login-label}</label>
- ${user.login}
- </div>
- <t:if test="edited">
- <div>
- <t:label for="password" />
- <t:PasswordField t:id="password" t:value="userEditable.password" t:validate="required,minlength=6" />
- </div>
- <div>
- <t:label for="newPassword1" />
- <t:PasswordField t:id="newPassword1" t:value="userEditable.newPassword" t:validate="minlength=6" />
- </div>
- <div>
- <t:label for="passwordVerify" />
- <t:PasswordField t:id="passwordVerify" t:value="passwordVerify" t:validate="minlength=6" />
- </div>
- </t:if>
- </FieldSet>
+ <t:zone t:id="accountZone" show="show" update="show">
+ <t:form t:id="accountForm" zone="accountZone">
+ <div id="myAccountFormDiv">
+ <div id="myAccountError">
+ <t:errors />
+ </div>
- <FieldSet>
- <legend>${message:userInfoLegend}</legend>
+ <FieldSet>
+ <legend>${message:connectionInfoLegend}</legend>
+ <div>
+ <label>${message:login-label}</label>
+ ${user.login}
+ </div>
+ <t:if test="edited">
<div>
- <t:label for="email" />
- <t:if test="edited">
- <t:TextField t:id="email" t:value="userEditable.email" t:validate="regexp" />
- <p:else>
- <t:if test="user.email">
- ${user.email}
- <p:else>-</p:else>
- </t:if>
- </p:else>
- </t:if>
+ <t:label for="password" />
+ <t:PasswordField t:id="password" t:value="user.password" t:validate="required,minlength=6" />
</div>
<div>
- <t:label for="firstName" />
- <t:if test="edited">
- <t:TextField t:id="firstName" t:value="userEditable.firstName" />
- <p:else>
- <t:if test="user.firstName">
- ${user.firstName}
- <p:else>-</p:else>
- </t:if>
- </p:else>
- </t:if>
+ <t:label for="newPassword1" />
+ <t:PasswordField t:id="newPassword1" t:value="user.newPassword" t:validate="minlength=6" />
</div>
<div>
- <t:label for="lastName" />
- <t:if test="edited">
- <t:TextField t:id="lastName" t:value="userEditable.lastName" />
- <p:else>
- <t:if test="user.lastName">
- ${user.lastName}
- <p:else>-</p:else>
- </t:if>
- </p:else>
- </t:if>
+ <t:label for="passwordVerify" />
+ <t:PasswordField t:id="passwordVerify" t:value="passwordVerify" t:validate="minlength=6" />
</div>
- </FieldSet>
+ </t:if>
+ </FieldSet>
- <div class="buttons">
+ <FieldSet>
+ <legend>${message:userInfoLegend}</legend>
+ <div>
+ <t:label for="email" />
<t:if test="edited">
- <input type="submit" value="${message:submit-label}" />
- <a t:type="pagelink" t:page="user/profile" style="text-decoration: none;">
- <input type="button" value="${message:cancel-action}" />
- </a>
+ <t:TextField t:id="email" t:value="user.email" t:validate="regexp" />
<p:else>
- <a t:type="actionlink" t:id="editAccount" style="text-decoration: none;">
- <input type="button" value="${message:edit-action}" />
- </a>
+ <t:if test="user.email">
+ ${user.email}
+ <p:else>-</p:else>
+ </t:if>
</p:else>
</t:if>
</div>
+ <div>
+ <t:label for="firstName" />
+ <t:if test="edited">
+ <t:TextField t:id="firstName" t:value="user.firstName" />
+ <p:else>
+ <t:if test="user.firstName">
+ ${user.firstName}
+ <p:else>-</p:else>
+ </t:if>
+ </p:else>
+ </t:if>
+ </div>
+ <div>
+ <t:label for="lastName" />
+ <t:if test="edited">
+ <t:TextField t:id="lastName" t:value="user.lastName" />
+ <p:else>
+ <t:if test="user.lastName">
+ ${user.lastName}
+ <p:else>-</p:else>
+ </t:if>
+ </p:else>
+ </t:if>
+ </div>
+ </FieldSet>
+
+ <div class="buttons">
+ <t:if test="edited">
+ <input type="submit" value="${message:submit-label}" />
+ <a t:type="pagelink" t:page="user/profile" style="text-decoration: none;">
+ <input type="button" value="${message:cancel-action}" />
+ </a>
+ <p:else>
+ <a t:type="actionlink" t:id="editAccount" style="text-decoration: none;">
+ <input type="button" value="${message:edit-action}" />
+ </a>
+ </p:else>
+ </t:if>
</div>
- </t:form>
- </t:zone>
-
- <p:else>
- <h4>${message:noUser}</h4>
- <t:LoginComponent />
- </p:else>
- </t:if>
+ </div>
+ </t:form>
+ </t:zone>
</t:border>
\ No newline at end of file
1
0
r2986 - in trunk/pollen-ui/src/main: java/org/chorem/pollen/ui/components java/org/chorem/pollen/ui/data java/org/chorem/pollen/ui/mixins java/org/chorem/pollen/ui/pages/admin java/org/chorem/pollen/ui/pages/poll java/org/chorem/pollen/ui/pages/user java/org/chorem/pollen/ui/services webapp/admin webapp/css webapp/js
by fdesbois@users.chorem.org 04 May '10
by fdesbois@users.chorem.org 04 May '10
04 May '10
Author: fdesbois
Date: 2010-05-04 18:24:31 +0200 (Tue, 04 May 2010)
New Revision: 2986
Url: http://chorem.org/repositories/revision/pollen/2986
Log:
Remove components moved in nuiton-tapestry-extra
Added:
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/PollenRequiresAuthentication.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenAuthentication.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenAuthenticationFilter.java
Removed:
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/FeedBack.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/AbstractMappedGridDataSource.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/RequiresAuthentication.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/mixins/Confirm.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/mixins/ZoneUpdater.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/AuthenticationFilter.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/FormatBinding.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/FormatBindingFactory.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/ServiceAuthenticationImpl.java
trunk/pollen-ui/src/main/webapp/js/confirm.js
trunk/pollen-ui/src/main/webapp/js/zoneUpdater.js
Modified:
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/Border.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/FavoriteParticipantDataSource.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/UserAccountDataSource.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/admin/AdminPolls.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/admin/AdminUsers.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/CloseValidation.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/CreationValidation.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/ModificationValidation.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/Results.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/VoteForPoll.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserLists.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserProfile.java
trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/AppModule.java
trunk/pollen-ui/src/main/webapp/admin/AdminUsers.tml
trunk/pollen-ui/src/main/webapp/css/common.css
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/Border.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/Border.java 2010-05-04 14:07:47 UTC (rev 2985)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/Border.java 2010-05-04 16:24:31 UTC (rev 2986)
@@ -41,6 +41,7 @@
import org.chorem.pollen.ui.data.AddressBar;
import org.chorem.pollen.ui.pages.Index;
import org.chorem.pollen.ui.services.PollenManager;
+import org.nuiton.web.tapestry5.components.FeedBack;
import org.nuiton.web.tapestry5.services.ServiceAuthentication;
import org.slf4j.Logger;
Deleted: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/FeedBack.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/FeedBack.java 2010-05-04 14:07:47 UTC (rev 2985)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/components/FeedBack.java 2010-05-04 16:24:31 UTC (rev 2986)
@@ -1,151 +0,0 @@
-/* *##%
- * Pollen :: Pollen Web Interface
- * Copyright (C) 2009 - 2010 Code Lutin
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Lesser Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program. If not, see
- * <http://www.gnu.org/licenses/gpl-3.0.html>.
- * ##%*/
-
-package org.chorem.pollen.ui.components;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.tapestry5.BindingConstants;
-import org.apache.tapestry5.ComponentResources;
-import org.apache.tapestry5.MarkupWriter;
-import org.apache.tapestry5.annotations.Log;
-import org.apache.tapestry5.annotations.Parameter;
-import org.apache.tapestry5.ioc.annotations.Inject;
-
-/**
- * Composant qui affiche des messages à l'utilisateur.
- *
- * Ce composant permet d'afficher des messages avec une apparence différente
- * selon leur type (info ou erreur). Lors de l'affichage de la page, les
- * messages seront affichés et la collection de messages sera vidée.
- *
- * Pour personnaliser l'apparence des messages il faut définir les classes
- * fb-error et fb-info dans le CSS.
- *
- * <pre>
- * Utilisation :
- * <t:feedback t:id="feedback"/>
- * @Component(id = "feedback") private FeedBack feedback;
- * feedback.addInfo("message d'info");
- * feedback.addError("message d'erreur");
- * </pre>
- *
- * @author rannou
- * @version $Id$
- */
-public class FeedBack {
-
- @Parameter(defaultPrefix = BindingConstants.LITERAL, value= "true")
- private boolean autoClear;
-
- /** Messages d'erreur */
- private List<String> errorMessages;
-
- /** Messages d'info */
- private List<String> infoMessages;
-
- private boolean errors;
-
- @Inject
- private ComponentResources resources;
-
- private boolean reload;
-
- public FeedBack() {
- errorMessages = new ArrayList<String>();
- infoMessages = new ArrayList<String>();
- }
-
- void beginRender(MarkupWriter writer) {
-
- // Rendu des messages d'erreur et vidage de la collection
- if (!errorMessages.isEmpty()) {
- errors = true;
- writer.element("div", "class", "fb-error");
- for (String message : errorMessages) {
- writer.write(message);
- writer.element("br");
- writer.end();
- }
- writer.end();
- }
- if (autoClear) {
- errorMessages.clear();
- }
-
- // Rendu des messages d'info et vidage de la collection
- if (!infoMessages.isEmpty()) {
- writer.element("div", "class", "fb-info");
- for (String message : infoMessages) {
- writer.write(message);
- writer.element("br");
- writer.end();
- }
- writer.end();
- }
- infoMessages.clear();
-
- resources.renderInformalParameters(writer);
- }
-
- void afterRender(MarkupWriter writer) {
-
- }
-
- /**
- * Ajout d'un message d'info.
- *
- * @param message le message
- */
- public void addInfo(String message) {
- if (!infoMessages.contains(message)) {
- infoMessages.add(message);
- }
- }
-
- /**
- * Ajout d'un message d'erreur.
- *
- * @param message le message
- */
- public void addError(String message) {
- if (!errorMessages.contains(message)) {
- errorMessages.add(message);
- }
- }
-
- public boolean hasErrors() {
- return errors;
- }
-
- @Log
- public void reload() {
- reload = true;
- }
-
- public boolean hasBeeanReloaded() {
- return reload;
- }
-
- public void clearErrors() {
- errorMessages.clear();
- reload = false;
- }
-}
Deleted: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/AbstractMappedGridDataSource.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/AbstractMappedGridDataSource.java 2010-05-04 14:07:47 UTC (rev 2985)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/AbstractMappedGridDataSource.java 2010-05-04 16:24:31 UTC (rev 2986)
@@ -1,127 +0,0 @@
-
-package org.chorem.pollen.ui.data;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.tapestry5.beaneditor.PropertyModel;
-import org.apache.tapestry5.grid.ColumnSort;
-import org.apache.tapestry5.grid.GridDataSource;
-import org.apache.tapestry5.grid.SortConstraint;
-import org.apache.tapestry5.ioc.internal.util.TapestryException;
-import org.chorem.pollen.PollenException;
-import org.nuiton.topia.persistence.TopiaEntity;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * AbstractMappedGridDataSource
- *
- * TODO : javadoc
- *
- * Created: 18 janv. 2010
- *
- * @param <K> Type of the map key
- * @param <E> Type of the map value
- * @author fdesbois <fdesbois(a)codelutin.com>
- */
-public abstract class AbstractMappedGridDataSource<K, E>
- implements GridDataSource {
-
- private Logger log =
- LoggerFactory.getLogger(AbstractMappedGridDataSource.class);
-
- private Map<K, E> mapResults;
-
- private List<E> listResults;
-
- private int nbRows = -1;
-
- private int nbRowsPerPage;
-
- @Override
- public abstract Class<?> getRowType();
-
- protected abstract int count();
-
- protected abstract Map<K, E> execute(int startIndex, int endIndex,
- SortConstraint orderBy);
-
- @Override
- public int getAvailableRows() {
- if (nbRows < 0) {
- nbRows = count();
- if (log.isDebugEnabled()) {
- log.debug("Count : " + nbRows);
- }
- }
- return nbRows;
- }
-
- @Override
- public void prepare(int startIndex, int endIndex,
- List<SortConstraint> sortConstraints) {
- if (log.isDebugEnabled()) {
- log.debug("Prepare results : " + startIndex + ", " + endIndex);
- }
- nbRowsPerPage = endIndex - startIndex + 1;
- mapResults = execute(startIndex, endIndex,
- getSortConstraint(sortConstraints));
- listResults = new ArrayList<E>(mapResults.values());
- }
-
- @Override
- public Object getRowValue(int index) {
- index = index % nbRowsPerPage;
- if (index >= listResults.size()) {
- if (log.isErrorEnabled()) {
- log.error("Size error : " + index + " / " + listResults.size());
- }
- return null;
- }
- return CollectionUtils.get(listResults, index);
- }
-
- public E get(K key) {
- return mapResults.get(key);
- }
-
- public List<E> values() {
- return listResults;
- }
-
- public boolean contains(K key) {
- return mapResults.containsKey(key);
- }
-
- protected SortConstraint getSortConstraint(
- List<SortConstraint> sortConstraints) {
- for (SortConstraint constraint : sortConstraints) {
- final ColumnSort sort = constraint.getColumnSort();
- if (sort != ColumnSort.UNSORTED) {
- return constraint;
- }
- }
- return null;
- }
-
- protected String resolveOrderBy(SortConstraint orderBy) {
- String filterOrder = null;
- if (orderBy != null) {
- PropertyModel property = orderBy.getPropertyModel();
- filterOrder = property.getPropertyName();
-
- ColumnSort sort = orderBy.getColumnSort();
- if (sort.equals(ColumnSort.DESCENDING)) {
- filterOrder += " desc";
- }
-
- if (log.isDebugEnabled()) {
- log.debug("Order : " + filterOrder);
- }
- }
- return filterOrder;
- }
-
-}
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/FavoriteParticipantDataSource.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/FavoriteParticipantDataSource.java 2010-05-04 14:07:47 UTC (rev 2985)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/FavoriteParticipantDataSource.java 2010-05-04 16:24:31 UTC (rev 2986)
@@ -8,6 +8,7 @@
import org.chorem.pollen.entity.FavoriteParticipant;
import org.chorem.pollen.entity.PollAccount;
import org.chorem.pollen.service.ServiceUser;
+import org.nuiton.web.tapestry5.data.AbstractMappedGridDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Copied: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/PollenRequiresAuthentication.java (from rev 2983, trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/RequiresAuthentication.java)
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/PollenRequiresAuthentication.java (rev 0)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/PollenRequiresAuthentication.java 2010-05-04 16:24:31 UTC (rev 2986)
@@ -0,0 +1,25 @@
+
+package org.chorem.pollen.ui.data;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation is used on pages and components that need authentication
+ * to be rendered.
+ *
+ * Created: 3 mai 2010
+ *
+ * @author fdesbois
+ * $Id$
+ */
+@Target( { ElementType.TYPE })
+(a)Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface PollenRequiresAuthentication {
+
+ boolean adminOnly() default false;
+}
Property changes on: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/PollenRequiresAuthentication.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:mergeinfo
+
Deleted: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/RequiresAuthentication.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/RequiresAuthentication.java 2010-05-04 14:07:47 UTC (rev 2985)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/RequiresAuthentication.java 2010-05-04 16:24:31 UTC (rev 2986)
@@ -1,25 +0,0 @@
-
-package org.chorem.pollen.ui.data;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * This annotation is used on pages and components that need authentication
- * to be rendered.
- *
- * Created: 3 mai 2010
- *
- * @author fdesbois
- * $Id$
- */
-@Target( { ElementType.TYPE })
-(a)Retention(RetentionPolicy.RUNTIME)
-@Documented
-public @interface RequiresAuthentication {
-
- boolean adminOnly() default false;
-}
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/UserAccountDataSource.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/UserAccountDataSource.java 2010-05-04 14:07:47 UTC (rev 2985)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/data/UserAccountDataSource.java 2010-05-04 16:24:31 UTC (rev 2986)
@@ -7,6 +7,7 @@
import org.chorem.pollen.bean.Filter;
import org.chorem.pollen.entity.UserAccount;
import org.chorem.pollen.service.ServiceUser;
+import org.nuiton.web.tapestry5.data.AbstractMappedGridDataSource;
/**
* UserAccountDataSource
Deleted: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/mixins/Confirm.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/mixins/Confirm.java 2010-05-04 14:07:47 UTC (rev 2985)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/mixins/Confirm.java 2010-05-04 16:24:31 UTC (rev 2986)
@@ -1,47 +0,0 @@
-package org.chorem.pollen.ui.mixins;
-
-import org.apache.tapestry5.BindingConstants;
-import org.apache.tapestry5.ClientElement;
-import org.apache.tapestry5.RenderSupport;
-import org.apache.tapestry5.annotations.AfterRender;
-import org.apache.tapestry5.annotations.IncludeJavaScriptLibrary;
-import org.apache.tapestry5.annotations.InjectContainer;
-import org.apache.tapestry5.annotations.Parameter;
-import org.apache.tapestry5.ioc.annotations.Inject;
-
-/**
- * Confirm.java
- *
- * A simple mixin for attaching a javascript confirmation box to the onclick
- * event of any component that implements ClientElement.
- *
- * @author fdesbois
- * @version $Revision$
- *
- * Last update: $Date$
- * by : $Author: fdesbois $
- */
-@IncludeJavaScriptLibrary("context:js/confirm.js")
-public class Confirm {
-
- @Parameter(value = "Are you sure?", defaultPrefix = BindingConstants.MESSAGE)
- private String message;
-
- @Inject
- private RenderSupport renderSupport;
-
- @InjectContainer
- private ClientElement element;
-
- @Parameter
- private boolean wDisabled;
-
- @AfterRender
- public void afterRender() {
- if (!wDisabled) {
- renderSupport.addScript(String.format("new Confirm('%s', '%s');",
- element.getClientId(), message));
- }
- }
-
-}
Deleted: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/mixins/ZoneUpdater.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/mixins/ZoneUpdater.java 2010-05-04 14:07:47 UTC (rev 2985)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/mixins/ZoneUpdater.java 2010-05-04 16:24:31 UTC (rev 2986)
@@ -1,101 +0,0 @@
-/**
- * *##%
- * Wao :: Web Interface
- * Copyright (C) 2009 - 2010 Ifremer
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Lesser Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program. If not, see
- * <http://www.gnu.org/licenses/gpl-3.0.html>.
- * ##%*
- */
-package org.chorem.pollen.ui.mixins;
-
-import org.apache.commons.lang.ArrayUtils;
-import org.apache.tapestry5.BindingConstants;
-import org.apache.tapestry5.ClientElement;
-import org.apache.tapestry5.ComponentResources;
-import org.apache.tapestry5.Link;
-import org.apache.tapestry5.RenderSupport;
-import org.apache.tapestry5.annotations.Environmental;
-import org.apache.tapestry5.annotations.IncludeJavaScriptLibrary;
-import org.apache.tapestry5.annotations.InjectContainer;
-import org.apache.tapestry5.annotations.Parameter;
-import org.apache.tapestry5.ioc.annotations.Inject;
-
-/**
- * ZoneUpdater.java
- *
- * From http://tinybits.blogspot.com/2009/05/update-zone-on-any-client-side-event.h… by ingesol
- *
- * @author ingesol
- * @version $Revision$
- *
- * Last update: $Date$
- * by : $Author: fdesbois $
- */
-@IncludeJavaScriptLibrary("context:js/zoneUpdater.js")
-public class ZoneUpdater {
-
- public static final String PLACEHOLDER = "XXX";
-
- @Inject
- private ComponentResources resources;
-
- @Environmental
- private RenderSupport renderSupport;
-
- @Parameter(defaultPrefix = BindingConstants.LITERAL)
- private String clientEvent;
-
- @Parameter(defaultPrefix = BindingConstants.LITERAL, required = true)
- private String event;
-
- @InjectContainer
- private ClientElement element;
-
- @Parameter
- private Object[] context;
-
- @Parameter(defaultPrefix = BindingConstants.LITERAL)
- // To enable popups to fire events on this document, enter "document" here.
- private String listeningElement;
-
- @Parameter(defaultPrefix = BindingConstants.LITERAL, required = true)
- private String zone;
-
- protected Link createLink(Object[] context) {
-
- if (context == null) {
- context = new Object[]{PLACEHOLDER};
- } else {
- context = ArrayUtils.add(context, PLACEHOLDER); // To be replaced by javascript
- }
-
- return resources.createEventLink(event, context);
-
- }
-
- void afterRender() {
- String link = createLink(context).toAbsoluteURI();
- String elementId = element.getClientId();
- if (clientEvent == null) {
- clientEvent = event;
- }
-
- if (listeningElement == null) {
- listeningElement = "$('" + elementId + "')";
- }
- renderSupport.addScript("new ZoneUpdater('%s', %s, '%s', '%s', '%s', '%s')", elementId, listeningElement, clientEvent, link, zone, PLACEHOLDER);
-
- }
-}
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/admin/AdminPolls.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/admin/AdminPolls.java 2010-05-04 14:07:47 UTC (rev 2985)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/admin/AdminPolls.java 2010-05-04 16:24:31 UTC (rev 2986)
@@ -28,7 +28,7 @@
import org.chorem.pollen.service.ServicePoll;
import org.chorem.pollen.ui.base.AbstractPollsPage;
import org.chorem.pollen.ui.components.Border;
-import org.chorem.pollen.ui.components.FeedBack;
+import org.nuiton.web.tapestry5.components.FeedBack;
/**
* Classe de la page d'administration des sondages. Si l'utilisateur n'est pas
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/admin/AdminUsers.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/admin/AdminUsers.java 2010-05-04 14:07:47 UTC (rev 2985)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/admin/AdminUsers.java 2010-05-04 16:24:31 UTC (rev 2986)
@@ -39,7 +39,7 @@
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.RequiresAuthentication;
+import org.chorem.pollen.ui.data.PollenRequiresAuthentication;
import org.chorem.pollen.ui.data.UserAccountDataSource;
import org.chorem.pollen.ui.services.PollenManager;
import org.slf4j.Logger;
@@ -50,7 +50,7 @@
* @author fdesbois <fdesbois(a)codelutin.com>
* @version $Id$
*/
-@RequiresAuthentication(adminOnly = true)
+@PollenRequiresAuthentication(adminOnly = true)
@IncludeStylesheet("context:css/usersAdmin.css")
public class AdminUsers extends AbstractPollenPage {
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/CloseValidation.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/CloseValidation.java 2010-05-04 14:07:47 UTC (rev 2985)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/CloseValidation.java 2010-05-04 16:24:31 UTC (rev 2986)
@@ -31,8 +31,8 @@
import org.chorem.pollen.service.ServiceUser;
import org.chorem.pollen.ui.base.AbstractPollenPage;
import org.chorem.pollen.ui.components.Border;
-import org.chorem.pollen.ui.components.FeedBack;
import org.chorem.pollen.ui.data.AddressBarItem;
+import org.nuiton.web.tapestry5.components.FeedBack;
/**
* Classe de la page de confirmation de la cloture d'un sondage.
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/CreationValidation.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/CreationValidation.java 2010-05-04 14:07:47 UTC (rev 2985)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/CreationValidation.java 2010-05-04 16:24:31 UTC (rev 2986)
@@ -29,8 +29,8 @@
import org.chorem.pollen.entity.PollAccount;
import org.chorem.pollen.ui.base.AbstractPollenPage;
import org.chorem.pollen.ui.components.Border;
-import org.chorem.pollen.ui.components.FeedBack;
import org.chorem.pollen.ui.data.AddressBarItem;
+import org.nuiton.web.tapestry5.components.FeedBack;
/**
* Classe de la page de confirmation de la création d'un sondage.
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/ModificationValidation.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/ModificationValidation.java 2010-05-04 14:07:47 UTC (rev 2985)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/ModificationValidation.java 2010-05-04 16:24:31 UTC (rev 2986)
@@ -29,8 +29,8 @@
import org.chorem.pollen.entity.PollAccount;
import org.chorem.pollen.ui.base.AbstractPollenPage;
import org.chorem.pollen.ui.components.Border;
-import org.chorem.pollen.ui.components.FeedBack;
import org.chorem.pollen.ui.data.AddressBarItem;
+import org.nuiton.web.tapestry5.components.FeedBack;
/**
* Classe de la page de confirmation de la modification d'un sondage.
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/Results.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/Results.java 2010-05-04 14:07:47 UTC (rev 2985)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/Results.java 2010-05-04 16:24:31 UTC (rev 2986)
@@ -48,8 +48,8 @@
import org.chorem.pollen.ui.base.AbstractPollenPage;
import org.chorem.pollen.ui.components.Border;
import org.chorem.pollen.ui.components.Chart;
-import org.chorem.pollen.ui.components.FeedBack;
import org.chorem.pollen.ui.data.AddressBarItem;
+import org.nuiton.web.tapestry5.components.FeedBack;
import org.slf4j.Logger;
/**
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/VoteForPoll.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/VoteForPoll.java 2010-05-04 14:07:47 UTC (rev 2985)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/poll/VoteForPoll.java 2010-05-04 16:24:31 UTC (rev 2986)
@@ -52,13 +52,13 @@
import org.chorem.pollen.service.ServiceUser;
import org.chorem.pollen.ui.base.AbstractUploadPage;
import org.chorem.pollen.ui.components.Border;
-import org.chorem.pollen.ui.components.FeedBack;
import org.chorem.pollen.ui.components.Pager;
import org.chorem.pollen.ui.data.AddressBar;
import org.chorem.pollen.ui.data.ChoiceField;
import org.chorem.pollen.ui.data.PollUri;
import org.chorem.pollen.ui.services.PollenManager;
import org.chorem.pollen.ui.services.ServiceImage;
+import org.nuiton.web.tapestry5.components.FeedBack;
import org.slf4j.Logger;
/**
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserLists.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserLists.java 2010-05-04 14:07:47 UTC (rev 2985)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserLists.java 2010-05-04 16:24:31 UTC (rev 2986)
@@ -29,7 +29,7 @@
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.RequiresAuthentication;
+import org.chorem.pollen.ui.data.PollenRequiresAuthentication;
/**
* Classe de la page d'affichage des listes de votants favorites de
@@ -40,7 +40,7 @@
* @author fdesbois <fdesbois(a)codelutin.com>
* @version $Id$
*/
-@RequiresAuthentication
+@PollenRequiresAuthentication
@IncludeStylesheet("context:css/lists.css")
public class UserLists extends AbstractPollenPage {
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserProfile.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserProfile.java 2010-05-04 14:07:47 UTC (rev 2985)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/pages/user/UserProfile.java 2010-05-04 16:24:31 UTC (rev 2986)
@@ -38,7 +38,7 @@
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.RequiresAuthentication;
+import org.chorem.pollen.ui.data.PollenRequiresAuthentication;
import org.chorem.pollen.ui.services.PollenManager;
import org.slf4j.Logger;
@@ -49,7 +49,7 @@
* @author rannou
* @version $Id$
*/
-@RequiresAuthentication
+@PollenRequiresAuthentication
@IncludeStylesheet("context:css/account.css")
public class UserProfile extends AbstractPollenPage {
Modified: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/AppModule.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/AppModule.java 2010-05-04 14:07:47 UTC (rev 2985)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/AppModule.java 2010-05-04 16:24:31 UTC (rev 2986)
@@ -28,9 +28,8 @@
import org.apache.tapestry5.services.ApplicationStateContribution;
import org.apache.tapestry5.services.ApplicationStateCreator;
import org.apache.tapestry5.services.ApplicationStateManager;
-import org.apache.tapestry5.services.BindingFactory;
-import org.apache.tapestry5.services.BindingSource;
import org.apache.tapestry5.services.ComponentRequestFilter;
+import org.apache.tapestry5.services.LibraryMapping;
import org.apache.tapestry5.upload.services.UploadSymbols;
import org.chorem.pollen.PollenContextImpl;
import org.chorem.pollen.entity.UserAccount;
@@ -94,7 +93,7 @@
public ServiceAuthentication<UserAccount> buildServiceAuthentication(
ApplicationStateManager stateManager) {
ServiceAuthentication<UserAccount> instance =
- new ServiceAuthenticationImpl(stateManager);
+ new PollenAuthentication(stateManager);
return instance;
}
@@ -213,6 +212,8 @@
// .getComponentResources().getMessages();
// return new BackgroundWorkerImpl(messages, servicePoll, context);
// }
+
+
/**
* Used to instanciate SessionState UserAccount when session expires.
*
@@ -252,12 +253,6 @@
public static void contributeComponentRequestHandler(
OrderedConfiguration<ComponentRequestFilter> configuration) {
configuration.addInstance("RequiresAuthentication",
- AuthenticationFilter.class);
+ PollenAuthenticationFilter.class);
}
-
- public static void contributeBindingSource(
- MappedConfiguration<String, BindingFactory> configuration,
- BindingSource bindingSource) {
- configuration.add("format", new FormatBindingFactory(bindingSource));
- }
}
Deleted: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/AuthenticationFilter.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/AuthenticationFilter.java 2010-05-04 14:07:47 UTC (rev 2985)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/AuthenticationFilter.java 2010-05-04 16:24:31 UTC (rev 2986)
@@ -1,43 +0,0 @@
-
-package org.chorem.pollen.ui.services;
-
-import org.apache.tapestry5.services.ComponentSource;
-import org.apache.tapestry5.services.PageRenderLinkSource;
-import org.apache.tapestry5.services.Response;
-import org.chorem.pollen.entity.UserAccount;
-import org.chorem.pollen.ui.data.RequiresAuthentication;
-import org.chorem.pollen.ui.pages.Connexion;
-import org.chorem.pollen.ui.pages.ErrorPage;
-import org.nuiton.web.tapestry5.services.AbstractAuthenticationFilter;
-import org.nuiton.web.tapestry5.services.ServiceAuthentication;
-
-/**
- * AuthenticationFilter
- *
- * Created: 4 mai 2010
- *
- * @author fdesbois
- * $Id$
- */
-public class AuthenticationFilter extends
- AbstractAuthenticationFilter<UserAccount, RequiresAuthentication>{
-
- public AuthenticationFilter(PageRenderLinkSource renderLinkSource,
- ComponentSource componentSource, Response response,
- ServiceAuthentication<UserAccount> serviceAuthentication) {
- super(renderLinkSource, componentSource, response,
- serviceAuthentication, RequiresAuthentication.class);
- }
-
- @Override
- protected Class<?> getRedirectPage(AuthenticationRedirect redirectType) {
- switch (redirectType) {
- case CONNEXION:
- return Connexion.class;
- case NOT_ALLOWED:
- return ErrorPage.class;
- }
- return null;
- }
-
-}
Deleted: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/FormatBinding.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/FormatBinding.java 2010-05-04 14:07:47 UTC (rev 2985)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/FormatBinding.java 2010-05-04 16:24:31 UTC (rev 2986)
@@ -1,72 +0,0 @@
-package org.chorem.pollen.ui.services;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.tapestry5.Binding;
-import org.apache.tapestry5.internal.bindings.AbstractBinding;
-import org.apache.tapestry5.ioc.Location;
-import org.apache.tapestry5.ioc.Messages;
-
-/**
- * From <http://wiki.apache.org/tapestry/Tapestry5HowToAddMessageFormatBindingPrefix>
- *
- * Created: 27 avr. 2010
- *
- * @author fdesbois
- */
-public class FormatBinding extends AbstractBinding {
-
- private final Messages messages;
- private final boolean invariant;
- private final List<Binding> keyBindings;
- private final List<Binding> valueBindings;
-
- public FormatBinding(Location location, Messages messages, boolean invariant,
- ArrayList<Binding> keyBindings, List<Binding> valueBindings) {
- super(location);
-
- this.messages = messages;
- this.invariant = invariant;
- this.keyBindings = keyBindings;
- this.valueBindings = valueBindings;
- }
-
- public FormatBinding(Location location, Messages messages, boolean invariant, ArrayList<Binding> keyBindings) {
- super(location);
-
- this.messages = messages;
- this.invariant = invariant;
- this.keyBindings = keyBindings;
- this.valueBindings = null;
- }
-
- @Override
- public Object get() {
- String key = "";
- for (Binding keyBinding : keyBindings) {
- key += keyBinding.get();
- }
-
- if (null == valueBindings) {
- return messages.get(key);
- }
-
- List<Object> values = new ArrayList<Object>(valueBindings.size());
- for (Binding valueBinding : valueBindings) {
- values.add(valueBinding.get());
- }
-
- return messages.format(key, values.toArray());
- }
-
- @Override
- public boolean isInvariant() {
- return this.invariant;
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public Class<?> getBindingType() {
- return String.class;
- }
-}
Deleted: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/FormatBindingFactory.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/FormatBindingFactory.java 2010-05-04 14:07:47 UTC (rev 2985)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/FormatBindingFactory.java 2010-05-04 16:24:31 UTC (rev 2986)
@@ -1,79 +0,0 @@
-package org.chorem.pollen.ui.services;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import org.apache.tapestry5.Binding;
-import org.apache.tapestry5.BindingConstants;
-import org.apache.tapestry5.ComponentResources;
-import org.apache.tapestry5.ioc.Location;
-import org.apache.tapestry5.services.BindingFactory;
-import org.apache.tapestry5.services.BindingSource;
-
-/**
- * From <http://wiki.apache.org/tapestry/Tapestry5HowToAddMessageFormatBindingPrefix>
- *
- * Created: 27 avr. 2010
- *
- * @author fdesbois
- */
-public class FormatBindingFactory
- implements BindingFactory {
-
- private static final String SEPARATOR = "=";
- private static final String DELIMITER = ",";
- private static final String KEY_PREFIX = BindingConstants.LITERAL;
- private static final String VALUE_PREFIX = BindingConstants.PROP;
- private final BindingSource bindingSource;
-
- public FormatBindingFactory(BindingSource bindingSource) {
- this.bindingSource = bindingSource;
- }
-
- @Override
- public Binding newBinding(String description, ComponentResources container, ComponentResources component,
- String expression, Location location) {
- int separatorIndex = expression.indexOf(SEPARATOR);
-
- if (-1 == separatorIndex) {
- List<String> keys = Arrays.asList(expression.split(DELIMITER));
-
- ArrayList<Binding> keyBindings = createBindings(description, container, component, KEY_PREFIX, keys, location);
-
- boolean invariant = isInvariant(keyBindings);
- return new FormatBinding(location, container.getMessages(), invariant, keyBindings);
- }
-
- List<String> keys = Arrays.asList(expression.substring(0, separatorIndex).split(DELIMITER));
- ArrayList<Binding> keyBindings = createBindings(description, container, component, KEY_PREFIX, keys, location);
-
- List<String> values = Arrays.asList(expression.substring(separatorIndex + 1).split(DELIMITER));
- ArrayList<Binding> valueBindings = createBindings(description, container, component, VALUE_PREFIX, values,
- location);
-
- boolean invariant = isInvariant(keyBindings) && isInvariant(valueBindings);
- return new FormatBinding(location, container.getMessages(), invariant, keyBindings, valueBindings);
- }
-
- private ArrayList<Binding> createBindings(String description, ComponentResources container,
- ComponentResources component, String defaultPrefix,
- List<String> expressions, Location location) {
- ArrayList<Binding> bindings = new ArrayList<Binding>(expressions.size());
-
- for (String expression : expressions) {
- bindings.add(bindingSource.newBinding(description, container, component, defaultPrefix, expression, location));
- }
-
- return bindings;
- }
-
- private boolean isInvariant(ArrayList<Binding> bindings) {
- for (Binding binding : bindings) {
- if (!binding.isInvariant()) {
- return false;
- }
- }
-
- return true;
- }
-}
Copied: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenAuthentication.java (from rev 2985, trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/ServiceAuthenticationImpl.java)
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenAuthentication.java (rev 0)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenAuthentication.java 2010-05-04 16:24:31 UTC (rev 2986)
@@ -0,0 +1,38 @@
+
+package org.chorem.pollen.ui.services;
+
+import org.apache.tapestry5.services.ApplicationStateManager;
+import org.chorem.pollen.entity.UserAccount;
+import org.chorem.pollen.entity.UserAccountImpl;
+import org.chorem.pollen.ui.data.PollenRequiresAuthentication;
+import org.nuiton.web.tapestry5.services.ServiceAuthenticationImpl;
+
+/**
+ * ServiceAuthenticationImpl
+ *
+ * Created: 4 mai 2010
+ *
+ * @author fdesbois
+ * $Id$
+ */
+public class PollenAuthentication extends
+ ServiceAuthenticationImpl<UserAccount, PollenRequiresAuthentication> {
+
+ public PollenAuthentication(ApplicationStateManager stateManager) {
+ super(stateManager, UserAccount.class,
+ PollenRequiresAuthentication.class);
+ }
+
+ @Override
+ protected boolean checkAuthorizations(UserAccount user,
+ PollenRequiresAuthentication annotation) {
+ // No problem for an admin or if the annotation has no limitation
+ return user.getAdmin() || !annotation.adminOnly();
+ }
+
+ @Override
+ public UserAccount getNewUserInstance() {
+ return new UserAccountImpl();
+ }
+
+}
Property changes on: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenAuthentication.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:mergeinfo
+
Copied: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenAuthenticationFilter.java (from rev 2985, trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/AuthenticationFilter.java)
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenAuthenticationFilter.java (rev 0)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenAuthenticationFilter.java 2010-05-04 16:24:31 UTC (rev 2986)
@@ -0,0 +1,43 @@
+
+package org.chorem.pollen.ui.services;
+
+import org.apache.tapestry5.services.ComponentSource;
+import org.apache.tapestry5.services.PageRenderLinkSource;
+import org.apache.tapestry5.services.Response;
+import org.chorem.pollen.entity.UserAccount;
+import org.chorem.pollen.ui.data.PollenRequiresAuthentication;
+import org.chorem.pollen.ui.pages.Connexion;
+import org.chorem.pollen.ui.pages.ErrorPage;
+import org.nuiton.web.tapestry5.services.AbstractAuthenticationFilter;
+import org.nuiton.web.tapestry5.services.ServiceAuthentication;
+
+/**
+ * AuthenticationFilter
+ *
+ * Created: 4 mai 2010
+ *
+ * @author fdesbois
+ * $Id$
+ */
+public class PollenAuthenticationFilter extends
+ AbstractAuthenticationFilter<UserAccount, PollenRequiresAuthentication>{
+
+ public PollenAuthenticationFilter(PageRenderLinkSource renderLinkSource,
+ ComponentSource componentSource, Response response,
+ ServiceAuthentication<UserAccount> serviceAuthentication) {
+ super(renderLinkSource, componentSource, response,
+ serviceAuthentication, PollenRequiresAuthentication.class);
+ }
+
+ @Override
+ protected Class<?> getRedirectPage(AuthenticationRedirect redirectType) {
+ switch (redirectType) {
+ case NOT_CONNECTED:
+ return Connexion.class;
+ case NOT_ALLOWED:
+ return ErrorPage.class;
+ }
+ return null;
+ }
+
+}
Property changes on: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/PollenAuthenticationFilter.java
___________________________________________________________________
Added: svn:keywords
+ Author Date Id Revision HeadURL
Added: svn:mergeinfo
+
Deleted: trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/ServiceAuthenticationImpl.java
===================================================================
--- trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/ServiceAuthenticationImpl.java 2010-05-04 14:07:47 UTC (rev 2985)
+++ trunk/pollen-ui/src/main/java/org/chorem/pollen/ui/services/ServiceAuthenticationImpl.java 2010-05-04 16:24:31 UTC (rev 2986)
@@ -1,37 +0,0 @@
-
-package org.chorem.pollen.ui.services;
-
-import org.apache.tapestry5.services.ApplicationStateManager;
-import org.chorem.pollen.entity.UserAccount;
-import org.chorem.pollen.entity.UserAccountImpl;
-import org.chorem.pollen.ui.data.RequiresAuthentication;
-import org.nuiton.web.tapestry5.services.ServiceAuthenticationAbstract;
-
-/**
- * ServiceAuthenticationImpl
- *
- * Created: 4 mai 2010
- *
- * @author fdesbois
- * $Id$
- */
-public class ServiceAuthenticationImpl extends
- ServiceAuthenticationAbstract<UserAccount, RequiresAuthentication> {
-
- public ServiceAuthenticationImpl(ApplicationStateManager stateManager) {
- super(stateManager, UserAccount.class, RequiresAuthentication.class);
- }
-
- @Override
- protected boolean checkAuthorizations(UserAccount user,
- RequiresAuthentication annotation) {
- // No problem for an admin or if the annotation has no limitation
- return user.getAdmin() || !annotation.adminOnly();
- }
-
- @Override
- public UserAccount getNewUserInstance() {
- return new UserAccountImpl();
- }
-
-}
Modified: trunk/pollen-ui/src/main/webapp/admin/AdminUsers.tml
===================================================================
--- trunk/pollen-ui/src/main/webapp/admin/AdminUsers.tml 2010-05-04 14:07:47 UTC (rev 2985)
+++ trunk/pollen-ui/src/main/webapp/admin/AdminUsers.tml 2010-05-04 16:24:31 UTC (rev 2986)
@@ -53,7 +53,7 @@
<img src="${asset:context:img/editSmall.png}" alt="Edit" title="${message:pollen.ui.user.update.edit}" />
</a>
<a t:type="actionlink" t:id="deleteAccount" t:context="account.login"
- t:mixins="confirm" t:message="pollen.ui.user.delete.confirmMessage">
+ t:mixins="nuiton/confirm" t:message="pollen.ui.user.delete.confirmMessage">
<img src="${asset:context:img/delete.png}" alt="Delete" title="${message:pollen.ui.user.delete}"/>
</a>
</p:else>
Modified: trunk/pollen-ui/src/main/webapp/css/common.css
===================================================================
--- trunk/pollen-ui/src/main/webapp/css/common.css 2010-05-04 14:07:47 UTC (rev 2985)
+++ trunk/pollen-ui/src/main/webapp/css/common.css 2010-05-04 16:24:31 UTC (rev 2986)
@@ -34,6 +34,7 @@
display: block;
}
+/** feedback.css not worked yet in nuiton-tapestry-extra **/
.fb-error {
width: 400px;
margin: auto;
Deleted: trunk/pollen-ui/src/main/webapp/js/confirm.js
===================================================================
--- trunk/pollen-ui/src/main/webapp/js/confirm.js 2010-05-04 14:07:47 UTC (rev 2985)
+++ trunk/pollen-ui/src/main/webapp/js/confirm.js 2010-05-04 16:24:31 UTC (rev 2986)
@@ -1,20 +0,0 @@
-/**
- * Dialogue de confirmation
- */
-var Confirm = Class.create({
- /**
- * element : Element DOM depuis lequel le dialogue de confirmation va s'ouvrir
- * message : Message à afficher dans la boîte de dialogue
- */
- initialize: function(element, message) {
- this.message = message;
- Event.observe($(element), 'click', this.doConfirm.bindAsEventListener(this));
- },
- doConfirm: function(e) {
- //Tapestry.debug('click ' + element);
- if(! confirm(this.message)) {
- //Tapestry.debug('STOP ' + e);
- Event.stop(e);
- }
- }
-});
\ No newline at end of file
Deleted: trunk/pollen-ui/src/main/webapp/js/zoneUpdater.js
===================================================================
--- trunk/pollen-ui/src/main/webapp/js/zoneUpdater.js 2010-05-04 14:07:47 UTC (rev 2985)
+++ trunk/pollen-ui/src/main/webapp/js/zoneUpdater.js 2010-05-04 16:24:31 UTC (rev 2986)
@@ -1,103 +0,0 @@
-var ZoneUpdater = Class.create();
-
-ZoneUpdater.prototype = {
-
- initialize: function(zoneElementId, listeningElement, event, link, zone, placeholder) {
-
- this.zoneElement = $(zoneElementId);
-
- this.event = event;
-
- this.link = link;
-
- this.placeholder = placeholder;
-
- $T(this.zoneElement).zoneId = zone;
-
- listeningElement.observe(this.event, this.updateZone.bindAsEventListener(this));
-
- },
-
- updateZone: function(event) {
-
- var zoneObject = Tapestry.findZoneManager(this.zoneElement);
-
- if ( !zoneObject ) return;
-
- var param;
-
- if (this.zoneElement.value) {
-
- param = this.zoneElement.value;
-
- }
-
- if (!param) param = ' ';
-
- param = this.encodeForUrl(param);
-
- var updatedLink = this.link.gsub(this.placeholder, param);
-
- zoneObject.updateFromURL(updatedLink);
-
- },
-
- encodeForUrl: function(string) {
-
- /**
-
- * See equanda.js for updated version of this
-
- */
-
- string = string.replace(/\r\n/g,"\n");
-
- var res = "";
-
- for (var n = 0; n < string.length; n++)
-
- {
-
- var c = string.charCodeAt( n );
-
- if ( '$' == string.charAt( n ) )
-
- {
-
- res += '$$';
-
- }
-
- else if ( this.inRange( c, "AZ" ) || this.inRange( c, "az" ) || this.inRange( c, "09" ) || this.inRange( c, ".." ) )
-
- {
-
- res += string.charAt( n )
-
- }
-
- else
-
- {
-
- var tmp = c.toString(16);
-
- while ( tmp.length < 4 ) tmp = "0" + tmp;
-
- res += '$' + tmp;
-
- }
-
- }
-
- return res;
-
- },
-
- inRange: function(code, range) {
-
- return code >= range.charCodeAt( 0 ) && code <= range.charCodeAt( 1 );
-
- }
-
-}
\ No newline at end of file
1
0