@plone/volto
Version:
Volto
63 lines (57 loc) • 1.69 kB
JSX
/**
* 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;