From d127e3c9c7083a11ec72e39eea273e178ebb5515 Mon Sep 17 00:00:00 2001 From: Paola De Bartolo Date: Tue, 3 Mar 2026 17:37:34 -0300 Subject: [PATCH 1/8] refactor: use Java text blocks to improved JavaScript readability --- .../addons/extendedlogin/LoginLayout.java | 18 +++-- .../ReplaceableLoginOverlay.java | 67 +++++++++++++++---- 2 files changed, 67 insertions(+), 18 deletions(-) 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..ba42e2d 100644 --- a/src/main/java/com/flowingcode/vaadin/addons/extendedlogin/LoginLayout.java +++ b/src/main/java/com/flowingcode/vaadin/addons/extendedlogin/LoginLayout.java @@ -52,13 +52,23 @@ protected void onAttach(AttachEvent attachEvent) { super.onAttach(attachEvent); setOpened(true); this.getElement() - .executeJs( - "setTimeout(()=>document.getElementById('vaadinLoginOverlayWrapper').getElementsByTagName('vaadin-login-form-wrapper')[0].replaceChildren())"); + .executeJs(""" + setTimeout(() => { + document.getElementById('vaadinLoginOverlayWrapper') + .getElementsByTagName('vaadin-login-form-wrapper')[0] + .replaceChildren(); + }); + """); 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))"); + .executeJs(""" + setTimeout(() => { + document.getElementById('vaadinLoginOverlayWrapper') + .getElementsByTagName('vaadin-login-form-wrapper')[0] + .appendChild(this); + }); + """); } } 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..f317412 100644 --- a/src/main/java/com/flowingcode/vaadin/addons/extendedlogin/ReplaceableLoginOverlay.java +++ b/src/main/java/com/flowingcode/vaadin/addons/extendedlogin/ReplaceableLoginOverlay.java @@ -30,13 +30,25 @@ public interface ReplaceableLoginOverlay extends HasElement { default void replaceFormComponents(HasElement... withElement) { this.getElement() - .executeJs( - "setTimeout(()=>document.getElementById('vaadinLoginOverlayWrapper').getElementsByTagName('vaadin-login-form-wrapper')[0].getElementsByTagName('form')[0].replaceChildren())"); + .executeJs(""" + setTimeout(() => { + document.getElementById('vaadinLoginOverlayWrapper') + .getElementsByTagName('vaadin-login-form-wrapper')[0] + .getElementsByTagName('form')[0] + .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))", + .executeJs(""" + setTimeout(() => { + document.getElementById('vaadinLoginOverlayWrapper') + .getElementsByTagName('vaadin-login-form-wrapper')[0] + .getElementsByTagName('form')[0] + .appendChild($0); + }); + """, we.getElement()); } } @@ -44,11 +56,21 @@ default void replaceFormComponents(HasElement... withElement) { default void replaceHeaderComponent(HasElement withElement) { getElement().appendChild(withElement.getElement()); this.getElement() - .executeJs( - "setTimeout(()=>document.getElementById('vaadinLoginOverlayWrapper').shadowRoot.querySelector('[part=\"brand\"]').replaceChildren())"); + .executeJs(""" + setTimeout(() => { + document.getElementById('vaadinLoginOverlayWrapper') + .shadowRoot.querySelector('[part="brand"]') + .replaceChildren(); + }); + """); this.getElement() - .executeJs( - "setTimeout(()=>document.getElementById('vaadinLoginOverlayWrapper').shadowRoot.querySelector('[part=\"brand\"]').appendChild($0))", + .executeJs(""" + setTimeout(() => { + document.getElementById('vaadinLoginOverlayWrapper') + .shadowRoot.querySelector('[part="brand"]') + .appendChild($0); + }); + """, withElement); } @@ -56,11 +78,22 @@ default void replaceForgotPassword(HasElement withElement) { withElement.getElement().setAttribute("slot", "forgot-password"); getElement().appendChild(withElement.getElement()); this.getElement() - .executeJs( - "setTimeout(()=>document.getElementById('vaadinLoginOverlayWrapper').getElementsByTagName('vaadin-login-form-wrapper')[0].querySelector('[slot=\\\"forgot-password\\\"]').remove())"); + .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))", + .executeJs(""" + setTimeout(() => { + document.getElementById('vaadinLoginOverlayWrapper') + .getElementsByTagName('vaadin-login-form-wrapper')[0] + .appendChild($0); + }); + """, withElement); } @@ -69,8 +102,14 @@ default void replaceForgotPassword(HasElement withElement) { */ default void removeSubmitButton() { this.getElement() - .executeJs( - "setTimeout(()=>document.getElementById('vaadinLoginOverlayWrapper').getElementsByTagName('vaadin-login-form-wrapper')[0].querySelector('[slot=\"submit\"]').remove())"); + .executeJs(""" + setTimeout(() => { + document.getElementById('vaadinLoginOverlayWrapper') + .getElementsByTagName('vaadin-login-form-wrapper')[0] + .querySelector('[slot="submit"]') + .remove(); + }); + """); } } From 31f4e457665893740638f9f95aa0b4268a33521d Mon Sep 17 00:00:00 2001 From: Paola De Bartolo Date: Thu, 5 Mar 2026 14:09:02 -0300 Subject: [PATCH 2/8] refactor: add Vaadin 25 support Update JavaScript calls in classes ReplaceableLoginOverlay and LoginLayout to support Vaadin 24 & Vaadin 25. Close #23 --- .../addons/extendedlogin/LoginLayout.java | 27 +-- .../ReplaceableLoginOverlay.java | 214 ++++++++++++------ 2 files changed, 159 insertions(+), 82 deletions(-) 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 ba42e2d..41fe493 100644 --- a/src/main/java/com/flowingcode/vaadin/addons/extendedlogin/LoginLayout.java +++ b/src/main/java/com/flowingcode/vaadin/addons/extendedlogin/LoginLayout.java @@ -51,24 +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( + ReplaceableLoginOverlay.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( + ReplaceableLoginOverlay.getLoginFormWrapperScript( + """ + formWrapper.appendChild(this); + """)); } } 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 f317412..b598b15 100644 --- a/src/main/java/com/flowingcode/vaadin/addons/extendedlogin/ReplaceableLoginOverlay.java +++ b/src/main/java/com/flowingcode/vaadin/addons/extendedlogin/ReplaceableLoginOverlay.java @@ -28,88 +28,172 @@ */ public interface ReplaceableLoginOverlay extends HasElement { + /** + * 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); + } + + /** + * 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(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()); + this.getElement().executeJs(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(); - }); - """); - this.getElement() - .executeJs(""" - setTimeout(() => { - document.getElementById('vaadinLoginOverlayWrapper') - .shadowRoot.querySelector('[part="brand"]') - .appendChild($0); - }); - """, - withElement); + + this.getElement().executeJs( + getOverlayWrapperScript( + """ + var brand = overlayWrapper.shadowRoot ? overlayWrapper.shadowRoot.querySelector('[part="brand"]') : overlayWrapper.querySelector('[part="brand"]'); + if (brand) { + brand.replaceChildren(); + } + """)); + + this.getElement().executeJs( + 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( + 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.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); - }); - """, - withElement); + this.removeForgotPassword(); + this.getElement().executeJs( + 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( + getLoginFormWrapperScript( + """ + var submitButton = formWrapper.querySelector('[slot="submit"]'); + if (submitButton) { + submitButton.remove(); + } + """)); } - + } From 409a750f9ff62289b21901a105570449f078f04e Mon Sep 17 00:00:00 2001 From: Paola De Bartolo Date: Thu, 5 Mar 2026 14:09:43 -0300 Subject: [PATCH 3/8] feat(demo): add AppShellConfiguratorImpl class --- pom.xml | 3 +- .../addons/AppShellConfiguratorImpl.java | 28 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/flowingcode/vaadin/addons/AppShellConfiguratorImpl.java diff --git a/pom.xml b/pom.xml index 0f6d858..6d24774 100644 --- a/pom.xml +++ b/pom.xml @@ -445,7 +445,8 @@ **/test/* **/it/* **/DemoView.class - **/DemoLayout.class + **/DemoLayout.class + **/AppShellConfiguratorImpl.class 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 { + +} From bfc6605627def86485941d899452ab81440f14b4 Mon Sep 17 00:00:00 2001 From: Paola De Bartolo Date: Thu, 5 Mar 2026 14:35:25 -0300 Subject: [PATCH 4/8] refactor(demo): use separate stylesheets for Vaadin 25 compatibility Use demo source condition attribute to select between Vaadin 24 & Vaadin 25 styles. --- .../ExtendedLoginOverlayDemo.java | 6 +++ .../addons/extendedlogin/LoginLayoutDemo.java | 6 +++ .../TestExtendedLoginOverlayView.java | 6 ++- .../extendedlogin/TestLoginLayoutView.java | 6 ++- .../styles/extended-login-styles-v25.css | 40 +++++++++++++++++++ 5 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 src/test/resources/META-INF/frontend/styles/extended-login-styles-v25.css 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..5bd43de 100644 --- a/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestExtendedLoginOverlayView.java +++ b/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestExtendedLoginOverlayView.java @@ -39,7 +39,11 @@ */ @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 { 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..7938235 100644 --- a/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestLoginLayoutView.java +++ b/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestLoginLayoutView.java @@ -38,7 +38,11 @@ @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 { 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 From 3a38f1153967cc0bd2aa0e7f1d50fdda278a9444 Mon Sep 17 00:00:00 2001 From: Paola De Bartolo Date: Thu, 5 Mar 2026 16:09:13 -0300 Subject: [PATCH 5/8] feat(demo): add simple change password validation --- .../extendedlogin/TestLoginLayoutView.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) 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 7938235..fd31de1 100644 --- a/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestLoginLayoutView.java +++ b/src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestLoginLayoutView.java @@ -46,6 +46,9 @@ // 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()); } @@ -53,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); @@ -69,4 +72,14 @@ private FormLayout createChangePasswordForm() { formLayout.setColspan(accept, 2); return formLayout; } + + private void onAccept() { + String password = this.password.getValue(); + String confirmPassword = this.confirmPassword.getValue(); + if (password != null && password.equals(confirmPassword)) { + Notification.show("Password changed."); + } else { + Notification.show("Passwords do not match."); + } + } } From 3be324582e38e4bbc74c2decbf3bf5c797a4d2cc Mon Sep 17 00:00:00 2001 From: Paola De Bartolo Date: Fri, 6 Mar 2026 15:50:46 -0300 Subject: [PATCH 6/8] test: refactor tests to make them compatible with Vaadin 24 & 25 Add testbench-rpc denpendency to be able to retrieve Vaadin version. --- pom.xml | 6 ++++ .../TestExtendedLoginOverlayView.java | 15 ++++++++- .../addons/extendedlogin/TestLoginLayout.java | 13 +++++++- .../extendedlogin/it/AbstractViewTest.java | 8 +++-- .../it/ExtendedLoginOverlayIT.java | 14 ++++++-- .../extendedlogin/it/LoginLayoutIT.java | 33 ++++++++++++++----- .../it/ServerVersionCallables.java | 31 +++++++++++++++++ 7 files changed, 104 insertions(+), 16 deletions(-) create mode 100644 src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/ServerVersionCallables.java diff --git a/pom.xml b/pom.xml index 6d24774..ac5538d 100644 --- a/pom.xml +++ b/pom.xml @@ -123,6 +123,12 @@ vaadin-testbench test + + com.flowingcode.vaadin.test + testbench-rpc + 1.5.0 + test + com.flowingcode.vaadin.addons.demo commons-demo 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 5bd43de..f16a062 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; @@ -45,7 +47,8 @@ @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(); @@ -64,4 +67,14 @@ public TestExtendedLoginOverlayView() { elo.setOpened(true); add(elo); } + + //#if vaadin eq 0 + @Override + @ClientCallable + public int getMajorVersion() { + // System.out.println("getMajorVersion called on server" + com.vaadin.flow.server.Version.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/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 From 59d544c16820518802864a978dd44fb85476ad64 Mon Sep 17 00:00:00 2001 From: Paola De Bartolo Date: Fri, 6 Mar 2026 16:12:41 -0300 Subject: [PATCH 7/8] refactor: move static methods from interface to utils class --- .../addons/extendedlogin/LoginLayout.java | 16 +- .../extendedlogin/LoginOverlayUtils.java | 105 ++++++++++ .../ReplaceableLoginOverlay.java | 182 ++++++------------ 3 files changed, 170 insertions(+), 133 deletions(-) create mode 100644 src/main/java/com/flowingcode/vaadin/addons/extendedlogin/LoginOverlayUtils.java 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 41fe493..87e8730 100644 --- a/src/main/java/com/flowingcode/vaadin/addons/extendedlogin/LoginLayout.java +++ b/src/main/java/com/flowingcode/vaadin/addons/extendedlogin/LoginLayout.java @@ -52,16 +52,16 @@ protected void onAttach(AttachEvent attachEvent) { super.onAttach(attachEvent); setOpened(true); this.getElement().executeJs( - ReplaceableLoginOverlay.getLoginFormWrapperScript( - """ - formWrapper.querySelectorAll('[slot="form"], [slot="submit"], [slot="forgot-password"]').forEach(c => c.remove()); - """)); + 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( - ReplaceableLoginOverlay.getLoginFormWrapperScript( - """ - formWrapper.appendChild(this); - """)); + 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..d48a8de --- /dev/null +++ b/src/main/java/com/flowingcode/vaadin/addons/extendedlogin/LoginOverlayUtils.java @@ -0,0 +1,105 @@ +/*- + * #%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 { + + /** + * 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 b598b15..0792f2a 100644 --- a/src/main/java/com/flowingcode/vaadin/addons/extendedlogin/ReplaceableLoginOverlay.java +++ b/src/main/java/com/flowingcode/vaadin/addons/extendedlogin/ReplaceableLoginOverlay.java @@ -29,171 +29,103 @@ public interface ReplaceableLoginOverlay extends HasElement { /** - * 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); - } - - /** - * Replaces the contents of the login form with the provided elements. - * Clears existing form contents and appends the provided elements. + * 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(getFormWrapperScript("form.replaceChildren();")); + this.getElement().executeJs(LoginOverlayUtils.getFormWrapperScript("form.replaceChildren();")); for (HasElement we : withElement) { getElement().appendChild(we.getElement()); - this.getElement().executeJs(getFormWrapperScript("form.appendChild($0);"), we.getElement()); + this.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. + * 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( - getOverlayWrapperScript( - """ - var brand = overlayWrapper.shadowRoot ? overlayWrapper.shadowRoot.querySelector('[part="brand"]') : overlayWrapper.querySelector('[part="brand"]'); - if (brand) { - brand.replaceChildren(); - } - """)); + this.getElement() + .executeJs( + LoginOverlayUtils.getOverlayWrapperScript( + """ + var brand = overlayWrapper.shadowRoot ? overlayWrapper.shadowRoot.querySelector('[part="brand"]') : overlayWrapper.querySelector('[part="brand"]'); + if (brand) { + brand.replaceChildren(); + } + """)); - this.getElement().executeJs( - getOverlayWrapperScript( - """ - var brand = overlayWrapper.shadowRoot ? overlayWrapper.shadowRoot.querySelector('[part="brand"]') : overlayWrapper.querySelector('[part="brand"]'); - if (brand) { - brand.appendChild($0); - } - """), - withElement); + this.getElement() + .executeJs( + 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( - getLoginFormWrapperScript( - """ - var forgotPassword = formWrapper.querySelector('[slot="forgot-password"]'); - if (forgotPassword) { - forgotPassword.remove(); - } - """)); + 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. + * 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( - getLoginFormWrapperScript( - """ - formWrapper.appendChild($0); - """), - withElement); + this.getElement() + .executeJs( + LoginOverlayUtils.getLoginFormWrapperScript( + """ + formWrapper.appendChild($0); + """), + withElement); } /** * Removes the default submit button. */ default void removeSubmitButton() { - this.getElement().executeJs( - getLoginFormWrapperScript( - """ - var submitButton = formWrapper.querySelector('[slot="submit"]'); - if (submitButton) { - submitButton.remove(); - } - """)); + this.getElement() + .executeJs( + LoginOverlayUtils.getLoginFormWrapperScript( + """ + var submitButton = formWrapper.querySelector('[slot="submit"]'); + if (submitButton) { + submitButton.remove(); + } + """)); } } From 06b372cbb5c9822c9b3d79a04ebf9937a3b1e214 Mon Sep 17 00:00:00 2001 From: Paola De Bartolo Date: Fri, 6 Mar 2026 16:39:50 -0300 Subject: [PATCH 8/8] ci: update Vaadin version to 25.0.6 in v25 profile --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ac5538d..b2f1a7b 100644 --- a/pom.xml +++ b/pom.xml @@ -466,7 +466,7 @@ 21 21 - 25.0.0 + 25.0.6 11.0.26