Skip to content

Commit

Permalink
fix: preserve maxFiles set after MultiFileReceiver in same roundtrip (#…
Browse files Browse the repository at this point in the history
…6623) (#6630)

Co-authored-by: Sergey Vinogradov <[email protected]>
  • Loading branch information
vaadin-bot and vursen committed Sep 10, 2024
1 parent f1b8d16 commit 1773300
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,7 @@ private StreamVariable getStreamVariable() {
*/
public void setMaxFiles(int maxFiles) {
getElement().setProperty("maxFiles", maxFiles);
getElement().executeJs("this.maxFiles = $0", maxFiles);
}

/**
Expand All @@ -220,6 +221,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
Expand Down Expand Up @@ -632,15 +638,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.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -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));
}
}

0 comments on commit 1773300

Please sign in to comment.