Data table sends wrong data to backing bean - jsf

I have a data-table (p:datatable) with filters and an action button on each row. Now when I click on action button, wrong data is passed to the bean.
Actually when Edit button is clicked, startupdate method of the bean is called and an argument is passed to it.
In normal cases, without any filter, right employee gets passes and the dialog box opens and shows correct values. However when I apply filter, It's always the first row which gets passed and the dialog box opens and show details of the employee of first row.
I do have rowKey set.
<h:form id="wrapform">
<p:dataTable style="margin-top:20px" widgetVar="emptable" id="empdata" var="emp" rowKey="#{emp.empdto.id}" value="#{employeeMaintainanceController.allUsersWithDetails}" filteredValue="#{employeeMaintainanceController.allUsersWithDetails_filtered}">
<f:facet name="header">
<p:outputPanel>
<h:outputText value="Search in any column:" />
<p:inputText id="globalFilter" onkeyup="emptable.filter()" style="width:150px; margin-left: 10px;" />
</p:outputPanel>
</f:facet>
<p:column headerText="Employee-Id" filterBy="#{emp.userdto.id}" filterMatchMode="contains">
<h:outputText value="#{emp.userdto.id}" />
</p:column>
<p:column headerText="First Name" filterBy="#{emp.userdto.firstName}" filterMatchMode="contains">
<h:outputText value="#{emp.userdto.firstName}" />
</p:column>
<p:column headerText="Last Name" filterBy="#{emp.userdto.lastName}" filterMatchMode="contains">
<h:outputText value="#{emp.userdto.lastName}" />
</p:column>
<p:column headerText="E-mail">
<h:outputText value="#{emp.userdto.email}" />
</p:column>
<p:column headerText="Date of Joining">
<h:outputText value="#{emp.empdto.doj}" />
</p:column>
<p:column headerText="Team" filterMatchMode="contains" filterBy="#{teamMaintainanceController.getTeamById(emp.empdto.teamid)}">
<h:outputText value="#{teamMaintainanceController.getTeamById(emp.empdto.teamid)}" />
</p:column>
<p:column headerText="Office" filterBy="#{employeeMaintainanceController.getLocName(emp.userdto.primaryOfficeSeq)}" filterMatchMode="contains">
<h:outputText value="#{employeeMaintainanceController.getLocName(emp.userdto.primaryOfficeSeq)}" />
</p:column>
<p:column headerText="Is Active?">
<h:outputText value="#{(emp.empdto.dor == null)?'Active':'Already Resigned'}" />
</p:column>
<p:column headerText="Edit">
<p:commandButton value="Edit/Move/Delete"
title="Edit"
actionListener="#{employeeMaintainanceController.startUpdate(emp)}"
ajax="true" process="#this" oncomplete="dlg2.show();" update=":entryform"/>
</p:column>
</p:dataTable>
</h:form>
<p:dialog header="Change Employee Details, Move him to different Teams, Transfer him to different Locations" widgetVar="dlg2" modal="true" >
<h:form id="entryform">
<table id="empdatatable">
<p:growl id="growl" showDetail="true"/>
<tr><td><p:outputLabel for="searchedid" value="ID" rendered="#{employeeMaintainanceController.wrapemp !=null}"></p:outputLabel></td><td><h:outputText id="searchedid" value="#{employeeMaintainanceController.wrapemp.userdto.id}"></h:outputText></td></tr>
<tr><td><p:outputLabel for="searchedfname" value="First Name" rendered="#{employeeMaintainanceController.wrapemp !=null}"></p:outputLabel></td><td><h:outputText id="searchedfname" value="#{employeeMaintainanceController.wrapemp.userdto.firstName}"></h:outputText></td></tr>
<tr><td><p:outputLabel for="searchedlname" value="Last Name" rendered="#{employeeMaintainanceController.wrapemp !=null}"></p:outputLabel></td><td><h:outputText id="searchedlname" value="#{employeeMaintainanceController.wrapemp.userdto.lastName}"></h:outputText></td></tr>
<tr><td><p:outputLabel for="searchedemail" value="E-Mail" rendered="#{employeeMaintainanceController.wrapemp !=null}"></p:outputLabel></td><td><h:outputText id="searchedemail" value="#{employeeMaintainanceController.wrapemp.userdto.email}"></h:outputText></td></tr>
<tr><td><p:outputLabel for="loc" value="Office Location" rendered="#{employeeMaintainanceController.wrapemp !=null}"></p:outputLabel></td><td><p:selectOneMenu id="loc" value="#{employeeMaintainanceController.wrapemp.userdto.primaryOfficeSeq}" rendered="#{employeeMaintainanceController.wrapemp !=null}">
<f:selectItem itemLabel="Select One" itemValue="-1" />
<f:selectItems value="#{employeeMaintainanceController.officeList}" var="theme" itemLabel="#{theme.name}" itemValue="#{theme.seq}"/>
</p:selectOneMenu></td></tr>
<tr><td><p:outputLabel for="searcheddoj" value="Date Of Joining" rendered="#{employeeMaintainanceController.wrapemp !=null}"></p:outputLabel></td><td><h:outputText id="searcheddoj" value="#{employeeMaintainanceController.wrapemp.empdto.doj}"></h:outputText></td></tr>
<tr><td><p:outputLabel for="cal1" value="Date Of Resignation" rendered="#{employeeMaintainanceController.wrapemp !=null}"></p:outputLabel></td><td><p:calendar id="cal1" value="#{employeeMaintainanceController.wrapemp.empdto.dor}" rendered="#{employeeMaintainanceController.wrapemp !=null}" /></td></tr>
<tr><td><p:outputLabel for="chk_isadmin" value="IS Admin?" rendered="#{employeeMaintainanceController.wrapemp !=null}"></p:outputLabel></td><td><p:selectBooleanCheckbox id="chk_isadmin" value="#{employeeMaintainanceController.isadmin}" rendered="#{employeeMaintainanceController.wrapemp !=null}"></p:selectBooleanCheckbox> </td></tr>
<tr><td><p:outputLabel for="sel_team" value="TeamName" rendered="#{employeeMaintainanceController.wrapemp !=null}"></p:outputLabel></td><td><p:selectOneMenu id="sel_team" value="#{employeeMaintainanceController.wrapemp.empdto.teamid}" rendered="#{employeeMaintainanceController.wrapemp !=null}">
<f:selectItem itemLabel="Select One" itemValue="-1" />
<f:selectItems value="#{teamMaintainanceController.allTeams}" var="theme" itemLabel="#{theme.name}" itemValue="#{theme.id}"/>
</p:selectOneMenu></td></tr>
<tr><td><p:commandButton value="Edit" ajax="false" actionListener="#{employeeMaintainanceController.updateemp}" update=":wrapform" oncomplete="dlg2.hide();" rendered="#{employeeMaintainanceController.wrapemp !=null}"></p:commandButton></td><td><p:commandButton value="Delete This Employee" ajax="false" actionListener="#{employeeMaintainanceController.deleteemp}" update=":wrapform" oncomplete="dlg2.hide();" rendered="#{employeeMaintainanceController.wrapemp !=null}"></p:commandButton></td></tr>
</table>
</h:form>
</p:dialog>
UPDATE
The problems more weird. The problem appears only when the number of filtered row is just one. Anything else and it works fine.

