added onRowClick and folder link

This commit is contained in:
Julie Plantey 2022-11-22 17:39:00 +01:00
parent 632ccb3c63
commit cb516f83cd
3 changed files with 89 additions and 35 deletions

View File

@ -1,18 +1,29 @@
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { useIntl } from 'react-intl'; import { useIntl } from 'react-intl';
import { getFileExtension } from '@strapi/helper-plugin'; import { useHistory, useLocation, Link } from 'react-router-dom';
import {
getFileExtension,
onRowClick,
stopPropagation,
useQueryParams,
} from '@strapi/helper-plugin';
import { BaseCheckbox } from '@strapi/design-system/BaseCheckbox'; import { BaseCheckbox } from '@strapi/design-system/BaseCheckbox';
import { Flex } from '@strapi/design-system/Flex';
import { IconButton } from '@strapi/design-system/IconButton'; import { IconButton } from '@strapi/design-system/IconButton';
import { Tbody, Td, Tr } from '@strapi/design-system/Table'; import { Tbody, Td, Tr } from '@strapi/design-system/Table';
import Pencil from '@strapi/icons/Pencil'; import Pencil from '@strapi/icons/Pencil';
import Eye from '@strapi/icons/Eye';
import { CellContent } from './CellContent'; import { CellContent } from './CellContent';
import { AssetDefinition, FolderDefinition, tableHeaders as cells } from '../../constants'; import { AssetDefinition, FolderDefinition, tableHeaders as cells } from '../../constants';
import { getTrad } from '../../utils'; import { getFolderURL, getTrad } from '../../utils';
export const TableRows = ({ onEditAsset, onEditFolder, onSelectOne, rows, selected }) => { export const TableRows = ({ onEditAsset, onEditFolder, onSelectOne, rows, selected }) => {
const { formatMessage } = useIntl(); const { formatMessage } = useIntl();
const { pathname } = useLocation();
const [{ query }] = useQueryParams();
const { push } = useHistory();
return ( return (
<Tbody> <Tbody>
@ -22,7 +33,15 @@ export const TableRows = ({ onEditAsset, onEditFolder, onSelectOne, rows, select
const isSelected = !!selected.find((currentRow) => currentRow.id === id); const isSelected = !!selected.find((currentRow) => currentRow.id === id);
return ( return (
<Tr key={id}> <Tr
key={id}
{...onRowClick({
fn: () =>
elementType === 'asset'
? onEditAsset(element)
: push(getFolderURL(pathname, query, element)),
})}
>
<Td> <Td>
<BaseCheckbox <BaseCheckbox
aria-label={formatMessage( aria-label={formatMessage(
@ -33,7 +52,7 @@ export const TableRows = ({ onEditAsset, onEditFolder, onSelectOne, rows, select
}, },
{ name } { name }
)} )}
onValueChange={() => onSelectOne({ ...element, elementType })} onValueChange={() => onSelectOne(element)}
checked={isSelected} checked={isSelected}
/> />
</Td> </Td>
@ -53,9 +72,25 @@ export const TableRows = ({ onEditAsset, onEditFolder, onSelectOne, rows, select
</Td> </Td>
); );
})} })}
<Td {...stopPropagation}>
<Flex justifyContent="flex-end">
{elementType === 'folder' && (
<IconButton
forwardedAs={Link}
label={formatMessage({
// TODO: fix trad
id: getTrad('app'),
defaultMessage: 'Access folder',
})}
to={getFolderURL(pathname, query, element)}
noBorder
>
<Eye />
</IconButton>
)}
{((elementType === 'asset' && onEditAsset) || {((elementType === 'asset' && onEditAsset) ||
(elementType === 'folder' && onEditFolder)) && ( (elementType === 'folder' && onEditFolder)) && (
<Td>
<IconButton <IconButton
label={formatMessage({ label={formatMessage({
id: getTrad('control-card.edit'), id: getTrad('control-card.edit'),
@ -68,8 +103,9 @@ export const TableRows = ({ onEditAsset, onEditFolder, onSelectOne, rows, select
> >
<Pencil /> <Pencil />
</IconButton> </IconButton>
</Td>
)} )}
</Flex>
</Td>
</Tr> </Tr>
); );
})} })}

View File

@ -1,5 +1,6 @@
import React from 'react'; import React from 'react';
import { IntlProvider } from 'react-intl'; import { IntlProvider } from 'react-intl';
import { MemoryRouter } from 'react-router-dom';
import { render } from '@testing-library/react'; import { render } from '@testing-library/react';
import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { ThemeProvider, lightTheme } from '@strapi/design-system';
@ -8,6 +9,7 @@ import { TableList } from '..';
jest.mock('@strapi/helper-plugin', () => ({ jest.mock('@strapi/helper-plugin', () => ({
...jest.requireActual('@strapi/helper-plugin'), ...jest.requireActual('@strapi/helper-plugin'),
useTracking: jest.fn(() => ({ trackUsage: jest.fn() })), useTracking: jest.fn(() => ({ trackUsage: jest.fn() })),
useQueryParams: jest.fn(() => [{ query: {} }]),
})); }));
const PROPS_FIXTURE = { const PROPS_FIXTURE = {
@ -43,11 +45,13 @@ const ComponentFixture = (props) => {
}; };
return ( return (
<MemoryRouter>
<IntlProvider locale="en" messages={{}}> <IntlProvider locale="en" messages={{}}>
<ThemeProvider theme={lightTheme}> <ThemeProvider theme={lightTheme}>
<TableList {...customProps} /> <TableList {...customProps} />
</ThemeProvider> </ThemeProvider>
</IntlProvider> </IntlProvider>
</MemoryRouter>
); );
}; };

View File

@ -1,10 +1,16 @@
import React from 'react'; import React from 'react';
import { IntlProvider } from 'react-intl'; import { IntlProvider } from 'react-intl';
import { MemoryRouter } from 'react-router-dom';
import { render, fireEvent } from '@testing-library/react'; import { render, fireEvent } from '@testing-library/react';
import { ThemeProvider, lightTheme } from '@strapi/design-system'; import { ThemeProvider, lightTheme } from '@strapi/design-system';
import { TableRows } from '../TableRows'; import { TableRows } from '../TableRows';
jest.mock('@strapi/helper-plugin', () => ({
...jest.requireActual('@strapi/helper-plugin'),
useQueryParams: jest.fn(() => [{ query: {} }]),
}));
const PROPS_FIXTURE = { const PROPS_FIXTURE = {
rows: [ rows: [
{ {
@ -46,6 +52,7 @@ const ComponentFixture = (props) => {
}; };
return ( return (
<MemoryRouter>
<IntlProvider locale="en" messages={{}}> <IntlProvider locale="en" messages={{}}>
<ThemeProvider theme={lightTheme}> <ThemeProvider theme={lightTheme}>
<table> <table>
@ -53,6 +60,7 @@ const ComponentFixture = (props) => {
</table> </table>
</ThemeProvider> </ThemeProvider>
</IntlProvider> </IntlProvider>
</MemoryRouter>
); );
}; };
@ -97,7 +105,7 @@ describe('TableList | TableRows', () => {
const onEditAssetSpy = jest.fn(); const onEditAssetSpy = jest.fn();
const { getByRole } = setup({ onEditAsset: onEditAssetSpy }); const { getByRole } = setup({ onEditAsset: onEditAssetSpy });
fireEvent.click(getByRole('button', { name: 'Edit' })); fireEvent.click(getByRole('button', { name: 'Edit', hidden: true }));
expect(onEditAssetSpy).toHaveBeenCalledTimes(1); expect(onEditAssetSpy).toHaveBeenCalledTimes(1);
}); });
@ -119,11 +127,17 @@ describe('TableList | TableRows', () => {
onEditFolder: onEditFolderSpy, onEditFolder: onEditFolderSpy,
}); });
fireEvent.click(getByRole('button', { name: 'Edit' })); fireEvent.click(getByRole('button', { name: 'Edit', hidden: true }));
expect(onEditFolderSpy).toHaveBeenCalledTimes(1); expect(onEditFolderSpy).toHaveBeenCalledTimes(1);
}); });
it('should display folder link', () => {
const { getByRole } = setup({ rows: [FOLDER_FIXTURE] });
expect(getByRole('link', { name: 'Access folder', hidden: true })).toBeInTheDocument();
});
it('should reflect non selected folder state', () => { it('should reflect non selected folder state', () => {
const { getByRole } = setup({ rows: [FOLDER_FIXTURE] }); const { getByRole } = setup({ rows: [FOLDER_FIXTURE] });