AutoComplete displays suggestions while the input is being type. AutoComplete features various options, customizable content, multiple selection, effects and events.
Documentation<style type="text/css">
.ui-datalist .ui-datalist-content {
border:0 none
}
.ui-datalist ul {
padding: 0px 10px 0 20px;
margin: 5px 0;
}
.value {
font-weight: bold;
}
.ui-autocomplete-itemtip {
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box;
box-sizing: content-box;
}
</style>
<h:form>
<p:growl id="msgs" showDetail="true" skipDetailIfEqualsSummary="true" />
<h:panelGrid columns="2" cellpadding="5">
<p:outputLabel value="Simple:" for="acSimple" />
<p:autoComplete id="acSimple" value="#{autoCompleteView.txt1}" completeMethod="#{autoCompleteView.completeText}" />
<p:outputLabel value="Min Length (3):" for="acMinLength" />
<p:autoComplete id="acMinLength" minQueryLength="3" value="#{autoCompleteView.txt2}" completeMethod="#{autoCompleteView.completeText}" effect="fade" />
<p:outputLabel value="Delay(1000):" for="acDelay" />
<p:autoComplete id="acDelay" queryDelay="1000" value="#{autoCompleteView.txt3}" completeMethod="#{autoCompleteView.completeText}" effect="blind" />
<p:outputLabel value="Max Results(5):" for="acMaxResults" />
<p:autoComplete id="acMaxResults" maxResults="5" value="#{autoCompleteView.txt4}" completeMethod="#{autoCompleteView.completeText}" />
<p:outputLabel value="Force Selection:" for="acForce" />
<p:autoComplete id="acForce" forceSelection="true" value="#{autoCompleteView.txt5}" completeMethod="#{autoCompleteView.completeText}" />
<p:outputLabel value="DropDown:" for="dd" />
<p:autoComplete id="dd" dropdown="true" value="#{autoCompleteView.txt6}" completeMethod="#{autoCompleteView.completeText}" />
<p:outputLabel value="Cache:" for="cache" />
<p:autoComplete id="cache" cache="true" cacheTimeout="30000" value="#{autoCompleteView.txt7}" completeMethod="#{autoCompleteView.completeText}" />
<p:outputLabel value="Select Event:" for="event" />
<p:autoComplete id="event" value="#{autoCompleteView.txt8}" completeMethod="#{autoCompleteView.completeText}">
<p:ajax event="itemSelect" listener="#{autoCompleteView.onItemSelect}" update="msgs" />
</p:autoComplete>
<p:outputLabel value="Pojo:" for="themePojo" />
<p:autoComplete id="themePojo" value="#{autoCompleteView.theme1}" completeMethod="#{autoCompleteView.completeTheme}"
var="theme" itemLabel="#{theme.displayName}" itemValue="#{theme}" converter="#{themeConverter}" forceSelection="true" />
<p:outputLabel value="Custom Content:" for="themeCustom" />
<p:autoComplete id="themeCustom" value="#{autoCompleteView.theme2}" completeMethod="#{autoCompleteView.completeTheme}"
var="theme" itemLabel="#{theme.displayName}" itemValue="#{theme}" converter="#{themeConverter}" forceSelection="true">
<p:column>
<h:graphicImage name="showcase/images/themeswitcher/themeswitcher-#{theme.name}.png" alt="#{theme.name}" styleClass="ui-theme"/>
</p:column>
<p:column>
<h:outputText value="#{theme.displayName}" />
</p:column>
</p:autoComplete>
<p:outputLabel value="Multiple:" for="themes" />
<p:autoComplete id="themes" multiple="true" value="#{autoCompleteView.selectedThemes}" completeMethod="#{autoCompleteView.completeTheme}"
var="theme" itemLabel="#{theme.displayName}" itemValue="#{theme}" converter="#{themeConverter}" forceSelection="true">
<p:column style="width:10%">
<h:graphicImage name="showcase/images/themeswitcher/themeswitcher-#{theme.name}.png" alt="#{theme.name}" styleClass="ui-theme"/>
</p:column>
<p:column>
<h:outputText value="#{theme.displayName}" />
</p:column>
</p:autoComplete>
<p:outputLabel value="Itemtip:" for="itemTip" />
<p:autoComplete id="itemTip" value="#{autoCompleteView.theme3}" completeMethod="#{autoCompleteView.completeTheme}"
var="theme" itemLabel="#{theme.displayName}" itemValue="#{theme}" converter="#{themeConverter}">
<f:facet name="itemtip">
<h:panelGrid columns="2" cellpadding="5">
<f:facet name="header">
<h:graphicImage name="showcase/images/themeswitcher/themeswitcher-#{theme.name}.png" alt="#{theme.name}" styleClass="ui-theme" />
</f:facet>
<h:outputText value="Display:" />
<h:outputText value="#{theme.displayName}" />
<h:outputText value="Key" />
<h:outputText value="#{theme.name}" />
</h:panelGrid>
</f:facet>
</p:autoComplete>
<p:outputLabel value="Group:" for="group" />
<p:autoComplete id="group" value="#{autoCompleteView.theme4}" completeMethod="#{autoCompleteView.completeThemeContains}"
var="theme" itemLabel="#{theme.displayName}" itemValue="#{theme}" converter="#{themeConverter}" forceSelection="true"
groupBy="#{autoCompleteView.getThemeGroup(theme)}" scrollHeight="250"/>
</h:panelGrid>
<p:commandButton value="Submit" icon="pi pi-check" update="output msgs" oncomplete="PF('dlg').show()" />
<p:dialog header="Values" resizable="false" showEffect="fade" widgetVar="dlg">
<p:panelGrid id="output" columns="2" columnClasses="label, value">
<h:outputText value="Simple:" />
<h:outputText value="#{autoCompleteView.txt1}" />
<h:outputText value="Min Length" />
<h:outputText value="#{autoCompleteView.txt2}" />
<h:outputText value="Delay:" />
<h:outputText value="#{autoCompleteView.txt3}" />
<h:outputText value="Max Results:" />
<h:outputText value="#{autoCompleteView.txt4}" />
<h:outputText value="Force Selection:" />
<h:outputText value="#{autoCompleteView.txt5}" />
<h:outputText value="Dropdown:" />
<h:outputText value="#{autoCompleteView.txt6}" />
<h:outputText value="Cache:" />
<h:outputText value="#{autoCompleteView.txt7}" />
<h:outputText value="Select Event:" />
<h:outputText value="#{autoCompleteView.txt8}" />
<h:outputText value="Pojo:" />
<h:outputText value="#{autoCompleteView.theme1}" />
<h:outputText value="Custom Content:" />
<h:outputText value="#{autoCompleteView.theme2}" />
<h:outputText value="Multiple:" />
<p:dataList value="#{autoCompleteView.selectedThemes}" var="t">
<h:outputText value="#{t}" />
</p:dataList>
<h:outputText value="Itemtip:" />
<h:outputText value="#{autoCompleteView.theme3}" />
</p:panelGrid>
</p:dialog>
</h:form>@Named
@RequestScoped
public class AutoCompleteView {
private String txt1;
private String txt2;
private String txt3;
private String txt4;
private String txt5;
private String txt6;
private String txt7;
private String txt8;
private Theme theme1;
private Theme theme2;
private Theme theme3;
private Theme theme4;
private List<Theme> selectedThemes;
@Inject
private ThemeService service;
public List<String> completeText(String query) {
List<String> results = new ArrayList<>();
for(int i = 0; i < 10; i++) {
results.add(query + i);
}
return results;
}
public List<Theme> completeTheme(String query) {
String queryLowerCase = query.toLowerCase();
List<Theme> allThemes = service.getThemes();
return allThemes.stream().filter(t -> t.getName().toLowerCase().startsWith(queryLowerCase)).collect(Collectors.toList());
}
public List<Theme> completeThemeContains(String query) {
String queryLowerCase = query.toLowerCase();
List<Theme> allThemes = service.getThemes();
return allThemes.stream().filter(t -> t.getName().toLowerCase().contains(queryLowerCase)).collect(Collectors.toList());
}
public void onItemSelect(SelectEvent<String> event) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Item Selected", event.getObject()));
}
public String getTxt1() {
return txt1;
}
public void setTxt1(String txt1) {
this.txt1 = txt1;
}
public String getTxt2() {
return txt2;
}
public void setTxt2(String txt2) {
this.txt2 = txt2;
}
public String getTxt3() {
return txt3;
}
public void setTxt3(String txt3) {
this.txt3 = txt3;
}
public String getTxt4() {
return txt4;
}
public void setTxt4(String txt4) {
this.txt4 = txt4;
}
public String getTxt5() {
return txt5;
}
public void setTxt5(String txt5) {
this.txt5 = txt5;
}
public String getTxt6() {
return txt6;
}
public void setTxt6(String txt6) {
this.txt6 = txt6;
}
public String getTxt7() {
return txt7;
}
public void setTxt7(String txt7) {
this.txt7 = txt7;
}
public String getTxt8() {
return txt8;
}
public void setTxt8(String txt8) {
this.txt8 = txt8;
}
public Theme getTheme1() {
return theme1;
}
public void setTheme1(Theme theme1) {
this.theme1 = theme1;
}
public Theme getTheme2() {
return theme2;
}
public void setTheme2(Theme theme2) {
this.theme2 = theme2;
}
public Theme getTheme3() {
return theme3;
}
public void setTheme3(Theme theme3) {
this.theme3 = theme3;
}
public Theme getTheme4() {
return theme4;
}
public void setTheme4(Theme theme4) {
this.theme4 = theme4;
}
public List<Theme> getSelectedThemes() {
return selectedThemes;
}
public void setSelectedThemes(List<Theme> selectedThemes) {
this.selectedThemes = selectedThemes;
}
public void setService(ThemeService service) {
this.service = service;
}
public char getThemeGroup(Theme theme) {
return theme.getDisplayName().charAt(0);
}
}public class Theme {
private int id;
private String displayName;
private String name;
public Theme() {}
public Theme(int id, String displayName, String name) {
this.id = id;
this.displayName = displayName;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDisplayName() {
return displayName;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}@Named
@ApplicationScoped
public class ThemeService {
private List<Theme> themes;
@PostConstruct
public void init() {
themes = new ArrayList<>();
themes.add(new Theme(0, "Nova-Light", "nova-light"));
themes.add(new Theme(1, "Nova-Dark", "nova-dark"));
themes.add(new Theme(2, "Nova-Colored", "nova-colored"));
themes.add(new Theme(3, "Luna-Blue", "luna-blue"));
themes.add(new Theme(4, "Luna-Amber", "luna-amber"));
themes.add(new Theme(5, "Luna-Green", "luna-green"));
themes.add(new Theme(6, "Luna-Pink", "luna-pink"));
themes.add(new Theme(7, "Omega", "omega"));
}
public List<Theme> getThemes() {
return themes;
}
}@Named
@FacesConverter(value = "themeConverter", managed = true)
public class ThemeConverter implements Converter {
@Inject private ThemeService themeService;
@Override
public Object getAsObject(FacesContext fc, UIComponent uic, String value) {
if(value != null && value.trim().length() > 0) {
try {
return themeService.getThemes().get(Integer.parseInt(value));
} catch(NumberFormatException e) {
throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion Error", "Not a valid theme."));
}
}
else {
return null;
}
}
@Override
public String getAsString(FacesContext fc, UIComponent uic, Object object) {
if(object != null) {
return String.valueOf(((Theme) object).getId());
}
else {
return null;
}
}
}