Skip to content

Migrate to Vaadin 25 with a live 2026 data source#4

Open
paodb wants to merge 4 commits into
masterfrom
migrate/vaadin25-worldcup2026
Open

Migrate to Vaadin 25 with a live 2026 data source#4
paodb wants to merge 4 commits into
masterfrom
migrate/vaadin25-worldcup2026

Conversation

@paodb

@paodb paodb commented Jun 10, 2026

Copy link
Copy Markdown
Member

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).

Real-time & UX: drive live scores with Vaadin 25 shared signals (SharedMapSignal keyed by match id) instead of the manual broadcaster (static cross-session listener set + register/unregister + UI.access), removing MatchUpdater/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 @UIScope via ExtendedClientDetails); 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.

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>
@paodb paodb requested a review from mlopezFC June 10, 2026 20:05
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>
@paodb paodb changed the title feat!: migrate to Vaadin 25 with a live 2026 data source Migrate to Vaadin 25 with a live 2026 data source Jun 11, 2026
@paodb paodb marked this pull request as draft June 11, 2026 21:16
paodb and others added 2 commits June 12, 2026 12:06
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>
@paodb paodb marked this pull request as ready for review June 12, 2026 15:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant