jsf dialog still updates backing bean on cancel or close

UI Components for JSF
jjpclev
Posts: 100
Joined: 12 Jan 2011, 15:28
Location: United States - Cleveland, Ohio

25 Mar 2011, 17:45

I have the following xhtml (sorry, this may seem like a pretty big code snippet to post), where I have a datatable with an options column (view, edit, delete, enable, disable). when I click one of the various option links, I get the cooresponding dialog box. Each dialog has a cancel button ( 'no', 'cancel', or 'close' ). say I click on the 'edit' link, I get the viewEditDialog to popup. If I modify the data in one of the output text fields, but then click the 'cancel' button, I would expect no call to the backing bean. But there is actually a call to the backing bean to update the selectedUser object. I would think that I would want to prevent this, as the next time the user clicks on the a link the 'updated' value show..even though I didn't really 'update' anything. can I get your thoughts on this? thank you....

have a nice day....
Jim

Code: Select all

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
	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:p="http://primefaces.prime.com.tr/ui"
	xmlns:fn="http://java.sun.com/jsp/jstl/functions">
		
<p:focus /> 
		
<h:form prependId="false">

	<p:fieldset legend="Search Users" toggleable="true">
		<h:panelGrid columns="3">
			<h:outputText value="UserName: " />
			<h:inputText value="#{manageUsers.login}" />
			<p:commandButton value="Search" actionListener="#{manageUsers.search}" async="true" update="users"/>
		</h:panelGrid>
	</p:fieldset>  

 	<p:messages id="manageMsgs" display="text"/>
 	
 	<p:ajaxStatus style="width:16px;height:16px;">
                    <f:facet name="start">
                        <h:graphicImage value="../design/ajaxloading.gif" />
                    </f:facet>

                    <f:facet name="complete">
                        <h:outputText value="" />
                    </f:facet>
                </p:ajaxStatus>
 	
    <p:dataTable id="users" var="user" value="#{manageUsers.users}" paginator="true" rows="10" effect="true"  
    			 paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"  
				 rowsPerPageTemplate="2,3,10" emptyMessage="No Users found with given criteria">

  		<f:facet name="header">Users</f:facet>    		 

        <p:column sortBy="#{user.login}" style="width:150px" headerText="UserName" footerText="UserName" filterMatchMode="contains">
            <h:outputText value="#{user.login}" />
        </p:column>

        <p:column sortBy="#{user.firstName}" style="width:150px" headerText="First Name" footerText="First Name" filterMatchMode="contains">
            <h:outputText value="#{user.firstName}" />
        </p:column>

        <p:column sortBy="#{user.lastName}" style="width:150px" headerText="Last Name" footerText="Last Name" filterMatchMode="contains">
            <h:outputText value="#{user.lastName}" />
        </p:column>
        
         <p:column sortBy="#{user.agencyId}" style="width:150px" headerText="Agency" footerText="Agency" filterMatchMode="contains">
             <h:outputText value="#{user.agencyId}" />
        </p:column>
        
        <p:column sortBy="#{user.status}" headerText="Status" footerText="Status" 
        	filterOptions="#{manageUsers.userStatusOptions}" filterMatchMode="exact">        
            <h:outputText value="#{user.status}" />
        </p:column>        

        <p:column style="width:300px" headerText="Actions" footerText="Actions">
        	<p:outputPanel>                 
                <p:commandLink update="users manageMsgs userDetailPanel" oncomplete="viewEditDialog.show()" value="view">
					<f:setPropertyActionListener value="#{user}" target="#{manageUsers.selectedUser}" />
                    
                    <f:setPropertyActionListener value="false" target="#{manageUsers.editMode}" />
                    <f:setPropertyActionListener value="true" target="#{manageUsers.viewMode}" />
                    
                </p:commandLink>                 
                <p:outputPanel rendered="#{p:ifGranted('ROLE_ADMIN')}">
					<h:outputText value="&#160;" />                 
	                <p:commandLink update="users manageMsgs userDetailPanel" oncomplete="viewEditDialog.show()" value="edit" rendered="#{user.status != 'User_Deleted'}">
	                	<f:setPropertyActionListener value="#{user}" target="#{manageUsers.selectedUser}" />
                    <f:setPropertyActionListener value="true" target="#{manageUsers.editMode}" />
                    <f:setPropertyActionListener value="false" target="#{manageUsers.viewMode}" />

	                </p:commandLink>
	                <h:outputText value="&#160;" />
	                <p:commandLink update="users manageMsgs userDeletePanel" immediate="true" oncomplete="deleteConfirm.show()" value="delete" rendered="#{user.status != 'User_Deleted'}">
	                	<f:setPropertyActionListener value="#{user}" target="#{manageUsers.selectedUser}" />
	                </p:commandLink>
					<h:outputText value="&#160;" />						 
					<p:commandLink update="users manageMsgs userDisablePanel" oncomplete="disableConfirm.show()" value="disable" rendered="#{user.status == 'User_Enabled'}">
	                    <f:setPropertyActionListener value="#{user}" target="#{manageUsers.selectedUser}" />
	                </p:commandLink>		                 
	                <p:commandLink update="users manageMsgs userEnablePanel" oncomplete="enableConfirm.show()" value="enable" rendered="#{user.status == 'User_Disabled'}">
	                	<f:setPropertyActionListener value="#{user}" target="#{manageUsers.selectedUser}" />
	                </p:commandLink>                 
                 </p:outputPanel>
        	</p:outputPanel>
        </p:column>
    </p:dataTable>

    <p:dialog header="User Detail" widgetVar="viewEditDialog" width="300" showEffect="explode" hideEffect="explode">
        <h:panelGrid id="userDetailPanel" columns="2" cellpadding="4">
        	<h:outputText value="User Login" />
    		<h:panelGroup>
    			<h:outputText value="#{manageUsers.selectedUser.login}" rendered="#{manageUsers.viewMode}"/>
			    <h:inputText value="#{manageUsers.selectedUser.login}" rendered="#{manageUsers.editMode}"/>
			</h:panelGroup>
			
			<h:outputText value="First Name" />
    		<h:panelGroup> 
    			<h:outputText value="#{manageUsers.selectedUser.firstName}" rendered="#{manageUsers.viewMode}"/>
			    <h:inputText value="#{manageUsers.selectedUser.firstName}" rendered="#{manageUsers.editMode}"/>
			</h:panelGroup>
	
			<p:commandButton value="Update" update="users manageMsgs" actionListener="#{manageUsers.edit}" oncomplete="viewEditDialog.hide();"  rendered="#{manageUsers.editMode}"/>
	        <p:commandButton value="Cancel" oncomplete="viewEditDialog.hide();" rendered="#{manageUsers.editMode}"/>
	   
			
		</h:panelGrid>  

	   		<p:commandButton value="Close" oncomplete="viewEditDialog.hide();" rendered="#{manageUsers.viewMode}"/>
			           
    </p:dialog>
  
    <p:outputPanel id="userDeletePanel">
    <p:confirmDialog message="Are you sure you want to delete #{manageUsers.selectedUser.login}?" showEffect="explode" hideEffect="explode" header="Delete Confirmation" severity="alert" widgetVar="deleteConfirm">
        <p:commandButton value="Yes" update="users manageMsgs" actionListener="#{manageUsers.delete}" oncomplete="deleteConfirm.hide()"/>
        <p:commandButton value="No" onclick="deleteConfirm.hide()" type="button" />
    </p:confirmDialog>
    </p:outputPanel> 

    <p:outputPanel id="userDisablePanel">
	<p:confirmDialog message="Are you sure you want to disable #{manageUsers.selectedUser.login}?" showEffect="explode" hideEffect="explode" header="Disable Confirmation" severity="alert" widgetVar="disableConfirm">
        <p:commandButton value="Yes" update="users manageMsgs" actionListener="#{manageUsers.disable}" oncomplete="disableConfirm.hide()"/>
        <p:commandButton value="No" onclick="disableConfirm.hide()" type="button" />
    </p:confirmDialog>
    </p:outputPanel>

	<p:outputPanel id="userEnablePanel">
	<p:confirmDialog message="Are you sure you want to enable #{manageUsers.selectedUser.login}?" showEffect="explode" hideEffect="explode" header="Enable Confirmation" severity="alert" widgetVar="enableConfirm">
        <p:commandButton value="Yes" update="users manageMsgs" actionListener="#{manageUsers.enable}" oncomplete="disableConfirm.hide()"/>
        <p:commandButton value="No" onclick="enableConfirm.hide()" type="button" />
    </p:confirmDialog>
    </p:outputPanel>

