feat(events): the app's events screens, and the module rows that were never gated (Phase 14b)
All checks were successful
PR Checks / android-build (pull_request) Successful in 12m7s
All checks were successful
PR Checks / android-build (pull_request) Successful in 12m7s
Events Phase 14b, the app half — recorded as M13 in docs/android/PLAN.md. Four screens on the four routes Phase 14a shipped: the public calendar, an event page carrying `?run=`, an arc, and participation history. One drawer row for the history, at SIGNED_IN rather than PLAYER: the route is `requireAuth` alone and self-scoped, and the website needed two mounts for it only because `RequirePlayer` guards `/account` there. The prerequisite fix is the larger half. The app read `/public/modules` nowhere and mapped every `/public/shard/features` failure to "unknown", which `canSee` treats as visible — so on a site with no `uo` module every shard row rendered and every one of them 404'd. Absence of an answer is not an answer of absence: a successful module list that omits `shard` hides the rows, a failed read keeps the last answer the host gave, and a host that has never answered leaves the gate open. Capability and feature compose as two gates and answer different questions: whether the module is installed (per host) and whether this shard publishes the surface to this viewer (per viewer). Also corrects the website path → route table, wrong since the module-system cutover on 2026-08-12: core's NAV is eight rows, not sixteen, and the nine shard rows moved to `/uo/*`. A nav override on any shard row was ignored, an added link to one handed off to a browser, and the sort-key line was wrong. Two existing tests had been passing vacuously since that day. An inbox link to an event now opens the app rather than a Custom Tab, through `resolveWebPath` rather than a second mechanism — so its "a query hands off" rule gains exactly one exception, `run` on an event page. The emulator walk found three defects that 563 green tests did not: - the three player game-data rows read `/player/shard/*` and were not gated, so they rendered and 404'd; the test meant to catch that asked whether every row *with a feature* declared the capability, and those three have none. It now asks by route. - `score` is DECIMAL(18,4) and was declared an integer, so one `318.5` made kotlinx refuse the entire body and a 200 rendered as a server error — latent on the public results table for every visitor. - a drawer route's view model outlives a sign-out, so signing in as a second account showed it the first account's participation history with no request made at all. 570 tests, 0 failures. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
This commit is contained in:
@@ -41,6 +41,7 @@
|
||||
<string name="nav_opens_in_browser">Opens in your browser</string>
|
||||
<string name="menu_home">Home</string>
|
||||
<string name="menu_news">News</string>
|
||||
<string name="menu_events">Events</string>
|
||||
<string name="menu_wiki">Wiki</string>
|
||||
<string name="menu_shard">Shard</string>
|
||||
<string name="menu_rules">Rules</string>
|
||||
@@ -50,6 +51,7 @@
|
||||
<string name="menu_about">About</string>
|
||||
<string name="menu_contact">Contact</string>
|
||||
<string name="menu_account">My account</string>
|
||||
<string name="menu_my_events">My events</string>
|
||||
<string name="menu_my_characters">My characters</string>
|
||||
<string name="menu_my_vendors">My vendors</string>
|
||||
<string name="menu_my_houses">My houses</string>
|
||||
@@ -525,4 +527,43 @@
|
||||
<string name="push_stream_house_idoc">Your house entered IDOC</string>
|
||||
<string name="push_stream_account_login">Login to your account</string>
|
||||
<string name="push_stream_generic">New notification</string>
|
||||
|
||||
<!-- ── Events (§9 M13, EVENTS.md §I) ─────────────────────────── -->
|
||||
<!--
|
||||
The four status words. `cancelled` has TWO, chosen by the clock rather than
|
||||
the status: "did not happen" is right for a past occurrence and false for a
|
||||
future one, and a run four days out that an operator called off is the common
|
||||
case. See EventTimes.statusWordRes.
|
||||
-->
|
||||
<string name="events_status_live">Happening now</string>
|
||||
<string name="events_status_scheduled">Scheduled</string>
|
||||
<string name="events_status_completed">Finished</string>
|
||||
<string name="events_status_cancelled">Cancelled</string>
|
||||
<string name="events_status_did_not_happen">Did not happen</string>
|
||||
|
||||
<string name="events_empty">Nothing on the calendar just yet — check back soon.</string>
|
||||
<!-- A forecast past the materialisation horizon: nothing is committed to it. -->
|
||||
<string name="events_projected">Expected — not yet confirmed</string>
|
||||
<string name="events_truncated">Showing the first part of a busy calendar.</string>
|
||||
|
||||
<string name="events_part_of">Part of %1$s</string>
|
||||
<string name="events_next">Next</string>
|
||||
<string name="events_under_way">Under way</string>
|
||||
<string name="events_nothing_scheduled">Nothing scheduled at the moment.</string>
|
||||
<string name="events_never_scheduled">This event has not been scheduled yet.</string>
|
||||
<string name="events_coming_up">Coming up</string>
|
||||
<string name="events_previously">Previously</string>
|
||||
<string name="events_results">Results</string>
|
||||
<string name="events_results_nobody">Results were published with nobody recorded.</string>
|
||||
<!-- A module puts a display name in its participation meta or it does not; the
|
||||
member key is never published, so there is nothing else to render. -->
|
||||
<string name="events_participant_unnamed">Unnamed</string>
|
||||
|
||||
<string name="events_history_empty">You have not taken part in an event yet.</string>
|
||||
<string name="events_rank">Rank %1$d</string>
|
||||
<!-- Not a dash: an unranked row is a real state, not a missing value. -->
|
||||
<string name="events_results_unpublished">Results not published</string>
|
||||
<string name="events_score">Score %1$s</string>
|
||||
<string name="events_show_more">Show more</string>
|
||||
<string name="events_loading">Loading…</string>
|
||||
</resources>
|
||||
|
||||
Reference in New Issue
Block a user