83 lines
2.1 KiB
TypeScript
83 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 }
|
||
|
}
|