</h:form>
</ui:composition>

JSF2 - weblogic 10.3.4 - primefaces-3.0-SNAPSHOT - MyEclipse 8.6.1

cagatay.civici
Prime
Posts: 18616
Joined: 05 Jan 2009, 00:21
Location: Cybertron
Contact:

28 Mar 2011, 09:09

Type of cancel button should be "button" so it does not submit the form. If you want to submit form, call the actionListener of cancel but don't want form parameters to be processed, just set process="@this" on button so only actionListener(if defined) of button is executed by JSF. Form fields will be ignored so there are two ways to solve this. I usually set type to button if I don't need to submit the form. Example;

http://www.primefaces.org/showcase-labs ... Dialog.jsf

jjpclev
Posts: 100
Joined: 12 Jan 2011, 15:28
Location: United States - Cleveland, Ohio

28 Mar 2011, 15:47

still having wierd issues with datatable and action links. I tried adding type=buton to my commandbuttons (cancel & close) in my widgetVar="viewEditDialog", but then the dialog box doesn't close ( the oncomplete="viewEditDialog.hide();" doesn't seem to fire) . but my bigger issue is with the delete action. here is my scenario, hopefully this will make sense, and you can provide some direction for me.

each row in the datatable presents several action links ( view, edit, delete, disable, enable ). I am having problem with the edit link. when I click on the edit link, it pops up the viewEditDialog. if I edit a field and then click update, it will correctly update the database and the ui datatable. if I then try to perform a different action on a different row, say that I want to do a 'disable' action on a different row. when I click the link to disable, the 'selectedUser' property in the backing bean is correctly set. A confirm dialog pops up asking the use to confirm the 'disable' action. If I click yes, the actionlistener method is correctly invoked. here is the issue, when I check the selecteduser property during this method, it is still pointing to row that I edited previously, not the current row that I am trying to disable. I have included both my xhtml and backing bean. I sincerely hope this a straightforward and easy fix to find.

