diff --git a/packages/twenty-front/src/modules/accounts/types/MessageChannel.ts b/packages/twenty-front/src/modules/accounts/types/MessageChannel.ts index ed49f7f0f..625147e16 100644 --- a/packages/twenty-front/src/modules/accounts/types/MessageChannel.ts +++ b/packages/twenty-front/src/modules/accounts/types/MessageChannel.ts @@ -1,4 +1,4 @@ -import { InboxSettingsVisibilityValue } from '@/settings/accounts/components/SettingsAccountsInboxSettingsVisibilitySection'; +import { InboxSettingsVisibilityValue } from '@/settings/accounts/components/SettingsAccountsInboxVisibilitySettingsCard'; export type MessageChannel = { id: string; diff --git a/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsCalendarVisibilitySettingsCard.tsx b/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsCalendarVisibilitySettingsCard.tsx new file mode 100644 index 000000000..412d21fc4 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsCalendarVisibilitySettingsCard.tsx @@ -0,0 +1,44 @@ +import styled from '@emotion/styled'; + +import { SettingsAccountsRadioSettingsCard } from '@/settings/accounts/components/SettingsAccountsRadioSettingsCard'; +import { SettingsAccountsVisibilitySettingCardMedia } from '@/settings/accounts/components/SettingsAccountsVisibilitySettingCardMedia'; + +export enum EventSettingsVisibilityValue { + Everything = 'share_everything', + Metadata = 'metadata', +} + +type SettingsAccountsEventVisibilitySettingsCardProps = { + onChange: (nextValue: EventSettingsVisibilityValue) => void; + value?: EventSettingsVisibilityValue; +}; + +const StyledCardMedia = styled(SettingsAccountsVisibilitySettingCardMedia)` + height: ${({ theme }) => theme.spacing(6)}; +`; + +const eventSettingsVisibilityOptions = [ + { + title: 'Everything', + description: 'The whole event details will be shared with your team.', + value: EventSettingsVisibilityValue.Everything, + cardMedia: , + }, + { + title: 'Metadata', + description: 'Only date & participants will be shared with your team.', + value: EventSettingsVisibilityValue.Metadata, + cardMedia: , + }, +]; + +export const SettingsAccountsEventVisibilitySettingsCard = ({ + onChange, + value = EventSettingsVisibilityValue.Everything, +}: SettingsAccountsEventVisibilitySettingsCardProps) => ( + +); diff --git a/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsInboxSettingsVisibilitySection.tsx b/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsInboxSettingsVisibilitySection.tsx deleted file mode 100644 index 58157f09a..000000000 --- a/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsInboxSettingsVisibilitySection.tsx +++ /dev/null @@ -1,139 +0,0 @@ -import styled from '@emotion/styled'; - -import { SettingsAccountsCardMedia } from '@/settings/accounts/components/SettingsAccountsCardMedia'; -import { H2Title } from '@/ui/display/typography/components/H2Title'; -import { Radio } from '@/ui/input/components/Radio'; -import { Card } from '@/ui/layout/card/components/Card'; -import { CardContent } from '@/ui/layout/card/components/CardContent'; -import { Section } from '@/ui/layout/section/components/Section'; - -export enum InboxSettingsVisibilityValue { - Everything = 'share_everything', - SubjectMetadata = 'subject', - Metadata = 'metadata', -} - -type SettingsAccountsInboxSettingsVisibilitySectionProps = { - onChange: (nextValue: InboxSettingsVisibilityValue) => void; - value?: InboxSettingsVisibilityValue; -}; - -const StyledCardContent = styled(CardContent)` - align-items: center; - display: flex; - gap: ${({ theme }) => theme.spacing(4)}; - cursor: pointer; - - &:hover { - background: ${({ theme }) => theme.background.transparent.lighter}; - } -`; - -const StyledCardMedia = styled(SettingsAccountsCardMedia)` - align-items: stretch; -`; - -const StyledSubjectSkeleton = styled.div<{ isActive?: boolean }>` - background-color: ${({ isActive, theme }) => - isActive ? theme.accent.accent4060 : theme.background.quaternary}; - border-radius: 1px; - height: 3px; -`; - -const StyledMetadataSkeleton = styled(StyledSubjectSkeleton)` - margin-right: ${({ theme }) => theme.spacing(2)}; -`; - -const StyledBodySkeleton = styled(StyledSubjectSkeleton)` - border-radius: ${({ theme }) => theme.border.radius.xs}; - height: 22px; -`; - -const StyledTitle = styled.div` - color: ${({ theme }) => theme.font.color.primary}; - font-weight: ${({ theme }) => theme.font.weight.medium}; - margin-bottom: ${({ theme }) => theme.spacing(2)}; -`; - -const StyledDescription = styled.div` - color: ${({ theme }) => theme.font.color.tertiary}; - font-size: ${({ theme }) => theme.font.size.sm}; -`; - -const StyledRadio = styled(Radio)` - margin-left: auto; -`; - -const inboxSettingsVisibilityOptions = [ - { - title: 'Everything', - description: 'Subject, body and attachments will be shared with your team.', - value: InboxSettingsVisibilityValue.Everything, - visibleElements: { - metadata: true, - subject: true, - body: true, - }, - }, - { - title: 'Subject and metadata', - description: 'Subject and metadata will be shared with your team.', - value: InboxSettingsVisibilityValue.SubjectMetadata, - visibleElements: { - metadata: true, - subject: true, - body: false, - }, - }, - { - title: 'Metadata', - description: 'Timestamp and participants will be shared with your team.', - value: InboxSettingsVisibilityValue.Metadata, - visibleElements: { - metadata: true, - subject: false, - body: false, - }, - }, -]; - -export const SettingsAccountsInboxSettingsVisibilitySection = ({ - onChange, - value = InboxSettingsVisibilityValue.Everything, -}: SettingsAccountsInboxSettingsVisibilitySectionProps) => ( - - - - {inboxSettingsVisibilityOptions.map( - ( - { title, description, value: optionValue, visibleElements }, - index, - ) => ( - onChange(optionValue)} - > - - - - - - - {title} - {description} - - onChange(optionValue)} - checked={value === optionValue} - /> - - ), - )} - - -); diff --git a/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsInboxVisibilitySettingsCard.tsx b/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsInboxVisibilitySettingsCard.tsx new file mode 100644 index 000000000..6c9713aa3 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsInboxVisibilitySettingsCard.tsx @@ -0,0 +1,63 @@ +import { SettingsAccountsRadioSettingsCard } from '@/settings/accounts/components/SettingsAccountsRadioSettingsCard'; +import { SettingsAccountsVisibilitySettingCardMedia } from '@/settings/accounts/components/SettingsAccountsVisibilitySettingCardMedia'; + +export enum InboxSettingsVisibilityValue { + Everything = 'share_everything', + SubjectMetadata = 'subject', + Metadata = 'metadata', +} + +type SettingsAccountsInboxVisibilitySettingsCardProps = { + onChange: (nextValue: InboxSettingsVisibilityValue) => void; + value?: InboxSettingsVisibilityValue; +}; + +const inboxSettingsVisibilityOptions = [ + { + title: 'Everything', + description: 'Subject, body and attachments will be shared with your team.', + value: InboxSettingsVisibilityValue.Everything, + cardMedia: ( + + ), + }, + { + title: 'Subject and metadata', + description: 'Subject and metadata will be shared with your team.', + value: InboxSettingsVisibilityValue.SubjectMetadata, + cardMedia: ( + + ), + }, + { + title: 'Metadata', + description: 'Timestamp and participants will be shared with your team.', + value: InboxSettingsVisibilityValue.Metadata, + cardMedia: ( + + ), + }, +]; + +export const SettingsAccountsInboxVisibilitySettingsCard = ({ + onChange, + value = InboxSettingsVisibilityValue.Everything, +}: SettingsAccountsInboxVisibilitySettingsCardProps) => ( + +); diff --git a/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsRadioSettingsCard.tsx b/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsRadioSettingsCard.tsx new file mode 100644 index 000000000..2075d6872 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsRadioSettingsCard.tsx @@ -0,0 +1,73 @@ +import { ReactNode } from 'react'; +import styled from '@emotion/styled'; + +import { Radio } from '@/ui/input/components/Radio'; +import { Card } from '@/ui/layout/card/components/Card'; +import { CardContent } from '@/ui/layout/card/components/CardContent'; + +type SettingsAccountsRadioSettingsCardProps = + { + onChange: (nextValue: Option['value']) => void; + options: Option[]; + value: Option['value']; + }; + +const StyledCardContent = styled(CardContent)` + align-items: center; + display: flex; + gap: ${({ theme }) => theme.spacing(4)}; + cursor: pointer; + + &:hover { + background: ${({ theme }) => theme.background.transparent.lighter}; + } +`; + +const StyledTitle = styled.div` + color: ${({ theme }) => theme.font.color.primary}; + font-weight: ${({ theme }) => theme.font.weight.medium}; + margin-bottom: ${({ theme }) => theme.spacing(2)}; +`; + +const StyledDescription = styled.div` + color: ${({ theme }) => theme.font.color.tertiary}; + font-size: ${({ theme }) => theme.font.size.sm}; +`; + +const StyledRadio = styled(Radio)` + margin-left: auto; +`; + +export const SettingsAccountsRadioSettingsCard = < + Option extends { + cardMedia: ReactNode; + description: string; + title: string; + value: string; + }, +>({ + onChange, + options, + value, +}: SettingsAccountsRadioSettingsCardProps) => ( + + {options.map((option, index) => ( + onChange(option.value)} + > + {option.cardMedia} + + {option.title} + {option.description} + + onChange(option.value)} + checked={value === option.value} + /> + + ))} + +); diff --git a/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsToggleSettingCard.tsx b/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsToggleSettingCard.tsx index 88d9dcaf0..927509a31 100644 --- a/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsToggleSettingCard.tsx +++ b/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsToggleSettingCard.tsx @@ -1,15 +1,13 @@ -import { useTheme } from '@emotion/react'; +import { ReactNode } from 'react'; import styled from '@emotion/styled'; -import { SettingsAccountsCardMedia } from '@/settings/accounts/components/SettingsAccountsCardMedia'; -import { IconComponent } from '@/ui/display/icon/types/IconComponent'; import { Toggle } from '@/ui/input/components/Toggle'; import { Card } from '@/ui/layout/card/components/Card'; import { CardContent } from '@/ui/layout/card/components/CardContent'; type SettingsAccountsToggleSettingCardProps = { - Icon: IconComponent; - isEnabled: boolean; + cardMedia: ReactNode; + value: boolean; onToggle: (value: boolean) => void; title: string; }; @@ -19,6 +17,11 @@ const StyledCardContent = styled(CardContent)` display: flex; gap: ${({ theme }) => theme.spacing(4)}; padding: ${({ theme }) => theme.spacing(2, 4)}; + cursor: pointer; + + &:hover { + background: ${({ theme }) => theme.background.transparent.lighter}; + } `; const StyledTitle = styled.span` @@ -28,22 +31,16 @@ const StyledTitle = styled.span` `; export const SettingsAccountsToggleSettingCard = ({ - Icon, - isEnabled, + cardMedia, + value, onToggle, title, -}: SettingsAccountsToggleSettingCardProps) => { - const theme = useTheme(); - - return ( - - - - - - {title} - - - - ); -}; +}: SettingsAccountsToggleSettingCardProps) => ( + + onToggle(!value)}> + {cardMedia} + {title} + + + +); diff --git a/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsVisibilitySettingCardMedia.tsx b/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsVisibilitySettingCardMedia.tsx new file mode 100644 index 000000000..119fb26e0 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/accounts/components/SettingsAccountsVisibilitySettingCardMedia.tsx @@ -0,0 +1,45 @@ +import styled from '@emotion/styled'; + +import { SettingsAccountsCardMedia } from '@/settings/accounts/components/SettingsAccountsCardMedia'; + +type VisibilityElementState = 'active' | 'inactive'; + +type SettingsAccountsVisibilitySettingCardMediaProps = { + className?: string; + metadata?: VisibilityElementState; + subject?: VisibilityElementState; + body?: VisibilityElementState; +}; + +const StyledCardMedia = styled(SettingsAccountsCardMedia)` + align-items: stretch; +`; + +const StyledSubjectSkeleton = styled.div<{ isActive?: boolean }>` + background-color: ${({ isActive, theme }) => + isActive ? theme.accent.accent4060 : theme.background.quaternary}; + border-radius: 1px; + height: 3px; +`; + +const StyledMetadataSkeleton = styled(StyledSubjectSkeleton)` + margin-right: ${({ theme }) => theme.spacing(2)}; +`; + +const StyledBodySkeleton = styled(StyledSubjectSkeleton)` + border-radius: ${({ theme }) => theme.border.radius.xs}; + flex: 1 0 auto; +`; + +export const SettingsAccountsVisibilitySettingCardMedia = ({ + className, + metadata, + subject, + body, +}: SettingsAccountsVisibilitySettingCardMediaProps) => ( + + {!!metadata && } + {!!subject && } + {!!body && } + +); diff --git a/packages/twenty-front/src/pages/settings/accounts/SettingsAccountsCalendarsSettings.tsx b/packages/twenty-front/src/pages/settings/accounts/SettingsAccountsCalendarsSettings.tsx index b37537cf0..fa62791b7 100644 --- a/packages/twenty-front/src/pages/settings/accounts/SettingsAccountsCalendarsSettings.tsx +++ b/packages/twenty-front/src/pages/settings/accounts/SettingsAccountsCalendarsSettings.tsx @@ -1,5 +1,12 @@ import { useParams } from 'react-router-dom'; +import { useTheme } from '@emotion/react'; +import styled from '@emotion/styled'; +import { + EventSettingsVisibilityValue, + SettingsAccountsEventVisibilitySettingsCard, +} from '@/settings/accounts/components/SettingsAccountsCalendarVisibilitySettingsCard'; +import { SettingsAccountsCardMedia } from '@/settings/accounts/components/SettingsAccountsCardMedia'; import { SettingsAccountsToggleSettingCard } from '@/settings/accounts/components/SettingsAccountsToggleSettingCard'; import { SettingsPageContainer } from '@/settings/components/SettingsPageContainer'; import { getSettingsPagePath } from '@/settings/utils/getSettingsPagePath'; @@ -11,7 +18,12 @@ import { Section } from '@/ui/layout/section/components/Section'; import { Breadcrumb } from '@/ui/navigation/bread-crumb/components/Breadcrumb'; import { mockedConnectedAccounts } from '~/testing/mock-data/accounts'; +const StyledCardMedia = styled(SettingsAccountsCardMedia)` + height: ${({ theme }) => theme.spacing(6)}; +`; + export const SettingsAccountsCalendarsSettings = () => { + const theme = useTheme(); const { accountUuid = '' } = useParams(); const connectedAccount = mockedConnectedAccounts.find( ({ id }) => id === accountUuid, @@ -33,15 +45,32 @@ export const SettingsAccountsCalendarsSettings = () => { { children: connectedAccount?.handle || '' }, ]} /> + + + {}} + /> + + + + } title="Auto-creation" - isEnabled={false} + value={false} onToggle={() => {}} /> @@ -51,9 +80,16 @@ export const SettingsAccountsCalendarsSettings = () => { description="Past and future calendar events will automatically be synced to this workspace" /> + + + } title="Sync events" - isEnabled={false} + value={false} onToggle={() => {}} /> diff --git a/packages/twenty-front/src/pages/settings/accounts/SettingsAccountsEmailsInboxSettings.tsx b/packages/twenty-front/src/pages/settings/accounts/SettingsAccountsEmailsInboxSettings.tsx index d45f8b5a0..00b3f87d2 100644 --- a/packages/twenty-front/src/pages/settings/accounts/SettingsAccountsEmailsInboxSettings.tsx +++ b/packages/twenty-front/src/pages/settings/accounts/SettingsAccountsEmailsInboxSettings.tsx @@ -1,14 +1,16 @@ import { useEffect } from 'react'; import { useNavigate, useParams } from 'react-router-dom'; +import { useTheme } from '@emotion/react'; import { MessageChannel } from '@/accounts/types/MessageChannel'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { useFindOneRecord } from '@/object-record/hooks/useFindOneRecord'; import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; +import { SettingsAccountsCardMedia } from '@/settings/accounts/components/SettingsAccountsCardMedia'; import { InboxSettingsVisibilityValue, - SettingsAccountsInboxSettingsVisibilitySection, -} from '@/settings/accounts/components/SettingsAccountsInboxSettingsVisibilitySection'; + SettingsAccountsInboxVisibilitySettingsCard, +} from '@/settings/accounts/components/SettingsAccountsInboxVisibilitySettingsCard'; import { SettingsAccountsToggleSettingCard } from '@/settings/accounts/components/SettingsAccountsToggleSettingCard'; import { SettingsPageContainer } from '@/settings/components/SettingsPageContainer'; import { AppPath } from '@/types/AppPath'; @@ -19,6 +21,7 @@ import { Section } from '@/ui/layout/section/components/Section'; import { Breadcrumb } from '@/ui/navigation/bread-crumb/components/Breadcrumb'; export const SettingsAccountsEmailsInboxSettings = () => { + const theme = useTheme(); const navigate = useNavigate(); const { accountUuid: messageChannelId = '' } = useParams(); @@ -65,32 +68,33 @@ export const SettingsAccountsEmailsInboxSettings = () => { { children: messageChannel.handle || '' }, ]} /> - {/* TODO : discuss the desired sync behaviour */} - {/* + {/* TODO : discuss the desired sync behaviour and add Synchronization section */} + - - */} - + + + + } title="Auto-creation" - isEnabled={!!messageChannel.isContactAutoCreationEnabled} + value={!!messageChannel.isContactAutoCreationEnabled} onToggle={handleContactAutoCreationToggle} />