Add Vaadin 25 support while maintaining Vaadin 24 compatibility#27
Add Vaadin 25 support while maintaining Vaadin 24 compatibility#27
Conversation
Update JavaScript calls in classes ReplaceableLoginOverlay and LoginLayout to support Vaadin 24 & Vaadin 25. Close #23
Use demo source condition attribute to select between Vaadin 24 & Vaadin 25 styles.
WalkthroughRefactors inline JavaScript for Vaadin login overlay into a new LoginOverlayUtils helper; adds default manipulation methods to ReplaceableLoginOverlay; updates demos, tests and ITs to be Vaadin-version aware (24 vs 25+); introduces RPC test support and a Vaadin‑25-specific demo stylesheet. Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
Suggested reviewers
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 6
🧹 Nitpick comments (3)
src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/ServerVersionCallables.java (1)
20-29: Move this contract out of the.itpackage.Both
TestExtendedLoginOverlayViewandTestLoginLayoutimplement this interface from outsidecom.flowingcode.vaadin.addons.extendedlogin.it, so the current location makes the server-side fixtures depend on the integration-test namespace. A neutral test-support package would keep that dependency direction cleaner.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/ServerVersionCallables.java` around lines 20 - 29, Move the ServerVersionCallables interface out of the com.flowingcode.vaadin.addons.extendedlogin.it package into a neutral test-support package (e.g., com.flowingcode.vaadin.addons.extendedlogin.testsupport) so integration tests don't become a dependency target; update the package declaration in the ServerVersionCallables file and adjust imports in classes that implement it (TestExtendedLoginOverlayView, TestLoginLayout) to reference the new package name, and run/compile tests to ensure no remaining references to the old .it package remain.src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/LoginLayoutIT.java (1)
57-62: Redundant conditional after assertTrue.The
if (h2exists)block on line 59 is unreachable ifh2existsis false becauseassertTrueon line 58 would already fail the test.Simplify by removing redundant conditional
} else { - boolean h2exists = vlfw.$(H2Element.class).exists(); - assertTrue("H2 is not present", h2exists); - if (h2exists) { - assertEquals("Change Password", vlfw.$(H2Element.class).first().getText()); - } + assertTrue("H2 is not present", vlfw.$(H2Element.class).exists()); + assertEquals("Change Password", vlfw.$(H2Element.class).first().getText()); }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/LoginLayoutIT.java` around lines 57 - 62, The test uses a redundant if (h2exists) after assertTrue("H2 is not present", h2exists) in LoginLayoutIT.java; remove the conditional and directly call assertEquals("Change Password", vlfw.$(H2Element.class).first().getText()) after the assertTrue (or replace both with a single assertEquals if you prefer) so the check of vlfw.$(H2Element.class).first().getText() is executed only when the existence assertion has guaranteed the element is present.src/main/java/com/flowingcode/vaadin/addons/extendedlogin/ReplaceableLoginOverlay.java (1)
55-78: Potential race condition with sequential asynchronous calls.
replaceHeaderComponentissues two separateexecuteJscalls, each wrapped insetTimeoutby the utility method. Without a guaranteed execution order, the append operation could theoretically execute before the clear operation completes, though in practice browsers typically execute same-ticksetTimeout(..., 0)callbacks in order.Consider combining the operations into a single script to eliminate any timing ambiguity.
Combine clear and append into single script
default void replaceHeaderComponent(HasElement withElement) { getElement().appendChild(withElement.getElement()); - 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( - LoginOverlayUtils.getOverlayWrapperScript( - """ - var brand = overlayWrapper.shadowRoot ? overlayWrapper.shadowRoot.querySelector('[part="brand"]') : overlayWrapper.querySelector('[part="brand"]'); - if (brand) { brand.appendChild($0); } """), withElement); }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/main/java/com/flowingcode/vaadin/addons/extendedlogin/ReplaceableLoginOverlay.java` around lines 55 - 78, The replaceHeaderComponent method issues two separate executeJs calls which can race; change it to a single executeJs call using LoginOverlayUtils.getOverlayWrapperScript that runs one script which finds the [part="brand"], clears its children and then appends $0 in the same tick, passing withElement as the single argument so both clear-and-append happen atomically; update the method to remove the two executeJs invocations and use one combined script invocation referencing withElement.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@pom.xml`:
- Around line 467-470: The v25 Maven profile currently sets
<vaadin.version>25.0.6</vaadin.version> but leaves
<jetty.version>11.0.26</jetty.version>, which is incompatible; update the v25
profile to bump the jetty.version property to a Jetty 12.x release (e.g.,
12.1.x) so Jetty supports Jakarta Servlet 6.1+ required by Vaadin 25 — locate
the jetty.version property in the v25 profile and change its value to a 12.1.x
version.
In
`@src/main/java/com/flowingcode/vaadin/addons/extendedlogin/LoginOverlayUtils.java`:
- Around line 61-75: The getFormWrapperScript method fails to traverse the
overlay's shadow DOM when locating the <form>, so update the lookup for the form
on the overlayFormWrapper to check overlayFormWrapper.shadowRoot first (like
getOverlayWrapperScript/getLoginFormWrapperScript): if
overlayFormWrapper.shadowRoot exists, query the form from
overlayFormWrapper.shadowRoot.querySelector('form'), otherwise fall back to
overlayFormWrapper.querySelector('form'), then run the formatted action when
form is found (symbols: getFormWrapperScript, overlayFormWrapper, shadowRoot,
querySelector).
In
`@src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestLoginLayout.java`:
- Around line 62-68: The preprocessor comment markers in TestLoginLayout's
getMajorVersion method use a spaced form ("// `#if`" and "// `#endif`") inconsistent
with the rest of the codebase; update the conditional block around the
getMajorVersion method (class TestLoginLayout, method getMajorVersion) to use
the no-space form ("//#if" and "//#endif") so the preprocessor recognizes the
directives consistently.
In
`@src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestLoginLayoutView.java`:
- Around line 76-83: The onAccept() handler currently treats two empty strings
as a valid password change; update onAccept() to reject blank or whitespace-only
passwords before showing success by ensuring password and confirmPassword are
non-null and not blank (e.g., check password != null &&
!password.trim().isEmpty() and same for confirmPassword) and only then compare
equality (password.equals(confirmPassword)) to show "Password changed."
otherwise show the mismatch/empty error; refer to the onAccept(), password and
confirmPassword variables for locating the change.
- Around line 41-45: The two `@CssImport` annotations in TestLoginLayoutView (the
lines with `@CssImport`("./styles/extended-login-styles.css") and
`@CssImport`("./styles/extended-login-styles-v25.css")) are both compiled because
the //#if comments are not a preprocessing step; remove both annotations and
instead load the appropriate stylesheet at runtime in the view's constructor (or
an init method) by checking the Vaadin version or a config flag and calling
UI.getCurrent().getPage().addStyleSheet(...) or
UI.getCurrent().getElement().executeJs(...) to include the correct CSS file;
this ensures only the version-specific stylesheet is loaded instead of relying
on compile-time comments.
In `@src/test/resources/META-INF/frontend/styles/extended-login-styles-v25.css`:
- Around line 1-20: The CSS license header starts with the unusual "/*-" and
lacks the required whitespace, triggering Stylelint's comment-whitespace-inside
rule for the file extended-login-styles-v25.css; fix by either (A) normalizing
the header comments in that file: change the opening "/*-" to a standard "/*"
and ensure there is a space immediately after "/*" and immediately before the
closing "*/" (so the license block and the "/*Demo styles*/" comment comply), or
(B) add an override in your stylelint config to whitelist this generated license
header by disabling or ignoring comment-whitespace-inside for that file (use an
override for the filename pattern and set the rule to null or exempt the header
pattern).
---
Nitpick comments:
In
`@src/main/java/com/flowingcode/vaadin/addons/extendedlogin/ReplaceableLoginOverlay.java`:
- Around line 55-78: The replaceHeaderComponent method issues two separate
executeJs calls which can race; change it to a single executeJs call using
LoginOverlayUtils.getOverlayWrapperScript that runs one script which finds the
[part="brand"], clears its children and then appends $0 in the same tick,
passing withElement as the single argument so both clear-and-append happen
atomically; update the method to remove the two executeJs invocations and use
one combined script invocation referencing withElement.
In
`@src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/LoginLayoutIT.java`:
- Around line 57-62: The test uses a redundant if (h2exists) after
assertTrue("H2 is not present", h2exists) in LoginLayoutIT.java; remove the
conditional and directly call assertEquals("Change Password",
vlfw.$(H2Element.class).first().getText()) after the assertTrue (or replace both
with a single assertEquals if you prefer) so the check of
vlfw.$(H2Element.class).first().getText() is executed only when the existence
assertion has guaranteed the element is present.
In
`@src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/ServerVersionCallables.java`:
- Around line 20-29: Move the ServerVersionCallables interface out of the
com.flowingcode.vaadin.addons.extendedlogin.it package into a neutral
test-support package (e.g.,
com.flowingcode.vaadin.addons.extendedlogin.testsupport) so integration tests
don't become a dependency target; update the package declaration in the
ServerVersionCallables file and adjust imports in classes that implement it
(TestExtendedLoginOverlayView, TestLoginLayout) to reference the new package
name, and run/compile tests to ensure no remaining references to the old .it
package remain.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 33ac540c-6001-4b01-9627-752c3e8dd146
📒 Files selected for processing (15)
pom.xmlsrc/main/java/com/flowingcode/vaadin/addons/extendedlogin/LoginLayout.javasrc/main/java/com/flowingcode/vaadin/addons/extendedlogin/LoginOverlayUtils.javasrc/main/java/com/flowingcode/vaadin/addons/extendedlogin/ReplaceableLoginOverlay.javasrc/test/java/com/flowingcode/vaadin/addons/AppShellConfiguratorImpl.javasrc/test/java/com/flowingcode/vaadin/addons/extendedlogin/ExtendedLoginOverlayDemo.javasrc/test/java/com/flowingcode/vaadin/addons/extendedlogin/LoginLayoutDemo.javasrc/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestExtendedLoginOverlayView.javasrc/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestLoginLayout.javasrc/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestLoginLayoutView.javasrc/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/AbstractViewTest.javasrc/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/ExtendedLoginOverlayIT.javasrc/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/LoginLayoutIT.javasrc/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/ServerVersionCallables.javasrc/test/resources/META-INF/frontend/styles/extended-login-styles-v25.css
src/main/java/com/flowingcode/vaadin/addons/extendedlogin/LoginOverlayUtils.java
Show resolved
Hide resolved
src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestLoginLayout.java
Show resolved
Hide resolved
src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestLoginLayoutView.java
Show resolved
Hide resolved
src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestLoginLayoutView.java
Show resolved
Hide resolved
src/test/resources/META-INF/frontend/styles/extended-login-styles-v25.css
Show resolved
Hide resolved
There was a problem hiding this comment.
🧹 Nitpick comments (4)
src/main/java/com/flowingcode/vaadin/addons/extendedlogin/ReplaceableLoginOverlay.java (1)
58-76: Extract the repeatedbrandlookup intoLoginOverlayUtils.The same
brand-lookup block is duplicated in both JS snippets here. Pulling that into the utility would keep the clear and append paths from drifting apart.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/main/java/com/flowingcode/vaadin/addons/extendedlogin/ReplaceableLoginOverlay.java` around lines 58 - 76, The duplicated brand lookup JS in ReplaceableLoginOverlay's two getElement().executeJs calls should be moved into a single reusable helper in LoginOverlayUtils (e.g. a method like getBrandLookupScript or an overload of getOverlayWrapperScript that injects the brand variable), then call that helper from both executeJs invocations so each snippet reuses the same brand lookup variable instead of duplicating the querySelector logic; update ReplaceableLoginOverlay to invoke LoginOverlayUtils.getOverlayWrapperScript (or the new helper) for both the clear and append paths and remove the duplicated brand query blocks.src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/AbstractViewTest.java (1)
53-77: Expose the version check from the base test.
$server.getMajorVersion() >= 25is now repeated in the IT subclasses. A small helper here, e.g.isVaadin25(), would keep the version boundary in one place and simplify the test bodies.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/AbstractViewTest.java` around lines 53 - 77, Add a small helper on AbstractViewTest that centralizes the Vaadin major-version check: implement a protected boolean isVaadin25() that returns $server.getMajorVersion() >= 25 (using the existing ServerVersionCallables $server instance), and update IT subclasses to call isVaadin25() instead of repeating the literal check so the version boundary is kept in one place.src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/LoginLayoutIT.java (1)
64-69: Assert that the original login form is actually replaced.This only checks that the custom
slot="form"content exists. A regression that leaves the stock login form in place would still pass, so add a negative assertion for the original form controls as well.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/LoginLayoutIT.java` around lines 64 - 69, Add a negative assertion to ensure the original login form is removed: after locating the custom slot (divSlotForm / divSlotFormExists) assert that the original form controls do not exist by querying for the original FormLayoutElement and its typical child controls and asserting false; for example use vlfw.$(FormLayoutElement.class).exists() (or vlfw.$(TextFieldElement.class) / vlfw.$(ButtonElement.class) as appropriate) and call assertFalse with a clear message so the test fails if the stock login form is still present.src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/ExtendedLoginOverlayIT.java (1)
52-57: Assert that the built-in forgot-password control is gone.This proves the custom anchor renders, but it still passes if the original forgot-password control remains alongside it. Adding a negative assertion here would lock in the replacement behavior across both supported versions.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/ExtendedLoginOverlayIT.java` around lines 52 - 57, Add a negative assertion in ExtendedLoginOverlayIT to ensure the original "forgot-password" control is removed: after computing anchorQuery/anchorExists, query for any AnchorElement that represents the built-in forgot-password control (e.g., an AnchorElement whose text contains "Forgot" or "Forgot password") and assertFalse that this query exists; keep the vaadin25 branching logic consistent when building the query so the absence check covers both supported versions.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In
`@src/main/java/com/flowingcode/vaadin/addons/extendedlogin/ReplaceableLoginOverlay.java`:
- Around line 58-76: The duplicated brand lookup JS in ReplaceableLoginOverlay's
two getElement().executeJs calls should be moved into a single reusable helper
in LoginOverlayUtils (e.g. a method like getBrandLookupScript or an overload of
getOverlayWrapperScript that injects the brand variable), then call that helper
from both executeJs invocations so each snippet reuses the same brand lookup
variable instead of duplicating the querySelector logic; update
ReplaceableLoginOverlay to invoke LoginOverlayUtils.getOverlayWrapperScript (or
the new helper) for both the clear and append paths and remove the duplicated
brand query blocks.
In
`@src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/AbstractViewTest.java`:
- Around line 53-77: Add a small helper on AbstractViewTest that centralizes the
Vaadin major-version check: implement a protected boolean isVaadin25() that
returns $server.getMajorVersion() >= 25 (using the existing
ServerVersionCallables $server instance), and update IT subclasses to call
isVaadin25() instead of repeating the literal check so the version boundary is
kept in one place.
In
`@src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/ExtendedLoginOverlayIT.java`:
- Around line 52-57: Add a negative assertion in ExtendedLoginOverlayIT to
ensure the original "forgot-password" control is removed: after computing
anchorQuery/anchorExists, query for any AnchorElement that represents the
built-in forgot-password control (e.g., an AnchorElement whose text contains
"Forgot" or "Forgot password") and assertFalse that this query exists; keep the
vaadin25 branching logic consistent when building the query so the absence check
covers both supported versions.
In
`@src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/LoginLayoutIT.java`:
- Around line 64-69: Add a negative assertion to ensure the original login form
is removed: after locating the custom slot (divSlotForm / divSlotFormExists)
assert that the original form controls do not exist by querying for the original
FormLayoutElement and its typical child controls and asserting false; for
example use vlfw.$(FormLayoutElement.class).exists() (or
vlfw.$(TextFieldElement.class) / vlfw.$(ButtonElement.class) as appropriate) and
call assertFalse with a clear message so the test fails if the stock login form
is still present.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 51dafd49-0c4d-4fda-bcd0-cf7afc521138
📒 Files selected for processing (11)
pom.xmlsrc/main/java/com/flowingcode/vaadin/addons/extendedlogin/LoginLayout.javasrc/main/java/com/flowingcode/vaadin/addons/extendedlogin/LoginOverlayUtils.javasrc/main/java/com/flowingcode/vaadin/addons/extendedlogin/ReplaceableLoginOverlay.javasrc/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestExtendedLoginOverlayView.javasrc/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestLoginLayout.javasrc/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestLoginLayoutView.javasrc/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/AbstractViewTest.javasrc/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/ExtendedLoginOverlayIT.javasrc/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/LoginLayoutIT.javasrc/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/ServerVersionCallables.java
🚧 Files skipped from review as they are similar to previous changes (3)
- pom.xml
- src/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestLoginLayoutView.java
- src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/ServerVersionCallables.java
Add testbench-rpc dependency to be able to retrieve Vaadin version.
|
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
src/main/java/com/flowingcode/vaadin/addons/extendedlogin/ReplaceableLoginOverlay.java (1)
55-78: Consider consolidating duplicate brand selection logic.The brand element selection logic (
overlayWrapper.shadowRoot ? ... : ...) is duplicated across bothexecuteJscalls. While functionally correct, this could be consolidated into a single script for clarity and to avoid potential timing issues between the two async calls.♻️ Optional: Single script approach
default void replaceHeaderComponent(HasElement withElement) { getElement().appendChild(withElement.getElement()); 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( - LoginOverlayUtils.getOverlayWrapperScript( - """ - var brand = overlayWrapper.shadowRoot ? overlayWrapper.shadowRoot.querySelector('[part="brand"]') : overlayWrapper.querySelector('[part="brand"]'); - if (brand) { brand.appendChild($0); } """), withElement); }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/main/java/com/flowingcode/vaadin/addons/extendedlogin/ReplaceableLoginOverlay.java` around lines 55 - 78, Consolidate the duplicated brand selection in replaceHeaderComponent by using a single executeJs call that obtains the brand element once (using the existing overlayWrapper.shadowRoot ? overlayWrapper.shadowRoot.querySelector('[part="brand"]') : overlayWrapper.querySelector('[part="brand"]')) and then performs both replaceChildren() and appendChild($0) in that same script; update the call that currently uses LoginOverlayUtils.getOverlayWrapperScript to execute a combined script and pass withElement as the argument to appendChild, keeping references to getElement(), replaceHeaderComponent, and LoginOverlayUtils.getOverlayWrapperScript to locate where to change the code.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In
`@src/main/java/com/flowingcode/vaadin/addons/extendedlogin/ReplaceableLoginOverlay.java`:
- Around line 103-114: The removeForgotPassword() call currently runs after
appending the new element and thus removes the element just added; modify
ReplaceableLoginOverlay.replaceForgotPassword(HasElement withElement) to first
call removeForgotPassword(), then set the slot attribute on withElement, then
append withElement via getElement().appendChild(...), and finally invoke
getElement().executeJs(LoginOverlayUtils.getLoginFormWrapperScript(...),
withElement) as before so the wrapper script operates on the newly appended
element.
---
Nitpick comments:
In
`@src/main/java/com/flowingcode/vaadin/addons/extendedlogin/ReplaceableLoginOverlay.java`:
- Around line 55-78: Consolidate the duplicated brand selection in
replaceHeaderComponent by using a single executeJs call that obtains the brand
element once (using the existing overlayWrapper.shadowRoot ?
overlayWrapper.shadowRoot.querySelector('[part="brand"]') :
overlayWrapper.querySelector('[part="brand"]')) and then performs both
replaceChildren() and appendChild($0) in that same script; update the call that
currently uses LoginOverlayUtils.getOverlayWrapperScript to execute a combined
script and pass withElement as the argument to appendChild, keeping references
to getElement(), replaceHeaderComponent, and
LoginOverlayUtils.getOverlayWrapperScript to locate where to change the code.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 592c3bfb-40f1-4072-be16-86a2d5ea3873
📒 Files selected for processing (10)
pom.xmlsrc/main/java/com/flowingcode/vaadin/addons/extendedlogin/LoginLayout.javasrc/main/java/com/flowingcode/vaadin/addons/extendedlogin/LoginOverlayUtils.javasrc/main/java/com/flowingcode/vaadin/addons/extendedlogin/ReplaceableLoginOverlay.javasrc/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestExtendedLoginOverlayView.javasrc/test/java/com/flowingcode/vaadin/addons/extendedlogin/TestLoginLayout.javasrc/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/AbstractViewTest.javasrc/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/ExtendedLoginOverlayIT.javasrc/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/LoginLayoutIT.javasrc/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/ServerVersionCallables.java
🚧 Files skipped from review as they are similar to previous changes (4)
- src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/ServerVersionCallables.java
- src/main/java/com/flowingcode/vaadin/addons/extendedlogin/LoginOverlayUtils.java
- src/test/java/com/flowingcode/vaadin/addons/extendedlogin/it/ExtendedLoginOverlayIT.java
- pom.xml



This PR adds Vaadin 25 compatibility while maintaining support for Vaadin 24, along with several refactorings and demo improvements.
Changes:
Vaadin 24 & 25 compatibility
Code improvements
Demo improvements
Summary by CodeRabbit
New Features
Improvements
Tests