UNPKG

design-comuni-plone-theme

Version:
181 lines (168 loc) 5.93 kB
import React from 'react'; import PropTypes from 'prop-types'; import { Link } from 'react-router-dom'; import { defineMessages, useIntl } from 'react-intl'; import { Container, Row, Col } from 'design-react-kit'; import { flattenToAppURL } from '@plone/volto/helpers'; import { Icon } from 'design-comuni-plone-theme/components/ItaliaTheme'; import { GenericCard } from 'design-comuni-plone-theme/components/ItaliaTheme/View'; const SITE_SECTIONS = { amministrazione: { icon: 'it-pa' }, novita: { icon: 'it-calendar' }, servizi: { icon: 'it-settings' }, 'documenti-e-dati': { icon: 'it-file' }, }; const messages = defineMessages({ related_items: { id: 'related_items', defaultMessage: 'Contenuti correlati', }, amministrazione: { id: 'amministrazione', defaultMessage: 'Amministrazione', }, servizi: { id: 'servizi', defaultMessage: 'Servizi', }, novita: { id: 'novita', defaultMessage: 'Novità', }, 'documenti-e-dati': { id: 'documenti-e-dati', defaultMessage: 'Documenti e dati', }, }); /** * RelatedItems view component class. * @function RelatedItems * @params {object} location: object. * @returns {string} Markup of the component. */ const RelatedItems = ({ content, list = [], children, view_sections = false, }) => { const intl = useIntl(); let sections = {}; const related_items_content = content?.relatedItems?.length > 0 ? [...content.relatedItems] : []; let related = [...related_items_content, ...list]; if (related?.length > 0) { related.forEach((item) => { let itemSection = flattenToAppURL(item['@id']).split('/')[1]; if (Object.keys(SITE_SECTIONS).indexOf(itemSection) >= 0) { if (!sections[itemSection]) { sections[itemSection] = []; } sections[itemSection].push(item); } }); } return related?.length > 0 || children ? ( <section id="contenuti-correlati" role="complementary" aria-label={intl.formatMessage(messages.related_items)} > <section className="section section-muted section-inset-shadow"> <div className="section-content"> <Container> {/*----------------vista per sezioni----------------*/} {view_sections && ( <> {Object.keys(sections).length > 0 && ( <> <Row> <Col className="text-center"> <h2 className="h3"> {intl.formatMessage(messages.related_items)} ??? </h2> </Col> </Row> <Row className="mt-lg-4"> <Col> <div className="card-wrapper card-teaser-wrapper card-teaser-wrapper-equal card-teaser-block-4"> {Object.keys(sections).map((sectionId, i) => ( <div className="card card-teaser card-column shadow my-3 rounded" key={i} > <div className="card-header"> <Icon icon={SITE_SECTIONS[sectionId].icon} /> <div className="card-title h5"> {intl.formatMessage(messages[sectionId])} </div> </div> <div className="card-body"> <div className="link-list-wrapper mt-3"> <ul className="link-list"> {sections[sectionId].map((item, i) => ( <li key={i}> <Link to={flattenToAppURL(item['@id'])} className="list-item" > <span>{item.title}</span> </Link> </li> ))} </ul> </div> </div> </div> ))} </div> </Col> </Row> </> )} </> )} {/*----------------vista per singoli elementi----------------*/} {!view_sections && related?.length > 0 && ( <> <Row> <Col className="text-center"> <h2 className="h3"> {intl.formatMessage(messages.related_items)} </h2> </Col> </Row> <Row className="mt-lg-4"> {related.map((item, i) => ( <Col md={4} key={item['@id'] + i} className="mb-3"> <div className="card-wrapper"> <GenericCard key={i} index={item['@id']} item={item} showimage={true} showInfos={true} /> </div> </Col> ))} </Row> </> )} {children} </Container> </div> </section> </section> ) : null; }; export default RelatedItems; RelatedItems.propTypes = { content: PropTypes.shape({ '@id': PropTypes.string, '@type': PropTypes.string, title: PropTypes.string, relatedItems: PropTypes.array, }), children: PropTypes.any, };