import React, { Component } from 'react'; import { createComponent } from 'react-fela'; import { get } from 'lodash'; import { compose, withPropsOnChange } from 'recompose'; import BigCalendar from 'react-big-calendar'; import 'react-big-calendar/lib/css/react-big-calendar.css'; import { format, compareAsc } from 'date-fns'; import moment from 'moment'; BigCalendar.momentLocalizer(moment); const min = new Date(0, 0, 0, 7, 0, 0, 0); const max = new Date(0, 0, 0, 22, 0, 0, 0); const EventAgenda = onClick => ({ event }) => (
onClick(event)} style={{ cursor: 'pointer' }}>

{event.title}

{event.desc}
); const Calendar = createComponent( ({ theme }) => ({ '& .rbc-event': { backgroundColor: theme.color, borderRadius: 0, marginX: theme.space1, onHover: { opacity: 0.67 } } }), p => , p => Object.keys(p) ); const enhance = compose( withPropsOnChange(['items', 'collection'], ({ items, collection }) => { const isEvent = !!get(collection, 'mapping.event'); const event = get(collection, 'mapping.event', {}); const events = (items || []).map(item => ({ id: item.id, title: item.list.title, desc: item.list.subtitle, allDay: event.allDay, start: new Date(event.start), end: isEvent ? new Date(event.end) : new Date(event.end) })); return { events }; }) ); @enhance export default class CalendarView extends Component { render() { const { collection, events, updateQuery } = this.props; const isEvent = !!get(collection, 'mapping.event'); const hasEnd = !!get(collection, 'mapping.event.end'); return ( updateQuery({ [`@${collection.name}`]: event.id }) ) } }} formats={{ dateFormat: 'DD.', dayFormat: 'dd, DD.MM', dayHeaderFormat: 'dddd, DD. MMMM YYYY', agendaDateFormat: 'dd, DD.MM.YYYY', agendaTimeRangeFormat: ({ start, end }) => compareAsc(start, end) ? `${format(start, 'HH:mm')} bis ${format(end, 'HH:mm')}` : format(start, 'HH:mm'), eventTimeRangeFormat: ({ start, end }) => compareAsc(start, end) ? `${format(start, 'HH:mm')} bis ${format(end, 'HH:mm')}` : format(start, 'HH:mm') }} min={min} max={max} onSelectEvent={event => updateQuery({ [`@${collection.name}`]: event.id }) } onSelectSlot={slotInfo => { const query = { [`@${collection.name}`]: 'new' }; if (isEvent) { query.start = slotInfo.start; } if (hasEnd) { query.end = slotInfo.end; } updateQuery(query); }} /> ); } }