diff --git a/src/main/java/com/flowingcode/vaadin/addons/extendedlogin/LoginLayout.java b/src/main/java/com/flowingcode/vaadin/addons/extendedlogin/LoginLayout.java
index 877c012..87e8730 100644
--- a/src/main/java/com/flowingcode/vaadin/addons/extendedlogin/LoginLayout.java
+++ b/src/main/java/com/flowingcode/vaadin/addons/extendedlogin/LoginLayout.java
@@ -51,14 +51,17 @@ public void removeRouterLayoutContent(HasElement oldContent) {
protected void onAttach(AttachEvent attachEvent) {
super.onAttach(attachEvent);
setOpened(true);
- this.getElement()
- .executeJs(
- "setTimeout(()=>document.getElementById('vaadinLoginOverlayWrapper').getElementsByTagName('vaadin-login-form-wrapper')[0].replaceChildren())");
+ this.getElement().executeJs(
+ LoginOverlayUtils.getLoginFormWrapperScript(
+ """
+ formWrapper.querySelectorAll('[slot="form"], [slot="submit"], [slot="forgot-password"]').forEach(c => c.remove());
+ """));
this.getElement().appendChild(content.getElement());
content.getElement().setAttribute("slot", "form");
- this.content
- .getElement()
- .executeJs(
- "setTimeout(()=>document.getElementById('vaadinLoginOverlayWrapper').getElementsByTagName('vaadin-login-form-wrapper')[0].appendChild(this))");
+ this.content.getElement().executeJs(
+ LoginOverlayUtils.getLoginFormWrapperScript(
+ """
+ formWrapper.appendChild(this);
+ """));
}
}
diff --git a/src/main/java/com/flowingcode/vaadin/addons/extendedlogin/LoginOverlayUtils.java b/src/main/java/com/flowingcode/vaadin/addons/extendedlogin/LoginOverlayUtils.java
new file mode 100644
index 0000000..e1a686b
--- /dev/null
+++ b/src/main/java/com/flowingcode/vaadin/addons/extendedlogin/LoginOverlayUtils.java
@@ -0,0 +1,107 @@
+/*-
+ * #%L
+ * Extended Login Add-on
+ * %%
+ * Copyright (C) 2023 - 2026 Flowing Code
+ * %%
+ * 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.
+ * #L%
+ */
+package com.flowingcode.vaadin.addons.extendedlogin;
+
+/**
+ * Utility class for LoginOverlay.
+ */
+class LoginOverlayUtils {
+
+ private LoginOverlayUtils() {
+ // Utility class
+ }
+
+ /**
+ * Generates a JavaScript snippet that finds the overlay wrapper element.
+ * Handles both Vaadin 24 and Vaadin 25+ compatibility.
+ *
+ * @param action the JavaScript code to execute on the overlay wrapper
+ * @return the complete JavaScript string with the overlay wrapper lookup and
+ * the provided action
+ */
+ static String getOverlayWrapperScript(String action) {
+ return """
+ setTimeout(() => {
+ var overlayWrapper = document.getElementById('vaadinLoginOverlayWrapper');
+ if (!overlayWrapper) {
+ var loginOverlay = document.querySelector('vaadin-login-overlay');
+ if (loginOverlay && loginOverlay.shadowRoot) {
+ overlayWrapper = loginOverlay.shadowRoot
+ .querySelector('vaadin-login-overlay-wrapper');
+ }
+ }
+ if (!overlayWrapper) return;
+ %s
+ });
+ """.formatted(action);
+ }
+
+ /**
+ * Generates a JavaScript snippet that finds the form element. Handles both
+ * Vaadin 24 and Vaadin 25+ compatibility.
+ *
+ * @param action the JavaScript code to execute on the form
+ * @return the complete JavaScript string with the form lookup and the provided
+ * action
+ */
+ static String getFormWrapperScript(String action) {
+ return """
+ setTimeout(() => {
+ var overlayFormWrapper = document.getElementById('vaadinLoginOverlayWrapper');
+ if (!overlayFormWrapper) {
+ overlayFormWrapper = document.querySelector('vaadin-login-overlay');
+ }
+ if (!overlayFormWrapper) return;
+ var form = overlayFormWrapper.querySelector('form');
+ if (form) {
+ %s
+ }
+ });
+ """.formatted(action);
+ }
+
+ /**
+ * Generates a JavaScript snippet that finds the form wrapper containing form
+ * elements. Handles both Vaadin 24 and Vaadin 25+ compatibility.
+ *
+ * @param action the JavaScript code to execute on the form wrapper
+ * @return the complete JavaScript string with the form wrapper lookup and the
+ * provided action
+ */
+ static String getLoginFormWrapperScript(String action) {
+ return """
+ setTimeout(() => {
+ var overlayWrapper = document.getElementById('vaadinLoginOverlayWrapper');
+ if (!overlayWrapper) {
+ var loginOverlay = document.querySelector('vaadin-login-overlay');
+ if (loginOverlay && loginOverlay.shadowRoot) {
+ overlayWrapper = loginOverlay.shadowRoot
+ .querySelector('vaadin-login-overlay-wrapper');
+ }
+ }
+ if (!overlayWrapper) return;
+ var formWrapper = overlayWrapper.querySelector('vaadin-login-form-wrapper');
+ if (!formWrapper) return;
+ %s
+ });
+ """.formatted(action);
+ }
+
+}
diff --git a/src/main/java/com/flowingcode/vaadin/addons/extendedlogin/ReplaceableLoginOverlay.java b/src/main/java/com/flowingcode/vaadin/addons/extendedlogin/ReplaceableLoginOverlay.java
index dcc1a68..0792f2a 100644
--- a/src/main/java/com/flowingcode/vaadin/addons/extendedlogin/ReplaceableLoginOverlay.java
+++ b/src/main/java/com/flowingcode/vaadin/addons/extendedlogin/ReplaceableLoginOverlay.java
@@ -28,49 +28,104 @@
*/
public interface ReplaceableLoginOverlay extends HasElement {
+ /**
+ * Replaces the contents of the login form with the provided elements. Clears
+ * existing form
+ * contents and appends the provided elements.
+ *
+ * @param withElement the elements to add to the form
+ */
default void replaceFormComponents(HasElement... withElement) {
- this.getElement()
- .executeJs(
- "setTimeout(()=>document.getElementById('vaadinLoginOverlayWrapper').getElementsByTagName('vaadin-login-form-wrapper')[0].getElementsByTagName('form')[0].replaceChildren())");
+ this.getElement().executeJs(LoginOverlayUtils.getFormWrapperScript("form.replaceChildren();"));
+
for (HasElement we : withElement) {
getElement().appendChild(we.getElement());
this.getElement()
- .executeJs(
- "setTimeout(()=>document.getElementById('vaadinLoginOverlayWrapper').getElementsByTagName('vaadin-login-form-wrapper')[0].getElementsByTagName('form')[0].appendChild($0))",
- we.getElement());
+ .executeJs(LoginOverlayUtils.getFormWrapperScript("form.appendChild($0);"), we.getElement());
}
}
+ /**
+ * Replaces the header/brand component of the login overlay. Clears the brand
+ * section and appends
+ * the provided element.
+ *
+ * @param withElement the element to set as the new brand/header
+ */
default void replaceHeaderComponent(HasElement withElement) {
getElement().appendChild(withElement.getElement());
+
this.getElement()
.executeJs(
- "setTimeout(()=>document.getElementById('vaadinLoginOverlayWrapper').shadowRoot.querySelector('[part=\"brand\"]').replaceChildren())");
+ LoginOverlayUtils.getOverlayWrapperScript(
+ """
+ var brand = overlayWrapper.shadowRoot ? overlayWrapper.shadowRoot.querySelector('[part="brand"]') : overlayWrapper.querySelector('[part="brand"]');
+ if (brand) {
+ brand.replaceChildren();
+ }
+ """));
+
this.getElement()
.executeJs(
- "setTimeout(()=>document.getElementById('vaadinLoginOverlayWrapper').shadowRoot.querySelector('[part=\"brand\"]').appendChild($0))",
+ LoginOverlayUtils.getOverlayWrapperScript(
+ """
+ var brand = overlayWrapper.shadowRoot ? overlayWrapper.shadowRoot.querySelector('[part="brand"]') : overlayWrapper.querySelector('[part="brand"]');
+ if (brand) {
+ brand.appendChild($0);
+ }
+ """),
withElement);
}
+ /**
+ * Removes the forgot password link from the login form.
+ */
+ default void removeForgotPassword() {
+ this.getElement()
+ .executeJs(
+ LoginOverlayUtils.getLoginFormWrapperScript(
+ """
+ var forgotPassword = formWrapper.querySelector('[slot="forgot-password"]');
+ if (forgotPassword) {
+ forgotPassword.remove();
+ }
+ """));
+ }
+
+ /**
+ * Replaces the forgot password component in the login overlay. Clears the
+ * forgot password section
+ * and appends the provided element.
+ *
+ * @param withElement the element to set as the new forgot password component
+ *
+ */
default void replaceForgotPassword(HasElement withElement) {
withElement.getElement().setAttribute("slot", "forgot-password");
getElement().appendChild(withElement.getElement());
+ this.removeForgotPassword();
this.getElement()
.executeJs(
- "setTimeout(()=>document.getElementById('vaadinLoginOverlayWrapper').getElementsByTagName('vaadin-login-form-wrapper')[0].querySelector('[slot=\\\"forgot-password\\\"]').remove())");
- this.getElement()
- .executeJs(
- "setTimeout(()=>document.getElementById('vaadinLoginOverlayWrapper').getElementsByTagName('vaadin-login-form-wrapper')[0].appendChild($0))",
+ LoginOverlayUtils.getLoginFormWrapperScript(
+ """
+ formWrapper.appendChild($0);
+ """),
withElement);
}
/**
- * Removes the default submit button.
+ * Removes the default submit button.
*/
default void removeSubmitButton() {
- this.getElement()
- .executeJs(
- "setTimeout(()=>document.getElementById('vaadinLoginOverlayWrapper').getElementsByTagName('vaadin-login-form-wrapper')[0].querySelector('[slot=\"submit\"]').remove())");
+ this.getElement()
+ .executeJs(
+ LoginOverlayUtils.getLoginFormWrapperScript(
+ """
+ var submitButton = formWrapper.querySelector('[slot="submit"]');
+ if (submitButton) {
+ submitButton.remove();
+ }
+ """));
}
-
+
}
diff --git a/src/test/java/com/flowingcode/vaadin/addons/AppShellConfiguratorImpl.java b/src/test/java/com/flowingcode/vaadin/addons/AppShellConfiguratorImpl.java
new file mode 100644
index 0000000..343396f
--- /dev/null
+++ b/src/test/java/com/flowingcode/vaadin/addons/AppShellConfiguratorImpl.java
@@ -0,0 +1,28 @@
+/*-
+ * #%L
+ * Extended Login Add-on
+ * %%
+ * Copyright (C) 2023 - 2026 Flowing Code
+ * %%
+ * 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.
+ * #L%
+ */
+package com.flowingcode.vaadin.addons;
+
+import com.vaadin.flow.component.page.AppShellConfigurator;
+import com.vaadin.flow.theme.Theme;
+
+@Theme
+public class AppShellConfiguratorImpl implements AppShellConfigurator {
+
+}
diff --git a/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/ExtendedLoginOverlayDemo.java b/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/ExtendedLoginOverlayDemo.java
index 2834456..d5de65b 100644
--- a/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/ExtendedLoginOverlayDemo.java
+++ b/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/ExtendedLoginOverlayDemo.java
@@ -29,6 +29,12 @@
@DemoSource(
"/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestExtendedLoginOverlayView.java")
+//#if vaadin eq 0
+@DemoSource(value = "/src/test/resources/META-INF/frontend/styles/extended-login-styles.css",
+ caption = "extended-login-styles.css", condition = "vaadin eq 24")
+@DemoSource(value = "/src/test/resources/META-INF/frontend/styles/extended-login-styles-v25.css",
+ caption = "extended-login-styles-v25.css", condition = "vaadin ge 25")
+//#endif
@PageTitle("Extended Login Overlay Demo")
@SuppressWarnings("serial")
@Route(value = "extended-login/login-overlay-demo", layout = ExtendedLoginDemoView.class)
diff --git a/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/LoginLayoutDemo.java b/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/LoginLayoutDemo.java
index af78c16..0b90fc0 100644
--- a/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/LoginLayoutDemo.java
+++ b/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/LoginLayoutDemo.java
@@ -29,6 +29,12 @@
@DemoSource("/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestLoginLayoutView.java")
@DemoSource("/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestLoginLayout.java")
+//#if vaadin eq 0
+@DemoSource(value = "/src/test/resources/META-INF/frontend/styles/extended-login-styles.css",
+ caption = "extended-login-styles.css", condition = "vaadin eq 24")
+@DemoSource(value = "/src/test/resources/META-INF/frontend/styles/extended-login-styles-v25.css",
+ caption = "extended-login-styles-v25.css", condition = "vaadin ge 25")
+//#endif
@PageTitle("Login Layout Demo")
@SuppressWarnings("serial")
@Route(value = "extended-login/login-layout-demo", layout = ExtendedLoginDemoView.class)
diff --git a/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestExtendedLoginOverlayView.java b/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestExtendedLoginOverlayView.java
index 7b69eb3..d196192 100644
--- a/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestExtendedLoginOverlayView.java
+++ b/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestExtendedLoginOverlayView.java
@@ -19,6 +19,8 @@
*/
package com.flowingcode.vaadin.addons.extendedlogin;
+import com.flowingcode.vaadin.addons.extendedlogin.it.ServerVersionCallables;
+import com.vaadin.flow.component.ClientCallable;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.combobox.ComboBox;
import com.vaadin.flow.component.dependency.CssImport;
@@ -39,9 +41,14 @@
*/
@SuppressWarnings("serial")
@Route(value = "extended-login/login-overlay")
-@CssImport("./styles/extended-login-styles.css") // hide-source
+//#if vaadin eq 24
+@CssImport("./styles/extended-login-styles.css")
+//#else
+@CssImport("./styles/extended-login-styles-v25.css")
+//#endif
@Ignore
-public class TestExtendedLoginOverlayView extends Div {
+// show-source public class TestExtendedLoginOverlayView extends Div {
+public class TestExtendedLoginOverlayView extends Div implements ServerVersionCallables { //hide-source
public TestExtendedLoginOverlayView() {
ExtendedLoginOverlay elo = new ExtendedLoginOverlay();
@@ -60,4 +67,13 @@ public TestExtendedLoginOverlayView() {
elo.setOpened(true);
add(elo);
}
+
+ //#if vaadin eq 0
+ @Override
+ @ClientCallable
+ public int getMajorVersion() {
+ return com.vaadin.flow.server.Version.getMajorVersion();
+ }
+ //#endif
+
}
diff --git a/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestLoginLayout.java b/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestLoginLayout.java
index a399ef9..9276954 100644
--- a/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestLoginLayout.java
+++ b/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestLoginLayout.java
@@ -19,6 +19,8 @@
*/
package com.flowingcode.vaadin.addons.extendedlogin;
+import com.flowingcode.vaadin.addons.extendedlogin.it.ServerVersionCallables;
+import com.vaadin.flow.component.ClientCallable;
import com.vaadin.flow.component.html.Image;
import com.vaadin.flow.component.login.LoginI18n;
import com.vaadin.flow.component.login.LoginI18n.Header;
@@ -28,7 +30,8 @@
*
* @author mlopez
*/
-public class TestLoginLayout extends LoginLayout {
+//show-source public class TestLoginLayout extends LoginLayout {
+public class TestLoginLayout extends LoginLayout implements ServerVersionCallables { //hide-source
private static final long serialVersionUID = 1L;
@@ -55,4 +58,12 @@ private LoginI18n createI18N() {
i18n.setAdditionalInformation("Change your password");
return i18n;
}
+
+ // #if vaadin eq 0
+ @Override
+ @ClientCallable
+ public int getMajorVersion() {
+ return com.vaadin.flow.server.Version.getMajorVersion();
+ }
+ // #endif
}
diff --git a/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestLoginLayoutView.java b/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestLoginLayoutView.java
index 180f3de..a07d5ee 100644
--- a/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestLoginLayoutView.java
+++ b/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestLoginLayoutView.java
@@ -38,10 +38,17 @@
@SuppressWarnings("serial")
@Route(value = "extended-login/login-layout", layout = TestLoginLayout.class)
@Ignore
-@CssImport("./styles/extended-login-styles.css") // hide-source
+//#if vaadin eq 24
+@CssImport("./styles/extended-login-styles.css")
+//#else
+@CssImport("./styles/extended-login-styles-v25.css")
+//#endif
// show-source @Route("value = "extended-login/login-layout-demo", layout = TestLoginLayout.class)
public class TestLoginLayoutView extends Div {
+ private PasswordField password;
+ private PasswordField confirmPassword;
+
public TestLoginLayoutView() {
add(createChangePasswordForm());
}
@@ -49,9 +56,9 @@ public TestLoginLayoutView() {
private FormLayout createChangePasswordForm() {
TextField username = new TextField("Username");
username.setEnabled(false);
- PasswordField password = new PasswordField("Password");
- PasswordField confirmPassword = new PasswordField("Confirm password");
- Button accept = new Button("Accept", ev -> Notification.show("Password changed."));
+ password = new PasswordField("Password");
+ confirmPassword = new PasswordField("Confirm password");
+ Button accept = new Button("Accept", ev -> onAccept());
FormLayout formLayout = new FormLayout();
formLayout.add(username, password, confirmPassword, accept);
@@ -65,4 +72,14 @@ private FormLayout createChangePasswordForm() {
formLayout.setColspan(accept, 2);
return formLayout;
}
+
+ private void onAccept() {
+ String passwordValue = this.password.getValue();
+ String confirmPasswordValue = this.confirmPassword.getValue();
+ if (passwordValue != null && !passwordValue.isBlank() && passwordValue.equals(confirmPasswordValue)) {
+ Notification.show("Password changed.");
+ } else {
+ Notification.show("Passwords do not match.");
+ }
+ }
}
diff --git a/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/AbstractViewTest.java b/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/AbstractViewTest.java
index 6e484bb..95a0f54 100644
--- a/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/AbstractViewTest.java
+++ b/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/AbstractViewTest.java
@@ -20,6 +20,7 @@
package com.flowingcode.vaadin.addons.extendedlogin.it;
+import com.flowingcode.vaadin.testbench.rpc.HasRpcSupport;
import com.vaadin.testbench.ScreenshotOnFailureRule;
import com.vaadin.testbench.TestBench;
import com.vaadin.testbench.parallel.ParallelTest;
@@ -42,13 +43,15 @@
* To learn more about TestBench, visit Vaadin TestBench.
*/
-public abstract class AbstractViewTest extends ParallelTest {
+public abstract class AbstractViewTest extends ParallelTest implements HasRpcSupport {
private static final int SERVER_PORT = 8080;
private final String route;
@Rule public ScreenshotOnFailureRule rule = new ScreenshotOnFailureRule(this, true);
+ ServerVersionCallables $server = createCallableProxy(ServerVersionCallables.class);
+
public AbstractViewTest() {
this("");
}
@@ -70,7 +73,8 @@ public void setup() throws Exception {
} else {
setDriver(TestBench.createDriver(new ChromeDriver()));
}
- getDriver().get(getURL(route));
+ getDriver().get(getURL(route));
+ getCommandExecutor().waitForVaadin();
}
/**
diff --git a/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/ExtendedLoginOverlayIT.java b/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/ExtendedLoginOverlayIT.java
index 4a8d24d..d3c78ca 100644
--- a/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/ExtendedLoginOverlayIT.java
+++ b/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/ExtendedLoginOverlayIT.java
@@ -26,6 +26,9 @@
import com.vaadin.flow.component.button.testbench.ButtonElement;
import com.vaadin.flow.component.combobox.testbench.ComboBoxElement;
import com.vaadin.flow.component.html.testbench.AnchorElement;
+import com.vaadin.flow.component.login.testbench.LoginOverlayElement;
+import com.vaadin.testbench.ElementQuery;
+
import org.junit.Test;
public class ExtendedLoginOverlayIT extends AbstractViewTest {
@@ -35,7 +38,9 @@ public ExtendedLoginOverlayIT() {
}
@Test
- public void testBasicBehaviour() {
+ public void testBasicBehaviour() {
+ boolean vaadin25 = $server.getMajorVersion() >= 25;
+
boolean comboBoxExists = $(ComboBoxElement.class).exists();
assertTrue("ComboBox not present", comboBoxExists);
boolean buttonExists = $(ButtonElement.class).exists();
@@ -43,10 +48,13 @@ public void testBasicBehaviour() {
if (buttonExists) {
assertEquals("Sign In", $(ButtonElement.class).first().getText());
}
- boolean anchorExists = $(AnchorElement.class).exists();
+
+ ElementQuery anchorQuery = vaadin25 ? $(LoginOverlayElement.class).first().$(AnchorElement.class)
+ : $(AnchorElement.class);
+ boolean anchorExists = anchorQuery.exists();
assertTrue("Anchor not present", anchorExists);
if (anchorExists) {
- assertEquals("Flowing Code Site", $(AnchorElement.class).first().getText());
+ assertEquals("Flowing Code Site", anchorQuery.first().getText());
}
}
}
diff --git a/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/LoginLayoutIT.java b/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/LoginLayoutIT.java
index ba550e1..e81f0bc 100644
--- a/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/LoginLayoutIT.java
+++ b/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/LoginLayoutIT.java
@@ -28,6 +28,9 @@
import com.vaadin.flow.component.html.testbench.H2Element;
import com.vaadin.flow.component.html.testbench.ImageElement;
import org.junit.Test;
+import com.vaadin.flow.component.login.testbench.LoginOverlayElement;
+import com.vaadin.testbench.ElementQuery;
+import com.vaadin.testbench.TestBenchElement;
public class LoginLayoutIT extends AbstractViewTest {
@@ -37,22 +40,34 @@ public LoginLayoutIT() {
@Test
public void testBasicBehaviour() {
- VaadinLoginOverlayWrapperElement vlow = $(VaadinLoginOverlayWrapperElement.class).first();
- VaadinLoginFormWrapperElement vlfw = $(VaadinLoginFormWrapperElement.class).first();
+ boolean vaadin25 = $server.getMajorVersion() >= 25;
+
+ LoginOverlayElement vlo = $(LoginOverlayElement.class).first();
+ TestBenchElement vlow = vaadin25 ? vlo.getLoginOverlayWrapper() : $(VaadinLoginOverlayWrapperElement.class).first();
+ TestBenchElement vlfw = vaadin25 ? vlo.$("vaadin-login-form-wrapper").first()
+ : $(VaadinLoginFormWrapperElement.class).first();
+
assertTrue(
"Custom image is not present",
vlow.$(ImageElement.class).attribute("alt", "Login image").exists());
- boolean h2exists = vlfw.$(H2Element.class).exists();
- assertTrue("H2 is not present", h2exists);
- if (h2exists) {
- assertEquals("Change Password", vlfw.$(H2Element.class).first().getText());
+
+ if (vaadin25) {
+ assertEquals("Change Password", vlo.getFormTitle());
+ } else {
+ boolean h2exists = vlfw.$(H2Element.class).exists();
+ assertTrue("H2 is not present", h2exists);
+ if (h2exists) {
+ assertEquals("Change Password", vlfw.$(H2Element.class).first().getText());
+ }
}
- boolean divSlotFormExists = $(DivElement.class).attribute("slot", "form").exists();
+
+ ElementQuery divSlotForm = vlfw.$(DivElement.class).attribute("slot", "form");
+ boolean divSlotFormExists = divSlotForm.exists();
assertTrue("Div with slot form is not present", divSlotFormExists);
if (divSlotFormExists) {
- boolean divContainsFormLayoutExists =
- $(DivElement.class).attribute("slot", "form").first().$(FormLayoutElement.class).exists();
+ boolean divContainsFormLayoutExists = divSlotForm.first().$(FormLayoutElement.class).exists();
assertTrue("Div does not contain form layout", divContainsFormLayoutExists);
}
}
+
}
diff --git a/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/ServerVersionCallables.java b/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/ServerVersionCallables.java
new file mode 100644
index 0000000..5b8c61c
--- /dev/null
+++ b/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/ServerVersionCallables.java
@@ -0,0 +1,31 @@
+/*-
+ * #%L
+ * Extended Login Add-on
+ * %%
+ * Copyright (C) 2023 - 2026 Flowing Code
+ * %%
+ * 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.
+ * #L%
+ */
+package com.flowingcode.vaadin.addons.extendedlogin.it;
+
+/**
+ * Interface for callable methods to retrieve server version information. This
+ * is used to determine whether certain tests should be executed based on the
+ * server version.
+ */
+public interface ServerVersionCallables {
+
+ int getMajorVersion();
+
+}
\ No newline at end of file
diff --git a/src/test/resources/META-INF/frontend/styles/extended-login-styles-v25.css b/src/test/resources/META-INF/frontend/styles/extended-login-styles-v25.css
new file mode 100644
index 0000000..8182882
--- /dev/null
+++ b/src/test/resources/META-INF/frontend/styles/extended-login-styles-v25.css
@@ -0,0 +1,40 @@
+/*-
+ * #%L
+ * Extended Login Add-on
+ * %%
+ * Copyright (C) 2023 - 2026 Flowing Code
+ * %%
+ * 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.
+ * #L%
+ */
+/*Demo styles*/
+vaadin-login-overlay::part(brand) {
+ background: black;
+ justify-content: center;
+ align-content: center;
+ flex-wrap: wrap;
+}
+
+@media only screen and (max-height: 600px) and (min-width: 600px) and (orientation: landscape) {
+ vaadin-login-overlay::part(form) {
+ overflow: initial;
+ }
+}
+
+vaadin-login-overlay::part(content) {
+ transform: scale(0.75);
+}
+
+.wrap-iframe {
+ overflow: hidden;
+}
\ No newline at end of file