@@ -2,6 +2,7 @@ import * as React from 'react';
22import ConditionalLink from '@plone/volto/components/manage/ConditionalLink/ConditionalLink' ;
33import cx from 'classnames' ;
44import type { ObjectBrowserItem } from '@plone/types' ;
5+ import defaultPlaceholderSVG from '@plone/volto/components/manage/Blocks/Listing/default-image.svg' ;
56
67type BaseCardProps = {
78 /** Optional additional CSS class names to apply to the card. */
@@ -93,33 +94,49 @@ type CardImageProps = {
9394 /** A custom React component to render the image. */
9495 imageComponent ?: React . ComponentType < any > ;
9596 children ?: React . ReactNode ;
97+ /** Show a placeholder image when the item has no image of its own. */
9698 showPlaceholderImage ?: boolean ;
99+ /**
100+ * Optional custom image configurable per content type at config.settings.placeholderImages.[type]. Falls back to the default placeholder image.
101+ */
102+ placeholderSrc ?: string ;
97103 sizes ?: string ;
98104} ;
99105
100106const CardImage = ( props : CardImageProps ) => {
101- const { src, item, image, imageComponent, showPlaceholderImage, sizes } =
102- props ;
107+ const {
108+ src,
109+ item,
110+ image,
111+ imageComponent,
112+ showPlaceholderImage,
113+ placeholderSrc,
114+ sizes,
115+ } = props ;
103116 const Image = imageComponent || DefaultImage ;
117+ const imageField = image ? image . image_field : item ?. image_field ;
118+ const hasItemImage = item ?. hasPreviewImage || imageField || image ;
104119
105120 return (
106121 < div className = "image-wrapper" >
107122 { src ? (
108123 < Image src = { src } alt = "" loading = "lazy" responsive = { true } />
109- ) : item || image ? (
110- ( item ?. hasPreviewImage ||
111- item ?. image_field ||
112- image ||
113- showPlaceholderImage ) && (
114- < Image
115- item = { image || item }
116- imageField = { image ? image . image_field : item ?. image_field }
117- alt = ""
118- loading = "lazy"
119- responsive = { true }
120- sizes = { sizes }
121- />
122- )
124+ ) : showPlaceholderImage && ! hasItemImage ? (
125+ < DefaultImage
126+ src = { placeholderSrc || defaultPlaceholderSVG }
127+ alt = ""
128+ loading = "lazy"
129+ responsive = { true }
130+ />
131+ ) : hasItemImage ? (
132+ < Image
133+ item = { image || item }
134+ imageField = { imageField }
135+ alt = ""
136+ loading = "lazy"
137+ responsive = { true }
138+ sizes = { sizes }
139+ />
123140 ) : (
124141 props . children
125142 ) }
0 commit comments