[SmartClient Version: v11.0p_2016-10-07/PowerEdition Deployment (built 2016-10-07)]
It's probably worth pointing out that this has worked fine for us, and continues to do so in SmartClient Version: v10.0p_2016-02-18/PowerEdition Deployment (built 2016-02-18).
We have a custom class (IpCodeNameCombobox) that extends ComboBoxItem. This class sets an initHandler which I have simplified in the below example to call setPickListFields() and setFilterFields(), passing valueField and displayField to each.
If I declare a control as an IpCodeNameCombobox, it renders as expected, with both fields contained in the dropdown and used for filtering purposes.
However, if I declare the control as a FormItem and allow it to render based on the editorType attribute defined for the corresponding field in the datasource, although the initHander is called with what appear to be the correct values (observed through the browser's debugger), the control does render as a combo but only shows and filters on the displayField.
To see this just make the modifications included below to the BuiltInDS sample. When you run it, click on "Animals" and a single field will render as a combo, but will only show item names in the dropdown. Change the code that instantiates a FormItem to instead instantiate an IpCodeNameCombobox and the combo will instead render both SKU and itemName, as expected. Remove the boundForm.setFields(combo); line and the field will again render as expected.
Regards,
Gary O'Donnell
1) Add the following class to the project:
2) Modify the definition of commonName in animals.ds.xml:
3) Modify BuildInDS.java by adding the two lines delineated by "MODIFICATION # 1 START/END":
It's probably worth pointing out that this has worked fine for us, and continues to do so in SmartClient Version: v10.0p_2016-02-18/PowerEdition Deployment (built 2016-02-18).
We have a custom class (IpCodeNameCombobox) that extends ComboBoxItem. This class sets an initHandler which I have simplified in the below example to call setPickListFields() and setFilterFields(), passing valueField and displayField to each.
If I declare a control as an IpCodeNameCombobox, it renders as expected, with both fields contained in the dropdown and used for filtering purposes.
However, if I declare the control as a FormItem and allow it to render based on the editorType attribute defined for the corresponding field in the datasource, although the initHander is called with what appear to be the correct values (observed through the browser's debugger), the control does render as a combo but only shows and filters on the displayField.
To see this just make the modifications included below to the BuiltInDS sample. When you run it, click on "Animals" and a single field will render as a combo, but will only show item names in the dropdown. Change the code that instantiates a FormItem to instead instantiate an IpCodeNameCombobox and the combo will instead render both SKU and itemName, as expected. Remove the boundForm.setFields(combo); line and the field will again render as expected.
Regards,
Gary O'Donnell
1) Add the following class to the project:
Code:
package com.smartgwt.sample.client; import com.google.gwt.core.client.JavaScriptObject; import com.smartgwt.client.bean.BeanFactory; import com.smartgwt.client.widgets.form.fields.ComboBoxItem; import com.smartgwt.client.widgets.form.fields.FormItem; import com.smartgwt.client.widgets.form.fields.events.FormItemInitHandler; import com.smartgwt.client.widgets.grid.ListGridField; @BeanFactory.Generate public class IpCodeNameCombobox extends ComboBoxItem { public IpCodeNameCombobox() { super(); init(); } public IpCodeNameCombobox(JavaScriptObject jso) { super(jso); init(); } public IpCodeNameCombobox(String name) { super(name); init(); } public IpCodeNameCombobox(String name, String title) { super(name, title); init(); } private void init() { final ComboBoxItem me = this; setInitHandler(new FormItemInitHandler() { @Override public void onInit(FormItem itemIn) { me.setPickListFields( new ListGridField(me.getValueField()), new ListGridField(me.getDisplayField())); me.setFilterFields(me.getValueField(), me.getDisplayField()); } }); } }
2) Modify the definition of commonName in animals.ds.xml:
Code:
<field name="commonName" title="Animal" type="text" optionDataSource="supplyItem" valueField="SKU" displayField="itemName" editorType="com.smartgwt.sample.client.IpCodeNameCombobox"/>
3) Modify BuildInDS.java by adding the two lines delineated by "MODIFICATION # 1 START/END":
Code:
package com.smartgwt.sample.client; import com.google.gwt.core.client.EntryPoint; import com.smartgwt.client.core.KeyIdentifier; import com.smartgwt.client.data.DataSource; import com.smartgwt.client.data.Record; import com.smartgwt.client.types.SelectionStyle; import com.smartgwt.client.types.SortArrow; import com.smartgwt.client.util.PageKeyHandler; import com.smartgwt.client.util.Page; import com.smartgwt.client.util.SC; import com.smartgwt.client.widgets.IButton; import com.smartgwt.client.widgets.Label; import com.smartgwt.client.widgets.events.ClickEvent; import com.smartgwt.client.widgets.events.ClickHandler; import com.smartgwt.client.widgets.form.DynamicForm; import com.smartgwt.client.widgets.form.fields.ComboBoxItem; import com.smartgwt.client.widgets.form.fields.FormItem; import com.smartgwt.client.widgets.grid.ListGrid; import com.smartgwt.client.widgets.grid.ListGridField; import com.smartgwt.client.widgets.grid.ListGridRecord; import com.smartgwt.client.widgets.grid.events.RecordClickEvent; import com.smartgwt.client.widgets.grid.events.RecordClickHandler; import com.smartgwt.client.widgets.layout.HLayout; import com.smartgwt.client.widgets.layout.VStack; import com.smartgwt.client.widgets.viewer.DetailViewer; /** * Entry point classes define <code>onModuleLoad()</code>. */ public class BuiltInDS implements EntryPoint { private ListGrid boundList; private DynamicForm boundForm; private IButton saveBtn; private DetailViewer boundViewer; private IButton newBtn; /** * This is the entry point method. */ public void onModuleLoad() { KeyIdentifier debugKey = new KeyIdentifier(); debugKey.setCtrlKey(true); debugKey.setKeyName("D"); Page.registerKey(debugKey, new PageKeyHandler() { public void execute(String keyName) { SC.showConsole(); } }); ListGrid grid = new ListGrid(); grid.setLeft(20); grid.setTop(75); grid.setWidth(130); grid.setLeaveScrollbarGap(false); grid.setShowSortArrow(SortArrow.NONE); grid.setCanSort(false); grid.setFields(new ListGridField("dsTitle", "Select a DataSource")); grid.setData(new ListGridRecord[]{ new DSRecord("Animals", "animals"), new DSRecord("Office Supplies", "supplyItem"), new DSRecord("Employees", "employees")} ); grid.setSelectionType(SelectionStyle.SINGLE); grid.addRecordClickHandler(new RecordClickHandler() { public void onRecordClick(RecordClickEvent event) { DSRecord record = (DSRecord) event.getRecord(); bindComponents(record.getDsName()); } }); grid.draw(); VStack vStack = new VStack(); vStack.setLeft(175); vStack.setTop(75); vStack.setWidth("70%"); vStack.setMembersMargin(20); Label label = new Label(); label.setContents("<ul>" + "<li>select a datasource from the list at left to bind to these components</li>" + "<li>click a record in the grid to view and edit that record in the form</li>" + "<li>click <b>New</b> to start editing a new record in the form</li>" + "<li>click <b>Save</b> to save changes to a new or edited record in the form</li>" + "<li>click <b>Clear</b> to clear all fields in the form</li>" + "<li>click <b>Filter</b> to filter (substring match) the grid based on form values</li>" + "<li>click <b>Fetch</b> to fetch records (exact match) for the grid based on form values</li>" + "<li>double-click a record in the grid to edit inline (press Return, or arrow/tab to another record, to save)</li>" + "</ul>"); vStack.addMember(label); boundList = new ListGrid(); boundList.setHeight(200); boundList.setCanEdit(true); boundList.addRecordClickHandler(new RecordClickHandler() { public void onRecordClick(RecordClickEvent event) { Record record = event.getRecord(); boundForm.editRecord(record); saveBtn.enable(); boundViewer.viewSelectedData(boundList); } }); vStack.addMember(boundList); boundForm = new DynamicForm(); boundForm.setNumCols(6); boundForm.setAutoFocus(false); vStack.addMember(boundForm); HLayout hLayout = new HLayout(10); hLayout.setMembersMargin(10); hLayout.setHeight(22); saveBtn = new IButton("Save"); saveBtn.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { boundForm.saveData(); if (!boundForm.hasErrors()) { boundForm.clearValues(); saveBtn.disable(); } } }); hLayout.addMember(saveBtn); newBtn = new IButton("New"); newBtn.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { boundForm.editNewRecord(); saveBtn.enable(); } }); hLayout.addMember(newBtn); IButton clearBtn = new IButton("Clear"); clearBtn.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { boundForm.clearValues(); saveBtn.disable(); } }); hLayout.addMember(clearBtn); IButton filterBtn = new IButton("Filter"); filterBtn.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { boundList.filterData(boundForm.getValuesAsCriteria()); saveBtn.disable(); } }); hLayout.addMember(filterBtn); IButton fetchBtn = new IButton("Fetch"); fetchBtn.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { boundList.fetchData(boundForm.getValuesAsCriteria()); saveBtn.disable(); } }); hLayout.addMember(fetchBtn); vStack.addMember(hLayout); boundViewer = new DetailViewer(); vStack.addMember(boundViewer); vStack.draw(); } private void bindComponents(String dsName) { DataSource ds = DataSource.get(dsName); boundList.setDataSource(ds); boundViewer.setDataSource(ds); boundForm.setDataSource(ds); // *** MODIFICATION #1 START FormItem combo = new FormItem("commonName"); boundForm.setFields(combo); // *** MODIFICATION #1 END boundList.fetchData(); newBtn.enable(); saveBtn.disable(); } }
Comment