import React from 'react' import PropTypes from 'prop-types' import Dropdown from 'react-dropdown' import { Link, graphql, useStaticQuery, navigate } from 'gatsby' import Img from 'gatsby-image' import classNames from 'classnames' import _ from 'lodash' import moment from 'moment' import 'moment/locale/nb' moment.locale('nb') const eventOrganizersQuery = graphql` query EventOrganizers { allWordpressWpEventOrganizers { edges { node { name slug path } } } } ` const EventList = props => { const renderEvent = event => { return (
{event.featured_media && event.featured_media.localFile && ( )}
{moment(event.start_time).format('dddd')}{' '} {moment(event.start_time).format('D.')}{' '} {moment(event.start_time).format('MMMM')}{' '} {/* Only specify year if different. */} {!moment(event.start_time).isSame(new Date(), 'year') && ( {moment(event.start_time).format('YYYY')}{' '} )}

{event.title}

kl. {moment(event.start_time).format('HH:mm')} {event.event_types && event.event_types.length && (
    {event.event_types.map(type => (
  • {type.name}
  • ))}
)}
) } const renderEventsByDate = (filteredEvents, groupBy) => { let groupByFormat = null if (groupBy === 'day') { groupByFormat = 'YYYY-MM-DD' } if (groupBy === 'month') { groupByFormat = 'YYYY-MM' } const grouper = ({ node: event }) => { return moment(event.start_time).format(groupByFormat) } const groupedEvents = _.groupBy(filteredEvents, grouper) return _.map(groupedEvents, (theseEvents, date) => { return (
{groupBy === 'day' && moment(date).format('dddd D. MMMM')} {groupBy === 'month' && moment(date).format('MMMM')}
{theseEvents.map(({ node: event }) => { return renderEvent(event) })}
) }) } const handleOrganizerFilterChange = ({ value }) => { if (!value) { navigate('/program/') return } navigate(`/organizer/${value}/`) } const { events, title, preTitle, classes, onlyUpcoming, maxEvents, groupBy, showMore, showFilter, filterOrganizer, children, } = props let filteredEvents = events.filter(({ node: event }) => { const startTime = moment(event.start_time) if (onlyUpcoming && !startTime.isSameOrAfter(new Date(), 'day')) { return false } return true }) const data = useStaticQuery(eventOrganizersQuery) const { edges: organizers } = data.allWordpressWpEventOrganizers const allOrganizersOption = { value: null, label: 'Alle arrangører', } const organizerOptions = [ allOrganizersOption, ...organizers.map(({ node: organizer }) => { return { value: organizer.slug, label: organizer.name } }), ] const selectedOrganizer = filterOrganizer !== null ? organizers.find(obj => filterOrganizer === obj.node.slug).node : null const organizerOptionsDefault = selectedOrganizer !== null ? { value: selectedOrganizer.slug, label: selectedOrganizer.name, } : allOrganizersOption if (maxEvents) { filteredEvents = filteredEvents.slice(0, maxEvents) } return (
{preTitle &&
{preTitle}
} {title &&

{title}

} {children !== null && children} {showFilter && organizers && (
Se arrangementer fra
)} {groupBy && renderEventsByDate(filteredEvents, groupBy)} {!groupBy && (
{filteredEvents.map(({ node: event }) => { return renderEvent(event) })}
)} {showMore && (
Se alle arrangementer
)} {filteredEvents.length === 0 && (
{!selectedOrganizer && ( <> Det ligger ingenting i programmet akkurat nå. Prøv igjen senere! )} {selectedOrganizer && ( <>{selectedOrganizer.name} har ingen kommende arrangementer. )}
)}
) } EventList.propTypes = { children: PropTypes.shape({}), events: PropTypes.arrayOf(PropTypes.object), classes: PropTypes.string, preTitle: PropTypes.string, title: PropTypes.string, onlyUpcoming: PropTypes.bool, maxEvents: PropTypes.number, groupBy: PropTypes.string, showMore: PropTypes.bool, showFilter: PropTypes.bool, filterOrganizer: PropTypes.string, } EventList.defaultProps = { preTitle: null, onlyUpcoming: true, maxEvents: 0, groupBy: null, showMore: false, showFilter: false, filterOrganizer: null, } export default EventList export const pageQuery = graphql` fragment EventTypeFields on wordpress__wp_events { event_types { name slug path } } fragment EventOrganizerFields on wordpress__wp_events { event_organizers { name slug path description association { title path } } } fragment EventListFields on wordpress__wp_events { id path title start_time end_time featured_media { localFile { ...FluidImage } } ...EventTypeFields } `