|
|
@@ -6,6 +6,8 @@ import {
|
|
|
getEntrySpanEnd,
|
|
|
binarySearch,
|
|
|
SegInput,
|
|
|
+ SegEntryGroup,
|
|
|
+ groupIntersectingEntries,
|
|
|
} from '@fullcalendar/common'
|
|
|
|
|
|
interface SegNode extends SegEntry {
|
|
|
@@ -25,12 +27,6 @@ export interface TimeColSegRect extends SegRect {
|
|
|
stackForward: number
|
|
|
}
|
|
|
|
|
|
-export interface SegEntryGroup {
|
|
|
- spanStart: number
|
|
|
- spanEnd: number
|
|
|
- entries: SegEntry[]
|
|
|
-}
|
|
|
-
|
|
|
// segInputs assumed sorted
|
|
|
export function computeFgSegPlacements(
|
|
|
segInputs: SegInput[],
|
|
|
@@ -212,37 +208,6 @@ function webToRects(topLevelNodes: SegNode[]): TimeColSegRect[] {
|
|
|
return rects // TODO: sort rects by levelCoord to be consistent with toRects?
|
|
|
}
|
|
|
|
|
|
-// returns in no specific order
|
|
|
-function groupIntersectingEntries(entries: SegEntry[]): SegEntryGroup[] {
|
|
|
- let groups: SegEntryGroup[] = []
|
|
|
-
|
|
|
- for (let entry of entries) {
|
|
|
- let filteredMerges: SegEntryGroup[] = []
|
|
|
- let hungryMerge: SegEntryGroup = { // the merge that will eat what is collides with
|
|
|
- spanStart: entry.spanStart,
|
|
|
- spanEnd: entry.spanEnd,
|
|
|
- entries: [entry]
|
|
|
- }
|
|
|
-
|
|
|
- for (let merge of groups) {
|
|
|
- if (merge.spanStart < hungryMerge.spanEnd && merge.spanEnd > hungryMerge.spanStart) { // collides?
|
|
|
- hungryMerge = {
|
|
|
- spanStart: Math.min(merge.spanStart, hungryMerge.spanStart),
|
|
|
- spanEnd: Math.max(merge.spanEnd, hungryMerge.spanEnd),
|
|
|
- entries: merge.entries.concat(hungryMerge.entries)
|
|
|
- }
|
|
|
- } else {
|
|
|
- filteredMerges.push(merge)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- filteredMerges.push(hungryMerge)
|
|
|
- groups = filteredMerges
|
|
|
- }
|
|
|
-
|
|
|
- return groups
|
|
|
-}
|
|
|
-
|
|
|
// TODO: move to general util
|
|
|
|
|
|
function cacheable<Args extends any[], Res>(
|