import { useEffect, useRef } from 'preact/hooks' import _ from 'lodash' import { differenceInMinutes, startOfDay } from 'date-fns' import { hashString, normalizeCourseName, WEEK_DAYS } from '../../utils.jsx' import { layoutIntervals } from '../../interval-layout.js' export const WorkWeekTranspose = ({ events }) => { const eventsByWeekday = _.groupBy(events, event => event.start.getDay()) // For each weekday compute the interval layout const rowLayouts = _.mapValues(eventsByWeekday, events => layoutIntervals( events.map(e => ({ start: differenceInMinutes(e.start, startOfDay(e.start)), end: differenceInMinutes(e.end, startOfDay(e.start)), data: e, })) ) ) return (
{WEEK_DAYS.slice(1, 6).map((label, index) => (
{label}
))}
9:00 – 11:00
11:00 – 13:00
14:00 – 16:00
16:00 – 18:00
{Object.values(rowLayouts).map(layout => (
{layout.map((events, rowIndex) => events.map(event => { const Local = () => { const eventRef = useRef() const updateMinWidth = () => { eventRef.current.style.minWidth = eventRef.current.offsetWidth + 'px' } useEffect(() => { if (eventRef.current) { setTimeout(updateMinWidth, 100) window.addEventListener('resize', updateMinWidth) return () => { window.removeEventListener( 'resize', updateMinWidth ) } } }, [eventRef.current]) return (
{normalizeCourseName(event.data.name)}
) } return }) )}
))}
) }