PickList is a dual list input component featuring Drag and Drop based reordering, transition effects, pojo support, theming filtering, captions, checkbox selection, client-server callbacks, responsive layout and more.
<h:form>
<p:growl id="msg" showDetail="true" escape="false"/>
<div class="card">
<h5 style="margin-top: 0">Basic PickList</h5>
<p:pickList id="pickList" value="#{pickListView.cities}" var="cities" itemLabel="#{cities}" itemValue="#{cities}"/>
</div>
<div class="card">
<h5>Advanced</h5>
<p:pickList id="PojoPickList" value="#{pickListView.countries}" var="country"
itemValue="#{country}" itemLabel="#{country.name}" showSourceControls="true"
showTargetControls="true" showCheckbox="true"
showSourceFilter="true" showTargetFilter="true" filterMatchMode="contains"
converter="#{countryConverter}" responsive="true">
<f:facet name="sourceCaption">Available</f:facet>
<f:facet name="targetCaption">Starting</f:facet>
<p:ajax event="transfer" listener="#{pickListView.onTransfer}" update="msg"/>
<p:ajax event="select" listener="#{pickListView.onSelect}" update="msg"/>
<p:ajax event="unselect" listener="#{pickListView.onUnselect}" update="msg"/>
<p:ajax event="reorder" listener="#{pickListView.onReorder}" update="msg"/>
<p:column style="width:94%">
<div class="p-d-flex p-ai-center">
<span class="flag flag-#{country.code} p-mr-2" style="width: 30px; height: 20px" />
<h:outputText value="#{country.name}"/>
</div>
</p:column>
</p:pickList>
</div>
</h:form>
@Named
@RequestScoped
public class PickListView {
@Inject
private CountryService service;
private DualListModel<String> cities;
private DualListModel<Country> countries;
@PostConstruct
public void init() {
//Cities
List<String> citiesSource = new ArrayList<>();
List<String> citiesTarget = new ArrayList<>();
citiesSource.add("San Francisco");
citiesSource.add("London");
citiesSource.add("Paris");
citiesSource.add("Istanbul");
citiesSource.add("Berlin");
citiesSource.add("Barcelona");
citiesSource.add("Rome");
cities = new DualListModel<>(citiesSource, citiesTarget);
//Countries
List<Country> countriesSource = service.getCountries().subList(0, 10);
List<Country> countriesTarget = new ArrayList<>();
countries = new DualListModel<>(countriesSource, countriesTarget);
}
public DualListModel<String> getCities() {
return cities;
}
public void setCities(DualListModel<String> cities) {
this.cities = cities;
}
public CountryService getService() {
return service;
}
public void setService(CountryService service) {
this.service = service;
}
public DualListModel<Country> getCountries() {
return countries;
}
public void setCountries(DualListModel<Country> countries) {
this.countries = countries;
}
public void onTransfer(TransferEvent event) {
StringBuilder builder = new StringBuilder();
for(Object item : event.getItems()) {
builder.append(((Country) item).getName()).append("<br />");
}
FacesMessage msg = new FacesMessage();
msg.setSeverity(FacesMessage.SEVERITY_INFO);
msg.setSummary("Items Transferred");
msg.setDetail(builder.toString());
FacesContext.getCurrentInstance().addMessage(null, msg);
}
public void onSelect(SelectEvent<Country> event) {
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Item Selected", event.getObject().getName()));
}
public void onUnselect(UnselectEvent<Country> event) {
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Item Unselected", event.getObject().getName()));
}
public void onReorder() {
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "List Reordered", null));
}
}
@Named
@ApplicationScoped
public class CountryService {
private List<Country> countries;
@PostConstruct
public void init() {
countries = new ArrayList<>();
String[] locales = Locale.getISOCountries();
for (int i = 0; i < locales.length; i++) {
Locale country = new Locale("", locales[i]);
countries.add(new Country(i, country.getDisplayCountry(), country.getCountry().toLowerCase()));
}
Collections.sort(countries, (Country c1, Country c2) -> c1.getName().compareTo(c2.getName()));
}
public List<Country> getCountries() {
return new ArrayList<>(countries);
}
}