Finally, I did a 100% Wicket solution :-)

Here the code for the client:

Wicket.Ajax.get({
    u: ajaxCallbackUrl,
    c: componentId,
    ep: {'request': 'translations'},
    dt: 'json',
    wr: false, // To be sure the response will not be parsed as an XML
Ajax response.
    sh: [function (u: string, jqXHR: any, data: any, textStatus: string) {
        console.log("AJAX callback success:", data);
    }],
    fh: [function (u: string, jqXHR: any, exception: any, textStatus: string) {
        console.error("AJAX callback failure:", exception);
    }]
});

And the code for the panel:

ajaxBehavior = new AbstractDefaultAjaxBehavior() {
    @Override
    protected void respond(AjaxRequestTarget target) {
        final StringValue requestValue =
getRequest().getRequestParameters().getParameterValue("request");
        if (!requestValue.isEmpty() &&
ajaxDispatchers.containsKey(requestValue.toString())) {
            final String request = requestValue.toString();
            ajaxDispatchers.get(request).execute();
            
NodeGraphPanel.this.getRequestCycle().scheduleRequestHandlerAfterCurrent(new
TextRequestHandler("application/json", "UTF-8",
jsonService.toJson(Action.builder().action("translations").build())));
        }
    }
};
add(ajaxBehavior);

Maybe it will help someone.

Regards,
Stef

Le sam. 16 nov. 2024 à 16:32, Ernesto Reinaldo Barreiro <reier...@gmail.com>
a écrit :

> Hi,
>
> You can:
>
>    - directly use JQuery for your call. This will avoid the wicket logic at
>    client side.
>    - Mount an AbstractAjaxBehavior and on respond do something like
>
> @Override
> public void onRequest()
> {
>     RequestCycle requestCycle = RequestCycle.get();
>     IRequestParameters parameters =
> requestCycle.getRequest().getQueryParameters();
>
>     requestCycle.scheduleRequestHandlerAfterCurrent(new
> TextRequestHandler(this.mimetype, this.encoding,
> this.getResponse(parameters)));
> }
>
>
> See e.g.
> https://github.com/sebfz1/wicket-jquery-ui/blob/wicket9.x/wicket-jquery-ui-core/src/main/java/com/googlecode/wicket/jquery/core/behavior/AjaxCallbackBehavior.java
> as inspiration/reference.
>
> This is how, for instance, Wicket wrapper for jqueryUI autocomplete
> transfers the JSON used to build the autocomplete at client side.
>
>
> On Sat, Nov 16, 2024 at 6:58 AM Stéphane V. <sva...@gmail.com> wrote:
>
> > Sorry, I found my stupidity: I forgot the ! in the condition :-(
> >
> > if (requestValue.isEmpty() &&
> > ajaxDispatchers.containsKey(requestValue.toString())) {
> >
> > if (!requestValue.isEmpty() &&
> > ajaxDispatchers.containsKey(requestValue.toString())) {
> >
> > The JSON is now sent to the client, but wicket-ajax-jquery.js is creating
> > an error because it's waiting for the tag ajax-response:
> >
> > wicket-ajax-jquery-ver-1722411717821.js:219 Wicket.Ajax.Call.failure:
> Error
> > while parsing response: TypeError: envelope.getElementsByTagName is not a
> > function
> >
> >
> > Le sam. 16 nov. 2024 à 10:37, Stéphane V. <sva...@gmail.com> a écrit :
> >
> > > Hello everyone,
> > >
> > > I am working on making Ajax calls from a Panel/JavaScript component.
> This
> > > component is entirely written in Typescript and uses a canvas element.
> > The
> > > only HTML elements within the Panel are <div><canvas></canvas></div> to
> > > render the canvas.
> > >
> > > I would like to retrieve some information from the server when the
> > > JavaScript component initializes. I was thinking of using
> Wicket.Ajax.get
> > > for this. Throughout the lifecycle of the JavaScript component,
> > additional
> > > Ajax calls will be needed.
> > >
> > > On the server side, I believe I need to use an
> > AbstractDefaultAjaxBehavior.
> > > I want to use GET for retrieving data and POST with a JSON body for
> > > sending data.
> > >
> > > Here’s my current implementation in the Panel:
> > >
> > > ajaxBehavior = new AbstractDefaultAjaxBehavior() {
> > >     @Override
> > >     protected void respond(AjaxRequestTarget target) {
> > >         final StringValue requestValue =
> > getRequest().getRequestParameters().getParameterValue("request");
> > >         if (requestValue.isEmpty() &&
> > ajaxDispatchers.containsKey(requestValue.toString())) {
> > >             final String request = requestValue.toString();
> > >             ajaxDispatchers.get(request).execute();
> > >             getRequestCycle().scheduleRequestHandlerAfterCurrent(new
> > TextRequestHandler("application/json", "UTF-8",
> > jsonService.toJson(Action.builder().action("translations").build())));
> > >         }
> > >     }
> > > };
> > > add(ajaxBehavior);
> > >
> > > Here is the code for the first Ajax call (TypeScript):
> > >
> > > Wicket.Ajax.get({
> > >     u: ajaxCallbackUrl,
> > >     c: componentId,
> > >     ep: {'request':'translations'},
> > >     dt: 'json',
> > >     sh: function (attributes: any) {
> > >         console.log("AJAX callback success:", attributes);
> > >     },
> > >     fh: function (attributes: any) {
> > >         console.error("AJAX callback failure:", attributes);
> > >     }
> > > });
> > >
> > > The call is made to the server, but the JSON response is not parsed
> > > correctly, and I get the following error in the browser console:
> > >
> > > Wicket.Ajax.Call.failure: Error while parsing response: SyntaxError:
> > > Unexpected token '<', "<?xml vers" is not valid JSON
> > > Indeed, the server response is and it's not the JSON I'm sending with
> my
> > > panel:
> > > <?xml version="1.0" encoding="UTF-8"?><ajax-response></ajax-response>
> > >
> > > Where did I go wrong?
> > >
> > > Thank you for your help!
> > >
> > > Regards,
> > >
> > > Stef
> > >
> >
>
>
> --
> Regards - Ernesto Reinaldo Barreiro
>

Reply via email to