On Tue, Oct 12, 2010 at 10:30 AM, Shelli Orton <shelli.or...@sjrb.ca> wrote:
> Thanks for the help.  Your changes got rid of the errors and I can delete 
> records now (and the list is updated).
>
> However, once a record has been selected for edit and either saved or 
> cancelled, that same record is always displayed in the edit group when I 
> choose another record to edit or even when I try to create a new one.  I can 
> even delete the chosen record and it still displays in the edit group.

works fine here, meaning you did not completely/propery apply my
changes. below is the complete file.

-igor

public class RecordAPanel extends Panel
{
    private static final long serialVersionUID = 1L;

    RecordAService recordAService;
    RecordBService recordBService;

    RecordA selectedRecordA = new RecordA();
    IModel<RecordA> selectedRecordAModel;
    String unmodifiedRecordA;

    boolean isNew = false;

    WebMarkupContainer selectGroup;
    WebMarkupContainer editGroup;

    Form selectForm;
    Form editForm;

    DropDownChoice<RecordA> recordAs;
    DropDownChoice<RecordB> recordBs;

    Button add;
    Button edit;
    Button save;
    Button delete;
    Button cancel;

    Label editLegendLabel;
    String editLegend;
    Label recordALabel;
    Label recordBLabel;

    RequiredTextField recordAText;

