fix: T6 browser-check findings (compliance, treatments, labels)
Backend Image / build-and-push (push) Successful in 6m39s
Frontend Image / build-and-push (push) Successful in 14m30s

- api-client accepts 2xx answers without body (revoke showed an error)
- authority notices: sentOn in the future is rejected (Berlin day) on
  create, mark-sent and PATCH; dialog defaults to the Berlin day
- service worker never caches /api/v1/site-settings
- treatments/new no longer overflows at 390 px (min-w-0 on form
  wrappers); dose with more than 3 decimals is an error, never rounded
- medicines: expired lots flagged, disposal over the rest warns
- label designer: side panel at lg, sample values instead of
  placeholders, compliance panel reopens on lg, labelled zoom buttons
- skip link to #main-content, headings on no-access pages

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
Nick SzaunigandClaude Opus 5.5 committed 2026-10-15 18:34:52 +02:00
1 parent 6c390efe7b
commit e712c5d4d1
64 files changed
+1497 -323

No files matched your search

@@ -98,6 +98,27 @@ describe("AppLayout", () => {
pushMock.mockClear();
});
it("starts with a skip link that moves the focus to the page content", async () => {
render(
<AppLayout>
<main>
<p>Seiteninhalt</p>
</main>
</AppLayout>,
);
const link = screen.getByRole("link", { name: "Zum Inhalt springen" });
// First in the tab order: before the sidebar and every other link.
await userEvent.tab();
expect(link).toHaveFocus();
expect(link).toHaveAttribute("href", "#main-content");
await userEvent.keyboard("{Enter}");
const content = screen.getByText("Seiteninhalt").closest("#main-content");
expect(content).not.toBeNull();
expect(content).toHaveFocus();
});
it("leaves room under the page for the quick-add button on a phone, so it covers no action", () => {
pathname = "/suggestions";
permissions = ["inspections:create"];