Suggested case list:
Using timer to refresh a grid
383guest172.69.33.12125nk0uiMay 7, 2020 7:23:47 AMlinkuser model to move item to another listbox
120guest162.158.193.148d0n3krApr 2, 2020 5:28:28 AMlinkDisabled list item row passed to VM-1981
296fatih123160.83.36.13025nk0uiFeb 13, 2018 4:25:44 PMlinkDisabled list item row passed to VM-1981
295fatih123160.83.36.13025nk0uiFeb 13, 2018 4:25:16 PMlinkDisabled list item row passed to VM-1981
294fatih123160.83.36.13225nk0uiFeb 13, 2018 3:30:44 PMlinkgrid sample with ListModel/RowRenderer
816guest80.82.2.1312vah9ajFeb 21, 2017 11:42:21 AMlinkgrid sample with ListModel/RowRenderer
809guest175.98.113.1622vah9ajJan 26, 2017 9:19:33 AMlinkgrid sample with ListModel/RowRenderer
196guest79.185.142.402vah9ajApr 26, 2014 10:53:57 PMlinkgrid sample with ListModel/RowRenderer
195guest79.185.142.402vah9ajApr 26, 2014 10:53:54 PMlinkgrid sample with ListModel/RowRenderer
194guest79.185.142.402vah9ajApr 26, 2014 10:53:51 PMlinkgrid sample with ListModel/RowRenderer
193guest79.185.142.402vah9ajApr 26, 2014 10:53:48 PMlinkgrid sample with ListModel/RowRenderer
192guest79.185.142.402vah9ajApr 26, 2014 10:53:44 PMlinkgrid sample with ListModel/RowRenderer
191guest79.185.142.402vah9ajApr 26, 2014 10:53:40 PMlinkHierarchy table without using ZK PE/EE
1aaknai151.28.135.2131s871daJul 29, 2013 11:02:46 PMlinkgrid sample with ListModel/RowRenderer
128aaknai151.28.135.2132vah9ajJul 29, 2013 7:20:00 PMlinkuser model to move item to another listbox
1TonyQ114.25.109.94d0n3krApr 21, 2012 10:43:27 AMlinkUsing timer to refresh a grid
1TonyQ220.133.44.3725nk0uiFeb 17, 2012 3:17:34 AMlinkFire a event from child iframe
1TonyQ220.133.44.372eupjotFeb 3, 2012 5:04:52 AMlinkTextbox input restriction sample
1TonyQ72.21.245.2431b3nlr0Dec 20, 2011 10:09:10 AMlinkTest web core taglib in ZUL
1TonyQ198.203.175.175ofqkemDec 17, 2011 3:36:08 AMlinkLatest 10 Fiddles :
constraint binding textbox
3guest172.68.151.16220peldaDec 5, 2025 5:08:19 PMlinkAnother new ZK fiddle
2guest172.68.151.16320peldaDec 5, 2025 5:07:51 PMlinkAnother new ZK fiddle
1guest172.68.151.16220peldaDec 5, 2025 5:07:32 PMlinkAnother new ZK fiddle
1peggypeng172.71.154.99364f4neDec 5, 2025 9:24:31 AMlinktooltip example
2guest104.22.23.13rc1ntoDec 4, 2025 2:23:45 PMlinkAnother new ZK fiddle
1guest172.69.134.2277t7602Dec 4, 2025 1:40:46 PMlinkAnother new ZK fiddle
1peggypeng104.22.17.1802df6e3oDec 4, 2025 8:41:29 AMlinkonClose
1peggypeng172.68.87.248j8kd8aDec 3, 2025 4:10:26 AMlinkAnother new ZK fiddle
1peggypeng172.69.134.2271rm7f4eNov 26, 2025 3:31:24 AMlinkZK-5912-Suggestion
2rebeccalai104.22.20.1442qrmiiuNov 26, 2025 2:07:15 AMlinkAnother new ZK fiddle
3guest14.141.67.2183arppreJan 24, 2018 4:52:35 AMlinkresources
index.zulzul<zk>
<portallayout onDrop="@command('dff')"
viewModel="@id('vm') @init('PropertyAdvanceSearchViewModel')">
<portalchildren style="padding: 25px;" width="50%">
<panel border="normal" style="margin-bottom:10px;"
width="100%">
<panelchildren>
<amandaSelectBox instant="true"
style="display: table-cell;" onOK="@command('retrieve')"
id="property_advanceSearch_StreetName_component"
model="@load(vm.propStreetList)" descriptionMode="true"
selectedItem="@bind(vm.selectedPropStreetName.value)"
value="@bind(vm.inputStreet)"
tooltiptext="${vm.getText('PeopleDetail:FIELD_ADDRSTREET')}"
placeholder="${vm.getText('PeopleDetail:FIELD_ADDRSTREET')}"
onSelect="@command('onSelectStreet')"
onChange="@command('updateStreetModel',val=self.text)">
</amandaSelectBox>
</panelchildren>
</panel>
</portalchildren>
</zk>
TestComposer.javajavaimport org.zkoss.zk.ui.*;
import org.zkoss.zk.ui.event.*;
import org.zkoss.zk.ui.util.*;
import org.zkoss.zk.ui.ext.*;
import org.zkoss.zk.au.*;
import org.zkoss.zk.au.out.*;
import org.zkoss.zul.*;
public class TestComposer extends GenericForwardComposer{
public void doAfterCompose(Component comp) throws Exception {
super.doAfterCompose(comp);
}
public void onClick$btn(Event e) throws InterruptedException{
Messagebox.show("Hi btn");
}
}
PropertyAdvanceSearchViewModel.javajavaimport org.zkoss.zk.ui.*;
import org.zkoss.zk.ui.event.*;
import org.zkoss.zk.ui.util.*;
import org.zkoss.zk.ui.ext.*;
import org.zkoss.zk.au.*;
import org.zkoss.zk.au.out.*;
import org.zkoss.zul.*;
public class PropertyAdvanceSearchViewModel{
@AfterCompose
public void afterCompose(){
}
}
AmandaSelectBox.javajavapackage com.csdcsystems.amanda.component;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.zkoss.json.JSONArray;
import org.zkoss.json.JSONObject;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.sys.ContentRenderer;
import org.zkoss.zul.Textbox;
import com.csdcsystems.amanda.common.Message;
import com.csdcsystems.amanda.core.AmandaConfig;
import com.csdcsystems.amanda.core.CsdcStringUtils;
import com.csdcsystems.amanda.service.Services;
/**
* Implementation of org.zkoss.zul.Textbox, creates JsonObject from stage and sends it to amandaselectbox framework to render data in drop down
* format. Widget class zul.selectbox.Amandaselectbox.
*/
public class AmandaSelectBox extends Textbox {
private static final long serialVersionUID = 2969910247216973979L;
private final Logger LOGGER = LoggerFactory.getLogger(AmandaSelectBox.class);
private List<?> _model;
private Object _selectedItem;
private boolean _open;
private String _style;
private boolean _choosenMode;
private Set<Object> _selectedItems;
private Set<Integer> _selectedIndices;
private boolean _creatable;
private String _createMessage;
private String _emptyMessage;
private boolean _descriptionMode;
private boolean _buttonVisible=true;
private String _parentContainer;
/**
* Method is called to render all properties that will be sent to the client for creating a selectbox widget.
*/
protected void renderProperties(ContentRenderer renderer) throws java.io.IOException {
LOGGER.info("Inside renderProperties method ");
super.renderProperties(renderer);
render(renderer, "selectedIndices", getIndicesAsJsonArry());
render(renderer, "style", _style);
render(renderer, "choosenMode", _choosenMode);
render(renderer, "descriptionMode", _descriptionMode);
render(renderer, "buttonVisible", _buttonVisible);
render(renderer, "parentContainer", _parentContainer);
render(renderer, "model", getRow());
if(_choosenMode){
render(renderer, "createMessage", _createMessage);
render(renderer, "creatable", _creatable);
render(renderer,"emptyMessage", _emptyMessage);
}
addEventListner();
LOGGER.info("All properties Rendered");
}
/**
* Creating Array of JsonObject from Model. Responsible for creating row, shown in dropdown
*/
private JSONArray getRow() {
JSONArray jsonArray = new JSONArray();
if (_model != null && _model.size() > 0) {
if (_model.get(0) instanceof String) {
for (Object object : _model) {
if (object != null) {
jsonArray.add(object);
}
}
} else {
List<AmandaSelectItem> itemList = generateAsItemList(_model);
for (AmandaSelectItem item : itemList) {
if (item != null) {
if (_descriptionMode) {
JSONObject obj = new JSONObject();
obj.put("label", item.getDescription());
obj.put("description", item.getLabel());
jsonArray.add(obj);
} else {
jsonArray.add(item.getLabel());
}
}
}
}
}
return jsonArray;
}
/**
* Method can be used to add custom event listeners to amandaselectbox.
*/
private void addEventListner() {
this.addEventListener("onClickOfItem", new EventListener<Event>() {
@Override
public void onEvent(Event event) throws Exception {
JSONObject job = (JSONObject) event.getData();
Integer index = Integer.valueOf(job.get("index").toString());
if(_model==null || _model.isEmpty() || index >= _model.size()){
return;
}
Object obj = index!=-1 ? _model.get(index):null;
setSelectedItem(obj);
if (isChoosenMode()) {
if (job.get("op") != null && job.get("op").equals("remove")) {
getSelectedItems().remove(obj);
_selectedIndices.remove(index);
} else {
getSelectedItems().add(obj);
_selectedIndices.add(index);
}
} else {
_selectedIndices.clear();
_selectedIndices.add(index);
if (_model != null && _model.size() > 0) {
if (obj instanceof String) {
setValue(String.valueOf(obj));
} else {
List<AmandaSelectItem> item = generateAsItemList(Arrays.asList(_selectedItem));
if (item.size() > 0) {
String value = item.get(0).getLabel();
setValue(value);
} else {
setValue(null);
}
}
}
}
smartUpdate("selectedIndices", getIndicesAsJsonArry());
}
});
this.addEventListener("onClose", new EventListener<Event>() {
@Override
public void onEvent(Event arg0) throws Exception {
_open = false;
}
});
}
/**
* Creates list of AmandaSelectItem, if Model is List of Object other than String.
*/
private List<AmandaSelectItem> generateAsItemList(List<?> objectList) {
List<AmandaSelectItem> list = new ArrayList<>();
try {
for (Object data : objectList) {
if (data != null) {
try {
AmandaSelectItem item = new AmandaSelectItem();
item.setLabel(String.valueOf(PropertyUtils.getProperty(data, "label")));
item.setDescription(String.valueOf(PropertyUtils.getProperty(data, "value")));
list.add(item);
} catch (NoSuchMethodException e) {
if (AmandaConfig.isDevMode()) {
Message.show("Error", e.getMessage(), Message.ERROR);
}
}
}
}
} catch (IllegalAccessException | InvocationTargetException e) {
LOGGER.error("Exception in generateAsItemList method ", e);
}
return list;
}
public List<?> getModel() {
return _model;
}
public void setModel(List<?> _model) {
this._model = _model;
getSelectedIndices().clear();
Set<Integer> indices = new LinkedHashSet<Integer>();
if (isChoosenMode()) {
for (Object item : getSelectedItems()) {
indices.add(_model.indexOf(item));
}
} else {
if(_model.indexOf(getSelectedItem())!=-1){
indices.add(_model.indexOf(getSelectedItem()));
}
}
setSelectedIndices(indices);
smartUpdate("model", getRow());
}
public Object getSelectedItem() {
return _selectedItem;
}
public void setSelectedItem(Object _selectedItem) {
this._selectedItem = _selectedItem;
Set<Integer> indices =new LinkedHashSet<Integer>();
if (_model != null) {
for (int i = 0; i < getModel().size(); i++) {
if (Objects.equals(getModel().get(i), _selectedItem)) {
this._selectedItem = getModel().get(i);
indices.add(i);
break;
}
}
if(indices.isEmpty() && (CsdcStringUtils.isBlank(getValue()))){
setValue(null);
}
setSelectedIndices(indices);
}
}
public boolean isOpen() {
return _open;
}
public void setOpen(boolean _open) {
this._open = _open;
smartUpdate("open", _open);
}
public String getStyle() {
return _style;
}
public void setStyle(String _style) {
this._style = _style;
smartUpdate("style", _style);
}
public boolean isChoosenMode() {
return _choosenMode;
}
public void setChoosenMode(boolean _choosenMode) {
this._choosenMode = _choosenMode;
}
public Set<Object> getSelectedItems() {
if (_selectedItems == null) {
_selectedItems = new LinkedHashSet<>();
}
return _selectedItems;
}
public void setSelectedItems(Set<Object> _selectedItems) {
this._selectedItems = _selectedItems;
if (getModel() != null) {
this._selectedItems = new LinkedHashSet<>();
if (_selectedItems != null) {
Iterator<Object> it = _selectedItems.iterator();
Set<Integer> indices = new LinkedHashSet<Integer>();
while (it.hasNext()) {
Object obj = it.next();
for (int i = 0; i < getModel().size(); i++) {
if (Objects.equals(getModel().get(i), obj)) {
this._selectedItems.add(getModel().get(i));
indices.add(i);
break;
}
}
}
setSelectedIndices(indices);
}else{
setSelectedIndices(null);
}
}
}
public Set<Integer> getSelectedIndices() {
if (_selectedIndices == null) {
_selectedIndices = new LinkedHashSet<Integer>();
}
return _selectedIndices;
}
public void setSelectedIndices(Set<Integer> _selectedIndices) {
this._selectedIndices = _selectedIndices;
smartUpdate("selectedIndices", getIndicesAsJsonArry());
}
public boolean isCreatable() {
return _creatable;
}
public void setCreatable(boolean _creatable) {
this._creatable = _creatable;
smartUpdate("creatable", _creatable);
}
public String getCreateMessage() {
return _createMessage;
}
public void setCreateMessage(String _createMessage) {
this._createMessage = _createMessage;
smartUpdate("createMessage", _createMessage);
}
public String getEmptyMessage() {
return _emptyMessage;
}
public void setEmptyMessage(String _emptyMessage) {
this._emptyMessage = _emptyMessage;
smartUpdate("emptyMessage", _emptyMessage);
}
private JSONArray getIndicesAsJsonArry() {
JSONArray array = new JSONArray();
for (Integer i : getSelectedIndices()) {
array.add(i);
}
return array;
}
public void setId(String id) {
if (StringUtils.isNotBlank(id) && Services.pageCustomizationService().getCustomizationPermission()) {
this.setWidgetAttribute("aid", id);
}
super.setId(id);
}
public boolean isDescriptionMode() {
return _descriptionMode;
}
public void setDescriptionMode(boolean _descriptionMode) {
this._descriptionMode = _descriptionMode;
smartUpdate("descriptionMode", _descriptionMode);
}
public boolean isButtonVisible() {
return _buttonVisible;
}
public void setButtonVisible(boolean _buttonVisible) {
this._buttonVisible = _buttonVisible;
smartUpdate("buttonVisible", _buttonVisible);
}
public String getParentContainer() {
return _parentContainer;
}
/**
* parentContainer used as to set width of container in which items will be shown.
*/
public void setParentContainer(String _parentContainer) {
this._parentContainer = _parentContainer;
smartUpdate("parentContainer", _parentContainer);
}
private class AmandaSelectItem {
private String label;
private String description;
private String iconClass;
private String group;
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@SuppressWarnings("unused")
public String getIconClass() {
return iconClass;
}
@SuppressWarnings("unused")
public void setIconClass(String iconClass) {
this.iconClass = iconClass;
}
@SuppressWarnings("unused")
public String getGroup() {
return group;
}
@SuppressWarnings("unused")
public void setGroup(String group) {
this.group = group;
}
}
}