xhtml

Code: Select all

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
	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:p="http://primefaces.prime.com.tr/ui"
	xmlns:fn="http://java.sun.com/jsp/jstl/functions">
		
<p:focus /> 
		
<h:form prependId="false">

	<p:fieldset legend="Search Users" toggleable="true">
		<h:panelGrid columns="3">
			<h:outputText value="UserName: " />
			<h:inputText value="#{manageUsers.login}" />
			<p:commandButton value="Search" actionListener="#{manageUsers.search}" async="true" update="users"/>
		</h:panelGrid>
	</p:fieldset>  

 	<p:messages id="manageMsgs" display="text"/>
 	
 	<p:ajaxStatus style="width:16px;height:16px;">
                    <f:facet name="start">
                        <h:graphicImage value="../design/ajaxloading.gif" />
                    </f:facet>

                    <f:facet name="complete">
                        <h:outputText value="" />
                    </f:facet>
                </p:ajaxStatus>
 	
    <p:dataTable id="users" var="user" value="#{manageUsers.users}" paginator="true" rows="10" effect="true"  
    			 paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"  
				 rowsPerPageTemplate="2,3,10" emptyMessage="No Users found with given criteria">

  		<f:facet name="header">Users</f:facet>    		 

        <p:column sortBy="#{user.login}" style="width:150px" headerText="UserName" footerText="UserName" filterMatchMode="contains">
            <h:outputText value="#{user.login}" />
        </p:column>

        <p:column sortBy="#{user.firstName}" style="width:150px" headerText="First Name" footerText="First Name" filterMatchMode="contains">
            <h:outputText value="#{user.firstName}" />
        </p:column>

        <p:column sortBy="#{user.lastName}" style="width:150px" headerText="Last Name" footerText="Last Name" filterMatchMode="contains">
            <h:outputText value="#{user.lastName}" />
        </p:column>
        
         <p:column sortBy="#{user.agencyId}" style="width:150px" headerText="Agency" footerText="Agency" filterMatchMode="contains">
             <h:outputText value="#{user.agencyId}" />
        </p:column>
        
        <p:column sortBy="#{user.status}" headerText="Status" footerText="Status" 
        	filterOptions="#{manageUsers.userStatusOptions}" filterMatchMode="exact">        
            <h:outputText value="#{user.status}" />
        </p:column>        

        <p:column style="width:300px" headerText="Actions" footerText="Actions">
        	<p:outputPanel>                 
                <p:commandLink update="users manageMsgs userDetailPanel" oncomplete="viewEditDialog.show()" value="view">
					<f:setPropertyActionListener value="#{user}" target="#{manageUsers.selectedUser}" />
                    
                    <f:setPropertyActionListener value="false" target="#{manageUsers.editMode}" />
                    <f:setPropertyActionListener value="true" target="#{manageUsers.viewMode}" />
                    
                </p:commandLink>                 
                <p:outputPanel rendered="#{p:ifGranted('ROLE_ADMIN')}">
					<h:outputText value="&#160;" />                 
	                <p:commandLink update="users manageMsgs userDetailPanel"  oncomplete="viewEditDialog.show()" value="edit" rendered="#{user.status != 'User_Deleted'}">
	                	<f:setPropertyActionListener value="#{user}" target="#{manageUsers.selectedUser}" />
                    <f:setPropertyActionListener value="true" target="#{manageUsers.editMode}" />
                    <f:setPropertyActionListener value="false" target="#{manageUsers.viewMode}" />

	                </p:commandLink>
	                <h:outputText value="&#160;" />
	                <p:commandLink update="users manageMsgs userDeletePanel"  oncomplete="deleteConfirm.show()" value="delete" rendered="#{user.status != 'User_Deleted'}">
	                	<f:setPropertyActionListener value="#{user}" target="#{manageUsers.selectedUser}" />
	                </p:commandLink>
					<h:outputText value="&#160;" />						 
					<p:commandLink update="users manageMsgs userDisablePanel" oncomplete="disableConfirm.show()" value="disable" rendered="#{user.status != 'User_Disabled'}">
	                    <f:setPropertyActionListener value="#{user}" target="#{manageUsers.selectedUser}" />
	                </p:commandLink>		                 
	                <p:commandLink update="users manageMsgs userEnablePanel" oncomplete="enableConfirm.show()" value="enable" rendered="#{user.status == 'User_Disabled'}">
	                	<f:setPropertyActionListener value="#{user}" target="#{manageUsers.selectedUser}" />
	                </p:commandLink>                 
                 </p:outputPanel>
        	</p:outputPanel>
        </p:column>
    </p:dataTable>

    <p:dialog header="User Detail" widgetVar="viewEditDialog" width="300" showEffect="explode" hideEffect="explode">
        <h:panelGrid id="userDetailPanel" columns="2" cellpadding="4">
        	<h:outputText value="User Login" />
    		<h:panelGroup>
    			<h:outputText value="#{manageUsers.selectedUser.login}" rendered="#{manageUsers.viewMode}"/>
			    <h:inputText value="#{manageUsers.selectedUser.login}" rendered="#{manageUsers.editMode}"/>
			</h:panelGroup>
			
			<h:outputText value="First Name" />
    		<h:panelGroup> 
    			<h:outputText value="#{manageUsers.selectedUser.firstName}" rendered="#{manageUsers.viewMode}"/>
			    <h:inputText value="#{manageUsers.selectedUser.firstName}" rendered="#{manageUsers.editMode}"/>
			</h:panelGroup>
	
			<p:commandButton value="Update"  update="users manageMsgs" actionListener="#{manageUsers.edit}" oncomplete="viewEditDialog.hide();"  rendered="#{manageUsers.editMode}"/>
	        <p:commandButton value="Cancel"  oncomplete="viewEditDialog.hide();" rendered="#{manageUsers.editMode}"/>	   
	   		<p:commandButton value="Close"  oncomplete="viewEditDialog.hide();" rendered="#{manageUsers.viewMode}"/>
	   		
		</h:panelGrid>  

			           
    </p:dialog>
  
    <p:outputPanel id="userDeletePanel">
    <p:confirmDialog message="Are you sure you want to delete #{manageUsers.selectedUser.login}?" showEffect="explode" hideEffect="explode" header="Delete Confirmation" severity="alert" widgetVar="deleteConfirm">
        <p:commandButton value="Yes" update="users manageMsgs" actionListener="#{manageUsers.delete}" oncomplete="deleteConfirm.hide()"/>
        <p:commandButton value="No" onclick="deleteConfirm.hide()" type="button"/>
    </p:confirmDialog>
    </p:outputPanel> 

    <p:outputPanel id="userDisablePanel">
	<p:confirmDialog message="Are you sure you want to disable #{manageUsers.selectedUser.login}?" showEffect="explode" hideEffect="explode" header="Disable Confirmation" severity="alert" widgetVar="disableConfirm">
        <p:commandButton value="Yes" update="users manageMsgs" actionListener="#{manageUsers.disable}" oncomplete="disableConfirm.hide()"/>
        <p:commandButton value="No" onclick="disableConfirm.hide()" type="button"/>
    </p:confirmDialog>
    </p:outputPanel>

	<p:outputPanel id="userEnablePanel">
	<p:confirmDialog message="Are you sure you want to enable #{manageUsers.selectedUser.login}?" showEffect="explode" hideEffect="explode" header="Enable Confirmation" severity="alert" widgetVar="enableConfirm">
        <p:commandButton value="Yes" update="users manageMsgs" actionListener="#{manageUsers.enable}" oncomplete="disableConfirm.hide()"/>
        <p:commandButton value="No" onclick="enableConfirm.hide()" type="button"/>
    </p:confirmDialog>
    </p:outputPanel>

