Calendrier
The hub that gathers everything anchored in time: tasks, bookings, scheduled posts, calls, invoices, webinars. A day, week and month view, plus a "my day" agenda in the top bar.
Overview
The calendar stores nothing of its own. It aggregates. Each domain (workbench, booking, studio, voice, invoices, webinars) provides a source that projects its rows onto one shared type, the CalendarItem. The result: you see your real week in one place instead of juggling six screens.
Two surfaces consume it. The "my day" drawer in the top bar shows what is overdue then what falls today, at a glance. The full-screen /calendar page gives you a real day, week or month grid, with events placed on their days and tabs to filter by family.
Each source keeps its own workspace scoping and RLS: the calendar orchestrates, it bypasses nothing. And a source that fails never blanks the whole calendar, it gets isolated and reported on its own.
What the module does
One unified type for six domains
Every dated item is projected onto the same contract, the CalendarItem: a title, a time anchor, a status (overdue, today, upcoming, to review) and a deep link back to its source record. What the calendar covers today:
- Tasks, milestones and project deadlines from the workbench
- Bookings (start and end slot)
- Scheduled Studio posts, plus posts to review while the draft is not approved
- People to call and next cadence follow-ups
- Overdue unpaid invoices
- Scheduled webinar sessions
Fault-tolerant aggregation
Sources are queried in parallel. If one fails, the calendar still returns the rest, marks the result as partial and logs the failing source with its latency. A single broken domain never leaves you staring at a blank calendar.
Three views plus the day agenda
The /calendar page offers day, week and month. Month and week place events on their day; the day view lists them. The top-bar drawer is a "my day" read: overdue items float to the top, then today's. The dashboard shows the same agenda in a widget.
Tabs by family
On the full-screen page you filter by tab without leaving the view: all, tasks, calls, bookings, content, invoices. The type-to-tab mapping is a single source of truth, not a loose string.
Reschedule and create in place
You drag an item and it is rescheduled on the right table, on the right anchor column. Rescheduling requires the write permission of the domain involved, on top of RLS: a read-only member cannot move anything. The "Create" menu opens the dated creation flows (task, content, calls, webinar, invoice), and clicking a slot creates a quick task at that time.
- Bookings are not rescheduled by raw write: they go through the booking flow, because of notifications and sync
- The quick task reuses workbench creation, so it inherits its reminders and scoping
How to use it
- 01
Open your day
From the top bar, the "my day" drawer shows what is overdue then what falls today.
- 02
Go full screen
You open /calendar and switch between day, week and month depending on what you need to see.
- 03
Filter by family
You click a tab (tasks, calls, bookings, content, invoices) to keep only what matters.
- 04
Reschedule
You drag an item to another slot. It is rewritten on its source if you hold the domain write permission.
- 05
Create an item
The "Create" menu opens the right flow, or clicking an empty slot drops a quick task at that time.