Chorem-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
- 542 discussions
r136 - trunk/chorem-entities/src/main/java/org/chorem/entities
by bpoussin@users.chorem.org 24 Apr '12
by bpoussin@users.chorem.org 24 Apr '12
24 Apr '12
Author: bpoussin
Date: 2012-04-24 16:55:08 +0200 (Tue, 24 Apr 2012)
New Revision: 136
Url: http://chorem.org/repositories/revision/chorem/136
Log:
utilisation de WikittyClient au lieu de WikittyProxy
Modified:
trunk/chorem-entities/src/main/java/org/chorem/entities/InvoiceableUtil.java
Modified: trunk/chorem-entities/src/main/java/org/chorem/entities/InvoiceableUtil.java
===================================================================
--- trunk/chorem-entities/src/main/java/org/chorem/entities/InvoiceableUtil.java 2012-04-23 13:11:43 UTC (rev 135)
+++ trunk/chorem-entities/src/main/java/org/chorem/entities/InvoiceableUtil.java 2012-04-24 14:55:08 UTC (rev 136)
@@ -5,6 +5,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.wikitty.ScriptEvaluator;
+import org.nuiton.wikitty.WikittyClient;
import org.nuiton.wikitty.WikittyProxy;
/**
@@ -22,9 +23,9 @@
/** to use log facility, just put in your code: log.info(\"...\"); */
static private Log log = LogFactory.getLog(InvoiceableUtil.class);
- static public boolean evalCondition(WikittyProxy proxy, Invoiceable invoiceable) {
+ static public boolean evalCondition(WikittyClient client, Invoiceable invoiceable) {
Map<String, Object> bindings = new HashMap<String, Object>();
- bindings.put("proxy", proxy);
+ bindings.put("wikittyClient", client);
bindings.put("invoiceable", invoiceable);
Object resultEval = ScriptEvaluator.eval(null,
invoiceable.getName(), invoiceable.getCondition(),
@@ -33,9 +34,9 @@
return result;
}
- static public double evalValue(WikittyProxy proxy, Invoiceable invoiceable) {
+ static public double evalValue(WikittyClient client, Invoiceable invoiceable) {
Map<String, Object> bindings = new HashMap<String, Object>();
- bindings.put("proxy", proxy);
+ bindings.put("wikittyClient", client);
bindings.put("invoiceable", invoiceable);
Object resultEval = ScriptEvaluator.eval(null,
invoiceable.getName(), invoiceable.getValue(),
1
0
Author: bpoussin
Date: 2012-04-23 15:11:43 +0200 (Mon, 23 Apr 2012)
New Revision: 135
Url: http://chorem.org/repositories/revision/chorem/135
Log:
Commit en l'etat de chorem/webmotion
Added:
trunk/chorem-entities/src/main/java/org/chorem/ChoremAction.java
trunk/chorem-entities/src/main/java/org/chorem/ChoremClient.java
trunk/chorem-entities/src/main/java/org/chorem/ChoremConfig.java
trunk/chorem-entities/src/main/java/org/chorem/ChoremConfigAction.java
trunk/chorem-entities/src/main/java/org/chorem/ChoremConfigOption.java
trunk/chorem-entities/src/main/java/org/chorem/ChoremMain.java
trunk/chorem-entities/src/main/java/org/chorem/ImportChoremTopia.java
trunk/chorem-entities/src/main/resources/
trunk/chorem-entities/src/main/resources/chorem.properties
trunk/chorem-entities/src/main/resources/log4j.properties
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/gepeto/projects.jsp
trunk/chorem-web/src/test/
trunk/chorem-web/src/test/java/
trunk/chorem-web/src/test/java/org/
trunk/chorem-web/src/test/java/org/chorem/
trunk/chorem-web/src/test/java/org/chorem/entities/
trunk/chorem-webmotion/
trunk/chorem-webmotion/LICENSE.txt
trunk/chorem-webmotion/README.txt
trunk/chorem-webmotion/changelog.txt
trunk/chorem-webmotion/nb-configuration.xml
trunk/chorem-webmotion/pom.xml
trunk/chorem-webmotion/src/
trunk/chorem-webmotion/src/main/
trunk/chorem-webmotion/src/main/i18n/
trunk/chorem-webmotion/src/main/i18n/jsp.rules
trunk/chorem-webmotion/src/main/java/
trunk/chorem-webmotion/src/main/java/org/
trunk/chorem-webmotion/src/main/java/org/chorem/
trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/
trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/
trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/GenericAction.java
trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/filters/
trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/filters/ChoremClientFilter.java
trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/filters/DecoratorFilter.java
trunk/chorem-webmotion/src/main/java/org/wikitty/
trunk/chorem-webmotion/src/main/java/org/wikitty/web/
trunk/chorem-webmotion/src/main/java/org/wikitty/web/jsptag/
trunk/chorem-webmotion/src/main/java/org/wikitty/web/jsptag/WikittyInput.java
trunk/chorem-webmotion/src/main/resources/
trunk/chorem-webmotion/src/main/resources/i18n/
trunk/chorem-webmotion/src/main/resources/i18n/chorem-webmotion_en_GB.properties
trunk/chorem-webmotion/src/main/resources/i18n/chorem-webmotion_fr_FR.properties
trunk/chorem-webmotion/src/main/resources/log4j.properties
trunk/chorem-webmotion/src/main/resources/mapping
trunk/chorem-webmotion/src/main/webapp/
trunk/chorem-webmotion/src/main/webapp/WEB-INF/
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/contact.jsp
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/decorator.jsp
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/edit.jsp
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/footerPerson.jsp
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/index.jsp
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/search.jsp
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/view.jsp
trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/wikittyFieldView.jsp
trunk/chorem-webmotion/src/main/webapp/WEB-INF/web.xml
trunk/chorem-webmotion/src/main/webapp/WEB-INF/wikitty.tld
trunk/chorem-webmotion/src/main/webapp/css/
trunk/chorem-webmotion/src/main/webapp/css/bootstrap-responsive.min.css
trunk/chorem-webmotion/src/main/webapp/css/bootstrap.min.css
trunk/chorem-webmotion/src/main/webapp/css/chorem.less
trunk/chorem-webmotion/src/main/webapp/css/token-input-facebook.css
trunk/chorem-webmotion/src/main/webapp/css/token-input-mac.css
trunk/chorem-webmotion/src/main/webapp/css/token-input.css
trunk/chorem-webmotion/src/main/webapp/img/
trunk/chorem-webmotion/src/main/webapp/img/glyphicons-halflings-white.png
trunk/chorem-webmotion/src/main/webapp/img/glyphicons-halflings.png
trunk/chorem-webmotion/src/main/webapp/js/
trunk/chorem-webmotion/src/main/webapp/js/bootstrap.min.js
trunk/chorem-webmotion/src/main/webapp/js/chorem.js
trunk/chorem-webmotion/src/main/webapp/js/jquery.maskedinput-1.3.js
trunk/chorem-webmotion/src/main/webapp/js/jquery.tokeninput.js
trunk/chorem-webmotion/src/main/webapp/js/less-1.2.1.min.js
Removed:
trunk/chorem-web/src/main/java/org/chorem/ChoremConfig.java
trunk/chorem-web/src/main/java/org/chorem/ChoremConfigOption.java
trunk/chorem-web/src/main/java/org/chorem/ChoremProxy.java
trunk/chorem-web/src/main/resources/chorem.properties
trunk/chorem-web/src/main/resources/log4j.properties
Modified:
trunk/
trunk/chorem-entities/pom.xml
trunk/chorem-entities/src/main/xmi/chorem.properties
trunk/chorem-entities/src/main/xmi/chorem.zargo
trunk/chorem-entities/src/test/java/org/chorem/entities/InvoiceableUtilTest.java
trunk/chorem-web/src/main/java/org/chorem/ChoremSession.java
trunk/chorem-web/src/main/java/org/chorem/action/EntitySearchJsonAction.java
trunk/chorem-web/src/main/java/org/chorem/action/HomeAction.java
trunk/chorem-web/src/main/resources/struts.xml
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companies.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/persons.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/gepeto/menu.jsp
trunk/pom.xml
Property changes on: trunk
___________________________________________________________________
Added: svn:ignore
+ target
Modified: trunk/chorem-entities/pom.xml
===================================================================
--- trunk/chorem-entities/pom.xml 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-entities/pom.xml 2012-04-23 13:11:43 UTC (rev 135)
@@ -24,6 +24,11 @@
<!-- compile dependencies -->
<dependency>
+ <groupId>net.sf.opencsv</groupId>
+ <artifactId>opencsv</artifactId>
+ </dependency>
+
+ <dependency>
<groupId>org.nuiton</groupId>
<artifactId>nuiton-utils</artifactId>
</dependency>
@@ -34,6 +39,18 @@
</dependency>
<dependency>
+ <groupId>org.nuiton.wikitty</groupId>
+ <artifactId>wikitty-jdbc</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.nuiton.wikitty</groupId>
+ <artifactId>wikitty-solr</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+
+ <dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
</dependency>
Added: trunk/chorem-entities/src/main/java/org/chorem/ChoremAction.java
===================================================================
--- trunk/chorem-entities/src/main/java/org/chorem/ChoremAction.java (rev 0)
+++ trunk/chorem-entities/src/main/java/org/chorem/ChoremAction.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,38 @@
+package org.chorem;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.util.ApplicationConfig;
+
+/**
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class ChoremAction {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(ChoremAction.class);
+
+ /**
+ * Remove all data in database, used with caution
+ */
+ static public void clean() {
+ System.out.println("Cleaning database ...");
+ ChoremClient proxy = ChoremClient.getClient();
+ proxy.clear();
+ System.out.println("... clean done");
+ }
+
+ static public void configInfo() {
+ ApplicationConfig config = ChoremConfig.getConfig();
+ config.printConfig();
+ }
+
+ static public void help() {
+ System.out.println("Chorem Main Help");
+ }
+}
Added: trunk/chorem-entities/src/main/java/org/chorem/ChoremClient.java
===================================================================
--- trunk/chorem-entities/src/main/java/org/chorem/ChoremClient.java (rev 0)
+++ trunk/chorem-entities/src/main/java/org/chorem/ChoremClient.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,153 @@
+package org.chorem;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.commons.lang3.StringUtils;
+
+import org.chorem.entities.Attachment;
+import org.chorem.entities.ContactDetails;
+
+import org.nuiton.util.ApplicationConfig;
+import org.nuiton.wikitty.WikittyClient;
+import org.nuiton.wikitty.WikittyService;
+import org.nuiton.wikitty.WikittyServiceFactory;
+import org.nuiton.wikitty.entities.WikittyExtension;
+import org.nuiton.wikitty.query.WikittyQuery;
+import org.nuiton.wikitty.query.WikittyQueryMaker;
+import org.nuiton.wikitty.query.WikittyQueryResult;
+
+/**
+ * Proxy pour l'application. Certaines methodes specifiques pour l'application
+ * peuvent y etre ajoutees (ex: des find particulier)
+ */
+public class ChoremClient extends WikittyClient {
+
+ static protected WikittyService ws = null;
+
+ protected ChoremClient(ApplicationConfig config, WikittyService ws) {
+ super(config, ws);
+ }
+
+ /**
+ * Returns new ChoremClient instance with specified security token
+ *
+ * @param token can be null, if no authorisation token already exist (no login done)
+ * @return
+ */
+ static public ChoremClient getClient(String token) {
+ ApplicationConfig config = ChoremConfig.getConfig();
+ WikittyService ws = getWikittyService(config);
+ ChoremClient result = new ChoremClient(config, ws);
+ result.setSecurityToken(token);
+
+ return result;
+ }
+
+ /**
+ * Return new ChoremClient instance with authentication done with login and
+ * password found in application configuration. If no login found
+ * ChoremClient returned doesn't have authentication.
+ *
+ * @return
+ */
+ static public ChoremClient getClient() {
+ ApplicationConfig config = ChoremConfig.getConfig();
+ String login = config.getOption(ChoremConfigOption.CHOREM_LOGIN.key);
+ String password = config.getOption(ChoremConfigOption.CHOREM_PASSWORD.key);
+
+ ChoremClient result = getClient(login, password);
+
+ return result;
+ }
+
+ /**
+ * return new ChoremClient instance with authentication done with
+ * login and password in argument, only if login is not null and not blank
+ *
+ * @param login login used for authentication
+ * @param password password used for authentication
+ */
+ static public ChoremClient getClient(String login, String password) {
+ ChoremClient result = getClient(null);
+
+ if (StringUtils.isNotBlank(login)) {
+ result.login(login, password);
+ }
+ return result;
+ }
+
+ /**
+ * Returns WikittyService to use. This WikittyService is singleton.
+ *
+ * @param config
+ * @return WikittyService instance
+ */
+ static protected WikittyService getWikittyService(ApplicationConfig config) {
+ if (ws == null) {
+ synchronized(ChoremClient.class) {
+ if (ws == null) {
+ ws = WikittyServiceFactory.buildWikittyService(config);
+
+ // register last entity versions in database
+ List<WikittyExtension> exts = new ArrayList<WikittyExtension>();
+
+ exts.addAll(org.chorem.entities.AttachmentAbstract.extensions);
+ exts.addAll(org.chorem.entities.CompanyAbstract.extensions);
+ exts.addAll(org.chorem.entities.ContactDetailsAbstract.extensions);
+ exts.addAll(org.chorem.entities.EmployeeAbstract.extensions);
+ exts.addAll(org.chorem.entities.EvaluationAbstract.extensions);
+ exts.addAll(org.chorem.entities.GoalAbstract.extensions);
+ exts.addAll(org.chorem.entities.IntervalAbstract.extensions);
+ exts.addAll(org.chorem.entities.InterviewAbstract.extensions);
+ exts.addAll(org.chorem.entities.InvoiceableAbstract.extensions);
+ exts.addAll(org.chorem.entities.InvoiceAbstract.extensions);
+ exts.addAll(org.chorem.entities.MissionAbstract.extensions);
+ exts.addAll(org.chorem.entities.PersonAbstract.extensions);
+ exts.addAll(org.chorem.entities.PersonSkillAbstract.extensions);
+ exts.addAll(org.chorem.entities.ProjectOrderAbstract.extensions);
+ exts.addAll(org.chorem.entities.ProjectAbstract.extensions);
+ exts.addAll(org.chorem.entities.QuotationAbstract.extensions);
+ exts.addAll(org.chorem.entities.SkillAbstract.extensions);
+ exts.addAll(org.chorem.entities.TaskAbstract.extensions);
+ exts.addAll(org.chorem.entities.TimeAbstract.extensions);
+ exts.addAll(org.chorem.entities.TouchAbstract.extensions);
+ exts.addAll(org.chorem.entities.VacationAbstract.extensions);
+ exts.addAll(org.chorem.entities.WorkerAbstract.extensions);
+
+ ws.storeExtension(null, exts);
+ }
+ }
+ }
+ return ws;
+ }
+
+ /**
+ * Returns the attachments linked with a wikitty id ordered by date
+ *
+ * @param wikittyId
+ * @return the list of attachments
+ */
+ static public List<Attachment> getAttachments(String wikittyId) {
+ WikittyQuery criteria = new WikittyQueryMaker()
+ .eq(Attachment.FQ_FIELD_ATTACHMENT_TARGET, wikittyId).end();
+ WikittyQueryResult<Attachment> result = getClient(null)
+ .findAllByQuery(Attachment.class, criteria);
+ List<Attachment> attachments = result.getAll();
+ return attachments;
+ }
+
+ /**
+ * Returns the contact details linked with a wikitty id
+ *
+ * @param wikittyId
+ * @return the list of contact details
+ */
+ static public List<ContactDetails> getContactDetails(String wikittyId) {
+ WikittyQuery criteria = new WikittyQueryMaker()
+ .eq(ContactDetails.FQ_FIELD_CONTACTDETAILS_TARGET, wikittyId).end();
+ WikittyQueryResult<ContactDetails> result = getClient(null)
+ .findAllByQuery(ContactDetails.class, criteria);
+ List<ContactDetails> contactDetails = result.getAll();
+ return contactDetails;
+ }
+}
Copied: trunk/chorem-entities/src/main/java/org/chorem/ChoremConfig.java (from rev 128, trunk/chorem-web/src/main/java/org/chorem/ChoremConfig.java)
===================================================================
--- trunk/chorem-entities/src/main/java/org/chorem/ChoremConfig.java (rev 0)
+++ trunk/chorem-entities/src/main/java/org/chorem/ChoremConfig.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,60 @@
+package org.chorem;
+
+import org.apache.commons.lang.UnhandledException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.util.ApplicationConfig;
+import org.nuiton.wikitty.WikittyConfigOption;
+
+import static org.nuiton.i18n.I18n._;
+
+/**
+ * Inits chorem configuration
+ */
+public class ChoremConfig {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(ChoremConfig.class);
+
+ static protected ApplicationConfig config = null;
+
+ /**
+ * constructeur public seulement pour pouvoir mettre une variable de ce
+ * type dans BowBaseAction et acceder facilement au donnees dans les jsp
+ * en ognl
+ */
+ public ChoremConfig() {
+ }
+
+ public static ApplicationConfig getConfig(String... args) {
+ if (config == null) {
+ synchronized (ChoremConfig.class) {
+ if (config == null) {
+ try {
+ config = new ApplicationConfig(ChoremConfigOption.CONFIG_FILE.getDefaultValue());
+
+ // Load wikitty options
+ config.loadDefaultOptions(WikittyConfigOption.class);
+
+ // Load chorem options
+ config.loadDefaultOptions(ChoremConfigOption.class);
+
+ // Load chorem action
+ config.loadActions(ChoremConfigAction.class);
+
+ // Parse args
+ config.parse(args);
+
+ // on fait toutes les actions
+ config.doAllAction();
+ } catch (Exception eee) {
+ log.error("Can't create chorem configuration", eee);
+ throw new UnhandledException(eee);
+ }
+ }
+ }
+ }
+ return config;
+ }
+
+}
Added: trunk/chorem-entities/src/main/java/org/chorem/ChoremConfigAction.java
===================================================================
--- trunk/chorem-entities/src/main/java/org/chorem/ChoremConfigAction.java (rev 0)
+++ trunk/chorem-entities/src/main/java/org/chorem/ChoremConfigAction.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,47 @@
+package org.chorem;
+
+import org.nuiton.util.ApplicationConfig.ActionDef;
+
+/**
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public enum ChoremConfigAction implements ActionDef {
+
+ HELP(ChoremAction.class.getName() + "#help", "-h", "--help"),
+ INFO(ChoremAction.class.getName() + "#configInfo", "-i", "--config-info" , "--configInfo"),
+ CLEAN(ChoremAction.class.getName() + "#clean", "--clean"),
+ IMPORT_PERSON(ImportChoremTopia.class.getName() + "#importPerson",
+ "-ip", "--import-person", "--importPerson"),
+ IMPORT_COMPANY(ImportChoremTopia.class.getName() + "#importCompany",
+ "-ic", "--import-company", "--importCompany"),
+ IMPORT_EMPLOYEE(ImportChoremTopia.class.getName() + "#importEmployee",
+ "-ie", "--import-employee", "--importEmployee"),
+ IMPORT_CONTRACT(ImportChoremTopia.class.getName() + "#importContract",
+ "--import-contract", "--importContract"),
+ IMPORT_CONTRACT_TYPE(ImportChoremTopia.class.getName() + "#importContractType",
+ "--import-contract-type", "--importContractType"),
+ IMPORT_COMMIT(ImportChoremTopia.class.getName() + "#commit", "--commit");
+
+ public String action;
+ public String[] aliases;
+
+ private ChoremConfigAction(String action, String... aliases) {
+ this.action = action;
+ this.aliases = aliases;
+ }
+
+ @Override
+ public String getAction() {
+ return action;
+ }
+
+ @Override
+ public String[] getAliases() {
+ return aliases;
+ }
+}
Copied: trunk/chorem-entities/src/main/java/org/chorem/ChoremConfigOption.java (from rev 128, trunk/chorem-web/src/main/java/org/chorem/ChoremConfigOption.java)
===================================================================
--- trunk/chorem-entities/src/main/java/org/chorem/ChoremConfigOption.java (rev 0)
+++ trunk/chorem-entities/src/main/java/org/chorem/ChoremConfigOption.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2011 poussin. All rights reserved.
+ *
+ * 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 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/>.
+ */
+package org.chorem;
+
+import static org.nuiton.i18n.I18n._;
+import org.nuiton.util.ApplicationConfig;
+
+/**
+ * Chorem option definition.
+ *
+ * @author poussin
+ */
+public enum ChoremConfigOption implements ApplicationConfig.OptionDef {
+ CONFIG_FILE(ApplicationConfig.CONFIG_FILE_NAME,
+ _("chorem.config.configFileName.description"),
+ "chorem.properties", String.class, false, false),
+ CHOREM_LOGIN(
+ "chorem.admin.login",
+ _("Login as default login for action on command line"),
+ "",
+ String.class, false, false),
+ CHOREM_PASSWORD(
+ "chorem.import.csv.format",
+ _("Password associated with login used"),
+ "",
+ String.class, false, false);
+
+ public final String key;
+ public final String description;
+ public String defaultValue;
+ public final Class<?> type;
+ public boolean isTransient;
+ public boolean isFinal;
+
+ ChoremConfigOption(String key, String description, String defaultValue,
+ Class<?> type, boolean isTransient, boolean isFinal) {
+ this.key = key;
+ this.description = description;
+ this.defaultValue = defaultValue;
+ this.type = type;
+ this.isFinal = isFinal;
+ this.isTransient = isTransient;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public Class<?> getType() {
+ return type;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public String getDefaultValue() {
+ return defaultValue;
+ }
+
+ public boolean isTransient() {
+ return isTransient;
+ }
+
+ public boolean isFinal() {
+ return isFinal;
+ }
+
+ public void setDefaultValue(String defaultValue) {
+ this.defaultValue = defaultValue;
+ }
+
+ public void setTransient(boolean isTransient) {
+ this.isTransient = isTransient;
+ }
+
+ public void setFinal(boolean isFinal) {
+ this.isFinal = isFinal;
+ }
+
+}
Added: trunk/chorem-entities/src/main/java/org/chorem/ChoremMain.java
===================================================================
--- trunk/chorem-entities/src/main/java/org/chorem/ChoremMain.java (rev 0)
+++ trunk/chorem-entities/src/main/java/org/chorem/ChoremMain.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,29 @@
+package org.chorem;
+
+import java.util.Arrays;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.util.ApplicationConfig;
+
+/**
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class ChoremMain {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(ChoremMain.class);
+
+ static public void main(String[] args) throws Exception {
+ System.out.println(String.format("Launching ChoremMain ... (args: %s)", Arrays.toString(args)));
+ // getConfig do all: parse and doAllAction
+// String[] forceArgs = "--clean -ic /tmp/chorem-company.csv -ip /tmp/chorem-person.csv -ie /tmp/chorem-employee.csv --import-contract-type /tmp/chorem-contracttype.csv --import-contract /tmp/chorem-contract.csv --commit".split(" ");
+ ApplicationConfig config = ChoremConfig.getConfig(args);
+
+ System.exit(0);
+ }
+}
Added: trunk/chorem-entities/src/main/java/org/chorem/ImportChoremTopia.java
===================================================================
--- trunk/chorem-entities/src/main/java/org/chorem/ImportChoremTopia.java (rev 0)
+++ trunk/chorem-entities/src/main/java/org/chorem/ImportChoremTopia.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,394 @@
+package org.chorem;
+
+import au.com.bytecode.opencsv.CSVReader;
+import java.io.FileReader;
+import java.text.ParseException;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.lang3.time.DateUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.chorem.entities.CompanyImpl;
+import org.chorem.entities.ContactDetailsImpl;
+import org.chorem.entities.EmployeeImpl;
+import org.chorem.entities.PersonImpl;
+import org.nuiton.util.ApplicationConfig.Action.Step;
+import org.nuiton.wikitty.entities.BusinessEntityImpl;
+
+/**
+ * Les donnees doivent etre exportees de la base postgresql avec les commandes:
+ * <pre>
+ * \copy employee to '/tmp/chorem-employee.csv' delimiters ';' CSV HEADER
+ * \copy company to '/tmp/chorem-company.csv' delimiters ';' CSV HEADER
+ * \copy person to '/tmp/chorem-person.csv' delimiters ';' CSV HEADER
+ * ...
+ * </pre>
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class ImportChoremTopia {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(ImportChoremTopia.class);
+
+ enum COMPANY_HEADER {
+ topiaid, topiaversion, topiacreatedate,
+ name, type, headoffice, activity,
+ address, phone, mail, web, fax,
+ relation, othercostemployee, percentcostemployeepay
+ };
+
+ enum PERSON_HEADER {
+ topiaid, topiaversion, topiacreatedate,
+ firstname, lastname,
+ address, birthdate, phone, mobile, mail
+ };
+
+ enum EMPLOYEE_HEADER {
+ topiaid, topiaversion, topiacreatedate,
+ phone, mobile, mail, job, company, service, responsable, person, contract
+ };
+
+ enum CONTRACT_TYPE_HEADER {
+ topiaid, topiaversion, topiacreatedate,
+ name
+ }
+
+ enum CONTRACT_HEADER {
+ topiaid, topiaversion, topiacreatedate,
+ type, hiringdate, timecost, beginhiringdate, endhiringdate, dayduration,
+ monthduration, basepay, othercost, employee, contracttype
+ }
+
+ protected List<ContactDetailsImpl> contacts = new LinkedList<ContactDetailsImpl>();
+ protected Map<String, CompanyImpl> companies = new HashMap<String, CompanyImpl>();
+ protected Map<String, PersonImpl> persons = new HashMap<String, PersonImpl>();
+ protected Map<String, EmployeeImpl> employees = new HashMap<String, EmployeeImpl>();
+
+ // a ne pas stocker dans wikitty
+ protected Map<String, String> contractType = new HashMap<String, String>();
+
+ public ImportChoremTopia() {
+ }
+
+ /**
+ * Try to parse date, if not possible, return null.
+ * acceptable pattern
+ * <li>"yyyy-MM-dd HH:mm:ss"
+ * <li>"yyyy-MM-dd"
+ *
+ * @param s date to parse
+ * @return Date object or null if s is not date with right pattern
+ */
+ protected Date parseDate(String s) {
+ Date result = null;
+ try {
+ result = DateUtils.parseDate(s, "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd");
+ } catch (ParseException ex) {
+ log.debug(String.format("Bad date format '%s'", s));
+ }
+ return result;
+ }
+
+ protected String getWikittyId(BusinessEntityImpl e) {
+ String result = null;
+ if (e != null) {
+ result = e.getWikittyId();
+ }
+ return result;
+ }
+
+ /**
+ * Commit all imported data. Step number must be the last
+ */
+ @Step(99)
+ public void commit() {
+ List<BusinessEntityImpl> data = new LinkedList<BusinessEntityImpl>();
+
+ data.addAll(companies.values());
+ data.addAll(persons.values());
+ data.addAll(employees.values());
+ data.addAll(contacts);
+
+ ChoremClient proxy = ChoremClient.getClient();
+ data = proxy.store(data);
+ System.out.println(String.format("%s Commited data", data.size()));
+ }
+
+ @Step(1)
+ public void importCompany(String filename) {
+ System.out.println(String.format("Try to import company '%s'", filename));
+ try {
+ FileReader in = new FileReader(filename);
+ // separateur ';' String delimiter '"', skip first line (header)
+ CSVReader reader = new CSVReader(in, ';', '"', 1);
+ for(String[] line : reader) {
+ String topiaId = line[COMPANY_HEADER.topiaid.ordinal()];
+
+ // Read company info
+ String name = line[COMPANY_HEADER.name.ordinal()];
+ String type = line[COMPANY_HEADER.type.ordinal()];
+
+ CompanyImpl company = new CompanyImpl();
+ company.setName(name);
+ company.setType(type);
+
+ companies.put(topiaId, company);
+
+ // Read company contacts details
+ String address = line[COMPANY_HEADER.address.ordinal()];
+ String fax = line[COMPANY_HEADER.fax.ordinal()];
+ String mail = line[COMPANY_HEADER.mail.ordinal()];
+ String phone = line[COMPANY_HEADER.phone.ordinal()];
+ String web = line[COMPANY_HEADER.web.ordinal()];
+
+ ContactDetailsImpl contactAddress = new ContactDetailsImpl();
+ contactAddress.setType("address");
+ contactAddress.setName("main");
+ contactAddress.setValue(address);
+ contactAddress.setTarget(company.getWikittyId());
+ contacts.add(contactAddress);
+
+ ContactDetailsImpl contactFax = new ContactDetailsImpl();
+ contactFax.setType("fax");
+ contactFax.setName("main");
+ contactFax.setValue(fax);
+ contactFax.setTarget(company.getWikittyId());
+ contacts.add(contactFax);
+
+ ContactDetailsImpl contactMail = new ContactDetailsImpl();
+ contactMail.setType("mail");
+ contactMail.setName("main");
+ contactMail.setValue(mail);
+ contactMail.setTarget(company.getWikittyId());
+ contacts.add(contactMail);
+
+ ContactDetailsImpl contactPhone = new ContactDetailsImpl();
+ contactPhone.setType("phone");
+ contactPhone.setName("main");
+ contactPhone.setValue(phone);
+ contactPhone.setTarget(company.getWikittyId());
+ contacts.add(contactPhone);
+
+ ContactDetailsImpl contactWeb = new ContactDetailsImpl();
+ contactWeb.setType("web");
+ contactWeb.setName("main");
+ contactWeb.setValue(web);
+ contactWeb.setTarget(company.getWikittyId());
+ contacts.add(contactWeb);
+ }
+ reader.close();
+
+
+ } catch (Exception eee) {
+ log.fatal(String.format("Can't import file '%s'", filename));
+ if (log.isDebugEnabled()) {
+ log.debug("StackTrace", eee);
+ }
+ System.exit(1);
+ }
+ System.out.println(String.format("%s companies loaded", companies.size()));
+ }
+
+ @Step(1)
+ public void importPerson(String filename) {
+ System.out.println(String.format("Try to import person '%s'", filename));
+ try {
+ FileReader in = new FileReader(filename);
+ // separateur ';' String delimiter '"', skip first line (header)
+ CSVReader reader = new CSVReader(in, ';', '"', 1);
+ for(String[] line : reader) {
+ String topiaId = line[COMPANY_HEADER.topiaid.ordinal()];
+
+ // Read company info
+ String firstname = line[PERSON_HEADER.firstname.ordinal()];
+ String lastname = line[PERSON_HEADER.lastname.ordinal()];
+ String birthdate = line[PERSON_HEADER.birthdate.ordinal()];
+
+ PersonImpl person = new PersonImpl();
+ person.setFirstName(firstname);
+ person.setLastName(lastname);
+ person.setBirthDate(parseDate(birthdate));
+
+ persons.put(topiaId, person);
+
+ // Read company contacts details
+ String address = line[PERSON_HEADER.address.ordinal()];
+ String mail = line[PERSON_HEADER.mail.ordinal()];
+ String phone = line[PERSON_HEADER.phone.ordinal()];
+ String mobile = line[PERSON_HEADER.mobile.ordinal()];
+
+ ContactDetailsImpl contactAddress = new ContactDetailsImpl();
+ contactAddress.setType("address");
+ contactAddress.setName("main");
+ contactAddress.setValue(address);
+ contactAddress.setTarget(person.getWikittyId());
+ contacts.add(contactAddress);
+
+ ContactDetailsImpl contactMobile = new ContactDetailsImpl();
+ contactMobile.setType("phone");
+ contactMobile.setName("mobile");
+ contactMobile.setValue(mobile);
+ contactMobile.setTarget(person.getWikittyId());
+ contacts.add(contactMobile);
+
+ ContactDetailsImpl contactMail = new ContactDetailsImpl();
+ contactMail.setType("mail");
+ contactMail.setName("main");
+ contactMail.setValue(mail);
+ contactMail.setTarget(person.getWikittyId());
+ contacts.add(contactMail);
+
+ ContactDetailsImpl contactPhone = new ContactDetailsImpl();
+ contactPhone.setType("phone");
+ contactPhone.setName("main");
+ contactPhone.setValue(phone);
+ contactPhone.setTarget(person.getWikittyId());
+ contacts.add(contactPhone);
+ }
+ reader.close();
+
+
+ } catch (Exception eee) {
+ log.fatal(String.format("Can't import file '%s'", filename));
+ if (log.isDebugEnabled()) {
+ log.debug("StackTrace", eee);
+ }
+ System.exit(1);
+ }
+ System.out.println(String.format("%s persons loaded", persons.size()));
+ }
+
+ @Step(1) // independant de tout
+ public void importContractType(String filename) {
+ System.out.println(String.format("Try to import contract type '%s'", filename));
+ try {
+ FileReader in = new FileReader(filename);
+ // separateur ';' String delimiter '"', skip first line (header)
+ CSVReader reader = new CSVReader(in, ';', '"', 1);
+ for(String[] line : reader) {
+ String topiaId = line[CONTRACT_TYPE_HEADER.topiaid.ordinal()];
+
+ // Read company info
+ String name = line[CONTRACT_TYPE_HEADER.name.ordinal()];
+
+ contractType.put(topiaId, name);
+ }
+ reader.close();
+ } catch (Exception eee) {
+ log.fatal(String.format("Can't import file '%s'", filename));
+ if (log.isDebugEnabled()) {
+ log.debug("StackTrace", eee);
+ }
+ System.exit(1);
+ }
+ System.out.println(String.format("%s contracts types loaded", contractType.size()));
+ }
+
+ @Step(2) // il faut importer apres company et person
+ public void importEmployee(String filename) {
+ System.out.println(String.format("Try to import employee '%s'", filename));
+ try {
+ FileReader in = new FileReader(filename);
+ // separateur ';' String delimiter '"', skip first line (header)
+ CSVReader reader = new CSVReader(in, ';', '"', 1);
+ for(String[] line : reader) {
+ String topiaId = line[EMPLOYEE_HEADER.topiaid.ordinal()];
+
+ // Read company info
+ String company = line[EMPLOYEE_HEADER.company.ordinal()];
+ String person = line[EMPLOYEE_HEADER.person.ordinal()];
+ String job = line[EMPLOYEE_HEADER.job.ordinal()];
+
+ EmployeeImpl employee = new EmployeeImpl();
+ employee.setCompany(getWikittyId(companies.get(company)));
+ employee.setPerson(getWikittyId(persons.get(person)));
+ employee.setDescription(job);
+
+ employees.put(topiaId, employee);
+
+ // Read company contacts details
+ String mail = line[EMPLOYEE_HEADER.mail.ordinal()];
+ String phone = line[EMPLOYEE_HEADER.phone.ordinal()];
+ String mobile = line[EMPLOYEE_HEADER.mobile.ordinal()];
+
+ ContactDetailsImpl contactMobile = new ContactDetailsImpl();
+ contactMobile.setType("phone");
+ contactMobile.setName("mobile");
+ contactMobile.setValue(mobile);
+ contactMobile.setTarget(employee.getWikittyId());
+ contacts.add(contactMobile);
+
+ ContactDetailsImpl contactMail = new ContactDetailsImpl();
+ contactMail.setType("mail");
+ contactMail.setName("main");
+ contactMail.setValue(mail);
+ contactMail.setTarget(employee.getWikittyId());
+ contacts.add(contactMail);
+
+ ContactDetailsImpl contactPhone = new ContactDetailsImpl();
+ contactPhone.setType("phone");
+ contactPhone.setName("main");
+ contactPhone.setValue(phone);
+ contactPhone.setTarget(employee.getWikittyId());
+ contacts.add(contactPhone);
+ }
+ reader.close();
+
+
+ } catch (Exception eee) {
+ log.fatal(String.format("Can't import file '%s'", filename));
+ if (log.isDebugEnabled()) {
+ log.debug("StackTrace", eee);
+ }
+ System.exit(1);
+ }
+ System.out.println(String.format("%s employees loaded", employees.size()));
+ }
+
+ @Step(3) // il faut importer apres employee
+ public void importContract(String filename) {
+ System.out.println(String.format("Try to import contract '%s'", filename));
+ int count = 0;
+ try {
+ FileReader in = new FileReader(filename);
+ // separateur ';' String delimiter '"', skip first line (header)
+ CSVReader reader = new CSVReader(in, ';', '"', 1);
+ for(String[] line : reader) {
+ count++;
+ String employeeId = line[CONTRACT_HEADER.employee.ordinal()];
+
+ EmployeeImpl employee = employees.get(employeeId);
+ if (employee != null) {
+
+ // Read info
+ String beginDate = line[CONTRACT_HEADER.beginhiringdate.ordinal()];
+ String endDate = line[CONTRACT_HEADER.endhiringdate.ordinal()];
+ String typeId = line[CONTRACT_HEADER.contracttype.ordinal()];
+ String salary = line[CONTRACT_HEADER.basepay.ordinal()];
+
+ employee.setBeginDate(parseDate(beginDate));
+ employee.setEndDate(parseDate(endDate));
+ employee.setSalary(Float.parseFloat(salary));
+ employee.setType(contractType.get(typeId));
+ }
+ }
+ reader.close();
+ } catch (Exception eee) {
+ log.fatal(String.format("Can't import file '%s'", filename));
+ if (log.isDebugEnabled()) {
+ log.debug("StackTrace", eee);
+ }
+ System.exit(1);
+ }
+ System.out.println(String.format("%s contracts loaded", count));
+ }
+
+}
Copied: trunk/chorem-entities/src/main/resources/chorem.properties (from rev 127, trunk/chorem-web/src/main/resources/chorem.properties)
===================================================================
--- trunk/chorem-entities/src/main/resources/chorem.properties (rev 0)
+++ trunk/chorem-entities/src/main/resources/chorem.properties 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,29 @@
+wikitty.data.directory=/tmp/chorem
+wikitty.storage.jdbc.queryfile=wikitty-jdbc-query.properties
+wikitty.storage.jdbc.driver=org.h2.Driver
+wikitty.storage.jdbc.host=jdbc:h2:file:${wikitty.data.directory}/data/db
+wikitty.storage.jdbc.login=sa
+wikitty.storage.jdbc.password=
+wikitty.storage.jdbc.xadatasource=org.h2.jdbcx.JdbcDataSource
+wikitty.storage.jdbc.xadatasource.org.h2.jdbcx.JdbcDataSource.URL=${wikitty.storage.jdbc.host}
+wikitty.storage.jdbc.xadatasource.org.h2.jdbcx.JdbcDataSource.user=${wikitty.storage.jdbc.login}
+wikitty.storage.jdbc.xadatasource.org.h2.jdbcx.JdbcDataSource.password=${wikitty.storage.jdbc.password}
+wikitty.searchengine.solr.directory.data=${wikitty.data.directory}/data/solr
+wikitty.searchengine.solr.directory.factory=solr.StandardDirectoryFactory
+wikitty.WikittyService.components=org.nuiton.wikitty.services.WikittyServiceStorage,\
+org.nuiton.wikitty.services.WikittyServiceNotifier,\
+org.nuiton.wikitty.services.WikittyServiceCached,\
+org.nuiton.wikitty.services.WikittyServiceSecurity
+wikitty.WikittyServiceStorage.components=org.nuiton.wikitty.jdbc.WikittyExtensionStorageJDBC,\
+org.nuiton.wikitty.jdbc.WikittyStorageJDBC,\
+org.nuiton.wikitty.storage.solr.WikittySearchEngineSolr
+wikitty.WikittyServiceCached.components=org.nuiton.wikitty.services.WikittyCacheJCS
+wikitty.service.cache.listenevents=false
+wikitty.service.cache.allwaysRestoreCopies=false
+wikitty.service.event.propagate=false
+wikitty.service.event.listen=false
+wikitty.addon.export.threadnumber=1
+wikitty.addon.export.directory=${wikitty.data.directory}/export
+wikitty.addon.export.publicurl=file://${wikitty.data.directory}/export/
+jcs.default=
+jcs.default.cacheattributes.MaxObjects=1000
Copied: trunk/chorem-entities/src/main/resources/log4j.properties (from rev 128, trunk/chorem-web/src/main/resources/log4j.properties)
===================================================================
--- trunk/chorem-entities/src/main/resources/log4j.properties (rev 0)
+++ trunk/chorem-entities/src/main/resources/log4j.properties 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,34 @@
+###
+# #%L
+# bow
+#
+# $Id$
+# $HeadURL$
+# %%
+# Copyright (C) 2010 CodeLutin
+# %%
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero 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 Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+# #L%
+###
+# Global logging configuration
+log4j.rootLogger=INFO, stdout
+
+# Console output...
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d %5p [%t] (%F:%L) %M - %m%n
+
+# package level
+log4j.logger.org.chorem=DEBUG
+log4j.logger.org.nuiton=INFO
Modified: trunk/chorem-entities/src/main/xmi/chorem.properties
===================================================================
--- trunk/chorem-entities/src/main/xmi/chorem.properties 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-entities/src/main/xmi/chorem.properties 2012-04-23 13:11:43 UTC (rev 135)
@@ -1,27 +1,68 @@
-org.chorem.entities.Project.class.tagvalue.version=1.0
+org.chorem.entities.Project.class.tagvalue.version=5.0
org.chorem.entities.Project.class.tagvalue.toString=%Project.name|noname$s
-org.chorem.entities.ProjectOrder.class.tagvalue.version=1.0
+org.chorem.entities.Project.class.tagvalue.sortOrder=Project.name
+org.chorem.entities.ProjectOrder.class.tagvalue.version=5.0
org.chorem.entities.ProjectOrder.class.tagvalue.toString=%ProjectOrder.description|noname$s
-org.chorem.entities.Task.class.tagvalue.version=1.0
+org.chorem.entities.ProjectOrder.class.tagvalue.sortOrder=ProjectOrder.description
+org.chorem.entities.Task.class.tagvalue.version=5.0
org.chorem.entities.Task.class.tagvalue.toString=%Task.name|noname$s
-org.chorem.entities.Worker.class.tagvalue.version=1.0
-org.chorem.entities.Person.class.tagvalue.version=3.0
+org.chorem.entities.Task.class.tagvalue.sortOrder=Task.name
+org.chorem.entities.Worker.class.tagvalue.version=5.0
+org.chorem.entities.Worker.class.tagvalue.toString=%Worker.percentage|nopercentage$s
+org.chorem.entities.Worker.class.tagvalue.sortOrder=Worker.percentage
+org.chorem.entities.Person.class.tagvalue.version=5.0
org.chorem.entities.Person.class.tagvalue.toString=%Person.lastName$s %Person.firstName|noname$s
-org.chorem.entities.Interval.class.tagvalue.version=1.0
-org.chorem.entities.Company.class.tagvalue.version=2.0
+org.chorem.entities.Person.class.tagvalue.sortOrder=Person.lastName,Person.firstName
+org.chorem.entities.Interval.class.tagvalue.version=5.0
+org.chorem.entities.Interval.class.tagvalue.toString=%Interval.beginDate$tF-%Interval.endDate$tF
+org.chorem.entities.Interval.class.tagvalue.sortOrder=Interval.beginDate,Interval.endDate
+org.chorem.entities.Company.class.tagvalue.version=5.0
org.chorem.entities.Company.class.tagvalue.toString=%Company.name|noname$s
-org.chorem.entities.ContactDetails.class.tagvalue.version=1.0
-org.chorem.entities.Time.class.tagvalue.version=1.0
-org.chorem.entities.Employee.class.tagvalue.version=2.0
-org.chorem.entities.Goal.class.tagvalue.version=1.0
-org.chorem.entities.PersonSkill.class.tagvalue.version=1.0
-org.chorem.entities.Skill.class.tagvalue.version=1.0
-org.chorem.entities.interview.class.tagvalue.version=1.0
-org.chorem.entities.Mission.class.tagvalue.version=1.0
-org.chorem.entities.Evaluation.class.tagvalue.version=1.0
-org.chorem.entities.Vacation.class.tagvalue.version=1.0
-org.chorem.entities.Touch.class.tagvalue.version=1.0
-org.chorem.entities.Attachment.class.tagvalue.version=1.0
-org.chorem.entities.Quotation.class.tagvalue.version=1.0
-org.chorem.entities.Invoice.class.tagvalue.version=1.0
-org.chorem.entities.Invoiceable.class.tagvalue.version=1.0
+org.chorem.entities.Company.class.tagvalue.sortOrder=Company.name
+org.chorem.entities.ContactDetails.class.tagvalue.version=5.0
+org.chorem.entities.ContactDetails.class.tagvalue.toString=%ContactDetails.type|notype$s %ContactDetails.name|noname$s %ContactDetails.value$s
+org.chorem.entities.ContactDetails.class.tagvalue.sortOrder=ContactDetails.type, ContactDetails.name,ContactDetails.value
+org.chorem.entities.Time.class.tagvalue.version=5.0
+org.chorem.entities.Employee.class.tagvalue.version=5.0
+org.chorem.entities.Employee.class.tagvalue.preload=Employee.company;Employee.person
+org.chorem.entities.Employee.class.tagvalue.toString=%Employee.company$s %Employee.person$s %Employee.type|notype$s
+org.chorem.entities.Employee.class.tagvalue.sortOrder=Employee.company,Employee.person
+org.chorem.entities.Goal.class.tagvalue.version=5.0
+org.chorem.entities.Goal.class.tagvalue.toString=%Goal.name|noname$s
+org.chorem.entities.Goal.class.tagvalue.sortOrder=Goal.name
+org.chorem.entities.PersonSkill.class.tagvalue.version=5.0
+org.chorem.entities.PersonSkill.class.tagvalue.toString=%Evaluation.level|nolevel$s
+org.chorem.entities.PersonSkill.class.tagvalue.sortOrder=Evaluation.level
+org.chorem.entities.Skill.class.tagvalue.version=5.0
+org.chorem.entities.Skill.class.tagvalue.toString=%Skill.description|nodescription$s
+org.chorem.entities.Skill.class.tagvalue.sortOrder=Skill.description
+org.chorem.entities.Interview.class.tagvalue.version=5.0
+org.chorem.entities.Interview.class.tagvalue.toString=%Interval.beginDate$tF-%Interval.endDate$tF %Interview.type|notype$s
+org.chorem.entities.Interview.class.tagvalue.sortOrder=Interval.beginDate,Interval.endDate,Interview.type
+org.chorem.entities.Mission.class.tagvalue.version=5.0
+org.chorem.entities.Mission.class.tagvalue.toString=%Mission.name|noname$s (%Mission.role$s)
+org.chorem.entities.Mission.class.tagvalue.sortOrder=Mission.name,Mission.role
+org.chorem.entities.Evaluation.class.tagvalue.version=5.0
+org.chorem.entities.Evaluation.class.tagvalue.toString=%Evaluation.level|nolevel$s
+org.chorem.entities.Evaluation.class.tagvalue.sortOrder=Evaluation.level
+org.chorem.entities.Vacation.class.tagvalue.version=5.0
+org.chorem.entities.Vacation.class.tagvalue.toString=%Interval.beginDate$tF-%Interval.endDate$tF %Vacation.type|notype$s
+org.chorem.entities.Vacation.class.tagvalue.sortOrder=Interval.beginDate,Interval.endDate,Vacation.type
+org.chorem.entities.Touch.class.tagvalue.version=6.0
+org.chorem.entities.Touch.class.tagvalue.preload=Touch.participant
+org.chorem.entities.Touch.class.tagvalue.toString=%Interval.beginDate$tF - %Touch.type$s - %Touch.goal|nogoal$s
+org.chorem.entities.Touch.class.tagvalue.sortOrder=Interval.beginDate desc,Touch.type,Touch.goal
+org.chorem.entities.Touch.attribute.goal.tagvalue.subtype=text/rst
+org.chorem.entities.Touch.attribute.type.tagvalue.choiceQuery=SELECT Touch.type WHERE extension=Touch
+org.chorem.entities.Attachment.class.tagvalue.version=5.0
+org.chorem.entities.Attachment.class.tagvalue.toString=%Attachment.name|noname$s (%Attachment.mimetype|notype$s) %Attachment.date$tF
+org.chorem.entities.Attachment.class.tagvalue.sortOrder=Attachment.name,Attachment.mimetype,Attachment.date
+org.chorem.entities.Quotation.class.tagvalue.version=5.0
+org.chorem.entities.Quotation.class.tagvalue.toString=%Interval.beginDate$tF-%Interval.endDate$tF %Quotation.reference|noref$s(%Quotation.type|notype$s) %Quotation.description|nodescription$s
+org.chorem.entities.Quotation.class.tagvalue.sortOrder=Interval.beginDate,Interval.endDate,Quotation.reference,Quotation.type,Quotation.description
+org.chorem.entities.Invoice.class.tagvalue.version=5.0
+org.chorem.entities.Invoice.class.tagvalue.toString=%Invoice.reference|noref$s %Invoice.amount|noamount$s %Invoice.postedDate$tF %Invoice.expectedDate$tF %Invoice.paymentDate$tF
+org.chorem.entities.Invoice.class.tagvalue.sortOrder=Invoice.postedDate,Invoice.expectedDate,Invoice.paymentDate,Invoice.reference,Invoice.amount
+org.chorem.entities.Invoiceable.class.tagvalue.version=5.0
+org.chorem.entities.Invoiceable.class.tagvalue.toString=%Invoiceable.name|noname$s
+org.chorem.entities.Invoiceable.class.tagvalue.sortOrder=Invoiceable.name
Modified: trunk/chorem-entities/src/main/xmi/chorem.zargo
===================================================================
(Binary files differ)
Modified: trunk/chorem-entities/src/test/java/org/chorem/entities/InvoiceableUtilTest.java
===================================================================
--- trunk/chorem-entities/src/test/java/org/chorem/entities/InvoiceableUtilTest.java 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-entities/src/test/java/org/chorem/entities/InvoiceableUtilTest.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -9,7 +9,7 @@
* @author poussin
*/
public class InvoiceableUtilTest {
-
+
/**
* Test of evalCondition method, of class InvoiceableUtil.
*/
Deleted: trunk/chorem-web/src/main/java/org/chorem/ChoremConfig.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/ChoremConfig.java 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-web/src/main/java/org/chorem/ChoremConfig.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -1,54 +0,0 @@
-package org.chorem;
-
-import org.apache.commons.lang.UnhandledException;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.nuiton.util.ApplicationConfig;
-import org.nuiton.wikitty.WikittyConfigOption;
-
-import static org.nuiton.i18n.I18n._;
-
-/**
- * Inits chorem configuration
- */
-public class ChoremConfig {
-
- /** to use log facility, just put in your code: log.info(\"...\"); */
- static private Log log = LogFactory.getLog(ChoremConfig.class);
-
- static protected ApplicationConfig config = null;
-
- /**
- * constructeur public seulement pour pouvoir mettre une variable de ce
- * type dans BowBaseAction et acceder facilement au donnees dans les jsp
- * en ognl
- */
- public ChoremConfig() {
- }
-
- public static ApplicationConfig getConfig(String... args) {
- if (config == null) {
- synchronized (ChoremConfig.class) {
- if (config == null) {
- try {
- config = new ApplicationConfig(ChoremConfigOption.CONFIG_FILE.getDefaultValue());
-
- // Load wikitty options
- config.loadDefaultOptions(WikittyConfigOption.class);
-
- // Load bow options
- config.loadDefaultOptions(ChoremConfigOption.class);
-
- // Parse args
- config.parse(args);
- } catch (Exception eee) {
- log.error("Can't create chorem configuration", eee);
- throw new UnhandledException(eee);
- }
- }
- }
- }
- return config;
- }
-
-}
Deleted: trunk/chorem-web/src/main/java/org/chorem/ChoremConfigOption.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/ChoremConfigOption.java 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-web/src/main/java/org/chorem/ChoremConfigOption.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -1,85 +0,0 @@
-/*
- * Copyright (c) 2011 poussin. All rights reserved.
- *
- * 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 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/>.
- */
-package org.chorem;
-
-import static org.nuiton.i18n.I18n._;
-import org.nuiton.util.ApplicationConfig;
-
-/**
- * Chorem option definition.
- *
- * @author poussin
- */
-public enum ChoremConfigOption implements ApplicationConfig.OptionDef {
- CONFIG_FILE(ApplicationConfig.CONFIG_FILE_NAME,
- _("chorem.config.configFileName.description"),
- "chorem.properties", String.class, false, false);
-
- public final String key;
- public final String description;
- public String defaultValue;
- public final Class<?> type;
- public boolean isTransient;
- public boolean isFinal;
-
- ChoremConfigOption(String key, String description, String defaultValue,
- Class<?> type, boolean isTransient, boolean isFinal) {
- this.key = key;
- this.description = description;
- this.defaultValue = defaultValue;
- this.type = type;
- this.isFinal = isFinal;
- this.isTransient = isTransient;
- }
-
- public String getKey() {
- return key;
- }
-
- public Class<?> getType() {
- return type;
- }
-
- public String getDescription() {
- return description;
- }
-
- public String getDefaultValue() {
- return defaultValue;
- }
-
- public boolean isTransient() {
- return isTransient;
- }
-
- public boolean isFinal() {
- return isFinal;
- }
-
- public void setDefaultValue(String defaultValue) {
- this.defaultValue = defaultValue;
- }
-
- public void setTransient(boolean isTransient) {
- this.isTransient = isTransient;
- }
-
- public void setFinal(boolean isFinal) {
- this.isFinal = isFinal;
- }
-
-}
Deleted: trunk/chorem-web/src/main/java/org/chorem/ChoremProxy.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/ChoremProxy.java 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-web/src/main/java/org/chorem/ChoremProxy.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -1,119 +0,0 @@
-package org.chorem;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.chorem.entities.Attachment;
-import org.chorem.entities.ContactDetails;
-
-import org.nuiton.util.ApplicationConfig;
-import org.nuiton.wikitty.WikittyProxy;
-import org.nuiton.wikitty.WikittyService;
-import org.nuiton.wikitty.WikittyServiceFactory;
-import org.nuiton.wikitty.entities.WikittyExtension;
-import org.nuiton.wikitty.search.Criteria;
-import org.nuiton.wikitty.search.PagedResult;
-import org.nuiton.wikitty.search.Search;
-
-/**
- * Proxy pour l'application. Certaines methodes specifiques pour l'application
- * peuvent y etre ajoutees (ex: des find particulier)
- */
-public class ChoremProxy extends WikittyProxy {
-
- static protected WikittyService ws = null;
-
- protected ChoremProxy(ApplicationConfig config, WikittyService ws) {
- super(config, ws);
- }
-
- /**
- * Returns instance of ChoremProxy with specified security token
- *
- * @param token
- * @return
- */
- static public ChoremProxy getInstance(String token) {
- ApplicationConfig config = ChoremConfig.getConfig();
- WikittyService ws = getWikittyService(config);
- ChoremProxy result = new ChoremProxy(config, ws);
- result.setSecurityToken(token);
-
- return result;
- }
-
- /**
- * Returns WikittyService to use. This WikittyService is singleton.
- *
- * @param config
- * @return WikittyService instance
- */
- static protected WikittyService getWikittyService(ApplicationConfig config) {
- if (ws == null) {
- synchronized(ChoremProxy.class) {
- if (ws == null) {
- ws = WikittyServiceFactory.buildWikittyService(config);
-
- // register last entity versions in database
- List<WikittyExtension> exts = new ArrayList<WikittyExtension>();
-
- exts.addAll(org.chorem.entities.AttachmentAbstract.extensions);
- exts.addAll(org.chorem.entities.CompanyAbstract.extensions);
- exts.addAll(org.chorem.entities.ContactDetailsAbstract.extensions);
- exts.addAll(org.chorem.entities.EmployeeAbstract.extensions);
- exts.addAll(org.chorem.entities.EvaluationAbstract.extensions);
- exts.addAll(org.chorem.entities.GoalAbstract.extensions);
- exts.addAll(org.chorem.entities.IntervalAbstract.extensions);
- exts.addAll(org.chorem.entities.InterviewAbstract.extensions);
- exts.addAll(org.chorem.entities.InvoiceableAbstract.extensions);
- exts.addAll(org.chorem.entities.InvoiceAbstract.extensions);
- exts.addAll(org.chorem.entities.MissionAbstract.extensions);
- exts.addAll(org.chorem.entities.PersonAbstract.extensions);
- exts.addAll(org.chorem.entities.PersonSkillAbstract.extensions);
- exts.addAll(org.chorem.entities.ProjectOrderAbstract.extensions);
- exts.addAll(org.chorem.entities.ProjectAbstract.extensions);
- exts.addAll(org.chorem.entities.QuotationAbstract.extensions);
- exts.addAll(org.chorem.entities.SkillAbstract.extensions);
- exts.addAll(org.chorem.entities.TaskAbstract.extensions);
- exts.addAll(org.chorem.entities.TimeAbstract.extensions);
- exts.addAll(org.chorem.entities.TouchAbstract.extensions);
- exts.addAll(org.chorem.entities.VacationAbstract.extensions);
- exts.addAll(org.chorem.entities.WorkerAbstract.extensions);
-
- ws.storeExtension(null, exts);
- }
- }
- }
- return ws;
- }
-
- /**
- * Returns the attachments linked with a wikitty id ordered by date
- *
- * @param wikittyId
- * @return the list of attachments
- */
- static public List<Attachment> getAttachments(String wikittyId) {
- Criteria criteria = Search.query().
- eq(Attachment.FQ_FIELD_ATTACHMENT_TARGET, wikittyId).criteria();
- PagedResult<Attachment> result = getInstance(null).
- findAllByCriteria(Attachment.class, criteria);
- List<Attachment> attachments = result.getAll();
- return attachments;
- }
-
- /**
- * Returns the contact details linked with a wikitty id
- *
- * @param wikittyId
- * @return the list of contact details
- */
- static public List<ContactDetails> getContactDetails(String wikittyId) {
- Criteria criteria = Search.query().
- eq(ContactDetails.FQ_FIELD_CONTACTDETAILS_TARGET, wikittyId).criteria();
- PagedResult<ContactDetails> result = getInstance(null).
- findAllByCriteria(ContactDetails.class, criteria);
- List<ContactDetails> contactDetails = result.getAll();
- return contactDetails;
- }
-}
Modified: trunk/chorem-web/src/main/java/org/chorem/ChoremSession.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/ChoremSession.java 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-web/src/main/java/org/chorem/ChoremSession.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -8,7 +8,6 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.wikitty.entities.WikittyUser;
-import org.nuiton.wikitty.services.WikittySecurityUtil;
/**
* Le seul objet qui doit être mis en session pour l'application. S'il y a
@@ -28,6 +27,7 @@
/** to use log facility, just put in your code: log.info(\"...\"); */
final static private Log log = LogFactory.getLog(ChoremSession.class);
+ private static final long serialVersionUID = 1L;
final static private String CHOREM_SESSION_KEY = ChoremSession.class.getSimpleName();
@@ -53,7 +53,7 @@
public ChoremProxy getProxy() {
if (proxy == null) {
- proxy = ChoremProxy.getInstance(securityToken);
+ proxy = ChoremProxy.getProxy(securityToken);
}
return proxy;
}
Modified: trunk/chorem-web/src/main/java/org/chorem/action/EntitySearchJsonAction.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/action/EntitySearchJsonAction.java 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-web/src/main/java/org/chorem/action/EntitySearchJsonAction.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -4,7 +4,6 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
-import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -23,9 +22,10 @@
import org.nuiton.wikitty.entities.Wikitty;
import org.nuiton.wikitty.entities.WikittyExtension;
import org.nuiton.wikitty.entities.WikittyImpl;
-import org.nuiton.wikitty.search.Criteria;
-import org.nuiton.wikitty.search.PagedResult;
-import org.nuiton.wikitty.search.Search;
+import org.nuiton.wikitty.query.WikittyQuery;
+import org.nuiton.wikitty.query.WikittyQueryMaker;
+import org.nuiton.wikitty.query.WikittyQueryResult;
+import org.nuiton.wikitty.query.conditions.Element;
/**
* Action qui d'interagir avec les jqgrid pour n'importe qu'elle type d'extension
@@ -168,12 +168,12 @@
// si l'utilisateur demande de supprimer aussi tous les objets qui ont
// ces ids comme reference, on les recherche
if (isDeleteAllLink()) {
- Search search = Search.query().or();
+ WikittyQueryMaker search = new WikittyQueryMaker().or();
for(String id:ids) {
search.keyword(id);
}
- Criteria criteria = search.criteria();
- PagedResult<String> result = getChoremProxy().findAllIdByCriteria(criteria);
+ WikittyQuery criteria = search.end();
+ WikittyQueryResult<String> result = getChoremProxy().findAllByQuery(criteria);
ids = result.getAll();
}
getChoremProxy().delete(ids);
@@ -223,11 +223,11 @@
protected void doSearch() {
- Search search = Search.query();
+ WikittyQueryMaker search = new WikittyQueryMaker().and();
if (StringUtils.isNotBlank(wikittyExtension)) {
Collection<String> col = ChoremUtil.toCollection(wikittyExtension);
- search.exteq(col);
+ search.extContainsAll(col);
}
// on restraint la recherche pour les sous grilles a l'id du wikitty
@@ -240,11 +240,10 @@
JSONObject jsonFilter = (JSONObject) JSONSerializer.toJSON( filters );
String groupOp = jsonFilter.getString("groupOp");
log.debug("groupOp: " + groupOp);
- Search filter;
if ("or".equalsIgnoreCase(groupOp)) {
- filter = search.or();
+ search.or();
} else {
- filter = search.and();
+ search.and();
}
JSONArray rules = jsonFilter.getJSONArray("rules");
int rulesCount = JSONArray.getDimensions(rules)[0];
@@ -253,19 +252,16 @@
String field = rule.getString("field");
String op = rule.getString("op");
String data = rule.getString("data");
- addCondition(filter, field, op, data);
+ addCondition(search, field, op, data);
}
} else if (StringUtils.isNotBlank(fulltextSearch)) {
- // TODO poussin 20111106: ca ne serait pas au like d'ajouter les * ?
- String s = "*" + fulltextSearch + "*";
- // TODO poussin 20111106: voir pourquoi like fontion comme on souhaite et pas Keyword :(
- // keyword ne fonctionne pas avec les *
- Search or = search.or();
- or = or.like("#fulltext", s);
+ String s = fulltextSearch;
+ WikittyQueryMaker or = new WikittyQueryMaker().or();
+ or = or.keyword(s);
log.debug("link: " + getWikittyLinkToLoadCache());
for (String link:getWikittyLinkToLoadCache()) {
- or.associated(link).like("#fulltext", s);
+ or.containsOne(link).select(Element.ID).keyword(s);
}
} else {
// si pas de filtre on recherche tout
@@ -274,17 +270,17 @@
int first = rows * (page - 1);
- int last = rows * page - 1;
+ int last = rows;
- Criteria criteria = search.criteria();
- criteria.setFirstIndex(first);
- criteria.setEndIndex(last);
+ WikittyQuery criteria = search.end();
+ criteria.setFirst(first);
+ criteria.setLimit(last);
if (StringUtils.isNotBlank(sidx)) {
if ("asc".equalsIgnoreCase(sord)) {
- criteria.setSortAscending(sidx);
+ criteria.setSortAscending(Element.get(sidx));
} else {
- criteria.setSortDescending(sidx);
+ criteria.setSortDescending(Element.get(sidx));
}
}
@@ -304,7 +300,8 @@
log.debug("criteria: " + criteria);
}
- PagedResult<Wikitty> result = getChoremProxy().findAllByCriteria(criteria);
+ WikittyQueryResult<Wikitty> result =
+ getChoremProxy().findAllByQuery(Wikitty.class, criteria);
setWikitties(result.getAll());
@@ -312,7 +309,7 @@
log.trace("result: " + getWikitties());
}
- setRecords(result.getNumFound());
+ setRecords(result.getTotalResult());
setTotal((int) Math.ceil((double) getRecords() / (double) getRows()));
gridModel = new ArrayList<Map<String, Object>>();
@@ -490,11 +487,11 @@
* @param op ['eq','ne','cn','nc','bw','bn','ew','en','lt','le','gt','ge','nu','nn','in','ni']
* @param data la valuer de la condition
*/
- protected void addCondition(Search search, String field, String op, String data) {
+ protected void addCondition(WikittyQueryMaker search, String field, String op, String data) {
if ("eq".equalsIgnoreCase(op)) {
search.eq(field, data);
} else if ("ne".equalsIgnoreCase(op)) {
- search.neq(field, data);
+ search.ne(field, data);
} else if ("lt".equalsIgnoreCase(op)) {
search.lt(field, data);
} else if ("le".equalsIgnoreCase(op)) {
@@ -506,7 +503,7 @@
} else if ("bw".equalsIgnoreCase(op)) {
search.sw(field, data);
} else if ("bn".equalsIgnoreCase(op)) {
- search.nsw(field, data);
+ search.notsw(field, data);
} else if ("ew".equalsIgnoreCase(op)) {
search.ew(field, data);
} else if ("en".equalsIgnoreCase(op)) {
@@ -522,9 +519,9 @@
} else {
Collection<String> col = ChoremUtil.toCollection(data);
if ("in".equalsIgnoreCase(op)) {
- search.in(field, col);
+ search.containsOne(field, col);
} else if ("ni".equalsIgnoreCase(op)) {
- search.not().in(field, col);
+ search.not().containsOne(field, col);
} else {
log.error(String.format("Unreconize Operator %s for field %s and value %s", op, field, data));
}
Modified: trunk/chorem-web/src/main/java/org/chorem/action/HomeAction.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/action/HomeAction.java 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-web/src/main/java/org/chorem/action/HomeAction.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -19,6 +19,7 @@
import org.chorem.entities.Task;
import org.chorem.entities.Touch;
import org.chorem.entities.Worker;
+import org.nuiton.wikitty.WikittyClient;
import org.nuiton.wikitty.WikittyProxy;
import org.nuiton.wikitty.WikittyUtil;
import org.nuiton.wikitty.entities.Wikitty;
@@ -48,7 +49,7 @@
@Override
public String execute() {
try {
- WikittyProxy proxy = getChoremProxy();
+ WikittyClient proxy = getChoremProxy();
load(proxy);
} catch (Exception eee) {
addActionError(getText(n_("chorem.error.internal")));
@@ -94,7 +95,7 @@
/** CA l'annee derniere jusqu'a maintenant (meme periode)*/
protected double salesTurnoverLastYear = 0;
- public void load(WikittyProxy proxy) throws ParseException {
+ public void load(WikittyClient proxy) throws ParseException {
String now = WikittyUtil.formatDate(new Date());
Deleted: trunk/chorem-web/src/main/resources/chorem.properties
===================================================================
--- trunk/chorem-web/src/main/resources/chorem.properties 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-web/src/main/resources/chorem.properties 2012-04-23 13:11:43 UTC (rev 135)
@@ -1,29 +0,0 @@
-wikitty.data.directory=/tmp/chorem
-wikitty.storage.jdbc.queryfile=wikitty-jdbc-query.properties
-wikitty.storage.jdbc.driver=org.h2.Driver
-wikitty.storage.jdbc.host=jdbc:h2:file:${wikitty.data.directory}/data/db
-wikitty.storage.jdbc.login=sa
-wikitty.storage.jdbc.password=
-wikitty.storage.jdbc.xadatasource=org.h2.jdbcx.JdbcDataSource
-wikitty.storage.jdbc.xadatasource.org.h2.jdbcx.JdbcDataSource.URL=${wikitty.storage.jdbc.host}
-wikitty.storage.jdbc.xadatasource.org.h2.jdbcx.JdbcDataSource.user=${wikitty.storage.jdbc.login}
-wikitty.storage.jdbc.xadatasource.org.h2.jdbcx.JdbcDataSource.password=${wikitty.storage.jdbc.password}
-wikitty.searchengine.solr.directory.data=${wikitty.data.directory}/data/solr
-wikitty.searchengine.solr.directory.factory=solr.StandardDirectoryFactory
-wikitty.WikittyService.components=org.nuiton.wikitty.services.WikittyServiceStorage,\
-org.nuiton.wikitty.services.WikittyServiceNotifier,\
-org.nuiton.wikitty.services.WikittyServiceCached,\
-org.nuiton.wikitty.services.WikittyServiceSecurity
-wikitty.WikittyServiceStorage.components=org.nuiton.wikitty.jdbc.WikittyExtensionStorageJDBC,\
-org.nuiton.wikitty.jdbc.WikittyStorageJDBC,\
-org.nuiton.wikitty.storage.solr.WikittySearchEngineSolr
-wikitty.WikittyServiceCached.components=org.nuiton.wikitty.services.WikittyCacheJCS
-wikitty.service.cache.listenevents=false
-wikitty.service.cache.allwaysRestoreCopies=false
-wikitty.service.event.propagate=false
-wikitty.service.event.listen=false
-wikitty.addon.export.threadnumber=1
-wikitty.addon.export.directory=${wikitty.data.directory}/export
-wikitty.addon.export.publicurl=file://${wikitty.data.directory}/export/
-jcs.default=
-jcs.default.cacheattributes.MaxObjects=1000
Deleted: trunk/chorem-web/src/main/resources/log4j.properties
===================================================================
--- trunk/chorem-web/src/main/resources/log4j.properties 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-web/src/main/resources/log4j.properties 2012-04-23 13:11:43 UTC (rev 135)
@@ -1,34 +0,0 @@
-###
-# #%L
-# bow
-#
-# $Id$
-# $HeadURL$
-# %%
-# Copyright (C) 2010 CodeLutin
-# %%
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero 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 Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-# #L%
-###
-# Global logging configuration
-log4j.rootLogger=INFO, stdout
-
-# Console output...
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d %5p [%t] (%F:%L) %M - %m%n
-
-# package level
-log4j.logger.org.chorem=DEBUG
-log4j.logger.org.nuiton=INFO
Modified: trunk/chorem-web/src/main/resources/struts.xml
===================================================================
--- trunk/chorem-web/src/main/resources/struts.xml 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-web/src/main/resources/struts.xml 2012-04-23 13:11:43 UTC (rev 135)
@@ -75,13 +75,18 @@
<action name="companies">
<result>/WEB-INF/jsp/bonzoms/companies.jsp</result>
</action>
- <action name="persons" class="org.chorem.bonzoms.action.PersonAction">
+ <action name="persons">
<result>/WEB-INF/jsp/bonzoms/persons.jsp</result>
</action>
</package>
<package name="gepeto" namespace="/gepeto" extends="publicArea">
- <default-action-ref name="projectsWithoutQuotation" />
+ <default-action-ref name="projects" />
+ <action name="projects">
+ <result>/WEB-INF/jsp/gepeto/projects.jsp</result>
+ </action>
+
+
<action name="addProjectInput">
<result>/WEB-INF/jsp/gepeto/addProject.jsp</result>
</action>
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companies.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companies.jsp 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companies.jsp 2012-04-23 13:11:43 UTC (rev 135)
@@ -1,6 +1,4 @@
-<%@page import="org.apache.commons.lang.StringUtils"%>
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
-<%@page import="java.util.List" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<%@taglib prefix="sj" uri="/struts-jquery-tags"%>
<%@taglib prefix="sjg" uri="/struts-jquery-grid-tags"%>
@@ -12,25 +10,11 @@
</head>
<body>
- <s:url id="companyDetails" namespace="/bonzoms" action="companyDetails"/>
- <script type="text/javascript">
- function formatCompanyIdLink(cellvalue, options, rowObject) {
- return "<a href='<s:property value="companyDetails"/>?companyId="+rowObject['id']+"'>voir</a>";
- }
- function formatCompanyLink(cellvalue, options, rowObject) {
- return "<a href='<s:property value="companyDetails"/>?companyId="+rowObject['id']+"'>" + cellvalue + "</a>";
- }
- </script>
-
- <s:url id="personDetails" namespace="/bonzoms" action="personDetails"/>
- <script type="text/javascript">
- function formatPersonNameLink(cellvalue, options, rowObject) {
- return "<a href='<s:property value="personDetails"/>?personId="+rowObject['id']+"'>" + cellvalue + "</a>";
- }
- </script>
-
- <%-- Partie generique (ou presque, ce ne sont que des variables qui change) --%>
-
+ <!--
+ |
+ | Definition des URL
+ |
+ +-->
<s:url id="selectPersonUrl" namespace="/ajax" action="selectWikittyComponent" escapeAmp="false">
<s:param name="wikittyExtension">Person</s:param>
<s:param name="sortField">Person.lastName</s:param>
@@ -91,7 +75,7 @@
href="%{listCompanyUrl}"
gridModel="gridModel"
rowList="10,20,50,100"
- rowNum="20"
+ rowNum="10"
rownumbers="true"
autowidth="true"
sortname="Company.name"
@@ -118,7 +102,7 @@
navigatorSearchOptions="{multipleGroup:true,showQuery:true,multipleSearch:true,sopt:['eq','ne','cn','nc','bw','bn','ew','en','lt','le','gt','ge','nu','nn','in','ni']}"
>
- <sjg:gridColumn name="id" hidden="true" key="true" title="Action" formatter="formatCompanyIdLink" editable="false" sortable="false"/>
+ <sjg:gridColumn name="id" hidden="true" title="id" key="true"/>
<sjg:gridColumn name="Company.name" index="Company.name" title="Société" editable="true" sortable="true"/>
<sjg:gridColumn name="Company.type" index="Company.type" title="type" editable="true" sortable="true"/>
@@ -128,7 +112,7 @@
href="%{listContactDetailsUrl}"
gridModel="gridModel"
rowList="10,20,50,100"
- rowNum="20"
+ rowNum="10"
rownumbers="true"
autowidth="true"
sortname="ContactDetails.type"
@@ -177,7 +161,7 @@
href="%{listEmployeeUrl}"
gridModel="gridModel"
rowList="10,20,50,100"
- rowNum="20"
+ rowNum="10"
rownumbers="true"
autowidth="true"
sortname="Person.lastName"
@@ -213,8 +197,8 @@
hidden="true" editrules="{edithidden:true}"
editoptions="{dataUrl:'%{selectPersonUrl}'}"/>
- <sjg:gridColumn name="Company.name" index="Company.name" title="Société" sortable="false" formatter="formatCompanyLink" editable="false"/>
- <sjg:gridColumn name="Person.lastName" index="Person.lastName" title="Nom" sortable="false" formatter="formatPersonNameLink" editable="false"/>
+ <sjg:gridColumn name="Company.name" index="Company.name" title="Société" sortable="false" editable="false"/>
+ <sjg:gridColumn name="Person.lastName" index="Person.lastName" title="Nom" sortable="false" editable="false"/>
<sjg:gridColumn name="Person.firstName" index="Person.firstName" title="Prénom" sortable="false" editable="false"/>
<sjg:gridColumn name="Person.diploma" index="Person.diploma" title="Diplôme" sortable="false" editable="false"/>
@@ -231,7 +215,7 @@
href="%{listContactDetailsUrl}"
gridModel="gridModel"
rowList="10,20,50,100"
- rowNum="20"
+ rowNum="10"
rownumbers="true"
autowidth="true"
sortname="ContactDetails.type"
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/persons.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/persons.jsp 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/persons.jsp 2012-04-23 13:11:43 UTC (rev 135)
@@ -1,7 +1,4 @@
-<%@page import="org.apache.commons.lang.StringUtils"%>
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
-<%@page import="java.util.List" %>
-<%@page import="org.chorem.entities.Person" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<%@taglib prefix="sj" uri="/struts-jquery-tags"%>
<%@taglib prefix="sjg" uri="/struts-jquery-grid-tags"%>
@@ -12,6 +9,7 @@
<title><s:text name="chorem.bonzoms.persons" /></title>
</head>
<body>
+
<h2><s:text name="chorem.bonzoms.persons" /></h2>
<s:url id="listPersonUrl" namespace="/ajax" action="EntitySearchJson" escapeAmp="false">
@@ -42,7 +40,7 @@
href="%{listPersonUrl}"
gridModel="gridModel"
rowList="10,20,50,100"
- rowNum="20"
+ rowNum="10"
rownumbers="true"
autowidth="true"
sortname="Person.lastName"
@@ -78,7 +76,7 @@
href="%{listContactDetailsUrl}"
gridModel="gridModel"
rowList="10,20,50,100"
- rowNum="20"
+ rowNum="10"
rownumbers="true"
autowidth="true"
sortname="ContactDetails.type"
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/gepeto/menu.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/gepeto/menu.jsp 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/gepeto/menu.jsp 2012-04-23 13:11:43 UTC (rev 135)
@@ -2,11 +2,12 @@
<div id="menu">
<ul>
- <li><s:a action="addProjectInput"><s:text name="chorem.gepeto.project.add" /></s:a></li>
- <s:url action="projectsByYear" var="projectsByYear">
- <s:param name="year">2011</s:param>
- </s:url>
- <li><a href="${projectsByYear}"><s:text name="chorem.gepeto.projects" /></a></li>
- <li><s:a action="projectsWithoutQuotation"><s:text name="chorem.gepeto.projectsWithoutQuotation" /></s:a></li>
+ <li><s:a action="projects"><s:text name="chorem.gepeto.projects" /></s:a></li>
+ <li><s:a action="addProjectInput"><s:text name="chorem.gepeto.project.add" /></s:a></li>
+ <s:url action="projectsByYear" var="projectsByYear">
+ <s:param name="year">2011</s:param>
+ </s:url>
+ <li><a href="${projectsByYear}"><s:text name="chorem.gepeto.projects" /></a></li>
+ <li><s:a action="projectsWithoutQuotation"><s:text name="chorem.gepeto.projectsWithoutQuotation" /></s:a></li>
</ul>
</div>
\ No newline at end of file
Copied: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/gepeto/projects.jsp (from rev 132, trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companies.jsp)
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/gepeto/projects.jsp (rev 0)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/gepeto/projects.jsp 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,254 @@
+<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
+<%@taglib prefix="s" uri="/struts-tags" %>
+<%@taglib prefix="sj" uri="/struts-jquery-tags"%>
+<%@taglib prefix="sjg" uri="/struts-jquery-grid-tags"%>
+
+<html xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
+ xmlns:jsp="http://java.sun.com/JSP/Page">
+ <head>
+ <title><s:text name="chorem.gepeto.projects" /></title>
+ </head>
+ <body>
+
+ <s:url id="selectEmployeeUrl" namespace="/ajax" action="selectWikittyComponent" escapeAmp="false">
+ <s:param name="wikittyExtension">Employee</s:param>
+ <s:param name="sortField">Employee.person</s:param>
+ </s:url>
+
+ <s:url id="selectCompanyUrl" namespace="/ajax" action="selectWikittyComponent" escapeAmp="false">
+ <s:param name="wikittyExtension">Company</s:param>
+ <s:param name="sortField">Company.name</s:param>
+ </s:url>
+
+ <s:url id="listProjectUrl" namespace="/ajax" action="EntitySearchJson" escapeAmp="false">
+ <s:param name="wikittyExtension">Project</s:param>
+ </s:url>
+
+ <s:url id="editProjectUrl" namespace="/ajax" action="EntitySearchJson" escapeAmp="false">
+ <s:param name="wikittyExtension">Project</s:param>
+ </s:url>
+
+ <s:url id="listQuotationUrl" namespace="/ajax" action="EntitySearchJson" escapeAmp="false">
+ <s:param name="wikittyExtension">Quotation</s:param>
+ <s:param name="wikittyLinkToLoad">Quotation.customer,Employee.person,Employee.company</s:param>
+ </s:url>
+
+ <s:url id="editQuotationUrl" namespace="/ajax" action="EntitySearchJson" escapeAmp="false">
+ <s:param name="wikittyExtension">Quotation</s:param>
+ <s:param name="wikittyLinkFieldForRowId">Quotation.project</s:param>
+ </s:url>
+
+ <s:url id="listProjectOrderUrl" namespace="/ajax" action="EntitySearchJson" escapeAmp="false">
+ <s:param name="wikittyExtension">ProjectOrder</s:param>
+ <s:param name="wikittyLinkToLoad">ProjectOrder.Quotation,Quotation.project,Quotation.customer,Employee.person,Employee.company</s:param>
+ </s:url>
+
+ <s:url id="editProjectOrderUrl" namespace="/ajax" action="EntitySearchJson" escapeAmp="false">
+ <s:param name="wikittyExtension">ProjectOrder</s:param>
+ </s:url>
+
+ <script type="text/javascript">
+ // event de la grille des companies qui selection seulement les employers
+ // la companie selectionnee
+ $.subscribe('rowselect', function(event, data) {
+ // alert('Selected Row : ' + event.originalEvent.id + ' data: ' + event.originalEvent.status);
+ var gridUrl = "<s:property value="listProjectOrderUrl" escapeHtml="false"/>&fulltextSearch=" + event.originalEvent.id;
+ jQuery("#gridProjectOrder").jqGrid('setGridParam',{url:gridUrl,page:1})
+ .trigger('reloadGrid');
+ });
+ </script>
+
+ <h2><s:text name="chorem.bonzoms.projects" /></h2>
+
+ <s:form>
+ <s:textfield id="fulltextSearchProject" name="fulltextSearchProject"
+ onkeydown="doSearch('#gridProject', '#fulltextSearchProject', '%{listProjectUrl}')"></s:textfield>
+ </s:form>
+
+ <sjg:grid
+ id="gridProject"
+ dataType="json"
+ href="%{listProjectUrl}"
+ gridModel="gridModel"
+ rowList="10,20,50,100"
+ rowNum="20"
+ rownumbers="true"
+ autowidth="true"
+ sortname="Project.name"
+ sortorder="asc"
+ pager="true"
+ viewrecords="true"
+
+ multiselect="false"
+
+ editurl="%{editProjectUrl}"
+ editinline="false"
+
+ onSelectRowTopics="rowselect"
+
+ navigator="true"
+ navigatorAdd="true"
+ navigatorEdit="true"
+ navigatorDelete="true"
+ navigatorView="true"
+ navigatorSearch="true"
+ navigatorAddOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorEditOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorDeleteOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorSearchOptions="{multipleGroup:true,showQuery:true,multipleSearch:true,sopt:['eq','ne','cn','nc','bw','bn','ew','en','lt','le','gt','ge','nu','nn','in','ni']}"
+ >
+
+ <sjg:gridColumn name="id" hidden="true" key="true" title="id"/>
+ <sjg:gridColumn name="Project.name" index="Project.name" title="Nom"
+ editable="true" sortable="true"/>
+ <sjg:gridColumn name="Project.description" index="Project.description"
+ title="Description" editable="true" sortable="true"
+ edittype="textarea"/>
+
+
+ <sjg:grid
+ id="gridQuotation"
+ dataType="json"
+ href="%{listQuotationUrl}"
+ gridModel="gridModel"
+ rowList="10,20,50,100"
+ rowNum="20"
+ rownumbers="true"
+ autowidth="true"
+ sortname="Quotation.reference"
+ sortorder="asc"
+ pager="true"
+ viewrecords="true"
+
+ multiselect="false"
+
+ editurl="%{editQuotationUrl}"
+ editinline="false"
+
+ navigator="true"
+ navigatorAdd="true"
+ navigatorEdit="true"
+ navigatorDelete="true"
+ navigatorView="true"
+ navigatorSearch="true"
+ navigatorAddOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorEditOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorDeleteOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorSearchOptions="{multipleGroup:true,showQuery:true,multipleSearch:true,sopt:['eq','ne','cn','nc','bw','bn','ew','en','lt','le','gt','ge','nu','nn','in','ni']}"
+ >
+
+ <sjg:gridColumn name="id" hidden="true" key="true" title="id"/>
+
+ <sjg:gridColumn name="Quotation.customer" index="Quotation.customer"
+ title="Acheteur" editable="true" edittype="select"
+ hidden="true" editrules="{edithidden:true,required:true}"
+ editoptions="{dataUrl:'%{selectEmployeeUrl}'}"/>
+ <sjg:gridColumn name="Quotation.supplier" index="Quotation.supplier"
+ title="Vendeur" editable="true" edittype="select"
+ hidden="true" editrules="{edithidden:true}"
+ editoptions="{dataUrl:'%{selectEmployeeUrl}'}"/>
+
+
+ <sjg:gridColumn name="Company.name" index="Company.name"
+ title="Société" editable="false" sortable="false"/>
+ <sjg:gridColumn name="Person.name" index="Person.name"
+ title="Acheteur" editable="false" sortable="false"/>
+
+ <sjg:gridColumn name="Quotation.reference" index="Quotation.reference"
+ title="Référence" editable="true" sortable="true"
+ editrules="{required:true}"/>
+ <sjg:gridColumn name="Quotation.type" index="Quotation.type"
+ title="Type" editable="true" sortable="true"
+ edittype="select" editoptions="{value:'Development:Development;TMA:TMA;Regie:Regie;System:Sytem;Conseil:Conseil;Audit:Audit;Support:Support;Other:Other'}"/>
+ <sjg:gridColumn name="Quotation.description" index="Quotation.description"
+ title="Description" editable="true" sortable="true"
+ edittype="textarea"/>
+ <sjg:gridColumn name="Quotation.amount" index="Quotation.amount"
+ title="Montant" editable="true" sortable="true"
+ editrules="{number:true}"/>
+ <sjg:gridColumn name="Quotation.VAT" index="Quotation.VAT"
+ title="TVA" editable="true" sortable="true"
+ editrules="{number:true}"/>
+ <sjg:gridColumn name="Interval.beginDate" index="Interval.beginDate"
+ title="Date d'envoi" editable="true" sortable="true"
+ editrules="{date:true}"/>
+ <sjg:gridColumn name="Interval.endDate" index="Interval.endDate"
+ title="Date de validité" editable="true" sortable="true"
+ editrules="{date:true}"/>
+ <sjg:gridColumn name="Quotation.conversionHope" index="Quotation.conversionHope"
+ title="Convertibilité" editable="true" sortable="true"
+ editrules="{integer:true,minValue:0,maxValue:100}"/>
+ </sjg:grid>
+ </sjg:grid>
+
+ <h2><s:text name="chorem.bonzoms.employees" /></h2>
+
+ <s:form>
+ <s:textfield id="fulltextSearchProjectOrder" name="fulltextSearchProjectOrder"
+ onkeydown="doSearch('#gridProjectOrder', '#fulltextSearchProjectOrder', '%{listProjectOrderUrl}')"></s:textfield>
+ </s:form>
+
+ <sjg:grid
+ id="gridProjectOrder"
+ dataType="json"
+ href="%{listProjectOrderUrl}"
+ gridModel="gridModel"
+ rowList="10,20,50,100"
+ rowNum="20"
+ rownumbers="true"
+ autowidth="true"
+ sortname="ProjectOrder.status"
+ sortorder="asc"
+ pager="true"
+ viewrecords="true"
+
+ multiselect="false"
+
+ editurl="%{editProjectOrderUrl}"
+ editinline="false"
+
+ navigator="true"
+ navigatorAdd="true"
+ navigatorEdit="true"
+ navigatorDelete="true"
+ navigatorView="true"
+ navigatorSearch="true"
+ navigatorAddOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorEditOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorDeleteOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorSearchOptions="{multipleGroup:true,showQuery:true,multipleSearch:true,sopt:['eq','ne','cn','nc','bw','bn','ew','en','lt','le','gt','ge','nu','nn','in','ni']}"
+ >
+
+ <sjg:gridColumn name="id" hidden="true" key="true" title="id"/>
+
+ <sjg:gridColumn name="ProjectOrder.company" index="ProjectOrder.company"
+ title="Société" editable="true" edittype="select"
+ hidden="true" editrules="{edithidden:true}"
+ editoptions="{dataUrl:'%{selectCompanyUrl}'}"/>
+
+ <sjg:gridColumn name="Company.name" index="Company.name"
+ title="Société" sortable="false" editable="false"/>
+
+ <sjg:gridColumn name="ProjectOrder.status" index="ProjectOrder.status"
+ title="Type" edittype="select" editable="true"
+ editoptions="{value:'NotStarted;NotStarted;WorkInProgress:WorkInProgress;Finished:Finished;Other:Other'}"/>
+ <sjg:gridColumn name="ProjectOrder.type" index="ProjectOrder.type"
+ title="Type" edittype="select" editable="true"
+ editoptions="{value:'Development;Development;Regie:Regie;System:Sytem;Conseil:Conseil;Audit:Audit;Support:Support;Other:Other'}"/>
+ <sjg:gridColumn name="ProjectOrder.description" index="ProjectOrder.description"
+ title="Description" edittype="textarea" editable="true"/>
+ <sjg:gridColumn name="Interval.beginDate" index="Interval.beginDate"
+ title="Date d'envoi" editable="true" sortable="true"
+ editrules="{date:true}"/>
+ <sjg:gridColumn name="Interval.endDate" index="Interval.endDate"
+ title="Date de validité" editable="true" sortable="true"
+ editrules="{date:true}"/>
+ <sjg:gridColumn name="Quotation.conversionHope" index="Quotation.conversionHope"
+ title="Convertibilité" editable="true" sortable="true"
+ editrules="{integer:true,minValue:0,maxValue:100}"/>
+
+ <%-- TODO poussin 20111123 put task grid here --%>
+ </sjg:grid>
+
+ </body>
+</html>
Property changes on: trunk/chorem-webmotion
___________________________________________________________________
Added: svn:ignore
+ target
Added: trunk/chorem-webmotion/LICENSE.txt
===================================================================
Added: trunk/chorem-webmotion/README.txt
===================================================================
Added: trunk/chorem-webmotion/changelog.txt
===================================================================
Added: trunk/chorem-webmotion/nb-configuration.xml
===================================================================
(Binary files differ)
Property changes on: trunk/chorem-webmotion/nb-configuration.xml
___________________________________________________________________
Added: svn:mime-type
+ application/xml
Added: trunk/chorem-webmotion/pom.xml
===================================================================
(Binary files differ)
Property changes on: trunk/chorem-webmotion/pom.xml
___________________________________________________________________
Added: svn:mime-type
+ application/xml
Added: trunk/chorem-webmotion/src/main/i18n/jsp.rules
===================================================================
--- trunk/chorem-webmotion/src/main/i18n/jsp.rules (rev 0)
+++ trunk/chorem-webmotion/src/main/i18n/jsp.rules 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,10 @@
+# Règles i18n pour les jsp
+
+//s:text/@name
+//s:submit/@key
+//s:textfield/@key
+//s:password/@key
+//s:file/@key
+//s:textarea/@key
+
+//sx:datetimepicker/@key
Added: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/GenericAction.java
===================================================================
--- trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/GenericAction.java (rev 0)
+++ trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/actions/GenericAction.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,411 @@
+package org.chorem.webmotion.actions;
+
+import com.google.common.collect.LinkedHashMultimap;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.chorem.ChoremClient;
+import org.debux.webmotion.server.WebMotionController;
+import org.debux.webmotion.server.render.Render;
+import org.nuiton.wikitty.WikittyUtil;
+import org.nuiton.wikitty.entities.Element;
+import org.nuiton.wikitty.entities.Wikitty;
+import org.nuiton.wikitty.entities.WikittyExtension;
+import org.nuiton.wikitty.entities.WikittyImpl;
+import org.nuiton.wikitty.entities.WikittyTypes;
+import org.nuiton.wikitty.generator.WikittyTagValue;
+import org.nuiton.wikitty.query.WikittyQuery;
+import org.nuiton.wikitty.query.WikittyQueryMaker;
+import org.nuiton.wikitty.query.WikittyQueryParser;
+import org.nuiton.wikitty.query.WikittyQueryResult;
+
+/**
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class GenericAction extends WebMotionController {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(GenericAction.class);
+
+ // ANCIENNE IMLANTATION A SUPPRIMER
+ public Render search2(ChoremClient client, String[] extension, String query) {
+ WikittyQuery q = null;
+ if (StringUtils.isNotBlank(query)) {
+ q = new WikittyQueryParser().parseQuery(query);
+ }
+ if (extension != null) {
+ WikittyQueryMaker maker = new WikittyQueryMaker().or();
+ for(String extName : extension) {
+ if (StringUtils.isNotBlank(extName)) {
+ maker.exteq(extName);
+ }
+ }
+
+ if (q == null) {
+ q = maker.end();
+ } else {
+ q = new WikittyQueryMaker(q).and()
+ .condition(q.getCondition())
+ .condition(maker.getCondition()).end();
+ }
+ }
+ LinkedHashMultimap<String, Wikitty> map = LinkedHashMultimap.create();
+ if (q != null) {
+ WikittyQueryResult<Wikitty> result = client.findAllByQuery(Wikitty.class, q);
+ for (Wikitty w : result) {
+ for (String ext : w.getExtensionNames()) {
+ String ts = w.getExtension(ext).getTagValue(WikittyTagValue.TAG_TO_STRING);
+ if (StringUtils.isNotBlank(ts)) {
+ map.put(ext, w);
+ }
+ }
+ }
+ }
+ return renderView("search.jsp", "result", map);
+ }
+
+ // FIXME poussin 20120418 cette methode est-elle vraiment utilise ?
+ // si oui searchJson ne peut-elle pas la remplacer ?
+ public Render searchFieldJson(ChoremClient client, String query) {
+ List<Map<String, String>> result;
+ try {
+ WikittyQuery q = WikittyQueryParser.parse(query);
+ q.setOffset(0).setLimit(WikittyQuery.MAX); // FIXME poussin 20120416 peut-etre toujours avoir un max et non pas l'infini (100?)
+ WikittyQueryResult<String> queryResult = client.findAllByQuery(q);
+
+ result = new ArrayList<Map<String, String>>(queryResult.size());
+ for (String s : queryResult) {
+ String id = s;
+ String label = s;
+ Map<String, String> item = new LinkedHashMap<String, String>();
+ item.put("label", label);
+ item.put("value", label);
+ item.put("name", label);
+ item.put("id", id);
+ result.add(item);
+ }
+ } catch (Exception eee) {
+ log.error(String.format("Can't evaluate query: '%s'", query), eee);
+ result = Collections.EMPTY_LIST;
+ }
+
+ return renderJSON(result);
+
+ }
+
+ public Render getById(ChoremClient client, String id) {
+ Map<String, String> result = new LinkedHashMap<String, String>();
+
+ Wikitty w = client.restore(id);
+ if (w != null) {
+ result.put("id", id);
+ result.put("version", w.getVersion());
+ result.put("extensions", StringUtils.join(w.getExtensionNames(), ","));
+ for (WikittyExtension ext : w.getExtensions()) {
+ result.put(ext.getName() + ".version", ext.getVersion());
+ for (String tag : ext.getTagNames()) {
+ result.put(ext.getName() + ".tag." + tag, ext.getTagValue(tag));
+ }
+ for (String field : ext.getFieldNames()){
+ result.put(ext.getName() + "." + field, w.getFieldAsString(ext.getName(), field));
+ }
+ }
+ }
+
+ return renderJSON(result);
+
+ }
+
+ public Render search(ChoremClient client, String[] extension, String query) {
+ LinkedHashMultimap<String, Wikitty> map = searchAsMap(client, extension, query);
+ return renderView("search.jsp", "result", map);
+
+ }
+
+ /**
+ * Execute une recherche et retourne le resultat sous un format json
+ * <pre>
+ * [{extension: XXXX, // nom de l'extension
+ * label: XXXX // toString pour l'extension pour l'objet
+ * value: XXXX // toString pour l'extension pour l'objet
+ * name: XXXX // toString pour l'extension pour l'objet
+ * id: XXXX // id de l'objet
+ * },
+ * {...}
+ * ,...
+ * ]
+ * </pre>
+ *
+ * @param client objet injecte par le framework webmotion/chorem
+ * @param extension la liste des extensions que peut/doit avoir l'objet resultat
+ * @param query la restriction a appliquer en plus des extensions
+ * @return une reponse JSON
+ */
+ public Render searchJson(ChoremClient client, String[] extension, String query) {
+// // extensionRestriction est de la forme "ext1,ext2;ext3;ext4,ext5,ext6" ...
+// String extensionRestriction = StringUtils.join(extension, ";");
+// if (StringUtils.isNotBlank(extensionRestriction)) {
+// // et il faut avoir "extension=ext1 AND extension=ext2 OR extension=ext3 OR extension=ext4 AND extension=ext5 AND extension=ext6"
+// extensionRestriction = extensionRestriction.replaceAll("\\s", "");
+// extensionRestriction = "extension=" + extensionRestriction;
+// extensionRestriction = extensionRestriction.replaceAll(";", " OR extension=");
+// extensionRestriction = extensionRestriction.replaceAll(",", " AND extension=");
+//
+// query += " AND ("+extensionRestriction+")";
+// }
+
+ LinkedHashMultimap<String, Wikitty> map = searchAsMap(client, extension, query);
+ List<Map<String, String>> result = new ArrayList<Map<String, String>>(map.size());
+ for (Map.Entry<String, Wikitty> e : map.entries()) {
+ String extName = e.getKey();
+ String id = e.getValue().getId();
+ String label = e.getValue().toString(extName);
+ Map<String, String> item = new LinkedHashMap<String, String>();
+ item.put("extension", extName);
+ item.put("label", label);
+ item.put("value", label);
+ item.put("name", label);
+ item.put("id", id);
+ result.add(item);
+ }
+ return renderJSON(result);
+ }
+
+ /**
+ * Fait une recherche et retourne le resultat dans une map avec comme cle
+ * le nom de l'extension et comme valeur une liste de Wikitty qui correspond
+ * aux criteres de recherche
+ *
+ * @param client objet injecte par le framework webmotion/chorem
+ * @param extension la liste des extensions que peut/doit avoir l'objet resultat
+ * Si vide alors on fait la recherche sur toutes les extensions disponibles
+ * dans la base.
+ * @param query la restriction a appliquer en plus des extensions
+ * @return une Map{extensionName: liste de wikitty}
+ */
+ protected LinkedHashMultimap<String, Wikitty> searchAsMap(
+ ChoremClient client, String[] extension, String query) {
+ boolean expliciteExtension = false;
+ Collection<String> extNames;
+ if (ArrayUtils.isEmpty(extension)) {
+ // recuperation de toutes les extensions
+ extNames = new LinkedHashSet<String>();
+ Collection<String> extIds = client.getAllExtensionIds();
+ for (String id : extIds) {
+ String name = WikittyExtension.computeName(id);
+ extNames.add(name);
+ }
+ } else {
+ // utilisation des extensions demande en parametre
+ extNames = Arrays.asList(extension);
+ expliciteExtension = true;
+ }
+
+ Map<String, WikittyExtension> extensionMaps = new LinkedHashMap<String, WikittyExtension>();
+ // chargement de la definition de toutes les extensions
+ List<WikittyExtension> exts = client.restoreExtensionAndDependenciesLastVesion(extNames);
+ for (WikittyExtension ext : exts) {
+ // on ne garde que les extensions qui on un toString ou qui ont ete
+ // explicitement demandee
+ if (expliciteExtension || ext.hasTagValueToString()) {
+ extensionMaps.put(ext.getName(), ext);
+ }
+ }
+
+ // suppression des extensions non souhaitee
+ // le mieux serait d'avoir une method sur le client 'restoreExtensionLastVesion'
+ extensionMaps.keySet().retainAll(extNames);
+
+ // creation de la parti de la condition commune a toutes les requetes
+ WikittyQuery q = null;
+ if (StringUtils.isNotBlank(query)) {
+ q = new WikittyQueryParser().parseQuery(query);
+ }
+
+ // creation d'une requete par extension
+ List<WikittyQuery> queries = new ArrayList<WikittyQuery>(extensionMaps.size());
+ for (WikittyExtension ext : extensionMaps.values()) {
+ WikittyQueryMaker queryMaker = new WikittyQueryMaker().and();
+ if (q != null) {
+ // on ajoute pour chaque champs precharge, la meme condition
+ // par exemple cela permet lorsqu'on recherche un 'Employee' de
+ // recherche aussi sur le nom de la personne ou de la societe
+ String [] preload = StringUtils.split(ext.getTagValue(WikittyTagValue.TAG_PRELOAD), ";");
+ if (preload == null) {
+ // si pas de preload, on ajoute directement la restriction
+ queryMaker.condition(q.getCondition());
+ } else {
+ // sinon, il faut faire un "or" entre tous
+ queryMaker.or();
+ // on ajoute la restriction dans le or
+ queryMaker.condition(q.getCondition());
+ for (String e : preload) {
+// String preloadQuery = String.format("%s={SELECT ID WHERE %s}",
+// e, query);
+// WikittyQuery wq = WikittyQueryParser.parse(preloadQuery);
+// queryMaker.condition(wq.getCondition());
+ queryMaker.containsOne(Element.get(e))
+ .select(Element.ID).condition(q.getCondition())
+ .close() // select
+ .close(); // containsOne
+ }
+ // on ferme le or
+ queryMaker.close();
+ }
+ }
+
+
+ WikittyQuery extQuery = queryMaker.exteq(ext.getName()).end();
+ extQuery.setName(ext.getName());
+ if (q != null) {
+ extQuery.setOffset(q.getOffset());
+ extQuery.setLimit(q.getLimit());
+ }
+ // ajout de l'ordre de tri de l'extension
+ extQuery.setSortAscending(ext.getSortAscending());
+ extQuery.setSortDescending(ext.getSortDescending());
+
+ queries.add(extQuery);
+ }
+
+ if (log.isDebugEnabled()) {
+ log.debug("Queries: " + queries);
+ }
+
+ List<WikittyQueryResult<Wikitty>> results =
+ client.findAllByQuery(Wikitty.class, queries);
+
+ // on classe par extension demande les resultats
+ LinkedHashMultimap<String, Wikitty> map = LinkedHashMultimap.create();
+ for (WikittyQueryResult<Wikitty> result : results) {
+ String ext = result.getQueryName();
+ for (Wikitty w : result) {
+ map.put(ext, w);
+ }
+ }
+
+ return map;
+ }
+
+ public Render view(ChoremClient client, String id, String[] extension) {
+ log.debug("view: " + id);
+ Wikitty w = client.restore(id, ".*");
+
+ LinkedHashSet<WikittyExtension> exts = new LinkedHashSet<WikittyExtension>();
+ if (w != null) {
+ if (extension == null) {
+ exts.addAll(w.getExtensions());
+ } else {
+ for (String extName : extension) {
+ exts.addAll(w.getExtensionDependencies(extName, true));
+ exts.add(w.getExtension(extName));
+ }
+ }
+ }
+
+ return renderView("view.jsp", "wikitty", w, "extensions", exts);
+ }
+
+ public Render edit(ChoremClient client, String id, String[] extension) {
+ log.debug("edit: " + id);
+ Wikitty w = client.restore(id, ".*");
+
+ if (w == null) {
+ w = new WikittyImpl();
+ }
+ if (extension != null) {
+ List<WikittyExtension> newExts =
+ client.restoreExtensionAndDependenciesLastVesion(Arrays.asList(extension));
+ w.addExtension(newExts);
+ }
+
+ LinkedHashSet<WikittyExtension> exts = new LinkedHashSet<WikittyExtension>();
+ if (w != null) {
+ if (extension == null) {
+ exts.addAll(w.getExtensions());
+ } else {
+ for (String extName : extension) {
+ exts.addAll(w.getExtensionDependencies(extName, true));
+ exts.add(w.getExtension(extName));
+ }
+ }
+ }
+
+ return renderView("edit.jsp", "wikitty", w, "extensions", exts);
+ }
+
+ public Render save(ChoremClient client, String id, String extension) {
+ log.debug("save: " + id);
+ Wikitty w = client.restore(id);
+ if (w == null) {
+ w = new WikittyImpl();
+ }
+ List<WikittyExtension> exts =
+ client.restoreExtensionAndDependenciesLastVesion(Arrays.asList(extension));
+ w.addExtension(exts);
+ Map<String, String[]> params = getContext().getParameters();
+ String error = "";
+ for (String fqfield : params.keySet()) {
+ if (w.hasField(fqfield)) {
+ String[] values = params.get(fqfield);
+ Object v;
+ if (w.getFieldType(fqfield).isCollection()) {
+ if (values.length == 1 && w.getFieldType(fqfield).getType() == WikittyTypes.WIKITTY) {
+ // petit hack si l'editeur utilise n'est pas un select,
+ // mais un input (et donc des valeurs separees par des ','
+ values = values[0].split(",");
+ System.out.println("YYYY " + Arrays.toString(values));
+ }
+ v = values;
+ } else {
+ v = values[0];
+ }
+ try {
+ System.out.println("AAA try to put in field: " + fqfield + " values: " + Arrays.toString(values));
+ w.setFqField(fqfield, v);
+ System.out.println("XXX after field: " + w.getFqField(fqfield));
+ } catch (Exception eee) {
+ String msg = String.format("Can't put value '%s' in field '%s'", v, fqfield);
+ error += "\n<li>" + msg + "</li>";
+ log.error(msg, eee);
+ }
+ }
+ }
+ client.store(w);
+
+ getContext().addInfoMessage("message", "Object saved" + error);
+
+ return renderURL("/wikitty/view/"+w.getId());
+ }
+
+ public Render delete(ChoremClient client, String id, String[] extension) {
+ log.debug("delete: " + id);
+ if (extension == null) {
+ client.delete(id);
+ getContext().addInfoMessage("message", "Object deleted");
+ } else {
+ getContext().addInfoMessage("message", "Delete extension not yet implemented");
+// Wikitty w = client.restore(id);
+// for (String extName : extension) {
+// // todo remove extension field and extension
+// }
+ }
+ return renderURL("/wikitty/view/"+id);
+ }
+}
Added: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/filters/ChoremClientFilter.java
===================================================================
--- trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/filters/ChoremClientFilter.java (rev 0)
+++ trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/filters/ChoremClientFilter.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,52 @@
+package org.chorem.webmotion.filters;
+
+
+import java.lang.reflect.Method;
+import java.util.Map;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.chorem.ChoremClient;
+import org.debux.webmotion.server.WebMotionFilter;
+import org.debux.webmotion.server.WebMotionUtils;
+import org.debux.webmotion.server.call.Executor;
+import org.debux.webmotion.server.mapping.Mapping;
+
+/**
+ * Inject dans les parametres des actions le client wikitty a utiliser pour les
+ * actions (ChoremClient)
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class ChoremClientFilter extends WebMotionFilter {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(ChoremClientFilter.class);
+
+ public void inject(Mapping mapping, String token) {
+ ChoremClient client = ChoremClient.getClient(token);
+
+ Executor executor = contextable.getCall().getExecutor();
+ if (executor != null) {
+ Method executorMethod = executor.getMethod();
+ String[] parameterNames = WebMotionUtils.getParameterNames(mapping, executorMethod);
+ Class<?>[] parameterTypes = executorMethod.getParameterTypes();
+ Map<String, Object> parameters = executor.getParameters();
+
+ for (int i=0; i<parameterNames.length; i++) {
+ Class<?> clazz = parameterTypes[i];
+ if (ChoremClient.class.isAssignableFrom(clazz)) {
+ String name = parameterNames[i];
+ if (parameters.get(name) == null) {
+ parameters.put(name, client);
+ }
+ }
+ }
+ }
+
+ doProcess();
+ }
+}
Added: trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/filters/DecoratorFilter.java
===================================================================
--- trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/filters/DecoratorFilter.java (rev 0)
+++ trunk/chorem-webmotion/src/main/java/org/chorem/webmotion/filters/DecoratorFilter.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,54 @@
+package org.chorem.webmotion.filters;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.debux.webmotion.server.WebMotionFilter;
+import org.debux.webmotion.server.render.Render;
+
+/**
+ * Filtre pour decorer les pages. Il est possible de le configurer pour modifier
+ * le fichier view par defaut ou le nom du slot principale
+ * <p>
+ * parametre possible
+ * <li> view: le nom du fichier jsp a utiliser comme decorateur (defaut: decorator.jsp)
+ * <li> main: le nom du slot utilise pour mettre le contenu principal (defaut: slotContent)
+ *
+ * Si dans la requete on trouve un attribut "__nodecorator__" qui vaut true alors
+ * on ne fait pas la decoration.
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class DecoratorFilter extends WebMotionFilter {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(DecoratorFilter.class);
+
+ public Render decorate(String wmDecoratorNo, String wmDecoratorView, String wmDecoratorMain) {
+ Boolean nodecorator = (Boolean)getContext().getRequest().getAttribute("wmDecoratorNo");
+ if (StringUtils.equalsIgnoreCase("true", wmDecoratorNo)
+ || nodecorator != null && nodecorator) {
+ log.debug("Decorator direct process");
+ doProcess();
+ return null;
+ } else {
+ getContext().getRequest().setAttribute("wmDecoratorNo", Boolean.TRUE);
+ String url = getContext().getUrl();
+ // pas besoin de mettre le query car, les arguments sont deja parse et stocke dans la request
+ log.debug("Decorate page '"+ url +"'");
+
+ if (StringUtils.isBlank(wmDecoratorView)) {
+ wmDecoratorView = "decorator.jsp";
+ }
+ if (StringUtils.isBlank(wmDecoratorMain)) {
+ wmDecoratorMain = "slotContent";
+ }
+ return renderView(wmDecoratorView, wmDecoratorMain, url);
+ }
+ }
+
+}
Added: trunk/chorem-webmotion/src/main/java/org/wikitty/web/jsptag/WikittyInput.java
===================================================================
--- trunk/chorem-webmotion/src/main/java/org/wikitty/web/jsptag/WikittyInput.java (rev 0)
+++ trunk/chorem-webmotion/src/main/java/org/wikitty/web/jsptag/WikittyInput.java 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,275 @@
+package org.wikitty.web.jsptag;
+
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.ServletContext;
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.JspWriter;
+import javax.servlet.jsp.PageContext;
+import javax.servlet.jsp.tagext.DynamicAttributes;
+import javax.servlet.jsp.tagext.SimpleTagSupport;
+import org.apache.commons.lang3.StringEscapeUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateFormatUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuiton.wikitty.WikittyUtil;
+import org.nuiton.wikitty.entities.FieldType;
+import org.nuiton.wikitty.entities.Wikitty;
+
+/**
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class WikittyInput extends SimpleTagSupport implements DynamicAttributes {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(WikittyInput.class);
+
+ protected Map<String, Object> dynamicAttribute = new HashMap<String, Object>();
+
+ protected String name="";
+ protected Object defaultValue="";
+
+ protected Wikitty wikitty;
+ protected String fqfield="";
+
+ public void setDynamicAttribute(String uri, String localName, Object value) throws JspException {
+ dynamicAttribute.put(localName, value);
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void setDefaultValue(Object defaultValue) {
+ this.defaultValue = defaultValue;
+ }
+
+ public void setWikitty(Wikitty wikitty) {
+ this.wikitty = wikitty;
+ }
+
+ public void setFqfield(String fqfield) {
+ this.fqfield = fqfield;
+ }
+
+ @Override
+ public void doTag() throws JspException, IOException {
+ // par defaut si pas de name on utilise celui du field
+ if (StringUtils.isBlank(name)) {
+ name = fqfield;
+ }
+
+ JspWriter output = getJspContext().getOut();
+ PageContext pageContext = (PageContext)getJspContext();
+ ServletContext servletContext = pageContext.getServletContext();
+ String contextPath = servletContext.getContextPath();
+
+ String extName = WikittyUtil.getExtensionNameFromFQFieldName(fqfield);
+ String fieldName = WikittyUtil.getFieldNameFromFQFieldName(fqfield);
+ FieldType field = wikitty.getFieldType(fqfield);
+
+ if (field != null) {
+ switch(field.getType()) {
+ case BINARY:
+ inputBinary(output, contextPath, name, wikitty, field, extName, fieldName);
+ break;
+ case BOOLEAN:
+ inputBoolean(output, contextPath, name, wikitty, field, extName, fieldName);
+ break;
+ case DATE:
+ inputDate(output, contextPath, name, wikitty, field, extName, fieldName);
+ break;
+ case NUMERIC:
+ inputNumeric(output, contextPath, name, wikitty, field, extName, fieldName);
+ break;
+ case STRING:
+ if (field.isCollection()) {
+ inputCollectionString(output, contextPath, name, wikitty, field, extName, fieldName);
+ } else {
+ inputString(output, contextPath, name, wikitty, field, extName, fieldName);
+ }
+ break;
+ case WIKITTY:
+ if (field.isCollection()) {
+ inputCollectionWikitty(output, contextPath, name, wikitty, field, extName, fieldName);
+ } else {
+ inputWikitty(output, contextPath, name, wikitty, field, extName, fieldName);
+ }
+ break;
+ }
+ } else {
+ /*{<div class="alert alert-error"><%=wikitty.getId()%> doesn't have field '<%=fqfield%>'</div>}*/
+ }
+ }
+
+ protected String getDynamicAttribute() {
+ String result = "";
+ for (Map.Entry<String, Object> e : dynamicAttribute.entrySet()) {
+ result += " " + e.getKey() + "=\"" + e.getValue() + "\"";
+ }
+ return result;
+ }
+
+
+
+ protected void inputBinary(JspWriter output, String contextPath, String name,
+ Wikitty wikitty, FieldType field, String extName , String fieldName)
+ throws JspException, IOException {
+ /*{<input type="text" name="<%=name%>" <%=getDynamicAttribute()%>/>"}*/
+ }
+
+ protected void inputBoolean(JspWriter output, String contextPath, String name,
+ Wikitty wikitty, FieldType field, String extName , String fieldName)
+ throws JspException, IOException {
+ boolean value = wikitty.getFieldAsBoolean(extName, fieldName);
+ String checked="";
+ if (value) {
+ checked=" checked";
+ }
+ /*{<input type="checkbox" name="<%=name%>"<%=checked%><%=getDynamicAttribute()%>/>}*/
+ }
+
+ protected void inputDate(JspWriter output, String contextPath, String name,
+ Wikitty wikitty, FieldType field, String extName , String fieldName)
+ throws JspException, IOException {
+ Date date = wikitty.getFieldAsDate(extName, fieldName);
+ String value = DateFormatUtils.format(date, "dd/MM/yyyy");
+ /*{<input class="datepicker" type="date" name="<%=name%>" value="<%=value%>"<%=getDynamicAttribute()%>/>}*/
+ }
+
+ protected void inputNumeric(JspWriter output, String contextPath, String name,
+ Wikitty wikitty, FieldType field, String extName , String fieldName)
+ throws JspException, IOException {
+ BigDecimal value = wikitty.getFieldAsBigDecimal(extName, fieldName);
+ /*{<input type="text" name="<%=name%>" value="<%=value%>"<%=getDynamicAttribute()%>/>}*/
+ }
+
+ protected void inputString(JspWriter output, String contextPath, String name,
+ Wikitty wikitty, FieldType field, String extName , String fieldName)
+ throws JspException, IOException {
+ String id = wikitty.getId() + "-" + extName + "-" + fieldName;
+ String value = wikitty.getFieldAsString(extName, fieldName);
+ if ("monoline".equalsIgnoreCase(field.getSubtype())) {
+ /*{<input id="text-<%=id%>" type="text" name="<%=name%>" value="<%=value%>"<%=getDynamicAttribute()%>/>}*/
+ if (field.hasChoiceQuery()) {
+ String url = contextPath + "/wikitty-json/searchField?q=" + field.getChoiceQuery();
+/*{
+ <script>
+ $(function() {
+ $( "#text-<%=id%>" ).autocomplete({
+ source: "<%=url%>",
+ minLength: 1
+ });
+ });
+ </script>
+}*/
+ }
+ } else {
+ /*{<textarea name="<%=name%>"<%=getDynamicAttribute()%>><%=value%></textarea>}*/
+ }
+ }
+
+ protected void inputCollectionString(JspWriter output, String contextPath, String name,
+ Wikitty wikitty, FieldType field, String extName , String fieldName)
+ throws JspException, IOException {
+ String id = wikitty.getId() + "-" + extName + "-" + fieldName;
+ List<String> value = wikitty.getFieldAsList(extName, fieldName, String.class);
+
+ if ("monoline".equalsIgnoreCase(field.getSubtype())) {
+ /*{<input id="text-<%=id%>" type="text" name="<%=name%>" value="<%=value%>"<%=getDynamicAttribute()%>/>}*/
+ if (field.hasChoiceQuery()) {
+ String url = contextPath + "/wikitty-json/searchField?q=" + field.getChoiceQuery();
+/*{
+ <script>
+ $(function() {
+ $( "#text-<%=id%>" ).autocomplete({
+ source: "<%=url%>",
+ minLength: 1
+ });
+ });
+ </script>
+}*/
+ }
+ } else {
+ /*{<textarea name="<%=name%>"<%=getDynamicAttribute()%>><%=value%></textarea>}*/
+ }
+ }
+
+ protected void inputWikitty(JspWriter output, String contextPath, String name,
+ Wikitty wikitty, FieldType field, String extName , String fieldName)
+ throws JspException, IOException {
+ String id = wikitty.getId() + "-" + extName + "-" + fieldName;
+ String value = wikitty.getFieldAsWikitty(extName, fieldName);
+ Wikitty wikittyValue = wikitty.getFieldAsWikitty(extName, fieldName, false);
+ String url = contextPath + "/wikitty-json/search?extension=" + field.getAllowed();
+/*{
+ <script>
+ $(function() {
+ $( "#text-<%=id%>" ).autocompleteByExtension({
+ source: "<%=url%>",
+ minLength: 2,
+ select: function( event, ui ) {
+ $( "#text-<%=id%>" ).val( ui.item.label );
+ $( "#hidden-<%=id%>" ).val( ui.item.id );
+
+ return false;
+ }
+ });
+ });
+ </script>
+
+<input type="text" id="text-<%=id%>" value="<%=wikittyValue%>"<%=getDynamicAttribute()%>/>
+<input type="hidden" id="hidden-<%=id%>" name="<%=name%>" value="<%=value%>"/>
+}*/
+ }
+
+ protected void inputCollectionWikitty(JspWriter output, String contextPath, String name,
+ Wikitty wikitty, FieldType field, String extName , String fieldName)
+ throws JspException, IOException {
+ String id = wikitty.getId() + "-" + extName + "-" + fieldName;
+ List<Wikitty> values = wikitty.getFieldAsWikittyList(extName, fieldName, false);
+
+ String url = contextPath + "/wikitty-json/search?extension=" + field.getAllowed();
+
+ String sep = "";
+ String prePopulate = "[";
+ if (values != null) {
+ for (Wikitty w :values) {
+ if (w != null) {
+ prePopulate += String.format("%s{id:'%s', label:'%s'}", sep,
+ StringEscapeUtils.escapeEcmaScript(w.getId()),
+ StringEscapeUtils.escapeEcmaScript(w.toString()));
+ sep = ",";
+ }
+ }
+ }
+ prePopulate += "]";
+/*{
+<script type="text/javascript">
+$(document).ready(function () {
+ $("#text-<%=id%>").tokenInput("<%=url%>", {
+ prePopulate: <%=prePopulate%>,
+ preventDuplicates: true,
+ propertyToSearch: "label"
+
+ });
+});
+</script>
+
+<input type="text" id="text-<%=id%>" name="<%=name%>"<%=getDynamicAttribute()%>/>
+}*/
+ }
+
+
+}
Added: trunk/chorem-webmotion/src/main/resources/i18n/chorem-webmotion_en_GB.properties
===================================================================
Added: trunk/chorem-webmotion/src/main/resources/i18n/chorem-webmotion_fr_FR.properties
===================================================================
Added: trunk/chorem-webmotion/src/main/resources/log4j.properties
===================================================================
--- trunk/chorem-webmotion/src/main/resources/log4j.properties (rev 0)
+++ trunk/chorem-webmotion/src/main/resources/log4j.properties 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,34 @@
+###
+# #%L
+# bow
+#
+# $Id$
+# $HeadURL$
+# %%
+# Copyright (C) 2010 CodeLutin
+# %%
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero 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 Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+# #L%
+###
+# Global logging configuration
+log4j.rootLogger=INFO, stdout
+
+# Console output...
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d %5p [%t] (%F:%L) %M - %m%n
+
+# package level
+log4j.logger.org.chorem=DEBUG
+log4j.logger.org.nuiton=INFO
Added: trunk/chorem-webmotion/src/main/resources/mapping
===================================================================
--- trunk/chorem-webmotion/src/main/resources/mapping (rev 0)
+++ trunk/chorem-webmotion/src/main/resources/mapping 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,27 @@
+[config]
+package.views=WEB-INF/jsp
+package.filters=org.chorem.webmotion.filters
+package.actions=org.chorem.webmotion.actions
+
+[filters]
+* /* ChoremClientFilter.inject
+#GET /wikitty/{extension}/view/{id} DecoratorFilter.decorate slotEntityFooter={extension}Footer.jsp
+* /wikitty-json/* DecoratorFilter.decorate wmDecoratorNo=true
+GET /* DecoratorFilter.decorate
+
+[actions]
+* / view:index.jsp
+* /wikitty/{extension}/search action:GenericAction.search
+* /wikitty/{extension}/view/{id} action:GenericAction.view
+* /wikitty/{extension}/edit/{id} action:GenericAction.edit
+* /wikitty/{extension}/delete/{id} action:GenericAction.delete
+* /wikitty/search action:GenericAction.search
+* /wikitty/view/{id} action:GenericAction.view
+* /wikitty/edit/{id} action:GenericAction.edit
+* /wikitty/delete/{id} action:GenericAction.delete
+* /wikitty/save action:GenericAction.save
+* /wikitty-json/searchField?q={query} action:GenericAction.searchFieldJson
+* /wikitty-json/search?q={query} action:GenericAction.searchJson
+* /wikitty-json/search?term={query} action:GenericAction.searchJson
+* /wikitty-json/get/{id} action:GenericAction.getById
+* /contact view:contact.jsp
Added: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/contact.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/contact.jsp (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/contact.jsp 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,4 @@
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+
+<h1>Contact</h1>
+toto: '${param.toto}'
Added: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/decorator.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/decorator.jsp (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/decorator.jsp 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,143 @@
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+<!DOCTYPE html>
+
+<html>
+ <head>
+ <title>Chorem</title>
+ <meta charset="utf-8" />
+ <%-- JQuery --%>
+ <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
+ <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
+ <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
+ <script type="text/javascript" src="http://jquery-ui.googlecode.com/svn/trunk/ui/i18n/jquery.ui.datepicker-fr.js"></script>
+ <%-- Bootstrap --%>
+ <link rel="stylesheet/less" href="/css/bootstrap.min.css">
+ <link rel="stylesheet/less" href="/css/bootstrap-responsive.min.css">
+ <script src="/js/bootstrap.min.js"></script>
+ <%-- multi selection ajax --%>
+ <script type="text/javascript" src="/js/jquery.tokeninput.js"></script>
+ <link rel="stylesheet" type="text/css" href="/css/token-input.css" />
+ <link rel="stylesheet" type="text/css" href="/css/token-input-mac.css" />
+ <link rel="stylesheet" type="text/css" href="/css/token-input-facebook.css" />
+ <%-- Specific chorem --%>
+ <link rel="stylesheet/less" href="/css/chorem.less">
+ <script src="/js/less-1.2.1.min.js"></script>
+ <script src="/js/chorem.js"></script>
+ </head>
+ <body>
+ <div class="navbar navbar-fixed-top">
+ <div class="navbar-inner">
+ <div class="container">
+ <!-- .btn-navbar is used as the toggle for collapsed navbar content -->
+ <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </a>
+
+ <a class="brand" href="/">Chorem</a>
+
+ <!-- Everything you want hidden at 940px or less, place within here -->
+ <div class="nav-collapse">
+
+ <ul class="nav">
+ <li class="dropdown nav-group">
+ <a href="<c:url value="/wikitty/search?extension=Company&extension=Person&extension=Contact"/>">Contact</a>
+ <a href="#"
+ class="dropdown-toggle"
+ data-toggle="dropdown">
+ <b class="caret"></b>
+ </a>
+ <ul class="dropdown-menu">
+ <li><a href="<c:url value="/wikitty/Company/search"/>"><i class="icon-th-list icon-black"></i> All company</a></li>
+ <li><a href="<c:url value="/wikitty/Company/edit/new"/>"><i class="icon-plus icon-black"></i> Add company</a></li>
+ <li class="divider"></li>
+ <li><a href="<c:url value="/wikitty/Employee/search"/>"><i class="icon-th-list icon-black"></i> All employee</a></li>
+ <li><a href="<c:url value="/wikitty/Employee/edit/new"/>"><i class="icon-plus icon-black"></i> Add employee</a></li>
+ <li class="divider"></li>
+ <li><a href="<c:url value="/wikitty/Person/search"/>"><i class="icon-th-list icon-black"></i> All person</a></li>
+ <li><a href="<c:url value="/wikitty/Person/edit/new"/>"><i class="icon-plus icon-black"></i> Add person</a></li>
+ <li class="divider"></li>
+ <li><a href="<c:url value="/wikitty/Touch/search"/>"><i class="icon-th-list icon-black"></i> All touch</a></li>
+ <li><a href="<c:url value="/wikitty/Touch/edit/new"/>"><i class="icon-plus icon-black"></i> Add touch</a></li>
+ </ul>
+ </li>
+ <li class="dropdown nav-group">
+ <a href="/project">Project</a>
+ <a href="#"
+ class="dropdown-toggle"
+ data-toggle="dropdown">
+ <b class="caret"></b>
+ </a>
+ <ul class="dropdown-menu">
+ <li><a href="/project/company">Propale</a></li>
+ <li><a href="/project/current">Current project</a></li>
+ <li><a href="/wikitty/search?query=extension=Task">Task</a></li>
+ </ul>
+ </li>
+ <li class="dropdown nav-group">
+ <a href="/financial">Financial</a>
+ <a href="#"
+ class="dropdown-toggle"
+ data-toggle="dropdown">
+ <b class="caret"></b>
+ </a>
+ <ul class="dropdown-menu">
+ <li><a href="/financial/projected">Projected</a></li>
+ <li><a href="/wikitty/search?query=extension=Invoice">Invoice</a></li>
+ <li><a href="/wikitty/search?query=extension=Accounting">Accounting</a></li>
+ </ul>
+ </li>
+ <li class="dropdown nav-group">
+ <a href="/hr">HR</a>
+ <a href="#"
+ class="dropdown-toggle"
+ data-toggle="dropdown">
+ <b class="caret"></b>
+ </a>
+ <ul class="dropdown-menu">
+ <li><a href="/wikitty/search?query=extension=Employee">Employee</a></li>
+ <li><a href="/wikitty/search?query=extension=Interview">Annual interview</a></li>
+ </ul>
+ </li>
+ </ul>
+
+ <form class="navbar-search pull-left" action="<c:url value="/wikitty/search"/>">
+ <input type="text" class="search-query" placeholder="Search" name="query" value="${param.query}"/>
+ </form>
+ </div>
+
+
+ </div>
+ </div>
+ </div>
+
+ <div class="container">
+ <c:if test="${not empty slotMenu}" >
+ <jsp:include page="${slotMenu}"></jsp:include>
+ </c:if>
+ </div>
+
+ <c:if test="${not empty flashMessages.errors.message}">
+ <div class="alert alert-error">
+ ... ${flashMessages.errors.message}
+ </div>
+ </c:if>
+
+ <c:if test="${not empty flashMessages.infos.message}">
+ <div class="alert alert-info">
+ ... ${flashMessages.infos.message}
+ </div>
+ </c:if>
+
+ <div class="container">
+ <div class="well">
+ <c:if test="${not empty slotContent}" >
+ <jsp:include page="${slotContent}"></jsp:include>
+ </c:if>
+ </div>
+ </div>
+ </body>
+</html>
Added: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/edit.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/edit.jsp (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/edit.jsp 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,22 @@
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="/WEB-INF/wikitty.tld" prefix="w"%>
+
+<c:if test="${not empty wikitty}">
+ <form class="form-inline" method="post" action="/wikitty/save">
+ <input type="hidden" name="id" value="${wikitty.id}"/>
+ <p>
+ <button class="btn btn-success" type="submit"><i class="icon-ok icon-white"></i> Save</button>
+ <a class="btn btn-info" href="/wikitty/view/${wikitty.id}"><i class="icon-remove icon-white"></i> Cancel</a>
+ </p>
+
+ <c:forEach var="ext" items="${extensions}">
+ <input type="hidden" name="extension" value="${ext.name}">
+ <dl><dt>${ext.name}</dt>
+ <c:forEach var="fieldName" items="${ext.fieldNames}">
+ <dd>${fieldName}: <w:input wikitty="${wikitty}" fqfield="${ext.name}.${fieldName}"/><%--@ include file="wikittyFieldEdit.jsp"--%></dd>
+ </c:forEach>
+ </dl>
+ </c:forEach>
+ </form>
+</c:if>
Added: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/footerPerson.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/footerPerson.jsp (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/footerPerson.jsp 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,4 @@
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+<jsp:include page="/wikitty/search?query=${wikitty.id} id!=${wikitty.id}"/>
Added: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/index.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/index.jsp (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/index.jsp 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,5 @@
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+
+<h1>Chorem</h1>
+
+Bienvenue sur Chorem, l'outil de gestion d'entreprise.
Added: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/search.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/search.jsp (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/search.jsp 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,25 @@
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+<c:forEach var="key" items="${result.keySet()}">
+ <dl>
+ <dt>
+ <ul class="nav nav-pills">
+ <li>
+ <a href="<c:url value="/wikitty/${key}/search"/>">${key}</a>
+ </li>
+ <li>
+ <a class="btn btn-success btn-mini" href="<c:url value="/wikitty/${key}/edit/new"/>"><i class="icon-plus icon-white"></i> Add</a>
+ </li>
+ <li>
+ <form class="form-search form-inline" action="<c:url value="/wikitty/${key}/search"/>">
+ <input type="text" class="search-query" placeholder="Search" name="query"/>
+ </form>
+ </li>
+ </ul>
+ </dt>
+ <c:forEach var="w" items="${result.get(key)}">
+ <dd><a href="<c:url value="/wikitty/${key}/view/${w.id}"/>"><c:out value="${w.toString(key)}"/></a></dd>
+ </c:forEach>
+ </dl>
+</c:forEach>
Added: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/view.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/view.jsp (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/view.jsp 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,29 @@
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+<p>
+ <c:if test="${not empty wikitty}">
+ <a class="btn btn-success" href="<c:url value="/wikitty/view/${wikitty.id}"/>"><i class="icon-list icon-white"></i> View all extension</a>
+ <a class="btn btn-success" href="<c:url value="/wikitty/edit/${wikitty.id}"/>"><i class="icon-pencil icon-white"></i> Edit object</a>
+ <a class="btn btn-danger" href="<c:url value="/wikitty/delete/${wikitty.id}?wmDecoratorNo=true"/>"><i class="icon-trash icon-white"></i> Delete object</a>
+ </c:if>
+</p>
+
+<c:forEach var="ext" items="${extensions}">
+ <dl><dt><a href="<c:url value="/wikitty/search?query=extension=${ext.name}"/>">${ext.name}</a>
+ <a class="btn btn-success btn-mini" href="<c:url value="/wikitty/edit/${wikitty.id}?extension=${ext.name}"/>"><i class="icon-pencil icon-white"></i> Edit</a>
+ <a class="btn btn-danger btn-mini" href="<c:url value="/wikitty/delete/${wikitty.id}?extension=${ext.name}&wmDecoratorNo=true"/>"><i class="icon-trash icon-white"></i> Delete</a></dt>
+ <c:forEach var="fieldName" items="${ext.fieldNames}">
+ <dd><%@ include file="wikittyFieldView.jsp"%></dd>
+ </c:forEach>
+ </dl>
+</c:forEach>
+
+<div class="container">
+ <jsp:include page="/wikitty/search?query=${wikitty.id} AND id!=${wikitty.id}"/>
+<%--
+ <c:forEach var="ext" items="${extensions}">
+ <jsp:include page="footer${ext.name}.jsp"/>
+ </c:forEach>
+--%>
+</div>
Added: trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/wikittyFieldView.jsp
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/wikittyFieldView.jsp (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/jsp/wikittyFieldView.jsp 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,42 @@
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+<c:choose>
+ <c:when test="${ext.getFieldType(fieldName).type == 'BOOLEAN'}">
+ ${fieldName}: ${wikitty.getFieldAsBoolean(ext.name, fieldName)}
+ </c:when>
+ <c:when test="${ext.getFieldType(fieldName).type == 'DATE'}">
+ <c:choose>
+ <c:when test="${ext.getFieldType(fieldName).hasPattern()}">
+ ${fieldName}: <fmt:formatDate value="${wikitty.getFieldAsDate(ext.name, fieldName)}"
+ pattern="${ext.getFieldType(fieldName).getPattern()}"/>
+ </c:when>
+ <c:otherwise>
+ ${fieldName}: <fmt:formatDate value="${wikitty.getFieldAsDate(ext.name, fieldName)}"/>
+ </c:otherwise>
+ </c:choose>
+ </c:when>
+ <c:when test="${ext.getFieldType(fieldName).type == 'NUMERIC'}">
+ <c:choose>
+ <c:when test="${ext.getFieldType(fieldName).hasPattern()}">
+ ${fieldName}: <fmt:formatNumber value="${wikitty.getFieldAsBigDecimal(ext.name, fieldName)}"
+ pattern="${ext.getFieldType(fieldName).getPattern()}"/>
+ </c:when>
+ <c:otherwise>
+ ${fieldName}: ${wikitty.getFieldAsBigDecimal(ext.name, fieldName)}
+ </c:otherwise>
+ </c:choose>
+ </c:when>
+ <c:when test="${ext.getFieldType(fieldName).type == 'STRING'}">
+ ${fieldName}: <c:out value="${wikitty.getFieldAsString(ext.name, fieldName)}"/>
+ </c:when>
+ <c:when test="${ext.getFieldType(fieldName).type == 'WIKITTY'}">
+ <c:if test="${wikitty.getFieldAsWikitty(ext.name, fieldName, false) != null}">
+ ${fieldName}: <a href="<c:url value="/wikitty/view/${wikitty.getFieldAsWikitty(ext.name, fieldName, false).getId()}"/>"><c:out value="${wikitty.getFieldAsWikitty(ext.name, fieldName, false)}"/></a>
+ </c:if>
+ </c:when>
+ <c:otherwise>
+ ${fieldName}: ${wikitty.getFieldAsObject(ext.name, fieldName)} (${ext.getFieldType(fieldName).toDefinition("")})
+ </c:otherwise>
+</c:choose>
\ No newline at end of file
Added: trunk/chorem-webmotion/src/main/webapp/WEB-INF/web.xml
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/WEB-INF/web.xml (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/WEB-INF/web.xml 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,5 @@
+<web-app version="3.0"
+ xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
+ http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" />
Added: trunk/chorem-webmotion/src/main/webapp/WEB-INF/wikitty.tld
===================================================================
(Binary files differ)
Property changes on: trunk/chorem-webmotion/src/main/webapp/WEB-INF/wikitty.tld
___________________________________________________________________
Added: svn:mime-type
+ application/xml
Added: trunk/chorem-webmotion/src/main/webapp/css/bootstrap-responsive.min.css
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/css/bootstrap-responsive.min.css (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/css/bootstrap-responsive.min.css 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,4 @@
+.clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";}
+.clearfix:after{clear:both;}
+.hidden{display:none;visibility:hidden;}
+@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:18px;} input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} .input-prepend input[class*="span"],.input-append input[class*="span"]{width:auto;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .modal{position:absolute;top:10px;left:10px;right:10px;width:auto;margin:0;}.modal.fade.in{top:auto;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (max-width:767px){.container{width:auto;padding:0 20px;} .row-fluid{width:100%;} .row{margin-left:0;} .row>[class*="span"],.row-fluid>[class*="span"]{float:none;display:block;width:auto;margin:0;}}@media (min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:20px;} .span1{width:42px;} .span2{width:104px;} .span3{width:166px;} .span4{width:228px;} .span5{width:290px;} .span6{width:352px;} .span7{width:414px;} .span8{width:476px;} .span9{width:538px;} .span10{width:600px;} .span11{width:662px;} .span12,.container{width:724px;} .offset1{margin-left:82px;} .offset2{margin-left:144px;} .offset3{margin-left:206px;} .offset4{margin-left:268px;} .offset5{margin-left:330px;} .offset6{margin-left:392px;} .offset7{margin-left:454px;} .offset8{margin-left:516px;} .offset9{margin-left:578px;} .offset10{margin-left:640px;} .offset11{margin-left:702px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.762430939%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid>.span1{width:5.801104972%;} .row-fluid>.span2{width:14.364640883%;} .row-fluid>.span3{width:22.928176794%;} .row-fluid>.span4{width:31.491712705%;} .row-fluid>.span5{width:40.055248616%;} .row-fluid>.span6{width:48.618784527%;} .row-fluid>.span7{width:57.182320438000005%;} .row-fluid>.span8{width:65.74585634900001%;} .row-fluid>.span9{width:74.30939226%;} .row-fluid>.span10{width:82.87292817100001%;} .row-fluid>.span11{width:91.436464082%;} .row-fluid>.span12{width:99.999999993%;} input.span1,textarea.span1,.uneditable-input.span1{width:32px;} input.span2,textarea.span2,.uneditable-input.span2{width:94px;} input.span3,textarea.span3,.uneditable-input.span3{width:156px;} input.span4,textarea.span4,.uneditable-input.span4{width:218px;} input.span5,textarea.span5,.uneditable-input.span5{width:280px;} input.span6,textarea.span6,.uneditable-input.span6{width:342px;} input.span7,textarea.span7,.uneditable-input.span7{width:404px;} input.span8,textarea.span8,.uneditable-input.span8{width:466px;} input.span9,textarea.span9,.uneditable-input.span9{width:528px;} input.span10,textarea.span10,.uneditable-input.span10{width:590px;} input.span11,textarea.span11,.uneditable-input.span11{width:652px;} input.span12,textarea.span12,.uneditable-input.span12{width:714px;}}@media (max-width:979px){body{padding-top:0;} .navbar-fixed-top{position:static;margin-bottom:18px;} .navbar-fixed-top .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .navbar .nav-collapse{clear:left;} .navbar .nav{float:none;margin:0 0 9px;} .navbar .nav>li{float:none;} .navbar .nav>li>a{margin-bottom:2px;} .navbar .nav>.divider-vertical{display:none;} .navbar .nav .nav-header{color:#999999;text-shadow:none;} .navbar .nav>li>a,.navbar .dropdown-menu a{padding:6px 15px;font-weight:bold;color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .navbar .dropdown-menu li+li a{margin-bottom:2px;} .navbar .nav>li>a:hover,.navbar .dropdown-menu a:hover{background-color:#222222;} .navbar .dropdown-menu{position:static;top:auto;left:auto;float:none;display:block;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .navbar .dropdown-menu:before,.navbar .dropdown-menu:after{display:none;} .navbar .dropdown-menu .divider{display:none;} .navbar-form,.navbar-search{float:none;padding:9px 15px;margin:9px 0;border-top:1px solid #222222;border-bottom:1px solid #222222;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);} .navbar .nav.pull-right{float:none;margin-left:0;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;} .btn-navbar{display:block;} .nav-collapse{overflow:hidden;height:0;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:30px;} .span1{width:70px;} .span2{width:170px;} .span3{width:270px;} .span4{width:370px;} .span5{width:470px;} .span6{width:570px;} .span7{width:670px;} .span8{width:770px;} .span9{width:870px;} .span10{width:970px;} .span11{width:1070px;} .span12,.container{width:1170px;} .offset1{margin-left:130px;} .offset2{margin-left:230px;} .offset3{margin-left:330px;} .offset4{margin-left:430px;} .offset5{margin-left:530px;} .offset6{margin-left:630px;} .offset7{margin-left:730px;} .offset8{margin-left:830px;} .offset9{margin-left:930px;} .offset10{margin-left:1030px;} .offset11{margin-left:1130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.564102564%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid>.span1{width:5.982905983%;} .row-fluid>.span2{width:14.529914530000001%;} .row-fluid>.span3{width:23.076923077%;} .row-fluid>.span4{width:31.623931624%;} .row-fluid>.span5{width:40.170940171000005%;} .row-fluid>.span6{width:48.717948718%;} .row-fluid>.span7{width:57.264957265%;} .row-fluid>.span8{width:65.81196581200001%;} .row-fluid>.span9{width:74.358974359%;} .row-fluid>.span10{width:82.905982906%;} .row-fluid>.span11{width:91.45299145300001%;} .row-fluid>.span12{width:100%;} input.span1,textarea.span1,.uneditable-input.span1{width:60px;} input.span2,textarea.span2,.uneditable-input.span2{width:160px;} input.span3,textarea.span3,.uneditable-input.span3{width:260px;} input.span4,textarea.span4,.uneditable-input.span4{width:360px;} input.span5,textarea.span5,.uneditable-input.span5{width:460px;} input.span6,textarea.span6,.uneditable-input.span6{width:560px;} input.span7,textarea.span7,.uneditable-input.span7{width:660px;} input.span8,textarea.span8,.uneditable-input.span8{width:760px;} input.span9,textarea.span9,.uneditable-input.span9{width:860px;} input.span10,textarea.span10,.uneditable-input.span10{width:960px;} input.span11,textarea.span11,.uneditable-input.span11{width:1060px;} input.span12,textarea.span12,.uneditable-input.span12{width:1160px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;}}
Added: trunk/chorem-webmotion/src/main/webapp/css/bootstrap.min.css
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/css/bootstrap.min.css (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/css/bootstrap.min.css 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,632 @@
+article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;}
+audio,canvas,video{display:inline-block;*display:inline;*zoom:1;}
+audio:not([controls]){display:none;}
+html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}
+a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
+a:hover,a:active{outline:0;}
+sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;}
+sup{top:-0.5em;}
+sub{bottom:-0.25em;}
+img{max-width:100%;height:auto;border:0;-ms-interpolation-mode:bicubic;}
+button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;}
+button,input{*overflow:visible;line-height:normal;}
+button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;}
+button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;}
+input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;}
+input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;}
+textarea{overflow:auto;vertical-align:top;}
+.clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";}
+.clearfix:after{clear:both;}
+body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;}
+a{color:#0088cc;text-decoration:none;}
+a:hover{color:#005580;text-decoration:underline;}
+.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";}
+.row:after{clear:both;}
+[class*="span"]{float:left;margin-left:20px;}
+.span1{width:60px;}
+.span2{width:140px;}
+.span3{width:220px;}
+.span4{width:300px;}
+.span5{width:380px;}
+.span6{width:460px;}
+.span7{width:540px;}
+.span8{width:620px;}
+.span9{width:700px;}
+.span10{width:780px;}
+.span11{width:860px;}
+.span12,.container{width:940px;}
+.offset1{margin-left:100px;}
+.offset2{margin-left:180px;}
+.offset3{margin-left:260px;}
+.offset4{margin-left:340px;}
+.offset5{margin-left:420px;}
+.offset6{margin-left:500px;}
+.offset7{margin-left:580px;}
+.offset8{margin-left:660px;}
+.offset9{margin-left:740px;}
+.offset10{margin-left:820px;}
+.offset11{margin-left:900px;}
+.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";}
+.row-fluid:after{clear:both;}
+.row-fluid>[class*="span"]{float:left;margin-left:2.127659574%;}
+.row-fluid>[class*="span"]:first-child{margin-left:0;}
+.row-fluid>.span1{width:6.382978723%;}
+.row-fluid>.span2{width:14.89361702%;}
+.row-fluid>.span3{width:23.404255317%;}
+.row-fluid>.span4{width:31.914893614%;}
+.row-fluid>.span5{width:40.425531911%;}
+.row-fluid>.span6{width:48.93617020799999%;}
+.row-fluid>.span7{width:57.446808505%;}
+.row-fluid>.span8{width:65.95744680199999%;}
+.row-fluid>.span9{width:74.468085099%;}
+.row-fluid>.span10{width:82.97872339599999%;}
+.row-fluid>.span11{width:91.489361693%;}
+.row-fluid>.span12{width:99.99999998999999%;}
+.container{width:940px;margin-left:auto;margin-right:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";}
+.container:after{clear:both;}
+.container-fluid{padding-left:20px;padding-right:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";}
+.container-fluid:after{clear:both;}
+p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;}p small{font-size:11px;color:#999999;}
+.lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;}
+h1,h2,h3,h4,h5,h6{margin:0;font-weight:bold;color:#333333;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;}
+h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;}
+h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;}
+h3{line-height:27px;font-size:18px;}h3 small{font-size:14px;}
+h4,h5,h6{line-height:18px;}
+h4{font-size:14px;}h4 small{font-size:12px;}
+h5{font-size:12px;}
+h6{font-size:11px;color:#999999;text-transform:uppercase;}
+.page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eeeeee;}
+.page-header h1{line-height:1;}
+ul,ol{padding:0;margin:0 0 9px 25px;}
+ul ul,ul ol,ol ol,ol ul{margin-bottom:0;}
+ul{list-style:disc;}
+ol{list-style:decimal;}
+li{line-height:18px;}
+ul.unstyled,ol.unstyled{margin-left:0;list-style:none;}
+dl{margin-bottom:18px;}
+dt,dd{line-height:18px;}
+dt{font-weight:bold;}
+dd{margin-left:9px;}
+hr{margin:18px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;}
+strong{font-weight:bold;}
+em{font-style:italic;}
+.muted{color:#999999;}
+abbr{font-size:90%;text-transform:uppercase;border-bottom:1px dotted #ddd;cursor:help;}
+blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;}
+blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:'\2014 \00A0';}
+blockquote.pull-right{float:right;padding-left:0;padding-right:15px;border-left:0;border-right:5px solid #eeeeee;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;}
+q:before,q:after,blockquote:before,blockquote:after{content:"";}
+address{display:block;margin-bottom:18px;line-height:18px;font-style:normal;}
+small{font-size:100%;}
+cite{font-style:normal;}
+code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
+code{padding:3px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;}
+pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;line-height:18px;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;white-space:pre;white-space:pre-wrap;word-break:break-all;word-wrap:break-word;}pre.prettyprint{margin-bottom:18px;}
+pre code{padding:0;color:inherit;background-color:transparent;border:0;}
+.pre-scrollable{max-height:340px;overflow-y:scroll;}
+form{margin:0 0 18px;}
+fieldset{padding:0;margin:0;border:0;}
+legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #eee;}legend small{font-size:13.5px;color:#999999;}
+label,input,button,select,textarea{font-size:13px;font-weight:normal;line-height:18px;}
+input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;}
+label{display:block;margin-bottom:5px;color:#333333;}
+input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
+.uneditable-textarea{width:auto;height:auto;}
+label input,label textarea,label select{display:block;}
+input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;cursor:pointer;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border:0 \9;}
+input[type="image"]{border:0;}
+input[type="file"]{width:auto;padding:initial;line-height:initial;border:initial;background-color:#ffffff;background-color:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
+input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto;}
+select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;}
+input[type="file"]{line-height:18px \9;}
+select{width:220px;background-color:#ffffff;}
+select[multiple],select[size]{height:auto;}
+input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
+textarea{height:auto;}
+input[type="hidden"]{display:none;}
+.radio,.checkbox{padding-left:18px;}
+.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;}
+.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;}
+.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;}
+.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;}
+input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;}
+input:focus,textarea:focus{border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);outline:0;outline:thin dotted \9;}
+input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
+.input-mini{width:60px;}
+.input-small{width:90px;}
+.input-medium{width:150px;}
+.input-large{width:210px;}
+.input-xlarge{width:270px;}
+.input-xxlarge{width:530px;}
+input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{float:none;margin-left:0;}
+input.span1,textarea.span1,.uneditable-input.span1{width:50px;}
+input.span2,textarea.span2,.uneditable-input.span2{width:130px;}
+input.span3,textarea.span3,.uneditable-input.span3{width:210px;}
+input.span4,textarea.span4,.uneditable-input.span4{width:290px;}
+input.span5,textarea.span5,.uneditable-input.span5{width:370px;}
+input.span6,textarea.span6,.uneditable-input.span6{width:450px;}
+input.span7,textarea.span7,.uneditable-input.span7{width:530px;}
+input.span8,textarea.span8,.uneditable-input.span8{width:610px;}
+input.span9,textarea.span9,.uneditable-input.span9{width:690px;}
+input.span10,textarea.span10,.uneditable-input.span10{width:770px;}
+input.span11,textarea.span11,.uneditable-input.span11{width:850px;}
+input.span12,textarea.span12,.uneditable-input.span12{width:930px;}
+input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;}
+.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;}
+.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e;}
+.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;}
+.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;}
+.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392;}
+.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;}
+.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;}
+.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b;}
+.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;}
+input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;}
+.form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#f5f5f5;border-top:1px solid #ddd;}
+.uneditable-input{display:block;background-color:#ffffff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;}
+:-moz-placeholder{color:#999999;}
+::-webkit-input-placeholder{color:#999999;}
+.help-block{display:block;margin-top:5px;margin-bottom:0;color:#999999;}
+.help-inline{display:inline-block;*display:inline;*zoom:1;margin-bottom:9px;vertical-align:middle;padding-left:5px;}
+.input-prepend,.input-append{margin-bottom:5px;*zoom:1;}.input-prepend:before,.input-append:before,.input-prepend:after,.input-append:after{display:table;content:"";}
+.input-prepend:after,.input-append:after{clear:both;}
+.input-prepend input,.input-append input,.input-prepend .uneditable-input,.input-append .uneditable-input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{position:relative;z-index:2;}
+.input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;}
+.input-prepend .add-on,.input-append .add-on{float:left;display:block;width:auto;min-width:16px;height:18px;margin-right:-1px;padding:4px 5px;font-weight:normal;line-height:18px;color:#999999;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#f5f5f5;border:1px solid #ccc;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
+.input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546;}
+.input-prepend .add-on{*margin-top:1px;}
+.input-append input,.input-append .uneditable-input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
+.input-append .uneditable-input{border-left-color:#eee;border-right-color:#ccc;}
+.input-append .add-on{margin-right:0;margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
+.input-append input:first-child{*margin-left:-160px;}.input-append input:first-child+.add-on{*margin-left:-21px;}
+.search-query{padding-left:14px;padding-right:14px;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px;}
+.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input{display:inline-block;margin-bottom:0;}
+.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;}
+.form-search label,.form-inline label,.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{display:inline-block;}
+.form-search .input-append .add-on,.form-inline .input-prepend .add-on,.form-search .input-append .add-on,.form-inline .input-prepend .add-on{vertical-align:middle;}
+.form-search .radio,.form-inline .radio,.form-search .checkbox,.form-inline .checkbox{margin-bottom:0;vertical-align:middle;}
+.control-group{margin-bottom:9px;}
+legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;}
+.form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";}
+.form-horizontal .control-group:after{clear:both;}
+.form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right;}
+.form-horizontal .controls{margin-left:160px;}
+.form-horizontal .form-actions{padding-left:160px;}
+table{max-width:100%;border-collapse:collapse;border-spacing:0;}
+.table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;vertical-align:top;border-top:1px solid #ddd;}
+.table th{font-weight:bold;}
+.table thead th{vertical-align:bottom;}
+.table thead:first-child tr th,.table thead:first-child tr td{border-top:0;}
+.table tbody+tbody{border-top:2px solid #ddd;}
+.table-condensed th,.table-condensed td{padding:4px 5px;}
+.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapsed;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th+th,.table-bordered td+td,.table-bordered th+td,.table-bordered td+th{border-left:1px solid #ddd;}
+.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;}
+.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;}
+.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;}
+.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;}
+.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;}
+.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;}
+.table tbody tr:hover td,.table tbody tr:hover th{background-color:#f5f5f5;}
+table .span1{float:none;width:44px;margin-left:0;}
+table .span2{float:none;width:124px;margin-left:0;}
+table .span3{float:none;width:204px;margin-left:0;}
+table .span4{float:none;width:284px;margin-left:0;}
+table .span5{float:none;width:364px;margin-left:0;}
+table .span6{float:none;width:444px;margin-left:0;}
+table .span7{float:none;width:524px;margin-left:0;}
+table .span8{float:none;width:604px;margin-left:0;}
+table .span9{float:none;width:684px;margin-left:0;}
+table .span10{float:none;width:764px;margin-left:0;}
+table .span11{float:none;width:844px;margin-left:0;}
+table .span12{float:none;width:924px;margin-left:0;}
+[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat;*margin-right:.3em;}[class^="icon-"]:last-child,[class*=" icon-"]:last-child{*margin-left:0;}
+.icon-white{background-image:url("../img/glyphicons-halflings-white.png");}
+.icon-glass{background-position:0 0;}
+.icon-music{background-position:-24px 0;}
+.icon-search{background-position:-48px 0;}
+.icon-envelope{background-position:-72px 0;}
+.icon-heart{background-position:-96px 0;}
+.icon-star{background-position:-120px 0;}
+.icon-star-empty{background-position:-144px 0;}
+.icon-user{background-position:-168px 0;}
+.icon-film{background-position:-192px 0;}
+.icon-th-large{background-position:-216px 0;}
+.icon-th{background-position:-240px 0;}
+.icon-th-list{background-position:-264px 0;}
+.icon-ok{background-position:-288px 0;}
+.icon-remove{background-position:-312px 0;}
+.icon-zoom-in{background-position:-336px 0;}
+.icon-zoom-out{background-position:-360px 0;}
+.icon-off{background-position:-384px 0;}
+.icon-signal{background-position:-408px 0;}
+.icon-cog{background-position:-432px 0;}
+.icon-trash{background-position:-456px 0;}
+.icon-home{background-position:0 -24px;}
+.icon-file{background-position:-24px -24px;}
+.icon-time{background-position:-48px -24px;}
+.icon-road{background-position:-72px -24px;}
+.icon-download-alt{background-position:-96px -24px;}
+.icon-download{background-position:-120px -24px;}
+.icon-upload{background-position:-144px -24px;}
+.icon-inbox{background-position:-168px -24px;}
+.icon-play-circle{background-position:-192px -24px;}
+.icon-repeat{background-position:-216px -24px;}
+.icon-refresh{background-position:-240px -24px;}
+.icon-list-alt{background-position:-264px -24px;}
+.icon-lock{background-position:-287px -24px;}
+.icon-flag{background-position:-312px -24px;}
+.icon-headphones{background-position:-336px -24px;}
+.icon-volume-off{background-position:-360px -24px;}
+.icon-volume-down{background-position:-384px -24px;}
+.icon-volume-up{background-position:-408px -24px;}
+.icon-qrcode{background-position:-432px -24px;}
+.icon-barcode{background-position:-456px -24px;}
+.icon-tag{background-position:0 -48px;}
+.icon-tags{background-position:-25px -48px;}
+.icon-book{background-position:-48px -48px;}
+.icon-bookmark{background-position:-72px -48px;}
+.icon-print{background-position:-96px -48px;}
+.icon-camera{background-position:-120px -48px;}
+.icon-font{background-position:-144px -48px;}
+.icon-bold{background-position:-167px -48px;}
+.icon-italic{background-position:-192px -48px;}
+.icon-text-height{background-position:-216px -48px;}
+.icon-text-width{background-position:-240px -48px;}
+.icon-align-left{background-position:-264px -48px;}
+.icon-align-center{background-position:-288px -48px;}
+.icon-align-right{background-position:-312px -48px;}
+.icon-align-justify{background-position:-336px -48px;}
+.icon-list{background-position:-360px -48px;}
+.icon-indent-left{background-position:-384px -48px;}
+.icon-indent-right{background-position:-408px -48px;}
+.icon-facetime-video{background-position:-432px -48px;}
+.icon-picture{background-position:-456px -48px;}
+.icon-pencil{background-position:0 -72px;}
+.icon-map-marker{background-position:-24px -72px;}
+.icon-adjust{background-position:-48px -72px;}
+.icon-tint{background-position:-72px -72px;}
+.icon-edit{background-position:-96px -72px;}
+.icon-share{background-position:-120px -72px;}
+.icon-check{background-position:-144px -72px;}
+.icon-move{background-position:-168px -72px;}
+.icon-step-backward{background-position:-192px -72px;}
+.icon-fast-backward{background-position:-216px -72px;}
+.icon-backward{background-position:-240px -72px;}
+.icon-play{background-position:-264px -72px;}
+.icon-pause{background-position:-288px -72px;}
+.icon-stop{background-position:-312px -72px;}
+.icon-forward{background-position:-336px -72px;}
+.icon-fast-forward{background-position:-360px -72px;}
+.icon-step-forward{background-position:-384px -72px;}
+.icon-eject{background-position:-408px -72px;}
+.icon-chevron-left{background-position:-432px -72px;}
+.icon-chevron-right{background-position:-456px -72px;}
+.icon-plus-sign{background-position:0 -96px;}
+.icon-minus-sign{background-position:-24px -96px;}
+.icon-remove-sign{background-position:-48px -96px;}
+.icon-ok-sign{background-position:-72px -96px;}
+.icon-question-sign{background-position:-96px -96px;}
+.icon-info-sign{background-position:-120px -96px;}
+.icon-screenshot{background-position:-144px -96px;}
+.icon-remove-circle{background-position:-168px -96px;}
+.icon-ok-circle{background-position:-192px -96px;}
+.icon-ban-circle{background-position:-216px -96px;}
+.icon-arrow-left{background-position:-240px -96px;}
+.icon-arrow-right{background-position:-264px -96px;}
+.icon-arrow-up{background-position:-289px -96px;}
+.icon-arrow-down{background-position:-312px -96px;}
+.icon-share-alt{background-position:-336px -96px;}
+.icon-resize-full{background-position:-360px -96px;}
+.icon-resize-small{background-position:-384px -96px;}
+.icon-plus{background-position:-408px -96px;}
+.icon-minus{background-position:-433px -96px;}
+.icon-asterisk{background-position:-456px -96px;}
+.icon-exclamation-sign{background-position:0 -120px;}
+.icon-gift{background-position:-24px -120px;}
+.icon-leaf{background-position:-48px -120px;}
+.icon-fire{background-position:-72px -120px;}
+.icon-eye-open{background-position:-96px -120px;}
+.icon-eye-close{background-position:-120px -120px;}
+.icon-warning-sign{background-position:-144px -120px;}
+.icon-plane{background-position:-168px -120px;}
+.icon-calendar{background-position:-192px -120px;}
+.icon-random{background-position:-216px -120px;}
+.icon-comment{background-position:-240px -120px;}
+.icon-magnet{background-position:-264px -120px;}
+.icon-chevron-up{background-position:-288px -120px;}
+.icon-chevron-down{background-position:-313px -119px;}
+.icon-retweet{background-position:-336px -120px;}
+.icon-shopping-cart{background-position:-360px -120px;}
+.icon-folder-close{background-position:-384px -120px;}
+.icon-folder-open{background-position:-408px -120px;}
+.icon-resize-vertical{background-position:-432px -119px;}
+.icon-resize-horizontal{background-position:-456px -118px;}
+.dropdown{position:relative;}
+.dropdown-toggle{*margin-bottom:-3px;}
+.dropdown-toggle:active,.open .dropdown-toggle{outline:0;}
+.caret{display:inline-block;width:0;height:0;text-indent:-99999px;*text-indent:0;vertical-align:top;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000000;opacity:0.3;filter:alpha(opacity=30);content:"\2193";}
+.dropdown .caret{margin-top:8px;margin-left:2px;}
+.dropdown:hover .caret,.open.dropdown .caret{opacity:1;filter:alpha(opacity=100);}
+.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;_width:160px;padding:4px 0;margin:0;list-style:none;background-color:#ffffff;border-color:#ccc;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:1px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;}.dropdown-menu.bottom-up{top:auto;bottom:100%;margin-bottom:2px;}
+.dropdown-menu .divider{height:1px;margin:5px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;*width:100%;*margin:-5px 0 5px;}
+.dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#555555;white-space:nowrap;}
+.dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;background-color:#0088cc;}
+.dropdown.open{*z-index:1000;}.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);}
+.dropdown.open .dropdown-menu{display:block;}
+.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
+.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);}
+.fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;}
+.collapse{-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-ms-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;position:relative;overflow:hidden;height:0;}.collapse.in{height:auto;}
+.close{float:right;font-size:20px;font-weight:bold;line-height:18px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;opacity:0.4;filter:alpha(opacity=40);cursor:pointer;}
+.btn{display:inline-block;padding:4px 10px 4px;margin-bottom:0;font-size:13px;line-height:18px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);vertical-align:middle;background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-ms-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);background-image:-o-linear-gradient(top, #ffffff, #e6e6e6);background-image:linear-gradient(top, #ffffff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);cursor:pointer;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);*margin-left:.3em;}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{background-color:#e6e6e6;}
+.btn:active,.btn.active{background-color:#cccccc \9;}
+.btn:first-child{*margin-left:0;}
+.btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-ms-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;}
+.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
+.btn.active,.btn:active{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);background-color:#e6e6e6;background-color:#d9d9d9 \9;outline:0;}
+.btn.disabled,.btn[disabled]{cursor:default;background-image:none;background-color:#e6e6e6;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
+.btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
+.btn-large [class^="icon-"]{margin-top:1px;}
+.btn-small{padding:5px 9px;font-size:11px;line-height:16px;}
+.btn-small [class^="icon-"]{margin-top:-1px;}
+.btn-mini{padding:2px 6px;font-size:11px;line-height:14px;}
+.btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover,.btn-inverse,.btn-inverse:hover{text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);color:#ffffff;}
+.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-dark.active{color:rgba(255, 255, 255, 0.75);}
+.btn-primary{background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-ms-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(top, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#0044cc;}
+.btn-primary:active,.btn-primary.active{background-color:#003399 \9;}
+.btn-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;}
+.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;}
+.btn-danger{background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-ms-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(top, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;}
+.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;}
+.btn-success{background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-ms-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(top, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;}
+.btn-success:active,.btn-success.active{background-color:#408140 \9;}
+.btn-info{background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-ms-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(top, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;}
+.btn-info:active,.btn-info.active{background-color:#24748c \9;}
+.btn-inverse{background-color:#393939;background-image:-moz-linear-gradient(top, #454545, #262626);background-image:-ms-linear-gradient(top, #454545, #262626);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#454545), to(#262626));background-image:-webkit-linear-gradient(top, #454545, #262626);background-image:-o-linear-gradient(top, #454545, #262626);background-image:linear-gradient(top, #454545, #262626);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#454545', endColorstr='#262626', GradientType=0);border-color:#262626 #262626 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{background-color:#262626;}
+.btn-inverse:active,.btn-inverse.active{background-color:#0c0c0c \9;}
+button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;}
+button.btn.large,input[type="submit"].btn.large{*padding-top:7px;*padding-bottom:7px;}
+button.btn.small,input[type="submit"].btn.small{*padding-top:3px;*padding-bottom:3px;}
+.btn-group{position:relative;*zoom:1;*margin-left:.3em;}.btn-group:before,.btn-group:after{display:table;content:"";}
+.btn-group:after{clear:both;}
+.btn-group:first-child{*margin-left:0;}
+.btn-group+.btn-group{margin-left:5px;}
+.btn-toolbar{margin-top:9px;margin-bottom:9px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;}
+.btn-group .btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
+.btn-group .btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
+.btn-group .btn:last-child,.btn-group .dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;}
+.btn-group .btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;}
+.btn-group .btn.large:last-child,.btn-group .large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;}
+.btn-group .btn:hover,.btn-group .btn:focus,.btn-group .btn:active,.btn-group .btn.active{z-index:2;}
+.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;}
+.btn-group .dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);*padding-top:5px;*padding-bottom:5px;}
+.btn-group.open{*z-index:1000;}.btn-group.open .dropdown-menu{display:block;margin-top:1px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
+.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);}
+.btn .caret{margin-top:7px;margin-left:0;}
+.btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100);}
+.btn-primary .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#ffffff;opacity:0.75;filter:alpha(opacity=75);}
+.btn-small .caret{margin-top:4px;}
+.alert{padding:8px 35px 8px 14px;margin-bottom:18px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
+.alert,.alert-heading{color:#c09853;}
+.alert .close{position:relative;top:-2px;right:-21px;line-height:18px;}
+.alert-success{background-color:#dff0d8;border-color:#d6e9c6;}
+.alert-success,.alert-success .alert-heading{color:#468847;}
+.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;}
+.alert-danger,.alert-error,.alert-danger .alert-heading,.alert-error .alert-heading{color:#b94a48;}
+.alert-info{background-color:#d9edf7;border-color:#bce8f1;}
+.alert-info,.alert-info .alert-heading{color:#3a87ad;}
+.alert-block{padding-top:14px;padding-bottom:14px;}
+.alert-block>p,.alert-block>ul{margin-bottom:0;}
+.alert-block p+p{margin-top:5px;}
+.nav{margin-left:0;margin-bottom:18px;list-style:none;}
+.nav>li>a{display:block;}
+.nav>li>a:hover{text-decoration:none;background-color:#eeeeee;}
+.nav .nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:18px;color:#999999;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase;}
+.nav li+.nav-header{margin-top:9px;}
+.nav-list{padding-left:14px;padding-right:14px;margin-bottom:0;}
+.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}
+.nav-list>li>a{padding:3px 15px;}
+.nav-list .active>a,.nav-list .active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;}
+.nav-list [class^="icon-"]{margin-right:2px;}
+.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";}
+.nav-tabs:after,.nav-pills:after{clear:both;}
+.nav-tabs>li,.nav-pills>li{float:left;}
+.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;}
+.nav-tabs{border-bottom:1px solid #ddd;}
+.nav-tabs>li{margin-bottom:-1px;}
+.nav-tabs>li>a{padding-top:9px;padding-bottom:9px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;}
+.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;}
+.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
+.nav-pills .active>a,.nav-pills .active>a:hover{color:#ffffff;background-color:#0088cc;}
+.nav-stacked>li{float:none;}
+.nav-stacked>li>a{margin-right:0;}
+.nav-tabs.nav-stacked{border-bottom:0;}
+.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
+.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}
+.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}
+.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;}
+.nav-pills.nav-stacked>li>a{margin-bottom:3px;}
+.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;}
+.nav-tabs .dropdown-menu,.nav-pills .dropdown-menu{margin-top:1px;border-width:1px;}
+.nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
+.nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{border-top-color:#0088cc;margin-top:6px;}
+.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;}
+.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;}
+.nav>.dropdown.active>a:hover{color:#000000;cursor:pointer;}
+.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;}
+.nav .open .caret,.nav .open.active .caret,.nav .open a:hover .caret{border-top-color:#ffffff;opacity:1;filter:alpha(opacity=100);}
+.tabs-stacked .open>a:hover{border-color:#999999;}
+.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";}
+.tabbable:after{clear:both;}
+.tab-content{overflow:hidden;}
+.tabs-below .nav-tabs,.tabs-right .nav-tabs,.tabs-left .nav-tabs{border-bottom:0;}
+.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;}
+.tab-content>.active,.pill-content>.active{display:block;}
+.tabs-below .nav-tabs{border-top:1px solid #ddd;}
+.tabs-below .nav-tabs>li{margin-top:-1px;margin-bottom:0;}
+.tabs-below .nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below .nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;}
+.tabs-below .nav-tabs .active>a,.tabs-below .nav-tabs .active>a:hover{border-color:transparent #ddd #ddd #ddd;}
+.tabs-left .nav-tabs>li,.tabs-right .nav-tabs>li{float:none;}
+.tabs-left .nav-tabs>li>a,.tabs-right .nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;}
+.tabs-left .nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;}
+.tabs-left .nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}
+.tabs-left .nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;}
+.tabs-left .nav-tabs .active>a,.tabs-left .nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;}
+.tabs-right .nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;}
+.tabs-right .nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
+.tabs-right .nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;}
+.tabs-right .nav-tabs .active>a,.tabs-right .nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;}
+.navbar{overflow:visible;margin-bottom:18px;}
+.navbar-inner{padding-left:20px;padding-right:20px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);}
+.btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);}.btn-navbar:hover,.btn-navbar:active,.btn-navbar.active,.btn-navbar.disabled,.btn-navbar[disabled]{background-color:#222222;}
+.btn-navbar:active,.btn-navbar.active{background-color:#080808 \9;}
+.btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);}
+.btn-navbar .icon-bar+.icon-bar{margin-top:3px;}
+.nav-collapse.collapse{height:auto;}
+.navbar .brand:hover{text-decoration:none;}
+.navbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#ffffff;}
+.navbar .navbar-text{margin-bottom:0;line-height:40px;color:#999999;}.navbar .navbar-text a:hover{color:#ffffff;background-color:transparent;}
+.navbar .btn,.navbar .btn-group{margin-top:5px;}
+.navbar .btn-group .btn{margin-top:0;}
+.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";}
+.navbar-form:after{clear:both;}
+.navbar-form input,.navbar-form select{display:inline-block;margin-top:5px;margin-bottom:0;}
+.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;}
+.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;}
+.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap;}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0;}
+.navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0;}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#ffffff;color:rgba(255, 255, 255, 0.75);background:#666;background:rgba(255, 255, 255, 0.3);border:1px solid #111;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.navbar-search .search-query :-moz-placeholder{color:#eeeeee;}
+.navbar-search .search-query::-webkit-input-placeholder{color:#eeeeee;}
+.navbar-search .search-query:hover{color:#ffffff;background-color:#999999;background-color:rgba(255, 255, 255, 0.5);}
+.navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;}
+.navbar-fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030;}
+.navbar-fixed-top .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
+.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;}
+.navbar .nav.pull-right{float:right;}
+.navbar .nav>li{display:block;float:left;}
+.navbar .nav>li>a{float:none;padding:10px 10px 11px;line-height:19px;color:#999999;text-decoration:none;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}
+.navbar .nav>li>a:hover{background-color:transparent;color:#ffffff;text-decoration:none;}
+.navbar .nav .active>a,.navbar .nav .active>a:hover{color:#ffffff;text-decoration:none;background-color:#222222;}
+.navbar .divider-vertical{height:40px;width:1px;margin:0 9px;overflow:hidden;background-color:#222222;border-right:1px solid #333333;}
+.navbar .nav.pull-right{margin-left:10px;margin-right:0;}
+.navbar .dropdown-menu{margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.navbar .dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;}
+.navbar .dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;}
+.navbar .nav .dropdown-toggle .caret,.navbar .nav .open.dropdown .caret{border-top-color:#ffffff;}
+.navbar .nav .active .caret{opacity:1;filter:alpha(opacity=100);}
+.navbar .nav .open>.dropdown-toggle,.navbar .nav .active>.dropdown-toggle,.navbar .nav .open.active>.dropdown-toggle{background-color:transparent;}
+.navbar .nav .active>.dropdown-toggle:hover{color:#ffffff;}
+.navbar .nav.pull-right .dropdown-menu{left:auto;right:0;}.navbar .nav.pull-right .dropdown-menu:before{left:auto;right:12px;}
+.navbar .nav.pull-right .dropdown-menu:after{left:auto;right:13px;}
+.breadcrumb{padding:7px 14px;margin:0 0 18px;background-color:#fbfbfb;background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline-block;text-shadow:0 1px 0 #ffffff;}
+.breadcrumb .divider{padding:0 5px;color:#999999;}
+.breadcrumb .active a{color:#333333;}
+.pagination{height:36px;margin:18px 0;}
+.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);}
+.pagination li{display:inline;}
+.pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0;}
+.pagination a:hover,.pagination .active a{background-color:#f5f5f5;}
+.pagination .active a{color:#999999;cursor:default;}
+.pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;}
+.pagination li:first-child a{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
+.pagination li:last-child a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
+.pagination-centered{text-align:center;}
+.pagination-right{text-align:right;}
+.pager{margin-left:0;margin-bottom:18px;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";}
+.pager:after{clear:both;}
+.pager li{display:inline;}
+.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
+.pager a:hover{text-decoration:none;background-color:#f5f5f5;}
+.pager .next a{float:right;}
+.pager .previous a{float:left;}
+.modal-open .dropdown-menu{z-index:2050;}
+.modal-open .dropdown.open{*z-index:2050;}
+.modal-open .popover{z-index:2060;}
+.modal-open .tooltip{z-index:2070;}
+.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;}
+.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);}
+.modal{position:fixed;top:50%;left:50%;z-index:1050;max-height:500px;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;}
+.modal.fade.in{top:50%;}
+.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;}
+.modal-body{padding:15px;}
+.modal-body .modal-form{margin-bottom:0;}
+.modal-footer{padding:14px 15px 15px;margin-bottom:0;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";}
+.modal-footer:after{clear:both;}
+.modal-footer .btn{float:right;margin-left:5px;margin-bottom:0;}
+.tooltip{position:absolute;z-index:1020;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);}
+.tooltip.top{margin-top:-2px;}
+.tooltip.right{margin-left:2px;}
+.tooltip.bottom{margin-top:2px;}
+.tooltip.left{margin-left:-2px;}
+.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}
+.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;}
+.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;}
+.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;}
+.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
+.tooltip-arrow{position:absolute;width:0;height:0;}
+.popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px;}.popover.top{margin-top:-5px;}
+.popover.right{margin-left:5px;}
+.popover.bottom{margin-top:5px;}
+.popover.left{margin-left:-5px;}
+.popover.top .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}
+.popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;}
+.popover.bottom .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;}
+.popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;}
+.popover .arrow{position:absolute;width:0;height:0;}
+.popover-inner{padding:3px;width:280px;overflow:hidden;background:#000000;background:rgba(0, 0, 0, 0.8);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);}
+.popover-title{padding:9px 15px;line-height:1;background-color:#f5f5f5;border-bottom:1px solid #eee;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;}
+.popover-content{padding:14px;background-color:#ffffff;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;}
+.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";}
+.thumbnails:after{clear:both;}
+.thumbnails>li{float:left;margin:0 0 18px 20px;}
+.thumbnail{display:block;padding:4px;line-height:1;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);}
+a.thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);}
+.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;}
+.thumbnail .caption{padding:9px;}
+.label{padding:2px 4px 3px;font-size:11.049999999999999px;font-weight:bold;color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
+.label:hover{color:#ffffff;text-decoration:none;}
+.label-important{background-color:#b94a48;}
+.label-important:hover{background-color:#953b39;}
+.label-warning{background-color:#f89406;}
+.label-warning:hover{background-color:#c67605;}
+.label-success{background-color:#468847;}
+.label-success:hover{background-color:#356635;}
+.label-info{background-color:#3a87ad;}
+.label-info:hover{background-color:#2d6987;}
+@-webkit-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-ms-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(top, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
+.progress .bar{width:0%;height:18px;color:#ffffff;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-ms-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(top, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-ms-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;}
+.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;}
+.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;}
+.progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);}
+.progress-danger.progress-striped .bar{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
+.progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);}
+.progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
+.progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);}
+.progress-info.progress-striped .bar{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
+.accordion{margin-bottom:18px;}
+.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
+.accordion-heading{border-bottom:0;}
+.accordion-heading .accordion-toggle{display:block;padding:8px 15px;}
+.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;}
+.carousel{position:relative;margin-bottom:18px;line-height:1;}
+.carousel-inner{overflow:hidden;width:100%;position:relative;}
+.carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-ms-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;}
+.carousel .item>img{display:block;line-height:1;}
+.carousel .active,.carousel .next,.carousel .prev{display:block;}
+.carousel .active{left:0;}
+.carousel .next,.carousel .prev{position:absolute;top:0;width:100%;}
+.carousel .next{left:100%;}
+.carousel .prev{left:-100%;}
+.carousel .next.left,.carousel .prev.right{left:0;}
+.carousel .active.left{left:-100%;}
+.carousel .active.right{left:100%;}
+.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;}
+.carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);}
+.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:10px 15px 5px;background:#333333;background:rgba(0, 0, 0, 0.75);}
+.carousel-caption h4,.carousel-caption p{color:#ffffff;}
+.hero-unit{padding:60px;margin-bottom:30px;background-color:#f5f5f5;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;}
+.hero-unit p{font-size:18px;font-weight:200;line-height:27px;}
+.pull-right{float:right;}
+.pull-left{float:left;}
+.hide{display:none;}
+.show{display:block;}
+.invisible{visibility:hidden;}
Added: trunk/chorem-webmotion/src/main/webapp/css/chorem.less
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/css/chorem.less (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/css/chorem.less 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,19 @@
+body {
+ position: relative;
+ padding-top: 60px;
+ background-color: #fff;
+}
+
+.nav > li.nav-group{
+ padding: 10px 10px 11px;
+}
+
+.nav > li.nav-group > a {
+ display: inline;
+ padding: 0px;
+}
+
+.ui-autocomplete-category {
+ color: rgba(82, 168, 236, 0.796875);
+ font-weight: bolder;
+}
Added: trunk/chorem-webmotion/src/main/webapp/css/token-input-facebook.css
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/css/token-input-facebook.css (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/css/token-input-facebook.css 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,122 @@
+/* Example tokeninput style #2: Facebook style */
+ul.token-input-list-facebook {
+ overflow: hidden;
+ height: auto !important;
+ height: 1%;
+ width: 400px;
+ border: 1px solid #8496ba;
+ cursor: text;
+ font-size: 12px;
+ font-family: Verdana;
+ min-height: 1px;
+ z-index: 999;
+ margin: 0;
+ padding: 0;
+ background-color: #fff;
+ list-style-type: none;
+ clear: left;
+}
+
+ul.token-input-list-facebook li input {
+ border: 0;
+ width: 100px;
+ padding: 3px 8px;
+ background-color: white;
+ margin: 2px 0;
+ -webkit-appearance: caret;
+}
+
+li.token-input-token-facebook {
+ overflow: hidden;
+ height: auto !important;
+ height: 15px;
+ margin: 3px;
+ padding: 1px 3px;
+ background-color: #eff2f7;
+ color: #000;
+ cursor: default;
+ border: 1px solid #ccd5e4;
+ font-size: 11px;
+ border-radius: 5px;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+ float: left;
+ white-space: nowrap;
+}
+
+li.token-input-token-facebook p {
+ display: inline;
+ padding: 0;
+ margin: 0;
+}
+
+li.token-input-token-facebook span {
+ color: #a6b3cf;
+ margin-left: 5px;
+ font-weight: bold;
+ cursor: pointer;
+}
+
+li.token-input-selected-token-facebook {
+ background-color: #5670a6;
+ border: 1px solid #3b5998;
+ color: #fff;
+}
+
+li.token-input-input-token-facebook {
+ float: left;
+ margin: 0;
+ padding: 0;
+ list-style-type: none;
+}
+
+div.token-input-dropdown-facebook {
+ position: absolute;
+ width: 400px;
+ background-color: #fff;
+ overflow: hidden;
+ border-left: 1px solid #ccc;
+ border-right: 1px solid #ccc;
+ border-bottom: 1px solid #ccc;
+ cursor: default;
+ font-size: 11px;
+ font-family: Verdana;
+ z-index: 1;
+}
+
+div.token-input-dropdown-facebook p {
+ margin: 0;
+ padding: 5px;
+ font-weight: bold;
+ color: #777;
+}
+
+div.token-input-dropdown-facebook ul {
+ margin: 0;
+ padding: 0;
+}
+
+div.token-input-dropdown-facebook ul li {
+ background-color: #fff;
+ padding: 3px;
+ margin: 0;
+ list-style-type: none;
+}
+
+div.token-input-dropdown-facebook ul li.token-input-dropdown-item-facebook {
+ background-color: #fff;
+}
+
+div.token-input-dropdown-facebook ul li.token-input-dropdown-item2-facebook {
+ background-color: #fff;
+}
+
+div.token-input-dropdown-facebook ul li em {
+ font-weight: bold;
+ font-style: normal;
+}
+
+div.token-input-dropdown-facebook ul li.token-input-selected-dropdown-item-facebook {
+ background-color: #3b5998;
+ color: #fff;
+}
\ No newline at end of file
Added: trunk/chorem-webmotion/src/main/webapp/css/token-input-mac.css
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/css/token-input-mac.css (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/css/token-input-mac.css 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,204 @@
+/* Example tokeninput style #2: Mac Style */
+fieldset.token-input-mac {
+ position: relative;
+ padding: 0;
+ margin: 5px 0;
+ background: #fff;
+ width: 400px;
+ border: 1px solid #A4BDEC;
+ border-radius: 10px;
+ -moz-border-radius: 10px;
+ -webkit-border-radius: 10px;
+}
+
+fieldset.token-input-mac.token-input-dropdown-mac {
+ border-radius: 10px 10px 0 0;
+ -moz-border-radius: 10px 10px 0 0;
+ -webkit-border-radius: 10px 10px 0 0;
+ box-shadow: 0 5px 20px 0 rgba(0,0,0,0.25);
+ -moz-box-shadow: 0 5px 20px 0 rgba(0,0,0,0.25);
+ -webkit-box-shadow: 0 5px 20px 0 rgba(0,0,0,0.25);
+}
+
+ul.token-input-list-mac {
+ overflow: hidden;
+ height: auto !important;
+ height: 1%;
+ cursor: text;
+ font-size: 12px;
+ font-family: Verdana;
+ min-height: 1px;
+ z-index: 999;
+ margin: 0;
+ padding: 3px;
+ background: transparent;
+}
+
+ul.token-input-list-mac.error {
+ border: 1px solid #C52020;
+}
+
+ul.token-input-list-mac li {
+ list-style-type: none;
+}
+
+li.token-input-token-mac p {
+ display: inline;
+ padding: 0;
+ margin: 0;
+}
+
+li.token-input-token-mac span {
+ color: #a6b3cf;
+ margin-left: 5px;
+ font-weight: bold;
+ cursor: pointer;
+}
+
+/* TOKENS */
+
+li.token-input-token-mac {
+ font-family: "Lucida Grande", Arial, serif;
+ font-size: 9pt;
+ line-height: 12pt;
+ overflow: hidden;
+ height: 16px;
+ margin: 3px;
+ padding: 0 10px;
+ background: none;
+ background-color: #dee7f8;
+ color: #000;
+ cursor: default;
+ border: 1px solid #a4bdec;
+ border-radius: 15px;
+ -moz-border-radius: 15px;
+ -webkit-border-radius: 15px;
+ float: left;
+}
+
+li.token-input-highlighted-token-mac {
+ background-color: #bbcef1;
+ border: 1px solid #598bec;
+ color: #000;
+}
+
+li.token-input-selected-token-mac {
+ background-color: #598bec;
+ border: 1px solid transparent;
+ color: #fff;
+}
+
+li.token-input-highlighted-token-mac span.token-input-delete-token-mac {
+ color: #000;
+}
+
+li.token-input-selected-token-mac span.token-input-delete-token-mac {
+ color: #fff;
+}
+
+li.token-input-input-token-mac {
+ border: none;
+ background: transparent;
+ float: left;
+ padding: 0;
+ margin: 0;
+}
+
+li.token-input-input-token-mac input {
+ border: 0;
+ width: 100px;
+ padding: 3px;
+ background-color: transparent;
+ margin: 0;
+}
+
+div.token-input-dropdown-mac {
+ position: absolute;
+ border: 1px solid #A4BDEC;
+ border-top: none;
+ left: -1px;
+ right: -1px;
+ background-color: #fff;
+ overflow: hidden;
+ cursor: default;
+ font-size: 10pt;
+ font-family: "Lucida Grande", Arial, serif;
+ padding: 5px;
+ border-radius: 0 0 10px 10px;
+ -moz-border-radius: 0 0 10px 10px;
+ -webkit-border-radius: 0 0 10px 10px;
+ box-shadow: 0 5px 20px 0 rgba(0,0,0,0.25);
+ -moz-box-shadow: 0 5px 20px 0 rgba(0,0,0,0.25);
+ -webkit-box-shadow: 0 5px 20px 0 rgba(0,0,0,0.25);
+ clip:rect(0px, 1000px, 1000px, -10px);
+}
+
+div.token-input-dropdown-mac p {
+ font-size: 8pt;
+ margin: 0;
+ padding: 0 5px;
+ font-style: italic;
+ color: #aaa;
+}
+
+div.token-input-dropdown-mac h3.token-input-dropdown-category-mac {
+ font-family: "Lucida Grande", Arial, serif;
+ font-size: 10pt;
+ font-weight: bold;
+ border: none;
+ padding: 0 5px;
+ margin: 0;
+}
+
+div.token-input-dropdown-mac ul {
+ margin: 0;
+ padding: 0;
+}
+
+div.token-input-dropdown-mac ul li {
+ list-style-type: none;
+ cursor: pointer;
+ background: none;
+ background-color: #fff;
+ margin: 0;
+ padding: 0 0 0 25px;
+}
+
+div.token-input-dropdown-mac ul li.token-input-dropdown-item-mac {
+ background-color: #fff;
+}
+
+div.token-input-dropdown-mac ul li.token-input-dropdown-item-mac.odd {
+ background-color: #ECF4F9;
+ border-radius: 15px;
+ -moz-border-radius: 15px;
+ -webkit-border-radius: 15px;
+}
+
+div.token-input-dropdown-mac ul li.token-input-dropdown-item-mac span.token-input-dropdown-item-description-mac {
+ float: right;
+ font-size: 8pt;
+ font-style: italic;
+ padding: 0 10px 0 0;
+ color: #999;
+}
+
+div.token-input-dropdown-mac ul li strong {
+ font-weight: bold;
+ text-decoration: underline;
+ font-style: none;
+}
+
+div.token-input-dropdown-mac ul li.token-input-selected-dropdown-item-mac,
+div.token-input-dropdown-mac ul li.token-input-selected-dropdown-item-mac.odd {
+ background-color: #598bec;
+ color: #fff;
+ border-radius: 15px;
+ -moz-border-radius: 15px;
+ -webkit-border-radius: 15px;
+}
+
+div.token-input-dropdown-mac ul li.token-input-selected-dropdown-item-mac span.token-input-dropdown-item-description-mac,
+div.token-input-dropdown-mac ul li.token-input-selected-dropdown-item-mac.odd span.token-input-dropdown-item-description-mac {
+ color: #fff;
+}
Added: trunk/chorem-webmotion/src/main/webapp/css/token-input.css
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/css/token-input.css (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/css/token-input.css 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,113 @@
+/* Example tokeninput style #1: Token vertical list*/
+ul.token-input-list {
+ overflow: hidden;
+ height: auto !important;
+ height: 1%;
+ width: 400px;
+ border: 1px solid #999;
+ cursor: text;
+ font-size: 12px;
+ font-family: Verdana;
+ z-index: 999;
+ margin: 0;
+ padding: 0;
+ background-color: #fff;
+ list-style-type: none;
+ clear: left;
+}
+
+ul.token-input-list li {
+ list-style-type: none;
+}
+
+ul.token-input-list li input {
+ border: 0;
+ width: 350px;
+ padding: 3px 8px;
+ background-color: white;
+ -webkit-appearance: caret;
+}
+
+li.token-input-token {
+ overflow: hidden;
+ height: auto !important;
+ height: 1%;
+ margin: 3px;
+ padding: 3px 5px;
+ background-color: #d0efa0;
+ color: #000;
+ font-weight: bold;
+ cursor: default;
+ display: block;
+}
+
+li.token-input-token p {
+ float: left;
+ padding: 0;
+ margin: 0;
+}
+
+li.token-input-token span {
+ float: right;
+ color: #777;
+ cursor: pointer;
+}
+
+li.token-input-selected-token {
+ background-color: #08844e;
+ color: #fff;
+}
+
+li.token-input-selected-token span {
+ color: #bbb;
+}
+
+div.token-input-dropdown {
+ position: absolute;
+ width: 400px;
+ background-color: #fff;
+ overflow: hidden;
+ border-left: 1px solid #ccc;
+ border-right: 1px solid #ccc;
+ border-bottom: 1px solid #ccc;
+ cursor: default;
+ font-size: 12px;
+ font-family: Verdana;
+ z-index: 1;
+}
+
+div.token-input-dropdown p {
+ margin: 0;
+ padding: 5px;
+ font-weight: bold;
+ color: #777;
+}
+
+div.token-input-dropdown ul {
+ margin: 0;
+ padding: 0;
+}
+
+div.token-input-dropdown ul li {
+ background-color: #fff;
+ padding: 3px;
+ list-style-type: none;
+}
+
+div.token-input-dropdown ul li.token-input-dropdown-item {
+ background-color: #fafafa;
+}
+
+div.token-input-dropdown ul li.token-input-dropdown-item2 {
+ background-color: #fff;
+}
+
+div.token-input-dropdown ul li em {
+ font-weight: bold;
+ font-style: normal;
+}
+
+div.token-input-dropdown ul li.token-input-selected-dropdown-item {
+ background-color: #d0efa0;
+}
+
Added: trunk/chorem-webmotion/src/main/webapp/img/glyphicons-halflings-white.png
===================================================================
(Binary files differ)
Property changes on: trunk/chorem-webmotion/src/main/webapp/img/glyphicons-halflings-white.png
___________________________________________________________________
Added: svn:mime-type
+ image/png
Added: trunk/chorem-webmotion/src/main/webapp/img/glyphicons-halflings.png
===================================================================
(Binary files differ)
Property changes on: trunk/chorem-webmotion/src/main/webapp/img/glyphicons-halflings.png
___________________________________________________________________
Added: svn:mime-type
+ image/png
Added: trunk/chorem-webmotion/src/main/webapp/js/bootstrap.min.js
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/js/bootstrap.min.js (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/js/bootstrap.min.js 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1 @@
+!function(a){a(function(){"use strict",a.support.transition=function(){var b=document.body||document.documentElement,c=b.style,d=c.transition!==undefined||c.WebkitTransition!==undefined||c.MozTransition!==undefined||c.MsTransition!==undefined||c.OTransition!==undefined;return d&&{end:function(){var b="TransitionEnd";return a.browser.webkit?b="webkitTransitionEnd":a.browser.mozilla?b="transitionend":a.browser.opera&&(b="oTransitionEnd"),b}()}}()})}(window.jQuery),!function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype={constructor:c,close:function(b){function f(){e.trigger("closed").remove()}var c=a(this),d=c.attr("data-target"),e;d||(d=c.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),e=a(d),e.trigger("close"),b&&b.preventDefault(),e.length||(e=c.hasClass("alert")?c:c.parent()),e.trigger("close").removeClass("in"),a.support.transition&&e.hasClass("fade")?e.on(a.support.transition.end,f):f()}},a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("alert");e||d.data("alert",e=new c(this)),typeof b=="string"&&e[b].call(d)})},a.fn.alert.Constructor=c,a(function(){a("body").on("click.alert.data-api",b,c.prototype.close)})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.button.defaults,c)};b.prototype={constructor:b,setState:function(a){var b="disabled",c=this.$element,d=c.data(),e=c.is("input")?"val":"html";a+="Text",d.resetText||c.data("resetText",c[e]()),c[e](d[a]||this.options[a]),setTimeout(function(){a=="loadingText"?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},toggle:function(){var a=this.$element.parent('[data-toggle="buttons-radio"]');a&&a.find(".active").removeClass("active"),this.$element.toggleClass("active")}},a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("button"),f=typeof c=="object"&&c;e||d.data("button",e=new b(this,f)),c=="toggle"?e.toggle():c&&e.setState(c)})},a.fn.button.defaults={loadingText:"loading..."},a.fn.button.Constructor=b,a(function(){a("body").on("click.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle")})})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.carousel.defaults,c),this.options.slide&&this.slide(this.options.slide)};b.prototype={cycle:function(){return this.interval=setInterval(a.proxy(this.next,this),this.options.interval),this},to:function(b){var c=this.$element.find(".active"),d=c.parent().children(),e=d.index(c),f=this;if(b>d.length-1||b<0)return;return this.sliding?this.$element.one("slid",function(){f.to(b)}):e==b?this.pause().cycle():this.slide(b>e?"next":"prev",a(d[b]))},pause:function(){return clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(b,c){var d=this.$element.find(".active"),e=c||d[b](),f=this.interval,g=b=="next"?"left":"right",h=b=="next"?"first":"last",i=this;if(!e.length)return;return this.sliding=!0,f&&this.pause(),e=e.length?e:this.$element.find(".item")[h](),!a.support.transition&&this.$element.hasClass("slide")?(this.$element.trigger("slide"),d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid")):(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),this.$element.trigger("slide"),this.$element.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid")},0)})),f&&this.cycle(),this}},a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("carousel"),f=typeof c=="object"&&c;e||d.data("carousel",e=new b(this,f)),typeof c=="number"?e.to(c):typeof c=="string"||(c=f.slide)?e[c]():e.cycle()})},a.fn.carousel.defaults={interval:5e3},a.fn.carousel.Constructor=b,a(function(){a("body").on("click.carousel.data-api","[data-slide]",function(b){var c=a(this),d,e=a(c.attr("data-target")||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,"")),f=!e.data("modal")&&a.extend({},e.data(),c.data());e.carousel(f),b.preventDefault()})})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.collapse.defaults,c),this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.prototype={constructor:b,dimension:function(){var a=this.$element.hasClass("width");return a?"width":"height"},show:function(){var b=this.dimension(),c=a.camelCase(["scroll",b].join("-")),d=this.$parent&&this.$parent.find(".in"),e;d&&d.length&&(e=d.data("collapse"),d.collapse("hide"),e||d.data("collapse",null)),this.$element[b](0),this.transition("addClass","show","shown"),this.$element[b](this.$element[0][c])},hide:function(){var a=this.dimension();this.reset(this.$element[a]()),this.transition("removeClass","hide","hidden"),this.$element[a](0)},reset:function(a){var b=this.dimension();this.$element.removeClass("collapse")[b](a||"auto")[0].offsetWidth,this.$element.addClass("collapse")},transition:function(b,c,d){var e=this,f=function(){c=="show"&&e.reset(),e.$element.trigger(d)};this.$element.trigger(c)[b]("in"),a.support.transition&&this.$element.hasClass("collapse")?this.$element.one(a.support.transition.end,f):f()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}},a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("collapse"),f=typeof c=="object"&&c;e||d.data("collapse",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.collapse.defaults={toggle:!0},a.fn.collapse.Constructor=b,a(function(){a("body").on("click.collapse.data-api","[data-toggle=collapse]",function(b){var c=a(this),d,e=c.attr("data-target")||b.preventDefault()||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),f=a(e).data("collapse")?"toggle":c.data();a(e).collapse(f)})})}(window.jQuery),!function(a){function d(){a(b).parent().removeClass("open")}"use strict";var b='[data-toggle="dropdown"]',c=function(b){var c=a(b).on("click.dropdown.data-api",this.toggle);a("html").on("click.dropdown.data-api",function(){c.parent().removeClass("open")})};c.prototype={constructor:c,toggle:function(b){var c=a(this),e=c.attr("data-target"),f,g;return e||(e=c.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,"")),f=a(e),f.length||(f=c.parent()),g=f.hasClass("open"),d(),!g&&f.toggleClass("open"),!1}},a.fn.dropdown=function(b){return this.each(function(){var d=a(this),e=d.data("dropdown");e||d.data("dropdown",e=new c(this)),typeof b=="string"&&e[b].call(d)})},a.fn.dropdown.Constructor=c,a(function(){a("html").on("click.dropdown.data-api",d),a("body").on("click.dropdown.data-api",b,c.prototype.toggle)})}(window.jQuery),!function(a){function c(){var b=this,c=setTimeout(function(){b.$element.off(a.support.transition.end),d.call(b)},500);this.$element.one(a.support.transition.end,function(){clearTimeout(c),d.call(b)})}function d(a){this.$element.hide().trigger("hidden"),e.call(this)}function e(b){var c=this,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;this.$backdrop=a('<div class="modal-backdrop '+d+'" />').appendTo(document.body),this.options.backdrop!="static"&&this.$backdrop.click(a.proxy(this.hide,this)),e&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),e?this.$backdrop.one(a.support.transition.end,b):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,a.proxy(f,this)):f.call(this)):b&&b()}function f(){this.$backdrop.remove(),this.$backdrop=null}function g(){var b=this;this.isShown&&this.options.keyboard?a(document).on("keyup.dismiss.modal",function(a){a.which==27&&b.hide()}):this.isShown||a(document).off("keyup.dismiss.modal")}"use strict";var b=function(b,c){this.options=c,this.$element=a(b).delegate('[data-dismiss="modal"]',"click.dismiss.modal",a.proxy(this.hide,this))};b.prototype={constructor:b,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var b=this;if(this.isShown)return;a("body").addClass("modal-open"),this.isShown=!0,this.$element.trigger("show"),g.call(this),e.call(this,function(){var c=a.support.transition&&b.$element.hasClass("fade");!b.$element.parent().length&&b.$element.appendTo(document.body),b.$element.show(),c&&b.$element[0].offsetWidth,b.$element.addClass("in"),c?b.$element.one(a.support.transition.end,function(){b.$element.trigger("shown")}):b.$element.trigger("shown")})},hide:function(b){b&&b.preventDefault();if(!this.isShown)return;var e=this;this.isShown=!1,a("body").removeClass("modal-open"),g.call(this),this.$element.trigger("hide").removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?c.call(this):d.call(this)}},a.fn.modal=function(c){return this.each(function(){var d=a(this),e=d.data("modal"),f=a.extend({},a.fn.modal.defaults,d.data(),typeof c=="object"&&c);e||d.data("modal",e=new b(this,f)),typeof c=="string"?e[c]():f.show&&e.show()})},a.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},a.fn.modal.Constructor=b,a(function(){a("body").on("click.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d,e=a(c.attr("data-target")||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("modal")?"toggle":a.extend({},e.data(),c.data());b.preventDefault(),e.modal(f)})})}(window.jQuery),!function(a){"use strict";var b=function(a,b){this.init("tooltip",a,b)};b.prototype={constructor:b,init:function(b,c,d){var e,f;this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.enabled=!0,this.options.trigger!="manual"&&(e=this.options.trigger=="hover"?"mouseenter":"focus",f=this.options.trigger=="hover"?"mouseleave":"blur",this.$element.on(e,this.options.selector,a.proxy(this.enter,this)),this.$element.on(f,this.options.selector,a.proxy(this.leave,this))),this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(b){return b=a.extend({},a.fn[this.type].defaults,b,this.$element.data()),b.delay&&typeof b.delay=="number"&&(b.delay={show:b.delay,hide:b.delay}),b},enter:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);!c.options.delay||!c.options.delay.show?c.show():(c.hoverState="in",setTimeout(function(){c.hoverState=="in"&&c.show()},c.options.delay.show))},leave:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);!c.options.delay||!c.options.delay.hide?c.hide():(c.hoverState="out",setTimeout(function(){c.hoverState=="out"&&c.hide()},c.options.delay.hide))},show:function(){var a,b,c,d,e,f,g;if(this.hasContent()&&this.enabled){a=this.tip(),this.setContent(),this.options.animation&&a.addClass("fade"),f=typeof this.options.placement=="function"?this.options.placement.call(this,a[0],this.$element[0]):this.options.placement,b=/in/.test(f),a.remove().css({top:0,left:0,display:"block"}).appendTo(b?this.$element:document.body),c=this.getPosition(b),d=a[0].offsetWidth,e=a[0].offsetHeight;switch(b?f.split(" ")[1]:f){case"bottom":g={top:c.top+c.height,left:c.left+c.width/2-d/2};break;case"top":g={top:c.top-e,left:c.left+c.width/2-d/2};break;case"left":g={top:c.top+c.height/2-e/2,left:c.left-d};break;case"right":g={top:c.top+c.height/2-e/2,left:c.left+c.width}}a.css(g).addClass(f).addClass("in")}},setContent:function(){var a=this.tip();a.find(".tooltip-inner").html(this.getTitle()),a.removeClass("fade in top bottom left right")},hide:function(){function d(){var b=setTimeout(function(){c.off(a.support.transition.end).remove()},500);c.one(a.support.transition.end,function(){clearTimeout(b),c.remove()})}var b=this,c=this.tip();c.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d():c.remove()},fixTitle:function(){var a=this.$element;(a.attr("title")||typeof a.attr("data-original-title")!="string")&&a.attr("data-original-title",a.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(b){return a.extend({},b?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||(typeof c.title=="function"?c.title.call(b[0]):c.title),a=a.toString().replace(/(^\s*|\s*$)/,""),a},tip:function(){return this.$tip=this.$tip||a(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(){this[this.tip().hasClass("in")?"hide":"show"]()}},a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("tooltip"),f=typeof c=="object"&&c;e||d.data("tooltip",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.defaults={animation:!0,delay:0,selector:!1,placement:"top",trigger:"hover",title:"",template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'}}(window.jQuery),!function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype,{constructor:b,setContent:function(){var b=this.tip(),c=this.getTitle(),d=this.getContent();b.find(".popover-title")[a.type(c)=="object"?"append":"html"](c),b.find(".popover-content > *")[a.type(d)=="object"?"append":"html"](d),b.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-content")||(typeof c.content=="function"?c.content.call(b[0]):c.content),a=a.toString().replace(/(^\s*|\s*$)/,""),a},tip:function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip}}),a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("popover"),f=typeof c=="object"&&c;e||d.data("popover",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.defaults=a.extend({},a.fn.tooltip.defaults,{placement:"right",content:"",template:'<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'})}(window.jQuery),!function(a){function b(b,c){var d=a.proxy(this.process,this),e=a(b).is("body")?a(window):a(b),f;this.options=a.extend({},a.fn.scrollspy.defaults,c),this.$scrollElement=e.on("scroll.scroll.data-api",d),this.selector=(this.options.target||(f=a(b).attr("href"))&&f.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=a("body").on("click.scroll.data-api",this.selector,d),this.refresh(),this.process()}"use strict",b.prototype={constructor:b,refresh:function(){this.targets=this.$body.find(this.selector).map(function(){var b=a(this).attr("href");return/^#\w/.test(b)&&a(b).length?b:null}),this.offsets=a.map(this.targets,function(b){return a(b).position().top})},process:function(){var a=this.$scrollElement.scrollTop()+this.options.offset,b=this.offsets,c=this.targets,d=this.activeTarget,e;for(e=b.length;e--;)d!=c[e]&&a>=b[e]&&(!b[e+1]||a<=b[e+1])&&this.activate(c[e])},activate:function(a){var b;this.activeTarget=a,this.$body.find(this.selector).parent(".active").removeClass("active"),b=this.$body.find(this.selector+'[href="'+a+'"]').parent("li").addClass("active"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active")}},a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("scrollspy"),f=typeof c=="object"&&c;e||d.data("scrollspy",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.defaults={offset:10},a(function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(window.jQuery),!function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype={constructor:b,show:function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.attr("data-target"),e,f;d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,""));if(b.parent("li").hasClass("active"))return;e=c.find(".active a").last()[0],b.trigger({type:"show",relatedTarget:e}),f=a(d),this.activate(b.parent("li"),c),this.activate(f,f.parent(),function(){b.trigger({type:"shown",relatedTarget:e})})},activate:function(b,c,d){function g(){e.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),f?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var e=c.find("> .active"),f=d&&a.support.transition&&e.hasClass("fade");f?e.one(a.support.transition.end,g):g(),e.removeClass("in")}},a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("tab");e||d.data("tab",e=new b(this)),typeof c=="string"&&e[c]()})},a.fn.tab.Constructor=b,a(function(){a("body").on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.typeahead.defaults,c),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.$menu=a(this.options.menu).appendTo("body"),this.source=this.options.source,this.shown=!1,this.listen()};b.prototype={constructor:b,select:function(){var a=this.$menu.find(".active").attr("data-value");return this.$element.val(a),this.hide()},show:function(){var b=a.extend({},this.$element.offset(),{height:this.$element[0].offsetHeight});return this.$menu.css({top:b.top+b.height,left:b.left}),this.$menu.show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(b){var c=this,d,e;return this.query=this.$element.val(),this.query?(d=a.grep(this.source,function(a){if(c.matcher(a))return a}),d=this.sorter(d),d.length?this.render(d.slice(0,this.options.items)).show():this.shown?this.hide():this):this.shown?this.hide():this},matcher:function(a){return~a.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(a){var b=[],c=[],d=[],e;while(e=a.shift())e.toLowerCase().indexOf(this.query.toLowerCase())?~e.indexOf(this.query)?c.push(e):d.push(e):b.push(e);return b.concat(c,d)},highlighter:function(a){return a.replace(new RegExp("("+this.query+")","ig"),function(a,b){return"<strong>"+b+"</strong>"})},render:function(b){var c=this;return b=a(b).map(function(b,d){return b=a(c.options.item).attr("data-value",d),b.find("a").html(c.highlighter(d)),b[0]}),b.first().addClass("active"),this.$menu.html(b),this},next:function(b){var c=this.$menu.find(".active").removeClass("active"),d=c.next();d.length||(d=a(this.$menu.find("li")[0])),d.addClass("active")},prev:function(a){var b=this.$menu.find(".active").removeClass("active"),c=b.prev();c.length||(c=this.$menu.find("li").last()),c.addClass("active")},listen:function(){this.$element.on("blur",a.proxy(this.blur,this)).on("keypress",a.proxy(this.keypress,this)).on("keyup",a.proxy(this.keyup,this)),(a.browser.webkit||a.browser.msie)&&this.$element.on("keydown",a.proxy(this.keypress,this)),this.$menu.on("click",a.proxy(this.click,this)).on("mouseenter","li",a.proxy(this.mouseenter,this))},keyup:function(a){a.stopPropagation(),a.preventDefault();switch(a.keyCode){case 40:case 38:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:this.hide();break;default:this.lookup()}},keypress:function(a){a.stopPropagation();if(!this.shown)return;switch(a.keyCode){case 9:case 13:case 27:a.preventDefault();break;case 38:a.preventDefault(),this.prev();break;case 40:a.preventDefault(),this.next()}},blur:function(a){var b=this;a.stopPropagation(),a.preventDefault(),setTimeout(function(){b.hide()},150)},click:function(a){a.stopPropagation(),a.preventDefault(),this.select()},mouseenter:function(b){this.$menu.find(".active").removeClass("active"),a(b.currentTarget).addClass("active")}},a.fn.typeahead=function(c){return this.each(function(){var d=a(this),e=d.data("typeahead"),f=typeof c=="object"&&c;e||d.data("typeahead",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>'},a.fn.typeahead.Constructor=b,a(function(){a("body").on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(b){var c=a(this);if(c.data("typeahead"))return;b.preventDefault(),c.typeahead(c.data())})})}(window.jQuery);
\ No newline at end of file
Added: trunk/chorem-webmotion/src/main/webapp/js/chorem.js
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/js/chorem.js (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/js/chorem.js 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,20 @@
+// tout ce qui aura la classe datepicker servira a editer une date
+$(function() {
+ $( ".datepicker" ).datepicker($.datepicker.regional['fr']);
+ $( ".datepicker" ).datepicker( "option", "gotoCurrent", true );
+});
+
+// nouveau composant pour afficher les wikitties lors de l'edition classe par extension
+$.widget( "custom.autocompleteByExtension", $.ui.autocomplete, {
+ _renderMenu: function( ul, items ) {
+ var self = this,
+ currentExtension = "";
+ $.each( items, function( index, item ) {
+ if ( item.extension != currentExtension ) {
+ ul.append( "<li class='ui-autocomplete-category'>" + item.extension + "</li>" );
+ currentExtension = item.extension;
+ }
+ self._renderItem( ul, item );
+ });
+ }
+});
Added: trunk/chorem-webmotion/src/main/webapp/js/jquery.maskedinput-1.3.js
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/js/jquery.maskedinput-1.3.js (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/js/jquery.maskedinput-1.3.js 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,299 @@
+/*
+ Masked Input plugin for jQuery
+ Copyright (c) 2007-2011 Josh Bush (digitalbush.com)
+ Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license)
+ Version: 1.3
+
+<script src="jquery.js" type="text/javascript"></script>
+<script src="jquery.maskedinput.js" type="text/javascript"></script>
+
+jQuery(function($){
+ $("#date").mask("99/99/9999");
+ $("#phone").mask("(999) 999-9999");
+ $("#tin").mask("99-9999999");
+ $("#ssn").mask("999-99-9999");
+});
+
+Optionally, if you are not satisfied with the underscore ('_') character as a
+placeholder, you may pass an optional argument to the maskedinput method.
+
+jQuery(function($){
+ $("#product").mask("99/99/9999",{placeholder:" "});
+});
+
+Optionally, if you would like to execute a function once the mask has been
+completed, you can specify that function as an optional argument to the
+maskedinput method.
+
+jQuery(function($){
+ $("#product").mask("99/99/9999",
+ {completed:function(){alert("You typed thefollowing: "+this.val());}});
+});
+
+You can now supply your own mask definitions.
+
+jQuery(function($){
+ $.mask.definitions['~']='[+-]';
+ $("#eyescript").mask("~9.99 ~9.99 999");
+});
+
+You can have part of your mask be optional. Anything listed after '?' within the
+mask is considered optional user input. The common example for this is phone
+number + optional extension.
+
+jQuery(function($){
+ $("#phone").mask("(999) 999-9999? x99999");
+});
+*/
+(function($) {
+ var pasteEventName = ($.browser.msie ? 'paste' : 'input') + ".mask";
+ var iPhone = (window.orientation != undefined);
+
+ $.mask = {
+ //Predefined character definitions
+ definitions: {
+ '9': "[0-9]",
+ 'a': "[A-Za-z]",
+ '*': "[A-Za-z0-9]"
+ },
+ dataName:"rawMaskFn"
+ };
+
+ $.fn.extend({
+ //Helper Function for Caret positioning
+ caret: function(begin, end) {
+ if (this.length == 0) return;
+ if (typeof begin == 'number') {
+ end = (typeof end == 'number') ? end : begin;
+ return this.each(function() {
+ if (this.setSelectionRange) {
+ this.setSelectionRange(begin, end);
+ } else if (this.createTextRange) {
+ var range = this.createTextRange();
+ range.collapse(true);
+ range.moveEnd('character', end);
+ range.moveStart('character', begin);
+ range.select();
+ }
+ });
+ } else {
+ if (this[0].setSelectionRange) {
+ begin = this[0].selectionStart;
+ end = this[0].selectionEnd;
+ } else if (document.selection && document.selection.createRange) {
+ var range = document.selection.createRange();
+ begin = 0 - range.duplicate().moveStart('character', -100000);
+ end = begin + range.text.length;
+ }
+ return { begin: begin, end: end };
+ }
+ },
+ unmask: function() { return this.trigger("unmask"); },
+ mask: function(mask, settings) {
+ if (!mask && this.length > 0) {
+ var input = $(this[0]);
+ return input.data($.mask.dataName)();
+ }
+ settings = $.extend({
+ placeholder: "_",
+ completed: null
+ }, settings);
+
+ var defs = $.mask.definitions;
+ var tests = [];
+ var partialPosition = mask.length;
+ var firstNonMaskPos = null;
+ var len = mask.length;
+
+ $.each(mask.split(""), function(i, c) {
+ if (c == '?') {
+ len--;
+ partialPosition = i;
+ } else if (defs[c]) {
+ tests.push(new RegExp(defs[c]));
+ if(firstNonMaskPos==null)
+ firstNonMaskPos = tests.length - 1;
+ } else {
+ tests.push(null);
+ }
+ });
+
+ return this.trigger("unmask").each(function() {
+ var input = $(this);
+ var buffer = $.map(mask.split(""), function(c, i) { if (c != '?') return defs[c] ? settings.placeholder : c });
+ var focusText = input.val();
+
+ function seekNext(pos) {
+ while (++pos <= len && !tests[pos]);
+ return pos;
+ };
+ function seekPrev(pos) {
+ while (--pos >= 0 && !tests[pos]);
+ return pos;
+ };
+
+ function shiftL(begin,end) {
+ if(begin<0)
+ return;
+ for (var i = begin,j = seekNext(end); i < len; i++) {
+ if (tests[i]) {
+ if (j < len && tests[i].test(buffer[j])) {
+ buffer[i] = buffer[j];
+ buffer[j] = settings.placeholder;
+ } else
+ break;
+ j = seekNext(j);
+ }
+ }
+ writeBuffer();
+ input.caret(Math.max(firstNonMaskPos, begin));
+ };
+
+ function shiftR(pos) {
+ for (var i = pos, c = settings.placeholder; i < len; i++) {
+ if (tests[i]) {
+ var j = seekNext(i);
+ var t = buffer[i];
+ buffer[i] = c;
+ if (j < len && tests[j].test(t))
+ c = t;
+ else
+ break;
+ }
+ }
+ };
+
+ function keydownEvent(e) {
+ var k=e.which;
+
+ //backspace, delete, and escape get special treatment
+ if(k == 8 || k == 46 || (iPhone && k == 127)){
+ var pos = input.caret(),
+ begin = pos.begin,
+ end = pos.end;
+
+ if(end-begin==0){
+ begin=k!=46?seekPrev(begin):(end=seekNext(begin-1));
+ end=k==46?seekNext(end):end;
+ }
+ clearBuffer(begin, end);
+ shiftL(begin,end-1);
+
+ return false;
+ } else if (k == 27) {//escape
+ input.val(focusText);
+ input.caret(0, checkVal());
+ return false;
+ }
+ };
+
+ function keypressEvent(e) {
+ var k = e.which,
+ pos = input.caret();
+ if (e.ctrlKey || e.altKey || e.metaKey || k<32) {//Ignore
+ return true;
+ } else if (k) {
+ if(pos.end-pos.begin!=0){
+ clearBuffer(pos.begin, pos.end);
+ shiftL(pos.begin, pos.end-1);
+ }
+
+ var p = seekNext(pos.begin - 1);
+ if (p < len) {
+ var c = String.fromCharCode(k);
+ if (tests[p].test(c)) {
+ shiftR(p);
+ buffer[p] = c;
+ writeBuffer();
+ var next = seekNext(p);
+ input.caret(next);
+ if (settings.completed && next >= len)
+ settings.completed.call(input);
+ }
+ }
+ return false;
+ }
+ };
+
+ function clearBuffer(start, end) {
+ for (var i = start; i < end && i < len; i++) {
+ if (tests[i])
+ buffer[i] = settings.placeholder;
+ }
+ };
+
+ function writeBuffer() { return input.val(buffer.join('')).val(); };
+
+ function checkVal(allow) {
+ //try to place characters where they belong
+ var test = input.val();
+ var lastMatch = -1;
+ for (var i = 0, pos = 0; i < len; i++) {
+ if (tests[i]) {
+ buffer[i] = settings.placeholder;
+ while (pos++ < test.length) {
+ var c = test.charAt(pos - 1);
+ if (tests[i].test(c)) {
+ buffer[i] = c;
+ lastMatch = i;
+ break;
+ }
+ }
+ if (pos > test.length)
+ break;
+ } else if (buffer[i] == test.charAt(pos) && i!=partialPosition) {
+ pos++;
+ lastMatch = i;
+ }
+ }
+ if (!allow && lastMatch + 1 < partialPosition) {
+ input.val("");
+ clearBuffer(0, len);
+ } else if (allow || lastMatch + 1 >= partialPosition) {
+ writeBuffer();
+ if (!allow) input.val(input.val().substring(0, lastMatch + 1));
+ }
+ return (partialPosition ? i : firstNonMaskPos);
+ };
+
+ input.data($.mask.dataName,function(){
+ return $.map(buffer, function(c, i) {
+ return tests[i]&&c!=settings.placeholder ? c : null;
+ }).join('');
+ })
+
+ if (!input.attr("readonly"))
+ input
+ .one("unmask", function() {
+ input
+ .unbind(".mask")
+ .removeData($.mask.dataName);
+ })
+ .bind("focus.mask", function() {
+ focusText = input.val();
+ var pos = checkVal();
+ writeBuffer();
+ var moveCaret=function(){
+ if (pos == mask.length)
+ input.caret(0, pos);
+ else
+ input.caret(pos);
+ };
+ ($.browser.msie ? moveCaret:function(){setTimeout(moveCaret,0)})();
+ })
+ .bind("blur.mask", function() {
+ checkVal();
+ if (input.val() != focusText)
+ input.change();
+ })
+ .bind("keydown.mask", keydownEvent)
+ .bind("keypress.mask", keypressEvent)
+ .bind(pasteEventName, function() {
+ setTimeout(function() { input.caret(checkVal(true)); }, 0);
+ });
+
+ checkVal(); //Perform initial check for existing values
+ });
+ }
+ });
+})(jQuery);
Added: trunk/chorem-webmotion/src/main/webapp/js/jquery.tokeninput.js
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/js/jquery.tokeninput.js (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/js/jquery.tokeninput.js 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,860 @@
+/*
+ * jQuery Plugin: Tokenizing Autocomplete Text Entry
+ * Version 1.6.0
+ *
+ * Copyright (c) 2009 James Smith (http://loopj.com)
+ * Licensed jointly under the GPL and MIT licenses,
+ * choose which one suits your project best!
+ *
+ */
+
+(function ($) {
+// Default settings
+var DEFAULT_SETTINGS = {
+ // Search settings
+ method: "GET",
+ contentType: "json",
+ queryParam: "q",
+ searchDelay: 300,
+ minChars: 1,
+ propertyToSearch: "name",
+ jsonContainer: null,
+
+ // Display settings
+ hintText: "Type in a search term",
+ noResultsText: "No results",
+ searchingText: "Searching...",
+ deleteText: "×",
+ animateDropdown: true,
+
+ // Tokenization settings
+ tokenLimit: null,
+ tokenDelimiter: ",",
+ preventDuplicates: false,
+
+ // Output settings
+ tokenValue: "id",
+
+ // Prepopulation settings
+ prePopulate: null,
+ processPrePopulate: false,
+
+ // Manipulation settings
+ idPrefix: "token-input-",
+
+ // Formatters
+ resultsFormatter: function(item){ return "<li>" + item[this.propertyToSearch]+ "</li>" },
+ tokenFormatter: function(item) { return "<li><p>" + item[this.propertyToSearch] + "</p></li>" },
+
+ // Callbacks
+ onResult: null,
+ onAdd: null,
+ onDelete: null,
+ onReady: null
+};
+
+// Default classes to use when theming
+var DEFAULT_CLASSES = {
+ tokenList: "token-input-list",
+ token: "token-input-token",
+ tokenDelete: "token-input-delete-token",
+ selectedToken: "token-input-selected-token",
+ highlightedToken: "token-input-highlighted-token",
+ dropdown: "token-input-dropdown",
+ dropdownItem: "token-input-dropdown-item",
+ dropdownItem2: "token-input-dropdown-item2",
+ selectedDropdownItem: "token-input-selected-dropdown-item",
+ inputToken: "token-input-input-token"
+};
+
+// Input box position "enum"
+var POSITION = {
+ BEFORE: 0,
+ AFTER: 1,
+ END: 2
+};
+
+// Keys "enum"
+var KEY = {
+ BACKSPACE: 8,
+ TAB: 9,
+ ENTER: 13,
+ ESCAPE: 27,
+ SPACE: 32,
+ PAGE_UP: 33,
+ PAGE_DOWN: 34,
+ END: 35,
+ HOME: 36,
+ LEFT: 37,
+ UP: 38,
+ RIGHT: 39,
+ DOWN: 40,
+ NUMPAD_ENTER: 108,
+ COMMA: 188
+};
+
+// Additional public (exposed) methods
+var methods = {
+ init: function(url_or_data_or_function, options) {
+ var settings = $.extend({}, DEFAULT_SETTINGS, options || {});
+
+ return this.each(function () {
+ $(this).data("tokenInputObject", new $.TokenList(this, url_or_data_or_function, settings));
+ });
+ },
+ clear: function() {
+ this.data("tokenInputObject").clear();
+ return this;
+ },
+ add: function(item) {
+ this.data("tokenInputObject").add(item);
+ return this;
+ },
+ remove: function(item) {
+ this.data("tokenInputObject").remove(item);
+ return this;
+ },
+ get: function() {
+ return this.data("tokenInputObject").getTokens();
+ }
+}
+
+// Expose the .tokenInput function to jQuery as a plugin
+$.fn.tokenInput = function (method) {
+ // Method calling and initialization logic
+ if(methods[method]) {
+ return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
+ } else {
+ return methods.init.apply(this, arguments);
+ }
+};
+
+// TokenList class for each input
+$.TokenList = function (input, url_or_data, settings) {
+ //
+ // Initialization
+ //
+
+ // Configure the data source
+ if($.type(url_or_data) === "string" || $.type(url_or_data) === "function") {
+ // Set the url to query against
+ settings.url = url_or_data;
+
+ // If the URL is a function, evaluate it here to do our initalization work
+ var url = computeURL();
+
+ // Make a smart guess about cross-domain if it wasn't explicitly specified
+ if(settings.crossDomain === undefined) {
+ if(url.indexOf("://") === -1) {
+ settings.crossDomain = false;
+ } else {
+ settings.crossDomain = (location.href.split(/\/+/g)[1] !== url.split(/\/+/g)[1]);
+ }
+ }
+ } else if(typeof(url_or_data) === "object") {
+ // Set the local data to search through
+ settings.local_data = url_or_data;
+ }
+
+ // Build class names
+ if(settings.classes) {
+ // Use custom class names
+ settings.classes = $.extend({}, DEFAULT_CLASSES, settings.classes);
+ } else if(settings.theme) {
+ // Use theme-suffixed default class names
+ settings.classes = {};
+ $.each(DEFAULT_CLASSES, function(key, value) {
+ settings.classes[key] = value + "-" + settings.theme;
+ });
+ } else {
+ settings.classes = DEFAULT_CLASSES;
+ }
+
+
+ // Save the tokens
+ var saved_tokens = [];
+
+ // Keep track of the number of tokens in the list
+ var token_count = 0;
+
+ // Basic cache to save on db hits
+ var cache = new $.TokenList.Cache();
+
+ // Keep track of the timeout, old vals
+ var timeout;
+ var input_val;
+
+ // Create a new text input an attach keyup events
+ var input_box = $("<input type=\"text\" autocomplete=\"off\">")
+ .css({
+ outline: "none"
+ })
+ .attr("id", settings.idPrefix + input.id)
+ .focus(function () {
+ if (settings.tokenLimit === null || settings.tokenLimit !== token_count) {
+ show_dropdown_hint();
+ }
+ })
+ .blur(function () {
+ hide_dropdown();
+ $(this).val("");
+ })
+ .bind("keyup keydown blur update", resize_input)
+ .keydown(function (event) {
+ var previous_token;
+ var next_token;
+
+ switch(event.keyCode) {
+ case KEY.LEFT:
+ case KEY.RIGHT:
+ case KEY.UP:
+ case KEY.DOWN:
+ if(!$(this).val()) {
+ previous_token = input_token.prev();
+ next_token = input_token.next();
+
+ if((previous_token.length && previous_token.get(0) === selected_token) || (next_token.length && next_token.get(0) === selected_token)) {
+ // Check if there is a previous/next token and it is selected
+ if(event.keyCode === KEY.LEFT || event.keyCode === KEY.UP) {
+ deselect_token($(selected_token), POSITION.BEFORE);
+ } else {
+ deselect_token($(selected_token), POSITION.AFTER);
+ }
+ } else if((event.keyCode === KEY.LEFT || event.keyCode === KEY.UP) && previous_token.length) {
+ // We are moving left, select the previous token if it exists
+ select_token($(previous_token.get(0)));
+ } else if((event.keyCode === KEY.RIGHT || event.keyCode === KEY.DOWN) && next_token.length) {
+ // We are moving right, select the next token if it exists
+ select_token($(next_token.get(0)));
+ }
+ } else {
+ var dropdown_item = null;
+
+ if(event.keyCode === KEY.DOWN || event.keyCode === KEY.RIGHT) {
+ dropdown_item = $(selected_dropdown_item).next();
+ } else {
+ dropdown_item = $(selected_dropdown_item).prev();
+ }
+
+ if(dropdown_item.length) {
+ select_dropdown_item(dropdown_item);
+ }
+ return false;
+ }
+ break;
+
+ case KEY.BACKSPACE:
+ previous_token = input_token.prev();
+
+ if(!$(this).val().length) {
+ if(selected_token) {
+ delete_token($(selected_token));
+ hidden_input.change();
+ } else if(previous_token.length) {
+ select_token($(previous_token.get(0)));
+ }
+
+ return false;
+ } else if($(this).val().length === 1) {
+ hide_dropdown();
+ } else {
+ // set a timeout just long enough to let this function finish.
+ setTimeout(function(){do_search();}, 5);
+ }
+ break;
+
+ case KEY.TAB:
+ case KEY.ENTER:
+ case KEY.NUMPAD_ENTER:
+ case KEY.COMMA:
+ if(selected_dropdown_item) {
+ add_token($(selected_dropdown_item).data("tokeninput"));
+ hidden_input.change();
+ return false;
+ }
+ break;
+
+ case KEY.ESCAPE:
+ hide_dropdown();
+ return true;
+
+ default:
+ if(String.fromCharCode(event.which)) {
+ // set a timeout just long enough to let this function finish.
+ setTimeout(function(){do_search();}, 5);
+ }
+ break;
+ }
+ });
+
+ // Keep a reference to the original input box
+ var hidden_input = $(input)
+ .hide()
+ .val("")
+ .focus(function () {
+ input_box.focus();
+ })
+ .blur(function () {
+ input_box.blur();
+ });
+
+ // Keep a reference to the selected token and dropdown item
+ var selected_token = null;
+ var selected_token_index = 0;
+ var selected_dropdown_item = null;
+
+ // The list to store the token items in
+ var token_list = $("<ul />")
+ .addClass(settings.classes.tokenList)
+ .click(function (event) {
+ var li = $(event.target).closest("li");
+ if(li && li.get(0) && $.data(li.get(0), "tokeninput")) {
+ toggle_select_token(li);
+ } else {
+ // Deselect selected token
+ if(selected_token) {
+ deselect_token($(selected_token), POSITION.END);
+ }
+
+ // Focus input box
+ input_box.focus();
+ }
+ })
+ .mouseover(function (event) {
+ var li = $(event.target).closest("li");
+ if(li && selected_token !== this) {
+ li.addClass(settings.classes.highlightedToken);
+ }
+ })
+ .mouseout(function (event) {
+ var li = $(event.target).closest("li");
+ if(li && selected_token !== this) {
+ li.removeClass(settings.classes.highlightedToken);
+ }
+ })
+ .insertBefore(hidden_input);
+
+ // The token holding the input box
+ var input_token = $("<li />")
+ .addClass(settings.classes.inputToken)
+ .appendTo(token_list)
+ .append(input_box);
+
+ // The list to store the dropdown items in
+ var dropdown = $("<div>")
+ .addClass(settings.classes.dropdown)
+ .appendTo("body")
+ .hide();
+
+ // Magic element to help us resize the text input
+ var input_resizer = $("<tester/>")
+ .insertAfter(input_box)
+ .css({
+ position: "absolute",
+ top: -9999,
+ left: -9999,
+ width: "auto",
+ fontSize: input_box.css("fontSize"),
+ fontFamily: input_box.css("fontFamily"),
+ fontWeight: input_box.css("fontWeight"),
+ letterSpacing: input_box.css("letterSpacing"),
+ whiteSpace: "nowrap"
+ });
+
+ // Pre-populate list if items exist
+ hidden_input.val("");
+ var li_data = settings.prePopulate || hidden_input.data("pre");
+ if(settings.processPrePopulate && $.isFunction(settings.onResult)) {
+ li_data = settings.onResult.call(hidden_input, li_data);
+ }
+ if(li_data && li_data.length) {
+ $.each(li_data, function (index, value) {
+ insert_token(value);
+ checkTokenLimit();
+ });
+ }
+
+ // Initialization is done
+ if($.isFunction(settings.onReady)) {
+ settings.onReady.call();
+ }
+
+ //
+ // Public functions
+ //
+
+ this.clear = function() {
+ token_list.children("li").each(function() {
+ if ($(this).children("input").length === 0) {
+ delete_token($(this));
+ }
+ });
+ }
+
+ this.add = function(item) {
+ add_token(item);
+ }
+
+ this.remove = function(item) {
+ token_list.children("li").each(function() {
+ if ($(this).children("input").length === 0) {
+ var currToken = $(this).data("tokeninput");
+ var match = true;
+ for (var prop in item) {
+ if (item[prop] !== currToken[prop]) {
+ match = false;
+ break;
+ }
+ }
+ if (match) {
+ delete_token($(this));
+ }
+ }
+ });
+ }
+
+ this.getTokens = function() {
+ return saved_tokens;
+ }
+
+ //
+ // Private functions
+ //
+
+ function checkTokenLimit() {
+ if(settings.tokenLimit !== null && token_count >= settings.tokenLimit) {
+ input_box.hide();
+ hide_dropdown();
+ return;
+ }
+ }
+
+ function resize_input() {
+ if(input_val === (input_val = input_box.val())) {return;}
+
+ // Enter new content into resizer and resize input accordingly
+ var escaped = input_val.replace(/&/g, '&').replace(/\s/g,' ').replace(/</g, '<').replace(/>/g, '>');
+ input_resizer.html(escaped);
+ input_box.width(input_resizer.width() + 30);
+ }
+
+ function is_printable_character(keycode) {
+ return ((keycode >= 48 && keycode <= 90) || // 0-1a-z
+ (keycode >= 96 && keycode <= 111) || // numpad 0-9 + - / * .
+ (keycode >= 186 && keycode <= 192) || // ; = , - . / ^
+ (keycode >= 219 && keycode <= 222)); // ( \ ) '
+ }
+
+ // Inner function to a token to the list
+ function insert_token(item) {
+ var this_token = settings.tokenFormatter(item);
+ this_token = $(this_token)
+ .addClass(settings.classes.token)
+ .insertBefore(input_token);
+
+ // The 'delete token' button
+ $("<span>" + settings.deleteText + "</span>")
+ .addClass(settings.classes.tokenDelete)
+ .appendTo(this_token)
+ .click(function () {
+ delete_token($(this).parent());
+ hidden_input.change();
+ return false;
+ });
+
+ // Store data on the token
+ var token_data = {"id": item.id};
+ token_data[settings.propertyToSearch] = item[settings.propertyToSearch];
+ $.data(this_token.get(0), "tokeninput", item);
+
+ // Save this token for duplicate checking
+ saved_tokens = saved_tokens.slice(0,selected_token_index).concat([token_data]).concat(saved_tokens.slice(selected_token_index));
+ selected_token_index++;
+
+ // Update the hidden input
+ update_hidden_input(saved_tokens, hidden_input);
+
+ token_count += 1;
+
+ // Check the token limit
+ if(settings.tokenLimit !== null && token_count >= settings.tokenLimit) {
+ input_box.hide();
+ hide_dropdown();
+ }
+
+ return this_token;
+ }
+
+ // Add a token to the token list based on user input
+ function add_token (item) {
+ var callback = settings.onAdd;
+
+ // See if the token already exists and select it if we don't want duplicates
+ if(token_count > 0 && settings.preventDuplicates) {
+ var found_existing_token = null;
+ token_list.children().each(function () {
+ var existing_token = $(this);
+ var existing_data = $.data(existing_token.get(0), "tokeninput");
+ if(existing_data && existing_data.id === item.id) {
+ found_existing_token = existing_token;
+ return false;
+ }
+ });
+
+ if(found_existing_token) {
+ select_token(found_existing_token);
+ input_token.insertAfter(found_existing_token);
+ input_box.focus();
+ return;
+ }
+ }
+
+ // Insert the new tokens
+ if(settings.tokenLimit == null || token_count < settings.tokenLimit) {
+ insert_token(item);
+ checkTokenLimit();
+ }
+
+ // Clear input box
+ input_box.val("");
+
+ // Don't show the help dropdown, they've got the idea
+ hide_dropdown();
+
+ // Execute the onAdd callback if defined
+ if($.isFunction(callback)) {
+ callback.call(hidden_input,item);
+ }
+ }
+
+ // Select a token in the token list
+ function select_token (token) {
+ token.addClass(settings.classes.selectedToken);
+ selected_token = token.get(0);
+
+ // Hide input box
+ input_box.val("");
+
+ // Hide dropdown if it is visible (eg if we clicked to select token)
+ hide_dropdown();
+ }
+
+ // Deselect a token in the token list
+ function deselect_token (token, position) {
+ token.removeClass(settings.classes.selectedToken);
+ selected_token = null;
+
+ if(position === POSITION.BEFORE) {
+ input_token.insertBefore(token);
+ selected_token_index--;
+ } else if(position === POSITION.AFTER) {
+ input_token.insertAfter(token);
+ selected_token_index++;
+ } else {
+ input_token.appendTo(token_list);
+ selected_token_index = token_count;
+ }
+
+ // Show the input box and give it focus again
+ input_box.focus();
+ }
+
+ // Toggle selection of a token in the token list
+ function toggle_select_token(token) {
+ var previous_selected_token = selected_token;
+
+ if(selected_token) {
+ deselect_token($(selected_token), POSITION.END);
+ }
+
+ if(previous_selected_token === token.get(0)) {
+ deselect_token(token, POSITION.END);
+ } else {
+ select_token(token);
+ }
+ }
+
+ // Delete a token from the token list
+ function delete_token (token) {
+ // Remove the id from the saved list
+ var token_data = $.data(token.get(0), "tokeninput");
+ var callback = settings.onDelete;
+
+ var index = token.prevAll().length;
+ if(index > selected_token_index) index--;
+
+ // Delete the token
+ token.remove();
+ selected_token = null;
+
+ // Show the input box and give it focus again
+ input_box.focus();
+
+ // Remove this token from the saved list
+ saved_tokens = saved_tokens.slice(0,index).concat(saved_tokens.slice(index+1));
+ if(index < selected_token_index) selected_token_index--;
+
+ // Update the hidden input
+ update_hidden_input(saved_tokens, hidden_input);
+
+ token_count -= 1;
+
+ if(settings.tokenLimit !== null) {
+ input_box
+ .show()
+ .val("")
+ .focus();
+ }
+
+ // Execute the onDelete callback if defined
+ if($.isFunction(callback)) {
+ callback.call(hidden_input,token_data);
+ }
+ }
+
+ // Update the hidden input box value
+ function update_hidden_input(saved_tokens, hidden_input) {
+ var token_values = $.map(saved_tokens, function (el) {
+ return el[settings.tokenValue];
+ });
+ hidden_input.val(token_values.join(settings.tokenDelimiter));
+
+ }
+
+ // Hide and clear the results dropdown
+ function hide_dropdown () {
+ dropdown.hide().empty();
+ selected_dropdown_item = null;
+ }
+
+ function show_dropdown() {
+ dropdown
+ .css({
+ position: "absolute",
+ top: $(token_list).offset().top + $(token_list).outerHeight(),
+ left: $(token_list).offset().left,
+ zindex: 999
+ })
+ .show();
+ }
+
+ function show_dropdown_searching () {
+ if(settings.searchingText) {
+ dropdown.html("<p>"+settings.searchingText+"</p>");
+ show_dropdown();
+ }
+ }
+
+ function show_dropdown_hint () {
+ if(settings.hintText) {
+ dropdown.html("<p>"+settings.hintText+"</p>");
+ show_dropdown();
+ }
+ }
+
+ // Highlight the query part of the search term
+ function highlight_term(value, term) {
+ return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<b>$1</b>");
+ }
+
+ function find_value_and_highlight_term(template, value, term) {
+ return template.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + value + ")(?![^<>]*>)(?![^&;]+;)", "g"), highlight_term(value, term));
+ }
+
+ // Populate the results dropdown with some results
+ function populate_dropdown (query, results) {
+ if(results && results.length) {
+ dropdown.empty();
+ var dropdown_ul = $("<ul>")
+ .appendTo(dropdown)
+ .mouseover(function (event) {
+ select_dropdown_item($(event.target).closest("li"));
+ })
+ .mousedown(function (event) {
+ add_token($(event.target).closest("li").data("tokeninput"));
+ hidden_input.change();
+ return false;
+ })
+ .hide();
+
+ $.each(results, function(index, value) {
+ var this_li = settings.resultsFormatter(value);
+
+ this_li = find_value_and_highlight_term(this_li ,value[settings.propertyToSearch], query);
+
+ this_li = $(this_li).appendTo(dropdown_ul);
+
+ if(index % 2) {
+ this_li.addClass(settings.classes.dropdownItem);
+ } else {
+ this_li.addClass(settings.classes.dropdownItem2);
+ }
+
+ if(index === 0) {
+ select_dropdown_item(this_li);
+ }
+
+ $.data(this_li.get(0), "tokeninput", value);
+ });
+
+ show_dropdown();
+
+ if(settings.animateDropdown) {
+ dropdown_ul.slideDown("fast");
+ } else {
+ dropdown_ul.show();
+ }
+ } else {
+ if(settings.noResultsText) {
+ dropdown.html("<p>"+settings.noResultsText+"</p>");
+ show_dropdown();
+ }
+ }
+ }
+
+ // Highlight an item in the results dropdown
+ function select_dropdown_item (item) {
+ if(item) {
+ if(selected_dropdown_item) {
+ deselect_dropdown_item($(selected_dropdown_item));
+ }
+
+ item.addClass(settings.classes.selectedDropdownItem);
+ selected_dropdown_item = item.get(0);
+ }
+ }
+
+ // Remove highlighting from an item in the results dropdown
+ function deselect_dropdown_item (item) {
+ item.removeClass(settings.classes.selectedDropdownItem);
+ selected_dropdown_item = null;
+ }
+
+ // Do a search and show the "searching" dropdown if the input is longer
+ // than settings.minChars
+ function do_search() {
+ var query = input_box.val().toLowerCase();
+
+ if(query && query.length) {
+ if(selected_token) {
+ deselect_token($(selected_token), POSITION.AFTER);
+ }
+
+ if(query.length >= settings.minChars) {
+ show_dropdown_searching();
+ clearTimeout(timeout);
+
+ timeout = setTimeout(function(){
+ run_search(query);
+ }, settings.searchDelay);
+ } else {
+ hide_dropdown();
+ }
+ }
+ }
+
+ // Do the actual search
+ function run_search(query) {
+ var cache_key = query + computeURL();
+ var cached_results = cache.get(cache_key);
+ if(cached_results) {
+ populate_dropdown(query, cached_results);
+ } else {
+ // Are we doing an ajax search or local data search?
+ if(settings.url) {
+ var url = computeURL();
+ // Extract exisiting get params
+ var ajax_params = {};
+ ajax_params.data = {};
+ if(url.indexOf("?") > -1) {
+ var parts = url.split("?");
+ ajax_params.url = parts[0];
+
+ var param_array = parts[1].split("&");
+ $.each(param_array, function (index, value) {
+ var kv = value.split("=");
+ ajax_params.data[kv[0]] = kv[1];
+ });
+ } else {
+ ajax_params.url = url;
+ }
+
+ // Prepare the request
+ ajax_params.data[settings.queryParam] = query;
+ ajax_params.type = settings.method;
+ ajax_params.dataType = settings.contentType;
+ if(settings.crossDomain) {
+ ajax_params.dataType = "jsonp";
+ }
+
+ // Attach the success callback
+ ajax_params.success = function(results) {
+ if($.isFunction(settings.onResult)) {
+ results = settings.onResult.call(hidden_input, results);
+ }
+ cache.add(cache_key, settings.jsonContainer ? results[settings.jsonContainer] : results);
+
+ // only populate the dropdown if the results are associated with the active search query
+ if(input_box.val().toLowerCase() === query) {
+ populate_dropdown(query, settings.jsonContainer ? results[settings.jsonContainer] : results);
+ }
+ };
+
+ // Make the request
+ $.ajax(ajax_params);
+ } else if(settings.local_data) {
+ // Do the search through local data
+ var results = $.grep(settings.local_data, function (row) {
+ return row[settings.propertyToSearch].toLowerCase().indexOf(query.toLowerCase()) > -1;
+ });
+
+ if($.isFunction(settings.onResult)) {
+ results = settings.onResult.call(hidden_input, results);
+ }
+ cache.add(cache_key, results);
+ populate_dropdown(query, results);
+ }
+ }
+ }
+
+ // compute the dynamic URL
+ function computeURL() {
+ var url = settings.url;
+ if(typeof settings.url == 'function') {
+ url = settings.url.call();
+ }
+ return url;
+ }
+};
+
+// Really basic cache for the results
+$.TokenList.Cache = function (options) {
+ var settings = $.extend({
+ max_size: 500
+ }, options);
+
+ var data = {};
+ var size = 0;
+
+ var flush = function () {
+ data = {};
+ size = 0;
+ };
+
+ this.add = function (query, results) {
+ if(size > settings.max_size) {
+ flush();
+ }
+
+ if(!data[query]) {
+ size += 1;
+ }
+
+ data[query] = results;
+ };
+
+ this.get = function (query) {
+ return data[query];
+ };
+};
+}(jQuery));
Added: trunk/chorem-webmotion/src/main/webapp/js/less-1.2.1.min.js
===================================================================
--- trunk/chorem-webmotion/src/main/webapp/js/less-1.2.1.min.js (rev 0)
+++ trunk/chorem-webmotion/src/main/webapp/js/less-1.2.1.min.js 2012-04-23 13:11:43 UTC (rev 135)
@@ -0,0 +1,9 @@
+//
+// LESS - Leaner CSS v1.2.1
+// http://lesscss.org
+//
+// Copyright (c) 2009-2011, Alexis Sellier
+// Licensed under the Apache 2.0 License.
+//
+(function(a,b){function c(b){return a.less[b.split("/")[1]]}function m(){var a=document.getElementsByTagName("style");for(var b=0;b<a.length;b++)a[b].type.match(k)&&(new d.Parser).parse(a[b].innerHTML||"",function(c,d){var e=d.toCSS(),f=a[b];f.type="text/css",f.styleSheet?f.styleSheet.cssText=e:f.innerHTML=e})}function n(a,b){for(var c=0;c<d.sheets.length;c++)o(d.sheets[c],a,b,d.sheets.length-(c+1))}function o(b,c,e,f){var g=a.location.href.replace(/[#?].*$/,""),i=b.href.replace(/\?.*$/,""),j=h&&h.getItem(i),k=h&&h.getItem(i+":timestamp"),l={css:j,timestamp:k};/^(https?|file):/.test(i)||(i.charAt(0)=="/"?i=a.location.protocol+"//"+a.location.host+i:i=g.slice(0,g.lastIndexOf("/")+1)+i);var m=i.match(/([^\/]+)$/)[1];s(b.href,b.type,function(a,g){if(!e&&l&&g&&(new Date(g)).valueOf()===(new Date(l.timestamp)).valueOf())r(l.css,b),c(null,b,{local:!0,remaining:f});else try{(new d.Parser({optimization:d.optimization,paths:[i.replace(/[\w\.-]+$/,"")],mime:b.type,filename:m})).parse(a,function(d,e){if(d)return w(d,i);try{c(d,e,a,b,{local:!1,lastModified:g,remaining:f}),u(document.getElementById("less-error-message:"+q(i)))}catch(d){w(d,i)}})}catch(h){w(h,i)}},function(a,b){throw new Error("Couldn't load "+b+" ("+a+")")})}function q(a){return a.replace(/^[a-z]+:\/\/?[^\/]+/,"").replace(/^\//,"").replace(/\?.*$/,"").replace(/\.[^\.\/]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function r(a,b,c){var d,e=b.href?b.href.replace(/\?.*$/,""):"",f="less:"+(b.title||q(e));(d=document.getElementById(f))===null&&(d=document.createElement("style"),d.type="text/css",d.media=b.media||"screen",d.id=f,document.getElementsByTagName("head")[0].appendChild(d));if(d.styleSheet)try{d.styleSheet.cssText=a}catch(g){throw new Error("Couldn't reassign styleSheet.cssText.")}else(function(a){d.childNodes.length>0?d.firstChild.nodeValue!==a.nodeValue&&d.replaceChild(a,d.firstChild):d.appendChild(a)})(document.createTextNode(a));c&&h&&(v("saving "+e+" to cache."),h.setItem(e,a),h.setItem(e+":timestamp",c))}function s(a,b,c,e){function i(b,c,d){b.status>=200&&b.status<300?c(b.responseText,b.getResponseHeader("Last-Modified")):typeof d=="function"&&d(b.status,a)}var f=t(),h=g?!1:d.async;typeof f.overrideMimeType=="function"&&f.overrideMimeType("text/css"),f.open("GET",a,h),f.setRequestHeader("Accept",b||"text/x-less, text/css; q=0.9, */*; q=0.5"),f.send(null),g?f.status===0||f.status>=200&&f.status<300?c(f.responseText):e(f.status,a):h?f.onreadystatechange=function(){f.readyState==4&&i(f,c,e)}:i(f,c,e)}function t(){if(a.XMLHttpRequest)return new XMLHttpRequest;try{return new ActiveXObject("MSXML2.XMLHTTP.3.0")}catch(b){return v("browser doesn't support AJAX."),null}}function u(a){return a&&a.parentNode.removeChild(a)}function v(a){d.env=="development"&&typeof console!="undefined"&&console.log("less: "+a)}function w(a,b){var c="less-error-message:"+q(b),e='<li><label>{line}</label><pre class="{class}">{content}</pre></li>',f=document.createElement("div"),g,h,i=[],j=a.filename||b;f.id=c,f.className="less-error-message",h="<h3>"+(a.message||"There is an error in your .less file")+"</h3>"+'<p>in <a href="'+j+'">'+j+"</a> ";var k=function(a,b,c){a.extract[b]&&i.push(e.replace(/\{line\}/,parseInt(a.line)+(b-1)).replace(/\{class\}/,c).replace(/\{content\}/,a.extract[b]))};a.stack?h+="<br/>"+a.stack.split("\n").slice(1).join("<br/>"):a.extract&&(k(a,0,""),k(a,1,"line"),k(a,2,""),h+="on line "+a.line+", column "+(a.column+1)+":</p>"+"<ul>"+i.join("")+"</ul>"),f.innerHTML=h,r([".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),f.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),d.env=="development"&&(g=setInterval(function(){document.body&&(document.getElementById(c)?document.body.replaceChild(f,document.getElementById(c)):document.body.insertBefore(f,document.body.firstChild),clearInterval(g))},10))}Array.isArray||(Array.isArray=function(a){return Object.prototype.toString.call(a)==="[object Array]"||a instanceof Array}),Array.prototype.forEach||(Array.prototype.forEach=function(a,b){var c=this.length>>>0;for(var d=0;d<c;d++)d in this&&a.call(b,this[d],d,this)}),Array.prototype.map||(Array.prototype.map=function(a){var b=this.length>>>0,c=new Array(b),d=arguments[1];for(var e=0;e<b;e++)e in this&&(c[e]=a.call(d,this[e],e,this));return c}),Array.prototype.filter||(Array.prototype.filter=function(a){var b=[],c=arguments[1];for(var d=0;d<this.length;d++)a.call(c,this[d])&&b.push(this[d]);return b}),Array.prototype.reduce||(Array.prototype.reduce=function(a){var b=this.length>>>0,c=0;if(b===0&&arguments.length===1)throw new TypeError;if(arguments.length>=2)var d=arguments[1];else do{if(c in this){d=this[c++];break}if(++c>=b)throw new TypeError}while(!0);for(;c<b;c++)c in this&&(d=a.call(null,d,this[c],c,this));return d}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){var b=this.length,c=arguments[1]||0;if(!b)return-1;if(c>=b)return-1;c<0&&(c+=b);for(;c<b;c++){if(!Object.prototype.hasOwnProperty.call(this,c))continue;if(a===this[c])return c}return-1}),Object.keys||(Object.keys=function(a){var b=[];for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&b.push(c);return b}),String.prototype.trim||(String.prototype.trim=function(){return String(this).replace(/^\s\s*/,"").replace(/\s\s*$/,"")});var d,f;typeof environment=="object"&&{}.toString.call(environment)==="[object Environment]"?(typeof a=="undefined"?d={}:d=a.less={},f=d.tree={},d.mode="rhino"):typeof a=="undefined"?(d=exports,f=c("./tree"),d.mode="node"):(typeof a.less=="undefined"&&(a.less={}),d=a.less,f=a.less.tree={},d.mode="browser"),d.Parser=function(b){function t(){j=m[i],k=h,n=h}function u(){m[i]=j,h=k,n=h}function v(){h>n&&(m[i]=m[i].slice(h-n),n=h)}function w(a){var b,c,d,e,f,j,k,l;if(a instanceof Function)return a.call(o.parsers);if(typeof a=="string")b=g.charAt(h)===a?a:null,d=1,v();else{v();if(!(b=a.exec(m[i])))return null;d=b[0].length}if(b){l=h+=d,j=h+m[i].length-d;while(h<j){e=g.charCodeAt(h);if(e!==32&&e!==10&&e!==9)break;h++}return m[i]=m[i].slice(d+(h-l)),n=h,m[i].length===0&&i<m.length-1&&i++,typeof b=="string"?b:b.length===1?b[0]:b}}function x(a,b){var c=w(a);if(!!c)return c;y(b||(typeof a=="string"?"expected '"+a+"' got '"+g.charAt(h)+"'":"unexpected token"))}function y(a,b){throw{index:h,type:b||"Syntax",message:a}}function z(a){return typeof a=="string"?g.charAt(h)===a:a.test(m[i])?!0:!1}function A(a,b){return a.filename&&b.filename&&a.filename!==b.filename?o.imports.contents[a.filename]:g}function B(a,b){for(var c=a,d=-1;c>=0&&b.charAt(c)!=="\n";c--)d++;return{line:typeof a=="number"?(b.slice(0,a).match(/\n/g)||"").length:null,column:d}}function C(a,b){var c=A(a,b),d=B(a.index,c),e=d.line,f=d.column,g=c.split("\n");this.type=a.type||"Syntax",this.message=a.message,this.filename=a.filename||b.filename,this.index=a.index,this.line=typeof e=="number"?e+1:null,this.callLine=a.call&&B(a.call,c)+1,this.callExtract=g[B(a.call,c)],this.stack=a.stack,this.column=f,this.extract=[g[e-1],g[e],g[e+1]]}var g,h,i,j,k,l,m,n,o,q=this,r=function(){},s=this.imports={paths:b&&b.paths||[],queue:[],files:{},contents:{},mime:b&&b.mime,error:null,push:function(a,c){var e=this;this.queue.push(a),d.Parser.importer(a,this.paths,function(b,d,f){e.queue.splice(e.queue.indexOf(a),1),e.files[a]=d,e.contents[a]=f,b&&!e.error&&(e.error=b),c(b,d),e.queue.length===0&&r()},b)}};return this.env=b=b||{},this.optimization="optimization"in this.env?this.env.optimization:1,this.env.filename=this.env.filename||null,o={imports:s,parse:function(a,e){var j,k,p,q,s,t,u=[],v,x=null;h=i=n=l=0,m=[],g=a.replace(/\r\n/g,"\n"),m=function(a){var c=0,d=/[^"'`\{\}\/\(\)]+/g,e=/\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g,f=0,h,i=a[0],j,k;for(var l=0,m,n;l<g.length;l++){d.lastIndex=l,(h=d.exec(g))&&h.index===l&&(l+=h[0].length,i.push(h[0])),m=g.charAt(l),e.lastIndex=l,!k&&!j&&m==="/"&&(n=g.charAt(l+1),(n==="/"||n==="*")&&(h=e.exec(g))&&h.index===l&&(l+=h[0].length,i.push(h[0]),m=g.charAt(l)));if(m==="{"&&!k&&!j)f++,i.push(m);else if(m==="}"&&!k&&!j)f--,i.push(m),a[++c]=i=[];else if(m==="("&&!k&&!j)i.push(m),j=!0;else if(m===")"&&!k&&j)i.push(m),j=!1;else{if(m==='"'||m==="'"||m==="`")k?k=k===m?!1:k:k=m;i.push(m)}}if(f>0)throw{type:"Syntax",message:"Missing closing `}`",filename:b.filename};return a.map(function(a){return a.join("")})}([[]]);try{j=new f.Ruleset([],w(this.parsers.primary)),j.root=!0}catch(y){return e(new C(y,b))}j.toCSS=function(a){var e,g,h;return function(e,g){var h=[],i;e=e||{},typeof g=="object"&&!Array.isArray(g)&&(g=Object.keys(g).map(function(a){var b=g[a];return b instanceof f.Value||(b instanceof f.Expression||(b=new f.Expression([b])),b=new f.Value([b])),new f.Rule("@"+a,b,!1,0)}),h=[new f.Ruleset(null,g)]);try{var j=a.call(this,{frames:h}).toCSS([],{compress:e.compress||!1})}catch(k){throw new C(k,b)}if(i=o.imports.error)throw i instanceof C?i:new C(i,b);return e.yuicompress&&d.mode==="node"?c("./cssmin").compressor.cssmin(j):e.compress?j.replace(/(\s)+/g,"$1"):j}}(j.eval);if(h<g.length-1){h=l,t=g.split("\n"),s=(g.slice(0,h).match(/\n/g)||"").length+1;for(var z=h,A=-1;z>=0&&g.charAt(z)!=="\n";z--)A++;x={type:"Parse",message:"Syntax Error on line "+s,index:h,filename:b.filename,line:s,column:A,extract:[t[s-2],t[s-1],t[s]]}}this.imports.queue.length>0?r=function(){e(x,j)}:e(x,j)},parsers:{primary:function(){var a,b=[];while((a=w(this.mixin.definition)||w(this.rule)||w(this.ruleset)||w(this.mixin.call)||w(this.comment)||w(this.directive))||w(/^[\s\n]+/))a&&b.push(a);return b},comment:function(){var a;if(g.charAt(h)!=="/")return;if(g.charAt(h+1)==="/")return new f.Comment(w(/^\/\/.*/),!0);if(a=w(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/))return new f.Comment(a)},entities:{quoted:function(){var a,b=h,c;g.charAt(b)==="~"&&(b++,c=!0);if(g.charAt(b)!=='"'&&g.charAt(b)!=="'")return;c&&w("~");if(a=w(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/))return new f.Quoted(a[0],a[1]||a[2],c)},keyword:function(){var a;if(a=w(/^[_A-Za-z-][_A-Za-z0-9-]*/))return f.colors.hasOwnProperty(a)?new f.Color(f.colors[a].slice(1)):new f.Keyword(a)},call:function(){var a,c,d=h;if(!(a=/^([\w-]+|%|progid:[\w\.]+)\(/.exec(m[i])))return;a=a[1].toLowerCase();if(a==="url")return null;h+=a.length;if(a==="alpha")return w(this.alpha);w("("),c=w(this.entities.arguments);if(!w(")"))return;if(a)return new f.Call(a,c,d,b.filename)},arguments:function(){var a=[],b;while(b=w(this.entities.assignment)||w(this.expression)){a.push(b);if(!w(","))break}return a},literal:function(){return w(this.entities.dimension)||w(this.entities.color)||w(this.entities.quoted)},assignment:function(){var a,b;if((a=w(/^\w+(?=\s?=)/i))&&w("=")&&(b=w(this.entity)))return new f.Assignment(a,b)},url:function(){var a;if(g.charAt(h)!=="u"||!w(/^url\(/))return;return a=w(this.entities.quoted)||w(this.entities.variable)||w(this.entities.dataURI)||w(/^[-\w%@$\/.&=:;#+?~]+/)||"",x(")"),new f.URL(a.value||a.data||a instanceof f.Variable?a:new f.Anonymous(a),s.paths)},dataURI:function(){var a;if(w(/^data:/)){a={},a.mime=w(/^[^\/]+\/[^,;)]+/)||"",a.charset=w(/^;\s*charset=[^,;)]+/)||"",a.base64=w(/^;\s*base64/)||"",a.data=w(/^,\s*[^)]+/);if(a.data)return a}},variable:function(){var a,c=h;if(g.charAt(h)==="@"&&(a=w(/^@@?[\w-]+/)))return new f.Variable(a,c,b.filename)},color:function(){var a;if(g.charAt(h)==="#"&&(a=w(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/)))return new f.Color(a[1])},dimension:function(){var a,b=g.charCodeAt(h);if(b>57||b<45||b===47)return;if(a=w(/^(-?\d*\.?\d+)(px|%|em|rem|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/))return new f.Dimension(a[1],a[2])},javascript:function(){var a,b=h,c;g.charAt(b)==="~"&&(b++,c=!0);if(g.charAt(b)!=="`")return;c&&w("~");if(a=w(/^`([^`]*)`/))return new f.JavaScript(a[1],h,c)}},variable:function(){var a;if(g.charAt(h)==="@"&&(a=w(/^(@[\w-]+)\s*:/)))return a[1]},shorthand:function(){var a,b;if(!z(/^[@\w.%-]+\/[@\w.-]+/))return;if((a=w(this.entity))&&w("/")&&(b=w(this.entity)))return new f.Shorthand(a,b)},mixin:{call:function(){var a=[],c,d,e,i=h,j=g.charAt(h),k=!1;if(j!=="."&&j!=="#")return;while(c=w(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/))a.push(new f.Element(d,c,h)),d=w(">");w("(")&&(e=w(this.entities.arguments))&&w(")"),w(this.important)&&(k=!0);if(a.length>0&&(w(";")||z("}")))return new f.mixin.Call(a,e,i,b.filename,k)},definition:function(){var a,b=[],c,d,e,i,j;if(g.charAt(h)!=="."&&g.charAt(h)!=="#"||z(/^[^{]*(;|})/))return;t();if(c=w(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)){a=c[1];while(e=w(this.entities.variable)||w(this.entities.literal)||w(this.entities.keyword)){e instanceof f.Variable?w(":")?(i=x(this.expression,"expected expression"),b.push({name:e.name,value:i})):b.push({name:e.name}):b.push({value:e});if(!w(","))break}x(")"),w(/^when/)&&(j=x(this.conditions,"expected condition")),d=w(this.block);if(d)return new f.mixin.Definition(a,b,d,j);u()}}},entity:function(){return w(this.entities.literal)||w(this.entities.variable)||w(this.entities.url)||w(this.entities.call)||w(this.entities.keyword)||w(this.entities.javascript)||w(this.comment)},end:function(){return w(";")||z("}")},alpha:function(){var a;if(!w(/^\(opacity=/i))return;if(a=w(/^\d+/)||w(this.entities.variable))return x(")"),new f.Alpha(a)},element:function(){var a,b,c,d;c=w(this.combinator),a=w(/^(?:\d+\.\d+|\d+)%/)||w(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)||w("*")||w(this.attribute)||w(/^\([^)@]+\)/),a||w("(")&&(d=w(this.entities.variable))&&w(")")&&(a=new f.Paren(d));if(a)return new f.Element(c,a,h);if(c.value&&c.value.charAt(0)==="&")return new f.Element(c,null,h)},combinator:function(){var a,b=g.charAt(h);if(b===">"||b==="+"||b==="~"){h++;while(g.charAt(h)===" ")h++;return new f.Combinator(b)}if(b==="&"){a="&",h++,g.charAt(h)===" "&&(a="& ");while(g.charAt(h)===" ")h++;return new f.Combinator(a)}if(b===":"&&g.charAt(h+1)===":"){h+=2;while(g.charAt(h)===" ")h++;return new f.Combinator("::")}return g.charAt(h-1)===" "?new f.Combinator(" "):new f.Combinator(null)},selector:function(){var a,b,c=[],d,e;while(b=w(this.element)){d=g.charAt(h),c.push(b);if(d==="{"||d==="}"||d===";"||d===",")break}if(c.length>0)return new f.Selector(c)},tag:function(){return w(/^[a-zA-Z][a-zA-Z-]*[0-9]?/)||w("*")},attribute:function(){var a="",b,c,d;if(!w("["))return;if(b=w(/^[a-zA-Z-]+/)||w(this.entities.quoted))(d=w(/^[|~*$^]?=/))&&(c=w(this.entities.quoted)||w(/^[\w-]+/))?a=[b,d,c.toCSS?c.toCSS():c].join(""):a=b;if(!w("]"))return;if(a)return"["+a+"]"},block:function(){var a;if(w("{")&&(a=w(this.primary))&&w("}"))return a},ruleset:function(){var a=[],b,c,d;t();while(b=w(this.selector)){a.push(b),w(this.comment);if(!w(","))break;w(this.comment)}if(a.length>0&&(c=w(this.block)))return new f.Ruleset(a,c);l=h,u()},rule:function(){var a,b,c=g.charAt(h),d,e;t();if(c==="."||c==="#"||c==="&")return;if(a=w(this.variable)||w(this.property)){a.charAt(0)!="@"&&(e=/^([^@+\/'"*`(;{}-]*);/.exec(m[i]))?(h+=e[0].length-1,b=new f.Anonymous(e[1])):a==="font"?b=w(this.font):b=w(this.value),d=w(this.important);if(b&&w(this.end))return new f.Rule(a,b,d,k);l=h,u()}},"import":function(){var a,b,c=h;if(w(/^@import\s+/)&&(a=w(this.entities.quoted)||w(this.entities.url))){b=w(this.mediaFeatures);if(w(";"))return new f.Import(a,s,b,c)}},mediaFeature:function(){var a=[];do if(e=w(this.entities.keyword))a.push(e);else if(w("(")){p=w(this.property),e=w(this.entity);if(!w(")"))return null;if(p&&e)a.push(new f.Paren(new f.Rule(p,e,null,h,!0)));else{if(!e)return null;a.push(new f.Paren(e))}}while(e);if(a.length>0)return new f.Expression(a)},mediaFeatures:function(){var a,b=[];while(a=w(this.mediaFeature)){b.push(a);if(!w(","))break}return b.length>0?b:null},media:function(){var a;if(w(/^(a)media/)){a=w(this.mediaFeatures);if(rules=w(this.block))return new f.Directive("@media",rules,a)}},directive:function(){var a,b,c,d,e,i;if(g.charAt(h)!=="@")return;if(b=w(this["import"])||w(this.media))return b;if(a=w(/^@page|@keyframes/)||w(/^@(?:-webkit-|-moz-|-o-|-ms-)[a-z0-9-]+/)){d=(w(/^[^{]+/)||"").trim();if(c=w(this.block))return new f.Directive(a+" "+d,c)}else if(a=w(/^@[-a-z]+/))if(a==="@font-face"){if(c=w(this.block))return new f.Directive(a,c)}else if((b=w(this.entity))&&w(";"))return new f.Directive(a,b)},font:function(){var a=[],b=[],c,d,e,g;while(g=w(this.shorthand)||w(this.entity))b.push(g);a.push(new f.Expression(b));if(w(","))while(g=w(this.expression)){a.push(g);if(!w(","))break}return new f.Value(a)},value:function(){var a,b=[],c;while(a=w(this.expression)){b.push(a);if(!w(","))break}if(b.length>0)return new f.Value(b)},important:function(){if(g.charAt(h)==="!")return w(/^! *important/)},sub:function(){var a;if(w("(")&&(a=w(this.expression))&&w(")"))return a},multiplication:function(){var a,b,c,d;if(a=w(this.operand)){while(!z(/^\/\*/)&&(c=w("/")||w("*"))&&(b=w(this.operand)))d=new f.Operation(c,[d||a,b]);return d||a}},addition:function(){var a,b,c,d;if(a=w(this.multiplication)){while((c=w(/^[-+]\s+/)||g.charAt(h-1)!=" "&&(w("+")||w("-")))&&(b=w(this.multiplication)))d=new f.Operation(c,[d||a,b]);return d||a}},conditions:function(){var a,b,c=h,d;if(a=w(this.condition)){while(w(",")&&(b=w(this.condition)))d=new f.Condition("or",d||a,b,c);return d||a}},condition:function(){var a,b,c,d,e=h,g=!1;w(/^not/)&&(g=!0),x("(");if(a=w(this.addition)||w(this.entities.keyword)||w(this.entities.quoted))return(d=w(/^(?:>=|=<|[<=>])/))?(b=w(this.addition)||w(this.entities.keyword)||w(this.entities.quoted))?c=new f.Condition(d,a,b,e,g):y("expected expression"):c=new f.Condition("=",a,new f.Keyword("true"),e,g),x(")"),w(/^and/)?new f.Condition("and",c,w(this.condition)):c},operand:function(){var a,b=g.charAt(h+1);g.charAt(h)==="-"&&(b==="@"||b==="(")&&(a=w("-"));var c=w(this.sub)||w(this.entities.dimension)||w(this.entities.color)||w(this.entities.variable)||w(this.entities.call);return a?new f.Operation("*",[new f.Dimension(-1),c]):c},expression:function(){var a,b,c=[],d;while(a=w(this.addition)||w(this.entity))c.push(a);if(c.length>0)return new f.Expression(c)},property:function(){var a;if(a=w(/^(\*?-?[-a-z_0-9]+)\s*:/))return a[1]}}}};if(d.mode==="browser"||d.mode==="rhino")d.Parser.importer=function(a,b,c,d){a.charAt(0)!=="/"&&b.length>0&&(a=b[0]+a),o({href:a,title:a,type:d.mime},c,!0)};(function(a){function b(b){return a.functions.hsla(b.h,b.s,b.l,b.a)}function c(b){if(b instanceof a.Dimension)return parseFloat(b.unit=="%"?b.value/100:b.value);if(typeof b=="number")return b;throw{error:"RuntimeError",message:"color functions take numbers as parameters"}}function d(a){return Math.min(1,Math.max(0,a))}a.functions={rgb:function(a,b,c){return this.rgba(a,b,c,1)},rgba:function(b,d,e,f){var g=[b,d,e].map(function(a){return c(a)}),f=c(f);return new a.Color(g,f)},hsl:function(a,b,c){return this.hsla(a,b,c,1)},hsla:function(a,b,d,e){function h(a){return a=a<0?a+1:a>1?a-1:a,a*6<1?g+(f-g)*a*6:a*2<1?f:a*3<2?g+(f-g)*(2/3-a)*6:g}a=c(a)%360/360,b=c(b),d=c(d),e=c(e);var f=d<=.5?d*(b+1):d+b-d*b,g=d*2-f;return this.rgba(h(a+1/3)*255,h(a)*255,h(a-1/3)*255,e)},hue:function(b){return new a.Dimension(Math.round(b.toHSL().h))},saturation:function(b){return new a.Dimension(Math.round(b.toHSL().s*100),"%")},lightness:function(b){return new a.Dimension(Math.round(b.toHSL().l*100),"%")},alpha:function(b){return new a.Dimension(b.toHSL().a)},saturate:function(a,c){var e=a.toHSL();return e.s+=c.value/100,e.s=d(e.s),b(e)},desaturate:function(a,c){var e=a.toHSL();return e.s-=c.value/100,e.s=d(e.s),b(e)},lighten:function(a,c){var e=a.toHSL();return e.l+=c.value/100,e.l=d(e.l),b(e)},darken:function(a,c){var e=a.toHSL();return e.l-=c.value/100,e.l=d(e.l),b(e)},fadein:function(a,c){var e=a.toHSL();return e.a+=c.value/100,e.a=d(e.a),b(e)},fadeout:function(a,c){var e=a.toHSL();return e.a-=c.value/100,e.a=d(e.a),b(e)},fade:function(a,c){var e=a.toHSL();return e.a=c.value/100,e.a=d(e.a),b(e)},spin:function(a,c){var d=a.toHSL(),e=(d.h+c.value)%360;return d.h=e<0?360+e:e,b(d)},mix:function(b,c,d){var e=d.value/100,f=e*2-1,g=b.toHSL().a-c.toHSL().a,h=((f*g==-1?f:(f+g)/(1+f*g))+1)/2,i=1-h,j=[b.rgb[0]*h+c.rgb[0]*i,b.rgb[1]*h+c.rgb[1]*i,b.rgb[2]*h+c.rgb[2]*i],k=b.alpha*e+c.alpha*(1-e);return new a.Color(j,k)},greyscale:function(b){return this.desaturate(b,new a.Dimension(100))},e:function(b){return new a.Anonymous(b instanceof a.JavaScript?b.evaluated:b)},escape:function(b){return new a.Anonymous(encodeURI(b.value).replace(/=/g,"%3D").replace(/:/g,"%3A").replace(/#/g,"%23").replace(/;/g,"%3B").replace(/\(/g,"%28").replace(/\)/g,"%29"))},"%":function(b){var c=Array.prototype.slice.call(arguments,1),d=b.value;for(var e=0;e<c.length;e++)d=d.replace(/%[sda]/i,function(a){var b=a.match(/s/i)?c[e].value:c[e].toCSS();return a.match(/[A-Z]$/)?encodeURIComponent(b):b});return d=d.replace(/%%/g,"%"),new a.Quoted('"'+d+'"',d)},round:function(a){return this._math("round",a)},ceil:function(a){return this._math("ceil",a)},floor:function(a){return this._math("floor",a)},_math:function(b,d){if(d instanceof a.Dimension)return new a.Dimension(Math[b](c(d)),d.unit);if(typeof d=="number")return Math[b](d);throw{type:"Argument",message:"argument must be a number"}},argb:function(b){return new a.Anonymous(b.toARGB())},percentage:function(b){return new a.Dimension(b.value*100,"%")},color:function(b){if(b instanceof a.Quoted)return new a.Color(b.value.slice(1));throw{type:"Argument",message:"argument must be a string"}},iscolor:function(b){return this._isa(b,a.Color)},isnumber:function(b){return this._isa(b,a.Dimension)},isstring:function(b){return this._isa(b,a.Quoted)},iskeyword:function(b){return this._isa(b,a.Keyword)},isurl:function(b){return this._isa(b,a.URL)},ispixel:function(b){return b instanceof a.Dimension&&b.unit==="px"?a.True:a.False},ispercentage:function(b){return b instanceof a.Dimension&&b.unit==="%"?a.True:a.False},isem:function(b){return b instanceof a.Dimension&&b.unit==="em"?a.True:a.False},_isa:function(b,c){return b instanceof c?a.True:a.False}}})(c("./tree")),function(a){a.colors={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"}}(c("./tree")),function(a){a.Alpha=function(a){this.value=a},a.Alpha.prototype={toCSS:function(){return"alpha(opacity="+(this.value.toCSS?this.value.toCSS():this.value)+")"},eval:function(a){return this.value.eval&&(this.value=this.value.eval(a)),this}}}(c("../tree")),function(a){a.Anonymous=function(a){this.value=a.value||a},a.Anonymous.prototype={toCSS:function(){return this.value},eval:function(){return this}}}(c("../tree")),function(a){a.Assignment=function(a,b){this.key=a,this.value=b},a.Assignment.prototype={toCSS:function(){return this.key+"="+(this.value.toCSS?this.value.toCSS():this.value)},eval:function(a){return this.value.eval&&(this.value=this.value.eval(a)),this}}}(c("../tree")),function(a){a.Call=function(a,b,c,d){this.name=a,this.args=b,this.index=c,this.filename=d},a.Call.prototype={eval:function(b){var c=this.args.map(function(a){return a.eval(b)});if(!(this.name in a.functions))return new a.Anonymous(this.name+"("+c.map(function(a){return a.toCSS()}).join(", ")+")");try{return a.functions[this.name].apply(a.functions,c)}catch(d){throw{type:d.type||"Runtime",message:"error evaluating function `"+this.name+"`"+(d.message?": "+d.message:""),index:this.index,filename:this.filename}}},toCSS:function(a){return this.eval(a).toCSS()}}}(c("../tree")),function(a){a.Color=function(a,b){Array.isArray(a)?this.rgb=a:a.length==6?this.rgb=a.match(/.{2}/g).map(function(a){return parseInt(a,16)}):this.rgb=a.split("").map(function(a){return parseInt(a+a,16)}),this.alpha=typeof b=="number"?b:1},a.Color.prototype={eval:function(){return this},toCSS:function(){return this.alpha<1?"rgba("+this.rgb.map(function(a){return Math.round(a)}).concat(this.alpha).join(", ")+")":"#"+this.rgb.map(function(a){return a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16),a.length===1?"0"+a:a}).join("")},operate:function(b,c){var d=[];c instanceof a.Color||(c=c.toColor());for(var e=0;e<3;e++)d[e]=a.operate(b,this.rgb[e],c.rgb[e]);return new a.Color(d,this.alpha+c.alpha)},toHSL:function(){var a=this.rgb[0]/255,b=this.rgb[1]/255,c=this.rgb[2]/255,d=this.alpha,e=Math.max(a,b,c),f=Math.min(a,b,c),g,h,i=(e+f)/2,j=e-f;if(e===f)g=h=0;else{h=i>.5?j/(2-e-f):j/(e+f);switch(e){case a:g=(b-c)/j+(b<c?6:0);break;case b:g=(c-a)/j+2;break;case c:g=(a-b)/j+4}g/=6}return{h:g*360,s:h,l:i,a:d}},toARGB:function(){var a=[Math.round(this.alpha*255)].concat(this.rgb);return"#"+a.map(function(a){return a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16),a.length===1?"0"+a:a}).join("")}}}(c("../tree")),function(a){a.Comment=function(a,b){this.value=a,this.silent=!!b},a.Comment.prototype={toCSS:function(a){return a.compress?"":this.value},eval:function(){return this}}}(c("../tree")),function(a){a.Condition=function(a,b,c,d,e){this.op=a.trim(),this.lvalue=b,this.rvalue=c,this.index=d,this.negate=e},a.Condition.prototype.eval=function(a){var b=this.lvalue.eval(a),c=this.rvalue.eval(a),d=this.index,e,e=function(a){switch(a){case"and":return b&&c;case"or":return b||c;default:if(b.compare)e=b.compare(c);else{if(!c.compare)throw{type:"Type",message:"Unable to perform comparison",index:d};e=c.compare(b)}switch(e){case-1:return a==="<"||a==="=<";case 0:return a==="="||a===">="||a==="=<";case 1:return a===">"||a===">="}}}(this.op);return this.negate?!e:e}}(c("../tree")),function(a){a.Dimension=function(a,b){this.value=parseFloat(a),this.unit=b||null},a.Dimension.prototype={eval:function(){return this},toColor:function(){return new a.Color([this.value,this.value,this.value])},toCSS:function(){var a=this.value+this.unit;return a},operate:function(b,c){return new a.Dimension(a.operate(b,this.value,c.value),this.unit||c.unit)},compare:function(b){return b instanceof a.Dimension?b.value>this.value?-1:b.value<this.value?1:0:-1}}}(c("../tree")),function(a){a.Directive=function(b,c,d){this.name=b,this.features=d&&new a.Value(d),Array.isArray(c)?(this.ruleset=new a.Ruleset([],c),this.ruleset.allowImports=!0):this.value=c},a.Directive.prototype={toCSS:function(a,b){var c=this.features?" "+this.features.toCSS(b):"";return this.ruleset?(this.ruleset.root=!0,this.name+c+(b.compress?"{":" {\n ")+this.ruleset.toCSS(a,b).trim().replace(/\n/g,"\n ")+(b.compress?"}":"\n}\n")):this.name+" "+this.value.toCSS()+";\n"},eval:function(a){return this.features=this.features&&this.features.eval(a),a.frames.unshift(this),this.ruleset=this.ruleset&&this.ruleset.eval(a),a.frames.shift(),this},variable:function(b){return a.Ruleset.prototype.variable.call(this.ruleset,b)},find:function(){return a.Ruleset.prototype.find.apply(this.ruleset,arguments)},rulesets:function(){return a.Ruleset.prototype.rulesets.apply(this.ruleset)}}}(c("../tree")),function(a){a.Element=function(b,c,d){this.combinator=b instanceof a.Combinator?b:new a.Combinator(b),typeof c=="string"?this.value=c.trim():c?this.value=c:this.value="",this.index=d},a.Element.prototype.eval=function(b){return new a.Element(this.combinator,this.value.eval?this.value.eval(b):this.value,this.index)},a.Element.prototype.toCSS=function(a){return this.combinator.toCSS(a||{})+(this.value.toCSS?this.value.toCSS(a):this.value)},a.Combinator=function(a){a===" "?this.value=" ":a==="& "?this.value="& ":this.value=a?a.trim():""},a.Combinator.prototype.toCSS=function(a){return{"":""," ":" ","&":"","& ":" ",":":" :","::":"::","+":a.compress?"+":" + ","~":a.compress?"~":" ~ ",">":a.compress?">":" > "}[this.value]}}(c("../tree")),function(a){a.Expression=function(a){this.value=a},a.Expression.prototype={eval:function(b){return this.value.length>1?new a.Expression(this.value.map(function(a){return a.eval(b)})):this.value.length===1?this.value[0].eval(b):this},toCSS:function(a){return this.value.map(function(b){return b.toCSS?b.toCSS(a):""}).join(" ")}}}(c("../tree")),function(a){a.Import=function(b,c,d,e){var f=this;this.index=e,this._path=b,this.features=d&&new a.Value(d),b instanceof a.Quoted?this.path=/\.(le?|c)ss(\?.*)?$/.test(b.value)?b.value:b.value+".less":this.path=b.value.value||b.value,this.css=/css(\?.*)?$/.test(this.path),this.css||c.push(this.path,function(b,c){b&&(b.index=e),f.root=c||new a.Ruleset([],[])})},a.Import.prototype={toCSS:function(a){var b=this.features?" "+this.features.toCSS(a):"";return this.css?"@import "+this._path.toCSS()+b+";\n":""},eval:function(b){var c,d=this.features&&this.features.eval(b);if(this.css)return this;c=new a.Ruleset([],this.root.rules.slice(0));for(var e=0;e<c.rules.length;e++)c.rules[e]instanceof a.Import&&Array.prototype.splice.apply(c.rules,[e,1].concat(c.rules[e].eval(b)));return this.features?new a.Directive("@media",c.rules,this.features.value):c.rules}}}(c("../tree")),function(a){a.JavaScript=function(a,b,c){this.escaped=c,this.expression=a,this.index=b},a.JavaScript.prototype={eval:function(b){var c,d=this,e={},f=this.expression.replace(/@\{([\w-]+)\}/g,function(c,e){return a.jsify((new a.Variable("@"+e,d.index)).eval(b))});try{f=new Function("return ("+f+")")}catch(g){throw{message:"JavaScript evaluation error: `"+
+f+"`",index:this.index}}for(var h in b.frames[0].variables())e[h.slice(1)]={value:b.frames[0].variables()[h].value,toJS:function(){return this.value.eval(b).toCSS()}};try{c=f.call(e)}catch(g){throw{message:"JavaScript evaluation error: '"+g.name+": "+g.message+"'",index:this.index}}return typeof c=="string"?new a.Quoted('"'+c+'"',c,this.escaped,this.index):Array.isArray(c)?new a.Anonymous(c.join(", ")):new a.Anonymous(c)}}}(c("../tree")),function(a){a.Keyword=function(a){this.value=a},a.Keyword.prototype={eval:function(){return this},toCSS:function(){return this.value},compare:function(b){return b instanceof a.Keyword?b.value===this.value?0:1:-1}},a.True=new a.Keyword("true"),a.False=new a.Keyword("false")}(c("../tree")),function(a){a.mixin={},a.mixin.Call=function(b,c,d,e,f){this.selector=new a.Selector(b),this.arguments=c,this.index=d,this.filename=e,this.important=f},a.mixin.Call.prototype={eval:function(a){var b,c,d=[],e=!1;for(var f=0;f<a.frames.length;f++)if((b=a.frames[f].find(this.selector)).length>0){c=this.arguments&&this.arguments.map(function(b){return b.eval(a)});for(var g=0;g<b.length;g++)if(b[g].match(c,a))try{Array.prototype.push.apply(d,b[g].eval(a,this.arguments,this.important).rules),e=!0}catch(h){throw{message:h.message,index:h.index,filename:this.filename,stack:h.stack,call:this.index}}if(e)return d;throw{type:"Runtime",message:"No matching definition was found for `"+this.selector.toCSS().trim()+"("+this.arguments.map(function(a){return a.toCSS()}).join(", ")+")`",index:this.index,filename:this.filename}}throw{type:"Name",message:this.selector.toCSS().trim()+" is undefined",index:this.index,filename:this.filename}}},a.mixin.Definition=function(b,c,d,e){this.name=b,this.selectors=[new a.Selector([new a.Element(null,b)])],this.params=c,this.condition=e,this.arity=c.length,this.rules=d,this._lookups={},this.required=c.reduce(function(a,b){return!b.name||b.name&&!b.value?a+1:a},0),this.parent=a.Ruleset.prototype,this.frames=[]},a.mixin.Definition.prototype={toCSS:function(){return""},variable:function(a){return this.parent.variable.call(this,a)},variables:function(){return this.parent.variables.call(this)},find:function(){return this.parent.find.apply(this,arguments)},rulesets:function(){return this.parent.rulesets.apply(this)},evalParams:function(b,c){var d=new a.Ruleset(null,[]);for(var e=0,f;e<this.params.length;e++)if(this.params[e].name){if(!(f=c&&c[e]||this.params[e].value))throw{type:"Runtime",message:"wrong number of arguments for "+this.name+" ("+c.length+" for "+this.arity+")"};d.rules.unshift(new a.Rule(this.params[e].name,f.eval(b)))}return d},eval:function(b,c,d){var e=this.evalParams(b,c),f,g=[],h;for(var i=0;i<Math.max(this.params.length,c&&c.length);i++)g.push(c[i]||this.params[i].value);return e.rules.unshift(new a.Rule("@arguments",(new a.Expression(g)).eval(b))),h=d?this.rules.map(function(b){return new a.Rule(b.name,b.value,"!important",b.index)}):this.rules.slice(0),(new a.Ruleset(null,h)).eval({frames:[this,e].concat(this.frames,b.frames)})},match:function(a,b){var c=a&&a.length||0,d,e;if(c<this.required)return!1;if(this.required>0&&c>this.params.length)return!1;if(this.condition&&!this.condition.eval({frames:[this.evalParams(b,a)].concat(b.frames)}))return!1;d=Math.min(c,this.arity);for(var f=0;f<d;f++)if(!this.params[f].name&&a[f].eval(b).toCSS()!=this.params[f].value.eval(b).toCSS())return!1;return!0}}}(c("../tree")),function(a){a.Operation=function(a,b){this.op=a.trim(),this.operands=b},a.Operation.prototype.eval=function(b){var c=this.operands[0].eval(b),d=this.operands[1].eval(b),e;if(c instanceof a.Dimension&&d instanceof a.Color){if(this.op!=="*"&&this.op!=="+")throw{name:"OperationError",message:"Can't substract or divide a color from a number"};e=d,d=c,c=e}return c.operate(this.op,d)},a.operate=function(a,b,c){switch(a){case"+":return b+c;case"-":return b-c;case"*":return b*c;case"/":return b/c}}}(c("../tree")),function(a){a.Paren=function(a){this.value=a},a.Paren.prototype={toCSS:function(a){return"("+this.value.toCSS(a)+")"},eval:function(b){return new a.Paren(this.value.eval(b))}}}(c("../tree")),function(a){a.Quoted=function(a,b,c,d){this.escaped=c,this.value=b||"",this.quote=a.charAt(0),this.index=d},a.Quoted.prototype={toCSS:function(){return this.escaped?this.value:this.quote+this.value+this.quote},eval:function(b){var c=this,d=this.value.replace(/`([^`]+)`/g,function(d,e){return(new a.JavaScript(e,c.index,!0)).eval(b).value}).replace(/@\{([\w-]+)\}/g,function(d,e){var f=(new a.Variable("@"+e,c.index)).eval(b);return"value"in f?f.value:f.toCSS()});return new a.Quoted(this.quote+d+this.quote,d,this.escaped,this.index)}}}(c("../tree")),function(a){a.Rule=function(b,c,d,e,f){this.name=b,this.value=c instanceof a.Value?c:new a.Value([c]),this.important=d?" "+d.trim():"",this.index=e,this.inline=f||!1,b.charAt(0)==="@"?this.variable=!0:this.variable=!1},a.Rule.prototype.toCSS=function(a){return this.variable?"":this.name+(a.compress?":":": ")+this.value.toCSS(a)+this.important+(this.inline?"":";")},a.Rule.prototype.eval=function(b){return new a.Rule(this.name,this.value.eval(b),this.important,this.index,this.inline)},a.Shorthand=function(a,b){this.a=a,this.b=b},a.Shorthand.prototype={toCSS:function(a){return this.a.toCSS(a)+"/"+this.b.toCSS(a)},eval:function(){return this}}}(c("../tree")),function(a){a.Ruleset=function(a,b){this.selectors=a,this.rules=b,this._lookups={}},a.Ruleset.prototype={eval:function(b){var c=this.selectors&&this.selectors.map(function(a){return a.eval(b)}),d=new a.Ruleset(c,this.rules.slice(0));d.root=this.root,d.allowImports=this.allowImports,b.frames.unshift(d);if(d.root||d.allowImports)for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.Import&&Array.prototype.splice.apply(d.rules,[e,1].concat(d.rules[e].eval(b)));for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.mixin.Definition&&(d.rules[e].frames=b.frames.slice(0));for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.mixin.Call&&Array.prototype.splice.apply(d.rules,[e,1].concat(d.rules[e].eval(b)));for(var e=0,f;e<d.rules.length;e++)f=d.rules[e],f instanceof a.mixin.Definition||(d.rules[e]=f.eval?f.eval(b):f);return b.frames.shift(),d},match:function(a){return!a||a.length===0},variables:function(){return this._variables?this._variables:this._variables=this.rules.reduce(function(b,c){return c instanceof a.Rule&&c.variable===!0&&(b[c.name]=c),b},{})},variable:function(a){return this.variables()[a]},rulesets:function(){return this._rulesets?this._rulesets:this._rulesets=this.rules.filter(function(b){return b instanceof a.Ruleset||b instanceof a.mixin.Definition})},find:function(b,c){c=c||this;var d=[],e,f,g=b.toCSS();return g in this._lookups?this._lookups[g]:(this.rulesets().forEach(function(e){if(e!==c)for(var g=0;g<e.selectors.length;g++)if(f=b.match(e.selectors[g])){b.elements.length>e.selectors[g].elements.length?Array.prototype.push.apply(d,e.find(new a.Selector(b.elements.slice(1)),c)):d.push(e);break}}),this._lookups[g]=d)},toCSS:function(b,c){var d=[],e=[],f=[],g=[],h,i;this.root||(b.length===0?g=this.selectors.map(function(a){return[a]}):this.joinSelectors(g,b,this.selectors));for(var j=0;j<this.rules.length;j++)i=this.rules[j],i.rules||i instanceof a.Directive?f.push(i.toCSS(g,c)):i instanceof a.Comment?i.silent||(this.root?f.push(i.toCSS(c)):e.push(i.toCSS(c))):i.toCSS&&!i.variable?e.push(i.toCSS(c)):i.value&&!i.variable&&e.push(i.value.toString());return f=f.join(""),this.root?d.push(e.join(c.compress?"":"\n")):e.length>0&&(h=g.map(function(a){return a.map(function(a){return a.toCSS(c)}).join("").trim()}).join(c.compress?",":g.length>3?",\n":", "),d.push(h,(c.compress?"{":" {\n ")+e.join(c.compress?"":"\n ")+(c.compress?"}":"\n}\n"))),d.push(f),d.join("")+(c.compress?"\n":"")},joinSelectors:function(a,b,c){for(var d=0;d<c.length;d++)this.joinSelector(a,b,c[d])},joinSelector:function(b,c,d){var e=[],f=[],g=[],h=[],i=!1,j;for(var k=0;k<d.elements.length;k++)j=d.elements[k],j.combinator.value.charAt(0)==="&"&&(i=!0),i?h.push(j):g.push(j);i||(h=g,g=[]),g.length>0&&e.push(new a.Selector(g)),h.length>0&&f.push(new a.Selector(h));for(var l=0;l<c.length;l++)b.push(e.concat(c[l]).concat(f))}}}(c("../tree")),function(a){a.Selector=function(a){this.elements=a,this.elements[0].combinator.value===""&&(this.elements[0].combinator.value=" ")},a.Selector.prototype.match=function(a){var b=this.elements.length,c=a.elements.length,d=Math.min(b,c);if(b<c)return!1;for(var e=0;e<d;e++)if(this.elements[e].value!==a.elements[e].value)return!1;return!0},a.Selector.prototype.eval=function(b){return new a.Selector(this.elements.map(function(a){return a.eval(b)}))},a.Selector.prototype.toCSS=function(a){return this._css?this._css:this._css=this.elements.map(function(b){return typeof b=="string"?" "+b.trim():b.toCSS(a)}).join("")}}(c("../tree")),function(b){b.URL=function(b,c){b.data?this.attrs=b:(typeof a!="undefined"&&!/^(?:https?:\/\/|file:\/\/|data:|\/)/.test(b.value)&&c.length>0&&(b.value=c[0]+(b.value.charAt(0)==="/"?b.value.slice(1):b.value)),this.value=b,this.paths=c)},b.URL.prototype={toCSS:function(){return"url("+(this.attrs?"data:"+this.attrs.mime+this.attrs.charset+this.attrs.base64+this.attrs.data:this.value.toCSS())+")"},eval:function(a){return this.attrs?this:new b.URL(this.value.eval(a),this.paths)}}}(c("../tree")),function(a){a.Value=function(a){this.value=a,this.is="value"},a.Value.prototype={eval:function(b){return this.value.length===1?this.value[0].eval(b):new a.Value(this.value.map(function(a){return a.eval(b)}))},toCSS:function(a){return this.value.map(function(b){return b.toCSS(a)}).join(a.compress?",":", ")}}}(c("../tree")),function(a){a.Variable=function(a,b,c){this.name=a,this.index=b,this.file=c},a.Variable.prototype={eval:function(b){var c,d,e=this.name;e.indexOf("@@")==0&&(e="@"+(new a.Variable(e.slice(1))).eval(b).value);if(c=a.find(b.frames,function(a){if(d=a.variable(e))return d.value.eval(b)}))return c;throw{type:"Name",message:"variable "+e+" is undefined",filename:this.file,index:this.index}}}}(c("../tree")),function(a){a.find=function(a,b){for(var c=0,d;c<a.length;c++)if(d=b.call(a,a[c]))return d;return null},a.jsify=function(a){return Array.isArray(a.value)&&a.value.length>1?"["+a.value.map(function(a){return a.toCSS(!1)}).join(", ")+"]":a.toCSS(!1)}}(c("./tree"));var g=location.protocol==="file:"||location.protocol==="chrome:"||location.protocol==="chrome-extension:"||location.protocol==="resource:";d.env=d.env||(location.hostname=="127.0.0.1"||location.hostname=="0.0.0.0"||location.hostname=="localhost"||location.port.length>0||g?"development":"production"),d.async=!1,d.poll=d.poll||(g?1e3:1500),d.watch=function(){return this.watchMode=!0},d.unwatch=function(){return this.watchMode=!1},d.env==="development"?(d.optimization=0,/!watch/.test(location.hash)&&d.watch(),d.watchTimer=setInterval(function(){d.watchMode&&n(function(a,b,c,d,e){b&&r(b.toCSS(),d,e.lastModified)})},d.poll)):d.optimization=3;var h;try{h=typeof a.localStorage=="undefined"?null:a.localStorage}catch(i){h=null}var j=document.getElementsByTagName("link"),k=/^text\/(x-)?less$/;d.sheets=[];for(var l=0;l<j.length;l++)(j[l].rel==="stylesheet/less"||j[l].rel.match(/stylesheet/)&&j[l].type.match(k))&&d.sheets.push(j[l]);d.refresh=function(a){var b,c;b=c=new Date,n(function(a,d,e,f,g){g.local?v("loading "+f.href+" from cache."):(v("parsed "+f.href+" successfully."),r(d.toCSS(),f,g.lastModified)),v("css for "+f.href+" generated in "+(new Date-c)+"ms"),g.remaining===0&&v("css generated in "+(new Date-b)+"ms"),c=new Date},a),m()},d.refreshStyles=m,d.refresh(d.env==="development")})(window);
\ No newline at end of file
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2012-01-04 17:21:03 UTC (rev 134)
+++ trunk/pom.xml 2012-04-23 13:11:43 UTC (rev 135)
@@ -19,7 +19,7 @@
<modules>
<module>chorem-entities</module>
- <module>chorem-web</module>
+ <module>chorem-webmotion</module>
</modules>
<name>chorem</name>
@@ -56,11 +56,13 @@
<platform>chorem.org</platform>
<projectId>chorem</projectId>
- <eugenePluginVersion>2.4.1-SNAPSHOT</eugenePluginVersion>
- <nuitonUtilsVersion>2.3</nuitonUtilsVersion>
- <nuitonWebVersion>1.3</nuitonWebVersion>
+ <opencsvVersion>2.4-SNAPSHOT</opencsvVersion>
+ <processPluginVersion>1.1</processPluginVersion>
+ <eugenePluginVersion>2.4.2</eugenePluginVersion>
+ <nuitonUtilsVersion>2.4.4</nuitonUtilsVersion>
+ <nuitonWebVersion>1.7</nuitonWebVersion>
<nuitonI18nVersion>2.3.1</nuitonI18nVersion>
- <wikittyVersion>3.3-SNAPSHOT</wikittyVersion>
+ <wikittyVersion>3.7-SNAPSHOT</wikittyVersion>
<slf4jVersion>1.6.1</slf4jVersion>
<struts2Version>2.2.3</struts2Version>
<struts2jqueryVersion>3.2.0</struts2jqueryVersion>
@@ -69,6 +71,8 @@
<servletApiVersion>2.5</servletApiVersion>
<jspApiVersion>2.0</jspApiVersion>
<h2Version>1.2.134</h2Version>
+ <webmotionVersion>2.1</webmotionVersion>
+ <jstlVersion>1.2</jstlVersion>
<!-- license to use -->
<license.licenseName>agpl_v3</license.licenseName>
@@ -82,8 +86,33 @@
<dependencies>
<!-- compile dependencies -->
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ <version>11.0</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.debux.webmotion</groupId>
+ <artifactId>webmotion</artifactId>
+ <version>${webmotionVersion}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>jstl</artifactId>
+ <version>${jstlVersion}</version>
+ <scope>runtime</scope>
+ </dependency>
+
<dependency>
+ <groupId>net.sf.opencsv</groupId>
+ <artifactId>opencsv</artifactId>
+ <version>${opencsvVersion}</version>
+ </dependency>
+
+ <dependency>
<groupId>org.nuiton</groupId>
<artifactId>nuiton-utils</artifactId>
<version>${nuitonUtilsVersion}</version>
@@ -233,7 +262,14 @@
</dependencies>
</plugin>
+ <!-- processor plugin -->
<plugin>
+ <groupId>org.nuiton.processor</groupId>
+ <artifactId>maven-processor-plugin</artifactId>
+ <version>${processPluginVersion}</version>
+ </plugin>
+
+ <plugin>
<groupId>org.nuiton.eugene</groupId>
<artifactId>maven-eugene-plugin</artifactId>
<version>${eugenePluginVersion}</version>
@@ -250,4 +286,27 @@
</build>
+ <repositories>
+
+ <repository>
+ <id>wikitty-group</id>
+ <name>wikitty-group</name>
+ <url>http://nexus.nuiton.org/nexus/content/groups/wikitty/</url>
+ </repository>
+ <repository>
+ <id>debux.repo</id>
+ <name>DebuxRepository</name>
+ <url>http://debux.org/maven/repo</url>
+ </repository>
+ <repository>
+ <id>debux.snapshot</id>
+ <name>DebuxSnapshotRepository</name>
+ <url>http://debux.org/maven/snapshot</url>
+ <snapshots>
+ <enabled>true</enabled>
+ <checksumPolicy>fail</checksumPolicy>
+ </snapshots>
+ </repository>
+ </repositories>
+
</project>
1
0
Author: maven-release
Date: 2012-01-04 18:21:03 +0100 (Wed, 04 Jan 2012)
New Revision: 134
Url: http://chorem.org/repositories/revision/chorem/134
Log:
Update mavenpom4redmine to 3.0.7.
Modified:
trunk/pom.xml
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2011-11-28 22:22:52 UTC (rev 133)
+++ trunk/pom.xml 2012-01-04 17:21:03 UTC (rev 134)
@@ -10,7 +10,7 @@
<parent>
<groupId>org.nuiton</groupId>
<artifactId>mavenpom4redmine</artifactId>
- <version>3.0.6</version>
+ <version>3.0.7</version>
</parent>
<groupId>org.chorem</groupId>
1
0
Author: maven-release
Date: 2011-11-28 23:22:52 +0100 (Mon, 28 Nov 2011)
New Revision: 133
Url: http://chorem.org/repositories/revision/chorem/133
Log:
Update mavenpom4redmine to 3.0.6.
Modified:
trunk/pom.xml
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2011-11-22 17:55:19 UTC (rev 132)
+++ trunk/pom.xml 2011-11-28 22:22:52 UTC (rev 133)
@@ -10,7 +10,7 @@
<parent>
<groupId>org.nuiton</groupId>
<artifactId>mavenpom4redmine</artifactId>
- <version>3.0.5</version>
+ <version>3.0.6</version>
</parent>
<groupId>org.chorem</groupId>
1
0
Author: bpoussin
Date: 2011-11-22 18:55:19 +0100 (Tue, 22 Nov 2011)
New Revision: 132
Url: http://chorem.org/repositories/revision/chorem/132
Log:
work in progress
bonzoms a priori fonctionnel (gros menage, suppression des anciens fichiers
Added:
trunk/chorem-web/src/main/java/org/chorem/ChoremUtil.java
trunk/chorem-web/src/main/java/org/chorem/action/SelectWikittyComponentAction.java
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/common/selectWikittyComponent.jsp
trunk/chorem-web/src/main/webapp/js/
trunk/chorem-web/src/main/webapp/js/chorem.js
Removed:
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/addCompany.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/addContactDetails.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/addEmploymentContract.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/addPerson.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companyDetails.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/personDetails.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/personDetailsEmployee.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/personDetailsEmploymentContract.jsp
Modified:
trunk/chorem-entities/src/main/xmi/chorem.properties
trunk/chorem-entities/src/main/xmi/chorem.zargo
trunk/chorem-web/src/main/java/org/chorem/ChoremProxy.java
trunk/chorem-web/src/main/java/org/chorem/action/EntitySearchJsonAction.java
trunk/chorem-web/src/main/java/org/chorem/billy/action/QuotationAction.java
trunk/chorem-web/src/main/resources/i18n/chorem-web_fr_FR.properties
trunk/chorem-web/src/main/resources/struts.xml
trunk/chorem-web/src/main/webapp/WEB-INF/decorators.xml
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companies.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/menu.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/persons.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/common/inc/footer.jsp
Modified: trunk/chorem-entities/src/main/xmi/chorem.properties
===================================================================
--- trunk/chorem-entities/src/main/xmi/chorem.properties 2011-11-22 17:55:13 UTC (rev 131)
+++ trunk/chorem-entities/src/main/xmi/chorem.properties 2011-11-22 17:55:19 UTC (rev 132)
@@ -1,10 +1,15 @@
org.chorem.entities.Project.class.tagvalue.version=1.0
+org.chorem.entities.Project.class.tagvalue.toString=%Project.name|noname$s
org.chorem.entities.ProjectOrder.class.tagvalue.version=1.0
+org.chorem.entities.ProjectOrder.class.tagvalue.toString=%ProjectOrder.description|noname$s
org.chorem.entities.Task.class.tagvalue.version=1.0
+org.chorem.entities.Task.class.tagvalue.toString=%Task.name|noname$s
org.chorem.entities.Worker.class.tagvalue.version=1.0
-org.chorem.entities.Person.class.tagvalue.version=2.0
+org.chorem.entities.Person.class.tagvalue.version=3.0
+org.chorem.entities.Person.class.tagvalue.toString=%Person.lastName$s %Person.firstName|noname$s
org.chorem.entities.Interval.class.tagvalue.version=1.0
-org.chorem.entities.Company.class.tagvalue.version=1.0
+org.chorem.entities.Company.class.tagvalue.version=2.0
+org.chorem.entities.Company.class.tagvalue.toString=%Company.name|noname$s
org.chorem.entities.ContactDetails.class.tagvalue.version=1.0
org.chorem.entities.Time.class.tagvalue.version=1.0
org.chorem.entities.Employee.class.tagvalue.version=2.0
Modified: trunk/chorem-entities/src/main/xmi/chorem.zargo
===================================================================
(Binary files differ)
Modified: trunk/chorem-web/src/main/java/org/chorem/ChoremProxy.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/ChoremProxy.java 2011-11-22 17:55:13 UTC (rev 131)
+++ trunk/chorem-web/src/main/java/org/chorem/ChoremProxy.java 2011-11-22 17:55:19 UTC (rev 132)
@@ -1,5 +1,6 @@
package org.chorem;
+import java.util.ArrayList;
import java.util.List;
import org.chorem.entities.Attachment;
@@ -9,6 +10,7 @@
import org.nuiton.wikitty.WikittyProxy;
import org.nuiton.wikitty.WikittyService;
import org.nuiton.wikitty.WikittyServiceFactory;
+import org.nuiton.wikitty.entities.WikittyExtension;
import org.nuiton.wikitty.search.Criteria;
import org.nuiton.wikitty.search.PagedResult;
import org.nuiton.wikitty.search.Search;
@@ -51,6 +53,34 @@
synchronized(ChoremProxy.class) {
if (ws == null) {
ws = WikittyServiceFactory.buildWikittyService(config);
+
+ // register last entity versions in database
+ List<WikittyExtension> exts = new ArrayList<WikittyExtension>();
+
+ exts.addAll(org.chorem.entities.AttachmentAbstract.extensions);
+ exts.addAll(org.chorem.entities.CompanyAbstract.extensions);
+ exts.addAll(org.chorem.entities.ContactDetailsAbstract.extensions);
+ exts.addAll(org.chorem.entities.EmployeeAbstract.extensions);
+ exts.addAll(org.chorem.entities.EvaluationAbstract.extensions);
+ exts.addAll(org.chorem.entities.GoalAbstract.extensions);
+ exts.addAll(org.chorem.entities.IntervalAbstract.extensions);
+ exts.addAll(org.chorem.entities.InterviewAbstract.extensions);
+ exts.addAll(org.chorem.entities.InvoiceableAbstract.extensions);
+ exts.addAll(org.chorem.entities.InvoiceAbstract.extensions);
+ exts.addAll(org.chorem.entities.MissionAbstract.extensions);
+ exts.addAll(org.chorem.entities.PersonAbstract.extensions);
+ exts.addAll(org.chorem.entities.PersonSkillAbstract.extensions);
+ exts.addAll(org.chorem.entities.ProjectOrderAbstract.extensions);
+ exts.addAll(org.chorem.entities.ProjectAbstract.extensions);
+ exts.addAll(org.chorem.entities.QuotationAbstract.extensions);
+ exts.addAll(org.chorem.entities.SkillAbstract.extensions);
+ exts.addAll(org.chorem.entities.TaskAbstract.extensions);
+ exts.addAll(org.chorem.entities.TimeAbstract.extensions);
+ exts.addAll(org.chorem.entities.TouchAbstract.extensions);
+ exts.addAll(org.chorem.entities.VacationAbstract.extensions);
+ exts.addAll(org.chorem.entities.WorkerAbstract.extensions);
+
+ ws.storeExtension(null, exts);
}
}
}
Added: trunk/chorem-web/src/main/java/org/chorem/ChoremUtil.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/ChoremUtil.java (rev 0)
+++ trunk/chorem-web/src/main/java/org/chorem/ChoremUtil.java 2011-11-22 17:55:19 UTC (rev 132)
@@ -0,0 +1,33 @@
+package org.chorem;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class ChoremUtil {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(ChoremUtil.class);
+
+ static public Collection<String> toCollection(String s) {
+ Collection<String> result;
+ if (s == null) {
+ result = Collections.EMPTY_LIST;
+ } else {
+ result = Arrays.asList(StringUtils.split(s, " :,;|"));
+ }
+ return result;
+ }
+
+}
Modified: trunk/chorem-web/src/main/java/org/chorem/action/EntitySearchJsonAction.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/action/EntitySearchJsonAction.java 2011-11-22 17:55:13 UTC (rev 131)
+++ trunk/chorem-web/src/main/java/org/chorem/action/EntitySearchJsonAction.java 2011-11-22 17:55:19 UTC (rev 132)
@@ -1,5 +1,6 @@
package org.chorem.action;
+import com.opensymphony.xwork2.ActionContext;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -17,6 +18,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.interceptor.ParameterAware;
+import org.chorem.ChoremUtil;
import org.nuiton.wikitty.entities.FieldType;
import org.nuiton.wikitty.entities.Wikitty;
import org.nuiton.wikitty.entities.WikittyExtension;
@@ -74,6 +76,10 @@
static private Log log = LogFactory.getLog(EntitySearchJsonAction.class);
private static final long serialVersionUID = 1L;
+ static public EntitySearchJsonAction getAction() {
+ return (EntitySearchJsonAction)ActionContext.getContext().get(CONTEXT_ACTION_KEY);
+ }
+
//get how many rows we want to have into the grid - rowNum attribute in the grid
protected int rows = 0;
@@ -131,6 +137,7 @@
protected Map<String, String[]> parameters;
+ @Override
public String execute() {
try {
if (log.isDebugEnabled()) {
@@ -156,7 +163,7 @@
}
protected void doDelete() {
- Collection<String> ids = toCollection(id);
+ Collection<String> ids = ChoremUtil.toCollection(id);
// si l'utilisateur demande de supprimer aussi tous les objets qui ont
// ces ids comme reference, on les recherche
@@ -174,7 +181,7 @@
protected void doAdd() {
Wikitty w = new WikittyImpl();
- Collection<String> extNames = toCollection(wikittyExtension);
+ Collection<String> extNames = ChoremUtil.toCollection(wikittyExtension);
List<WikittyExtension> exts = getChoremProxy().restoreExtensionAndDependenciesLastVesion(extNames);
w.addExtension(exts);
if (StringUtils.isNotBlank(wikittyLinkFieldForRowId)
@@ -219,7 +226,7 @@
Search search = Search.query();
if (StringUtils.isNotBlank(wikittyExtension)) {
- Collection<String> col = toCollection(wikittyExtension);
+ Collection<String> col = ChoremUtil.toCollection(wikittyExtension);
search.exteq(col);
}
@@ -328,7 +335,7 @@
// TODO poussin 20111107 pas tres optimal de faire une requete a chaque besoin
// il faudrait collecter les ids, pour faire une seule demande pour tous
// mais tant que pour le deploiement, tout est sur le meme serveur
- // si un peu moins genant
+ // c'est un peu moins genant
Wikitty wlink = getChoremProxy().restore(linkId);
Map<String, Object> map = wikittyToMap(wlink);
map.remove("id");
@@ -351,7 +358,7 @@
public Set<String> getWikittyLinkToLoadCache() {
if (wikittyLinkToLoadCache == null) {
wikittyLinkToLoadCache =
- new HashSet<String>(toCollection(wikittyLinkToLoad));
+ new HashSet<String>(ChoremUtil.toCollection(wikittyLinkToLoad));
}
return wikittyLinkToLoadCache;
}
@@ -513,7 +520,7 @@
} else if ("nn".equalsIgnoreCase(op)) {
search.isNotNull(field);
} else {
- Collection<String> col = toCollection(data);
+ Collection<String> col = ChoremUtil.toCollection(data);
if ("in".equalsIgnoreCase(op)) {
search.in(field, col);
} else if ("ni".equalsIgnoreCase(op)) {
@@ -524,14 +531,4 @@
}
}
-
- protected Collection<String> toCollection(String s) {
- Collection<String> result;
- if (s == null) {
- result = Collections.EMPTY_LIST;
- } else {
- result = Arrays.asList(StringUtils.split(s, " :,;|"));
- }
- return result;
- }
}
Added: trunk/chorem-web/src/main/java/org/chorem/action/SelectWikittyComponentAction.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/action/SelectWikittyComponentAction.java (rev 0)
+++ trunk/chorem-web/src/main/java/org/chorem/action/SelectWikittyComponentAction.java 2011-11-22 17:55:19 UTC (rev 132)
@@ -0,0 +1,131 @@
+package org.chorem.action;
+
+import java.util.Collection;
+import java.util.List;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.UnhandledException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.chorem.ChoremUtil;
+import org.nuiton.wikitty.entities.Wikitty;
+import org.nuiton.wikitty.search.Criteria;
+import org.nuiton.wikitty.search.PagedResult;
+import org.nuiton.wikitty.search.Search;
+
+/**
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class SelectWikittyComponentAction extends ChoremBaseAction {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(SelectWikittyComponentAction.class);
+ private static final long serialVersionUID = 1L;
+
+ protected String wikittyExtension;
+ protected String fulltextSearch;
+ protected String sortField;
+ protected boolean asc = true;
+ protected String format;
+ protected List<Wikitty> wikitties;
+
+ @Override
+ public String execute() {
+ try {
+ Search search = Search.query();
+
+ if (StringUtils.isNotBlank(wikittyExtension)) {
+ Collection<String> col = ChoremUtil.toCollection(wikittyExtension);
+ search.exteq(col);
+ }
+
+ if (StringUtils.isNotBlank(fulltextSearch)) {
+ // TODO poussin 20111106: ca ne serait pas au like d'ajouter les * ?
+ String s = "*" + fulltextSearch + "*";
+ // TODO poussin 20111106: voir pourquoi like fontion comme on souhaite et pas Keyword :(
+ // keyword ne fonctionne pas avec les *
+ search.like("#fulltext", s);
+ } else {
+ // si pas de filtre on recherche tout
+ search.rTrue();
+ }
+
+ Criteria criteria = search.criteria();
+
+ if (StringUtils.isNotBlank(sortField)) {
+ if (asc) {
+ criteria.setSortAscending(sortField);
+ } else {
+ criteria.setSortDescending(sortField);
+ }
+ }
+
+ PagedResult<Wikitty> result = getChoremProxy().findAllByCriteria(criteria);
+
+ setWikitties(result.getAll());
+
+ if (log.isTraceEnabled()) {
+ log.trace("result: " + getWikitties());
+ }
+
+ return SUCCESS;
+ } catch (Exception eee) {
+ log.error(String.format("Can't find wikitty '%s'", wikittyExtension), eee);
+ throw new UnhandledException(eee);
+ }
+ }
+
+ public String getFormat() {
+ return format;
+ }
+
+ public void setFormat(String format) {
+ this.format = format;
+ }
+
+ public String getFulltextSearch() {
+ return fulltextSearch;
+ }
+
+ public void setFulltextSearch(String fulltextSearch) {
+ this.fulltextSearch = fulltextSearch;
+ }
+
+ public String getWikittyExtension() {
+ return wikittyExtension;
+ }
+
+ public void setWikittyExtension(String wikittyExtension) {
+ this.wikittyExtension = wikittyExtension;
+ }
+
+ public String getSortField() {
+ return sortField;
+ }
+
+ public void setSortField(String sortField) {
+ this.sortField = sortField;
+ }
+
+ public boolean isAsc() {
+ return asc;
+ }
+
+ public void setAsc(boolean asc) {
+ this.asc = asc;
+ }
+
+ public List<Wikitty> getWikitties() {
+ return wikitties;
+ }
+
+ public void setWikitties(List<Wikitty> wikitties) {
+ this.wikitties = wikitties;
+ }
+
+
+}
Modified: trunk/chorem-web/src/main/java/org/chorem/billy/action/QuotationAction.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/billy/action/QuotationAction.java 2011-11-22 17:55:13 UTC (rev 131)
+++ trunk/chorem-web/src/main/java/org/chorem/billy/action/QuotationAction.java 2011-11-22 17:55:19 UTC (rev 132)
@@ -10,7 +10,7 @@
import org.apache.commons.logging.LogFactory;
import org.chorem.ChoremProxy;
import org.chorem.action.ChoremBaseAction;
-import org.chorem.bonzoms.EmployeeFull;
+//import org.chorem.bonzoms.EmployeeFull;
import org.chorem.entities.Employee;
import org.chorem.entities.Project;
import org.chorem.entities.ProjectOrder;
@@ -54,8 +54,8 @@
protected String quotationId;
protected String supplierId;
protected String customerId;
- protected EmployeeFull customer;
- protected EmployeeFull supplier;
+// protected EmployeeFull customer;
+// protected EmployeeFull supplier;
/**
* Adds a new quotation
@@ -137,10 +137,10 @@
}
setConversionHope(String.valueOf(quotation.getConversionHope()));
setProjectId(quotation.getProject());
- setSupplier(EmployeeFull.initEmployee(quotation.getSupplier(),
- proxy));
- setCustomer(EmployeeFull.initEmployee(quotation.getCustomer(),
- proxy));
+// setSupplier(EmployeeFull.initEmployee(quotation.getSupplier(),
+// proxy));
+// setCustomer(EmployeeFull.initEmployee(quotation.getCustomer(),
+// proxy));
} else {
result = ERROR;
}
@@ -194,17 +194,17 @@
return projectOrder;
}
- public List<EmployeeFull> getAllEmployees() {
- ChoremProxy proxy = getChoremProxy();
- Search search = Search.query();
- Criteria criteria = search.exteq(Employee.EXT_EMPLOYEE).criteria();
- PagedResult<Employee> result = proxy.findAllByCriteria(Employee.class,
- criteria);
- List<Employee> employees = result.getAll();
- List<EmployeeFull> employeesFullList = EmployeeFull.
- initEmployeeFullList(employees, proxy);
- return employeesFullList;
- }
+// public List<EmployeeFull> getAllEmployees() {
+// ChoremProxy proxy = getChoremProxy();
+// Search search = Search.query();
+// Criteria criteria = search.exteq(Employee.EXT_EMPLOYEE).criteria();
+// PagedResult<Employee> result = proxy.findAllByCriteria(Employee.class,
+// criteria);
+// List<Employee> employees = result.getAll();
+// List<EmployeeFull> employeesFullList = EmployeeFull.
+// initEmployeeFullList(employees, proxy);
+// return employeesFullList;
+// }
/**
* Stores the new quotation through the proxy
@@ -503,28 +503,28 @@
/**
* @return the customer
*/
- public EmployeeFull getCustomer() {
- return customer;
- }
-
- /**
- * @param customer the customer to set
- */
- public void setCustomer(EmployeeFull customer) {
- this.customer = customer;
- }
-
- /**
- * @return the supplier
- */
- public EmployeeFull getSupplier() {
- return supplier;
- }
-
- /**
- * @param supplier the supplier to set
- */
- public void setSupplier(EmployeeFull supplier) {
- this.supplier = supplier;
- }
+// public EmployeeFull getCustomer() {
+// return customer;
+// }
+//
+// /**
+// * @param customer the customer to set
+// */
+// public void setCustomer(EmployeeFull customer) {
+// this.customer = customer;
+// }
+//
+// /**
+// * @return the supplier
+// */
+// public EmployeeFull getSupplier() {
+// return supplier;
+// }
+//
+// /**
+// * @param supplier the supplier to set
+// */
+// public void setSupplier(EmployeeFull supplier) {
+// this.supplier = supplier;
+// }
}
Modified: trunk/chorem-web/src/main/resources/i18n/chorem-web_fr_FR.properties
===================================================================
--- trunk/chorem-web/src/main/resources/i18n/chorem-web_fr_FR.properties 2011-11-22 17:55:13 UTC (rev 131)
+++ trunk/chorem-web/src/main/resources/i18n/chorem-web_fr_FR.properties 2011-11-22 17:55:19 UTC (rev 132)
@@ -29,7 +29,7 @@
chorem.bonzoms.company.city=Ville
chorem.bonzoms.company.country=Pays
chorem.bonzoms.company.employees=Liste des employ\u00E9s
-chorem.bonzoms.company.list=Obtenir la liste des soci\u00E9t\u00E9s
+chorem.bonzoms.company.list=Les soci\u00E9t\u00E9s
chorem.bonzoms.company.name=Nom de la soci\u00E9t\u00E9
chorem.bonzoms.company.phoneNb=Num\u00E9ro de t\u00E9l\u00E9phone (opt.)
chorem.bonzoms.company.postcode=Code postal
@@ -50,6 +50,7 @@
chorem.bonzoms.employee.paidLeave.wrongFormat=Les cong\u00E9s pay\u00E9s doivent \u00EAtre \u00EAtre un entier positif ou un nombre \u00E0 virgule flottante positif
chorem.bonzoms.employee.rtt=RTT
chorem.bonzoms.employee.rtt.wrongFormat=Les RTT doivent \u00EAtre \u00EAtre un entier positif ou un nombre \u00E0 virgule flottante positif
+chorem.bonzoms.employees=List des employ\u00E9s
chorem.bonzoms.employmentContract=Contrat de travail
chorem.bonzoms.employmentContract.add=Ajouter un nouveau contrat de travail
chorem.bonzoms.employmentContract.allFieldsRequired=
@@ -74,7 +75,7 @@
chorem.bonzoms.person.employmentContracts=Contrats de travail \:
chorem.bonzoms.person.firstName=Pr\u00E9nom
chorem.bonzoms.person.lastName=Nom
-chorem.bonzoms.person.list=Obtenir la liste des personnes
+chorem.bonzoms.person.list=Les personnes
chorem.bonzoms.person.phoneNb=Num\u00E9ro de t\u00E9l\u00E9phone (opt.)
chorem.bonzoms.person.postcode=Code postal
chorem.bonzoms.personDetails.title=Informations d\u00E9taill\u00E9es de "%s"
Modified: trunk/chorem-web/src/main/resources/struts.xml
===================================================================
--- trunk/chorem-web/src/main/resources/struts.xml 2011-11-22 17:55:13 UTC (rev 131)
+++ trunk/chorem-web/src/main/resources/struts.xml 2011-11-22 17:55:19 UTC (rev 132)
@@ -54,104 +54,30 @@
<default-interceptor-ref name="publicAreaStack"/>
</package>
+ <package name="ajax" namespace="/ajax" extends="publicArea">
+ <action name="EntitySearchJson" class="org.chorem.action.EntitySearchJsonAction">
+ <result type="wikitty-json"/>
+ </action>
+ <action name="selectWikittyComponent" class="org.chorem.action.SelectWikittyComponentAction">
+ <result>/WEB-INF/jsp/common/selectWikittyComponent.jsp</result>
+ </action>
+ </package>
+
<package name="chorem" namespace="/" extends="publicArea">
<default-action-ref name="home" />
<action name="home" class="org.chorem.action.HomeAction">
<result>/WEB-INF/jsp/home.jsp</result>
</action>
- <action name="EntitySearchJson" class="org.chorem.action.EntitySearchJsonAction">
- <result type="wikitty-json"/>
- </action>
</package>
<package name="bonzoms" namespace="/bonzoms" extends="publicArea">
<default-action-ref name="companies" />
- <action name="addCompanyInput">
- <result>/WEB-INF/jsp/bonzoms/addCompany.jsp</result>
- </action>
- <action name="addCompany" class="org.chorem.bonzoms.action.CompanyAction" method="add">
- <result name="input">/WEB-INF/jsp/bonzoms/addCompany.jsp</result>
- <result name="error">/WEB-INF/jsp/bonzoms/addCompany.jsp</result>
- <result type="redirectAction">home</result>
- </action>
- <action name="companyDetails" class="org.chorem.bonzoms.action.CompanyAction" method="companyDetails">
- <result name="error" type="redirectAction">home</result>
- <result>/WEB-INF/jsp/bonzoms/companyDetails.jsp</result>
- </action>
- <action name="modifyCompany" class="org.chorem.bonzoms.action.CompanyAction" method="modify">
- <result name="input">/WEB-INF/jsp/bonzoms/companyDetails.jsp</result>
- <result type="redirectAction">
- <param name="actionName">companyDetails</param>
- <param name="namespace">/bonzoms</param>
- <param name="companyId">${companyId}</param>
- </result>
- </action>
<action name="companies">
<result>/WEB-INF/jsp/bonzoms/companies.jsp</result>
</action>
- <action name="addPersonInput" class="org.chorem.bonzoms.action.PersonAction">
- <result>/WEB-INF/jsp/bonzoms/addPerson.jsp</result>
- </action>
- <action name="addPerson" class="org.chorem.bonzoms.action.PersonAction" method="add">
- <result name="input">/WEB-INF/jsp/bonzoms/addPerson.jsp</result>
- <result name="error">/WEB-INF/jsp/bonzoms/addPerson.jsp</result>
- <result type="redirectAction">
- <param name="actionName">personDetails</param>
- <param name="namespace">/bonzoms</param>
- <param name="personId">${personId}</param>
- </result>
- </action>
- <action name="personDetails" class="org.chorem.bonzoms.action.PersonAction" method="personDetails">
- <result name="error" type="redirectAction">home</result>
- <result>/WEB-INF/jsp/bonzoms/personDetails.jsp</result>
- </action>
<action name="persons" class="org.chorem.bonzoms.action.PersonAction">
<result>/WEB-INF/jsp/bonzoms/persons.jsp</result>
</action>
- <action name="modifyPerson" class="org.chorem.bonzoms.action.PersonAction" method="modify">
- <result name="input">/WEB-INF/jsp/bonzoms/personDetails.jsp</result>
- <result type="redirectAction">
- <param name="actionName">personDetails</param>
- <param name="namespace">/bonzoms</param>
- <param name="personId">${personId}</param>
- </result>
- </action>
- <action name="addContactDetailsInput">
- <result>/WEB-INF/jsp/bonzoms/addContactDetails.jsp</result>
- </action>
- <action name="addContactDetails" class="org.chorem.bonzoms.action.ContactDetailsAction" method="add">
- <result name="input">/WEB-INF/jsp/bonzoms/addContactDetails.jsp</result>
- <result name="error">/WEB-INF/jsp/bonzoms/addContactDetails.jsp</result>
- <result type="redirectAction">home</result>
- </action>
- <action name="addEmploymentContractInput" class="org.chorem.bonzoms.action.EmploymentContractAction">
- <result>/WEB-INF/jsp/bonzoms/addEmploymentContract.jsp</result>
- </action>
- <action name="addEmploymentContract" class="org.chorem.bonzoms.action.EmploymentContractAction" method="add">
- <result name="input">/WEB-INF/jsp/bonzoms/addEmploymentContract.jsp</result>
- <result name="error">/WEB-INF/jsp/bonzoms/addEmploymentContract.jsp</result>
- <result type="redirectAction">
- <param name="actionName">personDetails</param>
- <param name="namespace">/bonzoms</param>
- <param name="personId">${personId}</param>
- </result>
- </action>
- <action name="modifyEmploymentContract" class="org.chorem.bonzoms.action.EmploymentContractAction" method="modify">
- <result name="input">/WEB-INF/jsp/bonzoms/personDetailsEmploymentContract.jsp</result>
- <result type="redirectAction">
- <param name="actionName">personDetails</param>
- <param name="namespace">/bonzoms</param>
- <param name="personId">${personId}</param>
- </result>
- </action>
- <action name="modifyEmployee" class="org.chorem.bonzoms.action.EmployeeAction" method="modify">
- <result name="input">/WEB-INF/jsp/bonzoms/personDetailsEmployee.jsp</result>
- <result type="redirectAction">
- <param name="actionName">personDetails</param>
- <param name="namespace">/bonzoms</param>
- <param name="personId">${personId}</param>
- </result>
- </action>
</package>
<package name="gepeto" namespace="/gepeto" extends="publicArea">
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/decorators.xml
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/decorators.xml 2011-11-22 17:55:13 UTC (rev 131)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/decorators.xml 2011-11-22 17:55:19 UTC (rev 132)
@@ -2,6 +2,8 @@
<!-- Any urls that are excluded will never be decorated by Sitemesh -->
<excludes>
<pattern>/css/*</pattern>
+ <pattern>/js/*</pattern>
+ <pattern>/ajax/*</pattern>
</excludes>
<decorator name="billy" page="billy.jsp">
Deleted: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/addCompany.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/addCompany.jsp 2011-11-22 17:55:13 UTC (rev 131)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/addCompany.jsp 2011-11-22 17:55:19 UTC (rev 132)
@@ -1,44 +0,0 @@
-<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-<%@taglib prefix="s" uri="/struts-tags" %>
-
-<html xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
- xmlns:jsp="http://java.sun.com/JSP/Page">
- <head>
- <title><s:text name="chorem.bonzoms.company.add" /></title>
- <s:head />
- </head>
- <body>
- <h2><s:text name="chorem.bonzoms.company.add" /></h2>
- <s:actionerror />
- <s:form action="addCompany" method="post">
- <fieldset>
- <legend>
- <s:text name="chorem.bonzoms.company">
- <s:param></s:param>
- </s:text>
- </legend>
- <s:textfield key="chorem.bonzoms.company.name" name="name" labelSeparator=": " />
- <br />
- <s:textfield key="chorem.bonzoms.company.type" name="type" labelSeparator=": " />
- <br />
- <br />
- <s:textfield key="chorem.bonzoms.company.addressLine1" name="addressLine1" labelSeparator=": " />
- <br />
- <s:textfield key="chorem.bonzoms.company.addressLine2" name="addressLine2" labelSeparator=": " />
- <br />
- <s:textfield key="chorem.bonzoms.company.postcode" name="postcode" labelSeparator=": " />
- <br />
- <s:textfield key="chorem.bonzoms.company.city" name="city" labelSeparator=": " />
- <br />
- <s:textfield key="chorem.bonzoms.company.country" name="country" labelSeparator=": " />
- <br />
- <br />
- <s:textfield key="chorem.bonzoms.company.phoneNb" name="phoneNb" labelSeparator=": " />
- <br />
- <s:textfield key="chorem.bonzoms.company.website" name="website" labelSeparator=": " />
- <br />
- <s:submit key="chorem.bonzoms.company.add" name="submit" />
- </fieldset>
- </s:form>
- </body>
-</html>
Deleted: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/addContactDetails.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/addContactDetails.jsp 2011-11-22 17:55:13 UTC (rev 131)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/addContactDetails.jsp 2011-11-22 17:55:19 UTC (rev 132)
@@ -1,25 +0,0 @@
-<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-<%@taglib prefix="s" uri="/struts-tags" %>
-
-<html xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
- xmlns:jsp="http://java.sun.com/JSP/Page">
- <head>
- <title><s:text name="chorem.bonzoms.contactDetails.add" /></title>
- <s:head />
- </head>
- <body>
- <h2><s:text name="chorem.bonzoms.contactDetails.add" /></h2>
- <s:form action="addContactDetails" method="post">
- <fieldset>
- <legend><s:text name="chorem.bonzoms.contactDetails" /></legend>
- <s:textfield key="chorem.bonzoms.contactDetails.name" name="name" labelSeparator=": " />
- <br />
- <s:textfield key="chorem.bonzoms.contactDetails.type" name="type" labelSeparator=": " />
- <br />
- <s:textfield key="chorem.bonzoms.contactDetails.value" name="value" labelSeparator=": " />
- <br />
- <s:submit key="chorem.bonzoms.contactDetails.add" name="submit" />
- </fieldset>
- </s:form>
- </body>
-</html>
Deleted: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/addEmploymentContract.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/addEmploymentContract.jsp 2011-11-22 17:55:13 UTC (rev 131)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/addEmploymentContract.jsp 2011-11-22 17:55:19 UTC (rev 132)
@@ -1,39 +0,0 @@
-<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-<%@page import="org.chorem.bonzoms.action.EmploymentContractAction" %>
-<%@taglib prefix="s" uri="/struts-tags" %>
-
-<html xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
- xmlns:jsp="http://java.sun.com/JSP/Page">
- <head>
- <title><s:text name="chorem.bonzoms.employmentContract.add" /></title>
- <s:head />
- </head>
- <body>
- <h2><s:text name="chorem.bonzoms.employmentContract.add" /></h2>
- <s:actionerror />
- <s:url action="addEmploymentContract" var="addEmploymentContract">
- <s:param name="personId"><%= EmploymentContractAction.getAction().getPersonId() %></s:param>
- <s:param name="employeeId"><%= EmploymentContractAction.getAction().getEmployeeId() %></s:param>
- </s:url>
- <form action="${addEmploymentContract}" method="post">
- <fieldset>
- <legend><s:text name="chorem.bonzoms.employmentContract" /></legend>
- <s:textfield key="chorem.bonzoms.employmentContract.type" name="type" labelSeparator=": " />
- <br />
- <br />
- <s:textarea key="chorem.bonzoms.employmentContract.description" name="description" cols="50" rows="10" labelposition="top" labelSeparator=": " />
- <br />
- <br />
- <s:textfield key="chorem.bonzoms.employmentContract.salary" name="salary" labelSeparator=": " />
- <br />
- <s:textfield key="chorem.bonzoms.employmentContract.workingTime" name="workingTime" labelSeparator=": " />
- <br />
- <s:textfield key="chorem.bonzoms.employmentContract.beginDate" name="beginDate" labelSeparator=": " />
- <br />
- <s:textfield key="chorem.bonzoms.employmentContract.endDate" name="endDate" labelSeparator=": " />
- <br />
- <s:submit key="chorem.bonzoms.person.add" name="submit" />
- </fieldset>
- </form>
- </body>
-</html>
Deleted: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/addPerson.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/addPerson.jsp 2011-11-22 17:55:13 UTC (rev 131)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/addPerson.jsp 2011-11-22 17:55:19 UTC (rev 132)
@@ -1,70 +0,0 @@
-<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-<%@page import="org.chorem.bonzoms.action.PersonAction" %>
-<%@taglib prefix="s" uri="/struts-tags" %>
-
-<html xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
- xmlns:jsp="http://java.sun.com/JSP/Page">
- <head>
- <title><s:text name="chorem.bonzoms.person.add" /></title>
- <s:head />
- </head>
- <body>
- <h2><s:text name="chorem.bonzoms.person.add" /></h2>
- <s:actionerror />
- <s:form action="addPerson" method="post">
- <fieldset>
- <legend><s:text name="chorem.bonzoms.person" /></legend>
- <s:textfield key="chorem.bonzoms.person.firstName" name="firstName" labelSeparator=": " />
- <br />
- <s:textfield key="chorem.bonzoms.person.lastName" name="lastName" labelSeparator=": " />
- <br />
- <s:textfield key="chorem.bonzoms.person.email" name="email" labelSeparator=": " />
- <br />
- <s:textfield key="chorem.bonzoms.person.birthDate" name="birthDate" labelSeparator=": " size="7" />
- <br />
- <br />
- <s:textfield key="chorem.bonzoms.person.addressLine1" name="addressLine1" labelSeparator=": " />
- <br />
- <s:textfield key="chorem.bonzoms.person.addressLine2" name="addressLine2" labelSeparator=": " />
- <br />
- <s:textfield key="chorem.bonzoms.person.postcode" name="postcode" labelSeparator=": " size="5" />
- <br />
- <s:textfield key="chorem.bonzoms.person.city" name="city" labelSeparator=": " />
- <br />
- <s:textfield key="chorem.bonzoms.person.country" name="country" labelSeparator=": " />
- <br />
- <br />
- <s:textfield key="chorem.bonzoms.person.phoneNb" name="phoneNb" labelSeparator=": " size="8" />
- </fieldset>
- <br />
- <fieldset>
- <legend><s:text name="chorem.bonzoms.employee" /></legend>
- <s:textfield key="chorem.bonzoms.employee.diploma" name="employeeDiploma" labelSeparator=": " />
- <br />
- <s:textfield key="chorem.bonzoms.employee.paidLeave" name="employeePaidLeave" labelSeparator=": " />
- <br />
- <s:textfield key="chorem.bonzoms.employee.rtt" name="employeeRtt" labelSeparator=": " />
- <br />
- <s:select label="%{getText('chorem.gepeto.projectOrder.company')}" list="allCompanies" name="companyId" listKey="wikittyId" listValue="name" />
- <br />
- <fieldset>
- <legend><s:text name="chorem.bonzoms.employmentContract" /></legend>
- <s:textfield key="chorem.bonzoms.employmentContract.type" name="contractType" labelSeparator=": " />
- <br />
- <br />
- <s:textarea key="chorem.bonzoms.employmentContract.description" name="contractDescription" rows="10" cols="50" labelposition="top" />
- <br />
- <s:textfield key="chorem.bonzoms.employmentContract.salary" name="contractSalary" labelSeparator=": " size="4" />
- <br />
- <s:textfield key="chorem.bonzoms.employmentContract.workingTime" name="contractWorkingTime" labelSeparator=": " size="1" />
- <br />
- <s:textfield key="chorem.bonzoms.employmentContract.beginDate" name="contractBeginDate" labelSeparator=": " size="7" />
- <br />
- <s:textfield key="chorem.bonzoms.employmentContract.endDate" name="contractEndDate" labelSeparator=": " size="7" />
- </fieldset>
- </fieldset>
- <br />
- <s:submit key="chorem.bonzoms.person.add" name="submit" />
- </s:form>
- </body>
-</html>
\ No newline at end of file
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companies.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companies.jsp 2011-11-22 17:55:13 UTC (rev 131)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companies.jsp 2011-11-22 17:55:19 UTC (rev 132)
@@ -1,8 +1,6 @@
<%@page import="org.apache.commons.lang.StringUtils"%>
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@page import="java.util.List" %>
-<%@page import="org.chorem.entities.Company" %>
-<%@page import="org.chorem.bonzoms.action.CompanyAction" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<%@taglib prefix="sj" uri="/struts-jquery-tags"%>
<%@taglib prefix="sjg" uri="/struts-jquery-grid-tags"%>
@@ -13,7 +11,6 @@
<title><s:text name="chorem.bonzoms.companies" /></title>
</head>
<body>
- <h2><s:text name="chorem.bonzoms.companies" /></h2>
<s:url id="companyDetails" namespace="/bonzoms" action="companyDetails"/>
<script type="text/javascript">
@@ -34,47 +31,45 @@
<%-- Partie generique (ou presque, ce ne sont que des variables qui change) --%>
- <s:url id="listCompanyUrl" namespace="/" action="EntitySearchJson" escapeAmp="false">
+ <s:url id="selectPersonUrl" namespace="/ajax" action="selectWikittyComponent" escapeAmp="false">
+ <s:param name="wikittyExtension">Person</s:param>
+ <s:param name="sortField">Person.lastName</s:param>
+ </s:url>
+
+ <s:url id="selectCompanyUrl" namespace="/ajax" action="selectWikittyComponent" escapeAmp="false">
<s:param name="wikittyExtension">Company</s:param>
+ <s:param name="sortField">Company.name</s:param>
</s:url>
- <s:url id="listContactDetailsUrl" namespace="/" action="EntitySearchJson" escapeAmp="false">
+ <s:url id="listCompanyUrl" namespace="/ajax" action="EntitySearchJson" escapeAmp="false">
+ <s:param name="wikittyExtension">Company</s:param>
+ </s:url>
+
+ <s:url id="listContactDetailsUrl" namespace="/ajax" action="EntitySearchJson" escapeAmp="false">
<s:param name="wikittyExtension">ContactDetails</s:param>
</s:url>
- <s:url id="listEmployeeUrl" namespace="/" action="EntitySearchJson" escapeAmp="false">
+ <s:url id="listEmployeeUrl" namespace="/ajax" action="EntitySearchJson" escapeAmp="false">
<s:param name="wikittyExtension">Employee</s:param>
<s:param name="wikittyLinkToLoad">Employee.person,Employee.company</s:param>
</s:url>
- <s:url id="editCompanyUrl" namespace="/" action="EntitySearchJson" escapeAmp="false">
+ <s:url id="editCompanyUrl" namespace="/ajax" action="EntitySearchJson" escapeAmp="false">
<s:param name="wikittyExtension">Company</s:param>
</s:url>
- <s:url id="editEmployeeUrl" namespace="/" action="EntitySearchJson" escapeAmp="false">
+ <s:url id="editEmployeeUrl" namespace="/ajax" action="EntitySearchJson" escapeAmp="false">
<s:param name="wikittyExtension">Employee</s:param>
</s:url>
- <s:url id="editContactDetailsUrl" namespace="/" action="EntitySearchJson" escapeAmp="false">
+ <s:url id="editContactDetailsUrl" namespace="/ajax" action="EntitySearchJson" escapeAmp="false">
<s:param name="wikittyExtension">ContactDetails</s:param>
<s:param name="wikittyLinkFieldForRowId">ContactDetails.target</s:param>
</s:url>
<script type="text/javascript">
- var timeoutHnd;
- function doSearchCompany() {
- if(timeoutHnd) {
- clearTimeout(timeoutHnd)
- }
- timeoutHnd = setTimeout(gridReloadCompany, 500)
- }
-
- function gridReloadCompany() {
- var filter = jQuery("#fulltextSearchCompany").val();
- var gridUrl = "<s:property value="listCompanyUrl" escapeHtml="false"/>&fulltextSearch="+filter;
- jQuery("#gridCompany").jqGrid('setGridParam',{url:gridUrl,page:1}).trigger("reloadGrid");
- }
-
+ // event de la grille des companies qui selection seulement les employers
+ // la companie selectionnee
$.subscribe('rowselect', function(event, data) {
// alert('Selected Row : ' + event.originalEvent.id + ' data: ' + event.originalEvent.status);
var gridUrl = "<s:property value="listEmployeeUrl" escapeHtml="false"/>&fulltextSearch=" + event.originalEvent.id;
@@ -83,8 +78,11 @@
});
</script>
+ <h2><s:text name="chorem.bonzoms.companies" /></h2>
+
<s:form>
- <s:textfield id="fulltextSearchCompany" name="fulltextSearchCompany" onkeydown="doSearchCompany()"></s:textfield>
+ <s:textfield id="fulltextSearchCompany" name="fulltextSearchCompany"
+ onkeydown="doSearch('#gridCompany', '#fulltextSearchCompany', '%{listCompanyUrl}')"></s:textfield>
</s:form>
<sjg:grid
@@ -156,13 +154,23 @@
>
<sjg:gridColumn name="id" hidden="true" key="true" title="id"/>
- <sjg:gridColumn name="ContactDetails.type" index="ContactDetails.type" title="Type" editable="true" sortable="true"/>
+ <sjg:gridColumn name="ContactDetails.type" index="ContactDetails.type"
+ edittype="select"
+ editoptions="{value:'Phone:Phone;Address:Address;Email:Email;Jabber:Jabber;Other:Other'}"
+ title="Type" editable="true" sortable="true"/>
<sjg:gridColumn name="ContactDetails.name" index="ContactDetails.name" title="Name" editable="true" sortable="true"/>
<sjg:gridColumn name="ContactDetails.value" index="ContactDetails.value" title="Value" editable="true" sortable="true"/>
</sjg:grid>
</sjg:grid>
+ <h2><s:text name="chorem.bonzoms.employees" /></h2>
+
+ <s:form>
+ <s:textfield id="fulltextSearchEmployee" name="fulltextSearchEmployee"
+ onkeydown="doSearch('#gridEmployee', '#fulltextSearchEmployee', '%{listEmployeeUrl}')"></s:textfield>
+ </s:form>
+
<sjg:grid
id="gridEmployee"
dataType="json"
@@ -195,18 +203,27 @@
>
<sjg:gridColumn name="id" hidden="true" key="true" title="id"/>
+
+ <sjg:gridColumn name="Employee.company" index="Employee.company"
+ title="Société" editable="true" edittype="select"
+ hidden="true" editrules="{edithidden:true}"
+ editoptions="{dataUrl:'%{selectCompanyUrl}'}"/>
+ <sjg:gridColumn name="Employee.person" index="Employee.person"
+ title="Personne" editable="true" edittype="select"
+ hidden="true" editrules="{edithidden:true}"
+ editoptions="{dataUrl:'%{selectPersonUrl}'}"/>
+
<sjg:gridColumn name="Company.name" index="Company.name" title="Société" sortable="false" formatter="formatCompanyLink" editable="false"/>
<sjg:gridColumn name="Person.lastName" index="Person.lastName" title="Nom" sortable="false" formatter="formatPersonNameLink" editable="false"/>
<sjg:gridColumn name="Person.firstName" index="Person.firstName" title="Prénom" sortable="false" editable="false"/>
<sjg:gridColumn name="Person.diploma" index="Person.diploma" title="Diplôme" sortable="false" editable="false"/>
+
<sjg:gridColumn name="Employee.type" index="Employee.type" title="Type" edittype="select" editoptions="{value:'CDI:CDI;CDD:CDD;Stage:Stage;TNS:TNS'}" editable="true"/>
<sjg:gridColumn name="Employee.paidLeave" index="Employee.paidLeave" title="Congé" editrules="{number:true}" editable="true"/>
<sjg:gridColumn name="Employee.rtt" index="Employee.rtt" title="RTT" editrules="{number:true}" editable="true"/>
<sjg:gridColumn name="Employee.salary" index="Employee.salary" title="Salaire" editrules="{number:true}" editable="true"/>
<sjg:gridColumn name="Employee.workingTime" index="Employee.workingTime" title="Temps de travail" editrules="{number:true}" editable="true"/>
<sjg:gridColumn name="Employee.description" index="Employee.description" title="Description" edittype="textarea" editable="true"/>
- <sjg:gridColumn name="Employee.person" index="Employee.person" title="Personne" editable="true" edittype="select" editoptions="{value:'%{selectOption}'}" editrules="{edithidden:true}"/>
- <sjg:gridColumn name="Employee.company" index="Employee.company" title="Société" hidden="true" editable="true" editrules="{edithidden:true}"/>
<sjg:grid
id="gridEmployeeContact"
@@ -240,7 +257,10 @@
>
<sjg:gridColumn name="id" hidden="true" key="true" title="id"/>
- <sjg:gridColumn name="ContactDetails.type" index="ContactDetails.type" title="Type" editable="true" sortable="true"/>
+ <sjg:gridColumn name="ContactDetails.type" index="ContactDetails.type"
+ edittype="select"
+ editoptions="{value:'Phone:Phone;Address:Address;Email:Email;Jabber:Jabber;Other:Other'}"
+ title="Type" editable="true" sortable="true"/>
<sjg:gridColumn name="ContactDetails.name" index="ContactDetails.name" title="Name" editable="true" sortable="true"/>
<sjg:gridColumn name="ContactDetails.value" index="ContactDetails.value" title="Value" editable="true" sortable="true"/>
</sjg:grid>
Deleted: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companyDetails.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companyDetails.jsp 2011-11-22 17:55:13 UTC (rev 131)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companyDetails.jsp 2011-11-22 17:55:19 UTC (rev 132)
@@ -1,62 +0,0 @@
-<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-<%@page import="java.util.List" %>
-<%@page import="org.chorem.entities.Person" %>
-<%@page import="org.chorem.bonzoms.action.CompanyAction" %>
-<%@page import="org.chorem.JspUtils" %>
-<%@taglib prefix="s" uri="/struts-tags" %>
-
-<html xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
- xmlns:jsp="http://java.sun.com/JSP/Page">
- <head>
- <title>
- <s:text name="chorem.bonzoms.companyDetails.title">
- <s:param><%= CompanyAction.getAction().getName() %></s:param>
- </s:text>
- </title>
- <s:head />
- </head>
- <body>
- <h2>
- <s:text name="chorem.bonzoms.companyDetails.name">
- <s:param><%= CompanyAction.getAction().getName() %></s:param>
- </s:text>
- </h2>
- <s:actionerror />
- <s:url action="modifyCompany" var="modifyCompany">
- <s:param name="companyId"><%= CompanyAction.getAction().getCompanyId() %></s:param>
- </s:url>
- <form action="${modifyCompany}" method="post">
- <p>
- <s:textfield key="chorem.bonzoms.company.type" name="type" labelSeparator=": " />
- <br />
- <br />
- <s:textarea key="chorem.bonzoms.company.address" name="address" cols="30" rows="3" labelposition="top" />
- <br />
- <s:textfield key="chorem.bonzoms.company.phoneNb" name="phoneNb" labelSeparator=": " />
- <br />
- <s:textfield key="chorem.bonzoms.company.website" name="website" labelSeparator=": " />
- <br />
- <br />
- <s:submit key="chorem.misc.modify" name="modify" />
- </p>
- </form>
- <br />
- <br />
- <s:text name="chorem.bonzoms.company.employees" />
- <br />
- <br />
- <%
- List<Person> employees = CompanyAction.getAction().getEmployees();
-
- for (Person employee : employees) {
- %>
- <s:url action="personDetails" var="personDetails">
- <s:param name="personId"><%= employee.getWikittyId() %></s:param>
- </s:url>
- <a href="${personDetails}"><%= employee.getFirstName() %> <%= employee.getLastName() %></a> (<%= JspUtils.dateFormat(employee.getBirthDate()) %>)<br />
- <%
- }
- %>
- <br />
- </body>
-</html>
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/menu.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/menu.jsp 2011-11-22 17:55:13 UTC (rev 131)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/menu.jsp 2011-11-22 17:55:19 UTC (rev 132)
@@ -4,7 +4,5 @@
<ul>
<li><s:a action="companies"><s:text name="chorem.bonzoms.company.list" /></s:a></li>
<li><s:a action="persons"><s:text name="chorem.bonzoms.person.list" /></s:a></li>
- <li><s:a action="addCompanyInput"><s:text name="chorem.bonzoms.company.add" /></s:a></li>
- <li><s:a action="addPersonInput"><s:text name="chorem.bonzoms.person.add" /></s:a></li>
</ul>
</div>
Deleted: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/personDetails.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/personDetails.jsp 2011-11-22 17:55:13 UTC (rev 131)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/personDetails.jsp 2011-11-22 17:55:19 UTC (rev 132)
@@ -1,119 +0,0 @@
-<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-<%@page import="org.chorem.bonzoms.action.PersonAction" %>
-<%@page import="org.chorem.gepeto.EmploymentContractFull" %>
-<%@page import="org.chorem.entities.EmploymentContract" %>
-<%@page import="org.chorem.entities.Employee" %>
-<%@page import="java.util.List" %>dip
-<%@taglib prefix="s" uri="/struts-tags" %>
-
-<html xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
- xmlns:jsp="http://java.sun.com/JSP/Page">
- <% PersonAction person = PersonAction.getAction(); %>
- <head>
- <title>
- <s:text name="chorem.bonzoms.personDetails.title">
- <s:param><%= person.getFirstName() %> <%= person.getLastName() %></s:param>
- </s:text>
- </title>
- <s:head />
- </head>
- <body>
- <h2><%= person.getFirstName() %> <%= person.getLastName() %></h2>
- <s:actionerror />
- <s:url action="modifyPerson" var="modifyPerson">
- <s:param name="personId"><%= person.getPersonId() %></s:param>
- </s:url>
- <form action="${modifyPerson}" method="post">
- <p>
- <s:text name="chorem.bonzoms.person.birthDate" />: <%= person.getBirthDate() %>
- <br />
- <label for="diploma"><s:text name="chorem.bonzoms.employee.diploma" /></label>:
- <% if (person != null) { %>
- <input type="text" name="diploma" id="diploma" value="<%= person.getDiploma() %>" />
- <% } else { %>
- <input type="text" name="diploma" id="diploma" />
- <% } %>
- <br />
- <s:submit key="chorem.misc.modify" name="submit" />
- </p>
- </form>
- <% Employee employee = person.getEmployee(); %>
- <h3><s:text name="chorem.bonzoms.employee" /></h3>
- <p>
- <s:url action="modifyEmployee" var="modifyEmployee">
- <s:param name="personId"><%= person.getPersonId() %></s:param>
- <%
- if (employee != null) {
- %>
- <s:param name="employeeId"><%= employee.getWikittyId() %></s:param>
- <% } %>
- </s:url>
- <form action="${modifyEmployee}" method="post">
- <label for="paidLeave"><s:text name="chorem.bonzoms.employee.paidLeave" /></label>:
- <% if (employee != null) { %>
- <input type="text" name="paidLeave" id="paidLeave" value="<%= employee.getPaidLeave() %>" />
- <% } else { %>
- <input type="text" name="paidLeave" id="paidLeave" />
- <% } %>
- <br />
- <label for="rtt"><s:text name="chorem.bonzoms.employee.rtt" /></label>:
- <% if (employee != null) { %>
- <input type="text" name="rtt" id="rtt" value="<%= employee.getRtt() %>" />
- <% } else { %>
- <input type="text" name="rtt" id="rtt" />
- <% } %>
- <br />
- <s:submit key="chorem.misc.modify" name="modify" />
- </form>
- </p>
- <h3><s:text name="chorem.bonzoms.person.employmentContracts" /></h3>
- <%
- List<EmploymentContractFull> employmentContractsFull = person.getEmploymentContracts();
- EmploymentContract employmentContract;
-
- for (EmploymentContractFull employmentContractFull : employmentContractsFull) {
- %>
- <% employmentContract = employmentContractFull.getEmploymentContract(); %>
- <s:url action="modifyEmploymentContract" var="modifyEmploymentContract">
- <s:param name="employmentContractId"><%= employmentContract.getWikittyId() %></s:param>
- <s:param name="personId"><%= employmentContractFull.getEmployee().getPerson().getWikittyId() %></s:param>
- </s:url>
- <form action="${modifyEmploymentContract}" method="post">
- <p>
- <% if (employmentContractFull.getEmployee().getCompany() != null) { %>
- <s:text name="chorem.bonzoms.employee.company" />: <%= employmentContractFull.getEmployee().getCompany().getName() %>
- <br />
- <% } %>
- <label for="type<%= employmentContract.getWikittyId() %>"><s:text name="chorem.bonzoms.employmentContract.type" /></label>:
- <input type="text" name="type" id="type<%= employmentContract.getWikittyId() %>" value="<%= employmentContract.getType() %>" />
- <br />
- <br />
- <label for="description<%= employmentContract.getWikittyId() %>"><s:text name="chorem.bonzoms.employmentContract.description" /></label>:
- <br />
- <textarea name="description" id="description<%= employmentContract.getWikittyId() %>"><%= employmentContract.getDescription() %></textarea>
- <br />
- <label for="salary<%= employmentContract.getWikittyId() %>"><s:text name="chorem.bonzoms.employmentContract.salary" /></label>:
- <input type="text" name="salary" id="salary<%= employmentContract.getWikittyId() %>" value="<%= employmentContract.getSalary() %>" size="6" />
- <br />
- <label for="workingTime<%= employmentContract.getWikittyId() %>"><s:text name="chorem.bonzoms.employmentContract.workingTime" /></label>:
- <input type="text" name="workingTime" id="workingTime<%= employmentContract.getWikittyId() %>" value="<%= employmentContract.getWorkingTime() %>" size="2" />
- <br />
- <s:submit key="chorem.misc.modify" name="modify" />
- <br />
- <br />
- </p>
- </form>
- <%
- }
- if (employee != null) {
- %>
- <p>
- <s:url action="addEmploymentContractInput" var="addEmploymentContract">
- <s:param name="personId"><%= person.getPersonId() %></s:param>
- <s:param name="employeeId"><%= employee.getWikittyId() %></s:param>
- </s:url>
- <a href="${addEmploymentContract}"><s:text name="chorem.bonzoms.employmentContract.add" /></a>
- </p>
- <% } %>
- </body>
-</html>
Deleted: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/personDetailsEmployee.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/personDetailsEmployee.jsp 2011-11-22 17:55:13 UTC (rev 131)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/personDetailsEmployee.jsp 2011-11-22 17:55:19 UTC (rev 132)
@@ -1,51 +0,0 @@
-<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-<%@page import="org.chorem.bonzoms.action.EmployeeAction" %>
-<%@page import="org.chorem.entities.Employee" %>
-<%@taglib prefix="s" uri="/struts-tags" %>
-
-<html xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
- xmlns:jsp="http://java.sun.com/JSP/Page">
- <head>
- <title></title>
- <s:head />
- </head>
- <body>
- <s:actionerror />
- <% Employee employee = EmployeeAction.getAction().getEmployee(); %>
- <h3><s:text name="chorem.bonzoms.employee" /></h3>
- <p>
- <s:url action="modifyEmployee" var="modifyEmployee">
- <s:param name="personId"><%= employee.getPerson() %></s:param>
- <%
- if (employee != null) {
- %>
- <s:param name="employeeId"><%= employee.getWikittyId() %></s:param>
- <% } %>
- </s:url>
- <form action="${modifyEmployee}" method="post">
- <label for="diploma"><s:text name="chorem.bonzoms.employee.diploma" /></label>:
- <% if (employee != null) { %>
- <input type="text" name="diploma" id="diploma" value="<%= employee.getDiploma() %>" />
- <% } else { %>
- <input type="text" name="diploma" id="diploma" />
- <% } %>
- <br />
- <label for="paidLeave"><s:text name="chorem.bonzoms.employee.paidLeave" /></label>:
- <% if (employee != null) { %>
- <input type="text" name="paidLeave" id="paidLeave" value="<%= employee.getPaidLeave() %>" />
- <% } else { %>
- <input type="text" name="paidLeave" id="paidLeave" />
- <% } %>
- <br />
- <label for="rtt"><s:text name="chorem.bonzoms.employee.rtt" /></label>:
- <% if (employee != null) { %>
- <input type="text" name="rtt" id="rtt" value="<%= employee.getRtt() %>" />
- <% } else { %>
- <input type="text" name="rtt" id="rtt" />
- <% } %>
- <br />
- <s:submit key="chorem.misc.modify" name="modify" />
- </form>
- </p>
- </body>
-</html>
Deleted: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/personDetailsEmploymentContract.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/personDetailsEmploymentContract.jsp 2011-11-22 17:55:13 UTC (rev 131)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/personDetailsEmploymentContract.jsp 2011-11-22 17:55:19 UTC (rev 132)
@@ -1,54 +0,0 @@
-<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-<%@page import="org.chorem.bonzoms.action.PersonAction" %>
-<%@page import="org.chorem.gepeto.EmploymentContractFull" %>
-<%@page import="org.chorem.bonzoms.action.EmploymentContractAction" %>
-<%@page import="org.chorem.entities.EmploymentContract" %>
-<%@page import="java.util.List" %>
-<%@taglib prefix="s" uri="/struts-tags" %>
-
-<html xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
- xmlns:jsp="http://java.sun.com/JSP/Page">
- <head>
- <title></title>
- <s:head />
- </head>
- <body>
- <p>
- <s:text name="chorem.bonzoms.person.employmentContracts" />
- <br />
- <%
- EmploymentContractFull employmentContractFull = EmploymentContractAction.getAction().getEmploymentContract();
- EmploymentContract employmentContract;
-
- employmentContract = employmentContractFull.getEmploymentContract(); %>
- <s:url action="modifyEmploymentContract" var="modifyEmploymentContract">
- <s:param name="employmentContractId"><%= employmentContract.getWikittyId() %></s:param>
- <s:param name="personId"><%= employmentContractFull.getEmployee().getPerson().getWikittyId() %></s:param>
- </s:url>
- <s:actionerror />
- <form action="${modifyEmploymentContract}" method="post">
- <p>
- <% if (employmentContractFull.getEmployee().getCompany() != null) { %>
- <s:text name="chorem.bonzoms.employee.company" />: <%= employmentContractFull.getEmployee().getCompany().getName() %>
- <br />
- <% } %>
- <label for="type"><s:text name="chorem.bonzoms.employmentContract.type" /></label>:
- <input type="text" name="type" id="type" value="<%= employmentContract.getType() %>" />
- <br />
- <br />
- <label for="description"><s:text name="chorem.bonzoms.employmentContract.description" /></label>:
- <br />
- <textarea name="description" id="description"><%= employmentContract.getDescription() %></textarea>
- <br />
- <label for="salary"><s:text name="chorem.bonzoms.employmentContract.salary" /></label>:
- <input type="text" name="salary" id="salary" value="<%= employmentContract.getSalary() %>" size="6" />
- <br />
- <label for="workingTime"><s:text name="chorem.bonzoms.employmentContract.workingTime" /></label>:
- <input type="text" name="workingTime" id="workingTime" value="<%= employmentContract.getWorkingTime() %>" size="2" />
- <br />
- <s:submit key="chorem.misc.modify" name="modify" />
- </p>
- </form>
- </p>
- </body>
-</html>
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/persons.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/persons.jsp 2011-11-22 17:55:13 UTC (rev 131)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/persons.jsp 2011-11-22 17:55:19 UTC (rev 132)
@@ -2,7 +2,6 @@
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@page import="java.util.List" %>
<%@page import="org.chorem.entities.Person" %>
-<%@page import="org.chorem.bonzoms.action.PersonAction" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<%@taglib prefix="sj" uri="/struts-jquery-tags"%>
<%@taglib prefix="sjg" uri="/struts-jquery-grid-tags"%>
@@ -15,53 +14,32 @@
<body>
<h2><s:text name="chorem.bonzoms.persons" /></h2>
- <s:url id="personDetails" namespace="/bonzoms" action="personDetails"/>
-
- <script type="text/javascript">
- function formatPersonNameLink(cellvalue, options, rowObject) {
- return "<a href='<s:property value="personDetails"/>?personId="+rowObject.id+"'>" + cellvalue + "</a>";
- }
- </script>
-
-
-
- <s:url id="remoteurlFulltextSearch" namespace="/" action="EntitySearchJson" escapeAmp="false">
+ <s:url id="listPersonUrl" namespace="/ajax" action="EntitySearchJson" escapeAmp="false">
<s:param name="wikittyExtension">Person</s:param>
</s:url>
- <s:url id="remoteurl" namespace="/" action="EntitySearchJson" escapeAmp="false">
- <s:param name="fulltextSearch"><%=StringUtils.defaultString(request.getParameter("fulltextSearch"))%></s:param>
+ <s:url id="editPersonUrl" namespace="/ajax" action="EntitySearchJson" escapeAmp="false">
<s:param name="wikittyExtension">Person</s:param>
</s:url>
- <script type="text/javascript">
- var timeoutHnd;
- function doSearch() {
- if(timeoutHnd) {
- clearTimeout(timeoutHnd)
- }
- timeoutHnd = setTimeout(gridReload, 500)
- }
+ <s:url id="listContactDetailsUrl" namespace="/ajax" action="EntitySearchJson" escapeAmp="false">
+ <s:param name="wikittyExtension">ContactDetails</s:param>
+ </s:url>
- function gridReload() {
- var filter = jQuery("#fulltextSearch").val();
- var gridUrl = "<s:property value="remoteurlFulltextSearch" escapeHtml="false"/>&fulltextSearch="+filter;
- jQuery("#gridtable").jqGrid('setGridParam',{url:gridUrl,page:1}).trigger("reloadGrid");
- }
- </script>
+ <s:url id="editContactDetailsUrl" namespace="/ajax" action="EntitySearchJson" escapeAmp="false">
+ <s:param name="wikittyExtension">ContactDetails</s:param>
+ <s:param name="wikittyLinkFieldForRowId">ContactDetails.target</s:param>
+ </s:url>
<s:form>
- <s:textfield id="fulltextSearch" name="fulltextSearch" onkeydown="doSearch()"></s:textfield>
- <s:submit></s:submit>
+ <s:textfield id="fulltextSearch" name="fulltextSearch"
+ onkeydown="doSearch('#gridtable', '#fulltextSearch', '%{listPersonUrl}')"></s:textfield>
</s:form>
- <s:url id="editurl" namespace="/" action="EntitySearchJson" escapeAmp="false">
- </s:url>
-
<sjg:grid
id="gridtable"
dataType="json"
- href="%{remoteurl}"
+ href="%{listPersonUrl}"
gridModel="gridModel"
rowList="10,20,50,100"
rowNum="20"
@@ -72,9 +50,9 @@
pager="true"
viewrecords="true"
- multiselect="true"
+ multiselect="false"
- editurl="%{editurl}"
+ editurl="%{editPersonUrl}"
editinline="false"
navigator="true"
@@ -90,8 +68,52 @@
>
<sjg:gridColumn name="id" hidden="true" key="true" title="id"/>
- <sjg:gridColumn name="Person.lastName" index="Person.lastName" title="Nom" editable="true" formatter="formatPersonNameLink"/>
+ <sjg:gridColumn name="Person.lastName" index="Person.lastName" title="Nom" editable="true"/>
<sjg:gridColumn name="Person.firstName" index="Person.firstName" title="Prénom" editable="true"/>
+ <sjg:gridColumn name="Person.diploma" index="Person.diploma" title="Diplôme" editable="true"/>
+
+ <sjg:grid
+ id="gridCompanyContact"
+ dataType="json"
+ href="%{listContactDetailsUrl}"
+ gridModel="gridModel"
+ rowList="10,20,50,100"
+ rowNum="20"
+ rownumbers="true"
+ autowidth="true"
+ sortname="ContactDetails.type"
+ sortorder="asc"
+ pager="true"
+ viewrecords="true"
+
+ multiselect="false"
+
+ editurl="%{editContactDetailsUrl}"
+ editinline="false"
+
+ navigator="true"
+ navigatorAdd="true"
+ navigatorEdit="true"
+ navigatorDelete="true"
+ navigatorView="true"
+ navigatorSearch="true"
+ navigatorAddOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorEditOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorDeleteOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorSearchOptions="{multipleGroup:true,showQuery:true,multipleSearch:true,sopt:['eq','ne','cn','nc','bw','bn','ew','en','lt','le','gt','ge','nu','nn','in','ni']}"
+ >
+
+ <sjg:gridColumn name="id" hidden="true" key="true" title="id"/>
+ <sjg:gridColumn name="ContactDetails.type" index="ContactDetails.type"
+ edittype="select"
+ editoptions="{value:'Phone:Phone;Address:Address;Email:Email;Jabber:Jabber;Other:Other'}"
+ title="Type" editable="true" sortable="true"/>
+ <sjg:gridColumn name="ContactDetails.name" index="ContactDetails.name" title="Name" editable="true" sortable="true"/>
+ <sjg:gridColumn name="ContactDetails.value" index="ContactDetails.value"
+ edittype="textarea"
+ title="Value" editable="true" sortable="true"/>
+ </sjg:grid>
+
</sjg:grid>
</body>
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/common/inc/footer.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/common/inc/footer.jsp 2011-11-22 17:55:13 UTC (rev 131)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/common/inc/footer.jsp 2011-11-22 17:55:19 UTC (rev 132)
@@ -1,7 +1,14 @@
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
+<%@taglib prefix="s" uri="/struts-tags" %>
-<div id="footer"
- xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
- xmlns:jsp="http://java.sun.com/JSP/Page">
- <a href="http://www.codelutin.com">Code Lutin</a>
+<div id="footer">
+ <a shape="rect" href="http://www.chorem.org/projects/show/chorem">Chorem</a>
+ <a shape="rect" href="http://www.gnu.org/licenses/agpl.html">Licence AGPL</a> -
+ <span title="Copyright">©2009-2011</span>
+ <a shape="rect" href="http://www.codelutin.com">Code Lutin</a> -
+ <a shape="rect" href="http://www.chorem.org/projects/chorem/issues">Rapport de bug</a> -
+ <a shape="rect" href="http://list.chorem.org/cgi-bin/mailman/listinfo/chorem-users">Support utilisateur</a>
</div>
+
+<s:url var="choremjs" value="/js/chorem.js" />
+<script type="text/javascript" src="${choremjs}"></script>
Added: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/common/selectWikittyComponent.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/common/selectWikittyComponent.jsp (rev 0)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/common/selectWikittyComponent.jsp 2011-11-22 17:55:19 UTC (rev 132)
@@ -0,0 +1,7 @@
+<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<%@taglib prefix="s" uri="/struts-tags" %>
+<select>
+ <s:iterator value="wikitties" var="w">
+ <option value='<s:property value="id"/>'><s:property value="toString(wikittyExtension)"/></option>
+ </s:iterator>
+</select>
\ No newline at end of file
Added: trunk/chorem-web/src/main/webapp/js/chorem.js
===================================================================
--- trunk/chorem-web/src/main/webapp/js/chorem.js (rev 0)
+++ trunk/chorem-web/src/main/webapp/js/chorem.js 2011-11-22 17:55:19 UTC (rev 132)
@@ -0,0 +1,18 @@
+/**
+ * Permet de faire des recherches fulltext qui s'applique sur une grille
+ * @param gridId l'identifiant de la grille
+ * @param inputId l'identifiant du champs input
+ * @param url l'url initiale de la grille sur lequel on ajoute la contrainte de recherche
+ */
+var timeoutHnd;
+
+function doSearch(gridId, inputId, url) {
+ if(timeoutHnd) {
+ clearTimeout(timeoutHnd)
+ }
+ timeoutHnd = setTimeout(function() {
+ var filter = jQuery(inputId).val();
+ var gridUrl = url + "&fulltextSearch=" + filter;
+ jQuery(gridId).jqGrid('setGridParam',{url:gridUrl,page:1}).trigger("reloadGrid");
+ }, 500);
+}
1
0
r131 - in trunk/chorem-web/src/main: java/org/chorem resources/org/chorem
by bpoussin@users.chorem.org 22 Nov '11
by bpoussin@users.chorem.org 22 Nov '11
22 Nov '11
Author: bpoussin
Date: 2011-11-22 18:55:13 +0100 (Tue, 22 Nov 2011)
New Revision: 131
Url: http://chorem.org/repositories/revision/chorem/131
Log:
work in progress
bonzoms a priori fonctionnel (gros menage, suppression des anciens fichiers
Removed:
trunk/chorem-web/src/main/java/org/chorem/bonzoms/
trunk/chorem-web/src/main/resources/org/chorem/bonzoms/
1
0
r130 - in trunk: . chorem-entities chorem-entities/src/main/xmi chorem-entities/src/site/rst chorem-web/src/main/java/org/chorem chorem-web/src/main/java/org/chorem/action chorem-web/src/main/java/org/chorem/bonzoms/action chorem-web/src/main/java/org/chorem/gepeto chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms
by bpoussin@users.chorem.org 19 Nov '11
by bpoussin@users.chorem.org 19 Nov '11
19 Nov '11
Author: bpoussin
Date: 2011-11-19 18:17:08 +0100 (Sat, 19 Nov 2011)
New Revision: 130
Url: http://chorem.org/repositories/revision/chorem/130
Log:
work in progress
Added:
trunk/chorem-entities/src/site/rst/chorem-entities-base.png
trunk/chorem-entities/src/site/rst/chorem-entities-billy.png
trunk/chorem-entities/src/site/rst/chorem-entities-bonzoms.png
trunk/chorem-entities/src/site/rst/chorem-entities-gepeto.png
Removed:
trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/EmploymentContractAction.java
trunk/chorem-web/src/main/java/org/chorem/gepeto/EmploymentContractFull.java
Modified:
trunk/chorem-entities/pom.xml
trunk/chorem-entities/src/main/xmi/chorem.properties
trunk/chorem-entities/src/main/xmi/chorem.zargo
trunk/chorem-entities/src/site/rst/dataModel.rst
trunk/chorem-web/src/main/java/org/chorem/ContactDetailsConstants.java
trunk/chorem-web/src/main/java/org/chorem/action/EntitySearchJsonAction.java
trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/EmployeeAction.java
trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/PersonAction.java
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companies.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/personDetails.jsp
trunk/pom.xml
Modified: trunk/chorem-entities/pom.xml
===================================================================
--- trunk/chorem-entities/pom.xml 2011-11-08 17:46:52 UTC (rev 129)
+++ trunk/chorem-entities/pom.xml 2011-11-19 17:17:08 UTC (rev 130)
@@ -57,18 +57,6 @@
</dependency>
<dependency>
- <groupId>org.nuiton.wikitty</groupId>
- <artifactId>wikitty-jdbc-impl</artifactId>
- <scope>runtime</scope>
- </dependency>
-
- <dependency>
- <groupId>org.nuiton.wikitty</groupId>
- <artifactId>wikitty-solr-impl</artifactId>
- <scope>runtime</scope>
- </dependency>
-
- <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<scope>runtime</scope>
Modified: trunk/chorem-entities/src/main/xmi/chorem.properties
===================================================================
--- trunk/chorem-entities/src/main/xmi/chorem.properties 2011-11-08 17:46:52 UTC (rev 129)
+++ trunk/chorem-entities/src/main/xmi/chorem.properties 2011-11-19 17:17:08 UTC (rev 130)
@@ -2,13 +2,12 @@
org.chorem.entities.ProjectOrder.class.tagvalue.version=1.0
org.chorem.entities.Task.class.tagvalue.version=1.0
org.chorem.entities.Worker.class.tagvalue.version=1.0
-org.chorem.entities.Person.class.tagvalue.version=1.0
+org.chorem.entities.Person.class.tagvalue.version=2.0
org.chorem.entities.Interval.class.tagvalue.version=1.0
org.chorem.entities.Company.class.tagvalue.version=1.0
org.chorem.entities.ContactDetails.class.tagvalue.version=1.0
org.chorem.entities.Time.class.tagvalue.version=1.0
-org.chorem.entities.EmploymentContract.class.tagvalue.version=1.0
-org.chorem.entities.Employee.class.tagvalue.version=1.0
+org.chorem.entities.Employee.class.tagvalue.version=2.0
org.chorem.entities.Goal.class.tagvalue.version=1.0
org.chorem.entities.PersonSkill.class.tagvalue.version=1.0
org.chorem.entities.Skill.class.tagvalue.version=1.0
Modified: trunk/chorem-entities/src/main/xmi/chorem.zargo
===================================================================
(Binary files differ)
Added: trunk/chorem-entities/src/site/rst/chorem-entities-base.png
===================================================================
(Binary files differ)
Property changes on: trunk/chorem-entities/src/site/rst/chorem-entities-base.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/chorem-entities/src/site/rst/chorem-entities-billy.png
===================================================================
(Binary files differ)
Property changes on: trunk/chorem-entities/src/site/rst/chorem-entities-billy.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/chorem-entities/src/site/rst/chorem-entities-bonzoms.png
===================================================================
(Binary files differ)
Property changes on: trunk/chorem-entities/src/site/rst/chorem-entities-bonzoms.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/chorem-entities/src/site/rst/chorem-entities-gepeto.png
===================================================================
(Binary files differ)
Property changes on: trunk/chorem-entities/src/site/rst/chorem-entities-gepeto.png
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Modified: trunk/chorem-entities/src/site/rst/dataModel.rst
===================================================================
--- trunk/chorem-entities/src/site/rst/dataModel.rst 2011-11-08 17:46:52 UTC (rev 129)
+++ trunk/chorem-entities/src/site/rst/dataModel.rst 2011-11-19 17:17:08 UTC (rev 130)
@@ -66,7 +66,12 @@
Billy
=====
-- Quotation: devis envoyé à un client en rapport avec un projet
+- Quotation: devis envoyé à un client en rapport avec un projet, un devis a
+ un type (dev, admin, formation, ...), et un beginDate, endDate qui
+ détermine approximativement le moment ou la réalisation devra être faite.
+ Tant que le devis n'a pas de date d'envoi, il s'agit d'un brouillon.
+ L'espoire de conversion (conversionHope) indique si l'on pense convertir
+ facilement en contrat ce devis (0 = non, 10 = quasi sur)
- Invoiceable: indique les conditions de facturation. Chaque facture a
emettre doit avoir une condition et une valeur associee. La condition et la
valeur associee sont evaluees en fonction du type mime indique. De meme il
Modified: trunk/chorem-web/src/main/java/org/chorem/ContactDetailsConstants.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/ContactDetailsConstants.java 2011-11-08 17:46:52 UTC (rev 129)
+++ trunk/chorem-web/src/main/java/org/chorem/ContactDetailsConstants.java 2011-11-19 17:17:08 UTC (rev 130)
@@ -9,4 +9,5 @@
public static final String CONTACT_DETAILS_POSTAL_ADDRESS = "Postal address";
public static final String CONTACT_DETAILS_PHONE = "Phone number";
public static final String CONTACT_DETAILS_WEBSITE = "Website";
+ public static final String CONTACT_DETAILS_EMAIL = "Email";
}
Modified: trunk/chorem-web/src/main/java/org/chorem/action/EntitySearchJsonAction.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/action/EntitySearchJsonAction.java 2011-11-08 17:46:52 UTC (rev 129)
+++ trunk/chorem-web/src/main/java/org/chorem/action/EntitySearchJsonAction.java 2011-11-19 17:17:08 UTC (rev 130)
@@ -6,7 +6,6 @@
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -21,16 +20,48 @@
import org.nuiton.wikitty.entities.FieldType;
import org.nuiton.wikitty.entities.Wikitty;
import org.nuiton.wikitty.entities.WikittyExtension;
+import org.nuiton.wikitty.entities.WikittyImpl;
import org.nuiton.wikitty.search.Criteria;
import org.nuiton.wikitty.search.PagedResult;
import org.nuiton.wikitty.search.Search;
/**
- * Action qui recherche n'importe qu'elle type d'extension de wikitty.
- * L'extension doit etre passee via le parametre 'wikittyExtension'
- * Il est possible d'ajouter une condition de recherche via le parametre
- * 'fulltextSearch'.
+ * Action qui d'interagir avec les jqgrid pour n'importe qu'elle type d'extension
+ * de wikitty.
+ * La grille doit être configuree en json et le model se nome 'gridModel'
*
+ * <h3>Recherche</h3>
+ *
+ * <li> id: si non vide l'id de ligne de la grille mere pour une sous grille
+ * <li> wikittyExtension: les extensions que doivent avoir les wikitties
+ * recherches (master)
+ * <li> wikittyLinkToLoad: listes des champs du wikitty master, qui represente
+ * des wikitties a charger en plus pour permettre un affichage plus
+ * lisible pour l'utilisateur
+ * <li> filters: la valeur du filtre de la grille
+ * <li> fulltextSearch: une contrainte de recherche des wikitties affiches
+ *
+ * si filters et fulltextSearch sont non vide, seul filters est utilise.
+ *
+ * <h3>Ajout</h3>
+ *
+ * <li> wikittyExtension: la liste des extensions a mettre sur le nouveau wikitty
+ * <li> rowid: l'id de la derniere ligne ouverte lorsqu'on est en sous grille
+ * <li> wikittyLinkFieldForRowId: le champs qui doit etre value avec rowid dans
+ * le nouvel objet wikitty
+ *
+ * <h3>Edition</h3>
+ *
+ * <li> id: l'id de l'objet a modifier
+ *
+ * L'ensemble des champs a mettre dans le wikitty sont passes dans les paramatres
+ *
+ * <h3>Suppression</h3>
+ *
+ * <li> id: l'id de l'objet a supprimer
+ * <li> deleteAllLink: indique de supprimer tous les objets qui contiennent cet
+ * identifiant
+ *
* @author poussin
* @version $Revision$
*
@@ -84,181 +115,225 @@
/** action faite via le grid ['add', 'edit', 'del'], si vide alors une simple recherche */
protected String oper;
- /** id ou list d'id sur lequel l'action est faite, le separateur est la ','*/
+
+ protected boolean deleteAllLink = false;
+ /**
+ * id ou list d'id sur lequel l'action est faite, le separateur est la ','
+ * id est aussi utilise pour les subgrid comme valeur de l'id du pere
+ */
protected String id;
- protected Map<String, String[]> parameters;
+ /** id de la derniere ligne ouverte (pour les tableaux ayant un sous tableau) */
+ protected String rowid;
- public void setWikittyLinkToLoad(String wikittyLinkToLoad) {
- this.wikittyLinkToLoad = wikittyLinkToLoad;
- }
+ /** champs wikitty dans lequel on doit stocker rowid si non vide */
+ protected String wikittyLinkFieldForRowId;
- public void setParameters(Map<String, String[]> parameters) {
- this.parameters = parameters;
- }
- public void setFilters(String filters) {
- this.filters = filters;
- }
+ protected Map<String, String[]> parameters;
- public void setWikittyExtension(String wikittyExtension) {
- this.wikittyExtension = wikittyExtension;
- }
+ public String execute() {
+ try {
+ if (log.isDebugEnabled()) {
+ for (String param : parameters.keySet()) {
+ log.debug("param:" + param + "=" + Arrays.toString(parameters.get(param)));
+ }
+ }
- public void setFulltextSearch(String fulltextSearch) {
- this.fulltextSearch = fulltextSearch;
+ if ("del".equalsIgnoreCase(oper)) {
+ doDelete();
+ } else if ("add".equalsIgnoreCase(oper)) {
+ doAdd();
+ } else if ("edit".equalsIgnoreCase(oper)) {
+ doEdit();
+ } else {
+ doSearch();
+ }
+ return SUCCESS;
+ } catch (Exception eee) {
+ log.error(String.format("Can't find wikitty '%s'", wikittyExtension), eee);
+ throw new UnhandledException(eee);
+ }
}
- public void setPage(Integer page) {
- this.page = page;
- }
+ protected void doDelete() {
+ Collection<String> ids = toCollection(id);
- public void setSord(String sord) {
- this.sord = sord;
+ // si l'utilisateur demande de supprimer aussi tous les objets qui ont
+ // ces ids comme reference, on les recherche
+ if (isDeleteAllLink()) {
+ Search search = Search.query().or();
+ for(String id:ids) {
+ search.keyword(id);
+ }
+ Criteria criteria = search.criteria();
+ PagedResult<String> result = getChoremProxy().findAllIdByCriteria(criteria);
+ ids = result.getAll();
+ }
+ getChoremProxy().delete(ids);
}
- public void setSidx(String sidx) {
- this.sidx = sidx;
+ protected void doAdd() {
+ Wikitty w = new WikittyImpl();
+ Collection<String> extNames = toCollection(wikittyExtension);
+ List<WikittyExtension> exts = getChoremProxy().restoreExtensionAndDependenciesLastVesion(extNames);
+ w.addExtension(exts);
+ if (StringUtils.isNotBlank(wikittyLinkFieldForRowId)
+ && StringUtils.isNotBlank(rowid)) {
+ w.setFqField(wikittyLinkFieldForRowId, rowid);
+ }
+ populateWikitty(w, parameters);
+ getChoremProxy().store(w);
}
- public void setRows(Integer rows) {
- this.rows = rows;
+ protected void doEdit() {
+ Wikitty w = getChoremProxy().restore(id);
+ populateWikitty(w, parameters);
+ getChoremProxy().store(w);
}
- public void setRecords(Integer records) {
- this.records = records;
+ /**
+ * Recherche dans parameters toutes les champs du wikitty pour mettre a jour
+ * le wikitty
+ *
+ * @param w le wikitty a mettre a jour
+ * @param parameters la map contenant les nouvelles valeurs pour les champs
+ */
+ protected void populateWikitty(Wikitty w, Map<String, String[]> parameters) {
+ if (w != null) {
+ for (String param : parameters.keySet()) {
+ if(w.hasField(param)) {
+ FieldType type = w.getFieldType(param);
+ String[] val = parameters.get(param);
+ if (type.isCollection()) {
+ w.setFqField(param, val);
+ } else {
+ w.setFqField(param, val[0]);
+ }
+ }
+ }
+ }
}
- public void setTotal(Integer total) {
- this.total = total;
- }
+ protected void doSearch() {
- public List getWikitties() {
- return wikitties;
- }
- public String execute() {
- try {
- if (log.isDebugEnabled()) {
- for (String param : parameters.keySet()) {
- log.debug("param:" + param + "=" + Arrays.toString(parameters.get(param)));
- }
- }
-
- Search search = Search.query();
+ Search search = Search.query();
- if (StringUtils.isNotBlank(wikittyExtension)) {
- Collection<String> col = toCollection(wikittyExtension);
- search.exteq(col);
- }
+ if (StringUtils.isNotBlank(wikittyExtension)) {
+ Collection<String> col = toCollection(wikittyExtension);
+ search.exteq(col);
+ }
- if (StringUtils.isNotBlank(filters)) {
- JSONObject jsonFilter = (JSONObject) JSONSerializer.toJSON( filters );
- String groupOp = jsonFilter.getString("groupOp");
- log.debug("groupOp: " + groupOp);
- Search filter;
- if ("or".equalsIgnoreCase(groupOp)) {
- filter = search.or();
- } else {
- filter = search.and();
- }
- JSONArray rules = jsonFilter.getJSONArray("rules");
- int rulesCount = JSONArray.getDimensions(rules)[0];
- for (int i = 0; i < rulesCount; i++) {
- JSONObject rule = rules.getJSONObject(i);
- String field = rule.getString("field");
- String op = rule.getString("op");
- String data = rule.getString("data");
- addCondition(filter, field, op, data);
- }
+ // on restraint la recherche pour les sous grilles a l'id du wikitty
+ // pere dans la grille principale
+ if (StringUtils.isNotBlank(id)) {
+ search.keyword(id);
+ }
- } else if (StringUtils.isNotBlank(fulltextSearch)) {
- // TODO poussin 20111106: ca ne serait pas au like d'ajouter les * ?
- String s = "*" + fulltextSearch + "*";
- // TODO poussin 20111106: voir pourquoi like fontion comme on souhaite et pas Keyword :(
- // keyword ne fonctionne pas avec les *
- Search or = search.or();
- or = or.like("#fulltext", s);
- log.debug("link: " + getWikittyLinkToLoadCache());
- for (String link:getWikittyLinkToLoadCache()) {
- or.associated(link).like("#fulltext", s);
- }
+ if (StringUtils.isNotBlank(filters)) {
+ JSONObject jsonFilter = (JSONObject) JSONSerializer.toJSON( filters );
+ String groupOp = jsonFilter.getString("groupOp");
+ log.debug("groupOp: " + groupOp);
+ Search filter;
+ if ("or".equalsIgnoreCase(groupOp)) {
+ filter = search.or();
} else {
- // si pas de filtre on recherche tout
- search.rTrue();
+ filter = search.and();
}
-
+ JSONArray rules = jsonFilter.getJSONArray("rules");
+ int rulesCount = JSONArray.getDimensions(rules)[0];
+ for (int i = 0; i < rulesCount; i++) {
+ JSONObject rule = rules.getJSONObject(i);
+ String field = rule.getString("field");
+ String op = rule.getString("op");
+ String data = rule.getString("data");
+ addCondition(filter, field, op, data);
+ }
- int first = rows * (page - 1);
- int last = rows * page - 1;
-
- Criteria criteria = search.criteria();
- criteria.setFirstIndex(first);
- criteria.setEndIndex(last);
-
- if (StringUtils.isNotBlank(sidx)) {
- if ("asc".equalsIgnoreCase(sord)) {
- criteria.setSortAscending(sidx);
- } else {
- criteria.setSortDescending(sidx);
- }
+ } else if (StringUtils.isNotBlank(fulltextSearch)) {
+ // TODO poussin 20111106: ca ne serait pas au like d'ajouter les * ?
+ String s = "*" + fulltextSearch + "*";
+ // TODO poussin 20111106: voir pourquoi like fontion comme on souhaite et pas Keyword :(
+ // keyword ne fonctionne pas avec les *
+ Search or = search.or();
+ or = or.like("#fulltext", s);
+ log.debug("link: " + getWikittyLinkToLoadCache());
+ for (String link:getWikittyLinkToLoadCache()) {
+ or.associated(link).like("#fulltext", s);
}
+ } else {
+ // si pas de filtre on recherche tout
+ search.rTrue();
+ }
- if (log.isDebugEnabled()) {
- log.debug("rows:" + rows);
- log.debug("page:" + page);
- log.debug("first:" + first);
- log.debug("last:" + last);
+ int first = rows * (page - 1);
+ int last = rows * page - 1;
- log.debug("sord:" + sord);
- log.debug("sidx:" + sidx);
+ Criteria criteria = search.criteria();
+ criteria.setFirstIndex(first);
+ criteria.setEndIndex(last);
- log.debug("wikittyExtension:" + wikittyExtension);
- log.debug("searchString: " + fulltextSearch);
- log.debug("filters: " + filters);
- log.debug("criteria: " + criteria);
+ if (StringUtils.isNotBlank(sidx)) {
+ if ("asc".equalsIgnoreCase(sord)) {
+ criteria.setSortAscending(sidx);
+ } else {
+ criteria.setSortDescending(sidx);
}
+ }
- PagedResult<Wikitty> result = getChoremProxy().findAllByCriteria(criteria);
+ if (log.isDebugEnabled()) {
+ log.debug("rows:" + rows);
+ log.debug("page:" + page);
- setWikitties(result.getAll());
+ log.debug("first:" + first);
+ log.debug("last:" + last);
- if (log.isTraceEnabled()) {
- log.trace("result: " + getWikitties());
- }
+ log.debug("sord:" + sord);
+ log.debug("sidx:" + sidx);
- setRecords(result.getNumFound());
- setTotal((int) Math.ceil((double) getRecords() / (double) getRows()));
+ log.debug("wikittyExtension:" + wikittyExtension);
+ log.debug("searchString: " + fulltextSearch);
+ log.debug("filters: " + filters);
+ log.debug("criteria: " + criteria);
+ }
- gridModel = new ArrayList<Map<String, Object>>();
- for (Wikitty w:wikitties) {
- Map<String, Object> map = wikittyToMap(w);
- gridModel.add(map);
- }
+ PagedResult<Wikitty> result = getChoremProxy().findAllByCriteria(criteria);
- return SUCCESS;
- } catch (Exception eee) {
- log.error(String.format("Can't find wikitty '%s'", wikittyExtension), eee);
- throw new UnhandledException(eee);
+ setWikitties(result.getAll());
+
+ if (log.isTraceEnabled()) {
+ log.trace("result: " + getWikitties());
}
+
+ setRecords(result.getNumFound());
+ setTotal((int) Math.ceil((double) getRecords() / (double) getRows()));
+
+ gridModel = new ArrayList<Map<String, Object>>();
+ for (Wikitty w:wikitties) {
+ Map<String, Object> map = wikittyToMap(w);
+ gridModel.add(map);
+ }
}
protected Map<String, Object> wikittyToMap(Wikitty w) {
Map<String, Object> result = new HashMap<String, Object>();
- String wid = w.getId();
+ if (w != null) {
+ String wid = w.getId();
- result.put("id", wid);
- result.putAll(w.getFieldValue());
- for (String fieldToLoad:getWikittyLinkToLoadCache()) {
- String linkId = (String)w.getFqField(fieldToLoad);
- if (linkId != null) {
- // TODO poussin 20111107 pas tres optimal de faire une requete a chaque besoin
- // il faudrait collecter les ids, pour faire une seule demande pour tous
- // mais tant que pour le deploiement, tout est sur le meme serveur
- // si un peu moins genant
- Wikitty wlink = getChoremProxy().restore(linkId);
- Map<String, Object> map = wikittyToMap(wlink);
- map.remove("id");
- result.putAll(map);
+ result.put("id", wid);
+ result.putAll(w.getFieldValue());
+ for (String fieldToLoad:getWikittyLinkToLoadCache()) {
+ String linkId = (String)w.getFqField(fieldToLoad);
+ if (linkId != null) {
+ // TODO poussin 20111107 pas tres optimal de faire une requete a chaque besoin
+ // il faudrait collecter les ids, pour faire une seule demande pour tous
+ // mais tant que pour le deploiement, tout est sur le meme serveur
+ // si un peu moins genant
+ Wikitty wlink = getChoremProxy().restore(linkId);
+ Map<String, Object> map = wikittyToMap(wlink);
+ map.remove("id");
+ result.putAll(map);
+ }
}
}
return result;
@@ -281,6 +356,85 @@
return wikittyLinkToLoadCache;
}
+ public String getRowid() {
+ return rowid;
+ }
+
+ public void setRowid(String rowid) {
+ this.rowid = rowid;
+ }
+
+ public String getWikittyLinkFieldForRowId() {
+ return wikittyLinkFieldForRowId;
+ }
+
+ public void setWikittyLinkFieldForRowId(String wikittyLinkFieldForRowId) {
+ this.wikittyLinkFieldForRowId = wikittyLinkFieldForRowId;
+ }
+
+ public boolean isDeleteAllLink() {
+ return deleteAllLink;
+ }
+
+ public void setDeleteAllLink(boolean deleteAllLink) {
+ this.deleteAllLink = deleteAllLink;
+ }
+
+ public void setWikittyLinkToLoad(String wikittyLinkToLoad) {
+ this.wikittyLinkToLoad = wikittyLinkToLoad;
+ }
+
+ public void setParameters(Map<String, String[]> parameters) {
+ this.parameters = parameters;
+ }
+ public void setFilters(String filters) {
+ this.filters = filters;
+ }
+
+ public void setWikittyExtension(String wikittyExtension) {
+ this.wikittyExtension = wikittyExtension;
+ }
+
+ public void setFulltextSearch(String fulltextSearch) {
+ this.fulltextSearch = fulltextSearch;
+ }
+
+ public void setOper(String oper) {
+ this.oper = oper;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public void setPage(Integer page) {
+ this.page = page;
+ }
+
+ public void setSord(String sord) {
+ this.sord = sord;
+ }
+
+ public void setSidx(String sidx) {
+ this.sidx = sidx;
+ }
+
+ public void setRows(Integer rows) {
+ this.rows = rows;
+ }
+
+ public void setRecords(Integer records) {
+ this.records = records;
+ }
+
+ public void setTotal(Integer total) {
+ this.total = total;
+ }
+
+ public List getWikitties() {
+ return wikitties;
+ }
+
public void setWikitties(List<Wikitty> wikitties) {
this.wikitties = wikitties;
}
Modified: trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/EmployeeAction.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/EmployeeAction.java 2011-11-08 17:46:52 UTC (rev 129)
+++ trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/EmployeeAction.java 2011-11-19 17:17:08 UTC (rev 130)
@@ -11,6 +11,8 @@
import org.nuiton.wikitty.search.Search;
import com.opensymphony.xwork2.ActionContext;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
import static org.nuiton.i18n.I18n.n_;
@@ -43,9 +45,12 @@
person = proxy.restore(Person.class, personId);
employee = proxy.restore(Employee.class, employeeId);
- if (person != null && employee != null) {
+ if (person != null) {
+ if (employee == null) {
+ employee = new EmployeeImpl();
+ }
//If the user wants to update the employee's details
- employee.setDiploma(diploma);
+// employee.setDiploma(diploma);
try {
employee.setPaidLeave(Float.parseFloat(paidLeave));
if (employee.getPaidLeave() < 0) {
@@ -66,33 +71,53 @@
addActionError(
getText(n_("chorem.bonzoms.employee.rtt.wrongFormat")));
}
- proxy.store(employee);
- } else if (person != null && employee == null) {
- //If the user wants to enter the employee's details
- employee = new EmployeeImpl();
-
- employee.setPerson(personId);
- employee.setDiploma(diploma);
+
+ employee.setType(type);
+ employee.setDescription(description);
try {
- employee.setPaidLeave(Float.parseFloat(paidLeave));
- if (employee.getPaidLeave() < 0) {
- throw new NumberFormatException();
- }
+ //Replaces the (possible) comma by a dot, so the string can be
+ //parsed successfully as a float
+ salary = salary.replace(',', '.');
+ employee.setSalary(Float.parseFloat(salary));
} catch (NumberFormatException e) {
result = INPUT;
addActionError(
- getText(n_("chorem.bonzoms.employee.paidLeave.wrongFormat")));
+ getText(n_("chorem.bonzoms.employmentContract.salary.wrongFormat")));
}
try {
- employee.setRtt(Float.parseFloat(rtt));
- if (employee.getRtt() < 0) {
- throw new NumberFormatException();
- }
+ //Replaces the (possible) comma by a dot, so the string can be
+ //parsed successfully as a float
+ workingTime = workingTime.replace(',', '.');
+ employee.setWorkingTime(Float.parseFloat(workingTime));
} catch (NumberFormatException e) {
result = INPUT;
addActionError(
- getText(n_("chorem.bonzoms.employee.rtt.wrongFormat")));
+ getText(n_("chorem.bonzoms.employmentContract.workingTime.wrongFormat")));
}
+
+
+ SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
+
+ //Lenient mode disabled because results may be very odd
+ formatter.setLenient(false);
+ try {
+
+ employee.setBeginDate(formatter.parse(beginDate));
+
+ if (!endDate.isEmpty()) { //If the contract is not permanent
+ employee.setEndDate(formatter.parse(endDate));
+ //If the end date is anterior to the begin date (...)
+ if (employee.getEndDate().before(employee.getBeginDate())) {
+ result = ERROR;
+ addActionError(getText(n_("chorem.endDate.afterBegin")));
+ }
+ }
+ } catch (ParseException e) {
+ //If the date doesn't match the format above
+ result = ERROR;
+ addActionError(getText(n_("chorem.date.wrongFormat")));
+ }
+
proxy.store(employee);
} else {
result = ERROR;
@@ -102,9 +127,15 @@
protected String personId;
protected String employeeId;
- protected String diploma;
+// protected String diploma;
protected String paidLeave;
protected String rtt;
+ protected String type;
+ protected String description;
+ protected String salary;
+ protected String workingTime;
+ protected String beginDate;
+ protected String endDate;
/**
* Gets the employee's information
@@ -149,21 +180,21 @@
this.employeeId = employeeId;
}
- /**
- * @return the diploma
- */
- public String getDiploma() {
- return diploma;
- }
+// /**
+// * @return the diploma
+// */
+// public String getDiploma() {
+// return diploma;
+// }
+//
+// /**
+// * @param diploma the diploma to set
+// */
+// public void setDiploma(String diploma) {
+// this.diploma = diploma;
+// }
/**
- * @param diploma the diploma to set
- */
- public void setDiploma(String diploma) {
- this.diploma = diploma;
- }
-
- /**
* @return the paidLeave
*/
public String getPaidLeave() {
@@ -190,4 +221,53 @@
public void setRtt(String rtt) {
this.rtt = rtt;
}
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getSalary() {
+ return salary;
+ }
+
+ public void setSalary(String salary) {
+ this.salary = salary;
+ }
+
+ public String getWorkingTime() {
+ return workingTime;
+ }
+
+ public void setWorkingTime(String workingTime) {
+ this.workingTime = workingTime;
+ }
+
+ public String getBeginDate() {
+ return beginDate;
+ }
+
+ public void setBeginDate(String beginDate) {
+ this.beginDate = beginDate;
+ }
+
+ public String getEndDate() {
+ return endDate;
+ }
+
+ public void setEndDate(String endDate) {
+ this.endDate = endDate;
+ }
+
}
Deleted: trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/EmploymentContractAction.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/EmploymentContractAction.java 2011-11-08 17:46:52 UTC (rev 129)
+++ trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/EmploymentContractAction.java 2011-11-19 17:17:08 UTC (rev 130)
@@ -1,354 +0,0 @@
-package org.chorem.bonzoms.action;
-
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.List;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.chorem.ChoremProxy;
-import org.chorem.action.ChoremBaseAction;
-import org.chorem.bonzoms.EmployeeFull;
-import org.chorem.entities.Employee;
-import org.chorem.entities.EmploymentContract;
-import org.chorem.entities.EmploymentContractImpl;
-import org.chorem.gepeto.EmploymentContractFull;
-import org.nuiton.wikitty.search.Criteria;
-import org.nuiton.wikitty.search.PagedResult;
-import org.nuiton.wikitty.search.Search;
-
-import com.opensymphony.xwork2.ActionContext;
-
-import static org.nuiton.i18n.I18n.n_;
-
-/**
- * Employment contract management class
- *
- * @author vbriand
- */
-public class EmploymentContractAction extends ChoremBaseAction {
-
- private static final long serialVersionUID = -5841507190565206548L;
-
- private static final Log log = LogFactory.getLog(EmploymentContractAction.class);
-
- static public EmploymentContractAction getAction() {
- return (EmploymentContractAction)ActionContext.getContext().get(CONTEXT_ACTION_KEY);
- }
-
- /**
- * Adds a new employment contract
- *
- * @return INPUT if the mandatory fields haven't all been filled in,
- * SUCCESS if the employment contract has been added successfully,
- * ERROR if an error occurred
- */
- public String add() {
- String result = INPUT;
-
- if (type != null && description != null && salary != null &&
- workingTime != null && beginDate != null && endDate != null) {
- if (!type.isEmpty() && !description.isEmpty() &&
- !salary.isEmpty() && !workingTime.isEmpty() &&
- !beginDate.isEmpty()) {
- //If the employment contract has been added successfully
- if (addEmploymentContract()) {
- result = SUCCESS;
- } else {
- result = ERROR;
- }
- }
- }
- return result;
- }
-
- /**
- * Modifies the employment contract's information
- *
- * @return SUCCESS if the employment contract has been successfully modified,
- * ERROR if the id is invalid
- */
- public String modify() {
- String result = SUCCESS;
- EmploymentContract employmentContract;
- ChoremProxy proxy = getChoremProxy();
-
- employmentContract = proxy.restore(EmploymentContract.class,
- employmentContractId);
- if (employmentContract != null) { //If the id exists
- employmentContract.setType(type);
- employmentContract.setDescription(description);
- try {
- //Replaces the (possible) comma by a dot, so the string can be
- //parsed successfully as a float
- salary = salary.replace(',', '.');
- employmentContract.setSalary(Float.parseFloat(salary));
- } catch (NumberFormatException e) {
- result = INPUT;
- addActionError(
- getText(n_("chorem.bonzoms.employmentContract.salary.wrongFormat")));
- }
- try {
- employmentContract.setWorkingTime(Integer.parseInt(workingTime));
- } catch (NumberFormatException e) {
- result = INPUT;
- addActionError(
- getText(n_("chorem.bonzoms.employmentContract.workingTime.wrongFormat")));
- }
- proxy.store(employmentContract);
- } else {
- result = ERROR;
- }
- return result;
- }
-
- protected String type;
- protected String description;
- protected String salary;
- protected String workingTime;
- protected String beginDate;
- protected String endDate;
- protected String personId;
- protected String employeeId;
- protected String employmentContractId;
-
- /**
- * Gets the employments contracts of the employee
- *
- * @return a list containing all employment contracts
- */
- public List<EmploymentContractFull> getEmploymentContracts() {
- ChoremProxy proxy = getChoremProxy();
- Search search = Search.query();
- Criteria criteria = search.exteq(EmploymentContract.EXT_EMPLOYMENTCONTRACT).
- associated(EmploymentContract.FQ_FIELD_EMPLOYMENTCONTRACT_EMPLOYEE).
- eq(Employee.FQ_FIELD_EMPLOYEE_PERSON, personId).criteria();
- PagedResult<EmploymentContract> result = proxy.findAllByCriteria(
- EmploymentContract.class, criteria);
- List<EmploymentContract> employmentContracts = result.getAll();
- List<EmploymentContractFull> employmentContractsFull = new ArrayList<EmploymentContractFull>();
- EmploymentContractFull employeeTmp;
- EmployeeFull employee;
-
- for (EmploymentContract employmentContract : employmentContracts) {
- employeeTmp = new EmploymentContractFull();
-
- employeeTmp.setEmploymentContract(employmentContract);
- employee = EmployeeFull.initEmployee(employmentContract.getEmployee(),
- proxy);
- employeeTmp.setEmployee(employee);
- employmentContractsFull.add(employeeTmp);
- }
- return employmentContractsFull;
- }
-
- /**
- * Retrieves the employment contract linked with the id
- *
- * @return the employment contract
- */
- public EmploymentContractFull getEmploymentContract() {
- EmployeeFull employee;
- ChoremProxy proxy = getChoremProxy();
- EmploymentContract employmentContract;
- EmploymentContractFull employmentContractFull = new EmploymentContractFull();
-
- employmentContract = proxy.restore(EmploymentContract.class,
- employmentContractId);
- employmentContractFull.setEmploymentContract(employmentContract);
- employee = EmployeeFull.initEmployee(employmentContract.getEmployee(),
- proxy);
- employmentContractFull.setEmployee(employee);
- return employmentContractFull;
- }
-
- /**
- * Stores the new employment contract through the proxy
- *
- * @return true if the employment contract has been stored properly,
- * false if a problem occurred
- */
- protected boolean addEmploymentContract() {
- boolean result = true;
-
- try {
- ChoremProxy proxy = getChoremProxy();
- EmploymentContractImpl newEmploymentContract = new EmploymentContractImpl();
- SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
-
- //Lenient mode disabled because results may be very odd
- formatter.setLenient(false);
- try {
- Calendar cal = Calendar.getInstance();
-
- newEmploymentContract.setBeginDate(formatter.parse(beginDate));
-
- //Subtracts 1 day to the current time so the next test willn't
- //fail if the begin date is today's date, as the before() method
- //is exclusive
- cal.add(Calendar.DAY_OF_MONTH, -1);
- //If the begin date is set before the current date
- if (newEmploymentContract.getBeginDate().before(cal.getTime())) {
- result = false;
- addFieldError("beginDate", getText(n_("chorem.beginDate.beforeToday")));
- }
-
- if (!endDate.isEmpty()) { //If the contract is not permanent
- newEmploymentContract.setEndDate(formatter.parse(endDate));
- //If the end date is anterior to the begin date (...)
- if (newEmploymentContract.getEndDate().before(newEmploymentContract.getBeginDate())) {
- result = false;
- addActionError(getText(n_("chorem.endDate.afterBegin")));
- }
- }
- } catch (ParseException e) {
- //If the date doesn't match the format above
- result = false;
- addActionError(getText(n_("chorem.date.wrongFormat")));
- }
- newEmploymentContract.setDescription(description);
- newEmploymentContract.setSalary(Float.parseFloat(salary));
- newEmploymentContract.setType(type);
- newEmploymentContract.setWorkingTime(Integer.parseInt(workingTime));
- newEmploymentContract.setEmployee(employeeId);
-
- //If everything went smoothly
- if (result) {
- proxy.store(newEmploymentContract);
- }
- } catch (Exception e) {
- result = false;
- addActionError(getText(n_("chorem.create.error")));
- log.error("An error occurred while creating a new employment contract", e);
- }
- return result;
- }
-
- /**
- * @return the type
- */
- public String getType() {
- return type;
- }
-
- /**
- * @param type the type to set
- */
- public void setType(String type) {
- this.type = type;
- }
-
- /**
- * @return the description
- */
- public String getDescription() {
- return description;
- }
-
- /**
- * @param description the description to set
- */
- public void setDescription(String description) {
- this.description = description;
- }
-
- /**
- * @return the salary
- */
- public String getSalary() {
- return salary;
- }
-
- /**
- * @param salary the salary to set
- */
- public void setSalary(String salary) {
- this.salary = salary;
- }
-
- /**
- * @return the workingTime
- */
- public String getWorkingTime() {
- return workingTime;
- }
-
- /**
- * @param workingTime the workingTime to set
- */
- public void setWorkingTime(String workingTime) {
- this.workingTime = workingTime;
- }
-
- /**
- * @return the beginDate
- */
- public String getBeginDate() {
- return beginDate;
- }
-
- /**
- * @param beginDate the beginDate to set
- */
- public void setBeginDate(String beginDate) {
- this.beginDate = beginDate;
- }
-
- /**
- * @return the endDate
- */
- public String getEndDate() {
- return endDate;
- }
-
- /**
- * @param endDate the endDate to set
- */
- public void setEndDate(String endDate) {
- this.endDate = endDate;
- }
-
- /**
- * @return the personId
- */
- public String getPersonId() {
- return personId;
- }
-
- /**
- * @param personId the personId to set
- */
- public void setPersonId(String personId) {
- this.personId = personId;
- }
-
- /**
- * @return the employmentContractId
- */
- public String getEmploymentContractId() {
- return employmentContractId;
- }
-
- /**
- * @param employmentContractId the employmentContractId to set
- */
- public void setEmploymentContractId(String employmentContractId) {
- this.employmentContractId = employmentContractId;
- }
-
- /**
- * @return the employeeId
- */
- public String getEmployeeId() {
- return employeeId;
- }
-
- /**
- * @param employeeId the employeeId to set
- */
- public void setEmployeeId(String employeeId) {
- this.employeeId = employeeId;
- }
-}
Modified: trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/PersonAction.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/PersonAction.java 2011-11-08 17:46:52 UTC (rev 129)
+++ trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/PersonAction.java 2011-11-19 17:17:08 UTC (rev 130)
@@ -2,7 +2,6 @@
import java.text.ParseException;
import java.text.SimpleDateFormat;
-import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@@ -11,16 +10,12 @@
import org.chorem.ChoremProxy;
import org.chorem.ContactDetailsConstants;
import org.chorem.action.ChoremBaseAction;
-import org.chorem.bonzoms.EmployeeFull;
import org.chorem.entities.Company;
import org.chorem.entities.ContactDetailsImpl;
import org.chorem.entities.Employee;
import org.chorem.entities.EmployeeImpl;
-import org.chorem.entities.EmploymentContract;
-import org.chorem.entities.EmploymentContractImpl;
import org.chorem.entities.Person;
import org.chorem.entities.PersonImpl;
-import org.chorem.gepeto.EmploymentContractFull;
import org.nuiton.wikitty.search.Criteria;
import org.nuiton.wikitty.search.PagedResult;
import org.nuiton.wikitty.search.Search;
@@ -90,7 +85,8 @@
setFirstName(person.getFirstName());
setLastName(person.getLastName());
- setEmail(person.getEmail());
+ setDiploma(person.getDiploma());
+// setEmail(person.getEmail());
if (person.getBirthDate() != null) {
setBirthDate(formatter.format(person.getBirthDate()));
}
@@ -118,7 +114,8 @@
person = proxy.restore(Person.class, personId);
if (person != null) {
- person.setEmail(email);
+ person.setDiploma(diploma);
+// person.setEmail(email);
proxy.store(person);
} else {
result = ERROR;
@@ -128,6 +125,7 @@
protected String firstName;
protected String lastName;
+ protected String diploma;
protected String email;
protected String birthDate;
protected String addressLine1;
@@ -164,10 +162,6 @@
newPerson.setFirstName(firstName);
newPerson.setLastName(lastName);
- if (StringUtils.isNotBlank(email)) {
- newPerson.setEmail(email);
- }
-
if (StringUtils.isNotBlank(birthDate)) {
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
//Lenient mode disabled because results may be very odd
@@ -208,14 +202,25 @@
proxy.store(newContactDetails);
}
- if (result) {
- result = storeEmployee(newPerson, result, proxy);
- if (result) {
- //Useful to redirect the user directly to the person's page
- setPersonId(newPerson.getWikittyId());
- proxy.store(newPerson);
- }
+ if (StringUtils.isNotBlank(email)) {
+// newPerson.setEmail(email);
+ newContactDetails = new ContactDetailsImpl();
+ newContactDetails.setName(CONTACT_DETAILS_EMAIL +
+ " of person \"" + firstName + " " + lastName + "\"");
+ newContactDetails.setType(CONTACT_DETAILS_EMAIL);
+ newContactDetails.setValue(email);
+ newContactDetails.setTarget(newPerson.getWikittyId());
+ proxy.store(newContactDetails);
}
+
+// if (result) {
+// result = storeEmployee(newPerson, result, proxy);
+// if (result) {
+// //Useful to redirect the user directly to the person's page
+// setPersonId(newPerson.getWikittyId());
+// proxy.store(newPerson);
+// }
+// }
}
} catch (Exception e) {
result = false;
@@ -225,132 +230,132 @@
return result;
}
- /**
- * Stores the employee details and links them to the person
- *
- * @param newPerson the person to link the employee details with
- * @param result whether or not the previous operations went smoothly
- * @param proxy the wikitty proxy
- * @return true if no errors occurred, false otherwise
- */
- protected boolean storeEmployee(PersonImpl newPerson, boolean result,
- ChoremProxy proxy) {
- EmployeeImpl newEmployee = new EmployeeImpl();
-
- newEmployee.setPerson(newPerson.getWikittyId());
- newEmployee.setDiploma(employeeDiploma);
-
- if (StringUtils.isNotBlank(employeePaidLeave)) {
- try {
- newEmployee.setPaidLeave(
- Float.parseFloat(employeePaidLeave));
- if (newEmployee.getPaidLeave() < 0) {
- throw new NumberFormatException();
- }
- } catch (NumberFormatException e) {
- result = false;
- addFieldError("employeePaidLeave", getText(
- n_("chorem.bonzoms.employee.paidLeave.wrongFormat")));
- }
- }
-
- if (StringUtils.isNotBlank(employeeRtt)) {
- try {
- newEmployee.setRtt(Float.parseFloat(employeeRtt));
- if (newEmployee.getRtt() < 0) {
- throw new NumberFormatException();
- }
- } catch (NumberFormatException e) {
- result = false;
- addFieldError("employeeRtt", getText(
- n_("chorem.bonzoms.employee.rtt.wrongFormat")));
- }
- }
-
- if (StringUtils.isNotBlank(companyId)) {
- if (proxy.restore(Company.class, companyId) != null) {
- newEmployee.setCompany(companyId);
- } else { //If the id doesn't exist or is invalid
- addActionError(getText(n_("chorem.bonzoms.employee.invalidCompany")));
- result = false;
- }
- }
-
- if (result) {
- result = storeEmploymentContract(newEmployee, result, proxy);
- if (result) {
- proxy.store(newEmployee);
- }
- }
- return result;
- }
+// /**
+// * Stores the employee details and links them to the person
+// *
+// * @param newPerson the person to link the employee details with
+// * @param result whether or not the previous operations went smoothly
+// * @param proxy the wikitty proxy
+// * @return true if no errors occurred, false otherwise
+// */
+// protected boolean storeEmployee(PersonImpl newPerson, boolean result,
+// ChoremProxy proxy) {
+// EmployeeImpl newEmployee = new EmployeeImpl();
+//
+// newEmployee.setPerson(newPerson.getWikittyId());
+// newEmployee.setDiploma(employeeDiploma);
+//
+// if (StringUtils.isNotBlank(employeePaidLeave)) {
+// try {
+// newEmployee.setPaidLeave(
+// Float.parseFloat(employeePaidLeave));
+// if (newEmployee.getPaidLeave() < 0) {
+// throw new NumberFormatException();
+// }
+// } catch (NumberFormatException e) {
+// result = false;
+// addFieldError("employeePaidLeave", getText(
+// n_("chorem.bonzoms.employee.paidLeave.wrongFormat")));
+// }
+// }
+//
+// if (StringUtils.isNotBlank(employeeRtt)) {
+// try {
+// newEmployee.setRtt(Float.parseFloat(employeeRtt));
+// if (newEmployee.getRtt() < 0) {
+// throw new NumberFormatException();
+// }
+// } catch (NumberFormatException e) {
+// result = false;
+// addFieldError("employeeRtt", getText(
+// n_("chorem.bonzoms.employee.rtt.wrongFormat")));
+// }
+// }
+//
+// if (StringUtils.isNotBlank(companyId)) {
+// if (proxy.restore(Company.class, companyId) != null) {
+// newEmployee.setCompany(companyId);
+// } else { //If the id doesn't exist or is invalid
+// addActionError(getText(n_("chorem.bonzoms.employee.invalidCompany")));
+// result = false;
+// }
+// }
+//
+// if (result) {
+// result = storeEmploymentContract(newEmployee, result, proxy);
+// if (result) {
+// proxy.store(newEmployee);
+// }
+// }
+// return result;
+// }
+//
+// /**
+// * Stores an employment contract and links it with the person
+// *
+// * @param employee the employee to link the contract with
+// * @param result whether or not the previous operations went smoothly
+// * @param proxy the wikitty proxy
+// * @return true if no errors occurred, false otherwise
+// */
+// protected boolean storeEmploymentContract(EmployeeImpl employee,
+// boolean result, ChoremProxy proxy) {
+//
+// EmploymentContractImpl newEmploymentContract =
+// new EmploymentContractImpl();
+//
+// newEmploymentContract.setEmployee(employee.getWikittyId());
+// newEmploymentContract.setType(contractType);
+// newEmploymentContract.setDescription(contractDescription);
+//
+// SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
+// if (StringUtils.isNotBlank(contractBeginDate)) {
+// try {
+// newEmploymentContract.setBeginDate(
+// formatter.parse(contractBeginDate));
+// } catch (ParseException e) {
+// addActionError(getText(n_("chorem.date.wrongFormat.contractBegin")));
+// result = false;
+// }
+// }
+//
+// if (StringUtils.isNotBlank(contractEndDate)) {
+// try {
+// newEmploymentContract.setEndDate(
+// formatter.parse(contractEndDate));
+// } catch (ParseException e) {
+// addActionError(getText(n_("chorem.date.wrongFormat.contractEnd")));
+// result = false;
+// }
+// }
+//
+// if (StringUtils.isNotBlank(contractSalary)) {
+// try {
+// newEmploymentContract.setSalary(Float.parseFloat(contractSalary));
+// } catch (NumberFormatException e) {
+// addFieldError("contractSalary",
+// getText(n_("chorem.bonzoms.employmentContract.salary.wrongFormat")));
+// result = false;
+// }
+// }
+//
+// if (StringUtils.isNotBlank(contractWorkingTime)) {
+// try {
+// newEmploymentContract.setWorkingTime(
+// Integer.parseInt(contractWorkingTime));
+// } catch (NumberFormatException e) {
+// addFieldError("contractWorkingTime",
+// getText(n_("chorem.bonzoms.employmentContract.workingTime.wrongFormat")));
+// result = false;
+// }
+// }
+//
+// if (result) {
+// proxy.store(newEmploymentContract);
+// }
+// return result;
+// }
- /**
- * Stores an employment contract and links it with the person
- *
- * @param employee the employee to link the contract with
- * @param result whether or not the previous operations went smoothly
- * @param proxy the wikitty proxy
- * @return true if no errors occurred, false otherwise
- */
- protected boolean storeEmploymentContract(EmployeeImpl employee,
- boolean result, ChoremProxy proxy) {
-
- EmploymentContractImpl newEmploymentContract =
- new EmploymentContractImpl();
-
- newEmploymentContract.setEmployee(employee.getWikittyId());
- newEmploymentContract.setType(contractType);
- newEmploymentContract.setDescription(contractDescription);
-
- SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
- if (StringUtils.isNotBlank(contractBeginDate)) {
- try {
- newEmploymentContract.setBeginDate(
- formatter.parse(contractBeginDate));
- } catch (ParseException e) {
- addActionError(getText(n_("chorem.date.wrongFormat.contractBegin")));
- result = false;
- }
- }
-
- if (StringUtils.isNotBlank(contractEndDate)) {
- try {
- newEmploymentContract.setEndDate(
- formatter.parse(contractEndDate));
- } catch (ParseException e) {
- addActionError(getText(n_("chorem.date.wrongFormat.contractEnd")));
- result = false;
- }
- }
-
- if (StringUtils.isNotBlank(contractSalary)) {
- try {
- newEmploymentContract.setSalary(Float.parseFloat(contractSalary));
- } catch (NumberFormatException e) {
- addFieldError("contractSalary",
- getText(n_("chorem.bonzoms.employmentContract.salary.wrongFormat")));
- result = false;
- }
- }
-
- if (StringUtils.isNotBlank(contractWorkingTime)) {
- try {
- newEmploymentContract.setWorkingTime(
- Integer.parseInt(contractWorkingTime));
- } catch (NumberFormatException e) {
- addFieldError("contractWorkingTime",
- getText(n_("chorem.bonzoms.employmentContract.workingTime.wrongFormat")));
- result = false;
- }
- }
-
- if (result) {
- proxy.store(newEmploymentContract);
- }
- return result;
- }
-
/**
* Gets the list of all companies
*
@@ -365,35 +370,35 @@
return companies;
}
- /**
- * Gets the employee's employments contracts
- *
- * @return a list containing all employment contracts
- */
- public List<EmploymentContractFull> getEmploymentContracts() {
- ChoremProxy proxy = getChoremProxy();
- Search search = Search.query();
- Criteria criteria = search.exteq(EmploymentContract.EXT_EMPLOYMENTCONTRACT).
- associated(EmploymentContract.FQ_FIELD_EMPLOYMENTCONTRACT_EMPLOYEE).
- eq(Employee.FQ_FIELD_EMPLOYEE_PERSON, personId).criteria();
- PagedResult<EmploymentContract> result = proxy.findAllByCriteria(
- EmploymentContract.class, criteria);
- List<EmploymentContract> employmentContracts = result.getAll();
- List<EmploymentContractFull> employmentContractsFull = new ArrayList<EmploymentContractFull>();
- EmploymentContractFull employeeTmp;
- EmployeeFull employee;
-
- for (EmploymentContract employmentContract : employmentContracts) {
- employeeTmp = new EmploymentContractFull();
-
- employeeTmp.setEmploymentContract(employmentContract);
- employee = EmployeeFull.initEmployee(employmentContract.getEmployee(),
- proxy);
- employeeTmp.setEmployee(employee);
- employmentContractsFull.add(employeeTmp);
- }
- return employmentContractsFull;
- }
+// /**
+// * Gets the employee's employments contracts
+// *
+// * @return a list containing all employment contracts
+// */
+// public List<EmploymentContractFull> getEmploymentContracts() {
+// ChoremProxy proxy = getChoremProxy();
+// Search search = Search.query();
+// Criteria criteria = search.exteq(EmploymentContract.EXT_EMPLOYMENTCONTRACT).
+// associated(EmploymentContract.FQ_FIELD_EMPLOYMENTCONTRACT_EMPLOYEE).
+// eq(Employee.FQ_FIELD_EMPLOYEE_PERSON, personId).criteria();
+// PagedResult<EmploymentContract> result = proxy.findAllByCriteria(
+// EmploymentContract.class, criteria);
+// List<EmploymentContract> employmentContracts = result.getAll();
+// List<EmploymentContractFull> employmentContractsFull = new ArrayList<EmploymentContractFull>();
+// EmploymentContractFull employeeTmp;
+// EmployeeFull employee;
+//
+// for (EmploymentContract employmentContract : employmentContracts) {
+// employeeTmp = new EmploymentContractFull();
+//
+// employeeTmp.setEmploymentContract(employmentContract);
+// employee = EmployeeFull.initEmployee(employmentContract.getEmployee(),
+// proxy);
+// employeeTmp.setEmployee(employee);
+// employmentContractsFull.add(employeeTmp);
+// }
+// return employmentContractsFull;
+// }
/**
* Gets the list of all persons
@@ -453,6 +458,14 @@
public void setLastName(String lastName) {
this.lastName = lastName;
}
+
+ public String getDiploma() {
+ return diploma;
+ }
+
+ public void setDiploma(String diploma) {
+ this.diploma = diploma;
+ }
/**
* @return the email
Deleted: trunk/chorem-web/src/main/java/org/chorem/gepeto/EmploymentContractFull.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/gepeto/EmploymentContractFull.java 2011-11-08 17:46:52 UTC (rev 129)
+++ trunk/chorem-web/src/main/java/org/chorem/gepeto/EmploymentContractFull.java 2011-11-19 17:17:08 UTC (rev 130)
@@ -1,40 +0,0 @@
-package org.chorem.gepeto;
-
-import org.chorem.bonzoms.EmployeeFull;
-import org.chorem.entities.EmploymentContract;
-
-/**
- * @author vbriand
- */
-public class EmploymentContractFull {
- protected EmployeeFull employee;
- protected EmploymentContract employmentContract;
-
- /**
- * @return the employmentContract
- */
- public EmploymentContract getEmploymentContract() {
- return employmentContract;
- }
-
- /**
- * @param employmentContract the employmentContract to set
- */
- public void setEmploymentContract(EmploymentContract employmentContract) {
- this.employmentContract = employmentContract;
- }
-
- /**
- * @return the employee
- */
- public EmployeeFull getEmployee() {
- return employee;
- }
-
- /**
- * @param employee the employee to set
- */
- public void setEmployee(EmployeeFull employee) {
- this.employee = employee;
- }
-}
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companies.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companies.jsp 2011-11-08 17:46:52 UTC (rev 129)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companies.jsp 2011-11-19 17:17:08 UTC (rev 130)
@@ -17,59 +17,156 @@
<s:url id="companyDetails" namespace="/bonzoms" action="companyDetails"/>
<script type="text/javascript">
- function formatCompanyNameLink(cellvalue, options, rowObject) {
- return "<a href='<s:property value="companyDetails"/>?companyId="+rowObject['Employee.company']+"'>" + cellvalue + "</a>";
+ function formatCompanyIdLink(cellvalue, options, rowObject) {
+ return "<a href='<s:property value="companyDetails"/>?companyId="+rowObject['id']+"'>voir</a>";
}
+ function formatCompanyLink(cellvalue, options, rowObject) {
+ return "<a href='<s:property value="companyDetails"/>?companyId="+rowObject['id']+"'>" + cellvalue + "</a>";
+ }
</script>
<s:url id="personDetails" namespace="/bonzoms" action="personDetails"/>
<script type="text/javascript">
function formatPersonNameLink(cellvalue, options, rowObject) {
- return "<a href='<s:property value="personDetails"/>?personId="+rowObject['Employee.person']+"'>" + cellvalue + "</a>";
+ return "<a href='<s:property value="personDetails"/>?personId="+rowObject['id']+"'>" + cellvalue + "</a>";
}
</script>
<%-- Partie generique (ou presque, ce ne sont que des variables qui change) --%>
- <s:url id="remoteurlFulltextSearch" namespace="/" action="EntitySearchJson" escapeAmp="false">
+ <s:url id="listCompanyUrl" namespace="/" action="EntitySearchJson" escapeAmp="false">
+ <s:param name="wikittyExtension">Company</s:param>
+ </s:url>
+
+ <s:url id="listContactDetailsUrl" namespace="/" action="EntitySearchJson" escapeAmp="false">
+ <s:param name="wikittyExtension">ContactDetails</s:param>
+ </s:url>
+
+ <s:url id="listEmployeeUrl" namespace="/" action="EntitySearchJson" escapeAmp="false">
<s:param name="wikittyExtension">Employee</s:param>
<s:param name="wikittyLinkToLoad">Employee.person,Employee.company</s:param>
</s:url>
- <s:url id="remoteurl" namespace="/" action="EntitySearchJson" escapeAmp="false">
- <s:param name="fulltextSearch"><%=StringUtils.defaultString(request.getParameter("fulltextSearch"))%></s:param>
+ <s:url id="editCompanyUrl" namespace="/" action="EntitySearchJson" escapeAmp="false">
+ <s:param name="wikittyExtension">Company</s:param>
+ </s:url>
+
+ <s:url id="editEmployeeUrl" namespace="/" action="EntitySearchJson" escapeAmp="false">
<s:param name="wikittyExtension">Employee</s:param>
- <s:param name="wikittyLinkToLoad">Employee.person,Employee.company</s:param>
</s:url>
+ <s:url id="editContactDetailsUrl" namespace="/" action="EntitySearchJson" escapeAmp="false">
+ <s:param name="wikittyExtension">ContactDetails</s:param>
+ <s:param name="wikittyLinkFieldForRowId">ContactDetails.target</s:param>
+ </s:url>
+
<script type="text/javascript">
var timeoutHnd;
- function doSearch() {
+ function doSearchCompany() {
if(timeoutHnd) {
clearTimeout(timeoutHnd)
}
- timeoutHnd = setTimeout(gridReload, 500)
+ timeoutHnd = setTimeout(gridReloadCompany, 500)
}
- function gridReload() {
- var filter = jQuery("#fulltextSearch").val();
- var gridUrl = "<s:property value="remoteurlFulltextSearch" escapeHtml="false"/>&fulltextSearch="+filter;
- jQuery("#gridtable").jqGrid('setGridParam',{url:gridUrl,page:1}).trigger("reloadGrid");
+ function gridReloadCompany() {
+ var filter = jQuery("#fulltextSearchCompany").val();
+ var gridUrl = "<s:property value="listCompanyUrl" escapeHtml="false"/>&fulltextSearch="+filter;
+ jQuery("#gridCompany").jqGrid('setGridParam',{url:gridUrl,page:1}).trigger("reloadGrid");
}
+
+ $.subscribe('rowselect', function(event, data) {
+ // alert('Selected Row : ' + event.originalEvent.id + ' data: ' + event.originalEvent.status);
+ var gridUrl = "<s:property value="listEmployeeUrl" escapeHtml="false"/>&fulltextSearch=" + event.originalEvent.id;
+ jQuery("#gridEmployee").jqGrid('setGridParam',{url:gridUrl,page:1})
+ .trigger('reloadGrid');
+ });
</script>
<s:form>
- <s:textfield id="fulltextSearch" name="fulltextSearch" onkeydown="doSearch()"></s:textfield>
- <s:submit></s:submit>
+ <s:textfield id="fulltextSearchCompany" name="fulltextSearchCompany" onkeydown="doSearchCompany()"></s:textfield>
</s:form>
- <s:url id="editurl" namespace="/" action="EntitySearchJson" escapeAmp="false">
- </s:url>
+ <sjg:grid
+ id="gridCompany"
+ dataType="json"
+ href="%{listCompanyUrl}"
+ gridModel="gridModel"
+ rowList="10,20,50,100"
+ rowNum="20"
+ rownumbers="true"
+ autowidth="true"
+ sortname="Company.name"
+ sortorder="asc"
+ pager="true"
+ viewrecords="true"
+ multiselect="false"
+
+ editurl="%{editCompanyUrl}"
+ editinline="false"
+
+ onSelectRowTopics="rowselect"
+
+ navigator="true"
+ navigatorAdd="true"
+ navigatorEdit="true"
+ navigatorDelete="true"
+ navigatorView="true"
+ navigatorSearch="true"
+ navigatorAddOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorEditOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorDeleteOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorSearchOptions="{multipleGroup:true,showQuery:true,multipleSearch:true,sopt:['eq','ne','cn','nc','bw','bn','ew','en','lt','le','gt','ge','nu','nn','in','ni']}"
+ >
+
+ <sjg:gridColumn name="id" hidden="true" key="true" title="Action" formatter="formatCompanyIdLink" editable="false" sortable="false"/>
+ <sjg:gridColumn name="Company.name" index="Company.name" title="Société" editable="true" sortable="true"/>
+ <sjg:gridColumn name="Company.type" index="Company.type" title="type" editable="true" sortable="true"/>
+
+ <sjg:grid
+ id="gridCompanyContact"
+ dataType="json"
+ href="%{listContactDetailsUrl}"
+ gridModel="gridModel"
+ rowList="10,20,50,100"
+ rowNum="20"
+ rownumbers="true"
+ autowidth="true"
+ sortname="ContactDetails.type"
+ sortorder="asc"
+ pager="true"
+ viewrecords="true"
+
+ multiselect="false"
+
+ editurl="%{editContactDetailsUrl}"
+ editinline="false"
+
+ navigator="true"
+ navigatorAdd="true"
+ navigatorEdit="true"
+ navigatorDelete="true"
+ navigatorView="true"
+ navigatorSearch="true"
+ navigatorAddOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorEditOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorDeleteOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorSearchOptions="{multipleGroup:true,showQuery:true,multipleSearch:true,sopt:['eq','ne','cn','nc','bw','bn','ew','en','lt','le','gt','ge','nu','nn','in','ni']}"
+ >
+
+ <sjg:gridColumn name="id" hidden="true" key="true" title="id"/>
+ <sjg:gridColumn name="ContactDetails.type" index="ContactDetails.type" title="Type" editable="true" sortable="true"/>
+ <sjg:gridColumn name="ContactDetails.name" index="ContactDetails.name" title="Name" editable="true" sortable="true"/>
+ <sjg:gridColumn name="ContactDetails.value" index="ContactDetails.value" title="Value" editable="true" sortable="true"/>
+ </sjg:grid>
+
+ </sjg:grid>
+
<sjg:grid
- id="gridtable"
+ id="gridEmployee"
dataType="json"
- href="%{remoteurl}"
+ href="%{listEmployeeUrl}"
gridModel="gridModel"
rowList="10,20,50,100"
rowNum="20"
@@ -80,9 +177,9 @@
pager="true"
viewrecords="true"
- multiselect="true"
+ multiselect="false"
- editurl="%{editurl}"
+ editurl="%{editEmployeeUrl}"
editinline="false"
navigator="true"
@@ -98,10 +195,56 @@
>
<sjg:gridColumn name="id" hidden="true" key="true" title="id"/>
- <sjg:gridColumn name="Company.name" index="Company.name" title="Société" formatter="formatCompanyNameLink"/>
- <sjg:gridColumn name="Person.lastName" index="Person.lastName" title="Nom" editable="true" formatter="formatPersonNameLink"/>
- <sjg:gridColumn name="Person.firstName" index="Person.firstName" title="Prénom" editable="true"/>
- <sjg:gridColumn name="Employee.diploma" index="Employee.diploma" title="Diplôme"/>
+ <sjg:gridColumn name="Company.name" index="Company.name" title="Société" sortable="false" formatter="formatCompanyLink" editable="false"/>
+ <sjg:gridColumn name="Person.lastName" index="Person.lastName" title="Nom" sortable="false" formatter="formatPersonNameLink" editable="false"/>
+ <sjg:gridColumn name="Person.firstName" index="Person.firstName" title="Prénom" sortable="false" editable="false"/>
+ <sjg:gridColumn name="Person.diploma" index="Person.diploma" title="Diplôme" sortable="false" editable="false"/>
+ <sjg:gridColumn name="Employee.type" index="Employee.type" title="Type" edittype="select" editoptions="{value:'CDI:CDI;CDD:CDD;Stage:Stage;TNS:TNS'}" editable="true"/>
+ <sjg:gridColumn name="Employee.paidLeave" index="Employee.paidLeave" title="Congé" editrules="{number:true}" editable="true"/>
+ <sjg:gridColumn name="Employee.rtt" index="Employee.rtt" title="RTT" editrules="{number:true}" editable="true"/>
+ <sjg:gridColumn name="Employee.salary" index="Employee.salary" title="Salaire" editrules="{number:true}" editable="true"/>
+ <sjg:gridColumn name="Employee.workingTime" index="Employee.workingTime" title="Temps de travail" editrules="{number:true}" editable="true"/>
+ <sjg:gridColumn name="Employee.description" index="Employee.description" title="Description" edittype="textarea" editable="true"/>
+ <sjg:gridColumn name="Employee.person" index="Employee.person" title="Personne" editable="true" edittype="select" editoptions="{value:'%{selectOption}'}" editrules="{edithidden:true}"/>
+ <sjg:gridColumn name="Employee.company" index="Employee.company" title="Société" hidden="true" editable="true" editrules="{edithidden:true}"/>
+
+ <sjg:grid
+ id="gridEmployeeContact"
+ dataType="json"
+ href="%{listContactDetailsUrl}"
+ gridModel="gridModel"
+ rowList="10,20,50,100"
+ rowNum="20"
+ rownumbers="true"
+ autowidth="true"
+ sortname="ContactDetails.type"
+ sortorder="asc"
+ pager="true"
+ viewrecords="true"
+
+ multiselect="false"
+
+ editurl="%{editContactDetailsUrl}"
+ editinline="false"
+
+ navigator="true"
+ navigatorAdd="true"
+ navigatorEdit="true"
+ navigatorDelete="true"
+ navigatorView="true"
+ navigatorSearch="true"
+ navigatorAddOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorEditOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorDeleteOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorSearchOptions="{multipleGroup:true,showQuery:true,multipleSearch:true,sopt:['eq','ne','cn','nc','bw','bn','ew','en','lt','le','gt','ge','nu','nn','in','ni']}"
+ >
+
+ <sjg:gridColumn name="id" hidden="true" key="true" title="id"/>
+ <sjg:gridColumn name="ContactDetails.type" index="ContactDetails.type" title="Type" editable="true" sortable="true"/>
+ <sjg:gridColumn name="ContactDetails.name" index="ContactDetails.name" title="Name" editable="true" sortable="true"/>
+ <sjg:gridColumn name="ContactDetails.value" index="ContactDetails.value" title="Value" editable="true" sortable="true"/>
+ </sjg:grid>
+
</sjg:grid>
</body>
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/personDetails.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/personDetails.jsp 2011-11-08 17:46:52 UTC (rev 129)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/personDetails.jsp 2011-11-19 17:17:08 UTC (rev 130)
@@ -3,7 +3,7 @@
<%@page import="org.chorem.gepeto.EmploymentContractFull" %>
<%@page import="org.chorem.entities.EmploymentContract" %>
<%@page import="org.chorem.entities.Employee" %>
-<%@page import="java.util.List" %>
+<%@page import="java.util.List" %>dip
<%@taglib prefix="s" uri="/struts-tags" %>
<html xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
@@ -27,7 +27,12 @@
<p>
<s:text name="chorem.bonzoms.person.birthDate" />: <%= person.getBirthDate() %>
<br />
- <s:textfield key="chorem.bonzoms.person.email" name="email" labelSeparator=": " />
+ <label for="diploma"><s:text name="chorem.bonzoms.employee.diploma" /></label>:
+ <% if (person != null) { %>
+ <input type="text" name="diploma" id="diploma" value="<%= person.getDiploma() %>" />
+ <% } else { %>
+ <input type="text" name="diploma" id="diploma" />
+ <% } %>
<br />
<s:submit key="chorem.misc.modify" name="submit" />
</p>
@@ -44,13 +49,6 @@
<% } %>
</s:url>
<form action="${modifyEmployee}" method="post">
- <label for="diploma"><s:text name="chorem.bonzoms.employee.diploma" /></label>:
- <% if (employee != null) { %>
- <input type="text" name="diploma" id="diploma" value="<%= employee.getDiploma() %>" />
- <% } else { %>
- <input type="text" name="diploma" id="diploma" />
- <% } %>
- <br />
<label for="paidLeave"><s:text name="chorem.bonzoms.employee.paidLeave" /></label>:
<% if (employee != null) { %>
<input type="text" name="paidLeave" id="paidLeave" value="<%= employee.getPaidLeave() %>" />
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2011-11-08 17:46:52 UTC (rev 129)
+++ trunk/pom.xml 2011-11-19 17:17:08 UTC (rev 130)
@@ -63,7 +63,7 @@
<wikittyVersion>3.3-SNAPSHOT</wikittyVersion>
<slf4jVersion>1.6.1</slf4jVersion>
<struts2Version>2.2.3</struts2Version>
- <struts2jqueryVersion>3.1.0</struts2jqueryVersion>
+ <struts2jqueryVersion>3.2.0</struts2jqueryVersion>
<xWorkCoreVersion>2.1.6</xWorkCoreVersion>
<javaxMailVersion>1.4.3</javaxMailVersion>
<servletApiVersion>2.5</servletApiVersion>
1
0
r129 - in trunk: . chorem-web/src/main/java/org/chorem/action chorem-web/src/main/resources chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms
by bpoussin@users.chorem.org 08 Nov '11
by bpoussin@users.chorem.org 08 Nov '11
08 Nov '11
Author: bpoussin
Date: 2011-11-08 18:46:52 +0100 (Tue, 08 Nov 2011)
New Revision: 129
Url: http://chorem.org/repositories/revision/chorem/129
Log:
EntitySearchJson permet d'afficher des aggregation de wikitty dans un tableau
Tableau des companies fonctionnel avec la recherche fulltext (suite a modif implantation association dans wikitty)
Modified:
trunk/chorem-web/src/main/java/org/chorem/action/EntitySearchJsonAction.java
trunk/chorem-web/src/main/resources/struts.xml
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companies.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/persons.jsp
trunk/pom.xml
Modified: trunk/chorem-web/src/main/java/org/chorem/action/EntitySearchJsonAction.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/action/EntitySearchJsonAction.java 2011-11-06 17:01:34 UTC (rev 128)
+++ trunk/chorem-web/src/main/java/org/chorem/action/EntitySearchJsonAction.java 2011-11-08 17:46:52 UTC (rev 129)
@@ -1,9 +1,15 @@
package org.chorem.action;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JSONSerializer;
@@ -12,6 +18,9 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.interceptor.ParameterAware;
+import org.nuiton.wikitty.entities.FieldType;
+import org.nuiton.wikitty.entities.Wikitty;
+import org.nuiton.wikitty.entities.WikittyExtension;
import org.nuiton.wikitty.search.Criteria;
import org.nuiton.wikitty.search.PagedResult;
import org.nuiton.wikitty.search.Search;
@@ -52,12 +61,25 @@
// All Record
protected int records = 0;
- protected List gridModel;
+ protected List<Wikitty> wikitties;
+ protected List<Map<String, Object>> gridModel;
+
+ /** la liste des extensions que doit avoir les objets recherchés*/
protected String wikittyExtension;
+ /**
+ * la liste des lien entre wikitty qu'il faut charger
+ * exemple: "Employee.person,Employee.company"
+ */
+ protected String wikittyLinkToLoad;
+ protected Set<String> wikittyLinkToLoadCache;
+ /** la recherche fulltext a faire sur les objets de base (pas les liens) pour les filtrer*/
protected String fulltextSearch = "";
+ /** Recherche multi-critere en syntaxe json
+ * exemple: {"groupOp":"OR","rules":[{"field":"Person.lastName","op":"eq","data":"coq"},{"field":"Person.lastName","op":"ne","data":"Poussin"},{"field":"Person.firstName","op":"eq","data":"benjamin"}]}
+ */
protected String filters;
/** action faite via le grid ['add', 'edit', 'del'], si vide alors une simple recherche */
@@ -67,6 +89,10 @@
protected Map<String, String[]> parameters;
+ public void setWikittyLinkToLoad(String wikittyLinkToLoad) {
+ this.wikittyLinkToLoad = wikittyLinkToLoad;
+ }
+
public void setParameters(Map<String, String[]> parameters) {
this.parameters = parameters;
}
@@ -106,8 +132,8 @@
this.total = total;
}
- public List getGridModel() {
- return gridModel;
+ public List getWikitties() {
+ return wikitties;
}
public String execute() {
try {
@@ -117,18 +143,22 @@
}
}
- Class clazz = Class.forName(wikittyExtension);
-
Search search = Search.query();
+ if (StringUtils.isNotBlank(wikittyExtension)) {
+ Collection<String> col = toCollection(wikittyExtension);
+ search.exteq(col);
+ }
+
if (StringUtils.isNotBlank(filters)) {
JSONObject jsonFilter = (JSONObject) JSONSerializer.toJSON( filters );
String groupOp = jsonFilter.getString("groupOp");
log.debug("groupOp: " + groupOp);
+ Search filter;
if ("or".equalsIgnoreCase(groupOp)) {
- search = search.or();
+ filter = search.or();
} else {
- search = search.and();
+ filter = search.and();
}
JSONArray rules = jsonFilter.getJSONArray("rules");
int rulesCount = JSONArray.getDimensions(rules)[0];
@@ -137,7 +167,7 @@
String field = rule.getString("field");
String op = rule.getString("op");
String data = rule.getString("data");
- addCondition(search, field, op, data);
+ addCondition(filter, field, op, data);
}
} else if (StringUtils.isNotBlank(fulltextSearch)) {
@@ -145,7 +175,12 @@
String s = "*" + fulltextSearch + "*";
// TODO poussin 20111106: voir pourquoi like fontion comme on souhaite et pas Keyword :(
// keyword ne fonctionne pas avec les *
- search.like("#fulltext", s);
+ Search or = search.or();
+ or = or.like("#fulltext", s);
+ log.debug("link: " + getWikittyLinkToLoadCache());
+ for (String link:getWikittyLinkToLoadCache()) {
+ or.associated(link).like("#fulltext", s);
+ }
} else {
// si pas de filtre on recherche tout
search.rTrue();
@@ -183,20 +218,78 @@
log.debug("criteria: " + criteria);
}
- PagedResult result = getChoremProxy().findAllByCriteria(clazz, criteria);
+ PagedResult<Wikitty> result = getChoremProxy().findAllByCriteria(criteria);
- setGridModel(result.getAll());
+ setWikitties(result.getAll());
+
+ if (log.isTraceEnabled()) {
+ log.trace("result: " + getWikitties());
+ }
+
setRecords(result.getNumFound());
setTotal((int) Math.ceil((double) getRecords() / (double) getRows()));
+ gridModel = new ArrayList<Map<String, Object>>();
+ for (Wikitty w:wikitties) {
+ Map<String, Object> map = wikittyToMap(w);
+ gridModel.add(map);
+ }
+
return SUCCESS;
- } catch (ClassNotFoundException eee) {
- log.error(String.format("Can't find class '%s'", wikittyExtension), eee);
+ } catch (Exception eee) {
+ log.error(String.format("Can't find wikitty '%s'", wikittyExtension), eee);
throw new UnhandledException(eee);
}
}
- public void setGridModel(List gridModel) {
+ protected Map<String, Object> wikittyToMap(Wikitty w) {
+ Map<String, Object> result = new HashMap<String, Object>();
+ String wid = w.getId();
+
+ result.put("id", wid);
+ result.putAll(w.getFieldValue());
+ for (String fieldToLoad:getWikittyLinkToLoadCache()) {
+ String linkId = (String)w.getFqField(fieldToLoad);
+ if (linkId != null) {
+ // TODO poussin 20111107 pas tres optimal de faire une requete a chaque besoin
+ // il faudrait collecter les ids, pour faire une seule demande pour tous
+ // mais tant que pour le deploiement, tout est sur le meme serveur
+ // si un peu moins genant
+ Wikitty wlink = getChoremProxy().restore(linkId);
+ Map<String, Object> map = wikittyToMap(wlink);
+ map.remove("id");
+ result.putAll(map);
+ }
+ }
+ return result;
+ }
+
+ protected void addToLoad(Map<String, List<String>> toLoad, String wid, String wfield) {
+ List<String> l = toLoad.get(wid);
+ if (l == null) {
+ l = new ArrayList<String>();
+ toLoad.put(wid, l);
+ }
+ l.add(wfield);
+ }
+
+ public Set<String> getWikittyLinkToLoadCache() {
+ if (wikittyLinkToLoadCache == null) {
+ wikittyLinkToLoadCache =
+ new HashSet<String>(toCollection(wikittyLinkToLoad));
+ }
+ return wikittyLinkToLoadCache;
+ }
+
+ public void setWikitties(List<Wikitty> wikitties) {
+ this.wikitties = wikitties;
+ }
+
+ public List<Map<String, Object>> getGridModel() {
+ return gridModel;
+ }
+
+ public void setGridModel(List<Map<String, Object>> gridModel) {
this.gridModel = gridModel;
}
@@ -266,7 +359,7 @@
} else if ("nn".equalsIgnoreCase(op)) {
search.isNotNull(field);
} else {
- Collection<String> col = Arrays.asList(StringUtils.split(data, " :,;|"));
+ Collection<String> col = toCollection(data);
if ("in".equalsIgnoreCase(op)) {
search.in(field, col);
} else if ("ni".equalsIgnoreCase(op)) {
@@ -277,4 +370,14 @@
}
}
+
+ protected Collection<String> toCollection(String s) {
+ Collection<String> result;
+ if (s == null) {
+ result = Collections.EMPTY_LIST;
+ } else {
+ result = Arrays.asList(StringUtils.split(s, " :,;|"));
+ }
+ return result;
+ }
}
Modified: trunk/chorem-web/src/main/resources/struts.xml
===================================================================
--- trunk/chorem-web/src/main/resources/struts.xml 2011-11-06 17:01:34 UTC (rev 128)
+++ trunk/chorem-web/src/main/resources/struts.xml 2011-11-08 17:46:52 UTC (rev 129)
@@ -21,6 +21,18 @@
<package name="publicArea" extends="struts-default">
<result-types>
<result-type name="json" class="org.apache.struts2.json.JSONResult"/>
+ <result-type name="wikitty-json" class="org.apache.struts2.json.JSONResult">
+ <param name="includeProperties">
+ fulltextSearch,
+ page,
+ sord,
+ sidx,
+ rows,
+ records,
+ total,
+ gridModel.*
+ </param>
+ </result-type>
</result-types>
<interceptors>
@@ -48,7 +60,7 @@
<result>/WEB-INF/jsp/home.jsp</result>
</action>
<action name="EntitySearchJson" class="org.chorem.action.EntitySearchJsonAction">
- <result type="json"/>
+ <result type="wikitty-json"/>
</action>
</package>
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companies.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companies.jsp 2011-11-06 17:01:34 UTC (rev 128)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companies.jsp 2011-11-08 17:46:52 UTC (rev 129)
@@ -18,35 +18,90 @@
<s:url id="companyDetails" namespace="/bonzoms" action="companyDetails"/>
<script type="text/javascript">
function formatCompanyNameLink(cellvalue, options, rowObject) {
- return "<a href='<s:property value="companyDetails"/>?companyId="+rowObject.wikittyId+"'>" + cellvalue + "</a>";
+ return "<a href='<s:property value="companyDetails"/>?companyId="+rowObject['Employee.company']+"'>" + cellvalue + "</a>";
}
</script>
+ <s:url id="personDetails" namespace="/bonzoms" action="personDetails"/>
+ <script type="text/javascript">
+ function formatPersonNameLink(cellvalue, options, rowObject) {
+ return "<a href='<s:property value="personDetails"/>?personId="+rowObject['Employee.person']+"'>" + cellvalue + "</a>";
+ }
+ </script>
+
+ <%-- Partie generique (ou presque, ce ne sont que des variables qui change) --%>
+
+ <s:url id="remoteurlFulltextSearch" namespace="/" action="EntitySearchJson" escapeAmp="false">
+ <s:param name="wikittyExtension">Employee</s:param>
+ <s:param name="wikittyLinkToLoad">Employee.person,Employee.company</s:param>
+ </s:url>
+
+ <s:url id="remoteurl" namespace="/" action="EntitySearchJson" escapeAmp="false">
+ <s:param name="fulltextSearch"><%=StringUtils.defaultString(request.getParameter("fulltextSearch"))%></s:param>
+ <s:param name="wikittyExtension">Employee</s:param>
+ <s:param name="wikittyLinkToLoad">Employee.person,Employee.company</s:param>
+ </s:url>
+
+ <script type="text/javascript">
+ var timeoutHnd;
+ function doSearch() {
+ if(timeoutHnd) {
+ clearTimeout(timeoutHnd)
+ }
+ timeoutHnd = setTimeout(gridReload, 500)
+ }
+
+ function gridReload() {
+ var filter = jQuery("#fulltextSearch").val();
+ var gridUrl = "<s:property value="remoteurlFulltextSearch" escapeHtml="false"/>&fulltextSearch="+filter;
+ jQuery("#gridtable").jqGrid('setGridParam',{url:gridUrl,page:1}).trigger("reloadGrid");
+ }
+ </script>
+
<s:form>
- <s:textfield name="searchString"></s:textfield>
+ <s:textfield id="fulltextSearch" name="fulltextSearch" onkeydown="doSearch()"></s:textfield>
<s:submit></s:submit>
</s:form>
- <s:url id="remoteurl" namespace="/" action="EntitySearchJson" escapeAmp="false">
- <s:param name="searchString"><%=StringUtils.defaultString(request.getParameter("searchString"))%></s:param>
- <s:param name="wikittyExtension">org.chorem.entities.Company</s:param>
+ <s:url id="editurl" namespace="/" action="EntitySearchJson" escapeAmp="false">
</s:url>
<sjg:grid
id="gridtable"
dataType="json"
href="%{remoteurl}"
- pager="true"
gridModel="gridModel"
rowList="10,20,50,100"
rowNum="20"
- rownumbers="false"
+ rownumbers="true"
autowidth="true"
- sortname="name"
- sortorder="asc">
+ sortname="Person.lastName"
+ sortorder="asc"
+ pager="true"
+ viewrecords="true"
- <sjg:gridColumn name="name" title="Nom" formatter="formatCompanyNameLink"/>
- <sjg:gridColumn name="type" title="Type"/>
+ multiselect="true"
+
+ editurl="%{editurl}"
+ editinline="false"
+
+ navigator="true"
+ navigatorAdd="true"
+ navigatorEdit="true"
+ navigatorDelete="true"
+ navigatorView="true"
+ navigatorSearch="true"
+ navigatorAddOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorEditOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorDeleteOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorSearchOptions="{multipleGroup:true,showQuery:true,multipleSearch:true,sopt:['eq','ne','cn','nc','bw','bn','ew','en','lt','le','gt','ge','nu','nn','in','ni']}"
+ >
+
+ <sjg:gridColumn name="id" hidden="true" key="true" title="id"/>
+ <sjg:gridColumn name="Company.name" index="Company.name" title="Société" formatter="formatCompanyNameLink"/>
+ <sjg:gridColumn name="Person.lastName" index="Person.lastName" title="Nom" editable="true" formatter="formatPersonNameLink"/>
+ <sjg:gridColumn name="Person.firstName" index="Person.firstName" title="Prénom" editable="true"/>
+ <sjg:gridColumn name="Employee.diploma" index="Employee.diploma" title="Diplôme"/>
</sjg:grid>
</body>
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/persons.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/persons.jsp 2011-11-06 17:01:34 UTC (rev 128)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/persons.jsp 2011-11-08 17:46:52 UTC (rev 129)
@@ -15,22 +15,26 @@
<body>
<h2><s:text name="chorem.bonzoms.persons" /></h2>
+ <s:url id="personDetails" namespace="/bonzoms" action="personDetails"/>
+
+ <script type="text/javascript">
+ function formatPersonNameLink(cellvalue, options, rowObject) {
+ return "<a href='<s:property value="personDetails"/>?personId="+rowObject.id+"'>" + cellvalue + "</a>";
+ }
+ </script>
+
+
+
<s:url id="remoteurlFulltextSearch" namespace="/" action="EntitySearchJson" escapeAmp="false">
- <s:param name="wikittyExtension">org.chorem.entities.Person</s:param>
+ <s:param name="wikittyExtension">Person</s:param>
</s:url>
<s:url id="remoteurl" namespace="/" action="EntitySearchJson" escapeAmp="false">
<s:param name="fulltextSearch"><%=StringUtils.defaultString(request.getParameter("fulltextSearch"))%></s:param>
- <s:param name="wikittyExtension">org.chorem.entities.Person</s:param>
+ <s:param name="wikittyExtension">Person</s:param>
</s:url>
- <s:url id="personDetails" namespace="/bonzoms" action="personDetails"/>
-
<script type="text/javascript">
- function formatPersonNameLink(cellvalue, options, rowObject) {
- return "<a href='<s:property value="personDetails"/>?personId="+rowObject.wikittyId+"'>" + cellvalue + "</a>";
- }
-
var timeoutHnd;
function doSearch() {
if(timeoutHnd) {
@@ -68,12 +72,8 @@
pager="true"
viewrecords="true"
- filter="true"
multiselect="true"
- footerrow="true"
- userDataOnFooter="{'Person.lastName':'titi', firsName:'Toto'}"
-
editurl="%{editurl}"
editinline="false"
@@ -89,9 +89,9 @@
navigatorSearchOptions="{multipleSearch:true,sopt:['eq','ne','cn','nc','bw','bn','ew','en','lt','le','gt','ge','nu','nn','in','ni']}"
>
- <sjg:gridColumn name="wikittyId" hidden="true" key="true" title="id"/>
- <sjg:gridColumn href="%{personDetails}" name="lastName" index="Person.lastName" title="Nom" editable="true" formatter="formatPersonNameLink"/>
- <sjg:gridColumn name="firstName" index="Person.firstName" title="Prénom" editable="true"/>
+ <sjg:gridColumn name="id" hidden="true" key="true" title="id"/>
+ <sjg:gridColumn name="Person.lastName" index="Person.lastName" title="Nom" editable="true" formatter="formatPersonNameLink"/>
+ <sjg:gridColumn name="Person.firstName" index="Person.firstName" title="Prénom" editable="true"/>
</sjg:grid>
</body>
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2011-11-06 17:01:34 UTC (rev 128)
+++ trunk/pom.xml 2011-11-08 17:46:52 UTC (rev 129)
@@ -56,7 +56,7 @@
<platform>chorem.org</platform>
<projectId>chorem</projectId>
- <eugenePluginVersion>2.3.2</eugenePluginVersion>
+ <eugenePluginVersion>2.4.1-SNAPSHOT</eugenePluginVersion>
<nuitonUtilsVersion>2.3</nuitonUtilsVersion>
<nuitonWebVersion>1.3</nuitonWebVersion>
<nuitonI18nVersion>2.3.1</nuitonI18nVersion>
1
0
Author: bpoussin
Date: 2011-11-06 18:01:34 +0100 (Sun, 06 Nov 2011)
New Revision: 128
Url: http://chorem.org/repositories/revision/chorem/128
Log:
debut de retravaille de chorem
Mise en place d'une action generique qui travail avec le grid jquery
Added:
trunk/chorem-web/src/main/java/org/chorem/ChoremConfigOption.java
trunk/chorem-web/src/main/java/org/chorem/action/ChoremBaseAction.java
trunk/chorem-web/src/main/java/org/chorem/action/EntitySearchJsonAction.java
trunk/chorem-web/src/main/resources/freemarker.properties
trunk/src/
trunk/src/site/
trunk/src/site/chorem-cdc.txt
trunk/src/site/requisite.txt
Removed:
trunk/chorem-web/src/main/java/org/chorem/action/BaseAction.java
Modified:
trunk/chorem-web/pom.xml
trunk/chorem-web/src/main/java/org/chorem/ChoremConfig.java
trunk/chorem-web/src/main/java/org/chorem/ChoremProxy.java
trunk/chorem-web/src/main/java/org/chorem/ChoremSession.java
trunk/chorem-web/src/main/java/org/chorem/action/HomeAction.java
trunk/chorem-web/src/main/java/org/chorem/billy/action/QuotationAction.java
trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/CompanyAction.java
trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/ContactDetailsAction.java
trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/EmployeeAction.java
trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/EmploymentContractAction.java
trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/PersonAction.java
trunk/chorem-web/src/main/java/org/chorem/gepeto/action/ProjectAction.java
trunk/chorem-web/src/main/java/org/chorem/gepeto/action/ProjectOrderAction.java
trunk/chorem-web/src/main/java/org/chorem/gepeto/action/TaskAction.java
trunk/chorem-web/src/main/resources/i18n/chorem-web_en_GB.properties
trunk/chorem-web/src/main/resources/i18n/chorem-web_fr_FR.properties
trunk/chorem-web/src/main/resources/log4j.properties
trunk/chorem-web/src/main/resources/org/chorem/bonzoms/action/CompanyAction-addCompany-validation.xml
trunk/chorem-web/src/main/resources/org/chorem/bonzoms/action/CompanyAction-modifyCompany-validation.xml
trunk/chorem-web/src/main/resources/org/chorem/bonzoms/action/EmploymentContractAction-addEmploymentContract-validation.xml
trunk/chorem-web/src/main/resources/org/chorem/bonzoms/action/PersonAction-addPerson-validation.xml
trunk/chorem-web/src/main/resources/org/chorem/gepeto/action/ProjectAction-addProject-validation.xml
trunk/chorem-web/src/main/resources/org/chorem/gepeto/action/ProjectAction-modifyProject-validation.xml
trunk/chorem-web/src/main/resources/org/chorem/gepeto/action/TaskAction-addTask-validation.xml
trunk/chorem-web/src/main/resources/struts.properties
trunk/chorem-web/src/main/resources/struts.xml
trunk/chorem-web/src/main/webapp/WEB-INF/decorators/billy.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/decorators/bonzoms.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/decorators/cash.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/decorators/gepeto.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/decorators/main.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/billy/addQuotation.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/billy/quotationDetails.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companies.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/menu.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/persons.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/common/inc/header.jsp
trunk/chorem-web/src/main/webapp/WEB-INF/jsp/gepeto/projectsByYear.jsp
trunk/pom.xml
Modified: trunk/chorem-web/pom.xml
===================================================================
--- trunk/chorem-web/pom.xml 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/pom.xml 2011-11-06 17:01:34 UTC (rev 128)
@@ -38,6 +38,33 @@
</dependency>
<dependency>
+ <groupId>net.sf.json-lib</groupId>
+ <artifactId>json-lib</artifactId>
+ <version>1.0</version>
+ <classifier>jdk15</classifier>
+ </dependency>
+
+ <dependency>
+ <groupId>org.nuiton.web</groupId>
+ <artifactId>nuiton-struts2</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.struts</groupId>
+ <artifactId>struts2-json-plugin</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>com.jgeppert.struts2.jquery</groupId>
+ <artifactId>struts2-jquery-plugin</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>com.jgeppert.struts2.jquery</groupId>
+ <artifactId>struts2-jquery-grid-plugin</artifactId>
+ </dependency>
+
+ <dependency>
<groupId>org.nuiton.i18n</groupId>
<artifactId>nuiton-i18n</artifactId>
</dependency>
@@ -102,13 +129,13 @@
<dependency>
<groupId>org.nuiton.wikitty</groupId>
- <artifactId>wikitty-jdbc-impl</artifactId>
+ <artifactId>wikitty-jdbc</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.nuiton.wikitty</groupId>
- <artifactId>wikitty-solr-impl</artifactId>
+ <artifactId>wikitty-solr</artifactId>
<scope>runtime</scope>
</dependency>
Modified: trunk/chorem-web/src/main/java/org/chorem/ChoremConfig.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/ChoremConfig.java 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/java/org/chorem/ChoremConfig.java 2011-11-06 17:01:34 UTC (rev 128)
@@ -1,10 +1,10 @@
package org.chorem;
-import java.util.Properties;
+import org.apache.commons.lang.UnhandledException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuiton.util.ApplicationConfig;
-import org.nuiton.util.ArgumentsParserException;
+import org.nuiton.wikitty.WikittyConfigOption;
import static org.nuiton.i18n.I18n._;
@@ -16,105 +16,39 @@
/** to use log facility, just put in your code: log.info(\"...\"); */
static private Log log = LogFactory.getLog(ChoremConfig.class);
- static protected ApplicationConfig instance = null;
-
- private ChoremConfig() {
- }
+ static protected ApplicationConfig config = null;
- static public ApplicationConfig getConfig() {
- return getConfig(null, null);
- }
-
- static public ApplicationConfig getConfig(
- Properties props, String configFilename, String ... args) {
- ApplicationConfig conf = new ApplicationConfig(
- Option.class, null, props, configFilename);
-
- try {
- conf.parse(args);
- } catch (ArgumentsParserException eee) {
- if (log.isErrorEnabled()) {
- log.error("Can't load chorem configuration", eee);
- }
- }
- return conf;
- }
-
- /**
- * Returns config instance (singleton)
- * @return ChoremConfig instance
+ /**
+ * constructeur public seulement pour pouvoir mettre une variable de ce
+ * type dans BowBaseAction et acceder facilement au donnees dans les jsp
+ * en ognl
*/
- public static ApplicationConfig getInstance() {
- if (instance == null) {
- synchronized(ChoremConfig.class) {
- if (instance == null) {
- instance = ChoremConfig.getConfig();
- }
- }
- }
- return instance;
+ public ChoremConfig() {
}
-
- /**
- * Vradi option definition.
- */
- public enum Option implements ApplicationConfig.OptionDef {
- CONFIG_FILE(
- ApplicationConfig.CONFIG_FILE_NAME,
- _("chorem.config.configFileName.description"),
- "chorem.properties", String.class, false, false);
-
- public final String key;
- public final String description;
- public String defaultValue;
- public final Class<?> type;
- public boolean isTransient;
- public boolean isFinal;
- Option(String key, String description, String defaultValue,
- Class<?> type, boolean isTransient, boolean isFinal) {
- this.key = key;
- this.description = description;
- this.defaultValue = defaultValue;
- this.type = type;
- this.isFinal = isFinal;
- this.isTransient = isTransient;
- }
+ public static ApplicationConfig getConfig(String... args) {
+ if (config == null) {
+ synchronized (ChoremConfig.class) {
+ if (config == null) {
+ try {
+ config = new ApplicationConfig(ChoremConfigOption.CONFIG_FILE.getDefaultValue());
- public String getKey() {
- return key;
- }
+ // Load wikitty options
+ config.loadDefaultOptions(WikittyConfigOption.class);
- public Class<?> getType() {
- return type;
- }
+ // Load bow options
+ config.loadDefaultOptions(ChoremConfigOption.class);
- public String getDescription() {
- return description;
+ // Parse args
+ config.parse(args);
+ } catch (Exception eee) {
+ log.error("Can't create chorem configuration", eee);
+ throw new UnhandledException(eee);
+ }
+ }
+ }
}
-
- public String getDefaultValue() {
- return defaultValue;
- }
-
- public boolean isTransient() {
- return isTransient;
- }
-
- public boolean isFinal() {
- return isFinal;
- }
-
- public void setDefaultValue(String defaultValue) {
- this.defaultValue = defaultValue;
- }
-
- public void setTransient(boolean isTransient) {
- this.isTransient = isTransient;
- }
-
- public void setFinal(boolean isFinal) {
- this.isFinal = isFinal;
- }
+ return config;
}
+
}
Added: trunk/chorem-web/src/main/java/org/chorem/ChoremConfigOption.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/ChoremConfigOption.java (rev 0)
+++ trunk/chorem-web/src/main/java/org/chorem/ChoremConfigOption.java 2011-11-06 17:01:34 UTC (rev 128)
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2011 poussin. All rights reserved.
+ *
+ * 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 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/>.
+ */
+package org.chorem;
+
+import static org.nuiton.i18n.I18n._;
+import org.nuiton.util.ApplicationConfig;
+
+/**
+ * Chorem option definition.
+ *
+ * @author poussin
+ */
+public enum ChoremConfigOption implements ApplicationConfig.OptionDef {
+ CONFIG_FILE(ApplicationConfig.CONFIG_FILE_NAME,
+ _("chorem.config.configFileName.description"),
+ "chorem.properties", String.class, false, false);
+
+ public final String key;
+ public final String description;
+ public String defaultValue;
+ public final Class<?> type;
+ public boolean isTransient;
+ public boolean isFinal;
+
+ ChoremConfigOption(String key, String description, String defaultValue,
+ Class<?> type, boolean isTransient, boolean isFinal) {
+ this.key = key;
+ this.description = description;
+ this.defaultValue = defaultValue;
+ this.type = type;
+ this.isFinal = isFinal;
+ this.isTransient = isTransient;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public Class<?> getType() {
+ return type;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public String getDefaultValue() {
+ return defaultValue;
+ }
+
+ public boolean isTransient() {
+ return isTransient;
+ }
+
+ public boolean isFinal() {
+ return isFinal;
+ }
+
+ public void setDefaultValue(String defaultValue) {
+ this.defaultValue = defaultValue;
+ }
+
+ public void setTransient(boolean isTransient) {
+ this.isTransient = isTransient;
+ }
+
+ public void setFinal(boolean isFinal) {
+ this.isFinal = isFinal;
+ }
+
+}
Modified: trunk/chorem-web/src/main/java/org/chorem/ChoremProxy.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/ChoremProxy.java 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/java/org/chorem/ChoremProxy.java 2011-11-06 17:01:34 UTC (rev 128)
@@ -32,7 +32,7 @@
* @return
*/
static public ChoremProxy getInstance(String token) {
- ApplicationConfig config = ChoremConfig.getInstance();
+ ApplicationConfig config = ChoremConfig.getConfig();
WikittyService ws = getWikittyService(config);
ChoremProxy result = new ChoremProxy(config, ws);
result.setSecurityToken(token);
Modified: trunk/chorem-web/src/main/java/org/chorem/ChoremSession.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/ChoremSession.java 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/java/org/chorem/ChoremSession.java 2011-11-06 17:01:34 UTC (rev 128)
@@ -48,11 +48,7 @@
public void login(String login, String password) {
getProxy().login(login, password);
securityToken = getProxy().getSecurityToken();
- // TODO poussin 20110315, lorsque la methode proxy.getUser() existera
- // remplacer le code suivant
- String userId = WikittySecurityUtil.getUserForToken(
- getProxy().getWikittyService(), securityToken);
- user = getProxy().restore(WikittyUser.class, userId);
+ user = proxy.getUser();
}
public ChoremProxy getProxy() {
Deleted: trunk/chorem-web/src/main/java/org/chorem/action/BaseAction.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/action/BaseAction.java 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/java/org/chorem/action/BaseAction.java 2011-11-06 17:01:34 UTC (rev 128)
@@ -1,119 +0,0 @@
-package org.chorem.action;
-
-import java.util.List;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import com.opensymphony.xwork2.ActionSupport;
-import com.opensymphony.xwork2.util.ValueStack;
-import java.util.Map;
-import org.apache.struts2.interceptor.SessionAware;
-import org.chorem.ChoremProxy;
-import org.chorem.ChoremSession;
-
-/**
- * Base class which must be extended by every action
- * Overrides the Struts2 methods to render text in order to explicitly show
- * the missing i18n translations
- */
-public class BaseAction extends ActionSupport implements SessionAware {
-
- private static final long serialVersionUID = 6360393466153765988L;
-
- private static final Log log = LogFactory.getLog(BaseAction.class);
-
- final static protected String CONTEXT_ACTION_KEY = "action";
-
- public static final String UNTRANSLATED_MARKER = "???";
-
- protected static final String MISSING_PARAM = "param";
-
- protected Map<String, Object> session;
-
- public ChoremSession getChoremSession() {
- ChoremSession result = ChoremSession.getChoremSession(session);
- return result;
- }
-
- public ChoremProxy getChoremProxy() {
- ChoremProxy result = getChoremSession().getProxy();
- return result;
- }
-
- @Override
- public void setSession(Map<String, Object> session) {
- this.session = session;
- }
-
- @Override
- public String getText(String aTextName) {
- String value = super.getText(aTextName);
- return getSafeText(aTextName, value);
- }
-
- @Override
- public String getText(String aTextName, String defaultValue) {
- String value = super.getText(aTextName, defaultValue);
- return getSafeText(aTextName, value);
- }
-
- @Override
- public String getText(String aTextName, String defaultValue, String obj) {
- String value = super.getText(aTextName, defaultValue, obj);
- return getSafeText(aTextName, value);
- }
-
- @Override
- public String getText(String aTextName, List<Object> args) {
- String value = super.getText(aTextName, args);
- return getSafeText(aTextName, value);
- }
-
- @Override
- public String getText(String key, String[] args) {
- String value = super.getText(key, args);
- return getSafeText(key, value);
- }
-
- @Override
- public String getText(String aTextName, String defaultValue,
- List<Object> args) {
- String value = super.getText(aTextName, defaultValue, args);
- return getSafeText(aTextName, value);
- }
-
- @Override
- public String getText(String key, String defaultValue, String[] args) {
- String value = super.getText(key, defaultValue, args);
- return getSafeText(key, value);
- }
-
- @Override
- public String getText(String key, String defaultValue, List<Object> args,
- ValueStack stack) {
- String value = super.getText(key, defaultValue, args, stack);
- return getSafeText(key, value);
- }
-
- @Override
- public String getText(String key, String defaultValue, String[] args,
- ValueStack stack) {
- String value = super.getText(key, defaultValue, args, stack);
- return getSafeText(key, value);
- }
-
- /**
- * Surrounds the non translated keys with a marker to make them visible
- */
- protected String getSafeText(String key, String value) {
- if (StringUtils.isEmpty(value)) {
- if (log.isWarnEnabled()) {
- log.warn("Key [" + key + "] is not translated");
- }
- return UNTRANSLATED_MARKER + key + UNTRANSLATED_MARKER;
- }
- return value;
- }
-}
Copied: trunk/chorem-web/src/main/java/org/chorem/action/ChoremBaseAction.java (from rev 121, trunk/chorem-web/src/main/java/org/chorem/action/BaseAction.java)
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/action/ChoremBaseAction.java (rev 0)
+++ trunk/chorem-web/src/main/java/org/chorem/action/ChoremBaseAction.java 2011-11-06 17:01:34 UTC (rev 128)
@@ -0,0 +1,57 @@
+package org.chorem.action;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.nuiton.web.struts2.BaseAction;
+import java.util.Map;
+import org.apache.struts2.interceptor.SessionAware;
+import org.chorem.ChoremConfig;
+import org.chorem.ChoremProxy;
+import org.chorem.ChoremSession;
+
+/**
+ * Base class which must be extended by every action
+ * Overrides the Struts2 methods to render text in order to explicitly show
+ * the missing i18n translations
+ */
+public class ChoremBaseAction extends BaseAction implements SessionAware {
+
+ private static final long serialVersionUID = 6360393466153765988L;
+
+ private static final Log log = LogFactory.getLog(ChoremBaseAction.class);
+
+ final static protected String CONTEXT_ACTION_KEY = "action";
+
+ public static final String UNTRANSLATED_MARKER = "???";
+
+ protected static final String MISSING_PARAM = "param";
+
+ protected Map<String, Object> session;
+
+ /** Configuration, default null for lazy loading */
+ protected transient ChoremConfig config;
+
+ public ChoremConfig getConfig() {
+ if (config == null) {
+ config = new ChoremConfig();
+ }
+ return config;
+ }
+
+ public ChoremSession getChoremSession() {
+ ChoremSession result = ChoremSession.getChoremSession(session);
+ return result;
+ }
+
+ public ChoremProxy getChoremProxy() {
+ ChoremProxy result = getChoremSession().getProxy();
+ return result;
+ }
+
+ @Override
+ public void setSession(Map<String, Object> session) {
+ this.session = session;
+ }
+
+}
Added: trunk/chorem-web/src/main/java/org/chorem/action/EntitySearchJsonAction.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/action/EntitySearchJsonAction.java (rev 0)
+++ trunk/chorem-web/src/main/java/org/chorem/action/EntitySearchJsonAction.java 2011-11-06 17:01:34 UTC (rev 128)
@@ -0,0 +1,280 @@
+package org.chorem.action;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import net.sf.json.JSONSerializer;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.UnhandledException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.struts2.interceptor.ParameterAware;
+import org.nuiton.wikitty.search.Criteria;
+import org.nuiton.wikitty.search.PagedResult;
+import org.nuiton.wikitty.search.Search;
+
+/**
+ * Action qui recherche n'importe qu'elle type d'extension de wikitty.
+ * L'extension doit etre passee via le parametre 'wikittyExtension'
+ * Il est possible d'ajouter une condition de recherche via le parametre
+ * 'fulltextSearch'.
+ *
+ * @author poussin
+ * @version $Revision$
+ *
+ * Last update: $Date$
+ * by : $Author$
+ */
+public class EntitySearchJsonAction extends ChoremBaseAction implements ParameterAware {
+
+ /** to use log facility, just put in your code: log.info(\"...\"); */
+ static private Log log = LogFactory.getLog(EntitySearchJsonAction.class);
+ private static final long serialVersionUID = 1L;
+
+ //get how many rows we want to have into the grid - rowNum attribute in the grid
+ protected int rows = 0;
+
+ //Get the requested page. By default grid sets this to 1.
+ protected int page = 0;
+
+ // sorting order - asc or desc
+ protected String sord;
+
+ // get index row - i.e. user click to sort.
+ protected String sidx;
+
+ // Your Total Pages
+ protected int total = 0;
+
+ // All Record
+ protected int records = 0;
+
+ protected List gridModel;
+
+ protected String wikittyExtension;
+
+ protected String fulltextSearch = "";
+
+ protected String filters;
+
+ /** action faite via le grid ['add', 'edit', 'del'], si vide alors une simple recherche */
+ protected String oper;
+ /** id ou list d'id sur lequel l'action est faite, le separateur est la ','*/
+ protected String id;
+
+ protected Map<String, String[]> parameters;
+
+ public void setParameters(Map<String, String[]> parameters) {
+ this.parameters = parameters;
+ }
+ public void setFilters(String filters) {
+ this.filters = filters;
+ }
+
+ public void setWikittyExtension(String wikittyExtension) {
+ this.wikittyExtension = wikittyExtension;
+ }
+
+ public void setFulltextSearch(String fulltextSearch) {
+ this.fulltextSearch = fulltextSearch;
+ }
+
+ public void setPage(Integer page) {
+ this.page = page;
+ }
+
+ public void setSord(String sord) {
+ this.sord = sord;
+ }
+
+ public void setSidx(String sidx) {
+ this.sidx = sidx;
+ }
+
+ public void setRows(Integer rows) {
+ this.rows = rows;
+ }
+
+ public void setRecords(Integer records) {
+ this.records = records;
+ }
+
+ public void setTotal(Integer total) {
+ this.total = total;
+ }
+
+ public List getGridModel() {
+ return gridModel;
+ }
+ public String execute() {
+ try {
+ if (log.isDebugEnabled()) {
+ for (String param : parameters.keySet()) {
+ log.debug("param:" + param + "=" + Arrays.toString(parameters.get(param)));
+ }
+ }
+
+ Class clazz = Class.forName(wikittyExtension);
+
+ Search search = Search.query();
+
+ if (StringUtils.isNotBlank(filters)) {
+ JSONObject jsonFilter = (JSONObject) JSONSerializer.toJSON( filters );
+ String groupOp = jsonFilter.getString("groupOp");
+ log.debug("groupOp: " + groupOp);
+ if ("or".equalsIgnoreCase(groupOp)) {
+ search = search.or();
+ } else {
+ search = search.and();
+ }
+ JSONArray rules = jsonFilter.getJSONArray("rules");
+ int rulesCount = JSONArray.getDimensions(rules)[0];
+ for (int i = 0; i < rulesCount; i++) {
+ JSONObject rule = rules.getJSONObject(i);
+ String field = rule.getString("field");
+ String op = rule.getString("op");
+ String data = rule.getString("data");
+ addCondition(search, field, op, data);
+ }
+
+ } else if (StringUtils.isNotBlank(fulltextSearch)) {
+ // TODO poussin 20111106: ca ne serait pas au like d'ajouter les * ?
+ String s = "*" + fulltextSearch + "*";
+ // TODO poussin 20111106: voir pourquoi like fontion comme on souhaite et pas Keyword :(
+ // keyword ne fonctionne pas avec les *
+ search.like("#fulltext", s);
+ } else {
+ // si pas de filtre on recherche tout
+ search.rTrue();
+ }
+
+
+ int first = rows * (page - 1);
+ int last = rows * page - 1;
+
+ Criteria criteria = search.criteria();
+ criteria.setFirstIndex(first);
+ criteria.setEndIndex(last);
+
+ if (StringUtils.isNotBlank(sidx)) {
+ if ("asc".equalsIgnoreCase(sord)) {
+ criteria.setSortAscending(sidx);
+ } else {
+ criteria.setSortDescending(sidx);
+ }
+ }
+
+ if (log.isDebugEnabled()) {
+ log.debug("rows:" + rows);
+ log.debug("page:" + page);
+
+ log.debug("first:" + first);
+ log.debug("last:" + last);
+
+ log.debug("sord:" + sord);
+ log.debug("sidx:" + sidx);
+
+ log.debug("wikittyExtension:" + wikittyExtension);
+ log.debug("searchString: " + fulltextSearch);
+ log.debug("filters: " + filters);
+ log.debug("criteria: " + criteria);
+ }
+
+ PagedResult result = getChoremProxy().findAllByCriteria(clazz, criteria);
+
+ setGridModel(result.getAll());
+ setRecords(result.getNumFound());
+ setTotal((int) Math.ceil((double) getRecords() / (double) getRows()));
+
+ return SUCCESS;
+ } catch (ClassNotFoundException eee) {
+ log.error(String.format("Can't find class '%s'", wikittyExtension), eee);
+ throw new UnhandledException(eee);
+ }
+ }
+
+ public void setGridModel(List gridModel) {
+ this.gridModel = gridModel;
+ }
+
+ public String getFulltextSearch() {
+ return fulltextSearch;
+ }
+
+ public int getTotal() {
+ return total;
+ }
+
+ public int getRecords() {
+ return records;
+ }
+
+ public int getRows() {
+ return rows;
+ }
+
+ public int getPage() {
+ return page;
+ }
+
+ public String getSord() {
+ return sord;
+ }
+
+ public String getSidx() {
+ return sidx;
+ }
+
+ /**
+ * Ajoute une contrainte a une recherche
+ *
+ * @param search la requete ou il faut ajouter la contrainte
+ * @param field le fq du champs a traiter
+ * @param op ['eq','ne','cn','nc','bw','bn','ew','en','lt','le','gt','ge','nu','nn','in','ni']
+ * @param data la valuer de la condition
+ */
+ protected void addCondition(Search search, String field, String op, String data) {
+ if ("eq".equalsIgnoreCase(op)) {
+ search.eq(field, data);
+ } else if ("ne".equalsIgnoreCase(op)) {
+ search.neq(field, data);
+ } else if ("lt".equalsIgnoreCase(op)) {
+ search.lt(field, data);
+ } else if ("le".equalsIgnoreCase(op)) {
+ search.le(field, data);
+ } else if ("gt".equalsIgnoreCase(op)) {
+ search.gt(field, data);
+ } else if ("ge".equalsIgnoreCase(op)) {
+ search.ge(field, data);
+ } else if ("bw".equalsIgnoreCase(op)) {
+ search.sw(field, data);
+ } else if ("bn".equalsIgnoreCase(op)) {
+ search.nsw(field, data);
+ } else if ("ew".equalsIgnoreCase(op)) {
+ search.ew(field, data);
+ } else if ("en".equalsIgnoreCase(op)) {
+ search.notew(field, data);
+ } else if ("cn".equalsIgnoreCase(op)) {
+ search.like(field, data);
+ } else if ("nc".equalsIgnoreCase(op)) {
+ search.unlike(field, data);
+ } else if ("nu".equalsIgnoreCase(op)) {
+ search.isNull(field);
+ } else if ("nn".equalsIgnoreCase(op)) {
+ search.isNotNull(field);
+ } else {
+ Collection<String> col = Arrays.asList(StringUtils.split(data, " :,;|"));
+ if ("in".equalsIgnoreCase(op)) {
+ search.in(field, col);
+ } else if ("ni".equalsIgnoreCase(op)) {
+ search.not().in(field, col);
+ } else {
+ log.error(String.format("Unreconize Operator %s for field %s and value %s", op, field, data));
+ }
+ }
+
+ }
+}
Modified: trunk/chorem-web/src/main/java/org/chorem/action/HomeAction.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/action/HomeAction.java 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/java/org/chorem/action/HomeAction.java 2011-11-06 17:01:34 UTC (rev 128)
@@ -36,7 +36,7 @@
* Last update: $Date$
* by : $Author$
*/
-public class HomeAction extends BaseAction {
+public class HomeAction extends ChoremBaseAction {
/** to use log facility, just put in your code: log.info(\"...\"); */
static private Log log = LogFactory.getLog(HomeAction.class);
Modified: trunk/chorem-web/src/main/java/org/chorem/billy/action/QuotationAction.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/billy/action/QuotationAction.java 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/java/org/chorem/billy/action/QuotationAction.java 2011-11-06 17:01:34 UTC (rev 128)
@@ -9,10 +9,9 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.chorem.ChoremProxy;
-import org.chorem.action.BaseAction;
+import org.chorem.action.ChoremBaseAction;
import org.chorem.bonzoms.EmployeeFull;
import org.chorem.entities.Employee;
-import org.chorem.entities.Person;
import org.chorem.entities.Project;
import org.chorem.entities.ProjectOrder;
import org.chorem.entities.Quotation;
@@ -22,6 +21,7 @@
import org.nuiton.wikitty.search.Search;
import com.opensymphony.xwork2.ActionContext;
+import org.nuiton.wikitty.entities.Wikitty;
import static org.nuiton.i18n.I18n.n_;
@@ -30,16 +30,33 @@
*
* @author vbriand
*/
-public class QuotationAction extends BaseAction {
+public class QuotationAction extends ChoremBaseAction {
private static final long serialVersionUID = -8773692389143447193L;
- private static final Log log = LogFactory.getLog(BaseAction.class);
+ private static final Log log = LogFactory.getLog(ChoremBaseAction.class);
static public QuotationAction getAction() {
return (QuotationAction)ActionContext.getContext().get(CONTEXT_ACTION_KEY);
}
+ protected String projectId;
+ protected String projectName;
+ protected String type;
+ protected String reference;
+ protected String description;
+ protected String amount;
+ protected String vta;
+ protected String beginDate;
+ protected String endDate;
+ protected String postedDate;
+ protected String conversionHope;
+ protected String quotationId;
+ protected String supplierId;
+ protected String customerId;
+ protected EmployeeFull customer;
+ protected EmployeeFull supplier;
+
/**
* Adds a new quotation
*
@@ -64,10 +81,9 @@
result = ERROR;
} else {
projectName = project.getName();
- if (reference != null && description != null &&
- amount != null && vta != null && postedDate != null) {
+ if (reference != null) {
//If the quotation has been created successfully
- if (addQuotation()) {
+ if (addOrModifyQuotation(null)) {
result = SUCCESS;
} else {
result = ERROR;
@@ -100,15 +116,26 @@
UUID.fromString(quotationId);
Quotation quotation = proxy.restore(Quotation.class, quotationId);
+ log.debug(String.format("Restored quotation: ", quotation));
if (quotation != null) { //If the quotationId exists
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
-
+
+ setType(quotation.getType());
setReference(quotation.getReference());
setDescription(quotation.getDescription());
setAmount(String.valueOf(quotation.getAmount()));
setVta(String.valueOf(quotation.getVTA()));
- setPostedDate(formatter.format(quotation.getPostedDate()));
+ if (quotation.getBeginDate() != null) {
+ setBeginDate(formatter.format(quotation.getBeginDate()));
+ }
+ if (quotation.getEndDate() != null) {
+ setEndDate(formatter.format(quotation.getEndDate()));
+ }
+ if (quotation.getPostedDate() != null) {
+ setPostedDate(formatter.format(quotation.getPostedDate()));
+ }
+ setConversionHope(String.valueOf(quotation.getConversionHope()));
setProjectId(quotation.getProject());
setSupplier(EmployeeFull.initEmployee(quotation.getSupplier(),
proxy));
@@ -140,40 +167,17 @@
quotation = proxy.restore(Quotation.class, quotationId);
if (quotation != null) { //If the id exists
- quotation.setDescription(description);
- quotation.setAmount(Double.parseDouble(amount));
- quotation.setVTA(Double.parseDouble(vta));
-
- //Lenient mode disabled because results may be very odd
- formatter.setLenient(false);
- try {
- quotation.setPostedDate(formatter.parse(postedDate));
- } catch (ParseException e) {
+ if (addOrModifyQuotation(quotation)) {
+ result = SUCCESS;
+ } else {
result = INPUT;
- addFieldError("postedDate", getText(n_("chorem.date.wrongFormat")));
}
- if (result.equals(SUCCESS)) {
- proxy.store(quotation);
- }
} else {
result = ERROR;
}
return result;
}
- protected String projectId;
- protected String projectName;
- protected String reference;
- protected String description;
- protected String amount;
- protected String vta;
- protected String postedDate;
- protected String quotationId;
- protected String supplierId;
- protected String customerId;
- protected EmployeeFull customer;
- protected EmployeeFull supplier;
-
/**
* Returns the project order linked with the quotation (if it exists)
*
@@ -204,50 +208,100 @@
/**
* Stores the new quotation through the proxy
- *
+ *
+ * @param newQuotation if null new quotation is created, else argument is used
* @return true if the quotation has been stored properly,
* false if a problem occurred
*/
- protected boolean addQuotation() {
+ protected boolean addOrModifyQuotation(Quotation newQuotation) {
boolean result = true;
try {
ChoremProxy proxy = getChoremProxy();
- QuotationImpl newQuotation = new QuotationImpl();
+ if (newQuotation == null) {
+ newQuotation = new QuotationImpl();
+ }
+
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
+ if (getType() != null) {
+ newQuotation.setType(getType());
+ }
+ if (getReference() != null) {
+ newQuotation.setReference(getReference());
+ }
+ if (getDescription() != null) {
+ newQuotation.setDescription(getDescription());
+ }
+ if (getAmount() != null) {
+ String val = getAmount();
+ val = val.replace(',', '.');
+ newQuotation.setAmount(Double.parseDouble(val));
+ }
- newQuotation.setReference(reference);
- newQuotation.setDescription(description);
- newQuotation.setAmount(Double.parseDouble(amount));
- //Replaces the (possible) comma by a dot, so the string can be
- //parsed successfully as a double
- vta = vta.replace(',', '.');
- newQuotation.setVTA(Double.parseDouble(vta));
- newQuotation.setProject(projectId);
+ if (getVta() != null) {
+ String val = getVta();
+ //Replaces the (possible) comma by a dot, so the string can be
+ //parsed successfully as a double
+ val = val.replace(',', '.');
+ newQuotation.setVTA(Double.parseDouble(val));
+ }
+ if (getProjectId() != null) {
+ newQuotation.setProject(getProjectId());
+ }
//Lenient mode disabled because results may be very odd
formatter.setLenient(false);
- try {
- newQuotation.setPostedDate(formatter.parse(postedDate));
- } catch (ParseException e) {
- result = false;
- addActionError(getText(n_("chorem.date.wrongFormat")));
+
+ if (getBeginDate() != null) {
+ try {
+ newQuotation.setBeginDate(formatter.parse(getBeginDate()));
+ } catch (ParseException e) {
+ result = false;
+ addActionError(getText(n_("chorem.date.wrongFormat")));
+ }
}
-
- if (proxy.restore(Person.class, supplierId) != null) {
- newQuotation.setSupplier(supplierId);
- } else { //If the id doesn't exist or is invalid
- addActionError(getText(n_("chorem.billy.quotation.invalidSupplier")));
- result = false;
+ if (getEndDate() != null) {
+ try {
+ newQuotation.setEndDate(formatter.parse(getEndDate()));
+ } catch (ParseException e) {
+ result = false;
+ addActionError(getText(n_("chorem.date.wrongFormat")));
+ }
}
+ if (getPostedDate() != null) {
+ try {
+ newQuotation.setPostedDate(formatter.parse(getPostedDate()));
+ } catch (ParseException e) {
+ result = false;
+ addActionError(getText(n_("chorem.date.wrongFormat")));
+ }
+ }
+ if (getConversionHope() != null) {
+ int val = Integer.parseInt(getConversionHope());
+ newQuotation.setConversionHope(val);
+ }
- if (proxy.restore(Person.class, customerId) != null) {
- newQuotation.setCustomer(customerId);
- } else { //If the id doesn't exist or is invalid
- addActionError(getText(n_("chorem.billy.quotation.invalidCustomer")));
- result = false;
+
+ if (supplierId != null) {
+ Wikitty wsupplier = proxy.restore(supplierId);
+ if (wsupplier != null) {
+ newQuotation.setSupplier(supplierId);
+ } else { //If the id doesn't exist or is invalid
+ addActionError(getText(n_("chorem.billy.quotation.invalidSupplier")));
+ result = false;
+ }
}
+ if (customerId != null) {
+ Wikitty wcustomer = proxy.restore(customerId);
+ if (wcustomer != null) {
+ newQuotation.setCustomer(customerId);
+ } else { //If the id doesn't exist or is invalid
+ addActionError(getText(n_("chorem.billy.quotation.invalidCustomer")));
+ result = false;
+ }
+ }
+
//If everything went smoothly
if (result) {
proxy.store(newQuotation);
@@ -259,7 +313,15 @@
}
return result;
}
-
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
/**
* @return the reference
*/
@@ -315,6 +377,22 @@
public void setVta(String vta) {
this.vta = vta;
}
+
+ public String getBeginDate() {
+ return beginDate;
+ }
+
+ public void setBeginDate(String beginDate) {
+ this.beginDate = beginDate;
+ }
+
+ public String getEndDate() {
+ return endDate;
+ }
+
+ public void setEndDate(String endDate) {
+ this.endDate = endDate;
+ }
/**
* @return the postedDate
@@ -330,6 +408,14 @@
this.postedDate = postedDate;
}
+ public String getConversionHope() {
+ return conversionHope;
+ }
+
+ public void setConversionHope(String conversionHope) {
+ this.conversionHope = conversionHope;
+ }
+
/**
* @return the projectId
*/
Modified: trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/CompanyAction.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/CompanyAction.java 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/CompanyAction.java 2011-11-06 17:01:34 UTC (rev 128)
@@ -8,7 +8,7 @@
import org.apache.commons.logging.LogFactory;
import org.chorem.ChoremProxy;
import org.chorem.ContactDetailsConstants;
-import org.chorem.action.BaseAction;
+import org.chorem.action.ChoremBaseAction;
import org.chorem.entities.Company;
import org.chorem.entities.CompanyImpl;
import org.chorem.entities.ContactDetails;
@@ -28,7 +28,7 @@
*
* @author vbriand
*/
-public class CompanyAction extends BaseAction implements ContactDetailsConstants {
+public class CompanyAction extends ChoremBaseAction implements ContactDetailsConstants {
private static final long serialVersionUID = 2266576941588474102L;
Modified: trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/ContactDetailsAction.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/ContactDetailsAction.java 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/ContactDetailsAction.java 2011-11-06 17:01:34 UTC (rev 128)
@@ -3,7 +3,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.chorem.ChoremProxy;
-import org.chorem.action.BaseAction;
+import org.chorem.action.ChoremBaseAction;
import org.chorem.entities.ContactDetailsImpl;
import static org.nuiton.i18n.I18n.n_;
@@ -13,7 +13,7 @@
*
* @author vbriand
*/
-public class ContactDetailsAction extends BaseAction {
+public class ContactDetailsAction extends ChoremBaseAction {
private static final long serialVersionUID = 2480555291620298704L;
Modified: trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/EmployeeAction.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/EmployeeAction.java 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/EmployeeAction.java 2011-11-06 17:01:34 UTC (rev 128)
@@ -3,7 +3,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.chorem.ChoremProxy;
-import org.chorem.action.BaseAction;
+import org.chorem.action.ChoremBaseAction;
import org.chorem.entities.Employee;
import org.chorem.entities.EmployeeImpl;
import org.chorem.entities.Person;
@@ -19,7 +19,7 @@
*
* @author vbriand
*/
-public class EmployeeAction extends BaseAction {
+public class EmployeeAction extends ChoremBaseAction {
private static final long serialVersionUID = -5757750975509965421L;
Modified: trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/EmploymentContractAction.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/EmploymentContractAction.java 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/EmploymentContractAction.java 2011-11-06 17:01:34 UTC (rev 128)
@@ -9,7 +9,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.chorem.ChoremProxy;
-import org.chorem.action.BaseAction;
+import org.chorem.action.ChoremBaseAction;
import org.chorem.bonzoms.EmployeeFull;
import org.chorem.entities.Employee;
import org.chorem.entities.EmploymentContract;
@@ -28,7 +28,7 @@
*
* @author vbriand
*/
-public class EmploymentContractAction extends BaseAction {
+public class EmploymentContractAction extends ChoremBaseAction {
private static final long serialVersionUID = -5841507190565206548L;
Modified: trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/PersonAction.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/PersonAction.java 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/java/org/chorem/bonzoms/action/PersonAction.java 2011-11-06 17:01:34 UTC (rev 128)
@@ -10,7 +10,7 @@
import org.apache.commons.logging.LogFactory;
import org.chorem.ChoremProxy;
import org.chorem.ContactDetailsConstants;
-import org.chorem.action.BaseAction;
+import org.chorem.action.ChoremBaseAction;
import org.chorem.bonzoms.EmployeeFull;
import org.chorem.entities.Company;
import org.chorem.entities.ContactDetailsImpl;
@@ -26,6 +26,7 @@
import org.nuiton.wikitty.search.Search;
import com.opensymphony.xwork2.ActionContext;
+import org.apache.commons.lang.StringUtils;
import static org.nuiton.i18n.I18n.n_;
@@ -34,7 +35,7 @@
*
* @author vbriand
*/
-public class PersonAction extends BaseAction implements ContactDetailsConstants {
+public class PersonAction extends ChoremBaseAction implements ContactDetailsConstants {
private static final long serialVersionUID = -5757750975509965421L;
@@ -54,8 +55,7 @@
public String add() {
String result = INPUT;
- if (firstName != null && lastName != null && email != null &&
- birthDate != null) {
+ if (firstName != null && lastName != null) {
//If the person has been added successfully
if (addPerson()) {
result = SUCCESS;
@@ -91,7 +91,9 @@
setFirstName(person.getFirstName());
setLastName(person.getLastName());
setEmail(person.getEmail());
- setBirthDate(formatter.format(person.getBirthDate()));
+ if (person.getBirthDate() != null) {
+ setBirthDate(formatter.format(person.getBirthDate()));
+ }
} else {
result = ERROR;
}
@@ -158,39 +160,45 @@
try {
ChoremProxy proxy = getChoremProxy();
PersonImpl newPerson = new PersonImpl();
- SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
newPerson.setFirstName(firstName);
newPerson.setLastName(lastName);
- newPerson.setEmail(email);
-
- //Lenient mode disabled because results may be very odd
- formatter.setLenient(false);
- try {
- newPerson.setBirthDate(formatter.parse(birthDate));
- } catch (ParseException e) {
- result = false;
- addActionError(getText(n_("chorem.date.wrongFormat")));
+
+ if (StringUtils.isNotBlank(email)) {
+ newPerson.setEmail(email);
}
-
+
+ if (StringUtils.isNotBlank(birthDate)) {
+ SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
+ //Lenient mode disabled because results may be very odd
+ formatter.setLenient(false);
+ try {
+ newPerson.setBirthDate(formatter.parse(birthDate));
+ } catch (ParseException e) {
+ result = false;
+ addActionError(getText(n_("chorem.date.wrongFormat.birth")));
+ }
+ }
//If everything went smoothly
if (result) {
ContactDetailsImpl newContactDetails = new ContactDetailsImpl();
String address = addressLine1;
- if (!addressLine2.isEmpty()) {
+ if (StringUtils.isNotBlank(addressLine2)) {
address += "\n" + addressLine2;
}
address += "\n" + postcode + "\n" + city + "\n" + country;
- newContactDetails.setName(CONTACT_DETAILS_POSTAL_ADDRESS +
- " of person \"" + firstName + " " + lastName + "\"");
- newContactDetails.setType(CONTACT_DETAILS_POSTAL_ADDRESS);
- newContactDetails.setValue(address);
- newContactDetails.setTarget(newPerson.getWikittyId());
- proxy.store(newContactDetails);
+ if (StringUtils.isNotBlank(address)) {
+ newContactDetails.setName(CONTACT_DETAILS_POSTAL_ADDRESS +
+ " of person \"" + firstName + " " + lastName + "\"");
+ newContactDetails.setType(CONTACT_DETAILS_POSTAL_ADDRESS);
+ newContactDetails.setValue(address);
+ newContactDetails.setTarget(newPerson.getWikittyId());
+ proxy.store(newContactDetails);
+ }
- if (!phoneNb.isEmpty()) {
+ if (StringUtils.isNotBlank(phoneNb)) {
newContactDetails = new ContactDetailsImpl();
newContactDetails.setName(CONTACT_DETAILS_PHONE +
" of person \"" + firstName + " " + lastName + "\"");
@@ -227,64 +235,53 @@
*/
protected boolean storeEmployee(PersonImpl newPerson, boolean result,
ChoremProxy proxy) {
- //Filling the employee fields isn't mandatory, but if one of
- //them is filled, the others (except the diploma) must be
- //filled as well
- if (!employeePaidLeave.isEmpty() || !employeeRtt.isEmpty() ||
- !employeeDiploma.isEmpty()) {
- if (!employeePaidLeave.isEmpty() && !employeeRtt.isEmpty()) {
- EmployeeImpl newEmployee = new EmployeeImpl();
-
- newEmployee.setDiploma(employeeDiploma);
- newEmployee.setPerson(newPerson.getWikittyId());
- try {
- newEmployee.setPaidLeave(
- Float.parseFloat(employeePaidLeave));
- if (newEmployee.getPaidLeave() < 0) {
- throw new NumberFormatException();
- }
- } catch (NumberFormatException e) {
- result = false;
- addFieldError("employeePaidLeave", getText(
- n_("chorem.bonzoms.employee.paidLeave.wrongFormat")));
+ EmployeeImpl newEmployee = new EmployeeImpl();
+
+ newEmployee.setPerson(newPerson.getWikittyId());
+ newEmployee.setDiploma(employeeDiploma);
+
+ if (StringUtils.isNotBlank(employeePaidLeave)) {
+ try {
+ newEmployee.setPaidLeave(
+ Float.parseFloat(employeePaidLeave));
+ if (newEmployee.getPaidLeave() < 0) {
+ throw new NumberFormatException();
}
- try {
- newEmployee.setRtt(Float.parseFloat(employeeRtt));
- if (newEmployee.getRtt() < 0) {
- throw new NumberFormatException();
- }
- } catch (NumberFormatException e) {
- result = false;
- addFieldError("employeeRtt", getText(
- n_("chorem.bonzoms.employee.rtt.wrongFormat")));
+ } catch (NumberFormatException e) {
+ result = false;
+ addFieldError("employeePaidLeave", getText(
+ n_("chorem.bonzoms.employee.paidLeave.wrongFormat")));
+ }
+ }
+
+ if (StringUtils.isNotBlank(employeeRtt)) {
+ try {
+ newEmployee.setRtt(Float.parseFloat(employeeRtt));
+ if (newEmployee.getRtt() < 0) {
+ throw new NumberFormatException();
}
-
- if (proxy.restore(Company.class, companyId) != null) {
- newEmployee.setCompany(companyId);
- } else { //If the id doesn't exist or is invalid
- addActionError(getText(n_("chorem.bonzoms.employee.invalidCompany")));
- result = false;
- }
-
- if (result) {
- result = storeEmploymentContract(newEmployee, result, proxy);
- if (result) {
- proxy.store(newEmployee);
- }
- }
+ } catch (NumberFormatException e) {
+ result = false;
+ addFieldError("employeeRtt", getText(
+ n_("chorem.bonzoms.employee.rtt.wrongFormat")));
+ }
+ }
- } else {
+ if (StringUtils.isNotBlank(companyId)) {
+ if (proxy.restore(Company.class, companyId) != null) {
+ newEmployee.setCompany(companyId);
+ } else { //If the id doesn't exist or is invalid
+ addActionError(getText(n_("chorem.bonzoms.employee.invalidCompany")));
result = false;
- if (employeeDiploma.isEmpty()) {
- addFieldError("employeeDiploma",
- getText(n_("chorem.field.required")));
- }
- if (employeePaidLeave.isEmpty()) {
- addFieldError("employeePaidLeave",
- getText(n_("chorem.field.required")));
- }
}
}
+
+ if (result) {
+ result = storeEmploymentContract(newEmployee, result, proxy);
+ if (result) {
+ proxy.store(newEmployee);
+ }
+ }
return result;
}
@@ -298,35 +295,46 @@
*/
protected boolean storeEmploymentContract(EmployeeImpl employee,
boolean result, ChoremProxy proxy) {
- if (!contractDescription.isEmpty() && !contractSalary.isEmpty() &&
- !contractType.isEmpty() && !contractWorkingTime.isEmpty()) {
- EmploymentContractImpl newEmploymentContract =
+
+ EmploymentContractImpl newEmploymentContract =
new EmploymentContractImpl();
- SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
- newEmploymentContract.setDescription(contractDescription);
- newEmploymentContract.setEmployee(employee.getWikittyId());
-
+ newEmploymentContract.setEmployee(employee.getWikittyId());
+ newEmploymentContract.setType(contractType);
+ newEmploymentContract.setDescription(contractDescription);
+
+ SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
+ if (StringUtils.isNotBlank(contractBeginDate)) {
try {
newEmploymentContract.setBeginDate(
formatter.parse(contractBeginDate));
- if (!contractEndDate.isEmpty()) {
- newEmploymentContract.setEndDate(
- formatter.parse(contractEndDate));
- }
} catch (ParseException e) {
- addActionError(getText(n_("chorem.date.wrongFormat")));
+ addActionError(getText(n_("chorem.date.wrongFormat.contractBegin")));
result = false;
}
-
+ }
+
+ if (StringUtils.isNotBlank(contractEndDate)) {
try {
+ newEmploymentContract.setEndDate(
+ formatter.parse(contractEndDate));
+ } catch (ParseException e) {
+ addActionError(getText(n_("chorem.date.wrongFormat.contractEnd")));
+ result = false;
+ }
+ }
+
+ if (StringUtils.isNotBlank(contractSalary)) {
+ try {
newEmploymentContract.setSalary(Float.parseFloat(contractSalary));
} catch (NumberFormatException e) {
- addFieldError("contractSalary",
+ addFieldError("contractSalary",
getText(n_("chorem.bonzoms.employmentContract.salary.wrongFormat")));
result = false;
}
- newEmploymentContract.setType(contractType);
+ }
+
+ if (StringUtils.isNotBlank(contractWorkingTime)) {
try {
newEmploymentContract.setWorkingTime(
Integer.parseInt(contractWorkingTime));
@@ -335,14 +343,11 @@
getText(n_("chorem.bonzoms.employmentContract.workingTime.wrongFormat")));
result = false;
}
- if (result) {
- proxy.store(newEmploymentContract);
- }
- } else {
- addActionError(getText(
- n_("chorem.bonzoms.employmentContract.allFieldsRequired")));
- result = false;
}
+
+ if (result) {
+ proxy.store(newEmploymentContract);
+ }
return result;
}
Modified: trunk/chorem-web/src/main/java/org/chorem/gepeto/action/ProjectAction.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/gepeto/action/ProjectAction.java 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/java/org/chorem/gepeto/action/ProjectAction.java 2011-11-06 17:01:34 UTC (rev 128)
@@ -12,7 +12,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.chorem.ChoremProxy;
-import org.chorem.action.BaseAction;
+import org.chorem.action.ChoremBaseAction;
import org.chorem.entities.Company;
import org.chorem.entities.Project;
import org.chorem.entities.ProjectImpl;
@@ -32,7 +32,7 @@
*
* @author vbriand
*/
-public class ProjectAction extends BaseAction {
+public class ProjectAction extends ChoremBaseAction {
private static final long serialVersionUID = 498267854350348906L;
Modified: trunk/chorem-web/src/main/java/org/chorem/gepeto/action/ProjectOrderAction.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/gepeto/action/ProjectOrderAction.java 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/java/org/chorem/gepeto/action/ProjectOrderAction.java 2011-11-06 17:01:34 UTC (rev 128)
@@ -10,7 +10,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.chorem.ChoremProxy;
-import org.chorem.action.BaseAction;
+import org.chorem.action.ChoremBaseAction;
import org.chorem.entities.Company;
import org.chorem.entities.ProjectOrder;
import org.chorem.entities.ProjectOrderImpl;
@@ -29,7 +29,7 @@
*
* @author vbriand
*/
-public class ProjectOrderAction extends BaseAction {
+public class ProjectOrderAction extends ChoremBaseAction {
private static final long serialVersionUID = -5469320345746533520L;
Modified: trunk/chorem-web/src/main/java/org/chorem/gepeto/action/TaskAction.java
===================================================================
--- trunk/chorem-web/src/main/java/org/chorem/gepeto/action/TaskAction.java 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/java/org/chorem/gepeto/action/TaskAction.java 2011-11-06 17:01:34 UTC (rev 128)
@@ -8,7 +8,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.chorem.ChoremProxy;
-import org.chorem.action.BaseAction;
+import org.chorem.action.ChoremBaseAction;
import org.chorem.entities.ProjectOrder;
import org.chorem.entities.TaskImpl;
@@ -21,7 +21,7 @@
*
* @author vbriand
*/
-public class TaskAction extends BaseAction {
+public class TaskAction extends ChoremBaseAction {
private static final long serialVersionUID = -3938480897148282089L;
Added: trunk/chorem-web/src/main/resources/freemarker.properties
===================================================================
--- trunk/chorem-web/src/main/resources/freemarker.properties (rev 0)
+++ trunk/chorem-web/src/main/resources/freemarker.properties 2011-11-06 17:01:34 UTC (rev 128)
@@ -0,0 +1,24 @@
+###
+# #%L
+# BOW UI
+#
+# $Id: freemarker.properties 333 2011-08-31 12:32:26Z bpoussin $
+# $HeadURL: http://svn.chorem.org/svn/bow/trunk/bow-ui/src/main/resources/freemarker.pr… $
+# %%
+# Copyright (C) 2010 - 2011 CodeLutin
+# %%
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero 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 Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+# #L%
+###
+template_update_delay=600000
\ No newline at end of file
Modified: trunk/chorem-web/src/main/resources/i18n/chorem-web_en_GB.properties
===================================================================
--- trunk/chorem-web/src/main/resources/i18n/chorem-web_en_GB.properties 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/resources/i18n/chorem-web_en_GB.properties 2011-11-06 17:01:34 UTC (rev 128)
@@ -1,9 +1,9 @@
chorem.beginDate.beforeToday=The date cannot be set before today''s date
chorem.billy.home=Home
-chorem.billy.quotation=Quotation \#{0}
+chorem.billy.quotation=Quotation \#%s
chorem.billy.quotation.add=Add a new quotation
chorem.billy.quotation.addProjectOrder=
-chorem.billy.quotation.addToProject=Add a new quotation to the project "{0}"
+chorem.billy.quotation.addToProject=Add a new quotation to the project "%s"
chorem.billy.quotation.amount=Amount
chorem.billy.quotation.backToProjectDetails=Get back to project
chorem.billy.quotation.customer=
@@ -22,7 +22,7 @@
chorem.billy.quotation.vta=VTA
chorem.billy.quotationDetails.title=
chorem.bonzoms.companies=
-chorem.bonzoms.company=Company {0}
+chorem.bonzoms.company=Company %s
chorem.bonzoms.company.add=Add a new company
chorem.bonzoms.company.address=
chorem.bonzoms.company.addressLine1=Address
@@ -82,11 +82,14 @@
chorem.config.configFileName.description=chorem''s configuration filename
chorem.create.error=An error occurred, please try again. If the problem persists, please contact an administrator
chorem.date.wrongFormat=The date must be in the following format \: dd/mm/yyyy
+chorem.date.wrongFormat.birth=
+chorem.date.wrongFormat.contractBegin=
+chorem.date.wrongFormat.contractEnd=
chorem.endDate.afterBegin=The end date cannot be posterior to the begin date
chorem.error.internal=An internal error occurred
chorem.field.required=You must fill in this field
chorem.gepeto.home=Home
-chorem.gepeto.project=Project {0}
+chorem.gepeto.project=Project %s
chorem.gepeto.project.add=New project
chorem.gepeto.project.description=Description
chorem.gepeto.project.name=Project''s name
@@ -94,13 +97,13 @@
chorem.gepeto.projectDetails.noQuotations=No quotations
chorem.gepeto.projectDetails.projectOrder=
chorem.gepeto.projectDetails.projectOrders=
-chorem.gepeto.projectDetails.quotation=Quotation of {0} (ref. {1})
+chorem.gepeto.projectDetails.quotation=Quotation of %s (ref. %s)
chorem.gepeto.projectDetails.quotationWithProjectOrder=Project''s quotation with project order
chorem.gepeto.projectDetails.quotationsWithoutProjectOrder=Project''s quotations without project order
-chorem.gepeto.projectDetails.title=Details of project "{0}"
+chorem.gepeto.projectDetails.title=Details of project "%s"
chorem.gepeto.projectOrder=Project order
chorem.gepeto.projectOrder.add=Add a new project order
-chorem.gepeto.projectOrder.addToQuotation=Add a new project order to the quotation \#{0}
+chorem.gepeto.projectOrder.addToQuotation=Add a new project order to the quotation \#%s
chorem.gepeto.projectOrder.backToQuotationDetails=Get back to the quotation
chorem.gepeto.projectOrder.beginDate=Begin date (dd/mm/yyyy)
chorem.gepeto.projectOrder.company.name=
@@ -127,11 +130,11 @@
chorem.gepeto.projectsByYear.thead.end=End
chorem.gepeto.projectsByYear.thead.name=Name
chorem.gepeto.projectsByYear.thead.start=Start
-chorem.gepeto.projectsByYear.title=Projects of year {0}
+chorem.gepeto.projectsByYear.title=Projects of year %s
chorem.gepeto.projectsWithoutQuotation=Projects list without quotation
chorem.gepeto.projectsWithoutQuotation.title=
chorem.gepeto.results.title=Results by year
-chorem.gepeto.task=Task {0}
+chorem.gepeto.task=Task %s
chorem.gepeto.task.add=Add a new task
chorem.gepeto.task.backToProjectDetails=
chorem.gepeto.task.beginDate=Begin date (dd/mm/yyyy)
Modified: trunk/chorem-web/src/main/resources/i18n/chorem-web_fr_FR.properties
===================================================================
--- trunk/chorem-web/src/main/resources/i18n/chorem-web_fr_FR.properties 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/resources/i18n/chorem-web_fr_FR.properties 2011-11-06 17:01:34 UTC (rev 128)
@@ -1,9 +1,9 @@
chorem.beginDate.beforeToday=La date entr\u00E9e ne peut \u00EAtre ant\u00E9rieure \u00E0 la date du jour
chorem.billy.home=Accueil
-chorem.billy.quotation=Devis \#{0}
+chorem.billy.quotation=Devis \#%s
chorem.billy.quotation.add=Ajouter un nouveau devis
chorem.billy.quotation.addProjectOrder=Cr\u00E9er un contrat pour ce devis
-chorem.billy.quotation.addToProject=Ajouter un nouveau devis au projet "{0}"
+chorem.billy.quotation.addToProject=Ajouter un nouveau devis au projet "%s"
chorem.billy.quotation.amount=Montant
chorem.billy.quotation.backToProjectDetails=Retourner sur le projet
chorem.billy.quotation.customer=Client
@@ -12,14 +12,14 @@
chorem.billy.quotation.invalidSupplier=
chorem.billy.quotation.postedDate=Date de d\u00E9p\u00F4t
chorem.billy.quotation.projectOrder=Contrat r\u00E9alis\u00E9 sur la base de ce devis
-chorem.billy.quotation.projectOrder.beginDate=Date de d\u00E9but \: {0}
-chorem.billy.quotation.projectOrder.company=Soci\u00E9t\u00E9 \: {0}
-chorem.billy.quotation.projectOrder.endDate=Date de fin \: {0}
-chorem.billy.quotation.projectOrder.type=Type \: {0}
+chorem.billy.quotation.projectOrder.beginDate=Date de d\u00E9but \: %s
+chorem.billy.quotation.projectOrder.company=Soci\u00E9t\u00E9 \: %s
+chorem.billy.quotation.projectOrder.endDate=Date de fin \: %s
+chorem.billy.quotation.projectOrder.type=Type \: %s
chorem.billy.quotation.reference=R\u00E9f\u00E9rence
chorem.billy.quotation.supplier=Fournisseur
chorem.billy.quotation.vta=TVA
-chorem.billy.quotationDetails.title=D\u00E9tails du devis "{0}"
+chorem.billy.quotationDetails.title=D\u00E9tails du devis "%s"
chorem.bonzoms.companies=Liste des entreprises
chorem.bonzoms.company=Soci\u00E9t\u00E9
chorem.bonzoms.company.add=Ajouter une nouvelle soci\u00E9t\u00E9
@@ -35,8 +35,8 @@
chorem.bonzoms.company.postcode=Code postal
chorem.bonzoms.company.type=Type de la soci\u00E9t\u00E9
chorem.bonzoms.company.website=Site internet (opt.)
-chorem.bonzoms.companyDetails.name=Entreprise "{0}"
-chorem.bonzoms.companyDetails.title=D\u00E9tails de l''entreprise "{0}"
+chorem.bonzoms.companyDetails.name=Entreprise "%s"
+chorem.bonzoms.companyDetails.title=D\u00E9tails de l''entreprise "%s"
chorem.bonzoms.contactDetails=M\u00E9thode de contact
chorem.bonzoms.contactDetails.add=Ajouter une nouvelle m\u00E9thode de contact
chorem.bonzoms.contactDetails.name=Nom de la m\u00E9thode de contact
@@ -77,30 +77,33 @@
chorem.bonzoms.person.list=Obtenir la liste des personnes
chorem.bonzoms.person.phoneNb=Num\u00E9ro de t\u00E9l\u00E9phone (opt.)
chorem.bonzoms.person.postcode=Code postal
-chorem.bonzoms.personDetails.title=Informations d\u00E9taill\u00E9es de "{0}"
+chorem.bonzoms.personDetails.title=Informations d\u00E9taill\u00E9es de "%s"
chorem.bonzoms.persons=Liste des personnes
chorem.config.configFileName.description=Nom du fichier de configuration de chorem
chorem.create.error=Une erreur s''est produite, merci d''essayer \u00E0 nouveau. Si le probl\u00E8me se reproduit, merci de contacter un administrateur
chorem.date.wrongFormat=La date doit respecter le format suivant \: jj/mm/yyyy
+chorem.date.wrongFormat.birth=
+chorem.date.wrongFormat.contractBegin=
+chorem.date.wrongFormat.contractEnd=
chorem.endDate.afterBegin=La date de fin ne doit pas pas \u00EAtre ant\u00E9rieure \u00E0 la date de d\u00E9but
chorem.error.internal=Une erreur interne s''est produite
chorem.field.required=Vous devez remplir ce champ
chorem.gepeto.home=Accueil
-chorem.gepeto.project=Projet {0}
+chorem.gepeto.project=Projet %s
chorem.gepeto.project.add=Nouveau projet
chorem.gepeto.project.description=Description
chorem.gepeto.project.name=Nom du projet
chorem.gepeto.projectDetails.noProjectOrder=Pas de contrat
chorem.gepeto.projectDetails.noQuotations=Pas de devis
-chorem.gepeto.projectDetails.projectOrder=Contrat du {0} au {1}
+chorem.gepeto.projectDetails.projectOrder=Contrat du %s au %s
chorem.gepeto.projectDetails.projectOrders=Contrats du projet
-chorem.gepeto.projectDetails.quotation=Devis du {0} (r\u00E9f. {1})
+chorem.gepeto.projectDetails.quotation=Devis du %s (r\u00E9f. %s)
chorem.gepeto.projectDetails.quotationWithProjectOrder=Devis du projet avec un contrat
chorem.gepeto.projectDetails.quotationsWithoutProjectOrder=Devis du projet sans contrat
-chorem.gepeto.projectDetails.title=D\u00E9tails du projet "{0}"
+chorem.gepeto.projectDetails.title=D\u00E9tails du projet "%s"
chorem.gepeto.projectOrder=Contrat de commande d''un projet
chorem.gepeto.projectOrder.add=Ajouter le contrat d''un projet
-chorem.gepeto.projectOrder.addToQuotation=Lier un nouveau contrat au devis \#{0}
+chorem.gepeto.projectOrder.addToQuotation=Lier un nouveau contrat au devis \#%s
chorem.gepeto.projectOrder.backToQuotationDetails=Retourner sur le devis
chorem.gepeto.projectOrder.beginDate=Date de d\u00E9but
chorem.gepeto.projectOrder.company=Entreprise
@@ -112,14 +115,14 @@
chorem.gepeto.projectOrder.status=Statut
chorem.gepeto.projectOrder.type=Type
chorem.gepeto.projectOrderDetails.beginDate=Date de d\u00E9but
-chorem.gepeto.projectOrderDetails.companyName=Nom de la soci\u00E9t\u00E9 \: {0}
+chorem.gepeto.projectOrderDetails.companyName=Nom de la soci\u00E9t\u00E9 \: %s
chorem.gepeto.projectOrderDetails.endDate=Date de fin
-chorem.gepeto.projectOrderDetails.quotation=Contrat r\u00E9alis\u00E9 sur la base du devis \#{0}
-chorem.gepeto.projectOrderDetails.task.beginDate=D\u00E9but de la t\u00E2che \: {0}
-chorem.gepeto.projectOrderDetails.task.endDate=Fin de la t\u00E2che \: {0}
-chorem.gepeto.projectOrderDetails.task.name=Nom de la t\u00E2che \: {0}
-chorem.gepeto.projectOrderDetails.task.price=Prix de la t\u00E2che \: {0}
-chorem.gepeto.projectOrderDetails.task.status=Statut de la t\u00E2che \: {0}
+chorem.gepeto.projectOrderDetails.quotation=Contrat r\u00E9alis\u00E9 sur la base du devis \#%s
+chorem.gepeto.projectOrderDetails.task.beginDate=D\u00E9but de la t\u00E2che \: %s
+chorem.gepeto.projectOrderDetails.task.endDate=Fin de la t\u00E2che \: %s
+chorem.gepeto.projectOrderDetails.task.name=Nom de la t\u00E2che \: %s
+chorem.gepeto.projectOrderDetails.task.price=Prix de la t\u00E2che \: %s
+chorem.gepeto.projectOrderDetails.task.status=Statut de la t\u00E2che \: %s
chorem.gepeto.projectOrderDetails.tasks=T\u00E2ches li\u00E9es au contrat
chorem.gepeto.projectOrderDetails.title=D\u00E9tails du contrat
chorem.gepeto.projectOrderDetails.type=Type de contrat
@@ -128,13 +131,13 @@
chorem.gepeto.projectsByYear.thead.end=Fin
chorem.gepeto.projectsByYear.thead.name=Nom
chorem.gepeto.projectsByYear.thead.start=D\u00E9but
-chorem.gepeto.projectsByYear.title=Projets de l''ann\u00E9e {0}
+chorem.gepeto.projectsByYear.title=Projets de l''ann\u00E9e %s
chorem.gepeto.projectsByYear.withProjectOrder=Avec contrat
chorem.gepeto.projectsByYear.withoutProjectOrder=Sans contrat
chorem.gepeto.projectsWithoutQuotation=Liste des projets sans devis
chorem.gepeto.projectsWithoutQuotation.title=Liste des projets sans devis
chorem.gepeto.results.title=R\u00E9sultats par ann\u00E0e
-chorem.gepeto.task=T\u00E2che {0}
+chorem.gepeto.task=T\u00E2che %s
chorem.gepeto.task.add=Ajouter une nouvelle t\u00E2che
chorem.gepeto.task.backToProjectDetails=Retourner sur le contrat
chorem.gepeto.task.beginDate=Date de d\u00E9but
Modified: trunk/chorem-web/src/main/resources/log4j.properties
===================================================================
--- trunk/chorem-web/src/main/resources/log4j.properties 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/resources/log4j.properties 2011-11-06 17:01:34 UTC (rev 128)
@@ -22,7 +22,7 @@
# #L%
###
# Global logging configuration
-log4j.rootLogger=WARN, stdout
+log4j.rootLogger=INFO, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
@@ -30,5 +30,5 @@
log4j.appender.stdout.layout.ConversionPattern=%d %5p [%t] (%F:%L) %M - %m%n
# package level
-log4j.logger.org.chorem=INFO
+log4j.logger.org.chorem=DEBUG
log4j.logger.org.nuiton=INFO
Modified: trunk/chorem-web/src/main/resources/org/chorem/bonzoms/action/CompanyAction-addCompany-validation.xml
===================================================================
--- trunk/chorem-web/src/main/resources/org/chorem/bonzoms/action/CompanyAction-addCompany-validation.xml 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/resources/org/chorem/bonzoms/action/CompanyAction-addCompany-validation.xml 2011-11-06 17:01:34 UTC (rev 128)
@@ -8,6 +8,8 @@
<message key="chorem.field.required" />
</field-validator>
</field>
+ <!-- poussin 20110616 seul le nom est requis les autres infos doivent pouvoir
+ etre saisie plus tard
<field name="type">
<field-validator type="requiredstring">
<message key="chorem.field.required" />
@@ -33,4 +35,5 @@
<message key="chorem.field.required" />
</field-validator>
</field>
+ -->
</validators>
Modified: trunk/chorem-web/src/main/resources/org/chorem/bonzoms/action/CompanyAction-modifyCompany-validation.xml
===================================================================
--- trunk/chorem-web/src/main/resources/org/chorem/bonzoms/action/CompanyAction-modifyCompany-validation.xml 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/resources/org/chorem/bonzoms/action/CompanyAction-modifyCompany-validation.xml 2011-11-06 17:01:34 UTC (rev 128)
@@ -3,6 +3,8 @@
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
+ <!-- poussin 20110616 seul le nom est requis les autres infos doivent pouvoir
+ etre saisie plus tard
<field name="type">
<field-validator type="requiredstring">
<message key="chorem.field.required" />
@@ -13,4 +15,5 @@
<message key="chorem.field.required" />
</field-validator>
</field>
+ -->
</validators>
Modified: trunk/chorem-web/src/main/resources/org/chorem/bonzoms/action/EmploymentContractAction-addEmploymentContract-validation.xml
===================================================================
--- trunk/chorem-web/src/main/resources/org/chorem/bonzoms/action/EmploymentContractAction-addEmploymentContract-validation.xml 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/resources/org/chorem/bonzoms/action/EmploymentContractAction-addEmploymentContract-validation.xml 2011-11-06 17:01:34 UTC (rev 128)
@@ -3,6 +3,9 @@
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
+ <!-- poussin 20110616 seul la societe est requise les autres infos doivent pouvoir
+ etre saisie plus tard
+
<field name="type">
<field-validator type="requiredstring">
<message key="chorem.field.required" />
@@ -46,4 +49,5 @@
<message key="chorem.date.wrongFormat" />
</field-validator>
</field>
+ -->
</validators>
Modified: trunk/chorem-web/src/main/resources/org/chorem/bonzoms/action/PersonAction-addPerson-validation.xml
===================================================================
--- trunk/chorem-web/src/main/resources/org/chorem/bonzoms/action/PersonAction-addPerson-validation.xml 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/resources/org/chorem/bonzoms/action/PersonAction-addPerson-validation.xml 2011-11-06 17:01:34 UTC (rev 128)
@@ -13,6 +13,8 @@
<message key="chorem.field.required" />
</field-validator>
</field>
+ <!-- poussin 20110616 seul le nom et prenom sont requis les autres infos doivent pouvoir
+ etre saisie plus tard
<field name="email">
<field-validator type="requiredstring">
<message key="chorem.field.required" />
@@ -46,4 +48,5 @@
<message key="chorem.field.required" />
</field-validator>
</field>
+ -->
</validators>
Modified: trunk/chorem-web/src/main/resources/org/chorem/gepeto/action/ProjectAction-addProject-validation.xml
===================================================================
--- trunk/chorem-web/src/main/resources/org/chorem/gepeto/action/ProjectAction-addProject-validation.xml 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/resources/org/chorem/gepeto/action/ProjectAction-addProject-validation.xml 2011-11-06 17:01:34 UTC (rev 128)
@@ -1,16 +1,19 @@
<!DOCTYPE validators PUBLIC
- "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
- "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
+"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
+"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="name">
- <field-validator type="requiredstring">
- <message key="chorem.field.required" />
- </field-validator>
+ <field-validator type="requiredstring">
+ <message key="chorem.field.required" />
+ </field-validator>
</field>
+ <!-- poussin 20110616 seul le nom est requis les autres infos doivent pouvoir
+ etre saisie plus tard
<field name="description">
<field-validator type="requiredstring">
<message key="chorem.field.required" />
</field-validator>
</field>
+ -->
</validators>
Modified: trunk/chorem-web/src/main/resources/org/chorem/gepeto/action/ProjectAction-modifyProject-validation.xml
===================================================================
--- trunk/chorem-web/src/main/resources/org/chorem/gepeto/action/ProjectAction-modifyProject-validation.xml 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/resources/org/chorem/gepeto/action/ProjectAction-modifyProject-validation.xml 2011-11-06 17:01:34 UTC (rev 128)
@@ -1,11 +1,14 @@
<!DOCTYPE validators PUBLIC
- "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
- "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
+"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
+"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
+ <!-- poussin 20110616 seul le nom est requis les autres infos doivent pouvoir
+ etre saisie plus tard
<field name="description">
<field-validator type="requiredstring">
<message key="chorem.field.required" />
</field-validator>
</field>
+ -->
</validators>
Modified: trunk/chorem-web/src/main/resources/org/chorem/gepeto/action/TaskAction-addTask-validation.xml
===================================================================
--- trunk/chorem-web/src/main/resources/org/chorem/gepeto/action/TaskAction-addTask-validation.xml 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/resources/org/chorem/gepeto/action/TaskAction-addTask-validation.xml 2011-11-06 17:01:34 UTC (rev 128)
@@ -4,9 +4,9 @@
<validators>
<field name="name">
- <field-validator type="requiredstring">
- <message key="chorem.field.required" />
- </field-validator>
+ <field-validator type="requiredstring">
+ <message key="chorem.field.required" />
+ </field-validator>
</field>
<field name="description">
<field-validator type="requiredstring">
Modified: trunk/chorem-web/src/main/resources/struts.properties
===================================================================
--- trunk/chorem-web/src/main/resources/struts.properties 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/resources/struts.properties 2011-11-06 17:01:34 UTC (rev 128)
@@ -47,5 +47,6 @@
#struts.freemarker.manager.classname=org.apache.struts2.views.freemarker.FreemarkerManager
struts.freemarker.wrapper.altMap=true
+struts.freemarker.templatesCache=true
struts.xslt.nocache=false
Modified: trunk/chorem-web/src/main/resources/struts.xml
===================================================================
--- trunk/chorem-web/src/main/resources/struts.xml 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/resources/struts.xml 2011-11-06 17:01:34 UTC (rev 128)
@@ -1,19 +1,58 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
- "http://struts.apache.org/dtds/struts-2.0.dtd">
+ "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
+ "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
- <constant name="struts.devMode" value="true" />
- <constant name="struts.ognl.allowStaticMethodAccess" value="true" />
-
- <package name="chorem" namespace="/" extends="struts-default">
- <default-action-ref name="home" />
+ <bean class="org.nuiton.web.struts2.I18nTextProvider" name="i18nTextProvider"
+ type="com.opensymphony.xwork2.TextProvider" />
+ <constant name="struts.xworkTextProvider" value="i18nTextProvider" />
+
+ <!-- pour ne pas remettre tous les parametres deja existant sur
+ les url construite avec s:url -->
+ <constant name="struts.url.includeParams" value="none" />
+ <constant name="struts.devMode" value="true"/>
+ <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
+ <constant name="struts.enable.SlashesInActionNames" value="true"/>
+
+ <!--
+ | Definition d'un package pour l'espace public
+ | - surcharge de parametre de certain intercepteur
+ +-->
+ <package name="publicArea" extends="struts-default">
+ <result-types>
+ <result-type name="json" class="org.apache.struts2.json.JSONResult"/>
+ </result-types>
+
+ <interceptors>
+ <interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>
+ <interceptor-stack name="publicAreaStack">
+
+ <!-- display errors in logger -->
+ <interceptor-ref name="exception">
+ <param name="logEnabled">true</param>
+ <param name="logCategory">org.chorem</param>
+ <param name="logLevel">ERROR</param>
+ </interceptor-ref>
+ <interceptor-ref name="defaultStack"/>
+ <interceptor-ref name="json">
+ <param name="enableSMD">true</param>
+ </interceptor-ref>
+ </interceptor-stack>
+ </interceptors>
+ <default-interceptor-ref name="publicAreaStack"/>
+ </package>
+
+ <package name="chorem" namespace="/" extends="publicArea">
+ <default-action-ref name="home" />
<action name="home" class="org.chorem.action.HomeAction">
<result>/WEB-INF/jsp/home.jsp</result>
</action>
+ <action name="EntitySearchJson" class="org.chorem.action.EntitySearchJsonAction">
+ <result type="json"/>
+ </action>
</package>
- <package name="bonzoms" namespace="/bonzoms" extends="struts-default">
+ <package name="bonzoms" namespace="/bonzoms" extends="publicArea">
<default-action-ref name="companies" />
<action name="addCompanyInput">
<result>/WEB-INF/jsp/bonzoms/addCompany.jsp</result>
@@ -35,7 +74,7 @@
<param name="companyId">${companyId}</param>
</result>
</action>
- <action name="companies" class="org.chorem.bonzoms.action.CompanyAction">
+ <action name="companies">
<result>/WEB-INF/jsp/bonzoms/companies.jsp</result>
</action>
<action name="addPersonInput" class="org.chorem.bonzoms.action.PersonAction">
@@ -103,8 +142,8 @@
</action>
</package>
- <package name="gepeto" namespace="/gepeto" extends="struts-default">
- <default-action-ref name="projectsWithoutQuotation" />
+ <package name="gepeto" namespace="/gepeto" extends="publicArea">
+ <default-action-ref name="projectsWithoutQuotation" />
<action name="addProjectInput">
<result>/WEB-INF/jsp/gepeto/addProject.jsp</result>
</action>
@@ -181,8 +220,8 @@
</action>
</package>
- <package name="billy" namespace="/billy" extends="struts-default">
- <default-action-ref name="home" />
+ <package name="billy" namespace="/billy" extends="publicArea">
+ <default-action-ref name="home" />
<action name="home">
<result>/WEB-INF/jsp/billy/home.jsp</result>
</action>
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/decorators/billy.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/decorators/billy.jsp 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/decorators/billy.jsp 2011-11-06 17:01:34 UTC (rev 128)
@@ -2,6 +2,7 @@
<%@taglib prefix="decorator" uri="http://www.opensymphony.com/sitemesh/decorator" %>
<%@taglib prefix="page" uri="http://www.opensymphony.com/sitemesh/page" %>
<%@taglib prefix="s" uri="/struts-tags" %>
+<%@taglib prefix="sj" uri="/struts-jquery-tags" %>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
@@ -9,11 +10,13 @@
xmlns:decorator="http://www.opensymphony.com/sitemesh/decorator">
<head>
<title>Chorem - billy : <decorator:title default="no title" /></title>
- <decorator:head />
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta name="description" content="" />
<s:url var="CSS" value="/css/style.css" />
<link href="${CSS}" rel="stylesheet" type="text/css" media="all" />
+ <s:head />
+ <sj:head locale="fr" jqueryui="true" jquerytheme="redmond"/>
+ <decorator:head />
</head>
<body>
<s:include value="/WEB-INF/jsp/common/inc/header.jsp" />
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/decorators/bonzoms.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/decorators/bonzoms.jsp 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/decorators/bonzoms.jsp 2011-11-06 17:01:34 UTC (rev 128)
@@ -2,6 +2,7 @@
<%@taglib prefix="decorator" uri="http://www.opensymphony.com/sitemesh/decorator" %>
<%@taglib prefix="page" uri="http://www.opensymphony.com/sitemesh/page" %>
<%@taglib prefix="s" uri="/struts-tags" %>
+<%@taglib prefix="sj" uri="/struts-jquery-tags" %>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
@@ -9,11 +10,13 @@
xmlns:decorator="http://www.opensymphony.com/sitemesh/decorator">
<head>
<title>Chorem - bonzoms : <decorator:title default="no title" /></title>
- <decorator:head />
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta name="description" content="" />
<s:url var="CSS" value="/css/style.css" />
<link href="${CSS}" rel="stylesheet" type="text/css" media="all" />
+ <s:head />
+ <sj:head locale="fr" jqueryui="true" jquerytheme="redmond"/>
+ <decorator:head />
</head>
<body>
<s:include value="/WEB-INF/jsp/common/inc/header.jsp" />
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/decorators/cash.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/decorators/cash.jsp 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/decorators/cash.jsp 2011-11-06 17:01:34 UTC (rev 128)
@@ -2,6 +2,7 @@
<%@taglib prefix="decorator" uri="http://www.opensymphony.com/sitemesh/decorator" %>
<%@taglib prefix="page" uri="http://www.opensymphony.com/sitemesh/page" %>
<%@taglib prefix="s" uri="/struts-tags" %>
+<%@taglib prefix="sj" uri="/struts-jquery-tags" %>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
@@ -9,11 +10,13 @@
xmlns:decorator="http://www.opensymphony.com/sitemesh/decorator">
<head>
<title>Chorem - cash : <decorator:title default="no title" /></title>
- <decorator:head />
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta name="description" content="" />
<s:url var="CSS" value="/css/style.css" />
<link href="${CSS}" rel="stylesheet" type="text/css" media="all" />
+ <s:head />
+ <sj:head locale="fr" jqueryui="true" jquerytheme="redmond"/>
+ <decorator:head />
</head>
<body>
<s:include value="/WEB-INF/jsp/common/inc/header.jsp" />
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/decorators/gepeto.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/decorators/gepeto.jsp 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/decorators/gepeto.jsp 2011-11-06 17:01:34 UTC (rev 128)
@@ -2,6 +2,7 @@
<%@taglib prefix="decorator" uri="http://www.opensymphony.com/sitemesh/decorator" %>
<%@taglib prefix="page" uri="http://www.opensymphony.com/sitemesh/page" %>
<%@taglib prefix="s" uri="/struts-tags" %>
+<%@taglib prefix="sj" uri="/struts-jquery-tags" %>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
@@ -9,11 +10,13 @@
xmlns:decorator="http://www.opensymphony.com/sitemesh/decorator">
<head>
<title>Chorem - gepeto : <decorator:title default="no title" /></title>
- <decorator:head />
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta name="description" content="" />
<s:url var="CSS" value="/css/style.css" />
<link href="${CSS}" rel="stylesheet" type="text/css" media="all" />
+ <s:head />
+ <sj:head locale="fr" jqueryui="true" jquerytheme="redmond"/>
+ <decorator:head />
</head>
<body>
<s:include value="/WEB-INF/jsp/common/inc/header.jsp" />
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/decorators/main.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/decorators/main.jsp 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/decorators/main.jsp 2011-11-06 17:01:34 UTC (rev 128)
@@ -2,6 +2,7 @@
<%@taglib prefix="decorator" uri="http://www.opensymphony.com/sitemesh/decorator" %>
<%@taglib prefix="page" uri="http://www.opensymphony.com/sitemesh/page" %>
<%@taglib prefix="s" uri="/struts-tags" %>
+<%@taglib prefix="sj" uri="/struts-jquery-tags" %>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
@@ -9,13 +10,17 @@
xmlns:decorator="http://www.opensymphony.com/sitemesh/decorator">
<head>
<title>Chorem : <decorator:title default="no title" /></title>
- <decorator:head />
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta name="description" content="" />
<s:url var="CSS" value="/css/style.css" />
<link href="${CSS}" rel="stylesheet" type="text/css" media="all" />
+ <s:head />
+ <sj:head locale="fr" jqueryui="true" jquerytheme="redmond"/>
+ <decorator:head />
+ toto
</head>
<body>
+ titi
<s:include value="/WEB-INF/jsp/common/inc/header.jsp" />
<decorator:body />
<s:include value="/WEB-INF/jsp/common/inc/footer.jsp" />
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/billy/addQuotation.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/billy/addQuotation.jsp 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/billy/addQuotation.jsp 2011-11-06 17:01:34 UTC (rev 128)
@@ -8,58 +8,66 @@
<html xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
xmlns:jsp="http://java.sun.com/JSP/Page">
- <head>
- <title><s:text name="chorem.billy.quotation.add" /></title>
- <s:head />
- </head>
- <body>
- <h2>
- <s:text name="chorem.billy.quotation.addToProject">
- <s:param><%= QuotationAction.getAction().getProjectName() %></s:param>
- </s:text>
- </h2>
- <s:actionerror />
- <s:url action="addQuotation" var="addQuotation">
- <s:param name="projectId"><%= QuotationAction.getAction().getProjectId() %></s:param>
- </s:url>
- <form action="${addQuotation}" method="post">
- <fieldset>
- <legend>
- <s:text name="chorem.billy.quotation" />
- </legend>
- <s:textfield key="chorem.billy.quotation.reference" name="reference" labelSeparator=": " />
- <br />
- <s:textarea key="chorem.billy.quotation.description" name="description" cols="50" rows="10" labelposition="top" labelSeparator=": " />
- <br />
- <s:textfield key="chorem.billy.quotation.amount" name="amount" labelSeparator=": " size="6" />
- <br />
- <s:textfield key="chorem.billy.quotation.vta" name="vta" labelSeparator=": " size="2" />%
- <br />
- <s:textfield key="chorem.billy.quotation.postedDate" name="postedDate" labelSeparator=": " size="7" value="%{dayDate}" />
- <br />
- <label for="supplierId" class="label"><s:text name="chorem.billy.quotation.supplier" />: </label>
- <select name="supplierId" id="supplierId">
- <%
- List<EmployeeFull> employees = QuotationAction.getAction().getAllEmployees();
-
- for (EmployeeFull employee : employees) {
- %>
- <option value="<%= employee.getEmployee().getWikittyId() %>"><%= employee.getCompany().getName() %> - <%= employee.getPerson().getLastName() %> <%= employee.getPerson().getFirstName() %> (<%= JspUtils.dateFormat(employee.getPerson().getBirthDate()) %>)</option>
- <% } %>
- </select>
- <br />
- <label for="customerId" class="label"><s:text name="chorem.billy.quotation.customer" />: </label>
- <select name="customerId" id="customerId">
- <%
- for (EmployeeFull employee : employees) {
- %>
- <option value="<%= employee.getEmployee().getWikittyId() %>"><%= employee.getCompany().getName() %> - <%= employee.getPerson().getLastName() %> <%= employee.getPerson().getFirstName() %> (<%= JspUtils.dateFormat(employee.getPerson().getBirthDate()) %>)</option>
- <% } %>
- </select>
- <br />
- <br />
- <s:submit key="chorem.billy.quotation.add" name="submit" />
- </fieldset>
- </form>
- </body>
+ <head>
+ <title><s:text name="chorem.billy.quotation.add" /></title>
+ <s:head />
+ </head>
+ <body>
+ <h2>
+ <s:text name="chorem.billy.quotation.addToProject">
+ <s:param><%= QuotationAction.getAction().getProjectName() %></s:param>
+ </s:text>
+ </h2>
+ <s:actionerror />
+ <s:url action="addQuotation" var="addQuotation">
+ <s:param name="projectId"><%= QuotationAction.getAction().getProjectId() %></s:param>
+ </s:url>
+ <form action="${addQuotation}" method="post">
+ <fieldset>
+ <legend>
+ <s:text name="chorem.billy.quotation" />
+ </legend>
+ <s:textfield key="chorem.billy.quotation.type" name="type" labelSeparator=": " />
+ <br />
+ <s:textfield key="chorem.billy.quotation.reference" name="reference" labelSeparator=": " />
+ <br />
+ <s:textarea key="chorem.billy.quotation.description" name="description" cols="50" rows="10" labelposition="top" labelSeparator=": " />
+ <br />
+ <s:textfield key="chorem.billy.quotation.amount" name="amount" labelSeparator=": " size="6" />
+ <br />
+ <s:textfield key="chorem.billy.quotation.vta" name="vta" labelSeparator=": " size="2" />%
+ <br />
+ <s:textfield key="chorem.billy.quotation.beginDate" name="beginDate" labelSeparator=": " size="7" value="%{dayDate}" />
+ <br />
+ <s:textfield key="chorem.billy.quotation.endDate" name="endDate" labelSeparator=": " size="7" value="%{dayDate}" />
+ <br />
+ <s:textfield key="chorem.billy.quotation.postedDate" name="postedDate" labelSeparator=": " size="7" value="%{dayDate}" />
+ <br />
+ <s:textfield key="chorem.billy.quotation.conversionHope" name="conversionHope" labelSeparator=": " />
+ <br />
+ <label for="supplierId" class="label"><s:text name="chorem.billy.quotation.supplier" />: </label>
+ <select name="supplierId" id="supplierId">
+ <%
+ List<EmployeeFull> employees = QuotationAction.getAction().getAllEmployees();
+
+ for (EmployeeFull employee : employees) {
+ %>
+ <option value="<%= employee.getEmployee().getWikittyId() %>"><%= employee.getCompany().getName() %> - <%= employee.getPerson().getLastName() %> <%= employee.getPerson().getFirstName() %> (<%= JspUtils.dateFormat(employee.getPerson().getBirthDate()) %>)</option>
+ <% } %>
+ </select>
+ <br />
+ <label for="customerId" class="label"><s:text name="chorem.billy.quotation.customer" />: </label>
+ <select name="customerId" id="customerId">
+ <%
+ for (EmployeeFull employee : employees) {
+ %>
+ <option value="<%= employee.getEmployee().getWikittyId() %>"><%= employee.getCompany().getName() %> - <%= employee.getPerson().getLastName() %> <%= employee.getPerson().getFirstName() %> (<%= JspUtils.dateFormat(employee.getPerson().getBirthDate()) %>)</option>
+ <% } %>
+ </select>
+ <br />
+ <br />
+ <s:submit key="chorem.billy.quotation.add" name="submit" />
+ </fieldset>
+ </form>
+ </body>
</html>
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/billy/quotationDetails.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/billy/quotationDetails.jsp 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/billy/quotationDetails.jsp 2011-11-06 17:01:34 UTC (rev 128)
@@ -7,25 +7,27 @@
<html xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
xmlns:jsp="http://java.sun.com/JSP/Page">
- <head>
- <title>
- <s:text name="chorem.billy.quotationDetails.title">
- <s:param><%= QuotationAction.getAction().getReference() %></s:param>
- </s:text>
- </title>
- <s:head />
- </head>
- <body>
- <h2>
- <s:text name="chorem.billy.quotation">
- <s:param><%= QuotationAction.getAction().getReference() %></s:param>
- </s:text>
- </h2>
- <s:url action="modifyQuotation" var="modifyQuotation">
- <s:param name="quotationId"><%= QuotationAction.getAction().getQuotationId() %></s:param>
- </s:url>
- <form action="${modifyQuotation}" method="post">
- <p>
+ <head>
+ <title>
+ <s:text name="chorem.billy.quotationDetails.title">
+ <s:param><%= QuotationAction.getAction().getReference() %></s:param>
+ </s:text>
+ </title>
+ <s:head />
+ </head>
+ <body>
+ <h2>
+ <s:text name="chorem.billy.quotation">
+ <s:param><%= QuotationAction.getAction().getReference() %></s:param>
+ </s:text>
+ </h2>
+ <s:url action="modifyQuotation" var="modifyQuotation">
+ <s:param name="quotationId"><%= QuotationAction.getAction().getQuotationId() %></s:param>
+ </s:url>
+ <form action="${modifyQuotation}" method="post">
+ <p>
+ <s:textfield name="type" key="chorem.billy.quotation.type" labelSeparator=": "/>
+ <br />
<s:textarea name="description" key="chorem.billy.quotation.description" cols="50" rows="10" labelposition="top" labelSeparator=": " />
<br />
<br />
@@ -33,59 +35,74 @@
<br />
<s:textfield name="vta" key="chorem.billy.quotation.vta" labelSeparator=": " size="2" />%
<br />
+ <s:textfield name="beginDate" key="chorem.billy.quotation.beginDate" labelSeparator=": " size="7" />
+ <br />
+ <s:textfield name="endDate" key="chorem.billy.quotation.endDate" labelSeparator=": " size="7" />
+ <br />
<s:textfield name="postedDate" key="chorem.billy.quotation.postedDate" labelSeparator=": " size="7" />
<br />
- <% EmployeeFull supplier = QuotationAction.getAction().getSupplier(); %>
+ <s:textfield name="conversionHope" key="chorem.billy.quotation.conversionHope" labelSeparator=": " size="2" />
+ <br />
+ <% EmployeeFull supplier = QuotationAction.getAction().getSupplier();
+ if (supplier != null) {
+ %>
<s:url namespace="/bonzoms" action="companyDetails" var="companyDetails">
<s:param name="companyId"><%= supplier.getCompany().getWikittyId() %></s:param>
</s:url>
<s:text name="chorem.billy.quotation.supplier" />: <a href="${companyDetails}"><%= supplier.getCompany().getName() %></a> - <%= supplier.getPerson().getLastName() %> <%= supplier.getPerson().getFirstName() %> (<%= JspUtils.dateFormat(supplier.getPerson().getBirthDate()) %>)
<br />
- <% EmployeeFull customer = QuotationAction.getAction().getCustomer(); %>
+ <%
+ }
+ EmployeeFull customer = QuotationAction.getAction().getCustomer();
+ if (customer != null) {
+ %>
<s:url namespace="/bonzoms" action="companyDetails" var="companyDetails">
- <s:param name="companyId"><%= supplier.getCompany().getWikittyId() %></s:param>
+ <s:param name="companyId"><%= customer.getCompany().getWikittyId() %></s:param>
</s:url>
<s:text name="chorem.billy.quotation.customer" />: <a href="${companyDetails}"><%= customer.getCompany().getName() %></a> - <%= customer.getPerson().getLastName() %> <%= customer.getPerson().getFirstName() %> (<%= JspUtils.dateFormat(customer.getPerson().getBirthDate()) %>)
<br />
+ <%
+ }
+ %>
<s:submit key="chorem.misc.modify" name="modify" />
- </p>
- </form>
- <p>
- <br />
- <br />
- <%
- ProjectOrder projectOrder = QuotationAction.getAction().getProjectOrder();
-
- if (projectOrder != null) {
- %>
- <s:text name="chorem.billy.quotation.projectOrder" />
- <br />
- <s:url namespace="/gepeto" action="projectOrderDetails" var="projectOrderDetails">
- <s:param name="projectOrderId"><%= projectOrder.getWikittyId() %></s:param>
- </s:url>
- <a href="${projectOrderDetails}">
- <s:text name="chorem.gepeto.projectDetails.projectOrder">
- <s:param>
- <%= JspUtils.dateFormat(projectOrder.getBeginDate()) %>
- </s:param>
- <s:param>
- <%= JspUtils.dateFormat(projectOrder.getEndDate()) %>
- </s:param>
- </s:text>
- </a>
- <br />
- <% } else { %>
- <s:url namespace="/gepeto" action="addProjectOrderInput" var="addProjectOrder">
- <s:param name="quotationId"><%= QuotationAction.getAction().getQuotationId() %></s:param>
- </s:url>
- <a href="${addProjectOrder}"><s:text name="chorem.billy.quotation.addProjectOrder" /></a>
- <br />
- <% } %>
- <br />
- <s:url namespace="/gepeto" action="projectDetails" var="projectDetails">
- <s:param name="projectId"><%= QuotationAction.getAction().getProjectId() %></s:param>
- </s:url>
- <a href="${projectDetails}"><s:text name="chorem.billy.quotation.backToProjectDetails" /></a>
- </p>
- </body>
+ </p>
+ </form>
+ <p>
+ <br />
+ <br />
+ <%
+ ProjectOrder projectOrder = QuotationAction.getAction().getProjectOrder();
+
+ if (projectOrder != null) {
+ %>
+ <s:text name="chorem.billy.quotation.projectOrder" />
+ <br />
+ <s:url namespace="/gepeto" action="projectOrderDetails" var="projectOrderDetails">
+ <s:param name="projectOrderId"><%= projectOrder.getWikittyId() %></s:param>
+ </s:url>
+ <a href="${projectOrderDetails}">
+ <s:text name="chorem.gepeto.projectDetails.projectOrder">
+ <s:param>
+ <%= JspUtils.dateFormat(projectOrder.getBeginDate()) %>
+ </s:param>
+ <s:param>
+ <%= JspUtils.dateFormat(projectOrder.getEndDate()) %>
+ </s:param>
+ </s:text>
+ </a>
+ <br />
+ <% } else { %>
+ <s:url namespace="/gepeto" action="addProjectOrderInput" var="addProjectOrder">
+ <s:param name="quotationId"><%= QuotationAction.getAction().getQuotationId() %></s:param>
+ </s:url>
+ <a href="${addProjectOrder}"><s:text name="chorem.billy.quotation.addProjectOrder" /></a>
+ <br />
+ <% } %>
+ <br />
+ <s:url namespace="/gepeto" action="projectDetails" var="projectDetails">
+ <s:param name="projectId"><%= QuotationAction.getAction().getProjectId() %></s:param>
+ </s:url>
+ <a href="${projectDetails}"><s:text name="chorem.billy.quotation.backToProjectDetails" /></a>
+ </p>
+ </body>
</html>
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companies.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companies.jsp 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/companies.jsp 2011-11-06 17:01:34 UTC (rev 128)
@@ -1,3 +1,4 @@
+<%@page import="org.apache.commons.lang.StringUtils"%>
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@page import="java.util.List" %>
<%@page import="org.chorem.entities.Company" %>
@@ -3,25 +4,49 @@
<%@page import="org.chorem.bonzoms.action.CompanyAction" %>
<%@taglib prefix="s" uri="/struts-tags" %>
+<%@taglib prefix="sj" uri="/struts-jquery-tags"%>
+<%@taglib prefix="sjg" uri="/struts-jquery-grid-tags"%>
<html xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
xmlns:jsp="http://java.sun.com/JSP/Page">
- <head>
- <title><s:text name="chorem.bonzoms.companies" /></title>
- <s:head />
- </head>
- <body>
- <h2><s:text name="chorem.bonzoms.companies" /></h2>
- <%
- List<Company> companies = CompanyAction.getAction().getAllCompanies();
-
- for (Company company : companies) {
- %>
- <s:url namespace="/bonzoms" action="companyDetails" var="companyDetails">
- <s:param name="companyId"><%= company.getWikittyId() %></s:param>
- </s:url>
- <a href="${companyDetails}"><%= company.getName() %></a><br />
- <%
- }
- %>
- </body>
+ <head>
+ <title><s:text name="chorem.bonzoms.companies" /></title>
+ </head>
+ <body>
+ <h2><s:text name="chorem.bonzoms.companies" /></h2>
+
+ <s:url id="companyDetails" namespace="/bonzoms" action="companyDetails"/>
+ <script type="text/javascript">
+ function formatCompanyNameLink(cellvalue, options, rowObject) {
+ return "<a href='<s:property value="companyDetails"/>?companyId="+rowObject.wikittyId+"'>" + cellvalue + "</a>";
+ }
+ </script>
+
+ <s:form>
+ <s:textfield name="searchString"></s:textfield>
+ <s:submit></s:submit>
+ </s:form>
+
+ <s:url id="remoteurl" namespace="/" action="EntitySearchJson" escapeAmp="false">
+ <s:param name="searchString"><%=StringUtils.defaultString(request.getParameter("searchString"))%></s:param>
+ <s:param name="wikittyExtension">org.chorem.entities.Company</s:param>
+ </s:url>
+
+ <sjg:grid
+ id="gridtable"
+ dataType="json"
+ href="%{remoteurl}"
+ pager="true"
+ gridModel="gridModel"
+ rowList="10,20,50,100"
+ rowNum="20"
+ rownumbers="false"
+ autowidth="true"
+ sortname="name"
+ sortorder="asc">
+
+ <sjg:gridColumn name="name" title="Nom" formatter="formatCompanyNameLink"/>
+ <sjg:gridColumn name="type" title="Type"/>
+ </sjg:grid>
+
+ </body>
</html>
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/menu.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/menu.jsp 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/menu.jsp 2011-11-06 17:01:34 UTC (rev 128)
@@ -2,9 +2,9 @@
<div id="menu">
<ul>
- <li><s:a action="addCompanyInput"><s:text name="chorem.bonzoms.company.add" /></s:a></li>
- <li><s:a action="addPersonInput"><s:text name="chorem.bonzoms.person.add" /></s:a></li>
- <li><s:a action="companies"><s:text name="chorem.bonzoms.company.list" /></s:a></li>
- <li><s:a action="persons"><s:text name="chorem.bonzoms.person.list" /></s:a></li>
+ <li><s:a action="companies"><s:text name="chorem.bonzoms.company.list" /></s:a></li>
+ <li><s:a action="persons"><s:text name="chorem.bonzoms.person.list" /></s:a></li>
+ <li><s:a action="addCompanyInput"><s:text name="chorem.bonzoms.company.add" /></s:a></li>
+ <li><s:a action="addPersonInput"><s:text name="chorem.bonzoms.person.add" /></s:a></li>
</ul>
</div>
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/persons.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/persons.jsp 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/bonzoms/persons.jsp 2011-11-06 17:01:34 UTC (rev 128)
@@ -1,3 +1,4 @@
+<%@page import="org.apache.commons.lang.StringUtils"%>
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@page import="java.util.List" %>
<%@page import="org.chorem.entities.Person" %>
@@ -3,25 +4,94 @@
<%@page import="org.chorem.bonzoms.action.PersonAction" %>
<%@taglib prefix="s" uri="/struts-tags" %>
+<%@taglib prefix="sj" uri="/struts-jquery-tags"%>
+<%@taglib prefix="sjg" uri="/struts-jquery-grid-tags"%>
<html xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
xmlns:jsp="http://java.sun.com/JSP/Page">
- <head>
- <title><s:text name="chorem.bonzoms.persons" /></title>
- <s:head />
- </head>
- <body>
- <h2><s:text name="chorem.bonzoms.persons" /></h2>
- <%
- List<Person> persons = PersonAction.getAction().getAllPersons();
-
- for (Person person : persons) {
- %>
- <s:url namespace="/bonzoms" action="personDetails" var="personDetails">
- <s:param name="personId"><%= person.getWikittyId() %></s:param>
- </s:url>
- <a href="${personDetails}"><%= person.getFirstName() %> <%= person.getLastName() %></a><br />
- <%
- }
- %>
- </body>
+ <head>
+ <title><s:text name="chorem.bonzoms.persons" /></title>
+ </head>
+ <body>
+ <h2><s:text name="chorem.bonzoms.persons" /></h2>
+
+ <s:url id="remoteurlFulltextSearch" namespace="/" action="EntitySearchJson" escapeAmp="false">
+ <s:param name="wikittyExtension">org.chorem.entities.Person</s:param>
+ </s:url>
+
+ <s:url id="remoteurl" namespace="/" action="EntitySearchJson" escapeAmp="false">
+ <s:param name="fulltextSearch"><%=StringUtils.defaultString(request.getParameter("fulltextSearch"))%></s:param>
+ <s:param name="wikittyExtension">org.chorem.entities.Person</s:param>
+ </s:url>
+
+ <s:url id="personDetails" namespace="/bonzoms" action="personDetails"/>
+
+ <script type="text/javascript">
+ function formatPersonNameLink(cellvalue, options, rowObject) {
+ return "<a href='<s:property value="personDetails"/>?personId="+rowObject.wikittyId+"'>" + cellvalue + "</a>";
+ }
+
+ var timeoutHnd;
+ function doSearch() {
+ if(timeoutHnd) {
+ clearTimeout(timeoutHnd)
+ }
+ timeoutHnd = setTimeout(gridReload, 500)
+ }
+
+ function gridReload() {
+ var filter = jQuery("#fulltextSearch").val();
+ var gridUrl = "<s:property value="remoteurlFulltextSearch" escapeHtml="false"/>&fulltextSearch="+filter;
+ jQuery("#gridtable").jqGrid('setGridParam',{url:gridUrl,page:1}).trigger("reloadGrid");
+ }
+ </script>
+
+ <s:form>
+ <s:textfield id="fulltextSearch" name="fulltextSearch" onkeydown="doSearch()"></s:textfield>
+ <s:submit></s:submit>
+ </s:form>
+
+ <s:url id="editurl" namespace="/" action="EntitySearchJson" escapeAmp="false">
+ </s:url>
+
+ <sjg:grid
+ id="gridtable"
+ dataType="json"
+ href="%{remoteurl}"
+ gridModel="gridModel"
+ rowList="10,20,50,100"
+ rowNum="20"
+ rownumbers="true"
+ autowidth="true"
+ sortname="Person.lastName"
+ sortorder="asc"
+ pager="true"
+ viewrecords="true"
+
+ filter="true"
+ multiselect="true"
+
+ footerrow="true"
+ userDataOnFooter="{'Person.lastName':'titi', firsName:'Toto'}"
+
+ editurl="%{editurl}"
+ editinline="false"
+
+ navigator="true"
+ navigatorAdd="true"
+ navigatorEdit="true"
+ navigatorDelete="true"
+ navigatorView="true"
+ navigatorSearch="true"
+ navigatorAddOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorEditOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorDeleteOptions="{height:280,reloadAfterSubmit:true}"
+ navigatorSearchOptions="{multipleSearch:true,sopt:['eq','ne','cn','nc','bw','bn','ew','en','lt','le','gt','ge','nu','nn','in','ni']}"
+ >
+
+ <sjg:gridColumn name="wikittyId" hidden="true" key="true" title="id"/>
+ <sjg:gridColumn href="%{personDetails}" name="lastName" index="Person.lastName" title="Nom" editable="true" formatter="formatPersonNameLink"/>
+ <sjg:gridColumn name="firstName" index="Person.firstName" title="Prénom" editable="true"/>
+ </sjg:grid>
+
+ </body>
</html>
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/common/inc/header.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/common/inc/header.jsp 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/common/inc/header.jsp 2011-11-06 17:01:34 UTC (rev 128)
@@ -4,5 +4,5 @@
<div id="header"
xmlns:s="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
xmlns:jsp="http://java.sun.com/JSP/Page">
- <s:a namespace="/bonzoms" action="home">Bonzoms</s:a> - <s:a namespace="/cash" action="home">Ca$h</s:a> - <s:a namespace="/billy" action="home">billy</s:a> - <s:a namespace="/gepeto" action="home">gepeto</s:a>
+ <s:a namespace="/" action="home">Home</s:a> - <s:a namespace="/bonzoms" action="home">Bonzoms</s:a> - <s:a namespace="/cash" action="home">Ca$h</s:a> - <s:a namespace="/billy" action="home">billy</s:a> - <s:a namespace="/gepeto" action="home">gepeto</s:a>
</div>
\ No newline at end of file
Modified: trunk/chorem-web/src/main/webapp/WEB-INF/jsp/gepeto/projectsByYear.jsp
===================================================================
--- trunk/chorem-web/src/main/webapp/WEB-INF/jsp/gepeto/projectsByYear.jsp 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/chorem-web/src/main/webapp/WEB-INF/jsp/gepeto/projectsByYear.jsp 2011-11-06 17:01:34 UTC (rev 128)
@@ -81,6 +81,7 @@
List<Project> projects = ProjectAction.getAction().getProjectsWithoutProjectOrderByYear();
for (Project project : projects) {
+ if (project != null) {
%>
<tr>
<s:url action="projectDetails" var="projectDetails">
@@ -88,7 +89,10 @@
</s:url>
<td><a href="${projectDetails}"><%= project.getName() %></a></td>
</tr>
- <% } %>
+ <%
+ }
+ }
+ %>
</tbody>
</table>
<br />
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2011-10-28 21:26:42 UTC (rev 127)
+++ trunk/pom.xml 2011-11-06 17:01:34 UTC (rev 128)
@@ -57,11 +57,13 @@
<projectId>chorem</projectId>
<eugenePluginVersion>2.3.2</eugenePluginVersion>
- <nuitonUtilsVersion>2.2-SNAPSHOT</nuitonUtilsVersion>
+ <nuitonUtilsVersion>2.3</nuitonUtilsVersion>
+ <nuitonWebVersion>1.3</nuitonWebVersion>
<nuitonI18nVersion>2.3.1</nuitonI18nVersion>
- <wikittyVersion>3.0.5</wikittyVersion>
+ <wikittyVersion>3.3-SNAPSHOT</wikittyVersion>
<slf4jVersion>1.6.1</slf4jVersion>
- <struts2Version>2.2.1.1</struts2Version>
+ <struts2Version>2.2.3</struts2Version>
+ <struts2jqueryVersion>3.1.0</struts2jqueryVersion>
<xWorkCoreVersion>2.1.6</xWorkCoreVersion>
<javaxMailVersion>1.4.3</javaxMailVersion>
<servletApiVersion>2.5</servletApiVersion>
@@ -88,6 +90,12 @@
</dependency>
<dependency>
+ <groupId>org.nuiton.web</groupId>
+ <artifactId>nuiton-struts2</artifactId>
+ <version>${nuitonWebVersion}</version>
+ </dependency>
+
+ <dependency>
<groupId>org.nuiton.i18n</groupId>
<artifactId>nuiton-i18n</artifactId>
<version>${nuitonI18nVersion}</version>
@@ -105,7 +113,25 @@
<version>${struts2Version}</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.struts</groupId>
+ <artifactId>struts2-json-plugin</artifactId>
+ <version>${struts2Version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.jgeppert.struts2.jquery</groupId>
+ <artifactId>struts2-jquery-plugin</artifactId>
+ <version>${struts2jqueryVersion}</version>
+ </dependency>
+
<dependency>
+ <groupId>com.jgeppert.struts2.jquery</groupId>
+ <artifactId>struts2-jquery-grid-plugin</artifactId>
+ <version>${struts2jqueryVersion}</version>
+ </dependency>
+
+ <dependency>
<groupId>com.opensymphony</groupId>
<artifactId>xwork-core</artifactId>
<version>${xWorkCoreVersion}</version>
@@ -131,14 +157,14 @@
<dependency>
<groupId>org.nuiton.wikitty</groupId>
- <artifactId>wikitty-jdbc-impl</artifactId>
+ <artifactId>wikitty-jdbc</artifactId>
<version>${wikittyVersion}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.nuiton.wikitty</groupId>
- <artifactId>wikitty-solr-impl</artifactId>
+ <artifactId>wikitty-solr</artifactId>
<version>${wikittyVersion}</version>
</dependency>
Added: trunk/src/site/chorem-cdc.txt
===================================================================
--- trunk/src/site/chorem-cdc.txt (rev 0)
+++ trunk/src/site/chorem-cdc.txt 2011-11-06 17:01:34 UTC (rev 128)
@@ -0,0 +1,105 @@
+====== Chorem ======
+
+Chorem est composé de plusieurs modules
+ * gestion de contacts
+ * gestion de resources
+ * gestion des emprunts (livres, switch, machine, ...)
+ * gestion des demandes d'achat
+ * gestion de rendez-vous
+ * gestion commercial
+ * gestion de congés
+ * gestion de projet
+ * suivie d'intervention client
+ * ...
+
+====== Besoin Intranet ======
+
+ - Gestion des salariés :
+ * données administratives (wiki)
+ * CV (OOo include wiki)
+ * congés/absences (interface spe mais wiki + dev envoie de mail)
+ * bilan RTT / CP (interface spe mais wiki)
+ * photo (wiki)
+ - Gestion des missions (salarié/indépendant)
+ * saisie du compte rendu d'activité mensuel (CRA) (wiki)
+ * ordres de mission (wiki)
+ * notes de frais (interface spe mais wiki)
+ * synthèse mensuelle sur mission (wiki)
+ * suivis de mission avec client (wiki)
+ - Espace commun
+ * abonnement mailing list (wiki)
+ * messagerie instantanée / blog / forum (wiki)
+ * trombinoscope (wiki)
+ * liens (PEE, Comité Ese...) (wiki)
+ * base documentaire (wiki)
+ * boîte à idées (wiki)
+ - Espace privé
+ * administration du site
+ * prospection commerciale (appli spe + interaction wiki)
+
+===== Gestion de contacts =====
+
+La gestion de contacts permet de créer des informations pour des sociétés ou pour des personnes physiques. Les personnes faisant partie d'une ou de plusieurs sociétés.
+
+Elle doit permettre de renseigner les informations les plus commune: adresse, téléphone, mail, context de la 1ère rencontre.
+
+Pour les sociétés un outil de graph sera utilisé pour la saisie de la hiérarchie des personnes constituant la société.
+
+Les personnes pourront aussi avoir un coût horaire.
+
+===== Gestion de ressources =====
+
+La gestion de ressources doit permettre de faire l'inventaire de tout ce qui est dans la société: ordinateur, libre, salle, voiture, vidéo-projecteur, ...
+
+Chaque ressource peut avoir un coût d'achat ou d'entretien.
+
+Elle doit aussi permettre à des contacts de faire des réservation de ces resources pour une date et une durée donner, ou faire un emprunt d'une ressource.
+
+===== Gestion des emprunts =====
+
+La gestion des emprunts est peut-être à fusioner avec la gestion des ressources.
+
+Il doit permettre d'indiquer qui à emprunté un livre, à partir de quelle date, à quelle date il pense le rendre, et à quelle date le livre à réellement été rendu.
+
+===== Gestion des demandes d'achat =====
+
+Ce module doit permettre au personne de demander l'achat de matériel, de livre, de ressource.
+
+Une personne fait la demande, avec une explication de la motivation de l'achat et la date limite pour laquelle il doit disposer de ce qu'il a demandé, il indique si possible le coût, et le lieu ou l'achat peut-être fait.
+
+D'autre personne peuvent voté contre ou pour en argumentant.
+
+===== Gestion de rendez-vous =====
+
+La gestion de rendez-vous doit permettre de prendre des rendez-vous pour privé ou public. Un rendez-vous peut mettre en jeu un ou plusieurs contact et une ou plusieurs resources. Les personnes doivent être notifié du rendez-vous dès sa création, ils ont moyen de le refuser ou de l'accepter. Une fois un rendez-vous accepté la personne recevra un mail ou l'application chorem l'avertira du rendez-vous quelque temps avant celui-ci.
+
+===== Gestion commercial =====
+
+La gestion commercial doit permettre le suivi client et propect. Avec un historique de tout ce qui à été fait et dit avec ce client au niveau commercial.
+
+===== Gestion de congés =====
+
+La gestion de congés doit permettre à chaque personne de poser des congés, qui seront validé par un supérieur.
+
+===== Gestion de projet =====
+
+La gestion de projet doit permettre toute la gestion du cycle de vie du projet:
+ * Cahier des charges
+ * développement
+ * test
+ * bug report
+
+Un projet aura un temps estimé et un prix de vente.
+
+Le projet sera divisé en tâches qui auront chacune une durée estimée, une date de début ou une contraite de début (après tel autre tâche ou avant tel autre tâche) et des personnes affectées à la tâche.
+
+Une fois fini chaque tâche devra se voir affecté une durée réelle de travaille pour chaque personne qui ayant participé à la tâche.
+
+Il sera alors possible pour chaque projet de voir la différence entre le temps estimé au départ et le temps réel passé, de calculer le coût de revient, de faire un graph de Gantt pour les tâches.
+
+===== Gestion de facturation =====
+
+La gestion de facturation utilise les informations sur les projets pour permettre l'édition automatique des factures lorsqu'un lot est terminé. Il doit aussi permettre de suivre l'avancement du paiement:
+ * date d'expédition de la facture
+ * rappelle automatique des factures non encore payé
+ * génération de lettre de relance
Added: trunk/src/site/requisite.txt
===================================================================
--- trunk/src/site/requisite.txt (rev 0)
+++ trunk/src/site/requisite.txt 2011-11-06 17:01:34 UTC (rev 128)
@@ -0,0 +1,5 @@
+Contact
+=======
+Avoir un champs langue sur le contact, qui permet d'indiquer la langue
+préférée de communication avec ce client. Ceci permettra d'éditer les
+documents dans la langue du client pour lui envoyer (facture, ....)
1
0
Author: maven-release
Date: 2011-10-28 23:26:42 +0200 (Fri, 28 Oct 2011)
New Revision: 127
Url: http://chorem.org/repositories/revision/chorem/127
Log:
Update mavenpom4redmine to 3.0.5.
Modified:
trunk/pom.xml
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2011-09-22 17:31:34 UTC (rev 126)
+++ trunk/pom.xml 2011-10-28 21:26:42 UTC (rev 127)
@@ -10,7 +10,7 @@
<parent>
<groupId>org.nuiton</groupId>
<artifactId>mavenpom4redmine</artifactId>
- <version>3.0.4</version>
+ <version>3.0.5</version>
</parent>
<groupId>org.chorem</groupId>
1
0