</h:form>
</ui:composition>
backing bean

Code: Select all

package gov.treas.fms.pups.view;

import gov.treas.fms.pups.defines.Status;
import gov.treas.fms.pups.domain.User;
import gov.treas.fms.pups.service.UserService;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import org.apache.log4j.Logger;
import org.primefaces.event.TabChangeEvent;
import org.primefaces.event.UnselectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import com.lowagie.text.pdf.hyphenation.TernaryTree.Iterator;

@Component("manageUsers")
@Scope("session")
public class ManageUsers implements Serializable{

	private static final long serialVersionUID = 8482847001201927154L;

	private static Logger logger = Logger.getLogger(CreateUser.class);
	
	private List<User> users;
	
	private UserService userService;
	
	private String login;
	
	private User selectedUser;
	
	private boolean viewMode;
	private boolean editMode;
	//private String mode;
	
	public ManageUsers() {}
	
	private SelectItem[] userStatusOptions;
	
	public SelectItem[] getUserStatusOptions() {
		return userStatusOptions;
	}

	public void setUserStatusOptions(SelectItem[] userStatusOptions) {
		this.userStatusOptions = userStatusOptions;
	}

	@Autowired
	public ManageUsers(UserService userService) {
		
		this.userService = userService;		
		userStatusOptions = createFilterOptions(Status.statusesArray);
		
	}

