design-comuni-plone-theme
Version:
Volto Theme for Italia design guidelines
139 lines (132 loc) • 4.15 kB
JSX
/*
* Gallery a griglia
*/
import { Alert, Col, Container, Row } from 'design-react-kit';
import {
ListingImage,
ListingLinkMore,
} from 'design-comuni-plone-theme/components/ItaliaTheme';
import { defineMessages, useIntl } from 'react-intl';
import { contentHasImage } from 'design-comuni-plone-theme/helpers';
import PropTypes from 'prop-types';
import React from 'react';
import { UniversalLink } from '@plone/volto/components';
import cx from 'classnames';
import { flattenToAppURL } from '@plone/volto/helpers';
import { getVariationPropsDefaults } from 'design-comuni-plone-theme/config/Blocks/ListingOptions/utils';
const messages = defineMessages({
maxItemsExceeded: {
id: 'grid-gallery-max-items-exceeded',
defaultMessage:
'Per questo template il numero di risultati per pagina deve essere 7. Controlla le impostazioni.',
},
});
const GridGalleryTemplate = (props) => {
const defaultVariationProps = getVariationPropsDefaults(
'gridGalleryTemplate',
);
const {
items,
isEditMode,
title,
titleLine,
linkAlign,
linkTitle,
linkHref,
show_block_bg,
critical = false,
linkmore_id_lighthouse,
wrap_title = defaultVariationProps.wrap_title,
} = props;
const intl = useIntl();
return (
<div className="grid-gallery-template">
<Container className="px-4 pt-3">
{title && (
<Row>
<Col>
<h2 className={cx('mb-4', { 'title-bottom-line': titleLine })}>
{title}
</h2>
</Col>
</Row>
)}
{isEditMode && items.length > 7 && (
<Alert color="danger">
{intl.formatMessage(messages.maxItemsExceeded)}
</Alert>
)}
<div className="grid-gallery-grid my-3 pb-3">
{items.map((item, index) => {
let image = ListingImage({
item,
className: '',
});
let scale = null;
let hasImage = contentHasImage(item);
if (index % 7 === 0 || index % 7 === 6 || index % 7 === 3) {
scale = 'great';
}
if (index % 7 === 1 || index % 7 === 5) {
scale = 'teaser';
}
if (index % 7 === 2 || index % 7 === 4) {
scale = 'large';
}
if (scale && item?.image?.scales?.[scale]) {
image = (
<img
src={flattenToAppURL(item.image.scales[scale].download)}
width={item.image.scales[scale].width}
height={item.image.scales[scale].height}
alt=""
role="presentation"
aria-hidden="true"
title={item.title}
loading={critical ? 'eager' : 'lazy'}
/>
);
hasImage = true;
}
return (
<div
key={item['@id'] ?? index}
className={cx('grid-gallery-item', `item-${index % 7}`)}
>
<UniversalLink
item={!isEditMode ? item : null}
href={isEditMode ? '#' : null}
>
{hasImage && (
<picture className="volto-image responsive">
{image}
</picture>
)}
<h3 className={cx({ 'wrap-title': wrap_title })}>
{item.title}
</h3>
</UniversalLink>
</div>
);
})}
</div>
<ListingLinkMore
title={linkTitle}
href={linkHref}
linkAlign={linkAlign}
className="my-5"
linkmoreIdLighthouse={linkmore_id_lighthouse}
/>
</Container>
</div>
);
};
GridGalleryTemplate.propTypes = {
items: PropTypes.arrayOf(PropTypes.any).isRequired,
linkTitle: PropTypes.any,
linkHref: PropTypes.any,
isEditMode: PropTypes.bool,
title: PropTypes.string,
critical: PropTypes.bool,
};
export default GridGalleryTemplate;