pages/fullcalendar-main/packages/timegrid/src/event-placement.ts
2024-03-06 14:33:17 +01:00

82 lines
2.1 KiB
TypeScript

import {
SegSpan,
SegEntry,
SegEntryGroup,
DateMarker,
} from '@fullcalendar/core/internal'
import { TimeColsSeg } from './TimeColsSeg.js'
import { TimeColsSlatsCoords } from './TimeColsSlatsCoords.js'
import { SegWebRect, buildPositioning } from './seg-web.js'
// public interface
// ------------------------------------------------------------------------------------------
export interface TimeColFgSegPlacement {
seg: TimeColsSeg
rect: SegWebRect | null
}
export function computeSegVCoords(
segs: TimeColsSeg[],
colDate: DateMarker,
slatCoords: TimeColsSlatsCoords = null,
eventMinHeight: number = 0, // might be null/undefined :(
): SegSpan[] {
let vcoords: SegSpan[] = []
if (slatCoords) {
for (let i = 0; i < segs.length; i += 1) {
let seg = segs[i]
let spanStart = slatCoords.computeDateTop(seg.start, colDate)
let spanEnd = Math.max(
spanStart + (eventMinHeight || 0), // :(
slatCoords.computeDateTop(seg.end, colDate),
)
vcoords.push({
start: Math.round(spanStart), // for barely-overlapping collisions
end: Math.round(spanEnd), //
})
}
}
return vcoords
}
export function computeFgSegPlacements(
segs: TimeColsSeg[],
segVCoords: SegSpan[], // might not have for every seg
eventOrderStrict?: boolean,
eventMaxStack?: number,
): { segPlacements: TimeColFgSegPlacement[], hiddenGroups: SegEntryGroup[] } {
let segInputs: SegEntry[] = []
let dumbSegs: TimeColsSeg[] = [] // segs without coords
for (let i = 0; i < segs.length; i += 1) {
let vcoords = segVCoords[i]
if (vcoords) {
segInputs.push({
index: i,
thickness: 1,
span: vcoords,
})
} else {
dumbSegs.push(segs[i])
}
}
let { segRects, hiddenGroups } = buildPositioning(segInputs, eventOrderStrict, eventMaxStack)
let segPlacements: TimeColFgSegPlacement[] = []
for (let segRect of segRects) {
segPlacements.push({
seg: segs[segRect.index],
rect: segRect,
})
}
for (let dumbSeg of dumbSegs) {
segPlacements.push({ seg: dumbSeg, rect: null })
}
return { segPlacements, hiddenGroups }
}