	public List<User> getUsers() {
		return users;
	}
	public void setUsers(List<User> users) {
		this.users = users;
	}
	
	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public User getSelectedUser() {
		return selectedUser;
	}

	public void setSelectedUser(User selectedUser) {
		
		try {
			System.out.println("selected user: " + selectedUser.getLogin());
			System.out.println("editmode=" + this.getEditMode());
			System.out.println("viewmode=" + this.getViewMode());
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		this.selectedUser = selectedUser;
	}

	public List<String> getUsersByLogin(String login) {
		
		long start = System.currentTimeMillis();
		List<User> foundUsers = userService.findByLogin(login);
		System.out.println("query took " + (System.currentTimeMillis()-start) + " ms.");
		List<String> users = new ArrayList<String>();
	
		for(User m : foundUsers)
			users.add(m.getLogin());
		
		return users;
	}
		
	public void search(ActionEvent actionEvent) {
		
		long start = System.currentTimeMillis();
		users = userService.findByLogin(login);
		System.out.println("query took " + (System.currentTimeMillis()-start) + " ms.");
		
	}

	public void delete() {  
		
		userService.delete(selectedUser);
		String msg = "Successfully deleted " + selectedUser.getLogin();
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "summary: " + msg, "detail: " + msg));  
		
	}  

	public void realDelete() {  
		
		//userService.delete(selectedUser);
		//users.remove(selectedUser);
		//String msg = "Successfully removed " + selectedUser.getLogin() + " from database";
		//FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "summary: " + msg, "detail: " + msg));  
		
	}  

	
	public void disable() {  
		
		userService.disable(selectedUser);
		String msg = "Successfully disabled " + selectedUser.getLogin();
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "summary: " + msg, "detail: " + msg));
		
	}  
	
	public void enable() {  
		
		userService.enable(selectedUser);
		String msg = "Successfully enabled " + selectedUser.getLogin();
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "summary: " + msg, "detail: " + msg));
		
	}  
	
	public void edit() {  
		
		userService.update(selectedUser);
		String msg = "Successfully disabled " + selectedUser.getLogin();
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "summary: " + msg, "detail: " + msg));  
		
	}
	
	public void deselectUser() {
		
		this.selectedUser = null;
		
	}
	
//	public void delete(ActionEvent actionEvent) {
//
//		String msg = "AN ERROR HAS OCCURRED.  UNABLE TO PROCESS YOUR REQUEST AT THIS TIME.";
//		Severity severity = FacesMessage.SEVERITY_ERROR;
//		
//		try {
//			userService.remove(this.selectedUser);
//			msg = "Successfully created user with login = " + user.getLogin();
//			severity = FacesMessage.SEVERITY_INFO;
//			user = new User();
//		} catch (Exception e) {
//			msg = "UNABLE TO CREATE USER DUE TO INTERNAL ERROR";	
//			logger.error(ExceptionUtils.getRootCauseMessage(e));
//		}
//		
//		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(severity, null, msg));
//				
//	}

	private SelectItem[] createFilterOptions(String[] data)  {
        SelectItem[] options = new SelectItem[data.length + 1];

        options[0] = new SelectItem("", "Select");
        for(int i = 0; i < data.length; i++) {
            options[i + 1] = new SelectItem(data[i], data[i]);
        }

        return options;
    }

	public boolean getViewMode() {
		return viewMode;
	}

	public void setViewMode(boolean viewMode) {
		this.viewMode = viewMode;
	}

	public boolean getEditMode() {
		return editMode;
	}

	public void setEditMode(boolean editMode) {
		this.editMode = editMode;
	}

//	public String getMode() {
//		return mode;
//	}
//
//	public void setMode(String mode) {
//		this.mode = mode;
//		if ("edit".equals(mode)) {
//			this.setEditMode(true);
//			this.setViewMode(false);
//		} else if ("view".equals(mode)){
//			this.setEditMode(false);
//			this.setViewMode(true);
//		}
//		System.out.println("mode: " + mode);
//	}
	
	
	
}
thank you again for your assistance with this important issue for me.

regards,
Jim
JSF2 - weblogic 10.3.4 - primefaces-3.0-SNAPSHOT - MyEclipse 8.6.1

User avatar
ydarcin
Posts: 258
Joined: 04 Jan 2009, 19:02
Location: Turkey

28 Mar 2011, 16:16

Hi Jim,