Related

p:dataTable is not updating

I have the following code in a xhtml file. After clicking the command button to save, it doesn't:
<p:tab id="bookingTab" title="Booking Information">
<p:panelGrid id="bookingGrid" columns="4">
<f:facet name="header">
#{bundle.CreateOrdrBookingTitle}
</f:facet>
<h:outputLabel value="#{bundle.CreateOrdrBookingLabel_number}"
for="number" />
<p:inputText id="number" value="#{ordrBookingController.selected.number}"
title="#{bundle.CreateOrdrBookingTitle_number}" required="true"
requiredMessage="Please enter Booking Number" />
<h:outputLabel value="#{bundle.CreateOrdrBookingLabel_ponumber}"
for="ponumber" />
<p:inputText id="ponumber"
value="#{ordrBookingController.selected.ponumber}" title="#{bundle.CreateOrdrBookingTitle_ponumber}"
required="true" requiredMessage="Please enter Booking PO Number" />
<h:outputLabel value="#{bundle.CreateOrdrBookingLabel_bookingDate}"
for="date" />
<p:calendar id="bookingDate" readonlyInput="true"
pattern="dd/MM/yyyy HH:mm:ss" value="#{ordrBookingController.selected.bookingDate}"
title="#{ordrBookingController.selected.bookingDate}" required="true"
requiredMessage="Please enter Booking Date">
<f:convertDateTime pattern="dd/MM/yyyy HH:mm:ss" />
</p:calendar>
<h:outputLabel value="#{bundle.CreateOrdrBookingLabel_cost}"
for="cost" />
<p:inputText id="cost" value="#{ordrBookingController.selected.cost}"
title="#{bundle.CreateOrdrBookingTitle_cost}" required="true"
requiredMessage="Please enter Booking Cost" />
<h:outputLabel value="Contact Person" for="contactname" />
<p:inputText id="contactname"
value="#{ordrBookingController.selected.contactName}" title="Contact Name"
required="true" requiredMessage="Please enter Contact Name" />
<h:outputLabel value="Contact Number" for="contactnumber" />
<p:inputText id="contactnumber"
value="#{ordrBookingController.selected.contactNumber}" title="Contact Number"
required="true" requiredMessage="Please enter Contact Number" />
<h:outputLabel value="Comment" for="comment" />
<p:inputTextarea id="comment"
value="#{ordrBookingController.selected.comment}" title="Comment"
required="true" requiredMessage="Please enter a comment" />
<h:outputLabel value="Email List" />
<p:selectCheckboxMenu value="#{ordrBookingController.selectedUsrs}"
id="emailList" label="Select Users to Email" filter="true"
filterMatchMode="startsWith" panelStyle="width:420px" required="true"
requiredMessage="Please supply users that need to be emailed">
<f:selectItems value="#{usrController.itemsAvailableSelectManyEmail}" />
</p:selectCheckboxMenu>
<f:facet name="footer">
<p:commandButton action="#{ordrBookingController.create}"
process="bookingGrid" value="#{bundle.CreateOrdrBookingSaveLink}"
icon="ui-icon-check" ajax="true" immediate="false"
update="bookingTable bookingGrid :bookingForm:messagePanel">
<f:setPropertyActionListener
target="#{ordrBookingController.selected.ordr}" value="#{ordrController.selected}" />
<f:setPropertyActionListener
target="#{ordrBookingController.selected.active}" value="#{true}" />
</p:commandButton>
</f:facet>
</p:panelGrid>
<br></br>
<p:dataTable id="bookingTable"
value="#{ordrController.selected.ordrBookingList}" var="bookingItem"
rowKey="#{bookingItem.id}" paginator="true" rows="10"
filteredValue="#{ordrBookingController.filteredItems}">
<f:facet name="header">
#{bundle.ListOrdrBookingTitle}
</f:facet>
<p:column headerText="#{bundle.ListOrdrBookingTitle_id}"
sortBy="#{bookingItem.id}">
#{bookingItem.id}
</p:column>
<p:column headerText="#{bundle.ListOrdrBookingTitle_number}"
sortBy="#{bookingItem.number}">
#{bookingItem.number}
</p:column>
<p:column headerText="#{bundle.ListOrdrBookingTitle_ponumber}"
sortBy="#{bookingItem.ponumber}">
#{bookingItem.ponumber}
</p:column>
<p:column headerText="#{bundle.ListOrdrBookingTitle_bookingDate}"
sortBy="#{bookingItem.bookingDate}">
<h:outputText value="#{bookingItem.bookingDate}">
<f:convertDateTime pattern="dd/MM/yyyy HH:mm:ss" />
</h:outputText>
</p:column>
<p:column headerText="#{bundle.ListOrdrBookingTitle_cost}"
sortBy="#{bookingItem.cost}">
R
<h:outputText value="#{bookingItem.cost}">
<f:convertNumber pattern="#0.00" />
</h:outputText>
</p:column>
<p:column headerText="Contact" sortBy="#{bookingItem.ponumber}">
#{bookingItem.contactName}
</p:column>
<p:column headerText="Contact Number" sortBy="#{bookingItem.contactNumber}">
#{bookingItem.contactNumber}
</p:column>
<p:column headerText="Comment" sortBy="#{bookingItem.comment}">
#{bookingItem.comment}
</p:column>
<p:column headerText="User" sortBy="#{bookingItem.createUsr}"
rendered="#{bookingItem.createDate == bookingItem.updateDate}">
#{bookingItem.createUsr}
</p:column>
<p:column headerText="Created Date" sortBy="#{bookingItem.createDate}"
rendered="#{bookingItem.createDate == bookingItem.updateDate}">
<h:outputText value="#{bookingItem.createDate}">
<f:convertDateTime pattern="dd/MM/yyyy HH:mm:ss" />
</h:outputText>
</p:column>
<p:column headerText="User" sortBy="#{bookingItem.updateUsr}"
rendered="#{bookingItem.createDate != bookingItem.updateDate}">
#{bookingItem.updateUsr}
</p:column>
<p:column headerText="Update Date" sortBy="#{bookingItem.updateDate}"
rendered="#{bookingItem.createDate != bookingItem.updateDate}">
<h:outputText value="#{bookingItem.updateDate}">
<f:convertDateTime pattern="dd/MM/yyyy HH:mm:ss" />
</h:outputText>
</p:column>
<p:column>
<p:commandButton value="Edit" process="#this" ajax="true"
update=":bookingForm:tabView:bookingGrid" rendered="#{bookingItem.active eq true}">
<f:setPropertyActionListener target="#{ordrBookingController.selected}"
value="#{bookingItem}" />
</p:commandButton>
<p:commandButton action="#{ordrBookingController.create}"
process="#this" value="Cancel" ajax="true" immediate="false"
update="bookingTable :bookingForm:messagePanel" rendered="#{bookingItem.active eq true}">
<f:setPropertyActionListener target="#{ordrBookingController.selected}"
value="#{bookingItem}" />
<f:setPropertyActionListener
target="#{ordrBookingController.selected.active}" value="#{false}" />
</p:commandButton>
</p:column>
</p:dataTable>
</p:tab>
The p:dataTable bookingTable must be update and other listed on the update attribute. The other tables are being updated, but the bookingTable is not. What is it that is wrong here.

