Browse Source

move seg merging to common

Adam Shaw 4 năm trước cách đây
mục cha
commit
dcef5af754

+ 37 - 0
packages/common/src/event-placement.ts

@@ -25,6 +25,12 @@ export interface SegInsertion {
   stackCnt: number
 }
 
+export interface SegEntryGroup {
+  spanStart: number
+  spanEnd: number
+  entries: SegEntry[]
+}
+
 export class SegHierarchy {
   // settings
   allowReslicing: boolean = false
@@ -197,6 +203,37 @@ export function buildEntryKey(entry: SegEntry) {
   return entry.segInput.index + ':' + entry.spanStart
 }
 
+// returns in no specific order
+export 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
+}
+
 // general util
 // ---------------------------------------------------------------------------------------------------------------------
 

+ 1 - 1
packages/common/src/main.ts

@@ -162,7 +162,7 @@ export { EventSourceDef } from './structs/event-source-def'
 export { EventSource, EventSourceHash } from './structs/event-source'
 export { EventSourceRefiners, EventSourceRefined } from './structs/event-source-parse'
 
-export { SegInput, SegRect, SegHierarchy, SegEntry, SegInsertion, buildEntryKey, getEntrySpanEnd, binarySearch } from './event-placement'
+export { SegInput, SegRect, SegHierarchy, SegEntry, SegInsertion, buildEntryKey, getEntrySpanEnd, binarySearch, SegEntryGroup, groupIntersectingEntries } from './event-placement'
 
 export {
   Interaction,

+ 2 - 37
packages/timegrid/src/event-placement.ts

@@ -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>(