Fixed bug for refectch activities and create activity on the currently filtered user. (#1493)

* Fixed bug for refectch activities and create activity on the currently filtered user.

* Refactor optimistif effect

---------

Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
Lucas Bordeau
2023-09-11 08:02:51 +02:00
committed by GitHub
parent 08727aafe5
commit 9be069bedc
37 changed files with 363 additions and 243 deletions

View File

@ -1,4 +1,5 @@
import { useApolloClient } from '@apollo/client';
import { getOperationName } from '@apollo/client/utilities';
import { useFilteredSearchEntityQuery } from '@/search/hooks/useFilteredSearchEntityQuery';
import { SingleEntitySelect } from '@/ui/input/relation-picker/components/SingleEntitySelect';
@ -14,6 +15,7 @@ import {
} from '~/generated/graphql';
import { ACTIVITY_UPDATE_FRAGMENT } from '../graphql/fragments/activityUpdateFragment';
import { GET_ACTIVITIES } from '../graphql/queries/getActivities';
export type OwnProps = {
activity: Pick<Activity, 'id'> & {
@ -86,6 +88,7 @@ export function ActivityAssigneePicker({
},
},
},
refetchQueries: [getOperationName(GET_ACTIVITIES) ?? ''],
});
}

View File

@ -119,6 +119,7 @@ export function ActivityEditor({
title: newTitle,
},
},
refetchQueries: [getOperationName(GET_ACTIVITIES) ?? ''],
});
},
[activity.id, cachedActivity, updateActivityMutation],

View File

@ -30,10 +30,15 @@ export function useOpenCreateActivityDrawer() {
);
const [, setViewableActivityId] = useRecoilState(viewableActivityIdState);
return function openCreateActivityDrawer(
type: ActivityType,
entities?: ActivityTargetableEntity[],
) {
return function openCreateActivityDrawer({
type,
targetableEntities,
assigneeId,
}: {
type: ActivityType;
targetableEntities?: ActivityTargetableEntity[];
assigneeId?: string;
}) {
const now = new Date().toISOString();
return createActivityMutation({
@ -43,11 +48,13 @@ export function useOpenCreateActivityDrawer() {
createdAt: now,
updatedAt: now,
author: { connect: { id: currentUser?.id ?? '' } },
assignee: { connect: { id: currentUser?.id ?? '' } },
assignee: { connect: { id: assigneeId ?? currentUser?.id ?? '' } },
type: type,
activityTargets: {
createMany: {
data: entities ? getRelationData(entities) : [],
data: targetableEntities
? getRelationData(targetableEntities)
: [],
skipDuplicates: true,
},
},
@ -63,7 +70,7 @@ export function useOpenCreateActivityDrawer() {
onCompleted(data) {
setHotkeyScope(RightDrawerHotkeyScope.RightDrawer, { goto: false });
setViewableActivityId(data.createOneActivity.id);
setActivityTargetableEntityArray(entities ?? []);
setActivityTargetableEntityArray(targetableEntities ?? []);
openRightDrawer(RightDrawerPages.CreateActivity);
},
});

View File

@ -24,6 +24,9 @@ export function useOpenCreateActivityDrawerForSelectedRowIds() {
type: entityType,
id,
}));
openCreateActivityDrawer(type, activityTargetableEntityArray);
openCreateActivityDrawer({
type,
targetableEntities: activityTargetableEntityArray,
});
};
}

View File

@ -59,7 +59,12 @@ export function Notes({ entity }: { entity: ActivityTargetableEntity }) {
Icon={IconNotes}
title="New note"
variant="secondary"
onClick={() => openCreateActivity(ActivityType.Note, [entity])}
onClick={() =>
openCreateActivity({
type: ActivityType.Note,
targetableEntities: [entity],
})
}
/>
</StyledTaskGroupEmptyContainer>
);
@ -76,7 +81,12 @@ export function Notes({ entity }: { entity: ActivityTargetableEntity }) {
size="small"
variant="secondary"
title="Add note"
onClick={() => openCreateActivity(ActivityType.Note, [entity])}
onClick={() =>
openCreateActivity({
type: ActivityType.Note,
targetableEntities: [entity],
})
}
></Button>
}
/>

View File

