فهرست منبع

move eventrange and datespan into slicer

Adam Shaw 7 سال پیش
والد
کامیت
ed10305bcc
6فایلهای تغییر یافته به همراه96 افزوده شده و 44 حذف شده
  1. 8 16
      src/agenda/TimeGrid.ts
  2. 31 1
      src/agenda/TimeGridSlicer.ts
  3. 1 18
      src/basic/DayGrid.ts
  4. 32 2
      src/basic/DayGridSlicer.ts
  5. 20 6
      src/component/StandardDateComponent.ts
  6. 4 1
      src/list/ListView.ts

+ 8 - 16
src/agenda/TimeGrid.ts

@@ -1,7 +1,6 @@
 import { htmlEscape } from '../util/html'
 import { htmlToElement, findElements, createElement, removeElement, applyStyle } from '../util/dom-manip'
 import PositionCache from '../common/PositionCache'
-import { DateRange } from '../datelib/date-range'
 import TimeGridEventRenderer from './TimeGridEventRenderer'
 import TimeGridMirrorRenderer from './TimeGridMirrorRenderer'
 import TimeGridFillRenderer from './TimeGridFillRenderer'
@@ -89,17 +88,6 @@ export default class TimeGrid extends StandardDateComponent {
   }
 
 
-  // Slices up the given span (unzoned start/end with other misc data) into an array of segments
-  rangeToSegs(range: DateRange): Seg[] {
-    let slicer = (this.props as any).slicer as TimeGridSlicer
-
-    return slicer.rangeToSegs(range).map((seg) => {
-      seg.component = this
-      return seg
-    })
-  }
-
-
   /* Options
   ------------------------------------------------------------------------------------------------------------------*/
 
