flow icon indicating copy to clipboard operation
flow copied to clipboard

treeGrid.getTreeData().setParent() may lose parent and children. See video.

Open enver-haase opened this issue 3 months ago • 2 comments

Description of the bug

When I drag the parent node to become a child of its child, the entire branch seems to be detached from the model tree and disappears.

Expected behavior

I expect an exception to be thrown.

Minimal reproducible example

package org.vaadin.example;

import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.grid.dnd.GridDropLocation;
import com.vaadin.flow.component.grid.dnd.GridDropMode;
import com.vaadin.flow.component.notification.Notification;
import com.vaadin.flow.component.treegrid.TreeGrid;

import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.data.provider.hierarchy.TreeData;
import com.vaadin.flow.router.Route;

import java.util.ArrayList;
import java.util.List;


@Route
public class MainView extends VerticalLayout {

    private static class DemoTreeData extends TreeData<String> {
        private DemoTreeData() {
            final String[] five = {"A", "B", "C", "D", "E"};

            addRootItems(five);

            for (String s : five) {
                List<String> children = new ArrayList<>();
                for (String ch : five) {
                    String child = s+ch;
                    children.add(child);
                }

                addItems(s, children);
            }
        }
    }
    public MainView() {

        TreeGrid<String> treeGrid = new TreeGrid<>();

        treeGrid.addHierarchyColumn(String::toString).setHeader("Name");

        treeGrid.setTreeData(new DemoTreeData());

        treeGrid.setDropMode(GridDropMode.ON_TOP_OR_BETWEEN);
        treeGrid.setSelectionMode(Grid.SelectionMode.SINGLE);
        treeGrid.setRowsDraggable(true);

        List<String> dragged = new ArrayList<>();
        treeGrid.addDragStartListener( evt -> {
            dragged.clear();
            dragged.addAll(evt.getDraggedItems());
        } );

        treeGrid.addDropListener( evt -> {
            try {
                if (GridDropLocation.ON_TOP == evt.getDropLocation()) {
                    evt.getDropTargetItem().ifPresent(s -> {
                        for (String drag : dragged) {
                            if (!drag.equals(s)) {
                                treeGrid.getTreeData().setParent(drag, s);
                                treeGrid.getDataProvider().refreshAll();
                            }
                            else throw new IllegalStateException("Ignored dropping to itself.");
                        }
                    });
                }
            }
            catch (Exception e) {
                Notification.show("Exception: "+e);
            }
        } );

        treeGrid.setWidthFull();
        treeGrid.setHeight("800px");
        add(treeGrid);
    }

}

Versions

  • Vaadin / Flow version: 24.3.11
  • Java version: n/a
  • OS version: n/a
  • Browser version (if applicable): n/a
  • Application Server (if applicable): n/a
  • IDE (if applicable): n/a

enver-haase avatar May 16 '24 08:05 enver-haase

https://github.com/vaadin/flow/assets/7870436/13b4d7eb-ff37-4e2a-8c82-7bce056f3f41

enver-haase avatar May 16 '24 09:05 enver-haase

May have the same or similar root cause https://github.com/vaadin/flow/issues/19378.

mshabarov avatar May 21 '24 13:05 mshabarov