Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: set maxFiles to Infinity when setting a MultiFileReceiver #6253

Merged
merged 9 commits into from
May 20, 2024
Original file line number Diff line number Diff line change
@@ -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);
}

}
Original file line number Diff line number Diff line change
@@ -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"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Copy link
Contributor Author

@vursen vursen Apr 26, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we rather change the default value for this property in the web component?

Copy link
Contributor Author

@vursen vursen May 14, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We discussed this internally and decided to go ahead with the current fix for now. We will consider changing the web component's default values later.

} else {
getElement().removeAttribute("maxFiles");
setMaxFiles(1);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand All @@ -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));
}
}