@@ -400,6 +388,7 @@ export default class TimeGrid extends StandardDateComponent {
 
 
   renderNowIndicator(date) {
+    let slicer = (this.props as any).slicer as TimeGridSlicer
 
     // HACK: if date columns not ready for some reason (scheduler)
     if (!this.colContainerEls) {
@@ -408,10 +397,13 @@ export default class TimeGrid extends StandardDateComponent {
 
     // seg system might be overkill, but it handles scenario where line needs to be rendered
     //  more than once because of columns with the same date (resources columns for example)
-    let segs = this.rangeToSegs({
-      start: date,
-      end: addMs(date, 1) // protect against null range
-    })
+    let segs = slicer.dateSpanToSegs({
+      range: {
+        start: date,
+        end: addMs(date, 1) // protect against null range
+      },
+      allDay: false
+    }, this)
     let top = this.computeDateTop(date)
     let nodes = []
     let i

+ 31 - 1
src/agenda/TimeGridSlicer.ts

@@ -3,6 +3,8 @@ import { DateRange, intersectRanges } from '../datelib/date-range'
 import DaySeries from '../common/DaySeries'
 import { Seg } from '../component/DateComponent'
 import { DateEnv } from '../datelib/env'
+import { EventRenderRange } from '../component/event-rendering';
+import { DateSpan } from '../structs/date-span'
 
 export default class TimeGridSlicer {
 
@@ -20,8 +22,36 @@ export default class TimeGridSlicer {
   }
 
 
+  eventRangeToSegs(eventRange: EventRenderRange, component) {
+    let range = intersectRanges(eventRange.range, component.props.dateProfile.validRange)
+
+    if (range) {
+      return this.rangeToSegs(range).map(function(seg) {
+        seg.component = component
+        return seg
+      })
+    }
+
+    return []
+  }
+
+
+  dateSpanToSegs(dateSpan: DateSpan, component) {
+    let range = intersectRanges(dateSpan.range, component.props.dateProfile.validRange)
+
+    if (range) {
+      return this.rangeToSegs(range).map(function(seg) {
+        seg.component = component
+        return seg
+      })
+    }
+
+    return []
+  }
+
+
   // Slices up the given span (unzoned start/end with other misc data) into an array of segments
-  rangeToSegs(range: DateRange): Seg[] {
+  private rangeToSegs(range: DateRange): Seg[] {
     let segs = []
 
     // important to do ALL cols (tho can be optimized)

+ 1 - 18
src/basic/DayGrid.ts

@@ -19,7 +19,7 @@ import { Seg } from '../component/DateComponent'
 import StandardDateComponent from '../component/StandardDateComponent'
 import DayTile from './DayTile'
 import { Hit } from '../interactions/HitDragging'
-import { DateRange, rangeContainsMarker, intersectRanges } from '../datelib/date-range'
+import { rangeContainsMarker, intersectRanges } from '../datelib/date-range'
 import OffsetTracker from '../common/OffsetTracker'
 import { EventRenderRange } from '../component/event-rendering'
 import { buildGotoAnchorHtml, getDayClasses } from '../component/date-rendering'
@@ -80,23 +80,6 @@ export default class DayGrid extends StandardDateComponent {
   }
 
 
-  // Slices up the given span (unzoned start/end with other misc data) into an array of segments
-  rangeToSegs(range: DateRange): Seg[] {
-    let slicer = (this.props as any).slicer as DayGridSlicer
-
-    range = intersectRanges(range, this.props.dateProfile.validRange)
-
-    if (range) {
-      return slicer.rangeToSegs(range).map((seg) => {
-        seg.component = this
-        return seg
-      })
-    } else {
-      return []
-    }
-  }
-
-
   render(props: StandardDateComponentProps) {
     super.render(props)
 

+ 32 - 2
src/basic/DayGridSlicer.ts

@@ -1,7 +1,9 @@
-import { DateRange } from '../datelib/date-range'
+import { DateRange, intersectRanges } from '../datelib/date-range'
 import { Seg } from '../component/DateComponent'
 import { addDays, DateMarker } from '../datelib/marker'
 import DayTable from '../common/DayTable'
+import { EventRenderRange } from '../component/event-rendering';
+import { DateSpan } from '../structs/date-span';
 
 export default class DayGridSlicer {
 
@@ -20,8 +22,36 @@ export default class DayGridSlicer {
   }
 
 
+  eventRangeToSegs(eventRange: EventRenderRange, component) {
+    let range = intersectRanges(eventRange.range, component.props.dateProfile.validRange)
+
+    if (range) {
+      return this.rangeToSegs(range).map(function(seg) {
+        seg.component = component
+        return seg
+      })
+    }
+
+    return []
+  }
+
+
+  dateSpanToSegs(dateSpan: DateSpan, component) {
+    let range = intersectRanges(dateSpan.range, component.props.dateProfile.validRange)
+
+    if (range) {
+      return this.rangeToSegs(range).map(function(seg) {
+        seg.component = component
+        return seg
+      })
+    }
+
+    return []
+  }
+
+
   // Slices up the given span (unzoned start/end with other misc data) into an array of segments
-  rangeToSegs(range: DateRange): Seg[] {
+  private rangeToSegs(range: DateRange): Seg[] {
     let colCnt = this.dayTable.colCnt
 
     return this.dayTable.sliceRange(range)

+ 20 - 6
src/component/StandardDateComponent.ts

@@ -7,7 +7,6 @@ import { EventInteractionUiState } from '../interactions/event-interaction-state
 import { Duration, createDuration } from '../datelib/duration'
 import { ComponentContext } from './Component';
 import { parseEventDef, createEventInstance } from '../structs/event'
-import { DateRange } from '../datelib/date-range'
 
 export interface StandardDateComponentProps {
   dateProfile: DateProfile | null
@@ -40,9 +39,24 @@ export default class StandardDateComponent extends DateComponent<StandardDateCom
   }
 
 
-  // SHOULD BE ABSTRACT
-  // but Views extends from this class :(
-  rangeToSegs(range: DateRange, allDay: boolean): Seg[] {
+  eventRangeToSegs(eventRange: EventRenderRange): Seg[] {
+    let slicer = (this.props as any).slicer
+
+    if (slicer) {
+      return slicer.eventRangeToSegs(eventRange, this)
+    }
+
+    return []
+  }
+
+
+  dateSpanToSegs(selection: DateSpan): Seg[] {
+    let slicer = (this.props as any).slicer
+
+    if (slicer) {
+      return slicer.dateSpanToSegs(selection, this)
+    }
+
     return []
   }
 
@@ -288,7 +302,7 @@ export default class StandardDateComponent extends DateComponent<StandardDateCom
     let allSegs: Seg[] = []
 
     for (let eventRenderRange of eventRenderRanges) {
-      let segs = this.rangeToSegs(eventRenderRange.range, eventRenderRange.def.allDay)
+      let segs = this.eventRangeToSegs(eventRenderRange)
 
       for (let seg of segs) {
         seg.eventRange = eventRenderRange
@@ -303,7 +317,7 @@ export default class StandardDateComponent extends DateComponent<StandardDateCom
   }
 
   selectionToSegs(selection: DateSpan): Seg[] {
-    let segs = this.rangeToSegs(selection.range, selection.allDay)
+    let segs = this.dateSpanToSegs(selection)
 
     // fabricate an eventRange. important for mirror
     // TODO: make a separate utility for this?

+ 4 - 1
src/list/ListView.ts

@@ -11,6 +11,7 @@ import DateProfileGenerator, { DateProfile } from '../DateProfileGenerator'
 import { buildGotoAnchorHtml } from '../component/date-rendering'
 import { ComponentContext } from '../component/Component'
 import { ViewSpec } from '../structs/view-spec'
+import { EventRenderRange } from '../component/event-rendering';
 
 /*
 Responsible for the scroller, and forwarding event-related actions into the "grid".
@@ -97,7 +98,9 @@ export default class ListView extends View {
 
 
   // slices by day
-  rangeToSegs(range: DateRange, allDay: boolean) {
+  eventRangeToSegs(eventRange: EventRenderRange) {
+    let range = eventRange.range
+    let allDay = eventRange.def.allDay
     let { dateEnv } = this
     let dayRanges = this.dayRanges
     let dayIndex