Hi,

If there is an Ajax component in the page then it should be stateful.
AutoCompleteTextField is an Ajax component and it should be enough.
But it seems there is some problem ...
If you are able to reproduce it with Wicket Quickstart 6.16.0 then please
attach the application to a ticket in JIRA !

The solution: call page.setStatelessHint(false) to mark the page as
stateful explicitly.

Martin Grigorov
Wicket Training and Consulting
https://twitter.com/mtgrigorov


On Tue, Jul 1, 2014 at 9:21 PM, Craig L <[email protected]> wrote:

> Wicket newbie so standard up front apologies. We are running our intranet
> on
> Wicket 1.4.18. I have searched the forums but I mostly see requests to
> generate stateless pages. I need to do the opposite. I need to generate a
> stateful page off an AutoCompleteTextField onchange/onsubmit event.
>
> Setup: I have an AutoCompleteTextField as the only component inside a form,
> no buttons or submit links. The AutoComplete field holds a list of strings
> of people's names and email addresses. Beneath the form in the html markup
> is a WebMarkupContainer which holds a ListView. The ListView is fed by a
> simple property model of Person objects which is empty on initial
> rendering.
> When a person is selected in the AutoComplete field then the ListView is
> updated to display one row with person-dependent links to other pages. I
> know the ListView is over kill for displaying only one row but the code was
> brought forward from a previous app so why re-invent the wheel.
>
> What is working: When a user types in chars and eventually selects a name
> from the AutoComplete they hit Enter and the name populates the field. I
> have an AjaxFormSubmitBehavior on the AutoComplete field where I trap the
> onSubmit, manipulate the selected user string and populate the simple
> property model with a Person object from our system. I then trigger a
> target.addComponent on the WebMarkupContainer to force the ListView to be
> rendered with the new Person object from the model and life is all good. I
> get the display results I am looking for...except
>
> The Problem: When the page is first rendered it is stateless (url just
> shows
> wicket:bookmarkablePage=:com.ourstuff.PersonSelectionPage). Even after the
> user types in chars to do the AutoComplete process, hits Enter to select
> the
> name from the AutoComplete listing, and the ajax process updates the
> ListView display with the resulting links for that person the page is still
> stateless. At that point If the user selects a link from the ListView and
> then tries to return to the page with a browser Back button they are
> returned to a blank AutoComplete field with no ListView data (since there
> is
> no stateful page to return to.)  I do see that both the Form and
> AutoCompleteTextField component's onSubmit events are called when the user
> hits enter to select the name from the listing.
>
> What I don't understand: After selecting a person from the AutoComplete
> listing if I place the cursor in the AutoComplete field again and hit
> Enter,
> then the Form's onSubmit event is called again but this time  the page is
> returned to the server, gets versioned with a wicket:interface=:2:1:::, and
> I am able to click the ListView links and return to the person populated
> page with the Back button. Not sure why the Form's onSubmit event behaves
> differently unless the AutoComplete's onSubmit is overridding it?
>
> The Question: So, how can I force a page to get 'versioned' on an
> AutoCompleteTextField onchange/onsubmit event without asking the user to
> click an additional button or link?
>
>
> I have attached the code for the relevant objects
>
> Form<Void> form = new Form<Void>("form") {
>                         @Override
>                         public void onSubmit() {
>                                 System.out.println("form submit");
>                         }
>                 };
>
> final AutoCompleteTextField<String> field = new
> AutoCompleteTextField<String>("ac", new Model<String>("")) {
>
>                         private static final long serialVersionUID = 1L;
>
>                         @Override
>                         protected Iterator<String> getChoices(String
> input) {
>                                 if (Strings.isEmpty(input)) {
>                                         List<String> emptyList =
> Collections.emptyList();
>                                         return emptyList.iterator();
>                                 }
>                                 List<String> choices = new
> ArrayList<String>(20);
>
>                                 for (final Persons person : customers) {
>                                         String fullname =
> person.getFullName() + " (" + person.getEmail() +
> ")";
>                                         if
> (fullname.toLowerCase().contains(input.toLowerCase())) {
>                                                 choices.add(fullname);
>                                                 if (choices.size() == 15) {
>                                                         break;
>                                                 }
>                                         }
>                                 }
>                                 return choices.iterator();
>                         }
>
>                 };
> form.add(field);
>
> field.add(new AjaxFormSubmitBehavior(form, "onchange") {
>         private static final long serialVersionUID = 1L;
>
>         @Override
>         protected void onSubmit(AjaxRequestTarget target) {
>                 // get the person record for the autocomplete user and
> update the chart
>                 System.out.println("ajax submit");
>                 String fullfieldentry = field.getModelObject();
>                 String email = parseEmailFromEntry(fullfieldentry);
>
>                 if (!email.equals("")) {
>                         SessionFactory factory =
> siteDaoFactory.getSessionFactory();
>                         HibernateUtility.openSession(factory);
>                         try {
>                                 // set the model with the Person object
>
> setLoneUser(personDao.findPersonsByEmailWithInit(email));
>
>                                 // wicket won't allow us to target the
> PageableListView repeater
>                                 // so we need to target the wmc holding
> the repeater.
>                                 target.addComponent(datacontainer);
>                         } catch (Exception e) {
>                                 e.printStackTrace();
>                         }finally {
>                                 HibernateUtility.close(factory);
>                         }
>                 }
>
>         }
>
>         @Override
>         protected void onError(AjaxRequestTarget target) {
>                 }
>
> });
>
>
> --
> View this message in context:
> http://apache-wicket.1842946.n4.nabble.com/How-to-Generate-a-Stateful-page-off-an-AutoCompleteTextField-onchange-onsubmit-event-tp4666414.html
> Sent from the Users forum mailing list archive at Nabble.com.
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>

Reply via email to