Спасибо @anko127 за отчёт
Действительно, существует проблема с календарём Мои события , который отображал событие на каждое предстоящее повторение, даже если вы подтвердили участие только в следующем.
main ← fix-recurring-rsvp-my-events
opened 10:09PM - 11 Jun 26 UTC
Addresses the **My events** calendar issue reported in [meta t/335780](https://m… eta.discourse.org/t/repeating-event-going-gets-not-deleted-anymore/335780), and improves how the event popup loads.
## FIX: Single-occurrence RSVPs filled the "My events" calendar
When a member RSVPs "going" to only the next occurrence of a recurring event (not the whole series), the personal **My events** calendar — and the personal ICS feed — listed the event on _every_ occurrence instead of just the one they joined.
`EventFinder` matches an event for `attending_user` whenever the member is a "going" invitee, ignoring the invitee's `recurring` flag, and the events endpoint then expands the full recurrence series. The per-occurrence invitee list already filtered single RSVPs out of future occurrences, but the calendar/feed query did not.
`ExpandOccurrences` gains a `current_occurrence_only` option that returns only the event's current occurrence (when it falls inside the requested window). `EventsController#index` sets it for the attending member's non-recurring "going" RSVPs, in both the JSON and ICS responses. RSVPs to every occurrence still expand fully; the non-personal calendars (all events / category) are unaffected.
This is a targeted fix — properly modelling per-occurrence RSVPs (storing each date instead of only the recurrence formula) remains a larger follow-up.
## UX: Render event popup details immediately instead of a spinner
Clicking an event opened a popup that showed only a loading spinner until a full event fetch resolved — slow on poor connections. The component wrapped its whole body in `DAsyncContent`, blocking every field on the request even though the calendar already provides each event's core fields (`BasicEventSerializer`) and the inline post widget provides the complete event (`EventSerializer`).
It now renders the data already on the client immediately (title, date, recurrence) and fills in the rest (creator, attendees, RSVP buttons) when the background request returns. Inline event widgets in a topic render fully with no fetch at all (and no longer fire a redundant request). Still-loading sections use core's `.placeholder-animation` shimmer.
## Testing
- Request spec — single-occurrence RSVP returns one occurrence; all-occurrences RSVP returns the series.
- Service spec — `current_occurrence_only` returns the current occurrence only when it is inside the window.
- System spec — a daily recurring event RSVPed once shows a single tile on `/upcoming-events/mine`.
- Existing popup integration + system specs cover the immediate-render behaviour.
4 лайка