Add calendar event composer to record timeline (#24667)
## Summary - add a **Create event** action to Calendar widgets and keep the Calendar header visible in solo timeline tabs - open a dedicated side-panel calendar composer instead of creating or editing inline - build the event header from the same shared composer rows and inputs as the email composer - reuse the complete email recipient picker for guests: contextual people/member suggestions, resolved avatars, paste/edit/remove behavior, keyboard selection, multi-select, and drag-and-drop reordering - keep calendar-specific dates, timezone, invitations, conferencing, provider setup, and OAuth recovery in the scrollable composer body - prefill and require the current record guest so the created event remains related to the record - create events through the existing Google, Microsoft, or CalDAV mutation and refresh the record calendar afterward ## Safety Nothing is written when the user clicks **+**. The event is only created from the final **Create event** button (or Cmd/Ctrl+Enter). When invitations are enabled, the composer visibly warns that guests will receive email. Because calendar-to-record association is participant-based, creation stays disabled if invitations are turned off or the current record guest is removed; this prevents a successfully-created provider event from disappearing from the originating record. The action is hidden without the CREATE_CALENDAR_EVENT_TOOL permission and disabled when the record has no resolvable guest email. ## Validation - direct twenty-front tsgo ✅ - focused Jest: calendar defaults/transitions/association/account eligibility/side-panel classification plus reused recipient parsing, field behavior, and drag/drop — 8 suites / 69 tests ✅ - focused oxlint for all changed frontend files ✅ - focused oxfmt check ✅ - git diff check ✅ Merged the latest origin/main into this branch before pushing.
F
Félix Malfait committed
d14069353fe263eb2d0790d92ab396919a1005a0
Parent: 6ab1e69
Committed by GitHub <noreply@github.com>
on 8/24/2026, 12:34:27 PM