Commit Graph

5 Commits

Author SHA1 Message Date
anonsaber 0cee50b4c9 feat: read business config back and accept partial patches
GET /api/business-config returns the stored values with presence-only secrets, and PUT now merges a patch against the stored config instead of replacing it, so the SPA can show what is already set and send back only the fields that changed.

The SPA marks secrets as set-but-unreadable, edits chat_allowlist as an unordered set, and omits fields it did not touch; blank required fields keep the stored value, blank optional fields clear it. The read-back is Serialize-only, so a client cannot inject secrets_present.

Forward both paths at the gateway: /api/business-config accepted PUT only, so the read-back returned 405, and the preflight path was missing from the safelist entirely, so it returned 404. The SPA is served from the Worker domain, so the whole edit experience was unreachable behind the production gateway. Route methods are now asserted per path, which the safelist test never checked.

Also: /debug/config reports timezone again, the timezone select is styled like the other fields, and the docs follow the new contract.
2026-09-30 00:53:58 +08:00
anonsaber 61de5f985f feat(spa): add a time zone selector to the business configuration page
Section 04 "Notification display" holds a single select populated from a
frozen catalogue of the 16 zones the server accepts, with Asia/Shanghai
selected by default. Labels are per-zone (`label.en` / `label.zh`) so they
follow the existing browser-language switch.

readBusinessConfig now submits the selection under the `timezone` key.
2026-09-29 21:48:04 +08:00
anonsaber 6868d47cd0 feat(web): add SPA i18n with browser-language detection (zh/en, default en)
- detect locale from navigator.language (zh* -> zh, otherwise en) at startup;
  <html lang> switches accordingly; English is the default
- index.html carries English default text plus data-i18n /
  data-i18n-placeholder / data-i18n-aria attributes
- config.js holds inline en/zh dictionaries, t(key, vars) and detectLocale();
  dynamic Chinese strings become t() calls with {var} interpolation
- no new asset files (src/web.rs serves only config.js and styles.css);
  stays a build-less vanilla-JS single page
- config.test.mjs updated to the English defaults; adds dictionary key-parity
  and markup key-coverage tests
2026-09-27 12:53:36 +08:00
anonsaber 8c32892206 fix: preserve desktop setup card width 2026-09-25 10:24:43 +08:00
anonsaber 9064fc5f1d fix: hide admin authorization in setup mode 2026-09-25 10:05:47 +08:00