Skip to content

Instantly share code, notes, and snippets.

@pigeonflight
Last active January 17, 2022 07:09
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pigeonflight/681e66da0de7c2c4f5fe237f9adc7bdc to your computer and use it in GitHub Desktop.
Save pigeonflight/681e66da0de7c2c4f5fe237f9adc7bdc to your computer and use it in GitHub Desktop.
example of relatedItems on an EventView

This is an event view with relatedItems. To make use of this view in your volto project register it in the src/config.js like this:

...
import EventView from './components/Views/EventView';

export default function applyConfig(config) {
  
  config.views.contentTypesViews.Event = EventView;
  return config;
}
/**
* EventView view component.
* @module components/theme/View/EventView
*/
import React from 'react';
import PropTypes from 'prop-types';
import { defineMessages, injectIntl } from 'react-intl';
import { flattenHTMLToAppURL } from '@plone/volto/helpers';
import { Container, Image, Segment, Header, List } from 'semantic-ui-react';
import {
When,
Recurrence,
} from '@plone/volto/components/theme/View/EventDatesInfo';
const messages = defineMessages({
what: {
id: 'event_what',
defaultMessage: 'What',
},
when: {
id: 'event_when',
defaultMessage: 'When',
},
allDates: {
id: 'event_alldates',
defaultMessage: 'All dates',
},
where: {
id: 'event_where',
defaultMessage: 'Where',
},
contactName: {
id: 'event_contactname',
defaultMessage: 'Contact Name',
},
contactPhone: {
id: 'event_contactphone',
defaultMessage: 'Contact Phone',
},
attendees: {
id: 'event_attendees',
defaultMessage: 'Attendees',
},
website: {
id: 'event_website',
defaultMessage: 'Website',
},
visitWebsite: {
id: 'visit_external_website',
defaultMessage: 'Visit external website',
},
});
/**
* EventView view component class.
* @function EventView
* @params {object} content Content object.
* @returns {string} Markup of the component.
*/
const EventView = ({ intl, content }) => (
<Container className="view-wrapper event-view">
{content.title && <h1 className="documentFirstHeading">I'm the event view{content.title}</h1>}
{content.description && (
<p className="documentDescription"> {content.description}</p>
)}
{content.relatedItems &&
<>
<h3>Related Items</h3><ul>
{content.relatedItems.map(item => (
<li key={item['@id']}>{item.title}</li>
))} </ul>
</>}
{content.image && (
<Image
className="document-image"
src={content.image.scales.thumb.download}
floated="right"
/>
)}
<Segment floated="right">
{content.subjects.length > 0 && (
<>
<Header dividing sub>
{intl.formatMessage(messages.what)}
</Header>
<List items={content.subjects} />
</>
)}
<Header dividing sub>
{intl.formatMessage(messages.when)}
</Header>
<When
start={content.start}
end={content.end}
whole_day={content.whole_day}
open_end={content.open_end}
/>
{content.recurrence && (
<>
<Header dividing sub>
{intl.formatMessage(messages.allDates)}
</Header>
<Recurrence recurrence={content.recurrence} start={content.start} />
</>
)}
{content.location && (
<>
<Header dividing sub>
{intl.formatMessage(messages.where)}
</Header>
<p>{content.location}</p>
</>
)}
{content.contact_name && (
<>
<Header dividing sub>
{intl.formatMessage(messages.contactName)}
</Header>
<p>
{content.contact_email ? (
<a href={`mailto:${content.contact_email}`}>
{content.contact_name}
</a>
) : (
content.contact_name
)}
</p>
</>
)}
{content.contact_phone && (
<>
<Header dividing sub>
{intl.formatMessage(messages.contactPhone)}
</Header>
<p>{content.contact_phone}</p>
</>
)}
{content.attendees.length > 0 && (
<>
<Header dividing sub>
{intl.formatMessage(messages.attendees)}
</Header>
<List items={content.attendees} />
</>
)}
{content.event_url && (
<>
<Header dividing sub>
{intl.formatMessage(messages.website)}
</Header>
<p>
<a
href={content.event_url}
target="_blank"
rel="noopener noreferrer"
>
{intl.formatMessage(messages.visitWebsite)}
</a>
</p>
</>
)}
</Segment>
{content.text && (
<div
dangerouslySetInnerHTML={{
__html: flattenHTMLToAppURL(content.text.data),
}}
/>
)}
</Container>
);
/**
* Property types.
* @property {Object} propTypes Property types.
* @static
*/
EventView.propTypes = {
content: PropTypes.shape({
title: PropTypes.string,
description: PropTypes.string,
text: PropTypes.shape({
data: PropTypes.string,
}),
attendees: PropTypes.arrayOf(PropTypes.string).isRequired,
contact_email: PropTypes.string,
contact_name: PropTypes.string,
contact_phone: PropTypes.string,
end: PropTypes.string.isRequired,
event_url: PropTypes.string,
location: PropTypes.string,
open_end: PropTypes.bool,
recurrence: PropTypes.any,
start: PropTypes.string.isRequired,
subjects: PropTypes.arrayOf(PropTypes.string).isRequired,
whole_day: PropTypes.bool,
}).isRequired,
};
export default injectIntl(EventView);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment