UNPKG

volto-advanced-variations

Version:
163 lines (154 loc) 5.01 kB
import React, { useMemo } from 'react'; import PropTypes from 'prop-types'; // Import PropTypes import { Link } from 'react-router-dom'; import { flattenToAppURL } from '@plone/volto/helpers'; import { isInternalURL } from '@plone/volto/helpers/Url/Url'; import CommonItemRenderer from './CommonItemRenderer'; import processItemsForRecurrence from './processItemsForRecurrence'; import './Advanced.css'; // Import the CSS file import { FadeInSection } from './sharedUtils'; const AdvancedListingBlockTemplate = ({ items, moreLinkText, moreLinkUrl, header, headerUrl, headerTag: HeaderTag = 'h2', // Default to <h2> if headerTag is not provided isEditMode, imageSide, imageWidth, howManyColumns, effectiveDate, expirationDate, titleTag, showDescription, eventDate, eventLocation, eventTime, showTitle, eventCard, quote, showRecurrence, fetchPriority, creatorauthor, readMore, enableAnimation, }) => { // Preprocess items for recurrence const processedItems = useMemo(() => { return showRecurrence ? processItemsForRecurrence(items) : items.map(item => ({ ...item, url: flattenToAppURL(item['@id']), })); }, [items, showRecurrence]); const getLink = (url, text) => { if (!url) return null; return isInternalURL(url) ? ( <Link to={flattenToAppURL(url)}>{text || url}</Link> ) : ( <a href={url} target='_blank' rel='noopener noreferrer'> {text || url} </a> ); }; const moreLink = getLink(moreLinkUrl?.[0]?.['@id'], moreLinkText); const headerLink = getLink(headerUrl?.[0]?.['@id'], header); const columnClassMap = { 1: 'twelve', 2: 'six', 3: 'four', 4: 'three', }; const columns = howManyColumns || 3; return ( <div className='ui twelve column grid column-grid'> {headerLink && <HeaderTag className='listing-header'>{headerLink}</HeaderTag>} {processedItems.map((item, index) => ( <div className={`${columnClassMap[howManyColumns] || 'four'} wide computer twelve wide mobile ${columnClassMap[howManyColumns] || 'four' } wide tablet column column-blocks-wrapper`} key={item['@id']} > {enableAnimation ? ( <FadeInSection delay={(index % columns) * 100}> <CommonItemRenderer items={[item]} showRecurrence={showRecurrence} quote={quote} showTitle={showTitle} eventCard={eventCard} titleTag={titleTag} eventDate={eventDate} eventTime={eventTime} eventLocation={eventLocation} showDescription={showDescription} effectiveDate={effectiveDate} expirationDate={expirationDate} isEditMode={isEditMode} imageSide={imageSide} imageWidth={imageWidth} howManyColumns={howManyColumns} fetchPriority={fetchPriority} creatorauthor={creatorauthor} readMore={readMore} /> </FadeInSection> ) : ( <CommonItemRenderer items={[item]} showRecurrence={showRecurrence} quote={quote} showTitle={showTitle} eventCard={eventCard} titleTag={titleTag} eventDate={eventDate} eventTime={eventTime} eventLocation={eventLocation} showDescription={showDescription} effectiveDate={effectiveDate} expirationDate={expirationDate} isEditMode={isEditMode} imageSide={imageSide} imageWidth={imageWidth} howManyColumns={howManyColumns} fetchPriority={fetchPriority} creatorauthor={creatorauthor} readMore={readMore} /> )} </div> ))} {moreLink && <div className='more-link'>{moreLink}</div>} </div> ); }; AdvancedListingBlockTemplate.propTypes = { items: PropTypes.arrayOf(PropTypes.object).isRequired, moreLinkText: PropTypes.string, moreLinkUrl: PropTypes.array, header: PropTypes.string, headerUrl: PropTypes.array, headerTag: PropTypes.string, isEditMode: PropTypes.bool, imageSide: PropTypes.string, imageWidth: PropTypes.number, howManyColumns: PropTypes.number, effectiveDate: PropTypes.bool, expirationDate: PropTypes.bool, titleTag: PropTypes.string, showDescription: PropTypes.bool, eventDate: PropTypes.bool, eventLocation: PropTypes.bool, eventTime: PropTypes.bool, showTitle: PropTypes.bool, eventCard: PropTypes.bool, quote: PropTypes.bool, showRecurrence: PropTypes.bool, fetchPriority: PropTypes.string, creatorauthor: PropTypes.bool, readMore: PropTypes.bool, enableAnimation: PropTypes.bool, }; export default React.memo(AdvancedListingBlockTemplate);