a4j:command button: backing bean property not updated in modalpanel
cazfr Dec 29, 2010 2:39 AMHi,
I have a page with rich:datatable, with on each row a button to edit current row. The idea is that when user click, a modalpopup appears to let user change values and ercord them in backing bean. Everything works fine when I post from a simple panel, but when i put the code in a modal panel, the backing bean properties are not updated.
Can someone help ?
Here's the page
<?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">
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<style>
.active-row {
background-color: #FFEBDA;
}
</style>
<script type="text/javascript">
var row;
</script>
<rich:message/>
<rich:panel id="tablePanel">
<h:form>
<rich:dataTable
value="#{MainBean.users}"
onRowMouseOver="this.style.backgroundColor='#B5CEFD'"
onRowMouseOut="this.style.backgroundColor='#{org.richfaces.SKIN.tableBackgroundColor}'"
onRowClick="this.style.backgroundColor='#F1F1F1'"
var="user" rows="20" rowKeyVar="row"
id="table"
>
<f:facet name="header">
<h:outputText value="Utilisateurs" />
</f:facet>
<rich:column>
<f:facet name="header">
<h:outputText value="login" />
</f:facet>
<h:outputText value="#{user.email}" id="login" />
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="Prénom" />
</f:facet>
<h:outputText value="#{user.firstname}" id="firstname" />
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="Nom" />
</f:facet>
<h:outputText value="#{user.lastname}" id="lastname" />
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="Admin." />
</f:facet>
<h:outputText value="#{user.admin}" id="admin"/>
</rich:column>
<rich:column>
<f:facet name="header">
Actions
</f:facet>
<a4j:commandLink
id="editlink"
ajaxSingle="true"
action="#{MainBean.setEditMode}"
oncomplete="#{rich:component('editCreateUser')}.show()"
reRender="editCreateUserForm" >
<h:graphicImage style="border:0;" url="/images/icons/edit.gif" />
</a4j:commandLink>
<rich:toolTip for="editlink" value="Edit" />
</rich:column>
<f:facet name="footer">
<rich:datascroller renderIfSinglePage="false" maxPages="5" />
</f:facet>
</rich:dataTable>
</h:form>
<a4j:commandButton id="newbtn"
reRender="editCreateUserForm"
value="Nouveau"
ajaxSingle="true"
oncomplete="#{rich:component('editCreateUser')}.show()"
action="#{MainBean.setInsertMode}" style="width:85px" />
</rich:panel>
<rich:modalPanel id="editCreateUser">
<f:facet name="header">Informations générales</f:facet>
<a4j:form id="editCreateUserForm" >
<a4j:region>
<h:panelGrid columns="2" width="350" >
<h:outputText value="Login" />
<h:inputText value="#{MainBean.selectedUser.email}" disabled="#{MainBean.editMode}"/>
<h:outputText value="Prénom" />
<h:inputText value="#{MainBean.selectedUser.firstname}" />
<h:outputText value="Nom" />
<h:inputText value="#{MainBean.selectedUser.lastname}" />
<h:outputText value="Admin" />
<h:selectBooleanCheckbox value="#{MainBean.selectedUser.admin}" />
</h:panelGrid>
<h:panelGrid id="crud_panel" columns="3">
<a4j:commandButton id="validbtn"
disabled="#{MainBean.editMode}" ajaxSingle="true" reRender="tablePanel,editCreateUserForm" value="Créer"
actionListener="#{MainBean.storeUser}" style="width:85px"/>
<a4j:commandButton id="editbtn"
disabled="#{!MainBean.editMode}" ajaxSingle="true" reRender="tablePanel,editCreateUserForm,editbtn" value="Modifier"
actionListener="#{MainBean.editUser}" style="width:85px"/>
<rich:componentControl for="editCreateUser" attachTo="validbtn,editbtn" operation="hide" event="onclick"/>
</h:panelGrid>
</a4j:region>
</a4j:form>
</rich:modalPanel>
</ui:composition>
And the backing bean:
@ManagedBean(name="MainBean")
@SessionScoped
public class MainBean {
private User currentUser;
private boolean init;
//private List<User> users;
@ManagedProperty(value="#{userService}")
private UserService service;
private User selectedUser;
private DataModel<User> userDataModel;
private boolean editMode;
public User getCurrentUser() {
return currentUser;
}
public void setCurrentUser(User currentUser) {
this.currentUser = currentUser;
}
public UserService getService() {
return service;
}
public void setService(UserService service) {
this.service = service;
}
public User getSelectedUser() {
return selectedUser;
}
public void setSelectedUser(User selectedUser) {
this.selectedUser = selectedUser;
}
public DataModel<User> getDataModel() {
return userDataModel;
}
public void setDataModel(DataModel<User> dataModel) {
this.userDataModel = dataModel;
}
public boolean getEditMode() {
return editMode;
}
public void setEditMode() {
this.selectedUser = (User) userDataModel.getRowData();
editMode = true;
}
public MainBean() {
HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
currentUser = (User) session.getAttribute("currentUser");
setInsertMode();
init = false;
}
private void updateDataModel() {
userDataModel = new ListDataModel<User>();
List<User> users = service.getUserDao().getAll();
userDataModel.setWrappedData(users);
}
public DataModel<User> getUsers() {
if (!init) {
updateDataModel();
init = true;
}
return userDataModel;
}
public void editUser() {
service.updateUser(selectedUser);
}
public void storeUser() {
service.createUser(
selectedUser.getEmail(),
selectedUser.getPassword(),
selectedUser.getFirstname(),
selectedUser.getLastname(),
selectedUser.isAdmin()
);
updateDataModel();
}
public void setInsertMode(){
this.selectedUser = new User();
editMode = false;
}
}
Thanks !