You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@myfaces.apache.org by Joe Rossi <je...@hotmail.co.uk> on 2007/10/11 20:42:20 UTC

[|Trinidad] RE: Problem auto-refreshing tables

Any pointers on this one from the Trinidad experts? This is about to really start hitting my project deliverables :-(

My gut feel is that it Trinidad is comparing old state to new state to work out whether or not to send a PPR update to the table and it's somehow failing if the last row is removed? If one of the Trinidad gurus points me in the right direction of the code I will debug into it.

btw - it appears that the same problem occurs with removing the last row of a branch in a tree table.



From: jeross@hotmail.co.uk
To: users@myfaces.apache.org
Subject: Problem auto-refreshing tables
Date: Tue, 2 Oct 2007 18:39:34 +0000










I'm hitting a problem with auto-refreshing of tables using Trinidad 1.2.1, facelets and JSF 1.2 (Sun RI). I've condensed the scenario down to a small test case shown below. The summary is:

- I have a page which displays a table containing a collection of objects 
- Each row of the table contains two command links - one to edit the row and another to delete the row
- Both links pop-up a dialog with details of the row. Hitting the "save" button on the dialog will either save the edit changes (if invoked from the edit link) or delete the row (if invoked from the delete link).
- The table has a partialTriggers attribute which attempts to refresh the table contents whenever a row is edited or deleted (i.e. partialTriggers contains the ids of the edit and delete links)
- Everything appears to work fine apart from deletion of the last row in the table whereby the table does not automatically refresh. 

Is this a bug or am I doing something silly? Is there a better way to achieve what I'm trying to do?

thanks in advance for any help.

Here's the source code:

widgetList.xhtml (page containing the table):=============================<!DOCTYPE htmlPUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><tr:document id="testForm" title="test form"  xmlns:h="http://java.sun.com/jsf/html"  xmlns:f="http://java.sun.com/jsf/core"  xmlns:ui="http://java.sun.com/jsf/facelets"  xmlns:tr="http://myfaces.apache.org/trinidad">  <tr:panelBorderLayout>    <tr:form id="widgetListForm">      <tr:panelGroupLayout layout="vertical">        <tr:commandButton text="Create New Widget"          action="dialog:widgetDialog"          useWindow="true" partialSubmit="true"          windowHeight="300" windowWidth="400"          id="createWidgetCommand">          <tr:setActionListener from="#{widgetListBean.newWidgetBean}"            to="#{pageFlowScope.widgetBean}" />          <tr:setActionListener from="#{'create'}"            to="#{pageFlowScope.widgetBean.operation}" />        </tr:commandButton>        <tr:commandButton text="Refresh Page" id="refreshCommand">        </tr:commandButton>        <tr:table id="widgetTable" var="widgetBean"          value="#{widgetListBean.widgetList}" rowBandingInterval="1"          partialTriggers="refreshCommand createWidgetCommand widgetTable:editWidgetCommand widgetTable:deleteWidgetCommand">          <tr:column>            <f:facet name="header">              <tr:outputText value="Widget Name" />            </f:facet>            <tr:outputText value="#{widgetBean.name}" />          </tr:column>          <tr:column>            <f:facet name="header">              <tr:outputText value="Actions" />            </f:facet>            <tr:panelGroupLayout layout="horizontal">              <tr:commandLink action="dialog:widgetDialog"                useWindow="true" partialSubmit="true"                windowHeight="300" windowWidth="400"                id="editWidgetCommand"                shortDesc="Edit the widget.">                <tr:image source="/skins/tn/images/ico_edit.gif" />                <tr:setActionListener from="#{'edit'}"                  to="#{widgetBean.operation}" />                <tr:setActionListener from="#{widgetBean}"                  to="#{pageFlowScope.widgetBean}" />              </tr:commandLink>              <tr:commandLink action="dialog:widgetDialog"                useWindow="true" partialSubmit="true"                windowHeight="300" windowWidth="400"                id="deleteWidgetCommand"                shortDesc="Delete the widget.">                <tr:image source="/skins/tn/images/ico_delete.gif" />                <tr:setActionListener from="#{'delete'}"                  to="#{widgetBean.operation}" />                <tr:setActionListener from="#{widgetBean}"                  to="#{pageFlowScope.widgetBean}" />              </tr:commandLink>            </tr:panelGroupLayout>          </tr:column>        </tr:table>      </tr:panelGroupLayout>    </tr:form>  </tr:panelBorderLayout></tr:document>widgetDialog.xhtml (the dialog that gets popped up when edit or delete is clicked):==========================================================<!DOCTYPE htmlPUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><tr:document id="testDialog" title="Dialog"  xmlns:h="http://java.sun.com/jsf/html"  xmlns:f="http://java.sun.com/jsf/core"  xmlns:ui="http://java.sun.com/jsf/facelets"  xmlns:tr="http://myfaces.apache.org/trinidad">  <tr:form id="widgetDialogForm">    <tr:panelFormLayout id="widgetDialogForm" inlineStyle="width:20%">      <tr:inputText label="Widget Code"        value="#{pageFlowScope.widgetBean.name}"        id="nameField" required="true" showRequired="true"        requiredMessageDetail="Widget name must be entered."        maximumLength="10"/>      <f:facet name="footer">        <tr:panelButtonBar>          <tr:commandButton id="saveCommand"            text="#{pageFlowScope.widgetBean.operation}"            action="#{pageFlowScope.widgetBean.commitAction}" />          <tr:commandButton id="cancelCommand" text="Cancel"            action="#{pageFlowScope.widgetBean.cancelAction}"            immediate="true" />        </tr:panelButtonBar>      </f:facet>    </tr:panelFormLayout>  </tr:form></tr:document>WidgetList.java (backing bean for the main page - manages the collection of widgets)==========================================================public class WidgetList{  public WidgetList()  {    _createInitialTestValues();  }    public List<Widget> getWidgetList()  {    return _widgetBeans;  }    public Widget getNewWidgetBean()  {    Widget widget = new Widget(this, "");    widget.setOperation("create");    return widget;  }    private void _createInitialTestValues()  {    _widgetBeans.add(new Widget(this, "w1"));    _widgetBeans.add(new Widget(this, "w2"));    _widgetBeans.add(new Widget(this, "w3"));  }  private List<Widget> _widgetBeans = new ArrayList<Widget>();}Widget.java (backing bean for the individual rows)=================================/** * Widget is a test bean */public class Widget{  public Widget(WidgetList widgetList, String name)  {    _widgetList = widgetList;    _name = name;  }    public String getName()  {    return _name;  }  public void setName(String name)  {    _name = name;  }  public String getOperation()  {    return _operation;  }  public void setOperation(String operation)  {    assert(operation.equals("edit") || operation.equals("create") || operation.equals("delete"));    _operation = operation;  }  public String commitAction()  {    if (_operation.equals("create"))    {      _widgetList.getWidgetList().add(this);    }    if (_operation.equals("delete"))    {      _widgetList.getWidgetList().remove(this);    }    if (_operation.equals("edit"))    {      // no change to owning collection    }    TrinidadFacesUtils.endDialog(_widgetList);    return null;  }    public String cancelAction()  {    TrinidadFacesUtils.endDialog(this);        return null;  }    @Override  public boolean equals(Object obj)  {    if (obj instanceof Widget)    {      Widget w = (Widget) obj;      return _name.equals(w._name);    }    return false;  }  @Override  public int hashCode()  {    return _name.hashCode();  }  @Override  public String toString()  {    return _name;  }  private String _name;  private String _operation = "edit";  private WidgetList _widgetList;}





Do you know a place like the back of your hand? Share local knowledge with  BackOfMyHand.com

_________________________________________________________________
Feel like a local wherever you go.
http://www.backofmyhand.com

RE: [|Trinidad] RE: Problem auto-refreshing tables

Posted by Joe Rossi <je...@hotmail.co.uk>.
Many thanks for the hints. Unfortunately, I can't proceed on either front:

(a) moving the table inside a panelGroupLayout and adding the triggers to that does not work

(b) Programatically calling addPartialTarget also does not work, possibly caused by my incompetence! i.e. The 'Delete' button is on a dialog (i.e. a separate page to the one containing the table). If I add an action listener to the delete button, programatically calling addPartialTarget on the table fails as the table is not on the "current page". Am I missing something?





Date: Thu, 11 Oct 2007 12:11:15 -0700
From: emailtoabhishek@gmail.com
To: users@myfaces.apache.org
Subject: Re: [|Trinidad] RE: Problem auto-refreshing tables

Please put your table inside a panelGroupLayout and add partial triggers to that. I am doing same thing in my application and never faced problem stated by you. As per reason of your problem is concerned i am not able to comment on that as i have never tried that.


Cheers,
Abhishek

On 10/11/07, venkata guddanti <ve...@gmail.com> wrote:
I suspect that this may be due to the fact that when the last row is deleted, the partial trigger may not longer valid during the rendering phase. One workaround is that you programatically call addPartialTarget with the table  in the  actionListener for the delete button.


Regards,
Venkata

On 10/11/07, Joe Rossi <
jeross@hotmail.co.uk> wrote:




Any pointers on this one from the Trinidad experts? This is about to really start hitting my project deliverables :-(

My gut feel is that it Trinidad is comparing old state to new state to work out whether or not to send a PPR update to the table and it's somehow failing if the last row is removed? If one of the Trinidad gurus points me in the right direction of the code I will debug into it.


btw - it appears that the same problem occurs with removing the last row of a branch in a tree table.



From: 

jeross@hotmail.co.uk
To: users@myfaces.apache.org
Subject: Problem auto-refreshing tables

Date: Tue, 2 Oct 2007 18:39:34 +0000











I'm hitting a problem with auto-refreshing of tables using Trinidad 1.2.1, facelets and JSF 1.2 (Sun RI). I've condensed the scenario down to a small test case shown below. The summary is:


- I have a page which displays a table containing a collection of objects 
- Each row of the table contains two command links - one to edit the row and another to delete the row
- Both links pop-up a dialog with details of the row. Hitting the "save" button on the dialog will either save the edit changes (if invoked from the edit link) or delete the row (if invoked from the delete link).

- The table has a partialTriggers attribute which attempts to refresh the table contents whenever a row is edited or deleted (i.e. partialTriggers contains the ids of the edit and delete links)
- Everything appears to work fine apart from deletion of the last row in the table whereby the table does not automatically refresh. 


Is this a bug or am I doing something silly? Is there a better way to achieve what I'm trying to do?

thanks in advance for any help.

Here's the source code:



widgetList.xhtml (page containing the table):=============================

<!DOCTYPE htmlPUBLIC "-//W3C//DTD XHTML 
1.0 Strict//EN""

http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><tr:document id="testForm" title="test form"
  xmlns:h="

http://java.sun.com/jsf/html"  xmlns:f="

http://java.sun.com/jsf/core"  xmlns:ui="

http://java.sun.com/jsf/facelets"  xmlns:tr="

http://myfaces.apache.org/trinidad">  <tr:panelBorderLayout>

    <tr:form id="widgetListForm">

      <tr:panelGroupLayout layout="vertical">        <tr:commandButton text="Create New Widget"
          action="dialog:widgetDialog"

          useWindow="true" partialSubmit="true"

          windowHeight="300" windowWidth="400"          id="createWidgetCommand">
          <tr:setActionListener from="#{widgetListBean.newWidgetBean}"

            to="#{pageFlowScope.widgetBean}" />

          <tr:setActionListener from="#{'create'}"            to="#{pageFlowScope.widgetBean.operation

}" />        </tr:commandButton>

        <tr:commandButton text="Refresh Page" id="refreshCommand">

        </tr:commandButton>

        <tr:table id="widgetTable" var="widgetBean"          value="#{widgetListBean.widgetList

}" rowBandingInterval="1"          partialTriggers="refreshCommand createWidgetCommand widgetTable:editWidgetCommand widgetTable:deleteWidgetCommand">
          <tr:column>

            <f:facet name="header">              <tr:outputText value="Widget Name" />
            </f:facet>

            <tr:outputText value="#{widgetBean.name}" />          </tr:column>
          <tr:column>

            <f:facet name="header">              <tr:outputText value="Actions" />
            </f:facet>

            <tr:panelGroupLayout layout="horizontal">              <tr:commandLink action="dialog:widgetDialog"
                useWindow="true" partialSubmit="true"

                windowHeight="300" windowWidth="400"

                id="editWidgetCommand"                shortDesc="Edit the widget.">
                <tr:image source="/skins/tn/images/ico_edit.gif" />

                <tr:setActionListener from="#{'edit'}"

                  to="#{widgetBean.operation}" />                <tr:setActionListener from="#{widgetBean}"
                  to="#{pageFlowScope.widgetBean}" />

              </tr:commandLink>              <tr:commandLink action="dialog:widgetDialog"
                useWindow="true" partialSubmit="true"

                windowHeight="300" windowWidth="400"

                id="deleteWidgetCommand"                shortDesc="Delete the widget.">
                <tr:image source="/skins/tn/images/ico_delete.gif" />

                <tr:setActionListener from="#{'delete'}"

                  to="#{widgetBean.operation}" />                <tr:setActionListener from="#{widgetBean}"
                  to="#{pageFlowScope.widgetBean}" />

              </tr:commandLink>            </tr:panelGroupLayout>
          </tr:column>

        </tr:table>      </tr:panelGroupLayout>
    </tr:form>

  </tr:panelBorderLayout></tr:document>


widgetDialog.xhtml (the dialog that gets popped up when edit or delete is clicked):==========================================================
<!DOCTYPE html

PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""

http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><tr:document id="testDialog" title="Dialog"
  xmlns:h="

http://java.sun.com/jsf/html"  xmlns:f="

http://java.sun.com/jsf/core"  xmlns:ui="

http://java.sun.com/jsf/facelets"  xmlns:tr="

http://myfaces.apache.org/trinidad">  <tr:form id="widgetDialogForm">

    <tr:panelFormLayout id="widgetDialogForm" inlineStyle="width:20%">
      <tr:inputText label="Widget Code"

        value="#{pageFlowScope.widgetBean.name
}"        id="nameField" required="true" showRequired="true"

        requiredMessageDetail="Widget name must be entered."

        maximumLength="10"/>

      <f:facet name="footer">        <tr:panelButtonBar>

          <tr:commandButton id="saveCommand"

            text="#{pageFlowScope.widgetBean.operation}"            action="#{pageFlowScope.widgetBean.commitAction

}" />          <tr:commandButton id="cancelCommand" text="Cancel"

            action="#{pageFlowScope.widgetBean.cancelAction}"

            immediate="true" />

        </tr:panelButtonBar>      </f:facet>

    </tr:panelFormLayout>  </tr:form>
</tr:document>

WidgetList.java (backing bean for the main page - manages the collection of widgets)

==========================================================

public class WidgetList{

  public WidgetList()

  {    _createInitialTestValues();

  }  

  public List<Widget> getWidgetList()  {

    return _widgetBeans;  }

    public Widget getNewWidgetBean()

  {

    Widget widget = new Widget(this, "");    widget.setOperation("create");

    return widget;

  }  

  private void _createInitialTestValues()  {

    _widgetBeans.add(new Widget(this, "w1"));

    _widgetBeans.add(new Widget(this, "w2"));    _widgetBeans.add(new Widget(this, "w3"));
  }

  private List<Widget> _widgetBeans = new ArrayList<Widget>();

}

Widget.java (backing bean for the individual rows)=================================

/**

 * Widget is a test bean */

public class Widget{

  public Widget(WidgetList widgetList, String name)

  {    _widgetList = widgetList;

    _name = name;  }

    public String getName()

  {    return _name;

  }  public void setName(String name)

  {    _name = name;

  }  public String getOperation()

  {    return _operation;

  }  public void setOperation(String operation)
  {

    assert(operation.equals("edit") || operation.equals("create") || operation.equals("delete"));

    _operation = operation;  }

  public String commitAction()  {

    if (_operation.equals("create"))

    {      _widgetList.getWidgetList().add(this);

    }    if (_operation.equals("delete"))
    {

      _widgetList.getWidgetList().remove(this);    }

    if (_operation.equals("edit"))

    {      // no change to owning collection

    }    TrinidadFacesUtils.endDialog(_widgetList);
    return null;

  }  

  public String cancelAction()  {

    TrinidadFacesUtils.endDialog(this);    
    return null;

  }  

  @Override  public boolean equals(Object obj)

  {    if (obj instanceof Widget)

    {      Widget w = (Widget) obj;

      return _name.equals(w._name);

    }    return false;

  }  @Override

  public int hashCode()  {

    return _name.hashCode();  }

  @Override

  public String toString()  {

    return _name;  }

  private String _name;  private String _operation = "edit";
  private WidgetList _widgetList;

}





Do you know a place like the back of your hand? Share local knowledge with  BackOfMyHand.com

Do you know a place like the back of your hand? Share local knowledge with  

BackOfMyHand.com





_________________________________________________________________
The next generation of MSN Hotmail has arrived - Windows Live Hotmail
http://www.newhotmail.co.uk

Re: [|Trinidad] RE: Problem auto-refreshing tables

Posted by Abhi <em...@gmail.com>.
Please put your table inside a panelGroupLayout and add partial triggers to
that. I am doing same thing in my application and never faced problem stated
by you. As per reason of your problem is concerned i am not able to comment
on that as i have never tried that.

Cheers,
Abhishek

On 10/11/07, venkata guddanti <ve...@gmail.com> wrote:
>
> I suspect that this may be due to the fact that when the last row is
> deleted, the partial trigger may not longer valid during the rendering
> phase. One workaround is that you programatically call addPartialTarget with
> the table  in the  actionListener for the delete button.
>
> Regards,
> Venkata
>
> On 10/11/07, Joe Rossi <je...@hotmail.co.uk> wrote:
> >
> > Any pointers on this one from the Trinidad experts? This is about to
> > really start hitting my project deliverables :-(
> >
> > My gut feel is that it Trinidad is comparing old state to new state to
> > work out whether or not to send a PPR update to the table and it's somehow
> > failing if the last row is removed? If one of the Trinidad gurus points me
> > in the right direction of the code I will debug into it.
> >
> > btw - it appears that the same problem occurs with removing the last row
> > of a branch in a tree table.
> >
> >
> >
> > ------------------------------
> > From: jeross@hotmail.co.uk
> > To: users@myfaces.apache.org
> > Subject: Problem auto-refreshing tables
> > Date: Tue, 2 Oct 2007 18:39:34 +0000
> >
> >  I'm hitting a problem with auto-refreshing of tables using Trinidad
> > 1.2.1, facelets and JSF 1.2 (Sun RI). I've condensed the scenario down
> > to a small test case shown below. The summary is:
> >
> > - I have a page which displays a table containing a collection of
> > objects
> > - Each row of the table contains two command links - one to edit the row
> > and another to delete the row
> > - Both links pop-up a dialog with details of the row. Hitting the "save"
> > button on the dialog will either save the edit changes (if invoked from the
> > edit link) or delete the row (if invoked from the delete link).
> > - The table has a partialTriggers attribute which attempts to refresh
> > the table contents whenever a row is edited or deleted (i.e.
> > partialTriggers contains the ids of the edit and delete links)
> > - Everything appears to work fine apart from deletion of the last row in
> > the table whereby the table does not automatically refresh.
> >
> > Is this a bug or am I doing something silly? Is there a better way to
> > achieve what I'm trying to do?
> >
> > thanks in advance for any help.
> >
> > Here's the source code:
> >
> > widgetList.xhtml (page containing the table):
> > =============================
> > <!DOCTYPE html
> > PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
> > " http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
> > <tr:document id="testForm" title="test form"
> >   xmlns:h=" http://java.sun.com/jsf/html"
> >   xmlns:f=" http://java.sun.com/jsf/core"
> >   xmlns:ui=" http://java.sun.com/jsf/facelets"
> >   xmlns:tr=" http://myfaces.apache.org/trinidad">
> >   <tr:panelBorderLayout>
> >     <tr:form id="widgetListForm">
> >       <tr:panelGroupLayout layout="vertical">
> >         <tr:commandButton text="Create New Widget"
> >           action="dialog:widgetDialog"
> >           useWindow="true" partialSubmit="true"
> >           windowHeight="300" windowWidth="400"
> >           id="createWidgetCommand">
> >           <tr:setActionListener from="#{widgetListBean.newWidgetBean}"
> >             to="#{pageFlowScope.widgetBean}" />
> >           <tr:setActionListener from="#{'create'}"
> >             to="#{pageFlowScope.widgetBean.operation }" />
> >         </tr:commandButton>
> >
> >         <tr:commandButton text="Refresh Page" id="refreshCommand">
> >         </tr:commandButton>
> >
> >         <tr:table id="widgetTable" var="widgetBean"
> >           value="#{widgetListBean.widgetList }" rowBandingInterval="1"
> >           partialTriggers="refreshCommand createWidgetCommand
> > widgetTable:editWidgetCommand widgetTable:deleteWidgetCommand">
> >           <tr:column>
> >             <f:facet name="header">
> >               <tr:outputText value="Widget Name" />
> >             </f:facet>
> >             <tr:outputText value="#{widgetBean.name}" />
> >           </tr:column>
> >           <tr:column>
> >             <f:facet name="header">
> >               <tr:outputText value="Actions" />
> >             </f:facet>
> >             <tr:panelGroupLayout layout="horizontal">
> >               <tr:commandLink action="dialog:widgetDialog"
> >                 useWindow="true" partialSubmit="true"
> >                 windowHeight="300" windowWidth="400"
> >                 id="editWidgetCommand"
> >                 shortDesc="Edit the widget.">
> >                 <tr:image source="/skins/tn/images/ico_edit.gif" />
> >                 <tr:setActionListener from="#{'edit'}"
> >                   to="#{widgetBean.operation}" />
> >                 <tr:setActionListener from="#{widgetBean}"
> >                   to="#{pageFlowScope.widgetBean}" />
> >               </tr:commandLink>
> >               <tr:commandLink action="dialog:widgetDialog"
> >                 useWindow="true" partialSubmit="true"
> >                 windowHeight="300" windowWidth="400"
> >                 id="deleteWidgetCommand"
> >                 shortDesc="Delete the widget.">
> >                 <tr:image source="/skins/tn/images/ico_delete.gif" />
> >                 <tr:setActionListener from="#{'delete'}"
> >                   to="#{widgetBean.operation}" />
> >                 <tr:setActionListener from="#{widgetBean}"
> >                   to="#{pageFlowScope.widgetBean}" />
> >               </tr:commandLink>
> >             </tr:panelGroupLayout>
> >           </tr:column>
> >         </tr:table>
> >
> >       </tr:panelGroupLayout>
> >     </tr:form>
> >
> >   </tr:panelBorderLayout>
> > </tr:document>
> >
> >
> > widgetDialog.xhtml (the dialog that gets popped up when edit or delete
> > is clicked):
> > ==========================================================
> > <!DOCTYPE html
> > PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
> > " http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
> > <tr:document id="testDialog" title="Dialog"
> >   xmlns:h=" http://java.sun.com/jsf/html"
> >   xmlns:f=" http://java.sun.com/jsf/core"
> >   xmlns:ui=" http://java.sun.com/jsf/facelets"
> >   xmlns:tr=" http://myfaces.apache.org/trinidad">
> >   <tr:form id="widgetDialogForm">
> >
> >     <tr:panelFormLayout id="widgetDialogForm" inlineStyle="width:20%">
> >       <tr:inputText label="Widget Code"
> >         value="#{pageFlowScope.widgetBean.name }"
> >         id="nameField" required="true" showRequired="true"
> >         requiredMessageDetail="Widget name must be entered."
> >         maximumLength="10"/>
> >
> >       <f:facet name="footer">
> >         <tr:panelButtonBar>
> >           <tr:commandButton id="saveCommand"
> >             text="#{pageFlowScope.widgetBean.operation}"
> >             action="#{pageFlowScope.widgetBean.commitAction }" />
> >           <tr:commandButton id="cancelCommand" text="Cancel"
> >             action="#{pageFlowScope.widgetBean.cancelAction}"
> >             immediate="true" />
> >         </tr:panelButtonBar>
> >       </f:facet>
> >     </tr:panelFormLayout>
> >   </tr:form>
> > </tr:document>
> >
> >
> > WidgetList.java (backing bean for the main page - manages the collection
> > of widgets)
> > ==========================================================
> > public class WidgetList
> > {
> >
> >
> >   public WidgetList()
> >   {
> >     _createInitialTestValues();
> >   }
> >
> >   public List<Widget> getWidgetList()
> >   {
> >     return _widgetBeans;
> >   }
> >
> >   public Widget getNewWidgetBean()
> >   {
> >     Widget widget = new Widget(this, "");
> >     widget.setOperation("create");
> >     return widget;
> >   }
> >
> >   private void _createInitialTestValues()
> >   {
> >     _widgetBeans.add(new Widget(this, "w1"));
> >     _widgetBeans.add(new Widget(this, "w2"));
> >     _widgetBeans.add(new Widget(this, "w3"));
> >   }
> >
> >   private List<Widget> _widgetBeans = new ArrayList<Widget>();
> > }
> >
> >
> > Widget.java (backing bean for the individual rows)
> > =================================
> >
> >
> > /**
> >  * Widget is a test bean
> >  */
> > public class Widget
> > {
> >   public Widget(WidgetList widgetList, String name)
> >   {
> >     _widgetList = widgetList;
> >     _name = name;
> >   }
> >
> >   public String getName()
> >   {
> >     return _name;
> >   }
> >   public void setName(String name)
> >   {
> >     _name = name;
> >   }
> >   public String getOperation()
> >   {
> >     return _operation;
> >   }
> >   public void setOperation(String operation)
> >   {
> >     assert(operation.equals("edit") || operation.equals("create") ||
> > operation.equals("delete"));
> >     _operation = operation;
> >   }
> >
> >   public String commitAction()
> >   {
> >     if (_operation.equals("create"))
> >     {
> >       _widgetList.getWidgetList().add(this);
> >     }
> >     if (_operation.equals("delete"))
> >     {
> >       _widgetList.getWidgetList().remove(this);
> >     }
> >     if (_operation.equals("edit"))
> >     {
> >       // no change to owning collection
> >     }
> >     TrinidadFacesUtils.endDialog(_widgetList);
> >
> >     return null;
> >   }
> >
> >   public String cancelAction()
> >   {
> >     TrinidadFacesUtils.endDialog(this);
> >
> >     return null;
> >   }
> >
> >   @Override
> >   public boolean equals(Object obj)
> >   {
> >     if (obj instanceof Widget)
> >     {
> >       Widget w = (Widget) obj;
> >       return _name.equals(w._name);
> >     }
> >     return false;
> >   }
> >
> >   @Override
> >   public int hashCode()
> >   {
> >     return _name.hashCode();
> >   }
> >
> >   @Override
> >   public String toString()
> >   {
> >     return _name;
> >   }
> >
> >   private String _name;
> >   private String _operation = "edit";
> >   private WidgetList _widgetList;
> > }
> >
> >
> >
> > ------------------------------
> > Do you know a place like the back of your hand? Share local knowledge
> > with BackOfMyHand.com <http://www.backofmyhand.com>
> >
> >
> > ------------------------------
> > Do you know a place like the back of your hand? Share local knowledge
> > with BackOfMyHand.com <http://www.backofmyhand.com>
> >
>
>

Re: [|Trinidad] RE: Problem auto-refreshing tables

Posted by venkata guddanti <ve...@gmail.com>.
I suspect that this may be due to the fact that when the last row is
deleted, the partial trigger may not longer valid during the rendering
phase. One workaround is that you programatically call addPartialTarget with
the table  in the  actionListener for the delete button.

Regards,
Venkata

On 10/11/07, Joe Rossi <je...@hotmail.co.uk> wrote:
>
> Any pointers on this one from the Trinidad experts? This is about to
> really start hitting my project deliverables :-(
>
> My gut feel is that it Trinidad is comparing old state to new state to
> work out whether or not to send a PPR update to the table and it's somehow
> failing if the last row is removed? If one of the Trinidad gurus points me
> in the right direction of the code I will debug into it.
>
> btw - it appears that the same problem occurs with removing the last row
> of a branch in a tree table.
>
>
>
> ------------------------------
> From: jeross@hotmail.co.uk
> To: users@myfaces.apache.org
> Subject: Problem auto-refreshing tables
> Date: Tue, 2 Oct 2007 18:39:34 +0000
>
>  I'm hitting a problem with auto-refreshing of tables using Trinidad 1.2.1,
> facelets and JSF 1.2 (Sun RI). I've condensed the scenario down to a small
> test case shown below. The summary is:
>
> - I have a page which displays a table containing a collection of objects
> - Each row of the table contains two command links - one to edit the row
> and another to delete the row
> - Both links pop-up a dialog with details of the row. Hitting the "save"
> button on the dialog will either save the edit changes (if invoked from the
> edit link) or delete the row (if invoked from the delete link).
> - The table has a partialTriggers attribute which attempts to refresh the
> table contents whenever a row is edited or deleted (i.e. partialTriggers
> contains the ids of the edit and delete links)
> - Everything appears to work fine apart from deletion of the last row in
> the table whereby the table does not automatically refresh.
>
> Is this a bug or am I doing something silly? Is there a better way to
> achieve what I'm trying to do?
>
> thanks in advance for any help.
>
> Here's the source code:
>
> widgetList.xhtml (page containing the table):
> =============================
> <!DOCTYPE html
> PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
> <tr:document id="testForm" title="test form"
>   xmlns:h="http://java.sun.com/jsf/html"
>   xmlns:f="http://java.sun.com/jsf/core"
>   xmlns:ui="http://java.sun.com/jsf/facelets"
>   xmlns:tr="http://myfaces.apache.org/trinidad">
>   <tr:panelBorderLayout>
>     <tr:form id="widgetListForm">
>       <tr:panelGroupLayout layout="vertical">
>         <tr:commandButton text="Create New Widget"
>           action="dialog:widgetDialog"
>           useWindow="true" partialSubmit="true"
>           windowHeight="300" windowWidth="400"
>           id="createWidgetCommand">
>           <tr:setActionListener from="#{widgetListBean.newWidgetBean}"
>             to="#{pageFlowScope.widgetBean}" />
>           <tr:setActionListener from="#{'create'}"
>             to="#{pageFlowScope.widgetBean.operation}" />
>         </tr:commandButton>
>
>         <tr:commandButton text="Refresh Page" id="refreshCommand">
>         </tr:commandButton>
>
>         <tr:table id="widgetTable" var="widgetBean"
>           value="#{widgetListBean.widgetList}" rowBandingInterval="1"
>           partialTriggers="refreshCommand createWidgetCommand
> widgetTable:editWidgetCommand widgetTable:deleteWidgetCommand">
>           <tr:column>
>             <f:facet name="header">
>               <tr:outputText value="Widget Name" />
>             </f:facet>
>             <tr:outputText value="#{widgetBean.name}" />
>           </tr:column>
>           <tr:column>
>             <f:facet name="header">
>               <tr:outputText value="Actions" />
>             </f:facet>
>             <tr:panelGroupLayout layout="horizontal">
>               <tr:commandLink action="dialog:widgetDialog"
>                 useWindow="true" partialSubmit="true"
>                 windowHeight="300" windowWidth="400"
>                 id="editWidgetCommand"
>                 shortDesc="Edit the widget.">
>                 <tr:image source="/skins/tn/images/ico_edit.gif" />
>                 <tr:setActionListener from="#{'edit'}"
>                   to="#{widgetBean.operation}" />
>                 <tr:setActionListener from="#{widgetBean}"
>                   to="#{pageFlowScope.widgetBean}" />
>               </tr:commandLink>
>               <tr:commandLink action="dialog:widgetDialog"
>                 useWindow="true" partialSubmit="true"
>                 windowHeight="300" windowWidth="400"
>                 id="deleteWidgetCommand"
>                 shortDesc="Delete the widget.">
>                 <tr:image source="/skins/tn/images/ico_delete.gif" />
>                 <tr:setActionListener from="#{'delete'}"
>                   to="#{widgetBean.operation}" />
>                 <tr:setActionListener from="#{widgetBean}"
>                   to="#{pageFlowScope.widgetBean}" />
>               </tr:commandLink>
>             </tr:panelGroupLayout>
>           </tr:column>
>         </tr:table>
>
>       </tr:panelGroupLayout>
>     </tr:form>
>
>   </tr:panelBorderLayout>
> </tr:document>
>
>
> widgetDialog.xhtml (the dialog that gets popped up when edit or delete is
> clicked):
> ==========================================================
> <!DOCTYPE html
> PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
> <tr:document id="testDialog" title="Dialog"
>   xmlns:h="http://java.sun.com/jsf/html"
>   xmlns:f="http://java.sun.com/jsf/core"
>   xmlns:ui="http://java.sun.com/jsf/facelets"
>   xmlns:tr="http://myfaces.apache.org/trinidad">
>   <tr:form id="widgetDialogForm">
>
>     <tr:panelFormLayout id="widgetDialogForm" inlineStyle="width:20%">
>       <tr:inputText label="Widget Code"
>         value="#{pageFlowScope.widgetBean.name}"
>         id="nameField" required="true" showRequired="true"
>         requiredMessageDetail="Widget name must be entered."
>         maximumLength="10"/>
>
>       <f:facet name="footer">
>         <tr:panelButtonBar>
>           <tr:commandButton id="saveCommand"
>             text="#{pageFlowScope.widgetBean.operation}"
>             action="#{pageFlowScope.widgetBean.commitAction}" />
>           <tr:commandButton id="cancelCommand" text="Cancel"
>             action="#{pageFlowScope.widgetBean.cancelAction}"
>             immediate="true" />
>         </tr:panelButtonBar>
>       </f:facet>
>     </tr:panelFormLayout>
>   </tr:form>
> </tr:document>
>
>
> WidgetList.java (backing bean for the main page - manages the collection
> of widgets)
> ==========================================================
> public class WidgetList
> {
>
>
>   public WidgetList()
>   {
>     _createInitialTestValues();
>   }
>
>   public List<Widget> getWidgetList()
>   {
>     return _widgetBeans;
>   }
>
>   public Widget getNewWidgetBean()
>   {
>     Widget widget = new Widget(this, "");
>     widget.setOperation("create");
>     return widget;
>   }
>
>   private void _createInitialTestValues()
>   {
>     _widgetBeans.add(new Widget(this, "w1"));
>     _widgetBeans.add(new Widget(this, "w2"));
>     _widgetBeans.add(new Widget(this, "w3"));
>   }
>
>   private List<Widget> _widgetBeans = new ArrayList<Widget>();
> }
>
>
> Widget.java (backing bean for the individual rows)
> =================================
>
>
> /**
>  * Widget is a test bean
>  */
> public class Widget
> {
>   public Widget(WidgetList widgetList, String name)
>   {
>     _widgetList = widgetList;
>     _name = name;
>   }
>
>   public String getName()
>   {
>     return _name;
>   }
>   public void setName(String name)
>   {
>     _name = name;
>   }
>   public String getOperation()
>   {
>     return _operation;
>   }
>   public void setOperation(String operation)
>   {
>     assert(operation.equals("edit") || operation.equals("create") ||
> operation.equals("delete"));
>     _operation = operation;
>   }
>
>   public String commitAction()
>   {
>     if (_operation.equals("create"))
>     {
>       _widgetList.getWidgetList().add(this);
>     }
>     if (_operation.equals("delete"))
>     {
>       _widgetList.getWidgetList().remove(this);
>     }
>     if (_operation.equals("edit"))
>     {
>       // no change to owning collection
>     }
>     TrinidadFacesUtils.endDialog(_widgetList);
>
>     return null;
>   }
>
>   public String cancelAction()
>   {
>     TrinidadFacesUtils.endDialog(this);
>
>     return null;
>   }
>
>   @Override
>   public boolean equals(Object obj)
>   {
>     if (obj instanceof Widget)
>     {
>       Widget w = (Widget) obj;
>       return _name.equals(w._name);
>     }
>     return false;
>   }
>
>   @Override
>   public int hashCode()
>   {
>     return _name.hashCode();
>   }
>
>   @Override
>   public String toString()
>   {
>     return _name;
>   }
>
>   private String _name;
>   private String _operation = "edit";
>   private WidgetList _widgetList;
> }
>
>
>
> ------------------------------
> Do you know a place like the back of your hand? Share local knowledge with
> BackOfMyHand.com <http://www.backofmyhand.com>
>
>
> ------------------------------
> Do you know a place like the back of your hand? Share local knowledge with
> BackOfMyHand.com <http://www.backofmyhand.com>
>