UNPKG

design-comuni-plone-theme

Version:
148 lines (139 loc) 4.15 kB
/** * DocRow view component. * @module components/theme/View/DocRow */ import React, { useState } from 'react'; import { UniversalLink } from '@plone/volto/components'; import { flattenToAppURL } from '@plone/volto/helpers'; import { DownloadFileFormat } from 'design-comuni-plone-theme/components/ItaliaTheme/View'; import { FontAwesomeIcon } from 'design-comuni-plone-theme/components/ItaliaTheme'; import { Icon } from 'design-comuni-plone-theme/components/ItaliaTheme'; import cx from 'classnames'; /** * DocRow view component class. * @function DocRow * @params {object} content Content object. * @returns {string} Markup of the component. */ const Downloads = ({ item, titleDoc }) => { return item['@type'] === 'Modulo' ? ( <React.Fragment> {!titleDoc ? ( <div className="title">{item.title}</div> ) : ( titleDoc !== item.title && <div className="title">{item.title}</div> )} <div className="downloads"> <DownloadFileFormat file={item?.file_principale} title={item.title} /> <DownloadFileFormat file={item?.formato_alternativo_1} title={item.title} /> <DownloadFileFormat file={item?.formato_alternativo_2} title={item.title} /> </div> </React.Fragment> ) : ( <UniversalLink href={item.remoteUrl || flattenToAppURL(item['@id'])} title={item.title} className="modulistica-link" item={item} > <div className="title">{item.title}</div> <FontAwesomeIcon icon={['fas', 'link']} alt={item.title} role="presentation" aria-hidden={true} /> </UniversalLink> ); }; const DocRow = ({ doc }) => { const [itemOpen, setItemOpen] = useState(false); const titleWrapper = ( <div className={cx('title-wrap', { 'single-row': doc.items?.length === 1, })} > <div id={`title-${doc.id}`} className="title"> <UniversalLink href={doc.remoteUrl || flattenToAppURL(doc['@id'])} item={doc} > {doc.title} </UniversalLink> {doc?.description && ( <p className="description text-muted">{doc.description}</p> )} </div> </div> ); return ( <div className={cx('doc-row', { 'has-children': doc.items?.length > 1, })} key={doc['@id']} > {/*Only title and/or description, no files */} {!doc.items && <div className="doc">{titleWrapper}</div>} {/*Single file*/} {doc.items?.length === 1 && ( <div className={cx('doc', { 'link-to-doc': doc.items[0]?.['@type'] === 'Link', })} > {titleWrapper} {doc.items?.length === 1 && ( <Downloads item={doc.items[0]} titleDoc={doc.title} /> )} </div> )} {/*Accordion*/} {doc.items?.length > 1 && ( <> <div className="accordion-wrapper"> <div id="headingAccordion" className="accordion-header doc"> {titleWrapper} </div> <button onClick={() => { setItemOpen(itemOpen ? false : true); }} aria-expanded={itemOpen} aria-controls="collapsedContent" aria-labelledby={`title-${doc.id}`} > <Icon color="primary" icon={itemOpen ? 'it-minus' : 'it-plus'} padding={false} /> </button> </div> <div id="collapsedContent" className={cx('accordion-content', { open: itemOpen })} role="region" aria-labelledby="headingAccordion" > <div className="accordion-inner"> {doc.items.map((modulo) => ( <div className="doc modulo" key={modulo['@id']}> <Downloads item={modulo} titleDoc={null} /> </div> ))} </div> </div> </> )} </div> ); }; export default DocRow;