@eeacms/volto-accordion-block
Version:
volto-accordion-block: Volto accordion block
63 lines (53 loc) • 1.66 kB
JavaScript
import { v4 as uuid } from 'uuid';
import { map } from 'lodash';
import { Icon as VoltoIcon } from '@plone/volto/components';
import { Icon as SemanticIcon } from 'semantic-ui-react';
import {
getBlocksFieldname,
getBlocksLayoutFieldname,
blockHasValue,
emptyBlocksForm,
} from '@plone/volto/helpers';
export const emptyAccordion = (count) => {
const blocks = {};
const items = [];
for (let x = 0; x < count; x++) {
const id = uuid();
blocks[id] = emptyBlocksForm();
items.push(id);
}
return {
blocks,
blocks_layout: {
items,
},
};
};
export const getPanels = (data) => {
return (data?.blocks_layout?.items || []).map((id) => [
id,
data.blocks?.[id],
]);
};
export const accordionBlockHasValue = (content) => {
const blocksFieldname = getBlocksFieldname(content);
const blocksLayoutFieldname = getBlocksLayoutFieldname(content);
const blockValue = map(content[blocksLayoutFieldname].items, (block) => {
const blockData = content[blocksFieldname]?.[block];
return blockHasValue(blockData);
});
if (content.hasOwnProperty('title') && content?.title.length > 0) return true;
return blockValue.some((item) => item === true);
};
export const Icon = (props) => {
const { name, options, ...rest } = props;
const componentToRender = options.iconComponent;
// Map component names to their actual components
const componentMap = {
SemanticIcon,
VoltoIcon,
};
// Get the component from the map based on the configuration
const IconComponent = componentMap[componentToRender] || VoltoIcon;
return <IconComponent size={options.size} name={name} {...rest} />;
};