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 18a36da..79f1eda 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 9294c73..585ac30 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 0000000..c87764a --- /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 99117a0..f519cfe 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 b922208..81c3dfc 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 fd14b2e..c042b08 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 ( - +