|
|
@@ -1,8 +1,10 @@
|
|
|
+import { EventApi } from '../api/EventApi'
|
|
|
+import { Seg } from '../component/DateComponent'
|
|
|
+import { DateMarker } from '../datelib/marker'
|
|
|
import { ComponentChildren, createElement, Ref, RefObject } from '../vdom'
|
|
|
import { BaseComponent } from '../vdom-util'
|
|
|
import { ViewApi } from '../ViewApi'
|
|
|
import { ViewContext, ViewContextType } from '../ViewContext'
|
|
|
-import { EventSegment } from './more-link'
|
|
|
import { MountArg, RenderHook } from './render-hook'
|
|
|
|
|
|
export type MoreLinkChildren = (
|
|
|
@@ -10,12 +12,13 @@ export type MoreLinkChildren = (
|
|
|
classNames: string[],
|
|
|
innerElRef: Ref<any>,
|
|
|
innerContent: ComponentChildren,
|
|
|
- handleClick: () => void,
|
|
|
+ handleClick: (ev: MouseEvent) => void,
|
|
|
) => ComponentChildren
|
|
|
|
|
|
export interface MoreLinkRootProps { // what the MoreLinkRoot component receives
|
|
|
- allSegs: EventSegment[]
|
|
|
- hiddenSegs: EventSegment[]
|
|
|
+ allDayDate: DateMarker | null
|
|
|
+ allSegs: Seg[]
|
|
|
+ hiddenSegs: Seg[]
|
|
|
positionElRef: RefObject<HTMLElement>
|
|
|
defaultContent?: (hookProps: MoreLinkContentArg) => ComponentChildren // not used by anyone yet
|
|
|
children: MoreLinkChildren
|
|
|
@@ -68,86 +71,81 @@ export class MoreLinkRoot extends BaseComponent<MoreLinkRootProps> {
|
|
|
)
|
|
|
}
|
|
|
|
|
|
- handleClick = () => {
|
|
|
- console.log('handle click', this.props.hiddenSegs, this.props.positionElRef.current)
|
|
|
- }
|
|
|
-}
|
|
|
+ handleClick = (ev: MouseEvent) => {
|
|
|
+ let { props, context } = this
|
|
|
+ let { moreLinkClick } = context.options
|
|
|
+ let allDay = Boolean(props.allDayDate)
|
|
|
+ let date = allDay ? context.dateEnv.toDate(props.allDayDate) :
|
|
|
+ context.dateEnv.toDate(getEarliestSeg(props.hiddenSegs).eventRange.range.start)
|
|
|
+
|
|
|
+ function buildPublicSeg(seg: Seg) {
|
|
|
+ let { def, instance, range } = seg.eventRange
|
|
|
+ return {
|
|
|
+ event: new EventApi(context, def, instance),
|
|
|
+ start: context.dateEnv.toDate(range.start),
|
|
|
+ end: context.dateEnv.toDate(range.end),
|
|
|
+ isStart: seg.isStart,
|
|
|
+ isEnd: seg.isEnd,
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
-function renderMoreLinkInner(props: MoreLinkContentArg) {
|
|
|
- return props.text
|
|
|
-}
|
|
|
+ if (typeof moreLinkClick === 'function') {
|
|
|
+ moreLinkClick = moreLinkClick({
|
|
|
+ date,
|
|
|
+ allDay,
|
|
|
+ allSegs: props.allSegs.map(buildPublicSeg),
|
|
|
+ hiddenSegs: props.hiddenSegs.map(buildPublicSeg),
|
|
|
+ jsEvent: ev,
|
|
|
+ view: context.viewApi,
|
|
|
+ }) as string | undefined
|
|
|
+ }
|
|
|
|
|
|
-/*
|
|
|
-let { props, context } = this
|
|
|
-let { options, dateEnv } = context
|
|
|
-let { moreLinkClick } = options
|
|
|
-let allSegs: EventSegment[] = []
|
|
|
-let hiddenSegs: EventSegment[] = []
|
|
|
-
|
|
|
-function segForPublic(seg: TableSeg) {
|
|
|
- let { def, instance, range } = seg.eventRange
|
|
|
- return {
|
|
|
- event: new EventApi(context, def, instance),
|
|
|
- start: dateEnv.toDate(range.start),
|
|
|
- end: dateEnv.toDate(range.end),
|
|
|
- isStart: seg.isStart,
|
|
|
- isEnd: seg.isEnd,
|
|
|
- }
|
|
|
-}
|
|
|
+ if (!moreLinkClick || moreLinkClick === 'popover') {
|
|
|
+ console.log('open popover', date, props.hiddenSegs, props.positionElRef.current)
|
|
|
+ /*
|
|
|
+ (!props.forPrint && (
|
|
|
+ <MorePopover
|
|
|
+ ref={this.morePopoverRef}
|
|
|
+ date={morePopoverState.date}
|
|
|
+ dateProfile={dateProfile}
|
|
|
+ segs={morePopoverState.allSegs}
|
|
|
+ alignmentEl={morePopoverState.dayEl}
|
|
|
+ topAlignmentEl={rowCnt === 1 ? props.headerAlignElRef.current : null}
|
|
|
+ selectedInstanceId={props.eventSelection}
|
|
|
+ hiddenInstances={// yuck
|
|
|
+ (props.eventDrag ? props.eventDrag.affectedInstances : null) ||
|
|
|
+ (props.eventResize ? props.eventResize.affectedInstances : null) ||
|
|
|
+ {}
|
|
|
+ }
|
|
|
+ todayRange={todayRange}
|
|
|
+ />
|
|
|
+ )
|
|
|
+
|
|
|
+ let morePopoverHit = morePopover ? morePopover.positionToHit(leftPosition, topPosition, this.rootEl) : null
|
|
|
+ let { morePopoverState } = this.state
|
|
|
+ if (morePopoverHit) {
|
|
|
+ return {
|
|
|
+ row: morePopoverState.fromRow,
|
|
|
+ col: morePopoverState.fromCol,
|
|
|
+ ...morePopoverHit,
|
|
|
+ }
|
|
|
+ }
|
|
|
+ */
|
|
|
|
|
|
-for (let placement of props.singlePlacements) {
|
|
|
- let publicSeg = segForPublic(placement.seg)
|
|
|
- allSegs.push(publicSeg)
|
|
|
- if (!placement.isVisible) {
|
|
|
- hiddenSegs.push(publicSeg)
|
|
|
+ } else if (typeof moreLinkClick === 'string') { // a view name
|
|
|
+ context.calendarApi.zoomTo(date, moreLinkClick)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-if (typeof moreLinkClick === 'function') {
|
|
|
- moreLinkClick = moreLinkClick({
|
|
|
- date: context.dateEnv.toDate(props.date),
|
|
|
- allDay: true,
|
|
|
- allSegs,
|
|
|
- hiddenSegs,
|
|
|
- jsEvent: ev,
|
|
|
- view: context.viewApi,
|
|
|
- }) as string | undefined
|
|
|
+function renderMoreLinkInner(props: MoreLinkContentArg) {
|
|
|
+ return props.text
|
|
|
}
|
|
|
|
|
|
-if (!moreLinkClick || moreLinkClick === 'popover') {
|
|
|
- console.log('TODO: open popover', allSegs, this.rootEl)
|
|
|
-
|
|
|
- (!props.forPrint && (
|
|
|
- <MorePopover
|
|
|
- ref={this.morePopoverRef}
|
|
|
- date={morePopoverState.date}
|
|
|
- dateProfile={dateProfile}
|
|
|
- segs={morePopoverState.allSegs}
|
|
|
- alignmentEl={morePopoverState.dayEl}
|
|
|
- topAlignmentEl={rowCnt === 1 ? props.headerAlignElRef.current : null}
|
|
|
- selectedInstanceId={props.eventSelection}
|
|
|
- hiddenInstances={// yuck
|
|
|
- (props.eventDrag ? props.eventDrag.affectedInstances : null) ||
|
|
|
- (props.eventResize ? props.eventResize.affectedInstances : null) ||
|
|
|
- {}
|
|
|
- }
|
|
|
- todayRange={todayRange}
|
|
|
- />
|
|
|
- )
|
|
|
-
|
|
|
- let morePopoverHit = morePopover ? morePopover.positionToHit(leftPosition, topPosition, this.rootEl) : null
|
|
|
- let { morePopoverState } = this.state
|
|
|
- if (morePopoverHit) {
|
|
|
- return {
|
|
|
- row: morePopoverState.fromRow,
|
|
|
- col: morePopoverState.fromCol,
|
|
|
- ...morePopoverHit,
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-} else if (typeof moreLinkClick === 'string') { // a view name
|
|
|
- context.calendarApi.zoomTo(props.date, moreLinkClick)
|
|
|
+function getEarliestSeg(segs: Seg[]): Seg {
|
|
|
+ return segs.reduce(getEarlierSeg)
|
|
|
}
|
|
|
-*/
|
|
|
|
|
|
-// TODO: address ticket where event refreshing closes popover
|
|
|
+function getEarlierSeg(seg0, seg1) {
|
|
|
+ return seg0.eventRange.range.start < seg1.eventRange.range.start ? seg0 : seg1
|
|
|
+}
|