From b1bf050936372088d00cc7f871c0cc2e8b27055d Mon Sep 17 00:00:00 2001 From: Sammy Teillet Date: Tue, 6 Jun 2023 17:45:07 +0200 Subject: [PATCH] test: add story for table header (#204) * test: add story for table header * feature: wrap chips in a container and set shrink to 0 so they don't grow vertically * feature: cancel button is darker * feature: set gap between chip to 4px instead of 8 * lint: remove unused code * bugfix: ChipContainer has a starting margin --- .../table/table-header/SortAndFilterBar.tsx | 61 ++++++++------ .../table/table-header/SortOrFilterChip.tsx | 2 +- .../__stories__/TableHeader.stories.tsx | 82 +++++++++++++++++++ 3 files changed, 120 insertions(+), 25 deletions(-) create mode 100644 front/src/modules/ui/components/table/table-header/__stories__/TableHeader.stories.tsx diff --git a/front/src/modules/ui/components/table/table-header/SortAndFilterBar.tsx b/front/src/modules/ui/components/table/table-header/SortAndFilterBar.tsx index 494b8e10a..b216c15fb 100644 --- a/front/src/modules/ui/components/table/table-header/SortAndFilterBar.tsx +++ b/front/src/modules/ui/components/table/table-header/SortAndFilterBar.tsx @@ -26,6 +26,17 @@ const StyledBar = styled.div` height: 40px; `; +const StyledChipcontainer = styled.div` + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + height: 40px; + overflow-x: auto; + margin-left: ${(props) => props.theme.spacing(2)}; + gap: ${(props) => props.theme.spacing(1)}; +`; + const StyledCancelButton = styled.button` margin-left: auto; border: none; @@ -35,7 +46,7 @@ const StyledCancelButton = styled.button` const vert = props.theme.spacing(1); return `${vert} ${horiz} ${vert} ${horiz}`; }}; - color: ${(props) => props.theme.text40}; + color: ${(props) => props.theme.text60}; font-weight: 500; margin-right: ${(props) => props.theme.spacing(2)}; cursor: pointer; @@ -56,29 +67,31 @@ function SortAndFilterBar({ }: OwnProps) { return ( - {sorts.map((sort) => { - return ( - : } - onRemove={() => onRemoveSort(sort.key)} - /> - ); - })} - {filters.map((filter) => { - return ( - onRemoveFilter(filter.key)} - /> - ); - })} + + {sorts.map((sort) => { + return ( + : } + onRemove={() => onRemoveSort(sort.key)} + /> + ); + })} + {filters.map((filter) => { + return ( + onRemoveFilter(filter.key)} + /> + ); + })} + {filters.length + sorts.length > 0 && ( props.theme.blueLowTransparency}; color: ${(props) => props.theme.blue}; padding: ${(props) => props.theme.spacing(1) + ' ' + props.theme.spacing(2)}; - margin-left: ${(props) => props.theme.spacing(2)}; font-size: ${(props) => props.theme.fontSizeSmall}; align-items: center; + flex-shrink: 0; `; const StyledIcon = styled.div` margin-right: ${(props) => props.theme.spacing(1)}; diff --git a/front/src/modules/ui/components/table/table-header/__stories__/TableHeader.stories.tsx b/front/src/modules/ui/components/table/table-header/__stories__/TableHeader.stories.tsx new file mode 100644 index 000000000..46bd64245 --- /dev/null +++ b/front/src/modules/ui/components/table/table-header/__stories__/TableHeader.stories.tsx @@ -0,0 +1,82 @@ +import React from 'react'; +import { FaList } from 'react-icons/fa'; +import { ApolloProvider } from '@apollo/client'; +import type { Meta, StoryObj } from '@storybook/react'; +import { userEvent, within } from '@storybook/testing-library'; + +import { FullHeightStorybookLayout } from '~/testing/FullHeightStorybookLayout'; +import { mockedClient } from '~/testing/mockedClient'; + +import { availableFilters } from '../../../../../../pages/companies/companies-filters'; +import { availableSorts } from '../../../../../../pages/companies/companies-sorts'; +import { TableHeader } from '../TableHeader'; + +const meta: Meta = { + title: 'Components/Table/TableHeader', + component: TableHeader, +}; + +export default meta; +type Story = StoryObj; + +export const Empty: Story = { + render: () => ( + + + } + availableSorts={availableSorts} + availableFilters={availableFilters} + /> + + + ), +}; + +export const WithSortsAndFilters: Story = { + render: () => ( + + + } + availableSorts={availableSorts} + availableFilters={availableFilters} + /> + + + ), + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + const outsideClick = await canvas.findByText('ViewName'); + + userEvent.click(await canvas.findByText('Filter')); + userEvent.click(await canvas.findByText('Name')); + const nameInput = await canvas.findByPlaceholderText('Name'); + userEvent.type(nameInput, 'My name'); + userEvent.click(outsideClick); + + userEvent.click(await canvas.findByText('Sort')); + userEvent.click(await canvas.findByText('Name')); + + userEvent.click(await canvas.findByText('Sort')); + userEvent.click(await canvas.findByText('Creation')); + + userEvent.click(await canvas.findByText('Sort')); + userEvent.click(await canvas.findByText('Address')); + + userEvent.click(await canvas.findByText('Filter')); + userEvent.click(await canvas.findByText('Employees')); + const employeesInput = await canvas.findByPlaceholderText('Employees'); + userEvent.type(employeesInput, '12'); + + userEvent.click(await canvas.findByText('Sort')); + userEvent.click(await canvas.findByText('Url')); + + userEvent.click(await canvas.findByText('Filter')); + userEvent.click(await canvas.findByText('Created At')); + userEvent.click(await canvas.findByText('6')); + userEvent.click(outsideClick); + }, +};