docs(wiki): catch concept pages up to the booth-UX/shift/font-scale work

Bring three queryable pages current with the booth-UX commit (cce99aa) whose
breadth hadn't propagated:
- booth-console: Active Sessions as a real table, dropped status column/filter,
  inline live-feed rows, removed TARGE via-badge + redundant Direction filter,
  plate now searchable + backfilled via plate-recognized WS push, per-user font scale.
- shift: Z-report display simplified (shitje dropped, opening cash added) while
  the signed payload is untouched.
- i18n: users.font_scale recorded alongside language/theme as the matching
  per-user server-stored pref (migration 0014).

Claude-Session: https://claude.ai/code/session_01Xcm6ikLgGoCxxHrxtjkk5V
This commit is contained in:
2026-06-29 11:43:12 +02:00
parent f6e35bbebf
commit 11567a417f
3 changed files with 31 additions and 0 deletions
+18
View File
@@ -111,6 +111,24 @@ what happened." Now every event is **self-describing and clickable**:
[[entry-exit-points]] for the coverage list and the synthetic `REFUSED-…` key used when a refused
entry has no ticket id.
### Layout & readability pass (2026-06-28)
- **Active Sessions is a real table** (columns: Ticket/subscriber · Plate · Entry · Elapsed), so
values align and long ones (subscriber names, ticket ids) no longer truncate. A subscriber shows
**★ + holder name**; an overstay keeps a red row tint; the audited "Open barrier" action sits in a
trailing cell. The **status column was dropped** (an unpaid transient is normal; a subscriber is
self-evident), and with it the **status filter** — only the Transient/Subscriber filter remains.
- **Live feed rows flow inline** — identity, plate, badges and reason sit on one line and wrap only
when the row runs out of width (no forced second line). The redundant `TARGË` *via*-badge was
dropped (the plate chip already conveys it), and the **Direction filter** (Hyrje/Dalje) was removed
— it duplicated the entry/exit options already in the Type filter.
- **Plate is searchable** in both the feed and active-sessions boxes (they now match the enriched
`plate` field, not the unsigned payload). A plate recognized AFTER its event shipped backfills the
feed row in place (a `plate-recognized` WS push), so it no longer needs a page refresh.
- **Per-user font scale.** An A−/A+ control in the header scales the whole UI; persisted on
`users.font_scale` and restored on login like the theme/language prefs (see [[i18n]]). Implemented
as a root `font-size` over rem-based type (NOT CSS `zoom`, which scaled viewport-locked modals out
of view) — so only text scales; `vh`/`h-screen` layout stays put.
## The shift control (header) + the booth gate
The header carries a single **shift button** that expresses the [[shift|site-wide single-open
+5
View File
@@ -22,6 +22,11 @@ any booth. (Decided + built 2026-06-18.)
(self-service, any signed-in role). It is **deliberately NOT in the JWT** (identity/role only) — so
changing language is a DB write + immediate `/me`, with no token refresh / re-login. See
[[local-jwt-auth]].
- **Sibling per-user UI prefs (same pattern).** `users.theme` (`'dark'|'light'`) and **`users.font_scale`**
(percent, default 100; migration 0014, added 2026-06-28) follow language exactly — DB column,
surfaced on `/login` + `/me`, self-service `PUT /api/auth/theme` / `/api/auth/font-scale`, applied
after `/me` (`applyTheme` / `applyFontScale`), header toggles that persist. Font scale sets the
root `font-size` over the app's rem-based type (NOT CSS `zoom`); none of the three is a JWT claim.
- **Library: react-i18next** (i18next). Chosen over a hand-rolled `t()` for pluralization,
interpolation, and headroom beyond two languages. The active language is applied after `/me`
resolves (App effect on `user.language`); the header **SQ/EN toggle** switches instantly *and*
+8
View File
@@ -89,6 +89,14 @@ no variance gate, no manager override.
> (`ticketTotalMinor`/`subscriptionTotalMinor`/`subscriptionSalesMinor`/`subscriptionWindowMinor`),
> shown in the X-report, the close modal, the history detail, and the printed Z-report; old reports
> that predate the fields default subscription to 0 (ticket absorbs the whole take).
>
> **Display simplified (2026-06-28).** All four figures stay in the SIGNED payload (audit data —
> untouched), but the operator-facing breakdown was trimmed: the `shitje` (subscription-sales)
> sub-line was **removed** from the close modal, the X/Z-report views, and the printed slip —
> `Abonime` is the subscription total, with only the out-of-window part broken out under it (it
> was confusing to show both halves under a total). The **opening cash** (`openingFloatMinor`,
> labelled "Arka fillestare") was **added** to the drawer block so `opening + cash-taken = expected
> drawer` reads explicitly.
> 2. The **header shift button no longer closes directly** — a stray click would sign an irreversible
> Z-report. It opens a **confirm modal showing the live X-report** (the source split + expected
> drawer) with Cancel / End-shift. Opening a shift stays immediate (no such risk).