Calendar
Calendar
Schedule shoots, track events, and sync with external calendars
Overview
The Calendar feature provides a visual timeline for planning and tracking production schedules. View all shoots across projects, manage events, and export to Google Calendar, Outlook, or any iCalendar-compatible app via .ics files or one-way import URLs.
Requirements
Functional Requirements
| ID | Requirement | Acceptance Criteria | Priority | Source |
|---|---|---|---|---|
| REQ-CAL-001 | The system shall provide a global calendar view showing events from all projects | Open Calendar → month grid or Gantt shown; events from all projects color-coded; empty state → "No events" message | Must | calendar |
| REQ-CAL-002 | The system shall provide a per-project calendar tab with shoot, travel, prep, and wrap days | Open project → Calendar tab → shows events; create shoot day → appears on date; create travel/prep/wrap days supported | Must | useGlobalCalendar |
| REQ-CAL-003 | The system shall support month view and Gantt (horizontal timeline) view | Toggle view → month grid shows events; switch to Gantt → horizontal bars per project; events clickable in both views | Must | useGlobalCalendar |
| REQ-CAL-004 | The system shall allow creating events with title, start/end dates, location, and notes | Click date → event form; fill title+dates+location+notes; save → event appears; validation on empty title or end < start | Must | useGlobalCalendar |
| REQ-CAL-005 | The system shall detect and visually warn about double-booked dates across projects | Two projects on same date → conflict icon shown; hover → tooltip lists conflicting projects; calendar day highlighted | Must | useGlobalCalendar |
| REQ-CAL-005a | The system shall expire a conflict once its overlap window has passed | Two projects overlapped last month → conflict absent from the panel and from the event chips; overlap ending today → still shown | Must | useGlobalCalendar |
| REQ-CAL-006 | The system shall support exporting events as .ics files and generating one-way import URLs for Google and Outlook | Click Export → .ics downloads or an import URL opens; file/URL valid in Apple Calendar, Outlook, Google | Should | calendarExportService |
| REQ-CAL-007 | The system shall support importing .ics files, skipping entries that already exist | Select .ics file → parsed; import confirmed → new entries added; re-import of the same file adds nothing. Dedup is silent — the review list does NOT mark which entries are duplicates | Should | CalendarImportModal + mergePeriods |
| REQ-CAL-008 | The system shall support configurable shoot reminders — any whole number of days from 1 to 365, defaulting to 1 and 7 — via push/browser notifications | Set reminder → saved; time reaches threshold → notification fires; dismiss → removed; click → navigates to event | Should | useGlobalCalendar |
| REQ-CAL-009 | The system shall display event cards with project name, color coding, dates, location, and crew | Click date → event card shown; project name + color visible; location displayed if set; crew names listed | Must | useGlobalCalendar |
| REQ-CAL-010 | The system shall provide a global calendar view aggregating events from all active projects | Navigate to calendar → all project events shown; color-coded by project; click event → navigates to project | Must | useGlobalCalendar |
Non-Functional Requirements
| ID | Requirement | Metric | Priority |
|---|---|---|---|
| NFR-CAL-001 | Calendar view shall render within 300ms for ≤200 events | Render time | Should |
| NFR-CAL-002 | Date picker and event forms shall be accessible via keyboard | WCAG 2.1 AA | Must |
Data Requirements
- Required fields: Event title, start date
- Optional fields: End date, location, notes, event type (shoot/travel/prep/wrap)
- Persistence: Stored on the project object in IndexedDB → cloud sync
- Color coding: Derived from project color assignment
Constraints & Limits
- Available to all tiers (Free and Pro)
.icsimport/export works offline- Google/Outlook import URLs open the respective web client in a new tab — they do not require an account on the Cine Power Planner side
Offline Behavior
- Calendar views fully available offline
.icsfile export works offline- One-way Google/Outlook import URLs require network connectivity to open the target calendar web app
- Push reminders require service worker and prior push subscription
Dependencies
- Requires: Projects — calendar events linked to projects
- Required by: Production Dashboard — upcoming events widget
Accessing the Calendar
Click Calendar in the sidebar. Two views are available:
| View | Description |
|---|---|
| Global Calendar | All events across all projects on one timeline |
| Project Calendar | Events specific to a single project (in workspace) |
The header on a phone (v0.648.5)
Below 768 px the calendar header carries a single More button. Import Calendar, Export All and the guided tour all live inside it, each with its written label — before this, Import and Export were two unlabelled arrows with no accessible name at all. From 768 px up the buttons sit in the header exactly as they did.
Global Calendar
Calendar Views
- Month view: Traditional calendar grid
- Week view: Seven-day columns with full event cards
- List view: Events grouped by month — opens at the current month (not the oldest event), with a month sidebar for jumping around (a month dropdown + Today button on phones) and a "Today" pill on the current month's heading
- Gantt view: Horizontal timeline showing project durations as bars
Sub-Rentals on the Calendar
A sub-rental with many gear items used to fill the calendar with one chip per item. Sub-rentals are now shown as one chip per rental with an item-count badge (e.g. "5").
- Click the chip to see everything inside: the full item list with quantities, plus pickup and return times. From there, Open sub-rentals jumps to the sub-rental page.
- Conflicts are highlighted directly on the rental chip (red ring + warning icon) when any of its gear is double-booked.
- Prefer the old per-item view? Open Filters and untick Group sub-rental items.
- A return with no return location of its own shows the pickup address. Leaving the sub-rental's return location blank means "same as pickup" — that is what the field's own placeholder promises — so the Return event carries the pickup address rather than no address at all. The details modal labels it Same as the pickup location, so an inherited address is never mistaken for one somebody typed into the return field. Fill the return location in whenever the gear actually goes back somewhere else.
Event Cards
Each event shows:
- Project name and color coding
- Event dates (start and end)
- Shoot location (if set)
- Assigned crew members
When the cell is too narrow to fit the full title:
- Hover an event — a small floating preview appears with the title, type and date range so you can read what's been truncated without navigating.
- Click an event — a larger details modal opens with the full title, dates, duration, project name, location, notes, and multi-day indicator. Use the button inside the modal (Open project, Open sub-rentals, or Open owned gear, depending on the event) to jump to the right page, or close (X, backdrop click, or Esc) to dismiss and stay on the calendar.
The Gantt timeline view keeps its existing behavior: clicking a bar jumps straight to the project.
Project Calendar
Access from within a project workspace via the Calendar tab.
Adding Events
- Click on a date or click Add Event
- Fill in event details:
| Field | Description |
|---|---|
| Title | Event name (e.g., "Day 1 — Studio") |
| Start Date | Event start date and time |
| End Date | Event end date and time |
| Location | Shoot location |
| Notes | Additional details |
- Click Save
Travel Days
Mark non-shoot days as travel or prep:
- Open the Schedule section in the project
- Click Add Travel Day
- Set the date and description
Travel days appear differently styled on the calendar to distinguish them from shoot days.
Double-Booking Detection
The calendar automatically detects when equipment or crew are double-booked across projects. A warning badge appears on conflicting dates.
Past conflicts expire. A conflict disappears from the panel — and from the event chips — once the overlap it describes has ended, because there is nothing left to reschedule. The cutoff is the end of the overlap, not the end of either booking: a rental running until September stops being flagged the day after its collision with a shoot is over. A conflict whose overlap ends today is still shown. Accepting a conflict is therefore only needed for overlaps that are still ahead; there is no end-of-job cleanup to do.
External Calendar Export & Invitations
Cine Power Planner integrates with external calendars through one-way export and invitation URLs — not bidirectional OAuth sync. You push schedule data outward; changes made in Google Calendar or Outlook do not flow back.
Exporting to .ics
The universal option. Works with any calendar app (Apple Calendar, Outlook desktop, Google Calendar, Fantastical, etc.).
- Go to the Calendar tab in a project.
- Click Export → Download .ics.
- Open the downloaded file — the recipient's calendar app imports the events.
.ics export is handled by calendarIcsService.js and shared/utils/calendar/calendarIcs.js and works fully offline. (data/calendar/icsGenerator.js is named here in older revisions but is not imported by anything; the subscribed-feed path uses its Deno port at supabase/functions/calendar-feed/icsGenerator.ts.)
If an entry's date cannot be read — an old record, or one edited by hand — that single entry is skipped and the rest of the export still downloads. The Add to Google Calendar link is likewise produced with the unreadable date left blank instead of failing outright.
Importing a .ics File
- Click Import in the Calendar view.
- Upload a
.icsfile (long folded lines from Google/Outlook exports are handled). - Choose the target project, review detected events, and confirm import.
Events are categorized into prep / shooting / return / travel phases by keywords in the event title — English and German terms are recognized ("Prep"/"Vorbereitung"/"Aufbau", "Shoot"/"Dreh", "Return"/"Rückgabe"/"Abbau", "Travel"/"Anreise"/"Abreise"); anything unrecognized lands in shooting. Files containing recurring events (RRULE) show a warning — each series is imported as a single occurrence.
Re-importing the same file is safe. Prep, shooting and return periods are deduplicated on their start|end pair by mergePeriods, and travel days on their date, so an export → re-import round-trip adds nothing the project already has. Note the dedup is silent: the review list before you confirm does not mark which entries are already present, so the count you see there can be larger than the number actually added. Entries that differ by even a minute in start or end are treated as new.
Google Calendar Import URL
Generates a URL that opens Google Calendar in a new tab with the event pre-filled:
- From an event, click Add to Google Calendar.
- A new tab opens on
calendar.google.comwith the title, dates, location, and notes pre-populated. - The user saves the event inside Google Calendar.
Implemented as generateGoogleCalendarUrl() in app/src/data/calendar/calendarExportService.js. This is a one-way "create event" link — it does not install an integration or grant Google access to your project data.
Outlook Import URL
Same pattern, but for Outlook on the web:
- From an event, click Add to Outlook.
- A new tab opens on
outlook.live.comwith the event pre-filled. - The user saves the event inside Outlook.
Implemented as generateOutlookCalendarUrl() in app/src/data/calendar/calendarExportService.js.
Not Supported
The following are not implemented:
- Bidirectional sync — changes made inside Google Calendar or Outlook are not reflected back.
- Google Calendar / Microsoft Outlook OAuth sync — no account-based OAuth integration; use Add to Google Calendar (URL export), the ICS subscription feed, or a
.icsexport instead. - CalDAV / iCloud live subscriptions beyond the provided ICS feed — one-off
.icsexports are snapshots, not live feeds; use the ICS Calendar Feed URL for a live read-only subscription.
If you need live one-way sync into an external calendar, use the ICS Calendar Feed URL — open the calendar, click ICS Feeds (/calendar/feeds), then Subscribe on the feed you created. For collaborative editing, share a project and work within Cine Power Planner.
Reminders
Configure reminders for upcoming shoots:
- Browser notifications: Get alerts before shoot days
- Push notifications: Receive alerts on mobile (requires Cloud Sync)
- Customizable timing: add any whole number of days from 1 to 365 before the event; the list starts at 1 and 7 days and reminders are off until you enable them. There is no fixed set of presets — remove either default or add as many lead times as you want.
Cloud Sync
Calendar events sync across your own devices when Cloud Sync is enabled, because they live on the project object. Changes made offline are queued and synchronized automatically. This sync is internal (device-to-device via Supabase); it is unrelated to Google/Outlook calendars.
Tips
- Use the Gantt view: Best for seeing project overlaps and scheduling conflicts
- Color-code projects: Each project has a unique color on the global calendar
- Export
.icsfiles: Share schedules with crew who use their own calendar apps - Set reminders: Don't miss prep days or equipment pickup deadlines
Related Documentation
Last Updated: 2026-09-10 Version: 0.790.2