can you add process attribute to the commandlinks so that datatable knows which row is selected etc.

you can first try setting process="@this" for each button and test your case again. if this does not work, can you test using process="users" ( id of your table ) in your command links?

Yigit

jjpclev
Posts: 100
Joined: 12 Jan 2011, 15:28
Location: United States - Cleveland, Ohio

28 Mar 2011, 17:18

tried adding process="@this" to my buttons. but it doesn't work. for some reason, it seems to remember previously selected user. I wish there was another way for me to debug this issue. can someone take a look at my xhml page to ensure that I have my viewEditDialog set up correctly? I am not even sure how it would remember the previous selectedUser as it sets the selectedUser correctly whenever I click on another link (delete, enable, disable). but then when I click the 'yes' button in the confirm dialog, the selectedUser property in my managed bean reverts back to the selectedUser when I was doing the edit. any thoughts? here is my code again.....could it have anything to do with the fact that my managed bean (manageUsers) is in session scope?

Code: Select all

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
	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:p="http://primefaces.prime.com.tr/ui"
	xmlns:fn="http://java.sun.com/jsp/jstl/functions">
		
<p:focus /> 
		
<h:form prependId="false">

	<p:fieldset legend="Search Users" toggleable="true">
		<h:panelGrid columns="3">
			<h:outputText value="UserName: " />
			<h:inputText value="#{manageUsers.login}" />
			<p:commandButton value="Search" actionListener="#{manageUsers.search}" async="true" update="users"/>
		</h:panelGrid>
	</p:fieldset>  

 	<p:messages id="manageMsgs" display="text"/>
 	
 	<p:ajaxStatus style="width:16px;height:16px;">
                    <f:facet name="start">
                        <h:graphicImage value="../design/ajaxloading.gif" />
                    </f:facet>

                    <f:facet name="complete">
                        <h:outputText value="" />
                    </f:facet>
                </p:ajaxStatus>
 	
    <p:dataTable id="users" var="user" value="#{manageUsers.users}" paginator="true" rows="10" effect="true"  
    			 paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"  
				 rowsPerPageTemplate="2,3,10" emptyMessage="No Users found with given criteria">

  		<f:facet name="header">Users</f:facet>    		 

        <p:column sortBy="#{user.login}" style="width:150px" headerText="UserName" footerText="UserName">
            <h:outputText value="#{user.login}" />
        </p:column>

        <p:column sortBy="#{user.firstName}" style="width:150px" headerText="First Name" footerText="First Name">
            <h:outputText value="#{user.firstName}" />
        </p:column>

        <p:column sortBy="#{user.lastName}" style="width:150px" headerText="Last Name" footerText="Last Name">
            <h:outputText value="#{user.lastName}" />
        </p:column>
        
         <p:column sortBy="#{user.agencyId}" style="width:150px" headerText="Agency" footerText="Agency">
             <h:outputText value="#{user.agencyId}" />
        </p:column>
        
        <p:column sortBy="#{user.status}" headerText="Status" footerText="Status">        
            <h:outputText value="#{user.status}" />
        </p:column>        

        <p:column style="width:300px" headerText="Actions" footerText="Actions">
        	<p:outputPanel>                 
                <p:commandLink update="users manageMsgs userDetailPanel" oncomplete="viewEditDialog.show()" value="view">
					<f:setPropertyActionListener value="#{user}" target="#{manageUsers.selectedUser}" />
                    
                    <f:setPropertyActionListener value="false" target="#{manageUsers.editMode}" />
                    <f:setPropertyActionListener value="true" target="#{manageUsers.viewMode}" />
                    
                </p:commandLink>                 
                <p:outputPanel rendered="#{p:ifGranted('ROLE_ADMIN')}">
					<h:outputText value="&#160;" />                 
	                <p:commandLink update="users manageMsgs userDetailPanel"  oncomplete="viewEditDialog.show()" value="edit" rendered="#{user.status != 'User_Deleted'}">
	                	<f:setPropertyActionListener value="#{user}" target="#{manageUsers.selectedUser}" />
                    <f:setPropertyActionListener value="true" target="#{manageUsers.editMode}" />
                    <f:setPropertyActionListener value="false" target="#{manageUsers.viewMode}" />

	                </p:commandLink>
	                <h:outputText value="&#160;" />
	                <p:commandLink update="users manageMsgs userDeletePanel"  oncomplete="deleteConfirm.show()" value="delete" rendered="#{user.status != 'User_Deleted'}">
	                	<f:setPropertyActionListener value="#{user}" target="#{manageUsers.selectedUser}" />
	                </p:commandLink>
					<h:outputText value="&#160;" />						 
					<p:commandLink update="users manageMsgs userDisablePanel" oncomplete="disableConfirm.show()" value="disable" rendered="#{user.status != 'User_Disabled'}">
	                    <f:setPropertyActionListener value="#{user}" target="#{manageUsers.selectedUser}" />
	                </p:commandLink>		                 
	                <p:commandLink update="users manageMsgs userEnablePanel" oncomplete="enableConfirm.show()" value="enable" rendered="#{user.status == 'User_Disabled'}">
	                	<f:setPropertyActionListener value="#{user}" target="#{manageUsers.selectedUser}" />
	                </p:commandLink>                 
                 </p:outputPanel>
        	</p:outputPanel>
        </p:column>
    </p:dataTable>

    <p:dialog header="User Detail" widgetVar="viewEditDialog" width="300" showEffect="explode" hideEffect="explode">
        <h:panelGrid id="userDetailPanel" columns="2" cellpadding="4">
        	<h:outputText value="User Login" />
    		<h:panelGroup>
    			<h:outputText value="#{manageUsers.selectedUser.login}" rendered="#{manageUsers.viewMode}"/>
			    <h:inputText value="#{manageUsers.selectedUser.login}" rendered="#{manageUsers.editMode}"/>
			</h:panelGroup>
			
			<h:outputText value="First Name" />
    		<h:panelGroup> 
    			<h:outputText value="#{manageUsers.selectedUser.firstName}" rendered="#{manageUsers.viewMode}"/>
			    <h:inputText value="#{manageUsers.selectedUser.firstName}" rendered="#{manageUsers.editMode}"/>
			</h:panelGroup>
	
			<p:commandButton value="Update"  update="users manageMsgs" actionListener="#{manageUsers.edit}" oncomplete="viewEditDialog.hide();"  rendered="#{manageUsers.editMode}"/>
	        <p:commandButton value="Cancel"  oncomplete="viewEditDialog.hide();" rendered="#{manageUsers.editMode}"/>	   
	   		<p:commandButton value="Close"  oncomplete="viewEditDialog.hide();" rendered="#{manageUsers.viewMode}"/>
	   		
		</h:panelGrid>  

			           
    </p:dialog>
  
    <p:outputPanel id="userDeletePanel">
    <p:confirmDialog message="Are you sure you want to delete #{manageUsers.selectedUser.login}?" showEffect="explode" hideEffect="explode" header="Delete Confirmation" severity="alert" widgetVar="deleteConfirm">
        <p:commandButton value="Yes" update="users manageMsgs" actionListener="#{manageUsers.delete}" oncomplete="deleteConfirm.hide()"/>
        <p:commandButton value="No" onclick="deleteConfirm.hide()" type="button"/>
    </p:confirmDialog>
    </p:outputPanel> 

    <p:outputPanel id="userDisablePanel">
	<p:confirmDialog message="Are you sure you want to disable #{manageUsers.selectedUser.login}?" showEffect="explode" hideEffect="explode" header="Disable Confirmation" severity="alert" widgetVar="disableConfirm">
        <p:commandButton value="Yes" update="users manageMsgs" actionListener="#{manageUsers.disable}" oncomplete="disableConfirm.hide()"/>
        <p:commandButton value="No" onclick="disableConfirm.hide()" type="button"/>
    </p:confirmDialog>
    </p:outputPanel>

	<p:outputPanel id="userEnablePanel">
	<p:confirmDialog message="Are you sure you want to enable #{manageUsers.selectedUser.login}?" showEffect="explode" hideEffect="explode" header="Enable Confirmation" severity="alert" widgetVar="enableConfirm">
        <p:commandButton value="Yes" update="users manageMsgs" actionListener="#{manageUsers.enable}" oncomplete="disableConfirm.hide()"/>
        <p:commandButton value="No" onclick="enableConfirm.hide()" type="button"/>
    </p:confirmDialog>
    </p:outputPanel>

