Repository: wicket Updated Branches: refs/heads/master 130cfb640 -> ece7575f5
WICKET-6041 Nested forms / parent FormComponents do not reflect updated model when nested form submitted Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/ece7575f Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/ece7575f Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/ece7575f Branch: refs/heads/master Commit: ece7575f5ea74ec27f88618fd287e4348aa9cc35 Parents: 130cfb6 Author: Andrea Del Bene <[email protected]> Authored: Fri Aug 19 15:53:50 2016 +0200 Committer: Andrea Del Bene <[email protected]> Committed: Fri Aug 19 16:17:09 2016 +0200 ---------------------------------------------------------------------- .../apache/wicket/markup/html/form/Form.java | 91 +++++++++++--------- .../markup/html/form/NestedFormsTest.java | 79 +++++++++++++++++ 2 files changed, 128 insertions(+), 42 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/ece7575f/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java index e8b61e7..88882c6 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java @@ -24,8 +24,6 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import javax.servlet.http.HttpServletRequest; - import org.apache.commons.fileupload.FileUploadBase; import org.apache.commons.fileupload.FileUploadException; import org.apache.wicket.Component; @@ -72,6 +70,8 @@ import org.apache.wicket.util.visit.Visits; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.servlet.http.HttpServletRequest; + /** * Container for {@link FormComponent}s (such as {@link CheckBox}es, {@link ListChoice}s or @@ -739,14 +739,19 @@ public class Form<T> extends WebMarkupContainer * * @see Form#validate() */ - public final void onFormSubmitted(IFormSubmitter submitter) + public final void onFormSubmitted(final IFormSubmitter submitter) { - markFormsSubmitted(); - + final IFormSubmitter actualSubmitter = submitter != null ? submitter : + findActualSubmitter(); + //find the actual form to process + final Form<?> formToProcess = findFormToProcess(actualSubmitter); + + formToProcess.markFormsSubmitted(); + if (handleMultiPart()) { // Tells FormComponents that a new user input has come - inputChanged(); + formToProcess.inputChanged(); String url = getRequest().getRequestParameters() .getParameterValue(getHiddenFieldId()) @@ -757,49 +762,19 @@ public class Form<T> extends WebMarkupContainer } else { - // First, see if the processing was triggered by a Wicket IFormSubmittingComponent - if (submitter == null) - { - submitter = findSubmittingButton(); - - if (submitter instanceof IFormSubmittingComponent) - { - IFormSubmittingComponent submittingComponent = (IFormSubmittingComponent)submitter; - Component component = (Component)submitter; - - if (!component.isVisibleInHierarchy()) - { - throw new WicketRuntimeException("Submit Button " + - submittingComponent.getInputName() + " (path=" + - component.getPageRelativePath() + ") is not visible"); - } - - if (!component.isEnabledInHierarchy()) - { - throw new WicketRuntimeException("Submit Button " + - submittingComponent.getInputName() + " (path=" + - component.getPageRelativePath() + ") is not enabled"); - } - } - } - // When processing was triggered by a Wicket IFormSubmittingComponent and that // component indicates it wants to be called immediately // (without processing), call the IFormSubmittingComponent.onSubmit* methods right // away. - if (submitter != null && !submitter.getDefaultFormProcessing()) + if (actualSubmitter != null && !actualSubmitter.getDefaultFormProcessing()) { - submitter.onSubmit(); - submitter.onAfterSubmit(); + actualSubmitter.onSubmit(); + actualSubmitter.onAfterSubmit(); } else { - // the submit request might be for one of the nested forms, so let's - // find the right one: - final Form<?> formToProcess = findFormToProcess(submitter); - // process the form for this request - formToProcess.process(submitter); + formToProcess.process(actualSubmitter); } } } @@ -807,7 +782,7 @@ public class Form<T> extends WebMarkupContainer // onError else if (hasError()) { - callOnError(submitter); + callOnError(actualSubmitter); } // update auto labels if we are inside an ajax request @@ -822,6 +797,39 @@ public class Form<T> extends WebMarkupContainer }); }); } + + /** + * Find the actual submitter for this form. If such component + * is found but it's not enabled or visible, an exception is thrown. + * + * @return the actual submitter + */ + private IFormSubmitter findActualSubmitter() + { + IFormSubmitter actualSubmitter = findSubmittingButton(); + + if (actualSubmitter instanceof IFormSubmittingComponent) + { + IFormSubmittingComponent submittingComponent = (IFormSubmittingComponent)actualSubmitter; + Component component = (Component)actualSubmitter; + + if (!component.isVisibleInHierarchy()) + { + throw new WicketRuntimeException("Submit Button " + + submittingComponent.getInputName() + " (path=" + + component.getPageRelativePath() + ") is not visible"); + } + + if (!component.isEnabledInHierarchy()) + { + throw new WicketRuntimeException("Submit Button " + + submittingComponent.getInputName() + " (path=" + + component.getPageRelativePath() + ") is not enabled"); + } + } + + return actualSubmitter; + } /** * This method finds the correct form that should be processed based on the submitting component @@ -900,7 +908,6 @@ public class Form<T> extends WebMarkupContainer * * @return Whether this form wants to be submitted too if a nested form is submitted. */ - // TODO wicket-7 migration guide: changed from public to protected protected boolean wantSubmitOnNestedFormSubmit() { return false; http://git-wip-us.apache.org/repos/asf/wicket/blob/ece7575f/wicket-core/src/test/java/org/apache/wicket/markup/html/form/NestedFormsTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/NestedFormsTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/NestedFormsTest.java index 6b5b8c4..5090e24 100644 --- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/NestedFormsTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/NestedFormsTest.java @@ -21,6 +21,7 @@ import java.util.List; import org.apache.wicket.Component; import org.apache.wicket.MarkupContainer; +import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.markup.IMarkupResourceStreamProvider; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.util.resource.IResourceStream; @@ -64,7 +65,85 @@ public class NestedFormsTest extends WicketTestCase assertEquals(0, testPage.submitSequence.indexOf(testPage.innerSubmit)); assertEquals(1, testPage.submitSequence.indexOf(testPage.innerForm)); } + + @SuppressWarnings("unchecked") + @Test + public void subitInnerFormWithAjaxBehavior() + { + tester.startPage(TestAjaxPage.class); + FormTester formTester = tester.newFormTester("formA"); + formTester.submit("formB:submit"); + + TestAjaxPage testPage = (TestAjaxPage)tester.getLastRenderedPage(); + + assertFalse(testPage.isFormAsubmitted()); + assertTrue(testPage.isFormBsubmitted()); + } + + public static class TestAjaxPage extends WebPage implements IMarkupResourceStreamProvider + { + /** + * + */ + private static final long serialVersionUID = 1L; + private boolean formAsubmitted; + private boolean formBsubmitted; + + public TestAjaxPage() + { + final Form<Void> formA = new Form<Void>("formA") + { + @Override + public void onDetach() + { + formAsubmitted = isSubmitted(); + super.onDetach(); + } + }; + final Form<Void> formB = new Form<Void>("formB") + { + @Override + protected void onDetach() + { + formBsubmitted = isSubmitted(); + super.onDetach(); + } + }; + + formB.add(new AjaxButton("submit") + { + private static final long serialVersionUID = 1L; + }); + + formA.add(formB); + add(formA); + } + + @Override + public IResourceStream getMarkupResourceStream(MarkupContainer container, + Class<?> containerClass) + { + return new StringResourceStream( + "<head></head>" + + "<form wicket:id=\"formA\">\r\n" + + " Form A\r\n" + + " <form wicket:id=\"formB\">\r\n" + + " Form B\r\n" + + " <button wicket:id=\"submit\">submit</button>\r\n" + + " </form>\r\n" + + " </form>"); + } + + public boolean isFormAsubmitted() { + return formAsubmitted; + } + + public boolean isFormBsubmitted() { + return formBsubmitted; + } + } + /** */ public static class TestPage extends WebPage implements IMarkupResourceStreamProvider {
