import { AllDayContentArg } from '@fullcalendar/core' import { MinimalEventProps, BaseComponent, ViewContext, Seg, isMultiDayRange, DateFormatter, buildSegTimeText, createFormatter, getSegAnchorAttrs, EventContainer, ContentContainer, } from '@fullcalendar/core/internal' import { createElement, ComponentChildren, Fragment, ComponentChild, } from '@fullcalendar/core/preact' const DEFAULT_TIME_FORMAT = createFormatter({ hour: 'numeric', minute: '2-digit', meridiem: 'short', }) export interface ListViewEventRowProps extends MinimalEventProps { timeHeaderId: string eventHeaderId: string dateHeaderId: string } export class ListViewEventRow extends BaseComponent { render() { let { props, context } = this let { options } = context let { seg, timeHeaderId, eventHeaderId, dateHeaderId } = props let timeFormat = options.eventTimeFormat || DEFAULT_TIME_FORMAT return ( renderEventInnerContent(seg, context) /* weird */} seg={seg} timeText="" disableDragging={true} disableResizing={true} > {(InnerContent, eventContentArg) => ( {buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId)} )} ) } } function renderEventInnerContent(seg: Seg, context: ViewContext) { let interactiveAttrs = getSegAnchorAttrs(seg, context) return ( {/* TODO: document how whole row become clickable */} {seg.eventRange.def.title} ) } function buildTimeContent( seg: Seg, timeFormat: DateFormatter, context: ViewContext, timeHeaderId: string, dateHeaderId: string, ): ComponentChildren { let { options } = context if (options.displayEventTime !== false) { let eventDef = seg.eventRange.def let eventInstance = seg.eventRange.instance let doAllDay = false let timeText: string if (eventDef.allDay) { doAllDay = true } else if (isMultiDayRange(seg.eventRange.range)) { // TODO: use (!isStart || !isEnd) instead? if (seg.isStart) { timeText = buildSegTimeText( seg, timeFormat, context, null, null, eventInstance.range.start, seg.end, ) } else if (seg.isEnd) { timeText = buildSegTimeText( seg, timeFormat, context, null, null, seg.start, eventInstance.range.end, ) } else { doAllDay = true } } else { timeText = buildSegTimeText( seg, timeFormat, context, ) } if (doAllDay) { let renderProps: AllDayContentArg = { text: context.options.allDayText, view: context.viewApi, } return ( ) } return ( {timeText} ) } return null } function renderAllDayInner(renderProps: AllDayContentArg): ComponentChild { return renderProps.text }