From 11567a417f8c4e7360f713c47f995674e8cd78d0 Mon Sep 17 00:00:00 2001 From: Julian Cuni Date: Mon, 29 Jun 2026 11:43:12 +0200 Subject: [PATCH] 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 --- wiki/concepts/booth-console.md | 18 ++++++++++++++++++ wiki/concepts/i18n.md | 5 +++++ wiki/concepts/shift.md | 8 ++++++++ 3 files changed, 31 insertions(+) diff --git a/wiki/concepts/booth-console.md b/wiki/concepts/booth-console.md index 18f70d8..686e304 100644 --- a/wiki/concepts/booth-console.md +++ b/wiki/concepts/booth-console.md @@ -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 diff --git a/wiki/concepts/i18n.md b/wiki/concepts/i18n.md index 49ae340..97d975e 100644 --- a/wiki/concepts/i18n.md +++ b/wiki/concepts/i18n.md @@ -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* diff --git a/wiki/concepts/shift.md b/wiki/concepts/shift.md index 3ee18d8..83a5093 100644 --- a/wiki/concepts/shift.md +++ b/wiki/concepts/shift.md @@ -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).