r52 - in trunk: . vradi-web vradi-web/src/main/java/org/chorem/vradi/actions vradi-web/src/main/resources vradi-web/src/main/webapp/WEB-INF/jsp
Author: bpoussin Date: 2011-05-26 11:46:08 +0200 (Thu, 26 May 2011) New Revision: 52 Url: http://chorem.org/repositories/revision/vradi/52 Log: - add jquery plugin (better than dojo) - add rst action (generate from rst and set field if necessary) - add AbstractEditAction used for EditAction and RSTAction to filter acceptable wikitty field Added: trunk/vradi-web/src/main/java/org/chorem/vradi/actions/AbstractEditAction.java trunk/vradi-web/src/main/java/org/chorem/vradi/actions/RSTAction.java Modified: trunk/pom.xml trunk/vradi-web/pom.xml trunk/vradi-web/src/main/java/org/chorem/vradi/actions/EditAction.java trunk/vradi-web/src/main/java/org/chorem/vradi/actions/FormNoteAction.java trunk/vradi-web/src/main/resources/struts.properties trunk/vradi-web/src/main/webapp/WEB-INF/jsp/formNote.jsp Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2011-05-25 16:58:41 UTC (rev 51) +++ trunk/pom.xml 2011-05-26 09:46:08 UTC (rev 52) @@ -120,6 +120,7 @@ <javamailVersion>1.4.3</javamailVersion> <slf4jVersion>1.6.1</slf4jVersion> <struts2Version>2.2.3</struts2Version> + <struts2jqueryVersion>3.0.1</struts2jqueryVersion> <servletApiVersion>2.5</servletApiVersion> <jspApiVersion>2.0</jspApiVersion> @@ -421,6 +422,32 @@ </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.jgeppert.struts2.jquery</groupId> + <artifactId>struts2-jquery-richtext-plugin</artifactId> + <version>${struts2jqueryVersion}</version> + </dependency> + <dependency> + <groupId>com.jgeppert.struts2.jquery</groupId> + <artifactId>struts2-jquery-tree-plugin</artifactId> + <version>${struts2jqueryVersion}</version> + </dependency> + <dependency> + <groupId>com.jgeppert.struts2.jquery</groupId> + <artifactId>struts2-jquery-mobile-plugin</artifactId> + <version>${struts2jqueryVersion}</version> + </dependency> + + <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-dojo-plugin</artifactId> <version>${struts2Version}</version> Modified: trunk/vradi-web/pom.xml =================================================================== --- trunk/vradi-web/pom.xml 2011-05-25 16:58:41 UTC (rev 51) +++ trunk/vradi-web/pom.xml 2011-05-26 09:46:08 UTC (rev 52) @@ -86,6 +86,27 @@ </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>com.jgeppert.struts2.jquery</groupId> + <artifactId>struts2-jquery-richtext-plugin</artifactId> + </dependency> + <dependency> + <groupId>com.jgeppert.struts2.jquery</groupId> + <artifactId>struts2-jquery-tree-plugin</artifactId> + </dependency> + <dependency> + <groupId>com.jgeppert.struts2.jquery</groupId> + <artifactId>struts2-jquery-mobile-plugin</artifactId> + </dependency> + + <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-dojo-plugin</artifactId> <scope>runtime</scope> Added: trunk/vradi-web/src/main/java/org/chorem/vradi/actions/AbstractEditAction.java =================================================================== --- trunk/vradi-web/src/main/java/org/chorem/vradi/actions/AbstractEditAction.java (rev 0) +++ trunk/vradi-web/src/main/java/org/chorem/vradi/actions/AbstractEditAction.java 2011-05-26 09:46:08 UTC (rev 52) @@ -0,0 +1,99 @@ +package org.chorem.vradi.actions; + +import java.util.Arrays; +import java.util.List; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * Looking for if fqfield match excludes and includes pattern list. + * <p> + * action param: + * <li>excludes: comma separated list of pattern + * <li>includes: comma separated list of pattern + * + * <p> + * sub classes can use isAcceptable(String) to know if field is accepted or not + * + * Exclude property expressions take precedence over includes property + * expressions. That is, if you use includes and excludes property expressions + * on the same result, includes property expressions will not be applied if an + * excludes excludes property expression matches a property first. + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public abstract class AbstractEditAction extends VradiBaseAction { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(AbstractEditAction.class); + + protected List<String> excludes; + protected List<String> includes; + + /** + * + * @param includes comma seperated list of pattern + */ + public void setExcludes(String excludeString) { + // remove all blank and newline + excludeString = excludeString.replaceAll("\\s", ""); + String[] excludeTab = excludeString.split(","); + this.excludes = Arrays.asList(excludeTab); + } + + /** + * + * @param includes comma seperated list of pattern + */ + public void setIncludes(String includeString) { + // remove all blank and newline + includeString = includeString.replaceAll("\\s", ""); + String[] includeTab = includeString.split(","); + this.includes = Arrays.asList(includeTab); + } + + protected boolean isAcceptable(String fqfield) { + Boolean result = null; + if (CollectionUtils.isEmpty(includes) && CollectionUtils.isEmpty(excludes)) { + // si pas de precission, on accepte tout + result = Boolean.TRUE; + } else { + // les excludes sont prioritaires + if (!CollectionUtils.isEmpty(excludes)) { + for (String ex : excludes) { + if (fqfield.matches(ex)) { + result = Boolean.FALSE; + break; + } + } + } + if (result == null) { + if (!CollectionUtils.isEmpty(includes)) { + // si pas dans les excludes, on regarde dans les includes + // vu qu'on a des includes, par defaut si on ne trouve pas + // d'includes qui match le fqfield, on retourne false + result = Boolean.FALSE; + for (String in : includes) { + if (fqfield.matches(in)) { + result = Boolean.TRUE; + break; + } + } + } else { + // pas de includes, donc tout est vrai + result = Boolean.TRUE; + } + } + } + log.debug(String.format( + "Accept field '%s' is %s with excludes: %s and includes: %s", + fqfield, result, excludes, includes)); + return result; + } + +} Modified: trunk/vradi-web/src/main/java/org/chorem/vradi/actions/EditAction.java =================================================================== --- trunk/vradi-web/src/main/java/org/chorem/vradi/actions/EditAction.java 2011-05-25 16:58:41 UTC (rev 51) +++ trunk/vradi-web/src/main/java/org/chorem/vradi/actions/EditAction.java 2011-05-26 09:46:08 UTC (rev 52) @@ -1,7 +1,6 @@ package org.chorem.vradi.actions; import com.opensymphony.xwork2.ActionContext; -import javax.servlet.ServletRequest; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; @@ -19,7 +18,7 @@ * Last update: $Date$ * by : $Author$ */ -public class EditAction extends VradiBaseAction implements ServletRequestAware { +public class EditAction extends AbstractEditAction implements ServletRequestAware { /** to use log facility, just put in your code: log.info(\"...\"); */ static private Log log = LogFactory.getLog(EditAction.class); @@ -29,19 +28,10 @@ } /** restraint les modifications possibles sur certaine extension */ - protected String restrictedExtension; protected HttpServletRequest request; protected String id; protected Wikitty wikitty; - public String getRestrictedExtension() { - return restrictedExtension; - } - - public void setRestrictedExtension(String restrictedExtension) { - this.restrictedExtension = restrictedExtension; - } - @Override public void setServletRequest(HttpServletRequest request) { this.request = request; @@ -59,21 +49,6 @@ return wikitty; } - protected boolean isAcceptableExtension(String fqfield) { - boolean result = false; - if (StringUtils.isBlank(restrictedExtension)) { - result = true; - } else { - try { - String extName = WikittyExtension.extractExtensionName(fqfield); - result = restrictedExtension.contains(extName); - } catch(Exception eee) { - log.debug("Not acceptable extension format", eee); - } - } - return result; - } - @Override public String execute() throws Exception { String result = SUCCESS; @@ -84,7 +59,7 @@ for (Object key : request.getParameterMap().keySet()) { String k = String.valueOf(key); log.debug(String.format("Look for field(%s)", k)); - if (wikitty.hasField(k) && isAcceptableExtension(k)) { + if (wikitty.hasField(k) && isAcceptable(k)) { Object v = request.getParameter(k); log.debug(String.format("Put value(%s) in field(%s)", v, k)); wikitty.setFqField(k, v); Modified: trunk/vradi-web/src/main/java/org/chorem/vradi/actions/FormNoteAction.java =================================================================== --- trunk/vradi-web/src/main/java/org/chorem/vradi/actions/FormNoteAction.java 2011-05-25 16:58:41 UTC (rev 51) +++ trunk/vradi-web/src/main/java/org/chorem/vradi/actions/FormNoteAction.java 2011-05-26 09:46:08 UTC (rev 52) @@ -114,13 +114,13 @@ // Render JRST in HTML try { - summary = JRST.generate(JRST.TYPE_HTML, formNote.getSummary()); + summary = JRST.generate(JRST.TYPE_HTML_INNER_BODY, formNote.getSummary()); } catch(Exception eee) { log.info("Can't generate HTML from RST", eee); summary = formNote.getSummary(); } try { - content = JRST.generate(JRST.TYPE_HTML, formNote.getContent()); + content = JRST.generate(JRST.TYPE_HTML_INNER_BODY, formNote.getContent()); } catch(Exception eee) { log.info("Can't generate HTML from RST", eee); content = formNote.getContent(); Added: trunk/vradi-web/src/main/java/org/chorem/vradi/actions/RSTAction.java =================================================================== --- trunk/vradi-web/src/main/java/org/chorem/vradi/actions/RSTAction.java (rev 0) +++ trunk/vradi-web/src/main/java/org/chorem/vradi/actions/RSTAction.java 2011-05-26 09:46:08 UTC (rev 52) @@ -0,0 +1,122 @@ +package org.chorem.vradi.actions; + +import java.io.InputStream; +import java.io.StringBufferInputStream; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.jrst.JRST; +import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.entities.Wikitty; +import org.nuiton.wikitty.entities.WikittyExtension; + +/** + * Convert rst string in other format. Default format is + * {@link JRST#TYPE_HTML_INNER_BODY} + * <p> + * algo: + * <li> if {@link #id} and {@link #field} is present and {@link #rst} is present + * this field is set with rst value. + * <li> rst is set with field value (if field is present) + * <li> rst is converted in rstResultType and result is put in rstResult + * + * @author poussin + * @version $Revision$ + * + * Last update: $Date$ + * by : $Author$ + */ +public class RSTAction extends AbstractEditAction { + + /** to use log facility, just put in your code: log.info(\"...\"); */ + static private Log log = LogFactory.getLog(RSTAction.class); + + /** optional: wikitty id */ + protected String id; + /** optional: fq wikitty field */ + protected String field; + /** optionnal rst string */ + protected String rst; + /** result stream */ + protected InputStream rstResult; + /** rstResultType */ + protected String rstResultType = JRST.TYPE_HTML_INNER_BODY; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getField() { + return field; + } + + public void setField(String field) { + this.field = field; + } + + public String getRst() { + return rst; + } + + public void setRst(String rst) { + this.rst = rst; + } + + public String getRstResultType() { + return rstResultType; + } + + public void setRstResultType(String rstResultType) { + this.rstResultType = rstResultType; + } + + public InputStream getRstResult() { + return rstResult; + } + + public String getMimeType() { + String result = JRST.getMimeType(getRstResultType()); + return result; + } + + @Override + public String execute() throws Exception { + // si on arrive pas a lire l'objet ou le champs on renvoie ca + try { + if (isAcceptable(field)) { + WikittyProxy proxy = getProxy(); + Wikitty w = proxy.restore(getId()); + String ext = WikittyExtension.extractExtensionName(field); + String fieldName = WikittyExtension.extractFieldName(field); + + if (rst != null) { + // rst est renseigne, on commence par mettre a jour le champs + w.setField(ext, fieldName, rst); + proxy.store(w); + } + // on recupere la valeur du champs + rst = w.getFieldAsString(ext, fieldName); + + // si on arrive pas a faire la generation a partir du champs + // on renvoi le champs en brut + rst = JRST.generate(rstResultType, rst); + } else { + rst = "<pre>Not acceptable field</pre>"; + } + } catch(Exception eee) { + log.info("Can't generate HTML from RST", eee); + // on a pas reussi a genere le HTML, le texte doit donc etre mis + // dans un element <pre> pour une meilleur presentation + if (rst == null) { + rst = "Can't be generate"; + } + rst = "<pre>" + rst + "</pre>"; + } + rstResult = new StringBufferInputStream(rst); + return SUCCESS; + } + +} Modified: trunk/vradi-web/src/main/resources/struts.properties =================================================================== --- trunk/vradi-web/src/main/resources/struts.properties 2011-05-25 16:58:41 UTC (rev 51) +++ trunk/vradi-web/src/main/resources/struts.properties 2011-05-26 09:46:08 UTC (rev 52) @@ -24,7 +24,7 @@ struts.i18n.reload=true -struts.ui.theme=xhtml +struts.ui.theme=css_xhtml struts.ui.templateDir=template #sets the default template type. Either ftl, vm, or jsp struts.ui.templateSuffix=ftl Modified: trunk/vradi-web/src/main/webapp/WEB-INF/jsp/formNote.jsp =================================================================== --- trunk/vradi-web/src/main/webapp/WEB-INF/jsp/formNote.jsp 2011-05-25 16:58:41 UTC (rev 51) +++ trunk/vradi-web/src/main/webapp/WEB-INF/jsp/formNote.jsp 2011-05-26 09:46:08 UTC (rev 52) @@ -8,18 +8,24 @@ <%@page import="org.chorem.vradi.entities.Attachment"%> <%@page import="org.chorem.vradi.entities.FormNote"%> <%@page import="org.chorem.vradi.actions.FormNoteAction"%> + <%@page contentType="text/html" pageEncoding="UTF-8"%> + <%@taglib prefix="s" uri="/struts-tags"%> -<%@taglib prefix="sx" uri="/struts-dojo-tags"%> +<%@taglib prefix="sj" uri="/struts-jquery-tags"%> <% FormNoteAction action = FormNoteAction.getAction(); FormNote formNote = action.getFormNote(); ActionContext.getContext().put("localNoteId", formNote.getWikittyId()); +ActionContext.getContext().put("localFieldSeekingPartner", FormNote.FQ_FIELD_FORMNOTE_SEEKINGPARTNER); ActionContext.getContext().put("localFieldSummary", FormNote.FQ_FIELD_FORMNOTE_SUMMARY); ActionContext.getContext().put("localFieldContent", FormNote.FQ_FIELD_FORMNOTE_CONTENT); ActionContext.getContext().put("localNote", formNote); +ActionContext.getContext().put("localSeekingPartner", formNote.getSeekingPartner()); +ActionContext.getContext().put("localSummary", formNote.getSummary()); +ActionContext.getContext().put("localContent", formNote.getContent()); %> <!DOCTYPE html> @@ -27,7 +33,8 @@ <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title><s:text name="vradi.formNote.title" /></title> - <sx:head /> + <s:head/> + <sj:head jquerytheme="sunny"/> </head> <body> <h1><s:text name="vradi.formNote.title" /></h1> @@ -46,37 +53,55 @@ <div> <s:select size="5" list="partners" listKey="wikittyId" listValue="login"/> <s:a action="seekPartners/%{localNoteId}"><s:text name="vradi.formNote.seekPartners" /></s:a> - <s:checkbox label="seeking partners" name="formNote.seekingPartners" - onchange="var xhr=new XMLHttpRequest(); xhr.open('GET', 'edit/%{localNoteId}.action?seekingPartners='+this.checked, true);xhr.send(null);"/> + <s:checkbox label="seeking partners" name="formNote.seekingPartners" value="%{localSeekingPartner}" + onchange="var url='/ajax/edit/%{localNoteId}.action?%{localFieldSeekingPartner}='+this.checked; var xhr=new XMLHttpRequest(); xhr.open('GET', url, true);xhr.send(null); alert(url);"/> </div> <div> - <sx:tabbedpanel id="tabContainer"> - <sx:div label="Summary" > - <iframe> + <sj:tabbedpanel id="tabContainerSummary" animate="true" + collapsible="true" useSelectedTabCookie="true"> + <sj:tab id="tabHtmlSummary" target="htmlSummary" label="Summary"/> + <sj:tab id="tabHtmlSummaryEdit" target="htmlSummaryEdit" label="Edit"/> + <div id="htmlSummary"> <%=action.getSummary()%> - </iframe> - </sx:div> - <sx:div label="Edit" > - <s:textarea><%=formNote.getSummary()%></s:textarea> - </sx:div> - </sx:tabbedpanel> - <div> - <s:a action="editText?id=%{localNoteId}&field=%{localFieldSummary}"> - <s:text name="vradi.text.edit"/> - </s:a> - </div> + </div> + <div id="htmlSummaryEdit"> + <s:form id="htmlSummaryEditForm" action="/ajax/rst.action"> + <s:hidden name="id" value="%{localNoteId}"/> + <s:hidden name="field" value="%{localFieldSummary}"/> + <s:textarea name="rst" value="%{localSummary}"/> + </s:form> + <sj:a id="htmlSummaryEditSubmit" formIds="htmlSummaryEditForm" + targets="htmlSummary" indicator="indicator" + button="true" buttonIcon="ui-icon-gear"> + <s:text name="vradi.edit.save"/> + </sj:a> + <img id="indicator" src="images/indicator.gif" alt="Loading..." style="display:none"/> + </div> + </sj:tabbedpanel> </div> <div> - <iframe> - <%=action.getContent()%> - </iframe> - <div> - <s:a action="editText?id=%{localNoteId}&field=%{localFieldContent}"> - <s:text name="vradi.text.edit"/> - </s:a> - </div> + <sj:tabbedpanel id="tabContainerContent" animate="true" + collapsible="true" useSelectedTabCookie="true"> + <sj:tab id="tabHtmlContent" target="htmlContent" label="Summary"/> + <sj:tab id="tabHtmlContentEdit" target="htmlContentEdit" label="Edit"/> + <div id="htmlContent" > + <%=action.getContent()%> + </div> + <div id="htmlContentEdit" > + <s:form id="htmlContentEditForm" action="/ajax/edit.action"> + <s:hidden name="id" value="%{localNoteId}"/> + <s:hidden name="field" value="%{localFieldSummary}"/> + <s:textarea name="content" value="%{localContent}"/> + </s:form> + <sj:a id="htmlContentEditSubmit" formIds="htmlContentEditForm" + targets="htmlContent" indicator="indicator" + button="true" buttonIcon="ui-icon-gear"> + <s:text name="vradi.edit.save"/> + </sj:a> + </div> + </sj:tabbedpanel> </div> <div>
participants (1)
-
bpoussin@users.chorem.org