</h:form>
           
</ui:composition>

Code: Select all

package gov.treas.fms.pups.view;

import gov.treas.fms.pups.defines.Status;
import gov.treas.fms.pups.domain.User;
import gov.treas.fms.pups.service.UserService;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import org.apache.log4j.Logger;
import org.primefaces.event.TabChangeEvent;
import org.primefaces.event.UnselectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import com.lowagie.text.pdf.hyphenation.TernaryTree.Iterator;

@Component("manageUsers")
@Scope("session")
public class ManageUsers implements Serializable{

	private static final long serialVersionUID = 8482847001201927154L;

	private static Logger logger = Logger.getLogger(CreateUser.class);
	
	private List<User> users;
	
	private UserService userService;
	
	private String login;
	
	private User selectedUser;
	
	private boolean viewMode;
	private boolean editMode;
	
	public ManageUsers() {}
	
	@Autowired
	public ManageUsers(UserService userService) {
		
		this.userService = userService;		
		
	}

	public List<User> getUsers() {
		return users;
	}
	public void setUsers(List<User> users) {
		this.users = users;
	}
	
	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public User getSelectedUser() {
		return selectedUser;
	}

	public void setSelectedUser(User selectedUser) {
		
		try {
			System.out.println("selected user: " + selectedUser.getLogin());
			System.out.println("editmode=" + this.getEditMode());
			System.out.println("viewmode=" + this.getViewMode());
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		this.selectedUser = selectedUser;
	}

	public List<String> getUsersByLogin(String login) {
		
		long start = System.currentTimeMillis();
		List<User> foundUsers = userService.findByLogin(login);
		System.out.println("query took " + (System.currentTimeMillis()-start) + " ms.");
		List<String> users = new ArrayList<String>();
	
		for(User m : foundUsers)
			users.add(m.getLogin());
		
		return users;
	}
		
	public void search(ActionEvent actionEvent) {
		
		long start = System.currentTimeMillis();
		users = userService.findByLogin(login);
		System.out.println("query took " + (System.currentTimeMillis()-start) + " ms.");
		
	}

	public void delete() {  
		
		userService.delete(selectedUser);
		String msg = "Successfully deleted " + selectedUser.getLogin();
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "summary: " + msg, "detail: " + msg));  
		
	}  

	public void realDelete() {  
		
		//userService.delete(selectedUser);
		//users.remove(selectedUser);
		//String msg = "Successfully removed " + selectedUser.getLogin() + " from database";
		//FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "summary: " + msg, "detail: " + msg));  
		
	}  

	
	public void disable() {  
		
		userService.disable(selectedUser);
		String msg = "Successfully disabled " + selectedUser.getLogin();
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "summary: " + msg, "detail: " + msg));
		
	}  
	
	public void enable() {  
		
		userService.enable(selectedUser);
		String msg = "Successfully enabled " + selectedUser.getLogin();
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "summary: " + msg, "detail: " + msg));
		
	}  
	
	public void edit() {  
		
		userService.update(selectedUser);
		String msg = "Successfully disabled " + selectedUser.getLogin();
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "summary: " + msg, "detail: " + msg));  
		
	}
	
	public boolean getViewMode() {
		return viewMode;
	}

	public void setViewMode(boolean viewMode) {
		this.viewMode = viewMode;
	}

	public boolean getEditMode() {
		return editMode;
	}

	public void setEditMode(boolean editMode) {
		this.editMode = editMode;
	}

	
}
thanks again....regards, Jim
JSF2 - weblogic 10.3.4 - primefaces-3.0-SNAPSHOT - MyEclipse 8.6.1

