To avoid changing wantSubmitOnParentFormSubmit visibility we can use isSubmitted to check if the target form has been submitted:
@Override protected void onEvent(final AjaxRequestTarget target) { AjaxFormSubmitBehavior.AjaxFormSubmitter submitter = new AjaxFormSubmitBehavior.AjaxFormSubmitter(this, target); Form<?> form = getForm(); form.getRootForm().onFormSubmitted(submitter); if (!form.isSubmitted()) { form.onFormSubmitted(submitter); } } On Mon, Aug 21, 2017 at 1:22 PM, Vit Rozkovec <rozkovec...@email.cz> wrote: > Hi, > this may be a naive solution that I did not have the time to test yet, but > wouldn't this change make at least inner form ajax-submit enabled? > > @Override > protected void onEvent(final AjaxRequestTarget target) > { > Form<?> form = getForm(); > if(!form.wantSubmitOnParentFormSubmit()) > form.onFormSubmitted(new > AjaxFormSubmitBehavior.AjaxFormSubmitter(this, > target)); > form.getRootForm().onFormSubmitted(new > AjaxFormSubmitBehavior.AjaxFormSubmitter(this, target)); > } > > It would mean to make Form's wantSubmitOnParentFormSubmit() public, though. > The point is to mark inner form as submitted via markFormsSubmitted() that > is private at the moment, so then in root form's onFormSubmitted > > formToProcess.process(submitter) > delegateSubmit(submittingComponent) > > Visits.visitPostOrder(...) the inner form is collected and inner form's > onSubmit is called. > > Vit > > On 08/21/2017 11:35 AM, Andrea Del Bene wrote: > >> Hi, >> >> this is somehow related to WICKET-6041 >> <https://issues.apache.org/jira/browse/WICKET-6041>. Unfortunately we >> couldn't find a solution for this old issue. >> >> On Mon, Aug 21, 2017 at 12:55 AM, Vit Rozkovec <vit.rozko...@gmail.com> >> wrote: >> >> Hi, >>> >>> I think I have discovered a bug where inner form, when set >>> wantSubmitOnParentFormSubmit() to false, does not get submitted when used >>> with AjaxButton. Normal SubmitLink works. >>> >>> Please see attached quickstart for demonstration. >>> >>> I believe the problem is in Form's onFormSubmitted(IFormSubmitter >>> submitter) and markFormsSubmitted() >>> >>> When used with Ajax, onFormSubmitted gets called for parent form in >>> AjaxFormSubmitBehavior: >>> >>> * @Override* >>> * protected void onEvent(final AjaxRequestTarget target)* >>> * {* >>> * getForm().getRootForm().onFormSubmitted(new >>> AjaxFormSubmitBehavior.AjaxFormSubmitter(this, target));* >>> * }* >>> >>> onFormSubmitted calls markFormsSubmitted but this implementation: >>> >>> * private void markFormsSubmitted()* >>> * {* >>> * setFlag(FLAG_SUBMITTED, true);* >>> >>> * visitChildren(Form.class, new IVisitor<Component, Void>()* >>> * {* >>> * @Override* >>> * public void component(final Component component, final >>> IVisit<Void> visit)* >>> * {* >>> * Form<?> form = (Form<?>)component;* >>> * if (form.wantSubmitOnParentFormSubmit() && >>> form.isEnabledInHierarchy() && form.isVisibleInHierarchy())* >>> * {* >>> * form.setFlag(FLAG_SUBMITTED, true);* >>> * return;* >>> * }* >>> * visit.dontGoDeeper();* >>> * }* >>> * });* >>> * }* >>> >>> skips the inner form with wantSubmitOnParentFormSubmit set to false. >>> >>> Further down the road delegateSubmit collects forms that have been >>> submitted, but as this inner form was skipped and flag was not set, it >>> does >>> not call form's onSubmit method. >>> >>> My use case is having one large form and ajax subform that works as >>> add/list comments form for parent large form. >>> >>> Am I missing something? >>> >>> Thanks for looking into it. >>> >>> Vit >>> >>> >