vaadin / vaadin/framework

TextField drag and drop issues

Open
#11,643 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Stale
Dominant language
Java
Stars
1.8k
Forks
717
Avg merge
2d 6h
Merged PRs (30d)
3

Description

When trying to migrate from Vaadin 7 to 8, I am running into the following issues with drag and drop and TextFields (I haven't tested other targets).

1: effect matching is not performed in Safari -https://github.com/vaadin/framework/issues/9246#issue-226499933
2: even when effect matching is performed, and determines a mismatch, the style -drag-center is applied to the textfield;
3: criteria matching does not appear to be performed;
4: on Safari drops still occur, even if a criteria script returns false;
5: TextFields without DropTargetExtensions can still receive drops;
6: in some cases the TextField cursor is activated whilst dragging over a drop target.

Vaadin: 8.8.2
Browsers: Safari, FireFox, Chrome

Code to illustrate issues:

`public class TextFieldDnDTest extends VerticalLayout {

public TextFieldDnDTest() {

    List<TextField> targets = new ArrayList<>();

    Page page = Page.getCurrent();

    WebBrowser browser = page.getWebBrowser();
    Label browserLabel = new Label("<b>Browser</b><br>" + browser.getBrowserApplication());
    browserLabel.setContentMode(ContentMode.HTML);
    addComponent(browserLabel);

    Panel source = new Panel();
    source.setSizeUndefined();
    addComponent(source);

    VerticalLayout sourceLayout = new VerticalLayout();
    source.setContent(sourceLayout);

    Label sourceLabel = new Label("<b>Source</b> - drag me");
    sourceLabel.setContentMode(ContentMode.HTML);
    sourceLayout.addComponent(sourceLabel);

    DragSourceExtension dragSource = new DragSourceExtension(source);
    dragSource.setEffectAllowed(EffectAllowed.COPY);
    dragSource.setDataTransferText("This is not expected");
    dragSource.setDragData(new String("This is expected"));
    dragSource.setPayload("drop", "true");

    TextField target1 = new TextField("<b>Target</b> - success");
    target1.setCaptionAsHtml(true);
    target1.setPlaceholder("Drop should succeed");
    targets.add(target1);
    addComponent(target1);

    DropTargetExtension dropTarget1 = new DropTargetExtension(target1);
    dropTarget1.setDropEffect(DropEffect.COPY);
    dropTarget1.addDropListener((DropListener) dropEvent -> {
        target1.setValue((String)dropEvent.getDragData().get());
    });

    TextField target2 = new TextField("<b>Target</b> - mismatching effects<br>Why is the style ..-drag-center added on drag enter?");
    target2.setCaptionAsHtml(true);
    target2.setPlaceholder("Drop should fail");
    targets.add(target2);
    addComponent(target2);

    DropTargetExtension dropTarget2 = new DropTargetExtension(target2);
    dropTarget2.setDropEffect(DropEffect.MOVE);
    dropTarget2.addDropListener((DropListener) dropEvent -> {
        target2.setValue(dropEvent.getDataTransferText());
    });

    TextField target3 = new TextField("<b>Target</b> - criteria script returns false<br>Why is the cursor activated?");
    target3.setCaptionAsHtml(true);
    target3.setPlaceholder("Drop should fail");
    targets.add(target3);
    addComponent(target3);

    DropTargetExtension dropTarget3 = new DropTargetExtension(target3);
    dropTarget3.setDropEffect(DropEffect.COPY);
    dropTarget3.setDropCriteriaScript("console.debug(event.dataTransfer); return false;");
    dropTarget3.addDropListener((DropListener) dropEvent -> {
        target3.setValue((String)dropEvent.getDragData().get());
    });

    TextField target4 = new TextField("<b>Target</b> - payload and criteria match");
    target4.setCaptionAsHtml(true);
    target4.setPlaceholder("Drop should succeed");
    targets.add(target4);
    addComponent(target4);

    DropTargetExtension dropTarget4 = new DropTargetExtension(target4);
    dropTarget4.setDropEffect(DropEffect.COPY);
    dropTarget4.setDropCriterion("drop", "true");
    dropTarget4.addDropListener((DropListener) dropEvent -> {
        target4.setValue((String)dropEvent.getDragData().get());
    });

    TextField target5 = new TextField("<b>Target</b> - payload and criteria do not match<br>Why is the style ..-drag-center added on drag enter?");
    target5.setCaptionAsHtml(true);
    target5.setPlaceholder("Drop should fail");
    targets.add(target5);
    addComponent(target5);

    DropTargetExtension dropTarget5 = new DropTargetExtension(target5);
    dropTarget5.setDropEffect(DropEffect.COPY);
    dropTarget5.setDropCriterion("drop", "false");
    dropTarget5.addDropListener((DropListener) dropEvent -> {
        target5.setValue(dropEvent.getDataTransferText());
    });

    TextField target6 = new TextField("<b>Target</b> - no drop target<br>Why is this textfield receiving drops?<br>Why is the cursor activated?");
    target6.setCaptionAsHtml(true);
    target6.setPlaceholder("Target not configured");
    targets.add(target6);
    addComponent(target6);

    Button reset = new Button("<b>Reset</b>");
    reset.setCaptionAsHtml(true);
    reset.addClickListener(event -> {
        targets.forEach(target -> target.setValue(""));
    });
    addComponent(reset);

    targets.forEach(target -> {
        target.addValueChangeListener((HasValue.ValueChangeListener<String>) event -> {
            String value = event.getValue();
            if (value.length() > 0) {
                boolean success = value.equals("This is expected");
                target.addStyleName(success ? "success" : "failure");
                target.removeStyleName(success ? "failure" : "success");
            } else {
                target.removeStyleName("failure");
                target.removeStyleName("success");
            }
        });


    });

    Page.Styles styles = page.getStyles();
    styles.add(".v-textfield.success { background: #00B96FAA; }");
    styles.add(".v-textfield.failure { background: #FF3F50AA; }");
    styles.add(".v-textfield-drag-center { background: #008CF0aa !important; }");
}

}`

image

image

image

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the provided TextFieldDnDTest reproduction and run it in Safari, Firefox, and Chrome to compare the six reported drag-and-drop behaviors. Trace the TextField, DragSourceExtension, and DropTargetExtension entry points; done means effect and criteria mismatches prevent drops and drag styling, unconfigured fields do not accept drops, and dragging does not activate the cursor.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
frontend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
28/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.