jjpclev
Posts: 100
Joined: 12 Jan 2011, 15:28
Location: United States - Cleveland, Ohio

28 Mar 2011, 17:36

below is a link that cagatay had updated for me. would it be possible for someone to update this slightly again so that it has another action button? if there was a button added that would have a dialog where a user could edit some of the info, then click a save button in the dialog, that would save to database, and update table. this would be incredibly helpful. perhaps that would give me enough info where I could then figure out my issue

http://www.primefaces.org/showcase-lab ... olumn.jsf

thank you again,

Jim
JSF2 - weblogic 10.3.4 - primefaces-3.0-SNAPSHOT - MyEclipse 8.6.1

cagatay.civici
Prime
Posts: 18616
Joined: 05 Jan 2009, 00:21
Location: Cybertron
Contact:

28 Mar 2011, 18:33

Hi Jim,

I'll add an edit action tomorrow and let you know.

Also we've added process option to fileUpload, that should fix your previous fileUpload problem where selectOneMenu is not processed.

jjpclev
Posts: 100
Joined: 12 Jan 2011, 15:28
Location: United States - Cleveland, Ohio

28 Mar 2011, 18:36

thank you very, very much Cagatay. I really appreciate all your hard work.
cheers...have a great night!
JSF2 - weblogic 10.3.4 - primefaces-3.0-SNAPSHOT - MyEclipse 8.6.1

cagatay.civici
Prime
Posts: 18616
Joined: 05 Jan 2009, 00:21
Location: Cybertron
Contact:

29 Mar 2011, 10:38

Edit action is added;

http://www.primefaces.org/showcase-labs ... Column.jsf

Just let us know if you have problems with this use case.

jjpclev
Posts: 100
Joined: 12 Jan 2011, 15:28
Location: United States - Cleveland, Ohio

29 Mar 2011, 13:37

thank you very much for this example. Hopefully it will help me get over my issue. I really think it will also help many of your other uses, as I frequently see the datatable ( and how to use it extensively ) referenced in the PF forums.
And thank you very much for getting this example together so quickly. Your very fast turnaround is is truly impressive.

have a nice day.

Jim
JSF2 - weblogic 10.3.4 - primefaces-3.0-SNAPSHOT - MyEclipse 8.6.1

Post Reply

Return to “PrimeFaces”

  • Information
  • Who is online

    Users browsing this forum: No registered users and 26 guests