@ -5,13 +5,13 @@ import { IconPlus } from '@/ui/icon';
import { ActivityType } from '~/generated/graphql';
export function AddTaskButton({
entity,
activityTargetEntity,
}: {
entity?: ActivityTargetableEntity;
activityTargetEntity?: ActivityTargetableEntity;
}) {
const openCreateActivity = useOpenCreateActivityDrawer();
if (!entity) {
if (!activityTargetEntity) {
return <></>;
}
@ -21,7 +21,12 @@ export function AddTaskButton({
size="small"
variant="secondary"
title="Add task"
onClick={() => openCreateActivity(ActivityType.Task, [entity])}
onClick={() =>
openCreateActivity({
type: ActivityType.Task,
targetableEntities: [activityTargetEntity],
})
}
></Button>
);
}

View File

@ -0,0 +1,34 @@
import { useOpenCreateActivityDrawer } from '@/activities/hooks/useOpenCreateActivityDrawer';
import { TasksRecoilScopeContext } from '@/activities/states/recoil-scope-contexts/TasksRecoilScopeContext';
import { DropdownRecoilScopeContext } from '@/ui/dropdown/states/recoil-scope-contexts/DropdownRecoilScopeContext';
import { PageAddButton } from '@/ui/layout/components/PageAddButton';
import { RecoilScope } from '@/ui/utilities/recoil-scope/components/RecoilScope';
import { useRecoilScopedValue } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedValue';
import { filtersScopedState } from '@/ui/view-bar/states/filtersScopedState';
import { ActivityType } from '~/generated/graphql';
export function PageAddTaskButton() {
const openCreateActivity = useOpenCreateActivityDrawer();
const filters = useRecoilScopedValue(
filtersScopedState,
TasksRecoilScopeContext,
);
const assigneeIdFilter = filters.find(
(filter) => filter.key === 'assigneeId',
);
function handleClick() {
openCreateActivity({
type: ActivityType.Task,
assigneeId: assigneeIdFilter?.value,
});
}
return (
<RecoilScope SpecificContext={DropdownRecoilScopeContext}>
<PageAddButton onClick={handleClick} />
</RecoilScope>
);
}

View File

@ -83,7 +83,10 @@ export function TaskGroups({ entity, showAddButton }: OwnProps) {
title="New task"
variant={'secondary'}
onClick={() =>
openCreateActivity(ActivityType.Task, entity ? [entity] : undefined)
openCreateActivity({
type: ActivityType.Task,
targetableEntities: entity ? [entity] : undefined,
})
}
/>
</StyledTaskGroupEmptyContainer>
@ -95,21 +98,27 @@ export function TaskGroups({ entity, showAddButton }: OwnProps) {
{activeTabId === 'done' ? (
<TaskList
tasks={completedTasks ?? []}
button={showAddButton && <AddTaskButton entity={entity} />}
button={
showAddButton && <AddTaskButton activityTargetEntity={entity} />
}
/>
) : (
<>
<TaskList
title="Today"
tasks={todayOrPreviousTasks ?? []}
button={showAddButton && <AddTaskButton entity={entity} />}
button={
showAddButton && <AddTaskButton activityTargetEntity={entity} />
}
/>
<TaskList
title="Upcoming"
tasks={upcomingTasks ?? []}
button={
showAddButton &&
!todayOrPreviousTasks?.length && <AddTaskButton entity={entity} />
!todayOrPreviousTasks?.length && (
<AddTaskButton activityTargetEntity={entity} />
)
}
/>
<TaskList
@ -118,7 +127,9 @@ export function TaskGroups({ entity, showAddButton }: OwnProps) {
button={
showAddButton &&
!todayOrPreviousTasks?.length &&
!upcomingTasks?.length && <AddTaskButton entity={entity} />
!upcomingTasks?.length && (
<AddTaskButton activityTargetEntity={entity} />
)
}
/>
</>

View File

@ -77,8 +77,18 @@ export function Timeline({ entity }: { entity: ActivityTargetableEntity }) {
<StyledEmptyTimelineTitle>No activity yet</StyledEmptyTimelineTitle>
<StyledEmptyTimelineSubTitle>Create one:</StyledEmptyTimelineSubTitle>
<ActivityCreateButton
onNoteClick={() => openCreateActivity(ActivityType.Note, [entity])}
onTaskClick={() => openCreateActivity(ActivityType.Task, [entity])}
onNoteClick={() =>
openCreateActivity({
type: ActivityType.Note,
targetableEntities: [entity],
})
}
onTaskClick={() =>
openCreateActivity({
type: ActivityType.Task,
targetableEntities: [entity],
})
}
/>
</StyledTimelineEmptyContainer>
);