Announcement

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

    RecordComponent problem after data update and if-condition-change in grouped ListGrid

    Hi Isomorphic,

    please see this 5.1p based testcase (v10.1p_2017-08-20).
    As you can see in the video (wait a bit, slow because of FF26 dev mode, but happens also compiled in GC60), the buttons are not updated until the data is reloaded via invalidateCache(). This does only happen in a grouped ListGrid.
    Click image for larger version  Name:	RecordComponentUpdate.gif Views:	1 Size:	120.7 KB ID:	249166

    Code:
    package com.smartgwt.sample.client;
    
    import com.google.gwt.core.client.EntryPoint;
    import com.smartgwt.client.Version;
    import com.smartgwt.client.core.KeyIdentifier;
    import com.smartgwt.client.data.AdvancedCriteria;
    import com.smartgwt.client.data.DataSource;
    import com.smartgwt.client.types.Alignment;
    import com.smartgwt.client.types.OperatorId;
    import com.smartgwt.client.types.RecordComponentPoolingMode;
    import com.smartgwt.client.util.Page;
    import com.smartgwt.client.util.PageKeyHandler;
    import com.smartgwt.client.util.SC;
    import com.smartgwt.client.widgets.Canvas;
    import com.smartgwt.client.widgets.IButton;
    import com.smartgwt.client.widgets.Window;
    import com.smartgwt.client.widgets.events.ClickEvent;
    import com.smartgwt.client.widgets.events.ClickHandler;
    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.layout.HLayout;
    import com.smartgwt.client.widgets.layout.VLayout;
    
    public class BuiltInDS extends VLayout implements EntryPoint {
        private IButton recreateBtn;
        private DataSource ds = DataSource.get("employees");
    
        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();
                }
            });
    
            setWidth100();
            setHeight100();
    
            recreateBtn = new IButton("Recreate");
            recreateBtn.addClickHandler(new ClickHandler() {
                @Override
                public void onClick(ClickEvent event) {
                    new MyWindow().show();
                }
            });
            addMember(recreateBtn);
            new MyWindow().show();
            draw();
        }
    
        private class MyWindow extends Window {
            public MyWindow() {
                setWidth("95%");
                setHeight("95%");
                setMembersMargin(0);
                setModalMaskOpacity(70);
                setTitle(" (" + Version.getVersion() + "/" + Version.getSCVersionNumber() + ")");
                setTitle("RecordComponent problem after data update and if-condition-change in grouped ListGrid" + getTitle());
                setShowMinimizeButton(false);
                setIsModal(true);
                setShowModalMask(true);
                centerInPage();
    
                final MyListGrid employeesGrid = new MyListGrid(ds);
                employeesGrid.setWidth(500);
                employeesGrid.setHeight(200);
    
                employeesGrid.setShowRecordComponents(true);
                employeesGrid.setShowRecordComponentsByCell(true);
                employeesGrid.setRecordComponentPoolingMode(RecordComponentPoolingMode.RECYCLE);
                employeesGrid.setPoolComponentsPerColumn(true);
                employeesGrid.setRecordComponentHeight(20);
    
                ListGridField employeeId = new ListGridField("EmployeeId");
                employeeId.setHidden(true);
                ListGridField name = new ListGridField("Name");
                ListGridField gender = new ListGridField("Gender");
                ListGridField salary = new ListGridField("Salary");
                ListGridField salary5k = new ListGridField("SALARY5K");
                salary5k.setWidth(130);
                ListGridField salary10k = new ListGridField("SALARY10K");
                salary10k.setWidth(130);
    
                employeesGrid.setFields(employeeId, name, gender, salary, salary5k, salary10k);
                employeesGrid.setGroupByField(gender.getName());
                employeesGrid.setSortField(name.getName());
                employeesGrid.fetchData(new AdvancedCriteria(name.getName(), OperatorId.GREATER_OR_EQUAL, "R"));
    
                HLayout buttonsLayout = new HLayout(5) {
                    {
                        setHeight(25);
                        setPadding(5);
                        setAlign(Alignment.LEFT);
    
                        IButton salary5kButton = new IButton("Set salary 5000");
                        salary5kButton.addClickHandler(new ClickHandler() {
                            @Override
                            public void onClick(ClickEvent event) {
                                if (employeesGrid.getSelectedRecord() != null) {
                                    for (ListGridRecord r : employeesGrid.getSelectedRecords()) {
                                        r.setAttribute("Salary", 5000);
                                        ds.updateData(r);
                                    }
                                }
                            }
                        });
                        addMembers(salary5kButton);
    
                        IButton salary10kButton = new IButton("Set salary 10000");
                        salary10kButton.addClickHandler(new ClickHandler() {
                            @Override
                            public void onClick(ClickEvent event) {
                                if (employeesGrid.getSelectedRecord() != null) {
                                    for (ListGridRecord r : employeesGrid.getSelectedRecords()) {
                                        r.setAttribute("Salary", 10000);
                                        ds.updateData(r);
                                    }
                                }
                            }
                        });
                        addMembers(salary10kButton);
    
                        IButton reloadButton = new IButton("Reload");
                        reloadButton.addClickHandler(new ClickHandler() {
                            @Override
                            public void onClick(ClickEvent event) {
                                employeesGrid.invalidateCache();
                            }
                        });
                        addMembers(reloadButton);
                    }
                };
                addItem(employeesGrid);
                addItem(buttonsLayout);
            }
        }
    
        private class MyListGrid extends ListGrid {
            public MyListGrid(DataSource dataSource) {
                super(dataSource);
            }
    
            @Override
            protected Canvas createRecordComponent(final ListGridRecord record, Integer colNum) {
                return updateRecordComponent(record, colNum, null, true);
            }
    
            @Override
            public Canvas updateRecordComponent(final ListGridRecord record, Integer colNum, Canvas component, boolean recordChanged) {
                String fieldName = this.getFieldName(colNum);
                if (fieldName.equals("SALARY10K") && record.getAttribute("Salary") != null && record.getAttributeAsInt("Salary") == 10000) {
                    if (component != null) {
                        MyButton myButton = (MyButton) component;
                        myButton.setListGridRecord(record);
                        return myButton;
                    } else {
                        return new MyButton(record);
                    }
                } else if (fieldName.equals("SALARY5K") && record.getAttribute("Salary") != null && record.getAttributeAsInt("Salary") == 5000) {
                    if (component != null) {
                        MyButton2 myButton = (MyButton2) component;
                        myButton.setListGridRecord(record);
                        return myButton;
                    } else {
                        return new MyButton2(record);
                    }
                } else {
                    return null;
                }
            }
        }
    
        private class MyButton extends IButton {
            private ListGridRecord listGridRecord;
    
            public void setListGridRecord(ListGridRecord r) {
                this.listGridRecord = r;
            }
    
            public MyButton(ListGridRecord r) {
                super("Salary 10k");
                this.listGridRecord = r;
                setShowDown(false);
                setShowRollOver(false);
                setLayoutAlign(Alignment.CENTER);
                setWidth(100);
                setHeight(20);
                addClickHandler(new ClickHandler() {
                    public void onClick(ClickEvent event) {
                        SC.say("Show name clicked for: " + MyButton.this.listGridRecord.getAttribute("Name"));
                    }
                });
            }
        }
    
        private class MyButton2 extends IButton {
            private ListGridRecord listGridRecord;
    
            public void setListGridRecord(ListGridRecord r) {
                this.listGridRecord = r;
            }
    
            public MyButton2(ListGridRecord r) {
                super("Salary 5k");
                this.listGridRecord = r;
                setShowDown(false);
                setShowRollOver(false);
                setLayoutAlign(Alignment.CENTER);
                setWidth(100);
                setHeight(20);
                addClickHandler(new ClickHandler() {
                    public void onClick(ClickEvent event) {
                        SC.say("Show name clicked for: " + MyButton2.this.listGridRecord.getAttribute("EmployeeId"));
                    }
                });
            }
        }
    }
    Best regards
    Blama

    #2
    Hi Isomorphic,

    actually it seems something similar also applies for Hilites.

    Best regards
    Blama

    Comment


      #3
      The issue with record components has been fixed and will be available in builds starting on Sep 16. We'll take a look at the hilites as well.

      Comment


        #4
        A fix has also been applied for hilites in the same situation. Thanks for the report.

        Comment


          #5
          Hi Isomorphic,

          this is fixed for me in the testcase and in my application using v11.1p_2017-12-27.

          Best regards
          Blama

          Comment


            #6
            Hi guys! It seems that a similar problem exists for TreeGrids. At least in v13.0p_2022-11-14/LGPL Development Only (built 2022-11-14) that I am testing right now... More exactly after a record update the createRecordComponent() method is not called and hence the component does not get updated for that record. I thought that it is appropriate to comment in here and not open another thread. I can also provide a test case if necessary. I assume that there must be a bug... Am I right Isomorphic ?

            Comment

            Working...
            X