feat: show weekly recurring events above calendar grid #21

Merged
addison merged 14 commits from exe-dev-bot/kiosk:feat/weekly-events-banner into main 2026-02-14 15:50:26 -05:00
Contributor

Summary

Weekly recurring events (e.g., daily standups, weekly yoga) now appear in a dedicated row between the day-of-week headers and the calendar grid, instead of cluttering every week in the day cells.

Changes

Backend

  • Tag expanded RRULE events with Recurring and RecurrenceRule fields
  • New separateWeeklyEvents() function splits events into regular and weekly
  • Weekly events promoted to the banner only if they occur every week of the month (handles EXDATE cancellations and mid-month starts gracefully)
  • weeklyEvents array added to /api/events response, sorted Mon→Sun then by time
  • Weekly events excluded from the main events array

Frontend

  • New .weekly-row inside the calendar grid, between weekday headers and day cells
  • Each weekly event placed in its day's column, styled identically to day cell events
  • Row auto-hides when no weekly events exist
  • Weekly event calendars included in the legend sidebar

Tests

  • 13 table-driven test cases for separateWeeklyEvents covering:
    • Empty input, no recurring events
    • Full-month vs partial-month weekly events
    • FREQ=MONTHLY/DAILY not promoted
    • Multiple events on different days, sorting verification
    • Same title from different calendars evaluated independently
    • Months with 5 occurrences of a weekday
    • All-day weekly events, field preservation

Demo Calendar

  • Converted repeating demo events to proper RRULE weekly recurrences

Screenshots

With weekly events:
Weekly row shows Team Standup (Mon–Fri), 1:1 with Sarah (Mon), Design Review (Tue), Product Demo (Thu), Kids Soccer Practice (Sat) — all pulled out of the day cells.

Without weekly events:
Row is hidden, calendar looks unchanged from before.

## Summary Weekly recurring events (e.g., daily standups, weekly yoga) now appear in a dedicated row between the day-of-week headers and the calendar grid, instead of cluttering every week in the day cells. ## Changes ### Backend - Tag expanded RRULE events with `Recurring` and `RecurrenceRule` fields - New `separateWeeklyEvents()` function splits events into regular and weekly - Weekly events promoted to the banner **only if they occur every week** of the month (handles EXDATE cancellations and mid-month starts gracefully) - `weeklyEvents` array added to `/api/events` response, sorted Mon→Sun then by time - Weekly events excluded from the main `events` array ### Frontend - New `.weekly-row` inside the calendar grid, between weekday headers and day cells - Each weekly event placed in its day's column, styled identically to day cell events - Row auto-hides when no weekly events exist - Weekly event calendars included in the legend sidebar ### Tests - 13 table-driven test cases for `separateWeeklyEvents` covering: - Empty input, no recurring events - Full-month vs partial-month weekly events - FREQ=MONTHLY/DAILY not promoted - Multiple events on different days, sorting verification - Same title from different calendars evaluated independently - Months with 5 occurrences of a weekday - All-day weekly events, field preservation ### Demo Calendar - Converted repeating demo events to proper RRULE weekly recurrences ## Screenshots **With weekly events:** Weekly row shows Team Standup (Mon–Fri), 1:1 with Sarah (Mon), Design Review (Tue), Product Demo (Thu), Kids Soccer Practice (Sat) — all pulled out of the day cells. **Without weekly events:** Row is hidden, calendar looks unchanged from before.
exe-dev-bot force-pushed feat/weekly-events-banner from 2643595a20 to 2f6f656503 2026-02-14 14:31:35 -05:00 Compare
Co-authored-by: Shelley <shelley@exe.dev>

# Conflicts:
#	justfile
#	static/kiosk/index.html
The test used 23:00-00:00 UTC which spans midnight in UTC but not in
EST. This made it pass only in US timezones. Use midday times instead
so the test passes regardless of the local timezone.

Co-authored-by: Shelley <shelley@exe.dev>
Co-authored-by: Shelley <shelley@exe.dev>
Co-authored-by: Shelley <shelley@exe.dev>
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
kwila/kiosk!21
No description provided.