Document title follows the configured instance name (#323) #327

Merged
fable-5 merged 1 commits from 323-document-title-instance-name into main 2026-08-04 12:44:06 +02:00
Collaborator

Closes #323. Stacked on #326 (contains its commit; fast-forwardable once #326 merges).

useDocumentTitle pinned APP_NAME='Dorfteich' -- tab, bookmarks and the window title a screen reader announces (WCAG 2.4.2) always named the product, never the operator's instance. The trailing name now comes from the public branding query, same reasoning as the TopBar brand (#306). Until the query resolves (or when it cannot, e.g. maintenance mode) the shipped default keeps the title stable. Static index.html title stays the pre-JS placeholder (recorded in the issue; #179 territory).

The admin-settings e2e additionally asserts the title carries the new name right after saving, without a reload.

Local evidence: pack green against the dev stack (title assertion included); web unit suite 141 green; typecheck + lint green.

🤖 Generated with Claude Code

https://claude.ai/code/session_017aviRTgWCcAHUh1SBoxf6P

Closes #323. Stacked on #326 (contains its commit; fast-forwardable once #326 merges). useDocumentTitle pinned APP_NAME='Dorfteich' -- tab, bookmarks and the window title a screen reader announces (WCAG 2.4.2) always named the product, never the operator's instance. The trailing name now comes from the public branding query, same reasoning as the TopBar brand (#306). Until the query resolves (or when it cannot, e.g. maintenance mode) the shipped default keeps the title stable. Static index.html title stays the pre-JS placeholder (recorded in the issue; #179 territory). The admin-settings e2e additionally asserts the title carries the new name right after saving, without a reload. Local evidence: pack green against the dev stack (title assertion included); web unit suite 141 green; typecheck + lint green. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_017aviRTgWCcAHUh1SBoxf6P
fable-5 added 2 commits 2026-08-04 11:20:38 +02:00
Fix admin general settings form: dot-free field names, flat PATCH keys (#322)
Some checks failed
CI / Lint, typecheck, test (pull_request) Successful in 6m42s
CI / Build container images (pull_request) Successful in 1m20s
CI / Auth e2e pack (pull_request) Failing after 10m3s
CI / Import/export fidelity gate (pull_request) Has been skipped
9f754649d4
The general and quota cards registered their react-hook-form fields under
the dotted settings keys. RHF treats dots as nested-path separators, so
the form DISPLAYED fine (its getter falls back to the literal flat key)
but typing nested the value ({ instance: { name } }) and the api's strict
PATCH schema rejected the body — none of these fields ever saved through
the UI, on any instance. Found by Stefan on a fresh self-hosted install.

- admin-settings-form.ts: dot-free form model with one explicit mapping
  to the dotted settings keys and converters in both directions; the
  submit now also carries ONLY the settings these cards edit, so the
  internal branding metadata keys never ride along.
- Saving invalidates the branding query too — the TopBar reads the
  instance name from it and kept the old name until its staleTime ran out.
- admin-settings.spec.ts (new e2e pack, registered in ci.yml): drives the
  rename THROUGH THE FORM — success message, TopBar update without
  reload, value survives reload, api returns it. Verified locally to fail
  against the unfixed page and pass against the fix. Every existing
  admin-settings test patched the api directly, which is why this bug was
  invisible to CI.
- admin-settings-form.test.ts pins that no form field name contains a dot
  and the mapping round-trips.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017aviRTgWCcAHUh1SBoxf6P
Document title follows the configured instance name (#323)
Some checks failed
CI / Lint, typecheck, test (pull_request) Successful in 6m58s
CI / Build container images (pull_request) Successful in 1m22s
CI / Auth e2e pack (pull_request) Failing after 9m54s
CI / Import/export fidelity gate (pull_request) Has been skipped
1c757fb76e
useDocumentTitle pinned APP_NAME = 'Dorfteich', so every route title —
tab, bookmarks, the window title a screen reader announces (WCAG 2.4.2)
— named the product instead of the operator's instance. The trailing
name now comes from the public branding query, exactly like the TopBar
brand (#306); until the query resolves (or when it cannot, e.g.
maintenance mode) the shipped default keeps the title stable, so an
untouched instance reads exactly as before. The static index.html title
stays the pre-JS placeholder — server-rendering it is #179's territory,
deliberately out of scope (recorded in the issue).

The admin-settings e2e now also asserts the title carries the new name
right after saving, without a reload.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017aviRTgWCcAHUh1SBoxf6P
fable-5 force-pushed 323-document-title-instance-name from 1c757fb76e to 6999b3dd73 2026-08-04 11:43:10 +02:00 Compare
fable-5 merged commit 6999b3dd73 into main 2026-08-04 12:44:06 +02:00
Sign in to join this conversation.
No description provided.