Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
Clear All
new posts

  • Problem with TextItem for multiple records after upgrading

    SmartGWT 4.1p EE
    GWT 2.5.1
    FF 61.0.1, IE 11.1266, Chrome 69.0.3497.100
    FF 26.0 (used in GWT Dev Mode)

    Recently we upgraded our application from SmartGWT 4.1d to 4.1p to take advantage of the bug fix for FireFox scrollbar animation. While regression testing the application we discovered a problem introduced with this upgrade.

    Originally in SmartGWT Pro 2.1 we had developed a component which extended a TextItem that allows a user able to enter a comma delimited list of codes. These codes represent child records of a parent record. The DataSource field associated with the TextItem has been tagged with multiple=true.

    In the attached example application, the DynamicForm has two TextItem fields, one for a country, and the other TextItem for the states in the country. The states TextItem is the one which has been extended to allow the user to enter a list of comma separated states. For example if the user entered CO,NY,WI then 3 records would be created. A FormItemValueParser was created to map the display value to a data value for storage and a FormItemValueFormatter to format the data value for display.

    The above implementation worked until the upgrade to SmartGWT 4.1p. Now the following problem occurs. For browsers FF 26 and Chrome 69.0.3497.100, the symptoms are that the last state code is always truncated (except for the first character) when the user tabs out of the field. So if 'co,ny' is entered then after tabbing out of the field the state field will be 'CO,N'. For browsers FF 61.0.1 and IE 11.1266 the entry is not being uppercased (which occurs in the FormItemValueParser method) when tabbing out of the 'States' field. The other strange behavior is that this problem does not manifest itself when running in GWT Dev Mode in FF 26. In that case the application behaves normally (which makes the problem difficult to diagnose).

    The code to reproduce this problem is below. Note that the problem does NOT occur in GWT Dev Mode, so the application must be built and deployed to a web server.

    Code:
    package com.smartgwt.sample.client;
    
    
    import java.util.ArrayList;
    import java.util.List;
    
    import com.google.gwt.core.client.EntryPoint;
    import com.google.gwt.core.client.JavaScriptObject;
    import com.smartgwt.client.core.KeyIdentifier;
    import com.smartgwt.client.data.DataSource;
    import com.smartgwt.client.data.DataSourceField;
    import com.smartgwt.client.data.Record;
    import com.smartgwt.client.types.DSDataFormat;
    import com.smartgwt.client.types.FieldType;
    import com.smartgwt.client.util.JSOHelper;
    import com.smartgwt.client.util.KeyCallback;
    import com.smartgwt.client.util.Page;
    import com.smartgwt.client.util.SC;
    import com.smartgwt.client.widgets.form.DynamicForm;
    import com.smartgwt.client.widgets.form.FormItemValueFormatter;
    import com.smartgwt.client.widgets.form.FormItemValueParser;
    import com.smartgwt.client.widgets.form.fields.FormItem;
    import com.smartgwt.client.widgets.form.fields.FormItemIcon;
    import com.smartgwt.client.widgets.form.fields.TextItem;
    import com.smartgwt.client.widgets.layout.VLayout;
    
    /**
     * Entry point classes define onModuleLoad()
     */
    public class BuiltInDS implements EntryPoint {
    
        /**
         * This is the entry point method.
         */
        public void onModuleLoad() {
            KeyIdentifier debugKey = new KeyIdentifier();
            debugKey.setCtrlKey(true);
            debugKey.setKeyName("D");
    
            Page.registerKey( debugKey, new KeyCallback()
            {
                public void execute(String keyName)
                {
                    SC.showConsole();
                }
            } );
    
    
            final DynamicForm form = new DynamicForm();
            DataSource ds = CountryDS.getInstance();
            form.setDataSource( ds );
    
            TextItem countryName = new TextItem( "countryName" );
    
            MultiValueItem state = new MultiValueItem( "state", "States" );
            state.setEditorValueParser( multiValueParser() );
            state.setEditorValueFormatter( multiValueFormatter() );    
    
            form.setFields( countryName, state );
    
    
            VLayout main = new VLayout();
            main.addMember( form );
    
            main.draw();        
        }
    
        public FormItemValueParser multiValueParser()
        {
            FormItemValueParser valueParser = new FormItemValueParser()
            {
                @Override
                public Object parseValue(String value, DynamicForm form, FormItem item)
                {
                     if (value == null) 
                     {
                            return null;
                     }    
                        String idents[] = value.split( "," );
                        List<Record> values = new ArrayList<Record>();
                        for (int i = 0; i < idents.length; i++)
                        {
                            if (idents[i] == null || idents[i] == "") continue;
                            Record r = new Record();
                            r.setAttribute("stateCode", idents[i].toUpperCase().trim());
                            values.add(r);
                        }
                        return JSOHelper.convertToJavaScriptArray(values.toArray());
                }
    
            };
            return valueParser;
        }
    
        public FormItemValueFormatter multiValueFormatter()
        {
            FormItemValueFormatter valueFormatter = new FormItemValueFormatter()
            {
                @Override
                public String formatValue(Object value, Record record, DynamicForm form, FormItem item)
                {
                    return fetchDisplayString( value, "stateCode" );
                }
            };
            return valueFormatter;            
        }
    
        private class MultiValueItem extends TextItem
        {
            public MultiValueItem(String name, String title)
            {
                super( name, title );
                setName( name );
                setTitle( title );
                setEditorType( this );
    
                FormItemIcon formItemIcon = new FormItemIcon();
                setIcons( formItemIcon );
            }
        }
    
        private static class CountryDS extends DataSource
        {
            // The DataSource would normally be defined external to any classes that use it.  
            private static CountryDS instance = null;
    
            public static CountryDS getInstance()
            {
                if ( instance == null )
                {
                    instance = new CountryDS( "countryDS_XML" );
                }
                return instance;
            }
    
            public CountryDS(String id)
            {
                setID( id );
                setDataFormat( DSDataFormat.XML );
                setRecordXPath( "/List/country" );
                DataSourceField countryCodeField = new DataSourceField( "countryCode", FieldType.TEXT, "Code" );
                DataSourceField countryNameField = new DataSourceField( "countryName", FieldType.TEXT, "Country" );
                DataSourceField capitalField = new DataSourceField( "capital", FieldType.TEXT, "Capital" );
                DataSourceField stateField = new DataSourceField();
                stateField.setName( "state" );
                stateField.setTypeAsDataSource( StateDS.getInstance() );
                stateField.setTitle( "States" );
                stateField.setMultiple(true);
                setFields( countryCodeField, countryNameField, capitalField, stateField );
                setDataURL( "ds/test_data/country.data.xml" );
                setClientOnly(true);
            }
        }
    
        private static class StateDS extends DataSource
        {
            // The DataSource would normally be defined external to any classes that use it.  
    
            private static StateDS instance = null;
    
            public static StateDS getInstance()
            {
                if ( instance == null )
                {
                    instance = new StateDS( "stateDS_XML" );
                }
                return instance;
            }
    
            public StateDS(String id)
            {
                setID( id );
                setDataFormat( DSDataFormat.XML );
                setRecordXPath( "/List/country/state" );
                DataSourceField stateCodeField = new DataSourceField( "stateCode", FieldType.TEXT, "Code" );
                DataSourceField stateNameField = new DataSourceField( "stateName", FieldType.TEXT, "State" );
                DataSourceField capitalField = new DataSourceField( "capital", FieldType.TEXT, "Capital" );
                setFields( stateCodeField, stateNameField, capitalField );
                setDataURL( "ds/test_data/country.data.xml" );
                setClientOnly(true);
            }
        }
    
        public static String fetchDisplayString(Object value, String fieldname)
        {
    
            if ( value != null && JSOHelper.isJSO( value ) )
            {
                String str = "";
                try
                {    
                    JavaScriptObject jso = (JavaScriptObject) value;
    
                    if ( JSOHelper.isArray( jso ))
                    {
                        int iLen = JSOHelper.arrayLength(jso);
                        for (int i = 0; i < iLen; i++)
                        {
                            JavaScriptObject jo = JSOHelper.getJSOArrayValue(jso, i);
                            String stateCode = JSOHelper.getAttribute(jo, fieldname);
    
                            if (i != 0 )
                            {
                                str = str + ",";
                            }
                            str = str + stateCode;
                        }
                    }
                    else
                    {
                        String fieldValue = JSOHelper.getAttribute( jso, fieldname );
                        str += fieldValue;
                    }
                }
                catch ( Exception t )
                {
                    str = "";
                }
                return str;
            }
            return "";
        }
    
    
    }

    Thanks for your help

  • #2
    It doesn’t make sense to now upgrade to a version that is several behind. First update to a current version, then let us know if you still have this issue.

    Comment


    • #3
      Ok I am in the process of obtaining a SmartGWT 12.0p license. In the meantime I have downloaded and installed:
      SmartClient Version: v12.0p_2018-09-11/EVAL Deployment (expires 2018.11.10_07.15.45) Licensed to: Isomorphic Software (#ISC_EVAL_NIGHTLY) and GWT 2.8.2

      Running in Chrome 69.0.3497.100 I still see the problem. Here is a dump from the developer console:
      18:02:21.999:INP3:WARN:Log:RangeError: Maximum call stack size exceeded
      Stack from error.stack:
      .addMethods(<no args: exited>) @ ISC_Core.js:105:129
      .addPropertyList(<no args: exited>) @ ISC_Core.js:100:17
      .addProperties(<no args: exited>) @ ISC_Core.js:91:13
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:103
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170

      18:02:26.343:IBLR5:WARN:Log:RangeError: Maximum call stack size exceeded
      Stack from error.stack:
      .addMethods(<no args: exited>) @ ISC_Core.js:105:129
      .addPropertyList(<no args: exited>) @ ISC_Core.js:100:17
      .addProperties(<no args: exited>) @ ISC_Core.js:91:13
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:103
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170
      [c]DynamicForm.compareValues(<no args: exited>) on [Class DynamicForm] @ ISC_Forms.js:666:170

      Comment


      • #4
        We've made a correction in SGWT 5.1p/SC 10.1p and newer branches to address the stack overflow. That fix will be in the nightly builds dated 2018-10-04 and beyond.

        However, you need to remove the line "setEditorType( this );" in your definition of the constructor for your MultiValueItem class. Any instance passed to setEditorType() is marked as a template and then cannot be used in a live instance of a DynamicForm. By passing "this", you've ensured that every MultiValueItem created by that constructor is a template, and therefore not valid in a live DynamicForm.

        Unfortunately, the warning log we generate for this itself had a bug, which we've repaired, but you should've seen an exception related to this when loading your sample code page.

        Comment

        Working...
        X