[ 
https://issues.apache.org/jira/browse/WICKET-1213?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12549696
 ] 

Peter Ertl commented on WICKET-1213:
------------------------------------

here's an example of how this could be used -- you might get an better idea of 
what I want to achieve with this patch...

this is some code inside my template page:


  @Override
  public AjaxRequestTarget newAjaxRequestTarget()
  {
    final AjaxRequestTarget target = super.newAjaxRequestTarget();

    target.addListener(new AjaxRequestTarget.IListener()
    {
      @SuppressWarnings({"RawUseOfParameterizedType"})
      public void onBeforeRespond(final Map map, final AjaxRequestTarget target)
      {
        // always render the feedback component that belongs to this template
        // no need to include it in all pages that use this template
        target.addComponent(feedbackPanel);
      }

      @SuppressWarnings({"RawUseOfParameterizedType"})
      public void onAfterRespond(final Map map, final 
AjaxRequestTarget.IJavascriptResponse response)
      {
        //
        // set the focus on the first form component that has errors
        // this is very convenient for the user as he doesn't have to click on 
the erroneous field first
        // 
        // this has to be rendered in onAfterRespond to be sure the dom 
component for setting focus on has
        // already been rendered in the dom structure of the browser
        //
        final FormComponent focus = (FormComponent) 
visitChildren(FormComponent.class, new IVisitor()
        {
          public Object component(final Component component)
          {
            final FormComponent formComponent = (FormComponent) component;

            if (formComponent.hasErrorMessage() && 
formComponent.getOutputMarkupId())
              return formComponent;

            return CONTINUE_TRAVERSAL;
          }
        });
        if (focus != null)
          target.focusComponent(focus);
      }
    });
    return target;
  }


another possible example (using common functionality specific to your 
application this time)

  @Override
  public AjaxRequestTarget newAjaxRequestTarget()
  {
    return new CustomAjaxRequestTarget();
  }


so inside your pages you could for example do this:


  public void onClick(final AjaxRequestTarget target)
  {
    final CustomAjaxRequestTarget customTarget = 
(CustomAjaxRequestTarget)target;
    
    // change some setting on the page
    // ..
    
    // let the user take notice of the change (the heavily-used effect from 
Ruby on Rails we probably all know)
    customTarget.applyYellowFadeEffect(component);

    // make it even more obvious (some freaky javascript :-)
    customTarget.letScreenShakeUpAndDown();

    // even half-blind people should see that (another crazy js)
    customTarget.zoomInAndOutAgain(component);
  }

this way you could provide some common ajax  functionality to your application 
which is easy to use and implementation details are perfectly hidden



> enable subclassing of AjaxRequestTarget
> ---------------------------------------
>
>                 Key: WICKET-1213
>                 URL: https://issues.apache.org/jira/browse/WICKET-1213
>             Project: Wicket
>          Issue Type: Wish
>          Components: wicket
>            Reporter: Peter Ertl
>         Attachments: AjaxRequestTarget_with_subclassing.patch
>
>
> In my wicket programming experience so far I always didn't feel quite 
> comfortable with the ajax part.
> I had some issues in particular with these as an example:
> - "Always include a common feedback panel from my template page"
>    --> add 'target.addComponent(feedbackPanel)' just _everywhere_ (very 
> cumbersome and not elegant at all)
> - add a listener using AjaxRequestTarget#addListener
>   --> not possible without subclassing the request cycle (which is *yuk* if 
> you ask me) to catch the short moment in between AjaxRequestTarget is 
> instantiated and AjaxRequestTarget#onRespond() is called
> - automatically set focus on the first form component with errors
>    --> add bulky code into all onSubmit() and onError() to check for errrors 
> and call AjaxRequestTarget#setFocus
> - add some common function like AjaxRequestTarget#yellowFade(FormComponent)
>   --> have some utility method and call it like this: 
> AjaxUtil.yellowFade(target) -- not nice as functionality like this should 
> really belong to the request target
> I found that all these issues can be solved very elegantly if you could just 
> catch the moment where AjaxRequestTarget is instantiated.
> I attached a very little patch (!) which solves all that issues and makes 
> ajax just a lot more powerful inside wicket *imho*
> also, it will not break current code but is just an enhancement you will not 
> notice unless you need it.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to