Announcement

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

    Bug: ListGrid.addRecordDropHandler RecordDropEvent targetRecord is incorrect

    Hello,
    I am using smartgwt 12.0-p20190302, gwt 2.8.2 , google chrome Version 73.0.3683.75
    I modified this example https://www.smartclient.com/smartgwt...n_drag_reorder
    Code:
    import com.smartgwt.client.types.Alignment;  
    import com.smartgwt.client.types.ListGridFieldType;  
    import com.smartgwt.client.types.VerticalAlignment;  
    import com.smartgwt.client.widgets.Canvas;  
    import com.smartgwt.client.data.RecordList;  
    import com.smartgwt.client.widgets.layout.HStack;  
    import com.smartgwt.client.widgets.layout.VStack;  
    import com.smartgwt.client.widgets.TransferImgButton;  
    import com.smartgwt.client.widgets.events.ClickEvent;  
    import com.smartgwt.client.widgets.events.ClickHandler;  
    import com.smartgwt.client.widgets.grid.ListGridRecord;  
    import com.smartgwt.client.widgets.grid.ListGrid;  
    import com.smartgwt.client.widgets.grid.ListGridField;  
    import com.smartgwt.sample.showcase.client.data.CountrySampleData;  
    
    import com.google.gwt.core.client.EntryPoint;  
    
    public class DragReorderSample implements EntryPoint {  
    
        public void onModuleLoad() {  
            HStack hStack = new HStack(10);  
            hStack.setHeight(160);  
    
            final ListGrid countryGrid = new ListGrid();  
            countryGrid.setWidth(300);  
            countryGrid.setHeight(224);  
            countryGrid.setShowAllRecords(true);  
            countryGrid.setCanReorderRecords(true);  
            countryGrid.addRecordDropHandler(this::recordDropHandler);
    
            ListGridField countryCodeField = new ListGridField("countryCode", "Flag", 50);  
            countryCodeField.setAlign(Alignment.CENTER);  
            countryCodeField.setType(ListGridFieldType.IMAGE);  
            countryCodeField.setImageURLPrefix("flags/16/");  
            countryCodeField.setImageURLSuffix(".png");  
    
            ListGridField nameField = new ListGridField("countryName", "Country");  
            ListGridField capitalField = new ListGridField("capital", "Capital");  
    
            countryGrid.setFields(countryCodeField, nameField, capitalField);  
            countryGrid.setData(CountrySampleData.getRecords());  
    
            hStack.addMember(countryGrid);  
    
            VStack modifyStack = new VStack(3);  
            modifyStack.setWidth(20);  
            modifyStack.setLayoutAlign(VerticalAlignment.CENTER);  
            modifyStack.setHeight(74);  
    
            TransferImgButton up = new TransferImgButton(TransferImgButton.UP);  
            up.addClickHandler(new ClickHandler() {  
                public void onClick(ClickEvent event) {  
                    ListGridRecord[] selectedRecords = countryGrid.getSelectedRecords();  
                    for (int i=0; i<selectedRecords.length; i++) {  
                        ListGridRecord selectedRecord = selectedRecords[i];  
                        if(selectedRecord != null) {  
                            int idx = countryGrid.getRecordIndex(selectedRecord);  
                            if(idx > 0) {  
                                RecordList rs = countryGrid.getRecordList();  
                                rs.removeAt(idx);  
                                rs.addAt(selectedRecord, idx - 1);  
                            } else {  
                                break;  
                            }  
                        }  
                    }  
                }  
            });  
    
            TransferImgButton upFirst = new TransferImgButton(TransferImgButton.UP_FIRST);  
            upFirst.addClickHandler(new ClickHandler() {  
                public void onClick(ClickEvent event) {  
                    ListGridRecord[] selectedRecords = countryGrid.getSelectedRecords();  
                    for (int i=0; i<selectedRecords.length; i++) {  
                        ListGridRecord selectedRecord = selectedRecords[i];  
                        if(selectedRecord != null) {  
                            int idx = countryGrid.getRecordIndex(selectedRecord);  
                            if(idx > 0) {  
                                RecordList rs = countryGrid.getRecordList();  
                                rs.removeAt(idx);  
                                rs.addAt(selectedRecord, i);  
                            }  
                        }  
                    }  
                }  
            });  
    
            TransferImgButton down = new TransferImgButton(TransferImgButton.DOWN);  
            down.addClickHandler(new ClickHandler() {  
                public void onClick(ClickEvent event) {  
                    ListGridRecord[] selectedRecords = countryGrid.getSelectedRecords();  
                    for (int i=selectedRecords.length-1; i>=0; i--) {  
                        ListGridRecord selectedRecord = selectedRecords[i];  
                        if(selectedRecord != null) {  
                            RecordList rs = countryGrid.getRecordList();  
                            int numRecords = rs.getLength();  
                            int idx = countryGrid.getRecordIndex(selectedRecord);  
                            if(idx < numRecords - 1) {  
                                rs.removeAt(idx);  
                                rs.addAt(selectedRecord, idx + 1);  
                            } else {  
                                break;  
                            }  
                        }  
                    }  
                }  
            });  
    
            TransferImgButton downLast = new TransferImgButton(TransferImgButton.DOWN_LAST);  
            downLast.addClickHandler(new ClickHandler() {  
                public void onClick(ClickEvent event) {  
                    ListGridRecord[] selectedRecords = countryGrid.getSelectedRecords();  
                    for (int i=0; i<selectedRecords.length; i++) {  
                        ListGridRecord selectedRecord = selectedRecords[i];  
                        if(selectedRecord != null) {  
                            RecordList rs = countryGrid.getRecordList();  
                            int numRecords = rs.getLength();  
                            int idx = countryGrid.getRecordIndex(selectedRecord);  
                            if(idx < numRecords - 1) {  
                                rs.removeAt(idx);  
                                rs.addAt(selectedRecord, rs.getLength());  
                            }  
                        }  
                    }  
                }  
            });  
            modifyStack.addMember(upFirst);  
            modifyStack.addMember(up);  
            modifyStack.addMember(down);  
            modifyStack.addMember(downLast);  
    
            hStack.addMember(modifyStack);  
    
            hStack.draw();  
        }  
    
        @Override  
        protected boolean shouldWrapViewPanel() {  
            return true;  
        }  
    
        private void recordDropHandler(RecordDropEvent event) {
            RecordDropPosition dropPosition = event.getDropPosition();
            ListGridRecord[] dropRecords = event.getDropRecords();
            ListGridRecord targetRecord = event.getTargetRecord();
        }
    }
    Following scenario:
    I drag element at index 5 and move the mouse to the element at index 0 so that the line which shows where the record will be dropped is displayed between the elements at index 0 and 1.
    I expect the targetrecord to be the record at index 0 and the dropposition AFTER.
    What i get instead is targetrecord at index 1 and the dropposition AFTER. This gives the impression that the record should be inserted at index 2 but I actually want to insert it at index 1.

    #2
    Not a bug, as designed, and for a good reason: your expectation would make it impossible to distinguish between a drop on the bottom half of the record above the insertion index vs the top half of the record below the insertion index, and this distinction matters for several UIs.

    Put another way: for the type of drop shown in this sample, the drop index is always the index of insertion and the dropPosition is additional information about fractional positioning over the adjacent records. If you don't need that fractional positioning information, you can ignore the dropPosition and work with the index only.

    Comment

    Working...
    X