diff --git a/packages/twenty-front/src/modules/object-record/record-calendar/components/RecordCalendarAddNew.tsx b/packages/twenty-front/src/modules/object-record/record-calendar/components/RecordCalendarAddNew.tsx new file mode 100644 index 0000000000..d2c5618c39 --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/record-calendar/components/RecordCalendarAddNew.tsx @@ -0,0 +1,71 @@ +import { useObjectPermissionsForObject } from '@/object-record/hooks/useObjectPermissionsForObject'; +import { hasAnySoftDeleteFilterOnViewComponentSelector } from '@/object-record/record-filter/states/hasAnySoftDeleteFilterOnView'; +import { recordIndexCalendarFieldMetadataIdState } from '@/object-record/record-index/states/recordIndexCalendarFieldMetadataIdState'; +import { useCreateNewIndexRecord } from '@/object-record/record-table/hooks/useCreateNewIndexRecord'; +import { useRecoilComponentValue } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValue'; +import styled from '@emotion/styled'; +import { useTheme } from '@emotion/react'; +import { useRecoilValue } from 'recoil'; +import { IconPlus } from 'twenty-ui/display'; +import { Button } from 'twenty-ui/input'; +import { useRecordCalendarContextOrThrow } from '../contexts/RecordCalendarContext'; + +const StyledButton = styled(Button)` + padding: ${({ theme }) => theme.spacing(0.5)}; + min-width: unset; + height: auto; +`; + +type RecordCalendarAddNewProps = { + cardDate: string; +}; + +export const RecordCalendarAddNew = ({ + cardDate, +}: RecordCalendarAddNewProps) => { + const { objectMetadataItem } = useRecordCalendarContextOrThrow(); + const theme = useTheme(); + + const { createNewIndexRecord } = useCreateNewIndexRecord({ + objectMetadataItem, + }); + + const objectPermissions = useObjectPermissionsForObject( + objectMetadataItem.id, + ); + + const hasObjectUpdatePermissions = objectPermissions.canUpdateObjectRecords; + + const hasAnySoftDeleteFilterOnView = useRecoilComponentValue( + hasAnySoftDeleteFilterOnViewComponentSelector, + ); + + const recordIndexCalendarFieldMetadataId = useRecoilValue( + recordIndexCalendarFieldMetadataIdState, + ); + + const calendarFieldMetadataItem = objectMetadataItem.fields.find( + (field) => field.id === recordIndexCalendarFieldMetadataId, + ); + + if ( + hasAnySoftDeleteFilterOnView || + !hasObjectUpdatePermissions || + !calendarFieldMetadataItem + ) { + return null; + } + + + return ( + { + createNewIndexRecord({ + [calendarFieldMetadataItem.name]: cardDate, + }); + }} + variant="tertiary" + Icon={() => } + /> + ); +}; diff --git a/packages/twenty-front/src/modules/object-record/record-calendar/month/components/RecordCalendarMonthBodyDay.tsx b/packages/twenty-front/src/modules/object-record/record-calendar/month/components/RecordCalendarMonthBodyDay.tsx index 4ef5c3408b..e9408eb512 100644 --- a/packages/twenty-front/src/modules/object-record/record-calendar/month/components/RecordCalendarMonthBodyDay.tsx +++ b/packages/twenty-front/src/modules/object-record/record-calendar/month/components/RecordCalendarMonthBodyDay.tsx @@ -7,6 +7,8 @@ import { css } from '@emotion/react'; import styled from '@emotion/styled'; import { Droppable } from '@hello-pangea/dnd'; import { format, isSameDay, isSameMonth, isWeekend } from 'date-fns'; +import { useState } from 'react'; +import { RecordCalendarAddNew } from '../../components/RecordCalendarAddNew'; const StyledContainer = styled.div<{ isOtherMonth: boolean; @@ -42,13 +44,13 @@ const StyledContainer = styled.div<{ const StyledDayHeader = styled.div` align-items: center; display: flex; - flex-direction: column; + flex-direction: row; height: 24px; - justify-content: center; - margin-bottom: ${({ theme }) => theme.spacing(0.5)}; - - margin-left: auto; - width: 24px; + justify-content: space-between; + margin-bottom: ${({ theme }) => theme.spacing(2)}; + margin-top: ${({ theme }) => theme.spacing(1.5)}; + margin-left: none; + width: 100%; `; const StyledDayHeaderDayContainer = styled.div` @@ -110,18 +112,27 @@ export const RecordCalendarMonthBodyDay = ({ dayKey, ); + const [hovered, setHovered] = useState(false); + const isToday = isSameDay(day, new Date()); const isOtherMonth = !isSameMonth(day, recordCalendarSelectedDate); const isDayOfWeekend = isWeekend(day); + const utcDate = new Date( + Date.UTC(day.getFullYear(), day.getMonth(), day.getDate()), + ); + return ( setHovered(true)} + onMouseLeave={() => setHovered(false)} > + {hovered && } {day.getDate()}