From a8a623971aaa82e75c4cd6022072a7dea12416f5 Mon Sep 17 00:00:00 2001 From: Sergey Vinogradov Date: Tue, 10 Sep 2024 15:10:36 +0400 Subject: [PATCH] fix: preserve maxFiles set after MultiFileReceiver in same roundtrip (#6623) --- .../upload/tests/SwitchReceiversPage.java | 12 +++- .../upload/tests/SwitchReceiversIT.java | 5 ++ .../vaadin/flow/component/upload/Upload.java | 19 +++++- .../upload/tests/SwitchReceiversTest.java | 63 +++++++++++++++++++ 4 files changed, 95 insertions(+), 4 deletions(-) create mode 100644 vaadin-upload-flow-parent/vaadin-upload-flow/src/test/java/com/vaadin/flow/component/upload/tests/SwitchReceiversTest.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 index 75fd4e527b7..5527ce7d05f 100644 --- 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 @@ -42,7 +42,17 @@ public SwitchReceiversPage() { }); setMultiFileReceiver.setId("set-multi-file-receiver"); - add(upload, setSingleFileReceiver, setMultiFileReceiver); + NativeButton setMultiFileReceiverAndMaxFiles = new NativeButton( + "Set multi file receiver and max files", event -> { + MultiFileMemoryBuffer buffer = new MultiFileMemoryBuffer(); + upload.setReceiver(buffer); + upload.setMaxFiles(3); + }); + setMultiFileReceiverAndMaxFiles + .setId("set-multi-file-receiver-and-max-files"); + + add(upload, setSingleFileReceiver, setMultiFileReceiver, + setMultiFileReceiverAndMaxFiles); } } 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 index 7aa497d4a67..6592f52fb82 100644 --- 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 @@ -50,5 +50,10 @@ public void switchBetweenSingleAndMultiFileReceiver_assertMaxFilesProperty() { 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-and-max-files").click(); + Assert.assertEquals( + "The maxFiles property should equal 3 when multi file receiver and max files is set", + 3, (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 b60e43ebbb5..cbdad35191d 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 @@ -199,6 +199,7 @@ private StreamVariable getStreamVariable() { */ public void setMaxFiles(int maxFiles) { getElement().setProperty("maxFiles", maxFiles); + getElement().executeJs("this.maxFiles = $0", maxFiles); } /** @@ -210,6 +211,11 @@ public int getMaxFiles() { return (int) getElement().getProperty("maxFiles", 0.0); } + private void removeMaxFiles() { + getElement().removeProperty("maxFiles"); + getElement().executeJs("this.maxFiles = Infinity"); + } + /** * Specify the maximum file size in bytes allowed to upload. Notice that it * is a client-side constraint, which will be checked before sending the @@ -589,15 +595,22 @@ public Receiver getReceiver() { * receiver to use for file reception */ public void setReceiver(Receiver receiver) { + Receiver oldReceiver = this.receiver; this.receiver = receiver; - if (receiver instanceof MultiFileReceiver) { - getElement().removeProperty("maxFiles"); - getElement().executeJs("this.maxFiles = Infinity"); + + if (isMultiFileReceiver(receiver)) { + if (oldReceiver != null && !isMultiFileReceiver(oldReceiver)) { + removeMaxFiles(); + } } else { setMaxFiles(1); } } + private boolean isMultiFileReceiver(Receiver receiver) { + return receiver instanceof MultiFileReceiver; + } + /** * Set the internationalization properties for this component. * diff --git a/vaadin-upload-flow-parent/vaadin-upload-flow/src/test/java/com/vaadin/flow/component/upload/tests/SwitchReceiversTest.java b/vaadin-upload-flow-parent/vaadin-upload-flow/src/test/java/com/vaadin/flow/component/upload/tests/SwitchReceiversTest.java new file mode 100644 index 00000000000..65944650536 --- /dev/null +++ b/vaadin-upload-flow-parent/vaadin-upload-flow/src/test/java/com/vaadin/flow/component/upload/tests/SwitchReceiversTest.java @@ -0,0 +1,63 @@ +/* + * 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.Test; + +import com.vaadin.flow.component.upload.Upload; +import com.vaadin.flow.component.upload.receivers.MemoryBuffer; +import com.vaadin.flow.component.upload.receivers.MultiFileMemoryBuffer; + +public class SwitchReceiversTest { + @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.assertFalse(upload.getElement().hasProperty("maxFiles")); + + upload.setReceiver(new MemoryBuffer()); + Assert.assertEquals(1, upload.getElement().getProperty("maxFiles", 0)); + } + + @Test + public void setMaxFiles_setSingleFileReceiver_maxFilesAreSetToOne() { + Upload upload = new Upload(); + upload.setMaxFiles(3); + upload.setReceiver(new MemoryBuffer()); + Assert.assertEquals(1, upload.getElement().getProperty("maxFiles", 0)); + } + + @Test + public void setMaxFiles_setMultiFileReceiver_maxFilesArePreserved() { + Upload upload = new Upload(); + upload.setMaxFiles(3); + upload.setReceiver(new MultiFileMemoryBuffer()); + Assert.assertEquals(3, upload.getElement().getProperty("maxFiles", 0)); + } + + @Test + public void setMaxFiles_setMultiFileReceiver_setAnotherMultiFileReceiver_maxFilesArePreserved() { + Upload upload = new Upload(); + upload.setMaxFiles(3); + upload.setReceiver(new MultiFileMemoryBuffer()); + upload.setReceiver(new MultiFileMemoryBuffer()); + Assert.assertEquals(3, upload.getElement().getProperty("maxFiles", 0)); + } +}