UNPKG

@plone/volto

Version:
79 lines (73 loc) 2.45 kB
import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; import { Container, Segment, Grid, Label } from 'semantic-ui-react'; import ErrorBoundary from '@plone/volto/components/theme/Error/ErrorBoundary'; import { getWidget } from '@plone/volto/helpers/Widget/utils'; import config from '@plone/volto/registry'; const messages = defineMessages({ unknownBlock: { id: 'Unknown Block', defaultMessage: 'Unknown Block {block}', }, invalidBlock: { id: 'Invalid Block', defaultMessage: 'Invalid block - Will be removed on saving', }, }); const DefaultBlockView = (props) => { const { data, block } = props; const intl = useIntl(); const { views } = config.widgets; const { blocksConfig = config.blocks.blocksConfig } = props; if (!data) return <div key={block}>{intl.formatMessage(messages.invalidBlock)}</div>; // Compatibility with RenderBlocks non-view const blockSchema = blocksConfig?.[data['@type']]?.blockSchema; const schema = typeof blockSchema === 'function' ? blockSchema({ ...props, intl }) : blockSchema; const fieldsets = schema?.fieldsets || []; return schema ? ( <Container className="page-block"> {fieldsets?.map((fs) => { return ( <div className="fieldset" key={fs.id}> {fs.id !== 'default' && <h2>{fs.title}</h2>} {fs.fields?.map((f, key) => { let field = { ...schema?.properties[f], id: f, widget: getWidget(f, schema?.properties[f]), }; let Widget = views?.getWidget(field); return f !== 'title' ? ( <Grid celled="internally" key={key}> <Grid.Row> <Label>{field.title}:</Label> </Grid.Row> <Grid.Row> <Segment basic> <ErrorBoundary name={f}> <Widget value={data[f]} /> </ErrorBoundary> </Segment> </Grid.Row> </Grid> ) : ( <Widget key={key} value={data[f]} /> ); })} </div> ); })} </Container> ) : ( <div key={block}> {intl.formatMessage(messages.unknownBlock, { block: data['@type'], })} </div> ); }; export default DefaultBlockView;