When I select one group from dataTable, I want to display corresponding users in pickList. When I move some users within pickList, I want these new values to be saved in bean's object even before submitting the values, or before selection in dataTable is changed.
When I move a user from source pickList to target pickList (or vice versa), and then change selection in dataTable, the pickList source and target values stay the same as the were when they got populated.
User.java
package com.test.model;
public class User {
private String userName;
public User(String userName) {
this.userName = userName;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
Group.java
package com.test.model;
import java.util.List;
public class Group {
private String groupName;
private List<User> users;
public Group(String groupName, List<User> users) {
this.groupName = groupName;
this.users = users;
}
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
UserBean.java
package com.test.beans;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import com.test.model.Group;
import com.test.model.User;
import org.primefaces.model.DualListModel;
@ManagedBean
@ViewScoped
public class UserBean {
private List<Group> groups = new ArrayList<>();
private List<User> allUsers = new ArrayList<>();
private Group selectedGroup;
private DualListModel<User> users = new DualListModel<>();
public List<Group> getGroups() {
return groups;
}
public Group getSelectedGroup() {
return selectedGroup;
}
public void setSelectedGroup(Group selectedGroup) {
this.selectedGroup = selectedGroup;
}
public DualListModel<User> getUsers() {
return users;
}
public void setUsers(DualListModel<User> users) {
this.users = users;
}
@PostConstruct
private void init() {
List<User> usersGroup1 = new ArrayList<>();
usersGroup1.add(new User("User1"));
usersGroup1.add(new User("User2"));
List<User> usersGroup2 = new ArrayList<>();
usersGroup2.add(new User("User3"));
usersGroup2.add(new User("User4"));
allUsers.addAll(usersGroup1);
allUsers.addAll(usersGroup2);
groups.add(new Group("Group1", usersGroup1));
groups.add(new Group("Group2", usersGroup2));
}
public void onRowSelect() {
// here I want to save the picklist source, but it is already reset
List<User> storeUsers = users.getSource();
fillPickList();
}
private void fillPickList() {
List<User> assignedUsers = new ArrayList<>();
List<User> availableUsers = new ArrayList<>();
assignedUsers.addAll(selectedGroup.getUsers());
availableUsers.addAll(allUsers);
for (User user : assignedUsers) {
if (availableUsers.contains(user))
availableUsers.remove(user);
}
users.setSource(assignedUsers);
users.setTarget(availableUsers);
}
}
index.xhtml
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:head>
<link rel="shortcut icon" type="image/x-icon" href="#{resource['images/favicon.ico']}"/>
</h:head>
<h:body>
<h:form>
<p:dataTable value="#{userBean.groups}"
var="group"
selectionMode="single"
selection="#{userBean.selectedGroup}"
rowKey="#{group.groupName}">
<p:column headerText="Groups">
<h:outputText value="#{group.groupName}"/>
</p:column>
<p:ajax event="rowSelect"
listener="#{userBean.onRowSelect}"
update="@form"/>
</p:dataTable>
<p:pickList value="#{userBean.users}"
var="user"
itemLabel="#{user.userName}"
itemValue="#{user.userName}"/>
</h:form>
</h:body>
</html>