Question

On my Wicket page, I have a form with a couple of TextFields and a paginated List of Checkboxes iplemenet with dataview and and a data provider. I have used this example of Checkgroup.

I have listed my source below. The problem is that when I select a few items on Page 1 and then go to Page 2 and then return to Page 1 using the AjaxPagingNavigator, the selection is lost : the items that were checked on Page 1 initially do no have the "check mark" anymore. What should I do so that the items that were selected on page do no get lost when the AjaxPagnigaion is used to traverse the list ?

public final class AjaxFormWithPaginatedCheckBoxPage extends BasePage {

static Logger logger = Logger.getLogger(AjaxFormWithPaginatedCheckBoxPage.class);
private Person person = new Person();
int counter = 0;

WebMarkupContainer webMC;
static List<Person> pList=Person.getPersons(100); 
int maxListCount=5;
DataView dv;
CheckGroup group;
public AjaxFormWithPaginatedCheckBoxPage() {
    super();
    final Form form = new Form("form", new CompoundPropertyModel(person)) {

        protected void onSubmit() {
            logger.info("form recived");
            logger.info(" person name " + person.getName());

            setResponsePage(new AjaxTogglePanelTestPage());
        }
    };
    final TextField name = new TextField("name");
    final TextField age = new TextField("age");
    form.add(name);
    form.add(age);


    group=new CheckGroup("group", new ArrayList());        
    form.add(group);

    webMC= new WebMarkupContainer("webMC");
    webMC.setOutputMarkupId(true);

    //PersonDataProvider personDataProvider= new PersonDataProvider();
    SortablePersonDataProvider personDataProvider=new SortablePersonDataProvider(pList);
    dv = new DataView<Person>("persons", personDataProvider) {

        @Override
        protected void populateItem(Item<Person> item) {
            //AttributeModifier am = new AttributeModifier("src", true, item.getModel());
            //item.add(new Radio("radio", item.getModel()));
            item.add(new Check("check", item.getModel()));
            item.add(new Label("id", new PropertyModel(item.getModel(), "id")));                
            item.add(new Label("name", new PropertyModel(item.getModel(), "name")));                
            item.add(new Label("age", new PropertyModel(item.getModel(), "age")));                
        }


    };
    dv.setItemsPerPage(maxListCount);


    webMC.add(new AjaxFallbackOrderByBorder("orderByID", "id", personDataProvider)
    {
        @Override
        protected void onSortChanged()
        {
            dv.setCurrentPage(0);
        }

        @Override
        protected void onAjaxClick(AjaxRequestTarget target) {
            target.addComponent(webMC);
        }
    });

    webMC.add(new AjaxFallbackOrderByBorder("orderByName", "name", personDataProvider)
    {
        @Override
        protected void onSortChanged()
        {
            dv.setCurrentPage(0);
        }

        @Override
        protected void onAjaxClick(AjaxRequestTarget target) {
            target.addComponent(webMC);
        }
    });
    webMC.add(new AjaxFallbackOrderByBorder("orderByAge", "age", personDataProvider)
    {
        @Override
        protected void onSortChanged()
        {
            dv.setCurrentPage(0);
        }

        @Override
        protected void onAjaxClick(AjaxRequestTarget target) {
            target.addComponent(webMC);
        }
    });


    webMC.add(dv);        
    webMC.add(new AjaxPagingNavigator("navigator",dv));
    group.add(webMC);

    AjaxButton ab = new AjaxButton("ajax-button", new PropertyModel<String>(this,
            "counter"), form) {

        @Override
        protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
            counter++;
            logger.info("ajx form recived");
            logger.info("ajx person name " + person.getName());

            target.addComponent(this);

        }
    };
    form.add(ab);
    form.setDefaultButton(ab);

    add(form);        
}
}

Ok -- This is the updated and WORKING SOLUTION code based on answer below. Thanks.

