From 8c8debee1e577f26557a919b0bf92db0eead0cd5 Mon Sep 17 00:00:00 2001 From: ntsekouras Date: Wed, 18 Oct 2023 14:02:14 +0300 Subject: [PATCH] [Data views]: Refactor to allow the rendering to be generated using a fields description --- .../src/components/dataviews/dataviews.js | 7 +- .../src/components/dataviews/field-types.js | 23 ++++ .../src/components/dataviews/index.js | 1 + .../src/components/dataviews/view-grid.js | 2 +- .../src/components/page-pages/index.js | 126 +++++++++++------- 5 files changed, 110 insertions(+), 49 deletions(-) create mode 100644 packages/edit-site/src/components/dataviews/field-types.js diff --git a/packages/edit-site/src/components/dataviews/dataviews.js b/packages/edit-site/src/components/dataviews/dataviews.js index b488836a91f3e..bd71f1e258feb 100644 --- a/packages/edit-site/src/components/dataviews/dataviews.js +++ b/packages/edit-site/src/components/dataviews/dataviews.js @@ -22,6 +22,7 @@ export default function DataViews( { fields, actions, data, + dataConfig, isLoading = false, paginationInfo, } ) { @@ -29,9 +30,11 @@ export default function DataViews( { const _fields = useMemo( () => { return fields.map( ( field ) => ( { ...field, - render: field.render || field.getValue, + render: + dataConfig[ field.id ]?.view?.( field.getValue ) || + field.getValue, } ) ); - }, [ fields ] ); + }, [ fields, dataConfig ] ); return (
diff --git a/packages/edit-site/src/components/dataviews/field-types.js b/packages/edit-site/src/components/dataviews/field-types.js new file mode 100644 index 0000000000000..0e44d3bd2f8e3 --- /dev/null +++ b/packages/edit-site/src/components/dataviews/field-types.js @@ -0,0 +1,23 @@ +/** + * Internal dependencies + */ +import Media from '../../components/media'; + +export const coreFieldTypes = { + string: { + view: + ( getValue ) => + ( { item } ) => + getValue( { item } ), + }, + date: { + view: ( { item, getValue } ) => , + }, + image: { + view: + ( getValue ) => + ( { item } ) => ( + + ), + }, +}; diff --git a/packages/edit-site/src/components/dataviews/index.js b/packages/edit-site/src/components/dataviews/index.js index 422d128b1461d..371f1713e2d90 100644 --- a/packages/edit-site/src/components/dataviews/index.js +++ b/packages/edit-site/src/components/dataviews/index.js @@ -1 +1,2 @@ export { default as DataViews } from './dataviews'; +export { coreFieldTypes } from './field-types'; diff --git a/packages/edit-site/src/components/dataviews/view-grid.js b/packages/edit-site/src/components/dataviews/view-grid.js index 30a36b68e2c09..85e1a2b27befd 100644 --- a/packages/edit-site/src/components/dataviews/view-grid.js +++ b/packages/edit-site/src/components/dataviews/view-grid.js @@ -20,7 +20,7 @@ export function ViewGrid( { data, fields, view, actions } ) { ); const visibleFields = fields.filter( ( field ) => - ! view.hiddenFields.includes( field.id ) && + ! view.hiddenFields?.includes( field.id ) && field.id !== view.layout.mediaField ); return ( diff --git a/packages/edit-site/src/components/page-pages/index.js b/packages/edit-site/src/components/page-pages/index.js index dc77439217c80..ce84b05a0e8f0 100644 --- a/packages/edit-site/src/components/page-pages/index.js +++ b/packages/edit-site/src/components/page-pages/index.js @@ -16,7 +16,7 @@ import { dateI18n, getDate, getSettings } from '@wordpress/date'; */ import Page from '../page'; import Link from '../routes/link'; -import { DataViews } from '../dataviews'; +import { DataViews, coreFieldTypes } from '../dataviews'; import useTrashPostAction from '../actions/trash-post'; import Media from '../media'; @@ -96,43 +96,12 @@ export default function PagePages() { id: 'featured-image', header: __( 'Featured Image' ), getValue: ( { item } ) => item.featured_media, - render: ( { item, view: currentView } ) => - !! item.featured_media ? ( - - ) : null, enableSorting: false, }, { header: __( 'Title' ), id: 'title', getValue: ( { item } ) => item.title?.rendered || item.slug, - render: ( { item } ) => { - return ( - - - - { decodeEntities( - item.title?.rendered || item.slug - ) || __( '(no title)' ) } - - - - ); - }, filters: [ { id: 'search', type: 'search' } ], maxWidth: 400, sortingFn: 'alphanumeric', @@ -142,14 +111,6 @@ export default function PagePages() { header: __( 'Author' ), id: 'author', getValue: ( { item } ) => item._embedded?.author[ 0 ]?.name, - render: ( { item } ) => { - const author = item._embedded?.author[ 0 ]; - return ( - - { author.name } - - ); - }, filters: [ { id: 'author', type: 'enumeration' } ], elements: [ { @@ -187,17 +148,89 @@ export default function PagePages() { header: __( 'Date' ), id: 'date', getValue: ( { item } ) => item.date, - render: ( { item } ) => { + enableSorting: false, + }, + ], + [ postStatuses, authors ] + ); + + const dataConfig = { + 'featured-image': { + ...coreFieldTypes.image, + view: + ( getValue ) => + ( { item, view: currentView } ) => { + const value = getValue( { item } ); + if ( ! value ) { + return null; + } + return ( + + ); + }, + }, + title: { + ...coreFieldTypes.string, + view: + ( getValue ) => + ( { item } ) => { + return ( + + + + { decodeEntities( getValue( { item } ) ) || + __( '(no title)' ) } + + + + ); + }, + }, + // For now we treat author as a string, but we should have a way + // to create a relation field type. + author: { + ...coreFieldTypes.string, + view: + ( getValue ) => + ( { item } ) => { + const author = item._embedded?.author[ 0 ]; + return ( + + { getValue( { item } ) } + + ); + }, + }, + status: { + ...coreFieldTypes.string, + }, + date: { + ...coreFieldTypes.date, + view: + ( getValue ) => + ( { item } ) => { const formattedDate = dateI18n( getSettings().formats.datetimeAbbreviated, - getDate( item.date ) + getDate( getValue( { item } ) ) ); return ; }, - }, - ], - [ postStatuses, authors ] - ); + }, + }; const trashPostAction = useTrashPostAction(); const actions = useMemo( () => [ trashPostAction ], [ trashPostAction ] ); @@ -229,6 +262,7 @@ export default function PagePages() { fields={ fields } actions={ actions } data={ pages || EMPTY_ARRAY } + dataConfig={ dataConfig } isLoading={ isLoadingPages } view={ view } onChangeView={ onChangeView }