From 22bc2712aba8311c0d19884af822b85cfdfb0cef Mon Sep 17 00:00:00 2001 From: Charles Bochet Date: Mon, 15 Sep 2025 10:58:41 +0200 Subject: [PATCH] Implement Calendar Grid (#14487) image --- .../components/RecordCalendar.tsx | 31 ++++ .../components/RecordCalendarTopBar.tsx | 32 +++++ .../month/components/RecordCalendarMonth.tsx | 44 ++++++ .../components/RecordCalendarMonthBody.tsx | 24 ++++ .../components/RecordCalendarMonthBodyDay.tsx | 16 +++ .../RecordCalendarMonthBodyWeek.tsx | 34 +++++ .../components/RecordCalendarMonthHeader.tsx | 21 +++ .../RecordCalendarMonthHeaderDay.tsx | 17 +++ .../RecordCalendarMonth.stories.tsx | 133 ++++++++++++++++++ .../contexts/RecordCalendarMonthContext.ts | 18 +++ .../hooks/useRecordCalendarMonthDaysRange.tsx | 71 ++++++++++ .../RecordIndexCalendarContainer.tsx | 3 +- 12 files changed, 443 insertions(+), 1 deletion(-) create mode 100644 packages/twenty-front/src/modules/object-record/record-calendar/components/RecordCalendar.tsx create mode 100644 packages/twenty-front/src/modules/object-record/record-calendar/components/RecordCalendarTopBar.tsx create mode 100644 packages/twenty-front/src/modules/object-record/record-calendar/month/components/RecordCalendarMonth.tsx create mode 100644 packages/twenty-front/src/modules/object-record/record-calendar/month/components/RecordCalendarMonthBody.tsx create mode 100644 packages/twenty-front/src/modules/object-record/record-calendar/month/components/RecordCalendarMonthBodyDay.tsx create mode 100644 packages/twenty-front/src/modules/object-record/record-calendar/month/components/RecordCalendarMonthBodyWeek.tsx create mode 100644 packages/twenty-front/src/modules/object-record/record-calendar/month/components/RecordCalendarMonthHeader.tsx create mode 100644 packages/twenty-front/src/modules/object-record/record-calendar/month/components/RecordCalendarMonthHeaderDay.tsx create mode 100644 packages/twenty-front/src/modules/object-record/record-calendar/month/components/__stories__/RecordCalendarMonth.stories.tsx create mode 100644 packages/twenty-front/src/modules/object-record/record-calendar/month/contexts/RecordCalendarMonthContext.ts create mode 100644 packages/twenty-front/src/modules/object-record/record-calendar/month/hooks/useRecordCalendarMonthDaysRange.tsx diff --git a/packages/twenty-front/src/modules/object-record/record-calendar/components/RecordCalendar.tsx b/packages/twenty-front/src/modules/object-record/record-calendar/components/RecordCalendar.tsx new file mode 100644 index 00000000000..508b72fb9ce --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-calendar/components/RecordCalendar.tsx @@ -0,0 +1,31 @@ +import styled from '@emotion/styled'; + +import { RecordCalendarTopBar } from '@/object-record/record-calendar/components/RecordCalendarTopBar'; +import { RecordCalendarMonth } from '@/object-record/record-calendar/month/components/RecordCalendarMonth'; +import { RecordCalendarComponentInstanceContext } from '@/object-record/record-calendar/states/contexts/RecordCalendarComponentInstanceContext'; +import { ScrollWrapper } from '@/ui/utilities/scroll/components/ScrollWrapper'; +import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow'; + +const StyledContainerContainer = styled.div` + display: flex; + flex-direction: column; + min-height: calc(100% - ${({ theme }) => theme.spacing(2)}); + height: min-content; +`; + +export const RecordCalendar = () => { + const recordCalendarId = useAvailableComponentInstanceIdOrThrow( + RecordCalendarComponentInstanceContext, + ); + + return ( + + + + + + + ); +}; diff --git a/packages/twenty-front/src/modules/object-record/record-calendar/components/RecordCalendarTopBar.tsx b/packages/twenty-front/src/modules/object-record/record-calendar/components/RecordCalendarTopBar.tsx new file mode 100644 index 00000000000..a1e6e39879c --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-calendar/components/RecordCalendarTopBar.tsx @@ -0,0 +1,32 @@ +import { RecordCalendarComponentInstanceContext } from '@/object-record/record-calendar/states/contexts/RecordCalendarComponentInstanceContext'; +import { Select } from '@/ui/input/components/Select'; +import { useAvailableComponentInstanceIdOrThrow } from '@/ui/utilities/state/component-state/hooks/useAvailableComponentInstanceIdOrThrow'; +import styled from '@emotion/styled'; + +const StyledContainer = styled.div` + display: flex; + height: 24px; +`; + +export const RecordCalendarTopBar = () => { + const recordCalendarId = useAvailableComponentInstanceIdOrThrow( + RecordCalendarComponentInstanceContext, + ); + + return ( + +