Skip to content

Commit

Permalink
Feat/filter activity inbox (twentyhq#1032)
Browse files Browse the repository at this point in the history
* Move files

* Add filtering for tasks inbox

* Add filter dropdown for single entity

* Minor

* Fill empty button

* Refine logic for filter dropdown

* remove log

* Fix unwanted change

* Set current user as default filter

* Add avatar on filter

* Improve initialization of assignee filter

* Add story for Tasks page

* Add more stories

* Add sotry with no tasks

* Improve dates

* Enh tests

---------

Co-authored-by: Charles Bochet <charlesBochet@users.noreply.github.com>
  • Loading branch information
2 people authored and AdityaPimpalkar committed Aug 3, 2023
1 parent 5462063 commit d9f8408
Show file tree
Hide file tree
Showing 28 changed files with 601 additions and 189 deletions.
4 changes: 2 additions & 2 deletions front/src/modules/activities/comment/CommentHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import styled from '@emotion/styled';

import { Avatar } from '@/users/components/Avatar';
import {
beautifyExactDate,
beautifyExactDateTime,
beautifyPastDateRelativeToNow,
} from '~/utils/date-utils';

Expand Down Expand Up @@ -64,7 +64,7 @@ const StyledTooltip = styled(Tooltip)`

export function CommentHeader({ comment, actionBar }: OwnProps) {
const beautifiedCreatedAt = beautifyPastDateRelativeToNow(comment.createdAt);
const exactCreatedAt = beautifyExactDate(comment.createdAt);
const exactCreatedAt = beautifyExactDateTime(comment.createdAt);
const showDate = beautifiedCreatedAt !== '';

const author = comment.author;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export function ActivityAssigneePicker({
);
const [updateActivity] = useUpdateActivityMutation();

const companies = useFilteredSearchEntityQuery({
const users = useFilteredSearchEntityQuery({
queryHook: useSearchUserQuery,
selectedIds: activity?.accountOwner?.id ? [activity?.accountOwner?.id] : [],
searchFilter: searchFilter,
Expand Down Expand Up @@ -70,9 +70,9 @@ export function ActivityAssigneePicker({
onEntitySelected={handleEntitySelected}
onCancel={onCancel}
entities={{
loading: companies.loading,
entitiesToSelect: companies.entitiesToSelect,
selectedEntity: companies.selectedEntities[0],
loading: users.loading,
entitiesToSelect: users.entitiesToSelect,
selectedEntity: users.selectedEntities[0],
}}
/>
);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { MemoryRouter } from 'react-router-dom';
import type { Meta, StoryObj } from '@storybook/react';

import { ComponentDecorator } from '~/testing/decorators/ComponentDecorator';
import { graphqlMocks } from '~/testing/graphqlMocks';
import { mockedActivities } from '~/testing/mock-data/activities';

import { TaskList } from '../TaskList';

const meta: Meta<typeof TaskList> = {
title: 'Modules/Activity/TaskList',
component: TaskList,
decorators: [
(Story) => (
<MemoryRouter>
<Story />
</MemoryRouter>
),
ComponentDecorator,
],
args: {
title: 'Tasks',
tasks: mockedActivities,
},
parameters: {
msw: graphqlMocks,
},
};

export default meta;
type Story = StoryObj<typeof TaskList>;

export const Default: Story = {
args: {
title: 'Tasks',
tasks: mockedActivities,
},
};

export const Empty: Story = {
args: {
title: 'No tasks',
tasks: [],
},
};
22 changes: 22 additions & 0 deletions front/src/modules/activities/hooks/useInitializeTasksFilters.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { useEffect } from 'react';

import { availableFiltersScopedState } from '@/ui/filter-n-sort/states/availableFiltersScopedState';
import { FilterDefinition } from '@/ui/filter-n-sort/types/FilterDefinition';
import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState';

import { TasksContext } from '../states/TasksContext';

export function useInitializeTasksFilters({
availableFilters,
}: {
availableFilters: FilterDefinition[];
}) {
const [, setAvailableFilters] = useRecoilScopedState(
availableFiltersScopedState,
TasksContext,
);

useEffect(() => {
setAvailableFilters(availableFilters);
}, [setAvailableFilters, availableFilters]);
}
103 changes: 103 additions & 0 deletions front/src/modules/activities/hooks/useTasks.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
import { useEffect } from 'react';
import { DateTime } from 'luxon';
import { useRecoilState } from 'recoil';

import { currentUserState } from '@/auth/states/currentUserState';
import { filtersScopedState } from '@/ui/filter-n-sort/states/filtersScopedState';
import { turnFilterIntoWhereClause } from '@/ui/filter-n-sort/utils/turnFilterIntoWhereClause';
import { activeTabIdScopedState } from '@/ui/tab/states/activeTabIdScopedState';
import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState';
import { ActivityType, useGetActivitiesQuery } from '~/generated/graphql';
import { tasksFilters } from '~/pages/tasks/tasks-filters';
import { parseDate } from '~/utils/date-utils';

import { TasksContext } from '../states/TasksContext';

import { useInitializeTasksFilters } from './useInitializeTasksFilters';

export function useTasks() {
useInitializeTasksFilters({
availableFilters: tasksFilters,
});

const [activeTabId] = useRecoilScopedState(
activeTabIdScopedState,
TasksContext,
);

const [filters, setFilters] = useRecoilScopedState(
filtersScopedState,
TasksContext,
);

// If there is no filter, we set the default filter to the current user
const [currentUser] = useRecoilState(currentUserState);

useEffect(() => {
if (currentUser && !filters.length) {
setFilters([
{
field: 'assigneeId',
type: 'entity',
value: currentUser.id,
operand: 'is',
displayValue: currentUser.displayName,
displayAvatarUrl: currentUser.avatarUrl ?? undefined,
},
]);
}
}, [currentUser, filters, setFilters]);

const whereFilters = Object.assign(
{},
...filters.map((filter) => {
return turnFilterIntoWhereClause(filter);
}),
);

const { data: completeTasksData } = useGetActivitiesQuery({
variables: {
where: {
type: { equals: ActivityType.Task },
completedAt: { not: { equals: null } },
...whereFilters,
},
},
});

const { data: incompleteTaskData } = useGetActivitiesQuery({
variables: {
where: {
type: { equals: ActivityType.Task },
completedAt: { equals: null },
...whereFilters,
},
},
});

const tasksData =
activeTabId === 'done' ? completeTasksData : incompleteTaskData;

const todayOrPreviousTasks = tasksData?.findManyActivities.filter((task) => {
if (!task.dueAt) {
return false;
}
const dueDate = parseDate(task.dueAt).toJSDate();
const today = DateTime.now().endOf('day').toJSDate();
return dueDate <= today;
});

const upcomingTasks = tasksData?.findManyActivities.filter((task) => {
if (!task.dueAt) {
return false;
}
const dueDate = parseDate(task.dueAt).toJSDate();
const today = DateTime.now().endOf('day').toJSDate();
return dueDate > today;
});

return {
todayOrPreviousTasks,
upcomingTasks,
};
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import { Tooltip } from 'react-tooltip';
import styled from '@emotion/styled';

import { useCompleteTask } from '@/activities/hooks/useCompleteTask';
import { useOpenActivityRightDrawer } from '@/activities/hooks/useOpenActivityRightDrawer';
import { useCompleteTask } from '@/tasks/hooks/useCompleteTask';
import { IconNotes } from '@/ui/icon';
import { OverflowingTextWithTooltip } from '@/ui/tooltip/OverflowingTextWithTooltip';
import { Activity, User } from '~/generated/graphql';
import {
beautifyExactDate,
beautifyExactDateTime,
beautifyPastDateRelativeToNow,
} from '~/utils/date-utils';

Expand Down Expand Up @@ -126,7 +126,7 @@ type OwnProps = {

export function TimelineActivity({ activity }: OwnProps) {
const beautifiedCreatedAt = beautifyPastDateRelativeToNow(activity.createdAt);
const exactCreatedAt = beautifyExactDate(activity.createdAt);
const exactCreatedAt = beautifyExactDateTime(activity.createdAt);
const body = JSON.parse(activity.body ?? '{}')[0]?.content[0]?.text;

const openActivityRightDrawer = useOpenActivityRightDrawer();
Expand Down
59 changes: 0 additions & 59 deletions front/src/modules/tasks/hooks/useTasks.ts

This file was deleted.

Loading

0 comments on commit d9f8408

Please sign in to comment.