javax.faces.FacesException: DataModel must implement org.primefaces.model.SelectableDataModel when selection is enabled or define rowKey attribute

I saw this problem here many times but it doesn't help me.
I have the first dataTable with id:servers and I can do right click over a row and a contextMenu appears. I can click in Show Process and I get a second dataTable with id:processes.
But here is the problem, instead of showing the new dataTable I get,
javax.faces.FacesException: DataModel must implement
org.primefaces.model.SelectableDataModel when selection is enabled or
you need to define rowKey attribute
But I have defined rowKey in both dataTable
I have this code:
<h:form id="form" onkeypress="return event.keyCode != 13">
<!-- <p:messages id="msgs" /> -->
<p:growl id="msgs" showDetail="true" sticky="true" autoUpdate="true" />
<!-- Context menu for servers table. -->
<p:contextMenu for="servers">
<p:menuitem value="Show processes" update="form" icon="ui-icon-search" actionListener="#{homeBean.findLSRunningProcesses}" styleClass="homeIE"/>
</p:contextMenu>
<!-- Context menu for processes table. -->
<p:contextMenu for="processes">
<p:menuitem styleClass="homeIE" update="#form" value="Stop Process" icon="ui-icon-stop" oncomplete="stopDialog.show()"/>
</p:contextMenu>
<!-- Servers table. -->
<p:dataTable id="servers" var="server" value="#{homeBean.serverList}" paginator="true" rows="10"
paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}"
rowsPerPageTemplate="5,10,15" widgetVar="serversTable" rowKey="#{server.adminFQDN}"
selection="#{homeBean.selectedLogicalServer}" selectionMode="single" emptyMessage="No servers found with given criteria">
<f:facet name="header">
<h:outputText value="Servers" />
</f:facet>
<p:column filterBy="#{server.ASSETID}" filterMatchMode="contains" sortBy="#{server.ASSETID}" headerText="ASSETID">
<h:outputText value="#{server.ASSETID}" />
</p:column>
<p:column filterBy="#{server.adminFQDN}" filterStyle="width:240px;" filterMatchMode="contains" sortBy="#{server.adminFQDN}" headerText="FQDN">
<h:outputText value="#{server.adminFQDN}" />
</p:column>
<p:column filterBy="#{server.adminIP}" filterMatchMode="contains" sortBy="#{server.adminIP}" headerText="Admin IP">
<h:outputText value="#{server.adminIP}" />
</p:column>
<p:column filterBy="#{server.delivery}" filterMatchMode="exact" sortBy="#{server.delivery}" headerText="Delivery">
<f:facet name="filter">
<p:selectOneMenu onchange="PF('serversTable').filter()">
<f:selectItem itemLabel="Select One" itemValue="#{null}" noSelectionOption="false" />
<f:selectItems label="#{homeBean.deliveries}" value="#{homeBean.deliveries}" />
</p:selectOneMenu>
</f:facet>
<h:outputText value="#{server.delivery}" />
</p:column>
<p:column filterBy="#{server.environment}" filterMatchMode="exact" sortBy="#{server.environment}" headerText="Environment">
<f:facet name="filter">
<p:selectOneMenu onchange="PF('serversTable').filter()">
<f:selectItem itemLabel="Select One" noSelectionOption="true" itemValue="#{null}"/>
<f:selectItems value="#{homeBean.environments}" />
</p:selectOneMenu>
</f:facet>
<h:outputText value="#{server.environment}" />
</p:column>
<p:column filterBy="#{server.function}" filterMatchMode="exact" sortBy="#{server.function}" headerText="Function">
<f:facet name="filter">
<p:selectOneMenu onchange="PF('serversTable').filter()">
<f:selectItem itemLabel="Select One" itemValue="#{null}" noSelectionOption="true" />
<f:selectItems value="#{homeBean.functions}" />
</p:selectOneMenu>
</f:facet>
<h:outputText value="#{server.function}" />
</p:column>
<p:column filterBy="#{server.osVersion}" filterMatchMode="contains" sortBy="#{server.osVersion}" headerText="OS VERSION">
<h:outputText value="#{server.osVersion}" />
</p:column>
<p:column filterBy="#{server.os}" filterMatchMode="contains" sortBy="#{server.os}" headerText="OS">
<h:outputText value="#{server.os}" />
</p:column>
</p:dataTable>
<!-- Panel containing processes tables. -->
<p:panelGrid id="serverProcesses" styleClass="group-user-selection-table" rendered="#{homeBean.showSelectionPanel}">
<f:facet name="header">
<p:row>
<p:column>
<h:outputText value="#{homeBean.selectedLogicalServer.adminFQDN}" />
</p:column>
</p:row>
</f:facet>
<p:row>
<!--Processes table. -->
<p:column>
<p:dataTable id="processes" var="process" value="#{homeBean.processesList}" filteredValue="#{homeBean.filteredProcesses}"
selection="#{homeBean.selectedProcesses}" paginator="true" rows="15" rowKey="#{process.owner}"
paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}"
rowsPerPageTemplate="15,20,25,30" selectionMode="single" emptyMessage="No processses found with given criteria">
<f:facet name="header">
<h:outputText value="Processes" />
</f:facet>
<p:column name="owner" filterBy="#{process.owner}" filterMatchMode="contains" sortBy="#{process.owner}" headerText="#{homeBean.selectedLogicalServer.os eq 'Windows' ? 'DESCRIPTION' : 'OWNER'}">
<h:outputText value="#{process.owner}" />
</p:column>
<p:column name="pid" filterBy="#{process.pid}" filterMatchMode="exact" sortBy="#{process.owner}" headerText="PID">
<h:outputText value="#{process.pid}" />
</p:column>
<p:column name="ppid" filterBy="#{process.ppid}" filterMatchMode="exact" sortBy="#{process.ppid}" headerText="#{homeBean.selectedLogicalServer.os eq 'Windows' ? 'TYPE' : 'PPID'}">
<h:outputText value="#{process.ppid}" />
</p:column>
<p:column name="c" filterBy="#{process.c}" filterMatchMode="exact" sortBy="#{process.c}" headerText="#{homeBean.selectedLogicalServer.os eq 'Windows' ? 'STATE' : 'C'}">
<h:outputText value="#{process.c}" />
</p:column>
<p:column name="stime" filterBy="#{process.stime}" filterMatchMode="contains" sortBy="#{process.stime}" headerText="STIME" rendered="#{!(homeBean.selectedLogicalServer.os eq 'Windows')}">
<h:outputText value="#{process.stime}" />
</p:column>
<p:column name="tty" filterBy="#{process.tty}" filterMatchMode="contains" sortBy="#{process.tty}" headerText="TTY" rendered="#{!(homeBean.selectedLogicalServer.os eq 'Windows')}">
<h:outputText value="#{process.tty}" />
</p:column>
<p:column name="time" filterBy="#{process.time}" filterMatchMode="contains" sortBy="#{process.time}" headerText="TIME" rendered="#{!(homeBean.selectedLogicalServer.os eq 'Windows')}">
<h:outputText value="#{process.time}" />
</p:column>
<p:column name="cmd" filterBy="#{process.cmd}" filterMatchMode="contains" sortBy="#{process.cmd}" headerText="#{homeBean.selectedLogicalServer.os eq 'Windows' ? 'NAME' : 'CMD'}">
<h:outputText value="#{process.cmd}" />
</p:column>
</p:dataTable>
</p:column>
</p:row>
</p:panelGrid>
<p:dialog header="Stop Process" widgetVar="stopDialog" minHeight="40" styleClass="dialogPosition">
<h:outputText value="You are going to stop the process "/>
<h:outputText value="#{homeBean.selectedProcesses.cmd}"/>
<h:outputText value="with PID"/>
<h:outputText value="#{homeBean.selectedProcesses.pid}"/>
<br /><br /><br /><br />
<p:commandButton value="Yes" type="button" styleClass="ui-confirmdialog-yes" icon="ui-icon-check" style="float:left" onclick="stopDialog2.show();stopDialog.hide();" actionListener="#{homeBean.attrListener}">
<f:attribute name="processPID" value="#{process.pid}" />
</p:commandButton>
<p:commandButton value="NO" onclick="stopDialog.hide()" type="button" styleClass="ui-confirmdialog-no" icon="ui-icon-close" style="float:right"/>
</p:dialog>
<p:dialog header="Stop Process" widgetVar="stopDialog2" minHeight="40" styleClass="dialogPosition">
<h:outputText value="You are going to send an email to:"/>
<br />
<h:outputText value="#{homeBean.email}"/>
<br /><br /><br />
<p:commandLink value="Yes" styleClass="ui-confirmdialog-yes" icon="ui-icon-check" style="float:left" update="form" action="#{homeBean.stopProcess}" oncomplete="stopDialog2.hide();"/>
<p:commandButton value="NO" onclick="stopDialog2.hide()" type="button" styleClass="ui-confirmdialog-no" icon="ui-icon-close" style="float:right"/>
</p:dialog>
</h:form>
FacesException: DataModel must implement org.primefaces.model.SelectableDataModel when selection is enabled
this solution works to me.
Especially this answer https://stackoverflow.com/a/10527008/5250930
The table must implement the SelectableDataModel