    @SuppressWarnings({ "rawtypes", "unchecked" })
    public RecordAPanel(String id)
    {
        super(id);

        recordAService = ((Application)
RequestCycle.get().getApplication()).getRecordAService();
        recordBService = ((Application)
RequestCycle.get().getApplication()).getRecordBService();

        selectedRecordAModel = new PropertyModel<RecordA>(this,
"selectedRecordA");
        this.setDefaultModel(selectedRecordAModel);

        // ************* Select  Group *************

        selectGroup = new WebMarkupContainer("selectGroup");
        selectForm = new Form("selectForm");

        recordAs = new DropDownChoice<RecordA>("recordAs");
        recordAs.setModel(selectedRecordAModel);
        recordAs.setChoices(recordAsModel);
        recordAs.setChoiceRenderer(new RecordARenderer());

        //            recordAs = (DropDownChoice<RecordA>) new
DropDownChoice<RecordA>("recordAs",
        //                    new PropertyModel<RecordA>(this,
"selectedRecordA"),
        //                    recordAsModel,
        //                    new RecordARenderer());

        recordAs.setNullValid(false);

        selectForm.add(recordAs);

        add = new Button("add")
        {
            private static final long serialVersionUID = 1L;

            public void onSubmit()
            {
                setSelectedRecordA(new RecordA());
                isNew = true;
                editLegend = "New";
                editGroup.setVisible(true);
                selectGroup.setVisible(false);
            }
        };

        selectForm.add(add);

        edit = new Button("edit")
        {
            private static final long serialVersionUID = 1L;

            public void onSubmit()
            {
                if (selectedRecordA == null)
                {
                    info("You must select a record to edit.");
                }
                else
                {
                    unmodifiedRecordA = selectedRecordA.getName();
                    isNew = false;
                    editLegend = "Edit";
                    editGroup.setVisible(true);
                    selectGroup.setVisible(false);
                }
            }
        };

        selectForm.add(edit);

        delete = new Button("delete")
        {
            private static final long serialVersionUID = 1L;

            public void onSubmit()
            {
                if (selectedRecordA == null)
                {
                    info("You must select a record to delete.");
                }
                else
                {
                    // Delete the selected record
                    unmodifiedRecordA = selectedRecordA.getName();
                    recordAService.delete(selectedRecordA.getName());
                    selectedRecordA = null;
                    info("Deleted '" + unmodifiedRecordA + "'");

                    // Force refresh of records list
                    RecordAPanel.this.recordAsModel.detach();
                }
            }
        };

        // Add confirmation dialog box
        delete.add(new SimpleAttributeModifier("onclick",
                "if (!confirm('Please confirm you want to delete this
record') ){ return false; }"));

        selectForm.add(delete);
        selectGroup.add(selectForm);

        this.add(selectGroup);

        // ************* Edit Group *************

        editGroup = new WebMarkupContainer("editGroup");

        editLegendLabel = new Label("editLegend", new PropertyModel(this,
                "editLegend"));

        editGroup.add(editLegendLabel);

        editForm = new Form("editForm");

        recordALabel = new Label("recordALabel", "Record A");
        editForm.add(recordALabel);

        recordBLabel = new Label("recordBLabel", "Record B");
        editForm.add(recordBLabel);

        recordAText = new RequiredTextField("recordAText",
                new PropertyModel(selectedRecordAModel, "name"));

        editForm.add(recordAText);

        recordBs = new DropDownChoice<RecordB>("recordBs");
        recordBs.setModel(new PropertyModel(selectedRecordAModel, "recordB"));
        recordBs.setChoices(RecordAPanel.this.getRecordBs());
        recordBs.setChoiceRenderer(new RecordBRenderer());

        editForm.add(recordBs);

        save = new Button("save")
        {
            private static final long serialVersionUID = 1L;

            @Override
            public void onSubmit()
            {
                if (isNew)
                {

recordAService.create(RecordAPanel.this.selectedRecordA);
                        info("Created '"
                                + RecordAPanel.this.selectedRecordA.getName()
                                + "'");
                }
                else
                {
                        recordAService.update(unmodifiedRecordA,
                                RecordAPanel.this.selectedRecordA);
                        info("Updated '"
                                + RecordAPanel.this.selectedRecordA.getName()
                                + "'");
                }

                // TODO Update the dropdown list?

                editGroup.setVisible(false);
                selectGroup.setVisible(true);
            }
        };

        editForm.add(save);

        cancel = new Button("cancel")
        {
            private static final long serialVersionUID = 1L;

            public void onSubmit()
            {
                RecordAPanel.this.selectedRecordA = null;
                editGroup.setVisible(false);
                selectGroup.setVisible(true);
            }
        };

        cancel.setDefaultFormProcessing(false);
        editForm.add(cancel);

        editGroup.add(editForm);

        editGroup.setVisible(false);
        this.add(editGroup);
    }

    public RecordA getSelectedRecordA()
    {
        return selectedRecordA;
    }

    public void setSelectedRecordA(RecordA selectedRecordA)
    {
        this.selectedRecordA = selectedRecordA;
    }

    public LoadableDetachableModel<List<RecordA>> recordAsModel = new
LoadableDetachableModel<List<RecordA>>()
    {
        private static final long serialVersionUID = 1L;

        @Override
        protected List<RecordA> load()
        {
            return recordAService.getList();
        }

        public void detach()
        {
            super.detach();
        }
    };

    // TODO change this to LDM?
    List<RecordB> getRecordBs()
    {
        return recordBService.getList();
    }

    class RecordARenderer implements IChoiceRenderer<RecordA>
    {
        private static final long serialVersionUID = 1L;

        public Object getDisplayValue(RecordA recordA)
        {
            return recordA.getName();
        }

        public String getIdValue(RecordA recordA, int index)
        {
            return recordA.getName();
        }
    }

    class RecordBRenderer implements IChoiceRenderer<RecordB>
    {
        private static final long serialVersionUID = 1L;

        public Object getDisplayValue(RecordB recordB)
        {
            return recordB.getName();
        }

        public String getIdValue(RecordB recordB, int index)
        {
            return recordB.getName();
        }
    }
}

>
> Shelli
>
> -----Original Message-----
> From: Igor Vaynberg [mailto:igor.vaynb...@gmail.com]
> Sent: Tuesday, October 12, 2010 10:38 AM
> To: users@wicket.apache.org
> Subject: Re: PropertyModel Not Refreshing
>
> here are the tweaks you need to make this work:
>
> selectedRecordAModel = new PropertyModel<RecordA>(this, "selectedRecordA");
>
> recordAText = new RequiredTextField("recordAText",
>                new PropertyModel(selectedRecordAModel, "name"));
>
>  recordBs.setModel(new PropertyModel(selectedRecordAModel, "recordB"));
>
> have fun
>
> -igor
>
> On Tue, Oct 12, 2010 at 9:03 AM, Shelli Orton <shelli.or...@sjrb.ca> wrote:
>> I've been able to create a sample application that exhibits the
>> same/similar problems to mine.  The sample makes use of an in-memory
>> list for the data versus accessing a database and so there's some
>> differences.  However, I believe the problems that this sample exhibits
>> have the same root cause as my project (which I believe have something
>> to do with how my models are set up...).
>>
>> Issues this sample exhibits:
>>
>> 1. Choose to edit an existing record, then cancel the edit.  Choose
>> another/the same record to edit and the selected record is null (error
>> message "You must select a record to edit" is displayed).  Must
>> close/open session to reset.
>>
>> 2. Choose to edit an existing record and save the edit.  Choose
>> another/the same record to edit and you get a NPE:
>>
>>    WicketMessage: Method onFormSubmitted of interface
>> org.apache.wicket.markup.html.form.IFormSubmitListener targeted at
>> component [MarkupContainer [Component id = selectForm]] threw an
>> exception
>>
>>    Root cause:
>>
>>    java.lang.NullPointerException
>>    at
>> org.apache.wicket.markup.html.form.AbstractSingleSelectChoice.convertCho
>> iceIdToChoice(AbstractSingleSelectChoice.java:247)
>>
>> 3. Create a new record and try to save it and get
>> WicketRuntimeException:
>>
>>    WicketMessage: Attempted to set property value on a null object.
>> Property expression: name Value: New One
>>
>>    Root cause:
>>
>>    org.apache.wicket.WicketRuntimeException: Attempted to set property
>> value on a null object. Property expression: name Value: New One
>>    at
>> org.apache.wicket.util.lang.PropertyResolver.setValue(PropertyResolver.j
>> ava:125)
>>
>> 4. Create a new record and then cancel the add, Choose an existing
>> record to edit and the selected record is null (error message "You must
>> select a record to edit" is displayed).  Must close/open session to
>> reset.
>>
>> As always, all help is greatly appreciated as I am stumped.
>>
>> Thanks,
>> Shelli
>>
>> -----Original Message-----
>> From: jcgarciam [mailto:jcgarc...@gmail.com]
>> Sent: Friday, October 08, 2010 1:41 PM
>> To: users@wicket.apache.org
>> Subject: Re: PropertyModel Not Refreshing
>>
>>
>> The attachment didn't make it,
>>
>> Can you try to extract out the relevant part and creates a quickstart
>> project that actually reproduces your issue?
>>
>>
>> On Fri, Oct 8, 2010 at 1:41 PM, Shelli Orton [via Apache Wicket] <
>> ml-node+2968688-305091622-65...@n4.nabble.com<ml-node%2B2968688-30509162
>> 2-65...@n4.nabble.com>
>>> wrote:
>>
>>> Hi,
>>>
>>> I have been trying different things to see if I could get my code to
>> work
>>> (and understand Wicket models better), but am still stuck.  I have a
>>> attached the (latest) panel class code which I hope is sufficient to
>> help.
>>>
>>> I was reading about different models (both online and the Wicket in
>> Action
>>> book) and thought that perhaps using a CompoundPropertyModel was more
>>> appropriate and may help with my issues.  Originally, I only declared
>>> selectedRecordA (line 40) but didn't instantiate it.  The select group
>>> displayed properly but when I chose a record from the list and tried
>> to edit
>>> it, this exception was thrown:
>>>
>>>     WicketMessage: Attempted to set property value on a null object.
>>> Property expression: recordA Value: Name=A-One
>>>     Root cause:
>>>
>>>     org.apache.wicket.WicketRuntimeException: Attempted to set
>> property
>>> value on a null object. Property expression: recordA Value: Name=A-One
>>>         at
>>>
>> org.apache.wicket.util.lang.PropertyResolver.setValue(PropertyResolver.j
>> ava:125)
>>>
>>>         at
>>>
>> org.apache.wicket.model.AbstractPropertyModel.setObject(AbstractProperty
>> Model.java:169)
>>>
>>>         at
>>> org.apache.wicket.Component.setDefaultModelObject(Component.java:3125)
>>>         ....
>>>
>>> I set breakpoints on the getSelectedRecordA and setSelectedRecordA
>> methods,
>>> but these aren't called when during the request cycle when the edit
>> button
>>> is clicked.
>>>
>>> I then changed the class so that selectedRecordA is initialized to an
>> empty
>>> instance of RecordA. This got rid of the above error.  However, I
>> cannot
>>> save the edit changes because the selectedRecordA is still the empty
>>> instance that was created in the initialization and the persistence
>> layer
>>> throws an exception.  This same problem exists if I try to add a new
>> RecordA
>>> or try to delete an existing one.
>>>
>>> If I choose to cancel the edit and then select another record to edit,
>> I
>>> get the message "You must select a record to edit" (line 131).  This
>> is
>>> because the cancel onSubmit sets selectedRecordA to null and choosing
>> the
>>> record from the DDC is not setting it to the chosen record.
>>>
>>> Clearly I am not setting up this CompoundPropertyModel properly so
>> that the
>>> selectedARecord is set by the model.  Can someone tell me what I'm
>> doing
>>> wrong?
>>>
>>> All help is greatly appreciated,
>>>
>>> Shelli
>>>
>>>
>>> -----Original Message-----
>>> From: Igor Vaynberg [mailto:[hidden
>> email]<http://user/SendEmail.jtp?type=node&node=2968688&i=0>]
>>>
>>> Sent: Thursday, October 07, 2010 11:27 AM
>>> To: [hidden email]
>> <http://user/SendEmail.jtp?type=node&node=2968688&i=1>
>>> Subject: Re: PropertyModel Not Refreshing
>>>
>>> you have posted an incomplete piece of code and somehow from that we
>>> are supposed to guess what is not working? create a quickstart and
>>> provide that.
>>>
>>> -igor
>>>
>>> On Thu, Oct 7, 2010 at 10:15 AM, Shelli Orton <[hidden
>> email]<http://user/SendEmail.jtp?type=node&node=2968688&i=2>>
>>> wrote:
>>>
>>> > Does nobody have any suggestions?  If I can't get this fixed, I'm
>> going
>>> > to have to write the app in another framework (possibly GWT) and I'd
>>> > really rather not have to do that.
>>> >
>>> > Shelli
>>> >
>>> > -----Original Message-----
>>> > From: Shelli Orton
>>> > Sent: Wednesday, October 06, 2010 3:52 PM
>>> > To: [hidden
>> email]<http://user/SendEmail.jtp?type=node&node=2968688&i=3>
>>> > Subject: PropertyModel Not Refreshing
>>> >
>>> > Hi,
>>> >
>>> > First, thanks to all who have been helping me as I am new to Wicket.
>> I
>>> > am splitting out two issues I am dealing with to try to keep things
>>> > clear.
>>> >
>>> > I am trying to write a simple app that does CRUD operations on
>> database
>>> > records.  The goal is for the app to make use of a tab panel where
>> each
>>> > tab encapsulates one table from the database.  Each tab panel has
>> two
>>> > groups (WebMarkupContainer).  The first, selectGroup, displays a
>> list
>>> > (DDC) of the current items, and three buttons, add, edit and delete.
>>> > The second, editGroup, is displayed when either the add or edit
>> button
>>> > was clicked on the select group, displays the record attributes and
>> save
>>> > and cancel buttons.  The tab panel has a "selectedRecord" which is
>> used
>>> > by both groups' components via PropertyModels. Very basic stuff.
>>> >
>>> > When I choose a record and click the edit button, the record is
>>> > displayed in the edit group properly.  If I then choose cancel, the
>> edit
>>> > group is no longer displayed and the select group DDC selection is
>> null
>>> > as expected. I then choose another record from the list and click
>> the
>>> > edit button and the previous record information is displayed in the
>> edit
>>> > group even though the select group DDC shows the correct/selected
>>> > record.
>>> >
>>> > This problem also occurs if I first choose to add a new record and
>> then
>>> > cancel the add and then choose to edit a different record.  The DDC
>>> > shows the correct/selected record, but all the attributes in the
>> edit
>>> > group are null/defaults for a new record.
>>> >
>>> > If I remove the call to setDefaultFormProcessing(false) on the
>> cancel
>>> > button, selecting other records for edit works correctly, but I
>> can't
>>> > cancel a creating a new record if I use a RequiredTextField because
>> the
>>> > form validation fails.
>>> >
>>> > If I select a record for editing or save the newly created record, I
>> can
>>> > select a different record for edit or create another one correctly.
>> So
>>> > I must be doing something wrong in the cancel logic. My editForm
>>> > (created in the EditGroup constructor) looks like this:
>>> >
>>> >            Form editForm = new Form("editForm");
>>> >
>>> >            editForm.add(new Label("nameLabel", "Name"));
>>> >
>>> >            editForm.add(new Label("attributeLabel", "Attribute"));
>>> >
>>> >            editForm.add(new
>> RequiredTextField<String>("recordNameText",
>>> >                    new PropertyModel<String>(MyRecordPanel.this,
>>> >                            "selectedRecord.name")));
>>> >
>>> >            editForm.add(new DropDownChoice<Lir>("attributes",
>>> >                    new PropertyModel<Attribute>(MyRecordPanel.this,
>>> >                            "selectedRecord.attribute"),
>>> >                    RateCentrePanel.this.getAttributes(),
>>> >                    new AttributeRenderer()));
>>> >
>>> >            ....
>>> >
>>> >            editForm.add(new Button("cancel")
>>> >            {
>>> >                private static final long serialVersionUID = 1L;
>>> >
>>> >                public void onSubmit()
>>> >                {
>>> >                    MyRecordPanel.this.selectedRecord = null;
>>> >                    editGroup.setVisible(false);
>>> >                    selectGroup.setVisible(true);
>>> >                }
>>> >            }.setDefaultFormProcessing(false));
>>> >
>>> >            add(editForm);
>>> >
>>> > Other than setting the selectedRecord to null, what should I be
>> doing
>>> > differently?
>>> >
>>> > Thanks in advance!
>>> >
>>> > Shelli
>>> >
>>> >
>> ---------------------------------------------------------------------
>>> > To unsubscribe, e-mail: [hidden
>> email]<http://user/SendEmail.jtp?type=node&node=2968688&i=4>
>>> > For additional commands, e-mail: [hidden
>> email]<http://user/SendEmail.jtp?type=node&node=2968688&i=5>
>>> >
>>> >
>>> >
>> ---------------------------------------------------------------------
>>> > To unsubscribe, e-mail: [hidden
>> email]<http://user/SendEmail.jtp?type=node&node=2968688&i=6>
>>> > For additional commands, e-mail: [hidden
>> email]<http://user/SendEmail.jtp?type=node&node=2968688&i=7>
>>> >
>>> >
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: [hidden
>> email]<http://user/SendEmail.jtp?type=node&node=2968688&i=8>
>>> For additional commands, e-mail: [hidden
>> email]<http://user/SendEmail.jtp?type=node&node=2968688&i=9>
>>>
>>>
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: [hidden
>> email]<http://user/SendEmail.jtp?type=node&node=2968688&i=10>
>>> For additional commands, e-mail: [hidden
>> email]<http://user/SendEmail.jtp?type=node&node=2968688&i=11>
>>>
>>> ------------------------------
>>>  View message @
>>>
>> http://apache-wicket.1842946.n4.nabble.com/DropDownChoice-Model-Confusio
>> n-tp2955144p2968688.html
>>> To start a new topic under Apache Wicket, email
>>>
>> ml-node+1842946-398011874-65...@n4.nabble.com<ml-node%2B1842946-39801187
>> 4-65...@n4.nabble.com>
>>> To unsubscribe from Apache Wicket, click
>> here<http://apache-wicket.1842946.n4.nabble.com/template/TplServlet.jtp?
>> tpl=unsubscribe_by_code&node=1842946&code=amNnYXJjaWFtQGdtYWlsLmNvbXwxOD
>> QyOTQ2fDEyNTYxMzc3ODY=>.
>>>
>>>
>>>
>>
>>
>> --
>> Sincerely,
>> JC (http://www.linkedin.com/in/jcgarciam)
>> Work smarter, not harder!.
>>
>> --
>> View this message in context:
>> http://apache-wicket.1842946.n4.nabble.com/DropDownChoice-Model-Confusio
>> n-tp2955144p2968936.html
>> Sent from the Users forum mailing list archive at Nabble.com.
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
>> For additional commands, e-mail: users-h...@wicket.apache.org
>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
>> For additional commands, e-mail: users-h...@wicket.apache.org
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
> For additional commands, e-mail: users-h...@wicket.apache.org
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
> For additional commands, e-mail: users-h...@wicket.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org

Reply via email to