Author: musachy Date: Sat Apr 28 09:59:01 2007 New Revision: 533389 URL: http://svn.apache.org/viewvc?view=rev&rev=533389 Log: WW-1897 Create JSONValidationInterceptor * Add 'validate' attribute to submit,anchor and bind tags for ajax validation * Add 'ajaxAfterValidation' attribute to submit,anchor and bind tags to make an ajax request if validation succeeds (false by default)
WW-1900 Clean up Dojo plugin * Rename AbstractRemoteCallUIBean * Drop 'form' tag Added: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractRemoteBean.java - copied, changed from r531046, struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractRemoteCallUIBean.java struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractValidateBean.java struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/RemoteBean.java - copied, changed from r531046, struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/RemoteUICallBean.java struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractRemoteTag.java - copied, changed from r531046, struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractRemoteCallUITag.java struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractValidateTag.java Removed: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractRemoteCallUIBean.java struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Form.java struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/RemoteUICallBean.java struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/freemarker/tags/FormModel.java struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractRemoteCallUITag.java struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/FormTag.java struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/velocity/components/FormDirective.java struts/struts2/trunk/plugins/dojo/src/main/resources/template/ajax/form-close.ftl struts/struts2/trunk/plugins/dojo/src/main/resources/template/ajax/form.ftl struts/struts2/trunk/plugins/dojo/src/main/resources/template/ajax/validation.js Modified: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Anchor.java struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Bind.java struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Div.java struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Submit.java struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/DojoTagLibrary.java struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/freemarker/tags/DojoModels.java struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AnchorTag.java struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/BindTag.java struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/DivTag.java struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/SubmitTag.java struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/struts/widget/Bind.js struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/struts_dojo.js struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/struts_dojo.js.uncompressed.js struts/struts2/trunk/plugins/dojo/src/main/resources/template/ajax/a.ftl struts/struts2/trunk/plugins/dojo/src/main/resources/template/ajax/bind.ftl struts/struts2/trunk/plugins/dojo/src/main/resources/template/ajax/head.ftl struts/struts2/trunk/plugins/dojo/src/main/resources/template/ajax/submit.ftl struts/struts2/trunk/plugins/dojo/src/test/java/org/apache/struts2/dojo/views/jsp/ui/AnchorTest.java struts/struts2/trunk/plugins/dojo/src/test/java/org/apache/struts2/dojo/views/jsp/ui/BindTest.java struts/struts2/trunk/plugins/dojo/src/test/java/org/apache/struts2/dojo/views/jsp/ui/SubmitAjaxTest.java struts/struts2/trunk/plugins/dojo/src/test/resources/org/apache/struts2/dojo/views/jsp/ui/Bind-1.txt struts/struts2/trunk/plugins/dojo/src/test/resources/org/apache/struts2/dojo/views/jsp/ui/HeadTagTest-1.txt struts/struts2/trunk/plugins/dojo/src/test/resources/org/apache/struts2/dojo/views/jsp/ui/HeadTagTest-2.txt struts/struts2/trunk/plugins/dojo/src/test/resources/org/apache/struts2/dojo/views/jsp/ui/href-1.txt struts/struts2/trunk/plugins/dojo/src/test/resources/org/apache/struts2/dojo/views/jsp/ui/submit-ajax-1.txt struts/struts2/trunk/plugins/dojo/src/test/resources/org/apache/struts2/dojo/views/jsp/ui/submit-ajax-3.txt Copied: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractRemoteBean.java (from r531046, struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractRemoteCallUIBean.java) URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractRemoteBean.java?view=diff&rev=533389&p1=struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractRemoteCallUIBean.java&r1=531046&p2=struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractRemoteBean.java&r2=533389 ============================================================================== --- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractRemoteCallUIBean.java (original) +++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractRemoteBean.java Sat Apr 28 09:59:01 2007 @@ -30,7 +30,7 @@ * AbstractRemoteCallUIBean is superclass for all components dealing with remote * calls. */ -public abstract class AbstractRemoteCallUIBean extends ClosingUIBean implements RemoteUICallBean { +public abstract class AbstractRemoteBean extends ClosingUIBean implements RemoteBean { protected String href; protected String errorText; @@ -50,7 +50,7 @@ protected String highlightColor; protected String highlightDuration; - public AbstractRemoteCallUIBean(ValueStack stack, HttpServletRequest request, + public AbstractRemoteBean(ValueStack stack, HttpServletRequest request, HttpServletResponse response) { super(stack, request, response); } Added: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractValidateBean.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractValidateBean.java?view=auto&rev=533389 ============================================================================== --- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractValidateBean.java (added) +++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/AbstractValidateBean.java Sat Apr 28 09:59:01 2007 @@ -0,0 +1,63 @@ +/* + * $Id$ + * + * Copyright 2006 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.struts2.dojo.components; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.struts2.components.Form; +import org.apache.struts2.views.annotations.StrutsTagAttribute; + +import com.opensymphony.xwork2.util.ValueStack; + +/** + * Base class for tags that perform AJAX validation + */ +public abstract class AbstractValidateBean extends AbstractRemoteBean { + protected String validate; + protected String ajaxAfterValidation; + + public AbstractValidateBean(ValueStack stack, HttpServletRequest request, HttpServletResponse response) { + super(stack, request, response); + } + + public void evaluateExtraParams() { + super.evaluateExtraParams(); + + if (validate != null) + addParameter("validate", findValue(validate, Boolean.class)); + if (ajaxAfterValidation != null) + addParameter("ajaxAfterValidation", findValue(ajaxAfterValidation, Boolean.class)); + + Form form = (Form) findAncestor(Form.class); + if (form != null) + addParameter("parentTheme", form.getTheme()); + } + + @StrutsTagAttribute(description = "Perform Ajax calidation. 'ajaxValidation' interceptor must be applied to action", type="Boolean", + defaultValue = "false") + public void setValidate(String validate) { + this.validate = validate; + } + + @StrutsTagAttribute(description = "Make an asynchronous request if validation succeeds. Only valid is 'validate' is 'true'", type="Boolean", + defaultValue = "false") + public void setAjaxAfterValidation(String ajaxAfterValidation) { + this.ajaxAfterValidation = ajaxAfterValidation; + } +} \ No newline at end of file Modified: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Anchor.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Anchor.java?view=diff&rev=533389&r1=533388&r2=533389 ============================================================================== --- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Anchor.java (original) +++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Anchor.java Sat Apr 28 09:59:01 2007 @@ -23,6 +23,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.apache.struts2.components.Form; import org.apache.struts2.views.annotations.StrutsTag; import org.apache.struts2.views.annotations.StrutsTagAttribute; import org.apache.struts2.views.annotations.StrutsTagSkipInheritance; @@ -90,7 +91,7 @@ */ @StrutsTag(name="a", tldTagClass="org.apache.struts2.dojo.views.jsp.ui.AnchorTag", description="Renders an HTML anchor element that when clicked calls a URL via remote XMLHttpRequest and updates " + "its targets content") -public class Anchor extends AbstractRemoteCallUIBean { +public class Anchor extends AbstractValidateBean { public static final String OPEN_TEMPLATE = "a"; public static final String TEMPLATE = "a-close"; public static final String COMPONENT_NAME = Anchor.class.getName(); @@ -112,7 +113,7 @@ public void evaluateExtraParams() { super.evaluateExtraParams(); - if(targets != null) + if (targets != null) addParameter("targets", findString(targets)); } Modified: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Bind.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Bind.java?view=diff&rev=533389&r1=533388&r2=533389 ============================================================================== --- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Bind.java (original) +++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Bind.java Sat Apr 28 09:59:01 2007 @@ -55,7 +55,7 @@ */ @StrutsTag(name="bind", tldTagClass="org.apache.struts2.dojo.views.jsp.ui.BindTag", description="Attach event listeners to elements to make AJAX calls") @StrutsTagSkipInheritance -public class Bind extends AbstractRemoteCallUIBean { +public class Bind extends AbstractValidateBean { public static final String TEMPLATE = "bind-close"; public static final String OPEN_TEMPLATE = "bind"; @@ -78,11 +78,11 @@ public void evaluateExtraParams() { super.evaluateExtraParams(); - if(targets != null) + if (targets != null) addParameter("targets", findString(targets)); - if(sources != null) + if (sources != null) addParameter("sources", findString(sources)); - if(events != null) + if (events != null) addParameter("events", findString(events)); } @@ -112,6 +112,8 @@ return "ajax"; } + //these attributes are overwritten here just for the TLD generation + @StrutsTagAttribute(description="Topic that will trigger the remote call") public void setListenTopics(String listenTopics) { this.listenTopics = listenTopics; @@ -220,5 +222,17 @@ defaultValue = "2000", type="Integer") public void setHighlightDuration(String highlightDuration) { this.highlightDuration = highlightDuration; + } + + @StrutsTagAttribute(description = "Perform Ajax calidation. 'ajaxValidation' interceptor must be applied to action", type="Boolean", + defaultValue = "false") + public void setValidate(String validate) { + this.validate = validate; + } + + @StrutsTagAttribute(description = "Make an asynchronous request if validation succeeds. Only valid is 'validate' is 'true'", type="Boolean", + defaultValue = "false") + public void setAjaxAfterValidation(String ajaxAfterValidation) { + this.ajaxAfterValidation = ajaxAfterValidation; } } Modified: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Div.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Div.java?view=diff&rev=533389&r1=533388&r2=533389 ============================================================================== --- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Div.java (original) +++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Div.java Sat Apr 28 09:59:01 2007 @@ -59,7 +59,7 @@ * */ @StrutsTag(name="div", tldTagClass="org.apache.struts2.dojo.views.jsp.ui.DivTag", description="Render HTML div providing content from remote call via AJAX") -public class Div extends AbstractRemoteCallUIBean { +public class Div extends AbstractRemoteBean { public static final String TEMPLATE = "div"; public static final String TEMPLATE_CLOSE = "div-close"; Copied: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/RemoteBean.java (from r531046, struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/RemoteUICallBean.java) URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/RemoteBean.java?view=diff&rev=533389&p1=struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/RemoteUICallBean.java&r1=531046&p2=struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/RemoteBean.java&r2=533389 ============================================================================== --- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/RemoteUICallBean.java (original) +++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/RemoteBean.java Sat Apr 28 09:59:01 2007 @@ -21,7 +21,7 @@ package org.apache.struts2.dojo.components; -public interface RemoteUICallBean { +public interface RemoteBean { void setListenTopics(String topics); Modified: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Submit.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Submit.java?view=diff&rev=533389&r1=533388&r2=533389 ============================================================================== --- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Submit.java (original) +++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/components/Submit.java Sat Apr 28 09:59:01 2007 @@ -27,6 +27,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.struts2.components.Form; import org.apache.struts2.components.FormButton; import org.apache.struts2.views.annotations.StrutsTag; import org.apache.struts2.views.annotations.StrutsTagAttribute; @@ -93,7 +94,7 @@ * */ @StrutsTag(name="submit", tldTagClass="org.apache.struts2.dojo.views.jsp.ui.SubmitTag", description="Render a submit button") -public class Submit extends FormButton implements RemoteUICallBean { +public class Submit extends FormButton implements RemoteBean { private static final Log LOG = LogFactory.getLog(Submit.class); @@ -118,7 +119,9 @@ protected String errorNotifyTopics; protected String highlightColor; protected String highlightDuration; - + protected String validate; + protected String ajaxAfterValidation; + public Submit(ValueStack stack, HttpServletRequest request, HttpServletResponse response) { super(stack, request, response); } @@ -180,6 +183,19 @@ addParameter("highlightColor", findString(highlightColor)); if (highlightDuration != null) addParameter("highlightDuration", findString(highlightDuration)); + + Boolean validateValue = false; + if (validate != null) { + validateValue = (Boolean) findValue(validate, Boolean.class); + addParameter("validate", validateValue); + } + + Form form = (Form) findAncestor(Form.class); + if (form != null) + addParameter("parentTheme", form.getTheme()); + + if (ajaxAfterValidation != null) + addParameter("ajaxAfterValidation", findValue(ajaxAfterValidation, Boolean.class)); } @Override @@ -352,5 +368,17 @@ defaultValue = "1000") public void setHighlightDuration(String highlightDuration) { this.highlightDuration = highlightDuration; + } + + @StrutsTagAttribute(description = "Perform Ajax calidation. 'ajaxValidation' interceptor must be applied to action", type="Boolean", + defaultValue = "false") + public void setValidate(String validate) { + this.validate = validate; + } + + @StrutsTagAttribute(description = "Make an asynchronous request if validation succeeds. Only valid is 'validate' is 'true'", type="Boolean", + defaultValue = "false") + public void setAjaxAfterValidation(String ajaxAfterValidation) { + this.ajaxAfterValidation = ajaxAfterValidation; } } Modified: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/DojoTagLibrary.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/DojoTagLibrary.java?view=diff&rev=533389&r1=533388&r2=533389 ============================================================================== --- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/DojoTagLibrary.java (original) +++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/DojoTagLibrary.java Sat Apr 28 09:59:01 2007 @@ -12,7 +12,6 @@ import org.apache.struts2.dojo.views.velocity.components.BindDirective; import org.apache.struts2.dojo.views.velocity.components.DateTimePickerDirective; import org.apache.struts2.dojo.views.velocity.components.DivDirective; -import org.apache.struts2.dojo.views.velocity.components.FormDirective; import org.apache.struts2.dojo.views.velocity.components.HeadDirective; import org.apache.struts2.dojo.views.velocity.components.SubmitDirective; import org.apache.struts2.dojo.views.velocity.components.TabbedPanelDirective; @@ -40,7 +39,6 @@ TabbedPanelDirective.class, TreeDirective.class, TreeNodeDirective.class, - FormDirective.class, HeadDirective.class, BindDirective.class }; Modified: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/freemarker/tags/DojoModels.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/freemarker/tags/DojoModels.java?view=diff&rev=533389&r1=533388&r2=533389 ============================================================================== --- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/freemarker/tags/DojoModels.java (original) +++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/freemarker/tags/DojoModels.java Sat Apr 28 09:59:01 2007 @@ -18,7 +18,6 @@ protected DivModel div; protected AnchorModel a; protected SubmitModel submit; - protected FormModel form; protected BindModel bind; private ValueStack stack; @@ -47,14 +46,6 @@ return dateTimePicker; } - public FormModel getForm() { - if (form == null) { - form = new FormModel(stack, req, res); - } - - return form; - } - public AutocompleterModel getAutocompleter() { if (autocompleter == null) { autocompleter = new AutocompleterModel(stack, req, res); @@ -63,7 +54,7 @@ return autocompleter; } - public TabbedPanelModel getTabbedpanelModel() { + public TabbedPanelModel getTabbedpanel() { if (tabbedPanel == null) { tabbedPanel = new TabbedPanelModel(stack, req, res); } Copied: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractRemoteTag.java (from r531046, struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractRemoteCallUITag.java) URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractRemoteTag.java?view=diff&rev=533389&p1=struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractRemoteCallUITag.java&r1=531046&p2=struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractRemoteTag.java&r2=533389 ============================================================================== --- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractRemoteCallUITag.java (original) +++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractRemoteTag.java Sat Apr 28 09:59:01 2007 @@ -17,10 +17,10 @@ */ package org.apache.struts2.dojo.views.jsp.ui; -import org.apache.struts2.dojo.components.RemoteUICallBean; +import org.apache.struts2.dojo.components.RemoteBean; import org.apache.struts2.views.jsp.ui.AbstractClosingTag; -public abstract class AbstractRemoteCallUITag extends AbstractClosingTag { +public abstract class AbstractRemoteTag extends AbstractClosingTag { protected String href; protected String listenTopics; @@ -43,7 +43,7 @@ protected void populateParams() { super.populateParams(); - RemoteUICallBean remote = (RemoteUICallBean) component; + RemoteBean remote = (RemoteBean) component; remote.setHref(href); remote.setListenTopics(listenTopics); remote.setLoadingText(loadingText); Added: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractValidateTag.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractValidateTag.java?view=auto&rev=533389 ============================================================================== --- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractValidateTag.java (added) +++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AbstractValidateTag.java Sat Apr 28 09:59:01 2007 @@ -0,0 +1,45 @@ +/* + * $Id$ + * + * Copyright 2006 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.struts2.dojo.views.jsp.ui; + +import org.apache.struts2.dojo.components.AbstractValidateBean; + +/** + * @see AbstractValidateTag + */ +public abstract class AbstractValidateTag extends AbstractRemoteTag { + protected String validate; + protected String ajaxAfterValidation; + + protected void populateParams() { + super.populateParams(); + + AbstractValidateBean validateBean = (AbstractValidateBean) component; + validateBean.setValidate(validate); + validateBean.setAjaxAfterValidation(ajaxAfterValidation); + } + + public void setAjaxAfterValidation(String ajaxAfterValidation) { + this.ajaxAfterValidation = ajaxAfterValidation; + } + + public void setValidate(String validate) { + this.validate = validate; + } + +} Modified: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AnchorTag.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AnchorTag.java?view=diff&rev=533389&r1=533388&r2=533389 ============================================================================== --- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AnchorTag.java (original) +++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/AnchorTag.java Sat Apr 28 09:59:01 2007 @@ -31,13 +31,12 @@ /** * @see Anchor */ -public class AnchorTag extends AbstractRemoteCallUITag { +public class AnchorTag extends AbstractValidateTag { private static final long serialVersionUID = -1034616578492431113L; protected String targets; - protected String preInvokeJS; - + public Component getBean(ValueStack stack, HttpServletRequest req, HttpServletResponse res) { return new Anchor(stack, req, res); } @@ -47,6 +46,7 @@ Anchor link = (Anchor) component; link.setTargets(targets); + link.setValidate(validate); } public void setTargets(String targets) { Modified: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/BindTag.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/BindTag.java?view=diff&rev=533389&r1=533388&r2=533389 ============================================================================== --- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/BindTag.java (original) +++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/BindTag.java Sat Apr 28 09:59:01 2007 @@ -28,11 +28,11 @@ import com.opensymphony.xwork2.util.ValueStack; -public class BindTag extends AbstractRemoteCallUITag { +public class BindTag extends AbstractValidateTag { protected String targets; protected String sources; protected String events; - + public Component getBean(ValueStack stack, HttpServletRequest req, HttpServletResponse res) { return new Bind(stack, req, res); } Modified: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/DivTag.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/DivTag.java?view=diff&rev=533389&r1=533388&r2=533389 ============================================================================== --- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/DivTag.java (original) +++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/DivTag.java Sat Apr 28 09:59:01 2007 @@ -28,7 +28,7 @@ import com.opensymphony.xwork2.util.ValueStack; -public class DivTag extends AbstractRemoteCallUITag { +public class DivTag extends AbstractRemoteTag { private static final long serialVersionUID = 5309231035916461758L; Modified: struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/SubmitTag.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/SubmitTag.java?view=diff&rev=533389&r1=533388&r2=533389 ============================================================================== --- struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/SubmitTag.java (original) +++ struts/struts2/trunk/plugins/dojo/src/main/java/org/apache/struts2/dojo/views/jsp/ui/SubmitTag.java Sat Apr 28 09:59:01 2007 @@ -59,7 +59,9 @@ protected String errorNotifyTopics; protected String highlightColor; protected String highlightDuration; - + protected String validate; + protected String ajaxAfterValidation; + public Component getBean(ValueStack stack, HttpServletRequest req, HttpServletResponse res) { return new Submit(stack, req, res); } @@ -91,6 +93,8 @@ submit.setErrorNotifyTopics(errorNotifyTopics); submit.setHighlightColor(highlightColor); submit.setHighlightDuration(highlightDuration); + submit.setValidate(validate); + submit.setAjaxAfterValidation(ajaxAfterValidation); } public void setAction(String action) { @@ -187,5 +191,13 @@ public void setHighlightDuration(String highlightDuration) { this.highlightDuration = highlightDuration; + } + + public void setValidate(String validate) { + this.validate = validate; + } + + public void setAjaxAfterValidation(String ajaxAfterValidation) { + this.ajaxAfterValidation = ajaxAfterValidation; } } Modified: struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/struts/widget/Bind.js URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/struts/widget/Bind.js?view=diff&rev=533389&r1=533388&r2=533389 ============================================================================== --- struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/struts/widget/Bind.js (original) +++ struts/struts2/trunk/plugins/dojo/src/main/resources/org/apache/struts2/static/dojo/struts/widget/Bind.js Sat Apr 28 09:59:01 2007 @@ -42,7 +42,10 @@ highlightColor : "", highlightDuration : 2000, - + + validate : false, + ajaxAfterValidation : false, + postCreate : function() { var self = this; @@ -149,38 +152,57 @@ }); } }, - + bindHandler : function(type, data, e) { - //hide indicator - dojo.html.hide(this.indicator); - - //publish topics - this.notify(data, type, e); - - if(type == "load") { - if(this.executeScripts) { - //update targets content - var parsed = this.parse(data); - //eval scripts - if(parsed.scripts && parsed.scripts.length > 0) { - var scripts = ""; - for(var i = 0; i < parsed.scripts.length; i++){ - scripts += parsed.scripts[i]; - } - (new Function('_container_', scripts+'; return this;'))(this); - } - this.setContent(parsed.text); - } - else { - this.setContent(data); - } - this.highlight(); - } else { - if(this.showError) { - var message = dojo.string.isBlank(this.errorText) ? e.message : this.errorText; - this.setContent(message); - } - } + //hide indicator + dojo.html.hide(this.indicator); + + //publish topics + this.notify(data, type, e); + + if(type == "load") { + if(this.validate) { + StrutsUtils.clearValidationErrors(this.formNode); + //validation is active for this action + var errors = StrutsUtils.getValidationErrors(data); + if(errors && errors.fieldErrors) { + //validation failed + StrutsUtils.showValidationErrors(this.formNode, errors); + return; + } else { + //validation passed + if(!this.ajaxAfterValidation && this.formNode) { + //regular submit + this.formNode.submit(); + return; + } + } + } + + // no validation or validation passed + if(this.executeScripts) { + //update targets content + var parsed = this.parse(data); + //eval scripts + if(parsed.scripts && parsed.scripts.length > 0) { + var scripts = ""; + for(var i = 0; i < parsed.scripts.length; i++){ + scripts += parsed.scripts[i]; + } + (new Function('_container_', scripts+'; return this;'))(this); + } + this.setContent(parsed.text); + } + else { + this.setContent(data); + } + this.highlight(); + } else { + if(this.showError) { + var message = dojo.string.isBlank(this.errorText) ? e.message : this.errorText; + this.setContent(message); + } + } }, notify : function(data, type, e) { @@ -254,8 +276,9 @@ } //if there is a parent form, and it has a "onsubmit" - //execute it, validation is usually there - if(this.formNode && this.formNode.onsubmit != null) { + //execute it, validation is usually there, except is validation == true + //on which case it is ajax validation, instead of client side + if(!this.validate && this.formNode && this.formNode.onsubmit != null) { var makeRequest = this.formNode.onsubmit.call(evt); if(makeRequest != null && !makeRequest) { this.log("Request canceled by 'onsubmit' of the form"); @@ -268,9 +291,14 @@ if(this.showLoading) { this.setContent(this.loadingText); } + + var tmpHref = this.href; + if(!this.ajaxAfterValidation) { + tmpHref = tmpHref + (tmpHref.indexOf("?") > -1 ? "&" : "?") + "validateOnly=true"; + } dojo.io.bind({ - url: this.href, + url: tmpHref, useCache: false, preventCache: true, formNode: self.formNode,