Update DataTable after cell edit not working in primefaces

I have a datatable includes some cell for edit, and these cells are disabled in specific conditions and after an other cell edition will be enabled.
My problem is after the edit, the new data stored in the database but the datatable not updated directly, it will be updated after reloading the page.
All what I want is how can I make the hole datatable updated after the edit or making the page reloaded
and here is my code:
<h:form id="process">
<p:remoteCommand name="onCellEdit" update=":process:ListC" />
<p:dataTable id="ListC"
value="#{recruitmentProcessMB.candidateListInProcess}"
var="candid" rowKey="#{candid.idCandidate}"
style="border:0px; " paginator="true"
paginatorTemplate="{PreviousPageLink} {NextPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="3,5,10" paginatorPosition="top"
rows="10" editable="true" editMode="cell">
<f:facet name="footer" >
<h:outputLabel value="Valider processus pour le Manager:" style="display: inline-block;"/>
<h:selectOneMenu id="managersInProcess" style="display: inline-block;"
value="#{recruitmentProcessMB.selectedManagerInProcess}">
<f:selectItem itemLabel="Selectionner..." itemValue="#{null}"/>
<f:selectItems value="#{recruitmentProcessMB.managersInProcess}" />
</h:selectOneMenu>
<h:outputText value=" " />
<h:outputText value=" " />
<h:outputText value=" " />
<h:outputText value=" " />
<h:outputText value=" " />
<p:commandButton icon="ui-icon-seek-next"
value="Valider le processus"
ajax="true"
style="display: inline-block;"
disabled="false"></p:commandButton>
</f:facet>
<p:ajax event="cellEdit"
update=":process:ListC"
immediate="true"
listener="#{recruitmentProcessMB.onCellEdit}"
process="#this"
oncomplete="onCellEdit()"
/>
<p:column headerText="Prenom">
<h:outputText value="#{candid.firstNameCandidate}" />
</p:column>
<p:column headerText="Nom">
<h:outputText value="#{candid.nameCandidate}" />
</p:column>
<p:column headerText="Specialité">
<h:outputText value="#{candid.specialityCandidate}" />
</p:column>
<p:column headerText="Niveau d'etude">
<h:outputText value="#{candid.levelStudyCandidate}" />
</p:column>
<p:column headerText="CV" style="text-align: center ;width:30px;">
<p:commandButton icon="ui-icon-arrowthickstop-1-s"
ajax="false"
actionListener="#{recruitmentProcessMB.downloadAction(candid.cvCandidate,candidate.nameCandidate,candidate.firstNameCandidate)}">
<p:fileDownload
value="#{recruitmentProcessMB.downloadContentProperty}" />
</p:commandButton>
</p:column>
<p:column headerText="Manager" style="position:center;">
<h:outputText
value="#{candid.employee.firstNameEmployee} #{candid.employee.nameEmployee}" />
</p:column>
<p:column headerText="Date d'entretien">
<p:cellEditor id="c1">
<f:facet name="output">
<h:outputText value="#{candid.interviewDateCandidate}">
<f:convertDateTime type="date" dateStyle="short"
pattern="dd/MM/yyyy" timeZone="Europe/Paris" />
</h:outputText>
</f:facet>
<f:facet name="input" >
<p:calendar id="dateInterview"
value="#{candid.interviewDateCandidate}"
navigator="true" pattern="dd/MM/yyyy" mask="true" immediate="true" />
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Validation Par Manager " >
<p:cellEditor id="c2">
<f:facet name="output" >
<h:outputText
value="#{candid.decisionOfManager}" />
</f:facet>
<f:facet name="input" >
<h:selectOneMenu id="manegerDecision" style="display: inline-block;"
value="#{candid.decisionOfManager}"
disabled="#{candid.currentTask!='InterviewAndValidationByManager'}"
immediate="true">
<f:selectItem itemLabel="Selectionner..." />
<f:selectItem itemLabel="Accepté" itemValue="Accepté"/>
<f:selectItem itemLabel="Refusé" itemValue="Refusé"/>
</h:selectOneMenu>
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Validation Par RH " >
<p:cellEditor id="c3" >
<f:facet name="output">
<h:outputText
value="#{candid.decisionOfRh}" />
</f:facet>
<f:facet name="input">
<h:selectOneMenu id="rhDecision" style="display: inline-block;"
value="#{candid.decisionOfRh}"
disabled="#{candid.currentTask!='InterviewAndValidationByRH'}"
immediate="true">
<f:selectItem itemLabel="Selectionner..." />
<f:selectItem itemLabel="Accepté" itemValue="Accepté"/>
<f:selectItem itemLabel="Refusé" itemValue="Refusé"/>
</h:selectOneMenu>
</f:facet>
</p:cellEditor>
</p:column>
</p:dataTable>
</h:form>

