vaadin / flow-components

Java counterpart of Vaadin Web Components
81 stars 63 forks source link

Adding & Editing row to Grid with 50 existing rows fails #6384

Open guttormvik2 opened 1 week ago

guttormvik2 commented 1 week ago

Describe the bug

This fails if the Grid initially has 50 rows:

rows.add(newRow);
grid.getDataProvider().refreshAll();
grid.getEditor().editItem(newRow);

java.lang.IllegalStateException: The item com.ec.traveller.TestGridInsert$Row@108 is not in the backing data provider
    at deployment.ptsmc.ear//com.vaadin.flow.component.grid.editor.EditorImpl.validate(EditorImpl.java:221)
    at deployment.ptsmc.ear//com.vaadin.flow.component.grid.editor.EditorImpl.requestEditItem(EditorImpl.java:147)
    at deployment.ptsmc.ear//com.vaadin.flow.component.grid.editor.EditorImpl.lambda$editItem$2d5ea2ce$1(EditorImpl.java:137)
    at deployment.ptsmc.ear//com.vaadin.flow.internal.StateTree.lambda$runExecutionsBeforeClientResponse$2(StateTree.java:397)
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
    at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
    at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
    at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
    at deployment.ptsmc.ear//com.vaadin.flow.internal.StateTree.runExecutionsBeforeClientResponse(StateTree.java:392)
    at deployment.ptsmc.ear//com.vaadin.flow.server.communication.UidlWriter.encodeChanges(UidlWriter.java:394)
    at deployment.ptsmc.ear//com.vaadin.flow.server.communication.UidlWriter.createUidl(UidlWriter.java:170)
    at deployment.ptsmc.ear//com.vaadin.flow.server.communication.UidlRequestHandler.createUidl(UidlRequestHandler.java:155)
    at deployment.ptsmc.ear//com.vaadin.flow.server.communication.UidlRequestHandler.writeUidl(UidlRequestHandler.java:145)
    at deployment.ptsmc.ear//com.vaadin.flow.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:115)
    at deployment.ptsmc.ear//com.vaadin.flow.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:40)
    at deployment.ptsmc.ear//com.vaadin.flow.server.VaadinService.handleRequest(VaadinService.java:1574)
    at deployment.ptsmc.ear//com.vaadin.flow.server.VaadinServlet.service(VaadinServlet.java:398)
    at jakarta.servlet.api@6.0.0//jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)

If grid has 49 rows, it works. It then also works to add&edit more rows, so it looks like this is only an initial issue?

Expected-behavior

Adding&editing row should always work

Reproduction

package com.ec.traveller;

import java.util.ArrayList;

import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.data.binder.Binder;
import com.vaadin.flow.router.Route;

/**
 * Possible bug with insert in Grid when there are 50+ rows?
 */

@Route
public class TestGridInsert extends VerticalLayout {

    static int idSequence = 0;

    public static class Row {

        int id = idSequence++;
        String name;

        Row(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Override
        public boolean equals(Object obj) {
            return obj instanceof Row that && that.id == this.id;
        }

        @Override
        public int hashCode() {
            return id;
        }

    }

    public TestGridInsert() {

        // Data

        var rows = new ArrayList<Row>();

        for(int i=0; i<50; i++) {
            rows.add(new Row("John Doe " + i));
        }

        // Grid with editor

        var grid = new Grid<Row>(rows);
        var namecol = grid.addColumn(Row::getName).setHeader("Name");
        grid.setSizeFull();

        var binder = new Binder<>(Row.class);
        var editor = grid.getEditor();
        editor.setBinder(binder);

        TextField nameField = new TextField();
        nameField.setWidthFull();

        binder.forField(nameField)
                .bind(Row::getName, Row::setName);
        namecol.setEditorComponent(nameField);

        // Button to add new row

        var addRowButton = new Button("Add", event -> {
            var newRow = new Row("Jane Doe");
            rows.add(newRow);
            grid.getDataProvider().refreshAll();
            grid.getEditor().editItem(newRow);
        });

        //

        setSizeFull();
        add(addRowButton, grid);

    }

}

System Info

Windows 10, Vaadin 24.3.12, Firefox 126.0.1