Migrate activities (#2545)

* Start

* Migrate activities to flexible schema
This commit is contained in:
Charles Bochet
2023-11-16 17:10:22 +01:00
committed by GitHub
parent 7da18a13e8
commit dee38bb901
69 changed files with 518 additions and 1479 deletions

View File

@ -3,14 +3,12 @@ import styled from '@emotion/styled';
import { ActivityCreateButton } from '@/activities/components/ActivityCreateButton';
import { useOpenCreateActivityDrawer } from '@/activities/hooks/useOpenCreateActivityDrawer';
import { Activity } from '@/activities/types/Activity';
import { ActivityForDrawer } from '@/activities/types/ActivityForDrawer';
import { ActivityTargetableEntity } from '@/activities/types/ActivityTargetableEntity';
import { useFindManyObjectRecords } from '@/object-record/hooks/useFindManyObjectRecords';
import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile';
import {
ActivityType,
SortOrder,
useGetActivitiesByTargetsQuery,
} from '~/generated/graphql';
import { SortOrder } from '~/generated/graphql';
import { TimelineItemsContainer } from './TimelineItemsContainer';
@ -52,20 +50,21 @@ const StyledEmptyTimelineSubTitle = styled.div`
`;
export const Timeline = ({ entity }: { entity: ActivityTargetableEntity }) => {
const { data: queryResult, loading } = useGetActivitiesByTargetsQuery({
variables: {
activityTargetIds: [entity.id],
orderBy: [
{
createdAt: SortOrder.Desc,
},
],
const { objects, loading } = useFindManyObjectRecords({
objectNamePlural: 'activitiesV2',
filter: {
companyId: { eq: entity.id },
},
orderBy: [
{
createdAt: SortOrder.Desc,
},
],
});
const openCreateActivity = useOpenCreateActivityDrawer();
const activities: ActivityForDrawer[] = queryResult?.findManyActivities ?? [];
const activities: ActivityForDrawer[] = (objects ?? []) as Activity[];
if (loading) {
return <></>;
@ -79,13 +78,13 @@ export const Timeline = ({ entity }: { entity: ActivityTargetableEntity }) => {
<ActivityCreateButton
onNoteClick={() =>
openCreateActivity({
type: ActivityType.Note,
type: 'Note',
targetableEntities: [entity],
})
}
onTaskClick={() =>
openCreateActivity({
type: ActivityType.Task,
type: 'Task',
targetableEntities: [entity],
})
}

View File

@ -3,10 +3,10 @@ import styled from '@emotion/styled';
import { useOpenActivityRightDrawer } from '@/activities/hooks/useOpenActivityRightDrawer';
import { useCompleteTask } from '@/activities/tasks/hooks/useCompleteTask';
import { Activity } from '@/activities/types/Activity';
import { IconNotes } from '@/ui/display/icon';
import { OverflowingTextWithTooltip } from '@/ui/display/tooltip/OverflowingTextWithTooltip';
import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile';
import { Activity, User } from '~/generated/graphql';
import {
beautifyExactDateTime,
beautifyPastDateRelativeToNow,
@ -119,9 +119,19 @@ const StyledTimelineItemContainer = styled.div`
type TimelineActivityProps = {
activity: Pick<
Activity,
'id' | 'title' | 'body' | 'createdAt' | 'completedAt' | 'type'
> & { author: Pick<Activity['author'], 'displayName'> } & {
assignee?: Pick<User, 'id' | 'displayName'> | null;
| 'id'
| 'title'
| 'body'
| 'createdAt'
| 'completedAt'
| 'type'
| 'comments'
| 'dueAt'
> & { author: Pick<Activity['author'], 'firstName' | 'lastName'> } & {
assignee?: Pick<
Activity['author'],
'id' | 'firstName' | 'lastName' | 'avatarUrl'
> | null;
};
};
@ -140,7 +150,9 @@ export const TimelineActivity = ({ activity }: TimelineActivityProps) => {
<IconNotes />
</StyledIconContainer>
<StyledItemTitleContainer>
<span>{activity.author.displayName}</span>
<span>
{activity.author.firstName + ' ' + activity.author.lastName}
</span>
created a {activity.type.toLowerCase()}
</StyledItemTitleContainer>
<StyledItemTitleDate id={`id-${activity.id}`}>

View File

@ -2,13 +2,17 @@ import { isNonEmptyArray } from '@apollo/client/utilities';
import styled from '@emotion/styled';
import CommentCounter from '@/activities/comment/CommentCounter';
import { Activity } from '@/activities/types/Activity';
import { UserChip } from '@/users/components/UserChip';
import { Activity, User } from '~/generated/graphql';
import { WorkspaceMember } from '@/workspace-member/types/WorkspaceMember';
import { beautifyExactDate } from '~/utils/date-utils';
type TimelineActivityCardFooterProps = {
activity: Pick<Activity, 'id' | 'dueAt' | 'comments'> & {
assignee?: Pick<User, 'id' | 'displayName' | 'avatarUrl'> | null;
assignee?: Pick<
WorkspaceMember,
'id' | 'firstName' | 'lastName' | 'avatarUrl'
> | null;
};
};
@ -43,7 +47,11 @@ export const TimelineActivityCardFooter = ({
{activity.assignee && (
<UserChip
id={activity.assignee.id}
name={activity.assignee.displayName ?? ''}
name={
activity.assignee.firstName +
' ' +
activity.assignee.lastName ?? ''
}
pictureUrl={activity.assignee.avatarUrl ?? ''}
/>
)}

View File

@ -1,8 +1,8 @@
import styled from '@emotion/styled';
import { ActivityType } from '@/activities/types/Activity';
import { OverflowingTextWithTooltip } from '@/ui/display/tooltip/OverflowingTextWithTooltip';
import { Checkbox, CheckboxShape } from '@/ui/input/components/Checkbox';
import { ActivityType } from '~/generated/graphql';
const StyledTitleContainer = styled.div`
color: ${({ theme }) => theme.font.color.primary};
@ -44,7 +44,7 @@ export const TimelineActivityTitle = ({
onCompletionChange,
}: TimelineActivityTitleProps) => (
<StyledTitleContainer>
{type === ActivityType.Task && (
{type === 'Task' && (
<StyledCheckboxContainer
onClick={(event) => {
event.preventDefault();
@ -55,10 +55,7 @@ export const TimelineActivityTitle = ({
<Checkbox checked={completed ?? false} shape={CheckboxShape.Rounded} />
</StyledCheckboxContainer>
)}
<StyledTitleText
completed={completed}
hasCheckbox={type === ActivityType.Task}
>
<StyledTitleText completed={completed} hasCheckbox={type === 'Task'}>
<OverflowingTextWithTooltip text={title ? title : 'Task title'} />
</StyledTitleText>
</StyledTitleContainer>