feat(sprint-6): Phase 6 — Notifications (WebSocket) + PWA
Deploy to Production / test (push) Has been cancelled
Deploy to Production / deploy (push) Has been cancelled

- WebSocket: Spring STOMP + SockJS, NotificationService, persistent notifications table
- NotificationController: GET/PUT endpoints for notification management
- Frontend: notification bell with unread badge, dropdown panel, real-time via STOMP
- PWA: manifest.json, service worker (manual sw.js), offline page, install prompt
- PWA icons (192+512), dark theme colors, standalone display
- Full i18n (de/en) for notifications and PWA
- Flyway V10 migration for notifications table
- spring-boot-starter-websocket dependency added
This commit is contained in:
Patrick Plate
2026-06-12 23:02:44 +02:00
parent 076fd6f9b3
commit 599514c0db
39 changed files with 6684 additions and 3217 deletions
@@ -26,7 +26,9 @@ test.describe("Staff Management", () => {
// If redirected to login, that's expected without a running backend
if (page.url().includes("/login")) {
console.log(" ️ Redirected to login (no session) — expected without backend")
console.log(
" ️ Redirected to login (no session) — expected without backend"
)
return
}
@@ -53,7 +55,9 @@ test.describe("Staff Management", () => {
// Sheet/dialog should open with form fields
const hasEmailField =
(await page.locator('input[type="email"], input[name="email"]').count()) > 0
(await page
.locator('input[type="email"], input[name="email"]')
.count()) > 0
expect(hasEmailField).toBe(true)
}
})
@@ -69,7 +73,8 @@ test.describe("Staff Management", () => {
// Check for table or list structure
const hasTable = (await page.locator("table").count()) > 0
const hasList = (await page.locator('[role="list"], [data-testid*="staff"]').count()) > 0
const hasList =
(await page.locator('[role="list"], [data-testid*="staff"]').count()) > 0
expect(hasTable || hasList).toBe(true)
})