diff --git a/packages/twenty-front/src/modules/activities/calendar/components/CalendarEventNotSharedContent.tsx b/packages/twenty-front/src/modules/activities/calendar/components/CalendarEventNotSharedContent.tsx index 4045e1d32..2af43d60e 100644 --- a/packages/twenty-front/src/modules/activities/calendar/components/CalendarEventNotSharedContent.tsx +++ b/packages/twenty-front/src/modules/activities/calendar/components/CalendarEventNotSharedContent.tsx @@ -1,5 +1,6 @@ import { useTheme } from '@emotion/react'; import styled from '@emotion/styled'; +import { Trans } from '@lingui/react/macro'; import { IconLock } from 'twenty-ui/display'; import { Card, CardContent } from 'twenty-ui/layout'; @@ -29,7 +30,7 @@ export const CalendarEventNotSharedContent = () => { - Not shared + Not shared ); diff --git a/packages/twenty-front/src/modules/activities/files/components/DocumentViewer.tsx b/packages/twenty-front/src/modules/activities/files/components/DocumentViewer.tsx index 1e6b3a006..135ecd358 100644 --- a/packages/twenty-front/src/modules/activities/files/components/DocumentViewer.tsx +++ b/packages/twenty-front/src/modules/activities/files/components/DocumentViewer.tsx @@ -1,7 +1,11 @@ +import { fetchCsvPreview } from '@/activities/files/utils/fetchCsvPreview'; import DocViewer, { DocViewerRenderers } from '@cyntler/react-doc-viewer'; import '@cyntler/react-doc-viewer/dist/index.css'; import { useTheme } from '@emotion/react'; import styled from '@emotion/styled'; +import { Trans } from '@lingui/react/macro'; +import { useEffect, useState } from 'react'; +import { isDefined } from 'twenty-shared/utils'; import { getFileNameAndExtension } from '~/utils/file/getFileNameAndExtension'; const StyledDocumentViewerContainer = styled.div` @@ -12,13 +16,6 @@ const StyledDocumentViewerContainer = styled.div` width: 100%; background: ${({ theme }) => theme.background.secondary}; - .react-doc-viewer { - height: 100%; - width: 100%; - overflow: auto; - background: none; - } - #react-doc-viewer #header-bar { display: none; } @@ -26,6 +23,17 @@ const StyledDocumentViewerContainer = styled.div` #react-doc-viewer #pdf-controls { display: none !important; } + + #react-doc-viewer, + #proxy-renderer, + #msdoc-renderer { + display: flex; + flex-direction: column; + height: 100%; + width: 100%; + overflow: auto; + background: none; + } `; type DocumentViewerProps = { @@ -87,6 +95,7 @@ export const DocumentViewer = ({ documentUrl, }: DocumentViewerProps) => { const theme = useTheme(); + const [csvPreview, setCsvPreview] = useState(undefined); const { extension } = getFileNameAndExtension(documentName); const fileExtension = extension?.toLowerCase().replace('.', '') ?? ''; @@ -94,12 +103,32 @@ export const DocumentViewer = ({ ? MIME_TYPE_MAPPING[fileExtension] : undefined; + useEffect(() => { + if (fileExtension === 'csv') { + fetchCsvPreview(documentUrl).then((content) => { + setCsvPreview(content); + }); + } + }, [documentUrl, fileExtension]); + + if (fileExtension === 'csv' && !isDefined(csvPreview)) + return ( + + Loading csv ... + + ); + return ( => { + const response = await fetch(url); + const text = await response.text(); + + const result = Papa.parse(text, { + preview: DEFAULT_PREVIEW_ROWS, + skipEmptyLines: true, + header: true, + }); + + const data = result.data as Record[]; + + const csvContent = Papa.unparse(data, { + header: true, + }); + + return csvContent; +}; diff --git a/packages/twenty-front/src/modules/activities/timeline-activities/rows/message/components/EventCardMessage.tsx b/packages/twenty-front/src/modules/activities/timeline-activities/rows/message/components/EventCardMessage.tsx index a5c84bc88..e60065afa 100644 --- a/packages/twenty-front/src/modules/activities/timeline-activities/rows/message/components/EventCardMessage.tsx +++ b/packages/twenty-front/src/modules/activities/timeline-activities/rows/message/components/EventCardMessage.tsx @@ -6,6 +6,7 @@ import { EventCardMessageForbidden } from '@/activities/timeline-activities/rows import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { useFindOneRecord } from '@/object-record/hooks/useFindOneRecord'; import { useUpsertRecordsInStore } from '@/object-record/record-store/hooks/useUpsertRecordsInStore'; +import { Trans } from '@lingui/react/macro'; import { FIELD_RESTRICTED_ADDITIONAL_PERMISSIONS_REQUIRED } from 'twenty-shared/constants'; import { isDefined } from 'twenty-shared/utils'; import { OverflowingTextWithTooltip } from 'twenty-ui/display'; @@ -94,14 +95,26 @@ export const EventCardMessage = ({ ); if (shouldHandleNotFound) { - return
Message not found
; + return ( +
+ Message not found +
+ ); } - return
Error loading message
; + return ( +
+ Error loading message +
+ ); } if (loading || !isDefined(message)) { - return
Loading...
; + return ( +
+ Loading... +
+ ); } const messageParticipantHandles = message.messageParticipants @@ -117,7 +130,7 @@ export const EventCardMessage = ({ {message.subject !== FIELD_RESTRICTED_ADDITIONAL_PERMISSIONS_REQUIRED ? message.subject - : 'Subject not shared'} + : `Subject not shared`} diff --git a/packages/twenty-front/src/modules/activities/timeline-activities/rows/message/components/EventCardMessageBodyNotShared.tsx b/packages/twenty-front/src/modules/activities/timeline-activities/rows/message/components/EventCardMessageBodyNotShared.tsx index b8f1cb5a9..559c526b2 100644 --- a/packages/twenty-front/src/modules/activities/timeline-activities/rows/message/components/EventCardMessageBodyNotShared.tsx +++ b/packages/twenty-front/src/modules/activities/timeline-activities/rows/message/components/EventCardMessageBodyNotShared.tsx @@ -1,4 +1,5 @@ import styled from '@emotion/styled'; +import { Trans } from '@lingui/react/macro'; import { IconLock } from 'twenty-ui/display'; const StyledEmailBodyNotSharedContainer = styled.div` @@ -44,7 +45,9 @@ export const EventCardMessageBodyNotShared = ({ - Not shared by {notSharedByFullName} + + Not shared by {notSharedByFullName} + ); diff --git a/packages/twenty-front/src/modules/activities/timeline-activities/rows/message/components/EventCardMessageForbidden.tsx b/packages/twenty-front/src/modules/activities/timeline-activities/rows/message/components/EventCardMessageForbidden.tsx index 60e658036..eee28a521 100644 --- a/packages/twenty-front/src/modules/activities/timeline-activities/rows/message/components/EventCardMessageForbidden.tsx +++ b/packages/twenty-front/src/modules/activities/timeline-activities/rows/message/components/EventCardMessageForbidden.tsx @@ -1,6 +1,6 @@ import { EventCardMessageBodyNotShared } from '@/activities/timeline-activities/rows/message/components/EventCardMessageBodyNotShared'; import styled from '@emotion/styled'; - +import { Trans } from '@lingui/react/macro'; const StyledEventCardMessageContainer = styled.div` display: flex; flex-direction: column; @@ -32,7 +32,7 @@ export const EventCardMessageForbidden = ({ - Subject not shared + Subject not shared = { title: 'Modules/TimelineActivities/Rows/Message/EventCardMessage', component: EventCardMessage, decorators: [ + I18nFrontDecorator, ComponentDecorator, ObjectMetadataItemsDecorator, SnackBarDecorator, @@ -66,21 +69,21 @@ export const NotShared: Story = { play: async ({ canvasElement }) => { const canvas = within(canvasElement); - await canvas.findByText('Subject not shared'); + await canvas.findByText(`Subject not shared`); }, parameters: { msw: { handlers: [ graphql.query('FindOneMessage', () => { return HttpResponse.json({ - errors: [ - { - message: 'Forbidden', - extensions: { - code: 'FORBIDDEN', - }, + data: { + message: { + id: '1', + subject: FIELD_RESTRICTED_ADDITIONAL_PERMISSIONS_REQUIRED, + text: FIELD_RESTRICTED_ADDITIONAL_PERMISSIONS_REQUIRED, + messageParticipants: [], }, - ], + }, }); }), ],