From e8aba29a6875acf4cf0227c16113cdf39542a6e9 Mon Sep 17 00:00:00 2001 From: Lebaud Antoine Date: Tue, 26 Mar 2024 00:17:02 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8(frontend)=20make=20the=20team=20panne?= =?UTF-8?q?l=20closable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Team panel was quite wide, and took too much space on small screens. Johann decided to make it closable. Thus, user that needs to navigate quickly between their team can open it, use it and then close it. This animation is a first draft, and should be improved later on. Also, some accessibility issues might ariase, I have ignored them in this first draft. --- .../apps/desk/src/features/menu/Menu.tsx | 2 +- .../teams/__tests__/PanelTeams.test.tsx | 44 +++++++++++++ .../features/teams/assets/icon-open-close.svg | 4 ++ .../features/teams/components/Panel/Panel.tsx | 64 +++++++++++++++---- .../teams/components/Panel/TeamItem.tsx | 3 + .../teams/components/Panel/TeamList.tsx | 2 +- .../apps/desk/src/i18n/translations.json | 2 + 7 files changed, 106 insertions(+), 15 deletions(-) create mode 100644 src/frontend/apps/desk/src/features/teams/assets/icon-open-close.svg diff --git a/src/frontend/apps/desk/src/features/menu/Menu.tsx b/src/frontend/apps/desk/src/features/menu/Menu.tsx index 18a36dad..79f1eda5 100644 --- a/src/frontend/apps/desk/src/features/menu/Menu.tsx +++ b/src/frontend/apps/desk/src/features/menu/Menu.tsx @@ -23,7 +23,7 @@ export const Menu = () => { $height="100%" $justify="space-between" > - + diff --git a/src/frontend/apps/desk/src/features/teams/__tests__/PanelTeams.test.tsx b/src/frontend/apps/desk/src/features/teams/__tests__/PanelTeams.test.tsx index 9294c739..585ac30f 100644 --- a/src/frontend/apps/desk/src/features/teams/__tests__/PanelTeams.test.tsx +++ b/src/frontend/apps/desk/src/features/teams/__tests__/PanelTeams.test.tsx @@ -1,7 +1,9 @@ import '@testing-library/jest-dom'; import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; import fetchMock from 'fetch-mock'; +import { Panel } from '@/features/teams'; import { AppWrapper } from '@/tests/utils'; import { TeamList } from '../components/Panel/TeamList'; @@ -127,4 +129,46 @@ describe('PanelTeams', () => { ), ).toBeInTheDocument(); }); + + it('renders with team panel open', async () => { + fetchMock.mock(`/api/teams/?page=1&ordering=-created_at`, { + count: 1, + results: [], + }); + + render(, { wrapper: AppWrapper }); + + expect( + screen.getByRole('button', { name: 'Close the teams panel' }), + ).toBeVisible(); + + expect(await screen.findByText('Recents')).toBeVisible(); + }); + + it('closes and opens the team panel', async () => { + fetchMock.mock(`/api/teams/?page=1&ordering=-created_at`, { + count: 1, + results: [], + }); + + render(, { wrapper: AppWrapper }); + + expect(await screen.findByText('Recents')).toBeVisible(); + + await userEvent.click( + screen.getByRole('button', { + name: 'Close the teams panel', + }), + ); + + expect(await screen.findByText('Recents')).not.toBeVisible(); + + await userEvent.click( + screen.getByRole('button', { + name: 'Open the teams panel', + }), + ); + + expect(await screen.findByText('Recents')).toBeVisible(); + }); }); diff --git a/src/frontend/apps/desk/src/features/teams/assets/icon-open-close.svg b/src/frontend/apps/desk/src/features/teams/assets/icon-open-close.svg new file mode 100644 index 00000000..c87764ac --- /dev/null +++ b/src/frontend/apps/desk/src/features/teams/assets/icon-open-close.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/frontend/apps/desk/src/features/teams/components/Panel/Panel.tsx b/src/frontend/apps/desk/src/features/teams/components/Panel/Panel.tsx index 99117a0f..f519cfe2 100644 --- a/src/frontend/apps/desk/src/features/teams/components/Panel/Panel.tsx +++ b/src/frontend/apps/desk/src/features/teams/components/Panel/Panel.tsx @@ -1,8 +1,9 @@ -import React from 'react'; +import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { Box, Text } from '@/components'; +import { Box, BoxButton, Text } from '@/components'; import { useCunninghamTheme } from '@/cunningham'; +import IconOpenClose from '@/features/teams/assets/icon-open-close.svg'; import { PanelActions } from './PanelActions'; import { TeamList } from './TeamList'; @@ -11,32 +12,69 @@ export const Panel = () => { const { t } = useTranslation(); const { colorsTokens } = useCunninghamTheme(); + const [isOpen, setIsOpen] = useState(true); + + const closedOverridingStyles = !isOpen && { + $width: '0', + $maxWidth: '0', + $minWidth: '0', + }; + + const transition = 'all 0.5s ease-in-out'; + return ( - setIsOpen(!isOpen)} + > + + + - - {t('Recents')} - - + + + {t('Recents')} + + + + - ); }; diff --git a/src/frontend/apps/desk/src/features/teams/components/Panel/TeamItem.tsx b/src/frontend/apps/desk/src/features/teams/components/Panel/TeamItem.tsx index b922208c..81c3dfca 100644 --- a/src/frontend/apps/desk/src/features/teams/components/Panel/TeamItem.tsx +++ b/src/frontend/apps/desk/src/features/teams/components/Panel/TeamItem.tsx @@ -88,6 +88,9 @@ export const TeamItem = ({ team }: TeamProps) => { {team.name} diff --git a/src/frontend/apps/desk/src/features/teams/components/Panel/TeamList.tsx b/src/frontend/apps/desk/src/features/teams/components/Panel/TeamList.tsx index fd14b2e2..c042b088 100644 --- a/src/frontend/apps/desk/src/features/teams/components/Panel/TeamList.tsx +++ b/src/frontend/apps/desk/src/features/teams/components/Panel/TeamList.tsx @@ -73,7 +73,7 @@ export const TeamList = () => { }, [data?.pages]); return ( - +