diff --git a/packages/core/upload/admin/src/components/TableList/PreviewCell.js b/packages/core/upload/admin/src/components/TableList/PreviewCell.js index 55e24b662d..6f3823d95a 100644 --- a/packages/core/upload/admin/src/components/TableList/PreviewCell.js +++ b/packages/core/upload/admin/src/components/TableList/PreviewCell.js @@ -54,7 +54,7 @@ export const PreviewCell = ({ alternativeText, fileExtension, mime, thumbnailURL PreviewCell.defaultProps = { alternativeText: null, fileExtension: '', - mime: null, + mime: '', thumbnailURL: null, url: null, }; diff --git a/packages/core/upload/admin/src/components/TableList/TableRows.js b/packages/core/upload/admin/src/components/TableList/TableRows.js index 7d1af7b192..9340e8f2ba 100644 --- a/packages/core/upload/admin/src/components/TableList/TableRows.js +++ b/packages/core/upload/admin/src/components/TableList/TableRows.js @@ -5,10 +5,10 @@ import { getFileExtension } from '@strapi/helper-plugin'; import { BaseCheckbox } from '@strapi/design-system/BaseCheckbox'; import { IconButton } from '@strapi/design-system/IconButton'; import { Tbody, Td, Tr } from '@strapi/design-system/Table'; -import { Typography } from '@strapi/design-system/Typography'; import Pencil from '@strapi/icons/Pencil'; import { PreviewCell } from './PreviewCell'; +import { TextCell } from './TextCell'; import { AssetDefinition, FolderDefinition } from '../../constants'; import { formatBytes, getTrad } from '../../utils'; @@ -30,7 +30,7 @@ export const TableRows = ({ onEditAsset, onEditFolder, onSelectOne, rows, select mime, formats, type, - } = element || {}; + } = element; const isSelected = !!selected.find((currentRow) => currentRow.id === id); @@ -61,19 +61,19 @@ export const TableRows = ({ onEditAsset, onEditFolder, onSelectOne, rows, select /> - {name} + - {ext ? getFileExtension(ext).toUpperCase() : '-'} + - {size ? formatBytes(size) : '-'} + - {formatDate(new Date(createdAt))} + - {formatDate(new Date(updatedAt))} + {((type === 'asset' && onEditAsset) || (type === 'folder' && onEditFolder)) && ( @@ -99,11 +99,12 @@ export const TableRows = ({ onEditAsset, onEditFolder, onSelectOne, rows, select TableRows.defaultProps = { onEditAsset: null, onEditFolder: null, + rows: [], selected: [], }; TableRows.propTypes = { - rows: PropTypes.arrayOf(AssetDefinition, FolderDefinition).isRequired, + rows: PropTypes.arrayOf(AssetDefinition, FolderDefinition), onEditAsset: PropTypes.func, onEditFolder: PropTypes.func, onSelectOne: PropTypes.func.isRequired, diff --git a/packages/core/upload/admin/src/components/TableList/TextCell.js b/packages/core/upload/admin/src/components/TableList/TextCell.js new file mode 100644 index 0000000000..1e48eebf6a --- /dev/null +++ b/packages/core/upload/admin/src/components/TableList/TextCell.js @@ -0,0 +1,19 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { Typography } from '@strapi/design-system/Typography'; + +export const TextCell = ({ content }) => { + if (content) { + return {content}; + } + + return -; +}; + +TextCell.defaultProps = { + content: '', +}; + +TextCell.propTypes = { + content: PropTypes.string, +}; diff --git a/packages/core/upload/admin/src/components/TableList/index.js b/packages/core/upload/admin/src/components/TableList/index.js index 4fb3527699..69a2ef799a 100644 --- a/packages/core/upload/admin/src/components/TableList/index.js +++ b/packages/core/upload/admin/src/components/TableList/index.js @@ -14,6 +14,7 @@ import { TableRows } from './TableRows'; export const TableList = ({ assetCount, folderCount, + indeterminate, onEditAsset, onEditFolder, onSelectAll, @@ -34,7 +35,7 @@ export const TableList = ({ id: getTrad('bulk.select.label'), defaultMessage: 'Select all folders & assets', })} - indeterminate={selected?.length > 0 && selected?.length !== assetCount + folderCount} + indeterminate={indeterminate} onChange={(e) => { if (e.target.checked) { trackUsage('didSelectAllMediaLibraryElements'); @@ -79,6 +80,7 @@ export const TableList = ({ TableList.defaultProps = { assetCount: 0, folderCount: 0, + indeterminate: false, onEditAsset: null, onEditFolder: null, rows: [], @@ -88,6 +90,7 @@ TableList.defaultProps = { TableList.propTypes = { assetCount: PropTypes.number, folderCount: PropTypes.number, + indeterminate: PropTypes.bool, onEditAsset: PropTypes.func, onEditFolder: PropTypes.func, onSelectAll: PropTypes.func.isRequired, diff --git a/packages/core/upload/admin/src/components/TableList/tests/PreviewCell.test.js b/packages/core/upload/admin/src/components/TableList/tests/PreviewCell.test.js index 9a71db1d81..a41e2e6aca 100644 --- a/packages/core/upload/admin/src/components/TableList/tests/PreviewCell.test.js +++ b/packages/core/upload/admin/src/components/TableList/tests/PreviewCell.test.js @@ -29,7 +29,7 @@ const ComponentFixture = (props) => { const setup = (props) => render(); -describe('AssetTableList | PreviewCell', () => { +describe('TableList | PreviewCell', () => { describe('rendering images', () => { it('should render an image with thumbnail if available', () => { const { getByRole } = setup(); diff --git a/packages/core/upload/admin/src/components/TableList/tests/TableRows.test.js b/packages/core/upload/admin/src/components/TableList/tests/TableRows.test.js index 718e481fc5..51d433aed6 100644 --- a/packages/core/upload/admin/src/components/TableList/tests/TableRows.test.js +++ b/packages/core/upload/admin/src/components/TableList/tests/TableRows.test.js @@ -58,7 +58,7 @@ const ComponentFixture = (props) => { const setup = (props) => render(); -describe('AssetTableList | TableRows', () => { +describe('TableList | TableRows', () => { describe('rendering assets', () => { it('should properly render every asset attribute', () => { const { getByRole, getByText } = setup(); diff --git a/packages/core/upload/admin/src/components/TableList/tests/TextCell.test.js b/packages/core/upload/admin/src/components/TableList/tests/TextCell.test.js new file mode 100644 index 0000000000..77a524516f --- /dev/null +++ b/packages/core/upload/admin/src/components/TableList/tests/TextCell.test.js @@ -0,0 +1,27 @@ +import React from 'react'; +import { render } from '@testing-library/react'; +import { ThemeProvider, lightTheme } from '@strapi/design-system'; + +import { TextCell } from '../TextCell'; + +const ComponentFixture = (props) => ( + + + +); + +const setup = (props) => render(); + +describe('TableList | TextCell', () => { + it('should render content', () => { + const { getByText } = setup({ content: 'michka' }); + + expect(getByText('michka')).toBeInTheDocument(); + }); + + it('should render a default content', () => { + const { getByText } = setup(); + + expect(getByText('-')).toBeInTheDocument(); + }); +}); diff --git a/packages/core/upload/admin/src/pages/App/MediaLibrary.js b/packages/core/upload/admin/src/pages/App/MediaLibrary.js index b0bda36971..b192b64a2a 100644 --- a/packages/core/upload/admin/src/pages/App/MediaLibrary.js +++ b/packages/core/upload/admin/src/pages/App/MediaLibrary.js @@ -86,7 +86,7 @@ export const MediaLibrary = () => { }); const { - data: folders, + data: foldersData, isLoading: foldersLoading, errors: foldersError, } = useFolders({ @@ -107,8 +107,9 @@ export const MediaLibrary = () => { push(pathname); } + const folders = foldersData ?? []; const folderCount = folders?.length || 0; - const assets = assetsData?.results; + const assets = assetsData?.results || []; const assetCount = assets?.length ?? 0; const isLoading = isCurrentFolderLoading || foldersLoading || permissionsLoading || assetsLoading; const [showUploadAssetDialog, setShowUploadAssetDialog] = useState(false); @@ -116,6 +117,8 @@ export const MediaLibrary = () => { const [assetToEdit, setAssetToEdit] = useState(undefined); const [folderToEdit, setFolderToEdit] = useState(undefined); const [selected, { selectOne, selectAll }] = useSelectionState(['type', 'id'], []); + const indeterminateBulkSelect = + selected?.length > 0 && selected?.length !== assetCount + folderCount; const toggleUploadAssetDialog = () => setShowUploadAssetDialog((prev) => !prev); const toggleEditFolderDialog = ({ created = false } = {}) => { // folders are only displayed on the first page, therefore @@ -183,9 +186,7 @@ export const MediaLibrary = () => { id: getTrad('bulk.select.label'), defaultMessage: 'Select all folders & assets', })} - indeterminate={ - selected?.length > 0 && selected?.length !== assetCount + folderCount - } + indeterminate={indeterminateBulkSelect} value={ (assetCount > 0 || folderCount > 0) && selected.length === assetCount + folderCount @@ -196,9 +197,7 @@ export const MediaLibrary = () => { } selectAll([ ...assets.map((asset) => ({ ...asset, type: 'asset' })), - ...(folders - ? folders.map((folder) => ({ ...folder, type: 'folder' })) - : []), + ...folders.map((folder) => ({ ...folder, type: 'folder' })), ]); }} /> @@ -243,14 +242,22 @@ export const MediaLibrary = () => { ({ ...folder, type: 'folder' })) : []), - ...(assets ? assets.map((asset) => ({ ...asset, type: 'asset' })) : []), - ]} + rows={ + // TODO: remove when fixed on DS side + // when number of rows in Table changes, the keyboard tab from a row to another + // is not working for 1st and last column + !assetsLoading && !foldersLoading + ? [ + ...folders.map((folder) => ({ ...folder, type: 'folder' })), + ...assets.map((asset) => ({ ...asset, type: 'asset' })), + ] + : [] + } selected={selected} /> )}