p:dataTable context menu "selection" object not updating

I am trying to update the selected row (object) in <p:dataTable> when user clicks on the context menu but the object bound to <p:dataTable> selection="" doesn't updates according to row selection/context menu click, the debugging showed that the object's attributes in the bean doesn't contain any updated values but empty.
The code is:
<h:form id="searchStdentsFrm">
<p:dialog id="searchStdentsDlg" header="Search Students" widgetVar="srchStdents" modal="true">
<p:contextMenu for="srchStdentsTble" id="menuStdEdit">
<p:menuitem value="Change Status" update="stdDetail" icon="ui-icon-flag" oncomplete="PF('editStudentDialog').show()" />
<p:menuitem value="Edit Student" update="stdStatusDetail" icon="ui-icon-wrench" oncomplete="PF('editStudentStatusDialog').show()" action="#{viewStudentsBean.testAction}"/>
</p:contextMenu>
<p:dataTable id="srchStdentsTble" var="student" value="#{viewStudentsBean.studentsList}"
rowKey="#{student.id}" selection="#{viewStudentsBean.selectedStudent}"
selectionMode="single" widgetVar="srchStdentTbl"
emptyMessage="No students found with the given criteria" filteredValue="#{viewStudentsBean.filteredStudents}">
<p:ajax event="contextMenu"/>
<f:facet name="header">
<p:outputPanel>
<h:outputText value="Search Students:" />
<p:inputText id="globalFilter" onkeyup="PF('srchStdentTbl').filter()" style="width:200px" placeholder="Enter keyword"/>
</p:outputPanel>
</f:facet>
<p:column id="stdentId" headerText="Id" filterBy="#{student.id}" filterStyle="display:none">
<h:outputText value="#{student.id}" />
</p:column>
<p:column id="stdentFirstName" headerText="Firstname" filterBy="#{student.firstName}" filterStyle="display:none">
<h:outputText value="#{student.firstName}" />
</p:column>
<p:column id="stdentLastname" headerText="Lastname" filterBy="#{student.lastName}" filterStyle="display:none">
<h:outputText value="#{student.lastName}" />
</p:column>
<p:column id="stdentFathername" headerText="Father name" filterBy="#{student.fatherName}" filterStyle="display:none">
<h:outputText value="#{student.fatherName}" />
</p:column>
<p:column id="stdentGender" headerText="Gender" filterBy="#{student.gender}" filterStyle="display:none">
<h:outputText value="#{student.gender}" />
</p:column>
<p:column id="stdentDOB" headerText="Date Of birth" filterBy="#{student.dob}" filterStyle="display:none">
<h:outputText value="#{student.dob}" />
</p:column>
<p:column id="stdentSkype" headerText="Skype/Email" filterBy="#{student.skypeOrEmailId}" filterStyle="display:none">
<h:outputText value="#{student.skypeOrEmailId}" />
</p:column>
<p:column id="stdentPhone" headerText="Phone No" filterBy="#{student.phoneNumber}" filterStyle="display:none">
<h:outputText value="#{student.phoneNumber}" />
</p:column>
<p:column id="stdentAddrs" headerText="Address" filterBy="#{student.address}" filterStyle="display:none">
<h:outputText value="#{student.address}" />
</p:column>
<p:column id="stdentCountry" headerText="Country" filterBy="#{student.country}" filterStyle="display:none">
<h:outputText value="#{student.country}" />
</p:column>
<p:column id="stdentJOD" headerText="Joining Date" filterBy="#{student.dateOfJoining}" filterStyle="display:none">
<h:outputText value="#{student.dateOfJoining}" />
</p:column>
<p:column id="stdentGenralRmrks" headerText="General Remarks" filterBy="#{student.generalRemarks}" filterStyle="display:none">
<h:outputText value="#{student.generalRemarks}" />
</p:column>
<p:column id="studentStatus" headerText="Student Status" filterBy="#{student.studentStatus}" filterStyle="display:none">
<h:outputText value="#{student.studentStatus}" />
</p:column>
</p:dataTable>
</p:dialog>
<p:dialog id="editStdentDlg" header="Edit Student" widgetVar="editStudentDialog" modal="true">
<p:outputPanel id="stdDetail" style="text-align:center;">
<p:outputLabel value="First Name *" />
<p:inputText value="#{viewStudentsBean.selectedStudent.lastName}"/>
<p:panelGrid id="editStdPanelGrd" columns="2" cellpadding="5" style="width: 100%;">
<p:outputLabel value="First Name *" />
<p:inputText id="stdEditFname" value="#{viewStudentsBean.selectedStudent.firstName}"/>
<p:outputLabel value="Last Name *" />
<p:inputText id="stdEditLastname" value="#{viewStudentsBean.selectedStudent.lastName}"/>
<p:outputLabel value="Father's Name *" />
<p:inputText id="stdEditFathName" value="#{viewStudentsBean.selectedStudent.fatherName}"/>
<p:outputLabel value="Gender *" />
<h:selectOneMenu id="stdEditGnder" value="#{viewStudentsBean.selectedStudent.gender}">
<f:selectItem itemValue="Male" itemLabel="Male" />
<f:selectItem itemValue="Female" itemLabel="Female" />
</h:selectOneMenu>
<p:outputLabel value="Date Of Birth *" />
<p:calendar id="stdEditDOB" value="#{viewStudentsBean.selectedStudent.dob}"/>
<p:outputLabel value="Skype Id/Email *" />
<p:inputText id="stdEditSkype" value="#{viewStudentsBean.selectedStudent.skypeOrEmailId}"/>
<p:outputLabel value="Phone No *" />
<p:inputText id="stdEditPNo" value="#{viewStudentsBean.selectedStudent.phoneNumber}"/>
<p:outputLabel value="Address *" />
<p:inputText id="stdEditAddrs" value="#{viewStudentsBean.selectedStudent.address}"/>
<p:outputLabel value="Country *" />
<p:inputText id="stdEditCountry" value="#{viewStudentsBean.selectedStudent.country}"/>
<p:outputLabel value="Date of joining *" />
<p:calendar id="stdEditDOJ" value="#{viewStudentsBean.selectedStudent.dateOfJoining}"/>
<p:outputLabel value="General Remarks" />
<p:inputText id="stdEditGR" value="#{viewStudentsBean.selectedStudent.generalRemarks}"/>
</p:panelGrid>
</p:outputPanel>
</p:dialog>
<p:dialog id="editStdentStatusDlg" header="Edit Student" widgetVar="editStudentStatusDialog" modal="true">
<p:outputPanel id="stdStatusDetail" style="text-align:center;">
The current status of:<p:outputLabel value="#{viewStudentsBean.selectedStudent.lastName}"/>
is: <p:outputLabel value="#{viewStudentsBean.selectedStudent.studentStatus}" />
</p:outputPanel>
</p:dialog>
</h:form>
PS: I am using JSF 2.2 with PrimeFaces 5.0
I am absolutely stuck here. Any help would be greatly appreciated
Found the solution. Actually the second dialog in which i wanted to display/edit the selection object binded to p:datatable, required to be updated in context menu like:
update=":searchStdentsForm:editStdentDlg"
means the form and dialog needed to be explicitly referred.