public final class AjaxFormWithPaginatedCheckBoxPage extends BasePage {
static Logger logger = Logger.getLogger(AjaxFormWithPaginatedCheckBoxPage.class);
private Person person = new Person();
int counter = 0;

WebMarkupContainer webMC;
static List<Person> pList=Person.getPersons(100); 
int maxListCount=5;
DataView dv;


Set<Person> selectedPersons= new HashSet<Person>();


public AjaxFormWithPaginatedCheckBoxPage() {
    super();
    final Form form = new Form("form", new CompoundPropertyModel(person)) {

        protected void onSubmit() {
            logger.info("form recived");
            logger.info(" person name " + person.getName());
            for(Person p: selectedPersons){
                logger.info(" selected "+ p.getName());
            }

            setResponsePage(new AjaxTogglePanelTestPage());

        }
    };
    final TextField name = new TextField("name");
    final TextField age = new TextField("age");
    form.add(name);
    form.add(age);


    //group=new CheckGroup("group", new ArrayList());        
    //form.add(group);
    /*
    group.add(new AjaxFormChoiceComponentUpdatingBehavior(){

        @Override
        protected void onUpdate(AjaxRequestTarget target) {
            logger.info(" AjaxFormChoiceComponentUpdatingBehavior invoked .. ");
             target.addComponent(webMC);

        }

    });
    */


    webMC= new WebMarkupContainer("webMC");
    webMC.setOutputMarkupId(true);


    //PersonDataProvider personDataProvider= new PersonDataProvider();
    SortablePersonDataProvider personDataProvider=new SortablePersonDataProvider(pList);
    dv = new DataView<Person>("persons", personDataProvider) {

        @Override
        protected void populateItem(final Item<Person> item) {


            //item.add(new  Check("check", item.getModel()));
            AjaxCheckBox ajc=new  AjaxCheckBox("check", new PropertyModel(item.getModel(), "id")) {

                @Override
                protected void onUpdate(AjaxRequestTarget art) {
                    logger.info("onupdate called");
                        String value=getValue();
                        if(value==null){
                            logger.info("dunno what to do ..");
                            throw new IllegalArgumentException(" ajax check box returned null");
                        }    

                        Person op=((Person)(item.getDefaultModelObject()));
                        logger.info("person "+ op.getName() +" was "+ person.isSelected() );
                            boolean bret= Strings.isTrue(value);
                            if(bret==false){
                                logger.info(" ... UN-selected");
                                //((Person)(item.getDefaultModelObject())).setSelected(false);
                                selectedPersons.remove(op);
                            }
                            else{
                                logger.info("....selected");
                                //((Person)(item.getDefaultModelObject())).setSelected(true);
                                selectedPersons.add(op);
                            }
                        }                                    

            };
            item.add(ajc);
            item.add(new Label("id", new PropertyModel(item.getModel(), "id") ) );                
            item.add(new Label("name", new PropertyModel(item.getModel(), "name")));                
            item.add(new Label("age", new PropertyModel(item.getModel(), "age")));                
        }


    };
    dv.setItemsPerPage(maxListCount);


    webMC.add(new AjaxFallbackOrderByBorder("orderByID", "id", personDataProvider)
    {
        @Override
        protected void onSortChanged()
        {
            dv.setCurrentPage(0);
        }

        @Override
        protected void onAjaxClick(AjaxRequestTarget target) {
            target.addComponent(webMC);
        }
    });

    webMC.add(new AjaxFallbackOrderByBorder("orderByName", "name", personDataProvider)
    {
        @Override
        protected void onSortChanged()
        {
            dv.setCurrentPage(0);
        }

        @Override
        protected void onAjaxClick(AjaxRequestTarget target) {
            target.addComponent(webMC);
        }
    });
    webMC.add(new AjaxFallbackOrderByBorder("orderByAge", "age", personDataProvider)
    {
        @Override
        protected void onSortChanged()
        {
            dv.setCurrentPage(0);
        }

        @Override
        protected void onAjaxClick(AjaxRequestTarget target) {
            target.addComponent(webMC);
        }
    });


    webMC.add(dv);        
    webMC.add(new AjaxPagingNavigator("navigator",dv));
  //  group.add(webMC);

    AjaxButton ab = new AjaxButton("ajax-button", new PropertyModel<String>(this,
            "counter"), form) {

        @Override
        protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
            counter++;
            logger.info("ajx form recived");
            logger.info("ajx person name " + person.getName());

            target.addComponent(this);

        }
    };

    form.add(webMC);
    form.add(ab);
    form.setDefaultButton(ab);

    add(form);        

}
}
Was it helpful?

Solution

Whenever you leave the page using your pagination navigator, you're not submitting the form, thus not transferring the data, thus not changing the models, thus getting a clean slate on return. The easiest way around this would be to user AjaxCheckboxes instead of your regular Checkboxes. If this can't be done, you will need to change your pagination links to submit the form.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top