UNPKG

@plone/volto

Version:
63 lines (57 loc) 1.69 kB
/** * View toc block. * @module components/manage/Blocks/ToC/View */ import PropTypes from 'prop-types'; import map from 'lodash/map'; import { List } from 'semantic-ui-react'; import Slugger from 'github-slugger'; import UniversalLink from '@plone/volto/components/manage/UniversalLink/UniversalLink'; import { normalizeString } from '@plone/volto/helpers/Utils/Utils'; const RenderListItems = ({ items, data }) => { return map(items, (item) => { const { id, level, title, override_toc, plaintext } = item; const slug = override_toc ? Slugger.slug(normalizeString(plaintext)) : Slugger.slug(normalizeString(title)) || id; return ( item && ( <List.Item key={id} className={`item headline-${level}`} as="li"> <UniversalLink href={`#${slug}`}>{title}</UniversalLink> {item.items?.length > 0 && ( <List ordered={data.ordered} bulleted={!data.ordered} as={data.ordered ? 'ol' : 'ul'} > <RenderListItems items={item.items} data={data} /> </List> )} </List.Item> ) ); }); }; const View = ({ data, tocEntries }) => { return ( <> {data.title && !data.hide_title ? <h2>{data.title}</h2> : ''} <List ordered={data.ordered} bulleted={!data.ordered} as={data.ordered ? 'ol' : 'ul'} > <RenderListItems items={tocEntries} data={data} /> </List> </> ); }; /** * Property types. * @property {Object} propTypes Property types. * @static */ View.propTypes = { properties: PropTypes.objectOf(PropTypes.any).isRequired, }; export default View;