Accessing invisible tabs in primefaces

I tried to update a Gmap which placed in a tabView. But i am getting the
java.lang.IllegalArgumentException: tab2
error. I have searched this problem a little and noticed that it is available only if tab is visible. So what can I do ? The code block is below:
<h:form id="form">
<p:tabView orientation="left" id="tabView" styleClass="tabView">
<p:ajax event="tabChange" listener="#{sucBean.onTabChange}"
update=":form:tabView:map" />
<p:tab title="Bütün Suçlar" id="tab1">
<p:gmap zoom="10" type="HYBRID" center="40.78470,29.94873" id="map"
model="#{sucBean.advancedModel}"
style="width:740px;height:500px;margin:-14px 0 0 -10px;">
<p:ajax event="overlaySelect" listener="#{sucBean.onMarkerSelect}" />
<p:gmapInfoWindow>
<p:outputPanel
style="text-align:justify;display:block;margin:auto:">
<p:panelGrid columns="2" cellpadding="8">
<h:outputText value="Suç Tipi:" style="color:red" />
<h:outputText value="#{sucBean.marker.data.sucTipi}" />
<h:outputText value="Tarih: " style="color:red" />
<h:outputText value="#{sucBean.marker.data.islenmeZamani}" />
<h:outputText value="Adres: " style="color:red" />
<h:outputText value="#{sucBean.marker.data.adres}" />
<h:outputText value="Suçu İşleyen:" style="color:red" />
<h:outputText value="#{sucBean.marker.data.isleyenBilgisi}" />
</p:panelGrid>
</p:outputPanel>
</p:gmapInfoWindow>
</p:gmap>
</p:tab>
<p:tab title="Suç Ara" id="tab2">
<p:fieldset legend="Ayrıntılı Arama" styleClass="searchField"
id="fieldSet">
<p:panelGrid columns="4" cellpadding="10">
<p:inputText value="#{sucBean.arananKelime}" style="width:300px" />
<h:outputText value=" Kriter:" />
<p:selectOneMenu value="#{sucBean.aramaKriteri}">
<f:selectItem itemLabel="Suç Tipi" itemValue="sucTipi" />
<f:selectItem itemLabel="Adres" itemValue="adres" />
<f:selectItem itemLabel="İşlenme Zamanı" itemValue="zaman" />
<f:selectItem itemLabel="Cinsiyet" itemValue="cinsiyet" />
<f:selectItem itemLabel="Yaş" itemValue="yas" />
</p:selectOneMenu>
<p:commandButton value="Ara"
actionListener="#{sucBean.sucKaydiAra}" update="aramaSonucu" />
</p:panelGrid>
</p:fieldset>
<p:dataTable var="suc" value="#{sucBean.sucModel}" paginator="true"
rows="10" id="aramaSonucu" selection="#{sucBean.selectedSuc}">
<p:column selectionMode="multiple" style="width:18px"></p:column>
<p:column headerText="Suç Tipi">
<h:outputText value="#{suc.sucTipi}" />
</p:column>
<p:column headerText="İşlenme Zamanı">
<h:outputText value="#{suc.islenmeZamani}" />
</p:column>
<p:column headerText="Adres">
<h:outputText value="#{suc.adres}" />
</p:column>
<p:column headerText="Suçu İşleyen">
<h:outputText value="#{suc.isleyenBilgisi}" />
</p:column>
<!-- <f:facet name="footer"> -->
<!-- </f:facet> -->
</p:dataTable>
<p:commandButton id="multiSelectButton" actionListener="#{sucBean.secilenleriGetir}" update=":form:tabView:tab2:map2"
value="Secilenleri Haritada Göster" icon="ui-icon-pin-s" />
<p:gmap zoom="12" type="HYBRID" center="40.78470,29.94873"
id="map2" model="#{sucBean.advancedModel2}"
style="width:740px;height:300px;margin:10px 0 0 -10px;">
When you reference a component inside container components like tabView or accordion, you don't need to include the actual tab id in your update target.
In your case update=":form:tabView:map2" would be the correct update target.

Resources