- Shipped
- August 22, 2026 at 1:13 AM UTC
- Author
- Kamo
- Commit
- 31eb68b
CalendarWidgetService answers what a widget actually needs and the calendar page hasEarlier/hasLater so an arrow greys out instead of offering an empty page. The two scopes are disjoint on purpose — the organisation's shared calendar for one widget, the member's own for the other — so a company meeting appears once rather than on both panes side by side. Neither the calendar ids nor the member id come from the request: the caller passes the session's org and member and the service resolves the rest, so a request naming anything else has nowhere to say so. CalendarChangePublisher pushes every write to /topic/calendar/org/<orgId> or **************** always AFTER the commit. Publishing inline would send the nudge while the write is uncommitted, and a widget that answers a nudge by re-reading would race the transaction and usually win — redrawing with the state it already had and never hearing about the change again. Both destinations are guarded in WebSocketConfig, whose per-org guard is now a prefix list like the per-member one.