From a66ade3b59f7109d8f2b4e8e7f42faa73f504d78 Mon Sep 17 00:00:00 2001 From: Vaadin Bot Date: Mon, 20 May 2024 12:25:58 +0200 Subject: [PATCH] fix: set maxFiles to Infinity when setting a MultiFileReceiver (#6253) (#6303) Co-authored-by: Sergey Vinogradov --- .../upload/tests/SwitchReceiversPage.java | 50 +++++++++++++++++ .../upload/tests/SwitchReceiversIT.java | 54 +++++++++++++++++++ .../vaadin/flow/component/upload/Upload.java | 7 +-- .../component/upload/tests/UploadTest.java | 18 +++++++ 4 files changed, 126 insertions(+), 3 deletions(-) create mode 100644 vaadin-upload-flow-parent/vaadin-upload-flow-integration-tests/src/main/java/com/vaadin/flow/component/upload/tests/SwitchReceiversPage.java create mode 100644 vaadin-upload-flow-parent/vaadin-upload-flow-integration-tests/src/test/java/com/vaadin/flow/component/upload/tests/SwitchReceiversIT.java diff --git a/vaadin-upload-flow-parent/vaadin-upload-flow-integration-tests/src/main/java/com/vaadin/flow/component/upload/tests/SwitchReceiversPage.java b/vaadin-upload-flow-parent/vaadin-upload-flow-integration-tests/src/main/java/com/vaadin/flow/component/upload/tests/SwitchReceiversPage.java new file mode 100644 index 00000000000..06a19fc498e --- /dev/null +++ b/vaadin-upload-flow-parent/vaadin-upload-flow-integration-tests/src/main/java/com/vaadin/flow/component/upload/tests/SwitchReceiversPage.java @@ -0,0 +1,50 @@ +/* + * Copyright 2000-2024 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + */ +package com.vaadin.flow.component.upload.tests; + +import com.vaadin.flow.component.html.NativeButton; + +import com.vaadin.flow.component.html.Div; +import com.vaadin.flow.component.upload.Upload; +import com.vaadin.flow.component.upload.receivers.MemoryBuffer; +import com.vaadin.flow.component.upload.receivers.MultiFileMemoryBuffer; +import com.vaadin.flow.router.Route; + +@Route("vaadin-upload/switch-receivers") +public class SwitchReceiversPage extends Div { + + public SwitchReceiversPage() { + Upload upload = new Upload(); + + NativeButton setSingleFileReceiver = new NativeButton( + "Set single file receiver", event -> { + MemoryBuffer buffer = new MemoryBuffer(); + upload.setReceiver(buffer); + }); + setSingleFileReceiver.setId("set-single-file-receiver"); + + NativeButton setMultiFileReceiver = new NativeButton( + "Set multi file receiver", event -> { + MultiFileMemoryBuffer buffer = new MultiFileMemoryBuffer(); + upload.setReceiver(buffer); + }); + setMultiFileReceiver.setId("set-multi-file-receiver"); + + add(upload, setSingleFileReceiver, setMultiFileReceiver); + } + +} diff --git a/vaadin-upload-flow-parent/vaadin-upload-flow-integration-tests/src/test/java/com/vaadin/flow/component/upload/tests/SwitchReceiversIT.java b/vaadin-upload-flow-parent/vaadin-upload-flow-integration-tests/src/test/java/com/vaadin/flow/component/upload/tests/SwitchReceiversIT.java new file mode 100644 index 00000000000..7aa497d4a67 --- /dev/null +++ b/vaadin-upload-flow-parent/vaadin-upload-flow-integration-tests/src/test/java/com/vaadin/flow/component/upload/tests/SwitchReceiversIT.java @@ -0,0 +1,54 @@ +/* + * Copyright 2000-2024 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.vaadin.flow.component.upload.tests; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.vaadin.flow.component.upload.testbench.UploadElement; +import com.vaadin.flow.testutil.TestPath; + +@TestPath("vaadin-upload/switch-receivers") +public class SwitchReceiversIT extends AbstractUploadIT { + + private UploadElement upload; + + @Before + public void init() { + open(); + upload = $(UploadElement.class).first(); + } + + @Test + public void switchBetweenSingleAndMultiFileReceiver_assertMaxFilesProperty() { + $("button").id("set-single-file-receiver").click(); + Assert.assertEquals( + "The maxFiles property should equal 1 when single file receiver is set", + 1, (int) upload.getPropertyInteger("maxFiles")); + + $("button").id("set-multi-file-receiver").click(); + Assert.assertTrue( + "The maxFiles property should equal Infinity when multi file receiver is set", + (boolean) executeScript( + "return arguments[0].maxFiles === Infinity", upload)); + + $("button").id("set-single-file-receiver").click(); + Assert.assertEquals( + "The maxFiles property should equal 1 when single file receiver is set", + 1, (int) upload.getPropertyInteger("maxFiles")); + } +} diff --git a/vaadin-upload-flow-parent/vaadin-upload-flow/src/main/java/com/vaadin/flow/component/upload/Upload.java b/vaadin-upload-flow-parent/vaadin-upload-flow/src/main/java/com/vaadin/flow/component/upload/Upload.java index 2c1543def49..6e50cbdd129 100644 --- a/vaadin-upload-flow-parent/vaadin-upload-flow/src/main/java/com/vaadin/flow/component/upload/Upload.java +++ b/vaadin-upload-flow-parent/vaadin-upload-flow/src/main/java/com/vaadin/flow/component/upload/Upload.java @@ -633,10 +633,11 @@ public Receiver getReceiver() { */ public void setReceiver(Receiver receiver) { this.receiver = receiver; - if (!(receiver instanceof MultiFileReceiver)) { - setMaxFiles(1); + if (receiver instanceof MultiFileReceiver) { + getElement().removeProperty("maxFiles"); + getElement().executeJs("this.maxFiles = Infinity"); } else { - getElement().removeAttribute("maxFiles"); + setMaxFiles(1); } } diff --git a/vaadin-upload-flow-parent/vaadin-upload-flow/src/test/java/com/vaadin/flow/component/upload/tests/UploadTest.java b/vaadin-upload-flow-parent/vaadin-upload-flow/src/test/java/com/vaadin/flow/component/upload/tests/UploadTest.java index 77c466ed852..bba30301e3e 100644 --- a/vaadin-upload-flow-parent/vaadin-upload-flow/src/test/java/com/vaadin/flow/component/upload/tests/UploadTest.java +++ b/vaadin-upload-flow-parent/vaadin-upload-flow/src/test/java/com/vaadin/flow/component/upload/tests/UploadTest.java @@ -3,6 +3,10 @@ import com.vaadin.flow.component.upload.Upload; import org.junit.Test; +import org.junit.Assert; + +import com.vaadin.flow.component.upload.receivers.MemoryBuffer; +import com.vaadin.flow.component.upload.receivers.MultiFileMemoryBuffer; public class UploadTest { @@ -11,4 +15,18 @@ public void uploadNewUpload() { // Test no NPE due missing UI when setAttribute is called. Upload upload = new Upload(); } + + @Test + public void switchBetweenSingleAndMultiFileReceiver_assertMaxFilesProperty() { + Upload upload = new Upload(); + + upload.setReceiver(new MemoryBuffer()); + Assert.assertEquals(1, upload.getElement().getProperty("maxFiles", 0)); + + upload.setReceiver(new MultiFileMemoryBuffer()); + Assert.assertNull(upload.getElement().getProperty("maxFiles")); + + upload.setReceiver(new MemoryBuffer()); + Assert.assertEquals(1, upload.getElement().getProperty("maxFiles", 0)); + } }