Migrate to Vaadin 25 with a live 2026 data source#4
Open
paodb wants to merge 4 commits into
Open
Conversation
Upgrade the 2018-era demo (Vaadin 10, Spring Boot 2, Java 8, WAR, Polymer) to a modern stack, pointed at a free live data source for the 2026 tournament. Platform: Vaadin 25.1.7, Spring Boot 4.0.6, Java 21, executable jar; javax.* -> jakarta.*; drop WAR/Heroku; add vaadin-dev; ehcache 3 -> Caffeine (120s TTL). Frontend: remove Polymer/Bower/@HtmlImport/MarkedElement/shared-styles; plain-CSS theming via @Stylesheet(Lumo) (@theme deprecated in 25); app shell on FixtureApp (AppShellConfigurator); AppLayout add-on 6.2.0-SNAPSHOT; PaperCard -> Vaadin Card; Label -> NativeLabel. Data: new worldcup26.ir client (RestClient) + TeamCatalog/StadiumCatalog replacing the dead worldcup.sfg.io layer; services map into the existing view DTOs (presenters unchanged); data-driven stage labels; match detail trimmed to available data (venue, kickoff, scorers). Docs: rename UI to "Global Football 2026 Stats" with trademark-safe naming and a non-affiliation disclaimer; rewrite README; add MIGRATION_PLAN.md. BREAKING CHANGE: requires Java 21 and Spring Boot 4; WAR packaging and the worldcup.sfg.io data source are removed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace the manual broadcaster (MatchUpdater + AccessUI) with Vaadin 25 shared signals. A single SharedMapSignal<LiveScore> keyed by match id is updated by the scheduled poll; MatchResultComponent binds its score, minutes, status text and "playing" styling to the per-match signal, so a refresh propagates to every UI automatically — no static listener set, no register/unregister on attach/detach, no manual UI.access(). - Add LiveScore record and LiveScoreSignals holder. - Bind labels/CSS classes reactively in MatchResultComponent; drop the imperative class toggling and refresh() listener plumbing. - Inject LiveScoreSignals into the screens; remove the detach-listener cleanup from MainLayout (effects are torn down on detach by the framework). - Delete MatchUpdater and AccessUI. - Add unit tests for LiveScore.from and the MatchServiceImpl status/stage mapping. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Kick-off times were always rendered in a hardcoded America/New_York zone with a fixed 12h pattern, ignoring the visitor's zone and locale. Now each match is anchored to its real venue zone and displayed in the viewer's own zone and locale. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Upgrade the 2018-era demo (Vaadin 10, Spring Boot 2, Java 8, WAR, Polymer) to a modern stack, pointed at a free live data source for the 2026 tournament.
Platform: Vaadin 25.1.7, Spring Boot 4.0.6, Java 21, executable jar; javax.* -> jakarta.*; drop WAR/Heroku; add vaadin-dev; ehcache 3 -> Caffeine (120s TTL).
Frontend: remove
Polymer/Bower/@HtmlImport/MarkedElement/shared-styles; plain-CSS theming via@StyleSheet(Lumo)(@Themedeprecated in 25); app shell onFixtureApp(AppShellConfigurator); AppLayout add-on 6.2.0-SNAPSHOT; PaperCard -> Vaadin Card; Label -> NativeLabel.Data: new worldcup26.ir client (RestClient) + TeamCatalog/StadiumCatalog replacing the dead worldcup.sfg.io layer; services map into the existing view DTOs (presenters unchanged); data-driven stage labels; match detail trimmed to available data (venue, kickoff, scorers).
Real-time & UX: drive live scores with Vaadin 25 shared signals (
SharedMapSignalkeyed by match id) instead of the manual broadcaster (static cross-session listener set + register/unregister + UI.access), removingMatchUpdater/AccessUI; show kick-off times in the viewer's own time zone and locale, anchoring each match to its real venue zone (stadium-id -> IANA zone map, since the API ships venue-local wall-clock with no offset) rather than a hardcoded America/New_York, with localized formatters and a non-blocking first render (ViewerClock@UIScopeviaExtendedClientDetails); strip worldcup26.ir's set-like wrapping ({"J. Quiñones 9'", ...}) from goal scorer names.Tests: mapping/status/stage-label coverage for MatchServiceImpl, venue-zone kick-off instant, StadiumCatalog zone map, LiveScore mapping, and scorer-name unwrapping.
Docs: rename UI to "Global Football 2026 Stats" with trademark-safe naming and a non-affiliation disclaimer; rewrite README; add MIGRATION_PLAN.md.
BREAKING CHANGE: requires Java 21 and Spring Boot 4; WAR packaging and the worldcup.sfg.io data source are removed.