[richfaces-issues] [JBoss JIRA] Created: (RF-11410) CommandButton in ExtentedDataTable
Florian Schoedel (JIRA)
jira-events at lists.jboss.org
Sat Sep 17 16:35:26 EDT 2011
CommandButton in ExtentedDataTable
----------------------------------
Key: RF-11410
URL: https://issues.jboss.org/browse/RF-11410
Project: RichFaces
Issue Type: Bug
Security Level: Public (Everyone can see)
Components: component
Affects Versions: 4.0.0.Final
Environment: java 1.6.0_26
glassfish 3.1
Mojarra 2.1.0 (FCS 2.1.0-b11)
Seam Faces 3.0.1.Final
Reporter: Florian Schoedel
I've created a composite component which contains two richfaces extented data tables. Each Datatable contains a column for a button to perform an action. (in the left datatable there is an 'add' button, on the right datatable a 'remove' button). Everything works fine until I try to attach a client behavior to the add / remove btns. I want to monitor my component for selection and removal of any value from the calling page.
The client behavior is triggered as expected, but the method behind the add and remove btns is executed twice! This also happens which actionListener attribute instead of action attribute.
I've replaced richfaces ext. DataTable by h:dataTable and everything works fine.
Here is the xml of my composite component:
-----
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:r="http://richfaces.org/rich"
xmlns:a="http://richfaces.org/a4j"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
xmlns:o="http://java.sun.com/jsf/composite/ezcomp"
xmlns:cc="http://java.sun.com/jsf/composite" >
<!-- INTERFACE -->
<cc:interface componentType="MultiplePersonSelectionComponent">
<cc:attribute name="all" type="java.util.List" />
<cc:attribute name="selection" type="java.util.List" />
<cc:clientBehavior name="addPerson" event="action" targets="allPersonTable:addBtn" />
<cc:clientBehavior name="removePerson" event="action" targets="selectedPersonTable:removeBtn" />
<cc:attribute name="refresh" type="java.lang.String" default=""/>
</cc:interface>
<!-- IMPLEMENTATION -->
<cc:implementation>
<div id="#{cc.clientId}" style="width: 100%">
<h:panelGrid columns="2" width="100%" columnClasses="pnlTop, pnlTop">
<r:panel header="Alle Personen" id="all" style="text-align: center;">
<r:extendedDataTable
value="#{cc.attrs.all}"
var="p"
id="allPersonTable"
selectionMode="none"
rows="10"
>
<f:facet name="header">
<r:dataScroller for="allPersonTable" maxPages="5" id="dataScrollerTop" />
</f:facet>
<f:facet name="footer">
<r:dataScroller for="allPersonTable" maxPages="5" id="dataScrollerBottom"/>
</f:facet>
<r:column
filterExpression="#{fn:containsIgnoreCase(p.firstName,cc.allFirstName)}"
sortBy="#{p.firstName}"
sortOrder="#{cc.allFirstNameSortOrder}"
>
<f:facet name="header">
<h:panelGrid columns="1" style="width:100%;" columnClasses="colTop">
<h:commandLink action="#{cc.sortAllByFirstName}" >
<a:ajax render="allPersonTable at body" />
<h:outputText value="Vorname" />
</h:commandLink>
<h:inputText value="#{cc.allFirstName}"
id="firstnameFilter"
style="width: 75px;"
>
<a:ajax event="keyup"
render="allPersonTable at body "
execute="@this"
/>
<a:ajax event="blur"
render="dataScrollerTop dataScrollerBottom"
execute="@this"
/>
</h:inputText>
</h:panelGrid>
</f:facet>
<h:outputText value="#{p.firstName}" />
</r:column>
<r:column
filterExpression="#{fn:containsIgnoreCase(p.lastName,cc.allLastName)}"
sortBy="#{p.lastName}"
sortOrder="#{cc.allLastNameSortOrder}">
<f:facet name="header">
<h:panelGrid columns="1"
style="width: 100%;"
columnClasses="colTop">
<h:commandLink action="#{cc.sortAllByLastName}" >
<a:ajax render="allPersonTable at body" />
<h:outputText value="Nachname" />
</h:commandLink>
<h:inputText value="#{cc.allLastName}"
id="lastnameFilter"
style="width:75px;"
>
<a:ajax event="keyup"
render="allPersonTable at body "
execute="@this"
/>
</h:inputText>
</h:panelGrid>
</f:facet>
<h:outputText value="#{p.lastName}" />
</r:column>
<r:column>
<f:facet name="header">
<h:outputText value="Auswahl" />
</f:facet>
<h:panelGroup id="addBtnGroup">
<h:commandButton value="add"
action="#{cc.add(p)}"
disabled="#{cc.attrs.selection.contains(p)}"
id="addBtn" >
<f:ajax event="action"
render=":#{cc.clientId}:selectedPersonTable @this #{cc.attrs.refresh}"
/>
</h:commandButton>
</h:panelGroup>
</r:column>
</r:extendedDataTable>
</r:panel>
<r:panel header="Auswahl" id="selection" style="text-align: center;">
<r:extendedDataTable
value="#{cc.attrs.selection}"
var="p" id="selectedPersonTable"
rows="10" style="width: 100%"
selectionMode="none">
<f:facet name="header">
<r:dataScroller for="selectedPersonTable" id="selectedDataScrollerTop" maxPages="5" />
</f:facet>
<f:facet name="footer">
<r:dataScroller for="selectedPersonTable" id="selectedDataScrollerBottom" maxPages="5" />
</f:facet>
<r:column
filterExpression="#{fn:containsIgnoreCase(p.firstName,cc.selectedFirstName)}"
sortBy="#{p.firstName}"
sortOrder="#{cc.selectedFirstNameSortOrder}"
>
<f:facet name="header">
<h:panelGrid columns="1" style="width:100%;" columnClasses="colTop">
<h:commandLink action="#{cc.sortSelectedByFirstName}" >
<a:ajax render="selectedPersonTable at body" />
<h:outputText value="Vorname" />
</h:commandLink>
<h:inputText value="#{cc.selectedFirstName}"
id="firstnameFilter"
style="width: 75px;"
>
<a:ajax event="keyup"
render="selectedPersonTable at body "
execute="@this"
/>
<a:ajax event="blur"
render="selectedDataScrollerTop selectedDataScrollerBottom"
execute="@this"
/>
</h:inputText>
</h:panelGrid>
</f:facet>
<h:outputText value="#{p.firstName}" />
</r:column>
<r:column
filterExpression="#{fn:containsIgnoreCase(p.lastName,cc.selectedLastName)}"
sortBy="#{p.lastName}"
sortOrder="#{cc.selectedLastNameSortOrder}">
<f:facet name="header">
<h:panelGrid columns="1"
style="width: 100%;"
columnClasses="colTop">
<h:commandLink action="#{cc.sortSelectedByLastName}" >
<a:ajax render="selectedPersonTable at body" />
<h:outputText value="Nachname" />
</h:commandLink>
<h:inputText value="#{cc.selectedLastName}"
id="lastnameFilter"
style="width:75px;"
>
<a:ajax event="keyup"
render="selectedPersonTable at body "
execute="@this"
/>
</h:inputText>
</h:panelGrid>
</f:facet>
<h:outputText value="#{p.lastName}" />
</r:column>
<r:column>
<f:facet name="header">
<h:outputText value="" />
</f:facet>
<h:panelGroup id="removeBtnGroup">
<h:commandButton value="remove"
action="#{cc.remove(p)}"
id="removeBtn" >
<f:ajax event="action"
render=":#{cc.clientId}:allPersonTable :#{cc.clientId}:selectedPersonTable #{cc.attrs.refresh}"
/>
</h:commandButton>
</h:panelGroup>
</r:column>
</r:extendedDataTable >
</r:panel>
</h:panelGrid>
</div>
</cc:implementation>
</html>
-----
And there's the place I use it:
-----
<o:MultiplePersonSelection all="#{ivb.persons}" selection="#{ivb.selection}"
refresh="">
<f:ajax event="addPerson" render=":myForm:listing" />
<f:ajax event="removePerson" render=":myForm:listing" />
</o:MultiplePersonSelection>
<h:panelGroup id="listing">
<h:dataTable value="#{ivb.selection}" var="p" id="liste">
<h:column>
#{p.firstName}
</h:column>
<h:column>
#{p.lastName}
</h:column>
</h:dataTable>
</h:panelGroup>
----
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the richfaces-issues
mailing list